From 0d9fbc1ad7122f3f1c35a179a825440b3ef978f7 Mon Sep 17 00:00:00 2001 From: echel0n Date: Sun, 9 Mar 2014 22:18:05 -0700 Subject: [PATCH] Welcome to our SickBeard-TVRage Edition ... This version of SickBeard uses both TVDB and TVRage to search and gather it's series data from allowing you to now have access to and download shows that you couldn't before because of being locked into only what TheTVDB had to offer. Also this edition is based off the code we used in our XEM editon so it does come with scene numbering support as well as all the other features our XEM edition has to offer. Please before using this with your existing database (sickbeard.db) please make a backup copy of it and delete any other database files such as cache.db and failed.db if present, we HIGHLY recommend starting out with no database files at all to make this a fresh start but the choice is at your own risk! Enjoy! --- .gitignore | 47 + .travis.yml | 14 + COPYING.txt | 674 + SickBeard.py | 354 + autoProcessTV/autoProcessTV.cfg.sample | 7 + autoProcessTV/autoProcessTV.py | 106 + autoProcessTV/hellaToSickBeard.py | 30 + autoProcessTV/mediaToSickbeard.py | 220 + autoProcessTV/sabToSickBeard.py | 33 + autoProcessTV/setup.py | 13 + cherrypy/__init__.py | 573 + cherrypy/_cpchecker.py | 322 + cherrypy/_cpconfig.py | 269 + cherrypy/_cpdispatch.py | 568 + cherrypy/_cperror.py | 396 + cherrypy/_cplogging.py | 250 + cherrypy/_cpmodpy.py | 333 + cherrypy/_cpnative_server.py | 150 + cherrypy/_cpreqbody.py | 723 + cherrypy/_cprequest.py | 940 + cherrypy/_cpserver.py | 139 + cherrypy/_cpthreadinglocal.py | 239 + cherrypy/_cptools.py | 498 + cherrypy/_cptree.py | 278 + cherrypy/_cpwsgi.py | 340 + cherrypy/_cpwsgi_server.py | 62 + cherrypy/cherryd | 102 + cherrypy/favicon.ico | Bin 0 -> 4286 bytes cherrypy/lib/__init__.py | 44 + cherrypy/lib/auth.py | 79 + cherrypy/lib/auth_basic.py | 87 + cherrypy/lib/auth_digest.py | 358 + cherrypy/lib/caching.py | 401 + cherrypy/lib/covercp.py | 364 + cherrypy/lib/cptools.py | 580 + cherrypy/lib/encoding.py | 362 + cherrypy/lib/http.py | 7 + cherrypy/lib/httpauth.py | 361 + cherrypy/lib/httputil.py | 446 + cherrypy/lib/jsontools.py | 50 + cherrypy/lib/profiler.py | 205 + cherrypy/lib/reprconf.py | 345 + cherrypy/lib/sessions.py | 741 + cherrypy/lib/static.py | 346 + cherrypy/lib/xmlrpc.py | 49 + cherrypy/process/__init__.py | 14 + cherrypy/process/plugins.py | 562 + cherrypy/process/servers.py | 283 + cherrypy/process/win32.py | 174 + cherrypy/process/wspbus.py | 384 + cherrypy/wsgiserver/__init__.py | 2074 + cherrypy/wsgiserver/ssl_builtin.py | 69 + cherrypy/wsgiserver/ssl_pyopenssl.py | 241 + contributing.md | 77 + googlecode_upload.py | 250 + gui/slick/css/browser.css | 54 + gui/slick/css/comingEpisodes.css | 222 + gui/slick/css/config.css | 195 + gui/slick/css/config.less | 78 + gui/slick/css/default.css | 1865 + gui/slick/css/default.less | 542 + gui/slick/css/formwizard.css | 91 + gui/slick/css/imports/config.less | 78 + gui/slick/css/iphone.css | 24 + gui/slick/css/jquery.qtip2.css | 536 + gui/slick/css/lib/images/animated-overlay.gif | Bin 0 -> 1738 bytes gui/slick/css/lib/images/tablesorter/asc.gif | Bin 0 -> 54 bytes gui/slick/css/lib/images/tablesorter/bg.gif | Bin 0 -> 64 bytes gui/slick/css/lib/images/tablesorter/desc.gif | Bin 0 -> 54 bytes .../ui-bg_fine-grain_10_eceadf_60x60.png | Bin 0 -> 4429 bytes .../lib/images/ui-bg_flat_0_000000_40x100.png | Bin 0 -> 205 bytes .../lib/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../lib/images/ui-bg_flat_0_ffffff_40x100.png | Bin 0 -> 208 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 111 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../ui-bg_highlight-soft_75_dcdcdc_1x100.png | Bin 0 -> 280 bytes .../ui-bg_highlight-soft_75_dddddd_1x100.png | Bin 0 -> 280 bytes .../ui-bg_highlight-soft_75_efefef_1x100.png | Bin 0 -> 279 bytes .../ui-bg_inset-soft_75_dfdfdf_1x100.png | Bin 0 -> 281 bytes .../lib/images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../lib/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../lib/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../lib/images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../lib/images/ui-icons_8c291d_256x240.png | Bin 0 -> 4549 bytes .../lib/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes gui/slick/css/lib/jquery-ui-1.10.4.custom.css | 858 + gui/slick/css/lib/jquery-ui-1.8.17.custom.css | 567 + gui/slick/css/lib/jquery.pnotify.default.css | 101 + gui/slick/css/lib/jquery.qtip-2.0.1.min.css | 1 + gui/slick/css/lib/tablesorter.css | 100 + gui/slick/css/superfish.css | 285 + gui/slick/css/superfish.less | 211 + gui/slick/css/tablesorter.less | 91 + gui/slick/css/token-input-facebook.css | 122 + gui/slick/css/token-input-mac.css | 204 + gui/slick/css/token-input.css | 136 + gui/slick/images/add-existing32.png | Bin 0 -> 975 bytes gui/slick/images/add-new32.png | Bin 0 -> 1365 bytes gui/slick/images/arrows.png | Bin 0 -> 382 bytes gui/slick/images/banner.png | Bin 0 -> 155703 bytes gui/slick/images/bg.gif | Bin 0 -> 48 bytes gui/slick/images/cancel32.png | Bin 0 -> 2552 bytes gui/slick/images/changelog16.png | Bin 0 -> 161 bytes gui/slick/images/closed_captioning.png | Bin 0 -> 880 bytes gui/slick/images/flags/ad.png | Bin 0 -> 643 bytes gui/slick/images/flags/ae.png | Bin 0 -> 408 bytes gui/slick/images/flags/af.png | Bin 0 -> 604 bytes gui/slick/images/flags/ag.png | Bin 0 -> 591 bytes gui/slick/images/flags/ai.png | Bin 0 -> 643 bytes gui/slick/images/flags/al.png | Bin 0 -> 600 bytes gui/slick/images/flags/am.png | Bin 0 -> 497 bytes gui/slick/images/flags/an.png | Bin 0 -> 488 bytes gui/slick/images/flags/ao.png | Bin 0 -> 428 bytes gui/slick/images/flags/ar.png | Bin 0 -> 506 bytes gui/slick/images/flags/as.png | Bin 0 -> 647 bytes gui/slick/images/flags/at.png | Bin 0 -> 403 bytes gui/slick/images/flags/au.png | Bin 0 -> 673 bytes gui/slick/images/flags/aw.png | Bin 0 -> 524 bytes gui/slick/images/flags/ax.png | Bin 0 -> 663 bytes gui/slick/images/flags/az.png | Bin 0 -> 589 bytes gui/slick/images/flags/ba.png | Bin 0 -> 593 bytes gui/slick/images/flags/bb.png | Bin 0 -> 585 bytes gui/slick/images/flags/bd.png | Bin 0 -> 504 bytes gui/slick/images/flags/be.png | Bin 0 -> 449 bytes gui/slick/images/flags/bf.png | Bin 0 -> 497 bytes gui/slick/images/flags/bg.png | Bin 0 -> 462 bytes gui/slick/images/flags/bh.png | Bin 0 -> 457 bytes gui/slick/images/flags/bi.png | Bin 0 -> 675 bytes gui/slick/images/flags/bj.png | Bin 0 -> 486 bytes gui/slick/images/flags/bm.png | Bin 0 -> 611 bytes gui/slick/images/flags/bn.png | Bin 0 -> 639 bytes gui/slick/images/flags/bo.png | Bin 0 -> 500 bytes gui/slick/images/flags/br.png | Bin 0 -> 593 bytes gui/slick/images/flags/bs.png | Bin 0 -> 526 bytes gui/slick/images/flags/bt.png | Bin 0 -> 631 bytes gui/slick/images/flags/bv.png | Bin 0 -> 512 bytes gui/slick/images/flags/bw.png | Bin 0 -> 443 bytes gui/slick/images/flags/by.png | Bin 0 -> 514 bytes gui/slick/images/flags/bz.png | Bin 0 -> 600 bytes gui/slick/images/flags/ca.png | Bin 0 -> 628 bytes gui/slick/images/flags/cc.png | Bin 0 -> 625 bytes gui/slick/images/flags/cd.png | Bin 0 -> 528 bytes gui/slick/images/flags/cf.png | Bin 0 -> 614 bytes gui/slick/images/flags/cg.png | Bin 0 -> 521 bytes gui/slick/images/flags/ch.png | Bin 0 -> 367 bytes gui/slick/images/flags/ci.png | Bin 0 -> 453 bytes gui/slick/images/flags/ck.png | Bin 0 -> 586 bytes gui/slick/images/flags/cl.png | Bin 0 -> 450 bytes gui/slick/images/flags/cm.png | Bin 0 -> 525 bytes gui/slick/images/flags/cn.png | Bin 0 -> 472 bytes gui/slick/images/flags/co.png | Bin 0 -> 483 bytes gui/slick/images/flags/cr.png | Bin 0 -> 477 bytes gui/slick/images/flags/cs.png | Bin 0 -> 439 bytes gui/slick/images/flags/cu.png | Bin 0 -> 563 bytes gui/slick/images/flags/cv.png | Bin 0 -> 529 bytes gui/slick/images/flags/cx.png | Bin 0 -> 608 bytes gui/slick/images/flags/cy.png | Bin 0 -> 428 bytes gui/slick/images/flags/cz.png | Bin 0 -> 476 bytes gui/slick/images/flags/da.png | Bin 0 -> 495 bytes gui/slick/images/flags/de.png | Bin 0 -> 545 bytes gui/slick/images/flags/dj.png | Bin 0 -> 572 bytes gui/slick/images/flags/dk.png | Bin 0 -> 495 bytes gui/slick/images/flags/dm.png | Bin 0 -> 620 bytes gui/slick/images/flags/do.png | Bin 0 -> 508 bytes gui/slick/images/flags/dz.png | Bin 0 -> 582 bytes gui/slick/images/flags/ec.png | Bin 0 -> 500 bytes gui/slick/images/flags/ee.png | Bin 0 -> 429 bytes gui/slick/images/flags/eg.png | Bin 0 -> 465 bytes gui/slick/images/flags/eh.png | Bin 0 -> 508 bytes gui/slick/images/flags/el.png | Bin 0 -> 487 bytes gui/slick/images/flags/en.png | Bin 0 -> 609 bytes gui/slick/images/flags/er.png | Bin 0 -> 653 bytes gui/slick/images/flags/es.png | Bin 0 -> 469 bytes gui/slick/images/flags/et.png | Bin 0 -> 592 bytes gui/slick/images/flags/fam.png | Bin 0 -> 532 bytes gui/slick/images/flags/fi.png | Bin 0 -> 489 bytes gui/slick/images/flags/fj.png | Bin 0 -> 610 bytes gui/slick/images/flags/fk.png | Bin 0 -> 648 bytes gui/slick/images/flags/fm.png | Bin 0 -> 552 bytes gui/slick/images/flags/fo.png | Bin 0 -> 474 bytes gui/slick/images/flags/fr.png | Bin 0 -> 545 bytes gui/slick/images/flags/ga.png | Bin 0 -> 489 bytes gui/slick/images/flags/gb.png | Bin 0 -> 599 bytes gui/slick/images/flags/gd.png | Bin 0 -> 637 bytes gui/slick/images/flags/ge.png | Bin 0 -> 594 bytes gui/slick/images/flags/gf.png | Bin 0 -> 545 bytes gui/slick/images/flags/gh.png | Bin 0 -> 490 bytes gui/slick/images/flags/gi.png | Bin 0 -> 463 bytes gui/slick/images/flags/gl.png | Bin 0 -> 470 bytes gui/slick/images/flags/gm.png | Bin 0 -> 493 bytes gui/slick/images/flags/gn.png | Bin 0 -> 480 bytes gui/slick/images/flags/gp.png | Bin 0 -> 488 bytes gui/slick/images/flags/gq.png | Bin 0 -> 537 bytes gui/slick/images/flags/gr.png | Bin 0 -> 487 bytes gui/slick/images/flags/gs.png | Bin 0 -> 630 bytes gui/slick/images/flags/gt.png | Bin 0 -> 493 bytes gui/slick/images/flags/gu.png | Bin 0 -> 509 bytes gui/slick/images/flags/gw.png | Bin 0 -> 516 bytes gui/slick/images/flags/gy.png | Bin 0 -> 645 bytes gui/slick/images/flags/he.png | Bin 0 -> 326 bytes gui/slick/images/flags/hk.png | Bin 0 -> 527 bytes gui/slick/images/flags/hm.png | Bin 0 -> 673 bytes gui/slick/images/flags/hn.png | Bin 0 -> 537 bytes gui/slick/images/flags/hr.png | Bin 0 -> 524 bytes gui/slick/images/flags/ht.png | Bin 0 -> 487 bytes gui/slick/images/flags/hu.png | Bin 0 -> 432 bytes gui/slick/images/flags/id.png | Bin 0 -> 430 bytes gui/slick/images/flags/ie.png | Bin 0 -> 481 bytes gui/slick/images/flags/il.png | Bin 0 -> 431 bytes gui/slick/images/flags/in.png | Bin 0 -> 503 bytes gui/slick/images/flags/io.png | Bin 0 -> 658 bytes gui/slick/images/flags/iq.png | Bin 0 -> 515 bytes gui/slick/images/flags/ir.png | Bin 0 -> 512 bytes gui/slick/images/flags/is.png | Bin 0 -> 532 bytes gui/slick/images/flags/it.png | Bin 0 -> 420 bytes gui/slick/images/flags/ja.png | Bin 0 -> 455 bytes gui/slick/images/flags/jm.png | Bin 0 -> 637 bytes gui/slick/images/flags/jo.png | Bin 0 -> 473 bytes gui/slick/images/flags/jp.png | Bin 0 -> 420 bytes gui/slick/images/flags/ke.png | Bin 0 -> 569 bytes gui/slick/images/flags/kg.png | Bin 0 -> 510 bytes gui/slick/images/flags/kh.png | Bin 0 -> 549 bytes gui/slick/images/flags/ki.png | Bin 0 -> 656 bytes gui/slick/images/flags/km.png | Bin 0 -> 577 bytes gui/slick/images/flags/kn.png | Bin 0 -> 604 bytes gui/slick/images/flags/ko.png | Bin 0 -> 327 bytes gui/slick/images/flags/kp.png | Bin 0 -> 561 bytes gui/slick/images/flags/kr.png | Bin 0 -> 592 bytes gui/slick/images/flags/kw.png | Bin 0 -> 486 bytes gui/slick/images/flags/ky.png | Bin 0 -> 643 bytes gui/slick/images/flags/kz.png | Bin 0 -> 616 bytes gui/slick/images/flags/la.png | Bin 0 -> 563 bytes gui/slick/images/flags/lb.png | Bin 0 -> 517 bytes gui/slick/images/flags/lc.png | Bin 0 -> 520 bytes gui/slick/images/flags/li.png | Bin 0 -> 537 bytes gui/slick/images/flags/lk.png | Bin 0 -> 627 bytes gui/slick/images/flags/lr.png | Bin 0 -> 466 bytes gui/slick/images/flags/ls.png | Bin 0 -> 628 bytes gui/slick/images/flags/lt.png | Bin 0 -> 508 bytes gui/slick/images/flags/lu.png | Bin 0 -> 481 bytes gui/slick/images/flags/lv.png | Bin 0 -> 465 bytes gui/slick/images/flags/ly.png | Bin 0 -> 419 bytes gui/slick/images/flags/ma.png | Bin 0 -> 432 bytes gui/slick/images/flags/mc.png | Bin 0 -> 380 bytes gui/slick/images/flags/md.png | Bin 0 -> 566 bytes gui/slick/images/flags/me.png | Bin 0 -> 448 bytes gui/slick/images/flags/mg.png | Bin 0 -> 453 bytes gui/slick/images/flags/mh.png | Bin 0 -> 628 bytes gui/slick/images/flags/mk.png | Bin 0 -> 664 bytes gui/slick/images/flags/ml.png | Bin 0 -> 474 bytes gui/slick/images/flags/mm.png | Bin 0 -> 483 bytes gui/slick/images/flags/mn.png | Bin 0 -> 492 bytes gui/slick/images/flags/mo.png | Bin 0 -> 588 bytes gui/slick/images/flags/mp.png | Bin 0 -> 597 bytes gui/slick/images/flags/mq.png | Bin 0 -> 655 bytes gui/slick/images/flags/mr.png | Bin 0 -> 569 bytes gui/slick/images/flags/ms.png | Bin 0 -> 614 bytes gui/slick/images/flags/mt.png | Bin 0 -> 420 bytes gui/slick/images/flags/mu.png | Bin 0 -> 496 bytes gui/slick/images/flags/mv.png | Bin 0 -> 542 bytes gui/slick/images/flags/mw.png | Bin 0 -> 529 bytes gui/slick/images/flags/mx.png | Bin 0 -> 574 bytes gui/slick/images/flags/my.png | Bin 0 -> 571 bytes gui/slick/images/flags/mz.png | Bin 0 -> 584 bytes gui/slick/images/flags/na.png | Bin 0 -> 647 bytes gui/slick/images/flags/nc.png | Bin 0 -> 591 bytes gui/slick/images/flags/ne.png | Bin 0 -> 537 bytes gui/slick/images/flags/nf.png | Bin 0 -> 602 bytes gui/slick/images/flags/ng.png | Bin 0 -> 482 bytes gui/slick/images/flags/ni.png | Bin 0 -> 508 bytes gui/slick/images/flags/nl.png | Bin 0 -> 453 bytes gui/slick/images/flags/no.png | Bin 0 -> 512 bytes gui/slick/images/flags/np.png | Bin 0 -> 443 bytes gui/slick/images/flags/nr.png | Bin 0 -> 527 bytes gui/slick/images/flags/nu.png | Bin 0 -> 572 bytes gui/slick/images/flags/nz.png | Bin 0 -> 639 bytes gui/slick/images/flags/om.png | Bin 0 -> 478 bytes gui/slick/images/flags/pa.png | Bin 0 -> 519 bytes gui/slick/images/flags/pb.png | Bin 0 -> 593 bytes gui/slick/images/flags/pe.png | Bin 0 -> 397 bytes gui/slick/images/flags/pf.png | Bin 0 -> 498 bytes gui/slick/images/flags/pg.png | Bin 0 -> 593 bytes gui/slick/images/flags/ph.png | Bin 0 -> 538 bytes gui/slick/images/flags/pk.png | Bin 0 -> 569 bytes gui/slick/images/flags/pl.png | Bin 0 -> 374 bytes gui/slick/images/flags/pm.png | Bin 0 -> 689 bytes gui/slick/images/flags/pn.png | Bin 0 -> 657 bytes gui/slick/images/flags/pr.png | Bin 0 -> 556 bytes gui/slick/images/flags/ps.png | Bin 0 -> 472 bytes gui/slick/images/flags/pt.png | Bin 0 -> 554 bytes gui/slick/images/flags/pw.png | Bin 0 -> 550 bytes gui/slick/images/flags/py.png | Bin 0 -> 473 bytes gui/slick/images/flags/qa.png | Bin 0 -> 450 bytes gui/slick/images/flags/re.png | Bin 0 -> 545 bytes gui/slick/images/flags/ro.png | Bin 0 -> 495 bytes gui/slick/images/flags/rs.png | Bin 0 -> 423 bytes gui/slick/images/flags/ru.png | Bin 0 -> 420 bytes gui/slick/images/flags/rw.png | Bin 0 -> 533 bytes gui/slick/images/flags/sa.png | Bin 0 -> 551 bytes gui/slick/images/flags/sb.png | Bin 0 -> 624 bytes gui/slick/images/flags/sc.png | Bin 0 -> 608 bytes gui/slick/images/flags/sd.png | Bin 0 -> 492 bytes gui/slick/images/flags/se.png | Bin 0 -> 542 bytes gui/slick/images/flags/sg.png | Bin 0 -> 468 bytes gui/slick/images/flags/sh.png | Bin 0 -> 645 bytes gui/slick/images/flags/si.png | Bin 0 -> 510 bytes gui/slick/images/flags/sj.png | Bin 0 -> 512 bytes gui/slick/images/flags/sk.png | Bin 0 -> 562 bytes gui/slick/images/flags/sl.png | Bin 0 -> 436 bytes gui/slick/images/flags/sm.png | Bin 0 -> 502 bytes gui/slick/images/flags/sn.png | Bin 0 -> 532 bytes gui/slick/images/flags/so.png | Bin 0 -> 527 bytes gui/slick/images/flags/sr.png | Bin 0 -> 513 bytes gui/slick/images/flags/st.png | Bin 0 -> 584 bytes gui/slick/images/flags/sv.png | Bin 0 -> 542 bytes gui/slick/images/flags/sy.png | Bin 0 -> 422 bytes gui/slick/images/flags/sz.png | Bin 0 -> 643 bytes gui/slick/images/flags/tc.png | Bin 0 -> 624 bytes gui/slick/images/flags/td.png | Bin 0 -> 570 bytes gui/slick/images/flags/tf.png | Bin 0 -> 527 bytes gui/slick/images/flags/tg.png | Bin 0 -> 562 bytes gui/slick/images/flags/th.png | Bin 0 -> 452 bytes gui/slick/images/flags/tj.png | Bin 0 -> 496 bytes gui/slick/images/flags/tk.png | Bin 0 -> 638 bytes gui/slick/images/flags/tl.png | Bin 0 -> 514 bytes gui/slick/images/flags/tm.png | Bin 0 -> 593 bytes gui/slick/images/flags/tn.png | Bin 0 -> 495 bytes gui/slick/images/flags/to.png | Bin 0 -> 426 bytes gui/slick/images/flags/tr.png | Bin 0 -> 492 bytes gui/slick/images/flags/tt.png | Bin 0 -> 617 bytes gui/slick/images/flags/tv.png | Bin 0 -> 536 bytes gui/slick/images/flags/tw.png | Bin 0 -> 465 bytes gui/slick/images/flags/tz.png | Bin 0 -> 642 bytes gui/slick/images/flags/ua.png | Bin 0 -> 446 bytes gui/slick/images/flags/ug.png | Bin 0 -> 531 bytes gui/slick/images/flags/um.png | Bin 0 -> 571 bytes gui/slick/images/flags/us.png | Bin 0 -> 609 bytes gui/slick/images/flags/uy.png | Bin 0 -> 532 bytes gui/slick/images/flags/uz.png | Bin 0 -> 515 bytes gui/slick/images/flags/va.png | Bin 0 -> 553 bytes gui/slick/images/flags/vc.png | Bin 0 -> 577 bytes gui/slick/images/flags/ve.png | Bin 0 -> 528 bytes gui/slick/images/flags/vg.png | Bin 0 -> 630 bytes gui/slick/images/flags/vi.png | Bin 0 -> 616 bytes gui/slick/images/flags/vn.png | Bin 0 -> 474 bytes gui/slick/images/flags/vu.png | Bin 0 -> 604 bytes gui/slick/images/flags/wf.png | Bin 0 -> 554 bytes gui/slick/images/flags/ws.png | Bin 0 -> 476 bytes gui/slick/images/flags/ye.png | Bin 0 -> 413 bytes gui/slick/images/flags/yt.png | Bin 0 -> 593 bytes gui/slick/images/flags/za.png | Bin 0 -> 642 bytes gui/slick/images/flags/zh.png | Bin 0 -> 472 bytes gui/slick/images/flags/zm.png | Bin 0 -> 500 bytes gui/slick/images/flags/zw.png | Bin 0 -> 574 bytes gui/slick/images/glyphicons-config.png | Bin 0 -> 2920 bytes .../images/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes gui/slick/images/glyphicons-halflings.png | Bin 0 -> 13826 bytes .../apple-touch-icon-114x114-precomposed.png | Bin 0 -> 22156 bytes .../apple-touch-icon-144x144-precomposed.png | Bin 0 -> 30799 bytes .../apple-touch-icon-57x57-precomposed.png | Bin 0 -> 7272 bytes .../apple-touch-icon-72x72-precomposed.png | Bin 0 -> 10536 bytes .../ico/apple-touch-icon-precomposed.png | Bin 0 -> 7272 bytes gui/slick/images/ico/favicon.ico | Bin 0 -> 1150 bytes gui/slick/images/imdb.png | Bin 0 -> 9158 bytes gui/slick/images/info32.png | Bin 0 -> 402 bytes gui/slick/images/legend16.png | Bin 0 -> 443 bytes gui/slick/images/like.png | Bin 0 -> 132 bytes gui/slick/images/loading.gif | Bin 0 -> 9427 bytes gui/slick/images/loading16.gif | Bin 0 -> 1553 bytes gui/slick/images/loading16_333333.gif | Bin 0 -> 1849 bytes gui/slick/images/loading16_dddddd.gif | Bin 0 -> 1849 bytes gui/slick/images/loading32.gif | Bin 0 -> 3208 bytes gui/slick/images/menu/addshow16.png | Bin 0 -> 303 bytes gui/slick/images/menu/addshow16_over.png | Bin 0 -> 313 bytes gui/slick/images/menu/backlog16.png | Bin 0 -> 228 bytes gui/slick/images/menu/backlog16_over.png | Bin 0 -> 250 bytes gui/slick/images/menu/backlog_view16.png | Bin 0 -> 224 bytes gui/slick/images/menu/backlog_view16_over.png | Bin 0 -> 230 bytes gui/slick/images/menu/bittorrent.png | Bin 0 -> 11215 bytes gui/slick/images/menu/bittorrent_over.png | Bin 0 -> 18112 bytes gui/slick/images/menu/config16.png | Bin 0 -> 403 bytes gui/slick/images/menu/config16_over.png | Bin 0 -> 432 bytes gui/slick/images/menu/config_index16.png | Bin 0 -> 161 bytes gui/slick/images/menu/config_index16_over.png | Bin 0 -> 158 bytes gui/slick/images/menu/failed_download.png | Bin 0 -> 5560 bytes .../images/menu/failed_download_over.png | Bin 0 -> 16132 bytes gui/slick/images/menu/home16.png | Bin 0 -> 307 bytes gui/slick/images/menu/home16_over.png | Bin 0 -> 304 bytes gui/slick/images/menu/manage16.png | Bin 0 -> 235 bytes gui/slick/images/menu/manage16_over.png | Bin 0 -> 239 bytes gui/slick/images/menu/managesearches16.png | Bin 0 -> 347 bytes .../images/menu/managesearches16_over.png | Bin 0 -> 375 bytes gui/slick/images/menu/poster16.png | Bin 0 -> 206 bytes gui/slick/images/menu/poster16_over.png | Bin 0 -> 203 bytes gui/slick/images/menu/postprocess16.png | Bin 0 -> 165 bytes gui/slick/images/menu/postprocess16_over.png | Bin 0 -> 263 bytes gui/slick/images/menu/restart16.png | Bin 0 -> 360 bytes gui/slick/images/menu/restart16_over.png | Bin 0 -> 390 bytes gui/slick/images/menu/shutdown16.png | Bin 0 -> 371 bytes gui/slick/images/menu/shutdown16_over.png | Bin 0 -> 400 bytes gui/slick/images/menu/system18.png | Bin 0 -> 3278 bytes gui/slick/images/menu/update16.png | Bin 0 -> 283 bytes gui/slick/images/menu/update16_over.png | Bin 0 -> 279 bytes gui/slick/images/menu/viewlog16.png | Bin 0 -> 168 bytes gui/slick/images/menu/viewlog16_over.png | Bin 0 -> 175 bytes gui/slick/images/menu/viewlog_errors16.png | Bin 0 -> 242 bytes .../images/menu/viewlog_errors16_over.png | Bin 0 -> 242 bytes gui/slick/images/menu/xbmc16.png | Bin 0 -> 491 bytes gui/slick/images/menu/xbmc16_over.png | Bin 0 -> 488 bytes gui/slick/images/minus.png | Bin 0 -> 3630 bytes gui/slick/images/network/1live.png | Bin 0 -> 866 bytes gui/slick/images/network/33.png | Bin 0 -> 1033 bytes gui/slick/images/network/3fm.png | Bin 0 -> 1474 bytes gui/slick/images/network/3sat.png | Bin 0 -> 1246 bytes gui/slick/images/network/7mate.png | Bin 0 -> 1426 bytes gui/slick/images/network/a&e.png | Bin 0 -> 996 bytes gui/slick/images/network/aande.png | Bin 0 -> 996 bytes gui/slick/images/network/abc (Australia).png | Bin 0 -> 1539 bytes gui/slick/images/network/abc family.png | Bin 0 -> 1139 bytes gui/slick/images/network/abc news.png | Bin 0 -> 913 bytes gui/slick/images/network/abc.png | Bin 0 -> 913 bytes gui/slick/images/network/adult swim.png | Bin 0 -> 1004 bytes gui/slick/images/network/adult-swim.png | Bin 0 -> 1004 bytes gui/slick/images/network/adultswim.png | Bin 0 -> 1004 bytes gui/slick/images/network/amazon.png | Bin 0 -> 2462 bytes gui/slick/images/network/amc.png | Bin 0 -> 982 bytes gui/slick/images/network/animal planet.png | Bin 0 -> 1743 bytes gui/slick/images/network/animalplanet.png | Bin 0 -> 1743 bytes gui/slick/images/network/animax.png | Bin 0 -> 1396 bytes gui/slick/images/network/anime network.png | Bin 0 -> 938 bytes gui/slick/images/network/antena 3.png | Bin 0 -> 1108 bytes gui/slick/images/network/ard.png | Bin 0 -> 662 bytes gui/slick/images/network/arte.png | Bin 0 -> 919 bytes gui/slick/images/network/at-x.png | Bin 0 -> 1059 bytes gui/slick/images/network/at5.png | Bin 0 -> 885 bytes gui/slick/images/network/avro.png | Bin 0 -> 1023 bytes gui/slick/images/network/bandai visual.png | Bin 0 -> 1420 bytes gui/slick/images/network/bandai.png | Bin 0 -> 975 bytes gui/slick/images/network/bbc america.png | Bin 0 -> 977 bytes .../images/network/bbc entertainment.png | Bin 0 -> 977 bytes gui/slick/images/network/bbc four.png | Bin 0 -> 977 bytes gui/slick/images/network/bbc one.png | Bin 0 -> 977 bytes gui/slick/images/network/bbc prime.png | Bin 0 -> 977 bytes gui/slick/images/network/bbc three.png | Bin 0 -> 977 bytes gui/slick/images/network/bbc two.png | Bin 0 -> 977 bytes gui/slick/images/network/bbc.png | Bin 0 -> 977 bytes gui/slick/images/network/bio..png | Bin 0 -> 1405 bytes .../images/network/biography channel.png | Bin 0 -> 1405 bytes gui/slick/images/network/bloomberg.png | Bin 0 -> 1084 bytes gui/slick/images/network/bnn.png | Bin 0 -> 1804 bytes gui/slick/images/network/bravo.png | Bin 0 -> 1062 bytes gui/slick/images/network/canal+.png | Bin 0 -> 1025 bytes gui/slick/images/network/canvas.png | Bin 0 -> 874 bytes gui/slick/images/network/cartoon network.png | Bin 0 -> 1250 bytes gui/slick/images/network/cartoonnetwork.png | Bin 0 -> 1250 bytes gui/slick/images/network/cbbc.png | Bin 0 -> 1509 bytes gui/slick/images/network/cbc.png | Bin 0 -> 976 bytes gui/slick/images/network/cbeebies.png | Bin 0 -> 1683 bytes gui/slick/images/network/cbs.png | Bin 0 -> 3966 bytes gui/slick/images/network/channel 4.png | Bin 0 -> 1035 bytes gui/slick/images/network/channel ten.png | Bin 0 -> 1009 bytes gui/slick/images/network/cinemax.png | Bin 0 -> 4017 bytes gui/slick/images/network/city.png | Bin 0 -> 4048 bytes gui/slick/images/network/cnn.png | Bin 0 -> 1629 bytes .../images/network/comedy central Family.png | Bin 0 -> 1055 bytes .../images/network/comedy central HD.png | Bin 0 -> 1055 bytes gui/slick/images/network/comedy central.png | Bin 0 -> 1055 bytes .../images/network/comedy entral old.png | Bin 0 -> 1172 bytes gui/slick/images/network/comedycentral.png | Bin 0 -> 1055 bytes gui/slick/images/network/ctc.png | Bin 0 -> 2956 bytes gui/slick/images/network/ctv.png | Bin 0 -> 1172 bytes gui/slick/images/network/cuatro.png | Bin 0 -> 1080 bytes gui/slick/images/network/cw.png | Bin 0 -> 1054 bytes .../images/network/discovery channel.png | Bin 0 -> 1091 bytes gui/slick/images/network/discovery.png | Bin 0 -> 1091 bytes gui/slick/images/network/discoverychannel.png | Bin 0 -> 1091 bytes gui/slick/images/network/disney channel.png | Bin 0 -> 1428 bytes gui/slick/images/network/disney xd.png | Bin 0 -> 1094 bytes gui/slick/images/network/disney.png | Bin 0 -> 1428 bytes gui/slick/images/network/disneychannel.png | Bin 0 -> 1428 bytes gui/slick/images/network/diy network.png | Bin 0 -> 1157 bytes gui/slick/images/network/dmax.png | Bin 0 -> 807 bytes gui/slick/images/network/e!.png | Bin 0 -> 1319 bytes gui/slick/images/network/e4.png | Bin 0 -> 1124 bytes gui/slick/images/network/een.png | Bin 0 -> 2402 bytes gui/slick/images/network/einslive.png | Bin 0 -> 866 bytes gui/slick/images/network/endemol.png | Bin 0 -> 1161 bytes gui/slick/images/network/entertainment.png | Bin 0 -> 1319 bytes .../images/network/eredivisie live 1.png | Bin 0 -> 1388 bytes .../images/network/eredivisie live 2.png | Bin 0 -> 1388 bytes gui/slick/images/network/eredivisie live.png | Bin 0 -> 1388 bytes gui/slick/images/network/espn.png | Bin 0 -> 866 bytes gui/slick/images/network/eurosport 1.png | Bin 0 -> 1313 bytes gui/slick/images/network/eurosport 2.png | Bin 0 -> 1313 bytes gui/slick/images/network/eurosport hd.png | Bin 0 -> 1313 bytes gui/slick/images/network/eurosport.png | Bin 0 -> 1313 bytes gui/slick/images/network/five.png | Bin 0 -> 1151 bytes gui/slick/images/network/food network.png | Bin 0 -> 1400 bytes .../network/fox television classics.png | Bin 0 -> 1353 bytes gui/slick/images/network/fox.png | Bin 0 -> 1231 bytes gui/slick/images/network/france 2.png | Bin 0 -> 733 bytes gui/slick/images/network/france 3.png | Bin 0 -> 749 bytes gui/slick/images/network/fuji TV.png | Bin 0 -> 1543 bytes gui/slick/images/network/funimation.png | Bin 0 -> 831 bytes gui/slick/images/network/fx.png | Bin 0 -> 1162 bytes gui/slick/images/network/fxnetworks.png | Bin 0 -> 1162 bytes gui/slick/images/network/fxx.png | Bin 0 -> 962 bytes gui/slick/images/network/g4.png | Bin 0 -> 1297 bytes gui/slick/images/network/g4_2.png | Bin 0 -> 1297 bytes .../images/network/game show network.png | Bin 0 -> 1050 bytes gui/slick/images/network/global tv.png | Bin 0 -> 1159 bytes gui/slick/images/network/hbo.png | Bin 0 -> 1147 bytes gui/slick/images/network/hdnet.png | Bin 0 -> 1270 bytes gui/slick/images/network/history.png | Bin 0 -> 1717 bytes gui/slick/images/network/historychannel.png | Bin 0 -> 1717 bytes gui/slick/images/network/hulu presents.png | Bin 0 -> 751 bytes gui/slick/images/network/hulu.png | Bin 0 -> 751 bytes gui/slick/images/network/ifc.png | Bin 0 -> 979 bytes gui/slick/images/network/itv.png | Bin 0 -> 3794 bytes gui/slick/images/network/itv1.png | Bin 0 -> 915 bytes gui/slick/images/network/ketnet.png | Bin 0 -> 918 bytes gui/slick/images/network/kro.png | Bin 0 -> 1221 bytes gui/slick/images/network/la1.png | Bin 0 -> 740 bytes gui/slick/images/network/la2.png | Bin 0 -> 881 bytes gui/slick/images/network/lasexta.png | Bin 0 -> 1195 bytes gui/slick/images/network/lifetime.png | Bin 0 -> 1271 bytes gui/slick/images/network/m6.png | Bin 0 -> 978 bytes .../manhattan neighborhood network.png | Bin 0 -> 851 bytes gui/slick/images/network/mbs.png | Bin 0 -> 3555 bytes gui/slick/images/network/mdr.png | Bin 0 -> 916 bytes gui/slick/images/network/motorvision tv.png | Bin 0 -> 838 bytes gui/slick/images/network/motorvision.png | Bin 0 -> 838 bytes gui/slick/images/network/mtv.png | Bin 0 -> 1049 bytes gui/slick/images/network/nat geo wild.png | Bin 0 -> 1273 bytes .../images/network/national geographic.png | Bin 0 -> 1376 bytes gui/slick/images/network/nbc.png | Bin 0 -> 1147 bytes gui/slick/images/network/nbcu tv.png | Bin 0 -> 1147 bytes gui/slick/images/network/ndr.png | Bin 0 -> 787 bytes gui/slick/images/network/nederland 1.png | Bin 0 -> 511 bytes gui/slick/images/network/nederland 2.png | Bin 0 -> 708 bytes gui/slick/images/network/nederland 3.png | Bin 0 -> 847 bytes gui/slick/images/network/net 5.png | Bin 0 -> 556 bytes gui/slick/images/network/net5.png | Bin 0 -> 556 bytes gui/slick/images/network/netflix.png | Bin 0 -> 4902 bytes gui/slick/images/network/network ten.png | Bin 0 -> 978 bytes gui/slick/images/network/ngc.png | Bin 0 -> 1716 bytes gui/slick/images/network/nhk.png | Bin 0 -> 3254 bytes gui/slick/images/network/nick at nite.png | Bin 0 -> 1415 bytes .../images/network/nickToons network.png | Bin 0 -> 1495 bytes gui/slick/images/network/nickelodeon.png | Bin 0 -> 1495 bytes gui/slick/images/network/nonetwork.png | Bin 0 -> 2085 bytes gui/slick/images/network/ntv.png | Bin 0 -> 1927 bytes gui/slick/images/network/orf.png | Bin 0 -> 921 bytes gui/slick/images/network/orf1 hd.png | Bin 0 -> 1087 bytes gui/slick/images/network/oxygen.png | Bin 0 -> 3757 bytes gui/slick/images/network/pbs.png | Bin 0 -> 1329 bytes gui/slick/images/network/playboy tv.png | Bin 0 -> 791 bytes gui/slick/images/network/private spice.png | Bin 0 -> 1358 bytes gui/slick/images/network/pro7.png | Bin 0 -> 462 bytes gui/slick/images/network/production i.g.png | Bin 0 -> 1058 bytes gui/slick/images/network/radio west.png | Bin 0 -> 810 bytes gui/slick/images/network/revision3.png | Bin 0 -> 1215 bytes gui/slick/images/network/rtl 4.png | Bin 0 -> 1094 bytes gui/slick/images/network/rtl 5.png | Bin 0 -> 1107 bytes gui/slick/images/network/rtl 7.png | Bin 0 -> 1049 bytes gui/slick/images/network/rtl 8.png | Bin 0 -> 1048 bytes gui/slick/images/network/rtl television.png | Bin 0 -> 2775 bytes gui/slick/images/network/rtl4.png | Bin 0 -> 1094 bytes gui/slick/images/network/rtl5.png | Bin 0 -> 1107 bytes gui/slick/images/network/rtl7.png | Bin 0 -> 1049 bytes gui/slick/images/network/rtl8.png | Bin 0 -> 1048 bytes gui/slick/images/network/sat1.png | Bin 0 -> 1346 bytes gui/slick/images/network/sbs 6.png | Bin 0 -> 1043 bytes gui/slick/images/network/sbs.png | Bin 0 -> 1080 bytes gui/slick/images/network/sbs6.png | Bin 0 -> 1043 bytes gui/slick/images/network/scifi.png | Bin 0 -> 1323 bytes gui/slick/images/network/seven network.png | Bin 0 -> 628 bytes gui/slick/images/network/showcase.png | Bin 0 -> 1367 bytes gui/slick/images/network/showtime.png | Bin 0 -> 1324 bytes gui/slick/images/network/sky.png | Bin 0 -> 1353 bytes gui/slick/images/network/sky1.png | Bin 0 -> 1353 bytes gui/slick/images/network/speed channel.png | Bin 0 -> 1493 bytes gui/slick/images/network/spike tv.png | Bin 0 -> 1112 bytes gui/slick/images/network/starz!.png | Bin 0 -> 1198 bytes gui/slick/images/network/starz.png | Bin 0 -> 1198 bytes gui/slick/images/network/style network.png | Bin 0 -> 903 bytes gui/slick/images/network/sundance.png | Bin 0 -> 1761 bytes gui/slick/images/network/sunrise.png | Bin 0 -> 1230 bytes gui/slick/images/network/super channel.png | Bin 0 -> 1398 bytes gui/slick/images/network/syfy.png | Bin 0 -> 1323 bytes gui/slick/images/network/tbs superstation.png | Bin 0 -> 851 bytes gui/slick/images/network/tbs.png | Bin 0 -> 851 bytes gui/slick/images/network/telecinco.png | Bin 0 -> 859 bytes gui/slick/images/network/the cw.png | Bin 0 -> 1054 bytes .../images/network/the movie network.png | Bin 0 -> 1044 bytes gui/slick/images/network/the wb.png | Bin 0 -> 1074 bytes gui/slick/images/network/the-cw.png | Bin 0 -> 1054 bytes gui/slick/images/network/thecw.png | Bin 0 -> 1054 bytes gui/slick/images/network/thewb.png | Bin 0 -> 1074 bytes gui/slick/images/network/tmf.png | Bin 0 -> 814 bytes gui/slick/images/network/tnt.png | Bin 0 -> 1124 bytes gui/slick/images/network/toei animation.png | Bin 0 -> 1437 bytes .../network/tokyo broadcasting system.png | Bin 0 -> 851 bytes gui/slick/images/network/tokyo mx.png | Bin 0 -> 854 bytes gui/slick/images/network/tv asahi.png | Bin 0 -> 3797 bytes gui/slick/images/network/tv guide.png | Bin 0 -> 1041 bytes gui/slick/images/network/tv saitama.png | Bin 0 -> 2641 bytes gui/slick/images/network/tv tokyo.png | Bin 0 -> 1221 bytes gui/slick/images/network/tv west.png | Bin 0 -> 810 bytes gui/slick/images/network/tv3.png | Bin 0 -> 1003 bytes gui/slick/images/network/tve.png | Bin 0 -> 740 bytes gui/slick/images/network/tve1.png | Bin 0 -> 740 bytes gui/slick/images/network/tve2.png | Bin 0 -> 881 bytes gui/slick/images/network/upn.png | Bin 0 -> 1113 bytes gui/slick/images/network/usa network.png | Bin 0 -> 1110 bytes gui/slick/images/network/usa-network.png | Bin 0 -> 1110 bytes gui/slick/images/network/usa.png | Bin 0 -> 1110 bytes gui/slick/images/network/usanetwork.png | Bin 0 -> 1110 bytes gui/slick/images/network/vara.png | Bin 0 -> 1164 bytes gui/slick/images/network/veronica.png | Bin 0 -> 1441 bytes gui/slick/images/network/vh1.png | Bin 0 -> 1031 bytes gui/slick/images/network/viz media.png | Bin 0 -> 1102 bytes gui/slick/images/network/vox.png | Bin 0 -> 970 bytes gui/slick/images/network/vpro.png | Bin 0 -> 1561 bytes gui/slick/images/network/vtm.png | Bin 0 -> 898 bytes gui/slick/images/network/wowow.png | Bin 0 -> 1743 bytes gui/slick/images/network/xebec.png | Bin 0 -> 1394 bytes gui/slick/images/network/youtube.png | Bin 0 -> 2342 bytes gui/slick/images/network/zdf.png | Bin 0 -> 986 bytes gui/slick/images/next.gif | Bin 0 -> 898 bytes gui/slick/images/nfo-no.gif | Bin 0 -> 98 bytes gui/slick/images/nfo.gif | Bin 0 -> 98 bytes gui/slick/images/no16.png | Bin 0 -> 2931 bytes gui/slick/images/notifiers/boxcar.png | Bin 0 -> 1537 bytes gui/slick/images/notifiers/email.png | Bin 0 -> 4258 bytes gui/slick/images/notifiers/growl.png | Bin 0 -> 1783 bytes gui/slick/images/notifiers/libnotify.png | Bin 0 -> 1375 bytes gui/slick/images/notifiers/nma.png | Bin 0 -> 1739 bytes gui/slick/images/notifiers/nmj.png | Bin 0 -> 1117 bytes gui/slick/images/notifiers/notifo.png | Bin 0 -> 1763 bytes gui/slick/images/notifiers/plex.png | Bin 0 -> 1759 bytes gui/slick/images/notifiers/prowl.png | Bin 0 -> 1913 bytes gui/slick/images/notifiers/pushalot.png | Bin 0 -> 927 bytes gui/slick/images/notifiers/pushbullet.png | Bin 0 -> 1878 bytes gui/slick/images/notifiers/pushover.png | Bin 0 -> 1700 bytes gui/slick/images/notifiers/pytivo.png | Bin 0 -> 2184 bytes gui/slick/images/notifiers/synoindex.png | Bin 0 -> 1667 bytes .../images/notifiers/synologynotifier.png | Bin 0 -> 2041 bytes gui/slick/images/notifiers/trakt.png | Bin 0 -> 850 bytes gui/slick/images/notifiers/twitter.png | Bin 0 -> 632 bytes gui/slick/images/notifiers/xbmc.png | Bin 0 -> 1976 bytes gui/slick/images/paypal/btn_donateCC_LG.gif | Bin 0 -> 2332 bytes gui/slick/images/paypal/btn_donate_LG.gif | Bin 0 -> 1714 bytes gui/slick/images/plus.png | Bin 0 -> 4657 bytes gui/slick/images/poster.png | Bin 0 -> 683472 bytes gui/slick/images/prev.gif | Bin 0 -> 899 bytes gui/slick/images/providers/bin_req.png | Bin 0 -> 345 bytes gui/slick/images/providers/btn.png | Bin 0 -> 945 bytes gui/slick/images/providers/ezrss.png | Bin 0 -> 889 bytes gui/slick/images/providers/eztv_bt_chat.png | Bin 0 -> 481 bytes gui/slick/images/providers/hdbits.png | Bin 0 -> 639 bytes gui/slick/images/providers/hdtorrents.png | Bin 0 -> 4826 bytes gui/slick/images/providers/iptorrents.png | Bin 0 -> 406 bytes gui/slick/images/providers/kat.png | Bin 0 -> 3022 bytes gui/slick/images/providers/missing.png | Bin 0 -> 236 bytes gui/slick/images/providers/newzbin.png | Bin 0 -> 979 bytes gui/slick/images/providers/newznab.png | Bin 0 -> 200 bytes gui/slick/images/providers/nextgen.png | Bin 0 -> 1150 bytes gui/slick/images/providers/nzb_su.png | Bin 0 -> 190 bytes gui/slick/images/providers/nzbfinder.png | Bin 0 -> 877 bytes gui/slick/images/providers/nzbgeek.png | Bin 0 -> 747 bytes gui/slick/images/providers/nzbs_org.png | Bin 0 -> 209 bytes gui/slick/images/providers/nzbs_org_old.png | Bin 0 -> 209 bytes gui/slick/images/providers/omgwtfnzbs.png | Bin 0 -> 338 bytes gui/slick/images/providers/publichd.png | Bin 0 -> 335 bytes gui/slick/images/providers/scc.png | Bin 0 -> 681 bytes .../images/providers/sick_beard_index.png | Bin 0 -> 844 bytes gui/slick/images/providers/thepiratebay.png | Bin 0 -> 2967 bytes gui/slick/images/providers/thepiratebay_.png | Bin 0 -> 1609 bytes gui/slick/images/providers/torrentday.png | Bin 0 -> 816 bytes gui/slick/images/providers/torrentleech.png | Bin 0 -> 3853 bytes gui/slick/images/providers/torrentrss.png | Bin 0 -> 634 bytes gui/slick/images/providers/tvbinz.png | Bin 0 -> 349 bytes gui/slick/images/providers/tvnzb.png | Bin 0 -> 754 bytes gui/slick/images/providers/tvtorrents.png | Bin 0 -> 703 bytes gui/slick/images/providers/usenet_crawler.png | Bin 0 -> 818 bytes gui/slick/images/providers/womble_s_index.png | Bin 0 -> 268 bytes gui/slick/images/save.png | Bin 0 -> 1190 bytes gui/slick/images/search32.png | Bin 0 -> 321 bytes gui/slick/images/shadow.png | Bin 0 -> 1698 bytes gui/slick/images/sickbeard.png | Bin 0 -> 15068 bytes gui/slick/images/subtitles/addic7ed.png | Bin 0 -> 830 bytes gui/slick/images/subtitles/bierdopje.png | Bin 0 -> 947 bytes gui/slick/images/subtitles/itasa.png | Bin 0 -> 1150 bytes gui/slick/images/subtitles/opensubtitles.png | Bin 0 -> 315 bytes gui/slick/images/subtitles/podnapisiweb.png | Bin 0 -> 221 bytes gui/slick/images/subtitles/subscene.png | Bin 0 -> 1159 bytes gui/slick/images/subtitles/subswiki.png | Bin 0 -> 834 bytes gui/slick/images/subtitles/subtitlesource.png | Bin 0 -> 485 bytes gui/slick/images/subtitles/subtitulos.png | Bin 0 -> 642 bytes gui/slick/images/subtitles/thesubdb.png | Bin 0 -> 524 bytes gui/slick/images/subtitles/tvsubtitles.png | Bin 0 -> 826 bytes gui/slick/images/subtitles/usub.png | Bin 0 -> 1006 bytes gui/slick/images/tablesorter/asc.gif | Bin 0 -> 54 bytes gui/slick/images/tablesorter/bg.gif | Bin 0 -> 64 bytes gui/slick/images/tablesorter/desc.gif | Bin 0 -> 54 bytes gui/slick/images/tbn-no.gif | Bin 0 -> 101 bytes gui/slick/images/tbn.gif | Bin 0 -> 101 bytes gui/slick/images/thetvdb16.png | Bin 0 -> 817 bytes gui/slick/images/top.gif | Bin 0 -> 252 bytes gui/slick/images/xbmc-notify.png | Bin 0 -> 8616 bytes gui/slick/images/yes16.png | Bin 0 -> 227 bytes gui/slick/interfaces/default/apiBuilder.tmpl | 378 + .../interfaces/default/comingEpisodes.tmpl | 354 + gui/slick/interfaces/default/config.tmpl | 36 + .../interfaces/default/config_general.tmpl | 327 + .../default/config_notifications.tmpl | 1304 + .../default/config_postProcessing.tmpl | 630 + .../interfaces/default/config_providers.tmpl | 513 + .../interfaces/default/config_search.tmpl | 455 + .../interfaces/default/config_subtitles.tmpl | 157 + gui/slick/interfaces/default/displayShow.tmpl | 314 + gui/slick/interfaces/default/editShow.tmpl | 180 + gui/slick/interfaces/default/errorlogs.tmpl | 32 + .../interfaces/default/genericMessage.tmpl | 14 + gui/slick/interfaces/default/history.tmpl | 216 + gui/slick/interfaces/default/home.tmpl | 270 + .../default/home_addExistingShow.tmpl | 67 + .../interfaces/default/home_addShows.tmpl | 42 + .../interfaces/default/home_massAddTable.tmpl | 48 + .../interfaces/default/home_newShow.tmpl | 91 + .../interfaces/default/home_postprocess.tmpl | 49 + .../default/inc_addShowOptions.tmpl | 46 + gui/slick/interfaces/default/inc_bottom.tmpl | 31 + .../default/inc_qualityChooser.tmpl | 47 + .../interfaces/default/inc_rootDirs.tmpl | 28 + gui/slick/interfaces/default/inc_top.tmpl | 298 + gui/slick/interfaces/default/manage.tmpl | 163 + .../default/manage_backlogOverview.tmpl | 97 + .../default/manage_episodeStatuses.tmpl | 86 + .../default/manage_failedDownloads.tmpl | 91 + .../default/manage_manageSearches.tmpl | 42 + .../interfaces/default/manage_massEdit.tmpl | 125 + .../default/manage_subtitleMissed.tmpl | 65 + .../interfaces/default/manage_torrents.tmpl | 22 + gui/slick/interfaces/default/restart.tmpl | 17 + .../interfaces/default/restart_bare.tmpl | 44 + gui/slick/interfaces/default/testRename.tmpl | 83 + gui/slick/interfaces/default/viewlogs.tmpl | 49 + gui/slick/js/addExistingShow.js | 78 + gui/slick/js/addShowOptions.js | 27 + gui/slick/js/ajaxEpRetry.js | 51 + gui/slick/js/ajaxEpSearch.js | 52 + gui/slick/js/ajaxEpSubtitles.js | 49 + gui/slick/js/ajaxNotifications.js | 25 + gui/slick/js/apibuilder.js | 641 + gui/slick/js/browser.js | 179 + gui/slick/js/config.js | 49 + gui/slick/js/configNotifications.js | 316 + gui/slick/js/configPostProcessing.js | 329 + gui/slick/js/configProviders.js | 487 + gui/slick/js/configSearch.js | 147 + gui/slick/js/configSubtitles.js | 69 + gui/slick/js/displayShow.js | 219 + gui/slick/js/failedDownloads.js | 60 + gui/slick/js/fancybox/blank.gif | Bin 0 -> 43 bytes gui/slick/js/fancybox/fancy_close.png | Bin 0 -> 1517 bytes gui/slick/js/fancybox/fancy_loading.png | Bin 0 -> 10195 bytes gui/slick/js/fancybox/fancy_nav_left.png | Bin 0 -> 1446 bytes gui/slick/js/fancybox/fancy_nav_right.png | Bin 0 -> 1454 bytes gui/slick/js/fancybox/fancy_shadow_e.png | Bin 0 -> 107 bytes gui/slick/js/fancybox/fancy_shadow_n.png | Bin 0 -> 106 bytes gui/slick/js/fancybox/fancy_shadow_ne.png | Bin 0 -> 347 bytes gui/slick/js/fancybox/fancy_shadow_nw.png | Bin 0 -> 324 bytes gui/slick/js/fancybox/fancy_shadow_s.png | Bin 0 -> 111 bytes gui/slick/js/fancybox/fancy_shadow_se.png | Bin 0 -> 352 bytes gui/slick/js/fancybox/fancy_shadow_sw.png | Bin 0 -> 340 bytes gui/slick/js/fancybox/fancy_shadow_w.png | Bin 0 -> 103 bytes gui/slick/js/fancybox/fancy_title_left.png | Bin 0 -> 503 bytes gui/slick/js/fancybox/fancy_title_main.png | Bin 0 -> 96 bytes gui/slick/js/fancybox/fancy_title_over.png | Bin 0 -> 70 bytes gui/slick/js/fancybox/fancy_title_right.png | Bin 0 -> 506 bytes gui/slick/js/fancybox/fancybox-x.png | Bin 0 -> 203 bytes gui/slick/js/fancybox/fancybox-y.png | Bin 0 -> 176 bytes gui/slick/js/fancybox/fancybox.png | Bin 0 -> 15287 bytes .../js/fancybox/jquery.easing-1.3.pack.js | 72 + .../js/fancybox/jquery.fancybox-1.3.4.css | 359 + .../js/fancybox/jquery.fancybox-1.3.4.js | 1156 + .../js/fancybox/jquery.fancybox-1.3.4.pack.js | 46 + .../fancybox/jquery.mousewheel-3.0.4.pack.js | 14 + gui/slick/js/formwizard.js | 212 + gui/slick/js/lib/jquery-1.8.3.min.js | 2 + .../js/lib/jquery-ui-1.10.4.custom.min.js | 6 + gui/slick/js/lib/jquery.bookmarkscroll.js | 51 + gui/slick/js/lib/jquery.cookie.js | 47 + gui/slick/js/lib/jquery.cookiejar.js | 200 + gui/slick/js/lib/jquery.form-3.35.js | 1190 + gui/slick/js/lib/jquery.json-2.2.min.js | 31 + gui/slick/js/lib/jquery.pnotify-1.0.2.min.js | 34 + gui/slick/js/lib/jquery.pnotify-1.2.0.min.js | 40 + gui/slick/js/lib/jquery.qtip-2.0.1.min.js | 2 + .../js/lib/jquery.qtip-2012-04-26.min.js | 13 + .../js/lib/jquery.scrolltopcontrol-1.1.js | 76 + gui/slick/js/lib/jquery.selectboxes.min.js | 14 + .../js/lib/jquery.tablesorter-2.1.19.min.js | 6 + .../js/lib/jquery.tablesorter.widgets.min.js | 10 + gui/slick/js/lib/jquery.tokeninput.js | 861 + .../js/lib/jquery.ui.touch-punch-0.2.2.min.js | 11 + gui/slick/js/lib/superfish-1.4.8.js | 120 + gui/slick/js/lib/supersubs-0.2b.js | 90 + gui/slick/js/manageEpisodeStatuses.js | 67 + gui/slick/js/manageSubtitleMissed.js | 72 + gui/slick/js/massEdit.js | 25 + gui/slick/js/massUpdate.js | 116 + gui/slick/js/newShow.js | 217 + gui/slick/js/plotTooltip.js | 40 + gui/slick/js/qualityChooser.js | 36 + gui/slick/js/restart.js | 78 + gui/slick/js/rootDirs.js | 189 + gui/slick/js/script.js | 131 + gui/slick/js/testRename.js | 31 + init.fedora | 94 + init.freebsd | 92 + init.solaris11 | 95 + init.systemd | 57 + init.ubuntu | 130 + lib/MultipartPostHandler.py | 89 + lib/__init__.py | 1 + lib/bencode/BTL.py | 2 + lib/bencode/LICENSE.txt | 143 + lib/bencode/__init__.py | 1 + lib/bencode/bencode.py | 131 + lib/bs4/__init__.py | 406 + lib/bs4/builder/__init__.py | 321 + lib/bs4/builder/_html5lib.py | 285 + lib/bs4/builder/_htmlparser.py | 258 + lib/bs4/builder/_lxml.py | 233 + lib/bs4/dammit.py | 829 + lib/bs4/diagnose.py | 204 + lib/bs4/element.py | 1611 + lib/bs4/testing.py | 592 + lib/bs4/tests/__init__.py | 1 + lib/bs4/tests/test_builder_registry.py | 141 + lib/bs4/tests/test_docs.py | 36 + lib/bs4/tests/test_html5lib.py | 85 + lib/bs4/tests/test_htmlparser.py | 19 + lib/bs4/tests/test_lxml.py | 91 + lib/bs4/tests/test_soup.py | 434 + lib/bs4/tests/test_tree.py | 1829 + lib/certgen.py | 82 + lib/configobj.py | 2455 + lib/dateutil/__init__.py | 9 + lib/dateutil/easter.py | 92 + lib/dateutil/parser.py | 886 + lib/dateutil/relativedelta.py | 432 + lib/dateutil/rrule.py | 1097 + lib/dateutil/tz.py | 951 + lib/dateutil/tzwin.py | 180 + lib/dateutil/zoneinfo/__init__.py | 87 + lib/dateutil/zoneinfo/zoneinfo-2013i.tar.gz | Bin 0 -> 168660 bytes lib/enzyme/__init__.py | 63 + lib/enzyme/asf.py | 389 + lib/enzyme/core.py | 450 + lib/enzyme/exceptions.py | 28 + lib/enzyme/flv.py | 181 + lib/enzyme/fourcc.py | 850 + lib/enzyme/infos.py | 19 + lib/enzyme/language.py | 535 + lib/enzyme/mkv.py | 840 + lib/enzyme/mp4.py | 474 + lib/enzyme/mpeg.py | 913 + lib/enzyme/ogm.py | 299 + lib/enzyme/real.py | 118 + lib/enzyme/riff.py | 566 + lib/enzyme/strutils.py | 78 + lib/growl/__init__.py | 0 lib/growl/gntp.py | 441 + lib/growl/gntp_bridge.py | 67 + lib/guessit/ISO-3166-1_utf8.txt | 249 + lib/guessit/ISO-639-2_utf-8.txt | 485 + lib/guessit/__init__.py | 275 + lib/guessit/__main__.py | 115 + lib/guessit/country.py | 112 + lib/guessit/date.py | 133 + lib/guessit/fileutils.py | 90 + lib/guessit/guess.py | 318 + lib/guessit/hash_ed2k.py | 65 + lib/guessit/hash_mpc.py | 57 + lib/guessit/language.py | 390 + lib/guessit/matcher.py | 162 + lib/guessit/matchtree.py | 287 + lib/guessit/patterns.py | 244 + lib/guessit/slogging.py | 87 + lib/guessit/textutils.py | 221 + lib/guessit/transfo/__init__.py | 101 + lib/guessit/transfo/guess_bonus_features.py | 61 + lib/guessit/transfo/guess_country.py | 48 + lib/guessit/transfo/guess_date.py | 38 + .../guess_episode_info_from_position.py | 146 + lib/guessit/transfo/guess_episodes_rexps.py | 66 + lib/guessit/transfo/guess_filetype.py | 176 + lib/guessit/transfo/guess_idnumber.py | 71 + lib/guessit/transfo/guess_language.py | 43 + .../guess_movie_title_from_position.py | 173 + lib/guessit/transfo/guess_properties.py | 38 + lib/guessit/transfo/guess_release_group.py | 86 + lib/guessit/transfo/guess_video_rexps.py | 49 + .../transfo/guess_weak_episodes_rexps.py | 62 + lib/guessit/transfo/guess_website.py | 39 + lib/guessit/transfo/guess_year.py | 50 + lib/guessit/transfo/post_process.py | 73 + lib/guessit/transfo/split_explicit_groups.py | 44 + lib/guessit/transfo/split_on_dash.py | 42 + lib/guessit/transfo/split_path_components.py | 36 + lib/hachoir_core/__init__.py | 2 + lib/hachoir_core/benchmark.py | 210 + lib/hachoir_core/bits.py | 277 + lib/hachoir_core/cmd_line.py | 43 + lib/hachoir_core/compatibility.py | 185 + lib/hachoir_core/config.py | 29 + lib/hachoir_core/dict.py | 183 + lib/hachoir_core/endian.py | 15 + lib/hachoir_core/error.py | 45 + lib/hachoir_core/event_handler.py | 26 + lib/hachoir_core/field/__init__.py | 59 + lib/hachoir_core/field/basic_field_set.py | 147 + lib/hachoir_core/field/bit_field.py | 68 + lib/hachoir_core/field/byte_field.py | 73 + lib/hachoir_core/field/character.py | 27 + lib/hachoir_core/field/enum.py | 26 + lib/hachoir_core/field/fake_array.py | 81 + lib/hachoir_core/field/field.py | 260 + lib/hachoir_core/field/field_set.py | 7 + lib/hachoir_core/field/float.py | 99 + lib/hachoir_core/field/generic_field_set.py | 532 + lib/hachoir_core/field/helper.py | 57 + lib/hachoir_core/field/integer.py | 44 + lib/hachoir_core/field/link.py | 109 + .../field/new_seekable_field_set.py | 82 + lib/hachoir_core/field/padding.py | 138 + lib/hachoir_core/field/parser.py | 40 + lib/hachoir_core/field/seekable_field_set.py | 182 + lib/hachoir_core/field/static_field_set.py | 54 + lib/hachoir_core/field/string_field.py | 402 + lib/hachoir_core/field/sub_file.py | 72 + lib/hachoir_core/field/timestamp.py | 86 + lib/hachoir_core/field/vector.py | 38 + lib/hachoir_core/i18n.py | 214 + lib/hachoir_core/iso639.py | 558 + lib/hachoir_core/language.py | 23 + lib/hachoir_core/log.py | 144 + lib/hachoir_core/memory.py | 99 + lib/hachoir_core/profiler.py | 31 + lib/hachoir_core/stream/__init__.py | 11 + lib/hachoir_core/stream/input.py | 563 + lib/hachoir_core/stream/input_helper.py | 38 + lib/hachoir_core/stream/output.py | 173 + lib/hachoir_core/stream/stream.py | 5 + lib/hachoir_core/text_handler.py | 60 + lib/hachoir_core/timeout.py | 76 + lib/hachoir_core/tools.py | 582 + lib/hachoir_core/version.py | 5 + lib/hachoir_metadata/__init__.py | 15 + lib/hachoir_metadata/archive.py | 166 + lib/hachoir_metadata/audio.py | 406 + lib/hachoir_metadata/config.py | 2 + lib/hachoir_metadata/file_system.py | 28 + lib/hachoir_metadata/filter.py | 52 + lib/hachoir_metadata/formatter.py | 25 + lib/hachoir_metadata/image.py | 299 + lib/hachoir_metadata/jpeg.py | 289 + lib/hachoir_metadata/metadata.py | 291 + lib/hachoir_metadata/metadata_item.py | 146 + lib/hachoir_metadata/misc.py | 262 + lib/hachoir_metadata/program.py | 100 + lib/hachoir_metadata/qt/__init__.py | 0 lib/hachoir_metadata/qt/dialog.ui | 64 + lib/hachoir_metadata/qt/dialog_ui.py | 52 + lib/hachoir_metadata/register.py | 112 + lib/hachoir_metadata/riff.py | 190 + lib/hachoir_metadata/safe.py | 27 + lib/hachoir_metadata/setter.py | 171 + lib/hachoir_metadata/timezone.py | 42 + lib/hachoir_metadata/version.py | 5 + lib/hachoir_metadata/video.py | 412 + lib/hachoir_parser/__init__.py | 7 + lib/hachoir_parser/archive/__init__.py | 12 + lib/hachoir_parser/archive/ace.py | 267 + lib/hachoir_parser/archive/ar.py | 52 + lib/hachoir_parser/archive/bzip2_parser.py | 85 + lib/hachoir_parser/archive/cab.py | 125 + lib/hachoir_parser/archive/gzip_parser.py | 129 + lib/hachoir_parser/archive/mar.py | 67 + lib/hachoir_parser/archive/rar.py | 353 + lib/hachoir_parser/archive/rpm.py | 267 + lib/hachoir_parser/archive/sevenzip.py | 401 + lib/hachoir_parser/archive/tar.py | 124 + lib/hachoir_parser/archive/zip.py | 427 + lib/hachoir_parser/audio/8svx.py | 126 + lib/hachoir_parser/audio/__init__.py | 12 + lib/hachoir_parser/audio/aiff.py | 127 + lib/hachoir_parser/audio/au.py | 88 + lib/hachoir_parser/audio/flac.py | 157 + lib/hachoir_parser/audio/id3.py | 507 + lib/hachoir_parser/audio/itunesdb.py | 433 + lib/hachoir_parser/audio/midi.py | 216 + lib/hachoir_parser/audio/mod.py | 149 + lib/hachoir_parser/audio/modplug.py | 291 + lib/hachoir_parser/audio/mpeg_audio.py | 408 + lib/hachoir_parser/audio/real_audio.py | 90 + lib/hachoir_parser/audio/s3m.py | 668 + lib/hachoir_parser/audio/xm.py | 390 + lib/hachoir_parser/common/__init__.py | 0 lib/hachoir_parser/common/deflate.py | 33 + lib/hachoir_parser/common/msdos.py | 62 + lib/hachoir_parser/common/tracker.py | 10 + lib/hachoir_parser/common/win32.py | 154 + lib/hachoir_parser/common/win32_lang_id.py | 136 + lib/hachoir_parser/container/__init__.py | 7 + lib/hachoir_parser/container/action_script.py | 316 + lib/hachoir_parser/container/asn1.py | 282 + lib/hachoir_parser/container/mkv.py | 598 + lib/hachoir_parser/container/ogg.py | 349 + lib/hachoir_parser/container/realmedia.py | 172 + lib/hachoir_parser/container/riff.py | 439 + lib/hachoir_parser/container/swf.py | 400 + lib/hachoir_parser/file_system/__init__.py | 8 + lib/hachoir_parser/file_system/ext2.py | 464 + lib/hachoir_parser/file_system/fat.py | 433 + lib/hachoir_parser/file_system/iso9660.py | 121 + lib/hachoir_parser/file_system/linux_swap.py | 114 + lib/hachoir_parser/file_system/mbr.py | 230 + lib/hachoir_parser/file_system/ntfs.py | 285 + lib/hachoir_parser/file_system/reiser_fs.py | 120 + lib/hachoir_parser/game/__init__.py | 4 + lib/hachoir_parser/game/blp.py | 269 + lib/hachoir_parser/game/laf.py | 94 + lib/hachoir_parser/game/spider_man_video.py | 65 + lib/hachoir_parser/game/zsnes.py | 250 + lib/hachoir_parser/guess.py | 123 + lib/hachoir_parser/image/__init__.py | 12 + lib/hachoir_parser/image/bmp.py | 195 + lib/hachoir_parser/image/common.py | 49 + lib/hachoir_parser/image/exif.py | 361 + lib/hachoir_parser/image/gif.py | 227 + lib/hachoir_parser/image/ico.py | 139 + lib/hachoir_parser/image/iptc.py | 113 + lib/hachoir_parser/image/jpeg.py | 368 + lib/hachoir_parser/image/pcx.py | 73 + .../image/photoshop_metadata.py | 83 + lib/hachoir_parser/image/png.py | 268 + lib/hachoir_parser/image/psd.py | 85 + lib/hachoir_parser/image/tga.py | 85 + lib/hachoir_parser/image/tiff.py | 211 + lib/hachoir_parser/image/wmf.py | 611 + lib/hachoir_parser/image/xcf.py | 331 + lib/hachoir_parser/misc/__init__.py | 14 + lib/hachoir_parser/misc/bplist.py | 292 + lib/hachoir_parser/misc/chm.py | 200 + lib/hachoir_parser/misc/common.py | 13 + lib/hachoir_parser/misc/file_3do.py | 214 + lib/hachoir_parser/misc/file_3ds.py | 177 + lib/hachoir_parser/misc/gnome_keyring.py | 200 + lib/hachoir_parser/misc/hlp.py | 76 + lib/hachoir_parser/misc/lnk.py | 582 + lib/hachoir_parser/misc/msoffice.py | 131 + lib/hachoir_parser/misc/msoffice_summary.py | 377 + lib/hachoir_parser/misc/ole2.py | 367 + lib/hachoir_parser/misc/pcf.py | 170 + lib/hachoir_parser/misc/pdf.py | 442 + lib/hachoir_parser/misc/pifv.py | 241 + lib/hachoir_parser/misc/torrent.py | 163 + lib/hachoir_parser/misc/ttf.py | 277 + lib/hachoir_parser/misc/word_doc.py | 299 + lib/hachoir_parser/network/__init__.py | 2 + lib/hachoir_parser/network/common.py | 118 + lib/hachoir_parser/network/ouid.py | 10110 ++++ lib/hachoir_parser/network/tcpdump.py | 505 + lib/hachoir_parser/parser.py | 154 + lib/hachoir_parser/parser_list.py | 217 + lib/hachoir_parser/program/__init__.py | 6 + lib/hachoir_parser/program/elf.py | 187 + lib/hachoir_parser/program/exe.py | 224 + lib/hachoir_parser/program/exe_ne.py | 60 + lib/hachoir_parser/program/exe_pe.py | 221 + lib/hachoir_parser/program/exe_res.py | 445 + lib/hachoir_parser/program/java.py | 1097 + lib/hachoir_parser/program/prc.py | 82 + lib/hachoir_parser/program/python.py | 334 + lib/hachoir_parser/template.py | 54 + lib/hachoir_parser/version.py | 5 + lib/hachoir_parser/video/__init__.py | 6 + lib/hachoir_parser/video/amf.py | 110 + lib/hachoir_parser/video/asf.py | 356 + lib/hachoir_parser/video/flv.py | 157 + lib/hachoir_parser/video/fourcc.py | 415 + lib/hachoir_parser/video/mov.py | 246 + lib/hachoir_parser/video/mpeg_ts.py | 102 + lib/hachoir_parser/video/mpeg_video.py | 576 + lib/html5lib/__init__.py | 17 + lib/html5lib/constants.py | 3085 ++ lib/html5lib/filters/__init__.py | 0 lib/html5lib/filters/_base.py | 10 + lib/html5lib/filters/formfiller.py | 127 + lib/html5lib/filters/inject_meta_charset.py | 62 + lib/html5lib/filters/lint.py | 88 + lib/html5lib/filters/optionaltags.py | 202 + lib/html5lib/filters/sanitizer.py | 8 + lib/html5lib/filters/whitespace.py | 41 + lib/html5lib/html5parser.py | 2733 + lib/html5lib/ihatexml.py | 177 + lib/html5lib/inputstream.py | 782 + lib/html5lib/sanitizer.py | 258 + lib/html5lib/serializer/__init__.py | 17 + lib/html5lib/serializer/htmlserializer.py | 312 + lib/html5lib/serializer/xhtmlserializer.py | 9 + lib/html5lib/tests/__init__.py | 12 + lib/html5lib/tests/mockParser.py | 37 + lib/html5lib/tests/runparsertests.py | 27 + lib/html5lib/tests/runtests.py | 20 + lib/html5lib/tests/support.py | 127 + lib/html5lib/tests/test_encoding.py | 54 + lib/html5lib/tests/test_formfiller.py | 296 + lib/html5lib/tests/test_parser.py | 140 + lib/html5lib/tests/test_parser2.py | 39 + lib/html5lib/tests/test_sanitizer.py | 76 + lib/html5lib/tests/test_serializer.py | 180 + lib/html5lib/tests/test_stream.py | 97 + lib/html5lib/tests/test_tokenizer.py | 193 + lib/html5lib/tests/test_treewalkers.py | 311 + lib/html5lib/tests/test_whitespace_filter.py | 123 + .../tests/testdata/encoding/test-yahoo-jp.dat | 10 + .../tests/testdata/encoding/tests1.dat | 394 + .../tests/testdata/encoding/tests2.dat | 115 + .../tests/testdata/sanitizer/tests1.dat | 501 + .../tests/testdata/serializer/core.test | 125 + .../tests/testdata/serializer/injectmeta.test | 66 + .../testdata/serializer/optionaltags.test | 965 + .../tests/testdata/serializer/options.test | 60 + .../tests/testdata/serializer/whitespace.test | 51 + .../tests/testdata/sniffer/htmlOrFeed.json | 43 + .../testdata/tokenizer/contentModelFlags.test | 75 + .../tests/testdata/tokenizer/domjs.test | 90 + .../tests/testdata/tokenizer/entities.test | 283 + .../tests/testdata/tokenizer/escapeFlag.test | 33 + .../testdata/tokenizer/namedEntities.test | 44189 ++++++++++++++++ .../testdata/tokenizer/numericEntities.test | 1313 + .../tokenizer/pendingSpecChanges.test | 7 + .../tests/testdata/tokenizer/test1.test | 196 + .../tests/testdata/tokenizer/test2.test | 179 + .../tests/testdata/tokenizer/test3.test | 6047 +++ .../tests/testdata/tokenizer/test4.test | 344 + .../testdata/tokenizer/unicodeChars.test | 1295 + .../tokenizer/unicodeCharsProblematic.test | 27 + .../testdata/tokenizer/xmlViolation.test | 22 + .../testdata/tree-construction/adoption01.dat | 194 + .../testdata/tree-construction/adoption02.dat | 31 + .../testdata/tree-construction/comments01.dat | 135 + .../testdata/tree-construction/doctype01.dat | 370 + .../tree-construction/domjs-unsafe.dat | Bin 0 -> 6639 bytes .../testdata/tree-construction/entities01.dat | 603 + .../testdata/tree-construction/entities02.dat | 249 + .../tree-construction/html5test-com.dat | 246 + .../testdata/tree-construction/inbody01.dat | 43 + .../testdata/tree-construction/isindex.dat | 40 + ...pending-spec-changes-plain-text-unsafe.dat | Bin 0 -> 115 bytes .../pending-spec-changes.dat | 52 + .../tree-construction/plain-text-unsafe.dat | Bin 0 -> 4166 bytes .../tree-construction/scriptdata01.dat | 308 + .../testdata/tree-construction/tables01.dat | 212 + .../testdata/tree-construction/tests1.dat | 1952 + .../testdata/tree-construction/tests10.dat | 799 + .../testdata/tree-construction/tests11.dat | 482 + .../testdata/tree-construction/tests12.dat | 62 + .../testdata/tree-construction/tests14.dat | 74 + .../testdata/tree-construction/tests15.dat | 208 + .../testdata/tree-construction/tests16.dat | 2299 + .../testdata/tree-construction/tests17.dat | 153 + .../testdata/tree-construction/tests18.dat | 269 + .../testdata/tree-construction/tests19.dat | 1237 + .../testdata/tree-construction/tests2.dat | 763 + .../testdata/tree-construction/tests20.dat | 455 + .../testdata/tree-construction/tests21.dat | 221 + .../testdata/tree-construction/tests22.dat | 157 + .../testdata/tree-construction/tests23.dat | 155 + .../testdata/tree-construction/tests24.dat | 79 + .../testdata/tree-construction/tests25.dat | 219 + .../testdata/tree-construction/tests26.dat | 313 + .../testdata/tree-construction/tests3.dat | 305 + .../testdata/tree-construction/tests4.dat | 59 + .../testdata/tree-construction/tests5.dat | 191 + .../testdata/tree-construction/tests6.dat | 663 + .../testdata/tree-construction/tests7.dat | 390 + .../testdata/tree-construction/tests8.dat | 148 + .../testdata/tree-construction/tests9.dat | 457 + .../tree-construction/tests_innerHTML_1.dat | 741 + .../testdata/tree-construction/tricky01.dat | 261 + .../testdata/tree-construction/webkit01.dat | 594 + .../testdata/tree-construction/webkit02.dat | 94 + lib/html5lib/tests/tokenizertotree.py | 64 + lib/html5lib/tokenizer.py | 1744 + lib/html5lib/treebuilders/__init__.py | 96 + lib/html5lib/treebuilders/_base.py | 377 + lib/html5lib/treebuilders/dom.py | 291 + lib/html5lib/treebuilders/etree.py | 344 + lib/html5lib/treebuilders/etree_lxml.py | 336 + lib/html5lib/treebuilders/simpletree.py | 256 + lib/html5lib/treebuilders/soup.py | 236 + lib/html5lib/treewalkers/__init__.py | 52 + lib/html5lib/treewalkers/_base.py | 176 + lib/html5lib/treewalkers/dom.py | 41 + lib/html5lib/treewalkers/etree.py | 141 + lib/html5lib/treewalkers/genshistream.py | 70 + lib/html5lib/treewalkers/lxmletree.py | 186 + lib/html5lib/treewalkers/pulldom.py | 60 + lib/html5lib/treewalkers/simpletree.py | 78 + lib/html5lib/treewalkers/soup.py | 60 + lib/html5lib/utils.py | 175 + lib/httplib2/__init__.py | 1234 + lib/httplib2/iri2uri.py | 110 + lib/imdb/Character.py | 201 + lib/imdb/Company.py | 195 + lib/imdb/Movie.py | 398 + lib/imdb/Person.py | 275 + lib/imdb/__init__.py | 959 + lib/imdb/_compat.py | 72 + lib/imdb/_exceptions.py | 45 + lib/imdb/_logging.py | 63 + lib/imdb/helpers.py | 640 + lib/imdb/imdbpy.cfg | 78 + lib/imdb/linguistics.py | 203 + lib/imdb/locale/__init__.py | 29 + lib/imdb/locale/generatepot.py | 78 + lib/imdb/locale/imdbpy-en.po | 1257 + lib/imdb/locale/imdbpy-it.po | 1300 + lib/imdb/locale/imdbpy-tr.po | 1300 + lib/imdb/locale/imdbpy.pot | 1301 + lib/imdb/locale/msgfmt.py | 204 + lib/imdb/locale/rebuildmo.py | 49 + lib/imdb/parser/__init__.py | 28 + lib/imdb/parser/http/__init__.py | 830 + lib/imdb/parser/http/bsouplxml/__init__.py | 0 lib/imdb/parser/http/bsouplxml/_bsoup.py | 1970 + lib/imdb/parser/http/bsouplxml/bsoupxpath.py | 410 + lib/imdb/parser/http/bsouplxml/etree.py | 75 + lib/imdb/parser/http/bsouplxml/html.py | 31 + lib/imdb/parser/http/characterParser.py | 203 + lib/imdb/parser/http/companyParser.py | 91 + lib/imdb/parser/http/movieParser.py | 1892 + lib/imdb/parser/http/personParser.py | 507 + lib/imdb/parser/http/searchCharacterParser.py | 69 + lib/imdb/parser/http/searchCompanyParser.py | 71 + lib/imdb/parser/http/searchKeywordParser.py | 111 + lib/imdb/parser/http/searchMovieParser.py | 182 + lib/imdb/parser/http/searchPersonParser.py | 92 + lib/imdb/parser/http/topBottomParser.py | 106 + lib/imdb/parser/http/utils.py | 876 + lib/imdb/parser/mobile/__init__.py | 844 + lib/imdb/parser/sql/__init__.py | 1589 + lib/imdb/parser/sql/alchemyadapter.py | 508 + lib/imdb/parser/sql/cutils.c | 269 + lib/imdb/parser/sql/cutils.so | Bin 0 -> 28469 bytes lib/imdb/parser/sql/dbschema.py | 476 + lib/imdb/parser/sql/objectadapter.py | 207 + lib/imdb/utils.py | 1572 + lib/jsonrpclib/SimpleJSONRPCServer.py | 229 + lib/jsonrpclib/__init__.py | 6 + lib/jsonrpclib/config.py | 38 + lib/jsonrpclib/history.py | 40 + lib/jsonrpclib/jsonclass.py | 145 + lib/jsonrpclib/jsonrpc.py | 556 + lib/oauth2/__init__.py | 704 + lib/profilehooks.py | 733 + lib/pynma/__init__.py | 4 + lib/pynma/pynma.py | 137 + lib/pythontwitter/__init__.py | 4649 ++ lib/requests/__init__.py | 77 + lib/requests/adapters.py | 396 + lib/requests/api.py | 120 + lib/requests/auth.py | 196 + lib/requests/cacert.pem | 5026 ++ lib/requests/certs.py | 24 + lib/requests/compat.py | 115 + lib/requests/cookies.py | 454 + lib/requests/exceptions.py | 68 + lib/requests/hooks.py | 45 + lib/requests/models.py | 781 + lib/requests/packages/README.rst | 8 + lib/requests/packages/__init__.py | 3 + lib/requests/packages/chardet/__init__.py | 32 + lib/requests/packages/chardet/big5freq.py | 925 + lib/requests/packages/chardet/big5prober.py | 42 + lib/requests/packages/chardet/chardetect.py | 46 + .../packages/chardet/chardistribution.py | 231 + .../packages/chardet/charsetgroupprober.py | 106 + .../packages/chardet/charsetprober.py | 62 + .../packages/chardet/codingstatemachine.py | 61 + lib/requests/packages/chardet/compat.py | 34 + lib/requests/packages/chardet/constants.py | 39 + lib/requests/packages/chardet/cp949prober.py | 44 + lib/requests/packages/chardet/escprober.py | 86 + lib/requests/packages/chardet/escsm.py | 242 + lib/requests/packages/chardet/eucjpprober.py | 90 + lib/requests/packages/chardet/euckrfreq.py | 596 + lib/requests/packages/chardet/euckrprober.py | 42 + lib/requests/packages/chardet/euctwfreq.py | 428 + lib/requests/packages/chardet/euctwprober.py | 41 + lib/requests/packages/chardet/gb2312freq.py | 472 + lib/requests/packages/chardet/gb2312prober.py | 41 + lib/requests/packages/chardet/hebrewprober.py | 283 + lib/requests/packages/chardet/jisfreq.py | 569 + lib/requests/packages/chardet/jpcntx.py | 219 + .../packages/chardet/langbulgarianmodel.py | 229 + .../packages/chardet/langcyrillicmodel.py | 329 + .../packages/chardet/langgreekmodel.py | 225 + .../packages/chardet/langhebrewmodel.py | 201 + .../packages/chardet/langhungarianmodel.py | 225 + .../packages/chardet/langthaimodel.py | 200 + lib/requests/packages/chardet/latin1prober.py | 139 + .../packages/chardet/mbcharsetprober.py | 86 + .../packages/chardet/mbcsgroupprober.py | 54 + lib/requests/packages/chardet/mbcssm.py | 575 + .../packages/chardet/sbcharsetprober.py | 120 + .../packages/chardet/sbcsgroupprober.py | 69 + lib/requests/packages/chardet/sjisprober.py | 91 + .../packages/chardet/universaldetector.py | 170 + lib/requests/packages/chardet/utf8prober.py | 76 + lib/requests/packages/urllib3/__init__.py | 58 + lib/requests/packages/urllib3/_collections.py | 103 + lib/requests/packages/urllib3/connection.py | 110 + .../packages/urllib3/connectionpool.py | 683 + .../packages/urllib3/contrib/__init__.py | 0 .../packages/urllib3/contrib/ntlmpool.py | 120 + .../packages/urllib3/contrib/pyopenssl.py | 346 + lib/requests/packages/urllib3/exceptions.py | 121 + lib/requests/packages/urllib3/fields.py | 177 + lib/requests/packages/urllib3/filepost.py | 101 + .../packages/urllib3/packages/__init__.py | 4 + .../packages/urllib3/packages/ordered_dict.py | 260 + lib/requests/packages/urllib3/packages/six.py | 385 + .../packages/ssl_match_hostname/__init__.py | 13 + .../ssl_match_hostname/_implementation.py | 105 + lib/requests/packages/urllib3/poolmanager.py | 258 + lib/requests/packages/urllib3/request.py | 141 + lib/requests/packages/urllib3/response.py | 312 + lib/requests/packages/urllib3/util.py | 643 + lib/requests/sessions.py | 553 + lib/requests/status_codes.py | 88 + lib/requests/structures.py | 128 + lib/requests/utils.py | 663 + lib/rtorrent/__init__.py | 647 + lib/rtorrent/common.py | 86 + lib/rtorrent/compat.py | 30 + lib/rtorrent/err.py | 40 + lib/rtorrent/file.py | 91 + lib/rtorrent/group.py | 84 + lib/rtorrent/lib/__init__.py | 0 lib/rtorrent/lib/bencode.py | 281 + lib/rtorrent/lib/torrentparser.py | 160 + lib/rtorrent/lib/xmlrpc/__init__.py | 0 lib/rtorrent/lib/xmlrpc/basic_auth.py | 73 + lib/rtorrent/lib/xmlrpc/http.py | 23 + lib/rtorrent/lib/xmlrpc/scgi.py | 219 + lib/rtorrent/peer.py | 98 + lib/rtorrent/rpc/__init__.py | 319 + lib/rtorrent/torrent.py | 517 + lib/rtorrent/tracker.py | 138 + lib/simplejson/__init__.py | 318 + lib/simplejson/_speedups.c | 2329 + lib/simplejson/decoder.py | 354 + lib/simplejson/encoder.py | 440 + lib/simplejson/scanner.py | 65 + lib/socks/__init__.py | 393 + lib/subliminal/__init__.py | 34 + lib/subliminal/api.py | 112 + lib/subliminal/async.py | 142 + lib/subliminal/cache.py | 134 + lib/subliminal/core.py | 275 + lib/subliminal/exceptions.py | 32 + lib/subliminal/infos.py | 18 + lib/subliminal/language.py | 1048 + lib/subliminal/services/__init__.py | 259 + lib/subliminal/services/addic7ed.py | 122 + lib/subliminal/services/bierdopje.py | 104 + lib/subliminal/services/itasa.py | 216 + lib/subliminal/services/opensubtitles.py | 159 + lib/subliminal/services/podnapisi.py | 111 + lib/subliminal/services/podnapisiweb.py | 124 + lib/subliminal/services/subswiki.py | 100 + lib/subliminal/services/subtitulos.py | 90 + lib/subliminal/services/thesubdb.py | 68 + lib/subliminal/services/tvsubtitles.py | 143 + lib/subliminal/services/usub.py | 99 + lib/subliminal/subtitles.py | 149 + lib/subliminal/tasks.py | 68 + lib/subliminal/utils.py | 69 + lib/subliminal/videos.py | 300 + lib/trakt/__init__.py | 59 + lib/tvdb_api/MANIFEST.in | 4 + lib/tvdb_api/Rakefile | 103 + lib/tvdb_api/UNLICENSE | 26 + lib/tvdb_api/__init__.py | 1 + lib/tvdb_api/readme.md | 109 + lib/tvdb_api/setup.py | 35 + lib/tvdb_api/tests/gprof2dot.py | 1638 + lib/tvdb_api/tests/runtests.py | 28 + lib/tvdb_api/tests/test_tvdb_api.py | 563 + lib/tvdb_api/tvdb_api.py | 976 + lib/tvdb_api/tvdb_cache.py | 251 + lib/tvdb_api/tvdb_exceptions.py | 52 + lib/tvdb_api/tvdb_ui.py | 153 + lib/tvrage_api/AUTHORS | 9 + lib/tvrage_api/LICENSE | 26 + lib/tvrage_api/__init__.py | 4 + lib/tvrage_api/setup.py | 29 + lib/tvrage_api/tvrage_api.py | 653 + lib/tvrage_api/tvrage_cache.py | 251 + lib/tvrage_api/tvrage_exceptions.py | 51 + lib/tvrage_api/tvrage_ui.py | 31 + lib/unidecode/__init__.py | 63 + lib/unidecode/x000.py | 258 + lib/unidecode/x001.py | 258 + lib/unidecode/x002.py | 257 + lib/unidecode/x003.py | 257 + lib/unidecode/x004.py | 257 + lib/unidecode/x005.py | 257 + lib/unidecode/x006.py | 257 + lib/unidecode/x007.py | 257 + lib/unidecode/x009.py | 257 + lib/unidecode/x00a.py | 257 + lib/unidecode/x00b.py | 257 + lib/unidecode/x00c.py | 257 + lib/unidecode/x00d.py | 257 + lib/unidecode/x00e.py | 257 + lib/unidecode/x00f.py | 257 + lib/unidecode/x010.py | 257 + lib/unidecode/x011.py | 257 + lib/unidecode/x012.py | 258 + lib/unidecode/x013.py | 257 + lib/unidecode/x014.py | 258 + lib/unidecode/x015.py | 258 + lib/unidecode/x016.py | 257 + lib/unidecode/x017.py | 257 + lib/unidecode/x018.py | 257 + lib/unidecode/x01d.py | 257 + lib/unidecode/x01e.py | 257 + lib/unidecode/x01f.py | 257 + lib/unidecode/x020.py | 257 + lib/unidecode/x021.py | 257 + lib/unidecode/x022.py | 257 + lib/unidecode/x023.py | 257 + lib/unidecode/x024.py | 257 + lib/unidecode/x025.py | 257 + lib/unidecode/x026.py | 257 + lib/unidecode/x027.py | 257 + lib/unidecode/x028.py | 258 + lib/unidecode/x02c.py | 257 + lib/unidecode/x02e.py | 257 + lib/unidecode/x02f.py | 257 + lib/unidecode/x030.py | 257 + lib/unidecode/x031.py | 257 + lib/unidecode/x032.py | 257 + lib/unidecode/x033.py | 257 + lib/unidecode/x04d.py | 257 + lib/unidecode/x04e.py | 258 + lib/unidecode/x04f.py | 258 + lib/unidecode/x050.py | 258 + lib/unidecode/x051.py | 258 + lib/unidecode/x052.py | 258 + lib/unidecode/x053.py | 258 + lib/unidecode/x054.py | 258 + lib/unidecode/x055.py | 258 + lib/unidecode/x056.py | 258 + lib/unidecode/x057.py | 258 + lib/unidecode/x058.py | 258 + lib/unidecode/x059.py | 258 + lib/unidecode/x05a.py | 258 + lib/unidecode/x05b.py | 258 + lib/unidecode/x05c.py | 258 + lib/unidecode/x05d.py | 258 + lib/unidecode/x05e.py | 258 + lib/unidecode/x05f.py | 258 + lib/unidecode/x060.py | 258 + lib/unidecode/x061.py | 258 + lib/unidecode/x062.py | 258 + lib/unidecode/x063.py | 258 + lib/unidecode/x064.py | 258 + lib/unidecode/x065.py | 258 + lib/unidecode/x066.py | 258 + lib/unidecode/x067.py | 258 + lib/unidecode/x068.py | 258 + lib/unidecode/x069.py | 258 + lib/unidecode/x06a.py | 258 + lib/unidecode/x06b.py | 258 + lib/unidecode/x06c.py | 258 + lib/unidecode/x06d.py | 258 + lib/unidecode/x06e.py | 258 + lib/unidecode/x06f.py | 258 + lib/unidecode/x070.py | 258 + lib/unidecode/x071.py | 258 + lib/unidecode/x072.py | 258 + lib/unidecode/x073.py | 258 + lib/unidecode/x074.py | 258 + lib/unidecode/x075.py | 258 + lib/unidecode/x076.py | 258 + lib/unidecode/x077.py | 258 + lib/unidecode/x078.py | 258 + lib/unidecode/x079.py | 258 + lib/unidecode/x07a.py | 258 + lib/unidecode/x07b.py | 258 + lib/unidecode/x07c.py | 258 + lib/unidecode/x07d.py | 258 + lib/unidecode/x07e.py | 258 + lib/unidecode/x07f.py | 258 + lib/unidecode/x080.py | 258 + lib/unidecode/x081.py | 258 + lib/unidecode/x082.py | 258 + lib/unidecode/x083.py | 258 + lib/unidecode/x084.py | 258 + lib/unidecode/x085.py | 258 + lib/unidecode/x086.py | 258 + lib/unidecode/x087.py | 258 + lib/unidecode/x088.py | 258 + lib/unidecode/x089.py | 258 + lib/unidecode/x08a.py | 258 + lib/unidecode/x08b.py | 258 + lib/unidecode/x08c.py | 258 + lib/unidecode/x08d.py | 258 + lib/unidecode/x08e.py | 258 + lib/unidecode/x08f.py | 258 + lib/unidecode/x090.py | 258 + lib/unidecode/x091.py | 258 + lib/unidecode/x092.py | 258 + lib/unidecode/x093.py | 258 + lib/unidecode/x094.py | 258 + lib/unidecode/x095.py | 258 + lib/unidecode/x096.py | 258 + lib/unidecode/x097.py | 258 + lib/unidecode/x098.py | 258 + lib/unidecode/x099.py | 258 + lib/unidecode/x09a.py | 258 + lib/unidecode/x09b.py | 258 + lib/unidecode/x09c.py | 258 + lib/unidecode/x09d.py | 258 + lib/unidecode/x09e.py | 258 + lib/unidecode/x09f.py | 257 + lib/unidecode/x0a0.py | 258 + lib/unidecode/x0a1.py | 258 + lib/unidecode/x0a2.py | 258 + lib/unidecode/x0a3.py | 258 + lib/unidecode/x0a4.py | 257 + lib/unidecode/x0ac.py | 258 + lib/unidecode/x0ad.py | 258 + lib/unidecode/x0ae.py | 258 + lib/unidecode/x0af.py | 258 + lib/unidecode/x0b0.py | 258 + lib/unidecode/x0b1.py | 258 + lib/unidecode/x0b2.py | 258 + lib/unidecode/x0b3.py | 258 + lib/unidecode/x0b4.py | 258 + lib/unidecode/x0b5.py | 258 + lib/unidecode/x0b6.py | 258 + lib/unidecode/x0b7.py | 258 + lib/unidecode/x0b8.py | 258 + lib/unidecode/x0b9.py | 258 + lib/unidecode/x0ba.py | 258 + lib/unidecode/x0bb.py | 258 + lib/unidecode/x0bc.py | 258 + lib/unidecode/x0bd.py | 258 + lib/unidecode/x0be.py | 258 + lib/unidecode/x0bf.py | 258 + lib/unidecode/x0c0.py | 258 + lib/unidecode/x0c1.py | 258 + lib/unidecode/x0c2.py | 258 + lib/unidecode/x0c3.py | 258 + lib/unidecode/x0c4.py | 258 + lib/unidecode/x0c5.py | 258 + lib/unidecode/x0c6.py | 258 + lib/unidecode/x0c7.py | 258 + lib/unidecode/x0c8.py | 258 + lib/unidecode/x0c9.py | 258 + lib/unidecode/x0ca.py | 258 + lib/unidecode/x0cb.py | 258 + lib/unidecode/x0cc.py | 258 + lib/unidecode/x0cd.py | 258 + lib/unidecode/x0ce.py | 258 + lib/unidecode/x0cf.py | 258 + lib/unidecode/x0d0.py | 258 + lib/unidecode/x0d1.py | 258 + lib/unidecode/x0d2.py | 258 + lib/unidecode/x0d3.py | 258 + lib/unidecode/x0d4.py | 258 + lib/unidecode/x0d5.py | 258 + lib/unidecode/x0d6.py | 258 + lib/unidecode/x0d7.py | 257 + lib/unidecode/x0f9.py | 258 + lib/unidecode/x0fa.py | 257 + lib/unidecode/x0fb.py | 258 + lib/unidecode/x0fc.py | 258 + lib/unidecode/x0fd.py | 257 + lib/unidecode/x0fe.py | 258 + lib/unidecode/x0ff.py | 258 + lib/unidecode/x1d4.py | 258 + lib/unidecode/x1d5.py | 258 + lib/unidecode/x1d6.py | 258 + lib/unidecode/x1d7.py | 258 + lib/unrar2/PKG-INFO | 27 + lib/unrar2/UnRAR2.html | 194 + lib/unrar2/UnRARDLL/license.txt | 18 + lib/unrar2/UnRARDLL/unrar.dll | Bin 0 -> 165376 bytes lib/unrar2/UnRARDLL/unrar.h | 140 + lib/unrar2/UnRARDLL/unrar.lib | Bin 0 -> 4114 bytes lib/unrar2/UnRARDLL/unrardll.txt | 606 + lib/unrar2/UnRARDLL/whatsnew.txt | 80 + lib/unrar2/UnRARDLL/x64/readme.txt | 1 + lib/unrar2/UnRARDLL/x64/unrar64.dll | Bin 0 -> 191488 bytes lib/unrar2/UnRARDLL/x64/unrar64.lib | Bin 0 -> 3972 bytes lib/unrar2/__init__.py | 177 + lib/unrar2/license.txt | 21 + lib/unrar2/rar_exceptions.py | 30 + lib/unrar2/setup.py | 54 + lib/unrar2/test.rar | Bin 0 -> 1838 bytes lib/unrar2/test_UnRAR2.py | 138 + lib/unrar2/test_nulls.rar | Bin 0 -> 48910 bytes lib/unrar2/test_protected_files.rar | Bin 0 -> 181 bytes lib/unrar2/test_protected_headers.rar | Bin 0 -> 236 bytes lib/unrar2/unix.py | 218 + lib/unrar2/windows.py | 309 + readme-FailedDownloads.md | 34 + readme.md | 73 + setup.py | 273 + sickbeard/__init__.py | 1664 + sickbeard/autoPostProcesser.py | 41 + sickbeard/browser.py | 111 + sickbeard/classes.py | 197 + sickbeard/clients/__init__.py | 85 + sickbeard/clients/deluge.py | 210 + sickbeard/clients/download_station.py | 71 + sickbeard/clients/generic.py | 201 + sickbeard/clients/rtorrent.py | 192 + sickbeard/clients/transmission.py | 132 + sickbeard/clients/utorrent.py | 76 + sickbeard/common.py | 328 + sickbeard/config.py | 637 + sickbeard/databases/__init__.py | 19 + sickbeard/databases/cache_db.py | 58 + sickbeard/databases/failed_db.py | 69 + sickbeard/databases/mainDB.py | 608 + sickbeard/db.py | 290 + sickbeard/encodingKludge.py | 69 + sickbeard/exceptions.py | 109 + sickbeard/failedProcessor.py | 116 + sickbeard/failed_history.py | 247 + sickbeard/generic_queue.py | 134 + sickbeard/gh_api.py | 88 + sickbeard/helpers.py | 998 + sickbeard/history.py | 95 + sickbeard/image_cache.py | 284 + sickbeard/indexers/__init__.py | 0 sickbeard/indexers/indexer_api.py | 58 + sickbeard/indexers/indexer_exceptions.py | 37 + sickbeard/indexers/test.py | 32 + sickbeard/logger.py | 276 + sickbeard/metadata/__init__.py | 53 + sickbeard/metadata/generic.py | 899 + sickbeard/metadata/helpers.py | 44 + sickbeard/metadata/mediabrowser.py | 546 + sickbeard/metadata/ps3.py | 125 + sickbeard/metadata/tivo.py | 334 + sickbeard/metadata/wdtv.py | 290 + sickbeard/metadata/xbmc.py | 126 + sickbeard/metadata/xbmc_12plus.py | 377 + sickbeard/name_cache.py | 65 + sickbeard/name_parser/__init__.py | 0 sickbeard/name_parser/parser.py | 452 + sickbeard/name_parser/regexes.py | 200 + sickbeard/naming.py | 180 + sickbeard/network_timezones.py | 242 + sickbeard/notifiers/__init__.py | 98 + sickbeard/notifiers/boxcar.py | 149 + sickbeard/notifiers/emailnotify.py | 176 + sickbeard/notifiers/growl.py | 187 + sickbeard/notifiers/libnotify.py | 118 + sickbeard/notifiers/nma.py | 56 + sickbeard/notifiers/nmj.py | 183 + sickbeard/notifiers/nmjv2.py | 175 + sickbeard/notifiers/plex.py | 196 + sickbeard/notifiers/prowl.py | 100 + sickbeard/notifiers/pushalot.py | 83 + sickbeard/notifiers/pushbullet.py | 112 + sickbeard/notifiers/pushover.py | 140 + sickbeard/notifiers/pytivo.py | 102 + sickbeard/notifiers/synoindex.py | 83 + sickbeard/notifiers/synologynotifier.py | 55 + sickbeard/notifiers/trakt.py | 91 + sickbeard/notifiers/tweet.py | 140 + sickbeard/notifiers/xbmc.py | 537 + sickbeard/nzbSplitter.py | 176 + sickbeard/nzbget.py | 117 + sickbeard/postProcessor.py | 1008 + sickbeard/processTV.py | 407 + sickbeard/properFinder.py | 279 + sickbeard/providers/__init__.py | 141 + sickbeard/providers/btn.py | 374 + sickbeard/providers/dtt.py | 145 + sickbeard/providers/ezrss.py | 198 + sickbeard/providers/generic.py | 424 + sickbeard/providers/hdbits.py | 245 + sickbeard/providers/hdtorrents.py | 372 + sickbeard/providers/iptorrents.py | 316 + sickbeard/providers/kat.py | 424 + sickbeard/providers/newzbin.py | 389 + sickbeard/providers/newznab.py | 317 + sickbeard/providers/nextgen.py | 356 + sickbeard/providers/nyaatorrents.py | 228 + sickbeard/providers/nzbs_org_old.py | 164 + sickbeard/providers/nzbsrus.py | 122 + sickbeard/providers/omgwtfnzbs.py | 185 + sickbeard/providers/publichd.py | 321 + sickbeard/providers/rsstorrent.py | 191 + sickbeard/providers/scc.py | 318 + sickbeard/providers/thepiratebay.py | 453 + sickbeard/providers/torrentday.py | 311 + sickbeard/providers/torrentleech.py | 315 + sickbeard/providers/tvtorrents.py | 100 + sickbeard/providers/womble.py | 53 + sickbeard/sab.py | 228 + sickbeard/sbdatetime.py | 197 + sickbeard/scene_exceptions.py | 132 + sickbeard/scene_numbering.py | 314 + sickbeard/scheduler.py | 81 + sickbeard/search.py | 541 + sickbeard/searchBacklog.py | 200 + sickbeard/searchCurrent.py | 36 + sickbeard/search_queue.py | 310 + sickbeard/showUpdater.py | 109 + sickbeard/show_name_helpers.py | 281 + sickbeard/show_queue.py | 517 + sickbeard/subtitles.py | 152 + sickbeard/traktWatchListChecker.py | 146 + sickbeard/tv.py | 1998 + sickbeard/tvcache.py | 432 + sickbeard/tvtumbler.py | 47 + sickbeard/ui.py | 180 + sickbeard/version.py | 1 + sickbeard/versionChecker.py | 716 + sickbeard/webapi.py | 2502 + sickbeard/webserve.py | 3656 ++ sickbeard/webserveInit.py | 196 + tests/__init__.py | 0 tests/all_tests.py | 39 + tests/common_tests.py | 103 + tests/db_tests.py | 40 + tests/name_parser_tests.py | 351 + tests/pp_tests.py | 111 + tests/scene_helpers_tests.py | 138 + tests/snatch_tests.py | 111 + tests/test_lib.py | 227 + tests/tv_tests.py | 113 + updater.py | 96 + 1765 files changed, 348691 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 COPYING.txt create mode 100644 SickBeard.py create mode 100644 autoProcessTV/autoProcessTV.cfg.sample create mode 100644 autoProcessTV/autoProcessTV.py create mode 100644 autoProcessTV/hellaToSickBeard.py create mode 100644 autoProcessTV/mediaToSickbeard.py create mode 100644 autoProcessTV/sabToSickBeard.py create mode 100644 autoProcessTV/setup.py create mode 100644 cherrypy/__init__.py create mode 100644 cherrypy/_cpchecker.py create mode 100644 cherrypy/_cpconfig.py create mode 100644 cherrypy/_cpdispatch.py create mode 100644 cherrypy/_cperror.py create mode 100644 cherrypy/_cplogging.py create mode 100644 cherrypy/_cpmodpy.py create mode 100644 cherrypy/_cpnative_server.py create mode 100644 cherrypy/_cpreqbody.py create mode 100644 cherrypy/_cprequest.py create mode 100644 cherrypy/_cpserver.py create mode 100644 cherrypy/_cpthreadinglocal.py create mode 100644 cherrypy/_cptools.py create mode 100644 cherrypy/_cptree.py create mode 100644 cherrypy/_cpwsgi.py create mode 100644 cherrypy/_cpwsgi_server.py create mode 100644 cherrypy/cherryd create mode 100644 cherrypy/favicon.ico create mode 100644 cherrypy/lib/__init__.py create mode 100644 cherrypy/lib/auth.py create mode 100644 cherrypy/lib/auth_basic.py create mode 100644 cherrypy/lib/auth_digest.py create mode 100644 cherrypy/lib/caching.py create mode 100644 cherrypy/lib/covercp.py create mode 100644 cherrypy/lib/cptools.py create mode 100644 cherrypy/lib/encoding.py create mode 100644 cherrypy/lib/http.py create mode 100644 cherrypy/lib/httpauth.py create mode 100644 cherrypy/lib/httputil.py create mode 100644 cherrypy/lib/jsontools.py create mode 100644 cherrypy/lib/profiler.py create mode 100644 cherrypy/lib/reprconf.py create mode 100644 cherrypy/lib/sessions.py create mode 100644 cherrypy/lib/static.py create mode 100644 cherrypy/lib/xmlrpc.py create mode 100644 cherrypy/process/__init__.py create mode 100644 cherrypy/process/plugins.py create mode 100644 cherrypy/process/servers.py create mode 100644 cherrypy/process/win32.py create mode 100644 cherrypy/process/wspbus.py create mode 100644 cherrypy/wsgiserver/__init__.py create mode 100644 cherrypy/wsgiserver/ssl_builtin.py create mode 100644 cherrypy/wsgiserver/ssl_pyopenssl.py create mode 100644 contributing.md create mode 100644 googlecode_upload.py create mode 100644 gui/slick/css/browser.css create mode 100644 gui/slick/css/comingEpisodes.css create mode 100644 gui/slick/css/config.css create mode 100644 gui/slick/css/config.less create mode 100644 gui/slick/css/default.css create mode 100644 gui/slick/css/default.less create mode 100644 gui/slick/css/formwizard.css create mode 100644 gui/slick/css/imports/config.less create mode 100644 gui/slick/css/iphone.css create mode 100644 gui/slick/css/jquery.qtip2.css create mode 100644 gui/slick/css/lib/images/animated-overlay.gif create mode 100644 gui/slick/css/lib/images/tablesorter/asc.gif create mode 100644 gui/slick/css/lib/images/tablesorter/bg.gif create mode 100644 gui/slick/css/lib/images/tablesorter/desc.gif create mode 100644 gui/slick/css/lib/images/ui-bg_fine-grain_10_eceadf_60x60.png create mode 100644 gui/slick/css/lib/images/ui-bg_flat_0_000000_40x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_flat_0_ffffff_40x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 gui/slick/css/lib/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 gui/slick/css/lib/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 gui/slick/css/lib/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 gui/slick/css/lib/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 gui/slick/css/lib/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_highlight-soft_75_dcdcdc_1x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_highlight-soft_75_dddddd_1x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_highlight-soft_75_efefef_1x100.png create mode 100644 gui/slick/css/lib/images/ui-bg_inset-soft_75_dfdfdf_1x100.png create mode 100644 gui/slick/css/lib/images/ui-icons_222222_256x240.png create mode 100644 gui/slick/css/lib/images/ui-icons_2e83ff_256x240.png create mode 100644 gui/slick/css/lib/images/ui-icons_454545_256x240.png create mode 100644 gui/slick/css/lib/images/ui-icons_888888_256x240.png create mode 100644 gui/slick/css/lib/images/ui-icons_8c291d_256x240.png create mode 100644 gui/slick/css/lib/images/ui-icons_cd0a0a_256x240.png create mode 100644 gui/slick/css/lib/jquery-ui-1.10.4.custom.css create mode 100644 gui/slick/css/lib/jquery-ui-1.8.17.custom.css create mode 100644 gui/slick/css/lib/jquery.pnotify.default.css create mode 100644 gui/slick/css/lib/jquery.qtip-2.0.1.min.css create mode 100644 gui/slick/css/lib/tablesorter.css create mode 100644 gui/slick/css/superfish.css create mode 100644 gui/slick/css/superfish.less create mode 100644 gui/slick/css/tablesorter.less create mode 100644 gui/slick/css/token-input-facebook.css create mode 100644 gui/slick/css/token-input-mac.css create mode 100644 gui/slick/css/token-input.css create mode 100644 gui/slick/images/add-existing32.png create mode 100644 gui/slick/images/add-new32.png create mode 100644 gui/slick/images/arrows.png create mode 100644 gui/slick/images/banner.png create mode 100644 gui/slick/images/bg.gif create mode 100644 gui/slick/images/cancel32.png create mode 100644 gui/slick/images/changelog16.png create mode 100644 gui/slick/images/closed_captioning.png create mode 100644 gui/slick/images/flags/ad.png create mode 100644 gui/slick/images/flags/ae.png create mode 100644 gui/slick/images/flags/af.png create mode 100644 gui/slick/images/flags/ag.png create mode 100644 gui/slick/images/flags/ai.png create mode 100644 gui/slick/images/flags/al.png create mode 100644 gui/slick/images/flags/am.png create mode 100644 gui/slick/images/flags/an.png create mode 100644 gui/slick/images/flags/ao.png create mode 100644 gui/slick/images/flags/ar.png create mode 100644 gui/slick/images/flags/as.png create mode 100644 gui/slick/images/flags/at.png create mode 100644 gui/slick/images/flags/au.png create mode 100644 gui/slick/images/flags/aw.png create mode 100644 gui/slick/images/flags/ax.png create mode 100644 gui/slick/images/flags/az.png create mode 100644 gui/slick/images/flags/ba.png create mode 100644 gui/slick/images/flags/bb.png create mode 100644 gui/slick/images/flags/bd.png create mode 100644 gui/slick/images/flags/be.png create mode 100644 gui/slick/images/flags/bf.png create mode 100644 gui/slick/images/flags/bg.png create mode 100644 gui/slick/images/flags/bh.png create mode 100644 gui/slick/images/flags/bi.png create mode 100644 gui/slick/images/flags/bj.png create mode 100644 gui/slick/images/flags/bm.png create mode 100644 gui/slick/images/flags/bn.png create mode 100644 gui/slick/images/flags/bo.png create mode 100644 gui/slick/images/flags/br.png create mode 100644 gui/slick/images/flags/bs.png create mode 100644 gui/slick/images/flags/bt.png create mode 100644 gui/slick/images/flags/bv.png create mode 100644 gui/slick/images/flags/bw.png create mode 100644 gui/slick/images/flags/by.png create mode 100644 gui/slick/images/flags/bz.png create mode 100644 gui/slick/images/flags/ca.png create mode 100644 gui/slick/images/flags/cc.png create mode 100644 gui/slick/images/flags/cd.png create mode 100644 gui/slick/images/flags/cf.png create mode 100644 gui/slick/images/flags/cg.png create mode 100644 gui/slick/images/flags/ch.png create mode 100644 gui/slick/images/flags/ci.png create mode 100644 gui/slick/images/flags/ck.png create mode 100644 gui/slick/images/flags/cl.png create mode 100644 gui/slick/images/flags/cm.png create mode 100644 gui/slick/images/flags/cn.png create mode 100644 gui/slick/images/flags/co.png create mode 100644 gui/slick/images/flags/cr.png create mode 100644 gui/slick/images/flags/cs.png create mode 100644 gui/slick/images/flags/cu.png create mode 100644 gui/slick/images/flags/cv.png create mode 100644 gui/slick/images/flags/cx.png create mode 100644 gui/slick/images/flags/cy.png create mode 100644 gui/slick/images/flags/cz.png create mode 100644 gui/slick/images/flags/da.png create mode 100644 gui/slick/images/flags/de.png create mode 100644 gui/slick/images/flags/dj.png create mode 100644 gui/slick/images/flags/dk.png create mode 100644 gui/slick/images/flags/dm.png create mode 100644 gui/slick/images/flags/do.png create mode 100644 gui/slick/images/flags/dz.png create mode 100644 gui/slick/images/flags/ec.png create mode 100644 gui/slick/images/flags/ee.png create mode 100644 gui/slick/images/flags/eg.png create mode 100644 gui/slick/images/flags/eh.png create mode 100644 gui/slick/images/flags/el.png create mode 100644 gui/slick/images/flags/en.png create mode 100644 gui/slick/images/flags/er.png create mode 100644 gui/slick/images/flags/es.png create mode 100644 gui/slick/images/flags/et.png create mode 100644 gui/slick/images/flags/fam.png create mode 100644 gui/slick/images/flags/fi.png create mode 100644 gui/slick/images/flags/fj.png create mode 100644 gui/slick/images/flags/fk.png create mode 100644 gui/slick/images/flags/fm.png create mode 100644 gui/slick/images/flags/fo.png create mode 100644 gui/slick/images/flags/fr.png create mode 100644 gui/slick/images/flags/ga.png create mode 100644 gui/slick/images/flags/gb.png create mode 100644 gui/slick/images/flags/gd.png create mode 100644 gui/slick/images/flags/ge.png create mode 100644 gui/slick/images/flags/gf.png create mode 100644 gui/slick/images/flags/gh.png create mode 100644 gui/slick/images/flags/gi.png create mode 100644 gui/slick/images/flags/gl.png create mode 100644 gui/slick/images/flags/gm.png create mode 100644 gui/slick/images/flags/gn.png create mode 100644 gui/slick/images/flags/gp.png create mode 100644 gui/slick/images/flags/gq.png create mode 100644 gui/slick/images/flags/gr.png create mode 100644 gui/slick/images/flags/gs.png create mode 100644 gui/slick/images/flags/gt.png create mode 100644 gui/slick/images/flags/gu.png create mode 100644 gui/slick/images/flags/gw.png create mode 100644 gui/slick/images/flags/gy.png create mode 100644 gui/slick/images/flags/he.png create mode 100644 gui/slick/images/flags/hk.png create mode 100644 gui/slick/images/flags/hm.png create mode 100644 gui/slick/images/flags/hn.png create mode 100644 gui/slick/images/flags/hr.png create mode 100644 gui/slick/images/flags/ht.png create mode 100644 gui/slick/images/flags/hu.png create mode 100644 gui/slick/images/flags/id.png create mode 100644 gui/slick/images/flags/ie.png create mode 100644 gui/slick/images/flags/il.png create mode 100644 gui/slick/images/flags/in.png create mode 100644 gui/slick/images/flags/io.png create mode 100644 gui/slick/images/flags/iq.png create mode 100644 gui/slick/images/flags/ir.png create mode 100644 gui/slick/images/flags/is.png create mode 100644 gui/slick/images/flags/it.png create mode 100644 gui/slick/images/flags/ja.png create mode 100644 gui/slick/images/flags/jm.png create mode 100644 gui/slick/images/flags/jo.png create mode 100644 gui/slick/images/flags/jp.png create mode 100644 gui/slick/images/flags/ke.png create mode 100644 gui/slick/images/flags/kg.png create mode 100644 gui/slick/images/flags/kh.png create mode 100644 gui/slick/images/flags/ki.png create mode 100644 gui/slick/images/flags/km.png create mode 100644 gui/slick/images/flags/kn.png create mode 100644 gui/slick/images/flags/ko.png create mode 100644 gui/slick/images/flags/kp.png create mode 100644 gui/slick/images/flags/kr.png create mode 100644 gui/slick/images/flags/kw.png create mode 100644 gui/slick/images/flags/ky.png create mode 100644 gui/slick/images/flags/kz.png create mode 100644 gui/slick/images/flags/la.png create mode 100644 gui/slick/images/flags/lb.png create mode 100644 gui/slick/images/flags/lc.png create mode 100644 gui/slick/images/flags/li.png create mode 100644 gui/slick/images/flags/lk.png create mode 100644 gui/slick/images/flags/lr.png create mode 100644 gui/slick/images/flags/ls.png create mode 100644 gui/slick/images/flags/lt.png create mode 100644 gui/slick/images/flags/lu.png create mode 100644 gui/slick/images/flags/lv.png create mode 100644 gui/slick/images/flags/ly.png create mode 100644 gui/slick/images/flags/ma.png create mode 100644 gui/slick/images/flags/mc.png create mode 100644 gui/slick/images/flags/md.png create mode 100644 gui/slick/images/flags/me.png create mode 100644 gui/slick/images/flags/mg.png create mode 100644 gui/slick/images/flags/mh.png create mode 100644 gui/slick/images/flags/mk.png create mode 100644 gui/slick/images/flags/ml.png create mode 100644 gui/slick/images/flags/mm.png create mode 100644 gui/slick/images/flags/mn.png create mode 100644 gui/slick/images/flags/mo.png create mode 100644 gui/slick/images/flags/mp.png create mode 100644 gui/slick/images/flags/mq.png create mode 100644 gui/slick/images/flags/mr.png create mode 100644 gui/slick/images/flags/ms.png create mode 100644 gui/slick/images/flags/mt.png create mode 100644 gui/slick/images/flags/mu.png create mode 100644 gui/slick/images/flags/mv.png create mode 100644 gui/slick/images/flags/mw.png create mode 100644 gui/slick/images/flags/mx.png create mode 100644 gui/slick/images/flags/my.png create mode 100644 gui/slick/images/flags/mz.png create mode 100644 gui/slick/images/flags/na.png create mode 100644 gui/slick/images/flags/nc.png create mode 100644 gui/slick/images/flags/ne.png create mode 100644 gui/slick/images/flags/nf.png create mode 100644 gui/slick/images/flags/ng.png create mode 100644 gui/slick/images/flags/ni.png create mode 100644 gui/slick/images/flags/nl.png create mode 100644 gui/slick/images/flags/no.png create mode 100644 gui/slick/images/flags/np.png create mode 100644 gui/slick/images/flags/nr.png create mode 100644 gui/slick/images/flags/nu.png create mode 100644 gui/slick/images/flags/nz.png create mode 100644 gui/slick/images/flags/om.png create mode 100644 gui/slick/images/flags/pa.png create mode 100644 gui/slick/images/flags/pb.png create mode 100644 gui/slick/images/flags/pe.png create mode 100644 gui/slick/images/flags/pf.png create mode 100644 gui/slick/images/flags/pg.png create mode 100644 gui/slick/images/flags/ph.png create mode 100644 gui/slick/images/flags/pk.png create mode 100644 gui/slick/images/flags/pl.png create mode 100644 gui/slick/images/flags/pm.png create mode 100644 gui/slick/images/flags/pn.png create mode 100644 gui/slick/images/flags/pr.png create mode 100644 gui/slick/images/flags/ps.png create mode 100644 gui/slick/images/flags/pt.png create mode 100644 gui/slick/images/flags/pw.png create mode 100644 gui/slick/images/flags/py.png create mode 100644 gui/slick/images/flags/qa.png create mode 100644 gui/slick/images/flags/re.png create mode 100644 gui/slick/images/flags/ro.png create mode 100644 gui/slick/images/flags/rs.png create mode 100644 gui/slick/images/flags/ru.png create mode 100644 gui/slick/images/flags/rw.png create mode 100644 gui/slick/images/flags/sa.png create mode 100644 gui/slick/images/flags/sb.png create mode 100644 gui/slick/images/flags/sc.png create mode 100644 gui/slick/images/flags/sd.png create mode 100644 gui/slick/images/flags/se.png create mode 100644 gui/slick/images/flags/sg.png create mode 100644 gui/slick/images/flags/sh.png create mode 100644 gui/slick/images/flags/si.png create mode 100644 gui/slick/images/flags/sj.png create mode 100644 gui/slick/images/flags/sk.png create mode 100644 gui/slick/images/flags/sl.png create mode 100644 gui/slick/images/flags/sm.png create mode 100644 gui/slick/images/flags/sn.png create mode 100644 gui/slick/images/flags/so.png create mode 100644 gui/slick/images/flags/sr.png create mode 100644 gui/slick/images/flags/st.png create mode 100644 gui/slick/images/flags/sv.png create mode 100644 gui/slick/images/flags/sy.png create mode 100644 gui/slick/images/flags/sz.png create mode 100644 gui/slick/images/flags/tc.png create mode 100644 gui/slick/images/flags/td.png create mode 100644 gui/slick/images/flags/tf.png create mode 100644 gui/slick/images/flags/tg.png create mode 100644 gui/slick/images/flags/th.png create mode 100644 gui/slick/images/flags/tj.png create mode 100644 gui/slick/images/flags/tk.png create mode 100644 gui/slick/images/flags/tl.png create mode 100644 gui/slick/images/flags/tm.png create mode 100644 gui/slick/images/flags/tn.png create mode 100644 gui/slick/images/flags/to.png create mode 100644 gui/slick/images/flags/tr.png create mode 100644 gui/slick/images/flags/tt.png create mode 100644 gui/slick/images/flags/tv.png create mode 100644 gui/slick/images/flags/tw.png create mode 100644 gui/slick/images/flags/tz.png create mode 100644 gui/slick/images/flags/ua.png create mode 100644 gui/slick/images/flags/ug.png create mode 100644 gui/slick/images/flags/um.png create mode 100644 gui/slick/images/flags/us.png create mode 100644 gui/slick/images/flags/uy.png create mode 100644 gui/slick/images/flags/uz.png create mode 100644 gui/slick/images/flags/va.png create mode 100644 gui/slick/images/flags/vc.png create mode 100644 gui/slick/images/flags/ve.png create mode 100644 gui/slick/images/flags/vg.png create mode 100644 gui/slick/images/flags/vi.png create mode 100644 gui/slick/images/flags/vn.png create mode 100644 gui/slick/images/flags/vu.png create mode 100644 gui/slick/images/flags/wf.png create mode 100644 gui/slick/images/flags/ws.png create mode 100644 gui/slick/images/flags/ye.png create mode 100644 gui/slick/images/flags/yt.png create mode 100644 gui/slick/images/flags/za.png create mode 100644 gui/slick/images/flags/zh.png create mode 100644 gui/slick/images/flags/zm.png create mode 100644 gui/slick/images/flags/zw.png create mode 100644 gui/slick/images/glyphicons-config.png create mode 100644 gui/slick/images/glyphicons-halflings-white.png create mode 100644 gui/slick/images/glyphicons-halflings.png create mode 100644 gui/slick/images/ico/apple-touch-icon-114x114-precomposed.png create mode 100644 gui/slick/images/ico/apple-touch-icon-144x144-precomposed.png create mode 100644 gui/slick/images/ico/apple-touch-icon-57x57-precomposed.png create mode 100644 gui/slick/images/ico/apple-touch-icon-72x72-precomposed.png create mode 100644 gui/slick/images/ico/apple-touch-icon-precomposed.png create mode 100644 gui/slick/images/ico/favicon.ico create mode 100644 gui/slick/images/imdb.png create mode 100644 gui/slick/images/info32.png create mode 100644 gui/slick/images/legend16.png create mode 100644 gui/slick/images/like.png create mode 100644 gui/slick/images/loading.gif create mode 100644 gui/slick/images/loading16.gif create mode 100644 gui/slick/images/loading16_333333.gif create mode 100644 gui/slick/images/loading16_dddddd.gif create mode 100644 gui/slick/images/loading32.gif create mode 100644 gui/slick/images/menu/addshow16.png create mode 100644 gui/slick/images/menu/addshow16_over.png create mode 100644 gui/slick/images/menu/backlog16.png create mode 100644 gui/slick/images/menu/backlog16_over.png create mode 100644 gui/slick/images/menu/backlog_view16.png create mode 100644 gui/slick/images/menu/backlog_view16_over.png create mode 100644 gui/slick/images/menu/bittorrent.png create mode 100644 gui/slick/images/menu/bittorrent_over.png create mode 100644 gui/slick/images/menu/config16.png create mode 100644 gui/slick/images/menu/config16_over.png create mode 100644 gui/slick/images/menu/config_index16.png create mode 100644 gui/slick/images/menu/config_index16_over.png create mode 100644 gui/slick/images/menu/failed_download.png create mode 100644 gui/slick/images/menu/failed_download_over.png create mode 100644 gui/slick/images/menu/home16.png create mode 100644 gui/slick/images/menu/home16_over.png create mode 100644 gui/slick/images/menu/manage16.png create mode 100644 gui/slick/images/menu/manage16_over.png create mode 100644 gui/slick/images/menu/managesearches16.png create mode 100644 gui/slick/images/menu/managesearches16_over.png create mode 100644 gui/slick/images/menu/poster16.png create mode 100644 gui/slick/images/menu/poster16_over.png create mode 100644 gui/slick/images/menu/postprocess16.png create mode 100644 gui/slick/images/menu/postprocess16_over.png create mode 100644 gui/slick/images/menu/restart16.png create mode 100644 gui/slick/images/menu/restart16_over.png create mode 100644 gui/slick/images/menu/shutdown16.png create mode 100644 gui/slick/images/menu/shutdown16_over.png create mode 100644 gui/slick/images/menu/system18.png create mode 100644 gui/slick/images/menu/update16.png create mode 100644 gui/slick/images/menu/update16_over.png create mode 100644 gui/slick/images/menu/viewlog16.png create mode 100644 gui/slick/images/menu/viewlog16_over.png create mode 100644 gui/slick/images/menu/viewlog_errors16.png create mode 100644 gui/slick/images/menu/viewlog_errors16_over.png create mode 100644 gui/slick/images/menu/xbmc16.png create mode 100644 gui/slick/images/menu/xbmc16_over.png create mode 100644 gui/slick/images/minus.png create mode 100644 gui/slick/images/network/1live.png create mode 100644 gui/slick/images/network/33.png create mode 100644 gui/slick/images/network/3fm.png create mode 100644 gui/slick/images/network/3sat.png create mode 100644 gui/slick/images/network/7mate.png create mode 100644 gui/slick/images/network/a&e.png create mode 100644 gui/slick/images/network/aande.png create mode 100644 gui/slick/images/network/abc (Australia).png create mode 100644 gui/slick/images/network/abc family.png create mode 100644 gui/slick/images/network/abc news.png create mode 100644 gui/slick/images/network/abc.png create mode 100644 gui/slick/images/network/adult swim.png create mode 100644 gui/slick/images/network/adult-swim.png create mode 100644 gui/slick/images/network/adultswim.png create mode 100644 gui/slick/images/network/amazon.png create mode 100644 gui/slick/images/network/amc.png create mode 100644 gui/slick/images/network/animal planet.png create mode 100644 gui/slick/images/network/animalplanet.png create mode 100644 gui/slick/images/network/animax.png create mode 100644 gui/slick/images/network/anime network.png create mode 100644 gui/slick/images/network/antena 3.png create mode 100644 gui/slick/images/network/ard.png create mode 100644 gui/slick/images/network/arte.png create mode 100644 gui/slick/images/network/at-x.png create mode 100644 gui/slick/images/network/at5.png create mode 100644 gui/slick/images/network/avro.png create mode 100644 gui/slick/images/network/bandai visual.png create mode 100644 gui/slick/images/network/bandai.png create mode 100644 gui/slick/images/network/bbc america.png create mode 100644 gui/slick/images/network/bbc entertainment.png create mode 100644 gui/slick/images/network/bbc four.png create mode 100644 gui/slick/images/network/bbc one.png create mode 100644 gui/slick/images/network/bbc prime.png create mode 100644 gui/slick/images/network/bbc three.png create mode 100644 gui/slick/images/network/bbc two.png create mode 100644 gui/slick/images/network/bbc.png create mode 100644 gui/slick/images/network/bio..png create mode 100644 gui/slick/images/network/biography channel.png create mode 100644 gui/slick/images/network/bloomberg.png create mode 100644 gui/slick/images/network/bnn.png create mode 100644 gui/slick/images/network/bravo.png create mode 100644 gui/slick/images/network/canal+.png create mode 100644 gui/slick/images/network/canvas.png create mode 100644 gui/slick/images/network/cartoon network.png create mode 100644 gui/slick/images/network/cartoonnetwork.png create mode 100644 gui/slick/images/network/cbbc.png create mode 100644 gui/slick/images/network/cbc.png create mode 100644 gui/slick/images/network/cbeebies.png create mode 100644 gui/slick/images/network/cbs.png create mode 100644 gui/slick/images/network/channel 4.png create mode 100644 gui/slick/images/network/channel ten.png create mode 100644 gui/slick/images/network/cinemax.png create mode 100644 gui/slick/images/network/city.png create mode 100644 gui/slick/images/network/cnn.png create mode 100644 gui/slick/images/network/comedy central Family.png create mode 100644 gui/slick/images/network/comedy central HD.png create mode 100644 gui/slick/images/network/comedy central.png create mode 100644 gui/slick/images/network/comedy entral old.png create mode 100644 gui/slick/images/network/comedycentral.png create mode 100644 gui/slick/images/network/ctc.png create mode 100644 gui/slick/images/network/ctv.png create mode 100644 gui/slick/images/network/cuatro.png create mode 100644 gui/slick/images/network/cw.png create mode 100644 gui/slick/images/network/discovery channel.png create mode 100644 gui/slick/images/network/discovery.png create mode 100644 gui/slick/images/network/discoverychannel.png create mode 100644 gui/slick/images/network/disney channel.png create mode 100644 gui/slick/images/network/disney xd.png create mode 100644 gui/slick/images/network/disney.png create mode 100644 gui/slick/images/network/disneychannel.png create mode 100644 gui/slick/images/network/diy network.png create mode 100644 gui/slick/images/network/dmax.png create mode 100644 gui/slick/images/network/e!.png create mode 100644 gui/slick/images/network/e4.png create mode 100644 gui/slick/images/network/een.png create mode 100644 gui/slick/images/network/einslive.png create mode 100644 gui/slick/images/network/endemol.png create mode 100644 gui/slick/images/network/entertainment.png create mode 100644 gui/slick/images/network/eredivisie live 1.png create mode 100644 gui/slick/images/network/eredivisie live 2.png create mode 100644 gui/slick/images/network/eredivisie live.png create mode 100644 gui/slick/images/network/espn.png create mode 100644 gui/slick/images/network/eurosport 1.png create mode 100644 gui/slick/images/network/eurosport 2.png create mode 100644 gui/slick/images/network/eurosport hd.png create mode 100644 gui/slick/images/network/eurosport.png create mode 100644 gui/slick/images/network/five.png create mode 100644 gui/slick/images/network/food network.png create mode 100644 gui/slick/images/network/fox television classics.png create mode 100644 gui/slick/images/network/fox.png create mode 100644 gui/slick/images/network/france 2.png create mode 100644 gui/slick/images/network/france 3.png create mode 100644 gui/slick/images/network/fuji TV.png create mode 100644 gui/slick/images/network/funimation.png create mode 100644 gui/slick/images/network/fx.png create mode 100644 gui/slick/images/network/fxnetworks.png create mode 100644 gui/slick/images/network/fxx.png create mode 100644 gui/slick/images/network/g4.png create mode 100644 gui/slick/images/network/g4_2.png create mode 100644 gui/slick/images/network/game show network.png create mode 100644 gui/slick/images/network/global tv.png create mode 100644 gui/slick/images/network/hbo.png create mode 100644 gui/slick/images/network/hdnet.png create mode 100644 gui/slick/images/network/history.png create mode 100644 gui/slick/images/network/historychannel.png create mode 100644 gui/slick/images/network/hulu presents.png create mode 100644 gui/slick/images/network/hulu.png create mode 100644 gui/slick/images/network/ifc.png create mode 100644 gui/slick/images/network/itv.png create mode 100644 gui/slick/images/network/itv1.png create mode 100644 gui/slick/images/network/ketnet.png create mode 100644 gui/slick/images/network/kro.png create mode 100644 gui/slick/images/network/la1.png create mode 100644 gui/slick/images/network/la2.png create mode 100644 gui/slick/images/network/lasexta.png create mode 100644 gui/slick/images/network/lifetime.png create mode 100644 gui/slick/images/network/m6.png create mode 100644 gui/slick/images/network/manhattan neighborhood network.png create mode 100644 gui/slick/images/network/mbs.png create mode 100644 gui/slick/images/network/mdr.png create mode 100644 gui/slick/images/network/motorvision tv.png create mode 100644 gui/slick/images/network/motorvision.png create mode 100644 gui/slick/images/network/mtv.png create mode 100644 gui/slick/images/network/nat geo wild.png create mode 100644 gui/slick/images/network/national geographic.png create mode 100644 gui/slick/images/network/nbc.png create mode 100644 gui/slick/images/network/nbcu tv.png create mode 100644 gui/slick/images/network/ndr.png create mode 100644 gui/slick/images/network/nederland 1.png create mode 100644 gui/slick/images/network/nederland 2.png create mode 100644 gui/slick/images/network/nederland 3.png create mode 100644 gui/slick/images/network/net 5.png create mode 100644 gui/slick/images/network/net5.png create mode 100644 gui/slick/images/network/netflix.png create mode 100644 gui/slick/images/network/network ten.png create mode 100644 gui/slick/images/network/ngc.png create mode 100644 gui/slick/images/network/nhk.png create mode 100644 gui/slick/images/network/nick at nite.png create mode 100644 gui/slick/images/network/nickToons network.png create mode 100644 gui/slick/images/network/nickelodeon.png create mode 100644 gui/slick/images/network/nonetwork.png create mode 100644 gui/slick/images/network/ntv.png create mode 100644 gui/slick/images/network/orf.png create mode 100644 gui/slick/images/network/orf1 hd.png create mode 100644 gui/slick/images/network/oxygen.png create mode 100644 gui/slick/images/network/pbs.png create mode 100644 gui/slick/images/network/playboy tv.png create mode 100644 gui/slick/images/network/private spice.png create mode 100644 gui/slick/images/network/pro7.png create mode 100644 gui/slick/images/network/production i.g.png create mode 100644 gui/slick/images/network/radio west.png create mode 100644 gui/slick/images/network/revision3.png create mode 100644 gui/slick/images/network/rtl 4.png create mode 100644 gui/slick/images/network/rtl 5.png create mode 100644 gui/slick/images/network/rtl 7.png create mode 100644 gui/slick/images/network/rtl 8.png create mode 100644 gui/slick/images/network/rtl television.png create mode 100644 gui/slick/images/network/rtl4.png create mode 100644 gui/slick/images/network/rtl5.png create mode 100644 gui/slick/images/network/rtl7.png create mode 100644 gui/slick/images/network/rtl8.png create mode 100644 gui/slick/images/network/sat1.png create mode 100644 gui/slick/images/network/sbs 6.png create mode 100644 gui/slick/images/network/sbs.png create mode 100644 gui/slick/images/network/sbs6.png create mode 100644 gui/slick/images/network/scifi.png create mode 100644 gui/slick/images/network/seven network.png create mode 100644 gui/slick/images/network/showcase.png create mode 100644 gui/slick/images/network/showtime.png create mode 100644 gui/slick/images/network/sky.png create mode 100644 gui/slick/images/network/sky1.png create mode 100644 gui/slick/images/network/speed channel.png create mode 100644 gui/slick/images/network/spike tv.png create mode 100644 gui/slick/images/network/starz!.png create mode 100644 gui/slick/images/network/starz.png create mode 100644 gui/slick/images/network/style network.png create mode 100644 gui/slick/images/network/sundance.png create mode 100644 gui/slick/images/network/sunrise.png create mode 100644 gui/slick/images/network/super channel.png create mode 100644 gui/slick/images/network/syfy.png create mode 100644 gui/slick/images/network/tbs superstation.png create mode 100644 gui/slick/images/network/tbs.png create mode 100644 gui/slick/images/network/telecinco.png create mode 100644 gui/slick/images/network/the cw.png create mode 100644 gui/slick/images/network/the movie network.png create mode 100644 gui/slick/images/network/the wb.png create mode 100644 gui/slick/images/network/the-cw.png create mode 100644 gui/slick/images/network/thecw.png create mode 100644 gui/slick/images/network/thewb.png create mode 100644 gui/slick/images/network/tmf.png create mode 100644 gui/slick/images/network/tnt.png create mode 100644 gui/slick/images/network/toei animation.png create mode 100644 gui/slick/images/network/tokyo broadcasting system.png create mode 100644 gui/slick/images/network/tokyo mx.png create mode 100644 gui/slick/images/network/tv asahi.png create mode 100644 gui/slick/images/network/tv guide.png create mode 100644 gui/slick/images/network/tv saitama.png create mode 100644 gui/slick/images/network/tv tokyo.png create mode 100644 gui/slick/images/network/tv west.png create mode 100644 gui/slick/images/network/tv3.png create mode 100644 gui/slick/images/network/tve.png create mode 100644 gui/slick/images/network/tve1.png create mode 100644 gui/slick/images/network/tve2.png create mode 100644 gui/slick/images/network/upn.png create mode 100644 gui/slick/images/network/usa network.png create mode 100644 gui/slick/images/network/usa-network.png create mode 100644 gui/slick/images/network/usa.png create mode 100644 gui/slick/images/network/usanetwork.png create mode 100644 gui/slick/images/network/vara.png create mode 100644 gui/slick/images/network/veronica.png create mode 100644 gui/slick/images/network/vh1.png create mode 100644 gui/slick/images/network/viz media.png create mode 100644 gui/slick/images/network/vox.png create mode 100644 gui/slick/images/network/vpro.png create mode 100644 gui/slick/images/network/vtm.png create mode 100644 gui/slick/images/network/wowow.png create mode 100644 gui/slick/images/network/xebec.png create mode 100644 gui/slick/images/network/youtube.png create mode 100644 gui/slick/images/network/zdf.png create mode 100644 gui/slick/images/next.gif create mode 100644 gui/slick/images/nfo-no.gif create mode 100644 gui/slick/images/nfo.gif create mode 100644 gui/slick/images/no16.png create mode 100644 gui/slick/images/notifiers/boxcar.png create mode 100644 gui/slick/images/notifiers/email.png create mode 100644 gui/slick/images/notifiers/growl.png create mode 100644 gui/slick/images/notifiers/libnotify.png create mode 100644 gui/slick/images/notifiers/nma.png create mode 100644 gui/slick/images/notifiers/nmj.png create mode 100644 gui/slick/images/notifiers/notifo.png create mode 100644 gui/slick/images/notifiers/plex.png create mode 100644 gui/slick/images/notifiers/prowl.png create mode 100644 gui/slick/images/notifiers/pushalot.png create mode 100644 gui/slick/images/notifiers/pushbullet.png create mode 100644 gui/slick/images/notifiers/pushover.png create mode 100644 gui/slick/images/notifiers/pytivo.png create mode 100644 gui/slick/images/notifiers/synoindex.png create mode 100644 gui/slick/images/notifiers/synologynotifier.png create mode 100644 gui/slick/images/notifiers/trakt.png create mode 100644 gui/slick/images/notifiers/twitter.png create mode 100644 gui/slick/images/notifiers/xbmc.png create mode 100644 gui/slick/images/paypal/btn_donateCC_LG.gif create mode 100644 gui/slick/images/paypal/btn_donate_LG.gif create mode 100644 gui/slick/images/plus.png create mode 100644 gui/slick/images/poster.png create mode 100644 gui/slick/images/prev.gif create mode 100644 gui/slick/images/providers/bin_req.png create mode 100644 gui/slick/images/providers/btn.png create mode 100644 gui/slick/images/providers/ezrss.png create mode 100644 gui/slick/images/providers/eztv_bt_chat.png create mode 100644 gui/slick/images/providers/hdbits.png create mode 100644 gui/slick/images/providers/hdtorrents.png create mode 100644 gui/slick/images/providers/iptorrents.png create mode 100644 gui/slick/images/providers/kat.png create mode 100644 gui/slick/images/providers/missing.png create mode 100644 gui/slick/images/providers/newzbin.png create mode 100644 gui/slick/images/providers/newznab.png create mode 100644 gui/slick/images/providers/nextgen.png create mode 100644 gui/slick/images/providers/nzb_su.png create mode 100644 gui/slick/images/providers/nzbfinder.png create mode 100644 gui/slick/images/providers/nzbgeek.png create mode 100644 gui/slick/images/providers/nzbs_org.png create mode 100644 gui/slick/images/providers/nzbs_org_old.png create mode 100644 gui/slick/images/providers/omgwtfnzbs.png create mode 100644 gui/slick/images/providers/publichd.png create mode 100644 gui/slick/images/providers/scc.png create mode 100644 gui/slick/images/providers/sick_beard_index.png create mode 100644 gui/slick/images/providers/thepiratebay.png create mode 100644 gui/slick/images/providers/thepiratebay_.png create mode 100644 gui/slick/images/providers/torrentday.png create mode 100644 gui/slick/images/providers/torrentleech.png create mode 100644 gui/slick/images/providers/torrentrss.png create mode 100644 gui/slick/images/providers/tvbinz.png create mode 100644 gui/slick/images/providers/tvnzb.png create mode 100644 gui/slick/images/providers/tvtorrents.png create mode 100644 gui/slick/images/providers/usenet_crawler.png create mode 100644 gui/slick/images/providers/womble_s_index.png create mode 100644 gui/slick/images/save.png create mode 100644 gui/slick/images/search32.png create mode 100644 gui/slick/images/shadow.png create mode 100644 gui/slick/images/sickbeard.png create mode 100644 gui/slick/images/subtitles/addic7ed.png create mode 100644 gui/slick/images/subtitles/bierdopje.png create mode 100644 gui/slick/images/subtitles/itasa.png create mode 100644 gui/slick/images/subtitles/opensubtitles.png create mode 100644 gui/slick/images/subtitles/podnapisiweb.png create mode 100644 gui/slick/images/subtitles/subscene.png create mode 100644 gui/slick/images/subtitles/subswiki.png create mode 100644 gui/slick/images/subtitles/subtitlesource.png create mode 100644 gui/slick/images/subtitles/subtitulos.png create mode 100644 gui/slick/images/subtitles/thesubdb.png create mode 100644 gui/slick/images/subtitles/tvsubtitles.png create mode 100644 gui/slick/images/subtitles/usub.png create mode 100644 gui/slick/images/tablesorter/asc.gif create mode 100644 gui/slick/images/tablesorter/bg.gif create mode 100644 gui/slick/images/tablesorter/desc.gif create mode 100644 gui/slick/images/tbn-no.gif create mode 100644 gui/slick/images/tbn.gif create mode 100644 gui/slick/images/thetvdb16.png create mode 100644 gui/slick/images/top.gif create mode 100644 gui/slick/images/xbmc-notify.png create mode 100644 gui/slick/images/yes16.png create mode 100644 gui/slick/interfaces/default/apiBuilder.tmpl create mode 100644 gui/slick/interfaces/default/comingEpisodes.tmpl create mode 100644 gui/slick/interfaces/default/config.tmpl create mode 100644 gui/slick/interfaces/default/config_general.tmpl create mode 100644 gui/slick/interfaces/default/config_notifications.tmpl create mode 100644 gui/slick/interfaces/default/config_postProcessing.tmpl create mode 100644 gui/slick/interfaces/default/config_providers.tmpl create mode 100644 gui/slick/interfaces/default/config_search.tmpl create mode 100644 gui/slick/interfaces/default/config_subtitles.tmpl create mode 100644 gui/slick/interfaces/default/displayShow.tmpl create mode 100644 gui/slick/interfaces/default/editShow.tmpl create mode 100644 gui/slick/interfaces/default/errorlogs.tmpl create mode 100644 gui/slick/interfaces/default/genericMessage.tmpl create mode 100644 gui/slick/interfaces/default/history.tmpl create mode 100644 gui/slick/interfaces/default/home.tmpl create mode 100644 gui/slick/interfaces/default/home_addExistingShow.tmpl create mode 100644 gui/slick/interfaces/default/home_addShows.tmpl create mode 100644 gui/slick/interfaces/default/home_massAddTable.tmpl create mode 100644 gui/slick/interfaces/default/home_newShow.tmpl create mode 100644 gui/slick/interfaces/default/home_postprocess.tmpl create mode 100644 gui/slick/interfaces/default/inc_addShowOptions.tmpl create mode 100644 gui/slick/interfaces/default/inc_bottom.tmpl create mode 100644 gui/slick/interfaces/default/inc_qualityChooser.tmpl create mode 100644 gui/slick/interfaces/default/inc_rootDirs.tmpl create mode 100644 gui/slick/interfaces/default/inc_top.tmpl create mode 100644 gui/slick/interfaces/default/manage.tmpl create mode 100644 gui/slick/interfaces/default/manage_backlogOverview.tmpl create mode 100644 gui/slick/interfaces/default/manage_episodeStatuses.tmpl create mode 100644 gui/slick/interfaces/default/manage_failedDownloads.tmpl create mode 100644 gui/slick/interfaces/default/manage_manageSearches.tmpl create mode 100644 gui/slick/interfaces/default/manage_massEdit.tmpl create mode 100644 gui/slick/interfaces/default/manage_subtitleMissed.tmpl create mode 100644 gui/slick/interfaces/default/manage_torrents.tmpl create mode 100644 gui/slick/interfaces/default/restart.tmpl create mode 100644 gui/slick/interfaces/default/restart_bare.tmpl create mode 100644 gui/slick/interfaces/default/testRename.tmpl create mode 100644 gui/slick/interfaces/default/viewlogs.tmpl create mode 100644 gui/slick/js/addExistingShow.js create mode 100644 gui/slick/js/addShowOptions.js create mode 100644 gui/slick/js/ajaxEpRetry.js create mode 100644 gui/slick/js/ajaxEpSearch.js create mode 100644 gui/slick/js/ajaxEpSubtitles.js create mode 100644 gui/slick/js/ajaxNotifications.js create mode 100644 gui/slick/js/apibuilder.js create mode 100644 gui/slick/js/browser.js create mode 100644 gui/slick/js/config.js create mode 100644 gui/slick/js/configNotifications.js create mode 100644 gui/slick/js/configPostProcessing.js create mode 100644 gui/slick/js/configProviders.js create mode 100644 gui/slick/js/configSearch.js create mode 100644 gui/slick/js/configSubtitles.js create mode 100644 gui/slick/js/displayShow.js create mode 100644 gui/slick/js/failedDownloads.js create mode 100644 gui/slick/js/fancybox/blank.gif create mode 100644 gui/slick/js/fancybox/fancy_close.png create mode 100644 gui/slick/js/fancybox/fancy_loading.png create mode 100644 gui/slick/js/fancybox/fancy_nav_left.png create mode 100644 gui/slick/js/fancybox/fancy_nav_right.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_e.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_n.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_ne.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_nw.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_s.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_se.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_sw.png create mode 100644 gui/slick/js/fancybox/fancy_shadow_w.png create mode 100644 gui/slick/js/fancybox/fancy_title_left.png create mode 100644 gui/slick/js/fancybox/fancy_title_main.png create mode 100644 gui/slick/js/fancybox/fancy_title_over.png create mode 100644 gui/slick/js/fancybox/fancy_title_right.png create mode 100644 gui/slick/js/fancybox/fancybox-x.png create mode 100644 gui/slick/js/fancybox/fancybox-y.png create mode 100644 gui/slick/js/fancybox/fancybox.png create mode 100644 gui/slick/js/fancybox/jquery.easing-1.3.pack.js create mode 100644 gui/slick/js/fancybox/jquery.fancybox-1.3.4.css create mode 100644 gui/slick/js/fancybox/jquery.fancybox-1.3.4.js create mode 100644 gui/slick/js/fancybox/jquery.fancybox-1.3.4.pack.js create mode 100644 gui/slick/js/fancybox/jquery.mousewheel-3.0.4.pack.js create mode 100644 gui/slick/js/formwizard.js create mode 100644 gui/slick/js/lib/jquery-1.8.3.min.js create mode 100644 gui/slick/js/lib/jquery-ui-1.10.4.custom.min.js create mode 100644 gui/slick/js/lib/jquery.bookmarkscroll.js create mode 100644 gui/slick/js/lib/jquery.cookie.js create mode 100644 gui/slick/js/lib/jquery.cookiejar.js create mode 100644 gui/slick/js/lib/jquery.form-3.35.js create mode 100644 gui/slick/js/lib/jquery.json-2.2.min.js create mode 100644 gui/slick/js/lib/jquery.pnotify-1.0.2.min.js create mode 100644 gui/slick/js/lib/jquery.pnotify-1.2.0.min.js create mode 100644 gui/slick/js/lib/jquery.qtip-2.0.1.min.js create mode 100644 gui/slick/js/lib/jquery.qtip-2012-04-26.min.js create mode 100644 gui/slick/js/lib/jquery.scrolltopcontrol-1.1.js create mode 100644 gui/slick/js/lib/jquery.selectboxes.min.js create mode 100644 gui/slick/js/lib/jquery.tablesorter-2.1.19.min.js create mode 100644 gui/slick/js/lib/jquery.tablesorter.widgets.min.js create mode 100644 gui/slick/js/lib/jquery.tokeninput.js create mode 100644 gui/slick/js/lib/jquery.ui.touch-punch-0.2.2.min.js create mode 100644 gui/slick/js/lib/superfish-1.4.8.js create mode 100644 gui/slick/js/lib/supersubs-0.2b.js create mode 100644 gui/slick/js/manageEpisodeStatuses.js create mode 100644 gui/slick/js/manageSubtitleMissed.js create mode 100644 gui/slick/js/massEdit.js create mode 100644 gui/slick/js/massUpdate.js create mode 100644 gui/slick/js/newShow.js create mode 100644 gui/slick/js/plotTooltip.js create mode 100644 gui/slick/js/qualityChooser.js create mode 100644 gui/slick/js/restart.js create mode 100644 gui/slick/js/rootDirs.js create mode 100644 gui/slick/js/script.js create mode 100644 gui/slick/js/testRename.js create mode 100644 init.fedora create mode 100644 init.freebsd create mode 100644 init.solaris11 create mode 100644 init.systemd create mode 100644 init.ubuntu create mode 100644 lib/MultipartPostHandler.py create mode 100644 lib/__init__.py create mode 100644 lib/bencode/BTL.py create mode 100644 lib/bencode/LICENSE.txt create mode 100644 lib/bencode/__init__.py create mode 100644 lib/bencode/bencode.py create mode 100644 lib/bs4/__init__.py create mode 100644 lib/bs4/builder/__init__.py create mode 100644 lib/bs4/builder/_html5lib.py create mode 100644 lib/bs4/builder/_htmlparser.py create mode 100644 lib/bs4/builder/_lxml.py create mode 100644 lib/bs4/dammit.py create mode 100644 lib/bs4/diagnose.py create mode 100644 lib/bs4/element.py create mode 100644 lib/bs4/testing.py create mode 100644 lib/bs4/tests/__init__.py create mode 100644 lib/bs4/tests/test_builder_registry.py create mode 100644 lib/bs4/tests/test_docs.py create mode 100644 lib/bs4/tests/test_html5lib.py create mode 100644 lib/bs4/tests/test_htmlparser.py create mode 100644 lib/bs4/tests/test_lxml.py create mode 100644 lib/bs4/tests/test_soup.py create mode 100644 lib/bs4/tests/test_tree.py create mode 100644 lib/certgen.py create mode 100644 lib/configobj.py create mode 100644 lib/dateutil/__init__.py create mode 100644 lib/dateutil/easter.py create mode 100644 lib/dateutil/parser.py create mode 100644 lib/dateutil/relativedelta.py create mode 100644 lib/dateutil/rrule.py create mode 100644 lib/dateutil/tz.py create mode 100644 lib/dateutil/tzwin.py create mode 100644 lib/dateutil/zoneinfo/__init__.py create mode 100644 lib/dateutil/zoneinfo/zoneinfo-2013i.tar.gz create mode 100644 lib/enzyme/__init__.py create mode 100644 lib/enzyme/asf.py create mode 100644 lib/enzyme/core.py create mode 100644 lib/enzyme/exceptions.py create mode 100644 lib/enzyme/flv.py create mode 100644 lib/enzyme/fourcc.py create mode 100644 lib/enzyme/infos.py create mode 100644 lib/enzyme/language.py create mode 100644 lib/enzyme/mkv.py create mode 100644 lib/enzyme/mp4.py create mode 100644 lib/enzyme/mpeg.py create mode 100644 lib/enzyme/ogm.py create mode 100644 lib/enzyme/real.py create mode 100644 lib/enzyme/riff.py create mode 100644 lib/enzyme/strutils.py create mode 100644 lib/growl/__init__.py create mode 100644 lib/growl/gntp.py create mode 100644 lib/growl/gntp_bridge.py create mode 100644 lib/guessit/ISO-3166-1_utf8.txt create mode 100644 lib/guessit/ISO-639-2_utf-8.txt create mode 100644 lib/guessit/__init__.py create mode 100644 lib/guessit/__main__.py create mode 100644 lib/guessit/country.py create mode 100644 lib/guessit/date.py create mode 100644 lib/guessit/fileutils.py create mode 100644 lib/guessit/guess.py create mode 100644 lib/guessit/hash_ed2k.py create mode 100644 lib/guessit/hash_mpc.py create mode 100644 lib/guessit/language.py create mode 100644 lib/guessit/matcher.py create mode 100644 lib/guessit/matchtree.py create mode 100644 lib/guessit/patterns.py create mode 100644 lib/guessit/slogging.py create mode 100644 lib/guessit/textutils.py create mode 100644 lib/guessit/transfo/__init__.py create mode 100644 lib/guessit/transfo/guess_bonus_features.py create mode 100644 lib/guessit/transfo/guess_country.py create mode 100644 lib/guessit/transfo/guess_date.py create mode 100644 lib/guessit/transfo/guess_episode_info_from_position.py create mode 100644 lib/guessit/transfo/guess_episodes_rexps.py create mode 100644 lib/guessit/transfo/guess_filetype.py create mode 100644 lib/guessit/transfo/guess_idnumber.py create mode 100644 lib/guessit/transfo/guess_language.py create mode 100644 lib/guessit/transfo/guess_movie_title_from_position.py create mode 100644 lib/guessit/transfo/guess_properties.py create mode 100644 lib/guessit/transfo/guess_release_group.py create mode 100644 lib/guessit/transfo/guess_video_rexps.py create mode 100644 lib/guessit/transfo/guess_weak_episodes_rexps.py create mode 100644 lib/guessit/transfo/guess_website.py create mode 100644 lib/guessit/transfo/guess_year.py create mode 100644 lib/guessit/transfo/post_process.py create mode 100644 lib/guessit/transfo/split_explicit_groups.py create mode 100644 lib/guessit/transfo/split_on_dash.py create mode 100644 lib/guessit/transfo/split_path_components.py create mode 100644 lib/hachoir_core/__init__.py create mode 100644 lib/hachoir_core/benchmark.py create mode 100644 lib/hachoir_core/bits.py create mode 100644 lib/hachoir_core/cmd_line.py create mode 100644 lib/hachoir_core/compatibility.py create mode 100644 lib/hachoir_core/config.py create mode 100644 lib/hachoir_core/dict.py create mode 100644 lib/hachoir_core/endian.py create mode 100644 lib/hachoir_core/error.py create mode 100644 lib/hachoir_core/event_handler.py create mode 100644 lib/hachoir_core/field/__init__.py create mode 100644 lib/hachoir_core/field/basic_field_set.py create mode 100644 lib/hachoir_core/field/bit_field.py create mode 100644 lib/hachoir_core/field/byte_field.py create mode 100644 lib/hachoir_core/field/character.py create mode 100644 lib/hachoir_core/field/enum.py create mode 100644 lib/hachoir_core/field/fake_array.py create mode 100644 lib/hachoir_core/field/field.py create mode 100644 lib/hachoir_core/field/field_set.py create mode 100644 lib/hachoir_core/field/float.py create mode 100644 lib/hachoir_core/field/generic_field_set.py create mode 100644 lib/hachoir_core/field/helper.py create mode 100644 lib/hachoir_core/field/integer.py create mode 100644 lib/hachoir_core/field/link.py create mode 100644 lib/hachoir_core/field/new_seekable_field_set.py create mode 100644 lib/hachoir_core/field/padding.py create mode 100644 lib/hachoir_core/field/parser.py create mode 100644 lib/hachoir_core/field/seekable_field_set.py create mode 100644 lib/hachoir_core/field/static_field_set.py create mode 100644 lib/hachoir_core/field/string_field.py create mode 100644 lib/hachoir_core/field/sub_file.py create mode 100644 lib/hachoir_core/field/timestamp.py create mode 100644 lib/hachoir_core/field/vector.py create mode 100644 lib/hachoir_core/i18n.py create mode 100644 lib/hachoir_core/iso639.py create mode 100644 lib/hachoir_core/language.py create mode 100644 lib/hachoir_core/log.py create mode 100644 lib/hachoir_core/memory.py create mode 100644 lib/hachoir_core/profiler.py create mode 100644 lib/hachoir_core/stream/__init__.py create mode 100644 lib/hachoir_core/stream/input.py create mode 100644 lib/hachoir_core/stream/input_helper.py create mode 100644 lib/hachoir_core/stream/output.py create mode 100644 lib/hachoir_core/stream/stream.py create mode 100644 lib/hachoir_core/text_handler.py create mode 100644 lib/hachoir_core/timeout.py create mode 100644 lib/hachoir_core/tools.py create mode 100644 lib/hachoir_core/version.py create mode 100644 lib/hachoir_metadata/__init__.py create mode 100644 lib/hachoir_metadata/archive.py create mode 100644 lib/hachoir_metadata/audio.py create mode 100644 lib/hachoir_metadata/config.py create mode 100644 lib/hachoir_metadata/file_system.py create mode 100644 lib/hachoir_metadata/filter.py create mode 100644 lib/hachoir_metadata/formatter.py create mode 100644 lib/hachoir_metadata/image.py create mode 100644 lib/hachoir_metadata/jpeg.py create mode 100644 lib/hachoir_metadata/metadata.py create mode 100644 lib/hachoir_metadata/metadata_item.py create mode 100644 lib/hachoir_metadata/misc.py create mode 100644 lib/hachoir_metadata/program.py create mode 100644 lib/hachoir_metadata/qt/__init__.py create mode 100644 lib/hachoir_metadata/qt/dialog.ui create mode 100644 lib/hachoir_metadata/qt/dialog_ui.py create mode 100644 lib/hachoir_metadata/register.py create mode 100644 lib/hachoir_metadata/riff.py create mode 100644 lib/hachoir_metadata/safe.py create mode 100644 lib/hachoir_metadata/setter.py create mode 100644 lib/hachoir_metadata/timezone.py create mode 100644 lib/hachoir_metadata/version.py create mode 100644 lib/hachoir_metadata/video.py create mode 100644 lib/hachoir_parser/__init__.py create mode 100644 lib/hachoir_parser/archive/__init__.py create mode 100644 lib/hachoir_parser/archive/ace.py create mode 100644 lib/hachoir_parser/archive/ar.py create mode 100644 lib/hachoir_parser/archive/bzip2_parser.py create mode 100644 lib/hachoir_parser/archive/cab.py create mode 100644 lib/hachoir_parser/archive/gzip_parser.py create mode 100644 lib/hachoir_parser/archive/mar.py create mode 100644 lib/hachoir_parser/archive/rar.py create mode 100644 lib/hachoir_parser/archive/rpm.py create mode 100644 lib/hachoir_parser/archive/sevenzip.py create mode 100644 lib/hachoir_parser/archive/tar.py create mode 100644 lib/hachoir_parser/archive/zip.py create mode 100644 lib/hachoir_parser/audio/8svx.py create mode 100644 lib/hachoir_parser/audio/__init__.py create mode 100644 lib/hachoir_parser/audio/aiff.py create mode 100644 lib/hachoir_parser/audio/au.py create mode 100644 lib/hachoir_parser/audio/flac.py create mode 100644 lib/hachoir_parser/audio/id3.py create mode 100644 lib/hachoir_parser/audio/itunesdb.py create mode 100644 lib/hachoir_parser/audio/midi.py create mode 100644 lib/hachoir_parser/audio/mod.py create mode 100644 lib/hachoir_parser/audio/modplug.py create mode 100644 lib/hachoir_parser/audio/mpeg_audio.py create mode 100644 lib/hachoir_parser/audio/real_audio.py create mode 100644 lib/hachoir_parser/audio/s3m.py create mode 100644 lib/hachoir_parser/audio/xm.py create mode 100644 lib/hachoir_parser/common/__init__.py create mode 100644 lib/hachoir_parser/common/deflate.py create mode 100644 lib/hachoir_parser/common/msdos.py create mode 100644 lib/hachoir_parser/common/tracker.py create mode 100644 lib/hachoir_parser/common/win32.py create mode 100644 lib/hachoir_parser/common/win32_lang_id.py create mode 100644 lib/hachoir_parser/container/__init__.py create mode 100644 lib/hachoir_parser/container/action_script.py create mode 100644 lib/hachoir_parser/container/asn1.py create mode 100644 lib/hachoir_parser/container/mkv.py create mode 100644 lib/hachoir_parser/container/ogg.py create mode 100644 lib/hachoir_parser/container/realmedia.py create mode 100644 lib/hachoir_parser/container/riff.py create mode 100644 lib/hachoir_parser/container/swf.py create mode 100644 lib/hachoir_parser/file_system/__init__.py create mode 100644 lib/hachoir_parser/file_system/ext2.py create mode 100644 lib/hachoir_parser/file_system/fat.py create mode 100644 lib/hachoir_parser/file_system/iso9660.py create mode 100644 lib/hachoir_parser/file_system/linux_swap.py create mode 100644 lib/hachoir_parser/file_system/mbr.py create mode 100644 lib/hachoir_parser/file_system/ntfs.py create mode 100644 lib/hachoir_parser/file_system/reiser_fs.py create mode 100644 lib/hachoir_parser/game/__init__.py create mode 100644 lib/hachoir_parser/game/blp.py create mode 100644 lib/hachoir_parser/game/laf.py create mode 100644 lib/hachoir_parser/game/spider_man_video.py create mode 100644 lib/hachoir_parser/game/zsnes.py create mode 100644 lib/hachoir_parser/guess.py create mode 100644 lib/hachoir_parser/image/__init__.py create mode 100644 lib/hachoir_parser/image/bmp.py create mode 100644 lib/hachoir_parser/image/common.py create mode 100644 lib/hachoir_parser/image/exif.py create mode 100644 lib/hachoir_parser/image/gif.py create mode 100644 lib/hachoir_parser/image/ico.py create mode 100644 lib/hachoir_parser/image/iptc.py create mode 100644 lib/hachoir_parser/image/jpeg.py create mode 100644 lib/hachoir_parser/image/pcx.py create mode 100644 lib/hachoir_parser/image/photoshop_metadata.py create mode 100644 lib/hachoir_parser/image/png.py create mode 100644 lib/hachoir_parser/image/psd.py create mode 100644 lib/hachoir_parser/image/tga.py create mode 100644 lib/hachoir_parser/image/tiff.py create mode 100644 lib/hachoir_parser/image/wmf.py create mode 100644 lib/hachoir_parser/image/xcf.py create mode 100644 lib/hachoir_parser/misc/__init__.py create mode 100644 lib/hachoir_parser/misc/bplist.py create mode 100644 lib/hachoir_parser/misc/chm.py create mode 100644 lib/hachoir_parser/misc/common.py create mode 100644 lib/hachoir_parser/misc/file_3do.py create mode 100644 lib/hachoir_parser/misc/file_3ds.py create mode 100644 lib/hachoir_parser/misc/gnome_keyring.py create mode 100644 lib/hachoir_parser/misc/hlp.py create mode 100644 lib/hachoir_parser/misc/lnk.py create mode 100644 lib/hachoir_parser/misc/msoffice.py create mode 100644 lib/hachoir_parser/misc/msoffice_summary.py create mode 100644 lib/hachoir_parser/misc/ole2.py create mode 100644 lib/hachoir_parser/misc/pcf.py create mode 100644 lib/hachoir_parser/misc/pdf.py create mode 100644 lib/hachoir_parser/misc/pifv.py create mode 100644 lib/hachoir_parser/misc/torrent.py create mode 100644 lib/hachoir_parser/misc/ttf.py create mode 100644 lib/hachoir_parser/misc/word_doc.py create mode 100644 lib/hachoir_parser/network/__init__.py create mode 100644 lib/hachoir_parser/network/common.py create mode 100644 lib/hachoir_parser/network/ouid.py create mode 100644 lib/hachoir_parser/network/tcpdump.py create mode 100644 lib/hachoir_parser/parser.py create mode 100644 lib/hachoir_parser/parser_list.py create mode 100644 lib/hachoir_parser/program/__init__.py create mode 100644 lib/hachoir_parser/program/elf.py create mode 100644 lib/hachoir_parser/program/exe.py create mode 100644 lib/hachoir_parser/program/exe_ne.py create mode 100644 lib/hachoir_parser/program/exe_pe.py create mode 100644 lib/hachoir_parser/program/exe_res.py create mode 100644 lib/hachoir_parser/program/java.py create mode 100644 lib/hachoir_parser/program/prc.py create mode 100644 lib/hachoir_parser/program/python.py create mode 100644 lib/hachoir_parser/template.py create mode 100644 lib/hachoir_parser/version.py create mode 100644 lib/hachoir_parser/video/__init__.py create mode 100644 lib/hachoir_parser/video/amf.py create mode 100644 lib/hachoir_parser/video/asf.py create mode 100644 lib/hachoir_parser/video/flv.py create mode 100644 lib/hachoir_parser/video/fourcc.py create mode 100644 lib/hachoir_parser/video/mov.py create mode 100644 lib/hachoir_parser/video/mpeg_ts.py create mode 100644 lib/hachoir_parser/video/mpeg_video.py create mode 100644 lib/html5lib/__init__.py create mode 100644 lib/html5lib/constants.py create mode 100644 lib/html5lib/filters/__init__.py create mode 100644 lib/html5lib/filters/_base.py create mode 100644 lib/html5lib/filters/formfiller.py create mode 100644 lib/html5lib/filters/inject_meta_charset.py create mode 100644 lib/html5lib/filters/lint.py create mode 100644 lib/html5lib/filters/optionaltags.py create mode 100644 lib/html5lib/filters/sanitizer.py create mode 100644 lib/html5lib/filters/whitespace.py create mode 100644 lib/html5lib/html5parser.py create mode 100644 lib/html5lib/ihatexml.py create mode 100644 lib/html5lib/inputstream.py create mode 100644 lib/html5lib/sanitizer.py create mode 100644 lib/html5lib/serializer/__init__.py create mode 100644 lib/html5lib/serializer/htmlserializer.py create mode 100644 lib/html5lib/serializer/xhtmlserializer.py create mode 100644 lib/html5lib/tests/__init__.py create mode 100644 lib/html5lib/tests/mockParser.py create mode 100644 lib/html5lib/tests/runparsertests.py create mode 100644 lib/html5lib/tests/runtests.py create mode 100644 lib/html5lib/tests/support.py create mode 100644 lib/html5lib/tests/test_encoding.py create mode 100644 lib/html5lib/tests/test_formfiller.py create mode 100644 lib/html5lib/tests/test_parser.py create mode 100644 lib/html5lib/tests/test_parser2.py create mode 100644 lib/html5lib/tests/test_sanitizer.py create mode 100644 lib/html5lib/tests/test_serializer.py create mode 100644 lib/html5lib/tests/test_stream.py create mode 100644 lib/html5lib/tests/test_tokenizer.py create mode 100644 lib/html5lib/tests/test_treewalkers.py create mode 100644 lib/html5lib/tests/test_whitespace_filter.py create mode 100644 lib/html5lib/tests/testdata/encoding/test-yahoo-jp.dat create mode 100644 lib/html5lib/tests/testdata/encoding/tests1.dat create mode 100644 lib/html5lib/tests/testdata/encoding/tests2.dat create mode 100644 lib/html5lib/tests/testdata/sanitizer/tests1.dat create mode 100644 lib/html5lib/tests/testdata/serializer/core.test create mode 100644 lib/html5lib/tests/testdata/serializer/injectmeta.test create mode 100644 lib/html5lib/tests/testdata/serializer/optionaltags.test create mode 100644 lib/html5lib/tests/testdata/serializer/options.test create mode 100644 lib/html5lib/tests/testdata/serializer/whitespace.test create mode 100644 lib/html5lib/tests/testdata/sniffer/htmlOrFeed.json create mode 100644 lib/html5lib/tests/testdata/tokenizer/contentModelFlags.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/domjs.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/entities.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/escapeFlag.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/namedEntities.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/numericEntities.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/test1.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/test2.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/test3.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/test4.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/unicodeChars.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test create mode 100644 lib/html5lib/tests/testdata/tokenizer/xmlViolation.test create mode 100644 lib/html5lib/tests/testdata/tree-construction/adoption01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/adoption02.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/comments01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/doctype01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/entities01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/entities02.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/html5test-com.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/inbody01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/isindex.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/scriptdata01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tables01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests1.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests10.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests11.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests12.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests14.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests15.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests16.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests17.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests18.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests19.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests2.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests20.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests21.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests22.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests23.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests24.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests25.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests26.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests3.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests4.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests5.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests6.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests7.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests8.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests9.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/tricky01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/webkit01.dat create mode 100644 lib/html5lib/tests/testdata/tree-construction/webkit02.dat create mode 100644 lib/html5lib/tests/tokenizertotree.py create mode 100644 lib/html5lib/tokenizer.py create mode 100644 lib/html5lib/treebuilders/__init__.py create mode 100644 lib/html5lib/treebuilders/_base.py create mode 100644 lib/html5lib/treebuilders/dom.py create mode 100644 lib/html5lib/treebuilders/etree.py create mode 100644 lib/html5lib/treebuilders/etree_lxml.py create mode 100644 lib/html5lib/treebuilders/simpletree.py create mode 100644 lib/html5lib/treebuilders/soup.py create mode 100644 lib/html5lib/treewalkers/__init__.py create mode 100644 lib/html5lib/treewalkers/_base.py create mode 100644 lib/html5lib/treewalkers/dom.py create mode 100644 lib/html5lib/treewalkers/etree.py create mode 100644 lib/html5lib/treewalkers/genshistream.py create mode 100644 lib/html5lib/treewalkers/lxmletree.py create mode 100644 lib/html5lib/treewalkers/pulldom.py create mode 100644 lib/html5lib/treewalkers/simpletree.py create mode 100644 lib/html5lib/treewalkers/soup.py create mode 100644 lib/html5lib/utils.py create mode 100644 lib/httplib2/__init__.py create mode 100644 lib/httplib2/iri2uri.py create mode 100644 lib/imdb/Character.py create mode 100644 lib/imdb/Company.py create mode 100644 lib/imdb/Movie.py create mode 100644 lib/imdb/Person.py create mode 100644 lib/imdb/__init__.py create mode 100644 lib/imdb/_compat.py create mode 100644 lib/imdb/_exceptions.py create mode 100644 lib/imdb/_logging.py create mode 100644 lib/imdb/helpers.py create mode 100644 lib/imdb/imdbpy.cfg create mode 100644 lib/imdb/linguistics.py create mode 100644 lib/imdb/locale/__init__.py create mode 100644 lib/imdb/locale/generatepot.py create mode 100644 lib/imdb/locale/imdbpy-en.po create mode 100644 lib/imdb/locale/imdbpy-it.po create mode 100644 lib/imdb/locale/imdbpy-tr.po create mode 100644 lib/imdb/locale/imdbpy.pot create mode 100644 lib/imdb/locale/msgfmt.py create mode 100644 lib/imdb/locale/rebuildmo.py create mode 100644 lib/imdb/parser/__init__.py create mode 100644 lib/imdb/parser/http/__init__.py create mode 100644 lib/imdb/parser/http/bsouplxml/__init__.py create mode 100644 lib/imdb/parser/http/bsouplxml/_bsoup.py create mode 100644 lib/imdb/parser/http/bsouplxml/bsoupxpath.py create mode 100644 lib/imdb/parser/http/bsouplxml/etree.py create mode 100644 lib/imdb/parser/http/bsouplxml/html.py create mode 100644 lib/imdb/parser/http/characterParser.py create mode 100644 lib/imdb/parser/http/companyParser.py create mode 100644 lib/imdb/parser/http/movieParser.py create mode 100644 lib/imdb/parser/http/personParser.py create mode 100644 lib/imdb/parser/http/searchCharacterParser.py create mode 100644 lib/imdb/parser/http/searchCompanyParser.py create mode 100644 lib/imdb/parser/http/searchKeywordParser.py create mode 100644 lib/imdb/parser/http/searchMovieParser.py create mode 100644 lib/imdb/parser/http/searchPersonParser.py create mode 100644 lib/imdb/parser/http/topBottomParser.py create mode 100644 lib/imdb/parser/http/utils.py create mode 100644 lib/imdb/parser/mobile/__init__.py create mode 100644 lib/imdb/parser/sql/__init__.py create mode 100644 lib/imdb/parser/sql/alchemyadapter.py create mode 100644 lib/imdb/parser/sql/cutils.c create mode 100644 lib/imdb/parser/sql/cutils.so create mode 100644 lib/imdb/parser/sql/dbschema.py create mode 100644 lib/imdb/parser/sql/objectadapter.py create mode 100644 lib/imdb/utils.py create mode 100644 lib/jsonrpclib/SimpleJSONRPCServer.py create mode 100644 lib/jsonrpclib/__init__.py create mode 100644 lib/jsonrpclib/config.py create mode 100644 lib/jsonrpclib/history.py create mode 100644 lib/jsonrpclib/jsonclass.py create mode 100644 lib/jsonrpclib/jsonrpc.py create mode 100644 lib/oauth2/__init__.py create mode 100644 lib/profilehooks.py create mode 100644 lib/pynma/__init__.py create mode 100644 lib/pynma/pynma.py create mode 100644 lib/pythontwitter/__init__.py create mode 100644 lib/requests/__init__.py create mode 100644 lib/requests/adapters.py create mode 100644 lib/requests/api.py create mode 100644 lib/requests/auth.py create mode 100644 lib/requests/cacert.pem create mode 100644 lib/requests/certs.py create mode 100644 lib/requests/compat.py create mode 100644 lib/requests/cookies.py create mode 100644 lib/requests/exceptions.py create mode 100644 lib/requests/hooks.py create mode 100644 lib/requests/models.py create mode 100644 lib/requests/packages/README.rst create mode 100644 lib/requests/packages/__init__.py create mode 100644 lib/requests/packages/chardet/__init__.py create mode 100644 lib/requests/packages/chardet/big5freq.py create mode 100644 lib/requests/packages/chardet/big5prober.py create mode 100644 lib/requests/packages/chardet/chardetect.py create mode 100644 lib/requests/packages/chardet/chardistribution.py create mode 100644 lib/requests/packages/chardet/charsetgroupprober.py create mode 100644 lib/requests/packages/chardet/charsetprober.py create mode 100644 lib/requests/packages/chardet/codingstatemachine.py create mode 100644 lib/requests/packages/chardet/compat.py create mode 100644 lib/requests/packages/chardet/constants.py create mode 100644 lib/requests/packages/chardet/cp949prober.py create mode 100644 lib/requests/packages/chardet/escprober.py create mode 100644 lib/requests/packages/chardet/escsm.py create mode 100644 lib/requests/packages/chardet/eucjpprober.py create mode 100644 lib/requests/packages/chardet/euckrfreq.py create mode 100644 lib/requests/packages/chardet/euckrprober.py create mode 100644 lib/requests/packages/chardet/euctwfreq.py create mode 100644 lib/requests/packages/chardet/euctwprober.py create mode 100644 lib/requests/packages/chardet/gb2312freq.py create mode 100644 lib/requests/packages/chardet/gb2312prober.py create mode 100644 lib/requests/packages/chardet/hebrewprober.py create mode 100644 lib/requests/packages/chardet/jisfreq.py create mode 100644 lib/requests/packages/chardet/jpcntx.py create mode 100644 lib/requests/packages/chardet/langbulgarianmodel.py create mode 100644 lib/requests/packages/chardet/langcyrillicmodel.py create mode 100644 lib/requests/packages/chardet/langgreekmodel.py create mode 100644 lib/requests/packages/chardet/langhebrewmodel.py create mode 100644 lib/requests/packages/chardet/langhungarianmodel.py create mode 100644 lib/requests/packages/chardet/langthaimodel.py create mode 100644 lib/requests/packages/chardet/latin1prober.py create mode 100644 lib/requests/packages/chardet/mbcharsetprober.py create mode 100644 lib/requests/packages/chardet/mbcsgroupprober.py create mode 100644 lib/requests/packages/chardet/mbcssm.py create mode 100644 lib/requests/packages/chardet/sbcharsetprober.py create mode 100644 lib/requests/packages/chardet/sbcsgroupprober.py create mode 100644 lib/requests/packages/chardet/sjisprober.py create mode 100644 lib/requests/packages/chardet/universaldetector.py create mode 100644 lib/requests/packages/chardet/utf8prober.py create mode 100644 lib/requests/packages/urllib3/__init__.py create mode 100644 lib/requests/packages/urllib3/_collections.py create mode 100644 lib/requests/packages/urllib3/connection.py create mode 100644 lib/requests/packages/urllib3/connectionpool.py create mode 100644 lib/requests/packages/urllib3/contrib/__init__.py create mode 100644 lib/requests/packages/urllib3/contrib/ntlmpool.py create mode 100644 lib/requests/packages/urllib3/contrib/pyopenssl.py create mode 100644 lib/requests/packages/urllib3/exceptions.py create mode 100644 lib/requests/packages/urllib3/fields.py create mode 100644 lib/requests/packages/urllib3/filepost.py create mode 100644 lib/requests/packages/urllib3/packages/__init__.py create mode 100644 lib/requests/packages/urllib3/packages/ordered_dict.py create mode 100644 lib/requests/packages/urllib3/packages/six.py create mode 100644 lib/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 lib/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 lib/requests/packages/urllib3/poolmanager.py create mode 100644 lib/requests/packages/urllib3/request.py create mode 100644 lib/requests/packages/urllib3/response.py create mode 100644 lib/requests/packages/urllib3/util.py create mode 100644 lib/requests/sessions.py create mode 100644 lib/requests/status_codes.py create mode 100644 lib/requests/structures.py create mode 100644 lib/requests/utils.py create mode 100644 lib/rtorrent/__init__.py create mode 100644 lib/rtorrent/common.py create mode 100644 lib/rtorrent/compat.py create mode 100644 lib/rtorrent/err.py create mode 100644 lib/rtorrent/file.py create mode 100644 lib/rtorrent/group.py create mode 100644 lib/rtorrent/lib/__init__.py create mode 100644 lib/rtorrent/lib/bencode.py create mode 100644 lib/rtorrent/lib/torrentparser.py create mode 100644 lib/rtorrent/lib/xmlrpc/__init__.py create mode 100644 lib/rtorrent/lib/xmlrpc/basic_auth.py create mode 100644 lib/rtorrent/lib/xmlrpc/http.py create mode 100644 lib/rtorrent/lib/xmlrpc/scgi.py create mode 100644 lib/rtorrent/peer.py create mode 100644 lib/rtorrent/rpc/__init__.py create mode 100644 lib/rtorrent/torrent.py create mode 100644 lib/rtorrent/tracker.py create mode 100644 lib/simplejson/__init__.py create mode 100644 lib/simplejson/_speedups.c create mode 100644 lib/simplejson/decoder.py create mode 100644 lib/simplejson/encoder.py create mode 100644 lib/simplejson/scanner.py create mode 100644 lib/socks/__init__.py create mode 100644 lib/subliminal/__init__.py create mode 100644 lib/subliminal/api.py create mode 100644 lib/subliminal/async.py create mode 100644 lib/subliminal/cache.py create mode 100644 lib/subliminal/core.py create mode 100644 lib/subliminal/exceptions.py create mode 100644 lib/subliminal/infos.py create mode 100644 lib/subliminal/language.py create mode 100644 lib/subliminal/services/__init__.py create mode 100644 lib/subliminal/services/addic7ed.py create mode 100644 lib/subliminal/services/bierdopje.py create mode 100644 lib/subliminal/services/itasa.py create mode 100644 lib/subliminal/services/opensubtitles.py create mode 100644 lib/subliminal/services/podnapisi.py create mode 100644 lib/subliminal/services/podnapisiweb.py create mode 100644 lib/subliminal/services/subswiki.py create mode 100644 lib/subliminal/services/subtitulos.py create mode 100644 lib/subliminal/services/thesubdb.py create mode 100644 lib/subliminal/services/tvsubtitles.py create mode 100644 lib/subliminal/services/usub.py create mode 100644 lib/subliminal/subtitles.py create mode 100644 lib/subliminal/tasks.py create mode 100644 lib/subliminal/utils.py create mode 100644 lib/subliminal/videos.py create mode 100644 lib/trakt/__init__.py create mode 100644 lib/tvdb_api/MANIFEST.in create mode 100644 lib/tvdb_api/Rakefile create mode 100644 lib/tvdb_api/UNLICENSE create mode 100644 lib/tvdb_api/__init__.py create mode 100644 lib/tvdb_api/readme.md create mode 100644 lib/tvdb_api/setup.py create mode 100644 lib/tvdb_api/tests/gprof2dot.py create mode 100644 lib/tvdb_api/tests/runtests.py create mode 100644 lib/tvdb_api/tests/test_tvdb_api.py create mode 100644 lib/tvdb_api/tvdb_api.py create mode 100644 lib/tvdb_api/tvdb_cache.py create mode 100644 lib/tvdb_api/tvdb_exceptions.py create mode 100644 lib/tvdb_api/tvdb_ui.py create mode 100644 lib/tvrage_api/AUTHORS create mode 100644 lib/tvrage_api/LICENSE create mode 100644 lib/tvrage_api/__init__.py create mode 100644 lib/tvrage_api/setup.py create mode 100644 lib/tvrage_api/tvrage_api.py create mode 100644 lib/tvrage_api/tvrage_cache.py create mode 100644 lib/tvrage_api/tvrage_exceptions.py create mode 100644 lib/tvrage_api/tvrage_ui.py create mode 100644 lib/unidecode/__init__.py create mode 100644 lib/unidecode/x000.py create mode 100644 lib/unidecode/x001.py create mode 100644 lib/unidecode/x002.py create mode 100644 lib/unidecode/x003.py create mode 100644 lib/unidecode/x004.py create mode 100644 lib/unidecode/x005.py create mode 100644 lib/unidecode/x006.py create mode 100644 lib/unidecode/x007.py create mode 100644 lib/unidecode/x009.py create mode 100644 lib/unidecode/x00a.py create mode 100644 lib/unidecode/x00b.py create mode 100644 lib/unidecode/x00c.py create mode 100644 lib/unidecode/x00d.py create mode 100644 lib/unidecode/x00e.py create mode 100644 lib/unidecode/x00f.py create mode 100644 lib/unidecode/x010.py create mode 100644 lib/unidecode/x011.py create mode 100644 lib/unidecode/x012.py create mode 100644 lib/unidecode/x013.py create mode 100644 lib/unidecode/x014.py create mode 100644 lib/unidecode/x015.py create mode 100644 lib/unidecode/x016.py create mode 100644 lib/unidecode/x017.py create mode 100644 lib/unidecode/x018.py create mode 100644 lib/unidecode/x01d.py create mode 100644 lib/unidecode/x01e.py create mode 100644 lib/unidecode/x01f.py create mode 100644 lib/unidecode/x020.py create mode 100644 lib/unidecode/x021.py create mode 100644 lib/unidecode/x022.py create mode 100644 lib/unidecode/x023.py create mode 100644 lib/unidecode/x024.py create mode 100644 lib/unidecode/x025.py create mode 100644 lib/unidecode/x026.py create mode 100644 lib/unidecode/x027.py create mode 100644 lib/unidecode/x028.py create mode 100644 lib/unidecode/x02c.py create mode 100644 lib/unidecode/x02e.py create mode 100644 lib/unidecode/x02f.py create mode 100644 lib/unidecode/x030.py create mode 100644 lib/unidecode/x031.py create mode 100644 lib/unidecode/x032.py create mode 100644 lib/unidecode/x033.py create mode 100644 lib/unidecode/x04d.py create mode 100644 lib/unidecode/x04e.py create mode 100644 lib/unidecode/x04f.py create mode 100644 lib/unidecode/x050.py create mode 100644 lib/unidecode/x051.py create mode 100644 lib/unidecode/x052.py create mode 100644 lib/unidecode/x053.py create mode 100644 lib/unidecode/x054.py create mode 100644 lib/unidecode/x055.py create mode 100644 lib/unidecode/x056.py create mode 100644 lib/unidecode/x057.py create mode 100644 lib/unidecode/x058.py create mode 100644 lib/unidecode/x059.py create mode 100644 lib/unidecode/x05a.py create mode 100644 lib/unidecode/x05b.py create mode 100644 lib/unidecode/x05c.py create mode 100644 lib/unidecode/x05d.py create mode 100644 lib/unidecode/x05e.py create mode 100644 lib/unidecode/x05f.py create mode 100644 lib/unidecode/x060.py create mode 100644 lib/unidecode/x061.py create mode 100644 lib/unidecode/x062.py create mode 100644 lib/unidecode/x063.py create mode 100644 lib/unidecode/x064.py create mode 100644 lib/unidecode/x065.py create mode 100644 lib/unidecode/x066.py create mode 100644 lib/unidecode/x067.py create mode 100644 lib/unidecode/x068.py create mode 100644 lib/unidecode/x069.py create mode 100644 lib/unidecode/x06a.py create mode 100644 lib/unidecode/x06b.py create mode 100644 lib/unidecode/x06c.py create mode 100644 lib/unidecode/x06d.py create mode 100644 lib/unidecode/x06e.py create mode 100644 lib/unidecode/x06f.py create mode 100644 lib/unidecode/x070.py create mode 100644 lib/unidecode/x071.py create mode 100644 lib/unidecode/x072.py create mode 100644 lib/unidecode/x073.py create mode 100644 lib/unidecode/x074.py create mode 100644 lib/unidecode/x075.py create mode 100644 lib/unidecode/x076.py create mode 100644 lib/unidecode/x077.py create mode 100644 lib/unidecode/x078.py create mode 100644 lib/unidecode/x079.py create mode 100644 lib/unidecode/x07a.py create mode 100644 lib/unidecode/x07b.py create mode 100644 lib/unidecode/x07c.py create mode 100644 lib/unidecode/x07d.py create mode 100644 lib/unidecode/x07e.py create mode 100644 lib/unidecode/x07f.py create mode 100644 lib/unidecode/x080.py create mode 100644 lib/unidecode/x081.py create mode 100644 lib/unidecode/x082.py create mode 100644 lib/unidecode/x083.py create mode 100644 lib/unidecode/x084.py create mode 100644 lib/unidecode/x085.py create mode 100644 lib/unidecode/x086.py create mode 100644 lib/unidecode/x087.py create mode 100644 lib/unidecode/x088.py create mode 100644 lib/unidecode/x089.py create mode 100644 lib/unidecode/x08a.py create mode 100644 lib/unidecode/x08b.py create mode 100644 lib/unidecode/x08c.py create mode 100644 lib/unidecode/x08d.py create mode 100644 lib/unidecode/x08e.py create mode 100644 lib/unidecode/x08f.py create mode 100644 lib/unidecode/x090.py create mode 100644 lib/unidecode/x091.py create mode 100644 lib/unidecode/x092.py create mode 100644 lib/unidecode/x093.py create mode 100644 lib/unidecode/x094.py create mode 100644 lib/unidecode/x095.py create mode 100644 lib/unidecode/x096.py create mode 100644 lib/unidecode/x097.py create mode 100644 lib/unidecode/x098.py create mode 100644 lib/unidecode/x099.py create mode 100644 lib/unidecode/x09a.py create mode 100644 lib/unidecode/x09b.py create mode 100644 lib/unidecode/x09c.py create mode 100644 lib/unidecode/x09d.py create mode 100644 lib/unidecode/x09e.py create mode 100644 lib/unidecode/x09f.py create mode 100644 lib/unidecode/x0a0.py create mode 100644 lib/unidecode/x0a1.py create mode 100644 lib/unidecode/x0a2.py create mode 100644 lib/unidecode/x0a3.py create mode 100644 lib/unidecode/x0a4.py create mode 100644 lib/unidecode/x0ac.py create mode 100644 lib/unidecode/x0ad.py create mode 100644 lib/unidecode/x0ae.py create mode 100644 lib/unidecode/x0af.py create mode 100644 lib/unidecode/x0b0.py create mode 100644 lib/unidecode/x0b1.py create mode 100644 lib/unidecode/x0b2.py create mode 100644 lib/unidecode/x0b3.py create mode 100644 lib/unidecode/x0b4.py create mode 100644 lib/unidecode/x0b5.py create mode 100644 lib/unidecode/x0b6.py create mode 100644 lib/unidecode/x0b7.py create mode 100644 lib/unidecode/x0b8.py create mode 100644 lib/unidecode/x0b9.py create mode 100644 lib/unidecode/x0ba.py create mode 100644 lib/unidecode/x0bb.py create mode 100644 lib/unidecode/x0bc.py create mode 100644 lib/unidecode/x0bd.py create mode 100644 lib/unidecode/x0be.py create mode 100644 lib/unidecode/x0bf.py create mode 100644 lib/unidecode/x0c0.py create mode 100644 lib/unidecode/x0c1.py create mode 100644 lib/unidecode/x0c2.py create mode 100644 lib/unidecode/x0c3.py create mode 100644 lib/unidecode/x0c4.py create mode 100644 lib/unidecode/x0c5.py create mode 100644 lib/unidecode/x0c6.py create mode 100644 lib/unidecode/x0c7.py create mode 100644 lib/unidecode/x0c8.py create mode 100644 lib/unidecode/x0c9.py create mode 100644 lib/unidecode/x0ca.py create mode 100644 lib/unidecode/x0cb.py create mode 100644 lib/unidecode/x0cc.py create mode 100644 lib/unidecode/x0cd.py create mode 100644 lib/unidecode/x0ce.py create mode 100644 lib/unidecode/x0cf.py create mode 100644 lib/unidecode/x0d0.py create mode 100644 lib/unidecode/x0d1.py create mode 100644 lib/unidecode/x0d2.py create mode 100644 lib/unidecode/x0d3.py create mode 100644 lib/unidecode/x0d4.py create mode 100644 lib/unidecode/x0d5.py create mode 100644 lib/unidecode/x0d6.py create mode 100644 lib/unidecode/x0d7.py create mode 100644 lib/unidecode/x0f9.py create mode 100644 lib/unidecode/x0fa.py create mode 100644 lib/unidecode/x0fb.py create mode 100644 lib/unidecode/x0fc.py create mode 100644 lib/unidecode/x0fd.py create mode 100644 lib/unidecode/x0fe.py create mode 100644 lib/unidecode/x0ff.py create mode 100644 lib/unidecode/x1d4.py create mode 100644 lib/unidecode/x1d5.py create mode 100644 lib/unidecode/x1d6.py create mode 100644 lib/unidecode/x1d7.py create mode 100644 lib/unrar2/PKG-INFO create mode 100644 lib/unrar2/UnRAR2.html create mode 100644 lib/unrar2/UnRARDLL/license.txt create mode 100644 lib/unrar2/UnRARDLL/unrar.dll create mode 100644 lib/unrar2/UnRARDLL/unrar.h create mode 100644 lib/unrar2/UnRARDLL/unrar.lib create mode 100644 lib/unrar2/UnRARDLL/unrardll.txt create mode 100644 lib/unrar2/UnRARDLL/whatsnew.txt create mode 100644 lib/unrar2/UnRARDLL/x64/readme.txt create mode 100644 lib/unrar2/UnRARDLL/x64/unrar64.dll create mode 100644 lib/unrar2/UnRARDLL/x64/unrar64.lib create mode 100644 lib/unrar2/__init__.py create mode 100644 lib/unrar2/license.txt create mode 100644 lib/unrar2/rar_exceptions.py create mode 100644 lib/unrar2/setup.py create mode 100644 lib/unrar2/test.rar create mode 100644 lib/unrar2/test_UnRAR2.py create mode 100644 lib/unrar2/test_nulls.rar create mode 100644 lib/unrar2/test_protected_files.rar create mode 100644 lib/unrar2/test_protected_headers.rar create mode 100644 lib/unrar2/unix.py create mode 100644 lib/unrar2/windows.py create mode 100644 readme-FailedDownloads.md create mode 100644 readme.md create mode 100644 setup.py create mode 100644 sickbeard/__init__.py create mode 100644 sickbeard/autoPostProcesser.py create mode 100644 sickbeard/browser.py create mode 100644 sickbeard/classes.py create mode 100644 sickbeard/clients/__init__.py create mode 100644 sickbeard/clients/deluge.py create mode 100644 sickbeard/clients/download_station.py create mode 100644 sickbeard/clients/generic.py create mode 100644 sickbeard/clients/rtorrent.py create mode 100644 sickbeard/clients/transmission.py create mode 100644 sickbeard/clients/utorrent.py create mode 100644 sickbeard/common.py create mode 100644 sickbeard/config.py create mode 100644 sickbeard/databases/__init__.py create mode 100644 sickbeard/databases/cache_db.py create mode 100644 sickbeard/databases/failed_db.py create mode 100644 sickbeard/databases/mainDB.py create mode 100644 sickbeard/db.py create mode 100644 sickbeard/encodingKludge.py create mode 100644 sickbeard/exceptions.py create mode 100644 sickbeard/failedProcessor.py create mode 100644 sickbeard/failed_history.py create mode 100644 sickbeard/generic_queue.py create mode 100644 sickbeard/gh_api.py create mode 100644 sickbeard/helpers.py create mode 100644 sickbeard/history.py create mode 100644 sickbeard/image_cache.py create mode 100644 sickbeard/indexers/__init__.py create mode 100644 sickbeard/indexers/indexer_api.py create mode 100644 sickbeard/indexers/indexer_exceptions.py create mode 100644 sickbeard/indexers/test.py create mode 100644 sickbeard/logger.py create mode 100644 sickbeard/metadata/__init__.py create mode 100644 sickbeard/metadata/generic.py create mode 100644 sickbeard/metadata/helpers.py create mode 100644 sickbeard/metadata/mediabrowser.py create mode 100644 sickbeard/metadata/ps3.py create mode 100644 sickbeard/metadata/tivo.py create mode 100644 sickbeard/metadata/wdtv.py create mode 100644 sickbeard/metadata/xbmc.py create mode 100644 sickbeard/metadata/xbmc_12plus.py create mode 100644 sickbeard/name_cache.py create mode 100644 sickbeard/name_parser/__init__.py create mode 100644 sickbeard/name_parser/parser.py create mode 100644 sickbeard/name_parser/regexes.py create mode 100644 sickbeard/naming.py create mode 100644 sickbeard/network_timezones.py create mode 100644 sickbeard/notifiers/__init__.py create mode 100644 sickbeard/notifiers/boxcar.py create mode 100644 sickbeard/notifiers/emailnotify.py create mode 100644 sickbeard/notifiers/growl.py create mode 100644 sickbeard/notifiers/libnotify.py create mode 100644 sickbeard/notifiers/nma.py create mode 100644 sickbeard/notifiers/nmj.py create mode 100644 sickbeard/notifiers/nmjv2.py create mode 100644 sickbeard/notifiers/plex.py create mode 100644 sickbeard/notifiers/prowl.py create mode 100644 sickbeard/notifiers/pushalot.py create mode 100644 sickbeard/notifiers/pushbullet.py create mode 100644 sickbeard/notifiers/pushover.py create mode 100644 sickbeard/notifiers/pytivo.py create mode 100644 sickbeard/notifiers/synoindex.py create mode 100644 sickbeard/notifiers/synologynotifier.py create mode 100644 sickbeard/notifiers/trakt.py create mode 100644 sickbeard/notifiers/tweet.py create mode 100644 sickbeard/notifiers/xbmc.py create mode 100644 sickbeard/nzbSplitter.py create mode 100644 sickbeard/nzbget.py create mode 100644 sickbeard/postProcessor.py create mode 100644 sickbeard/processTV.py create mode 100644 sickbeard/properFinder.py create mode 100644 sickbeard/providers/__init__.py create mode 100644 sickbeard/providers/btn.py create mode 100644 sickbeard/providers/dtt.py create mode 100644 sickbeard/providers/ezrss.py create mode 100644 sickbeard/providers/generic.py create mode 100644 sickbeard/providers/hdbits.py create mode 100644 sickbeard/providers/hdtorrents.py create mode 100644 sickbeard/providers/iptorrents.py create mode 100644 sickbeard/providers/kat.py create mode 100644 sickbeard/providers/newzbin.py create mode 100644 sickbeard/providers/newznab.py create mode 100644 sickbeard/providers/nextgen.py create mode 100644 sickbeard/providers/nyaatorrents.py create mode 100644 sickbeard/providers/nzbs_org_old.py create mode 100644 sickbeard/providers/nzbsrus.py create mode 100644 sickbeard/providers/omgwtfnzbs.py create mode 100644 sickbeard/providers/publichd.py create mode 100644 sickbeard/providers/rsstorrent.py create mode 100644 sickbeard/providers/scc.py create mode 100644 sickbeard/providers/thepiratebay.py create mode 100644 sickbeard/providers/torrentday.py create mode 100644 sickbeard/providers/torrentleech.py create mode 100644 sickbeard/providers/tvtorrents.py create mode 100644 sickbeard/providers/womble.py create mode 100644 sickbeard/sab.py create mode 100644 sickbeard/sbdatetime.py create mode 100644 sickbeard/scene_exceptions.py create mode 100644 sickbeard/scene_numbering.py create mode 100644 sickbeard/scheduler.py create mode 100644 sickbeard/search.py create mode 100644 sickbeard/searchBacklog.py create mode 100644 sickbeard/searchCurrent.py create mode 100644 sickbeard/search_queue.py create mode 100644 sickbeard/showUpdater.py create mode 100644 sickbeard/show_name_helpers.py create mode 100644 sickbeard/show_queue.py create mode 100644 sickbeard/subtitles.py create mode 100644 sickbeard/traktWatchListChecker.py create mode 100644 sickbeard/tv.py create mode 100644 sickbeard/tvcache.py create mode 100644 sickbeard/tvtumbler.py create mode 100644 sickbeard/ui.py create mode 100644 sickbeard/version.py create mode 100644 sickbeard/versionChecker.py create mode 100644 sickbeard/webapi.py create mode 100644 sickbeard/webserve.py create mode 100644 sickbeard/webserveInit.py create mode 100644 tests/__init__.py create mode 100644 tests/all_tests.py create mode 100644 tests/common_tests.py create mode 100644 tests/db_tests.py create mode 100644 tests/name_parser_tests.py create mode 100644 tests/pp_tests.py create mode 100644 tests/scene_helpers_tests.py create mode 100644 tests/snatch_tests.py create mode 100644 tests/test_lib.py create mode 100644 tests/tv_tests.py create mode 100644 updater.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9cc34bc5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# SB User Related # +###################### +cache/* +cache.db* +config.ini* +Logs/* +sickbeard.db* +failed.db* +autoProcessTV/autoProcessTV.cfg +server.crt +server.key + +# SB Test Related # +###################### +tests/Logs/* +tests/sickbeard.* +tests/cache.db + +# Compiled source # +###################### +*.py[co] + +# IDE specific # +###################### +*.bak +*.tmp +*.wpr +*.project +*.pydevproject +*.cproject +*.tmproj +*.tmproject +*.sw? +Session.vim +.ropeproject/* + +# OS generated files # +###################### +.Spotlight-V100 +.Trashes +.DS_Store +desktop.ini +ehthumbs.db +Thumbs.db +.directory +*~ +/.idea/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..63180c38 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: python +python: + - 2.5 + - 2.6 + - 2.7 + +# whitelist +branches: + only: + - ThePirateBay + - Pistachitos + +before_script: cd ./tests +script: ./all_tests.py \ No newline at end of file diff --git a/COPYING.txt b/COPYING.txt new file mode 100644 index 00000000..859d1c05 --- /dev/null +++ b/COPYING.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + The ultimate PVR application that downloads and manages your TV shows + Copyright (C) 2010 - Nic Wolfe + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Sick Beard - Copyright (C) 2010 - Nic Wolfe + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/SickBeard.py b/SickBeard.py new file mode 100644 index 00000000..513f5bde --- /dev/null +++ b/SickBeard.py @@ -0,0 +1,354 @@ +#!/usr/bin/env python2 +# Author: Nic Wolfe +# URL: http://code.google.com/p/sickbeard/ +# +# This file is part of Sick Beard. +# +# Sick Beard is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Sick Beard is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Sick Beard. If not, see . + +# Check needed software dependencies to nudge users to fix their setup +import sys +if sys.version_info < (2, 6): + print "Sorry, requires Python 2.6 or 2.7." + sys.exit(1) + +try: + import Cheetah + if Cheetah.Version[0] != '2': + raise ValueError +except ValueError: + print "Sorry, requires Python module Cheetah 2.1.0 or newer." + sys.exit(1) +except: + print "The Python module Cheetah is required" + sys.exit(1) + +import os +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'lib'))) + +# We only need this for compiling an EXE and I will just always do that on 2.6+ +if sys.hexversion >= 0x020600F0: + from multiprocessing import freeze_support # @UnresolvedImport + +import locale +import threading +import time +import signal +import traceback +import getopt + +import sickbeard + +from sickbeard import db +from sickbeard.tv import TVShow +from sickbeard import logger +from sickbeard.version import SICKBEARD_VERSION +from sickbeard.databases.mainDB import MIN_DB_VERSION +from sickbeard.databases.mainDB import MAX_DB_VERSION + +from sickbeard.webserveInit import initWebServer + +from lib.configobj import ConfigObj + +signal.signal(signal.SIGINT, sickbeard.sig_handler) +signal.signal(signal.SIGTERM, sickbeard.sig_handler) + + +def loadShowsFromDB(): + """ + Populates the showList with shows from the database + """ + + myDB = db.DBConnection() + sqlResults = myDB.select("SELECT * FROM tv_shows") + + for sqlShow in sqlResults: + try: + curShow = TVShow(sqlShow["indexer"], int(sqlShow["indexer_id"])) + sickbeard.showList.append(curShow) + except Exception, e: + logger.log(u"There was an error creating the show in " + sqlShow["location"] + ": " + str(e).decode('utf-8'), logger.ERROR) + logger.log(traceback.format_exc(), logger.DEBUG) + + # TODO: update the existing shows if the showlist has something in it + + +def daemonize(): + """ + Fork off as a daemon + """ + + # pylint: disable=E1101 + # Make a non-session-leader child process + try: + pid = os.fork() # @UndefinedVariable - only available in UNIX + if pid != 0: + sys.exit(0) + except OSError, e: + raise RuntimeError("1st fork failed: %s [%d]" % (e.strerror, e.errno)) + + os.setsid() # @UndefinedVariable - only available in UNIX + + # Make sure I can read my own files and shut out others + prev = os.umask(0) + os.umask(prev and int('077', 8)) + + # Make the child a session-leader by detaching from the terminal + try: + pid = os.fork() # @UndefinedVariable - only available in UNIX + if pid != 0: + sys.exit(0) + except OSError, e: + raise RuntimeError("2nd fork failed: %s [%d]" % (e.strerror, e.errno)) + + dev_null = file('/dev/null', 'r') + os.dup2(dev_null.fileno(), sys.stdin.fileno()) + + if sickbeard.CREATEPID: + pid = str(os.getpid()) + logger.log(u"Writing PID " + pid + " to " + str(sickbeard.PIDFILE)) + file(sickbeard.PIDFILE, 'w').write("%s\n" % pid) + + +def main(): + """ + TV for me + """ + + # do some preliminary stuff + sickbeard.MY_FULLNAME = os.path.normpath(os.path.abspath(__file__)) + sickbeard.MY_NAME = os.path.basename(sickbeard.MY_FULLNAME) + sickbeard.PROG_DIR = os.path.dirname(sickbeard.MY_FULLNAME) + sickbeard.DATA_DIR = sickbeard.PROG_DIR + sickbeard.MY_ARGS = sys.argv[1:] + sickbeard.CREATEPID = False + sickbeard.DAEMON = False + + sickbeard.SYS_ENCODING = None + + try: + locale.setlocale(locale.LC_ALL, "") + sickbeard.SYS_ENCODING = locale.getpreferredencoding() + except (locale.Error, IOError): + pass + + # For OSes that are poorly configured I'll just randomly force UTF-8 + if not sickbeard.SYS_ENCODING or sickbeard.SYS_ENCODING in ('ANSI_X3.4-1968', 'US-ASCII', 'ASCII'): + sickbeard.SYS_ENCODING = 'UTF-8' + + if not hasattr(sys, "setdefaultencoding"): + reload(sys) + + try: + # pylint: disable=E1101 + # On non-unicode builds this will raise an AttributeError, if encoding type is not valid it throws a LookupError + sys.setdefaultencoding(sickbeard.SYS_ENCODING) + except: + print 'Sorry, you MUST add the Sick Beard folder to the PYTHONPATH environment variable' + print 'or find another way to force Python to use ' + sickbeard.SYS_ENCODING + ' for string encoding.' + sys.exit(1) + + # Need console logging for SickBeard.py and SickBeard-console.exe + consoleLogging = (not hasattr(sys, "frozen")) or (sickbeard.MY_NAME.lower().find('-console') > 0) + + # Rename the main thread + threading.currentThread().name = "MAIN" + + try: + opts, args = getopt.getopt(sys.argv[1:], "qfdp::", ['quiet', 'forceupdate', 'daemon', 'port=', 'pidfile=', 'nolaunch', 'config=', 'datadir=']) # @UnusedVariable + except getopt.GetoptError: + print "Available Options: --quiet, --forceupdate, --port, --daemon, --pidfile, --config, --datadir" + sys.exit() + + forceUpdate = False + forcedPort = None + noLaunch = False + + for o, a in opts: + # For now we'll just silence the logging + if o in ('-q', '--quiet'): + consoleLogging = False + + # Should we update (from indexer) all shows in the DB right away? + if o in ('-f', '--forceupdate'): + forceUpdate = True + + # Suppress launching web browser + # Needed for OSes without default browser assigned + # Prevent duplicate browser window when restarting in the app + if o in ('--nolaunch',): + noLaunch = True + + # Override default/configured port + if o in ('-p', '--port'): + forcedPort = int(a) + + # Run as a daemon + if o in ('-d', '--daemon'): + if sys.platform == 'win32': + print "Daemonize not supported under Windows, starting normally" + else: + consoleLogging = False + sickbeard.DAEMON = True + + # Specify folder to load the config file from + if o in ('--config',): + sickbeard.CONFIG_FILE = os.path.abspath(a) + + # Specify folder to use as the data dir + if o in ('--datadir',): + sickbeard.DATA_DIR = os.path.abspath(a) + + # Write a pidfile if requested + if o in ('--pidfile',): + sickbeard.PIDFILE = str(a) + + # If the pidfile already exists, sickbeard may still be running, so exit + if os.path.exists(sickbeard.PIDFILE): + sys.exit("PID file '" + sickbeard.PIDFILE + "' already exists. Exiting.") + + # The pidfile is only useful in daemon mode, make sure we can write the file properly + if sickbeard.DAEMON: + sickbeard.CREATEPID = True + try: + file(sickbeard.PIDFILE, 'w').write("pid\n") + except IOError, e: + raise SystemExit("Unable to write PID file: %s [%d]" % (e.strerror, e.errno)) + else: + logger.log(u"Not running in daemon mode. PID file creation disabled.") + + # If they don't specify a config file then put it in the data dir + if not sickbeard.CONFIG_FILE: + sickbeard.CONFIG_FILE = os.path.join(sickbeard.DATA_DIR, "config.ini") + + # Make sure that we can create the data dir + if not os.access(sickbeard.DATA_DIR, os.F_OK): + try: + os.makedirs(sickbeard.DATA_DIR, 0744) + except os.error, e: + raise SystemExit("Unable to create datadir '" + sickbeard.DATA_DIR + "'") + + # Make sure we can write to the data dir + if not os.access(sickbeard.DATA_DIR, os.W_OK): + raise SystemExit("Datadir must be writeable '" + sickbeard.DATA_DIR + "'") + + # Make sure we can write to the config file + if not os.access(sickbeard.CONFIG_FILE, os.W_OK): + if os.path.isfile(sickbeard.CONFIG_FILE): + raise SystemExit("Config file '" + sickbeard.CONFIG_FILE + "' must be writeable.") + elif not os.access(os.path.dirname(sickbeard.CONFIG_FILE), os.W_OK): + raise SystemExit("Config file root dir '" + os.path.dirname(sickbeard.CONFIG_FILE) + "' must be writeable.") + + os.chdir(sickbeard.DATA_DIR) + + if consoleLogging: + print "Starting up Sick Beard " + SICKBEARD_VERSION + " from " + sickbeard.CONFIG_FILE + + # Load the config and publish it to the sickbeard package + if not os.path.isfile(sickbeard.CONFIG_FILE): + logger.log(u"Unable to find '" + sickbeard.CONFIG_FILE + "' , all settings will be default!", logger.ERROR) + + sickbeard.CFG = ConfigObj(sickbeard.CONFIG_FILE) + + CUR_DB_VERSION = db.DBConnection().checkDBVersion() + if CUR_DB_VERSION > 0: + if CUR_DB_VERSION < MIN_DB_VERSION: + raise SystemExit("Your database version (" + str(db.DBConnection().checkDBVersion()) + ") is too old to migrate from with this version of Sick Beard (" + str(MIN_DB_VERSION) + ").\n" + \ + "Upgrade using a previous version of SB first, or start with no database file to begin fresh.") + if CUR_DB_VERSION > MAX_DB_VERSION: + raise SystemExit("Your database version (" + str(db.DBConnection().checkDBVersion()) + ") has been incremented past what this version of Sick Beard supports (" + str(MAX_DB_VERSION) + ").\n" + \ + "If you have used other forks of SB, your database may be unusable due to their modifications.") + + # Initialize the config and our threads + sickbeard.initialize(consoleLogging=consoleLogging) + + sickbeard.showList = [] + + if sickbeard.DAEMON: + daemonize() + + # Use this PID for everything + sickbeard.PID = os.getpid() + + if forcedPort: + logger.log(u"Forcing web server to port " + str(forcedPort)) + startPort = forcedPort + else: + startPort = sickbeard.WEB_PORT + + if sickbeard.WEB_LOG: + log_dir = sickbeard.LOG_DIR + else: + log_dir = None + + # sickbeard.WEB_HOST is available as a configuration value in various + # places but is not configurable. It is supported here for historic reasons. + if sickbeard.WEB_HOST and sickbeard.WEB_HOST != '0.0.0.0': + webhost = sickbeard.WEB_HOST + else: + if sickbeard.WEB_IPV6: + webhost = '::' + else: + webhost = '0.0.0.0' + + try: + initWebServer({ + 'port': startPort, + 'host': webhost, + 'data_root': os.path.join(sickbeard.PROG_DIR, 'gui/'+sickbeard.GUI_NAME), + 'web_root': sickbeard.WEB_ROOT, + 'log_dir': log_dir, + 'username': sickbeard.WEB_USERNAME, + 'password': sickbeard.WEB_PASSWORD, + 'enable_https': sickbeard.ENABLE_HTTPS, + 'https_cert': sickbeard.HTTPS_CERT, + 'https_key': sickbeard.HTTPS_KEY, + }) + except IOError: + logger.log(u"Unable to start web server, is something else running on port %d?" % startPort, logger.ERROR) + if sickbeard.LAUNCH_BROWSER and not sickbeard.DAEMON: + logger.log(u"Launching browser and exiting", logger.ERROR) + sickbeard.launchBrowser(startPort) + sys.exit() + + # Build from the DB to start with + logger.log(u"Loading initial show list") + loadShowsFromDB() + + # Fire up all our threads + sickbeard.start() + + # Launch browser if we're supposed to + if sickbeard.LAUNCH_BROWSER and not noLaunch and not sickbeard.DAEMON: + sickbeard.launchBrowser(startPort) + + # Start an update if we're supposed to + if forceUpdate or sickbeard.UPDATE_SHOWS_ON_START: + sickbeard.showUpdateScheduler.action.run(force=True) # @UndefinedVariable + + # Stay alive while my threads do the work + while (True): + + if sickbeard.invoked_command: + sickbeard.invoked_command() + sickbeard.invoked_command = None + + time.sleep(1) + + return + +if __name__ == "__main__": + if sys.hexversion >= 0x020600F0: + freeze_support() + main() diff --git a/autoProcessTV/autoProcessTV.cfg.sample b/autoProcessTV/autoProcessTV.cfg.sample new file mode 100644 index 00000000..7a213d29 --- /dev/null +++ b/autoProcessTV/autoProcessTV.cfg.sample @@ -0,0 +1,7 @@ +[SickBeard] +host=localhost +port=8081 +username= +password= +web_root= +ssl=0 \ No newline at end of file diff --git a/autoProcessTV/autoProcessTV.py b/autoProcessTV/autoProcessTV.py new file mode 100644 index 00000000..04f4ec06 --- /dev/null +++ b/autoProcessTV/autoProcessTV.py @@ -0,0 +1,106 @@ +# Author: Nic Wolfe +# URL: http://code.google.com/p/sickbeard/ +# +# This file is part of Sick Beard. +# +# Sick Beard is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Sick Beard is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Sick Beard. If not, see . + + +import sys +import urllib +import os.path +import ConfigParser + +class AuthURLOpener(urllib.FancyURLopener): + def __init__(self, user, pw): + self.username = user + self.password = pw + self.numTries = 0 + urllib.FancyURLopener.__init__(self) + + def prompt_user_passwd(self, host, realm): + if self.numTries == 0: + self.numTries = 1 + return (self.username, self.password) + else: + return ('', '') + + def openit(self, url): + self.numTries = 0 + return urllib.FancyURLopener.open(self, url) + + +def processEpisode(dirName, nzbName=None, failed=False): + + config = ConfigParser.ConfigParser() + configFilename = os.path.join(os.path.dirname(sys.argv[0]), "autoProcessTV.cfg") + print "Loading config from", configFilename + + if not os.path.isfile(configFilename): + print "ERROR: You need an autoProcessTV.cfg file - did you rename and edit the .sample?" + sys.exit(-1) + + try: + fp = open(configFilename, "r") + config.readfp(fp) + fp.close() + except IOError, e: + print "Could not read configuration file: ", str(e) + sys.exit(1) + + host = config.get("SickBeard", "host") + port = config.get("SickBeard", "port") + username = config.get("SickBeard", "username") + password = config.get("SickBeard", "password") + try: + ssl = int(config.get("SickBeard", "ssl")) + except (ConfigParser.NoOptionError, ValueError): + ssl = 0 + + try: + web_root = config.get("SickBeard", "web_root") + except ConfigParser.NoOptionError: + web_root = "" + + params = {} + + params['quiet'] = 1 + + params['dir'] = dirName + if nzbName != None: + params['nzbName'] = nzbName + + params['failed'] = int(failed) + + myOpener = AuthURLOpener(username, password) + + if ssl: + protocol = "https://" + else: + protocol = "http://" + + url = protocol + host + ":" + port + web_root + "/home/postprocess/processEpisode?" + urllib.urlencode(params) + + print "Opening URL:", url + + try: + urlObj = myOpener.openit(url) + except IOError, e: + print "Unable to open URL: ", str(e) + sys.exit(1) + + result = urlObj.readlines() + for line in result: + print line + diff --git a/autoProcessTV/hellaToSickBeard.py b/autoProcessTV/hellaToSickBeard.py new file mode 100644 index 00000000..0f48d895 --- /dev/null +++ b/autoProcessTV/hellaToSickBeard.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python2 + +# Author: Nic Wolfe +# URL: http://code.google.com/p/sickbeard/ +# +# This file is part of Sick Beard. +# +# Sick Beard is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Sick Beard is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Sick Beard. If not, see . + + +import sys + +import autoProcessTV + +if len(sys.argv) < 4: + print "No folder supplied - is this being called from HellaVCR?" + sys.exit() +else: + autoProcessTV.processEpisode(sys.argv[3], sys.argv[2]) diff --git a/autoProcessTV/mediaToSickbeard.py b/autoProcessTV/mediaToSickbeard.py new file mode 100644 index 00000000..d57e5f1a --- /dev/null +++ b/autoProcessTV/mediaToSickbeard.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python2 + +import sys +import os +import time +import ConfigParser +import logging + +#Needed for importing logging & requests module +sickbeardPath = os.path.split(os.path.split(sys.argv[0])[0])[0] +sys.path.append(os.path.join( sickbeardPath, 'lib')) +sys.path.append(sickbeardPath) +configFilename = os.path.join(sickbeardPath, "config.ini") + +import requests + +config = ConfigParser.ConfigParser() + +try: + fp = open(configFilename, "r") + config.readfp(fp) + fp.close() +except IOError, e: + print "Could not find/read Sickbeard config.ini: " + str(e) + print 'Possibly wrong mediaToSickbeard.py location. Ensure the file is in the autoProcessTV subdir of your Sickbeard installation' + time.sleep(3) + sys.exit(1) + +scriptlogger = logging.getLogger('mediaToSickbeard') +formatter = logging.Formatter('%(asctime)s %(levelname)-8s MEDIATOSICKBEARD :: %(message)s', '%b-%d %H:%M:%S') + +# Get the log dir setting from SB config +logdirsetting = config.get("General", "log_dir") if config.get("General", "log_dir") else 'Logs' +# put the log dir inside the SickBeard dir, unless an absolute path +logdir = os.path.normpath(os.path.join(sickbeardPath, logdirsetting)) +logfile = os.path.join(logdir, 'sickbeard.log') + +try: + handler = logging.FileHandler(logfile) +except: + print 'Unable to open/create the log file at ' + logfile + time.sleep(3) + sys.exit() + +handler.setFormatter(formatter) +scriptlogger.addHandler(handler) +scriptlogger.setLevel(logging.DEBUG) + + +def utorrent(): +# print 'Calling utorrent' + if len(sys.argv) < 2: + scriptlogger.error('No folder supplied - is this being called from uTorrent?') + print "No folder supplied - is this being called from uTorrent?" + time.sleep(3) + sys.exit() + + dirName = sys.argv[1] + nzbName = sys.argv[2] + + return (dirName, nzbName) + +def transmission(): + + dirName = os.getenv('TR_TORRENT_DIR') + nzbName = os.getenv('TR_TORRENT_NAME') + + return (dirName, nzbName) + +def deluge(): + + if len(sys.argv) < 4: + scriptlogger.error('No folder supplied - is this being called from Deluge?') + print "No folder supplied - is this being called from Deluge?" + time.sleep(3) + sys.exit() + + dirName = sys.argv[3] + nzbName = sys.argv[2] + + return (dirName, nzbName) + +def blackhole(): + + if None != os.getenv('TR_TORRENT_DIR'): + scriptlogger.debug('Processing script triggered by Transmission') + print "Processing script triggered by Transmission" + scriptlogger.debug(u'TR_TORRENT_DIR: ' + os.getenv('TR_TORRENT_DIR')) + scriptlogger.debug(u'TR_TORRENT_NAME: ' + os.getenv('TR_TORRENT_NAME')) + dirName = os.getenv('TR_TORRENT_DIR') + nzbName = os.getenv('TR_TORRENT_NAME') + else: + if len(sys.argv) < 2: + scriptlogger.error('No folder supplied - Your client should invoke the script with a Dir and a Relese Name') + print "No folder supplied - Your client should invoke the script with a Dir and a Relese Name" + time.sleep(3) + sys.exit() + + dirName = sys.argv[1] + nzbName = sys.argv[2] + + return (dirName, nzbName) + +#def sabnzb(): +# if len(sys.argv) < 2: +# scriptlogger.error('No folder supplied - is this being called from SABnzbd?') +# print "No folder supplied - is this being called from SABnzbd?" +# sys.exit() +# elif len(sys.argv) >= 3: +# dirName = sys.argv[1] +# nzbName = sys.argv[2] +# else: +# dirName = sys.argv[1] +# +# return (dirName, nzbName) +# +#def hella(): +# if len(sys.argv) < 4: +# scriptlogger.error('No folder supplied - is this being called from HellaVCR?') +# print "No folder supplied - is this being called from HellaVCR?" +# sys.exit() +# else: +# dirName = sys.argv[3] +# nzbName = sys.argv[2] +# +# return (dirName, nzbName) + +def main(): + + scriptlogger.info(u'Starting external PostProcess script ' + __file__) + + host = config.get("General", "web_host") + port = config.get("General", "web_port") + username = config.get("General", "web_username") + password = config.get("General", "web_password") + try: + ssl = int(config.get("General", "enable_https")) + except (ConfigParser.NoOptionError, ValueError): + ssl = 0 + + try: + web_root = config.get("General", "web_root") + except ConfigParser.NoOptionError: + web_root = "" + + tv_dir = config.get("General", "tv_download_dir") + use_torrents = int(config.get("General", "use_torrents")) + torrent_method = config.get("General", "torrent_method") + + if not use_torrents: + scriptlogger.error(u'Enable Use Torrent on Sickbeard to use this Script. Aborting!') + print u'Enable Use Torrent on Sickbeard to use this Script. Aborting!' + time.sleep(3) + sys.exit() + + if not torrent_method in ['utorrent', 'transmission', 'deluge', 'blackhole']: + scriptlogger.error(u'Unknown Torrent Method. Aborting!') + print u'Unknown Torrent Method. Aborting!' + time.sleep(3) + sys.exit() + + dirName, nzbName = eval(locals()['torrent_method'])() + + if dirName is None: + scriptlogger.error(u'MediaToSickbeard script need a dir to be run. Aborting!') + print u'MediaToSickbeard script need a dir to be run. Aborting!' + time.sleep(3) + sys.exit() + + if not os.path.isdir(dirName): + scriptlogger.error(u'Folder ' + dirName + ' does not exist. Aborting AutoPostProcess.') + print u'Folder ' + dirName + ' does not exist. Aborting AutoPostProcess.' + time.sleep(3) + sys.exit() + + if nzbName and os.path.isdir(os.path.join(dirName, nzbName)): + dirName = os.path.join(dirName, nzbName) + + params = {} + + params['quiet'] = 1 + + params['dir'] = dirName + if nzbName != None: + params['nzbName'] = nzbName + + if ssl: + protocol = "https://" + else: + protocol = "http://" + + if host == '0.0.0.0': + host = 'localhost' + + url = protocol + host + ":" + port + web_root + "/home/postprocess/processEpisode" + + scriptlogger.debug("Opening URL: " + url + ' with params=' + str(params)) + print "Opening URL: " + url + ' with params=' + str(params) + + try: + response = requests.get(url, auth=(username, password), params=params) + except Exception, e: + scriptlogger.error(u': Unknown exception raised when opening url: ' + ex(e)) + time.sleep(3) + sys.exit() + + if response.status_code == 401: + scriptlogger.error(u'Invalid Sickbeard Username or Password, check your config') + print 'Invalid Sickbeard Username or Password, check your config' + time.sleep(3) + sys.exit() + + if response.status_code == 200: + scriptlogger.info(u'Script ' + __file__ + ' Succesfull') + print 'Script ' + __file__ + ' Succesfull' + time.sleep(3) + sys.exit() + +if __name__ == '__main__': + main() diff --git a/autoProcessTV/sabToSickBeard.py b/autoProcessTV/sabToSickBeard.py new file mode 100644 index 00000000..33299b8f --- /dev/null +++ b/autoProcessTV/sabToSickBeard.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python2 + +# Author: Nic Wolfe +# URL: http://code.google.com/p/sickbeard/ +# +# This file is part of Sick Beard. +# +# Sick Beard is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Sick Beard is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Sick Beard. If not, see . + + +import sys +import autoProcessTV + +if len(sys.argv) < 2: + print "No folder supplied - is this being called from SABnzbd?" + sys.exit() +elif len(sys.argv) >= 8: + autoProcessTV.processEpisode(sys.argv[1], sys.argv[2], sys.argv[7]) +elif len(sys.argv) >= 3: + autoProcessTV.processEpisode(sys.argv[1], sys.argv[2]) +else: + autoProcessTV.processEpisode(sys.argv[1]) diff --git a/autoProcessTV/setup.py b/autoProcessTV/setup.py new file mode 100644 index 00000000..c79e4fd6 --- /dev/null +++ b/autoProcessTV/setup.py @@ -0,0 +1,13 @@ +from distutils.core import setup +import py2exe, sys, shutil + +sys.argv.append('py2exe') + +setup( + options = {'py2exe': {'bundle_files': 1}}, +# windows = [{'console': "sabToSickbeard.py"}], + zipfile = None, + console = ['sabToSickbeard.py'], +) + +shutil.copy('dist/sabToSickbeard.exe', '.') diff --git a/cherrypy/__init__.py b/cherrypy/__init__.py new file mode 100644 index 00000000..c9fc1f1d --- /dev/null +++ b/cherrypy/__init__.py @@ -0,0 +1,573 @@ +"""CherryPy is a pythonic, object-oriented HTTP framework. + + +CherryPy consists of not one, but four separate API layers. + +The APPLICATION LAYER is the simplest. CherryPy applications are written as +a tree of classes and methods, where each branch in the tree corresponds to +a branch in the URL path. Each method is a 'page handler', which receives +GET and POST params as keyword arguments, and returns or yields the (HTML) +body of the response. The special method name 'index' is used for paths +that end in a slash, and the special method name 'default' is used to +handle multiple paths via a single handler. This layer also includes: + + * the 'exposed' attribute (and cherrypy.expose) + * cherrypy.quickstart() + * _cp_config attributes + * cherrypy.tools (including cherrypy.session) + * cherrypy.url() + +The ENVIRONMENT LAYER is used by developers at all levels. It provides +information about the current request and response, plus the application +and server environment, via a (default) set of top-level objects: + + * cherrypy.request + * cherrypy.response + * cherrypy.engine + * cherrypy.server + * cherrypy.tree + * cherrypy.config + * cherrypy.thread_data + * cherrypy.log + * cherrypy.HTTPError, NotFound, and HTTPRedirect + * cherrypy.lib + +The EXTENSION LAYER allows advanced users to construct and share their own +plugins. It consists of: + + * Hook API + * Tool API + * Toolbox API + * Dispatch API + * Config Namespace API + +Finally, there is the CORE LAYER, which uses the core API's to construct +the default components which are available at higher layers. You can think +of the default components as the 'reference implementation' for CherryPy. +Megaframeworks (and advanced users) may replace the default components +with customized or extended components. The core API's are: + + * Application API + * Engine API + * Request API + * Server API + * WSGI API + +These API's are described in the CherryPy specification: +http://www.cherrypy.org/wiki/CherryPySpec +""" + +__version__ = "3.2.0rc1" + +from urlparse import urljoin as _urljoin +from urllib import urlencode as _urlencode + + +class _AttributeDocstrings(type): + """Metaclass for declaring docstrings for class attributes.""" + # The full docstring for this type is down in the __init__ method so + # that it doesn't show up in help() for every consumer class. + + def __init__(cls, name, bases, dct): + '''Metaclass for declaring docstrings for class attributes. + + Base Python doesn't provide any syntax for setting docstrings on + 'data attributes' (non-callables). This metaclass allows class + definitions to follow the declaration of a data attribute with + a docstring for that attribute; the attribute docstring will be + popped from the class dict and folded into the class docstring. + + The naming convention for attribute docstrings is: + + "__doc". + For example: + + class Thing(object): + """A thing and its properties.""" + + __metaclass__ = cherrypy._AttributeDocstrings + + height = 50 + height__doc = """The height of the Thing in inches.""" + + In which case, help(Thing) starts like this: + + >>> help(mod.Thing) + Help on class Thing in module pkg.mod: + + class Thing(__builtin__.object) + | A thing and its properties. + | + | height [= 50]: + | The height of the Thing in inches. + | + + The benefits of this approach over hand-edited class docstrings: + 1. Places the docstring nearer to the attribute declaration. + 2. Makes attribute docs more uniform ("name (default): doc"). + 3. Reduces mismatches of attribute _names_ between + the declaration and the documentation. + 4. Reduces mismatches of attribute default _values_ between + the declaration and the documentation. + + The benefits of a metaclass approach over other approaches: + 1. Simpler ("less magic") than interface-based solutions. + 2. __metaclass__ can be specified at the module global level + for classic classes. + + For various formatting reasons, you should write multiline docs + with a leading newline and not a trailing one: + + response__doc = """ + The response object for the current thread. In the main thread, + and any threads which are not HTTP requests, this is None.""" + + The type of the attribute is intentionally not included, because + that's not How Python Works. Quack. + ''' + + newdoc = [cls.__doc__ or ""] + + dctkeys = dct.keys() + dctkeys.sort() + for name in dctkeys: + if name.endswith("__doc"): + # Remove the magic doc attribute. + if hasattr(cls, name): + delattr(cls, name) + + # Make a uniformly-indented docstring from it. + val = '\n'.join([' ' + line.strip() + for line in dct[name].split('\n')]) + + # Get the default value. + attrname = name[:-5] + try: + attrval = getattr(cls, attrname) + except AttributeError: + attrval = "missing" + + # Add the complete attribute docstring to our list. + newdoc.append("%s [= %r]:\n%s" % (attrname, attrval, val)) + + # Add our list of new docstrings to the class docstring. + cls.__doc__ = "\n\n".join(newdoc) + + +from cherrypy._cperror import HTTPError, HTTPRedirect, InternalRedirect +from cherrypy._cperror import NotFound, CherryPyException, TimeoutError + +from cherrypy import _cpdispatch as dispatch + +from cherrypy import _cptools +tools = _cptools.default_toolbox +Tool = _cptools.Tool + +from cherrypy import _cprequest +from cherrypy.lib import httputil as _httputil + +from cherrypy import _cptree +tree = _cptree.Tree() +from cherrypy._cptree import Application +from cherrypy import _cpwsgi as wsgi + +from cherrypy import process +try: + from cherrypy.process import win32 + engine = win32.Win32Bus() + engine.console_control_handler = win32.ConsoleCtrlHandler(engine) + del win32 +except ImportError: + engine = process.bus + + +# Timeout monitor +class _TimeoutMonitor(process.plugins.Monitor): + + def __init__(self, bus): + self.servings = [] + process.plugins.Monitor.__init__(self, bus, self.run) + + def acquire(self): + self.servings.append((serving.request, serving.response)) + + def release(self): + try: + self.servings.remove((serving.request, serving.response)) + except ValueError: + pass + + def run(self): + """Check timeout on all responses. (Internal)""" + for req, resp in self.servings: + resp.check_timeout() +engine.timeout_monitor = _TimeoutMonitor(engine) +engine.timeout_monitor.subscribe() + +engine.autoreload = process.plugins.Autoreloader(engine) +engine.autoreload.subscribe() + +engine.thread_manager = process.plugins.ThreadManager(engine) +engine.thread_manager.subscribe() + +engine.signal_handler = process.plugins.SignalHandler(engine) + + +from cherrypy import _cpserver +server = _cpserver.Server() +server.subscribe() + + +def quickstart(root=None, script_name="", config=None): + """Mount the given root, start the builtin server (and engine), then block. + + root: an instance of a "controller class" (a collection of page handler + methods) which represents the root of the application. + script_name: a string containing the "mount point" of the application. + This should start with a slash, and be the path portion of the URL + at which to mount the given root. For example, if root.index() will + handle requests to "http://www.example.com:8080/dept/app1/", then + the script_name argument would be "/dept/app1". + + It MUST NOT end in a slash. If the script_name refers to the root + of the URI, it MUST be an empty string (not "/"). + config: a file or dict containing application config. If this contains + a [global] section, those entries will be used in the global + (site-wide) config. + """ + if config: + _global_conf_alias.update(config) + + tree.mount(root, script_name, config) + + if hasattr(engine, "signal_handler"): + engine.signal_handler.subscribe() + if hasattr(engine, "console_control_handler"): + engine.console_control_handler.subscribe() + + engine.start() + engine.block() + + +try: + from threading import local as _local +except ImportError: + from cherrypy._cpthreadinglocal import local as _local + +class _Serving(_local): + """An interface for registering request and response objects. + + Rather than have a separate "thread local" object for the request and + the response, this class works as a single threadlocal container for + both objects (and any others which developers wish to define). In this + way, we can easily dump those objects when we stop/start a new HTTP + conversation, yet still refer to them as module-level globals in a + thread-safe way. + """ + + __metaclass__ = _AttributeDocstrings + + request = _cprequest.Request(_httputil.Host("127.0.0.1", 80), + _httputil.Host("127.0.0.1", 1111)) + request__doc = """ + The request object for the current thread. In the main thread, + and any threads which are not receiving HTTP requests, this is None.""" + + response = _cprequest.Response() + response__doc = """ + The response object for the current thread. In the main thread, + and any threads which are not receiving HTTP requests, this is None.""" + + def load(self, request, response): + self.request = request + self.response = response + + def clear(self): + """Remove all attributes of self.""" + self.__dict__.clear() + +serving = _Serving() + + +class _ThreadLocalProxy(object): + + __slots__ = ['__attrname__', '__dict__'] + + def __init__(self, attrname): + self.__attrname__ = attrname + + def __getattr__(self, name): + child = getattr(serving, self.__attrname__) + return getattr(child, name) + + def __setattr__(self, name, value): + if name in ("__attrname__",): + object.__setattr__(self, name, value) + else: + child = getattr(serving, self.__attrname__) + setattr(child, name, value) + + def __delattr__(self, name): + child = getattr(serving, self.__attrname__) + delattr(child, name) + + def _get_dict(self): + child = getattr(serving, self.__attrname__) + d = child.__class__.__dict__.copy() + d.update(child.__dict__) + return d + __dict__ = property(_get_dict) + + def __getitem__(self, key): + child = getattr(serving, self.__attrname__) + return child[key] + + def __setitem__(self, key, value): + child = getattr(serving, self.__attrname__) + child[key] = value + + def __delitem__(self, key): + child = getattr(serving, self.__attrname__) + del child[key] + + def __contains__(self, key): + child = getattr(serving, self.__attrname__) + return key in child + + def __len__(self): + child = getattr(serving, self.__attrname__) + return len(child) + + def __nonzero__(self): + child = getattr(serving, self.__attrname__) + return bool(child) + + +# Create request and response object (the same objects will be used +# throughout the entire life of the webserver, but will redirect +# to the "serving" object) +request = _ThreadLocalProxy('request') +response = _ThreadLocalProxy('response') + +# Create thread_data object as a thread-specific all-purpose storage +class _ThreadData(_local): + """A container for thread-specific data.""" +thread_data = _ThreadData() + + +# Monkeypatch pydoc to allow help() to go through the threadlocal proxy. +# Jan 2007: no Googleable examples of anyone else replacing pydoc.resolve. +# The only other way would be to change what is returned from type(request) +# and that's not possible in pure Python (you'd have to fake ob_type). +def _cherrypy_pydoc_resolve(thing, forceload=0): + """Given an object or a path to an object, get the object and its name.""" + if isinstance(thing, _ThreadLocalProxy): + thing = getattr(serving, thing.__attrname__) + return _pydoc._builtin_resolve(thing, forceload) + +try: + import pydoc as _pydoc + _pydoc._builtin_resolve = _pydoc.resolve + _pydoc.resolve = _cherrypy_pydoc_resolve +except ImportError: + pass + + +from cherrypy import _cplogging + +class _GlobalLogManager(_cplogging.LogManager): + + def __call__(self, *args, **kwargs): + # Do NOT use try/except here. See http://www.cherrypy.org/ticket/945 + if hasattr(request, 'app') and hasattr(request.app, 'log'): + log = request.app.log + else: + log = self + return log.error(*args, **kwargs) + + def access(self): + try: + return request.app.log.access() + except AttributeError: + return _cplogging.LogManager.access(self) + + +log = _GlobalLogManager() +# Set a default screen handler on the global log. +log.screen = True +log.error_file = '' +# Using an access file makes CP about 10% slower. Leave off by default. +log.access_file = '' + +def _buslog(msg, level): + log.error(msg, 'ENGINE', severity=level) +engine.subscribe('log', _buslog) + +# Helper functions for CP apps # + + +def expose(func=None, alias=None): + """Expose the function, optionally providing an alias or set of aliases.""" + def expose_(func): + func.exposed = True + if alias is not None: + if isinstance(alias, basestring): + parents[alias.replace(".", "_")] = func + else: + for a in alias: + parents[a.replace(".", "_")] = func + return func + + import sys, types + if isinstance(func, (types.FunctionType, types.MethodType)): + if alias is None: + # @expose + func.exposed = True + return func + else: + # func = expose(func, alias) + parents = sys._getframe(1).f_locals + return expose_(func) + elif func is None: + if alias is None: + # @expose() + parents = sys._getframe(1).f_locals + return expose_ + else: + # @expose(alias="alias") or + # @expose(alias=["alias1", "alias2"]) + parents = sys._getframe(1).f_locals + return expose_ + else: + # @expose("alias") or + # @expose(["alias1", "alias2"]) + parents = sys._getframe(1).f_locals + alias = func + return expose_ + + +def url(path="", qs="", script_name=None, base=None, relative=None): + """Create an absolute URL for the given path. + + If 'path' starts with a slash ('/'), this will return + (base + script_name + path + qs). + If it does not start with a slash, this returns + (base + script_name [+ request.path_info] + path + qs). + + If script_name is None, cherrypy.request will be used + to find a script_name, if available. + + If base is None, cherrypy.request.base will be used (if available). + Note that you can use cherrypy.tools.proxy to change this. + + Finally, note that this function can be used to obtain an absolute URL + for the current request path (minus the querystring) by passing no args. + If you call url(qs=cherrypy.request.query_string), you should get the + original browser URL (assuming no internal redirections). + + If relative is None or not provided, request.app.relative_urls will + be used (if available, else False). If False, the output will be an + absolute URL (including the scheme, host, vhost, and script_name). + If True, the output will instead be a URL that is relative to the + current request path, perhaps including '..' atoms. If relative is + the string 'server', the output will instead be a URL that is + relative to the server root; i.e., it will start with a slash. + """ + if isinstance(qs, (tuple, list, dict)): + qs = _urlencode(qs) + if qs: + qs = '?' + qs + + if request.app: + if not path.startswith("/"): + # Append/remove trailing slash from path_info as needed + # (this is to support mistyped URL's without redirecting; + # if you want to redirect, use tools.trailing_slash). + pi = request.path_info + if request.is_index is True: + if not pi.endswith('/'): + pi = pi + '/' + elif request.is_index is False: + if pi.endswith('/') and pi != '/': + pi = pi[:-1] + + if path == "": + path = pi + else: + path = _urljoin(pi, path) + + if script_name is None: + script_name = request.script_name + if base is None: + base = request.base + + newurl = base + script_name + path + qs + else: + # No request.app (we're being called outside a request). + # We'll have to guess the base from server.* attributes. + # This will produce very different results from the above + # if you're using vhosts or tools.proxy. + if base is None: + base = server.base() + + path = (script_name or "") + path + newurl = base + path + qs + + if './' in newurl: + # Normalize the URL by removing ./ and ../ + atoms = [] + for atom in newurl.split('/'): + if atom == '.': + pass + elif atom == '..': + atoms.pop() + else: + atoms.append(atom) + newurl = '/'.join(atoms) + + # At this point, we should have a fully-qualified absolute URL. + + if relative is None: + relative = getattr(request.app, "relative_urls", False) + + # See http://www.ietf.org/rfc/rfc2396.txt + if relative == 'server': + # "A relative reference beginning with a single slash character is + # termed an absolute-path reference, as defined by ..." + # This is also sometimes called "server-relative". + newurl = '/' + '/'.join(newurl.split('/', 3)[3:]) + elif relative: + # "A relative reference that does not begin with a scheme name + # or a slash character is termed a relative-path reference." + old = url().split('/')[:-1] + new = newurl.split('/') + while old and new: + a, b = old[0], new[0] + if a != b: + break + old.pop(0) + new.pop(0) + new = (['..'] * len(old)) + new + newurl = '/'.join(new) + + return newurl + + +# import _cpconfig last so it can reference other top-level objects +from cherrypy import _cpconfig +# Use _global_conf_alias so quickstart can use 'config' as an arg +# without shadowing cherrypy.config. +config = _global_conf_alias = _cpconfig.Config() +config.defaults = { + 'tools.log_tracebacks.on': True, + 'tools.log_headers.on': True, + 'tools.trailing_slash.on': True, + 'tools.encode.on': True + } +config.namespaces["log"] = lambda k, v: setattr(log, k, v) +config.namespaces["checker"] = lambda k, v: setattr(checker, k, v) +# Must reset to get our defaults applied. +config.reset() + +from cherrypy import _cpchecker +checker = _cpchecker.Checker() +engine.subscribe('start', checker) diff --git a/cherrypy/_cpchecker.py b/cherrypy/_cpchecker.py new file mode 100644 index 00000000..47739d8f --- /dev/null +++ b/cherrypy/_cpchecker.py @@ -0,0 +1,322 @@ +import os +import warnings + +import cherrypy + + +class Checker(object): + """A checker for CherryPy sites and their mounted applications. + + on: set this to False to turn off the checker completely. + + When this object is called at engine startup, it executes each + of its own methods whose names start with "check_". If you wish + to disable selected checks, simply add a line in your global + config which sets the appropriate method to False: + + [global] + checker.check_skipped_app_config = False + + You may also dynamically add or replace check_* methods in this way. + """ + + on = True + + def __init__(self): + self._populate_known_types() + + def __call__(self): + """Run all check_* methods.""" + if self.on: + oldformatwarning = warnings.formatwarning + warnings.formatwarning = self.formatwarning + try: + for name in dir(self): + if name.startswith("check_"): + method = getattr(self, name) + if method and callable(method): + method() + finally: + warnings.formatwarning = oldformatwarning + + def formatwarning(self, message, category, filename, lineno, line=None): + """Function to format a warning.""" + return "CherryPy Checker:\n%s\n\n" % message + + # This value should be set inside _cpconfig. + global_config_contained_paths = False + + def check_app_config_entries_dont_start_with_script_name(self): + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + if not app.config: + continue + if sn == '': + continue + sn_atoms = sn.strip("/").split("/") + for key in app.config.keys(): + key_atoms = key.strip("/").split("/") + if key_atoms[:len(sn_atoms)] == sn_atoms: + warnings.warn( + "The application mounted at %r has config " \ + "entries that start with its script name: %r" % (sn, key)) + + def check_site_config_entries_in_app_config(self): + for sn, app in cherrypy.tree.apps.iteritems(): + if not isinstance(app, cherrypy.Application): + continue + + msg = [] + for section, entries in app.config.iteritems(): + if section.startswith('/'): + for key, value in entries.iteritems(): + for n in ("engine.", "server.", "tree.", "checker."): + if key.startswith(n): + msg.append("[%s] %s = %s" % (section, key, value)) + if msg: + msg.insert(0, + "The application mounted at %r contains the following " + "config entries, which are only allowed in site-wide " + "config. Move them to a [global] section and pass them " + "to cherrypy.config.update() instead of tree.mount()." % sn) + warnings.warn(os.linesep.join(msg)) + + def check_skipped_app_config(self): + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + if not app.config: + msg = "The Application mounted at %r has an empty config." % sn + if self.global_config_contained_paths: + msg += (" It looks like the config you passed to " + "cherrypy.config.update() contains application-" + "specific sections. You must explicitly pass " + "application config via " + "cherrypy.tree.mount(..., config=app_config)") + warnings.warn(msg) + return + + def check_app_config_brackets(self): + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + if not app.config: + continue + for key in app.config.keys(): + if key.startswith("[") or key.endswith("]"): + warnings.warn( + "The application mounted at %r has config " \ + "section names with extraneous brackets: %r. " + "Config *files* need brackets; config *dicts* " + "(e.g. passed to tree.mount) do not." % (sn, key)) + + def check_static_paths(self): + # Use the dummy Request object in the main thread. + request = cherrypy.request + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + request.app = app + for section in app.config: + # get_resource will populate request.config + request.get_resource(section + "/dummy.html") + conf = request.config.get + + if conf("tools.staticdir.on", False): + msg = "" + root = conf("tools.staticdir.root") + dir = conf("tools.staticdir.dir") + if dir is None: + msg = "tools.staticdir.dir is not set." + else: + fulldir = "" + if os.path.isabs(dir): + fulldir = dir + if root: + msg = ("dir is an absolute path, even " + "though a root is provided.") + testdir = os.path.join(root, dir[1:]) + if os.path.exists(testdir): + msg += ("\nIf you meant to serve the " + "filesystem folder at %r, remove " + "the leading slash from dir." % testdir) + else: + if not root: + msg = "dir is a relative path and no root provided." + else: + fulldir = os.path.join(root, dir) + if not os.path.isabs(fulldir): + msg = "%r is not an absolute path." % fulldir + + if fulldir and not os.path.exists(fulldir): + if msg: + msg += "\n" + msg += ("%r (root + dir) is not an existing " + "filesystem path." % fulldir) + + if msg: + warnings.warn("%s\nsection: [%s]\nroot: %r\ndir: %r" + % (msg, section, root, dir)) + + + # -------------------------- Compatibility -------------------------- # + + obsolete = { + 'server.default_content_type': 'tools.response_headers.headers', + 'log_access_file': 'log.access_file', + 'log_config_options': None, + 'log_file': 'log.error_file', + 'log_file_not_found': None, + 'log_request_headers': 'tools.log_headers.on', + 'log_to_screen': 'log.screen', + 'show_tracebacks': 'request.show_tracebacks', + 'throw_errors': 'request.throw_errors', + 'profiler.on': ('cherrypy.tree.mount(profiler.make_app(' + 'cherrypy.Application(Root())))'), + } + + deprecated = {} + + def _compat(self, config): + """Process config and warn on each obsolete or deprecated entry.""" + for section, conf in config.items(): + if isinstance(conf, dict): + for k, v in conf.items(): + if k in self.obsolete: + warnings.warn("%r is obsolete. Use %r instead.\n" + "section: [%s]" % + (k, self.obsolete[k], section)) + elif k in self.deprecated: + warnings.warn("%r is deprecated. Use %r instead.\n" + "section: [%s]" % + (k, self.deprecated[k], section)) + else: + if section in self.obsolete: + warnings.warn("%r is obsolete. Use %r instead." + % (section, self.obsolete[section])) + elif section in self.deprecated: + warnings.warn("%r is deprecated. Use %r instead." + % (section, self.deprecated[section])) + + def check_compatibility(self): + """Process config and warn on each obsolete or deprecated entry.""" + self._compat(cherrypy.config) + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + self._compat(app.config) + + + # ------------------------ Known Namespaces ------------------------ # + + extra_config_namespaces = [] + + def _known_ns(self, app): + ns = ["wsgi"] + ns.extend(app.toolboxes.keys()) + ns.extend(app.namespaces.keys()) + ns.extend(app.request_class.namespaces.keys()) + ns.extend(cherrypy.config.namespaces.keys()) + ns += self.extra_config_namespaces + + for section, conf in app.config.items(): + is_path_section = section.startswith("/") + if is_path_section and isinstance(conf, dict): + for k, v in conf.items(): + atoms = k.split(".") + if len(atoms) > 1: + if atoms[0] not in ns: + # Spit out a special warning if a known + # namespace is preceded by "cherrypy." + if (atoms[0] == "cherrypy" and atoms[1] in ns): + msg = ("The config entry %r is invalid; " + "try %r instead.\nsection: [%s]" + % (k, ".".join(atoms[1:]), section)) + else: + msg = ("The config entry %r is invalid, because " + "the %r config namespace is unknown.\n" + "section: [%s]" % (k, atoms[0], section)) + warnings.warn(msg) + elif atoms[0] == "tools": + if atoms[1] not in dir(cherrypy.tools): + msg = ("The config entry %r may be invalid, " + "because the %r tool was not found.\n" + "section: [%s]" % (k, atoms[1], section)) + warnings.warn(msg) + + def check_config_namespaces(self): + """Process config and warn on each unknown config namespace.""" + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + self._known_ns(app) + + + + + # -------------------------- Config Types -------------------------- # + + known_config_types = {} + + def _populate_known_types(self): + import __builtin__ as builtins + b = [x for x in vars(builtins).values() + if type(x) is type(str)] + + def traverse(obj, namespace): + for name in dir(obj): + # Hack for 3.2's warning about body_params + if name == 'body_params': + continue + vtype = type(getattr(obj, name, None)) + if vtype in b: + self.known_config_types[namespace + "." + name] = vtype + + traverse(cherrypy.request, "request") + traverse(cherrypy.response, "response") + traverse(cherrypy.server, "server") + traverse(cherrypy.engine, "engine") + traverse(cherrypy.log, "log") + + def _known_types(self, config): + msg = ("The config entry %r in section %r is of type %r, " + "which does not match the expected type %r.") + + for section, conf in config.items(): + if isinstance(conf, dict): + for k, v in conf.items(): + if v is not None: + expected_type = self.known_config_types.get(k, None) + vtype = type(v) + if expected_type and vtype != expected_type: + warnings.warn(msg % (k, section, vtype.__name__, + expected_type.__name__)) + else: + k, v = section, conf + if v is not None: + expected_type = self.known_config_types.get(k, None) + vtype = type(v) + if expected_type and vtype != expected_type: + warnings.warn(msg % (k, section, vtype.__name__, + expected_type.__name__)) + + def check_config_types(self): + """Assert that config values are of the same type as default values.""" + self._known_types(cherrypy.config) + for sn, app in cherrypy.tree.apps.items(): + if not isinstance(app, cherrypy.Application): + continue + self._known_types(app.config) + + + # -------------------- Specific config warnings -------------------- # + + def check_localhost(self): + """Warn if any socket_host is 'localhost'. See #711.""" + for k, v in cherrypy.config.items(): + if k == 'server.socket_host' and v == 'localhost': + warnings.warn("The use of 'localhost' as a socket host can " + "cause problems on newer systems, since 'localhost' can " + "map to either an IPv4 or an IPv6 address. You should " + "use '127.0.0.1' or '[::1]' instead.") diff --git a/cherrypy/_cpconfig.py b/cherrypy/_cpconfig.py new file mode 100644 index 00000000..93d6fcb6 --- /dev/null +++ b/cherrypy/_cpconfig.py @@ -0,0 +1,269 @@ +"""Configuration system for CherryPy. + +Configuration in CherryPy is implemented via dictionaries. Keys are strings +which name the mapped value, which may be of any type. + + +Architecture +------------ + +CherryPy Requests are part of an Application, which runs in a global context, +and configuration data may apply to any of those three scopes: + + Global: configuration entries which apply everywhere are stored in + cherrypy.config. + + Application: entries which apply to each mounted application are stored + on the Application object itself, as 'app.config'. This is a two-level + dict where each key is a path, or "relative URL" (for example, "/" or + "/path/to/my/page"), and each value is a config dict. Usually, this + data is provided in the call to tree.mount(root(), config=conf), + although you may also use app.merge(conf). + + Request: each Request object possesses a single 'Request.config' dict. + Early in the request process, this dict is populated by merging global + config entries, Application entries (whose path equals or is a parent + of Request.path_info), and any config acquired while looking up the + page handler (see next). + + +Declaration +----------- + +Configuration data may be supplied as a Python dictionary, as a filename, +or as an open file object. When you supply a filename or file, CherryPy +uses Python's builtin ConfigParser; you declare Application config by +writing each path as a section header: + + [/path/to/my/page] + request.stream = True + +To declare global configuration entries, place them in a [global] section. + +You may also declare config entries directly on the classes and methods +(page handlers) that make up your CherryPy application via the '_cp_config' +attribute. For example: + + class Demo: + _cp_config = {'tools.gzip.on': True} + + def index(self): + return "Hello world" + index.exposed = True + index._cp_config = {'request.show_tracebacks': False} + +Note, however, that this behavior is only guaranteed for the default +dispatcher. Other dispatchers may have different restrictions on where +you can attach _cp_config attributes. + + +Namespaces +---------- + +Configuration keys are separated into namespaces by the first "." in the key. +Current namespaces: + + engine: Controls the 'application engine', including autoreload. + These can only be declared in the global config. + tree: Grafts cherrypy.Application objects onto cherrypy.tree. + These can only be declared in the global config. + hooks: Declares additional request-processing functions. + log: Configures the logging for each application. + These can only be declared in the global or / config. + request: Adds attributes to each Request. + response: Adds attributes to each Response. + server: Controls the default HTTP server via cherrypy.server. + These can only be declared in the global config. + tools: Runs and configures additional request-processing packages. + wsgi: Adds WSGI middleware to an Application's "pipeline". + These can only be declared in the app's root config ("/"). + checker: Controls the 'checker', which looks for common errors in + app state (including config) when the engine starts. + Global config only. + +The only key that does not exist in a namespace is the "environment" entry. +This special entry 'imports' other config entries from a template stored in +cherrypy._cpconfig.environments[environment]. It only applies to the global +config, and only when you use cherrypy.config.update. + +You can define your own namespaces to be called at the Global, Application, +or Request level, by adding a named handler to cherrypy.config.namespaces, +app.namespaces, or app.request_class.namespaces. The name can +be any string, and the handler must be either a callable or a (Python 2.5 +style) context manager. +""" + +try: + set +except NameError: + from sets import Set as set + +import cherrypy +from cherrypy.lib import reprconf + +# Deprecated in CherryPy 3.2--remove in 3.3 +NamespaceSet = reprconf.NamespaceSet + +def merge(base, other): + """Merge one app config (from a dict, file, or filename) into another. + + If the given config is a filename, it will be appended to + the list of files to monitor for "autoreload" changes. + """ + if isinstance(other, basestring): + cherrypy.engine.autoreload.files.add(other) + + # Load other into base + for section, value_map in reprconf.as_dict(other).items(): + if not isinstance(value_map, dict): + raise ValueError( + "Application config must include section headers, but the " + "config you tried to merge doesn't have any sections. " + "Wrap your config in another dict with paths as section " + "headers, for example: {'/': config}.") + base.setdefault(section, {}).update(value_map) + + +class Config(reprconf.Config): + """The 'global' configuration data for the entire CherryPy process.""" + + def update(self, config): + """Update self from a dict, file or filename.""" + if isinstance(config, basestring): + # Filename + cherrypy.engine.autoreload.files.add(config) + reprconf.Config.update(self, config) + + def _apply(self, config): + """Update self from a dict.""" + if isinstance(config.get("global", None), dict): + if len(config) > 1: + cherrypy.checker.global_config_contained_paths = True + config = config["global"] + if 'tools.staticdir.dir' in config: + config['tools.staticdir.section'] = "global" + reprconf.Config._apply(self, config) + + def __call__(self, *args, **kwargs): + """Decorator for page handlers to set _cp_config.""" + if args: + raise TypeError( + "The cherrypy.config decorator does not accept positional " + "arguments; you must use keyword arguments.") + def tool_decorator(f): + if not hasattr(f, "_cp_config"): + f._cp_config = {} + for k, v in kwargs.items(): + f._cp_config[k] = v + return f + return tool_decorator + + +Config.environments = environments = { + "staging": { + 'engine.autoreload_on': False, + 'checker.on': False, + 'tools.log_headers.on': False, + 'request.show_tracebacks': False, + 'request.show_mismatched_params': False, + }, + "production": { + 'engine.autoreload_on': False, + 'checker.on': False, + 'tools.log_headers.on': False, + 'request.show_tracebacks': False, + 'request.show_mismatched_params': False, + 'log.screen': False, + }, + "embedded": { + # For use with CherryPy embedded in another deployment stack. + 'engine.autoreload_on': False, + 'checker.on': False, + 'tools.log_headers.on': False, + 'request.show_tracebacks': False, + 'request.show_mismatched_params': False, + 'log.screen': False, + 'engine.SIGHUP': None, + 'engine.SIGTERM': None, + }, + "test_suite": { + 'engine.autoreload_on': False, + 'checker.on': False, + 'tools.log_headers.on': False, + 'request.show_tracebacks': True, + 'request.show_mismatched_params': True, + 'log.screen': False, + }, + } + + +def _server_namespace_handler(k, v): + """Config handler for the "server" namespace.""" + atoms = k.split(".", 1) + if len(atoms) > 1: + # Special-case config keys of the form 'server.servername.socket_port' + # to configure additional HTTP servers. + if not hasattr(cherrypy, "servers"): + cherrypy.servers = {} + + servername, k = atoms + if servername not in cherrypy.servers: + from cherrypy import _cpserver + cherrypy.servers[servername] = _cpserver.Server() + # On by default, but 'on = False' can unsubscribe it (see below). + cherrypy.servers[servername].subscribe() + + if k == 'on': + if v: + cherrypy.servers[servername].subscribe() + else: + cherrypy.servers[servername].unsubscribe() + else: + setattr(cherrypy.servers[servername], k, v) + else: + setattr(cherrypy.server, k, v) +Config.namespaces["server"] = _server_namespace_handler + +def _engine_namespace_handler(k, v): + """Backward compatibility handler for the "engine" namespace.""" + engine = cherrypy.engine + if k == 'autoreload_on': + if v: + engine.autoreload.subscribe() + else: + engine.autoreload.unsubscribe() + elif k == 'autoreload_frequency': + engine.autoreload.frequency = v + elif k == 'autoreload_match': + engine.autoreload.match = v + elif k == 'reload_files': + engine.autoreload.files = set(v) + elif k == 'deadlock_poll_freq': + engine.timeout_monitor.frequency = v + elif k == 'SIGHUP': + engine.listeners['SIGHUP'] = set([v]) + elif k == 'SIGTERM': + engine.listeners['SIGTERM'] = set([v]) + elif "." in k: + plugin, attrname = k.split(".", 1) + plugin = getattr(engine, plugin) + if attrname == 'on': + if v and hasattr(getattr(plugin, 'subscribe', None), '__call__'): + plugin.subscribe() + return + elif (not v) and hasattr(getattr(plugin, 'unsubscribe', None), '__call__'): + plugin.unsubscribe() + return + setattr(plugin, attrname, v) + else: + setattr(engine, k, v) +Config.namespaces["engine"] = _engine_namespace_handler + + +def _tree_namespace_handler(k, v): + """Namespace handler for the 'tree' config namespace.""" + cherrypy.tree.graft(v, v.script_name) + cherrypy.engine.log("Mounted: %s on %s" % (v, v.script_name or "/")) +Config.namespaces["tree"] = _tree_namespace_handler + + diff --git a/cherrypy/_cpdispatch.py b/cherrypy/_cpdispatch.py new file mode 100644 index 00000000..f1d10b8a --- /dev/null +++ b/cherrypy/_cpdispatch.py @@ -0,0 +1,568 @@ +"""CherryPy dispatchers. + +A 'dispatcher' is the object which looks up the 'page handler' callable +and collects config for the current request based on the path_info, other +request attributes, and the application architecture. The core calls the +dispatcher as early as possible, passing it a 'path_info' argument. + +The default dispatcher discovers the page handler by matching path_info +to a hierarchical arrangement of objects, starting at request.app.root. +""" + +import cherrypy + + +class PageHandler(object): + """Callable which sets response.body.""" + + def __init__(self, callable, *args, **kwargs): + self.callable = callable + self.args = args + self.kwargs = kwargs + + def __call__(self): + try: + return self.callable(*self.args, **self.kwargs) + except TypeError, x: + try: + test_callable_spec(self.callable, self.args, self.kwargs) + except cherrypy.HTTPError, error: + raise error + except: + raise x + raise + + +def test_callable_spec(callable, callable_args, callable_kwargs): + """ + Inspect callable and test to see if the given args are suitable for it. + + When an error occurs during the handler's invoking stage there are 2 + erroneous cases: + 1. Too many parameters passed to a function which doesn't define + one of *args or **kwargs. + 2. Too little parameters are passed to the function. + + There are 3 sources of parameters to a cherrypy handler. + 1. query string parameters are passed as keyword parameters to the handler. + 2. body parameters are also passed as keyword parameters. + 3. when partial matching occurs, the final path atoms are passed as + positional args. + Both the query string and path atoms are part of the URI. If they are + incorrect, then a 404 Not Found should be raised. Conversely the body + parameters are part of the request; if they are invalid a 400 Bad Request. + """ + show_mismatched_params = getattr( + cherrypy.serving.request, 'show_mismatched_params', False) + try: + (args, varargs, varkw, defaults) = inspect.getargspec(callable) + except TypeError: + if isinstance(callable, object) and hasattr(callable, '__call__'): + (args, varargs, varkw, defaults) = inspect.getargspec(callable.__call__) + else: + # If it wasn't one of our own types, re-raise + # the original error + raise + + if args and args[0] == 'self': + args = args[1:] + + arg_usage = dict([(arg, 0,) for arg in args]) + vararg_usage = 0 + varkw_usage = 0 + extra_kwargs = set() + + for i, value in enumerate(callable_args): + try: + arg_usage[args[i]] += 1 + except IndexError: + vararg_usage += 1 + + for key in callable_kwargs.keys(): + try: + arg_usage[key] += 1 + except KeyError: + varkw_usage += 1 + extra_kwargs.add(key) + + # figure out which args have defaults. + args_with_defaults = args[-len(defaults or []):] + for i, val in enumerate(defaults or []): + # Defaults take effect only when the arg hasn't been used yet. + if arg_usage[args_with_defaults[i]] == 0: + arg_usage[args_with_defaults[i]] += 1 + + missing_args = [] + multiple_args = [] + for key, usage in arg_usage.items(): + if usage == 0: + missing_args.append(key) + elif usage > 1: + multiple_args.append(key) + + if missing_args: + # In the case where the method allows body arguments + # there are 3 potential errors: + # 1. not enough query string parameters -> 404 + # 2. not enough body parameters -> 400 + # 3. not enough path parts (partial matches) -> 404 + # + # We can't actually tell which case it is, + # so I'm raising a 404 because that covers 2/3 of the + # possibilities + # + # In the case where the method does not allow body + # arguments it's definitely a 404. + message = None + if show_mismatched_params: + message = "Missing parameters: %s" % ",".join(missing_args) + raise cherrypy.HTTPError(404, message=message) + + # the extra positional arguments come from the path - 404 Not Found + if not varargs and vararg_usage > 0: + raise cherrypy.HTTPError(404) + + body_params = cherrypy.serving.request.body.params or {} + body_params = set(body_params.keys()) + qs_params = set(callable_kwargs.keys()) - body_params + + if multiple_args: + if qs_params.intersection(set(multiple_args)): + # If any of the multiple parameters came from the query string then + # it's a 404 Not Found + error = 404 + else: + # Otherwise it's a 400 Bad Request + error = 400 + + message = None + if show_mismatched_params: + message = "Multiple values for parameters: "\ + "%s" % ",".join(multiple_args) + raise cherrypy.HTTPError(error, message=message) + + if not varkw and varkw_usage > 0: + + # If there were extra query string parameters, it's a 404 Not Found + extra_qs_params = set(qs_params).intersection(extra_kwargs) + if extra_qs_params: + message = None + if show_mismatched_params: + message = "Unexpected query string "\ + "parameters: %s" % ", ".join(extra_qs_params) + raise cherrypy.HTTPError(404, message=message) + + # If there were any extra body parameters, it's a 400 Not Found + extra_body_params = set(body_params).intersection(extra_kwargs) + if extra_body_params: + message = None + if show_mismatched_params: + message = "Unexpected body parameters: "\ + "%s" % ", ".join(extra_body_params) + raise cherrypy.HTTPError(400, message=message) + + +try: + import inspect +except ImportError: + test_callable_spec = lambda callable, args, kwargs: None + + + +class LateParamPageHandler(PageHandler): + """When passing cherrypy.request.params to the page handler, we do not + want to capture that dict too early; we want to give tools like the + decoding tool a chance to modify the params dict in-between the lookup + of the handler and the actual calling of the handler. This subclass + takes that into account, and allows request.params to be 'bound late' + (it's more complicated than that, but that's the effect). + """ + + def _get_kwargs(self): + kwargs = cherrypy.serving.request.params.copy() + if self._kwargs: + kwargs.update(self._kwargs) + return kwargs + + def _set_kwargs(self, kwargs): + self._kwargs = kwargs + + kwargs = property(_get_kwargs, _set_kwargs, + doc='page handler kwargs (with ' + 'cherrypy.request.params copied in)') + + +class Dispatcher(object): + """CherryPy Dispatcher which walks a tree of objects to find a handler. + + The tree is rooted at cherrypy.request.app.root, and each hierarchical + component in the path_info argument is matched to a corresponding nested + attribute of the root object. Matching handlers must have an 'exposed' + attribute which evaluates to True. The special method name "index" + matches a URI which ends in a slash ("/"). The special method name + "default" may match a portion of the path_info (but only when no longer + substring of the path_info matches some other object). + + This is the default, built-in dispatcher for CherryPy. + """ + __metaclass__ = cherrypy._AttributeDocstrings + + dispatch_method_name = '_cp_dispatch' + dispatch_method_name__doc = """ + The name of the dispatch method that nodes may optionally implement + to provide their own dynamic dispatch algorithm. + """ + + def __init__(self, dispatch_method_name=None): + if dispatch_method_name: + self.dispatch_method_name = dispatch_method_name + + def __call__(self, path_info): + """Set handler and config for the current request.""" + request = cherrypy.serving.request + func, vpath = self.find_handler(path_info) + + if func: + # Decode any leftover %2F in the virtual_path atoms. + vpath = [x.replace("%2F", "/") for x in vpath] + request.handler = LateParamPageHandler(func, *vpath) + else: + request.handler = cherrypy.NotFound() + + def find_handler(self, path): + """Return the appropriate page handler, plus any virtual path. + + This will return two objects. The first will be a callable, + which can be used to generate page output. Any parameters from + the query string or request body will be sent to that callable + as keyword arguments. + + The callable is found by traversing the application's tree, + starting from cherrypy.request.app.root, and matching path + components to successive objects in the tree. For example, the + URL "/path/to/handler" might return root.path.to.handler. + + The second object returned will be a list of names which are + 'virtual path' components: parts of the URL which are dynamic, + and were not used when looking up the handler. + These virtual path components are passed to the handler as + positional arguments. + """ + request = cherrypy.serving.request + app = request.app + root = app.root + dispatch_name = self.dispatch_method_name + + # Get config for the root object/path. + curpath = "" + nodeconf = {} + if hasattr(root, "_cp_config"): + nodeconf.update(root._cp_config) + if "/" in app.config: + nodeconf.update(app.config["/"]) + object_trail = [['root', root, nodeconf, curpath]] + + node = root + names = [x for x in path.strip('/').split('/') if x] + ['index'] + iternames = names[:] + while iternames: + name = iternames[0] + # map to legal Python identifiers (replace '.' with '_') + objname = name.replace('.', '_') + + nodeconf = {} + subnode = getattr(node, objname, None) + if subnode is None: + dispatch = getattr(node, dispatch_name, None) + if dispatch and callable(dispatch) and not \ + getattr(dispatch, 'exposed', False): + subnode = dispatch(vpath=iternames) + name = iternames.pop(0) + node = subnode + + if node is not None: + # Get _cp_config attached to this node. + if hasattr(node, "_cp_config"): + nodeconf.update(node._cp_config) + + # Mix in values from app.config for this path. + curpath = "/".join((curpath, name)) + if curpath in app.config: + nodeconf.update(app.config[curpath]) + + object_trail.append([name, node, nodeconf, curpath]) + + def set_conf(): + """Collapse all object_trail config into cherrypy.request.config.""" + base = cherrypy.config.copy() + # Note that we merge the config from each node + # even if that node was None. + for name, obj, conf, curpath in object_trail: + base.update(conf) + if 'tools.staticdir.dir' in conf: + base['tools.staticdir.section'] = curpath + return base + + # Try successive objects (reverse order) + num_candidates = len(object_trail) - 1 + for i in range(num_candidates, -1, -1): + + name, candidate, nodeconf, curpath = object_trail[i] + if candidate is None: + continue + + # Try a "default" method on the current leaf. + if hasattr(candidate, "default"): + defhandler = candidate.default + if getattr(defhandler, 'exposed', False): + # Insert any extra _cp_config from the default handler. + conf = getattr(defhandler, "_cp_config", {}) + object_trail.insert(i + 1, ["default", defhandler, conf, curpath]) + request.config = set_conf() + # See http://www.cherrypy.org/ticket/613 + request.is_index = path.endswith("/") + return defhandler, names[i:-1] + + # Uncomment the next line to restrict positional params to "default". + # if i < num_candidates - 2: continue + + # Try the current leaf. + if getattr(candidate, 'exposed', False): + request.config = set_conf() + if i == num_candidates: + # We found the extra ".index". Mark request so tools + # can redirect if path_info has no trailing slash. + request.is_index = True + else: + # We're not at an 'index' handler. Mark request so tools + # can redirect if path_info has NO trailing slash. + # Note that this also includes handlers which take + # positional parameters (virtual paths). + request.is_index = False + return candidate, names[i:-1] + + # We didn't find anything + request.config = set_conf() + return None, [] + + +class MethodDispatcher(Dispatcher): + """Additional dispatch based on cherrypy.request.method.upper(). + + Methods named GET, POST, etc will be called on an exposed class. + The method names must be all caps; the appropriate Allow header + will be output showing all capitalized method names as allowable + HTTP verbs. + + Note that the containing class must be exposed, not the methods. + """ + + def __call__(self, path_info): + """Set handler and config for the current request.""" + request = cherrypy.serving.request + resource, vpath = self.find_handler(path_info) + + if resource: + # Set Allow header + avail = [m for m in dir(resource) if m.isupper()] + if "GET" in avail and "HEAD" not in avail: + avail.append("HEAD") + avail.sort() + cherrypy.serving.response.headers['Allow'] = ", ".join(avail) + + # Find the subhandler + meth = request.method.upper() + func = getattr(resource, meth, None) + if func is None and meth == "HEAD": + func = getattr(resource, "GET", None) + if func: + # Grab any _cp_config on the subhandler. + if hasattr(func, "_cp_config"): + request.config.update(func._cp_config) + + # Decode any leftover %2F in the virtual_path atoms. + vpath = [x.replace("%2F", "/") for x in vpath] + request.handler = LateParamPageHandler(func, *vpath) + else: + request.handler = cherrypy.HTTPError(405) + else: + request.handler = cherrypy.NotFound() + + +class RoutesDispatcher(object): + """A Routes based dispatcher for CherryPy.""" + + def __init__(self, full_result=False): + """ + Routes dispatcher + + Set full_result to True if you wish the controller + and the action to be passed on to the page handler + parameters. By default they won't be. + """ + import routes + self.full_result = full_result + self.controllers = {} + self.mapper = routes.Mapper() + self.mapper.controller_scan = self.controllers.keys + + def connect(self, name, route, controller, **kwargs): + self.controllers[name] = controller + self.mapper.connect(name, route, controller=name, **kwargs) + + def redirect(self, url): + raise cherrypy.HTTPRedirect(url) + + def __call__(self, path_info): + """Set handler and config for the current request.""" + func = self.find_handler(path_info) + if func: + cherrypy.serving.request.handler = LateParamPageHandler(func) + else: + cherrypy.serving.request.handler = cherrypy.NotFound() + + def find_handler(self, path_info): + """Find the right page handler, and set request.config.""" + import routes + + request = cherrypy.serving.request + + config = routes.request_config() + config.mapper = self.mapper + if hasattr(request, 'wsgi_environ'): + config.environ = request.wsgi_environ + config.host = request.headers.get('Host', None) + config.protocol = request.scheme + config.redirect = self.redirect + + result = self.mapper.match(path_info) + + config.mapper_dict = result + params = {} + if result: + params = result.copy() + if not self.full_result: + params.pop('controller', None) + params.pop('action', None) + request.params.update(params) + + # Get config for the root object/path. + request.config = base = cherrypy.config.copy() + curpath = "" + + def merge(nodeconf): + if 'tools.staticdir.dir' in nodeconf: + nodeconf['tools.staticdir.section'] = curpath or "/" + base.update(nodeconf) + + app = request.app + root = app.root + if hasattr(root, "_cp_config"): + merge(root._cp_config) + if "/" in app.config: + merge(app.config["/"]) + + # Mix in values from app.config. + atoms = [x for x in path_info.split("/") if x] + if atoms: + last = atoms.pop() + else: + last = None + for atom in atoms: + curpath = "/".join((curpath, atom)) + if curpath in app.config: + merge(app.config[curpath]) + + handler = None + if result: + controller = result.get('controller', None) + controller = self.controllers.get(controller) + if controller: + # Get config from the controller. + if hasattr(controller, "_cp_config"): + merge(controller._cp_config) + + action = result.get('action', None) + if action is not None: + handler = getattr(controller, action, None) + # Get config from the handler + if hasattr(handler, "_cp_config"): + merge(handler._cp_config) + + # Do the last path atom here so it can + # override the controller's _cp_config. + if last: + curpath = "/".join((curpath, last)) + if curpath in app.config: + merge(app.config[curpath]) + + return handler + + +def XMLRPCDispatcher(next_dispatcher=Dispatcher()): + from cherrypy.lib import xmlrpc + def xmlrpc_dispatch(path_info): + path_info = xmlrpc.patched_path(path_info) + return next_dispatcher(path_info) + return xmlrpc_dispatch + + +def VirtualHost(next_dispatcher=Dispatcher(), use_x_forwarded_host=True, **domains): + """Select a different handler based on the Host header. + + This can be useful when running multiple sites within one CP server. + It allows several domains to point to different parts of a single + website structure. For example: + + http://www.domain.example -> root + http://www.domain2.example -> root/domain2/ + http://www.domain2.example:443 -> root/secure + + can be accomplished via the following config: + + [/] + request.dispatch = cherrypy.dispatch.VirtualHost( + **{'www.domain2.example': '/domain2', + 'www.domain2.example:443': '/secure', + }) + + next_dispatcher: the next dispatcher object in the dispatch chain. + The VirtualHost dispatcher adds a prefix to the URL and calls + another dispatcher. Defaults to cherrypy.dispatch.Dispatcher(). + + use_x_forwarded_host: if True (the default), any "X-Forwarded-Host" + request header will be used instead of the "Host" header. This + is commonly added by HTTP servers (such as Apache) when proxying. + + **domains: a dict of {host header value: virtual prefix} pairs. + The incoming "Host" request header is looked up in this dict, + and, if a match is found, the corresponding "virtual prefix" + value will be prepended to the URL path before calling the + next dispatcher. Note that you often need separate entries + for "example.com" and "www.example.com". In addition, "Host" + headers may contain the port number. + """ + from cherrypy.lib import httputil + def vhost_dispatch(path_info): + request = cherrypy.serving.request + header = request.headers.get + + domain = header('Host', '') + if use_x_forwarded_host: + domain = header("X-Forwarded-Host", domain) + + prefix = domains.get(domain, "") + if prefix: + path_info = httputil.urljoin(prefix, path_info) + + result = next_dispatcher(path_info) + + # Touch up staticdir config. See http://www.cherrypy.org/ticket/614. + section = request.config.get('tools.staticdir.section') + if section: + section = section[len(prefix):] + request.config['tools.staticdir.section'] = section + + return result + return vhost_dispatch + diff --git a/cherrypy/_cperror.py b/cherrypy/_cperror.py new file mode 100644 index 00000000..308086e5 --- /dev/null +++ b/cherrypy/_cperror.py @@ -0,0 +1,396 @@ +"""Error classes for CherryPy.""" + +from cgi import escape as _escape +from sys import exc_info as _exc_info +from traceback import format_exception as _format_exception +from urlparse import urljoin as _urljoin +from cherrypy.lib import httputil as _httputil + + +class CherryPyException(Exception): + pass + + +class TimeoutError(CherryPyException): + """Exception raised when Response.timed_out is detected.""" + pass + + +class InternalRedirect(CherryPyException): + """Exception raised to switch to the handler for a different URL. + + Any request.params must be supplied in a query string. + """ + + def __init__(self, path, query_string=""): + import cherrypy + self.request = cherrypy.serving.request + + self.query_string = query_string + if "?" in path: + # Separate any params included in the path + path, self.query_string = path.split("?", 1) + + # Note that urljoin will "do the right thing" whether url is: + # 1. a URL relative to root (e.g. "/dummy") + # 2. a URL relative to the current path + # Note that any query string will be discarded. + path = _urljoin(self.request.path_info, path) + + # Set a 'path' member attribute so that code which traps this + # error can have access to it. + self.path = path + + CherryPyException.__init__(self, path, self.query_string) + + +class HTTPRedirect(CherryPyException): + """Exception raised when the request should be redirected. + + The new URL must be passed as the first argument to the Exception, + e.g., HTTPRedirect(newUrl). Multiple URLs are allowed. If a URL is + absolute, it will be used as-is. If it is relative, it is assumed + to be relative to the current cherrypy.request.path_info. + """ + + def __init__(self, urls, status=None): + import cherrypy + request = cherrypy.serving.request + + if isinstance(urls, basestring): + urls = [urls] + + abs_urls = [] + for url in urls: + # Note that urljoin will "do the right thing" whether url is: + # 1. a complete URL with host (e.g. "http://www.example.com/test") + # 2. a URL relative to root (e.g. "/dummy") + # 3. a URL relative to the current path + # Note that any query string in cherrypy.request is discarded. + url = _urljoin(cherrypy.url(), url) + abs_urls.append(url) + self.urls = abs_urls + + # RFC 2616 indicates a 301 response code fits our goal; however, + # browser support for 301 is quite messy. Do 302/303 instead. See + # http://www.alanflavell.org.uk/www/post-redirect.html + if status is None: + if request.protocol >= (1, 1): + status = 303 + else: + status = 302 + else: + status = int(status) + if status < 300 or status > 399: + raise ValueError("status must be between 300 and 399.") + + self.status = status + CherryPyException.__init__(self, abs_urls, status) + + def set_response(self): + """Modify cherrypy.response status, headers, and body to represent self. + + CherryPy uses this internally, but you can also use it to create an + HTTPRedirect object and set its output without *raising* the exception. + """ + import cherrypy + response = cherrypy.serving.response + response.status = status = self.status + + if status in (300, 301, 302, 303, 307): + response.headers['Content-Type'] = "text/html;charset=utf-8" + # "The ... URI SHOULD be given by the Location field + # in the response." + response.headers['Location'] = self.urls[0] + + # "Unless the request method was HEAD, the entity of the response + # SHOULD contain a short hypertext note with a hyperlink to the + # new URI(s)." + msg = {300: "This resource can be found at %s.", + 301: "This resource has permanently moved to %s.", + 302: "This resource resides temporarily at %s.", + 303: "This resource can be found at %s.", + 307: "This resource has moved temporarily to %s.", + }[status] + msgs = [msg % (u, u) for u in self.urls] + response.body = "
\n".join(msgs) + # Previous code may have set C-L, so we have to reset it + # (allow finalize to set it). + response.headers.pop('Content-Length', None) + elif status == 304: + # Not Modified. + # "The response MUST include the following header fields: + # Date, unless its omission is required by section 14.18.1" + # The "Date" header should have been set in Response.__init__ + + # "...the response SHOULD NOT include other entity-headers." + for key in ('Allow', 'Content-Encoding', 'Content-Language', + 'Content-Length', 'Content-Location', 'Content-MD5', + 'Content-Range', 'Content-Type', 'Expires', + 'Last-Modified'): + if key in response.headers: + del response.headers[key] + + # "The 304 response MUST NOT contain a message-body." + response.body = None + # Previous code may have set C-L, so we have to reset it. + response.headers.pop('Content-Length', None) + elif status == 305: + # Use Proxy. + # self.urls[0] should be the URI of the proxy. + response.headers['Location'] = self.urls[0] + response.body = None + # Previous code may have set C-L, so we have to reset it. + response.headers.pop('Content-Length', None) + else: + raise ValueError("The %s status code is unknown." % status) + + def __call__(self): + """Use this exception as a request.handler (raise self).""" + raise self + + +def clean_headers(status): + """Remove any headers which should not apply to an error response.""" + import cherrypy + + response = cherrypy.serving.response + + # Remove headers which applied to the original content, + # but do not apply to the error page. + respheaders = response.headers + for key in ["Accept-Ranges", "Age", "ETag", "Location", "Retry-After", + "Vary", "Content-Encoding", "Content-Length", "Expires", + "Content-Location", "Content-MD5", "Last-Modified"]: + if key in respheaders: + del respheaders[key] + + if status != 416: + # A server sending a response with status code 416 (Requested + # range not satisfiable) SHOULD include a Content-Range field + # with a byte-range-resp-spec of "*". The instance-length + # specifies the current length of the selected resource. + # A response with status code 206 (Partial Content) MUST NOT + # include a Content-Range field with a byte-range- resp-spec of "*". + if "Content-Range" in respheaders: + del respheaders["Content-Range"] + + +class HTTPError(CherryPyException): + """ Exception used to return an HTTP error code (4xx-5xx) to the client. + This exception will automatically set the response status and body. + + A custom message (a long description to display in the browser) + can be provided in place of the default. + """ + + def __init__(self, status=500, message=None): + self.status = status + try: + self.code, self.reason, defaultmsg = _httputil.valid_status(status) + except ValueError, x: + raise self.__class__(500, x.args[0]) + + if self.code < 400 or self.code > 599: + raise ValueError("status must be between 400 and 599.") + + # See http://www.python.org/dev/peps/pep-0352/ + # self.message = message + self._message = message or defaultmsg + CherryPyException.__init__(self, status, message) + + def set_response(self): + """Modify cherrypy.response status, headers, and body to represent self. + + CherryPy uses this internally, but you can also use it to create an + HTTPError object and set its output without *raising* the exception. + """ + import cherrypy + + response = cherrypy.serving.response + + clean_headers(self.code) + + # In all cases, finalize will be called after this method, + # so don't bother cleaning up response values here. + response.status = self.status + tb = None + if cherrypy.serving.request.show_tracebacks: + tb = format_exc() + response.headers['Content-Type'] = "text/html;charset=utf-8" + response.headers.pop('Content-Length', None) + + content = self.get_error_page(self.status, traceback=tb, + message=self._message) + response.body = content + + _be_ie_unfriendly(self.code) + + def get_error_page(self, *args, **kwargs): + return get_error_page(*args, **kwargs) + + def __call__(self): + """Use this exception as a request.handler (raise self).""" + raise self + + +class NotFound(HTTPError): + """Exception raised when a URL could not be mapped to any handler (404).""" + + def __init__(self, path=None): + if path is None: + import cherrypy + request = cherrypy.serving.request + path = request.script_name + request.path_info + self.args = (path,) + HTTPError.__init__(self, 404, "The path '%s' was not found." % path) + + +_HTTPErrorTemplate = ''' + + + + %(status)s + + + +

%(status)s

+

%(message)s

+
%(traceback)s
+
+ Powered by CherryPy %(version)s +
+ + +''' + +def get_error_page(status, **kwargs): + """Return an HTML page, containing a pretty error response. + + status should be an int or a str. + kwargs will be interpolated into the page template. + """ + import cherrypy + + try: + code, reason, message = _httputil.valid_status(status) + except ValueError, x: + raise cherrypy.HTTPError(500, x.args[0]) + + # We can't use setdefault here, because some + # callers send None for kwarg values. + if kwargs.get('status') is None: + kwargs['status'] = "%s %s" % (code, reason) + if kwargs.get('message') is None: + kwargs['message'] = message + if kwargs.get('traceback') is None: + kwargs['traceback'] = '' + if kwargs.get('version') is None: + kwargs['version'] = cherrypy.__version__ + + for k, v in kwargs.iteritems(): + if v is None: + kwargs[k] = "" + else: + kwargs[k] = _escape(kwargs[k]) + + # Use a custom template or callable for the error page? + pages = cherrypy.serving.request.error_page + error_page = pages.get(code) or pages.get('default') + if error_page: + try: + if callable(error_page): + return error_page(**kwargs) + else: + return open(error_page, 'rb').read() % kwargs + except: + e = _format_exception(*_exc_info())[-1] + m = kwargs['message'] + if m: + m += "
" + m += "In addition, the custom error page failed:\n
%s" % e + kwargs['message'] = m + + return _HTTPErrorTemplate % kwargs + + +_ie_friendly_error_sizes = { + 400: 512, 403: 256, 404: 512, 405: 256, + 406: 512, 408: 512, 409: 512, 410: 256, + 500: 512, 501: 512, 505: 512, + } + + +def _be_ie_unfriendly(status): + import cherrypy + response = cherrypy.serving.response + + # For some statuses, Internet Explorer 5+ shows "friendly error + # messages" instead of our response.body if the body is smaller + # than a given size. Fix this by returning a body over that size + # (by adding whitespace). + # See http://support.microsoft.com/kb/q218155/ + s = _ie_friendly_error_sizes.get(status, 0) + if s: + s += 1 + # Since we are issuing an HTTP error status, we assume that + # the entity is short, and we should just collapse it. + content = response.collapse_body() + l = len(content) + if l and l < s: + # IN ADDITION: the response must be written to IE + # in one chunk or it will still get replaced! Bah. + content = content + (" " * (s - l)) + response.body = content + response.headers[u'Content-Length'] = str(len(content)) + + +def format_exc(exc=None): + """Return exc (or sys.exc_info if None), formatted.""" + if exc is None: + exc = _exc_info() + if exc == (None, None, None): + return "" + import traceback + return "".join(traceback.format_exception(*exc)) + +def bare_error(extrabody=None): + """Produce status, headers, body for a critical error. + + Returns a triple without calling any other questionable functions, + so it should be as error-free as possible. Call it from an HTTP server + if you get errors outside of the request. + + If extrabody is None, a friendly but rather unhelpful error message + is set in the body. If extrabody is a string, it will be appended + as-is to the body. + """ + + # The whole point of this function is to be a last line-of-defense + # in handling errors. That is, it must not raise any errors itself; + # it cannot be allowed to fail. Therefore, don't add to it! + # In particular, don't call any other CP functions. + + body = "Unrecoverable error in the server." + if extrabody is not None: + if not isinstance(extrabody, str): + extrabody = extrabody.encode('utf-8') + body += "\n" + extrabody + + return ("500 Internal Server Error", + [('Content-Type', 'text/plain'), + ('Content-Length', str(len(body)))], + [body]) + + diff --git a/cherrypy/_cplogging.py b/cherrypy/_cplogging.py new file mode 100644 index 00000000..3935d24f --- /dev/null +++ b/cherrypy/_cplogging.py @@ -0,0 +1,250 @@ +"""CherryPy logging.""" + +import datetime +import logging +# Silence the no-handlers "warning" (stderr write!) in stdlib logging +logging.Logger.manager.emittedNoHandlerWarning = 1 +logfmt = logging.Formatter("%(message)s") +import os +import sys + +import cherrypy +from cherrypy import _cperror + + +class LogManager(object): + + appid = None + error_log = None + access_log = None + access_log_format = \ + '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' + + def __init__(self, appid=None, logger_root="cherrypy"): + self.logger_root = logger_root + self.appid = appid + if appid is None: + self.error_log = logging.getLogger("%s.error" % logger_root) + self.access_log = logging.getLogger("%s.access" % logger_root) + else: + self.error_log = logging.getLogger("%s.error.%s" % (logger_root, appid)) + self.access_log = logging.getLogger("%s.access.%s" % (logger_root, appid)) + self.error_log.setLevel(logging.INFO) + self.access_log.setLevel(logging.INFO) + cherrypy.engine.subscribe('graceful', self.reopen_files) + + def reopen_files(self): + """Close and reopen all file handlers.""" + for log in (self.error_log, self.access_log): + for h in log.handlers: + if isinstance(h, logging.FileHandler): + h.acquire() + h.stream.close() + h.stream = open(h.baseFilename, h.mode) + h.release() + + def error(self, msg='', context='', severity=logging.INFO, traceback=False): + """Write to the error log. + + This is not just for errors! Applications may call this at any time + to log application-specific information. + """ + if traceback: + msg += _cperror.format_exc() + self.error_log.log(severity, ' '.join((self.time(), context, msg))) + + def __call__(self, *args, **kwargs): + """Write to the error log. + + This is not just for errors! Applications may call this at any time + to log application-specific information. + """ + return self.error(*args, **kwargs) + + def access(self): + """Write to the access log (in Apache/NCSA Combined Log format). + + Like Apache started doing in 2.0.46, non-printable and other special + characters in %r (and we expand that to all parts) are escaped using + \\xhh sequences, where hh stands for the hexadecimal representation + of the raw byte. Exceptions from this rule are " and \\, which are + escaped by prepending a backslash, and all whitespace characters, + which are written in their C-style notation (\\n, \\t, etc). + """ + request = cherrypy.serving.request + remote = request.remote + response = cherrypy.serving.response + outheaders = response.headers + inheaders = request.headers + if response.output_status is None: + status = "-" + else: + status = response.output_status.split(" ", 1)[0] + + atoms = {'h': remote.name or remote.ip, + 'l': '-', + 'u': getattr(request, "login", None) or "-", + 't': self.time(), + 'r': request.request_line, + 's': status, + 'b': dict.get(outheaders, 'Content-Length', '') or "-", + 'f': dict.get(inheaders, 'Referer', ''), + 'a': dict.get(inheaders, 'User-Agent', ''), + } + for k, v in atoms.items(): + if isinstance(v, unicode): + v = v.encode('utf8') + elif not isinstance(v, str): + v = str(v) + # Fortunately, repr(str) escapes unprintable chars, \n, \t, etc + # and backslash for us. All we have to do is strip the quotes. + v = repr(v)[1:-1] + # Escape double-quote. + atoms[k] = v.replace('"', '\\"') + + try: + self.access_log.log(logging.INFO, self.access_log_format % atoms) + except: + self(traceback=True) + + def time(self): + """Return now() in Apache Common Log Format (no timezone).""" + now = datetime.datetime.now() + monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', + 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'] + month = monthnames[now.month - 1].capitalize() + return ('[%02d/%s/%04d:%02d:%02d:%02d]' % + (now.day, month, now.year, now.hour, now.minute, now.second)) + + def _get_builtin_handler(self, log, key): + for h in log.handlers: + if getattr(h, "_cpbuiltin", None) == key: + return h + + + # ------------------------- Screen handlers ------------------------- # + + def _set_screen_handler(self, log, enable, stream=None): + h = self._get_builtin_handler(log, "screen") + if enable: + if not h: + if stream is None: + stream = sys.stderr + h = logging.StreamHandler(stream) + h.setFormatter(logfmt) + h._cpbuiltin = "screen" + log.addHandler(h) + elif h: + log.handlers.remove(h) + + def _get_screen(self): + h = self._get_builtin_handler + has_h = h(self.error_log, "screen") or h(self.access_log, "screen") + return bool(has_h) + + def _set_screen(self, newvalue): + self._set_screen_handler(self.error_log, newvalue, stream=sys.stderr) + self._set_screen_handler(self.access_log, newvalue, stream=sys.stdout) + screen = property(_get_screen, _set_screen, + doc="If True, error and access will print to stderr.") + + + # -------------------------- File handlers -------------------------- # + + def _add_builtin_file_handler(self, log, fname): + h = logging.FileHandler(fname) + h.setFormatter(logfmt) + h._cpbuiltin = "file" + log.addHandler(h) + + def _set_file_handler(self, log, filename): + h = self._get_builtin_handler(log, "file") + if filename: + if h: + if h.baseFilename != os.path.abspath(filename): + h.close() + log.handlers.remove(h) + self._add_builtin_file_handler(log, filename) + else: + self._add_builtin_file_handler(log, filename) + else: + if h: + h.close() + log.handlers.remove(h) + + def _get_error_file(self): + h = self._get_builtin_handler(self.error_log, "file") + if h: + return h.baseFilename + return '' + def _set_error_file(self, newvalue): + self._set_file_handler(self.error_log, newvalue) + error_file = property(_get_error_file, _set_error_file, + doc="The filename for self.error_log.") + + def _get_access_file(self): + h = self._get_builtin_handler(self.access_log, "file") + if h: + return h.baseFilename + return '' + def _set_access_file(self, newvalue): + self._set_file_handler(self.access_log, newvalue) + access_file = property(_get_access_file, _set_access_file, + doc="The filename for self.access_log.") + + + # ------------------------- WSGI handlers ------------------------- # + + def _set_wsgi_handler(self, log, enable): + h = self._get_builtin_handler(log, "wsgi") + if enable: + if not h: + h = WSGIErrorHandler() + h.setFormatter(logfmt) + h._cpbuiltin = "wsgi" + log.addHandler(h) + elif h: + log.handlers.remove(h) + + def _get_wsgi(self): + return bool(self._get_builtin_handler(self.error_log, "wsgi")) + + def _set_wsgi(self, newvalue): + self._set_wsgi_handler(self.error_log, newvalue) + wsgi = property(_get_wsgi, _set_wsgi, + doc="If True, error messages will be sent to wsgi.errors.") + + +class WSGIErrorHandler(logging.Handler): + "A handler class which writes logging records to environ['wsgi.errors']." + + def flush(self): + """Flushes the stream.""" + try: + stream = cherrypy.serving.request.wsgi_environ.get('wsgi.errors') + except (AttributeError, KeyError): + pass + else: + stream.flush() + + def emit(self, record): + """Emit a record.""" + try: + stream = cherrypy.serving.request.wsgi_environ.get('wsgi.errors') + except (AttributeError, KeyError): + pass + else: + try: + msg = self.format(record) + fs = "%s\n" + import types + if not hasattr(types, "UnicodeType"): #if no unicode support... + stream.write(fs % msg) + else: + try: + stream.write(fs % msg) + except UnicodeError: + stream.write(fs % msg.encode("UTF-8")) + self.flush() + except: + self.handleError(record) diff --git a/cherrypy/_cpmodpy.py b/cherrypy/_cpmodpy.py new file mode 100644 index 00000000..c2a66db3 --- /dev/null +++ b/cherrypy/_cpmodpy.py @@ -0,0 +1,333 @@ +"""Native adapter for serving CherryPy via mod_python + +Basic usage: + +########################################## +# Application in a module called myapp.py +########################################## + +import cherrypy + +class Root: + @cherrypy.expose + def index(self): + return 'Hi there, Ho there, Hey there' + + +# We will use this method from the mod_python configuration +# as the entry point to our application +def setup_server(): + cherrypy.tree.mount(Root()) + cherrypy.config.update({'environment': 'production', + 'log.screen': False, + 'show_tracebacks': False}) + +########################################## +# mod_python settings for apache2 +# This should reside in your httpd.conf +# or a file that will be loaded at +# apache startup +########################################## + +# Start +DocumentRoot "/" +Listen 8080 +LoadModule python_module /usr/lib/apache2/modules/mod_python.so + + + PythonPath "sys.path+['/path/to/my/application']" + SetHandler python-program + PythonHandler cherrypy._cpmodpy::handler + PythonOption cherrypy.setup myapp::setup_server + PythonDebug On + +# End + +The actual path to your mod_python.so is dependent on your +environment. In this case we suppose a global mod_python +installation on a Linux distribution such as Ubuntu. + +We do set the PythonPath configuration setting so that +your application can be found by from the user running +the apache2 instance. Of course if your application +resides in the global site-package this won't be needed. + +Then restart apache2 and access http://127.0.0.1:8080 +""" + +import logging +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +import cherrypy +from cherrypy._cperror import format_exc, bare_error +from cherrypy.lib import httputil + + +# ------------------------------ Request-handling + + + +def setup(req): + from mod_python import apache + + # Run any setup functions defined by a "PythonOption cherrypy.setup" directive. + options = req.get_options() + if 'cherrypy.setup' in options: + for function in options['cherrypy.setup'].split(): + atoms = function.split('::', 1) + if len(atoms) == 1: + mod = __import__(atoms[0], globals(), locals()) + else: + modname, fname = atoms + mod = __import__(modname, globals(), locals(), [fname]) + func = getattr(mod, fname) + func() + + cherrypy.config.update({'log.screen': False, + "tools.ignore_headers.on": True, + "tools.ignore_headers.headers": ['Range'], + }) + + engine = cherrypy.engine + if hasattr(engine, "signal_handler"): + engine.signal_handler.unsubscribe() + if hasattr(engine, "console_control_handler"): + engine.console_control_handler.unsubscribe() + engine.autoreload.unsubscribe() + cherrypy.server.unsubscribe() + + def _log(msg, level): + newlevel = apache.APLOG_ERR + if logging.DEBUG >= level: + newlevel = apache.APLOG_DEBUG + elif logging.INFO >= level: + newlevel = apache.APLOG_INFO + elif logging.WARNING >= level: + newlevel = apache.APLOG_WARNING + # On Windows, req.server is required or the msg will vanish. See + # http://www.modpython.org/pipermail/mod_python/2003-October/014291.html. + # Also, "When server is not specified...LogLevel does not apply..." + apache.log_error(msg, newlevel, req.server) + engine.subscribe('log', _log) + + engine.start() + + def cherrypy_cleanup(data): + engine.exit() + try: + # apache.register_cleanup wasn't available until 3.1.4. + apache.register_cleanup(cherrypy_cleanup) + except AttributeError: + req.server.register_cleanup(req, cherrypy_cleanup) + + +class _ReadOnlyRequest: + expose = ('read', 'readline', 'readlines') + def __init__(self, req): + for method in self.expose: + self.__dict__[method] = getattr(req, method) + + +recursive = False + +_isSetUp = False +def handler(req): + from mod_python import apache + try: + global _isSetUp + if not _isSetUp: + setup(req) + _isSetUp = True + + # Obtain a Request object from CherryPy + local = req.connection.local_addr + local = httputil.Host(local[0], local[1], req.connection.local_host or "") + remote = req.connection.remote_addr + remote = httputil.Host(remote[0], remote[1], req.connection.remote_host or "") + + scheme = req.parsed_uri[0] or 'http' + req.get_basic_auth_pw() + + try: + # apache.mpm_query only became available in mod_python 3.1 + q = apache.mpm_query + threaded = q(apache.AP_MPMQ_IS_THREADED) + forked = q(apache.AP_MPMQ_IS_FORKED) + except AttributeError: + bad_value = ("You must provide a PythonOption '%s', " + "either 'on' or 'off', when running a version " + "of mod_python < 3.1") + + threaded = options.get('multithread', '').lower() + if threaded == 'on': + threaded = True + elif threaded == 'off': + threaded = False + else: + raise ValueError(bad_value % "multithread") + + forked = options.get('multiprocess', '').lower() + if forked == 'on': + forked = True + elif forked == 'off': + forked = False + else: + raise ValueError(bad_value % "multiprocess") + + sn = cherrypy.tree.script_name(req.uri or "/") + if sn is None: + send_response(req, '404 Not Found', [], '') + else: + app = cherrypy.tree.apps[sn] + method = req.method + path = req.uri + qs = req.args or "" + reqproto = req.protocol + headers = req.headers_in.items() + rfile = _ReadOnlyRequest(req) + prev = None + + try: + redirections = [] + while True: + request, response = app.get_serving(local, remote, scheme, + "HTTP/1.1") + request.login = req.user + request.multithread = bool(threaded) + request.multiprocess = bool(forked) + request.app = app + request.prev = prev + + # Run the CherryPy Request object and obtain the response + try: + request.run(method, path, qs, reqproto, headers, rfile) + break + except cherrypy.InternalRedirect, ir: + app.release_serving() + prev = request + + if not recursive: + if ir.path in redirections: + raise RuntimeError("InternalRedirector visited the " + "same URL twice: %r" % ir.path) + else: + # Add the *previous* path_info + qs to redirections. + if qs: + qs = "?" + qs + redirections.append(sn + path + qs) + + # Munge environment and try again. + method = "GET" + path = ir.path + qs = ir.query_string + rfile = StringIO() + + send_response(req, response.status, response.header_list, + response.body, response.stream) + finally: + app.release_serving() + except: + tb = format_exc() + cherrypy.log(tb, 'MOD_PYTHON', severity=logging.ERROR) + s, h, b = bare_error() + send_response(req, s, h, b) + return apache.OK + + +def send_response(req, status, headers, body, stream=False): + # Set response status + req.status = int(status[:3]) + + # Set response headers + req.content_type = "text/plain" + for header, value in headers: + if header.lower() == 'content-type': + req.content_type = value + continue + req.headers_out.add(header, value) + + if stream: + # Flush now so the status and headers are sent immediately. + req.flush() + + # Set response body + if isinstance(body, basestring): + req.write(body) + else: + for seg in body: + req.write(seg) + + + +# --------------- Startup tools for CherryPy + mod_python --------------- # + + +import os +import re + + +def read_process(cmd, args=""): + pipein, pipeout = os.popen4("%s %s" % (cmd, args)) + try: + firstline = pipeout.readline() + if (re.search(r"(not recognized|No such file|not found)", firstline, + re.IGNORECASE)): + raise IOError('%s must be on your system path.' % cmd) + output = firstline + pipeout.read() + finally: + pipeout.close() + return output + + +class ModPythonServer(object): + + template = """ +# Apache2 server configuration file for running CherryPy with mod_python. + +DocumentRoot "/" +Listen %(port)s +LoadModule python_module modules/mod_python.so + + + SetHandler python-program + PythonHandler %(handler)s + PythonDebug On +%(opts)s + +""" + + def __init__(self, loc="/", port=80, opts=None, apache_path="apache", + handler="cherrypy._cpmodpy::handler"): + self.loc = loc + self.port = port + self.opts = opts + self.apache_path = apache_path + self.handler = handler + + def start(self): + opts = "".join([" PythonOption %s %s\n" % (k, v) + for k, v in self.opts]) + conf_data = self.template % {"port": self.port, + "loc": self.loc, + "opts": opts, + "handler": self.handler, + } + + mpconf = os.path.join(os.path.dirname(__file__), "cpmodpy.conf") + f = open(mpconf, 'wb') + try: + f.write(conf_data) + finally: + f.close() + + response = read_process(self.apache_path, "-k start -f %s" % mpconf) + self.ready = True + return response + + def stop(self): + os.popen("apache -k stop") + self.ready = False + diff --git a/cherrypy/_cpnative_server.py b/cherrypy/_cpnative_server.py new file mode 100644 index 00000000..f71cdd5b --- /dev/null +++ b/cherrypy/_cpnative_server.py @@ -0,0 +1,150 @@ +"""Native adapter for serving CherryPy via its builtin server.""" + +import logging +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +import cherrypy +from cherrypy._cperror import format_exc, bare_error +from cherrypy.lib import httputil +from cherrypy import wsgiserver + + +class NativeGateway(wsgiserver.Gateway): + + recursive = False + + def respond(self): + req = self.req + try: + # Obtain a Request object from CherryPy + local = req.server.bind_addr + local = httputil.Host(local[0], local[1], "") + remote = req.conn.remote_addr, req.conn.remote_port + remote = httputil.Host(remote[0], remote[1], "") + + scheme = req.scheme + sn = cherrypy.tree.script_name(req.uri or "/") + if sn is None: + self.send_response('404 Not Found', [], ['']) + else: + app = cherrypy.tree.apps[sn] + method = req.method + path = req.path + qs = req.qs or "" + headers = req.inheaders.items() + rfile = req.rfile + prev = None + + try: + redirections = [] + while True: + request, response = app.get_serving( + local, remote, scheme, "HTTP/1.1") + request.multithread = True + request.multiprocess = False + request.app = app + request.prev = prev + + # Run the CherryPy Request object and obtain the response + try: + request.run(method, path, qs, req.request_protocol, headers, rfile) + break + except cherrypy.InternalRedirect, ir: + app.release_serving() + prev = request + + if not self.recursive: + if ir.path in redirections: + raise RuntimeError("InternalRedirector visited the " + "same URL twice: %r" % ir.path) + else: + # Add the *previous* path_info + qs to redirections. + if qs: + qs = "?" + qs + redirections.append(sn + path + qs) + + # Munge environment and try again. + method = "GET" + path = ir.path + qs = ir.query_string + rfile = StringIO() + + self.send_response( + response.output_status, response.header_list, + response.body) + finally: + app.release_serving() + except: + tb = format_exc() + #print tb + cherrypy.log(tb, 'NATIVE_ADAPTER', severity=logging.ERROR) + s, h, b = bare_error() + self.send_response(s, h, b) + + def send_response(self, status, headers, body): + req = self.req + + # Set response status + req.status = str(status or "500 Server Error") + + # Set response headers + for header, value in headers: + req.outheaders.append((header, value)) + if (req.ready and not req.sent_headers): + req.sent_headers = True + req.send_headers() + + # Set response body + for seg in body: + req.write(seg) + + +class CPHTTPServer(wsgiserver.HTTPServer): + """Wrapper for wsgiserver.HTTPServer. + + wsgiserver has been designed to not reference CherryPy in any way, + so that it can be used in other frameworks and applications. + Therefore, we wrap it here, so we can apply some attributes + from config -> cherrypy.server -> HTTPServer. + """ + + def __init__(self, server_adapter=cherrypy.server): + self.server_adapter = server_adapter + + server_name = (self.server_adapter.socket_host or + self.server_adapter.socket_file or + None) + + wsgiserver.HTTPServer.__init__( + self, server_adapter.bind_addr, NativeGateway, + minthreads=server_adapter.thread_pool, + maxthreads=server_adapter.thread_pool_max, + server_name=server_name) + + self.max_request_header_size = self.server_adapter.max_request_header_size or 0 + self.max_request_body_size = self.server_adapter.max_request_body_size or 0 + self.request_queue_size = self.server_adapter.socket_queue_size + self.timeout = self.server_adapter.socket_timeout + self.shutdown_timeout = self.server_adapter.shutdown_timeout + self.protocol = self.server_adapter.protocol_version + self.nodelay = self.server_adapter.nodelay + + ssl_module = self.server_adapter.ssl_module or 'pyopenssl' + if self.server_adapter.ssl_context: + adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) + self.ssl_adapter = adapter_class( + self.server_adapter.ssl_certificate, + self.server_adapter.ssl_private_key, + self.server_adapter.ssl_certificate_chain) + self.ssl_adapter.context = self.server_adapter.ssl_context + elif self.server_adapter.ssl_certificate: + adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) + self.ssl_adapter = adapter_class( + self.server_adapter.ssl_certificate, + self.server_adapter.ssl_private_key, + self.server_adapter.ssl_certificate_chain) + + diff --git a/cherrypy/_cpreqbody.py b/cherrypy/_cpreqbody.py new file mode 100644 index 00000000..3514f098 --- /dev/null +++ b/cherrypy/_cpreqbody.py @@ -0,0 +1,723 @@ +"""Request body processing for CherryPy. + +When an HTTP request includes an entity body, it is often desirable to +provide that information to applications in a form other than the raw bytes. +Different content types demand different approaches. Examples: + + * For a GIF file, we want the raw bytes in a stream. + * An HTML form is better parsed into its component fields, and each text field + decoded from bytes to unicode. + * A JSON body should be deserialized into a Python dict or list. + +When the request contains a Content-Type header, the media type is used as a +key to look up a value in the 'request.body.processors' dict. If the full media +type is not found, then the major type is tried; for example, if no processor +is found for the 'image/jpeg' type, then we look for a processor for the 'image' +types altogether. If neither the full type nor the major type has a matching +processor, then a default processor is used (self.default_proc). For most +types, this means no processing is done, and the body is left unread as a +raw byte stream. Processors are configurable in an 'on_start_resource' hook. + +Some processors, especially those for the 'text' types, attempt to decode bytes +to unicode. If the Content-Type request header includes a 'charset' parameter, +this is used to decode the entity. Otherwise, one or more default charsets may +be attempted, although this decision is up to each processor. If a processor +successfully decodes an Entity or Part, it should set the 'charset' attribute +on the Entity or Part to the name of the successful charset, so that +applications can easily re-encode or transcode the value if they wish. + +If the Content-Type of the request entity is of major type 'multipart', then +the above parsing process, and possibly a decoding process, is performed for +each part. + +For both the full entity and multipart parts, a Content-Disposition header may +be used to fill .name and .filename attributes on the request.body or the Part. +""" + +import re +import tempfile +from urllib import unquote_plus + +import cherrypy +from cherrypy.lib import httputil + + +# -------------------------------- Processors -------------------------------- # + +def process_urlencoded(entity): + """Read application/x-www-form-urlencoded data into entity.params.""" + qs = entity.fp.read() + for charset in entity.attempt_charsets: + try: + params = {} + for aparam in qs.split('&'): + for pair in aparam.split(';'): + if not pair: + continue + + atoms = pair.split('=', 1) + if len(atoms) == 1: + atoms.append('') + + key = unquote_plus(atoms[0]).decode(charset) + value = unquote_plus(atoms[1]).decode(charset) + + if key in params: + if not isinstance(params[key], list): + params[key] = [params[key]] + params[key].append(value) + else: + params[key] = value + except UnicodeDecodeError: + pass + else: + entity.charset = charset + break + else: + raise cherrypy.HTTPError( + 400, "The request entity could not be decoded. The following " + "charsets were attempted: %s" % repr(entity.attempt_charsets)) + + # Now that all values have been successfully parsed and decoded, + # apply them to the entity.params dict. + for key, value in params.items(): + if key in entity.params: + if not isinstance(entity.params[key], list): + entity.params[key] = [entity.params[key]] + entity.params[key].append(value) + else: + entity.params[key] = value + + +def process_multipart(entity): + """Read all multipart parts into entity.parts.""" + ib = u"" + if u'boundary' in entity.content_type.params: + # http://tools.ietf.org/html/rfc2046#section-5.1.1 + # "The grammar for parameters on the Content-type field is such that it + # is often necessary to enclose the boundary parameter values in quotes + # on the Content-type line" + ib = entity.content_type.params['boundary'].strip(u'"') + + if not re.match(u"^[ -~]{0,200}[!-~]$", ib): + raise ValueError(u'Invalid boundary in multipart form: %r' % (ib,)) + + ib = (u'--' + ib).encode('ascii') + + # Find the first marker + while True: + b = entity.readline() + if not b: + return + + b = b.strip() + if b == ib: + break + + # Read all parts + while True: + part = entity.part_class.from_fp(entity.fp, ib) + entity.parts.append(part) + part.process() + if part.fp.done: + break + +def process_multipart_form_data(entity): + """Read all multipart/form-data parts into entity.parts or entity.params.""" + process_multipart(entity) + + kept_parts = [] + for part in entity.parts: + if part.name is None: + kept_parts.append(part) + else: + if part.filename is None: + # It's a regular field + entity.params[part.name] = part.fullvalue() + else: + # It's a file upload. Retain the whole part so consumer code + # has access to its .file and .filename attributes. + entity.params[part.name] = part + + entity.parts = kept_parts + +def _old_process_multipart(entity): + """The behavior of 3.2 and lower. Deprecated and will be changed in 3.3.""" + process_multipart(entity) + + params = entity.params + + for part in entity.parts: + if part.name is None: + key = u'parts' + else: + key = part.name + + if part.filename is None: + # It's a regular field + value = part.fullvalue() + else: + # It's a file upload. Retain the whole part so consumer code + # has access to its .file and .filename attributes. + value = part + + if key in params: + if not isinstance(params[key], list): + params[key] = [params[key]] + params[key].append(value) + else: + params[key] = value + + + +# --------------------------------- Entities --------------------------------- # + + +class Entity(object): + """An HTTP request body, or MIME multipart body.""" + + __metaclass__ = cherrypy._AttributeDocstrings + + params = None + params__doc = u""" + If the request Content-Type is 'application/x-www-form-urlencoded' or + multipart, this will be a dict of the params pulled from the entity + body; that is, it will be the portion of request.params that come + from the message body (sometimes called "POST params", although they + can be sent with various HTTP method verbs). This value is set between + the 'before_request_body' and 'before_handler' hooks (assuming that + process_request_body is True).""" + + default_content_type = u'application/x-www-form-urlencoded' + # http://tools.ietf.org/html/rfc2046#section-4.1.2: + # "The default character set, which must be assumed in the + # absence of a charset parameter, is US-ASCII." + # However, many browsers send data in utf-8 with no charset. + attempt_charsets = [u'utf-8'] + processors = {u'application/x-www-form-urlencoded': process_urlencoded, + u'multipart/form-data': process_multipart_form_data, + u'multipart': process_multipart, + } + + def __init__(self, fp, headers, params=None, parts=None): + # Make an instance-specific copy of the class processors + # so Tools, etc. can replace them per-request. + self.processors = self.processors.copy() + + self.fp = fp + self.headers = headers + + if params is None: + params = {} + self.params = params + + if parts is None: + parts = [] + self.parts = parts + + # Content-Type + self.content_type = headers.elements(u'Content-Type') + if self.content_type: + self.content_type = self.content_type[0] + else: + self.content_type = httputil.HeaderElement.from_str( + self.default_content_type) + + # Copy the class 'attempt_charsets', prepending any Content-Type charset + dec = self.content_type.params.get(u"charset", None) + if dec: + dec = dec.decode('ISO-8859-1') + self.attempt_charsets = [dec] + [c for c in self.attempt_charsets + if c != dec] + else: + self.attempt_charsets = self.attempt_charsets[:] + + # Length + self.length = None + clen = headers.get(u'Content-Length', None) + # If Transfer-Encoding is 'chunked', ignore any Content-Length. + if clen is not None and 'chunked' not in headers.get(u'Transfer-Encoding', ''): + try: + self.length = int(clen) + except ValueError: + pass + + # Content-Disposition + self.name = None + self.filename = None + disp = headers.elements(u'Content-Disposition') + if disp: + disp = disp[0] + if 'name' in disp.params: + self.name = disp.params['name'] + if self.name.startswith(u'"') and self.name.endswith(u'"'): + self.name = self.name[1:-1] + if 'filename' in disp.params: + self.filename = disp.params['filename'] + if self.filename.startswith(u'"') and self.filename.endswith(u'"'): + self.filename = self.filename[1:-1] + + # The 'type' attribute is deprecated in 3.2; remove it in 3.3. + type = property(lambda self: self.content_type) + + def read(self, size=None, fp_out=None): + return self.fp.read(size, fp_out) + + def readline(self, size=None): + return self.fp.readline(size) + + def readlines(self, sizehint=None): + return self.fp.readlines(sizehint) + + def __iter__(self): + return self + + def next(self): + line = self.readline() + if not line: + raise StopIteration + return line + + def read_into_file(self, fp_out=None): + """Read the request body into fp_out (or make_file() if None). Return fp_out.""" + if fp_out is None: + fp_out = self.make_file() + self.read(fp_out=fp_out) + return fp_out + + def make_file(self): + """Return a file into which the request body will be read. + + By default, this will return a TemporaryFile. Override as needed.""" + return tempfile.TemporaryFile() + + def fullvalue(self): + """Return this entity as a string, whether stored in a file or not.""" + if self.file: + # It was stored in a tempfile. Read it. + self.file.seek(0) + value = self.file.read() + self.file.seek(0) + else: + value = self.value + return value + + def process(self): + """Execute the best-match processor for the given media type.""" + proc = None + ct = self.content_type.value + try: + proc = self.processors[ct] + except KeyError: + toptype = ct.split(u'/', 1)[0] + try: + proc = self.processors[toptype] + except KeyError: + pass + if proc is None: + self.default_proc() + else: + proc(self) + + def default_proc(self): + # Leave the fp alone for someone else to read. This works fine + # for request.body, but the Part subclasses need to override this + # so they can move on to the next part. + pass + + +class Part(Entity): + """A MIME part entity, part of a multipart entity.""" + + default_content_type = u'text/plain' + # "The default character set, which must be assumed in the absence of a + # charset parameter, is US-ASCII." + attempt_charsets = [u'us-ascii', u'utf-8'] + # This is the default in stdlib cgi. We may want to increase it. + maxrambytes = 1000 + + def __init__(self, fp, headers, boundary): + Entity.__init__(self, fp, headers) + self.boundary = boundary + self.file = None + self.value = None + + def from_fp(cls, fp, boundary): + headers = cls.read_headers(fp) + return cls(fp, headers, boundary) + from_fp = classmethod(from_fp) + + def read_headers(cls, fp): + headers = httputil.HeaderMap() + while True: + line = fp.readline() + if not line: + # No more data--illegal end of headers + raise EOFError(u"Illegal end of headers.") + + if line == '\r\n': + # Normal end of headers + break + if not line.endswith('\r\n'): + raise ValueError(u"MIME requires CRLF terminators: %r" % line) + + if line[0] in ' \t': + # It's a continuation line. + v = line.strip().decode(u'ISO-8859-1') + else: + k, v = line.split(":", 1) + k = k.strip().decode(u'ISO-8859-1') + v = v.strip().decode(u'ISO-8859-1') + + existing = headers.get(k) + if existing: + v = u", ".join((existing, v)) + headers[k] = v + + return headers + read_headers = classmethod(read_headers) + + def read_lines_to_boundary(self, fp_out=None): + """Read bytes from self.fp and return or write them to a file. + + If the 'fp_out' argument is None (the default), all bytes read are + returned in a single byte string. + + If the 'fp_out' argument is not None, it must be a file-like object that + supports the 'write' method; all bytes read will be written to the fp, + and that fp is returned. + """ + endmarker = self.boundary + "--" + delim = "" + prev_lf = True + lines = [] + seen = 0 + while True: + line = self.fp.readline(1 << 16) + if not line: + raise EOFError(u"Illegal end of multipart body.") + if line.startswith("--") and prev_lf: + strippedline = line.strip() + if strippedline == self.boundary: + break + if strippedline == endmarker: + self.fp.finish() + break + + line = delim + line + + if line.endswith("\r\n"): + delim = "\r\n" + line = line[:-2] + prev_lf = True + elif line.endswith("\n"): + delim = "\n" + line = line[:-1] + prev_lf = True + else: + delim = "" + prev_lf = False + + if fp_out is None: + lines.append(line) + seen += len(line) + if seen > self.maxrambytes: + fp_out = self.make_file() + for line in lines: + fp_out.write(line) + else: + fp_out.write(line) + + if fp_out is None: + result = ''.join(lines) + for charset in self.attempt_charsets: + try: + result = result.decode(charset) + except UnicodeDecodeError: + pass + else: + self.charset = charset + return result + else: + raise cherrypy.HTTPError( + 400, "The request entity could not be decoded. The following " + "charsets were attempted: %s" % repr(self.attempt_charsets)) + else: + fp_out.seek(0) + return fp_out + + def default_proc(self): + if self.filename: + # Always read into a file if a .filename was given. + self.file = self.read_into_file() + else: + result = self.read_lines_to_boundary() + if isinstance(result, basestring): + self.value = result + else: + self.file = result + + def read_into_file(self, fp_out=None): + """Read the request body into fp_out (or make_file() if None). Return fp_out.""" + if fp_out is None: + fp_out = self.make_file() + self.read_lines_to_boundary(fp_out=fp_out) + return fp_out + +Entity.part_class = Part + + +class Infinity(object): + def __cmp__(self, other): + return 1 + def __sub__(self, other): + return self +inf = Infinity() + + +comma_separated_headers = ['Accept', 'Accept-Charset', 'Accept-Encoding', + 'Accept-Language', 'Accept-Ranges', 'Allow', 'Cache-Control', 'Connection', + 'Content-Encoding', 'Content-Language', 'Expect', 'If-Match', + 'If-None-Match', 'Pragma', 'Proxy-Authenticate', 'Te', 'Trailer', + 'Transfer-Encoding', 'Upgrade', 'Vary', 'Via', 'Warning', 'Www-Authenticate'] + + +class SizedReader: + + def __init__(self, fp, length, maxbytes, bufsize=8192, has_trailers=False): + # Wrap our fp in a buffer so peek() works + self.fp = fp + self.length = length + self.maxbytes = maxbytes + self.buffer = '' + self.bufsize = bufsize + self.bytes_read = 0 + self.done = False + self.has_trailers = has_trailers + + def read(self, size=None, fp_out=None): + """Read bytes from the request body and return or write them to a file. + + A number of bytes less than or equal to the 'size' argument are read + off the socket. The actual number of bytes read are tracked in + self.bytes_read. The number may be smaller than 'size' when 1) the + client sends fewer bytes, 2) the 'Content-Length' request header + specifies fewer bytes than requested, or 3) the number of bytes read + exceeds self.maxbytes (in which case, 413 is raised). + + If the 'fp_out' argument is None (the default), all bytes read are + returned in a single byte string. + + If the 'fp_out' argument is not None, it must be a file-like object that + supports the 'write' method; all bytes read will be written to the fp, + and None is returned. + """ + + if self.length is None: + if size is None: + remaining = inf + else: + remaining = size + else: + remaining = self.length - self.bytes_read + if size and size < remaining: + remaining = size + if remaining == 0: + self.finish() + if fp_out is None: + return '' + else: + return None + + chunks = [] + + # Read bytes from the buffer. + if self.buffer: + if remaining is inf: + data = self.buffer + self.buffer = '' + else: + data = self.buffer[:remaining] + self.buffer = self.buffer[remaining:] + datalen = len(data) + remaining -= datalen + + # Check lengths. + self.bytes_read += datalen + if self.maxbytes and self.bytes_read > self.maxbytes: + raise cherrypy.HTTPError(413) + + # Store the data. + if fp_out is None: + chunks.append(data) + else: + fp_out.write(data) + + # Read bytes from the socket. + while remaining > 0: + chunksize = min(remaining, self.bufsize) + try: + data = self.fp.read(chunksize) + except Exception, e: + if e.__class__.__name__ == 'MaxSizeExceeded': + # Post data is too big + raise cherrypy.HTTPError( + 413, "Maximum request length: %r" % e.args[1]) + else: + raise + if not data: + self.finish() + break + datalen = len(data) + remaining -= datalen + + # Check lengths. + self.bytes_read += datalen + if self.maxbytes and self.bytes_read > self.maxbytes: + raise cherrypy.HTTPError(413) + + # Store the data. + if fp_out is None: + chunks.append(data) + else: + fp_out.write(data) + + if fp_out is None: + return ''.join(chunks) + + def readline(self, size=None): + """Read a line from the request body and return it.""" + chunks = [] + while size is None or size > 0: + chunksize = self.bufsize + if size is not None and size < self.bufsize: + chunksize = size + data = self.read(chunksize) + if not data: + break + pos = data.find('\n') + 1 + if pos: + chunks.append(data[:pos]) + remainder = data[pos:] + self.buffer += remainder + self.bytes_read -= len(remainder) + break + else: + chunks.append(data) + return ''.join(chunks) + + def readlines(self, sizehint=None): + """Read lines from the request body and return them.""" + if self.length is not None: + if sizehint is None: + sizehint = self.length - self.bytes_read + else: + sizehint = min(sizehint, self.length - self.bytes_read) + + lines = [] + seen = 0 + while True: + line = self.readline() + if not line: + break + lines.append(line) + seen += len(line) + if seen >= sizehint: + break + return lines + + def finish(self): + self.done = True + if self.has_trailers and hasattr(self.fp, 'read_trailer_lines'): + self.trailers = {} + + try: + for line in self.fp.read_trailer_lines(): + if line[0] in ' \t': + # It's a continuation line. + v = line.strip() + else: + try: + k, v = line.split(":", 1) + except ValueError: + raise ValueError("Illegal header line.") + k = k.strip().title() + v = v.strip() + + if k in comma_separated_headers: + existing = self.trailers.get(envname) + if existing: + v = ", ".join((existing, v)) + self.trailers[k] = v + except Exception, e: + if e.__class__.__name__ == 'MaxSizeExceeded': + # Post data is too big + raise cherrypy.HTTPError( + 413, "Maximum request length: %r" % e.args[1]) + else: + raise + + +class RequestBody(Entity): + + # Don't parse the request body at all if the client didn't provide + # a Content-Type header. See http://www.cherrypy.org/ticket/790 + default_content_type = u'' + + bufsize = 8 * 1024 + maxbytes = None + + def __init__(self, fp, headers, params=None, request_params=None): + Entity.__init__(self, fp, headers, params) + + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1 + # When no explicit charset parameter is provided by the + # sender, media subtypes of the "text" type are defined + # to have a default charset value of "ISO-8859-1" when + # received via HTTP. + if self.content_type.value.startswith('text/'): + for c in (u'ISO-8859-1', u'iso-8859-1', u'Latin-1', u'latin-1'): + if c in self.attempt_charsets: + break + else: + self.attempt_charsets.append(u'ISO-8859-1') + + # Temporary fix while deprecating passing .parts as .params. + self.processors[u'multipart'] = _old_process_multipart + + if request_params is None: + request_params = {} + self.request_params = request_params + + def process(self): + """Include body params in request params.""" + # "The presence of a message-body in a request is signaled by the + # inclusion of a Content-Length or Transfer-Encoding header field in + # the request's message-headers." + # It is possible to send a POST request with no body, for example; + # however, app developers are responsible in that case to set + # cherrypy.request.process_body to False so this method isn't called. + h = cherrypy.serving.request.headers + if u'Content-Length' not in h and u'Transfer-Encoding' not in h: + raise cherrypy.HTTPError(411) + + self.fp = SizedReader(self.fp, self.length, + self.maxbytes, bufsize=self.bufsize, + has_trailers='Trailer' in h) + super(RequestBody, self).process() + + # Body params should also be a part of the request_params + # add them in here. + request_params = self.request_params + for key, value in self.params.items(): + # Python 2 only: keyword arguments must be byte strings (type 'str'). + if isinstance(key, unicode): + key = key.encode('ISO-8859-1') + + if key in request_params: + if not isinstance(request_params[key], list): + request_params[key] = [request_params[key]] + request_params[key].append(value) + else: + request_params[key] = value + diff --git a/cherrypy/_cprequest.py b/cherrypy/_cprequest.py new file mode 100644 index 00000000..f08c4a82 --- /dev/null +++ b/cherrypy/_cprequest.py @@ -0,0 +1,940 @@ + +from Cookie import SimpleCookie, CookieError +import os +import sys +import time +import types +import warnings + +import cherrypy +from cherrypy import _cpreqbody, _cpconfig +from cherrypy._cperror import format_exc, bare_error +from cherrypy.lib import httputil, file_generator + + +class Hook(object): + """A callback and its metadata: failsafe, priority, and kwargs.""" + + __metaclass__ = cherrypy._AttributeDocstrings + + callback = None + callback__doc = """ + The bare callable that this Hook object is wrapping, which will + be called when the Hook is called.""" + + failsafe = False + failsafe__doc = """ + If True, the callback is guaranteed to run even if other callbacks + from the same call point raise exceptions.""" + + priority = 50 + priority__doc = """ + Defines the order of execution for a list of Hooks. Priority numbers + should be limited to the closed interval [0, 100], but values outside + this range are acceptable, as are fractional values.""" + + kwargs = {} + kwargs__doc = """ + A set of keyword arguments that will be passed to the + callable on each call.""" + + def __init__(self, callback, failsafe=None, priority=None, **kwargs): + self.callback = callback + + if failsafe is None: + failsafe = getattr(callback, "failsafe", False) + self.failsafe = failsafe + + if priority is None: + priority = getattr(callback, "priority", 50) + self.priority = priority + + self.kwargs = kwargs + + def __cmp__(self, other): + return cmp(self.priority, other.priority) + + def __call__(self): + """Run self.callback(**self.kwargs).""" + return self.callback(**self.kwargs) + + def __repr__(self): + cls = self.__class__ + return ("%s.%s(callback=%r, failsafe=%r, priority=%r, %s)" + % (cls.__module__, cls.__name__, self.callback, + self.failsafe, self.priority, + ", ".join(['%s=%r' % (k, v) + for k, v in self.kwargs.items()]))) + + +class HookMap(dict): + """A map of call points to lists of callbacks (Hook objects).""" + + def __new__(cls, points=None): + d = dict.__new__(cls) + for p in points or []: + d[p] = [] + return d + + def __init__(self, *a, **kw): + pass + + def attach(self, point, callback, failsafe=None, priority=None, **kwargs): + """Append a new Hook made from the supplied arguments.""" + self[point].append(Hook(callback, failsafe, priority, **kwargs)) + + def run(self, point): + """Execute all registered Hooks (callbacks) for the given point.""" + exc = None + hooks = self[point] + hooks.sort() + for hook in hooks: + # Some hooks are guaranteed to run even if others at + # the same hookpoint fail. We will still log the failure, + # but proceed on to the next hook. The only way + # to stop all processing from one of these hooks is + # to raise SystemExit and stop the whole server. + if exc is None or hook.failsafe: + try: + hook() + except (KeyboardInterrupt, SystemExit): + raise + except (cherrypy.HTTPError, cherrypy.HTTPRedirect, + cherrypy.InternalRedirect): + exc = sys.exc_info()[1] + except: + exc = sys.exc_info()[1] + cherrypy.log(traceback=True, severity=40) + if exc: + raise + + def __copy__(self): + newmap = self.__class__() + # We can't just use 'update' because we want copies of the + # mutable values (each is a list) as well. + for k, v in self.items(): + newmap[k] = v[:] + return newmap + copy = __copy__ + + def __repr__(self): + cls = self.__class__ + return "%s.%s(points=%r)" % (cls.__module__, cls.__name__, self.keys()) + + +# Config namespace handlers + +def hooks_namespace(k, v): + """Attach bare hooks declared in config.""" + # Use split again to allow multiple hooks for a single + # hookpoint per path (e.g. "hooks.before_handler.1"). + # Little-known fact you only get from reading source ;) + hookpoint = k.split(".", 1)[0] + if isinstance(v, basestring): + v = cherrypy.lib.attributes(v) + if not isinstance(v, Hook): + v = Hook(v) + cherrypy.serving.request.hooks[hookpoint].append(v) + +def request_namespace(k, v): + """Attach request attributes declared in config.""" + # Provides config entries to set request.body attrs (like attempt_charsets). + if k[:5] == 'body.': + setattr(cherrypy.serving.request.body, k[5:], v) + else: + setattr(cherrypy.serving.request, k, v) + +def response_namespace(k, v): + """Attach response attributes declared in config.""" + # Provides config entries to set default response headers + # http://cherrypy.org/ticket/889 + if k[:8] == 'headers.': + cherrypy.serving.response.headers[k.split('.', 1)[1]] = v + else: + setattr(cherrypy.serving.response, k, v) + +def error_page_namespace(k, v): + """Attach error pages declared in config.""" + if k != 'default': + k = int(k) + cherrypy.serving.request.error_page[k] = v + + +hookpoints = ['on_start_resource', 'before_request_body', + 'before_handler', 'before_finalize', + 'on_end_resource', 'on_end_request', + 'before_error_response', 'after_error_response'] + + +class Request(object): + """An HTTP request. + + This object represents the metadata of an HTTP request message; + that is, it contains attributes which describe the environment + in which the request URL, headers, and body were sent (if you + want tools to interpret the headers and body, those are elsewhere, + mostly in Tools). This 'metadata' consists of socket data, + transport characteristics, and the Request-Line. This object + also contains data regarding the configuration in effect for + the given URL, and the execution plan for generating a response. + """ + + __metaclass__ = cherrypy._AttributeDocstrings + + prev = None + prev__doc = """ + The previous Request object (if any). This should be None + unless we are processing an InternalRedirect.""" + + # Conversation/connection attributes + local = httputil.Host("127.0.0.1", 80) + local__doc = \ + "An httputil.Host(ip, port, hostname) object for the server socket." + + remote = httputil.Host("127.0.0.1", 1111) + remote__doc = \ + "An httputil.Host(ip, port, hostname) object for the client socket." + + scheme = "http" + scheme__doc = """ + The protocol used between client and server. In most cases, + this will be either 'http' or 'https'.""" + + server_protocol = "HTTP/1.1" + server_protocol__doc = """ + The HTTP version for which the HTTP server is at least + conditionally compliant.""" + + base = "" + base__doc = """The (scheme://host) portion of the requested URL. + In some cases (e.g. when proxying via mod_rewrite), this may contain + path segments which cherrypy.url uses when constructing url's, but + which otherwise are ignored by CherryPy. Regardless, this value + MUST NOT end in a slash.""" + + # Request-Line attributes + request_line = "" + request_line__doc = """ + The complete Request-Line received from the client. This is a + single string consisting of the request method, URI, and protocol + version (joined by spaces). Any final CRLF is removed.""" + + method = "GET" + method__doc = """ + Indicates the HTTP method to be performed on the resource identified + by the Request-URI. Common methods include GET, HEAD, POST, PUT, and + DELETE. CherryPy allows any extension method; however, various HTTP + servers and gateways may restrict the set of allowable methods. + CherryPy applications SHOULD restrict the set (on a per-URI basis).""" + + query_string = "" + query_string__doc = """ + The query component of the Request-URI, a string of information to be + interpreted by the resource. The query portion of a URI follows the + path component, and is separated by a '?'. For example, the URI + 'http://www.cherrypy.org/wiki?a=3&b=4' has the query component, + 'a=3&b=4'.""" + + query_string_encoding = 'utf8' + query_string_encoding__doc = """ + The encoding expected for query string arguments after % HEX HEX decoding). + If a query string is provided that cannot be decoded with this encoding, + 404 is raised (since technically it's a different URI). If you want + arbitrary encodings to not error, set this to 'Latin-1'; you can then + encode back to bytes and re-decode to whatever encoding you like later. + """ + + protocol = (1, 1) + protocol__doc = """The HTTP protocol version corresponding to the set + of features which should be allowed in the response. If BOTH + the client's request message AND the server's level of HTTP + compliance is HTTP/1.1, this attribute will be the tuple (1, 1). + If either is 1.0, this attribute will be the tuple (1, 0). + Lower HTTP protocol versions are not explicitly supported.""" + + params = {} + params__doc = """ + A dict which combines query string (GET) and request entity (POST) + variables. This is populated in two stages: GET params are added + before the 'on_start_resource' hook, and POST params are added + between the 'before_request_body' and 'before_handler' hooks.""" + + # Message attributes + header_list = [] + header_list__doc = """ + A list of the HTTP request headers as (name, value) tuples. + In general, you should use request.headers (a dict) instead.""" + + headers = httputil.HeaderMap() + headers__doc = """ + A dict-like object containing the request headers. Keys are header + names (in Title-Case format); however, you may get and set them in + a case-insensitive manner. That is, headers['Content-Type'] and + headers['content-type'] refer to the same value. Values are header + values (decoded according to RFC 2047 if necessary). See also: + httputil.HeaderMap, httputil.HeaderElement.""" + + cookie = SimpleCookie() + cookie__doc = """See help(Cookie).""" + + body = None + body__doc = """See help(cherrypy.request.body)""" + + rfile = None + rfile__doc = """ + If the request included an entity (body), it will be available + as a stream in this attribute. However, the rfile will normally + be read for you between the 'before_request_body' hook and the + 'before_handler' hook, and the resulting string is placed into + either request.params or the request.body attribute. + + You may disable the automatic consumption of the rfile by setting + request.process_request_body to False, either in config for the desired + path, or in an 'on_start_resource' or 'before_request_body' hook. + + WARNING: In almost every case, you should not attempt to read from the + rfile stream after CherryPy's automatic mechanism has read it. If you + turn off the automatic parsing of rfile, you should read exactly the + number of bytes specified in request.headers['Content-Length']. + Ignoring either of these warnings may result in a hung request thread + or in corruption of the next (pipelined) request. + """ + + process_request_body = True + process_request_body__doc = """ + If True, the rfile (if any) is automatically read and parsed, + and the result placed into request.params or request.body.""" + + methods_with_bodies = ("POST", "PUT") + methods_with_bodies__doc = """ + A sequence of HTTP methods for which CherryPy will automatically + attempt to read a body from the rfile.""" + + body = None + body__doc = """ + If the request Content-Type is 'application/x-www-form-urlencoded' + or multipart, this will be None. Otherwise, this will contain the + request entity body as an open file object (which you can .read()); + this value is set between the 'before_request_body' and 'before_handler' + hooks (assuming that process_request_body is True).""" + + body_params = None + body_params__doc = """ + If the request Content-Type is 'application/x-www-form-urlencoded' or + multipart, this will be a dict of the params pulled from the entity + body; that is, it will be the portion of request.params that come + from the message body (sometimes called "POST params", although they + can be sent with various HTTP method verbs). This value is set between + the 'before_request_body' and 'before_handler' hooks (assuming that + process_request_body is True).""" + + # Dispatch attributes + dispatch = cherrypy.dispatch.Dispatcher() + dispatch__doc = """ + The object which looks up the 'page handler' callable and collects + config for the current request based on the path_info, other + request attributes, and the application architecture. The core + calls the dispatcher as early as possible, passing it a 'path_info' + argument. + + The default dispatcher discovers the page handler by matching path_info + to a hierarchical arrangement of objects, starting at request.app.root. + See help(cherrypy.dispatch) for more information.""" + + script_name = "" + script_name__doc = """ + The 'mount point' of the application which is handling this request. + + This attribute MUST NOT end in a slash. If the script_name refers to + the root of the URI, it MUST be an empty string (not "/"). + """ + + path_info = "/" + path_info__doc = """ + The 'relative path' portion of the Request-URI. This is relative + to the script_name ('mount point') of the application which is + handling this request.""" + + login = None + login__doc = """ + When authentication is used during the request processing this is + set to 'False' if it failed and to the 'username' value if it succeeded. + The default 'None' implies that no authentication happened.""" + + # Note that cherrypy.url uses "if request.app:" to determine whether + # the call is during a real HTTP request or not. So leave this None. + app = None + app__doc = \ + """The cherrypy.Application object which is handling this request.""" + + handler = None + handler__doc = """ + The function, method, or other callable which CherryPy will call to + produce the response. The discovery of the handler and the arguments + it will receive are determined by the request.dispatch object. + By default, the handler is discovered by walking a tree of objects + starting at request.app.root, and is then passed all HTTP params + (from the query string and POST body) as keyword arguments.""" + + toolmaps = {} + toolmaps__doc = """ + A nested dict of all Toolboxes and Tools in effect for this request, + of the form: {Toolbox.namespace: {Tool.name: config dict}}.""" + + config = None + config__doc = """ + A flat dict of all configuration entries which apply to the + current request. These entries are collected from global config, + application config (based on request.path_info), and from handler + config (exactly how is governed by the request.dispatch object in + effect for this request; by default, handler config can be attached + anywhere in the tree between request.app.root and the final handler, + and inherits downward).""" + + is_index = None + is_index__doc = """ + This will be True if the current request is mapped to an 'index' + resource handler (also, a 'default' handler if path_info ends with + a slash). The value may be used to automatically redirect the + user-agent to a 'more canonical' URL which either adds or removes + the trailing slash. See cherrypy.tools.trailing_slash.""" + + hooks = HookMap(hookpoints) + hooks__doc = """ + A HookMap (dict-like object) of the form: {hookpoint: [hook, ...]}. + Each key is a str naming the hook point, and each value is a list + of hooks which will be called at that hook point during this request. + The list of hooks is generally populated as early as possible (mostly + from Tools specified in config), but may be extended at any time. + See also: _cprequest.Hook, _cprequest.HookMap, and cherrypy.tools.""" + + error_response = cherrypy.HTTPError(500).set_response + error_response__doc = """ + The no-arg callable which will handle unexpected, untrapped errors + during request processing. This is not used for expected exceptions + (like NotFound, HTTPError, or HTTPRedirect) which are raised in + response to expected conditions (those should be customized either + via request.error_page or by overriding HTTPError.set_response). + By default, error_response uses HTTPError(500) to return a generic + error response to the user-agent.""" + + error_page = {} + error_page__doc = """ + A dict of {error code: response filename or callable} pairs. + + The error code must be an int representing a given HTTP error code, + or the string 'default', which will be used if no matching entry + is found for a given numeric code. + + If a filename is provided, the file should contain a Python string- + formatting template, and can expect by default to receive format + values with the mapping keys %(status)s, %(message)s, %(traceback)s, + and %(version)s. The set of format mappings can be extended by + overriding HTTPError.set_response. + + If a callable is provided, it will be called by default with keyword + arguments 'status', 'message', 'traceback', and 'version', as for a + string-formatting template. The callable must return a string or iterable of + strings which will be set to response.body. It may also override headers or + perform any other processing. + + If no entry is given for an error code, and no 'default' entry exists, + a default template will be used. + """ + + show_tracebacks = True + show_tracebacks__doc = """ + If True, unexpected errors encountered during request processing will + include a traceback in the response body.""" + + show_mismatched_params = True + show_mismatched_params__doc = """ + If True, mismatched parameters encountered during PageHandler invocation + processing will be included in the response body.""" + + throws = (KeyboardInterrupt, SystemExit, cherrypy.InternalRedirect) + throws__doc = \ + """The sequence of exceptions which Request.run does not trap.""" + + throw_errors = False + throw_errors__doc = """ + If True, Request.run will not trap any errors (except HTTPRedirect and + HTTPError, which are more properly called 'exceptions', not errors).""" + + closed = False + closed__doc = """ + True once the close method has been called, False otherwise.""" + + stage = None + stage__doc = """ + A string containing the stage reached in the request-handling process. + This is useful when debugging a live server with hung requests.""" + + namespaces = _cpconfig.NamespaceSet( + **{"hooks": hooks_namespace, + "request": request_namespace, + "response": response_namespace, + "error_page": error_page_namespace, + "tools": cherrypy.tools, + }) + + def __init__(self, local_host, remote_host, scheme="http", + server_protocol="HTTP/1.1"): + """Populate a new Request object. + + local_host should be an httputil.Host object with the server info. + remote_host should be an httputil.Host object with the client info. + scheme should be a string, either "http" or "https". + """ + self.local = local_host + self.remote = remote_host + self.scheme = scheme + self.server_protocol = server_protocol + + self.closed = False + + # Put a *copy* of the class error_page into self. + self.error_page = self.error_page.copy() + + # Put a *copy* of the class namespaces into self. + self.namespaces = self.namespaces.copy() + + self.stage = None + + def close(self): + """Run cleanup code. (Core)""" + if not self.closed: + self.closed = True + self.stage = 'on_end_request' + self.hooks.run('on_end_request') + self.stage = 'close' + + def run(self, method, path, query_string, req_protocol, headers, rfile): + """Process the Request. (Core) + + method, path, query_string, and req_protocol should be pulled directly + from the Request-Line (e.g. "GET /path?key=val HTTP/1.0"). + path should be %XX-unquoted, but query_string should not be. + They both MUST be byte strings, not unicode strings. + headers should be a list of (name, value) tuples. + rfile should be a file-like object containing the HTTP request entity. + + When run() is done, the returned object should have 3 attributes: + status, e.g. "200 OK" + header_list, a list of (name, value) tuples + body, an iterable yielding strings + + Consumer code (HTTP servers) should then access these response + attributes to build the outbound stream. + + """ + response = cherrypy.serving.response + self.stage = 'run' + try: + self.error_response = cherrypy.HTTPError(500).set_response + + self.method = method + path = path or "/" + self.query_string = query_string or '' + self.params = {} + + # Compare request and server HTTP protocol versions, in case our + # server does not support the requested protocol. Limit our output + # to min(req, server). We want the following output: + # request server actual written supported response + # protocol protocol response protocol feature set + # a 1.0 1.0 1.0 1.0 + # b 1.0 1.1 1.1 1.0 + # c 1.1 1.0 1.0 1.0 + # d 1.1 1.1 1.1 1.1 + # Notice that, in (b), the response will be "HTTP/1.1" even though + # the client only understands 1.0. RFC 2616 10.5.6 says we should + # only return 505 if the _major_ version is different. + rp = int(req_protocol[5]), int(req_protocol[7]) + sp = int(self.server_protocol[5]), int(self.server_protocol[7]) + self.protocol = min(rp, sp) + response.headers.protocol = self.protocol + + # Rebuild first line of the request (e.g. "GET /path HTTP/1.0"). + url = path + if query_string: + url += '?' + query_string + self.request_line = '%s %s %s' % (method, url, req_protocol) + + self.header_list = list(headers) + self.headers = httputil.HeaderMap() + + self.rfile = rfile + self.body = None + + self.cookie = SimpleCookie() + self.handler = None + + # path_info should be the path from the + # app root (script_name) to the handler. + self.script_name = self.app.script_name + self.path_info = pi = path[len(self.script_name):] + + self.stage = 'respond' + self.respond(pi) + + except self.throws: + raise + except: + if self.throw_errors: + raise + else: + # Failure in setup, error handler or finalize. Bypass them. + # Can't use handle_error because we may not have hooks yet. + cherrypy.log(traceback=True, severity=40) + if self.show_tracebacks: + body = format_exc() + else: + body = "" + r = bare_error(body) + response.output_status, response.header_list, response.body = r + + if self.method == "HEAD": + # HEAD requests MUST NOT return a message-body in the response. + response.body = [] + + try: + cherrypy.log.access() + except: + cherrypy.log.error(traceback=True) + + if response.timed_out: + raise cherrypy.TimeoutError() + + return response + + # Uncomment for stage debugging + # stage = property(lambda self: self._stage, lambda self, v: print(v)) + + def respond(self, path_info): + """Generate a response for the resource at self.path_info. (Core)""" + response = cherrypy.serving.response + try: + try: + try: + if self.app is None: + raise cherrypy.NotFound() + + # Get the 'Host' header, so we can HTTPRedirect properly. + self.stage = 'process_headers' + self.process_headers() + + # Make a copy of the class hooks + self.hooks = self.__class__.hooks.copy() + self.toolmaps = {} + + self.stage = 'get_resource' + self.get_resource(path_info) + + self.body = _cpreqbody.RequestBody( + self.rfile, self.headers, request_params=self.params) + + self.namespaces(self.config) + + self.stage = 'on_start_resource' + self.hooks.run('on_start_resource') + + # Parse the querystring + self.stage = 'process_query_string' + self.process_query_string() + + # Process the body + if self.process_request_body: + if self.method not in self.methods_with_bodies: + self.process_request_body = False + self.stage = 'before_request_body' + self.hooks.run('before_request_body') + if self.process_request_body: + self.body.process() + + # Run the handler + self.stage = 'before_handler' + self.hooks.run('before_handler') + if self.handler: + self.stage = 'handler' + response.body = self.handler() + + # Finalize + self.stage = 'before_finalize' + self.hooks.run('before_finalize') + response.finalize() + except (cherrypy.HTTPRedirect, cherrypy.HTTPError), inst: + inst.set_response() + self.stage = 'before_finalize (HTTPError)' + self.hooks.run('before_finalize') + response.finalize() + finally: + self.stage = 'on_end_resource' + self.hooks.run('on_end_resource') + except self.throws: + raise + except: + if self.throw_errors: + raise + self.handle_error() + + def process_query_string(self): + """Parse the query string into Python structures. (Core)""" + try: + p = httputil.parse_query_string( + self.query_string, encoding=self.query_string_encoding) + except UnicodeDecodeError: + raise cherrypy.HTTPError( + 404, "The given query string could not be processed. Query " + "strings for this resource must be encoded with %r." % + self.query_string_encoding) + + # Python 2 only: keyword arguments must be byte strings (type 'str'). + for key, value in p.items(): + if isinstance(key, unicode): + del p[key] + p[key.encode(self.query_string_encoding)] = value + self.params.update(p) + + def process_headers(self): + """Parse HTTP header data into Python structures. (Core)""" + # Process the headers into self.headers + headers = self.headers + for name, value in self.header_list: + # Call title() now (and use dict.__method__(headers)) + # so title doesn't have to be called twice. + name = name.title() + value = value.strip() + + # Warning: if there is more than one header entry for cookies (AFAIK, + # only Konqueror does that), only the last one will remain in headers + # (but they will be correctly stored in request.cookie). + if "=?" in value: + dict.__setitem__(headers, name, httputil.decode_TEXT(value)) + else: + dict.__setitem__(headers, name, value) + + # Handle cookies differently because on Konqueror, multiple + # cookies come on different lines with the same key + if name == 'Cookie': + try: + self.cookie.load(value) + except CookieError: + msg = "Illegal cookie name %s" % value.split('=')[0] + raise cherrypy.HTTPError(400, msg) + + if not dict.__contains__(headers, 'Host'): + # All Internet-based HTTP/1.1 servers MUST respond with a 400 + # (Bad Request) status code to any HTTP/1.1 request message + # which lacks a Host header field. + if self.protocol >= (1, 1): + msg = "HTTP/1.1 requires a 'Host' request header." + raise cherrypy.HTTPError(400, msg) + host = dict.get(headers, 'Host') + if not host: + host = self.local.name or self.local.ip + self.base = "%s://%s" % (self.scheme, host) + + def get_resource(self, path): + """Call a dispatcher (which sets self.handler and .config). (Core)""" + # First, see if there is a custom dispatch at this URI. Custom + # dispatchers can only be specified in app.config, not in _cp_config + # (since custom dispatchers may not even have an app.root). + dispatch = self.app.find_config(path, "request.dispatch", self.dispatch) + + # dispatch() should set self.handler and self.config + dispatch(path) + + def handle_error(self): + """Handle the last unanticipated exception. (Core)""" + try: + self.hooks.run("before_error_response") + if self.error_response: + self.error_response() + self.hooks.run("after_error_response") + cherrypy.serving.response.finalize() + except cherrypy.HTTPRedirect, inst: + inst.set_response() + cherrypy.serving.response.finalize() + + # ------------------------- Properties ------------------------- # + + def _get_body_params(self): + warnings.warn( + "body_params is deprecated in CherryPy 3.2, will be removed in " + "CherryPy 3.3.", + DeprecationWarning + ) + return self.body.params + body_params = property(_get_body_params, + doc=""" + If the request Content-Type is 'application/x-www-form-urlencoded' or + multipart, this will be a dict of the params pulled from the entity + body; that is, it will be the portion of request.params that come + from the message body (sometimes called "POST params", although they + can be sent with various HTTP method verbs). This value is set between + the 'before_request_body' and 'before_handler' hooks (assuming that + process_request_body is True). + + Deprecated in 3.2, will be removed for 3.3""") + + +class ResponseBody(object): + """The body of the HTTP response (the response entity).""" + + def __get__(self, obj, objclass=None): + if obj is None: + # When calling on the class instead of an instance... + return self + else: + return obj._body + + def __set__(self, obj, value): + # Convert the given value to an iterable object. + if isinstance(value, basestring): + # strings get wrapped in a list because iterating over a single + # item list is much faster than iterating over every character + # in a long string. + if value: + value = [value] + else: + # [''] doesn't evaluate to False, so replace it with []. + value = [] + elif isinstance(value, types.FileType): + value = file_generator(value) + elif value is None: + value = [] + obj._body = value + + +class Response(object): + """An HTTP Response, including status, headers, and body. + + Application developers should use Response.headers (a dict) to + set or modify HTTP response headers. When the response is finalized, + Response.headers is transformed into Response.header_list as + (key, value) tuples. + """ + + __metaclass__ = cherrypy._AttributeDocstrings + + # Class attributes for dev-time introspection. + status = "" + status__doc = """The HTTP Status-Code and Reason-Phrase.""" + + header_list = [] + header_list__doc = """ + A list of the HTTP response headers as (name, value) tuples. + In general, you should use response.headers (a dict) instead.""" + + headers = httputil.HeaderMap() + headers__doc = """ + A dict-like object containing the response headers. Keys are header + names (in Title-Case format); however, you may get and set them in + a case-insensitive manner. That is, headers['Content-Type'] and + headers['content-type'] refer to the same value. Values are header + values (decoded according to RFC 2047 if necessary). See also: + httputil.HeaderMap, httputil.HeaderElement.""" + + cookie = SimpleCookie() + cookie__doc = """See help(Cookie).""" + + body = ResponseBody() + body__doc = """The body (entity) of the HTTP response.""" + + time = None + time__doc = """The value of time.time() when created. Use in HTTP dates.""" + + timeout = 300 + timeout__doc = """Seconds after which the response will be aborted.""" + + timed_out = False + timed_out__doc = """ + Flag to indicate the response should be aborted, because it has + exceeded its timeout.""" + + stream = False + stream__doc = """If False, buffer the response body.""" + + def __init__(self): + self.status = None + self.header_list = None + self._body = [] + self.time = time.time() + + self.headers = httputil.HeaderMap() + # Since we know all our keys are titled strings, we can + # bypass HeaderMap.update and get a big speed boost. + dict.update(self.headers, { + "Content-Type": 'text/html', + "Server": "CherryPy/" + cherrypy.__version__, + "Date": httputil.HTTPDate(self.time), + }) + self.cookie = SimpleCookie() + + def collapse_body(self): + """Collapse self.body to a single string; replace it and return it.""" + if isinstance(self.body, basestring): + return self.body + + newbody = ''.join([chunk for chunk in self.body]) + self.body = newbody + return newbody + + def finalize(self): + """Transform headers (and cookies) into self.header_list. (Core)""" + try: + code, reason, _ = httputil.valid_status(self.status) + except ValueError, x: + raise cherrypy.HTTPError(500, x.args[0]) + + headers = self.headers + + self.output_status = str(code) + " " + headers.encode(reason) + + if self.stream: + # The upshot: wsgiserver will chunk the response if + # you pop Content-Length (or set it explicitly to None). + # Note that lib.static sets C-L to the file's st_size. + if dict.get(headers, 'Content-Length') is None: + dict.pop(headers, 'Content-Length', None) + elif code < 200 or code in (204, 205, 304): + # "All 1xx (informational), 204 (no content), + # and 304 (not modified) responses MUST NOT + # include a message-body." + dict.pop(headers, 'Content-Length', None) + self.body = "" + else: + # Responses which are not streamed should have a Content-Length, + # but allow user code to set Content-Length if desired. + if dict.get(headers, 'Content-Length') is None: + content = self.collapse_body() + dict.__setitem__(headers, 'Content-Length', len(content)) + + # Transform our header dict into a list of tuples. + self.header_list = h = headers.output() + + cookie = self.cookie.output() + if cookie: + for line in cookie.split("\n"): + if line.endswith("\r"): + # Python 2.4 emits cookies joined by LF but 2.5+ by CRLF. + line = line[:-1] + name, value = line.split(": ", 1) + if isinstance(name, unicode): + name = name.encode("ISO-8859-1") + if isinstance(value, unicode): + value = headers.encode(value) + h.append((name, value)) + + def check_timeout(self): + """If now > self.time + self.timeout, set self.timed_out. + + This purposefully sets a flag, rather than raising an error, + so that a monitor thread can interrupt the Response thread. + """ + if time.time() > self.time + self.timeout: + self.timed_out = True + + + diff --git a/cherrypy/_cpserver.py b/cherrypy/_cpserver.py new file mode 100644 index 00000000..9fa63f06 --- /dev/null +++ b/cherrypy/_cpserver.py @@ -0,0 +1,139 @@ +"""Manage HTTP servers with CherryPy.""" + +import warnings + +import cherrypy +from cherrypy.lib import attributes + +# We import * because we want to export check_port +# et al as attributes of this module. +from cherrypy.process.servers import * + + +class Server(ServerAdapter): + """An adapter for an HTTP server. + + You can set attributes (like socket_host and socket_port) + on *this* object (which is probably cherrypy.server), and call + quickstart. For example: + + cherrypy.server.socket_port = 80 + cherrypy.quickstart() + """ + + socket_port = 8080 + + _socket_host = '127.0.0.1' + def _get_socket_host(self): + return self._socket_host + def _set_socket_host(self, value): + if value == '': + raise ValueError("The empty string ('') is not an allowed value. " + "Use '0.0.0.0' instead to listen on all active " + "interfaces (INADDR_ANY).") + self._socket_host = value + socket_host = property(_get_socket_host, _set_socket_host, + doc="""The hostname or IP address on which to listen for connections. + + Host values may be any IPv4 or IPv6 address, or any valid hostname. + The string 'localhost' is a synonym for '127.0.0.1' (or '::1', if + your hosts file prefers IPv6). The string '0.0.0.0' is a special + IPv4 entry meaning "any active interface" (INADDR_ANY), and '::' + is the similar IN6ADDR_ANY for IPv6. The empty string or None are + not allowed.""") + + socket_file = None + socket_queue_size = 5 + socket_timeout = 10 + shutdown_timeout = 5 + protocol_version = 'HTTP/1.1' + reverse_dns = False + thread_pool = 10 + thread_pool_max = -1 + max_request_header_size = 500 * 1024 + max_request_body_size = 100 * 1024 * 1024 + instance = None + ssl_context = None + ssl_certificate = None + ssl_certificate_chain = None + ssl_private_key = None + ssl_module = 'pyopenssl' + nodelay = True + wsgi_version = (1, 1) + + def __init__(self): + self.bus = cherrypy.engine + self.httpserver = None + self.interrupt = None + self.running = False + + def httpserver_from_self(self, httpserver=None): + """Return a (httpserver, bind_addr) pair based on self attributes.""" + if httpserver is None: + httpserver = self.instance + if httpserver is None: + from cherrypy import _cpwsgi_server + httpserver = _cpwsgi_server.CPWSGIServer(self) + if isinstance(httpserver, basestring): + # Is anyone using this? Can I add an arg? + httpserver = attributes(httpserver)(self) + return httpserver, self.bind_addr + + def start(self): + """Start the HTTP server.""" + if not self.httpserver: + self.httpserver, self.bind_addr = self.httpserver_from_self() + ServerAdapter.start(self) + start.priority = 75 + + def _get_bind_addr(self): + if self.socket_file: + return self.socket_file + if self.socket_host is None and self.socket_port is None: + return None + return (self.socket_host, self.socket_port) + def _set_bind_addr(self, value): + if value is None: + self.socket_file = None + self.socket_host = None + self.socket_port = None + elif isinstance(value, basestring): + self.socket_file = value + self.socket_host = None + self.socket_port = None + else: + try: + self.socket_host, self.socket_port = value + self.socket_file = None + except ValueError: + raise ValueError("bind_addr must be a (host, port) tuple " + "(for TCP sockets) or a string (for Unix " + "domain sockets), not %r" % value) + bind_addr = property(_get_bind_addr, _set_bind_addr) + + def base(self): + """Return the base (scheme://host[:port] or sock file) for this server.""" + if self.socket_file: + return self.socket_file + + host = self.socket_host + if host in ('0.0.0.0', '::'): + # 0.0.0.0 is INADDR_ANY and :: is IN6ADDR_ANY. + # Look up the host name, which should be the + # safest thing to spit out in a URL. + import socket + host = socket.gethostname() + + port = self.socket_port + + if self.ssl_certificate: + scheme = "https" + if port != 443: + host += ":%s" % port + else: + scheme = "http" + if port != 80: + host += ":%s" % port + + return "%s://%s" % (scheme, host) + diff --git a/cherrypy/_cpthreadinglocal.py b/cherrypy/_cpthreadinglocal.py new file mode 100644 index 00000000..34c17ac4 --- /dev/null +++ b/cherrypy/_cpthreadinglocal.py @@ -0,0 +1,239 @@ +# This is a backport of Python-2.4's threading.local() implementation + +"""Thread-local objects + +(Note that this module provides a Python version of thread + threading.local class. Depending on the version of Python you're + using, there may be a faster one available. You should always import + the local class from threading.) + +Thread-local objects support the management of thread-local data. +If you have data that you want to be local to a thread, simply create +a thread-local object and use its attributes: + + >>> mydata = local() + >>> mydata.number = 42 + >>> mydata.number + 42 + +You can also access the local-object's dictionary: + + >>> mydata.__dict__ + {'number': 42} + >>> mydata.__dict__.setdefault('widgets', []) + [] + >>> mydata.widgets + [] + +What's important about thread-local objects is that their data are +local to a thread. If we access the data in a different thread: + + >>> log = [] + >>> def f(): + ... items = mydata.__dict__.items() + ... items.sort() + ... log.append(items) + ... mydata.number = 11 + ... log.append(mydata.number) + + >>> import threading + >>> thread = threading.Thread(target=f) + >>> thread.start() + >>> thread.join() + >>> log + [[], 11] + +we get different data. Furthermore, changes made in the other thread +don't affect data seen in this thread: + + >>> mydata.number + 42 + +Of course, values you get from a local object, including a __dict__ +attribute, are for whatever thread was current at the time the +attribute was read. For that reason, you generally don't want to save +these values across threads, as they apply only to the thread they +came from. + +You can create custom local objects by subclassing the local class: + + >>> class MyLocal(local): + ... number = 2 + ... initialized = False + ... def __init__(self, **kw): + ... if self.initialized: + ... raise SystemError('__init__ called too many times') + ... self.initialized = True + ... self.__dict__.update(kw) + ... def squared(self): + ... return self.number ** 2 + +This can be useful to support default values, methods and +initialization. Note that if you define an __init__ method, it will be +called each time the local object is used in a separate thread. This +is necessary to initialize each thread's dictionary. + +Now if we create a local object: + + >>> mydata = MyLocal(color='red') + +Now we have a default number: + + >>> mydata.number + 2 + +an initial color: + + >>> mydata.color + 'red' + >>> del mydata.color + +And a method that operates on the data: + + >>> mydata.squared() + 4 + +As before, we can access the data in a separate thread: + + >>> log = [] + >>> thread = threading.Thread(target=f) + >>> thread.start() + >>> thread.join() + >>> log + [[('color', 'red'), ('initialized', True)], 11] + +without affecting this thread's data: + + >>> mydata.number + 2 + >>> mydata.color + Traceback (most recent call last): + ... + AttributeError: 'MyLocal' object has no attribute 'color' + +Note that subclasses can define slots, but they are not thread +local. They are shared across threads: + + >>> class MyLocal(local): + ... __slots__ = 'number' + + >>> mydata = MyLocal() + >>> mydata.number = 42 + >>> mydata.color = 'red' + +So, the separate thread: + + >>> thread = threading.Thread(target=f) + >>> thread.start() + >>> thread.join() + +affects what we see: + + >>> mydata.number + 11 + +>>> del mydata +""" + +# Threading import is at end + +class _localbase(object): + __slots__ = '_local__key', '_local__args', '_local__lock' + + def __new__(cls, *args, **kw): + self = object.__new__(cls) + key = 'thread.local.' + str(id(self)) + object.__setattr__(self, '_local__key', key) + object.__setattr__(self, '_local__args', (args, kw)) + object.__setattr__(self, '_local__lock', RLock()) + + if args or kw and (cls.__init__ is object.__init__): + raise TypeError("Initialization arguments are not supported") + + # We need to create the thread dict in anticipation of + # __init__ being called, to make sure we don't call it + # again ourselves. + dict = object.__getattribute__(self, '__dict__') + currentThread().__dict__[key] = dict + + return self + +def _patch(self): + key = object.__getattribute__(self, '_local__key') + d = currentThread().__dict__.get(key) + if d is None: + d = {} + currentThread().__dict__[key] = d + object.__setattr__(self, '__dict__', d) + + # we have a new instance dict, so call out __init__ if we have + # one + cls = type(self) + if cls.__init__ is not object.__init__: + args, kw = object.__getattribute__(self, '_local__args') + cls.__init__(self, *args, **kw) + else: + object.__setattr__(self, '__dict__', d) + +class local(_localbase): + + def __getattribute__(self, name): + lock = object.__getattribute__(self, '_local__lock') + lock.acquire() + try: + _patch(self) + return object.__getattribute__(self, name) + finally: + lock.release() + + def __setattr__(self, name, value): + lock = object.__getattribute__(self, '_local__lock') + lock.acquire() + try: + _patch(self) + return object.__setattr__(self, name, value) + finally: + lock.release() + + def __delattr__(self, name): + lock = object.__getattribute__(self, '_local__lock') + lock.acquire() + try: + _patch(self) + return object.__delattr__(self, name) + finally: + lock.release() + + + def __del__(): + threading_enumerate = enumerate + __getattribute__ = object.__getattribute__ + + def __del__(self): + key = __getattribute__(self, '_local__key') + + try: + threads = list(threading_enumerate()) + except: + # if enumerate fails, as it seems to do during + # shutdown, we'll skip cleanup under the assumption + # that there is nothing to clean up + return + + for thread in threads: + try: + __dict__ = thread.__dict__ + except AttributeError: + # Thread is dying, rest in peace + continue + + if key in __dict__: + try: + del __dict__[key] + except KeyError: + pass # didn't have anything in this thread + + return __del__ + __del__ = __del__() + +from threading import currentThread, enumerate, RLock diff --git a/cherrypy/_cptools.py b/cherrypy/_cptools.py new file mode 100644 index 00000000..2eb826fc --- /dev/null +++ b/cherrypy/_cptools.py @@ -0,0 +1,498 @@ +"""CherryPy tools. A "tool" is any helper, adapted to CP. + +Tools are usually designed to be used in a variety of ways (although some +may only offer one if they choose): + + Library calls: + All tools are callables that can be used wherever needed. + The arguments are straightforward and should be detailed within the + docstring. + + Function decorators: + All tools, when called, may be used as decorators which configure + individual CherryPy page handlers (methods on the CherryPy tree). + That is, "@tools.anytool()" should "turn on" the tool via the + decorated function's _cp_config attribute. + + CherryPy config: + If a tool exposes a "_setup" callable, it will be called + once per Request (if the feature is "turned on" via config). + +Tools may be implemented as any object with a namespace. The builtins +are generally either modules or instances of the tools.Tool class. +""" + +import cherrypy +import warnings + + +def _getargs(func): + """Return the names of all static arguments to the given function.""" + # Use this instead of importing inspect for less mem overhead. + import types + if isinstance(func, types.MethodType): + func = func.im_func + co = func.func_code + return co.co_varnames[:co.co_argcount] + + +_attr_error = ("CherryPy Tools cannot be turned on directly. Instead, turn them " + "on via config, or use them as decorators on your page handlers.") + +class Tool(object): + """A registered function for use with CherryPy request-processing hooks. + + help(tool.callable) should give you more information about this Tool. + """ + + namespace = "tools" + + def __init__(self, point, callable, name=None, priority=50): + self._point = point + self.callable = callable + self._name = name + self._priority = priority + self.__doc__ = self.callable.__doc__ + self._setargs() + + def _get_on(self): + raise AttributeError(_attr_error) + def _set_on(self, value): + raise AttributeError(_attr_error) + on = property(_get_on, _set_on) + + def _setargs(self): + """Copy func parameter names to obj attributes.""" + try: + for arg in _getargs(self.callable): + setattr(self, arg, None) + except (TypeError, AttributeError): + if hasattr(self.callable, "__call__"): + for arg in _getargs(self.callable.__call__): + setattr(self, arg, None) + # IronPython 1.0 raises NotImplementedError because + # inspect.getargspec tries to access Python bytecode + # in co_code attribute. + except NotImplementedError: + pass + # IronPython 1B1 may raise IndexError in some cases, + # but if we trap it here it doesn't prevent CP from working. + except IndexError: + pass + + def _merged_args(self, d=None): + """Return a dict of configuration entries for this Tool.""" + if d: + conf = d.copy() + else: + conf = {} + + tm = cherrypy.serving.request.toolmaps[self.namespace] + if self._name in tm: + conf.update(tm[self._name]) + + if "on" in conf: + del conf["on"] + + return conf + + def __call__(self, *args, **kwargs): + """Compile-time decorator (turn on the tool in config). + + For example: + + @tools.proxy() + def whats_my_base(self): + return cherrypy.request.base + whats_my_base.exposed = True + """ + if args: + raise TypeError("The %r Tool does not accept positional " + "arguments; you must use keyword arguments." + % self._name) + def tool_decorator(f): + if not hasattr(f, "_cp_config"): + f._cp_config = {} + subspace = self.namespace + "." + self._name + "." + f._cp_config[subspace + "on"] = True + for k, v in kwargs.items(): + f._cp_config[subspace + k] = v + return f + return tool_decorator + + def _setup(self): + """Hook this tool into cherrypy.request. + + The standard CherryPy request object will automatically call this + method when the tool is "turned on" in config. + """ + conf = self._merged_args() + p = conf.pop("priority", None) + if p is None: + p = getattr(self.callable, "priority", self._priority) + cherrypy.serving.request.hooks.attach(self._point, self.callable, + priority=p, **conf) + + +class HandlerTool(Tool): + """Tool which is called 'before main', that may skip normal handlers. + + If the tool successfully handles the request (by setting response.body), + if should return True. This will cause CherryPy to skip any 'normal' page + handler. If the tool did not handle the request, it should return False + to tell CherryPy to continue on and call the normal page handler. If the + tool is declared AS a page handler (see the 'handler' method), returning + False will raise NotFound. + """ + + def __init__(self, callable, name=None): + Tool.__init__(self, 'before_handler', callable, name) + + def handler(self, *args, **kwargs): + """Use this tool as a CherryPy page handler. + + For example: + class Root: + nav = tools.staticdir.handler(section="/nav", dir="nav", + root=absDir) + """ + def handle_func(*a, **kw): + handled = self.callable(*args, **self._merged_args(kwargs)) + if not handled: + raise cherrypy.NotFound() + return cherrypy.serving.response.body + handle_func.exposed = True + return handle_func + + def _wrapper(self, **kwargs): + if self.callable(**kwargs): + cherrypy.serving.request.handler = None + + def _setup(self): + """Hook this tool into cherrypy.request. + + The standard CherryPy request object will automatically call this + method when the tool is "turned on" in config. + """ + conf = self._merged_args() + p = conf.pop("priority", None) + if p is None: + p = getattr(self.callable, "priority", self._priority) + cherrypy.serving.request.hooks.attach(self._point, self._wrapper, + priority=p, **conf) + + +class HandlerWrapperTool(Tool): + """Tool which wraps request.handler in a provided wrapper function. + + The 'newhandler' arg must be a handler wrapper function that takes a + 'next_handler' argument, plus *args and **kwargs. Like all page handler + functions, it must return an iterable for use as cherrypy.response.body. + + For example, to allow your 'inner' page handlers to return dicts + which then get interpolated into a template: + + def interpolator(next_handler, *args, **kwargs): + filename = cherrypy.request.config.get('template') + cherrypy.response.template = env.get_template(filename) + response_dict = next_handler(*args, **kwargs) + return cherrypy.response.template.render(**response_dict) + cherrypy.tools.jinja = HandlerWrapperTool(interpolator) + """ + + def __init__(self, newhandler, point='before_handler', name=None, priority=50): + self.newhandler = newhandler + self._point = point + self._name = name + self._priority = priority + + def callable(self, debug=False): + innerfunc = cherrypy.serving.request.handler + def wrap(*args, **kwargs): + return self.newhandler(innerfunc, *args, **kwargs) + cherrypy.serving.request.handler = wrap + + +class ErrorTool(Tool): + """Tool which is used to replace the default request.error_response.""" + + def __init__(self, callable, name=None): + Tool.__init__(self, None, callable, name) + + def _wrapper(self): + self.callable(**self._merged_args()) + + def _setup(self): + """Hook this tool into cherrypy.request. + + The standard CherryPy request object will automatically call this + method when the tool is "turned on" in config. + """ + cherrypy.serving.request.error_response = self._wrapper + + +# Builtin tools # + +from cherrypy.lib import cptools, encoding, auth, static, jsontools +from cherrypy.lib import sessions as _sessions, xmlrpc as _xmlrpc +from cherrypy.lib import caching as _caching +from cherrypy.lib import auth_basic, auth_digest + + +class SessionTool(Tool): + """Session Tool for CherryPy. + + sessions.locking: + When 'implicit' (the default), the session will be locked for you, + just before running the page handler. + When 'early', the session will be locked before reading the request + body. This is off by default for safety reasons; for example, + a large upload would block the session, denying an AJAX + progress meter (see http://www.cherrypy.org/ticket/630). + When 'explicit' (or any other value), you need to call + cherrypy.session.acquire_lock() yourself before using + session data. + """ + + def __init__(self): + # _sessions.init must be bound after headers are read + Tool.__init__(self, 'before_request_body', _sessions.init) + + def _lock_session(self): + cherrypy.serving.session.acquire_lock() + + def _setup(self): + """Hook this tool into cherrypy.request. + + The standard CherryPy request object will automatically call this + method when the tool is "turned on" in config. + """ + hooks = cherrypy.serving.request.hooks + + conf = self._merged_args() + + p = conf.pop("priority", None) + if p is None: + p = getattr(self.callable, "priority", self._priority) + + hooks.attach(self._point, self.callable, priority=p, **conf) + + locking = conf.pop('locking', 'implicit') + if locking == 'implicit': + hooks.attach('before_handler', self._lock_session) + elif locking == 'early': + # Lock before the request body (but after _sessions.init runs!) + hooks.attach('before_request_body', self._lock_session, + priority=60) + else: + # Don't lock + pass + + hooks.attach('before_finalize', _sessions.save) + hooks.attach('on_end_request', _sessions.close) + + def regenerate(self): + """Drop the current session and make a new one (with a new id).""" + sess = cherrypy.serving.session + sess.regenerate() + + # Grab cookie-relevant tool args + conf = dict([(k, v) for k, v in self._merged_args().items() + if k in ('path', 'path_header', 'name', 'timeout', + 'domain', 'secure')]) + _sessions.set_response_cookie(**conf) + + + + +class XMLRPCController(object): + """A Controller (page handler collection) for XML-RPC. + + To use it, have your controllers subclass this base class (it will + turn on the tool for you). + + You can also supply the following optional config entries: + + tools.xmlrpc.encoding: 'utf-8' + tools.xmlrpc.allow_none: 0 + + XML-RPC is a rather discontinuous layer over HTTP; dispatching to the + appropriate handler must first be performed according to the URL, and + then a second dispatch step must take place according to the RPC method + specified in the request body. It also allows a superfluous "/RPC2" + prefix in the URL, supplies its own handler args in the body, and + requires a 200 OK "Fault" response instead of 404 when the desired + method is not found. + + Therefore, XML-RPC cannot be implemented for CherryPy via a Tool alone. + This Controller acts as the dispatch target for the first half (based + on the URL); it then reads the RPC method from the request body and + does its own second dispatch step based on that method. It also reads + body params, and returns a Fault on error. + + The XMLRPCDispatcher strips any /RPC2 prefix; if you aren't using /RPC2 + in your URL's, you can safely skip turning on the XMLRPCDispatcher. + Otherwise, you need to use declare it in config: + + request.dispatch: cherrypy.dispatch.XMLRPCDispatcher() + """ + + # Note we're hard-coding this into the 'tools' namespace. We could do + # a huge amount of work to make it relocatable, but the only reason why + # would be if someone actually disabled the default_toolbox. Meh. + _cp_config = {'tools.xmlrpc.on': True} + + def default(self, *vpath, **params): + rpcparams, rpcmethod = _xmlrpc.process_body() + + subhandler = self + for attr in str(rpcmethod).split('.'): + subhandler = getattr(subhandler, attr, None) + + if subhandler and getattr(subhandler, "exposed", False): + body = subhandler(*(vpath + rpcparams), **params) + + else: + # http://www.cherrypy.org/ticket/533 + # if a method is not found, an xmlrpclib.Fault should be returned + # raising an exception here will do that; see + # cherrypy.lib.xmlrpc.on_error + raise Exception('method "%s" is not supported' % attr) + + conf = cherrypy.serving.request.toolmaps['tools'].get("xmlrpc", {}) + _xmlrpc.respond(body, + conf.get('encoding', 'utf-8'), + conf.get('allow_none', 0)) + return cherrypy.serving.response.body + default.exposed = True + + +class SessionAuthTool(HandlerTool): + + def _setargs(self): + for name in dir(cptools.SessionAuth): + if not name.startswith("__"): + setattr(self, name, None) + + +class CachingTool(Tool): + """Caching Tool for CherryPy.""" + + def _wrapper(self, **kwargs): + request = cherrypy.serving.request + if _caching.get(**kwargs): + request.handler = None + else: + if request.cacheable: + # Note the devious technique here of adding hooks on the fly + request.hooks.attach('before_finalize', _caching.tee_output, + priority=90) + _wrapper.priority = 20 + + def _setup(self): + """Hook caching into cherrypy.request.""" + conf = self._merged_args() + + p = conf.pop("priority", None) + cherrypy.serving.request.hooks.attach('before_handler', self._wrapper, + priority=p, **conf) + + + +class Toolbox(object): + """A collection of Tools. + + This object also functions as a config namespace handler for itself. + Custom toolboxes should be added to each Application's toolboxes dict. + """ + + def __init__(self, namespace): + self.namespace = namespace + + def __setattr__(self, name, value): + # If the Tool._name is None, supply it from the attribute name. + if isinstance(value, Tool): + if value._name is None: + value._name = name + value.namespace = self.namespace + object.__setattr__(self, name, value) + + def __enter__(self): + """Populate request.toolmaps from tools specified in config.""" + cherrypy.serving.request.toolmaps[self.namespace] = map = {} + def populate(k, v): + toolname, arg = k.split(".", 1) + bucket = map.setdefault(toolname, {}) + bucket[arg] = v + return populate + + def __exit__(self, exc_type, exc_val, exc_tb): + """Run tool._setup() for each tool in our toolmap.""" + map = cherrypy.serving.request.toolmaps.get(self.namespace) + if map: + for name, settings in map.items(): + if settings.get("on", False): + tool = getattr(self, name) + tool._setup() + + +class DeprecatedTool(Tool): + + _name = None + warnmsg = "This Tool is deprecated." + + def __init__(self, point, warnmsg=None): + self.point = point + if warnmsg is not None: + self.warnmsg = warnmsg + + def __call__(self, *args, **kwargs): + warnings.warn(self.warnmsg) + def tool_decorator(f): + return f + return tool_decorator + + def _setup(self): + warnings.warn(self.warnmsg) + + +default_toolbox = _d = Toolbox("tools") +_d.session_auth = SessionAuthTool(cptools.session_auth) +_d.proxy = Tool('before_request_body', cptools.proxy, priority=30) +_d.response_headers = Tool('on_start_resource', cptools.response_headers) +_d.log_tracebacks = Tool('before_error_response', cptools.log_traceback) +_d.log_headers = Tool('before_error_response', cptools.log_request_headers) +_d.log_hooks = Tool('on_end_request', cptools.log_hooks, priority=100) +_d.err_redirect = ErrorTool(cptools.redirect) +_d.etags = Tool('before_finalize', cptools.validate_etags, priority=75) +_d.decode = Tool('before_request_body', encoding.decode) +# the order of encoding, gzip, caching is important +_d.encode = Tool('before_handler', encoding.ResponseEncoder, priority=70) +_d.gzip = Tool('before_finalize', encoding.gzip, priority=80) +_d.staticdir = HandlerTool(static.staticdir) +_d.staticfile = HandlerTool(static.staticfile) +_d.sessions = SessionTool() +_d.xmlrpc = ErrorTool(_xmlrpc.on_error) +_d.caching = CachingTool('before_handler', _caching.get, 'caching') +_d.expires = Tool('before_finalize', _caching.expires) +_d.tidy = DeprecatedTool('before_finalize', + "The tidy tool has been removed from the standard distribution of CherryPy. " + "The most recent version can be found at http://tools.cherrypy.org/browser.") +_d.nsgmls = DeprecatedTool('before_finalize', + "The nsgmls tool has been removed from the standard distribution of CherryPy. " + "The most recent version can be found at http://tools.cherrypy.org/browser.") +_d.ignore_headers = Tool('before_request_body', cptools.ignore_headers) +_d.referer = Tool('before_request_body', cptools.referer) +_d.basic_auth = Tool('on_start_resource', auth.basic_auth) +_d.digest_auth = Tool('on_start_resource', auth.digest_auth) +_d.trailing_slash = Tool('before_handler', cptools.trailing_slash, priority=60) +_d.flatten = Tool('before_finalize', cptools.flatten) +_d.accept = Tool('on_start_resource', cptools.accept) +_d.redirect = Tool('on_start_resource', cptools.redirect) +_d.autovary = Tool('on_start_resource', cptools.autovary, priority=0) +_d.json_in = Tool('before_request_body', jsontools.json_in, priority=30) +_d.json_out = Tool('before_handler', jsontools.json_out, priority=30) +_d.auth_basic = Tool('before_handler', auth_basic.basic_auth, priority=1) +_d.auth_digest = Tool('before_handler', auth_digest.digest_auth, priority=1) + +del _d, cptools, encoding, auth, static diff --git a/cherrypy/_cptree.py b/cherrypy/_cptree.py new file mode 100644 index 00000000..9c89bdb8 --- /dev/null +++ b/cherrypy/_cptree.py @@ -0,0 +1,278 @@ +"""CherryPy Application and Tree objects.""" + +import os +import cherrypy +from cherrypy import _cpconfig, _cplogging, _cprequest, _cpwsgi, tools +from cherrypy.lib import httputil + + +class Application(object): + """A CherryPy Application. + + Servers and gateways should not instantiate Request objects directly. + Instead, they should ask an Application object for a request object. + + An instance of this class may also be used as a WSGI callable + (WSGI application object) for itself. + """ + + __metaclass__ = cherrypy._AttributeDocstrings + + root = None + root__doc = """ + The top-most container of page handlers for this app. Handlers should + be arranged in a hierarchy of attributes, matching the expected URI + hierarchy; the default dispatcher then searches this hierarchy for a + matching handler. When using a dispatcher other than the default, + this value may be None.""" + + config = {} + config__doc = """ + A dict of {path: pathconf} pairs, where 'pathconf' is itself a dict + of {key: value} pairs.""" + + namespaces = _cpconfig.NamespaceSet() + toolboxes = {'tools': cherrypy.tools} + + log = None + log__doc = """A LogManager instance. See _cplogging.""" + + wsgiapp = None + wsgiapp__doc = """A CPWSGIApp instance. See _cpwsgi.""" + + request_class = _cprequest.Request + response_class = _cprequest.Response + + relative_urls = False + + def __init__(self, root, script_name="", config=None): + self.log = _cplogging.LogManager(id(self), cherrypy.log.logger_root) + self.root = root + self.script_name = script_name + self.wsgiapp = _cpwsgi.CPWSGIApp(self) + + self.namespaces = self.namespaces.copy() + self.namespaces["log"] = lambda k, v: setattr(self.log, k, v) + self.namespaces["wsgi"] = self.wsgiapp.namespace_handler + + self.config = self.__class__.config.copy() + if config: + self.merge(config) + + def __repr__(self): + return "%s.%s(%r, %r)" % (self.__module__, self.__class__.__name__, + self.root, self.script_name) + + script_name__doc = """ + The URI "mount point" for this app. A mount point is that portion of + the URI which is constant for all URIs that are serviced by this + application; it does not include scheme, host, or proxy ("virtual host") + portions of the URI. + + For example, if script_name is "/my/cool/app", then the URL + "http://www.example.com/my/cool/app/page1" might be handled by a + "page1" method on the root object. + + The value of script_name MUST NOT end in a slash. If the script_name + refers to the root of the URI, it MUST be an empty string (not "/"). + + If script_name is explicitly set to None, then the script_name will be + provided for each call from request.wsgi_environ['SCRIPT_NAME']. + """ + def _get_script_name(self): + if self._script_name is None: + # None signals that the script name should be pulled from WSGI environ. + return cherrypy.serving.request.wsgi_environ['SCRIPT_NAME'].rstrip("/") + return self._script_name + def _set_script_name(self, value): + if value: + value = value.rstrip("/") + self._script_name = value + script_name = property(fget=_get_script_name, fset=_set_script_name, + doc=script_name__doc) + + def merge(self, config): + """Merge the given config into self.config.""" + _cpconfig.merge(self.config, config) + + # Handle namespaces specified in config. + self.namespaces(self.config.get("/", {})) + + def find_config(self, path, key, default=None): + """Return the most-specific value for key along path, or default.""" + trail = path or "/" + while trail: + nodeconf = self.config.get(trail, {}) + + if key in nodeconf: + return nodeconf[key] + + lastslash = trail.rfind("/") + if lastslash == -1: + break + elif lastslash == 0 and trail != "/": + trail = "/" + else: + trail = trail[:lastslash] + + return default + + def get_serving(self, local, remote, scheme, sproto): + """Create and return a Request and Response object.""" + req = self.request_class(local, remote, scheme, sproto) + req.app = self + + for name, toolbox in self.toolboxes.items(): + req.namespaces[name] = toolbox + + resp = self.response_class() + cherrypy.serving.load(req, resp) + cherrypy.engine.timeout_monitor.acquire() + cherrypy.engine.publish('acquire_thread') + + return req, resp + + def release_serving(self): + """Release the current serving (request and response).""" + req = cherrypy.serving.request + + cherrypy.engine.timeout_monitor.release() + + try: + req.close() + except: + cherrypy.log(traceback=True, severity=40) + + cherrypy.serving.clear() + + def __call__(self, environ, start_response): + return self.wsgiapp(environ, start_response) + + +class Tree(object): + """A registry of CherryPy applications, mounted at diverse points. + + An instance of this class may also be used as a WSGI callable + (WSGI application object), in which case it dispatches to all + mounted apps. + """ + + apps = {} + apps__doc = """ + A dict of the form {script name: application}, where "script name" + is a string declaring the URI mount point (no trailing slash), and + "application" is an instance of cherrypy.Application (or an arbitrary + WSGI callable if you happen to be using a WSGI server).""" + + def __init__(self): + self.apps = {} + + def mount(self, root, script_name="", config=None): + """Mount a new app from a root object, script_name, and config. + + root: an instance of a "controller class" (a collection of page + handler methods) which represents the root of the application. + This may also be an Application instance, or None if using + a dispatcher other than the default. + script_name: a string containing the "mount point" of the application. + This should start with a slash, and be the path portion of the + URL at which to mount the given root. For example, if root.index() + will handle requests to "http://www.example.com:8080/dept/app1/", + then the script_name argument would be "/dept/app1". + + It MUST NOT end in a slash. If the script_name refers to the + root of the URI, it MUST be an empty string (not "/"). + config: a file or dict containing application config. + """ + if script_name is None: + raise TypeError( + "The 'script_name' argument may not be None. Application " + "objects may, however, possess a script_name of None (in " + "order to inpect the WSGI environ for SCRIPT_NAME upon each " + "request). You cannot mount such Applications on this Tree; " + "you must pass them to a WSGI server interface directly.") + + # Next line both 1) strips trailing slash and 2) maps "/" -> "". + script_name = script_name.rstrip("/") + + if isinstance(root, Application): + app = root + if script_name != "" and script_name != app.script_name: + raise ValueError("Cannot specify a different script name and " + "pass an Application instance to cherrypy.mount") + script_name = app.script_name + else: + app = Application(root, script_name) + + # If mounted at "", add favicon.ico + if (script_name == "" and root is not None + and not hasattr(root, "favicon_ico")): + favicon = os.path.join(os.getcwd(), os.path.dirname(__file__), + "favicon.ico") + root.favicon_ico = tools.staticfile.handler(favicon) + + if config: + app.merge(config) + + self.apps[script_name] = app + + return app + + def graft(self, wsgi_callable, script_name=""): + """Mount a wsgi callable at the given script_name.""" + # Next line both 1) strips trailing slash and 2) maps "/" -> "". + script_name = script_name.rstrip("/") + self.apps[script_name] = wsgi_callable + + def script_name(self, path=None): + """The script_name of the app at the given path, or None. + + If path is None, cherrypy.request is used. + """ + if path is None: + try: + request = cherrypy.serving.request + path = httputil.urljoin(request.script_name, + request.path_info) + except AttributeError: + return None + + while True: + if path in self.apps: + return path + + if path == "": + return None + + # Move one node up the tree and try again. + path = path[:path.rfind("/")] + + def __call__(self, environ, start_response): + # If you're calling this, then you're probably setting SCRIPT_NAME + # to '' (some WSGI servers always set SCRIPT_NAME to ''). + # Try to look up the app using the full path. + env1x = environ + if environ.get(u'wsgi.version') == (u'u', 0): + env1x = _cpwsgi.downgrade_wsgi_ux_to_1x(environ) + path = httputil.urljoin(env1x.get('SCRIPT_NAME', ''), + env1x.get('PATH_INFO', '')) + sn = self.script_name(path or "/") + if sn is None: + start_response('404 Not Found', []) + return [] + + app = self.apps[sn] + + # Correct the SCRIPT_NAME and PATH_INFO environ entries. + environ = environ.copy() + if environ.get(u'wsgi.version') == (u'u', 0): + # Python 2/WSGI u.0: all strings MUST be of type unicode + enc = environ[u'wsgi.url_encoding'] + environ[u'SCRIPT_NAME'] = sn.decode(enc) + environ[u'PATH_INFO'] = path[len(sn.rstrip("/")):].decode(enc) + else: + # Python 2/WSGI 1.x: all strings MUST be of type str + environ['SCRIPT_NAME'] = sn + environ['PATH_INFO'] = path[len(sn.rstrip("/")):] + return app(environ, start_response) + diff --git a/cherrypy/_cpwsgi.py b/cherrypy/_cpwsgi.py new file mode 100644 index 00000000..104562ce --- /dev/null +++ b/cherrypy/_cpwsgi.py @@ -0,0 +1,340 @@ +"""WSGI interface (see PEP 333).""" + +import sys as _sys + +import cherrypy as _cherrypy +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +from cherrypy import _cperror +from cherrypy.lib import httputil + + +def downgrade_wsgi_ux_to_1x(environ): + """Return a new environ dict for WSGI 1.x from the given WSGI u.x environ.""" + env1x = {} + + url_encoding = environ[u'wsgi.url_encoding'] + for k, v in environ.items(): + if k in [u'PATH_INFO', u'SCRIPT_NAME', u'QUERY_STRING']: + v = v.encode(url_encoding) + elif isinstance(v, unicode): + v = v.encode('ISO-8859-1') + env1x[k.encode('ISO-8859-1')] = v + + return env1x + + +class VirtualHost(object): + """Select a different WSGI application based on the Host header. + + This can be useful when running multiple sites within one CP server. + It allows several domains to point to different applications. For example: + + root = Root() + RootApp = cherrypy.Application(root) + Domain2App = cherrypy.Application(root) + SecureApp = cherrypy.Application(Secure()) + + vhost = cherrypy._cpwsgi.VirtualHost(RootApp, + domains={'www.domain2.example': Domain2App, + 'www.domain2.example:443': SecureApp, + }) + + cherrypy.tree.graft(vhost) + + default: required. The default WSGI application. + + use_x_forwarded_host: if True (the default), any "X-Forwarded-Host" + request header will be used instead of the "Host" header. This + is commonly added by HTTP servers (such as Apache) when proxying. + + domains: a dict of {host header value: application} pairs. + The incoming "Host" request header is looked up in this dict, + and, if a match is found, the corresponding WSGI application + will be called instead of the default. Note that you often need + separate entries for "example.com" and "www.example.com". + In addition, "Host" headers may contain the port number. + """ + + def __init__(self, default, domains=None, use_x_forwarded_host=True): + self.default = default + self.domains = domains or {} + self.use_x_forwarded_host = use_x_forwarded_host + + def __call__(self, environ, start_response): + domain = environ.get('HTTP_HOST', '') + if self.use_x_forwarded_host: + domain = environ.get("HTTP_X_FORWARDED_HOST", domain) + + nextapp = self.domains.get(domain) + if nextapp is None: + nextapp = self.default + return nextapp(environ, start_response) + + +class InternalRedirector(object): + """WSGI middleware that handles raised cherrypy.InternalRedirect.""" + + def __init__(self, nextapp, recursive=False): + self.nextapp = nextapp + self.recursive = recursive + + def __call__(self, environ, start_response): + redirections = [] + while True: + environ = environ.copy() + try: + return self.nextapp(environ, start_response) + except _cherrypy.InternalRedirect, ir: + sn = environ.get('SCRIPT_NAME', '') + path = environ.get('PATH_INFO', '') + qs = environ.get('QUERY_STRING', '') + + # Add the *previous* path_info + qs to redirections. + old_uri = sn + path + if qs: + old_uri += "?" + qs + redirections.append(old_uri) + + if not self.recursive: + # Check to see if the new URI has been redirected to already + new_uri = sn + ir.path + if ir.query_string: + new_uri += "?" + ir.query_string + if new_uri in redirections: + ir.request.close() + raise RuntimeError("InternalRedirector visited the " + "same URL twice: %r" % new_uri) + + # Munge the environment and try again. + environ['REQUEST_METHOD'] = "GET" + environ['PATH_INFO'] = ir.path + environ['QUERY_STRING'] = ir.query_string + environ['wsgi.input'] = StringIO() + environ['CONTENT_LENGTH'] = "0" + environ['cherrypy.previous_request'] = ir.request + + +class ExceptionTrapper(object): + + def __init__(self, nextapp, throws=(KeyboardInterrupt, SystemExit)): + self.nextapp = nextapp + self.throws = throws + + def __call__(self, environ, start_response): + return _TrappedResponse(self.nextapp, environ, start_response, self.throws) + + +class _TrappedResponse(object): + + response = iter([]) + + def __init__(self, nextapp, environ, start_response, throws): + self.nextapp = nextapp + self.environ = environ + self.start_response = start_response + self.throws = throws + self.started_response = False + self.response = self.trap(self.nextapp, self.environ, self.start_response) + self.iter_response = iter(self.response) + + def __iter__(self): + self.started_response = True + return self + + def next(self): + return self.trap(self.iter_response.next) + + def close(self): + if hasattr(self.response, 'close'): + self.response.close() + + def trap(self, func, *args, **kwargs): + try: + return func(*args, **kwargs) + except self.throws: + raise + except StopIteration: + raise + except: + tb = _cperror.format_exc() + #print('trapped (started %s):' % self.started_response, tb) + _cherrypy.log(tb, severity=40) + if not _cherrypy.request.show_tracebacks: + tb = "" + s, h, b = _cperror.bare_error(tb) + if self.started_response: + # Empty our iterable (so future calls raise StopIteration) + self.iter_response = iter([]) + else: + self.iter_response = iter(b) + + try: + self.start_response(s, h, _sys.exc_info()) + except: + # "The application must not trap any exceptions raised by + # start_response, if it called start_response with exc_info. + # Instead, it should allow such exceptions to propagate + # back to the server or gateway." + # But we still log and call close() to clean up ourselves. + _cherrypy.log(traceback=True, severity=40) + raise + + if self.started_response: + return "".join(b) + else: + return b + + +# WSGI-to-CP Adapter # + + +class AppResponse(object): + """WSGI response iterable for CherryPy applications.""" + + def __init__(self, environ, start_response, cpapp): + if environ.get(u'wsgi.version') == (u'u', 0): + environ = downgrade_wsgi_ux_to_1x(environ) + self.environ = environ + self.cpapp = cpapp + try: + self.run() + except: + self.close() + raise + r = _cherrypy.serving.response + self.iter_response = iter(r.body) + self.write = start_response(r.output_status, r.header_list) + + def __iter__(self): + return self + + def next(self): + return self.iter_response.next() + + def close(self): + """Close and de-reference the current request and response. (Core)""" + self.cpapp.release_serving() + + def run(self): + """Create a Request object using environ.""" + env = self.environ.get + + local = httputil.Host('', int(env('SERVER_PORT', 80)), + env('SERVER_NAME', '')) + remote = httputil.Host(env('REMOTE_ADDR', ''), + int(env('REMOTE_PORT', -1)), + env('REMOTE_HOST', '')) + scheme = env('wsgi.url_scheme') + sproto = env('ACTUAL_SERVER_PROTOCOL', "HTTP/1.1") + request, resp = self.cpapp.get_serving(local, remote, scheme, sproto) + + # LOGON_USER is served by IIS, and is the name of the + # user after having been mapped to a local account. + # Both IIS and Apache set REMOTE_USER, when possible. + request.login = env('LOGON_USER') or env('REMOTE_USER') or None + request.multithread = self.environ['wsgi.multithread'] + request.multiprocess = self.environ['wsgi.multiprocess'] + request.wsgi_environ = self.environ + request.prev = env('cherrypy.previous_request', None) + + meth = self.environ['REQUEST_METHOD'] + + path = httputil.urljoin(self.environ.get('SCRIPT_NAME', ''), + self.environ.get('PATH_INFO', '')) + qs = self.environ.get('QUERY_STRING', '') + rproto = self.environ.get('SERVER_PROTOCOL') + headers = self.translate_headers(self.environ) + rfile = self.environ['wsgi.input'] + request.run(meth, path, qs, rproto, headers, rfile) + + headerNames = {'HTTP_CGI_AUTHORIZATION': 'Authorization', + 'CONTENT_LENGTH': 'Content-Length', + 'CONTENT_TYPE': 'Content-Type', + 'REMOTE_HOST': 'Remote-Host', + 'REMOTE_ADDR': 'Remote-Addr', + } + + def translate_headers(self, environ): + """Translate CGI-environ header names to HTTP header names.""" + for cgiName in environ: + # We assume all incoming header keys are uppercase already. + if cgiName in self.headerNames: + yield self.headerNames[cgiName], environ[cgiName] + elif cgiName[:5] == "HTTP_": + # Hackish attempt at recovering original header names. + translatedHeader = cgiName[5:].replace("_", "-") + yield translatedHeader, environ[cgiName] + + +class CPWSGIApp(object): + """A WSGI application object for a CherryPy Application. + + pipeline: a list of (name, wsgiapp) pairs. Each 'wsgiapp' MUST be a + constructor that takes an initial, positional 'nextapp' argument, + plus optional keyword arguments, and returns a WSGI application + (that takes environ and start_response arguments). The 'name' can + be any you choose, and will correspond to keys in self.config. + + head: rather than nest all apps in the pipeline on each call, it's only + done the first time, and the result is memoized into self.head. Set + this to None again if you change self.pipeline after calling self. + + config: a dict whose keys match names listed in the pipeline. Each + value is a further dict which will be passed to the corresponding + named WSGI callable (from the pipeline) as keyword arguments. + """ + + pipeline = [('ExceptionTrapper', ExceptionTrapper), + ('InternalRedirector', InternalRedirector), + ] + head = None + config = {} + + response_class = AppResponse + + def __init__(self, cpapp, pipeline=None): + self.cpapp = cpapp + self.pipeline = self.pipeline[:] + if pipeline: + self.pipeline.extend(pipeline) + self.config = self.config.copy() + + def tail(self, environ, start_response): + """WSGI application callable for the actual CherryPy application. + + You probably shouldn't call this; call self.__call__ instead, + so that any WSGI middleware in self.pipeline can run first. + """ + return self.response_class(environ, start_response, self.cpapp) + + def __call__(self, environ, start_response): + head = self.head + if head is None: + # Create and nest the WSGI apps in our pipeline (in reverse order). + # Then memoize the result in self.head. + head = self.tail + for name, callable in self.pipeline[::-1]: + conf = self.config.get(name, {}) + head = callable(head, **conf) + self.head = head + return head(environ, start_response) + + def namespace_handler(self, k, v): + """Config handler for the 'wsgi' namespace.""" + if k == "pipeline": + # Note this allows multiple 'wsgi.pipeline' config entries + # (but each entry will be processed in a 'random' order). + # It should also allow developers to set default middleware + # in code (passed to self.__init__) that deployers can add to + # (but not remove) via config. + self.pipeline.extend(v) + elif k == "response_class": + self.response_class = v + else: + name, arg = k.split(".", 1) + bucket = self.config.setdefault(name, {}) + bucket[arg] = v + diff --git a/cherrypy/_cpwsgi_server.py b/cherrypy/_cpwsgi_server.py new file mode 100644 index 00000000..55c3a42a --- /dev/null +++ b/cherrypy/_cpwsgi_server.py @@ -0,0 +1,62 @@ +"""WSGI server interface (see PEP 333). This adds some CP-specific bits to +the framework-agnostic wsgiserver package. +""" +import sys + +import cherrypy +from cherrypy import wsgiserver + + +class CPHTTPRequest(wsgiserver.HTTPRequest): + pass + + +class CPHTTPConnection(wsgiserver.HTTPConnection): + pass + + +class CPWSGIServer(wsgiserver.CherryPyWSGIServer): + """Wrapper for wsgiserver.CherryPyWSGIServer. + + wsgiserver has been designed to not reference CherryPy in any way, + so that it can be used in other frameworks and applications. Therefore, + we wrap it here, so we can set our own mount points from cherrypy.tree + and apply some attributes from config -> cherrypy.server -> wsgiserver. + """ + + def __init__(self, server_adapter=cherrypy.server): + self.server_adapter = server_adapter + self.max_request_header_size = self.server_adapter.max_request_header_size or 0 + self.max_request_body_size = self.server_adapter.max_request_body_size or 0 + + server_name = (self.server_adapter.socket_host or + self.server_adapter.socket_file or + None) + + self.wsgi_version = self.server_adapter.wsgi_version + s = wsgiserver.CherryPyWSGIServer + s.__init__(self, server_adapter.bind_addr, cherrypy.tree, + self.server_adapter.thread_pool, + server_name, + max=self.server_adapter.thread_pool_max, + request_queue_size=self.server_adapter.socket_queue_size, + timeout=self.server_adapter.socket_timeout, + shutdown_timeout=self.server_adapter.shutdown_timeout, + ) + self.protocol = self.server_adapter.protocol_version + self.nodelay = self.server_adapter.nodelay + + ssl_module = self.server_adapter.ssl_module or 'pyopenssl' + if self.server_adapter.ssl_context: + adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) + self.ssl_adapter = adapter_class( + self.server_adapter.ssl_certificate, + self.server_adapter.ssl_private_key, + self.server_adapter.ssl_certificate_chain) + self.ssl_adapter.context = self.server_adapter.ssl_context + elif self.server_adapter.ssl_certificate: + adapter_class = wsgiserver.get_ssl_adapter_class(ssl_module) + self.ssl_adapter = adapter_class( + self.server_adapter.ssl_certificate, + self.server_adapter.ssl_private_key, + self.server_adapter.ssl_certificate_chain) diff --git a/cherrypy/cherryd b/cherrypy/cherryd new file mode 100644 index 00000000..6dcdcca3 --- /dev/null +++ b/cherrypy/cherryd @@ -0,0 +1,102 @@ +#! /usr/bin/env python +"""The CherryPy daemon.""" + +import sys + +import cherrypy +from cherrypy.process import plugins, servers + + +def start(configfiles=None, daemonize=False, environment=None, + fastcgi=False, scgi=False, pidfile=None, imports=None): + """Subscribe all engine plugins and start the engine.""" + sys.path = [''] + sys.path + for i in imports or []: + exec("import %s" % i) + + for c in configfiles or []: + cherrypy.config.update(c) + # If there's only one app mounted, merge config into it. + if len(cherrypy.tree.apps) == 1: + for app in cherrypy.tree.apps.values(): + app.merge(c) + + engine = cherrypy.engine + + if environment is not None: + cherrypy.config.update({'environment': environment}) + + # Only daemonize if asked to. + if daemonize: + # Don't print anything to stdout/sterr. + cherrypy.config.update({'log.screen': False}) + plugins.Daemonizer(engine).subscribe() + + if pidfile: + plugins.PIDFile(engine, pidfile).subscribe() + + if hasattr(engine, "signal_handler"): + engine.signal_handler.subscribe() + if hasattr(engine, "console_control_handler"): + engine.console_control_handler.subscribe() + + if fastcgi and scgi: + # fastcgi and scgi aren't allowed together. + cherrypy.log.error("fastcgi and scgi aren't allowed together.", 'ENGINE') + sys.exit(1) + elif fastcgi or scgi: + # Turn off autoreload when using fastcgi or scgi. + cherrypy.config.update({'engine.autoreload_on': False}) + # Turn off the default HTTP server (which is subscribed by default). + cherrypy.server.unsubscribe() + + addr = cherrypy.server.bind_addr + if fastcgi: + f = servers.FlupFCGIServer(application=cherrypy.tree, + bindAddress=addr) + else: + f = servers.FlupSCGIServer(application=cherrypy.tree, + bindAddress=addr) + s = servers.ServerAdapter(engine, httpserver=f, bind_addr=addr) + s.subscribe() + + # Always start the engine; this will start all other services + try: + engine.start() + except: + # Assume the error has been logged already via bus.log. + sys.exit(1) + else: + engine.block() + + +if __name__ == '__main__': + from optparse import OptionParser + + p = OptionParser() + p.add_option('-c', '--config', action="append", dest='config', + help="specify config file(s)") + p.add_option('-d', action="store_true", dest='daemonize', + help="run the server as a daemon") + p.add_option('-e', '--environment', dest='environment', default=None, + help="apply the given config environment") + p.add_option('-f', action="store_true", dest='fastcgi', + help="start a fastcgi server instead of the default HTTP server") + p.add_option('-s', action="store_true", dest='scgi', + help="start a scgi server instead of the default HTTP server") + p.add_option('-i', '--import', action="append", dest='imports', + help="specify modules to import") + p.add_option('-p', '--pidfile', dest='pidfile', default=None, + help="store the process id in the given file") + p.add_option('-P', '--Path', action="append", dest='Path', + help="add the given paths to sys.path") + options, args = p.parse_args() + + if options.Path: + for p in options.Path: + sys.path.insert(0, p) + + start(options.config, options.daemonize, + options.environment, options.fastcgi, options.scgi, options.pidfile, + options.imports) + diff --git a/cherrypy/favicon.ico b/cherrypy/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2c6a2fad7eb3fa64b1b1df6ad0ead3799ea1485f GIT binary patch literal 4286 zcmbtYXHZmG7H-QQ&em)>IwmC9WF$37qR`!#W@OBfAQBo7L`6nH1qB_&K@%skic{2C#L7FY;*=Hi?(@0*`fFpC zs$A&XX0sSsCw)7E#Ea(U(>O|hZ{K%X{|oK&w_GBB>b&v*yiyLsad`o3;+55X_vxN# zzbVN_){yR{qSPapoKXVHC5m6H8sf0BRLnmNfJ-TIhld7ZNM9L`+52BSzh>90ca{`NuR`+DmqJlJBN49n6;$RBb+7hC_8qWE{PW{im;@_wV;H^@lPTN9D7a7SS0l zI(t;7mB=tUJP+S&EXBhY zy-=UMhKcEA@Jv2Pw&wqf&XVzCl-)&*9ayNNfucf=o~J({uet>$ zQL;uIzD;~#m%6bIe|z-+KNO`RDL0Px?ty*q2*_)yVJuNm9;u+|>cypN4Y>QH8wJ&Q zn6SbVb5f^Z*4hb(%MQlH>*sOt)^p@kUW4Y!EzC&qhvT9#h|F9F^LfLtw=xgUUS3D~ zAq`9<@+=)b`Dj}|Cd5il zG5bq&_@)x6ZOG30*M-$G1g`QYd@I<8m_V@D3~e`B@c89D?5oZNf9_BY&o0Cm4xuJ+ z4maoauzl>=VUa1U7K|bp$(=KE%|v)c+i|jBLm&<}9KZ(UGUSvuQk;~vI(#;cktnvS zo4PS)od`BT2IMzWct~s!lNHLv&^g?KJD*``MTbpe7#{-ivu@3a_Sl6OapFX4=JSRl zqaXz{*G|HBtK1>4ZK0Y`7Wc&`AB+vkssBY*zK8T5p*<_ijC^ZI=NNPPaOacV0)s+NQoSRY2c9+1gD_U!RelQ&8evNT!Deg=c%1;5=!On7^Tvk-7;gNjoXTsv^;}fs! zh{|uo*5dV)%fq$U%wJl6>J3X$2R;AD0~pul#s=w&(KSh3e8hJrI5kdm(z<3Gvfzcpgq=;uH4_6eOxIs~b+iJ(3SrFHXd1ey5AH`9--e zx_zE|7j`%NKE`@_a5>6yf%)uuBgYv|L58p-PEFVmg7pV4Q2eDU`{J`_<0yGr{>jUT z%ACRNW&G-0oQ42q|2@h-iYfC08~e3grw7Z?Tj#-S7q*sbdlcDYPP~*?wu9~nb>K(K z#_Qt~9~*wRrRqs}b2*oT_Kf$|1VDH)A3pn%wRLru&eq|4Vq`k{os_~)y#e0RcyOC02xHU%!kaU2)0`e$|h z32crds7@I7x-yQ6wC4JkP0(<FF{@RGJJtKVAmX=qyT|@NN*)W?kgzN9#`%);kni25$3i*RLo+N;BQrLVDZYw;f zZVb7**n+f)IMvaKshg`W3=i9FqksM%c^?xk{le}0LlrgcR}q{(nRKAuN9VgO9|zCP zv*Df{!u5O)>bI=_vA$?Uv6_Euj3-jZVE7iSAidlRN-*4#0P%KyLY*4KsZW+VMlOHbFd zcVflPV7i}uP4zsKdb$zDNvz4{kuaM(1d|h;p=mpf;GFtLqa$*i_0Rb;@1(<*f|Y8S zvaaj50~$5f$(P~4sUp<3*CTY}w@6bY(BF)$n6b5{(;z(8?$2O-?pwnMndqBMl`={G znfmFORr}{;)tp>c+}xW~*nC~EvUn5y4L0<1-|Mfv6~6uIk^h=OO~wX;GI(DM$e{l& z(3d8fdnW^Fd@rMdRGf93InzwvnK;PHTr0YKA0;LRZX4}~Bm ANB{r; literal 0 HcmV?d00001 diff --git a/cherrypy/lib/__init__.py b/cherrypy/lib/__init__.py new file mode 100644 index 00000000..73310173 --- /dev/null +++ b/cherrypy/lib/__init__.py @@ -0,0 +1,44 @@ +"""CherryPy Library""" + +# Deprecated in CherryPy 3.2 -- remove in CherryPy 3.3 +from cherrypy.lib.reprconf import _Builder, unrepr, modules, attributes + +class file_generator(object): + """Yield the given input (a file object) in chunks (default 64k). (Core)""" + + def __init__(self, input, chunkSize=65536): + self.input = input + self.chunkSize = chunkSize + + def __iter__(self): + return self + + def __next__(self): + chunk = self.input.read(self.chunkSize) + if chunk: + return chunk + else: + self.input.close() + raise StopIteration() + next = __next__ + +def file_generator_limited(fileobj, count, chunk_size=65536): + """Yield the given file object in chunks, stopping after `count` + bytes has been emitted. Default chunk size is 64kB. (Core) + """ + remaining = count + while remaining > 0: + chunk = fileobj.read(min(chunk_size, remaining)) + chunklen = len(chunk) + if chunklen == 0: + return + remaining -= chunklen + yield chunk + +def set_vary_header(response, header_name): + "Add a Vary header to a response" + varies = response.headers.get("Vary", "") + varies = [x.strip() for x in varies.split(",") if x.strip()] + if header_name not in varies: + varies.append(header_name) + response.headers['Vary'] = ", ".join(varies) diff --git a/cherrypy/lib/auth.py b/cherrypy/lib/auth.py new file mode 100644 index 00000000..36ac7710 --- /dev/null +++ b/cherrypy/lib/auth.py @@ -0,0 +1,79 @@ +import cherrypy +from cherrypy.lib import httpauth + + +def check_auth(users, encrypt=None, realm=None): + """If an authorization header contains credentials, return True, else False.""" + request = cherrypy.serving.request + if 'authorization' in request.headers: + # make sure the provided credentials are correctly set + ah = httpauth.parseAuthorization(request.headers['authorization']) + if ah is None: + raise cherrypy.HTTPError(400, 'Bad Request') + + if not encrypt: + encrypt = httpauth.DIGEST_AUTH_ENCODERS[httpauth.MD5] + + if hasattr(users, '__call__'): + try: + # backward compatibility + users = users() # expect it to return a dictionary + + if not isinstance(users, dict): + raise ValueError("Authentication users must be a dictionary") + + # fetch the user password + password = users.get(ah["username"], None) + except TypeError: + # returns a password (encrypted or clear text) + password = users(ah["username"]) + else: + if not isinstance(users, dict): + raise ValueError("Authentication users must be a dictionary") + + # fetch the user password + password = users.get(ah["username"], None) + + # validate the authorization by re-computing it here + # and compare it with what the user-agent provided + if httpauth.checkResponse(ah, password, method=request.method, + encrypt=encrypt, realm=realm): + request.login = ah["username"] + return True + + request.login = False + return False + +def basic_auth(realm, users, encrypt=None, debug=False): + """If auth fails, raise 401 with a basic authentication header. + + realm: a string containing the authentication realm. + users: a dict of the form: {username: password} or a callable returning a dict. + encrypt: callable used to encrypt the password returned from the user-agent. + if None it defaults to a md5 encryption. + """ + if check_auth(users, encrypt): + if debug: + cherrypy.log('Auth successful', 'TOOLS.BASIC_AUTH') + return + + # inform the user-agent this path is protected + cherrypy.serving.response.headers['www-authenticate'] = httpauth.basicAuth(realm) + + raise cherrypy.HTTPError(401, "You are not authorized to access that resource") + +def digest_auth(realm, users, debug=False): + """If auth fails, raise 401 with a digest authentication header. + + realm: a string containing the authentication realm. + users: a dict of the form: {username: password} or a callable returning a dict. + """ + if check_auth(users, realm=realm): + if debug: + cherrypy.log('Auth successful', 'TOOLS.DIGEST_AUTH') + return + + # inform the user-agent this path is protected + cherrypy.serving.response.headers['www-authenticate'] = httpauth.digestAuth(realm) + + raise cherrypy.HTTPError(401, "You are not authorized to access that resource") diff --git a/cherrypy/lib/auth_basic.py b/cherrypy/lib/auth_basic.py new file mode 100644 index 00000000..7aa6d33c --- /dev/null +++ b/cherrypy/lib/auth_basic.py @@ -0,0 +1,87 @@ +# This file is part of CherryPy +# -*- coding: utf-8 -*- +# vim:ts=4:sw=4:expandtab:fileencoding=utf-8 + +__doc__ = """Module auth_basic.py provides a CherryPy 3.x tool which implements +the server-side of HTTP Basic Access Authentication, as described in RFC 2617. + +Example usage, using the built-in checkpassword_dict function which uses a dict +as the credentials store: + +userpassdict = {'bird' : 'bebop', 'ornette' : 'wayout'} +checkpassword = cherrypy.lib.auth_basic.checkpassword_dict(userpassdict) +basic_auth = {'tools.auth_basic.on': True, + 'tools.auth_basic.realm': 'earth', + 'tools.auth_basic.checkpassword': checkpassword, +} +app_config = { '/' : basic_auth } +""" + +__author__ = 'visteya' +__date__ = 'April 2009' + +import binascii +import base64 +import cherrypy + + +def checkpassword_dict(user_password_dict): + """Returns a checkpassword function which checks credentials + against a dictionary of the form: {username : password}. + + If you want a simple dictionary-based authentication scheme, use + checkpassword_dict(my_credentials_dict) as the value for the + checkpassword argument to basic_auth(). + """ + def checkpassword(realm, user, password): + p = user_password_dict.get(user) + return p and p == password or False + + return checkpassword + + +def basic_auth(realm, checkpassword, debug=False): + """basic_auth is a CherryPy tool which hooks at before_handler to perform + HTTP Basic Access Authentication, as specified in RFC 2617. + + If the request has an 'authorization' header with a 'Basic' scheme, this + tool attempts to authenticate the credentials supplied in that header. If + the request has no 'authorization' header, or if it does but the scheme is + not 'Basic', or if authentication fails, the tool sends a 401 response with + a 'WWW-Authenticate' Basic header. + + Arguments: + realm: a string containing the authentication realm. + + checkpassword: a callable which checks the authentication credentials. + Its signature is checkpassword(realm, username, password). where + username and password are the values obtained from the request's + 'authorization' header. If authentication succeeds, checkpassword + returns True, else it returns False. + """ + + if '"' in realm: + raise ValueError('Realm cannot contain the " (quote) character.') + request = cherrypy.serving.request + + auth_header = request.headers.get('authorization') + if auth_header is not None: + try: + scheme, params = auth_header.split(' ', 1) + if scheme.lower() == 'basic': + # since CherryPy claims compability with Python 2.3, we must use + # the legacy API of base64 + username_password = base64.decodestring(params) + username, password = username_password.split(':', 1) + if checkpassword(realm, username, password): + if debug: + cherrypy.log('Auth succeeded', 'TOOLS.AUTH_BASIC') + request.login = username + return # successful authentication + except (ValueError, binascii.Error): # split() error, base64.decodestring() error + raise cherrypy.HTTPError(400, 'Bad Request') + + # Respond with 401 status and a WWW-Authenticate header + cherrypy.serving.response.headers['www-authenticate'] = 'Basic realm="%s"' % realm + raise cherrypy.HTTPError(401, "You are not authorized to access that resource") + diff --git a/cherrypy/lib/auth_digest.py b/cherrypy/lib/auth_digest.py new file mode 100644 index 00000000..ba64a592 --- /dev/null +++ b/cherrypy/lib/auth_digest.py @@ -0,0 +1,358 @@ +# This file is part of CherryPy +# -*- coding: utf-8 -*- +# vim:ts=4:sw=4:expandtab:fileencoding=utf-8 + +__doc__ = """An implementation of the server-side of HTTP Digest Access +Authentication, which is described in RFC 2617. + +Example usage, using the built-in get_ha1_dict_plain function which uses a dict +of plaintext passwords as the credentials store: + +userpassdict = {'alice' : '4x5istwelve'} +get_ha1 = cherrypy.lib.auth_digest.get_ha1_dict_plain(userpassdict) +digest_auth = {'tools.auth_digest.on': True, + 'tools.auth_digest.realm': 'wonderland', + 'tools.auth_digest.get_ha1': get_ha1, + 'tools.auth_digest.key': 'a565c27146791cfb', +} +app_config = { '/' : digest_auth } +""" + +__author__ = 'visteya' +__date__ = 'April 2009' + + +try: + from hashlib import md5 +except ImportError: + # Python 2.4 and earlier + from md5 import new as md5 +md5_hex = lambda s: md5(s).hexdigest() + +import time +import base64 +from urllib2 import parse_http_list, parse_keqv_list + +import cherrypy + +qop_auth = 'auth' +qop_auth_int = 'auth-int' +valid_qops = (qop_auth, qop_auth_int) + +valid_algorithms = ('MD5', 'MD5-sess') + + +def TRACE(msg): + cherrypy.log(msg, context='TOOLS.AUTH_DIGEST') + +# Three helper functions for users of the tool, providing three variants +# of get_ha1() functions for three different kinds of credential stores. +def get_ha1_dict_plain(user_password_dict): + """Returns a get_ha1 function which obtains a plaintext password from a + dictionary of the form: {username : password}. + + If you want a simple dictionary-based authentication scheme, with plaintext + passwords, use get_ha1_dict_plain(my_userpass_dict) as the value for the + get_ha1 argument to digest_auth(). + """ + def get_ha1(realm, username): + password = user_password_dict.get(username) + if password: + return md5_hex('%s:%s:%s' % (username, realm, password)) + return None + + return get_ha1 + +def get_ha1_dict(user_ha1_dict): + """Returns a get_ha1 function which obtains a HA1 password hash from a + dictionary of the form: {username : HA1}. + + If you want a dictionary-based authentication scheme, but with + pre-computed HA1 hashes instead of plain-text passwords, use + get_ha1_dict(my_userha1_dict) as the value for the get_ha1 + argument to digest_auth(). + """ + def get_ha1(realm, username): + return user_ha1_dict.get(user) + + return get_ha1 + +def get_ha1_file_htdigest(filename): + """Returns a get_ha1 function which obtains a HA1 password hash from a + flat file with lines of the same format as that produced by the Apache + htdigest utility. For example, for realm 'wonderland', username 'alice', + and password '4x5istwelve', the htdigest line would be: + + alice:wonderland:3238cdfe91a8b2ed8e39646921a02d4c + + If you want to use an Apache htdigest file as the credentials store, + then use get_ha1_file_htdigest(my_htdigest_file) as the value for the + get_ha1 argument to digest_auth(). It is recommended that the filename + argument be an absolute path, to avoid problems. + """ + def get_ha1(realm, username): + result = None + f = open(filename, 'r') + for line in f: + u, r, ha1 = line.rstrip().split(':') + if u == username and r == realm: + result = ha1 + break + f.close() + return result + + return get_ha1 + + +def synthesize_nonce(s, key, timestamp=None): + """Synthesize a nonce value which resists spoofing and can be checked for staleness. + Returns a string suitable as the value for 'nonce' in the www-authenticate header. + + Args: + s: a string related to the resource, such as the hostname of the server. + key: a secret string known only to the server. + timestamp: an integer seconds-since-the-epoch timestamp + """ + if timestamp is None: + timestamp = int(time.time()) + h = md5_hex('%s:%s:%s' % (timestamp, s, key)) + nonce = '%s:%s' % (timestamp, h) + return nonce + + +def H(s): + """The hash function H""" + return md5_hex(s) + + +class HttpDigestAuthorization (object): + """Class to parse a Digest Authorization header and perform re-calculation + of the digest. + """ + + def errmsg(self, s): + return 'Digest Authorization header: %s' % s + + def __init__(self, auth_header, http_method, debug=False): + self.http_method = http_method + self.debug = debug + scheme, params = auth_header.split(" ", 1) + self.scheme = scheme.lower() + if self.scheme != 'digest': + raise ValueError('Authorization scheme is not "Digest"') + + self.auth_header = auth_header + + # make a dict of the params + items = parse_http_list(params) + paramsd = parse_keqv_list(items) + + self.realm = paramsd.get('realm') + self.username = paramsd.get('username') + self.nonce = paramsd.get('nonce') + self.uri = paramsd.get('uri') + self.method = paramsd.get('method') + self.response = paramsd.get('response') # the response digest + self.algorithm = paramsd.get('algorithm', 'MD5') + self.cnonce = paramsd.get('cnonce') + self.opaque = paramsd.get('opaque') + self.qop = paramsd.get('qop') # qop + self.nc = paramsd.get('nc') # nonce count + + # perform some correctness checks + if self.algorithm not in valid_algorithms: + raise ValueError(self.errmsg("Unsupported value for algorithm: '%s'" % self.algorithm)) + + has_reqd = self.username and \ + self.realm and \ + self.nonce and \ + self.uri and \ + self.response + if not has_reqd: + raise ValueError(self.errmsg("Not all required parameters are present.")) + + if self.qop: + if self.qop not in valid_qops: + raise ValueError(self.errmsg("Unsupported value for qop: '%s'" % self.qop)) + if not (self.cnonce and self.nc): + raise ValueError(self.errmsg("If qop is sent then cnonce and nc MUST be present")) + else: + if self.cnonce or self.nc: + raise ValueError(self.errmsg("If qop is not sent, neither cnonce nor nc can be present")) + + + def __str__(self): + return 'authorization : %s' % self.auth_header + + def validate_nonce(self, s, key): + """Validate the nonce. + Returns True if nonce was generated by synthesize_nonce() and the timestamp + is not spoofed, else returns False. + + Args: + s: a string related to the resource, such as the hostname of the server. + key: a secret string known only to the server. + Both s and key must be the same values which were used to synthesize the nonce + we are trying to validate. + """ + try: + timestamp, hashpart = self.nonce.split(':', 1) + s_timestamp, s_hashpart = synthesize_nonce(s, key, timestamp).split(':', 1) + is_valid = s_hashpart == hashpart + if self.debug: + TRACE('validate_nonce: %s' % is_valid) + return is_valid + except ValueError: # split() error + pass + return False + + + def is_nonce_stale(self, max_age_seconds=600): + """Returns True if a validated nonce is stale. The nonce contains a + timestamp in plaintext and also a secure hash of the timestamp. You should + first validate the nonce to ensure the plaintext timestamp is not spoofed. + """ + try: + timestamp, hashpart = self.nonce.split(':', 1) + if int(timestamp) + max_age_seconds > int(time.time()): + return False + except ValueError: # int() error + pass + if self.debug: + TRACE("nonce is stale") + return True + + + def HA2(self, entity_body=''): + """Returns the H(A2) string. See RFC 2617 3.2.2.3.""" + # RFC 2617 3.2.2.3 + # If the "qop" directive's value is "auth" or is unspecified, then A2 is: + # A2 = method ":" digest-uri-value + # + # If the "qop" value is "auth-int", then A2 is: + # A2 = method ":" digest-uri-value ":" H(entity-body) + if self.qop is None or self.qop == "auth": + a2 = '%s:%s' % (self.http_method, self.uri) + elif self.qop == "auth-int": + a2 = "%s:%s:%s" % (self.http_method, self.uri, H(entity_body)) + else: + # in theory, this should never happen, since I validate qop in __init__() + raise ValueError(self.errmsg("Unrecognized value for qop!")) + return H(a2) + + + def request_digest(self, ha1, entity_body=''): + """Calculates the Request-Digest. See RFC 2617 3.2.2.1. + Arguments: + + ha1 : the HA1 string obtained from the credentials store. + + entity_body : if 'qop' is set to 'auth-int', then A2 includes a hash + of the "entity body". The entity body is the part of the + message which follows the HTTP headers. See RFC 2617 section + 4.3. This refers to the entity the user agent sent in the request which + has the Authorization header. Typically GET requests don't have an entity, + and POST requests do. + """ + ha2 = self.HA2(entity_body) + # Request-Digest -- RFC 2617 3.2.2.1 + if self.qop: + req = "%s:%s:%s:%s:%s" % (self.nonce, self.nc, self.cnonce, self.qop, ha2) + else: + req = "%s:%s" % (self.nonce, ha2) + + # RFC 2617 3.2.2.2 + # + # If the "algorithm" directive's value is "MD5" or is unspecified, then A1 is: + # A1 = unq(username-value) ":" unq(realm-value) ":" passwd + # + # If the "algorithm" directive's value is "MD5-sess", then A1 is + # calculated only once - on the first request by the client following + # receipt of a WWW-Authenticate challenge from the server. + # A1 = H( unq(username-value) ":" unq(realm-value) ":" passwd ) + # ":" unq(nonce-value) ":" unq(cnonce-value) + if self.algorithm == 'MD5-sess': + ha1 = H('%s:%s:%s' % (ha1, self.nonce, self.cnonce)) + + digest = H('%s:%s' % (ha1, req)) + return digest + + + +def www_authenticate(realm, key, algorithm='MD5', nonce=None, qop=qop_auth, stale=False): + """Constructs a WWW-Authenticate header for Digest authentication.""" + if qop not in valid_qops: + raise ValueError("Unsupported value for qop: '%s'" % qop) + if algorithm not in valid_algorithms: + raise ValueError("Unsupported value for algorithm: '%s'" % algorithm) + + if nonce is None: + nonce = synthesize_nonce(realm, key) + s = 'Digest realm="%s", nonce="%s", algorithm="%s", qop="%s"' % ( + realm, nonce, algorithm, qop) + if stale: + s += ', stale="true"' + return s + + +def digest_auth(realm, get_ha1, key, debug=False): + """digest_auth is a CherryPy tool which hooks at before_handler to perform + HTTP Digest Access Authentication, as specified in RFC 2617. + + If the request has an 'authorization' header with a 'Digest' scheme, this + tool authenticates the credentials supplied in that header. If + the request has no 'authorization' header, or if it does but the scheme is + not "Digest", or if authentication fails, the tool sends a 401 response with + a 'WWW-Authenticate' Digest header. + + Arguments: + realm: a string containing the authentication realm. + + get_ha1: a callable which looks up a username in a credentials store + and returns the HA1 string, which is defined in the RFC to be + MD5(username : realm : password). The function's signature is: + get_ha1(realm, username) + where username is obtained from the request's 'authorization' header. + If username is not found in the credentials store, get_ha1() returns + None. + + key: a secret string known only to the server, used in the synthesis of nonces. + """ + request = cherrypy.serving.request + + auth_header = request.headers.get('authorization') + nonce_is_stale = False + if auth_header is not None: + try: + auth = HttpDigestAuthorization(auth_header, request.method, debug=debug) + except ValueError, e: + raise cherrypy.HTTPError(400, 'Bad Request: %s' % e) + + if debug: + TRACE(str(auth)) + + if auth.validate_nonce(realm, key): + ha1 = get_ha1(realm, auth.username) + if ha1 is not None: + # note that for request.body to be available we need to hook in at + # before_handler, not on_start_resource like 3.1.x digest_auth does. + digest = auth.request_digest(ha1, entity_body=request.body) + if digest == auth.response: # authenticated + if debug: + TRACE("digest matches auth.response") + # Now check if nonce is stale. + # The choice of ten minutes' lifetime for nonce is somewhat arbitrary + nonce_is_stale = auth.is_nonce_stale(max_age_seconds=600) + if not nonce_is_stale: + request.login = auth.username + if debug: + TRACE("authentication of %s successful" % auth.username) + return + + # Respond with 401 status and a WWW-Authenticate header + header = www_authenticate(realm, key, stale=nonce_is_stale) + if debug: + TRACE(header) + cherrypy.serving.response.headers['WWW-Authenticate'] = header + raise cherrypy.HTTPError(401, "You are not authorized to access that resource") + diff --git a/cherrypy/lib/caching.py b/cherrypy/lib/caching.py new file mode 100644 index 00000000..6a032071 --- /dev/null +++ b/cherrypy/lib/caching.py @@ -0,0 +1,401 @@ +import datetime +import threading +import time + +import cherrypy +from cherrypy.lib import cptools, httputil + + +class Cache(object): + + def get(self): + raise NotImplemented + + def put(self, obj, size): + raise NotImplemented + + def delete(self): + raise NotImplemented + + def clear(self): + raise NotImplemented + + + +# ------------------------------- Memory Cache ------------------------------- # + + +class AntiStampedeCache(dict): + + def wait(self, key, timeout=5, debug=False): + """Return the cached value for the given key, or None. + + If timeout is not None (the default), and the value is already + being calculated by another thread, wait until the given timeout has + elapsed. If the value is available before the timeout expires, it is + returned. If not, None is returned, and a sentinel placed in the cache + to signal other threads to wait. + + If timeout is None, no waiting is performed nor sentinels used. + """ + value = self.get(key) + if isinstance(value, threading._Event): + if timeout is None: + # Ignore the other thread and recalc it ourselves. + if debug: + cherrypy.log('No timeout', 'TOOLS.CACHING') + return None + + # Wait until it's done or times out. + if debug: + cherrypy.log('Waiting up to %s seconds' % timeout, 'TOOLS.CACHING') + value.wait(timeout) + if value.result is not None: + # The other thread finished its calculation. Use it. + if debug: + cherrypy.log('Result!', 'TOOLS.CACHING') + return value.result + # Timed out. Stick an Event in the slot so other threads wait + # on this one to finish calculating the value. + if debug: + cherrypy.log('Timed out', 'TOOLS.CACHING') + e = threading.Event() + e.result = None + dict.__setitem__(self, key, e) + + return None + elif value is None: + # Stick an Event in the slot so other threads wait + # on this one to finish calculating the value. + if debug: + cherrypy.log('Timed out', 'TOOLS.CACHING') + e = threading.Event() + e.result = None + dict.__setitem__(self, key, e) + return value + + def __setitem__(self, key, value): + """Set the cached value for the given key.""" + existing = self.get(key) + dict.__setitem__(self, key, value) + if isinstance(existing, threading._Event): + # Set Event.result so other threads waiting on it have + # immediate access without needing to poll the cache again. + existing.result = value + existing.set() + + +class MemoryCache(Cache): + """An in-memory cache for varying response content. + + Each key in self.store is a URI, and each value is an AntiStampedeCache. + The response for any given URI may vary based on the values of + "selecting request headers"; that is, those named in the Vary + response header. We assume the list of header names to be constant + for each URI throughout the lifetime of the application, and store + that list in self.store[uri].selecting_headers. + + The items contained in self.store[uri] have keys which are tuples of request + header values (in the same order as the names in its selecting_headers), + and values which are the actual responses. + """ + + maxobjects = 1000 + maxobj_size = 100000 + maxsize = 10000000 + delay = 600 + antistampede_timeout = 5 + expire_freq = 0.1 + debug = False + + def __init__(self): + self.clear() + + # Run self.expire_cache in a separate daemon thread. + t = threading.Thread(target=self.expire_cache, name='expire_cache') + self.expiration_thread = t + if hasattr(threading.Thread, "daemon"): + # Python 2.6+ + t.daemon = True + else: + t.setDaemon(True) + t.start() + + def clear(self): + """Reset the cache to its initial, empty state.""" + self.store = {} + self.expirations = {} + self.tot_puts = 0 + self.tot_gets = 0 + self.tot_hist = 0 + self.tot_expires = 0 + self.tot_non_modified = 0 + self.cursize = 0 + + def expire_cache(self): + # expire_cache runs in a separate thread which the servers are + # not aware of. It's possible that "time" will be set to None + # arbitrarily, so we check "while time" to avoid exceptions. + # See tickets #99 and #180 for more information. + while time: + now = time.time() + # Must make a copy of expirations so it doesn't change size + # during iteration + for expiration_time, objects in self.expirations.items(): + if expiration_time <= now: + for obj_size, uri, sel_header_values in objects: + try: + del self.store[uri][sel_header_values] + self.tot_expires += 1 + self.cursize -= obj_size + except KeyError: + # the key may have been deleted elsewhere + pass + del self.expirations[expiration_time] + time.sleep(self.expire_freq) + + def get(self): + """Return the current variant if in the cache, else None.""" + request = cherrypy.serving.request + self.tot_gets += 1 + + uri = cherrypy.url(qs=request.query_string) + uricache = self.store.get(uri) + if uricache is None: + return None + + header_values = [request.headers.get(h, '') + for h in uricache.selecting_headers] + header_values.sort() + variant = uricache.wait(key=tuple(header_values), + timeout=self.antistampede_timeout, + debug=self.debug) + if variant is not None: + self.tot_hist += 1 + return variant + + def put(self, variant, size): + """Store the current variant in the cache.""" + request = cherrypy.serving.request + response = cherrypy.serving.response + + uri = cherrypy.url(qs=request.query_string) + uricache = self.store.get(uri) + if uricache is None: + uricache = AntiStampedeCache() + uricache.selecting_headers = [ + e.value for e in response.headers.elements('Vary')] + self.store[uri] = uricache + + if len(self.store) < self.maxobjects: + total_size = self.cursize + size + + # checks if there's space for the object + if (size < self.maxobj_size and total_size < self.maxsize): + # add to the expirations list + expiration_time = response.time + self.delay + bucket = self.expirations.setdefault(expiration_time, []) + bucket.append((size, uri, uricache.selecting_headers)) + + # add to the cache + header_values = [request.headers.get(h, '') + for h in uricache.selecting_headers] + header_values.sort() + uricache[tuple(header_values)] = variant + self.tot_puts += 1 + self.cursize = total_size + + def delete(self): + """Remove ALL cached variants of the current resource.""" + uri = cherrypy.url(qs=cherrypy.serving.request.query_string) + self.store.pop(uri, None) + + +def get(invalid_methods=("POST", "PUT", "DELETE"), debug=False, **kwargs): + """Try to obtain cached output. If fresh enough, raise HTTPError(304). + + If POST, PUT, or DELETE: + * invalidates (deletes) any cached response for this resource + * sets request.cached = False + * sets request.cacheable = False + + else if a cached copy exists: + * sets request.cached = True + * sets request.cacheable = False + * sets response.headers to the cached values + * checks the cached Last-Modified response header against the + current If-(Un)Modified-Since request headers; raises 304 + if necessary. + * sets response.status and response.body to the cached values + * returns True + + otherwise: + * sets request.cached = False + * sets request.cacheable = True + * returns False + """ + request = cherrypy.serving.request + response = cherrypy.serving.response + + if not hasattr(cherrypy, "_cache"): + # Make a process-wide Cache object. + cherrypy._cache = kwargs.pop("cache_class", MemoryCache)() + + # Take all remaining kwargs and set them on the Cache object. + for k, v in kwargs.items(): + setattr(cherrypy._cache, k, v) + cherrypy._cache.debug = debug + + # POST, PUT, DELETE should invalidate (delete) the cached copy. + # See http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.10. + if request.method in invalid_methods: + if debug: + cherrypy.log('request.method %r in invalid_methods %r' % + (request.method, invalid_methods), 'TOOLS.CACHING') + cherrypy._cache.delete() + request.cached = False + request.cacheable = False + return False + + if 'no-cache' in [e.value for e in request.headers.elements('Pragma')]: + request.cached = False + request.cacheable = True + return False + + cache_data = cherrypy._cache.get() + request.cached = bool(cache_data) + request.cacheable = not request.cached + if request.cached: + # Serve the cached copy. + max_age = cherrypy._cache.delay + for v in [e.value for e in request.headers.elements('Cache-Control')]: + atoms = v.split('=', 1) + directive = atoms.pop(0) + if directive == 'max-age': + if len(atoms) != 1 or not atoms[0].isdigit(): + raise cherrypy.HTTPError(400, "Invalid Cache-Control header") + max_age = int(atoms[0]) + break + elif directive == 'no-cache': + if debug: + cherrypy.log('Ignoring cache due to Cache-Control: no-cache', + 'TOOLS.CACHING') + request.cached = False + request.cacheable = True + return False + + if debug: + cherrypy.log('Reading response from cache', 'TOOLS.CACHING') + s, h, b, create_time = cache_data + age = int(response.time - create_time) + if (age > max_age): + if debug: + cherrypy.log('Ignoring cache due to age > %d' % max_age, + 'TOOLS.CACHING') + request.cached = False + request.cacheable = True + return False + + # Copy the response headers. See http://www.cherrypy.org/ticket/721. + response.headers = rh = httputil.HeaderMap() + for k in h: + dict.__setitem__(rh, k, dict.__getitem__(h, k)) + + # Add the required Age header + response.headers["Age"] = str(age) + + try: + # Note that validate_since depends on a Last-Modified header; + # this was put into the cached copy, and should have been + # resurrected just above (response.headers = cache_data[1]). + cptools.validate_since() + except cherrypy.HTTPRedirect, x: + if x.status == 304: + cherrypy._cache.tot_non_modified += 1 + raise + + # serve it & get out from the request + response.status = s + response.body = b + else: + if debug: + cherrypy.log('request is not cached', 'TOOLS.CACHING') + return request.cached + + +def tee_output(): + request = cherrypy.serving.request + if 'no-store' in request.headers.values('Cache-Control'): + return + + def tee(body): + """Tee response.body into a list.""" + if ('no-cache' in response.headers.values('Pragma') or + 'no-store' in response.headers.values('Cache-Control')): + for chunk in body: + yield chunk + return + + output = [] + for chunk in body: + output.append(chunk) + yield chunk + + # save the cache data + body = ''.join(output) + cherrypy._cache.put((response.status, response.headers or {}, + body, response.time), len(body)) + + response = cherrypy.serving.response + response.body = tee(response.body) + + +def expires(secs=0, force=False, debug=False): + """Tool for influencing cache mechanisms using the 'Expires' header. + + 'secs' must be either an int or a datetime.timedelta, and indicates the + number of seconds between response.time and when the response should + expire. The 'Expires' header will be set to (response.time + secs). + + If 'secs' is zero, the 'Expires' header is set one year in the past, and + the following "cache prevention" headers are also set: + 'Pragma': 'no-cache' + 'Cache-Control': 'no-cache, must-revalidate' + + If 'force' is False (the default), the following headers are checked: + 'Etag', 'Last-Modified', 'Age', 'Expires'. If any are already present, + none of the above response headers are set. + """ + + response = cherrypy.serving.response + headers = response.headers + + cacheable = False + if not force: + # some header names that indicate that the response can be cached + for indicator in ('Etag', 'Last-Modified', 'Age', 'Expires'): + if indicator in headers: + cacheable = True + break + + if not cacheable and not force: + if debug: + cherrypy.log('request is not cacheable', 'TOOLS.EXPIRES') + else: + if debug: + cherrypy.log('request is cacheable', 'TOOLS.EXPIRES') + if isinstance(secs, datetime.timedelta): + secs = (86400 * secs.days) + secs.seconds + + if secs == 0: + if force or ("Pragma" not in headers): + headers["Pragma"] = "no-cache" + if cherrypy.serving.request.protocol >= (1, 1): + if force or "Cache-Control" not in headers: + headers["Cache-Control"] = "no-cache, must-revalidate" + # Set an explicit Expires date in the past. + expiry = httputil.HTTPDate(1169942400.0) + else: + expiry = httputil.HTTPDate(response.time + secs) + if force or "Expires" not in headers: + headers["Expires"] = expiry diff --git a/cherrypy/lib/covercp.py b/cherrypy/lib/covercp.py new file mode 100644 index 00000000..1d7bf1f4 --- /dev/null +++ b/cherrypy/lib/covercp.py @@ -0,0 +1,364 @@ +"""Code-coverage tools for CherryPy. + +To use this module, or the coverage tools in the test suite, +you need to download 'coverage.py', either Gareth Rees' original +implementation: +http://www.garethrees.org/2001/12/04/python-coverage/ + +or Ned Batchelder's enhanced version: +http://www.nedbatchelder.com/code/modules/coverage.html + +To turn on coverage tracing, use the following code: + + cherrypy.engine.subscribe('start', covercp.start) + +DO NOT subscribe anything on the 'start_thread' channel, as previously +recommended. Calling start once in the main thread should be sufficient +to start coverage on all threads. Calling start again in each thread +effectively clears any coverage data gathered up to that point. + +Run your code, then use the covercp.serve() function to browse the +results in a web browser. If you run this module from the command line, +it will call serve() for you. +""" + +import re +import sys +import cgi +from urllib import quote_plus +import os, os.path +localFile = os.path.join(os.path.dirname(__file__), "coverage.cache") + +try: + from coverage import the_coverage as coverage + def start(): + coverage.start() +except ImportError: + # Setting coverage to None will raise errors + # that need to be trapped downstream. + coverage = None + + import warnings + warnings.warn("No code coverage will be performed; coverage.py could not be imported.") + + def start(): + pass +start.priority = 20 + +TEMPLATE_MENU = """ + + CherryPy Coverage Menu + + + +

CherryPy Coverage

""" + +TEMPLATE_FORM = """ +
+
+ + Show percentages
+ Hide files over %%
+ Exclude files matching
+ +
+ + +
+
""" + +TEMPLATE_FRAMESET = """ +CherryPy coverage data + + + + + +""" + +TEMPLATE_COVERAGE = """ + + Coverage for %(name)s + + + +

%(name)s

+

%(fullpath)s

+

Coverage: %(pc)s%%

""" + +TEMPLATE_LOC_COVERED = """ + %s  + %s +\n""" +TEMPLATE_LOC_NOT_COVERED = """ + %s  + %s +\n""" +TEMPLATE_LOC_EXCLUDED = """ + %s  + %s +\n""" + +TEMPLATE_ITEM = "%s%s%s\n" + +def _percent(statements, missing): + s = len(statements) + e = s - len(missing) + if s > 0: + return int(round(100.0 * e / s)) + return 0 + +def _show_branch(root, base, path, pct=0, showpct=False, exclude=""): + + # Show the directory name and any of our children + dirs = [k for k, v in root.items() if v] + dirs.sort() + for name in dirs: + newpath = os.path.join(path, name) + + if newpath.lower().startswith(base): + relpath = newpath[len(base):] + yield "| " * relpath.count(os.sep) + yield "%s\n" % \ + (newpath, quote_plus(exclude), name) + + for chunk in _show_branch(root[name], base, newpath, pct, showpct, exclude): + yield chunk + + # Now list the files + if path.lower().startswith(base): + relpath = path[len(base):] + files = [k for k, v in root.items() if not v] + files.sort() + for name in files: + newpath = os.path.join(path, name) + + pc_str = "" + if showpct: + try: + _, statements, _, missing, _ = coverage.analysis2(newpath) + except: + # Yes, we really want to pass on all errors. + pass + else: + pc = _percent(statements, missing) + pc_str = ("%3d%% " % pc).replace(' ', ' ') + if pc < float(pct) or pc == -1: + pc_str = "%s" % pc_str + else: + pc_str = "%s" % pc_str + + yield TEMPLATE_ITEM % ("| " * (relpath.count(os.sep) + 1), + pc_str, newpath, name) + +def _skip_file(path, exclude): + if exclude: + return bool(re.search(exclude, path)) + +def _graft(path, tree): + d = tree + + p = path + atoms = [] + while True: + p, tail = os.path.split(p) + if not tail: + break + atoms.append(tail) + atoms.append(p) + if p != "/": + atoms.append("/") + + atoms.reverse() + for node in atoms: + if node: + d = d.setdefault(node, {}) + +def get_tree(base, exclude): + """Return covered module names as a nested dict.""" + tree = {} + coverage.get_ready() + runs = list(coverage.cexecuted.keys()) + if runs: + for path in runs: + if not _skip_file(path, exclude) and not os.path.isdir(path): + _graft(path, tree) + return tree + +class CoverStats(object): + + def __init__(self, root=None): + if root is None: + # Guess initial depth. Files outside this path will not be + # reachable from the web interface. + import cherrypy + root = os.path.dirname(cherrypy.__file__) + self.root = root + + def index(self): + return TEMPLATE_FRAMESET % self.root.lower() + index.exposed = True + + def menu(self, base="/", pct="50", showpct="", + exclude=r'python\d\.\d|test|tut\d|tutorial'): + + # The coverage module uses all-lower-case names. + base = base.lower().rstrip(os.sep) + + yield TEMPLATE_MENU + yield TEMPLATE_FORM % locals() + + # Start by showing links for parent paths + yield "
" + path = "" + atoms = base.split(os.sep) + atoms.pop() + for atom in atoms: + path += atom + os.sep + yield ("%s %s" + % (path, quote_plus(exclude), atom, os.sep)) + yield "
" + + yield "
" + + # Then display the tree + tree = get_tree(base, exclude) + if not tree: + yield "

No modules covered.

" + else: + for chunk in _show_branch(tree, base, "/", pct, + showpct == 'checked', exclude): + yield chunk + + yield "
" + yield "" + menu.exposed = True + + def annotated_file(self, filename, statements, excluded, missing): + source = open(filename, 'r') + buffer = [] + for lineno, line in enumerate(source.readlines()): + lineno += 1 + line = line.strip("\n\r") + empty_the_buffer = True + if lineno in excluded: + template = TEMPLATE_LOC_EXCLUDED + elif lineno in missing: + template = TEMPLATE_LOC_NOT_COVERED + elif lineno in statements: + template = TEMPLATE_LOC_COVERED + else: + empty_the_buffer = False + buffer.append((lineno, line)) + if empty_the_buffer: + for lno, pastline in buffer: + yield template % (lno, cgi.escape(pastline)) + buffer = [] + yield template % (lineno, cgi.escape(line)) + + def report(self, name): + coverage.get_ready() + filename, statements, excluded, missing, _ = coverage.analysis2(name) + pc = _percent(statements, missing) + yield TEMPLATE_COVERAGE % dict(name=os.path.basename(name), + fullpath=name, + pc=pc) + yield '\n' + for line in self.annotated_file(filename, statements, excluded, + missing): + yield line + yield '
' + yield '' + yield '' + report.exposed = True + + +def serve(path=localFile, port=8080, root=None): + if coverage is None: + raise ImportError("The coverage module could not be imported.") + coverage.cache_default = path + + import cherrypy + cherrypy.config.update({'server.socket_port': int(port), + 'server.thread_pool': 10, + 'environment': "production", + }) + cherrypy.quickstart(CoverStats(root)) + +if __name__ == "__main__": + serve(*tuple(sys.argv[1:])) + diff --git a/cherrypy/lib/cptools.py b/cherrypy/lib/cptools.py new file mode 100644 index 00000000..143b85d1 --- /dev/null +++ b/cherrypy/lib/cptools.py @@ -0,0 +1,580 @@ +"""Functions for builtin CherryPy tools.""" + +import logging +try: + # Python 2.5+ + from hashlib import md5 +except ImportError: + from md5 import new as md5 +import re + +try: + set +except NameError: + from sets import Set as set + +import cherrypy +from cherrypy.lib import httputil as _httputil + + +# Conditional HTTP request support # + +def validate_etags(autotags=False, debug=False): + """Validate the current ETag against If-Match, If-None-Match headers. + + If autotags is True, an ETag response-header value will be provided + from an MD5 hash of the response body (unless some other code has + already provided an ETag header). If False (the default), the ETag + will not be automatic. + + WARNING: the autotags feature is not designed for URL's which allow + methods other than GET. For example, if a POST to the same URL returns + no content, the automatic ETag will be incorrect, breaking a fundamental + use for entity tags in a possibly destructive fashion. Likewise, if you + raise 304 Not Modified, the response body will be empty, the ETag hash + will be incorrect, and your application will break. + See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24 + """ + response = cherrypy.serving.response + + # Guard against being run twice. + if hasattr(response, "ETag"): + return + + status, reason, msg = _httputil.valid_status(response.status) + + etag = response.headers.get('ETag') + + # Automatic ETag generation. See warning in docstring. + if etag: + if debug: + cherrypy.log('ETag already set: %s' % etag, 'TOOLS.ETAGS') + elif not autotags: + if debug: + cherrypy.log('Autotags off', 'TOOLS.ETAGS') + elif status != 200: + if debug: + cherrypy.log('Status not 200', 'TOOLS.ETAGS') + else: + etag = response.collapse_body() + etag = '"%s"' % md5(etag).hexdigest() + if debug: + cherrypy.log('Setting ETag: %s' % etag, 'TOOLS.ETAGS') + response.headers['ETag'] = etag + + response.ETag = etag + + # "If the request would, without the If-Match header field, result in + # anything other than a 2xx or 412 status, then the If-Match header + # MUST be ignored." + if debug: + cherrypy.log('Status: %s' % status, 'TOOLS.ETAGS') + if status >= 200 and status <= 299: + request = cherrypy.serving.request + + conditions = request.headers.elements('If-Match') or [] + conditions = [str(x) for x in conditions] + if debug: + cherrypy.log('If-Match conditions: %s' % repr(conditions), + 'TOOLS.ETAGS') + if conditions and not (conditions == ["*"] or etag in conditions): + raise cherrypy.HTTPError(412, "If-Match failed: ETag %r did " + "not match %r" % (etag, conditions)) + + conditions = request.headers.elements('If-None-Match') or [] + conditions = [str(x) for x in conditions] + if debug: + cherrypy.log('If-None-Match conditions: %s' % repr(conditions), + 'TOOLS.ETAGS') + if conditions == ["*"] or etag in conditions: + if debug: + cherrypy.log('request.method: %s' % request.method, 'TOOLS.ETAGS') + if request.method in ("GET", "HEAD"): + raise cherrypy.HTTPRedirect([], 304) + else: + raise cherrypy.HTTPError(412, "If-None-Match failed: ETag %r " + "matched %r" % (etag, conditions)) + +def validate_since(): + """Validate the current Last-Modified against If-Modified-Since headers. + + If no code has set the Last-Modified response header, then no validation + will be performed. + """ + response = cherrypy.serving.response + lastmod = response.headers.get('Last-Modified') + if lastmod: + status, reason, msg = _httputil.valid_status(response.status) + + request = cherrypy.serving.request + + since = request.headers.get('If-Unmodified-Since') + if since and since != lastmod: + if (status >= 200 and status <= 299) or status == 412: + raise cherrypy.HTTPError(412) + + since = request.headers.get('If-Modified-Since') + if since and since == lastmod: + if (status >= 200 and status <= 299) or status == 304: + if request.method in ("GET", "HEAD"): + raise cherrypy.HTTPRedirect([], 304) + else: + raise cherrypy.HTTPError(412) + + +# Tool code # + +def proxy(base=None, local='X-Forwarded-Host', remote='X-Forwarded-For', + scheme='X-Forwarded-Proto', debug=False): + """Change the base URL (scheme://host[:port][/path]). + + For running a CP server behind Apache, lighttpd, or other HTTP server. + + If you want the new request.base to include path info (not just the host), + you must explicitly set base to the full base path, and ALSO set 'local' + to '', so that the X-Forwarded-Host request header (which never includes + path info) does not override it. Regardless, the value for 'base' MUST + NOT end in a slash. + + cherrypy.request.remote.ip (the IP address of the client) will be + rewritten if the header specified by the 'remote' arg is valid. + By default, 'remote' is set to 'X-Forwarded-For'. If you do not + want to rewrite remote.ip, set the 'remote' arg to an empty string. + """ + + request = cherrypy.serving.request + + if scheme: + s = request.headers.get(scheme, None) + if debug: + cherrypy.log('Testing scheme %r:%r' % (scheme, s), 'TOOLS.PROXY') + if s == 'on' and 'ssl' in scheme.lower(): + # This handles e.g. webfaction's 'X-Forwarded-Ssl: on' header + scheme = 'https' + else: + # This is for lighttpd/pound/Mongrel's 'X-Forwarded-Proto: https' + scheme = s + if not scheme: + scheme = request.base[:request.base.find("://")] + + if local: + lbase = request.headers.get(local, None) + if debug: + cherrypy.log('Testing local %r:%r' % (local, lbase), 'TOOLS.PROXY') + if lbase is not None: + base = lbase.split(',')[0] + if not base: + port = request.local.port + if port == 80: + base = '127.0.0.1' + else: + base = '127.0.0.1:%s' % port + + if base.find("://") == -1: + # add http:// or https:// if needed + base = scheme + "://" + base + + request.base = base + + if remote: + xff = request.headers.get(remote) + if debug: + cherrypy.log('Testing remote %r:%r' % (remote, xff), 'TOOLS.PROXY') + if xff: + if remote == 'X-Forwarded-For': + # See http://bob.pythonmac.org/archives/2005/09/23/apache-x-forwarded-for-caveat/ + xff = xff.split(',')[-1].strip() + request.remote.ip = xff + + +def ignore_headers(headers=('Range',), debug=False): + """Delete request headers whose field names are included in 'headers'. + + This is a useful tool for working behind certain HTTP servers; + for example, Apache duplicates the work that CP does for 'Range' + headers, and will doubly-truncate the response. + """ + request = cherrypy.serving.request + for name in headers: + if name in request.headers: + if debug: + cherrypy.log('Ignoring request header %r' % name, + 'TOOLS.IGNORE_HEADERS') + del request.headers[name] + + +def response_headers(headers=None, debug=False): + """Set headers on the response.""" + if debug: + cherrypy.log('Setting response headers: %s' % repr(headers), + 'TOOLS.RESPONSE_HEADERS') + for name, value in (headers or []): + cherrypy.serving.response.headers[name] = value +response_headers.failsafe = True + + +def referer(pattern, accept=True, accept_missing=False, error=403, + message='Forbidden Referer header.', debug=False): + """Raise HTTPError if Referer header does/does not match the given pattern. + + pattern: a regular expression pattern to test against the Referer. + accept: if True, the Referer must match the pattern; if False, + the Referer must NOT match the pattern. + accept_missing: if True, permit requests with no Referer header. + error: the HTTP error code to return to the client on failure. + message: a string to include in the response body on failure. + """ + try: + ref = cherrypy.serving.request.headers['Referer'] + match = bool(re.match(pattern, ref)) + if debug: + cherrypy.log('Referer %r matches %r' % (ref, pattern), + 'TOOLS.REFERER') + if accept == match: + return + except KeyError: + if debug: + cherrypy.log('No Referer header', 'TOOLS.REFERER') + if accept_missing: + return + + raise cherrypy.HTTPError(error, message) + + +class SessionAuth(object): + """Assert that the user is logged in.""" + + session_key = "username" + debug = False + + def check_username_and_password(self, username, password): + pass + + def anonymous(self): + """Provide a temporary user name for anonymous users.""" + pass + + def on_login(self, username): + pass + + def on_logout(self, username): + pass + + def on_check(self, username): + pass + + def login_screen(self, from_page='..', username='', error_msg='', **kwargs): + return """ +Message: %(error_msg)s +
+ Login:
+ Password:
+
+ +
+""" % {'from_page': from_page, 'username': username, + 'error_msg': error_msg} + + def do_login(self, username, password, from_page='..', **kwargs): + """Login. May raise redirect, or return True if request handled.""" + response = cherrypy.serving.response + error_msg = self.check_username_and_password(username, password) + if error_msg: + body = self.login_screen(from_page, username, error_msg) + response.body = body + if "Content-Length" in response.headers: + # Delete Content-Length header so finalize() recalcs it. + del response.headers["Content-Length"] + return True + else: + cherrypy.serving.request.login = username + cherrypy.session[self.session_key] = username + self.on_login(username) + raise cherrypy.HTTPRedirect(from_page or "/") + + def do_logout(self, from_page='..', **kwargs): + """Logout. May raise redirect, or return True if request handled.""" + sess = cherrypy.session + username = sess.get(self.session_key) + sess[self.session_key] = None + if username: + cherrypy.serving.request.login = None + self.on_logout(username) + raise cherrypy.HTTPRedirect(from_page) + + def do_check(self): + """Assert username. May raise redirect, or return True if request handled.""" + sess = cherrypy.session + request = cherrypy.serving.request + response = cherrypy.serving.response + + username = sess.get(self.session_key) + if not username: + sess[self.session_key] = username = self.anonymous() + if self.debug: + cherrypy.log('No session[username], trying anonymous', 'TOOLS.SESSAUTH') + if not username: + url = cherrypy.url(qs=request.query_string) + if self.debug: + cherrypy.log('No username, routing to login_screen with ' + 'from_page %r' % url, 'TOOLS.SESSAUTH') + response.body = self.login_screen(url) + if "Content-Length" in response.headers: + # Delete Content-Length header so finalize() recalcs it. + del response.headers["Content-Length"] + return True + if self.debug: + cherrypy.log('Setting request.login to %r' % username, 'TOOLS.SESSAUTH') + request.login = username + self.on_check(username) + + def run(self): + request = cherrypy.serving.request + response = cherrypy.serving.response + + path = request.path_info + if path.endswith('login_screen'): + if self.debug: + cherrypy.log('routing %r to login_screen' % path, 'TOOLS.SESSAUTH') + return self.login_screen(**request.params) + elif path.endswith('do_login'): + if request.method != 'POST': + response.headers['Allow'] = "POST" + if self.debug: + cherrypy.log('do_login requires POST', 'TOOLS.SESSAUTH') + raise cherrypy.HTTPError(405) + if self.debug: + cherrypy.log('routing %r to do_login' % path, 'TOOLS.SESSAUTH') + return self.do_login(**request.params) + elif path.endswith('do_logout'): + if request.method != 'POST': + response.headers['Allow'] = "POST" + raise cherrypy.HTTPError(405) + if self.debug: + cherrypy.log('routing %r to do_logout' % path, 'TOOLS.SESSAUTH') + return self.do_logout(**request.params) + else: + if self.debug: + cherrypy.log('No special path, running do_check', 'TOOLS.SESSAUTH') + return self.do_check() + + +def session_auth(**kwargs): + sa = SessionAuth() + for k, v in kwargs.items(): + setattr(sa, k, v) + return sa.run() +session_auth.__doc__ = """Session authentication hook. + +Any attribute of the SessionAuth class may be overridden via a keyword arg +to this function: + +""" + "\n".join(["%s: %s" % (k, type(getattr(SessionAuth, k)).__name__) + for k in dir(SessionAuth) if not k.startswith("__")]) + + +def log_traceback(severity=logging.ERROR, debug=False): + """Write the last error's traceback to the cherrypy error log.""" + cherrypy.log("", "HTTP", severity=severity, traceback=True) + +def log_request_headers(debug=False): + """Write request headers to the cherrypy error log.""" + h = [" %s: %s" % (k, v) for k, v in cherrypy.serving.request.header_list] + cherrypy.log('\nRequest Headers:\n' + '\n'.join(h), "HTTP") + +def log_hooks(debug=False): + """Write request.hooks to the cherrypy error log.""" + request = cherrypy.serving.request + + msg = [] + # Sort by the standard points if possible. + from cherrypy import _cprequest + points = _cprequest.hookpoints + for k in request.hooks.keys(): + if k not in points: + points.append(k) + + for k in points: + msg.append(" %s:" % k) + v = request.hooks.get(k, []) + v.sort() + for h in v: + msg.append(" %r" % h) + cherrypy.log('\nRequest Hooks for ' + cherrypy.url() + + ':\n' + '\n'.join(msg), "HTTP") + +def redirect(url='', internal=True, debug=False): + """Raise InternalRedirect or HTTPRedirect to the given url.""" + if debug: + cherrypy.log('Redirecting %sto: %s' % + ({True: 'internal ', False: ''}[internal], url), + 'TOOLS.REDIRECT') + if internal: + raise cherrypy.InternalRedirect(url) + else: + raise cherrypy.HTTPRedirect(url) + +def trailing_slash(missing=True, extra=False, status=None, debug=False): + """Redirect if path_info has (missing|extra) trailing slash.""" + request = cherrypy.serving.request + pi = request.path_info + + if debug: + cherrypy.log('is_index: %r, missing: %r, extra: %r, path_info: %r' % + (request.is_index, missing, extra, pi), + 'TOOLS.TRAILING_SLASH') + if request.is_index is True: + if missing: + if not pi.endswith('/'): + new_url = cherrypy.url(pi + '/', request.query_string) + raise cherrypy.HTTPRedirect(new_url, status=status or 301) + elif request.is_index is False: + if extra: + # If pi == '/', don't redirect to ''! + if pi.endswith('/') and pi != '/': + new_url = cherrypy.url(pi[:-1], request.query_string) + raise cherrypy.HTTPRedirect(new_url, status=status or 301) + +def flatten(debug=False): + """Wrap response.body in a generator that recursively iterates over body. + + This allows cherrypy.response.body to consist of 'nested generators'; + that is, a set of generators that yield generators. + """ + import types + def flattener(input): + numchunks = 0 + for x in input: + if not isinstance(x, types.GeneratorType): + numchunks += 1 + yield x + else: + for y in flattener(x): + numchunks += 1 + yield y + if debug: + cherrypy.log('Flattened %d chunks' % numchunks, 'TOOLS.FLATTEN') + response = cherrypy.serving.response + response.body = flattener(response.body) + + +def accept(media=None, debug=False): + """Return the client's preferred media-type (from the given Content-Types). + + If 'media' is None (the default), no test will be performed. + + If 'media' is provided, it should be the Content-Type value (as a string) + or values (as a list or tuple of strings) which the current resource + can emit. The client's acceptable media ranges (as declared in the + Accept request header) will be matched in order to these Content-Type + values; the first such string is returned. That is, the return value + will always be one of the strings provided in the 'media' arg (or None + if 'media' is None). + + If no match is found, then HTTPError 406 (Not Acceptable) is raised. + Note that most web browsers send */* as a (low-quality) acceptable + media range, which should match any Content-Type. In addition, "...if + no Accept header field is present, then it is assumed that the client + accepts all media types." + + Matching types are checked in order of client preference first, + and then in the order of the given 'media' values. + + Note that this function does not honor accept-params (other than "q"). + """ + if not media: + return + if isinstance(media, basestring): + media = [media] + request = cherrypy.serving.request + + # Parse the Accept request header, and try to match one + # of the requested media-ranges (in order of preference). + ranges = request.headers.elements('Accept') + if not ranges: + # Any media type is acceptable. + if debug: + cherrypy.log('No Accept header elements', 'TOOLS.ACCEPT') + return media[0] + else: + # Note that 'ranges' is sorted in order of preference + for element in ranges: + if element.qvalue > 0: + if element.value == "*/*": + # Matches any type or subtype + if debug: + cherrypy.log('Match due to */*', 'TOOLS.ACCEPT') + return media[0] + elif element.value.endswith("/*"): + # Matches any subtype + mtype = element.value[:-1] # Keep the slash + for m in media: + if m.startswith(mtype): + if debug: + cherrypy.log('Match due to %s' % element.value, + 'TOOLS.ACCEPT') + return m + else: + # Matches exact value + if element.value in media: + if debug: + cherrypy.log('Match due to %s' % element.value, + 'TOOLS.ACCEPT') + return element.value + + # No suitable media-range found. + ah = request.headers.get('Accept') + if ah is None: + msg = "Your client did not send an Accept header." + else: + msg = "Your client sent this Accept header: %s." % ah + msg += (" But this resource only emits these media types: %s." % + ", ".join(media)) + raise cherrypy.HTTPError(406, msg) + + +class MonitoredHeaderMap(_httputil.HeaderMap): + + def __init__(self): + self.accessed_headers = set() + + def __getitem__(self, key): + self.accessed_headers.add(key) + return _httputil.HeaderMap.__getitem__(self, key) + + def __contains__(self, key): + self.accessed_headers.add(key) + return _httputil.HeaderMap.__contains__(self, key) + + def get(self, key, default=None): + self.accessed_headers.add(key) + return _httputil.HeaderMap.get(self, key, default=default) + + def has_key(self, key): + self.accessed_headers.add(key) + return _httputil.HeaderMap.has_key(self, key) + + +def autovary(ignore=None, debug=False): + """Auto-populate the Vary response header based on request.header access.""" + request = cherrypy.serving.request + + req_h = request.headers + request.headers = MonitoredHeaderMap() + request.headers.update(req_h) + if ignore is None: + ignore = set(['Content-Disposition', 'Content-Length', 'Content-Type']) + + def set_response_header(): + resp_h = cherrypy.serving.response.headers + v = set([e.value for e in resp_h.elements('Vary')]) + if debug: + cherrypy.log('Accessed headers: %s' % request.headers.accessed_headers, + 'TOOLS.AUTOVARY') + v = v.union(request.headers.accessed_headers) + v = v.difference(ignore) + v = list(v) + v.sort() + resp_h['Vary'] = ', '.join(v) + request.hooks.attach('before_finalize', set_response_header, 95) + diff --git a/cherrypy/lib/encoding.py b/cherrypy/lib/encoding.py new file mode 100644 index 00000000..0e5ec622 --- /dev/null +++ b/cherrypy/lib/encoding.py @@ -0,0 +1,362 @@ +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +try: + set +except NameError: + from sets import Set as set +import struct +import time +import types + +import cherrypy +from cherrypy.lib import file_generator +from cherrypy.lib import set_vary_header + + +def decode(encoding=None, default_encoding='utf-8'): + """Replace or extend the list of charsets used to decode a request entity. + + Either argument may be a single string or a list of strings. + + encoding: If not None, restricts the set of charsets attempted while decoding + a request entity to the given set (even if a different charset is given in + the Content-Type request header). + + default_encoding: Only in effect if the 'encoding' argument is not given. + If given, the set of charsets attempted while decoding a request entity is + *extended* with the given value(s). + """ + body = cherrypy.request.body + if encoding is not None: + if not isinstance(encoding, list): + encoding = [encoding] + body.attempt_charsets = encoding + elif default_encoding: + if not isinstance(default_encoding, list): + default_encoding = [default_encoding] + body.attempt_charsets = body.attempt_charsets + default_encoding + + +class ResponseEncoder: + + default_encoding = 'utf-8' + failmsg = "Response body could not be encoded with %r." + encoding = None + errors = 'strict' + text_only = True + add_charset = True + debug = False + + def __init__(self, **kwargs): + for k, v in kwargs.items(): + setattr(self, k, v) + + self.attempted_charsets = set() + request = cherrypy.serving.request + if request.handler is not None: + # Replace request.handler with self + if self.debug: + cherrypy.log('Replacing request.handler', 'TOOLS.ENCODE') + self.oldhandler = request.handler + request.handler = self + + def encode_stream(self, encoding): + """Encode a streaming response body. + + Use a generator wrapper, and just pray it works as the stream is + being written out. + """ + if encoding in self.attempted_charsets: + return False + self.attempted_charsets.add(encoding) + + def encoder(body): + for chunk in body: + if isinstance(chunk, unicode): + chunk = chunk.encode(encoding, self.errors) + yield chunk + self.body = encoder(self.body) + return True + + def encode_string(self, encoding): + """Encode a buffered response body.""" + if encoding in self.attempted_charsets: + return False + self.attempted_charsets.add(encoding) + + try: + body = [] + for chunk in self.body: + if isinstance(chunk, unicode): + chunk = chunk.encode(encoding, self.errors) + body.append(chunk) + self.body = body + except (LookupError, UnicodeError): + return False + else: + return True + + def find_acceptable_charset(self): + request = cherrypy.serving.request + response = cherrypy.serving.response + + if self.debug: + cherrypy.log('response.stream %r' % response.stream, 'TOOLS.ENCODE') + if response.stream: + encoder = self.encode_stream + else: + encoder = self.encode_string + if "Content-Length" in response.headers: + # Delete Content-Length header so finalize() recalcs it. + # Encoded strings may be of different lengths from their + # unicode equivalents, and even from each other. For example: + # >>> t = u"\u7007\u3040" + # >>> len(t) + # 2 + # >>> len(t.encode("UTF-8")) + # 6 + # >>> len(t.encode("utf7")) + # 8 + del response.headers["Content-Length"] + + # Parse the Accept-Charset request header, and try to provide one + # of the requested charsets (in order of user preference). + encs = request.headers.elements('Accept-Charset') + charsets = [enc.value.lower() for enc in encs] + if self.debug: + cherrypy.log('charsets %s' % repr(charsets), 'TOOLS.ENCODE') + + if self.encoding is not None: + # If specified, force this encoding to be used, or fail. + encoding = self.encoding.lower() + if self.debug: + cherrypy.log('Specified encoding %r' % encoding, 'TOOLS.ENCODE') + if (not charsets) or "*" in charsets or encoding in charsets: + if self.debug: + cherrypy.log('Attempting encoding %r' % encoding, 'TOOLS.ENCODE') + if encoder(encoding): + return encoding + else: + if not encs: + if self.debug: + cherrypy.log('Attempting default encoding %r' % + self.default_encoding, 'TOOLS.ENCODE') + # Any character-set is acceptable. + if encoder(self.default_encoding): + return self.default_encoding + else: + raise cherrypy.HTTPError(500, self.failmsg % self.default_encoding) + else: + if "*" not in charsets: + # If no "*" is present in an Accept-Charset field, then all + # character sets not explicitly mentioned get a quality + # value of 0, except for ISO-8859-1, which gets a quality + # value of 1 if not explicitly mentioned. + iso = 'iso-8859-1' + if iso not in charsets: + if self.debug: + cherrypy.log('Attempting ISO-8859-1 encoding', + 'TOOLS.ENCODE') + if encoder(iso): + return iso + + for element in encs: + if element.qvalue > 0: + if element.value == "*": + # Matches any charset. Try our default. + if self.debug: + cherrypy.log('Attempting default encoding due ' + 'to %r' % element, 'TOOLS.ENCODE') + if encoder(self.default_encoding): + return self.default_encoding + else: + encoding = element.value + if self.debug: + cherrypy.log('Attempting encoding %r (qvalue >' + '0)' % element, 'TOOLS.ENCODE') + if encoder(encoding): + return encoding + + # No suitable encoding found. + ac = request.headers.get('Accept-Charset') + if ac is None: + msg = "Your client did not send an Accept-Charset header." + else: + msg = "Your client sent this Accept-Charset header: %s." % ac + msg += " We tried these charsets: %s." % ", ".join(self.attempted_charsets) + raise cherrypy.HTTPError(406, msg) + + def __call__(self, *args, **kwargs): + response = cherrypy.serving.response + self.body = self.oldhandler(*args, **kwargs) + + if isinstance(self.body, basestring): + # strings get wrapped in a list because iterating over a single + # item list is much faster than iterating over every character + # in a long string. + if self.body: + self.body = [self.body] + else: + # [''] doesn't evaluate to False, so replace it with []. + self.body = [] + elif isinstance(self.body, types.FileType): + self.body = file_generator(self.body) + elif self.body is None: + self.body = [] + + ct = response.headers.elements("Content-Type") + if self.debug: + cherrypy.log('Content-Type: %r' % ct, 'TOOLS.ENCODE') + if ct: + if self.text_only: + ct = ct[0] + if ct.value.lower().startswith("text/"): + if self.debug: + cherrypy.log('Content-Type %r starts with "text/"' % ct, + 'TOOLS.ENCODE') + do_find = True + else: + if self.debug: + cherrypy.log('Not finding because Content-Type %r does ' + 'not start with "text/"' % ct, + 'TOOLS.ENCODE') + do_find = False + else: + if self.debug: + cherrypy.log('Finding because not text_only', 'TOOLS.ENCODE') + do_find = True + + if do_find: + # Set "charset=..." param on response Content-Type header + ct.params['charset'] = self.find_acceptable_charset() + if self.add_charset: + if self.debug: + cherrypy.log('Setting Content-Type %r' % ct, + 'TOOLS.ENCODE') + response.headers["Content-Type"] = str(ct) + + return self.body + +# GZIP + +def compress(body, compress_level): + """Compress 'body' at the given compress_level.""" + import zlib + + # See http://www.gzip.org/zlib/rfc-gzip.html + yield '\x1f\x8b' # ID1 and ID2: gzip marker + yield '\x08' # CM: compression method + yield '\x00' # FLG: none set + # MTIME: 4 bytes + yield struct.pack(" 0 is present + * The 'identity' value is given with a qvalue > 0. + """ + request = cherrypy.serving.request + response = cherrypy.serving.response + + set_vary_header(response, "Accept-Encoding") + + if not response.body: + # Response body is empty (might be a 304 for instance) + if debug: + cherrypy.log('No response body', context='TOOLS.GZIP') + return + + # If returning cached content (which should already have been gzipped), + # don't re-zip. + if getattr(request, "cached", False): + if debug: + cherrypy.log('Not gzipping cached response', context='TOOLS.GZIP') + return + + acceptable = request.headers.elements('Accept-Encoding') + if not acceptable: + # If no Accept-Encoding field is present in a request, + # the server MAY assume that the client will accept any + # content coding. In this case, if "identity" is one of + # the available content-codings, then the server SHOULD use + # the "identity" content-coding, unless it has additional + # information that a different content-coding is meaningful + # to the client. + if debug: + cherrypy.log('No Accept-Encoding', context='TOOLS.GZIP') + return + + ct = response.headers.get('Content-Type', '').split(';')[0] + for coding in acceptable: + if coding.value == 'identity' and coding.qvalue != 0: + if debug: + cherrypy.log('Non-zero identity qvalue: %r' % coding, + context='TOOLS.GZIP') + return + if coding.value in ('gzip', 'x-gzip'): + if coding.qvalue == 0: + if debug: + cherrypy.log('Zero gzip qvalue: %r' % coding, + context='TOOLS.GZIP') + return + + if ct not in mime_types: + if debug: + cherrypy.log('Content-Type %r not in mime_types %r' % + (ct, mime_types), context='TOOLS.GZIP') + return + + if debug: + cherrypy.log('Gzipping', context='TOOLS.GZIP') + # Return a generator that compresses the page + response.headers['Content-Encoding'] = 'gzip' + response.body = compress(response.body, compress_level) + if "Content-Length" in response.headers: + # Delete Content-Length header so finalize() recalcs it. + del response.headers["Content-Length"] + + return + + if debug: + cherrypy.log('No acceptable encoding found.', context='GZIP') + cherrypy.HTTPError(406, "identity, gzip").set_response() + diff --git a/cherrypy/lib/http.py b/cherrypy/lib/http.py new file mode 100644 index 00000000..4661d69e --- /dev/null +++ b/cherrypy/lib/http.py @@ -0,0 +1,7 @@ +import warnings +warnings.warn('cherrypy.lib.http has been deprecated and will be removed ' + 'in CherryPy 3.3 use cherrypy.lib.httputil instead.', + DeprecationWarning) + +from cherrypy.lib.httputil import * + diff --git a/cherrypy/lib/httpauth.py b/cherrypy/lib/httpauth.py new file mode 100644 index 00000000..39e632c2 --- /dev/null +++ b/cherrypy/lib/httpauth.py @@ -0,0 +1,361 @@ +""" +httpauth modules defines functions to implement HTTP Digest Authentication (RFC 2617). +This has full compliance with 'Digest' and 'Basic' authentication methods. In +'Digest' it supports both MD5 and MD5-sess algorithms. + +Usage: + + First use 'doAuth' to request the client authentication for a + certain resource. You should send an httplib.UNAUTHORIZED response to the + client so he knows he has to authenticate itself. + + Then use 'parseAuthorization' to retrieve the 'auth_map' used in + 'checkResponse'. + + To use 'checkResponse' you must have already verified the password associated + with the 'username' key in 'auth_map' dict. Then you use the 'checkResponse' + function to verify if the password matches the one sent by the client. + +SUPPORTED_ALGORITHM - list of supported 'Digest' algorithms +SUPPORTED_QOP - list of supported 'Digest' 'qop'. +""" +__version__ = 1, 0, 1 +__author__ = "Tiago Cogumbreiro " +__credits__ = """ + Peter van Kampen for its recipe which implement most of Digest authentication: + http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/302378 +""" + +__license__ = """ +Copyright (c) 2005, Tiago Cogumbreiro +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Sylvain Hellegouarch nor the names of his contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +""" + +__all__ = ("digestAuth", "basicAuth", "doAuth", "checkResponse", + "parseAuthorization", "SUPPORTED_ALGORITHM", "md5SessionKey", + "calculateNonce", "SUPPORTED_QOP") + +################################################################################ +try: + # Python 2.5+ + from hashlib import md5 +except ImportError: + from md5 import new as md5 +import time +import base64 +from urllib2 import parse_http_list, parse_keqv_list + +MD5 = "MD5" +MD5_SESS = "MD5-sess" +AUTH = "auth" +AUTH_INT = "auth-int" + +SUPPORTED_ALGORITHM = (MD5, MD5_SESS) +SUPPORTED_QOP = (AUTH, AUTH_INT) + +################################################################################ +# doAuth +# +DIGEST_AUTH_ENCODERS = { + MD5: lambda val: md5(val).hexdigest(), + MD5_SESS: lambda val: md5(val).hexdigest(), +# SHA: lambda val: sha.new (val).hexdigest (), +} + +def calculateNonce (realm, algorithm=MD5): + """This is an auxaliary function that calculates 'nonce' value. It is used + to handle sessions.""" + + global SUPPORTED_ALGORITHM, DIGEST_AUTH_ENCODERS + assert algorithm in SUPPORTED_ALGORITHM + + try: + encoder = DIGEST_AUTH_ENCODERS[algorithm] + except KeyError: + raise NotImplementedError ("The chosen algorithm (%s) does not have "\ + "an implementation yet" % algorithm) + + return encoder ("%d:%s" % (time.time(), realm)) + +def digestAuth (realm, algorithm=MD5, nonce=None, qop=AUTH): + """Challenges the client for a Digest authentication.""" + global SUPPORTED_ALGORITHM, DIGEST_AUTH_ENCODERS, SUPPORTED_QOP + assert algorithm in SUPPORTED_ALGORITHM + assert qop in SUPPORTED_QOP + + if nonce is None: + nonce = calculateNonce (realm, algorithm) + + return 'Digest realm="%s", nonce="%s", algorithm="%s", qop="%s"' % ( + realm, nonce, algorithm, qop + ) + +def basicAuth (realm): + """Challengenes the client for a Basic authentication.""" + assert '"' not in realm, "Realms cannot contain the \" (quote) character." + + return 'Basic realm="%s"' % realm + +def doAuth (realm): + """'doAuth' function returns the challenge string b giving priority over + Digest and fallback to Basic authentication when the browser doesn't + support the first one. + + This should be set in the HTTP header under the key 'WWW-Authenticate'.""" + + return digestAuth (realm) + " " + basicAuth (realm) + + +################################################################################ +# Parse authorization parameters +# +def _parseDigestAuthorization (auth_params): + # Convert the auth params to a dict + items = parse_http_list(auth_params) + params = parse_keqv_list(items) + + # Now validate the params + + # Check for required parameters + required = ["username", "realm", "nonce", "uri", "response"] + for k in required: + if k not in params: + return None + + # If qop is sent then cnonce and nc MUST be present + if "qop" in params and not ("cnonce" in params \ + and "nc" in params): + return None + + # If qop is not sent, neither cnonce nor nc can be present + if ("cnonce" in params or "nc" in params) and \ + "qop" not in params: + return None + + return params + + +def _parseBasicAuthorization (auth_params): + username, password = base64.decodestring (auth_params).split (":", 1) + return {"username": username, "password": password} + +AUTH_SCHEMES = { + "basic": _parseBasicAuthorization, + "digest": _parseDigestAuthorization, +} + +def parseAuthorization (credentials): + """parseAuthorization will convert the value of the 'Authorization' key in + the HTTP header to a map itself. If the parsing fails 'None' is returned. + """ + + global AUTH_SCHEMES + + auth_scheme, auth_params = credentials.split(" ", 1) + auth_scheme = auth_scheme.lower () + + parser = AUTH_SCHEMES[auth_scheme] + params = parser (auth_params) + + if params is None: + return + + assert "auth_scheme" not in params + params["auth_scheme"] = auth_scheme + return params + + +################################################################################ +# Check provided response for a valid password +# +def md5SessionKey (params, password): + """ + If the "algorithm" directive's value is "MD5-sess", then A1 + [the session key] is calculated only once - on the first request by the + client following receipt of a WWW-Authenticate challenge from the server. + + This creates a 'session key' for the authentication of subsequent + requests and responses which is different for each "authentication + session", thus limiting the amount of material hashed with any one + key. + + Because the server need only use the hash of the user + credentials in order to create the A1 value, this construction could + be used in conjunction with a third party authentication service so + that the web server would not need the actual password value. The + specification of such a protocol is beyond the scope of this + specification. +""" + + keys = ("username", "realm", "nonce", "cnonce") + params_copy = {} + for key in keys: + params_copy[key] = params[key] + + params_copy["algorithm"] = MD5_SESS + return _A1 (params_copy, password) + +def _A1(params, password): + algorithm = params.get ("algorithm", MD5) + H = DIGEST_AUTH_ENCODERS[algorithm] + + if algorithm == MD5: + # If the "algorithm" directive's value is "MD5" or is + # unspecified, then A1 is: + # A1 = unq(username-value) ":" unq(realm-value) ":" passwd + return "%s:%s:%s" % (params["username"], params["realm"], password) + + elif algorithm == MD5_SESS: + + # This is A1 if qop is set + # A1 = H( unq(username-value) ":" unq(realm-value) ":" passwd ) + # ":" unq(nonce-value) ":" unq(cnonce-value) + h_a1 = H ("%s:%s:%s" % (params["username"], params["realm"], password)) + return "%s:%s:%s" % (h_a1, params["nonce"], params["cnonce"]) + + +def _A2(params, method, kwargs): + # If the "qop" directive's value is "auth" or is unspecified, then A2 is: + # A2 = Method ":" digest-uri-value + + qop = params.get ("qop", "auth") + if qop == "auth": + return method + ":" + params["uri"] + elif qop == "auth-int": + # If the "qop" value is "auth-int", then A2 is: + # A2 = Method ":" digest-uri-value ":" H(entity-body) + entity_body = kwargs.get ("entity_body", "") + H = kwargs["H"] + + return "%s:%s:%s" % ( + method, + params["uri"], + H(entity_body) + ) + + else: + raise NotImplementedError ("The 'qop' method is unknown: %s" % qop) + +def _computeDigestResponse(auth_map, password, method="GET", A1=None, **kwargs): + """ + Generates a response respecting the algorithm defined in RFC 2617 + """ + params = auth_map + + algorithm = params.get ("algorithm", MD5) + + H = DIGEST_AUTH_ENCODERS[algorithm] + KD = lambda secret, data: H(secret + ":" + data) + + qop = params.get ("qop", None) + + H_A2 = H(_A2(params, method, kwargs)) + + if algorithm == MD5_SESS and A1 is not None: + H_A1 = H(A1) + else: + H_A1 = H(_A1(params, password)) + + if qop in ("auth", "auth-int"): + # If the "qop" value is "auth" or "auth-int": + # request-digest = <"> < KD ( H(A1), unq(nonce-value) + # ":" nc-value + # ":" unq(cnonce-value) + # ":" unq(qop-value) + # ":" H(A2) + # ) <"> + request = "%s:%s:%s:%s:%s" % ( + params["nonce"], + params["nc"], + params["cnonce"], + params["qop"], + H_A2, + ) + elif qop is None: + # If the "qop" directive is not present (this construction is + # for compatibility with RFC 2069): + # request-digest = + # <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > <"> + request = "%s:%s" % (params["nonce"], H_A2) + + return KD(H_A1, request) + +def _checkDigestResponse(auth_map, password, method="GET", A1=None, **kwargs): + """This function is used to verify the response given by the client when + he tries to authenticate. + Optional arguments: + entity_body - when 'qop' is set to 'auth-int' you MUST provide the + raw data you are going to send to the client (usually the + HTML page. + request_uri - the uri from the request line compared with the 'uri' + directive of the authorization map. They must represent + the same resource (unused at this time). + """ + + if auth_map['realm'] != kwargs.get('realm', None): + return False + + response = _computeDigestResponse(auth_map, password, method, A1, **kwargs) + + return response == auth_map["response"] + +def _checkBasicResponse (auth_map, password, method='GET', encrypt=None, **kwargs): + # Note that the Basic response doesn't provide the realm value so we cannot + # test it + try: + return encrypt(auth_map["password"], auth_map["username"]) == password + except TypeError: + return encrypt(auth_map["password"]) == password + +AUTH_RESPONSES = { + "basic": _checkBasicResponse, + "digest": _checkDigestResponse, +} + +def checkResponse (auth_map, password, method="GET", encrypt=None, **kwargs): + """'checkResponse' compares the auth_map with the password and optionally + other arguments that each implementation might need. + + If the response is of type 'Basic' then the function has the following + signature: + + checkBasicResponse (auth_map, password) -> bool + + If the response is of type 'Digest' then the function has the following + signature: + + checkDigestResponse (auth_map, password, method = 'GET', A1 = None) -> bool + + The 'A1' argument is only used in MD5_SESS algorithm based responses. + Check md5SessionKey() for more info. + """ + global AUTH_RESPONSES + checker = AUTH_RESPONSES[auth_map["auth_scheme"]] + return checker (auth_map, password, method=method, encrypt=encrypt, **kwargs) + + + + diff --git a/cherrypy/lib/httputil.py b/cherrypy/lib/httputil.py new file mode 100644 index 00000000..38432470 --- /dev/null +++ b/cherrypy/lib/httputil.py @@ -0,0 +1,446 @@ +"""HTTP library functions.""" + +# This module contains functions for building an HTTP application +# framework: any one, not just one whose name starts with "Ch". ;) If you +# reference any modules from some popular framework inside *this* module, +# FuManChu will personally hang you up by your thumbs and submit you +# to a public caning. + +from binascii import b2a_base64 +from BaseHTTPServer import BaseHTTPRequestHandler +response_codes = BaseHTTPRequestHandler.responses.copy() + +# From http://www.cherrypy.org/ticket/361 +response_codes[500] = ('Internal Server Error', + 'The server encountered an unexpected condition ' + 'which prevented it from fulfilling the request.') +response_codes[503] = ('Service Unavailable', + 'The server is currently unable to handle the ' + 'request due to a temporary overloading or ' + 'maintenance of the server.') + +import re +import urllib + +from rfc822 import formatdate as HTTPDate + + +def urljoin(*atoms): + """Return the given path *atoms, joined into a single URL. + + This will correctly join a SCRIPT_NAME and PATH_INFO into the + original URL, even if either atom is blank. + """ + url = "/".join([x for x in atoms if x]) + while "//" in url: + url = url.replace("//", "/") + # Special-case the final url of "", and return "/" instead. + return url or "/" + +def protocol_from_http(protocol_str): + """Return a protocol tuple from the given 'HTTP/x.y' string.""" + return int(protocol_str[5]), int(protocol_str[7]) + +def get_ranges(headervalue, content_length): + """Return a list of (start, stop) indices from a Range header, or None. + + Each (start, stop) tuple will be composed of two ints, which are suitable + for use in a slicing operation. That is, the header "Range: bytes=3-6", + if applied against a Python string, is requesting resource[3:7]. This + function will return the list [(3, 7)]. + + If this function returns an empty list, you should return HTTP 416. + """ + + if not headervalue: + return None + + result = [] + bytesunit, byteranges = headervalue.split("=", 1) + for brange in byteranges.split(","): + start, stop = [x.strip() for x in brange.split("-", 1)] + if start: + if not stop: + stop = content_length - 1 + start, stop = int(start), int(stop) + if start >= content_length: + # From rfc 2616 sec 14.16: + # "If the server receives a request (other than one + # including an If-Range request-header field) with an + # unsatisfiable Range request-header field (that is, + # all of whose byte-range-spec values have a first-byte-pos + # value greater than the current length of the selected + # resource), it SHOULD return a response code of 416 + # (Requested range not satisfiable)." + continue + if stop < start: + # From rfc 2616 sec 14.16: + # "If the server ignores a byte-range-spec because it + # is syntactically invalid, the server SHOULD treat + # the request as if the invalid Range header field + # did not exist. (Normally, this means return a 200 + # response containing the full entity)." + return None + result.append((start, stop + 1)) + else: + if not stop: + # See rfc quote above. + return None + # Negative subscript (last N bytes) + result.append((content_length - int(stop), content_length)) + + return result + + +class HeaderElement(object): + """An element (with parameters) from an HTTP header's element list.""" + + def __init__(self, value, params=None): + self.value = value + if params is None: + params = {} + self.params = params + + def __cmp__(self, other): + return cmp(self.value, other.value) + + def __unicode__(self): + p = [";%s=%s" % (k, v) for k, v in self.params.iteritems()] + return u"%s%s" % (self.value, "".join(p)) + + def __str__(self): + return str(self.__unicode__()) + + def parse(elementstr): + """Transform 'token;key=val' to ('token', {'key': 'val'}).""" + # Split the element into a value and parameters. The 'value' may + # be of the form, "token=token", but we don't split that here. + atoms = [x.strip() for x in elementstr.split(";") if x.strip()] + if not atoms: + initial_value = '' + else: + initial_value = atoms.pop(0).strip() + params = {} + for atom in atoms: + atom = [x.strip() for x in atom.split("=", 1) if x.strip()] + key = atom.pop(0) + if atom: + val = atom[0] + else: + val = "" + params[key] = val + return initial_value, params + parse = staticmethod(parse) + + def from_str(cls, elementstr): + """Construct an instance from a string of the form 'token;key=val'.""" + ival, params = cls.parse(elementstr) + return cls(ival, params) + from_str = classmethod(from_str) + + +q_separator = re.compile(r'; *q *=') + +class AcceptElement(HeaderElement): + """An element (with parameters) from an Accept* header's element list. + + AcceptElement objects are comparable; the more-preferred object will be + "less than" the less-preferred object. They are also therefore sortable; + if you sort a list of AcceptElement objects, they will be listed in + priority order; the most preferred value will be first. Yes, it should + have been the other way around, but it's too late to fix now. + """ + + def from_str(cls, elementstr): + qvalue = None + # The first "q" parameter (if any) separates the initial + # media-range parameter(s) (if any) from the accept-params. + atoms = q_separator.split(elementstr, 1) + media_range = atoms.pop(0).strip() + if atoms: + # The qvalue for an Accept header can have extensions. The other + # headers cannot, but it's easier to parse them as if they did. + qvalue = HeaderElement.from_str(atoms[0].strip()) + + media_type, params = cls.parse(media_range) + if qvalue is not None: + params["q"] = qvalue + return cls(media_type, params) + from_str = classmethod(from_str) + + def qvalue(self): + val = self.params.get("q", "1") + if isinstance(val, HeaderElement): + val = val.value + return float(val) + qvalue = property(qvalue, doc="The qvalue, or priority, of this value.") + + def __cmp__(self, other): + diff = cmp(self.qvalue, other.qvalue) + if diff == 0: + diff = cmp(str(self), str(other)) + return diff + + +def header_elements(fieldname, fieldvalue): + """Return a sorted HeaderElement list from a comma-separated header str.""" + if not fieldvalue: + return [] + + result = [] + for element in fieldvalue.split(","): + if fieldname.startswith("Accept") or fieldname == 'TE': + hv = AcceptElement.from_str(element) + else: + hv = HeaderElement.from_str(element) + result.append(hv) + result.sort() + result.reverse() + return result + +def decode_TEXT(value): + """Decode RFC-2047 TEXT (e.g. "=?utf-8?q?f=C3=BCr?=" -> u"f\xfcr").""" + from email.Header import decode_header + atoms = decode_header(value) + decodedvalue = "" + for atom, charset in atoms: + if charset is not None: + atom = atom.decode(charset) + decodedvalue += atom + return decodedvalue + +def valid_status(status): + """Return legal HTTP status Code, Reason-phrase and Message. + + The status arg must be an int, or a str that begins with an int. + + If status is an int, or a str and no reason-phrase is supplied, + a default reason-phrase will be provided. + """ + + if not status: + status = 200 + + status = str(status) + parts = status.split(" ", 1) + if len(parts) == 1: + # No reason supplied. + code, = parts + reason = None + else: + code, reason = parts + reason = reason.strip() + + try: + code = int(code) + except ValueError: + raise ValueError("Illegal response status from server " + "(%s is non-numeric)." % repr(code)) + + if code < 100 or code > 599: + raise ValueError("Illegal response status from server " + "(%s is out of range)." % repr(code)) + + if code not in response_codes: + # code is unknown but not illegal + default_reason, message = "", "" + else: + default_reason, message = response_codes[code] + + if reason is None: + reason = default_reason + + return code, reason, message + + +def _parse_qs(qs, keep_blank_values=0, strict_parsing=0, encoding='utf-8'): + """Parse a query given as a string argument. + + Arguments: + + qs: URL-encoded query string to be parsed + + keep_blank_values: flag indicating whether blank values in + URL encoded queries should be treated as blank strings. A + true value indicates that blanks should be retained as blank + strings. The default false value indicates that blank values + are to be ignored and treated as if they were not included. + + strict_parsing: flag indicating what to do with parsing errors. If + false (the default), errors are silently ignored. If true, + errors raise a ValueError exception. + + Returns a dict, as G-d intended. + """ + pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')] + d = {} + for name_value in pairs: + if not name_value and not strict_parsing: + continue + nv = name_value.split('=', 1) + if len(nv) != 2: + if strict_parsing: + raise ValueError("bad query field: %r" % (name_value,)) + # Handle case of a control-name with no equal sign + if keep_blank_values: + nv.append('') + else: + continue + if len(nv[1]) or keep_blank_values: + name = urllib.unquote(nv[0].replace('+', ' ')) + name = name.decode(encoding, 'strict') + value = urllib.unquote(nv[1].replace('+', ' ')) + value = value.decode(encoding, 'strict') + if name in d: + if not isinstance(d[name], list): + d[name] = [d[name]] + d[name].append(value) + else: + d[name] = value + return d + + +image_map_pattern = re.compile(r"[0-9]+,[0-9]+") + +def parse_query_string(query_string, keep_blank_values=True, encoding='utf-8'): + """Build a params dictionary from a query_string. + + Duplicate key/value pairs in the provided query_string will be + returned as {'key': [val1, val2, ...]}. Single key/values will + be returned as strings: {'key': 'value'}. + """ + if image_map_pattern.match(query_string): + # Server-side image map. Map the coords to 'x' and 'y' + # (like CGI::Request does). + pm = query_string.split(",") + pm = {'x': int(pm[0]), 'y': int(pm[1])} + else: + pm = _parse_qs(query_string, keep_blank_values, encoding=encoding) + return pm + + +class CaseInsensitiveDict(dict): + """A case-insensitive dict subclass. + + Each key is changed on entry to str(key).title(). + """ + + def __getitem__(self, key): + return dict.__getitem__(self, str(key).title()) + + def __setitem__(self, key, value): + dict.__setitem__(self, str(key).title(), value) + + def __delitem__(self, key): + dict.__delitem__(self, str(key).title()) + + def __contains__(self, key): + return dict.__contains__(self, str(key).title()) + + def get(self, key, default=None): + return dict.get(self, str(key).title(), default) + + def has_key(self, key): + return dict.has_key(self, str(key).title()) + + def update(self, E): + for k in E.keys(): + self[str(k).title()] = E[k] + + def fromkeys(cls, seq, value=None): + newdict = cls() + for k in seq: + newdict[str(k).title()] = value + return newdict + fromkeys = classmethod(fromkeys) + + def setdefault(self, key, x=None): + key = str(key).title() + try: + return self[key] + except KeyError: + self[key] = x + return x + + def pop(self, key, default): + return dict.pop(self, str(key).title(), default) + + +class HeaderMap(CaseInsensitiveDict): + """A dict subclass for HTTP request and response headers. + + Each key is changed on entry to str(key).title(). This allows headers + to be case-insensitive and avoid duplicates. + + Values are header values (decoded according to RFC 2047 if necessary). + """ + + protocol = (1, 1) + + def elements(self, key): + """Return a sorted list of HeaderElements for the given header.""" + key = str(key).title() + value = self.get(key) + return header_elements(key, value) + + def values(self, key): + """Return a sorted list of HeaderElement.value for the given header.""" + return [e.value for e in self.elements(key)] + + def output(self): + """Transform self into a list of (name, value) tuples.""" + header_list = [] + for k, v in self.items(): + if isinstance(k, unicode): + k = k.encode("ISO-8859-1") + + if not isinstance(v, basestring): + v = str(v) + + if isinstance(v, unicode): + v = self.encode(v) + header_list.append((k, v)) + return header_list + + def encode(self, v): + """Return the given header value, encoded for HTTP output.""" + # HTTP/1.0 says, "Words of *TEXT may contain octets + # from character sets other than US-ASCII." and + # "Recipients of header field TEXT containing octets + # outside the US-ASCII character set may assume that + # they represent ISO-8859-1 characters." + try: + v = v.encode("ISO-8859-1") + except UnicodeEncodeError: + if self.protocol == (1, 1): + # Encode RFC-2047 TEXT + # (e.g. u"\u8200" -> "=?utf-8?b?6IiA?="). + # We do our own here instead of using the email module + # because we never want to fold lines--folding has + # been deprecated by the HTTP working group. + v = b2a_base64(v.encode('utf-8')) + v = ('=?utf-8?b?' + v.strip('\n') + '?=') + else: + raise + return v + +class Host(object): + """An internet address. + + name should be the client's host name. If not available (because no DNS + lookup is performed), the IP address should be used instead. + """ + + ip = "0.0.0.0" + port = 80 + name = "unknown.tld" + + def __init__(self, ip, port, name=None): + self.ip = ip + self.port = port + if name is None: + name = ip + self.name = name + + def __repr__(self): + return "httputil.Host(%r, %r, %r)" % (self.ip, self.port, self.name) diff --git a/cherrypy/lib/jsontools.py b/cherrypy/lib/jsontools.py new file mode 100644 index 00000000..a9ee275f --- /dev/null +++ b/cherrypy/lib/jsontools.py @@ -0,0 +1,50 @@ +import sys +import cherrypy + +if sys.version_info >= (2, 6): + # Python 2.6: simplejson is part of the standard library + import json +else: + try: + import simplejson as json + except ImportError: + json = None + +if json is None: + def json_decode(s): + raise ValueError('No JSON library is available') + def json_encode(s): + raise ValueError('No JSON library is available') +else: + json_decode = json.JSONDecoder().decode + json_encode = json.JSONEncoder().iterencode + +def json_in(force=True, debug=False): + request = cherrypy.serving.request + def json_processor(entity): + """Read application/json data into request.json.""" + if not entity.headers.get(u"Content-Length", u""): + raise cherrypy.HTTPError(411) + + body = entity.fp.read() + try: + request.json = json_decode(body) + except ValueError: + raise cherrypy.HTTPError(400, 'Invalid JSON document') + if force: + request.body.processors.clear() + request.body.default_proc = cherrypy.HTTPError( + 415, 'Expected an application/json content type') + request.body.processors[u'application/json'] = json_processor + +def json_out(debug=False): + request = cherrypy.serving.request + response = cherrypy.serving.response + + real_handler = request.handler + def json_handler(*args, **kwargs): + response.headers['Content-Type'] = 'application/json' + value = real_handler(*args, **kwargs) + return json_encode(value) + request.handler = json_handler + diff --git a/cherrypy/lib/profiler.py b/cherrypy/lib/profiler.py new file mode 100644 index 00000000..17500cdb --- /dev/null +++ b/cherrypy/lib/profiler.py @@ -0,0 +1,205 @@ +"""Profiler tools for CherryPy. + +CherryPy users +============== + +You can profile any of your pages as follows: + + from cherrypy.lib import profiler + + class Root: + p = profile.Profiler("/path/to/profile/dir") + + def index(self): + self.p.run(self._index) + index.exposed = True + + def _index(self): + return "Hello, world!" + + cherrypy.tree.mount(Root()) + + +You can also turn on profiling for all requests +using the make_app function as WSGI middleware. + + +CherryPy developers +=================== + +This module can be used whenever you make changes to CherryPy, +to get a quick sanity-check on overall CP performance. Use the +"--profile" flag when running the test suite. Then, use the serve() +function to browse the results in a web browser. If you run this +module from the command line, it will call serve() for you. + +""" + + +# Make profiler output more readable by adding __init__ modules' parents. +def new_func_strip_path(func_name): + filename, line, name = func_name + if filename.endswith("__init__.py"): + return os.path.basename(filename[:-12]) + filename[-12:], line, name + return os.path.basename(filename), line, name + +try: + import profile + import pstats + pstats.func_strip_path = new_func_strip_path +except ImportError: + profile = None + pstats = None + +import os, os.path +import sys +import warnings + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO + +_count = 0 + +class Profiler(object): + + def __init__(self, path=None): + if not path: + path = os.path.join(os.path.dirname(__file__), "profile") + self.path = path + if not os.path.exists(path): + os.makedirs(path) + + def run(self, func, *args, **params): + """Dump profile data into self.path.""" + global _count + c = _count = _count + 1 + path = os.path.join(self.path, "cp_%04d.prof" % c) + prof = profile.Profile() + result = prof.runcall(func, *args, **params) + prof.dump_stats(path) + return result + + def statfiles(self): + """statfiles() -> list of available profiles.""" + return [f for f in os.listdir(self.path) + if f.startswith("cp_") and f.endswith(".prof")] + + def stats(self, filename, sortby='cumulative'): + """stats(index) -> output of print_stats() for the given profile.""" + sio = StringIO() + if sys.version_info >= (2, 5): + s = pstats.Stats(os.path.join(self.path, filename), stream=sio) + s.strip_dirs() + s.sort_stats(sortby) + s.print_stats() + else: + # pstats.Stats before Python 2.5 didn't take a 'stream' arg, + # but just printed to stdout. So re-route stdout. + s = pstats.Stats(os.path.join(self.path, filename)) + s.strip_dirs() + s.sort_stats(sortby) + oldout = sys.stdout + try: + sys.stdout = sio + s.print_stats() + finally: + sys.stdout = oldout + response = sio.getvalue() + sio.close() + return response + + def index(self): + return """ + CherryPy profile data + + + + + + """ + index.exposed = True + + def menu(self): + yield "

Profiling runs

" + yield "

Click on one of the runs below to see profiling data.

" + runs = self.statfiles() + runs.sort() + for i in runs: + yield "%s
" % (i, i) + menu.exposed = True + + def report(self, filename): + import cherrypy + cherrypy.response.headers['Content-Type'] = 'text/plain' + return self.stats(filename) + report.exposed = True + + +class ProfileAggregator(Profiler): + + def __init__(self, path=None): + Profiler.__init__(self, path) + global _count + self.count = _count = _count + 1 + self.profiler = profile.Profile() + + def run(self, func, *args): + path = os.path.join(self.path, "cp_%04d.prof" % self.count) + result = self.profiler.runcall(func, *args) + self.profiler.dump_stats(path) + return result + + +class make_app: + def __init__(self, nextapp, path=None, aggregate=False): + """Make a WSGI middleware app which wraps 'nextapp' with profiling. + + nextapp: the WSGI application to wrap, usually an instance of + cherrypy.Application. + path: where to dump the profiling output. + aggregate: if True, profile data for all HTTP requests will go in + a single file. If False (the default), each HTTP request will + dump its profile data into a separate file. + """ + if profile is None or pstats is None: + msg = ("Your installation of Python does not have a profile module. " + "If you're on Debian, try `sudo apt-get install python-profiler`. " + "See http://www.cherrypy.org/wiki/ProfilingOnDebian for details.") + warnings.warn(msg) + + self.nextapp = nextapp + self.aggregate = aggregate + if aggregate: + self.profiler = ProfileAggregator(path) + else: + self.profiler = Profiler(path) + + def __call__(self, environ, start_response): + def gather(): + result = [] + for line in self.nextapp(environ, start_response): + result.append(line) + return result + return self.profiler.run(gather) + + +def serve(path=None, port=8080): + if profile is None or pstats is None: + msg = ("Your installation of Python does not have a profile module. " + "If you're on Debian, try `sudo apt-get install python-profiler`. " + "See http://www.cherrypy.org/wiki/ProfilingOnDebian for details.") + warnings.warn(msg) + + import cherrypy + cherrypy.config.update({'server.socket_port': int(port), + 'server.thread_pool': 10, + 'environment': "production", + }) + cherrypy.quickstart(Profiler(path)) + + +if __name__ == "__main__": + serve(*tuple(sys.argv[1:])) + diff --git a/cherrypy/lib/reprconf.py b/cherrypy/lib/reprconf.py new file mode 100644 index 00000000..d348b243 --- /dev/null +++ b/cherrypy/lib/reprconf.py @@ -0,0 +1,345 @@ +"""Generic configuration system using unrepr. + +Configuration data may be supplied as a Python dictionary, as a filename, +or as an open file object. When you supply a filename or file, Python's +builtin ConfigParser is used (with some extensions). + +Namespaces +---------- + +Configuration keys are separated into namespaces by the first "." in the key. + +The only key that cannot exist in a namespace is the "environment" entry. +This special entry 'imports' other config entries from a template stored in +the Config.environments dict. + +You can define your own namespaces to be called when new config is merged +by adding a named handler to Config.namespaces. The name can be any string, +and the handler must be either a callable or a context manager. +""" + +from ConfigParser import ConfigParser +try: + set +except NameError: + from sets import Set as set +import sys + +def as_dict(config): + """Return a dict from 'config' whether it is a dict, file, or filename.""" + if isinstance(config, basestring): + config = Parser().dict_from_file(config) + elif hasattr(config, 'read'): + config = Parser().dict_from_file(config) + return config + + +class NamespaceSet(dict): + """A dict of config namespace names and handlers. + + Each config entry should begin with a namespace name; the corresponding + namespace handler will be called once for each config entry in that + namespace, and will be passed two arguments: the config key (with the + namespace removed) and the config value. + + Namespace handlers may be any Python callable; they may also be + Python 2.5-style 'context managers', in which case their __enter__ + method should return a callable to be used as the handler. + See cherrypy.tools (the Toolbox class) for an example. + """ + + def __call__(self, config): + """Iterate through config and pass it to each namespace handler. + + 'config' should be a flat dict, where keys use dots to separate + namespaces, and values are arbitrary. + + The first name in each config key is used to look up the corresponding + namespace handler. For example, a config entry of {'tools.gzip.on': v} + will call the 'tools' namespace handler with the args: ('gzip.on', v) + """ + # Separate the given config into namespaces + ns_confs = {} + for k in config: + if "." in k: + ns, name = k.split(".", 1) + bucket = ns_confs.setdefault(ns, {}) + bucket[name] = config[k] + + # I chose __enter__ and __exit__ so someday this could be + # rewritten using Python 2.5's 'with' statement: + # for ns, handler in self.iteritems(): + # with handler as callable: + # for k, v in ns_confs.get(ns, {}).iteritems(): + # callable(k, v) + for ns, handler in self.items(): + exit = getattr(handler, "__exit__", None) + if exit: + callable = handler.__enter__() + no_exc = True + try: + try: + for k, v in ns_confs.get(ns, {}).items(): + callable(k, v) + except: + # The exceptional case is handled here + no_exc = False + if exit is None: + raise + if not exit(*sys.exc_info()): + raise + # The exception is swallowed if exit() returns true + finally: + # The normal and non-local-goto cases are handled here + if no_exc and exit: + exit(None, None, None) + else: + for k, v in ns_confs.get(ns, {}).items(): + handler(k, v) + + def __repr__(self): + return "%s.%s(%s)" % (self.__module__, self.__class__.__name__, + dict.__repr__(self)) + + def __copy__(self): + newobj = self.__class__() + newobj.update(self) + return newobj + copy = __copy__ + + +class Config(dict): + """A dict-like set of configuration data, with defaults and namespaces. + + May take a file, filename, or dict. + """ + + defaults = {} + environments = {} + namespaces = NamespaceSet() + + def __init__(self, file=None, **kwargs): + self.reset() + if file is not None: + self.update(file) + if kwargs: + self.update(kwargs) + + def reset(self): + """Reset self to default values.""" + self.clear() + dict.update(self, self.defaults) + + def update(self, config): + """Update self from a dict, file or filename.""" + if isinstance(config, basestring): + # Filename + config = Parser().dict_from_file(config) + elif hasattr(config, 'read'): + # Open file object + config = Parser().dict_from_file(config) + else: + config = config.copy() + self._apply(config) + + def _apply(self, config): + """Update self from a dict.""" + which_env = config.get('environment') + if which_env: + env = self.environments[which_env] + for k in env: + if k not in config: + config[k] = env[k] + + dict.update(self, config) + self.namespaces(config) + + def __setitem__(self, k, v): + dict.__setitem__(self, k, v) + self.namespaces({k: v}) + + +class Parser(ConfigParser): + """Sub-class of ConfigParser that keeps the case of options and that raises + an exception if the file cannot be read. + """ + + def optionxform(self, optionstr): + return optionstr + + def read(self, filenames): + if isinstance(filenames, basestring): + filenames = [filenames] + for filename in filenames: + # try: + # fp = open(filename) + # except IOError: + # continue + fp = open(filename) + try: + self._read(fp, filename) + finally: + fp.close() + + def as_dict(self, raw=False, vars=None): + """Convert an INI file to a dictionary""" + # Load INI file into a dict + result = {} + for section in self.sections(): + if section not in result: + result[section] = {} + for option in self.options(section): + value = self.get(section, option, raw, vars) + try: + value = unrepr(value) + except Exception, x: + msg = ("Config error in section: %r, option: %r, " + "value: %r. Config values must be valid Python." % + (section, option, value)) + raise ValueError(msg, x.__class__.__name__, x.args) + result[section][option] = value + return result + + def dict_from_file(self, file): + if hasattr(file, 'read'): + self.readfp(file) + else: + self.read(file) + return self.as_dict() + + +# public domain "unrepr" implementation, found on the web and then improved. + +class _Builder: + + def build(self, o): + m = getattr(self, 'build_' + o.__class__.__name__, None) + if m is None: + raise TypeError("unrepr does not recognize %s" % + repr(o.__class__.__name__)) + return m(o) + + def build_Subscript(self, o): + expr, flags, subs = o.getChildren() + expr = self.build(expr) + subs = self.build(subs) + return expr[subs] + + def build_CallFunc(self, o): + children = map(self.build, o.getChildren()) + callee = children.pop(0) + kwargs = children.pop() or {} + starargs = children.pop() or () + args = tuple(children) + tuple(starargs) + return callee(*args, **kwargs) + + def build_List(self, o): + return map(self.build, o.getChildren()) + + def build_Const(self, o): + return o.value + + def build_Dict(self, o): + d = {} + i = iter(map(self.build, o.getChildren())) + for el in i: + d[el] = i.next() + return d + + def build_Tuple(self, o): + return tuple(self.build_List(o)) + + def build_Name(self, o): + name = o.name + if name == 'None': + return None + if name == 'True': + return True + if name == 'False': + return False + + # See if the Name is a package or module. If it is, import it. + try: + return modules(name) + except ImportError: + pass + + # See if the Name is in builtins. + try: + import __builtin__ + return getattr(__builtin__, name) + except AttributeError: + pass + + raise TypeError("unrepr could not resolve the name %s" % repr(name)) + + def build_Add(self, o): + left, right = map(self.build, o.getChildren()) + return left + right + + def build_Getattr(self, o): + parent = self.build(o.expr) + return getattr(parent, o.attrname) + + def build_NoneType(self, o): + return None + + def build_UnarySub(self, o): + return - self.build(o.getChildren()[0]) + + def build_UnaryAdd(self, o): + return self.build(o.getChildren()[0]) + + +def _astnode(s): + """Return a Python ast Node compiled from a string.""" + try: + import compiler + except ImportError: + # Fallback to eval when compiler package is not available, + # e.g. IronPython 1.0. + return eval(s) + + p = compiler.parse("__tempvalue__ = " + s) + return p.getChildren()[1].getChildren()[0].getChildren()[1] + + +def unrepr(s): + """Return a Python object compiled from a string.""" + if not s: + return s + obj = _astnode(s) + return _Builder().build(obj) + + +def modules(modulePath): + """Load a module and retrieve a reference to that module.""" + try: + mod = sys.modules[modulePath] + if mod is None: + raise KeyError() + except KeyError: + # The last [''] is important. + mod = __import__(modulePath, globals(), locals(), ['']) + return mod + +def attributes(full_attribute_name): + """Load a module and retrieve an attribute of that module.""" + + # Parse out the path, module, and attribute + last_dot = full_attribute_name.rfind(".") + attr_name = full_attribute_name[last_dot + 1:] + mod_path = full_attribute_name[:last_dot] + + mod = modules(mod_path) + # Let an AttributeError propagate outward. + try: + attr = getattr(mod, attr_name) + except AttributeError: + raise AttributeError("'%s' object has no attribute '%s'" + % (mod_path, attr_name)) + + # Return a reference to the attribute. + return attr + + diff --git a/cherrypy/lib/sessions.py b/cherrypy/lib/sessions.py new file mode 100644 index 00000000..ed114f46 --- /dev/null +++ b/cherrypy/lib/sessions.py @@ -0,0 +1,741 @@ +"""Session implementation for CherryPy. + +We use cherrypy.request to store some convenient variables as +well as data about the session for the current request. Instead of +polluting cherrypy.request we use a Session object bound to +cherrypy.session to store these variables. +""" + +import datetime +import os +try: + import cPickle as pickle +except ImportError: + import pickle +import random +try: + # Python 2.5+ + from hashlib import sha1 as sha +except ImportError: + from sha import new as sha +import time +import threading +import types +from warnings import warn + +import cherrypy +from cherrypy.lib import httputil + + +missing = object() + +class Session(object): + """A CherryPy dict-like Session object (one per request).""" + + __metaclass__ = cherrypy._AttributeDocstrings + + _id = None + id_observers = None + id_observers__doc = "A list of callbacks to which to pass new id's." + + id__doc = "The current session ID." + def _get_id(self): + return self._id + def _set_id(self, value): + self._id = value + for o in self.id_observers: + o(value) + id = property(_get_id, _set_id, doc=id__doc) + + timeout = 60 + timeout__doc = "Number of minutes after which to delete session data." + + locked = False + locked__doc = """ + If True, this session instance has exclusive read/write access + to session data.""" + + loaded = False + loaded__doc = """ + If True, data has been retrieved from storage. This should happen + automatically on the first attempt to access session data.""" + + clean_thread = None + clean_thread__doc = "Class-level Monitor which calls self.clean_up." + + clean_freq = 5 + clean_freq__doc = "The poll rate for expired session cleanup in minutes." + + originalid = None + originalid__doc = "The session id passed by the client. May be missing or unsafe." + + missing = False + missing__doc = "True if the session requested by the client did not exist." + + regenerated = False + regenerated__doc = """ + True if the application called session.regenerate(). This is not set by + internal calls to regenerate the session id.""" + + debug = False + + def __init__(self, id=None, **kwargs): + self.id_observers = [] + self._data = {} + + for k, v in kwargs.items(): + setattr(self, k, v) + + self.originalid = id + self.missing = False + if id is None: + if self.debug: + cherrypy.log('No id given; making a new one', 'TOOLS.SESSIONS') + self._regenerate() + else: + self.id = id + if not self._exists(): + if self.debug: + cherrypy.log('Expired or malicious session %r; ' + 'making a new one' % id, 'TOOLS.SESSIONS') + # Expired or malicious session. Make a new one. + # See http://www.cherrypy.org/ticket/709. + self.id = None + self.missing = True + self._regenerate() + + def regenerate(self): + """Replace the current session (with a new id).""" + self.regenerated = True + self._regenerate() + + def _regenerate(self): + if self.id is not None: + self.delete() + + old_session_was_locked = self.locked + if old_session_was_locked: + self.release_lock() + + self.id = None + while self.id is None: + self.id = self.generate_id() + # Assert that the generated id is not already stored. + if self._exists(): + self.id = None + + if old_session_was_locked: + self.acquire_lock() + + def clean_up(self): + """Clean up expired sessions.""" + pass + + try: + os.urandom(20) + except (AttributeError, NotImplementedError): + # os.urandom not available until Python 2.4. Fall back to random.random. + def generate_id(self): + """Return a new session id.""" + return sha('%s' % random.random()).hexdigest() + else: + def generate_id(self): + """Return a new session id.""" + return os.urandom(20).encode('hex') + + def save(self): + """Save session data.""" + try: + # If session data has never been loaded then it's never been + # accessed: no need to save it + if self.loaded: + t = datetime.timedelta(seconds=self.timeout * 60) + expiration_time = datetime.datetime.now() + t + if self.debug: + cherrypy.log('Saving with expiry %s' % expiration_time, + 'TOOLS.SESSIONS') + self._save(expiration_time) + + finally: + if self.locked: + # Always release the lock if the user didn't release it + self.release_lock() + + def load(self): + """Copy stored session data into this session instance.""" + data = self._load() + # data is either None or a tuple (session_data, expiration_time) + if data is None or data[1] < datetime.datetime.now(): + if self.debug: + cherrypy.log('Expired session, flushing data', 'TOOLS.SESSIONS') + self._data = {} + else: + self._data = data[0] + self.loaded = True + + # Stick the clean_thread in the class, not the instance. + # The instances are created and destroyed per-request. + cls = self.__class__ + if self.clean_freq and not cls.clean_thread: + # clean_up is in instancemethod and not a classmethod, + # so that tool config can be accessed inside the method. + t = cherrypy.process.plugins.Monitor( + cherrypy.engine, self.clean_up, self.clean_freq * 60, + name='Session cleanup') + t.subscribe() + cls.clean_thread = t + t.start() + + def delete(self): + """Delete stored session data.""" + self._delete() + + def __getitem__(self, key): + if not self.loaded: self.load() + return self._data[key] + + def __setitem__(self, key, value): + if not self.loaded: self.load() + self._data[key] = value + + def __delitem__(self, key): + if not self.loaded: self.load() + del self._data[key] + + def pop(self, key, default=missing): + """Remove the specified key and return the corresponding value. + If key is not found, default is returned if given, + otherwise KeyError is raised. + """ + if not self.loaded: self.load() + if default is missing: + return self._data.pop(key) + else: + return self._data.pop(key, default) + + def __contains__(self, key): + if not self.loaded: self.load() + return key in self._data + + def has_key(self, key): + """D.has_key(k) -> True if D has a key k, else False.""" + if not self.loaded: self.load() + return key in self._data + + def get(self, key, default=None): + """D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.""" + if not self.loaded: self.load() + return self._data.get(key, default) + + def update(self, d): + """D.update(E) -> None. Update D from E: for k in E: D[k] = E[k].""" + if not self.loaded: self.load() + self._data.update(d) + + def setdefault(self, key, default=None): + """D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D.""" + if not self.loaded: self.load() + return self._data.setdefault(key, default) + + def clear(self): + """D.clear() -> None. Remove all items from D.""" + if not self.loaded: self.load() + self._data.clear() + + def keys(self): + """D.keys() -> list of D's keys.""" + if not self.loaded: self.load() + return self._data.keys() + + def items(self): + """D.items() -> list of D's (key, value) pairs, as 2-tuples.""" + if not self.loaded: self.load() + return self._data.items() + + def values(self): + """D.values() -> list of D's values.""" + if not self.loaded: self.load() + return self._data.values() + + +class RamSession(Session): + + # Class-level objects. Don't rebind these! + cache = {} + locks = {} + + def clean_up(self): + """Clean up expired sessions.""" + now = datetime.datetime.now() + for id, (data, expiration_time) in self.cache.items(): + if expiration_time <= now: + try: + del self.cache[id] + except KeyError: + pass + try: + del self.locks[id] + except KeyError: + pass + + def _exists(self): + return self.id in self.cache + + def _load(self): + return self.cache.get(self.id) + + def _save(self, expiration_time): + self.cache[self.id] = (self._data, expiration_time) + + def _delete(self): + self.cache.pop(self.id, None) + + def acquire_lock(self): + """Acquire an exclusive lock on the currently-loaded session data.""" + self.locked = True + self.locks.setdefault(self.id, threading.RLock()).acquire() + + def release_lock(self): + """Release the lock on the currently-loaded session data.""" + self.locks[self.id].release() + self.locked = False + + def __len__(self): + """Return the number of active sessions.""" + return len(self.cache) + + +class FileSession(Session): + """Implementation of the File backend for sessions + + storage_path: the folder where session data will be saved. Each session + will be saved as pickle.dump(data, expiration_time) in its own file; + the filename will be self.SESSION_PREFIX + self.id. + """ + + SESSION_PREFIX = 'session-' + LOCK_SUFFIX = '.lock' + pickle_protocol = pickle.HIGHEST_PROTOCOL + + def __init__(self, id=None, **kwargs): + # The 'storage_path' arg is required for file-based sessions. + kwargs['storage_path'] = os.path.abspath(kwargs['storage_path']) + Session.__init__(self, id=id, **kwargs) + + def setup(cls, **kwargs): + """Set up the storage system for file-based sessions. + + This should only be called once per process; this will be done + automatically when using sessions.init (as the built-in Tool does). + """ + # The 'storage_path' arg is required for file-based sessions. + kwargs['storage_path'] = os.path.abspath(kwargs['storage_path']) + + for k, v in kwargs.items(): + setattr(cls, k, v) + + # Warn if any lock files exist at startup. + lockfiles = [fname for fname in os.listdir(cls.storage_path) + if (fname.startswith(cls.SESSION_PREFIX) + and fname.endswith(cls.LOCK_SUFFIX))] + if lockfiles: + plural = ('', 's')[len(lockfiles) > 1] + warn("%s session lockfile%s found at startup. If you are " + "only running one process, then you may need to " + "manually delete the lockfiles found at %r." + % (len(lockfiles), plural, cls.storage_path)) + setup = classmethod(setup) + + def _get_file_path(self): + f = os.path.join(self.storage_path, self.SESSION_PREFIX + self.id) + if not os.path.abspath(f).startswith(self.storage_path): + raise cherrypy.HTTPError(400, "Invalid session id in cookie.") + return f + + def _exists(self): + path = self._get_file_path() + return os.path.exists(path) + + def _load(self, path=None): + if path is None: + path = self._get_file_path() + try: + f = open(path, "rb") + try: + return pickle.load(f) + finally: + f.close() + except (IOError, EOFError): + return None + + def _save(self, expiration_time): + f = open(self._get_file_path(), "wb") + try: + pickle.dump((self._data, expiration_time), f, self.pickle_protocol) + finally: + f.close() + + def _delete(self): + try: + os.unlink(self._get_file_path()) + except OSError: + pass + + def acquire_lock(self, path=None): + """Acquire an exclusive lock on the currently-loaded session data.""" + if path is None: + path = self._get_file_path() + path += self.LOCK_SUFFIX + while True: + try: + lockfd = os.open(path, os.O_CREAT | os.O_WRONLY | os.O_EXCL) + except OSError: + time.sleep(0.1) + else: + os.close(lockfd) + break + self.locked = True + + def release_lock(self, path=None): + """Release the lock on the currently-loaded session data.""" + if path is None: + path = self._get_file_path() + os.unlink(path + self.LOCK_SUFFIX) + self.locked = False + + def clean_up(self): + """Clean up expired sessions.""" + now = datetime.datetime.now() + # Iterate over all session files in self.storage_path + for fname in os.listdir(self.storage_path): + if (fname.startswith(self.SESSION_PREFIX) + and not fname.endswith(self.LOCK_SUFFIX)): + # We have a session file: lock and load it and check + # if it's expired. If it fails, nevermind. + path = os.path.join(self.storage_path, fname) + self.acquire_lock(path) + try: + contents = self._load(path) + # _load returns None on IOError + if contents is not None: + data, expiration_time = contents + if expiration_time < now: + # Session expired: deleting it + os.unlink(path) + finally: + self.release_lock(path) + + def __len__(self): + """Return the number of active sessions.""" + return len([fname for fname in os.listdir(self.storage_path) + if (fname.startswith(self.SESSION_PREFIX) + and not fname.endswith(self.LOCK_SUFFIX))]) + + +class PostgresqlSession(Session): + """ Implementation of the PostgreSQL backend for sessions. It assumes + a table like this: + + create table session ( + id varchar(40), + data text, + expiration_time timestamp + ) + + You must provide your own get_db function. + """ + + pickle_protocol = pickle.HIGHEST_PROTOCOL + + def __init__(self, id=None, **kwargs): + Session.__init__(self, id, **kwargs) + self.cursor = self.db.cursor() + + def setup(cls, **kwargs): + """Set up the storage system for Postgres-based sessions. + + This should only be called once per process; this will be done + automatically when using sessions.init (as the built-in Tool does). + """ + for k, v in kwargs.items(): + setattr(cls, k, v) + + self.db = self.get_db() + setup = classmethod(setup) + + def __del__(self): + if self.cursor: + self.cursor.close() + self.db.commit() + + def _exists(self): + # Select session data from table + self.cursor.execute('select data, expiration_time from session ' + 'where id=%s', (self.id,)) + rows = self.cursor.fetchall() + return bool(rows) + + def _load(self): + # Select session data from table + self.cursor.execute('select data, expiration_time from session ' + 'where id=%s', (self.id,)) + rows = self.cursor.fetchall() + if not rows: + return None + + pickled_data, expiration_time = rows[0] + data = pickle.loads(pickled_data) + return data, expiration_time + + def _save(self, expiration_time): + pickled_data = pickle.dumps(self._data, self.pickle_protocol) + self.cursor.execute('update session set data = %s, ' + 'expiration_time = %s where id = %s', + (pickled_data, expiration_time, self.id)) + + def _delete(self): + self.cursor.execute('delete from session where id=%s', (self.id,)) + + def acquire_lock(self): + """Acquire an exclusive lock on the currently-loaded session data.""" + # We use the "for update" clause to lock the row + self.locked = True + self.cursor.execute('select id from session where id=%s for update', + (self.id,)) + + def release_lock(self): + """Release the lock on the currently-loaded session data.""" + # We just close the cursor and that will remove the lock + # introduced by the "for update" clause + self.cursor.close() + self.locked = False + + def clean_up(self): + """Clean up expired sessions.""" + self.cursor.execute('delete from session where expiration_time < %s', + (datetime.datetime.now(),)) + + +class MemcachedSession(Session): + + # The most popular memcached client for Python isn't thread-safe. + # Wrap all .get and .set operations in a single lock. + mc_lock = threading.RLock() + + # This is a seperate set of locks per session id. + locks = {} + + servers = ['127.0.0.1:11211'] + + def setup(cls, **kwargs): + """Set up the storage system for memcached-based sessions. + + This should only be called once per process; this will be done + automatically when using sessions.init (as the built-in Tool does). + """ + for k, v in kwargs.items(): + setattr(cls, k, v) + + import memcache + cls.cache = memcache.Client(cls.servers) + setup = classmethod(setup) + + def _exists(self): + self.mc_lock.acquire() + try: + return bool(self.cache.get(self.id)) + finally: + self.mc_lock.release() + + def _load(self): + self.mc_lock.acquire() + try: + return self.cache.get(self.id) + finally: + self.mc_lock.release() + + def _save(self, expiration_time): + # Send the expiration time as "Unix time" (seconds since 1/1/1970) + td = int(time.mktime(expiration_time.timetuple())) + self.mc_lock.acquire() + try: + if not self.cache.set(self.id, (self._data, expiration_time), td): + raise AssertionError("Session data for id %r not set." % self.id) + finally: + self.mc_lock.release() + + def _delete(self): + self.cache.delete(self.id) + + def acquire_lock(self): + """Acquire an exclusive lock on the currently-loaded session data.""" + self.locked = True + self.locks.setdefault(self.id, threading.RLock()).acquire() + + def release_lock(self): + """Release the lock on the currently-loaded session data.""" + self.locks[self.id].release() + self.locked = False + + def __len__(self): + """Return the number of active sessions.""" + raise NotImplementedError + + +# Hook functions (for CherryPy tools) + +def save(): + """Save any changed session data.""" + + if not hasattr(cherrypy.serving, "session"): + return + request = cherrypy.serving.request + response = cherrypy.serving.response + + # Guard against running twice + if hasattr(request, "_sessionsaved"): + return + request._sessionsaved = True + + if response.stream: + # If the body is being streamed, we have to save the data + # *after* the response has been written out + request.hooks.attach('on_end_request', cherrypy.session.save) + else: + # If the body is not being streamed, we save the data now + # (so we can release the lock). + if isinstance(response.body, types.GeneratorType): + response.collapse_body() + cherrypy.session.save() +save.failsafe = True + +def close(): + """Close the session object for this request.""" + sess = getattr(cherrypy.serving, "session", None) + if getattr(sess, "locked", False): + # If the session is still locked we release the lock + sess.release_lock() +close.failsafe = True +close.priority = 90 + + +def init(storage_type='ram', path=None, path_header=None, name='session_id', + timeout=60, domain=None, secure=False, clean_freq=5, + persistent=True, debug=False, **kwargs): + """Initialize session object (using cookies). + + storage_type: one of 'ram', 'file', 'postgresql'. This will be used + to look up the corresponding class in cherrypy.lib.sessions + globals. For example, 'file' will use the FileSession class. + path: the 'path' value to stick in the response cookie metadata. + path_header: if 'path' is None (the default), then the response + cookie 'path' will be pulled from request.headers[path_header]. + name: the name of the cookie. + timeout: the expiration timeout (in minutes) for the stored session data. + If 'persistent' is True (the default), this is also the timeout + for the cookie. + domain: the cookie domain. + secure: if False (the default) the cookie 'secure' value will not + be set. If True, the cookie 'secure' value will be set (to 1). + clean_freq (minutes): the poll rate for expired session cleanup. + persistent: if True (the default), the 'timeout' argument will be used + to expire the cookie. If False, the cookie will not have an expiry, + and the cookie will be a "session cookie" which expires when the + browser is closed. + + Any additional kwargs will be bound to the new Session instance, + and may be specific to the storage type. See the subclass of Session + you're using for more information. + """ + + request = cherrypy.serving.request + + # Guard against running twice + if hasattr(request, "_session_init_flag"): + return + request._session_init_flag = True + + # Check if request came with a session ID + id = None + if name in request.cookie: + id = request.cookie[name].value + if debug: + cherrypy.log('ID obtained from request.cookie: %r' % id, + 'TOOLS.SESSIONS') + + # Find the storage class and call setup (first time only). + storage_class = storage_type.title() + 'Session' + storage_class = globals()[storage_class] + if not hasattr(cherrypy, "session"): + if hasattr(storage_class, "setup"): + storage_class.setup(**kwargs) + + # Create and attach a new Session instance to cherrypy.serving. + # It will possess a reference to (and lock, and lazily load) + # the requested session data. + kwargs['timeout'] = timeout + kwargs['clean_freq'] = clean_freq + cherrypy.serving.session = sess = storage_class(id, **kwargs) + sess.debug = debug + def update_cookie(id): + """Update the cookie every time the session id changes.""" + cherrypy.serving.response.cookie[name] = id + sess.id_observers.append(update_cookie) + + # Create cherrypy.session which will proxy to cherrypy.serving.session + if not hasattr(cherrypy, "session"): + cherrypy.session = cherrypy._ThreadLocalProxy('session') + + if persistent: + cookie_timeout = timeout + else: + # See http://support.microsoft.com/kb/223799/EN-US/ + # and http://support.mozilla.com/en-US/kb/Cookies + cookie_timeout = None + set_response_cookie(path=path, path_header=path_header, name=name, + timeout=cookie_timeout, domain=domain, secure=secure) + + +def set_response_cookie(path=None, path_header=None, name='session_id', + timeout=60, domain=None, secure=False): + """Set a response cookie for the client. + + path: the 'path' value to stick in the response cookie metadata. + path_header: if 'path' is None (the default), then the response + cookie 'path' will be pulled from request.headers[path_header]. + name: the name of the cookie. + timeout: the expiration timeout for the cookie. If 0 or other boolean + False, no 'expires' param will be set, and the cookie will be a + "session cookie" which expires when the browser is closed. + domain: the cookie domain. + secure: if False (the default) the cookie 'secure' value will not + be set. If True, the cookie 'secure' value will be set (to 1). + """ + # Set response cookie + cookie = cherrypy.serving.response.cookie + cookie[name] = cherrypy.serving.session.id + cookie[name]['path'] = (path or cherrypy.serving.request.headers.get(path_header) + or '/') + + # We'd like to use the "max-age" param as indicated in + # http://www.faqs.org/rfcs/rfc2109.html but IE doesn't + # save it to disk and the session is lost if people close + # the browser. So we have to use the old "expires" ... sigh ... +## cookie[name]['max-age'] = timeout * 60 + if timeout: + e = time.time() + (timeout * 60) + cookie[name]['expires'] = httputil.HTTPDate(e) + if domain is not None: + cookie[name]['domain'] = domain + if secure: + cookie[name]['secure'] = 1 + + +def expire(): + """Expire the current session cookie.""" + name = cherrypy.serving.request.config.get('tools.sessions.name', 'session_id') + one_year = 60 * 60 * 24 * 365 + e = time.time() - one_year + cherrypy.serving.response.cookie[name]['expires'] = httputil.HTTPDate(e) + + diff --git a/cherrypy/lib/static.py b/cherrypy/lib/static.py new file mode 100644 index 00000000..61c207c2 --- /dev/null +++ b/cherrypy/lib/static.py @@ -0,0 +1,346 @@ +import logging +import mimetypes +mimetypes.init() +mimetypes.types_map['.dwg'] = 'image/x-dwg' +mimetypes.types_map['.ico'] = 'image/x-icon' +mimetypes.types_map['.bz2'] = 'application/x-bzip2' +mimetypes.types_map['.gz'] = 'application/x-gzip' + +import os +import re +import stat +import time +from urllib import unquote + +import cherrypy +from cherrypy.lib import cptools, httputil, file_generator_limited + + +def serve_file(path, content_type=None, disposition=None, name=None, debug=False): + """Set status, headers, and body in order to serve the given path. + + The Content-Type header will be set to the content_type arg, if provided. + If not provided, the Content-Type will be guessed by the file extension + of the 'path' argument. + + If disposition is not None, the Content-Disposition header will be set + to "; filename=". If name is None, it will be set + to the basename of path. If disposition is None, no Content-Disposition + header will be written. + """ + + response = cherrypy.serving.response + + # If path is relative, users should fix it by making path absolute. + # That is, CherryPy should not guess where the application root is. + # It certainly should *not* use cwd (since CP may be invoked from a + # variety of paths). If using tools.staticdir, you can make your relative + # paths become absolute by supplying a value for "tools.staticdir.root". + if not os.path.isabs(path): + msg = "'%s' is not an absolute path." % path + if debug: + cherrypy.log(msg, 'TOOLS.STATICFILE') + raise ValueError(msg) + + try: + st = os.stat(path) + except OSError: + if debug: + cherrypy.log('os.stat(%r) failed' % path, 'TOOLS.STATIC') + raise cherrypy.NotFound() + + # Check if path is a directory. + if stat.S_ISDIR(st.st_mode): + # Let the caller deal with it as they like. + if debug: + cherrypy.log('%r is a directory' % path, 'TOOLS.STATIC') + raise cherrypy.NotFound() + + # Set the Last-Modified response header, so that + # modified-since validation code can work. + response.headers['Last-Modified'] = httputil.HTTPDate(st.st_mtime) + cptools.validate_since() + + if content_type is None: + # Set content-type based on filename extension + ext = "" + i = path.rfind('.') + if i != -1: + ext = path[i:].lower() + content_type = mimetypes.types_map.get(ext, None) + if content_type is not None: + response.headers['Content-Type'] = content_type + if debug: + cherrypy.log('Content-Type: %r' % content_type, 'TOOLS.STATIC') + + cd = None + if disposition is not None: + if name is None: + name = os.path.basename(path) + cd = '%s; filename="%s"' % (disposition, name) + response.headers["Content-Disposition"] = cd + if debug: + cherrypy.log('Content-Disposition: %r' % cd, 'TOOLS.STATIC') + + # Set Content-Length and use an iterable (file object) + # this way CP won't load the whole file in memory + content_length = st.st_size + fileobj = open(path, 'rb') + return _serve_fileobj(fileobj, content_type, content_length, debug=debug) + +def serve_fileobj(fileobj, content_type=None, disposition=None, name=None, + debug=False): + """Set status, headers, and body in order to serve the given file object. + + The Content-Type header will be set to the content_type arg, if provided. + + If disposition is not None, the Content-Disposition header will be set + to "; filename=". If name is None, 'filename' will + not be set. If disposition is None, no Content-Disposition header will + be written. + + CAUTION: If the request contains a 'Range' header, one or more seek()s will + be performed on the file object. This may cause undesired behavior if + the file object is not seekable. It could also produce undesired results + if the caller set the read position of the file object prior to calling + serve_fileobj(), expecting that the data would be served starting from that + position. + """ + + response = cherrypy.serving.response + + try: + st = os.fstat(fileobj.fileno()) + except AttributeError: + if debug: + cherrypy.log('os has no fstat attribute', 'TOOLS.STATIC') + content_length = None + else: + # Set the Last-Modified response header, so that + # modified-since validation code can work. + response.headers['Last-Modified'] = httputil.HTTPDate(st.st_mtime) + cptools.validate_since() + content_length = st.st_size + + if content_type is not None: + response.headers['Content-Type'] = content_type + if debug: + cherrypy.log('Content-Type: %r' % content_type, 'TOOLS.STATIC') + + cd = None + if disposition is not None: + if name is None: + cd = disposition + else: + cd = '%s; filename="%s"' % (disposition, name) + response.headers["Content-Disposition"] = cd + if debug: + cherrypy.log('Content-Disposition: %r' % cd, 'TOOLS.STATIC') + + return _serve_fileobj(fileobj, content_type, content_length, debug=debug) + +def _serve_fileobj(fileobj, content_type, content_length, debug=False): + """Internal. Set response.body to the given file object, perhaps ranged.""" + response = cherrypy.serving.response + + # HTTP/1.0 didn't have Range/Accept-Ranges headers, or the 206 code + request = cherrypy.serving.request + if request.protocol >= (1, 1): + response.headers["Accept-Ranges"] = "bytes" + r = httputil.get_ranges(request.headers.get('Range'), content_length) + if r == []: + response.headers['Content-Range'] = "bytes */%s" % content_length + message = "Invalid Range (first-byte-pos greater than Content-Length)" + if debug: + cherrypy.log(message, 'TOOLS.STATIC') + raise cherrypy.HTTPError(416, message) + + if r: + if len(r) == 1: + # Return a single-part response. + start, stop = r[0] + if stop > content_length: + stop = content_length + r_len = stop - start + if debug: + cherrypy.log('Single part; start: %r, stop: %r' % (start, stop), + 'TOOLS.STATIC') + response.status = "206 Partial Content" + response.headers['Content-Range'] = ( + "bytes %s-%s/%s" % (start, stop - 1, content_length)) + response.headers['Content-Length'] = r_len + fileobj.seek(start) + response.body = file_generator_limited(fileobj, r_len) + else: + # Return a multipart/byteranges response. + response.status = "206 Partial Content" + import mimetools + boundary = mimetools.choose_boundary() + ct = "multipart/byteranges; boundary=%s" % boundary + response.headers['Content-Type'] = ct + if "Content-Length" in response.headers: + # Delete Content-Length header so finalize() recalcs it. + del response.headers["Content-Length"] + + def file_ranges(): + # Apache compatibility: + yield "\r\n" + + for start, stop in r: + if debug: + cherrypy.log('Multipart; start: %r, stop: %r' % (start, stop), + 'TOOLS.STATIC') + yield "--" + boundary + yield "\r\nContent-type: %s" % content_type + yield ("\r\nContent-range: bytes %s-%s/%s\r\n\r\n" + % (start, stop - 1, content_length)) + fileobj.seek(start) + for chunk in file_generator_limited(fileobj, stop - start): + yield chunk + yield "\r\n" + # Final boundary + yield "--" + boundary + "--" + + # Apache compatibility: + yield "\r\n" + response.body = file_ranges() + return response.body + else: + if debug: + cherrypy.log('No byteranges requested', 'TOOLS.STATIC') + + # Set Content-Length and use an iterable (file object) + # this way CP won't load the whole file in memory + response.headers['Content-Length'] = content_length + response.body = fileobj + return response.body + +def serve_download(path, name=None): + """Serve 'path' as an application/x-download attachment.""" + # This is such a common idiom I felt it deserved its own wrapper. + return serve_file(path, "application/x-download", "attachment", name) + + +def _attempt(filename, content_types, debug=False): + if debug: + cherrypy.log('Attempting %r (content_types %r)' % + (filename, content_types), 'TOOLS.STATICDIR') + try: + # you can set the content types for a + # complete directory per extension + content_type = None + if content_types: + r, ext = os.path.splitext(filename) + content_type = content_types.get(ext[1:], None) + serve_file(filename, content_type=content_type, debug=debug) + return True + except cherrypy.NotFound: + # If we didn't find the static file, continue handling the + # request. We might find a dynamic handler instead. + if debug: + cherrypy.log('NotFound', 'TOOLS.STATICFILE') + return False + +def staticdir(section, dir, root="", match="", content_types=None, index="", + debug=False): + """Serve a static resource from the given (root +) dir. + + If 'match' is given, request.path_info will be searched for the given + regular expression before attempting to serve static content. + + If content_types is given, it should be a Python dictionary of + {file-extension: content-type} pairs, where 'file-extension' is + a string (e.g. "gif") and 'content-type' is the value to write + out in the Content-Type response header (e.g. "image/gif"). + + If 'index' is provided, it should be the (relative) name of a file to + serve for directory requests. For example, if the dir argument is + '/home/me', the Request-URI is 'myapp', and the index arg is + 'index.html', the file '/home/me/myapp/index.html' will be sought. + """ + request = cherrypy.serving.request + if request.method not in ('GET', 'HEAD'): + if debug: + cherrypy.log('request.method not GET or HEAD', 'TOOLS.STATICDIR') + return False + + if match and not re.search(match, request.path_info): + if debug: + cherrypy.log('request.path_info %r does not match pattern %r' % + (request.path_info, match), 'TOOLS.STATICDIR') + return False + + # Allow the use of '~' to refer to a user's home directory. + dir = os.path.expanduser(dir) + + # If dir is relative, make absolute using "root". + if not os.path.isabs(dir): + if not root: + msg = "Static dir requires an absolute dir (or root)." + if debug: + cherrypy.log(msg, 'TOOLS.STATICDIR') + raise ValueError(msg) + dir = os.path.join(root, dir) + + # Determine where we are in the object tree relative to 'section' + # (where the static tool was defined). + if section == 'global': + section = "/" + section = section.rstrip(r"\/") + branch = request.path_info[len(section) + 1:] + branch = unquote(branch.lstrip(r"\/")) + + # If branch is "", filename will end in a slash + filename = os.path.join(dir, branch) + if debug: + cherrypy.log('Checking file %r to fulfill %r' % + (filename, request.path_info), 'TOOLS.STATICDIR') + + # There's a chance that the branch pulled from the URL might + # have ".." or similar uplevel attacks in it. Check that the final + # filename is a child of dir. + if not os.path.normpath(filename).startswith(os.path.normpath(dir)): + raise cherrypy.HTTPError(403) # Forbidden + + handled = _attempt(filename, content_types) + if not handled: + # Check for an index file if a folder was requested. + if index: + handled = _attempt(os.path.join(filename, index), content_types) + if handled: + request.is_index = filename[-1] in (r"\/") + return handled + +def staticfile(filename, root=None, match="", content_types=None, debug=False): + """Serve a static resource from the given (root +) filename. + + If 'match' is given, request.path_info will be searched for the given + regular expression before attempting to serve static content. + + If content_types is given, it should be a Python dictionary of + {file-extension: content-type} pairs, where 'file-extension' is + a string (e.g. "gif") and 'content-type' is the value to write + out in the Content-Type response header (e.g. "image/gif"). + """ + request = cherrypy.serving.request + if request.method not in ('GET', 'HEAD'): + if debug: + cherrypy.log('request.method not GET or HEAD', 'TOOLS.STATICFILE') + return False + + if match and not re.search(match, request.path_info): + if debug: + cherrypy.log('request.path_info %r does not match pattern %r' % + (request.path_info, match), 'TOOLS.STATICFILE') + return False + + # If filename is relative, make absolute using "root". + if not os.path.isabs(filename): + if not root: + msg = "Static tool requires an absolute filename (got '%s')." % filename + if debug: + cherrypy.log(msg, 'TOOLS.STATICFILE') + raise ValueError(msg) + filename = os.path.join(root, filename) + + return _attempt(filename, content_types, debug=debug) diff --git a/cherrypy/lib/xmlrpc.py b/cherrypy/lib/xmlrpc.py new file mode 100644 index 00000000..7585d573 --- /dev/null +++ b/cherrypy/lib/xmlrpc.py @@ -0,0 +1,49 @@ +import sys + +import cherrypy + + +def process_body(): + """Return (params, method) from request body.""" + try: + import xmlrpclib + return xmlrpclib.loads(cherrypy.request.body.read()) + except Exception: + return ('ERROR PARAMS',), 'ERRORMETHOD' + + +def patched_path(path): + """Return 'path', doctored for RPC.""" + if not path.endswith('/'): + path += '/' + if path.startswith('/RPC2/'): + # strip the first /rpc2 + path = path[5:] + return path + + +def _set_response(body): + # The XML-RPC spec (http://www.xmlrpc.com/spec) says: + # "Unless there's a lower-level error, always return 200 OK." + # Since Python's xmlrpclib interprets a non-200 response + # as a "Protocol Error", we'll just return 200 every time. + response = cherrypy.response + response.status = '200 OK' + response.body = body + response.headers['Content-Type'] = 'text/xml' + response.headers['Content-Length'] = len(body) + + +def respond(body, encoding='utf-8', allow_none=0): + from xmlrpclib import Fault, dumps + if not isinstance(body, Fault): + body = (body,) + _set_response(dumps(body, methodresponse=1, + encoding=encoding, + allow_none=allow_none)) + +def on_error(*args, **kwargs): + body = str(sys.exc_info()[1]) + from xmlrpclib import Fault, dumps + _set_response(dumps(Fault(1, body))) + diff --git a/cherrypy/process/__init__.py b/cherrypy/process/__init__.py new file mode 100644 index 00000000..f15b1237 --- /dev/null +++ b/cherrypy/process/__init__.py @@ -0,0 +1,14 @@ +"""Site container for an HTTP server. + +A Web Site Process Bus object is used to connect applications, servers, +and frameworks with site-wide services such as daemonization, process +reload, signal handling, drop privileges, PID file management, logging +for all of these, and many more. + +The 'plugins' module defines a few abstract and concrete services for +use with the bus. Some use tool-specific channels; see the documentation +for each class. +""" + +from cherrypy.process.wspbus import bus +from cherrypy.process import plugins, servers diff --git a/cherrypy/process/plugins.py b/cherrypy/process/plugins.py new file mode 100644 index 00000000..ddeefb2c --- /dev/null +++ b/cherrypy/process/plugins.py @@ -0,0 +1,562 @@ +"""Site services for use with a Web Site Process Bus.""" + +import os +import re +try: + set +except NameError: + from sets import Set as set +import signal as _signal +import sys +import time +import thread +import threading + +# _module__file__base is used by Autoreload to make +# absolute any filenames retrieved from sys.modules which are not +# already absolute paths. This is to work around Python's quirk +# of importing the startup script and using a relative filename +# for it in sys.modules. +# +# Autoreload examines sys.modules afresh every time it runs. If an application +# changes the current directory by executing os.chdir(), then the next time +# Autoreload runs, it will not be able to find any filenames which are +# not absolute paths, because the current directory is not the same as when the +# module was first imported. Autoreload will then wrongly conclude the file has +# "changed", and initiate the shutdown/re-exec sequence. +# See ticket #917. +# For this workaround to have a decent probability of success, this module +# needs to be imported as early as possible, before the app has much chance +# to change the working directory. +_module__file__base = os.getcwd() + + +class SimplePlugin(object): + """Plugin base class which auto-subscribes methods for known channels.""" + + def __init__(self, bus): + self.bus = bus + + def subscribe(self): + """Register this object as a (multi-channel) listener on the bus.""" + for channel in self.bus.listeners: + # Subscribe self.start, self.exit, etc. if present. + method = getattr(self, channel, None) + if method is not None: + self.bus.subscribe(channel, method) + + def unsubscribe(self): + """Unregister this object as a listener on the bus.""" + for channel in self.bus.listeners: + # Unsubscribe self.start, self.exit, etc. if present. + method = getattr(self, channel, None) + if method is not None: + self.bus.unsubscribe(channel, method) + + + +class SignalHandler(object): + """Register bus channels (and listeners) for system signals. + + By default, instantiating this object subscribes the following signals + and listeners: + + TERM: bus.exit + HUP : bus.restart + USR1: bus.graceful + """ + + # Map from signal numbers to names + signals = {} + for k, v in vars(_signal).items(): + if k.startswith('SIG') and not k.startswith('SIG_'): + signals[v] = k + del k, v + + def __init__(self, bus): + self.bus = bus + # Set default handlers + self.handlers = {'SIGTERM': self.bus.exit, + 'SIGHUP': self.handle_SIGHUP, + 'SIGUSR1': self.bus.graceful, + } + + self._previous_handlers = {} + + def subscribe(self): + for sig, func in self.handlers.items(): + try: + self.set_handler(sig, func) + except ValueError: + pass + + def unsubscribe(self): + for signum, handler in self._previous_handlers.items(): + signame = self.signals[signum] + + if handler is None: + self.bus.log("Restoring %s handler to SIG_DFL." % signame) + handler = _signal.SIG_DFL + else: + self.bus.log("Restoring %s handler %r." % (signame, handler)) + + try: + our_handler = _signal.signal(signum, handler) + if our_handler is None: + self.bus.log("Restored old %s handler %r, but our " + "handler was not registered." % + (signame, handler), level=30) + except ValueError: + self.bus.log("Unable to restore %s handler %r." % + (signame, handler), level=40, traceback=True) + + def set_handler(self, signal, listener=None): + """Subscribe a handler for the given signal (number or name). + + If the optional 'listener' argument is provided, it will be + subscribed as a listener for the given signal's channel. + + If the given signal name or number is not available on the current + platform, ValueError is raised. + """ + if isinstance(signal, basestring): + signum = getattr(_signal, signal, None) + if signum is None: + raise ValueError("No such signal: %r" % signal) + signame = signal + else: + try: + signame = self.signals[signal] + except KeyError: + raise ValueError("No such signal: %r" % signal) + signum = signal + + prev = _signal.signal(signum, self._handle_signal) + self._previous_handlers[signum] = prev + + if listener is not None: + self.bus.log("Listening for %s." % signame) + self.bus.subscribe(signame, listener) + + def _handle_signal(self, signum=None, frame=None): + """Python signal handler (self.set_handler subscribes it for you).""" + signame = self.signals[signum] + self.bus.log("Caught signal %s." % signame) + self.bus.publish(signame) + + def handle_SIGHUP(self): + if os.isatty(sys.stdin.fileno()): + # not daemonized (may be foreground or background) + self.bus.log("SIGHUP caught but not daemonized. Exiting.") + self.bus.exit() + else: + self.bus.log("SIGHUP caught while daemonized. Restarting.") + self.bus.restart() + + +try: + import pwd, grp +except ImportError: + pwd, grp = None, None + + +class DropPrivileges(SimplePlugin): + """Drop privileges. uid/gid arguments not available on Windows. + + Special thanks to Gavin Baker: http://antonym.org/node/100. + """ + + def __init__(self, bus, umask=None, uid=None, gid=None): + SimplePlugin.__init__(self, bus) + self.finalized = False + self.uid = uid + self.gid = gid + self.umask = umask + + def _get_uid(self): + return self._uid + def _set_uid(self, val): + if val is not None: + if pwd is None: + self.bus.log("pwd module not available; ignoring uid.", + level=30) + val = None + elif isinstance(val, basestring): + val = pwd.getpwnam(val)[2] + self._uid = val + uid = property(_get_uid, _set_uid, doc="The uid under which to run.") + + def _get_gid(self): + return self._gid + def _set_gid(self, val): + if val is not None: + if grp is None: + self.bus.log("grp module not available; ignoring gid.", + level=30) + val = None + elif isinstance(val, basestring): + val = grp.getgrnam(val)[2] + self._gid = val + gid = property(_get_gid, _set_gid, doc="The gid under which to run.") + + def _get_umask(self): + return self._umask + def _set_umask(self, val): + if val is not None: + try: + os.umask + except AttributeError: + self.bus.log("umask function not available; ignoring umask.", + level=30) + val = None + self._umask = val + umask = property(_get_umask, _set_umask, doc="The umask under which to run.") + + def start(self): + # uid/gid + def current_ids(): + """Return the current (uid, gid) if available.""" + name, group = None, None + if pwd: + name = pwd.getpwuid(os.getuid())[0] + if grp: + group = grp.getgrgid(os.getgid())[0] + return name, group + + if self.finalized: + if not (self.uid is None and self.gid is None): + self.bus.log('Already running as uid: %r gid: %r' % + current_ids()) + else: + if self.uid is None and self.gid is None: + if pwd or grp: + self.bus.log('uid/gid not set', level=30) + else: + self.bus.log('Started as uid: %r gid: %r' % current_ids()) + if self.gid is not None: + os.setgid(self.gid) + if self.uid is not None: + os.setuid(self.uid) + self.bus.log('Running as uid: %r gid: %r' % current_ids()) + + # umask + if self.finalized: + if self.umask is not None: + self.bus.log('umask already set to: %03o' % self.umask) + else: + if self.umask is None: + self.bus.log('umask not set', level=30) + else: + old_umask = os.umask(self.umask) + self.bus.log('umask old: %03o, new: %03o' % + (old_umask, self.umask)) + + self.finalized = True + # This is slightly higher than the priority for server.start + # in order to facilitate the most common use: starting on a low + # port (which requires root) and then dropping to another user. + start.priority = 77 + + +class Daemonizer(SimplePlugin): + """Daemonize the running script. + + Use this with a Web Site Process Bus via: + + Daemonizer(bus).subscribe() + + When this component finishes, the process is completely decoupled from + the parent environment. Please note that when this component is used, + the return code from the parent process will still be 0 if a startup + error occurs in the forked children. Errors in the initial daemonizing + process still return proper exit codes. Therefore, if you use this + plugin to daemonize, don't use the return code as an accurate indicator + of whether the process fully started. In fact, that return code only + indicates if the process succesfully finished the first fork. + """ + + def __init__(self, bus, stdin='/dev/null', stdout='/dev/null', + stderr='/dev/null'): + SimplePlugin.__init__(self, bus) + self.stdin = stdin + self.stdout = stdout + self.stderr = stderr + self.finalized = False + + def start(self): + if self.finalized: + self.bus.log('Already deamonized.') + + # forking has issues with threads: + # http://www.opengroup.org/onlinepubs/000095399/functions/fork.html + # "The general problem with making fork() work in a multi-threaded + # world is what to do with all of the threads..." + # So we check for active threads: + if threading.activeCount() != 1: + self.bus.log('There are %r active threads. ' + 'Daemonizing now may cause strange failures.' % + threading.enumerate(), level=30) + + # See http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16 + # (or http://www.faqs.org/faqs/unix-faq/programmer/faq/ section 1.7) + # and http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66012 + + # Finish up with the current stdout/stderr + sys.stdout.flush() + sys.stderr.flush() + + # Do first fork. + try: + pid = os.fork() + if pid == 0: + # This is the child process. Continue. + pass + else: + # This is the first parent. Exit, now that we've forked. + self.bus.log('Forking once.') + os._exit(0) + except OSError, exc: + # Python raises OSError rather than returning negative numbers. + sys.exit("%s: fork #1 failed: (%d) %s\n" + % (sys.argv[0], exc.errno, exc.strerror)) + + os.setsid() + + # Do second fork + try: + pid = os.fork() + if pid > 0: + self.bus.log('Forking twice.') + os._exit(0) # Exit second parent + except OSError, exc: + sys.exit("%s: fork #2 failed: (%d) %s\n" + % (sys.argv[0], exc.errno, exc.strerror)) + + os.chdir("/") + os.umask(0) + + si = open(self.stdin, "r") + so = open(self.stdout, "a+") + se = open(self.stderr, "a+") + + # os.dup2(fd, fd2) will close fd2 if necessary, + # so we don't explicitly close stdin/out/err. + # See http://docs.python.org/lib/os-fd-ops.html + os.dup2(si.fileno(), sys.stdin.fileno()) + os.dup2(so.fileno(), sys.stdout.fileno()) + os.dup2(se.fileno(), sys.stderr.fileno()) + + self.bus.log('Daemonized to PID: %s' % os.getpid()) + self.finalized = True + start.priority = 65 + + +class PIDFile(SimplePlugin): + """Maintain a PID file via a WSPBus.""" + + def __init__(self, bus, pidfile): + SimplePlugin.__init__(self, bus) + self.pidfile = pidfile + self.finalized = False + + def start(self): + pid = os.getpid() + if self.finalized: + self.bus.log('PID %r already written to %r.' % (pid, self.pidfile)) + else: + open(self.pidfile, "wb").write(str(pid)) + self.bus.log('PID %r written to %r.' % (pid, self.pidfile)) + self.finalized = True + start.priority = 70 + + def exit(self): + try: + os.remove(self.pidfile) + self.bus.log('PID file removed: %r.' % self.pidfile) + except (KeyboardInterrupt, SystemExit): + raise + except: + pass + + +class PerpetualTimer(threading._Timer): + """A subclass of threading._Timer whose run() method repeats.""" + + def run(self): + while True: + self.finished.wait(self.interval) + if self.finished.isSet(): + return + try: + self.function(*self.args, **self.kwargs) + except Exception, x: + self.bus.log("Error in perpetual timer thread function %r." % + self.function, level=40, traceback=True) + # Quit on first error to avoid massive logs. + raise + + +class Monitor(SimplePlugin): + """WSPBus listener to periodically run a callback in its own thread. + + bus: a Web Site Process Bus object. + callback: the function to call at intervals. + frequency: the time in seconds between callback runs. + """ + + frequency = 60 + + def __init__(self, bus, callback, frequency=60, name=None): + SimplePlugin.__init__(self, bus) + self.callback = callback + self.frequency = frequency + self.thread = None + self.name = name + + def start(self): + """Start our callback in its own perpetual timer thread.""" + if self.frequency > 0: + threadname = self.name or self.__class__.__name__ + if self.thread is None: + self.thread = PerpetualTimer(self.frequency, self.callback) + self.thread.bus = self.bus + self.thread.setName(threadname) + self.thread.start() + self.bus.log("Started monitor thread %r." % threadname) + else: + self.bus.log("Monitor thread %r already started." % threadname) + start.priority = 70 + + def stop(self): + """Stop our callback's perpetual timer thread.""" + if self.thread is None: + self.bus.log("No thread running for %s." % self.name or self.__class__.__name__) + else: + if self.thread is not threading.currentThread(): + name = self.thread.getName() + self.thread.cancel() + self.thread.join() + self.bus.log("Stopped thread %r." % name) + self.thread = None + + def graceful(self): + """Stop the callback's perpetual timer thread and restart it.""" + self.stop() + self.start() + + +class Autoreloader(Monitor): + """Monitor which re-executes the process when files change.""" + + frequency = 1 + match = '.*' + + def __init__(self, bus, frequency=1, match='.*'): + self.mtimes = {} + self.files = set() + self.match = match + Monitor.__init__(self, bus, self.run, frequency) + + def start(self): + """Start our own perpetual timer thread for self.run.""" + if self.thread is None: + self.mtimes = {} + Monitor.start(self) + start.priority = 70 + + def sysfiles(self): + """Return a Set of filenames which the Autoreloader will monitor.""" + files = set() + for k, m in sys.modules.items(): + if re.match(self.match, k): + if hasattr(m, '__loader__') and hasattr(m.__loader__, 'archive'): + f = m.__loader__.archive + else: + f = getattr(m, '__file__', None) + if f is not None and not os.path.isabs(f): + # ensure absolute paths so a os.chdir() in the app doesn't break me + f = os.path.normpath(os.path.join(_module__file__base, f)) + files.add(f) + return files + + def run(self): + """Reload the process if registered files have been modified.""" + for filename in self.sysfiles() | self.files: + if filename: + if filename.endswith('.pyc'): + filename = filename[:-1] + + oldtime = self.mtimes.get(filename, 0) + if oldtime is None: + # Module with no .py file. Skip it. + continue + + try: + mtime = os.stat(filename).st_mtime + except OSError: + # Either a module with no .py file, or it's been deleted. + mtime = None + + if filename not in self.mtimes: + # If a module has no .py file, this will be None. + self.mtimes[filename] = mtime + else: + if mtime is None or mtime > oldtime: + # The file has been deleted or modified. + self.bus.log("Restarting because %s changed." % filename) + self.thread.cancel() + self.bus.log("Stopped thread %r." % self.thread.getName()) + self.bus.restart() + return + + +class ThreadManager(SimplePlugin): + """Manager for HTTP request threads. + + If you have control over thread creation and destruction, publish to + the 'acquire_thread' and 'release_thread' channels (for each thread). + This will register/unregister the current thread and publish to + 'start_thread' and 'stop_thread' listeners in the bus as needed. + + If threads are created and destroyed by code you do not control + (e.g., Apache), then, at the beginning of every HTTP request, + publish to 'acquire_thread' only. You should not publish to + 'release_thread' in this case, since you do not know whether + the thread will be re-used or not. The bus will call + 'stop_thread' listeners for you when it stops. + """ + + def __init__(self, bus): + self.threads = {} + SimplePlugin.__init__(self, bus) + self.bus.listeners.setdefault('acquire_thread', set()) + self.bus.listeners.setdefault('release_thread', set()) + + def acquire_thread(self): + """Run 'start_thread' listeners for the current thread. + + If the current thread has already been seen, any 'start_thread' + listeners will not be run again. + """ + thread_ident = thread.get_ident() + if thread_ident not in self.threads: + # We can't just use _get_ident as the thread ID + # because some platforms reuse thread ID's. + i = len(self.threads) + 1 + self.threads[thread_ident] = i + self.bus.publish('start_thread', i) + + def release_thread(self): + """Release the current thread and run 'stop_thread' listeners.""" + thread_ident = threading._get_ident() + i = self.threads.pop(thread_ident, None) + if i is not None: + self.bus.publish('stop_thread', i) + + def stop(self): + """Release all threads and run all 'stop_thread' listeners.""" + for thread_ident, i in self.threads.items(): + self.bus.publish('stop_thread', i) + self.threads.clear() + graceful = stop + diff --git a/cherrypy/process/servers.py b/cherrypy/process/servers.py new file mode 100644 index 00000000..93e523e5 --- /dev/null +++ b/cherrypy/process/servers.py @@ -0,0 +1,283 @@ +"""Adapt an HTTP server.""" + +import time + + +class ServerAdapter(object): + """Adapter for an HTTP server. + + If you need to start more than one HTTP server (to serve on multiple + ports, or protocols, etc.), you can manually register each one and then + start them all with bus.start: + + s1 = ServerAdapter(bus, MyWSGIServer(host='0.0.0.0', port=80)) + s2 = ServerAdapter(bus, another.HTTPServer(host='127.0.0.1', SSL=True)) + s1.subscribe() + s2.subscribe() + bus.start() + """ + + def __init__(self, bus, httpserver=None, bind_addr=None): + self.bus = bus + self.httpserver = httpserver + self.bind_addr = bind_addr + self.interrupt = None + self.running = False + + def subscribe(self): + self.bus.subscribe('start', self.start) + self.bus.subscribe('stop', self.stop) + + def unsubscribe(self): + self.bus.unsubscribe('start', self.start) + self.bus.unsubscribe('stop', self.stop) + + def start(self): + """Start the HTTP server.""" + if self.bind_addr is None: + on_what = "unknown interface (dynamic?)" + elif isinstance(self.bind_addr, tuple): + host, port = self.bind_addr + on_what = "%s:%s" % (host, port) + else: + on_what = "socket file: %s" % self.bind_addr + + if self.running: + self.bus.log("Already serving on %s" % on_what) + return + + self.interrupt = None + if not self.httpserver: + raise ValueError("No HTTP server has been created.") + + # Start the httpserver in a new thread. + if isinstance(self.bind_addr, tuple): + wait_for_free_port(*self.bind_addr) + + import threading + t = threading.Thread(target=self._start_http_thread) + t.setName("HTTPServer " + t.getName()) + t.start() + + self.wait() + self.running = True + self.bus.log("Serving on %s" % on_what) + start.priority = 75 + + def _start_http_thread(self): + """HTTP servers MUST be running in new threads, so that the + main thread persists to receive KeyboardInterrupt's. If an + exception is raised in the httpserver's thread then it's + trapped here, and the bus (and therefore our httpserver) + are shut down. + """ + try: + self.httpserver.start() + except KeyboardInterrupt, exc: + self.bus.log(" hit: shutting down HTTP server") + self.interrupt = exc + self.bus.exit() + except SystemExit, exc: + self.bus.log("SystemExit raised: shutting down HTTP server") + self.interrupt = exc + self.bus.exit() + raise + except: + import sys + self.interrupt = sys.exc_info()[1] + self.bus.log("Error in HTTP server: shutting down", + traceback=True, level=40) + self.bus.exit() + raise + + def wait(self): + """Wait until the HTTP server is ready to receive requests.""" + while not getattr(self.httpserver, "ready", False): + if self.interrupt: + raise self.interrupt + time.sleep(.1) + + # Wait for port to be occupied + if isinstance(self.bind_addr, tuple): + host, port = self.bind_addr + wait_for_occupied_port(host, port) + + def stop(self): + """Stop the HTTP server.""" + if self.running: + # stop() MUST block until the server is *truly* stopped. + self.httpserver.stop() + # Wait for the socket to be truly freed. + if isinstance(self.bind_addr, tuple): + wait_for_free_port(*self.bind_addr) + self.running = False + self.bus.log("HTTP Server %s shut down" % self.httpserver) + else: + self.bus.log("HTTP Server %s already shut down" % self.httpserver) + stop.priority = 25 + + def restart(self): + """Restart the HTTP server.""" + self.stop() + self.start() + + +class FlupFCGIServer(object): + """Adapter for a flup.server.fcgi.WSGIServer.""" + + def __init__(self, *args, **kwargs): + if kwargs.get('bindAddress', None) is None: + import socket + if not hasattr(socket.socket, 'fromfd'): + raise ValueError( + 'Dynamic FCGI server not available on this platform. ' + 'You must use a static or external one by providing a ' + 'legal bindAddress.') + self.args = args + self.kwargs = kwargs + self.ready = False + + def start(self): + """Start the FCGI server.""" + # We have to instantiate the server class here because its __init__ + # starts a threadpool. If we do it too early, daemonize won't work. + from flup.server.fcgi import WSGIServer + self.fcgiserver = WSGIServer(*self.args, **self.kwargs) + # TODO: report this bug upstream to flup. + # If we don't set _oldSIGs on Windows, we get: + # File "C:\Python24\Lib\site-packages\flup\server\threadedserver.py", + # line 108, in run + # self._restoreSignalHandlers() + # File "C:\Python24\Lib\site-packages\flup\server\threadedserver.py", + # line 156, in _restoreSignalHandlers + # for signum,handler in self._oldSIGs: + # AttributeError: 'WSGIServer' object has no attribute '_oldSIGs' + self.fcgiserver._installSignalHandlers = lambda: None + self.fcgiserver._oldSIGs = [] + self.ready = True + self.fcgiserver.run() + + def stop(self): + """Stop the HTTP server.""" + # Forcibly stop the fcgi server main event loop. + self.fcgiserver._keepGoing = False + # Force all worker threads to die off. + self.fcgiserver._threadPool.maxSpare = self.fcgiserver._threadPool._idleCount + self.ready = False + + +class FlupSCGIServer(object): + """Adapter for a flup.server.scgi.WSGIServer.""" + + def __init__(self, *args, **kwargs): + self.args = args + self.kwargs = kwargs + self.ready = False + + def start(self): + """Start the SCGI server.""" + # We have to instantiate the server class here because its __init__ + # starts a threadpool. If we do it too early, daemonize won't work. + from flup.server.scgi import WSGIServer + self.scgiserver = WSGIServer(*self.args, **self.kwargs) + # TODO: report this bug upstream to flup. + # If we don't set _oldSIGs on Windows, we get: + # File "C:\Python24\Lib\site-packages\flup\server\threadedserver.py", + # line 108, in run + # self._restoreSignalHandlers() + # File "C:\Python24\Lib\site-packages\flup\server\threadedserver.py", + # line 156, in _restoreSignalHandlers + # for signum,handler in self._oldSIGs: + # AttributeError: 'WSGIServer' object has no attribute '_oldSIGs' + self.scgiserver._installSignalHandlers = lambda: None + self.scgiserver._oldSIGs = [] + self.ready = True + self.scgiserver.run() + + def stop(self): + """Stop the HTTP server.""" + self.ready = False + # Forcibly stop the scgi server main event loop. + self.scgiserver._keepGoing = False + # Force all worker threads to die off. + self.scgiserver._threadPool.maxSpare = 0 + + +def client_host(server_host): + """Return the host on which a client can connect to the given listener.""" + if server_host == '0.0.0.0': + # 0.0.0.0 is INADDR_ANY, which should answer on localhost. + return '127.0.0.1' + if server_host == '::': + # :: is IN6ADDR_ANY, which should answer on localhost. + return '::1' + return server_host + +def check_port(host, port, timeout=1.0): + """Raise an error if the given port is not free on the given host.""" + if not host: + raise ValueError("Host values of '' or None are not allowed.") + host = client_host(host) + port = int(port) + + import socket + + # AF_INET or AF_INET6 socket + # Get the correct address family for our host (allows IPv6 addresses) + try: + info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + socket.SOCK_STREAM) + except socket.gaierror: + if ':' in host: + info = [(socket.AF_INET6, socket.SOCK_STREAM, 0, "", (host, port, 0, 0))] + else: + info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", (host, port))] + + for res in info: + af, socktype, proto, canonname, sa = res + s = None + try: + s = socket.socket(af, socktype, proto) + # See http://groups.google.com/group/cherrypy-users/ + # browse_frm/thread/bbfe5eb39c904fe0 + s.settimeout(timeout) + s.connect((host, port)) + s.close() + raise IOError("Port %s is in use on %s; perhaps the previous " + "httpserver did not shut down properly." % + (repr(port), repr(host))) + except socket.error: + if s: + s.close() + +def wait_for_free_port(host, port): + """Wait for the specified port to become free (drop requests).""" + if not host: + raise ValueError("Host values of '' or None are not allowed.") + + for trial in range(50): + try: + # we are expecting a free port, so reduce the timeout + check_port(host, port, timeout=0.1) + except IOError: + # Give the old server thread time to free the port. + time.sleep(0.1) + else: + return + + raise IOError("Port %r not free on %r" % (port, host)) + +def wait_for_occupied_port(host, port): + """Wait for the specified port to become active (receive requests).""" + if not host: + raise ValueError("Host values of '' or None are not allowed.") + + for trial in range(50): + try: + check_port(host, port) + except IOError: + return + else: + time.sleep(.1) + + raise IOError("Port %r not bound on %r" % (port, host)) diff --git a/cherrypy/process/win32.py b/cherrypy/process/win32.py new file mode 100644 index 00000000..49a83d40 --- /dev/null +++ b/cherrypy/process/win32.py @@ -0,0 +1,174 @@ +"""Windows service. Requires pywin32.""" + +import os +import win32api +import win32con +import win32event +import win32service +import win32serviceutil + +from cherrypy.process import wspbus, plugins + + +class ConsoleCtrlHandler(plugins.SimplePlugin): + """A WSPBus plugin for handling Win32 console events (like Ctrl-C).""" + + def __init__(self, bus): + self.is_set = False + plugins.SimplePlugin.__init__(self, bus) + + def start(self): + if self.is_set: + self.bus.log('Handler for console events already set.', level=40) + return + + result = win32api.SetConsoleCtrlHandler(self.handle, 1) + if result == 0: + self.bus.log('Could not SetConsoleCtrlHandler (error %r)' % + win32api.GetLastError(), level=40) + else: + self.bus.log('Set handler for console events.', level=40) + self.is_set = True + + def stop(self): + if not self.is_set: + self.bus.log('Handler for console events already off.', level=40) + return + + try: + result = win32api.SetConsoleCtrlHandler(self.handle, 0) + except ValueError: + # "ValueError: The object has not been registered" + result = 1 + + if result == 0: + self.bus.log('Could not remove SetConsoleCtrlHandler (error %r)' % + win32api.GetLastError(), level=40) + else: + self.bus.log('Removed handler for console events.', level=40) + self.is_set = False + + def handle(self, event): + """Handle console control events (like Ctrl-C).""" + if event in (win32con.CTRL_C_EVENT, win32con.CTRL_LOGOFF_EVENT, + win32con.CTRL_BREAK_EVENT, win32con.CTRL_SHUTDOWN_EVENT, + win32con.CTRL_CLOSE_EVENT): + self.bus.log('Console event %s: shutting down bus' % event) + + # Remove self immediately so repeated Ctrl-C doesn't re-call it. + try: + self.stop() + except ValueError: + pass + + self.bus.exit() + # 'First to return True stops the calls' + return 1 + return 0 + + +class Win32Bus(wspbus.Bus): + """A Web Site Process Bus implementation for Win32. + + Instead of time.sleep, this bus blocks using native win32event objects. + """ + + def __init__(self): + self.events = {} + wspbus.Bus.__init__(self) + + def _get_state_event(self, state): + """Return a win32event for the given state (creating it if needed).""" + try: + return self.events[state] + except KeyError: + event = win32event.CreateEvent(None, 0, 0, + "WSPBus %s Event (pid=%r)" % + (state.name, os.getpid())) + self.events[state] = event + return event + + def _get_state(self): + return self._state + def _set_state(self, value): + self._state = value + event = self._get_state_event(value) + win32event.PulseEvent(event) + state = property(_get_state, _set_state) + + def wait(self, state, interval=0.1, channel=None): + """Wait for the given state(s), KeyboardInterrupt or SystemExit. + + Since this class uses native win32event objects, the interval + argument is ignored. + """ + if isinstance(state, (tuple, list)): + # Don't wait for an event that beat us to the punch ;) + if self.state not in state: + events = tuple([self._get_state_event(s) for s in state]) + win32event.WaitForMultipleObjects(events, 0, win32event.INFINITE) + else: + # Don't wait for an event that beat us to the punch ;) + if self.state != state: + event = self._get_state_event(state) + win32event.WaitForSingleObject(event, win32event.INFINITE) + + +class _ControlCodes(dict): + """Control codes used to "signal" a service via ControlService. + + User-defined control codes are in the range 128-255. We generally use + the standard Python value for the Linux signal and add 128. Example: + + >>> signal.SIGUSR1 + 10 + control_codes['graceful'] = 128 + 10 + """ + + def key_for(self, obj): + """For the given value, return its corresponding key.""" + for key, val in self.items(): + if val is obj: + return key + raise ValueError("The given object could not be found: %r" % obj) + +control_codes = _ControlCodes({'graceful': 138}) + + +def signal_child(service, command): + if command == 'stop': + win32serviceutil.StopService(service) + elif command == 'restart': + win32serviceutil.RestartService(service) + else: + win32serviceutil.ControlService(service, control_codes[command]) + + +class PyWebService(win32serviceutil.ServiceFramework): + """Python Web Service.""" + + _svc_name_ = "Python Web Service" + _svc_display_name_ = "Python Web Service" + _svc_deps_ = None # sequence of service names on which this depends + _exe_name_ = "pywebsvc" + _exe_args_ = None # Default to no arguments + + # Only exists on Windows 2000 or later, ignored on windows NT + _svc_description_ = "Python Web Service" + + def SvcDoRun(self): + from cherrypy import process + process.bus.start() + process.bus.block() + + def SvcStop(self): + from cherrypy import process + self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) + process.bus.exit() + + def SvcOther(self, control): + process.bus.publish(control_codes.key_for(control)) + + +if __name__ == '__main__': + win32serviceutil.HandleCommandLine(PyWebService) diff --git a/cherrypy/process/wspbus.py b/cherrypy/process/wspbus.py new file mode 100644 index 00000000..db38a99d --- /dev/null +++ b/cherrypy/process/wspbus.py @@ -0,0 +1,384 @@ +"""An implementation of the Web Site Process Bus. + +This module is completely standalone, depending only on the stdlib. + +Web Site Process Bus +-------------------- + +A Bus object is used to contain and manage site-wide behavior: +daemonization, HTTP server start/stop, process reload, signal handling, +drop privileges, PID file management, logging for all of these, +and many more. + +In addition, a Bus object provides a place for each web framework +to register code that runs in response to site-wide events (like +process start and stop), or which controls or otherwise interacts with +the site-wide components mentioned above. For example, a framework which +uses file-based templates would add known template filenames to an +autoreload component. + +Ideally, a Bus object will be flexible enough to be useful in a variety +of invocation scenarios: + + 1. The deployer starts a site from the command line via a framework- + neutral deployment script; applications from multiple frameworks + are mixed in a single site. Command-line arguments and configuration + files are used to define site-wide components such as the HTTP server, + WSGI component graph, autoreload behavior, signal handling, etc. + 2. The deployer starts a site via some other process, such as Apache; + applications from multiple frameworks are mixed in a single site. + Autoreload and signal handling (from Python at least) are disabled. + 3. The deployer starts a site via a framework-specific mechanism; + for example, when running tests, exploring tutorials, or deploying + single applications from a single framework. The framework controls + which site-wide components are enabled as it sees fit. + +The Bus object in this package uses topic-based publish-subscribe +messaging to accomplish all this. A few topic channels are built in +('start', 'stop', 'exit', 'graceful', 'log', and 'main'). Frameworks and +site containers are free to define their own. If a message is sent to a +channel that has not been defined or has no listeners, there is no effect. + +In general, there should only ever be a single Bus object per process. +Frameworks and site containers share a single Bus object by publishing +messages and subscribing listeners. + +The Bus object works as a finite state machine which models the current +state of the process. Bus methods move it from one state to another; +those methods then publish to subscribed listeners on the channel for +the new state. + + O + | + V + STOPPING --> STOPPED --> EXITING -> X + A A | + | \___ | + | \ | + | V V + STARTED <-- STARTING + +""" + +import atexit +import os +try: + set +except NameError: + from sets import Set as set +import sys +import threading +import time +import traceback as _traceback +import warnings + +# Here I save the value of os.getcwd(), which, if I am imported early enough, +# will be the directory from which the startup script was run. This is needed +# by _do_execv(), to change back to the original directory before execv()ing a +# new process. This is a defense against the application having changed the +# current working directory (which could make sys.executable "not found" if +# sys.executable is a relative-path, and/or cause other problems). +_startup_cwd = os.getcwd() + +class ChannelFailures(Exception): + delimiter = '\n' + + def __init__(self, *args, **kwargs): + # Don't use 'super' here; Exceptions are old-style in Py2.4 + # See http://www.cherrypy.org/ticket/959 + Exception.__init__(self, *args, **kwargs) + self._exceptions = list() + + def handle_exception(self): + self._exceptions.append(sys.exc_info()) + + def get_instances(self): + return [instance for cls, instance, traceback in self._exceptions] + + def __str__(self): + exception_strings = map(repr, self.get_instances()) + return self.delimiter.join(exception_strings) + + def __nonzero__(self): + return bool(self._exceptions) + +# Use a flag to indicate the state of the bus. +class _StateEnum(object): + class State(object): + name = None + def __repr__(self): + return "states.%s" % self.name + + def __setattr__(self, key, value): + if isinstance(value, self.State): + value.name = key + object.__setattr__(self, key, value) +states = _StateEnum() +states.STOPPED = states.State() +states.STARTING = states.State() +states.STARTED = states.State() +states.STOPPING = states.State() +states.EXITING = states.State() + + +class Bus(object): + """Process state-machine and messenger for HTTP site deployment. + + All listeners for a given channel are guaranteed to be called even + if others at the same channel fail. Each failure is logged, but + execution proceeds on to the next listener. The only way to stop all + processing from inside a listener is to raise SystemExit and stop the + whole server. + """ + + states = states + state = states.STOPPED + execv = False + + def __init__(self): + self.execv = False + self.state = states.STOPPED + self.listeners = dict( + [(channel, set()) for channel + in ('start', 'stop', 'exit', 'graceful', 'log', 'main')]) + self._priorities = {} + + def subscribe(self, channel, callback, priority=None): + """Add the given callback at the given channel (if not present).""" + if channel not in self.listeners: + self.listeners[channel] = set() + self.listeners[channel].add(callback) + + if priority is None: + priority = getattr(callback, 'priority', 50) + self._priorities[(channel, callback)] = priority + + def unsubscribe(self, channel, callback): + """Discard the given callback (if present).""" + listeners = self.listeners.get(channel) + if listeners and callback in listeners: + listeners.discard(callback) + del self._priorities[(channel, callback)] + + def publish(self, channel, *args, **kwargs): + """Return output of all subscribers for the given channel.""" + if channel not in self.listeners: + return [] + + exc = ChannelFailures() + output = [] + + items = [(self._priorities[(channel, listener)], listener) + for listener in self.listeners[channel]] + items.sort() + for priority, listener in items: + try: + output.append(listener(*args, **kwargs)) + except KeyboardInterrupt: + raise + except SystemExit, e: + # If we have previous errors ensure the exit code is non-zero + if exc and e.code == 0: + e.code = 1 + raise + except: + exc.handle_exception() + if channel == 'log': + # Assume any further messages to 'log' will fail. + pass + else: + self.log("Error in %r listener %r" % (channel, listener), + level=40, traceback=True) + if exc: + raise exc + return output + + def _clean_exit(self): + """An atexit handler which asserts the Bus is not running.""" + if self.state != states.EXITING: + warnings.warn( + "The main thread is exiting, but the Bus is in the %r state; " + "shutting it down automatically now. You must either call " + "bus.block() after start(), or call bus.exit() before the " + "main thread exits." % self.state, RuntimeWarning) + self.exit() + + def start(self): + """Start all services.""" + atexit.register(self._clean_exit) + + self.state = states.STARTING + self.log('Bus STARTING') + try: + self.publish('start') + self.state = states.STARTED + self.log('Bus STARTED') + except (KeyboardInterrupt, SystemExit): + raise + except: + self.log("Shutting down due to error in start listener:", + level=40, traceback=True) + e_info = sys.exc_info() + try: + self.exit() + except: + # Any stop/exit errors will be logged inside publish(). + pass + raise e_info[0], e_info[1], e_info[2] + + def exit(self): + """Stop all services and prepare to exit the process.""" + exitstate = self.state + try: + self.stop() + + self.state = states.EXITING + self.log('Bus EXITING') + self.publish('exit') + # This isn't strictly necessary, but it's better than seeing + # "Waiting for child threads to terminate..." and then nothing. + self.log('Bus EXITED') + except: + # This method is often called asynchronously (whether thread, + # signal handler, console handler, or atexit handler), so we + # can't just let exceptions propagate out unhandled. + # Assume it's been logged and just die. + os._exit(70) # EX_SOFTWARE + + if exitstate == states.STARTING: + # exit() was called before start() finished, possibly due to + # Ctrl-C because a start listener got stuck. In this case, + # we could get stuck in a loop where Ctrl-C never exits the + # process, so we just call os.exit here. + os._exit(70) # EX_SOFTWARE + + def restart(self): + """Restart the process (may close connections). + + This method does not restart the process from the calling thread; + instead, it stops the bus and asks the main thread to call execv. + """ + self.execv = True + self.exit() + + def graceful(self): + """Advise all services to reload.""" + self.log('Bus graceful') + self.publish('graceful') + + def block(self, interval=0.1): + """Wait for the EXITING state, KeyboardInterrupt or SystemExit. + + This function is intended to be called only by the main thread. + After waiting for the EXITING state, it also waits for all threads + to terminate, and then calls os.execv if self.execv is True. This + design allows another thread to call bus.restart, yet have the main + thread perform the actual execv call (required on some platforms). + """ + try: + self.wait(states.EXITING, interval=interval, channel='main') + except (KeyboardInterrupt, IOError): + # The time.sleep call might raise + # "IOError: [Errno 4] Interrupted function call" on KBInt. + self.log('Keyboard Interrupt: shutting down bus') + self.exit() + except SystemExit: + self.log('SystemExit raised: shutting down bus') + self.exit() + raise + + # Waiting for ALL child threads to finish is necessary on OS X. + # See http://www.cherrypy.org/ticket/581. + # It's also good to let them all shut down before allowing + # the main thread to call atexit handlers. + # See http://www.cherrypy.org/ticket/751. + self.log("Waiting for child threads to terminate...") + for t in threading.enumerate(): + if t != threading.currentThread() and t.isAlive(): + # Note that any dummy (external) threads are always daemonic. + if hasattr(threading.Thread, "daemon"): + # Python 2.6+ + d = t.daemon + else: + d = t.isDaemon() + if not d: + t.join() + + if self.execv: + self._do_execv() + + def wait(self, state, interval=0.1, channel=None): + """Wait for the given state(s).""" + if isinstance(state, (tuple, list)): + states = state + else: + states = [state] + + def _wait(): + while self.state not in states: + time.sleep(interval) + self.publish(channel) + + # From http://psyco.sourceforge.net/psycoguide/bugs.html: + # "The compiled machine code does not include the regular polling + # done by Python, meaning that a KeyboardInterrupt will not be + # detected before execution comes back to the regular Python + # interpreter. Your program cannot be interrupted if caught + # into an infinite Psyco-compiled loop." + try: + sys.modules['psyco'].cannotcompile(_wait) + except (KeyError, AttributeError): + pass + + _wait() + + def _do_execv(self): + """Re-execute the current process. + + This must be called from the main thread, because certain platforms + (OS X) don't allow execv to be called in a child thread very well. + """ + args = sys.argv[:] + self.log('Re-spawning %s' % ' '.join(args)) + args.insert(0, sys.executable) + if sys.platform == 'win32': + args = ['"%s"' % arg for arg in args] + + os.chdir(_startup_cwd) + os.execv(sys.executable, args) + + def stop(self): + """Stop all services.""" + self.state = states.STOPPING + self.log('Bus STOPPING') + self.publish('stop') + self.state = states.STOPPED + self.log('Bus STOPPED') + + def start_with_callback(self, func, args=None, kwargs=None): + """Start 'func' in a new thread T, then start self (and return T).""" + if args is None: + args = () + if kwargs is None: + kwargs = {} + args = (func,) + args + + def _callback(func, *a, **kw): + self.wait(states.STARTED) + func(*a, **kw) + t = threading.Thread(target=_callback, args=args, kwargs=kwargs) + t.setName('Bus Callback ' + t.getName()) + t.start() + + self.start() + + return t + + def log(self, msg="", level=20, traceback=False): + """Log the given message. Append the last traceback if requested.""" + if traceback: + exc = sys.exc_info() + msg += "\n" + "".join(_traceback.format_exception(*exc)) + self.publish('log', msg, level) + +bus = Bus() diff --git a/cherrypy/wsgiserver/__init__.py b/cherrypy/wsgiserver/__init__.py new file mode 100644 index 00000000..d44cb31e --- /dev/null +++ b/cherrypy/wsgiserver/__init__.py @@ -0,0 +1,2074 @@ +"""A high-speed, production ready, thread pooled, generic HTTP server. + +Simplest example on how to use this module directly +(without using CherryPy's application machinery): + + from cherrypy import wsgiserver + + def my_crazy_app(environ, start_response): + status = '200 OK' + response_headers = [('Content-type','text/plain')] + start_response(status, response_headers) + return ['Hello world!\n'] + + server = wsgiserver.CherryPyWSGIServer( + ('0.0.0.0', 8070), my_crazy_app, + server_name='www.cherrypy.example') + +The CherryPy WSGI server can serve as many WSGI applications +as you want in one instance by using a WSGIPathInfoDispatcher: + + d = WSGIPathInfoDispatcher({'/': my_crazy_app, '/blog': my_blog_app}) + server = wsgiserver.CherryPyWSGIServer(('0.0.0.0', 80), d) + +Want SSL support? Just set server.ssl_adapter to an SSLAdapter instance. + +This won't call the CherryPy engine (application side) at all, only the +HTTP server, which is independent from the rest of CherryPy. Don't +let the name "CherryPyWSGIServer" throw you; the name merely reflects +its origin, not its coupling. + +For those of you wanting to understand internals of this module, here's the +basic call flow. The server's listening thread runs a very tight loop, +sticking incoming connections onto a Queue: + + server = CherryPyWSGIServer(...) + server.start() + while True: + tick() + # This blocks until a request comes in: + child = socket.accept() + conn = HTTPConnection(child, ...) + server.requests.put(conn) + +Worker threads are kept in a pool and poll the Queue, popping off and then +handling each connection in turn. Each connection can consist of an arbitrary +number of requests and their responses, so we run a nested loop: + + while True: + conn = server.requests.get() + conn.communicate() + -> while True: + req = HTTPRequest(...) + req.parse_request() + -> # Read the Request-Line, e.g. "GET /page HTTP/1.1" + req.rfile.readline() + read_headers(req.rfile, req.inheaders) + req.respond() + -> response = app(...) + try: + for chunk in response: + if chunk: + req.write(chunk) + finally: + if hasattr(response, "close"): + response.close() + if req.close_connection: + return +""" + +CRLF = '\r\n' +import os +import Queue +import re +quoted_slash = re.compile("(?i)%2F") +import rfc822 +import socket +import sys +if 'win' in sys.platform and not hasattr(socket, 'IPPROTO_IPV6'): + socket.IPPROTO_IPV6 = 41 +try: + import cStringIO as StringIO +except ImportError: + import StringIO + +_fileobject_uses_str_type = isinstance(socket._fileobject(None)._rbuf, basestring) + +import threading +import time +import traceback +from urllib import unquote +from urlparse import urlparse +import warnings + +import errno + +def plat_specific_errors(*errnames): + """Return error numbers for all errors in errnames on this platform. + + The 'errno' module contains different global constants depending on + the specific platform (OS). This function will return the list of + numeric values for a given list of potential names. + """ + errno_names = dir(errno) + nums = [getattr(errno, k) for k in errnames if k in errno_names] + # de-dupe the list + return dict.fromkeys(nums).keys() + +socket_error_eintr = plat_specific_errors("EINTR", "WSAEINTR") + +socket_errors_to_ignore = plat_specific_errors( + "EPIPE", + "EBADF", "WSAEBADF", + "ENOTSOCK", "WSAENOTSOCK", + "ETIMEDOUT", "WSAETIMEDOUT", + "ECONNREFUSED", "WSAECONNREFUSED", + "ECONNRESET", "WSAECONNRESET", + "ECONNABORTED", "WSAECONNABORTED", + "ENETRESET", "WSAENETRESET", + "EHOSTDOWN", "EHOSTUNREACH", + ) +socket_errors_to_ignore.append("timed out") +socket_errors_to_ignore.append("The read operation timed out") + +socket_errors_nonblocking = plat_specific_errors( + 'EAGAIN', 'EWOULDBLOCK', 'WSAEWOULDBLOCK') + +comma_separated_headers = ['Accept', 'Accept-Charset', 'Accept-Encoding', + 'Accept-Language', 'Accept-Ranges', 'Allow', 'Cache-Control', + 'Connection', 'Content-Encoding', 'Content-Language', 'Expect', + 'If-Match', 'If-None-Match', 'Pragma', 'Proxy-Authenticate', 'TE', + 'Trailer', 'Transfer-Encoding', 'Upgrade', 'Vary', 'Via', 'Warning', + 'WWW-Authenticate'] + + +def read_headers(rfile, hdict=None): + """Read headers from the given stream into the given header dict. + + If hdict is None, a new header dict is created. Returns the populated + header dict. + + Headers which are repeated are folded together using a comma if their + specification so dictates. + + This function raises ValueError when the read bytes violate the HTTP spec. + You should probably return "400 Bad Request" if this happens. + """ + if hdict is None: + hdict = {} + + while True: + line = rfile.readline() + if not line: + # No more data--illegal end of headers + raise ValueError("Illegal end of headers.") + + if line == CRLF: + # Normal end of headers + break + if not line.endswith(CRLF): + raise ValueError("HTTP requires CRLF terminators") + + if line[0] in ' \t': + # It's a continuation line. + v = line.strip() + else: + try: + k, v = line.split(":", 1) + except ValueError: + raise ValueError("Illegal header line.") + # TODO: what about TE and WWW-Authenticate? + k = k.strip().title() + v = v.strip() + hname = k + + if k in comma_separated_headers: + existing = hdict.get(hname) + if existing: + v = ", ".join((existing, v)) + hdict[hname] = v + + return hdict + + +class MaxSizeExceeded(Exception): + pass + +class SizeCheckWrapper(object): + """Wraps a file-like object, raising MaxSizeExceeded if too large.""" + + def __init__(self, rfile, maxlen): + self.rfile = rfile + self.maxlen = maxlen + self.bytes_read = 0 + + def _check_length(self): + if self.maxlen and self.bytes_read > self.maxlen: + raise MaxSizeExceeded() + + def read(self, size=None): + data = self.rfile.read(size) + self.bytes_read += len(data) + self._check_length() + return data + + def readline(self, size=None): + if size is not None: + data = self.rfile.readline(size) + self.bytes_read += len(data) + self._check_length() + return data + + # User didn't specify a size ... + # We read the line in chunks to make sure it's not a 100MB line ! + res = [] + while True: + data = self.rfile.readline(256) + self.bytes_read += len(data) + self._check_length() + res.append(data) + # See http://www.cherrypy.org/ticket/421 + if len(data) < 256 or data[-1:] == "\n": + return ''.join(res) + + def readlines(self, sizehint=0): + # Shamelessly stolen from StringIO + total = 0 + lines = [] + line = self.readline() + while line: + lines.append(line) + total += len(line) + if 0 < sizehint <= total: + break + line = self.readline() + return lines + + def close(self): + self.rfile.close() + + def __iter__(self): + return self + + def next(self): + data = self.rfile.next() + self.bytes_read += len(data) + self._check_length() + return data + + +class KnownLengthRFile(object): + """Wraps a file-like object, returning an empty string when exhausted.""" + + def __init__(self, rfile, content_length): + self.rfile = rfile + self.remaining = content_length + + def read(self, size=None): + if self.remaining == 0: + return '' + if size is None: + size = self.remaining + else: + size = min(size, self.remaining) + + data = self.rfile.read(size) + self.remaining -= len(data) + return data + + def readline(self, size=None): + if self.remaining == 0: + return '' + if size is None: + size = self.remaining + else: + size = min(size, self.remaining) + + data = self.rfile.readline(size) + self.remaining -= len(data) + return data + + def readlines(self, sizehint=0): + # Shamelessly stolen from StringIO + total = 0 + lines = [] + line = self.readline(sizehint) + while line: + lines.append(line) + total += len(line) + if 0 < sizehint <= total: + break + line = self.readline(sizehint) + return lines + + def close(self): + self.rfile.close() + + def __iter__(self): + return self + + def __next__(self): + data = next(self.rfile) + self.remaining -= len(data) + return data + + +class MaxSizeExceeded(Exception): + pass + + +class ChunkedRFile(object): + """Wraps a file-like object, returning an empty string when exhausted. + + This class is intended to provide a conforming wsgi.input value for + request entities that have been encoded with the 'chunked' transfer + encoding. + """ + + def __init__(self, rfile, maxlen, bufsize=8192): + self.rfile = rfile + self.maxlen = maxlen + self.bytes_read = 0 + self.buffer = '' + self.bufsize = bufsize + self.closed = False + + def _fetch(self): + if self.closed: + return + + line = self.rfile.readline() + self.bytes_read += len(line) + + if self.maxlen and self.bytes_read > self.maxlen: + raise MaxSizeExceeded("Request Entity Too Large", self.maxlen) + + line = line.strip().split(";", 1) + + try: + chunk_size = line.pop(0) + chunk_size = int(chunk_size, 16) + except ValueError: + raise ValueError("Bad chunked transfer size: " + repr(chunk_size)) + + if chunk_size <= 0: + self.closed = True + return + +## if line: chunk_extension = line[0] + + if self.maxlen and self.bytes_read + chunk_size > self.maxlen: + raise IOError("Request Entity Too Large") + + chunk = self.rfile.read(chunk_size) + self.bytes_read += len(chunk) + self.buffer += chunk + + crlf = self.rfile.read(2) + if crlf != CRLF: + raise ValueError( + "Bad chunked transfer coding (expected '\\r\\n', " + "got " + repr(crlf) + ")") + + def read(self, size=None): + data = '' + while True: + if size and len(data) >= size: + return data + + if not self.buffer: + self._fetch() + if not self.buffer: + # EOF + return data + + if size: + remaining = size - len(data) + data += self.buffer[:remaining] + self.buffer = self.buffer[remaining:] + else: + data += self.buffer + + def readline(self, size=None): + data = '' + while True: + if size and len(data) >= size: + return data + + if not self.buffer: + self._fetch() + if not self.buffer: + # EOF + return data + + newline_pos = self.buffer.find('\n') + if size: + if newline_pos == -1: + remaining = size - len(data) + data += self.buffer[:remaining] + self.buffer = self.buffer[remaining:] + else: + remaining = min(size - len(data), newline_pos) + data += self.buffer[:remaining] + self.buffer = self.buffer[remaining:] + else: + if newline_pos == -1: + data += self.buffer + else: + data += self.buffer[:newline_pos] + self.buffer = self.buffer[newline_pos:] + + def readlines(self, sizehint=0): + # Shamelessly stolen from StringIO + total = 0 + lines = [] + line = self.readline(sizehint) + while line: + lines.append(line) + total += len(line) + if 0 < sizehint <= total: + break + line = self.readline(sizehint) + return lines + + def read_trailer_lines(self): + if not self.closed: + raise ValueError( + "Cannot read trailers until the request body has been read.") + + while True: + line = self.rfile.readline() + if not line: + # No more data--illegal end of headers + raise ValueError("Illegal end of headers.") + + self.bytes_read += len(line) + if self.maxlen and self.bytes_read > self.maxlen: + raise IOError("Request Entity Too Large") + + if line == CRLF: + # Normal end of headers + break + if not line.endswith(CRLF): + raise ValueError("HTTP requires CRLF terminators") + + yield line + + def close(self): + self.rfile.close() + + def __iter__(self): + # Shamelessly stolen from StringIO + total = 0 + line = self.readline(sizehint) + while line: + yield line + total += len(line) + if 0 < sizehint <= total: + break + line = self.readline(sizehint) + + +class HTTPRequest(object): + """An HTTP Request (and response). + + A single HTTP connection may consist of multiple request/response pairs. + + server: the Server object which is receiving this request. + conn: the HTTPConnection object on which this request connected. + + inheaders: a dict of request headers. + outheaders: a list of header tuples to write in the response. + ready: when True, the request has been parsed and is ready to begin + generating the response. When False, signals the calling Connection + that the response should not be generated and the connection should + close. + close_connection: signals the calling Connection that the request + should close. This does not imply an error! The client and/or + server may each request that the connection be closed. + chunked_write: if True, output will be encoded with the "chunked" + transfer-coding. This value is set automatically inside + send_headers. + """ + + def __init__(self, server, conn): + self.server = server + self.conn = conn + + self.ready = False + self.started_request = False + self.scheme = "http" + if self.server.ssl_adapter is not None: + self.scheme = "https" + self.inheaders = {} + + self.status = "" + self.outheaders = [] + self.sent_headers = False + self.close_connection = False + self.chunked_write = False + + def parse_request(self): + """Parse the next HTTP request start-line and message-headers.""" + self.rfile = SizeCheckWrapper(self.conn.rfile, + self.server.max_request_header_size) + try: + self._parse_request() + except MaxSizeExceeded: + self.simple_response("413 Request Entity Too Large") + return + + def _parse_request(self): + # HTTP/1.1 connections are persistent by default. If a client + # requests a page, then idles (leaves the connection open), + # then rfile.readline() will raise socket.error("timed out"). + # Note that it does this based on the value given to settimeout(), + # and doesn't need the client to request or acknowledge the close + # (although your TCP stack might suffer for it: cf Apache's history + # with FIN_WAIT_2). + request_line = self.rfile.readline() + + # Set started_request to True so communicate() knows to send 408 + # from here on out. + self.started_request = True + if not request_line: + # Force self.ready = False so the connection will close. + self.ready = False + return + + if request_line == CRLF: + # RFC 2616 sec 4.1: "...if the server is reading the protocol + # stream at the beginning of a message and receives a CRLF + # first, it should ignore the CRLF." + # But only ignore one leading line! else we enable a DoS. + request_line = self.rfile.readline() + if not request_line: + self.ready = False + return + + if not request_line.endswith(CRLF): + self.simple_response(400, "HTTP requires CRLF terminators") + return + + try: + method, uri, req_protocol = request_line.strip().split(" ", 2) + except ValueError: + self.simple_response(400, "Malformed Request-Line") + return + + self.uri = uri + self.method = method + + # uri may be an abs_path (including "http://host.domain.tld"); + scheme, authority, path = self.parse_request_uri(uri) + if '#' in path: + self.simple_response("400 Bad Request", + "Illegal #fragment in Request-URI.") + return + + if scheme: + self.scheme = scheme + + qs = '' + if '?' in path: + path, qs = path.split('?', 1) + + # Unquote the path+params (e.g. "/this%20path" -> "/this path"). + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2 + # + # But note that "...a URI must be separated into its components + # before the escaped characters within those components can be + # safely decoded." http://www.ietf.org/rfc/rfc2396.txt, sec 2.4.2 + # Therefore, "/this%2Fpath" becomes "/this%2Fpath", not "/this/path". + try: + atoms = [unquote(x) for x in quoted_slash.split(path)] + except ValueError, ex: + self.simple_response("400 Bad Request", ex.args[0]) + return + path = "%2F".join(atoms) + self.path = path + + # Note that, like wsgiref and most other HTTP servers, + # we "% HEX HEX"-unquote the path but not the query string. + self.qs = qs + + # Compare request and server HTTP protocol versions, in case our + # server does not support the requested protocol. Limit our output + # to min(req, server). We want the following output: + # request server actual written supported response + # protocol protocol response protocol feature set + # a 1.0 1.0 1.0 1.0 + # b 1.0 1.1 1.1 1.0 + # c 1.1 1.0 1.0 1.0 + # d 1.1 1.1 1.1 1.1 + # Notice that, in (b), the response will be "HTTP/1.1" even though + # the client only understands 1.0. RFC 2616 10.5.6 says we should + # only return 505 if the _major_ version is different. + rp = int(req_protocol[5]), int(req_protocol[7]) + sp = int(self.server.protocol[5]), int(self.server.protocol[7]) + + if sp[0] != rp[0]: + self.simple_response("505 HTTP Version Not Supported") + return + self.request_protocol = req_protocol + self.response_protocol = "HTTP/%s.%s" % min(rp, sp) + + # then all the http headers + try: + read_headers(self.rfile, self.inheaders) + except ValueError, ex: + self.simple_response("400 Bad Request", ex.args[0]) + return + + mrbs = self.server.max_request_body_size + if mrbs and int(self.inheaders.get("Content-Length", 0)) > mrbs: + self.simple_response("413 Request Entity Too Large") + return + + # Persistent connection support + if self.response_protocol == "HTTP/1.1": + # Both server and client are HTTP/1.1 + if self.inheaders.get("Connection", "") == "close": + self.close_connection = True + else: + # Either the server or client (or both) are HTTP/1.0 + if self.inheaders.get("Connection", "") != "Keep-Alive": + self.close_connection = True + + # Transfer-Encoding support + te = None + if self.response_protocol == "HTTP/1.1": + te = self.inheaders.get("Transfer-Encoding") + if te: + te = [x.strip().lower() for x in te.split(",") if x.strip()] + + self.chunked_read = False + + if te: + for enc in te: + if enc == "chunked": + self.chunked_read = True + else: + # Note that, even if we see "chunked", we must reject + # if there is an extension we don't recognize. + self.simple_response("501 Unimplemented") + self.close_connection = True + return + + # From PEP 333: + # "Servers and gateways that implement HTTP 1.1 must provide + # transparent support for HTTP 1.1's "expect/continue" mechanism. + # This may be done in any of several ways: + # 1. Respond to requests containing an Expect: 100-continue request + # with an immediate "100 Continue" response, and proceed normally. + # 2. Proceed with the request normally, but provide the application + # with a wsgi.input stream that will send the "100 Continue" + # response if/when the application first attempts to read from + # the input stream. The read request must then remain blocked + # until the client responds. + # 3. Wait until the client decides that the server does not support + # expect/continue, and sends the request body on its own. + # (This is suboptimal, and is not recommended.) + # + # We used to do 3, but are now doing 1. Maybe we'll do 2 someday, + # but it seems like it would be a big slowdown for such a rare case. + if self.inheaders.get("Expect", "") == "100-continue": + # Don't use simple_response here, because it emits headers + # we don't want. See http://www.cherrypy.org/ticket/951 + msg = self.server.protocol + " 100 Continue\r\n\r\n" + try: + self.conn.wfile.sendall(msg) + except socket.error, x: + if x.args[0] not in socket_errors_to_ignore: + raise + + self.ready = True + + def parse_request_uri(self, uri): + """Parse a Request-URI into (scheme, authority, path). + + Note that Request-URI's must be one of: + + Request-URI = "*" | absoluteURI | abs_path | authority + + Therefore, a Request-URI which starts with a double forward-slash + cannot be a "net_path": + + net_path = "//" authority [ abs_path ] + + Instead, it must be interpreted as an "abs_path" with an empty first + path segment: + + abs_path = "/" path_segments + path_segments = segment *( "/" segment ) + segment = *pchar *( ";" param ) + param = *pchar + """ + if uri == "*": + return None, None, uri + + i = uri.find('://') + if i > 0 and '?' not in uri[:i]: + # An absoluteURI. + # If there's a scheme (and it must be http or https), then: + # http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] + scheme, remainder = uri[:i].lower(), uri[i + 3:] + authority, path = remainder.split("/", 1) + return scheme, authority, path + + if uri.startswith('/'): + # An abs_path. + return None, None, uri + else: + # An authority. + return None, uri, None + + def respond(self): + """Call the gateway and write its iterable output.""" + mrbs = self.server.max_request_body_size + if self.chunked_read: + self.rfile = ChunkedRFile(self.conn.rfile, mrbs) + else: + cl = int(self.inheaders.get("Content-Length", 0)) + if mrbs and mrbs < cl: + if not self.sent_headers: + self.simple_response("413 Request Entity Too Large") + return + self.rfile = KnownLengthRFile(self.conn.rfile, cl) + + self.server.gateway(self).respond() + + if (self.ready and not self.sent_headers): + self.sent_headers = True + self.send_headers() + if self.chunked_write: + self.conn.wfile.sendall("0\r\n\r\n") + + def simple_response(self, status, msg=""): + """Write a simple response back to the client.""" + status = str(status) + buf = [self.server.protocol + " " + + status + CRLF, + "Content-Length: %s\r\n" % len(msg), + "Content-Type: text/plain\r\n"] + + if status[:3] == "413" and self.response_protocol == 'HTTP/1.1': + # Request Entity Too Large + self.close_connection = True + buf.append("Connection: close\r\n") + + buf.append(CRLF) + if msg: + if isinstance(msg, unicode): + msg = msg.encode("ISO-8859-1") + buf.append(msg) + + try: + self.conn.wfile.sendall("".join(buf)) + except socket.error, x: + if x.args[0] not in socket_errors_to_ignore: + raise + + def write(self, chunk): + """Write unbuffered data to the client.""" + if self.chunked_write and chunk: + buf = [hex(len(chunk))[2:], CRLF, chunk, CRLF] + self.conn.wfile.sendall("".join(buf)) + else: + self.conn.wfile.sendall(chunk) + + def send_headers(self): + """Assert, process, and send the HTTP response message-headers. + + You must set self.status, and self.outheaders before calling this. + """ + hkeys = [key.lower() for key, value in self.outheaders] + status = int(self.status[:3]) + + if status == 413: + # Request Entity Too Large. Close conn to avoid garbage. + self.close_connection = True + elif "content-length" not in hkeys: + # "All 1xx (informational), 204 (no content), + # and 304 (not modified) responses MUST NOT + # include a message-body." So no point chunking. + if status < 200 or status in (204, 205, 304): + pass + else: + if (self.response_protocol == 'HTTP/1.1' + and self.method != 'HEAD'): + # Use the chunked transfer-coding + self.chunked_write = True + self.outheaders.append(("Transfer-Encoding", "chunked")) + else: + # Closing the conn is the only way to determine len. + self.close_connection = True + + if "connection" not in hkeys: + if self.response_protocol == 'HTTP/1.1': + # Both server and client are HTTP/1.1 or better + if self.close_connection: + self.outheaders.append(("Connection", "close")) + else: + # Server and/or client are HTTP/1.0 + if not self.close_connection: + self.outheaders.append(("Connection", "Keep-Alive")) + + if (not self.close_connection) and (not self.chunked_read): + # Read any remaining request body data on the socket. + # "If an origin server receives a request that does not include an + # Expect request-header field with the "100-continue" expectation, + # the request includes a request body, and the server responds + # with a final status code before reading the entire request body + # from the transport connection, then the server SHOULD NOT close + # the transport connection until it has read the entire request, + # or until the client closes the connection. Otherwise, the client + # might not reliably receive the response message. However, this + # requirement is not be construed as preventing a server from + # defending itself against denial-of-service attacks, or from + # badly broken client implementations." + remaining = getattr(self.rfile, 'remaining', 0) + if remaining > 0: + self.rfile.read(remaining) + + if "date" not in hkeys: + self.outheaders.append(("Date", rfc822.formatdate())) + + if "server" not in hkeys: + self.outheaders.append(("Server", self.server.server_name)) + + buf = [self.server.protocol + " " + self.status + CRLF] + for k, v in self.outheaders: + buf.append(k + ": " + v + CRLF) + buf.append(CRLF) + self.conn.wfile.sendall("".join(buf)) + + +class NoSSLError(Exception): + """Exception raised when a client speaks HTTP to an HTTPS socket.""" + pass + + +class FatalSSLAlert(Exception): + """Exception raised when the SSL implementation signals a fatal alert.""" + pass + + +if not _fileobject_uses_str_type: + class CP_fileobject(socket._fileobject): + """Faux file object attached to a socket object.""" + + def sendall(self, data): + """Sendall for non-blocking sockets.""" + while data: + try: + bytes_sent = self.send(data) + data = data[bytes_sent:] + except socket.error, e: + if e.args[0] not in socket_errors_nonblocking: + raise + + def send(self, data): + return self._sock.send(data) + + def flush(self): + if self._wbuf: + buffer = "".join(self._wbuf) + self._wbuf = [] + self.sendall(buffer) + + def recv(self, size): + while True: + try: + return self._sock.recv(size) + except socket.error, e: + if (e.args[0] not in socket_errors_nonblocking + and e.args[0] not in socket_error_eintr): + raise + + def read(self, size= -1): + # Use max, disallow tiny reads in a loop as they are very inefficient. + # We never leave read() with any leftover data from a new recv() call + # in our internal buffer. + rbufsize = max(self._rbufsize, self.default_bufsize) + # Our use of StringIO rather than lists of string objects returned by + # recv() minimizes memory usage and fragmentation that occurs when + # rbufsize is large compared to the typical return value of recv(). + buf = self._rbuf + buf.seek(0, 2) # seek end + if size < 0: + # Read until EOF + self._rbuf = StringIO.StringIO() # reset _rbuf. we consume it via buf. + while True: + data = self.recv(rbufsize) + if not data: + break + buf.write(data) + return buf.getvalue() + else: + # Read until size bytes or EOF seen, whichever comes first + buf_len = buf.tell() + if buf_len >= size: + # Already have size bytes in our buffer? Extract and return. + buf.seek(0) + rv = buf.read(size) + self._rbuf = StringIO.StringIO() + self._rbuf.write(buf.read()) + return rv + + self._rbuf = StringIO.StringIO() # reset _rbuf. we consume it via buf. + while True: + left = size - buf_len + # recv() will malloc the amount of memory given as its + # parameter even though it often returns much less data + # than that. The returned data string is short lived + # as we copy it into a StringIO and free it. This avoids + # fragmentation issues on many platforms. + data = self.recv(left) + if not data: + break + n = len(data) + if n == size and not buf_len: + # Shortcut. Avoid buffer data copies when: + # - We have no data in our buffer. + # AND + # - Our call to recv returned exactly the + # number of bytes we were asked to read. + return data + if n == left: + buf.write(data) + del data # explicit free + break + assert n <= left, "recv(%d) returned %d bytes" % (left, n) + buf.write(data) + buf_len += n + del data # explicit free + #assert buf_len == buf.tell() + return buf.getvalue() + + def readline(self, size= -1): + buf = self._rbuf + buf.seek(0, 2) # seek end + if buf.tell() > 0: + # check if we already have it in our buffer + buf.seek(0) + bline = buf.readline(size) + if bline.endswith('\n') or len(bline) == size: + self._rbuf = StringIO.StringIO() + self._rbuf.write(buf.read()) + return bline + del bline + if size < 0: + # Read until \n or EOF, whichever comes first + if self._rbufsize <= 1: + # Speed up unbuffered case + buf.seek(0) + buffers = [buf.read()] + self._rbuf = StringIO.StringIO() # reset _rbuf. we consume it via buf. + data = None + recv = self.recv + while data != "\n": + data = recv(1) + if not data: + break + buffers.append(data) + return "".join(buffers) + + buf.seek(0, 2) # seek end + self._rbuf = StringIO.StringIO() # reset _rbuf. we consume it via buf. + while True: + data = self.recv(self._rbufsize) + if not data: + break + nl = data.find('\n') + if nl >= 0: + nl += 1 + buf.write(data[:nl]) + self._rbuf.write(data[nl:]) + del data + break + buf.write(data) + return buf.getvalue() + else: + # Read until size bytes or \n or EOF seen, whichever comes first + buf.seek(0, 2) # seek end + buf_len = buf.tell() + if buf_len >= size: + buf.seek(0) + rv = buf.read(size) + self._rbuf = StringIO.StringIO() + self._rbuf.write(buf.read()) + return rv + self._rbuf = StringIO.StringIO() # reset _rbuf. we consume it via buf. + while True: + data = self.recv(self._rbufsize) + if not data: + break + left = size - buf_len + # did we just receive a newline? + nl = data.find('\n', 0, left) + if nl >= 0: + nl += 1 + # save the excess data to _rbuf + self._rbuf.write(data[nl:]) + if buf_len: + buf.write(data[:nl]) + break + else: + # Shortcut. Avoid data copy through buf when returning + # a substring of our first recv(). + return data[:nl] + n = len(data) + if n == size and not buf_len: + # Shortcut. Avoid data copy through buf when + # returning exactly all of our first recv(). + return data + if n >= left: + buf.write(data[:left]) + self._rbuf.write(data[left:]) + break + buf.write(data) + buf_len += n + #assert buf_len == buf.tell() + return buf.getvalue() + +else: + class CP_fileobject(socket._fileobject): + """Faux file object attached to a socket object.""" + + def sendall(self, data): + """Sendall for non-blocking sockets.""" + while data: + try: + bytes_sent = self.send(data) + data = data[bytes_sent:] + except socket.error, e: + if e.args[0] not in socket_errors_nonblocking: + raise + + def send(self, data): + return self._sock.send(data) + + def flush(self): + if self._wbuf: + buffer = "".join(self._wbuf) + self._wbuf = [] + self.sendall(buffer) + + def recv(self, size): + while True: + try: + return self._sock.recv(size) + except socket.error, e: + if (e.args[0] not in socket_errors_nonblocking + and e.args[0] not in socket_error_eintr): + raise + + def read(self, size= -1): + if size < 0: + # Read until EOF + buffers = [self._rbuf] + self._rbuf = "" + if self._rbufsize <= 1: + recv_size = self.default_bufsize + else: + recv_size = self._rbufsize + + while True: + data = self.recv(recv_size) + if not data: + break + buffers.append(data) + return "".join(buffers) + else: + # Read until size bytes or EOF seen, whichever comes first + data = self._rbuf + buf_len = len(data) + if buf_len >= size: + self._rbuf = data[size:] + return data[:size] + buffers = [] + if data: + buffers.append(data) + self._rbuf = "" + while True: + left = size - buf_len + recv_size = max(self._rbufsize, left) + data = self.recv(recv_size) + if not data: + break + buffers.append(data) + n = len(data) + if n >= left: + self._rbuf = data[left:] + buffers[-1] = data[:left] + break + buf_len += n + return "".join(buffers) + + def readline(self, size= -1): + data = self._rbuf + if size < 0: + # Read until \n or EOF, whichever comes first + if self._rbufsize <= 1: + # Speed up unbuffered case + assert data == "" + buffers = [] + while data != "\n": + data = self.recv(1) + if not data: + break + buffers.append(data) + return "".join(buffers) + nl = data.find('\n') + if nl >= 0: + nl += 1 + self._rbuf = data[nl:] + return data[:nl] + buffers = [] + if data: + buffers.append(data) + self._rbuf = "" + while True: + data = self.recv(self._rbufsize) + if not data: + break + buffers.append(data) + nl = data.find('\n') + if nl >= 0: + nl += 1 + self._rbuf = data[nl:] + buffers[-1] = data[:nl] + break + return "".join(buffers) + else: + # Read until size bytes or \n or EOF seen, whichever comes first + nl = data.find('\n', 0, size) + if nl >= 0: + nl += 1 + self._rbuf = data[nl:] + return data[:nl] + buf_len = len(data) + if buf_len >= size: + self._rbuf = data[size:] + return data[:size] + buffers = [] + if data: + buffers.append(data) + self._rbuf = "" + while True: + data = self.recv(self._rbufsize) + if not data: + break + buffers.append(data) + left = size - buf_len + nl = data.find('\n', 0, left) + if nl >= 0: + nl += 1 + self._rbuf = data[nl:] + buffers[-1] = data[:nl] + break + n = len(data) + if n >= left: + self._rbuf = data[left:] + buffers[-1] = data[:left] + break + buf_len += n + return "".join(buffers) + + +class HTTPConnection(object): + """An HTTP connection (active socket). + + server: the Server object which received this connection. + socket: the raw socket object (usually TCP) for this connection. + makefile: a fileobject class for reading from the socket. + """ + + remote_addr = None + remote_port = None + ssl_env = None + rbufsize = -1 + RequestHandlerClass = HTTPRequest + + def __init__(self, server, sock, makefile=CP_fileobject): + self.server = server + self.socket = sock + self.rfile = makefile(sock, "rb", self.rbufsize) + self.wfile = makefile(sock, "wb", -1) + + def communicate(self): + """Read each request and respond appropriately.""" + request_seen = False + try: + while True: + # (re)set req to None so that if something goes wrong in + # the RequestHandlerClass constructor, the error doesn't + # get written to the previous request. + req = None + req = self.RequestHandlerClass(self.server, self) + + # This order of operations should guarantee correct pipelining. + req.parse_request() + if not req.ready: + # Something went wrong in the parsing (and the server has + # probably already made a simple_response). Return and + # let the conn close. + return + + request_seen = True + req.respond() + if req.close_connection: + return + except socket.error, e: + errnum = e.args[0] + if errnum == 'timed out': + # Don't error if we're between requests; only error + # if 1) no request has been started at all, or 2) we're + # in the middle of a request. + # See http://www.cherrypy.org/ticket/853 + if (not request_seen) or (req and req.started_request): + # Don't bother writing the 408 if the response + # has already started being written. + if req and not req.sent_headers: + try: + req.simple_response("408 Request Timeout") + except FatalSSLAlert: + # Close the connection. + return + elif errnum not in socket_errors_to_ignore: + if req and not req.sent_headers: + try: + req.simple_response("500 Internal Server Error", + format_exc()) + except FatalSSLAlert: + # Close the connection. + return + return + except (KeyboardInterrupt, SystemExit): + raise + except FatalSSLAlert: + # Close the connection. + return + except NoSSLError: + if req and not req.sent_headers: + # Unwrap our wfile + self.wfile = CP_fileobject(self.socket._sock, "wb", -1) + req.simple_response("400 Bad Request", + "The client sent a plain HTTP request, but " + "this server only speaks HTTPS on this port.") + self.linger = True + except Exception: + if req and not req.sent_headers: + try: + req.simple_response("500 Internal Server Error", format_exc()) + except FatalSSLAlert: + # Close the connection. + return + + linger = False + + def close(self): + """Close the socket underlying this connection.""" + self.rfile.close() + + if not self.linger: + # Python's socket module does NOT call close on the kernel socket + # when you call socket.close(). We do so manually here because we + # want this server to send a FIN TCP segment immediately. Note this + # must be called *before* calling socket.close(), because the latter + # drops its reference to the kernel socket. + if hasattr(self.socket, '_sock'): + self.socket._sock.close() + self.socket.close() + else: + # On the other hand, sometimes we want to hang around for a bit + # to make sure the client has a chance to read our entire + # response. Skipping the close() calls here delays the FIN + # packet until the socket object is garbage-collected later. + # Someday, perhaps, we'll do the full lingering_close that + # Apache does, but not today. + pass + + +def format_exc(limit=None): + """Like print_exc() but return a string. Backport for Python 2.3.""" + try: + etype, value, tb = sys.exc_info() + return ''.join(traceback.format_exception(etype, value, tb, limit)) + finally: + etype = value = tb = None + + +_SHUTDOWNREQUEST = None + +class WorkerThread(threading.Thread): + """Thread which continuously polls a Queue for Connection objects. + + server: the HTTP Server which spawned this thread, and which owns the + Queue and is placing active connections into it. + ready: a simple flag for the calling server to know when this thread + has begun polling the Queue. + + Due to the timing issues of polling a Queue, a WorkerThread does not + check its own 'ready' flag after it has started. To stop the thread, + it is necessary to stick a _SHUTDOWNREQUEST object onto the Queue + (one for each running WorkerThread). + """ + + conn = None + + def __init__(self, server): + self.ready = False + self.server = server + threading.Thread.__init__(self) + + def run(self): + try: + self.ready = True + while True: + conn = self.server.requests.get() + if conn is _SHUTDOWNREQUEST: + return + + self.conn = conn + try: + conn.communicate() + finally: + conn.close() + self.conn = None + except (KeyboardInterrupt, SystemExit), exc: + self.server.interrupt = exc + + +class ThreadPool(object): + """A Request Queue for the CherryPyWSGIServer which pools threads. + + ThreadPool objects must provide min, get(), put(obj), start() + and stop(timeout) attributes. + """ + + def __init__(self, server, min=10, max= -1): + self.server = server + self.min = min + self.max = max + self._threads = [] + self._queue = Queue.Queue() + self.get = self._queue.get + + def start(self): + """Start the pool of threads.""" + for i in range(self.min): + self._threads.append(WorkerThread(self.server)) + for worker in self._threads: + worker.setName("CP Server " + worker.getName()) + worker.start() + for worker in self._threads: + while not worker.ready: + time.sleep(.1) + + def _get_idle(self): + """Number of worker threads which are idle. Read-only.""" + return len([t for t in self._threads if t.conn is None]) + idle = property(_get_idle, doc=_get_idle.__doc__) + + def put(self, obj): + self._queue.put(obj) + if obj is _SHUTDOWNREQUEST: + return + + def grow(self, amount): + """Spawn new worker threads (not above self.max).""" + for i in range(amount): + if self.max > 0 and len(self._threads) >= self.max: + break + worker = WorkerThread(self.server) + worker.setName("CP Server " + worker.getName()) + self._threads.append(worker) + worker.start() + + def shrink(self, amount): + """Kill off worker threads (not below self.min).""" + # Grow/shrink the pool if necessary. + # Remove any dead threads from our list + for t in self._threads: + if not t.isAlive(): + self._threads.remove(t) + amount -= 1 + + if amount > 0: + for i in range(min(amount, len(self._threads) - self.min)): + # Put a number of shutdown requests on the queue equal + # to 'amount'. Once each of those is processed by a worker, + # that worker will terminate and be culled from our list + # in self.put. + self._queue.put(_SHUTDOWNREQUEST) + + def stop(self, timeout=5): + # Must shut down threads here so the code that calls + # this method can know when all threads are stopped. + for worker in self._threads: + self._queue.put(_SHUTDOWNREQUEST) + + # Don't join currentThread (when stop is called inside a request). + current = threading.currentThread() + if timeout and timeout >= 0: + endtime = time.time() + timeout + while self._threads: + worker = self._threads.pop() + if worker is not current and worker.isAlive(): + try: + if timeout is None or timeout < 0: + worker.join() + else: + remaining_time = endtime - time.time() + if remaining_time > 0: + worker.join(remaining_time) + if worker.isAlive(): + # We exhausted the timeout. + # Forcibly shut down the socket. + c = worker.conn + if c and not c.rfile.closed: + try: + c.socket.shutdown(socket.SHUT_RD) + except TypeError: + # pyOpenSSL sockets don't take an arg + c.socket.shutdown() + worker.join() + except (AssertionError, + # Ignore repeated Ctrl-C. + # See http://www.cherrypy.org/ticket/691. + KeyboardInterrupt), exc1: + pass + + + +try: + import fcntl +except ImportError: + try: + from ctypes import windll, WinError + except ImportError: + def prevent_socket_inheritance(sock): + """Dummy function, since neither fcntl nor ctypes are available.""" + pass + else: + def prevent_socket_inheritance(sock): + """Mark the given socket fd as non-inheritable (Windows).""" + if not windll.kernel32.SetHandleInformation(sock.fileno(), 1, 0): + raise WinError() +else: + def prevent_socket_inheritance(sock): + """Mark the given socket fd as non-inheritable (POSIX).""" + fd = sock.fileno() + old_flags = fcntl.fcntl(fd, fcntl.F_GETFD) + fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) + + +class SSLAdapter(object): + + def __init__(self, certificate, private_key, certificate_chain=None): + self.certificate = certificate + self.private_key = private_key + self.certificate_chain = certificate_chain + + def wrap(self, sock): + raise NotImplemented + + def makefile(self, sock, mode='r', bufsize= -1): + raise NotImplemented + + +class HTTPServer(object): + """An HTTP server. + + bind_addr: The interface on which to listen for connections. + For TCP sockets, a (host, port) tuple. Host values may be any IPv4 + or IPv6 address, or any valid hostname. The string 'localhost' is a + synonym for '127.0.0.1' (or '::1', if your hosts file prefers IPv6). + The string '0.0.0.0' is a special IPv4 entry meaning "any active + interface" (INADDR_ANY), and '::' is the similar IN6ADDR_ANY for + IPv6. The empty string or None are not allowed. + + For UNIX sockets, supply the filename as a string. + gateway: a Gateway instance. + minthreads: the minimum number of worker threads to create (default 10). + maxthreads: the maximum number of worker threads to create (default -1 = no limit). + server_name: defaults to socket.gethostname(). + + request_queue_size: the 'backlog' argument to socket.listen(); + specifies the maximum number of queued connections (default 5). + timeout: the timeout in seconds for accepted connections (default 10). + nodelay: if True (the default since 3.1), sets the TCP_NODELAY socket + option. + protocol: the version string to write in the Status-Line of all + HTTP responses. For example, "HTTP/1.1" (the default). This + also limits the supported features used in the response. + + + SSL/HTTPS + --------- + You must have an ssl library installed and set self.ssl_adapter to an + instance of SSLAdapter (or a subclass) which provides the methods: + wrap(sock) -> wrapped socket, ssl environ dict + makefile(sock, mode='r', bufsize=-1) -> socket file object + """ + + protocol = "HTTP/1.1" + _bind_addr = "127.0.0.1" + version = "CherryPy/3.2.0rc1" + response_header = None + ready = False + _interrupt = None + max_request_header_size = 0 + max_request_body_size = 0 + nodelay = True + + ConnectionClass = HTTPConnection + + ssl_adapter = None + + def __init__(self, bind_addr, gateway, minthreads=10, maxthreads= -1, + server_name=None): + self.bind_addr = bind_addr + self.gateway = gateway + + self.requests = ThreadPool(self, min=minthreads or 1, max=maxthreads) + + if not server_name: + server_name = socket.gethostname() + self.server_name = server_name + + def __str__(self): + return "%s.%s(%r)" % (self.__module__, self.__class__.__name__, + self.bind_addr) + + def _get_bind_addr(self): + return self._bind_addr + def _set_bind_addr(self, value): + if isinstance(value, tuple) and value[0] in ('', None): + # Despite the socket module docs, using '' does not + # allow AI_PASSIVE to work. Passing None instead + # returns '0.0.0.0' like we want. In other words: + # host AI_PASSIVE result + # '' Y 192.168.x.y + # '' N 192.168.x.y + # None Y 0.0.0.0 + # None N 127.0.0.1 + # But since you can get the same effect with an explicit + # '0.0.0.0', we deny both the empty string and None as values. + raise ValueError("Host values of '' or None are not allowed. " + "Use '0.0.0.0' (IPv4) or '::' (IPv6) instead " + "to listen on all active interfaces.") + self._bind_addr = value + bind_addr = property(_get_bind_addr, _set_bind_addr, + doc="""The interface on which to listen for connections. + + For TCP sockets, a (host, port) tuple. Host values may be any IPv4 + or IPv6 address, or any valid hostname. The string 'localhost' is a + synonym for '127.0.0.1' (or '::1', if your hosts file prefers IPv6). + The string '0.0.0.0' is a special IPv4 entry meaning "any active + interface" (INADDR_ANY), and '::' is the similar IN6ADDR_ANY for + IPv6. The empty string or None are not allowed. + + For UNIX sockets, supply the filename as a string.""") + + def start(self): + """Run the server forever.""" + # We don't have to trap KeyboardInterrupt or SystemExit here, + # because cherrpy.server already does so, calling self.stop() for us. + # If you're using this server with another framework, you should + # trap those exceptions in whatever code block calls start(). + self._interrupt = None + + # SSL backward compatibility + if (self.ssl_adapter is None and + getattr(self, 'ssl_certificate', None) and + getattr(self, 'ssl_private_key', None)): + warnings.warn( + "SSL attributes are deprecated in CherryPy 3.2, and will " + "be removed in CherryPy 3.3. Use an ssl_adapter attribute " + "instead.", + DeprecationWarning + ) + try: + from cherrypy.wsgiserver.ssl_pyopenssl import pyOpenSSLAdapter + except ImportError: + pass + else: + self.ssl_adapter = pyOpenSSLAdapter( + self.ssl_certificate, self.ssl_private_key, + getattr(self, 'ssl_certificate_chain', None)) + + # Select the appropriate socket + if isinstance(self.bind_addr, basestring): + # AF_UNIX socket + + # So we can reuse the socket... + try: os.unlink(self.bind_addr) + except: pass + + # So everyone can access the socket... + try: os.chmod(self.bind_addr, 0777) + except: pass + + info = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, "", self.bind_addr)] + else: + # AF_INET or AF_INET6 socket + # Get the correct address family for our host (allows IPv6 addresses) + host, port = self.bind_addr + try: + info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + socket.SOCK_STREAM, 0, socket.AI_PASSIVE) + except socket.gaierror: + if ':' in self.bind_addr[0]: + info = [(socket.AF_INET6, socket.SOCK_STREAM, + 0, "", self.bind_addr + (0, 0))] + else: + info = [(socket.AF_INET, socket.SOCK_STREAM, + 0, "", self.bind_addr)] + + self.socket = None + msg = "No socket could be created" + for res in info: + af, socktype, proto, canonname, sa = res + try: + self.bind(af, socktype, proto) + except socket.error, msg: + if self.socket: + self.socket.close() + self.socket = None + continue + break + if not self.socket: + raise socket.error(msg) + + # Timeout so KeyboardInterrupt can be caught on Win32 + self.socket.settimeout(1) + self.socket.listen(self.request_queue_size) + + # Create worker threads + self.requests.start() + + self.ready = True + while self.ready: + self.tick() + if self.interrupt: + while self.interrupt is True: + # Wait for self.stop() to complete. See _set_interrupt. + time.sleep(0.1) + if self.interrupt: + raise self.interrupt + + def bind(self, family, type, proto=0): + """Create (or recreate) the actual socket object.""" + self.socket = socket.socket(family, type, proto) + prevent_socket_inheritance(self.socket) + self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + if self.nodelay and not isinstance(self.bind_addr, str): + self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + + if self.ssl_adapter is not None: + self.socket = self.ssl_adapter.bind(self.socket) + + # If listening on the IPV6 any address ('::' = IN6ADDR_ANY), + # activate dual-stack. See http://www.cherrypy.org/ticket/871. + if (family == socket.AF_INET6 + and self.bind_addr[0] in ('::', '::0', '::0.0.0.0')): + try: + self.socket.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 0) + except (AttributeError, socket.error): + # Apparently, the socket option is not available in + # this machine's TCP stack + pass + + self.socket.bind(self.bind_addr) + + def tick(self): + """Accept a new connection and put it on the Queue.""" + try: + s, addr = self.socket.accept() + if not self.ready: + return + + prevent_socket_inheritance(s) + if hasattr(s, 'settimeout'): + s.settimeout(self.timeout) + + if self.response_header is None: + self.response_header = "%s Server" % self.version + + makefile = CP_fileobject + ssl_env = {} + # if ssl cert and key are set, we try to be a secure HTTP server + if self.ssl_adapter is not None: + try: + s, ssl_env = self.ssl_adapter.wrap(s) + except NoSSLError: + msg = ("The client sent a plain HTTP request, but " + "this server only speaks HTTPS on this port.") + buf = ["%s 400 Bad Request\r\n" % self.protocol, + "Content-Length: %s\r\n" % len(msg), + "Content-Type: text/plain\r\n\r\n", + msg] + + wfile = CP_fileobject(s, "wb", -1) + try: + wfile.sendall("".join(buf)) + except socket.error, x: + if x.args[0] not in socket_errors_to_ignore: + raise + return + if not s: + return + makefile = self.ssl_adapter.makefile + + conn = self.ConnectionClass(self, s, makefile) + + if not isinstance(self.bind_addr, basestring): + # optional values + # Until we do DNS lookups, omit REMOTE_HOST + if addr is None: # sometimes this can happen + # figure out if AF_INET or AF_INET6. + if len(s.getsockname()) == 2: + # AF_INET + addr = ('0.0.0.0', 0) + else: + # AF_INET6 + addr = ('::', 0) + conn.remote_addr = addr[0] + conn.remote_port = addr[1] + + conn.ssl_env = ssl_env + + self.requests.put(conn) + except socket.timeout: + # The only reason for the timeout in start() is so we can + # notice keyboard interrupts on Win32, which don't interrupt + # accept() by default + return + except socket.error, x: + if x.args[0] in socket_error_eintr: + # I *think* this is right. EINTR should occur when a signal + # is received during the accept() call; all docs say retry + # the call, and I *think* I'm reading it right that Python + # will then go ahead and poll for and handle the signal + # elsewhere. See http://www.cherrypy.org/ticket/707. + return + if x.args[0] in socket_errors_nonblocking: + # Just try again. See http://www.cherrypy.org/ticket/479. + return + if x.args[0] in socket_errors_to_ignore: + # Our socket was closed. + # See http://www.cherrypy.org/ticket/686. + return + raise + + def _get_interrupt(self): + return self._interrupt + def _set_interrupt(self, interrupt): + self._interrupt = True + self.stop() + self._interrupt = interrupt + interrupt = property(_get_interrupt, _set_interrupt, + doc="Set this to an Exception instance to " + "interrupt the server.") + + def stop(self): + """Gracefully shutdown a server that is serving forever.""" + self.ready = False + + sock = getattr(self, "socket", None) + if sock: + if not isinstance(self.bind_addr, basestring): + # Touch our own socket to make accept() return immediately. + try: + host, port = sock.getsockname()[:2] + except socket.error, x: + if x.args[0] not in socket_errors_to_ignore: + # Changed to use error code and not message + # See http://www.cherrypy.org/ticket/860. + raise + else: + # Note that we're explicitly NOT using AI_PASSIVE, + # here, because we want an actual IP to touch. + # localhost won't work if we've bound to a public IP, + # but it will if we bound to '0.0.0.0' (INADDR_ANY). + for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, + socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + s = None + try: + s = socket.socket(af, socktype, proto) + # See http://groups.google.com/group/cherrypy-users/ + # browse_frm/thread/bbfe5eb39c904fe0 + s.settimeout(1.0) + s.connect((host, port)) + s.close() + except socket.error: + if s: + s.close() + if hasattr(sock, "close"): + sock.close() + self.socket = None + + self.requests.stop(self.shutdown_timeout) + + +class Gateway(object): + + def __init__(self, req): + self.req = req + + def respond(self): + raise NotImplemented + + +# These may either be wsgiserver.SSLAdapter subclasses or the string names +# of such classes (in which case they will be lazily loaded). +ssl_adapters = { + 'builtin': 'cherrypy.wsgiserver.ssl_builtin.BuiltinSSLAdapter', + 'pyopenssl': 'cherrypy.wsgiserver.ssl_pyopenssl.pyOpenSSLAdapter', + } + +def get_ssl_adapter_class(name='pyopenssl'): + adapter = ssl_adapters[name.lower()] + if isinstance(adapter, basestring): + last_dot = adapter.rfind(".") + attr_name = adapter[last_dot + 1:] + mod_path = adapter[:last_dot] + + try: + mod = sys.modules[mod_path] + if mod is None: + raise KeyError() + except KeyError: + # The last [''] is important. + mod = __import__(mod_path, globals(), locals(), ['']) + + # Let an AttributeError propagate outward. + try: + adapter = getattr(mod, attr_name) + except AttributeError: + raise AttributeError("'%s' object has no attribute '%s'" + % (mod_path, attr_name)) + + return adapter + +# -------------------------------- WSGI Stuff -------------------------------- # + + +class CherryPyWSGIServer(HTTPServer): + + wsgi_version = (1, 1) + + def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, + max= -1, request_queue_size=5, timeout=10, shutdown_timeout=5): + self.requests = ThreadPool(self, min=numthreads or 1, max=max) + self.wsgi_app = wsgi_app + self.gateway = wsgi_gateways[self.wsgi_version] + + self.bind_addr = bind_addr + if not server_name: + server_name = socket.gethostname() + self.server_name = server_name + self.request_queue_size = request_queue_size + + self.timeout = timeout + self.shutdown_timeout = shutdown_timeout + + def _get_numthreads(self): + return self.requests.min + def _set_numthreads(self, value): + self.requests.min = value + numthreads = property(_get_numthreads, _set_numthreads) + + +class WSGIGateway(Gateway): + + def __init__(self, req): + self.req = req + self.started_response = False + self.env = self.get_environ() + + def get_environ(self): + """Return a new environ dict targeting the given wsgi.version""" + raise NotImplemented + + def respond(self): + response = self.req.server.wsgi_app(self.env, self.start_response) + try: + for chunk in response: + # "The start_response callable must not actually transmit + # the response headers. Instead, it must store them for the + # server or gateway to transmit only after the first + # iteration of the application return value that yields + # a NON-EMPTY string, or upon the application's first + # invocation of the write() callable." (PEP 333) + if chunk: + if isinstance(chunk, unicode): + chunk = chunk.encode('ISO-8859-1') + self.write(chunk) + finally: + if hasattr(response, "close"): + response.close() + + def start_response(self, status, headers, exc_info=None): + """WSGI callable to begin the HTTP response.""" + # "The application may call start_response more than once, + # if and only if the exc_info argument is provided." + if self.started_response and not exc_info: + raise AssertionError("WSGI start_response called a second " + "time with no exc_info.") + self.started_response = True + + # "if exc_info is provided, and the HTTP headers have already been + # sent, start_response must raise an error, and should raise the + # exc_info tuple." + if self.req.sent_headers: + try: + raise exc_info[0], exc_info[1], exc_info[2] + finally: + exc_info = None + + self.req.status = status + for k, v in headers: + if not isinstance(k, str): + raise TypeError("WSGI response header key %r is not a byte string." % k) + if not isinstance(v, str): + raise TypeError("WSGI response header value %r is not a byte string." % v) + self.req.outheaders.extend(headers) + + return self.write + + def write(self, chunk): + """WSGI callable to write unbuffered data to the client. + + This method is also used internally by start_response (to write + data from the iterable returned by the WSGI application). + """ + if not self.started_response: + raise AssertionError("WSGI write called before start_response.") + + if not self.req.sent_headers: + self.req.sent_headers = True + self.req.send_headers() + + self.req.write(chunk) + + +class WSGIGateway_10(WSGIGateway): + + def get_environ(self): + """Return a new environ dict targeting the given wsgi.version""" + req = self.req + env = { + # set a non-standard environ entry so the WSGI app can know what + # the *real* server protocol is (and what features to support). + # See http://www.faqs.org/rfcs/rfc2145.html. + 'ACTUAL_SERVER_PROTOCOL': req.server.protocol, + 'PATH_INFO': req.path, + 'QUERY_STRING': req.qs, + 'REMOTE_ADDR': req.conn.remote_addr or '', + 'REMOTE_PORT': str(req.conn.remote_port or ''), + 'REQUEST_METHOD': req.method, + 'REQUEST_URI': req.uri, + 'SCRIPT_NAME': '', + 'SERVER_NAME': req.server.server_name, + # Bah. "SERVER_PROTOCOL" is actually the REQUEST protocol. + 'SERVER_PROTOCOL': req.request_protocol, + 'wsgi.errors': sys.stderr, + 'wsgi.input': req.rfile, + 'wsgi.multiprocess': False, + 'wsgi.multithread': True, + 'wsgi.run_once': False, + 'wsgi.url_scheme': req.scheme, + 'wsgi.version': (1, 0), + } + + if isinstance(req.server.bind_addr, basestring): + # AF_UNIX. This isn't really allowed by WSGI, which doesn't + # address unix domain sockets. But it's better than nothing. + env["SERVER_PORT"] = "" + else: + env["SERVER_PORT"] = str(req.server.bind_addr[1]) + + # CONTENT_TYPE/CONTENT_LENGTH + for k, v in req.inheaders.iteritems(): + env["HTTP_" + k.upper().replace("-", "_")] = v + ct = env.pop("HTTP_CONTENT_TYPE", None) + if ct is not None: + env["CONTENT_TYPE"] = ct + cl = env.pop("HTTP_CONTENT_LENGTH", None) + if cl is not None: + env["CONTENT_LENGTH"] = cl + + if req.conn.ssl_env: + env.update(req.conn.ssl_env) + + return env + + +class WSGIGateway_11(WSGIGateway_10): + + def get_environ(self): + env = WSGIGateway_10.get_environ(self) + env['wsgi.version'] = (1, 1) + return env + + +class WSGIGateway_u0(WSGIGateway_10): + + def get_environ(self): + """Return a new environ dict targeting the given wsgi.version""" + req = self.req + env_10 = WSGIGateway_10.get_environ(self) + env = dict([(k.decode('ISO-8859-1'), v) for k, v in env_10.iteritems()]) + env[u'wsgi.version'] = ('u', 0) + + # Request-URI + env.setdefault(u'wsgi.url_encoding', u'utf-8') + try: + for key in [u"PATH_INFO", u"SCRIPT_NAME", u"QUERY_STRING"]: + env[key] = env_10[str(key)].decode(env[u'wsgi.url_encoding']) + except UnicodeDecodeError: + # Fall back to latin 1 so apps can transcode if needed. + env[u'wsgi.url_encoding'] = u'ISO-8859-1' + for key in [u"PATH_INFO", u"SCRIPT_NAME", u"QUERY_STRING"]: + env[key] = env_10[str(key)].decode(env[u'wsgi.url_encoding']) + + for k, v in sorted(env.items()): + if isinstance(v, str) and k not in ('REQUEST_URI', 'wsgi.input'): + env[k] = v.decode('ISO-8859-1') + + return env + +wsgi_gateways = { + (1, 0): WSGIGateway_10, + (1, 1): WSGIGateway_11, + ('u', 0): WSGIGateway_u0, +} + +class WSGIPathInfoDispatcher(object): + """A WSGI dispatcher for dispatch based on the PATH_INFO. + + apps: a dict or list of (path_prefix, app) pairs. + """ + + def __init__(self, apps): + try: + apps = apps.items() + except AttributeError: + pass + + # Sort the apps by len(path), descending + apps.sort(cmp=lambda x, y: cmp(len(x[0]), len(y[0]))) + apps.reverse() + + # The path_prefix strings must start, but not end, with a slash. + # Use "" instead of "/". + self.apps = [(p.rstrip("/"), a) for p, a in apps] + + def __call__(self, environ, start_response): + path = environ["PATH_INFO"] or "/" + for p, app in self.apps: + # The apps list should be sorted by length, descending. + if path.startswith(p + "/") or path == p: + environ = environ.copy() + environ["SCRIPT_NAME"] = environ["SCRIPT_NAME"] + p + environ["PATH_INFO"] = path[len(p):] + return app(environ, start_response) + + start_response('404 Not Found', [('Content-Type', 'text/plain'), + ('Content-Length', '0')]) + return [''] diff --git a/cherrypy/wsgiserver/ssl_builtin.py b/cherrypy/wsgiserver/ssl_builtin.py new file mode 100644 index 00000000..0f6f8bae --- /dev/null +++ b/cherrypy/wsgiserver/ssl_builtin.py @@ -0,0 +1,69 @@ +"""A library for integrating pyOpenSSL with CherryPy. + +The ssl module must be importable for SSL functionality. + +To use this module, set CherryPyWSGIServer.ssl_adapter to an instance of +BuiltinSSLAdapter. + + ssl_adapter.certificate: the filename of the server SSL certificate. + ssl_adapter.private_key: the filename of the server's private key file. +""" + +try: + import ssl +except ImportError: + ssl = None + +from cherrypy import wsgiserver + + +class BuiltinSSLAdapter(wsgiserver.SSLAdapter): + """A wrapper for integrating Python's builtin ssl module with CherryPy.""" + + def __init__(self, certificate, private_key, certificate_chain=None): + if ssl is None: + raise ImportError("You must install the ssl module to use HTTPS.") + self.certificate = certificate + self.private_key = private_key + self.certificate_chain = certificate_chain + + def bind(self, sock): + """Wrap and return the given socket.""" + return sock + + def wrap(self, sock): + """Wrap and return the given socket, plus WSGI environ entries.""" + try: + s = ssl.wrap_socket(sock, do_handshake_on_connect=True, + server_side=True, certfile=self.certificate, + keyfile=self.private_key, ssl_version=ssl.PROTOCOL_SSLv23) + except ssl.SSLError, e: + if e.errno == ssl.SSL_ERROR_EOF: + # This is almost certainly due to the cherrypy engine + # 'pinging' the socket to assert it's connectable; + # the 'ping' isn't SSL. + return None, {} + elif e.errno == ssl.SSL_ERROR_SSL: + if e.args[1].endswith('http request'): + # The client is speaking HTTP to an HTTPS server. + raise wsgiserver.NoSSLError + raise + return s, self.get_environ(s) + + # TODO: fill this out more with mod ssl env + def get_environ(self, sock): + """Create WSGI environ entries to be merged into each request.""" + cipher = sock.cipher() + ssl_environ = { + "wsgi.url_scheme": "https", + "HTTPS": "on", + 'SSL_PROTOCOL': cipher[1], + 'SSL_CIPHER': cipher[0] +## SSL_VERSION_INTERFACE string The mod_ssl program version +## SSL_VERSION_LIBRARY string The OpenSSL program version + } + return ssl_environ + + def makefile(self, sock, mode='r', bufsize= -1): + return wsgiserver.CP_fileobject(sock, mode, bufsize) + diff --git a/cherrypy/wsgiserver/ssl_pyopenssl.py b/cherrypy/wsgiserver/ssl_pyopenssl.py new file mode 100644 index 00000000..d06e7100 --- /dev/null +++ b/cherrypy/wsgiserver/ssl_pyopenssl.py @@ -0,0 +1,241 @@ +"""A library for integrating pyOpenSSL with CherryPy. + +The OpenSSL module must be importable for SSL functionality. +You can obtain it from http://pyopenssl.sourceforge.net/ + +To use this module, set CherryPyWSGIServer.ssl_adapter to an instance of +SSLAdapter. There are two ways to use SSL: + +Method One: + ssl_adapter.context: an instance of SSL.Context. + + If this is not None, it is assumed to be an SSL.Context instance, + and will be passed to SSL.Connection on bind(). The developer is + responsible for forming a valid Context object. This approach is + to be preferred for more flexibility, e.g. if the cert and key are + streams instead of files, or need decryption, or SSL.SSLv3_METHOD + is desired instead of the default SSL.SSLv23_METHOD, etc. Consult + the pyOpenSSL documentation for complete options. + +Method Two (shortcut): + ssl_adapter.certificate: the filename of the server SSL certificate. + ssl_adapter.private_key: the filename of the server's private key file. + + Both are None by default. If ssl_adapter.context is None, but .private_key + and .certificate are both given and valid, they will be read, and the + context will be automatically created from them. + + ssl_adapter.certificate_chain: (optional) the filename of CA's intermediate + certificate bundle. This is needed for cheaper "chained root" SSL + certificates, and should be left as None if not required. +""" + +import socket +import threading +import time + +from cherrypy import wsgiserver + +try: + from OpenSSL import SSL + from OpenSSL import crypto +except ImportError: + SSL = None + + +class SSL_fileobject(wsgiserver.CP_fileobject): + """SSL file object attached to a socket object.""" + + ssl_timeout = 3 + ssl_retry = .01 + + def _safe_call(self, is_reader, call, *args, **kwargs): + """Wrap the given call with SSL error-trapping. + + is_reader: if False EOF errors will be raised. If True, EOF errors + will return "" (to emulate normal sockets). + """ + start = time.time() + while True: + try: + return call(*args, **kwargs) + except SSL.WantReadError: + # Sleep and try again. This is dangerous, because it means + # the rest of the stack has no way of differentiating + # between a "new handshake" error and "client dropped". + # Note this isn't an endless loop: there's a timeout below. + time.sleep(self.ssl_retry) + except SSL.WantWriteError: + time.sleep(self.ssl_retry) + except SSL.SysCallError, e: + if is_reader and e.args == (-1, 'Unexpected EOF'): + return "" + + errnum = e.args[0] + if is_reader and errnum in wsgiserver.socket_errors_to_ignore: + return "" + raise socket.error(errnum) + except SSL.Error, e: + if is_reader and e.args == (-1, 'Unexpected EOF'): + return "" + + thirdarg = None + try: + thirdarg = e.args[0][0][2] + except IndexError: + pass + + if thirdarg == 'http request': + # The client is talking HTTP to an HTTPS server. + raise wsgiserver.NoSSLError() + + raise wsgiserver.FatalSSLAlert(*e.args) + except: + raise + + if time.time() - start > self.ssl_timeout: + raise socket.timeout("timed out") + + def recv(self, *args, **kwargs): + buf = [] + r = super(SSL_fileobject, self).recv + while True: + data = self._safe_call(True, r, *args, **kwargs) + buf.append(data) + p = self._sock.pending() + if not p: + return "".join(buf) + + def sendall(self, *args, **kwargs): + return self._safe_call(False, super(SSL_fileobject, self).sendall, + *args, **kwargs) + + def send(self, *args, **kwargs): + return self._safe_call(False, super(SSL_fileobject, self).send, + *args, **kwargs) + + +class SSLConnection: + """A thread-safe wrapper for an SSL.Connection. + + *args: the arguments to create the wrapped SSL.Connection(*args). + """ + + def __init__(self, *args): + self._ssl_conn = SSL.Connection(*args) + self._lock = threading.RLock() + + for f in ('get_context', 'pending', 'send', 'write', 'recv', 'read', + 'renegotiate', 'bind', 'listen', 'connect', 'accept', + 'setblocking', 'fileno', 'close', 'get_cipher_list', + 'getpeername', 'getsockname', 'getsockopt', 'setsockopt', + 'makefile', 'get_app_data', 'set_app_data', 'state_string', + 'sock_shutdown', 'get_peer_certificate', 'want_read', + 'want_write', 'set_connect_state', 'set_accept_state', + 'connect_ex', 'sendall', 'settimeout', 'gettimeout'): + exec("""def %s(self, *args): + self._lock.acquire() + try: + return self._ssl_conn.%s(*args) + finally: + self._lock.release() +""" % (f, f)) + + def shutdown(self, *args): + self._lock.acquire() + try: + # pyOpenSSL.socket.shutdown takes no args + return self._ssl_conn.shutdown() + finally: + self._lock.release() + + +class pyOpenSSLAdapter(wsgiserver.SSLAdapter): + """A wrapper for integrating pyOpenSSL with CherryPy.""" + + def __init__(self, certificate, private_key, certificate_chain=None): + if SSL is None: + raise ImportError("You must install pyOpenSSL to use HTTPS.") + + self.context = None + self.certificate = certificate + self.private_key = private_key + self.certificate_chain = certificate_chain + self._environ = None + + def bind(self, sock): + """Wrap and return the given socket.""" + if self.context is None: + self.context = self.get_context() + conn = SSLConnection(self.context, sock) + self._environ = self.get_environ() + return conn + + def wrap(self, sock): + """Wrap and return the given socket, plus WSGI environ entries.""" + return sock, self._environ.copy() + + def get_context(self): + """Return an SSL.Context from self attributes.""" + # See http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/442473 + c = SSL.Context(SSL.SSLv23_METHOD) + c.use_privatekey_file(self.private_key) + if self.certificate_chain: + c.load_verify_locations(self.certificate_chain) + c.use_certificate_file(self.certificate) + return c + + def get_environ(self): + """Return WSGI environ entries to be merged into each request.""" + ssl_environ = { + "HTTPS": "on", + # pyOpenSSL doesn't provide access to any of these AFAICT +## 'SSL_PROTOCOL': 'SSLv2', +## SSL_CIPHER string The cipher specification name +## SSL_VERSION_INTERFACE string The mod_ssl program version +## SSL_VERSION_LIBRARY string The OpenSSL program version + } + + if self.certificate: + # Server certificate attributes + cert = open(self.certificate, 'rb').read() + cert = crypto.load_certificate(crypto.FILETYPE_PEM, cert) + ssl_environ.update({ + 'SSL_SERVER_M_VERSION': cert.get_version(), + 'SSL_SERVER_M_SERIAL': cert.get_serial_number(), +## 'SSL_SERVER_V_START': Validity of server's certificate (start time), +## 'SSL_SERVER_V_END': Validity of server's certificate (end time), + }) + + for prefix, dn in [("I", cert.get_issuer()), + ("S", cert.get_subject())]: + # X509Name objects don't seem to have a way to get the + # complete DN string. Use str() and slice it instead, + # because str(dn) == "" + dnstr = str(dn)[18:-2] + + wsgikey = 'SSL_SERVER_%s_DN' % prefix + ssl_environ[wsgikey] = dnstr + + # The DN should be of the form: /k1=v1/k2=v2, but we must allow + # for any value to contain slashes itself (in a URL). + while dnstr: + pos = dnstr.rfind("=") + dnstr, value = dnstr[:pos], dnstr[pos + 1:] + pos = dnstr.rfind("/") + dnstr, key = dnstr[:pos], dnstr[pos + 1:] + if key and value: + wsgikey = 'SSL_SERVER_%s_DN_%s' % (prefix, key) + ssl_environ[wsgikey] = value + + return ssl_environ + + def makefile(self, sock, mode='r', bufsize= -1): + if SSL and isinstance(sock, SSL.ConnectionType): + timeout = sock.gettimeout() + f = SSL_fileobject(sock, mode, bufsize) + f.ssl_timeout = timeout + return f + else: + return wsgiserver.CP_fileobject(sock, mode, bufsize) + diff --git a/contributing.md b/contributing.md new file mode 100644 index 00000000..24b2ecd4 --- /dev/null +++ b/contributing.md @@ -0,0 +1,77 @@ +# Contributing to SickBeard + +1. [Getting Involved](#getting-involved) +2. [How To Report Bugs](#how-to-report-bugs) +3. [Tips For Submitting Code](#tips-for-submitting-code) + + + +## Getting Involved + +There are a number of ways to get involved with the development of SickBeard. Even if you've never contributed code to an Open Source project before, we're always looking for help identifying bugs, cleaning up code, writing documentation and testing. + +The goal of this guide is to provide the best way to contribute to the official SickBeard repository. Please read through the full guide detailing [How to Report Bugs](#how-to-report-bugs). + +## Discussion + +### Forum and IRC + +The SickBeard development team frequently tracks posts on the [SickBeard Forum](http://www.sickbeard.com/forums/). If you have longer posts or questions please feel free to post them there. If you think you've found a bug please [file it in the bug tracker](#how-to-report-bugs). + +Additionally most of the SickBeard development team can be found in the [#sickbeard](http://webchat.freenode.net/?channels=sickbeard) IRC channel on irc.freenode.net. + + +## How to Report Bugs + +### Make sure it is a SickBeard bug + +Many bugs reported are actually issues with the user mis-understanding of how something works (there are a bit of moving parts to an ideal setup) and most of the time can be fixed by just changing some settings to fit the users needs. + +If you are new to SickBeard, it is usually a much better idea to ask for help first in the [Using SickBeard Forum](http://www.sickbeard.com/forums/) or the [SickBeard IRC channel](http://webchat.freenode.net/?channels=sickbeard). You will get much quicker support, and you will help avoid tying up the SickBeard team with invalid bug reports. + +[SickBeard Issue Tracker](http://code.google.com/p/sickbeard/issues/list) + + +### Try the latest version of SickBeard + +Bugs in old versions of SickBeard may have already been fixed. In order to avoid reporting known issues, make sure you are always testing against the latest build/source. Also, we put new code in the `development` branch first before pushing down to the `master` branch (which is what the binary builds are built off of). + + +## Tips For Submitting Code + + +### Code + +**NEVER write your patches to the master branch** - it gets messy (I say this from experience!) + +**ALWAYS USE A "TOPIC" BRANCH!** Personally I like the `branch-feature_name` format that way its easy to identify the branch and feature at a glance. Also please make note of any forum post / google code issue number in the pull commit so we know what you are solving (it helps with cleaning up the related items later). + + +Please follow these guidelines before reporting a bug: + +1. **Update to the latest version** — Check if you can reproduce the issue with the latest version from the `development` branch. + +2. **Use the SickBeard Forums search** — check if the issue has already been reported. If it has been, please comment on the existing issue. + +3. **Provide a means to reproduce the problem** — Please provide as much details as possible, e.g. SickBeard log files (obfuscate apikey/passwords), browser and operating system versions, how you started SickBeard, and of course the steps to reproduce the problem. + + +### Feature requests + +Please follow the bug guidelines above for feature requests, i.e. update to the latest version and search for existing issues before posting a new request. + +### Pull requests + +[Pull requests](https://help.github.com/articles/using-pull-requests) are welcome and the preferred way of accepting code contributions. + +Please follow these guidelines before sending a pull request: + +1. Update your fork to the latest upstream version. + +2. Use the `development` branch to base your code off of. + +3. Follow the coding conventions of the original repository. Do not change line endings of the existing file, as this will rewrite the file and loses history. + +4. Keep your commits as autonomous as possible, i.e. create a new commit for every single bug fix or feature added. + +5. Always add meaningful commit messages. We should not have to guess at what your code is suppose to do. diff --git a/googlecode_upload.py b/googlecode_upload.py new file mode 100644 index 00000000..1b934925 --- /dev/null +++ b/googlecode_upload.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python2 +# +# Copyright 2006, 2007 Google Inc. All Rights Reserved. +# Author: danderson@google.com (David Anderson) +# +# Script for uploading files to a Google Code project. +# +# This is intended to be both a useful script for people who want to +# streamline project uploads and a reference implementation for +# uploading files to Google Code projects. +# +# To upload a file to Google Code, you need to provide a path to the +# file on your local machine, a small summary of what the file is, a +# project name, and a valid account that is a member or owner of that +# project. You can optionally provide a list of labels that apply to +# the file. The file will be uploaded under the same name that it has +# in your local filesystem (that is, the "basename" or last path +# component). Run the script with '--help' to get the exact syntax +# and available options. +# +# Note that the upload script requests that you enter your +# googlecode.com password. This is NOT your Gmail account password! +# This is the password you use on googlecode.com for committing to +# Subversion and uploading files. You can find your password by going +# to http://code.google.com/hosting/settings when logged in with your +# Gmail account. If you have already committed to your project's +# Subversion repository, the script will automatically retrieve your +# credentials from there (unless disabled, see the output of '--help' +# for details). +# +# If you are looking at this script as a reference for implementing +# your own Google Code file uploader, then you should take a look at +# the upload() function, which is the meat of the uploader. You +# basically need to build a multipart/form-data POST request with the +# right fields and send it to https://PROJECT.googlecode.com/files . +# Authenticate the request using HTTP Basic authentication, as is +# shown below. +# +# Licensed under the terms of the Apache Software License 2.0: +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Questions, comments, feature requests and patches are most welcome. +# Please direct all of these to the Google Code users group: +# http://groups.google.com/group/google-code-hosting + +"""Google Code file uploader script. +""" + +__author__ = 'danderson@google.com (David Anderson)' + +import httplib +import os.path +import optparse +import getpass +import base64 +import sys + + +def upload(file, project_name, user_name, password, summary, labels=None): + """Upload a file to a Google Code project's file server. + + Args: + file: The local path to the file. + project_name: The name of your project on Google Code. + user_name: Your Google account name. + password: The googlecode.com password for your account. + Note that this is NOT your global Google Account password! + summary: A small description for the file. + labels: an optional list of label strings with which to tag the file. + + Returns: a tuple: + http_status: 201 if the upload succeeded, something else if an + error occured. + http_reason: The human-readable string associated with http_status + file_url: If the upload succeeded, the URL of the file on Google + Code, None otherwise. + """ + # The login is the user part of user@gmail.com. If the login provided + # is in the full user@domain form, strip it down. + if user_name.endswith('@gmail.com'): + user_name = user_name[:user_name.index('@gmail.com')] + + form_fields = [('summary', summary)] + if labels is not None: + form_fields.extend([('label', l.strip()) for l in labels]) + + content_type, body = encode_upload_request(form_fields, file) + + upload_host = '%s.googlecode.com' % project_name + upload_uri = '/files' + auth_token = base64.b64encode('%s:%s'% (user_name, password)) + headers = { + 'Authorization': 'Basic %s' % auth_token, + 'User-Agent': 'Googlecode.com uploader v0.9.4', + 'Content-Type': content_type, + } + + server = httplib.HTTPSConnection(upload_host) + server.request('POST', upload_uri, body, headers) + resp = server.getresponse() + server.close() + + if resp.status == 201: + location = resp.getheader('Location', None) + else: + location = None + return resp.status, resp.reason, location + + +def encode_upload_request(fields, file_path): + """Encode the given fields and file into a multipart form body. + + fields is a sequence of (name, value) pairs. file is the path of + the file to upload. The file will be uploaded to Google Code with + the same file name. + + Returns: (content_type, body) ready for httplib.HTTP instance + """ + BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla' + CRLF = '\r\n' + + body = [] + + # Add the metadata about the upload first + for key, value in fields: + body.extend( + ['--' + BOUNDARY, + 'Content-Disposition: form-data; name="%s"' % key, + '', + value, + ]) + + # Now add the file itself + file_name = os.path.basename(file_path) + f = open(file_path, 'rb') + file_content = f.read() + f.close() + + body.extend( + ['--' + BOUNDARY, + 'Content-Disposition: form-data; name="filename"; filename="%s"' + % file_name, + # The upload server determines the mime-type, no need to set it. + 'Content-Type: application/octet-stream', + '', + file_content, + ]) + + # Finalize the form body + body.extend(['--' + BOUNDARY + '--', '']) + + return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body) + + +def upload_find_auth(file_path, project_name, summary, labels=None, + user_name=None, password=None, tries=3): + """Find credentials and upload a file to a Google Code project's file server. + + file_path, project_name, summary, and labels are passed as-is to upload. + + Args: + file_path: The local path to the file. + project_name: The name of your project on Google Code. + summary: A small description for the file. + labels: an optional list of label strings with which to tag the file. + config_dir: Path to Subversion configuration directory, 'none', or None. + user_name: Your Google account name. + tries: How many attempts to make. + """ + + while tries > 0: + if user_name is None: + # Read username if not specified or loaded from svn config, or on + # subsequent tries. + sys.stdout.write('Please enter your googlecode.com username: ') + sys.stdout.flush() + user_name = sys.stdin.readline().rstrip() + if password is None: + # Read password if not loaded from svn config, or on subsequent tries. + print 'Please enter your googlecode.com password.' + print '** Note that this is NOT your Gmail account password! **' + print 'It is the password you use to access Subversion repositories,' + print 'and can be found here: http://code.google.com/hosting/settings' + password = getpass.getpass() + + status, reason, url = upload(file_path, project_name, user_name, password, + summary, labels) + # Returns 403 Forbidden instead of 401 Unauthorized for bad + # credentials as of 2007-07-17. + if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]: + # Rest for another try. + user_name = password = None + tries = tries - 1 + else: + # We're done. + break + + return status, reason, url + + +def main(): + parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY ' + '-p PROJECT [options] FILE') + parser.add_option('-s', '--summary', dest='summary', + help='Short description of the file') + parser.add_option('-p', '--project', dest='project', + help='Google Code project name') + parser.add_option('-u', '--user', dest='user', + help='Your Google Code username') + parser.add_option('-w', '--password', dest='password', + help='Your Google Code password') + parser.add_option('-l', '--labels', dest='labels', + help='An optional list of comma-separated labels to attach ' + 'to the file') + + options, args = parser.parse_args() + + if not options.summary: + parser.error('File summary is missing.') + elif not options.project: + parser.error('Project name is missing.') + elif len(args) < 1: + parser.error('File to upload not provided.') + elif len(args) > 1: + parser.error('Only one file may be specified.') + + file_path = args[0] + + if options.labels: + labels = options.labels.split(',') + else: + labels = None + +def upload_file(file, project, summary, labels, username, password): + + status, reason, url = upload_find_auth(file, project, + summary, labels, + username, password) + if url: + print 'The file was uploaded successfully.' + print 'URL: %s' % url + return 0 + else: + print 'An error occurred. Your file was not uploaded.' + print 'Google Code upload server said: %s (%s)' % (reason, status) + return 1 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/gui/slick/css/browser.css b/gui/slick/css/browser.css new file mode 100644 index 00000000..42b6a387 --- /dev/null +++ b/gui/slick/css/browser.css @@ -0,0 +1,54 @@ +#fileBrowserDialog { + max-height: 480px; + overflow-y: auto; +} +#fileBrowserDialog ul { + margin: 0; + padding: 0; +} +#fileBrowserDialog ul li { + margin: 2px 0; + cursor: pointer; + list-style-type: none; +} +#fileBrowserDialog ul li a { + display: block; + padding: 4px 0; +} +#fileBrowserDialog ul li a:hover { + color: blue; + background: none; +} +#fileBrowserDialog ul li a span.ui-icon { + margin: 0 4px; + float: left; +} +/* +.browserDialog.busy .ui-dialog-buttonpane { + background: url("/images/loading.gif") 10px 50% no-repeat; +} +*/ + +/* jquery ui autocomplete overrides to make it look more like the old autocomplete */ +.ui-autocomplete { + max-height: 180px; + overflow-y: auto; + /* prevent horizontal scrollbar */ + overflow-x: hidden; + /* add padding to account for vertical scrollbar */ + padding-right: 20px; +} +* html .ui-autocomplete { + height: 180px; +} +.ui-menu .ui-menu-item { + background-color: #eeeeee; +} +.ui-menu .ui-menu-item-alternate{ + background-color: #ffffff; +} +.ui-menu a.ui-state-hover{ + background: none; + background-color: #0A246A; + color: #ffffff; +} diff --git a/gui/slick/css/comingEpisodes.css b/gui/slick/css/comingEpisodes.css new file mode 100644 index 00000000..4c747c8f --- /dev/null +++ b/gui/slick/css/comingEpisodes.css @@ -0,0 +1,222 @@ +.tvshowDiv { + display: block; + clear: both; + border-left: 1px solid #CCCCCC; + border-right: 1px solid #CCCCCC; + border-bottom: 1px solid #CCCCCC; + margin: auto; + padding: 0px; + text-align: left; + width: 750px; +} + +.tvshowDiv a, .tvshowDiv a:link, .tvshowDiv a:visited, .tvshowDiv a:hover { + text-decoration: none; + background: none; +} + +.tvshowTitle a { + color: #000000; + float: left; + padding-top: 3px; + line-height: 1.2em; + font-size: 1.1em; + text-shadow: -1px -1px 0 #FFF); +} + +.tvshowTitleIcons { + float: right; + padding: 3px 5px; +} + +.tvshowDiv .title { + font-weight: 900; + color: #333; +} +.imgWrapper { + background: url("../images/loading.gif") no-repeat scroll center center #FFFFFF; + border: 3px solid #FFFFFF; + box-shadow: 1px 1px 2px 0 #555555; + float: left; + height: 50px; + overflow: hidden; + text-indent: -3000px; + width: 50px; +} +.imgWrapper .posterThumb { + float: left; + min-height: 100%; + min-width: 100%; + width: 50px; + height: auto; + position: relative; + border: none; + vertical-align: middle; +} +.posterThumb { + -ms-interpolation-mode: bicubic; /* make scaling look nicer for ie */ + vertical-align: top; + height: auto; + width: 160px; + border-top: 1px solid #ccc; + border-right: 1px solid #ccc; +} +.bannerThumb { + -ms-interpolation-mode: bicubic; /* make scaling look nicer for ie */ + vertical-align: top; + height: auto; + width: 750px; + /* margin-bottom: 1px; */ +} + +.tvshowDiv th { + color: #000; + letter-spacing: 1px; + text-align: left; + background-color: #333333; +} + +.tvshowDiv th.nobg { + background: #efefef; + border-top: 1px solid #666; + text-align: center; +} + +.tvshowDiv td { + border-top: 1px solid #d2ebe8; + background: #fff; + padding: 5px 10px 5px 10px; + color: #000; +} + +.tvshowDiv td.next_episode { + width: 100%; + height: 90%; + border-top: 1px solid #ccc; + vertical-align: top; + background: #F5FAFA; + color: #000; +} + +h1.day { + font-weight: bold; + margin-top: 10px; + padding: 4px; + letter-spacing: 1px; + background-image: -moz-linear-gradient(#555555, #333333) !important; + background-image: linear-gradient(#555555, #333333) !important; + background-image: -webkit-linear-gradient(#555555, #333333) !important; + background-image: -o-linear-gradient(#555555, #333333) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + color: #fff; + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); + text-align: center; +} + +h1.network { + font-weight: bold; + padding: 4px; + letter-spacing: 1px; + background-image: -moz-linear-gradient(#555555, #333333) !important; + background-image: linear-gradient(#555555, #333333) !important; + background-image: -webkit-linear-gradient(#555555, #333333) !important; + background-image: -o-linear-gradient(#555555, #333333) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + color: #fff; + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); + text-align: center; +} + +.ep_listing { + width: auto; + border: 1px solid #CCCCCC; + margin-bottom: 10px; + /* margin: 10px; */ + /* overflow: hidden; */ + padding: 10px; +} + +.h2footer .listing_default, +.h2footer .listing_current, +.h2footer .listing_waiting, +.h2footer .listing_overdue, +.h2footer .listing_toofar { + padding: 2px 10px; + display: inline-block; + font-size: 13px; + font-weight: bold; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} + +.listing_default { + background-color: #F5F1E4; + color: #cec198; +} + +.listing_current { + background-color: #E2FFD8; + color: #AAD450; +} + +.listing_waiting { + background-color: #99ff99; +} + +.listing_overdue { + background-color: #FDEBF3; + color: #F49AC1; +} + +.listing_toofar { + background-color: #E9F7FB; + color: #90D5EC; +} + +.listing_unknown { + background-color: #ffdc89; +} + +tr.listing_default { + color: #000000; +} + +tr.listing_current { + color: #000000; +} + +tr.listing_waiting { + color: #000000; +} + +tr.listing_overdue { + color: #000000; +} + +tr.listing_toofar { + color: #000000; +} + +tr.listing_unknown { + color: #000000; +} + +span.pause { + color: #FF0000; + font-size: 12px; +} + +.ep_summaryTrigger { +/* float: left; + padding-top: 9px;*/ + margin-top: -1px; +} +.ep_summary { + margin-left: 5px; +/* padding-top: 5px; */ + font-style: italic; + line-height: 21px; +} \ No newline at end of file diff --git a/gui/slick/css/config.css b/gui/slick/css/config.css new file mode 100644 index 00000000..311bd757 --- /dev/null +++ b/gui/slick/css/config.css @@ -0,0 +1,195 @@ +#config{text-align:center;padding:0 0 0 0;font-size: 12px;} +#config /**{font-family:Verdana, sans-serif;}*/ +#config *{font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;} +#config a:hover {color: #005580 !important;/*text-decoration: underline;*/} +#config h3 a {text-decoration: none;font-size: 18px;} +#config h3 img {vertical-align: text-bottom; padding-right: 5px;} +#config ul{list-style-type:none;} +#config h3{font-size:1.5em;color:#000;} +#config h4{font-size:1em;color:#333;text-transform:uppercase;margin:0 0 .2em;line-height: 12px;margin-top: 2px;} +#config h5{font-size:1em;color:#000;margin:0 0 .2em;} +#config p{font-size:1.2em;line-height:1.3;} +#config .path{font-size:1em;color:#333;font-family:Verdana;} +#config .jumbo{font-size:15px !important;} +#config-content{display:block;width:100%;text-align:left;clear:both;background:#fff;margin:0 auto;padding:0 0 0;} +#config-components{width:auto;} +#config-components-border{float:left;width:auto;border-top:1px solid #999;padding:5px 0;} +#config .title-group{border-bottom:1px dotted #666;position:relative;padding:25px 15px 25px;} +#config .component-group{border-bottom:1px dotted #666;padding:15px 15px 25px;} +#config .component-group-desc{float:left;width:235px;} +#config .component-group-desc h3{font-size:1.5em;} +#config .component-group-desc p{width:85%;font-size:1.0em;color:#666;margin:.8em 0;} +#config .component-group-desc p.note{width:90%;/*font-size:1.2em*/;color:#333;margin:.8em 0;} +#config .component-group-list{float:left;width:610px;margin-top:16px;} + +#config fieldset{border:0;outline:0;} +#config div.field-pair{margin:.9em 0 1.4em;} +#config div.field-pair input:not(.btn){float:left;margin-right:6px;margin-top:5px;padding-top:4px;padding-bottom:4px;padding-right:4px;padding-left:4px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-top-width: 1px; + border-left-width: 1px; + border-left-style: solid; + border-bottom-color: #CCCCCC; + border-right-color: #CCCCCC; + border-left-color: #CCCCCC; + border-right-style: solid; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-style: solid; + border-bottom-width: 1px; + border-right-width: 1px; + border-right-style: solid; + border-right-width-value: 1px; + border-top-color: #CCCCCC; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-style: solid; + border-top-width: 1px; +} +#config label.nocheck,#config div.providerDiv,#config div #customQuality{padding-left:20px;} +#config label span.component-title{font-size:13px;font-weight:700;float:left;width:175px;margin-right:10px;} +#config label span.component-desc{font-size:11px; margin-left:190px; display:block; font-size:11px;} +#config label.nocheck span.component-desc{margin-left:170px;} +#config div.field-pair select{font-size:12px;} +/* #config div.field-pair select{/*font-size:1.1em*//*;border:1px solid #d4d0c8;padding-top:4px;padding-bottom:4px;padding-right:4px;padding-left:4px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;} +#config div.field-pair select option{line-height:1.4;padding:0 10px; border-bottom: 1px dotted #D7D7D7;}*/ +#config-settings{float:right;width:200px;background:#fffae5;border-bottom:1px dotted #666;border-top:1px solid #999;margin-right:20px;padding:20px 0 30px;} +#config-settings .config-settings-group{border-bottom:1px dotted #999;padding-bottom:15px;margin:0 15px 15px;} +#config-settings .config-settings-group h2{margin-bottom:0;} +#config-settings .config-settings-group p{font-size:1.1em;color:#666;margin:.6em 0 1em;} +#config-settings .config-settings-group div.field-pair{margin:1.2em 0 .6em;} +#config-settings .config-settings-group input{float:left;} +.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;} +.clearfix{display:block;} +/* Hides from IE-mac \*/ +* html .clearfix{height:1%;} +/* End hide from IE-mac */ +#provider_order_list, #service_order_list{list-style-type:none;width:270px;margin:0;padding:0;} +#provider_order_list li, #service_order_list li{font-size:15px;font-weight:bold;height:1.3em;font-family:Verdana;margin:0 5px 5px;padding:6px;} +#provider_order_list input, #service_order_list input{margin:0px 2px;} +.providerDiv{display:none;padding-left:20px;}#config div.metadataDiv{display:none;} +#config div.metadataDiv{display:none;} +#config div.metadata_options{float:left;font-size:14px;font-family:Verdana;width:185px;color:#036;background:#F5F1E4;overflow:hidden;border-left:1px solid #404040;border-top:1px solid #404040;border-bottom:1px solid #d4d0c8;border-right:1px solid #d4d0c8;padding:7px;} +#config div.metadata_options label:hover{background-color:#9f9;} +#config div.metadata_options label{display:block;color:#036;line-height:1.5em;padding-left:4px;} +#config div.metadata_example{float:right;font-size:14px;font-family:Verdana;width:265px;color:#036;overflow:auto;margin-right:30px;padding:7px;} +#config div.metadata_example label{display:block;color:#000;line-height:1.56em;} +#config div.metadataDiv .disabled{color:#ccc;} +#config div #metadataLegend{font-size:14px;font-family:Verdana;font-weight:900;display:block;width:auto;text-align:center;padding-bottom:3px;} + +.infoTable {border-collapse: collapse;} +.infoTableHeader, .infoTableCell {padding: 5px;} +.infoTableHeader{font-weight:700;} +.infoTableSeperator { border-top: 1px dotted #666666; } + +#config div.testNotification {border: 1px dotted #CCCCCC; padding: 5px; margin-bottom: 10px; line-height:20px;} + +.config_message { + width: 100%; + text-align: center; + font-size: 1.3em; + background: #ffecac; +} + +[class^="icon16-"], [class*=" icon16-"] { + background-image: url("/images/glyphicons-config.png"); + background-position: -40px 0; + background-repeat: no-repeat; + display: inline-block; + height: 16px; + line-height: 16px; + vertical-align: text-top; + width: 16px; +} + +.icon16-github { + background-position: 0 0; +} +.icon16-mirc { + background-position: -20px 0; +} +.icon16-sb { + background-position: -40px 0; +} +.icon16-web { + background-position: -60px 0; +} +.icon16-win { + background-position: -80px 0; +} + +#config span.path { + background-color: #F5F1E4; + color: #6666FF; + padding-bottom: 3px; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; +} + +#config .tip_scale { +margin-left: -9px; +margin-top: -10px !important; +margin-right: 5px; +margin-bottom: -20px; +line-height: 18px; +font-size: 0.5 em !important; + +text-align: left; + +} + +#config .tip_scale label span.component-title{ +width: 85px !important; +font-size: 12px !important; +margin-top: 2px !important; + +} + +#config .tip_scale label span.component-desc { +margin-left: 90px !important; +} + +#config .tip_scale input[type="text"], #config .tip_scale input[type="password"], #config .tip_scale select{ +transform: scale(0.8) !important; +-ms-transform: scale(0.8) !important; +-webkit-transform: scale(0.8) !important; +margin-left: -35px !important; +margin-top: 3px !important; +} + + +/* ======================================================================= +config_postProcessing.tmpl +========================================================================== */ +#config div.example { + padding: 4px 10px 4px 10px; + margin-top: 2px; + background-color: #dfdede; +} +.Key { + width: 100%; + padding: 6px; + font-family: sans-serif; + font-size: 13px; + background-color: #f4f4f4; + border: 1px solid #ccc; + border-collapse: collapse; + border-spacing: 0; + line-height: 18px !important; + margin-left: 15px !important; +} +.Key th, .tableHeader { + padding: 3px 9px; + margin: 0; + color: #fff; + text-align: center; + background: none repeat scroll 0 0 #666; +} +.Key td { + padding: 1px 5px !important; +} +.Key tr { + border-bottom: 1px solid #ccc; +} +.Key tr.even { + background-color: #dfdede; +} \ No newline at end of file diff --git a/gui/slick/css/config.less b/gui/slick/css/config.less new file mode 100644 index 00000000..ed02b06f --- /dev/null +++ b/gui/slick/css/config.less @@ -0,0 +1,78 @@ +/* Variables */ +@base-font-face: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif; +@alt-font-face: "Trebuchet MS", Helvetica, Arial, sans-serif; +@base-font-size: 12px; +@text-color: #343434; +@swatch-blue: #4183C4; +@swatch-green: #BDE433; +@swatch-grey: #666666; +@link-color: #75ADD8; +@border-color: #CCCCCC; +@msg-bg: #FFF6A9; +@msg-bg-success: #D3FFD7; +@msg-bg-error: #FFD3D3; + +/* Mixins */ +.rounded(@radius: 5px) { + -moz-border-radius: @radius; + -webkit-border-radius: @radius; + border-radius: @radius; +} +.roundedTop(@radius: 5px) { + -moz-border-radius-topleft: @radius; + -moz-border-radius-topright: @radius; + -webkit-border-top-right-radius: @radius; + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; + border-top-right-radius: @radius; +} +.roundedLeftTop(@radius: 5px) { + -moz-border-radius-topleft: @radius; + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; +} +.roundedRightTop(@radius: 5px) { + -moz-border-radius-topright: @radius; + -webkit-border-top-right-radius: @radius; + border-top-right-radius: @radius; +} +.roundedBottom(@radius: 5px) { + -moz-border-radius-bottomleft: @radius; + -moz-border-radius-bottomright: @radius; + -webkit-border-bottom-right-radius: @radius; + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; +} +.roundedLeftBottom(@radius: 5px) { + -moz-border-radius-bottomleft: @radius; + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.roundedRightBottom(@radius: 5px) { + -moz-border-radius-bottomright: @radius; + -webkit-border-bottom-right-radius: @radius; + border-bottom-right-radius: @radius; +} +.shadow(@shadow: 0 17px 11px -1px #ced8d9) { + -moz-box-shadow: @shadow; + -webkit-box-shadow: @shadow; + -o-box-shadow: @shadow; + box-shadow: @shadow; +} +.gradient(@gradientFrom: #FFFFFF, @gradientTo: #EEEEEE){ + background-image: -moz-linear-gradient(@gradientFrom, @gradientTo) !important; + background-image: linear-gradient(@gradientFrom, @gradientTo) !important; + background-image: -webkit-linear-gradient(@gradientFrom, @gradientTo) !important; + background-image: -o-linear-gradient(@gradientFrom, @gradientTo) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=@gradientFrom, endColorstr=@gradientTo) !important; + -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=@gradientFrom, endColorstr=@gradientTo) !important; +} +.opacity(@opacity_percent:85) { + filter: ~"alpha(opacity=85)"; + -moz-opacity: @opacity_percent / 100 !important; + -khtml-opacity:@opacity_percent / 100 !important; + -o-opacity:@opacity_percent / 100 !important; + opacity:@opacity_percent / 100 !important; +} + diff --git a/gui/slick/css/default.css b/gui/slick/css/default.css new file mode 100644 index 00000000..9054d7d6 --- /dev/null +++ b/gui/slick/css/default.css @@ -0,0 +1,1865 @@ +/* Variables *//* Mixins */ +* { + outline: 0; + margin: 0; +} + +*:focus { + outline: none; +} + +input, textarea { + -moz-transition-delay: 0s, 0s; + -webkit-transition-delay: 0s, 0s; + -o-transition-delay: 0s, 0s; + -moz-transition-duration: 0.2s, 0.2s; + -webkit-transition-duration: 0.2s, 0.2s; + -o-transition-duration: 0.2s, 0.2s; + -moz-transition-property: border, box-shadow; + -webkit-transition-property: border, box-shadow; + -o-transition-property: border, box-shadow; + -moz-transition-timing-function: linear, linear; + -webkit-transition-timing-function: linear, linear; + -o-transition-timing-function: linear, linear; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset; +} +input:focus, textarea:focus { + border-bottom-color: rgba(0, 168, 236, 0.8); + border-left-color-ltr-source: physical; + border-left-color-rtl-source: physical; + border-left-color-value: rgba(0, 168, 236, 0.8); + border-right-color-ltr-source: physical; + border-right-color-rtl-source: physical; + border-right-color-value: rgba(0, 168, 236, 0.8); + border-top-color: rgba(0, 168, 236, 0.8); + border-right-color: rgba(0, 168, 236, 0.8); + border-left-color: rgba(0, 168, 236, 0.8); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset, 0 0 2px rgba(0, 168, 236, 1.0); + outline-color: -moz-use-text-color; + outline-style: none; + outline-width: 0; +} + +/*input:focus, select:focus, textarea:focus { + box-shadow: 0 0 3px 0 #0066FF; + z-index: 1; +}*/ + +input[type="checkbox"]:focus, input[type="checkbox"]:active, input[type="submit"]:focus, +input[type="submit"]:active,input[type="button"]:focus, input[type="button"]:active { + box-shadow: none; +} + +img { + border: 0; +/* vertical-align: middle; + vertical-align: sub;*/ + vertical-align: text-top; +} + +.imgLink img { + padding-bottom: 1px; + padding-left: 2px; + padding-right: 2px; +} + +.imgHomeWrapper { + background: url("../images/loading.gif") no-repeat scroll center center #FFFFFF; + border: 3px solid #FFFFFF; + box-shadow: 1px 1px 2px 0 #555555; + float: left; + height: 52px; + overflow: hidden; +} + +.imgHomeWrapperRounded{ + border-radius: 8px; +} + +.imgHomeWrapper .poster { + float: left; + width: 50px; + height: auto; + position: relative; + vertical-align: middle; +} + +.imgHomeWrapper .banner { + height: 52px; + overflow: hidden; + border-radius: 8px; + vertical-align: top; + height: auto; + width: 300px; + border-radius: 8px; +} + +html { + margin: 0; + padding: 0; +} +body { + text-rendering: optimizeLegibility; + background: none repeat scroll 0 0 #FFFFFF; + color: #343434; + font-family: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif; + margin: 0; + overflow-y: scroll; + padding: 0; + font-size: 14px; +} +form { + border: none; + display: inline; + margin: 0; + padding: 0; +} +a{ + color: #75add8; + -moz-text-decoration-line: none; + text-decoration: none; +} + +.update { + color: #339933; + text-decoration: blink; +} + +/* these are for inc_top.tmpl */ +#upgrade-notification { + position: fixed; + line-height: 0.5em; +/* color: #000; */ + font-size: 1em; + font-weight: bold; + height: 0px; + text-align: center; + width: 100%; + z-index: 100; + margin: 0; + padding: 0; +} +#upgrade-notification div { +/* background-image: -moz-linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: -webkit-linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: -o-linear-gradient(#fdf0d5, #fff9ee) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + border-bottom: 1px solid #af986b; */ + background-color: #C6B695; + border-bottom-color: #AF986B; + border-bottom-style: solid; + border-bottom-width: 1px; + padding: 7px 0; +} +#header-fix { + *margin-bottom: -31px; + /* IE fix */ + height: 21px; + padding: 0; +} +#header { + background-image: -moz-linear-gradient(#555555, #333333) !important; + background-image: linear-gradient(#555555, #333333) !important; + background-image: -webkit-linear-gradient(#555555, #333333) !important; + background-image: -o-linear-gradient(#555555, #333333) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + border-bottom: 1px solid #CACACA; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + height: 58px; + position: fixed; + width: 100%; + z-index: 999; +} +#header .wrapper { + margin: 0 auto; + position: relative; + width: 960px; +} +#header a:hover { + background: none; +} + +#header .showInfo .checkboxControls { + margin: 0 auto; + position: relative; + width: 960px; +} + +#logo { + float: left; + position: relative; + top: 0px; + left: -5px; +} +#versiontext { + color: #FFFFFF; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; + position: relative; +/* text-transform: lowercase;*/ + top: 42px; + left: -5px +} + +.update { + color: #339933; + text-decoration: none; +} + +.navShows { + margin-top: -5px; + margin-bottom: 30px; +} +.tvshowImg { + background: url("../images/loading.gif") no-repeat scroll center center #ffffff; + border: 5px solid #FFFFFF; + -moz-box-shadow: 1px 1px 2px 0 #555555; + -webkit-box-shadow: 1px 1px 2px 0 #555555; + -o-box-shadow: 1px 1px 2px 0 #555555; + box-shadow: 1px 1px 2px 0 #555555; + float: left; + height: auto; + margin-bottom: 30px; + margin-right: 25px; + overflow: hidden; + text-indent: -3000px; + width: 175px; +} +.tvshowImg img { + float: left; + min-width: 100%; + position: relative; +} +/* --------------------------------------------- */ +table { + margin: 0; +} + +table .ep_name { + color: #000000; +} + + +table td a { + color: #555; +} +table td a:hover { + color: #343434; +} + +h1 { + text-align: left; + font-size: 21px; + line-height: 23px; + font-weight: 400; +} +h1.title { + padding-bottom: 10px; + margin-bottom: 12px; + font-weight: bold; + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + font-size: 38px; + line-height: 5px; + text-rendering: optimizelegibility; +} + +h1.header { + padding-bottom: 10px; + margin-top: 12px; + margin-bottom: 12px; + font-size: 30px; + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + font-weight: bold; +} +h1 a { + text-decoration: none; +} +h2 { + font-size: 18px; + font-weight: 700; +} +.h2footer { + margin: -35px 5px 6px 0px; +} +.h2footer select { + margin-top: -6px; + margin-bottom: -6px; +} +.separator { + font-size: 90%; + color: #999; +} + +div select { +/* font-size: 12px; !important*/ + border: 1px solid #d4d0c8; +} +div select{font-size:0.9em ;height:28px;border:1px solid #d4d0c8;padding-top:4px;padding-bottom:4px;padding-right:4px;padding-left:4px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;} + +div select[multiple], div select[size] { + height: auto; +} + +div select option { +/* line-height: 1.4; + padding: 0 10px; + border-bottom: 1px dotted #D7D7D7;*/ + font-size:13px; + padding-bottom: 2px; + padding-left: 8px; + padding-right: 8px; + padding-top: 2px; +} + +input:not(.btn){margin-right:6px;margin-top:5px;padding-top:4px;padding-bottom:4px;padding-right:4px;padding-left:4px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-top-width: 1px; + border-left-width: 1px; + border-left-style: solid; + border-bottom-color: #CCCCCC; + border-right-color: #CCCCCC; + border-left-color: #CCCCCC; + border-right-style: solid; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-style: solid; + border-bottom-width: 1px; + border-right-width: 1px; + border-right-style: solid; + border-right-width-value: 1px; + border-top-color: #CCCCCC; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-style: solid; + border-top-width: 1px; +} + +/* --------------- alignment ------------------- */ +.float-left { + float: left; +} +.float-right { + float: right; +} +.align-left { + text-align: left; +} +.align-right { + text-align: right; +} +.nowrap { + white-space: nowrap; +} +/* --------------------------------------------- */ +.footer { + clear: both; + width: 960px; + text-align: center; + padding-top: 5px; + padding-bottom: 5px; + margin: 20px auto; + border-top: 1px solid #eee; + line-height: 1.4em; + font-size: 11px; +} +.footer a { + color: #75add8; + text-decoration: none; +} +.footer ul li { + list-style: none; + float: left; + margin-left: 10px; +} +.footer ul li img { + margin-right: 1px; + position: relative; + top: -2px; + vertical-align: middle; +} +.sickbeardTable { + width: 100%; + margin-left: auto; + margin-right: auto; + text-align: left; + color: #343434; + background-color: #fff; + border-spacing: 0; +} +.sickbeardTable th, +.sickbeardTable td { + padding: 4px; + border-top: #fff 1px solid; + vertical-align: middle; +} + +#massUpdateTable.sickbeardTable th { + padding: 4px 0 !important; + border-top: #fff 1px solid; + vertical-align: middle; +} + +#massUpdateTable.sickbeardTable th { + padding: 4px 0 !important; + border-top: #fff 1px solid; + vertical-align: middle; +} + +#massUpdateTable.tablesorter td { + padding: 8px 5px; +} + +#massUpdateTable.tablesorter td.tvShow a{ + font-size: 16px; +} + +.sickbeardTable th:first-child, +.sickbeardTable td:first-child { + border-left: none; +} +.sickbeardTable th { + border-collapse: collapse; + background-image: -moz-linear-gradient(#555555, #333333) !important; + background-image: linear-gradient(#555555, #333333) !important; + background-image: -webkit-linear-gradient(#555555, #333333) !important; + background-image: -o-linear-gradient(#555555, #333333) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + color: #fff; + text-shadow: -1px -1px 0 rgba(0, 0, 0, 0.3); + text-align: center; +} +.sickbeardTable tfoot a { + text-decoration: none; + color: #bde433; + float: left; +} +.sickbeardTable td { + font-size: 14px; +} + +.sickbeardTable td.title { + font-size: 14px; + line-height: normal; +} + +.sickbeardTable td.filename { +width: 30%; + +} + +.sickbeardTable td.subtitles_column { + vertical-align: middle; +/* width: 10%; */ +} + +.sickbeardTable td.subtitles_column img { + padding-right: 2px; + padding-top: 2px; +} + + +.sickbeardTable td.status_column { + font-weight: bold; + line-height: 20px; + text-align: center; + width: 13%; + color: #555555; +} + +.sickbeardTable td.search img { + padding-right: 2px; +} + +.sickbeardTable td small { + font-size: 11px; + font-style: italic; + line-height: normal; +} +.row { + clear: left; +} + +.plotInfo { + cursor: help; + float: right; + font-weight: 700; + position: relative; + padding-left: 2px; +} + +.sickbeardTable td.plotInfo { + align: center; +} + +#actions .selectAll { + margin-right: 10px; + border-right: 1px solid #eee; + padding-right: 10px; +} +#tooltip { + display: none; + z-index: 3343434; + border: 1px solid #111; + background-color: #eee; + padding: 5px; + margin-right: 10px; +} +.progressbarText { + text-shadow: 0 0 0.1em #fff; + position: absolute; + top: 0; + font-size: 12px; + color: #555555; + font-weight: bold; + width: 100%; + height: 100%; + overflow: visible; + text-align: center; + vertical-align: middle; +} +.ui-progressbar .ui-widget-header { + background-image: -moz-linear-gradient(#a3e532, #90cc2a) !important; + background-image: linear-gradient(#a3e532, #90cc2a) !important; + background-image: -webkit-linear-gradient(#a3e532, #90cc2a) !important; + background-image: -o-linear-gradient(#a3e532, #90cc2a) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} +tr.seasonheader { + background-color: #FFFFFF; + padding-bottom: 5px; + padding-top: 10px; + text-align: left; +/* white-space: nowrap;*/ +} +tr.seasonheader td { + padding-top: 20px; + padding-bottom: 10px; +} +tr.seasonheader h2 { + display: inline; + font-size: 22px; + line-height: 20px; + letter-spacing: 1px; + margin: 0; + color: #343434; +} +tr.seasonheader a:not(.btn) { + text-decoration: none; +} + +tr.seasonheader a:hover:not(.btn) { + background-color: #fff; + color: #343434; +} +#checkboxControls label { + white-space: nowrap; +} +tr.unaired, +span.unaired { + background-color: #F5F1E4; + padding: 5px; + font-size: 13px; + color: #cec198; + font-weight: bold; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} +tr.unaired b, +span.unaired b { + color: #343434; +} +tr.skipped, +span.skipped { + background-color: #E9F7FB; + color: #90D5EC; + font-weight: bold; + font-size: 13px; + padding: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} +tr.skipped b, +span.skipped b { + color: #343434; +} +tr.good, +span.good { + background-color: #E2FFD8; + color: #AAD450; + padding: 5px; + font-size: 13px; + font-weight: bold; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} +tr.good b, +span.good b { + color: #343434; +} +tr.qual, +span.qual { + background-color: #FDF0D5; + padding: 5px; + font-size: 13px; + font-weight: bold; + color: #F7B42C; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} + +tr.qual b, +span.qual b { + color: #343434; +} +tr.wanted, +span.wanted { + background-color: #FDEBF3; + padding: 5px; + font-size: 13px; + font-weight: bold; + color: #F49AC1; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} + +tr.wanted b, +span.wanted b { + color: #343434; +} + +tr.snatched, +span.snatched { + background-color: #efefef; + padding: 5px; + font-size: 13px; + font-weight: bold; + color: #F49AC1; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; +} + +tr.snatched b, +span.snatched b { + color: #343434; +} + +tr.wanted, +tr.qual, +tr.good, +tr.skipped, +tr.unaired, +tr.snatched { + font-size: 14px; + font-weight: normal; + color: #343434; + height: 35px; +} +.showInfo { + width: 745px; + float: right; + padding-top: 10px; +} + +span .headerInfo { + color: #666666; +} + +div .seasonList { + padding-top: 12px; + padding-right: 10px; +} + +div#summary { + background-color: #f9f9f9; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 10px; + padding: 5px 10px; + border: 1px solid #ddd; + margin: 3px 0 10px 0; +} +div#summary .infoTable { + width: 90%; +} +div#summary tr { + line-height: 17px; +} +div#summary tr td { + font-size: 14px; + line-height: 25px; +} +#MainMenu { + float: right; + height: 58px; + margin: 0; + padding: 0 0 0 10px; +} +#SubMenu { + float: right; + margin-top: -35px; + position: relative; + z-index: 99; +} +#SubMenu a { + font-size: 12px; + text-decoration: none; +} +#SubMenu span b { + margin-left: 20px; +} +#donate { + line-height: 1em; + float: right; +/* display: none;*/ +} +#donate a, +#donate a:hover { + border: 0 ; + padding: 4px 15px 4px; +} + +#contentWrapper { + background: none; +} +#content { + line-height: 24px; + margin: 0 auto; + padding: 105px 0 0; + width: 960px; +} +.showLegend { + font-weight: 700; + padding-right: 6px; + padding-bottom: 1px; +} +/* for the add new/existing show */ +.alt { + background-color: #efefef; +} + +#tabs div.field-pair, +.stepDiv div.field-pair { + padding: 0.75em 0; +} + +#tabs div.field-pair input, +.stepDiv div.field-pair input { + float: left; + margin-top: 5px; + margin-left: 3px; +} + +#tabs label.nocheck, +#tabs div.providerDiv, +#tabs div #customQuality, +.stepDiv label.nocheck, +.stepDiv div.providerDiv, +.stepDiv div #customQuality { + padding-left: 23px; +} + +#tabs label span.component-title, +.stepDiv label span.component-title { +/* font-size: 1.1em; */ + font-weight: 700; + float: left; + width: 165px; + padding-left: 6px; + margin-right: 10px; +} + +#tabs label span.component-desc, +.stepDiv label span.component-desc { + font-size: .9em; + float: left; +} + +#tabs div.field-pair select, +.stepDiv div.field-pair select { + font-size: 12px; + border: 1px solid #d4d0c8; +} + +#tabs div.field-pair select option, +.stepDiv div.field-pair select option { + line-height: 1.4; + padding: 0 10px; +/* border-bottom: 1px dotted #D7D7D7;*/ +} +ul#rootDirStaticList { + width: 90%; + text-align: left; + margin-left: auto; + margin-right: auto; + padding-left: 0; +} +ul#rootDirStaticList li { + list-style: none outside none; + margin: 2px; + padding: 4px 5px 4px 5px; + cursor: pointer; +} + +/*#rootDirs, #rootDirsControls { + width: 50%; + min-width: 400px; + height:auto !important; +}*/ + +#episodeDir, #newRootDir { + margin-right: 6px; + } + +#displayText { + background-color: #efefef; + padding: 8px; + border: 1px solid #DFDEDE; + font-size: 1.1em; + overflow: hidden; +} +div#addShowPortal { + margin: 50px auto; + width: 100%; +} +div#addShowPortal button { + float: left; + margin-left: 20px; + padding: 10px; + width: 47%; +} +div#addShowPortal button div.button img { + position: absolute; + display: block; + top: 35%; + padding-left: 0.4em; + text-align: center; +} +div#addShowPortal button .buttontext { + position: relative; + display: block; + padding: 0.1em 0.4em 0.1em 4.4em; + text-align: left; +} + +td.tvShow a { + text-decoration: none; + font-size: 18px; + font-weight: bold; + display: block; + width: 100%; + height: 100%; +} + +.navShow { + display: inline; + cursor: pointer; + vertical-align: top; + position: relative; + top: 3px; + filter: alpha(opacity=85); + -moz-opacity: 0.5 !important; + -khtml-opacity: 0.5 !important; + -o-opacity: 0.5 !important; + opacity: 0.5 !important; +} +.navShow:hover { + filter: alpha(opacity=85); + -moz-opacity: 1 !important; + -khtml-opacity: 1 !important; + -o-opacity: 1 !important; + opacity: 1 !important; +} +/* for manage_massEdit */ +.optionWrapper { + width: 450px; + margin-left: auto; + margin-right: auto; + padding: 6px 12px; +} +.optionWrapper span.selectTitle { + float: left; + font-weight: 700; + font-size: 1.2em; + text-align: left; + width: 225px; +} +.optionWrapper div.selectChoices { + float: left; + width: 175px; + margin-left: 25px; +} +.optionWrapper br { + clear: both; +} +a.whitelink { + color: white; +} +/* for displayShow notice */ +#show_message { + border: 1px solid #cccccc; + background-image: -moz-linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: -webkit-linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: -o-linear-gradient(#fdf0d5, #fff9ee) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; + border-radius: 7px; + font-size: 14px; + right: 10px; + -moz-box-shadow: 0px 0px 2px #aaaaaa; + -webkit-box-shadow: 0px 0px 2px #aaaaaa; + -o-box-shadow: 0px 0px 2px #aaaaaa; + box-shadow: 0px 0px 2px #aaaaaa; + padding: 7px 10px; + position: fixed; + text-align: center; + bottom: 10px; + min-height: 22px; + width: 250px; + z-index: 9999; + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + line-height: normal; + filter: alpha(opacity=85); + -moz-opacity: 0.8 !important; + -khtml-opacity: 0.8 !important; + -o-opacity: 0.8 !important; + opacity: 0.8 !important; +} +#show_message .msg { + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + line-height: normal; + padding-left: 20px; +} +#show_message .loader { + position: relative; + top: 2px; +} +#show_message.success { + background-image: -moz-linear-gradient(#d3ffd7, #c2edc6) !important; + background-image: linear-gradient(#d3ffd7, #c2edc6) !important; + background-image: -webkit-linear-gradient(#d3ffd7, #c2edc6) !important; + background-image: -o-linear-gradient(#d3ffd7, #c2edc6) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + padding: 15px 10px; + text-align: left; +} +#show_message.error { + background-image: -moz-linear-gradient(#ffd3d3, #edc4c4) !important; + background-image: linear-gradient(#ffd3d3, #edc4c4) !important; + background-image: -webkit-linear-gradient(#ffd3d3, #edc4c4) !important; + background-image: -o-linear-gradient(#ffd3d3, #edc4c4) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#fdf0d5, endColorstr=#fff9ee) !important; + padding: 15px 10px; + text-align: left; +} +#show_message .ui-icon { + display: inline-block; + margin-left: -20px; + top: 2px; + position: relative; + margin-right: 3px; +} + +ui-pnotify-text img { + /*padding-top: 3px;*/ + margin-top: -3px; +} + +div.ui-pnotify { + min-width: 340px; + max-width: 550px; + width: auto !important; +} +/* override for qtip2 */ +.ui-tooltip-sb .ui-tooltip-titlebar a { + color: #222222; + text-decoration: none; +} +.ui-tooltip, +.qtip { + max-width: 500px !important; +} + +.changelog { max-width: 650px !important; } + +option.flag { + padding-left: 35px; + background-color: #fff; + background-repeat: no-repeat; + background-position: 10px 50%; +} + +span.quality { + font: bold 1em/1.2em verdana, sans-serif; + background: none repeat scroll 0 0 #999999; + color: #FFFFFF; + display: inline-block; + padding: 2px 4px; + text-align: center; + -webkit-border-radius: 4px; + font-size: 12px; + -moz-border-radius: 4px; + border-radius: 4px; +} +span.Custom { + background: none repeat scroll 0 0 #449; + /* purplish blue */ +} + +span.HD { + background: none repeat scroll 0 0 #008fbb; + /* greenish blue */ +} + +span.HD720p { + background: none repeat scroll 0 0 #494; + /* green */ +} + +span.HD1080p { + background: none repeat scroll 0 0 #499; + /* blue */ +} + +span.RawHD { + background: none repeat scroll 0 0 #999944; + /* dark orange */ +} + +span.SD { + background: none repeat scroll 0 0 #944; + /* red */ +} + +span.Any { + background: none repeat scroll 0 0 #444; + /* black */ +} + +span.Proper { + background: none repeat scroll 0 0 #CD7300; + /* orange_red */ +} + +span.false { + color: #993333; + /* red */ + +} +span.true { + color: #669966; + /* green */ + +} +.ui-progressbar { + height: 18px !important; + line-height: 17px; +} + +.pull-left { + float: left; + padding-right: 2px +} + +.pull-right { + float: right; +} + +#searchResults a { + color: #343434; +} + +.btn { + display: inline-block; + *display: inline; + padding: 3.5px 10px 3.5px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); +/* vertical-align: middle; */ + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + margin-top: 4px; +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding-left: 6px; + padding-right: 6px; + font-size: 11px; + line-height: 14px; + margin-top: -2px; +} + +.btn-mini a { + color: #333333; +} + +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + background-color: #0074cc; + *background-color: #0055cc; + background-image: -ms-linear-gradient(top, #0088cc, #0055cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); + background-image: -o-linear-gradient(top, #0088cc, #0055cc); + background-image: -moz-linear-gradient(top, #0088cc, #0055cc); + background-image: linear-gradient(top, #0088cc, #0055cc); + background-repeat: repeat-x; + border-color: #0055cc #0055cc #003580; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0055cc; + *background-color: #004ab3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #004099 \9; +} + +.btn-warning { + background-color: #faa732; + *background-color: #f89406; + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + *background-color: #bd362f; + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + *background-color: #51a351; + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #414141; + *background-color: #414141; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + vertical-align: middle; +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +.btn:focus, +.btn:active { + border: 1px solid #4d90fe; + outline: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-primary:focus, +.btn-warning:focus, +.btn-danger:focus, +.btn-success:focus, +.btn-info:focus, +.btn-inverse:focus { + border: 1px solid transparent; + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.75) inset; +} + +/*button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +}*/ + +/* button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +}*/ + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-group { + position: relative; + *margin-left: .3em; + *zoom: 1; +} + +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +#customQuality { + clear: both; + display: block ; + overflow-x: hidden; + overflow-y: hidden; + padding-bottom: 10px; + padding-left: 0; + padding-right: 0; + padding-top: 10px; + font-size: 14px; + padding-left:20px; +} + +.stepDiv > #customQualityWrapper { + overflow-x: hidden; + overflow-y: hidden; +} + +#customQualityWrapper div.component-group-desc { + float: left; + width: 165px; +} +#customQualityWrapper div.component-group-desc p { + color: #666666; +/* font-size: 1.2em;*/ + margin-bottom: 0.8em; + margin-left: 0; + margin-right: 0; + margin-top: 0.8em; + width: 85%; +} + +#SceneException { + height: 180px; + padding-bottom: 10px; + padding-left: 20px; + padding-right: 0; + padding-top: 10px; +} + +#SceneException div.component-group-desc { + float: left; + width: 165px; +} + +#SceneException div.component-group-desc p { + color: #666666; +/* font-size: 1.2em;*/ + margin-bottom: 0.8em; + margin-left: 0; + margin-right: 0; + margin-top: 0.8em; + width: 85%; +} + +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { + font-size: 14px; +} + +[class^="icon-"], [class*=" icon-"] { + background-image: url("../images/glyphicons-halflings.png"); +} + +.icon-white { + background-image: url("../images/glyphicons-halflings-white.png"); +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 16px; + height: 16px; +/* margin-left: -21px; + margin-right: 8px; + position: absolute; */ + vertical-align: bottom; + background-repeat: no-repeat; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-calendar { + background-position: -192px -120px; +} + +h3 { + font-size: 18px; + line-height: 27px; +} + +h4.note { + color: #000000; + float: left; + padding-right: 5px; +} +h4 { + font-size: 14px; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #838B8B; + opacity: 0.6; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +pre { + display: block; + padding: 8.5px; + margin: 10px 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.vertical { + display: inline-block; + + background-color: #79DF46; + border-radius: 0 4px 4px 0; + border-width: 3px 3px 3px 0; + border-style: solid; + border-color: #B7B7B7; + position: absolute; + font-weight: bold; + font-size: 0.99em; + line-height: 12.5px; + width: 24px; + color: #343434; + height: 37px; + text-align: center; +} \ No newline at end of file diff --git a/gui/slick/css/default.less b/gui/slick/css/default.less new file mode 100644 index 00000000..6969ec23 --- /dev/null +++ b/gui/slick/css/default.less @@ -0,0 +1,542 @@ +// Config +@import "config.less"; + +* { outline: 0;margin:0; } +*:focus { outline: none; } +img { border: 0; vertical-align: middle;} +html { margin:0; padding:0} +body { +text-rendering: optimizeLegibility; +background: none repeat scroll 0 0 #FFFFFF; + color: #343434; + font-family: @base-font-face; + margin: 0; + overflow-y: scroll; + padding: 0; + font-size: 12px; +} + +form { +border:none; +display:inline; +margin:0; +padding:0; +} +a {color: @link-color;} + +/* these are for inc_top.tmpl */ +#upgrade-notification{position: fixed;line-height:0.5em;color:#000;font-size:1em; height:0px;text-align:center;width:100%;z-index:100;margin:0;padding:0;} +#upgrade-notification div{.gradient(#FDF0D5,#fff9ee);border-bottom:1px solid #af986b;padding:7px 0;} +#header-fix{*margin-bottom: -31px; /* IE fix */height:21px;padding:0;} + +#header { + .gradient(#555555, #333333); + border-bottom: 1px solid #CACACA; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + height: 58px; + position: fixed; + width: 100%; + z-index: 999; +} +#header .wrapper { + margin: 0 auto; + position: relative; + width: 960px; +} +#header a:hover { +background:none; +} + +#logo { +float: left; + position: relative; + top: 0px; + left: -5px; +} + +#versiontext { +color: #FFFFFF; + font-family: Arial,Helvetica,sans-serif; + font-size: 11px; + position: relative; + text-transform: lowercase; + top: 7px; +} + +.navShows { margin-top:-25px; margin-bottom: 40px;} + +.tvshowImg { + background: url("../images/loading.gif") no-repeat scroll center center #FFFFFF; + border: 5px solid #FFFFFF; + .shadow(1px 1px 2px 0 #555555); + float: left; + height: auto; + margin-bottom: 30px; + margin-right: 25px; + overflow: hidden; + text-indent: -3000px; + width: 175px; + img { + float: left; + min-width: 100%; + position: relative; + } +} +/* --------------------------------------------- */ + +table { +margin:0; + td a { + color: #555; + &:hover { color: @text-color;} + } +} + +h1 { +text-align:left; +font-size:21px; +line-height:23px; +font-weight:400; +} +h1.title { +padding-bottom:4px; +margin-bottom:12px; +font-weight: bold; +font-family: @alt-font-face; +font-size: 38px; +} +h1.header { +padding-bottom:4px; +margin-bottom:12px; +font-size: 30px; +font-family: @alt-font-face; +font-weight: bold; +} +h1 a { +text-decoration:none; +} + +h2 { +font-size:18px; +font-weight:700; +} + +.h2footer { +margin: -33px 5px 6px 0px; +} +.h2footer select { +margin-top: -6px; +margin-bottom: -6px; +} + +.separator { +font-size:90%; +color:#999; +} + +div select { +font-size:10px; +border:1px solid #d4d0c8; +} + +div select option { +line-height:1.4; +padding:0 10px; +border-bottom: 1px dotted #D7D7D7; +} + +/* --------------- alignment ------------------- */ +.float-left { float:left; } +.float-right { float:right; } +.align-left { text-align:left; } +.align-right { text-align:right; } +.nowrap { white-space: nowrap; } +/* --------------------------------------------- */ + +.footer { +clear:both; +width: 960px; +text-align:center; +padding-top: 5px; +padding-bottom: 5px; +margin: 20px auto; +border-top:1px solid #eee; +line-height: 1.4em; +font-size: 11px; + a { + color: @link-color; + text-decoration: none; + } + ul { + li { + list-style: none; + float: left; + margin-left: 10px; + img { margin-right: 3px; position: relative; top: -2px;} + } + } +} + +.sickbeardTable { + width: 100%; + margin-left:auto; + margin-right:auto; + text-align:left; + color: #343434; + background-color: #fff; + border-spacing: 0; +} +.sickbeardTable th, +.sickbeardTable td { + padding: 4px; + border-top: #fff 1px solid; + vertical-align: middle; +} +.sickbeardTable th:first-child, +.sickbeardTable td:first-child { + border-left: none; +} +.sickbeardTable th{ + border-collapse: collapse; + .gradient(#555555,#333333); + color: #fff; + text-shadow: -1px -1px 0 rgba(0,0,0,0.3); + text-align: left; +} +.sickbeardTable tfoot a { + text-decoration: none; + color: @swatch-green; +} +.sickbeardTable td { + font-size: 12px; + &.title { font-size: 14px; line-height: normal;} + &.status_column{ line-height: normal;} + small { font-size:11px; font-style: italic; line-height: normal;} +} +.row { +clear:left; +} + +.plotInfo { +cursor:help; +font-weight: 700; +position: relative; +} + +#actions { + .selectAll { margin-right: 10px; border-right: 1px solid #eee; padding-right: 10px;} + .clearAll {} +} +#tooltip { +display:none; +z-index:3343434; +border:1px solid #111; +background-color:#eee; +padding:5px; +margin-right:10px; +} + +.progressbarText { +text-shadow: 0 0 0.1em #fff; +position:absolute; +top:0; +font-size: 9px; +width:100%; +height:100%; +overflow:visible; +text-align:center; +vertical-align: middle; +} +.ui-progressbar .ui-widget-header { + .gradient(#A3E532, #90CC2A); + .rounded(3px); +} +tr.seasonheader { +background-color: #FFFFFF; + padding-bottom: 5px; + padding-top: 10px; + text-align: left; + white-space: nowrap; + td { + padding-top: 20px; + padding-bottom: 10px; + } +} +tr.seasonheader h2 { +display:inline; +font-size:22px; +line-height:20px; +letter-spacing:1px; +margin:0; +color:#343434; +} +tr.seasonheader a { +text-decoration:none; +} +tr.seasonheader a:hover { +background-color: #fff; +color:#343434; +} + + +#checkboxControls label { white-space:nowrap; } +tr.unaired,span.unaired { +background-color:#F5F1E4; +padding:5px; +font-size: 13px; +color: #cec198; +font-weight: bold; +b { color:@text-color;} +.rounded(5px); +} + +tr.skipped,span.skipped { +background-color:#E9F7FB; +color: #90D5EC; +font-weight: bold; +font-size: 13px; +padding:5px; +.rounded(5px); +b { color:@text-color;} +} + +tr.good,span.good { +background-color:#E2FFD8; +color: #AAD450; +padding:5px; +font-size: 13px; +font-weight: bold; +.rounded(5px); +b { color:@text-color;} +} + +tr.qual,span.qual { +background-color:#FDF0D5; +padding:5px; +font-size: 13px; +font-weight: bold; +color: #F7B42C; +.rounded(5px); +b { color:@text-color;} +} + +tr.wanted,span.wanted { +background-color:#FDEBF3; +padding:5px; +font-size: 13px; +font-weight: bold; +color: #F49AC1; +.rounded(5px); +b { color:@text-color;} +} + +tr.wanted,tr.qual,tr.good,tr.skipped,tr.unaired { + font-size: 14px; + font-weight: normal; + color: @text-color; +} +.showInfo { + width: 745px; + float: right; + padding-top: 10px; +} +div#summary { +background-color:#f9f9f9; +.rounded(10px); +padding:10px; +border:1px solid #ddd; +margin:10px 0; + .infoTable { + width: 85%; + } +} +div#summary tr { +line-height: 17px; + td { font-size: 14px; line-height: 25px;} +} + +#MainMenu { + float: right; + height: 58px; + margin: 0; + padding: 0 0 0 10px; +} +#SubMenu { + float: right; + margin-top: -30px; + position: relative; + z-index: 99; +} + +#SubMenu a { + font-size: 12px; + text-decoration: none; +} +#SubMenu span b { margin-left: 20px;} +#donate { +line-height:1em; +background: #57442B; +float: right; +display: none; +} +#donate a,#donate a:hover { +background-color:#57442B; +border:0; +padding:4px 15px 0px; +} +#contentWrapper { + background: none; +} +#content { + line-height: 24px; + margin: 0 auto; + padding: 105px 0 0; + width: 960px; +} +.showLegend{ +font-weight:700; +padding-right:10px; +padding-bottom:1px; +} + +/* for the add new/existing show */ +.alt { background-color: #efefef; } +#tabs div.field-pair, .stepDiv div.field-pair{padding:0.75em 0;} +#tabs div.field-pair input, .stepDiv div.field-pair input{float:left;} +#tabs label.nocheck, #tabs div.providerDiv, #tabs div #customQuality, .stepDiv label.nocheck,.stepDiv div.providerDiv,.stepDiv div #customQuality{padding-left:23px;} +#tabs label span.component-title, .stepDiv label span.component-title{font-size:1.1em;font-weight:700;float:left;width:165px; padding-left: 6px; margin-right:10px;} +#tabs label span.component-desc, .stepDiv label span.component-desc{font-size:.9em; float:left;} +#tabs div.field-pair select, .stepDiv div.field-pair select{font-size:1em;border:1px solid #d4d0c8;} +#tabs div.field-pair select option, .stepDiv div.field-pair select option{line-height:1.4;padding:0 10px; border-bottom: 1px dotted #D7D7D7;} + +ul#rootDirStaticList { width: 90%; text-align: left; margin-left: auto; margin-right: auto; padding-left: 0; } +ul#rootDirStaticList li{ list-style: none outside none; margin: 2px; padding: 4px 5px 4px 5px; cursor: pointer; } + +#displayText { +background-color:#efefef; +padding:8px; +border:1px solid #DFDEDE; +font-size:1.1em; +overflow: hidden; +} + +div#addShowPortal { +margin: 50px auto; + width: 100%; +} + +div#addShowPortal button { float: left; + margin-left: 20px; + padding: 10px; + width: 47%;} +div#addShowPortal button div.button img{ position: absolute; display: block; top: 35%; padding-left: 0.4em; text-align: center; } +div#addShowPortal button .buttontext { position: relative; display: block; padding: 0.1em 0.4em 0.1em 4.4em; text-align: left; } + +#rootDirs, #rootDirsControls { width: 50%; min-width: 400px; } + +td.tvShow a {text-decoration: none; font-size:16px; } +.navShow { display: inline; cursor: pointer; vertical-align: top; position:relative;top:0px; .opacity(50); + &:hover { .opacity(100);} +} + +/* for manage_massEdit */ +.optionWrapper { width: 450px; margin-left: auto; margin-right: auto; padding: 6px 12px; } +.optionWrapper span.selectTitle { float: left; font-weight: 700; font-size: 1.2em; text-align: left; width: 225px; } +.optionWrapper div.selectChoices { float: left; width: 175px; margin-left: 25px; } +.optionWrapper br { clear: both; } + +a.whitelink { color: white; } + +/* for displayShow notice */ +#show_message { + border: 1px solid @border-color; + .gradient(#FDF0D5,#fff9ee); + .rounded(7px); + font-size: 14px; + right: 10px; + .shadow(0px 0px 2px #aaa); + padding: 7px 10px; + position: fixed; + text-align: center; + bottom: 10px; + min-height: 22px; + width: 250px; + z-index: 9999; + font-family: @alt-font-face; + line-height: normal; + .opacity(80); + .msg { + font-family: @alt-font-face; + line-height: normal; + padding-left: 20px; + } + .loader { + position: relative; + top: 2px; + } + &.success { + .gradient(@msg-bg-success,#C2EDC6); + padding: 15px 10px; + text-align: left; + } + &.error { + .gradient(@msg-bg-error,#EDC4C4); + padding:15px 10px; + text-align: left; + } + .ui-icon { + display: inline-block; + margin-left: -20px; + top: 2px; + position: relative; + margin-right: 3px; + } +} +div.ui-pnotify { min-width: 340px; max-width: 550px; width: auto !important;} + +/* override for qtip2 */ +.ui-tooltip-sb .ui-tooltip-titlebar a { color: #222222; text-decoration: none; } +.ui-tooltip, .qtip { max-width: 500px !important; } + +option.flag { + padding-left: 35px; + background-color: #fff; + background-repeat: no-repeat; + background-position: 10px 50%; +} + +span.quality { + font: bold 1em/1.2em verdana, sans-serif; + background: none repeat scroll 0 0 #999999; + color: #FFFFFF; + display: inline-block; + padding: 2px 4px; + text-align: center; + -webkit-border-radius: 4px; + font-size:12px; + -moz-border-radius: 4px; + border-radius: 4px; +} +span.Custom { + background: none repeat scroll 0 0 #444499; /* blue */ +} +span.HD,span.WEB-DL,span.BluRay { + background: none repeat scroll 0 0 #449944; /* green */ +} +span.SD { + background: none repeat scroll 0 0 #994444; /* red */ +} +span.Any { + background: none repeat scroll 0 0 #444444; /* black */ +} + +span.false { + color: #993333; /* red */ +} +span.true { + color: #669966; /* green */ +} +.ui-progressbar { + height: 15px !important; + line-height: 17px; +} \ No newline at end of file diff --git a/gui/slick/css/formwizard.css b/gui/slick/css/formwizard.css new file mode 100644 index 00000000..4524d56d --- /dev/null +++ b/gui/slick/css/formwizard.css @@ -0,0 +1,91 @@ +fieldset.sectionwrap{ +text-align: left; +width: 800px; +border-width:0; +padding:5px; +top: -25px !important; +} + +legend.legendStep{ +font:bold 16px Arial; +color: #343434; +display: none; +} + +div.stepsguide{ /*div that contains all the "steps" text located at top of form */ +text-align: left; +width: 800px; /*width of "steps" container*/ +overflow:hidden; +margin-bottom:15px; +cursor:pointer; +} + +div.stepsguide .step{ +width:250px; /*width of each "steps" text*/ +font: bold 24px Arial; +float:left; +} +div.stepsguide .step p { +border-bottom: 4px solid #57442B; +} + +div.stepsguide .disabledstep{ +color:#C4C4C4; +} +div.stepsguide .disabledstep p { +border-bottom: 4px solid #8A775E; +} + +div.stepsguide .step .smalltext{ +font-size: 13px; +font-weight: normal; +} + +div.formpaginate{ +width: 800px; +overflow:auto; +font-weight:bold; +text-align:center; +margin-top:1em; +} + +div.formpaginate .prev, div.formpaginate .next{ +border-radius:6px; +-webkit-border-radius:6px; +-moz-border-radius:6px; +padding:3px 6px; +background:#57442B; +color:white; +cursor:hand; +cursor:pointer; +} + +.stepDiv {padding: 21px 15px 15px 15px;} + +input:not(.btn){float:left;margin-right:6px;margin-top:5px;padding-top:4px;padding-bottom:4px;padding-right:4px;padding-left:4px;border-bottom-left-radius:3px;border-bottom-right-radius:3px;border-top-left-radius:3px;border-top-right-radius:3px;border-top-width: 1px; + border-left-width: 1px; + border-left-style: solid; + border-bottom-color: #CCCCCC; + border-right-color: #CCCCCC; + border-left-color: #CCCCCC; + border-right-style: solid; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + border-bottom-style: solid; + border-bottom-width: 1px; + border-right-width: 1px; + border-right-style: solid; + border-right-width-value: 1px; + border-top-color: #CCCCCC; + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-top-style: solid; + border-top-width: 1px; +} + +/* step 3 related */ + +#customQualityWrapper {/* height: 190px;*/ overflow: hidden; } +#customQualityWrapper div.component-group-desc{float:left;width:165px;} +#customQualityWrapper div.component-group-desc p{width:85%;font-size:14px;color:#666;margin:.8em 0;} +#customQualityWrapper div.component-group-desc p.note{width:90%;font-size:14px;color:#333;margin:.8em 0;} diff --git a/gui/slick/css/imports/config.less b/gui/slick/css/imports/config.less new file mode 100644 index 00000000..a9fba3b2 --- /dev/null +++ b/gui/slick/css/imports/config.less @@ -0,0 +1,78 @@ +/* Variables */ +@base-font-face: "Helvetica Neue", Helvetica, Arial, Geneva, sans-serif; +@alt-font-face: "Trebuchet MS", Helvetica, Arial, sans-serif; +@base-font-size: 12px; +@text-color: #343434; +@swatch-blue: #4183C4; +@swatch-green: #BDE433; +@swatch-grey: #666666; +@link-color: #555555; +@border-color: #CCCCCC; +@msg-bg: #FFF6A9; +@msg-bg-success: #D3FFD7; +@msg-bg-error: #FFD3D3; + +/* Mixins */ +.rounded(@radius: 5px) { + -moz-border-radius: @radius; + -webkit-border-radius: @radius; + border-radius: @radius; +} +.roundedTop(@radius: 5px) { + -moz-border-radius-topleft: @radius; + -moz-border-radius-topright: @radius; + -webkit-border-top-right-radius: @radius; + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; + border-top-right-radius: @radius; +} +.roundedLeftTop(@radius: 5px) { + -moz-border-radius-topleft: @radius; + -webkit-border-top-left-radius: @radius; + border-top-left-radius: @radius; +} +.roundedRightTop(@radius: 5px) { + -moz-border-radius-topright: @radius; + -webkit-border-top-right-radius: @radius; + border-top-right-radius: @radius; +} +.roundedBottom(@radius: 5px) { + -moz-border-radius-bottomleft: @radius; + -moz-border-radius-bottomright: @radius; + -webkit-border-bottom-right-radius: @radius; + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; +} +.roundedLeftBottom(@radius: 5px) { + -moz-border-radius-bottomleft: @radius; + -webkit-border-bottom-left-radius: @radius; + border-bottom-left-radius: @radius; +} +.roundedRightBottom(@radius: 5px) { + -moz-border-radius-bottomright: @radius; + -webkit-border-bottom-right-radius: @radius; + border-bottom-right-radius: @radius; +} +.shadow(@shadow: 0 17px 11px -1px #ced8d9) { + -moz-box-shadow: @shadow; + -webkit-box-shadow: @shadow; + -o-box-shadow: @shadow; + box-shadow: @shadow; +} +.gradient(@gradientFrom: #FFFFFF, @gradientTo: #EEEEEE){ + background-image: -moz-linear-gradient(@gradientFrom, @gradientTo) !important; + background-image: linear-gradient(@gradientFrom, @gradientTo) !important; + background-image: -webkit-linear-gradient(@gradientFrom, @gradientTo) !important; + background-image: -o-linear-gradient(@gradientFrom, @gradientTo) !important; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=@gradientFrom, endColorstr=@gradientTo) !important; + -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=@gradientFrom, endColorstr=@gradientTo) !important; +} +.opacity(@opacity_percent:85) { + filter: ~"alpha(opacity=85)"; + -moz-opacity: @opacity_percent / 100 !important; + -khtml-opacity:@opacity_percent / 100 !important; + -o-opacity:@opacity_percent / 100 !important; + opacity:@opacity_percent / 100 !important; +} + diff --git a/gui/slick/css/iphone.css b/gui/slick/css/iphone.css new file mode 100644 index 00000000..617f1661 --- /dev/null +++ b/gui/slick/css/iphone.css @@ -0,0 +1,24 @@ +body { +width: 100%; +padding: 0; +margin: 0; +font-size: 10px; +line-height:10px; +} + +.MainMenu a, .SubMenu a { padding: 2px; font-weight: normal; } +#btnExistingShow, #btnNewShow { min-height: 150px; } + +.sickbeardTable { +margin-left:1%; +margin-right:1%; +width:98%; +} + +table { +margin:0; +font-size: 10px; +} + +#outerWrapper { width: 98%; padding-left: 1%; padding-right: 1%; } + diff --git a/gui/slick/css/jquery.qtip2.css b/gui/slick/css/jquery.qtip2.css new file mode 100644 index 00000000..173ce4ba --- /dev/null +++ b/gui/slick/css/jquery.qtip2.css @@ -0,0 +1,536 @@ +/* +* qTip2 - Pretty powerful tooltips +* http://craigsworks.com/projects/qtip2/ +* +* Version: nightly +* Copyright 2009-2010 Craig Michael Thompson - http://craigsworks.com +* +* Dual licensed under MIT or GPLv2 licenses +* http://en.wikipedia.org/wiki/MIT_License +* http://en.wikipedia.org/wiki/GNU_General_Public_License +* +* Date: Thu Nov 17 12:01:03.0000000000 2011 +*/ + +/* Core qTip styles */ +.ui-tooltip, .qtip{ + position: absolute; + left: -28000px; + top: -28000px; + display: none; + + max-width: 280px; + min-width: 50px; + + font-size: 10.5px; + line-height: 12px; + + z-index: 15000; +} + + /* Fluid class for determining actual width in IE */ + .ui-tooltip-fluid{ + display: block; + visibility: hidden; + position: static !important; + float: left !important; + } + + .ui-tooltip-content{ + position: relative; + padding: 5px 9px; + overflow: hidden; + + border-width: 1px; + border-style: solid; + + text-align: left; + word-wrap: break-word; + overflow: hidden; + } + + .ui-tooltip-titlebar{ + position: relative; + min-height: 14px; + padding: 5px 35px 5px 10px; + overflow: hidden; + + border-width: 1px 1px 0; + border-style: solid; + + font-weight: bold; + } + + .ui-tooltip-titlebar + .ui-tooltip-content{ border-top-width: 0px !important; } + + /*! Default close button class */ + .ui-tooltip-titlebar .ui-state-default{ + position: absolute; + right: 4px; + top: 50%; + margin-top: -9px; + + cursor: pointer; + outline: medium none; + + border-width: 1px; + border-style: solid; + } + + * html .ui-tooltip-titlebar .ui-state-default{ top: 16px; } /* IE fix */ + + .ui-tooltip-titlebar .ui-icon, + .ui-tooltip-icon .ui-icon{ + display: block; + text-indent: -1000em; + } + + .ui-tooltip-icon, .ui-tooltip-icon .ui-icon{ + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + } + + .ui-tooltip-icon .ui-icon{ + width: 18px; + height: 14px; + + text-align: center; + text-indent: 0; + font: normal bold 10px/13px Tahoma,sans-serif; + + color: inherit; + background: transparent none no-repeat -100em -100em; + } + + +/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */ +.ui-tooltip-focus{ + +} + +/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */ +.ui-tooltip-hover{ + +} + + +/*! Default tooltip style */ +.ui-tooltip-default .ui-tooltip-titlebar, +.ui-tooltip-default .ui-tooltip-content{ + border-color: #F1D031; + background-color: #FFFFA3; + color: #555; +} + + .ui-tooltip-default .ui-tooltip-titlebar{ + background-color: #FFEF93; + } + + .ui-tooltip-default .ui-tooltip-icon{ + border-color: #CCC; + background: #F1F1F1; + color: #777; + } + + .ui-tooltip-default .ui-tooltip-titlebar .ui-state-hover{ + border-color: #AAA; + color: #111; + } + +/* Tips plugin */ +.ui-tooltip .ui-tooltip-tip{ + margin: 0 auto; + overflow: hidden; + z-index: 10; +} + + .ui-tooltip .ui-tooltip-tip, + .ui-tooltip .ui-tooltip-tip *{ + position: absolute; + + line-height: 0.1px !important; + font-size: 0.1px !important; + color: #123456; + + background: transparent; + border: 0px dashed transparent; + } + + .ui-tooltip .ui-tooltip-tip canvas{ top: 0; left: 0; } + + +/*! Light tooltip style */ +.ui-tooltip-light .ui-tooltip-titlebar, +.ui-tooltip-light .ui-tooltip-content{ + border-color: #E2E2E2; + color: #454545; +} + + .ui-tooltip-light .ui-tooltip-content{ + background-color: white; + } + + .ui-tooltip-light .ui-tooltip-titlebar{ + background-color: #f1f1f1; + } + + +/*! Dark tooltip style */ +.ui-tooltip-dark .ui-tooltip-titlebar, +.ui-tooltip-dark .ui-tooltip-content{ + border-color: #303030; + color: #f3f3f3; +} + + .ui-tooltip-dark .ui-tooltip-content{ + background-color: #505050; + } + + .ui-tooltip-dark .ui-tooltip-titlebar{ + background-color: #404040; + } + + .ui-tooltip-dark .ui-tooltip-icon{ + border-color: #444; + } + + .ui-tooltip-dark .ui-tooltip-titlebar .ui-state-hover{ + border-color: #303030; + } + + +/*! Cream tooltip style */ +.ui-tooltip-cream .ui-tooltip-titlebar, +.ui-tooltip-cream .ui-tooltip-content{ + border-color: #F9E98E; + color: #A27D35; +} + + .ui-tooltip-cream .ui-tooltip-content{ + background-color: #FBF7AA; + } + + .ui-tooltip-cream .ui-tooltip-titlebar{ + background-color: #F0DE7D; + } + + .ui-tooltip-cream .ui-state-default .ui-tooltip-icon{ + background-position: -82px 0; + } + + +/*! Red tooltip style */ +.ui-tooltip-red .ui-tooltip-titlebar, +.ui-tooltip-red .ui-tooltip-content{ + border-color: #D95252; + color: #912323; +} + + .ui-tooltip-red .ui-tooltip-content{ + background-color: #F78B83; + } + + .ui-tooltip-red .ui-tooltip-titlebar{ + background-color: #F06D65; + } + + .ui-tooltip-red .ui-state-default .ui-tooltip-icon{ + background-position: -102px 0; + } + + .ui-tooltip-red .ui-tooltip-icon{ + border-color: #D95252; + } + + .ui-tooltip-red .ui-tooltip-titlebar .ui-state-hover{ + border-color: #D95252; + } + + +/*! Green tooltip style */ +.ui-tooltip-green .ui-tooltip-titlebar, +.ui-tooltip-green .ui-tooltip-content{ + border-color: #90D93F; + color: #3F6219; +} + + .ui-tooltip-green .ui-tooltip-content{ + background-color: #CAED9E; + } + + .ui-tooltip-green .ui-tooltip-titlebar{ + background-color: #B0DE78; + } + + .ui-tooltip-green .ui-state-default .ui-tooltip-icon{ + background-position: -42px 0; + } + + +/*! Blue tooltip style */ +.ui-tooltip-blue .ui-tooltip-titlebar, +.ui-tooltip-blue .ui-tooltip-content{ + border-color: #ADD9ED; + color: #5E99BD; +} + + .ui-tooltip-blue .ui-tooltip-content{ + background-color: #E5F6FE; + } + + .ui-tooltip-blue .ui-tooltip-titlebar{ + background-color: #D0E9F5; + } + + .ui-tooltip-blue .ui-state-default .ui-tooltip-icon{ + background-position: -2px 0; + } + +/*! Add shadows to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE6+, Safari 2+ */ +.ui-tooltip-shadow{ + -webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15); + box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15); +} + + .ui-tooltip-shadow .ui-tooltip-titlebar, + .ui-tooltip-shadow .ui-tooltip-content{ + filter: progid:DXImageTransform.Microsoft.Shadow(Color='gray', Direction=135, Strength=3); + -ms-filter:"progid:DXImageTransform.Microsoft.Shadow(Color='gray', Direction=135, Strength=3)"; + + _margin-bottom: -3px; /* IE6 */ + .margin-bottom: -3px; /* IE7 */ + } + + +/*! Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */ +.ui-tooltip-rounded, +.ui-tooltip-rounded .ui-tooltip-content, +.ui-tooltip-tipsy, +.ui-tooltip-tipsy .ui-tooltip-content, +.ui-tooltip-youtube, +.ui-tooltip-youtube .ui-tooltip-content{ + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.ui-tooltip-rounded .ui-tooltip-titlebar, +.ui-tooltip-tipsy .ui-tooltip-titlebar, +.ui-tooltip-youtube .ui-tooltip-titlebar{ + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.ui-tooltip-rounded .ui-tooltip-titlebar + .ui-tooltip-content, +.ui-tooltip-tipsy .ui-tooltip-titlebar + .ui-tooltip-content, +.ui-tooltip-youtube .ui-tooltip-titlebar + .ui-tooltip-content{ + -moz-border-radius: 0 0 5px 5px; + -webkit-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + + +/*! Youtube tooltip style */ +.ui-tooltip-youtube{ + -webkit-box-shadow: 0 0 3px #333; + -moz-box-shadow: 0 0 3px #333; + box-shadow: 0 0 3px #333; +} + + .ui-tooltip-youtube .ui-tooltip-titlebar, + .ui-tooltip-youtube .ui-tooltip-content{ + _margin-bottom: 0; /* IE6 */ + .margin-bottom: 0; /* IE7 */ + + background: transparent; + background: rgba(0, 0, 0, 0.85); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)"; + + color: white; + border-color: #CCCCCC; + } + + .ui-tooltip-youtube .ui-tooltip-icon{ + border-color: #222; + } + + .ui-tooltip-youtube .ui-tooltip-titlebar .ui-state-hover{ + border-color: #303030; + } + + +/* jQuery TOOLS Tooltip style */ +.ui-tooltip-jtools{ + background: #232323; + background: rgba(0, 0, 0, 0.7); + background-image: -moz-linear-gradient(top, #717171, #232323); + background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323)); + + border: 2px solid #ddd; + border: 2px solid rgba(241,241,241,1); + + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + + -webkit-box-shadow: 0 0 12px #333; + -moz-box-shadow: 0 0 12px #333; + box-shadow: 0 0 12px #333; +} + + /* IE Specific */ + .ui-tooltip-jtools .ui-tooltip-titlebar{ + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)"; + } + .ui-tooltip-jtools .ui-tooltip-content{ + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)"; + } + + .ui-tooltip-jtools .ui-tooltip-titlebar, + .ui-tooltip-jtools .ui-tooltip-content{ + background: transparent; + color: white; + border: 0 dashed transparent; + } + + .ui-tooltip-jtools .ui-tooltip-icon{ + border-color: #555; + } + + .ui-tooltip-jtools .ui-tooltip-titlebar .ui-state-hover{ + border-color: #333; + } + + +/* Cluetip style */ +.ui-tooltip-cluetip{ + -webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); + -moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); + box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4); +} + + .ui-tooltip-cluetip .ui-tooltip-titlebar{ + background-color: #87876A; + color: white; + border: 0 dashed transparent; + } + + .ui-tooltip-cluetip .ui-tooltip-content{ + background-color: #D9D9C2; + color: #111; + border: 0 dashed transparent; + } + + .ui-tooltip-cluetip .ui-tooltip-icon{ + border-color: #808064; + } + + .ui-tooltip-cluetip .ui-tooltip-titlebar .ui-state-hover{ + border-color: #696952; + color: #696952; + } + + +/* Tipsy style */ +.ui-tooltip-tipsy{ + border: 0; +} + + .ui-tooltip-tipsy .ui-tooltip-titlebar, + .ui-tooltip-tipsy .ui-tooltip-content{ + _margin-bottom: 0; /* IE6 */ + .margin-bottom: 0; /* IE7 */ + + background: transparent; + background: rgba(0, 0, 0, .87); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#D9000000,endColorstr=#D9000000)"; + + color: white; + border: 0px transparent; + + font-size: 11px; + font-family: 'Lucida Grande', sans-serif; + font-weight: bold; + line-height: 16px; + text-shadow: 0 1px black; + } + + .ui-tooltip-tipsy .ui-tooltip-titlebar{ + padding: 6px 35px 0 10; + } + + .ui-tooltip-tipsy .ui-tooltip-content{ + padding: 6px 10; + } + + .ui-tooltip-tipsy .ui-tooltip-icon{ + border-color: #222; + text-shadow: none; + } + + .ui-tooltip-tipsy .ui-tooltip-titlebar .ui-state-hover{ + border-color: #303030; + } + + +/* Tipped style */ +.ui-tooltip-tipped{ + +} + + .ui-tooltip-tipped .ui-tooltip-titlebar, + .ui-tooltip-tipped .ui-tooltip-content{ + border: 3px solid #959FA9; + + filter: none; -ms-filter: none; + } + + .ui-tooltip-tipped .ui-tooltip-titlebar{ + background: #3A79B8; + background-image: -moz-linear-gradient(top, #3A79B8, #2E629D); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3A79B8), to(#2E629D)); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D); + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)"; + + color: white; + font-weight: normal; + font-family: serif; + + border-bottom-width: 0; + -moz-border-radius: 3px 3px 0 0; + -webkit-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; + } + + .ui-tooltip-tipped .ui-tooltip-content{ + background-color: #F9F9F9; + color: #454545; + + -moz-border-radius: 0 0 3px 3px; + -webkit-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + } + + .ui-tooltip-tipped .ui-tooltip-icon{ + border: 2px solid #285589; + background: #285589; + } + + .ui-tooltip-tipped .ui-tooltip-icon .ui-icon{ + background-color: #FBFBFB; + color: #555; + } + +/* IE9 fix - removes all filters */ +.ui-tooltip:not(.ie9haxors) div.ui-tooltip-content, +.ui-tooltip:not(.ie9haxors) div.ui-tooltip-titlebar{ + filter: none; + -ms-filter: none; +} \ No newline at end of file diff --git a/gui/slick/css/lib/images/animated-overlay.gif b/gui/slick/css/lib/images/animated-overlay.gif new file mode 100644 index 0000000000000000000000000000000000000000..d441f75ebfbdf26a265dfccd670120d25c0a341c GIT binary patch literal 1738 zcmZ|OX;ji_6b5ixNYt8>l?gOuO)6lU%W(mxn(`>1S(XO;u`D+P%xqBvMr|w-Vyr1s z7R|Cn0b8|Hu<=Zmv1mFqh9Fj!NuZfKB2MP$e75`XJ@>=!y!Ux9xR3x;EW!q1^V>X| znVFuRUN`NqJ2)ybXh%e__h!!pv(M|S3+?9F%(K}zyE40MGyhWF5-IDgL&=%2-9`Nk z!1@8uk4t%_{(K~>N;sK&dzJbwJ=$kYTlL=$%#0Pfh>U{%i@~wWbvYsD_K-D`&+u1( z#Ma`>%q<^UhzGvi(hyE`zCD{-=2|zL5>wnB=DE!U?(CZG%q4@lDnCq_%&3DCla#(X zmBhDD+RN$aMWWHm?ig*>1Onn6~r?Ma~N2JKAxN>H%UtRyRqS)6Um!-Tz%-r=& zQmTb^JFIe3W^-kAm`}`2P|niMh>RYyd)S^f(dbrx965?rzbhP|XeP}o&&DSZ4|oYQ z)I{f!SfycYw?3=9W;o-B%U5xs(pP267X~9-7L|4WzaYexC0GtG8wWygm63rF{llCEraxzkc=IxvFQ-y37=_;e5 zJLq^gsSO0Ayz?a>E_?{dmUc+t#qv$)XN8$<<}rQ#)lsiw+pmL&J>~+hgpo>i$m+;l zZIa_ZRIfSeT$~v5d`EBV&*k`apPgjv&B|+d`Q!nyu{L4rs%ZfoF0*Kq8I%ByOcFpL zK=>wzofZo<+0GZLCnWM3oQ^pb(gRSf02;~cEn@LJ>~XB9IkEX{$N#Z`m%>S!U{uPx zloI%bLdo$Adxlh(Uv^yX7s5G&C zLwNRG>~T?G{kzupp8EcyLGPoPf)@&9Wqfw_l&uU-6cexk%5;uQg%wb=0k_733{i#& z1a2p)gV3S2+QG1-K9tZ}E~I<(P0r2aFFY-c{o?TUOz3Xjod#TLE2A_c?*T7t z=1>~%YW450{Qqno4t`}gvLnuMrcu8+#xEBoY%2_+Mb#Z6S38+r*M4O`-+!zl(@m`D zQsi|GA2l3gEy}LFe<#Hv8?$_L#u8E|3-bP$*La*E>B{X!Sy4i6?TKam!49aXCAW4S*P_O^H4^*DpiA40o}Uqw~Eo&veh1`|8i zD2$x+>_b^bXE4N;AW=5>iYak2%!JAh0j1*k1{p#iRCjbB7!cSws~U{1IA@acLII$t z$>X#A+^s6iJ5~DFG!xa?>z{=lxtdi1rzbM-(nqAu3D8h-&64xo6|E!p?pK0xT;qoK z`6%+SpBk+~M?nO}>2mTw!A{yZ6O>Z@kwSd4;8aWU5z!P~tQl?u==^+R`{OmOS}oZh zOXQ3{6kuz?Is^n^L7;9ieB9C+8B{>t+pDrlq4xGDDn#T#3T5$l1g`FTQkU;b-981j zNm{zC`$wn7etklM#qHI4=3m5gwa6DNS{?Z!vSObi_od{4eUo=_S2BKNpkSdiqe(k9WtkeM79;2-%CFbb)aB=&H1?i1}uwFzoZQ(38Kn1zBP ORn*B%u*Wk|4g3!*Rv{Mv literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/tablesorter/asc.gif b/gui/slick/css/lib/images/tablesorter/asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3fe40113a4482d2d3ff9b39c9056067477999e GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcXc|NlP&1B2pE7DfgJMg|=qn*k)lz{J}lzkvJ2`CGHoFJ`Og HGFSruQVtDe literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/tablesorter/bg.gif b/gui/slick/css/lib/images/tablesorter/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..40c6a65aa2862b0939e2707b4d9c1174225f21c1 GIT binary patch literal 64 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 DSH>_4 literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_flat_0_ffffff_40x100.png b/gui/slick/css/lib/images/ui-bg_flat_0_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..74d39425c3745c60011f314ed1c3578bdf42dbb6 GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|dINz(Uu^FvP&r%E-jZ7|1oZGBD`a+N6h~AvZrIGp!Q0hMzC2CIK}tc)I$z JtaD0e0s!YvH4Fd% literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_flat_75_ffffff_40x100.png b/gui/slick/css/lib/images/ui-bg_flat_75_ffffff_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8b229af950c29356abf64a6c4aa894575445f0 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQYz+E8 zPo9&<{J;c_6SHRil>2s{Zw^OT)6@jj2u|u!(plXsM>LJD`vD!n;OXk;vd$@?2>^GI BH@yG= literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_glass_55_fbf9ee_1x400.png b/gui/slick/css/lib/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..448f5ffe858b483353bed25002edd4bba14c8ab5 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&AL(GzgD0I22WQ%mvv4FO#nzYb)5hJ literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_glass_65_ffffff_1x400.png b/gui/slick/css/lib/images/ui-bg_glass_65_ffffff_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..42ccba269b6e91bef12ad0fa18be651b5ef0ee68 GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouqzpV=978O6-=0?FV^9z|eBtf= z|7WztIJ;WT>{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_glass_75_dadada_1x400.png b/gui/slick/css/lib/images/ui-bg_glass_75_dadada_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..5a46b47cb16631068aee9e0bd61269fc4e95e5cd GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|7{B978O6lPf+wIa#m9#>Unb zm^4K~wN3Zq+uPnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12VciT^vI^j=w#>k(V)1qW$CZ|6)SVV-&*#dav<$DMuV&n0Dbpw@aZZT>@%g@O1TaS?83{1OWG9bmjm6 literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/gui/slick/css/lib/images/ui-bg_highlight-soft_75_cccccc_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9fa6c6edcfcdd3e5b77e6f547b719e6fc66e30 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l#Zv1V~E7m9BNM+x59T>mw!NmKyGfIsM_0@nLT5w&yQ- z&Z`;Q+&%x{3GZQH&bH%vJpG3xnC}Q!>*kack(X%sUCxz~JfX=d#Wzp$PzmVOwwj literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-bg_highlight-soft_75_efefef_1x100.png b/gui/slick/css/lib/images/ui-bg_highlight-soft_75_efefef_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..265552081d58898bb3b85083e8294693bc528cca GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXfGaSV~TeDu&>UWWjYhKu>^OZRkK64Gj3;j+@GRWf8-faXyiF5x}D z|E-&(YhiguRNnMOt6oOG*pg;EwE z{F+v$vxBz*Xo+fxYeY#(Vo9o1a#1RfVlXl=G}bk+&^0m)F*LI>vam7$a?Py_3~Ua+ f_>H0=H$NpatrE8e-+2Mv~X5Kb-Sss2>Njblyij>12Ug#WtY}BSM#^Wz% zWOMiIhc#^vcgi0A{GUgk&uC9hQpM9lA71Gmex1paFC%d;CZ*!_(GTAY4qHpNl`DR6 zWGFG1y5rHqEr)>CsFt`!l%yn}eUBf}6wGbMcA=BH$)RpQprVVQRlsDZ)L)z4*}Q$iB}`;1#K literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-icons_222222_256x240.png b/gui/slick/css/lib/images/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..c1cb1170c8b3795835b8831ab81fa9ae63b606b1 GIT binary patch literal 6922 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 QJ~;stWz}Trq%1=J3#jBGg8%>k literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-icons_2e83ff_256x240.png b/gui/slick/css/lib/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..84b601bf0f726bf95801da487deaf2344a32e4b8 GIT binary patch literal 4549 zcmeHK_fr#0w@yL`C4e;PN)$zq7MdV6lwcrqkj_hxqSBk95FkiZx)cEg;gu=~5ouB+ z6hWGRp=l@)L3)uU1VTRa&U`cXhx;GgXLk0S-Pvc(?z1yz&UtKVe1nx)fEfS)ue-5sSDU*q&uA_^$iYBH`q)KEs@euwErLfRY0(1#rISo+aPme3jja6Jebk6?NN@* z#hd;JcZ>j++yLtZH6Cpg8g|}J!|?%oN?9H)v|o>ZQT*-LaOJ0^rBubXFqj(kLD_UJMQ}V=jE>zt4&o&-@Lq= zik3Np9XDyTG$8i7UtF9`AGi09bg5NFc0!mME*KyN<>26u1zk#AYhqFz7uNfX*!+2! zJfYdnQZ~@ZsV&LQZ3wy(ni!OsOBMlCg0?IXpJg=JJUB-|*MUslDQU*lFcDn-X9-MB zI*=c;-cUi-Uu0o^N^)wF3Y;6Py$Of@G%DiFwvYeK90=V~z&wEB(>rpPL~wbm1G;L( zTwFroER(ntbSrdNTH)9cv)H(tY^wVgUGe_Q`Q&73K{V16k@q_~U+bM9FuddH)*u6( z>4Gh#Aj3w0z=+|$b6?)U(1tz(U=mbrAS}msYrUaiGTkf3Okb@ufxr#R0JB^>N073a z^cs&Jzm|OlHSh(i?lHlGLC)RvryT-jbndG_qWz~gL8nsuMYE1(kLFS?q<{0=gI!6$ zLBQ3ZPt(m|SXF?hX@SC)@b{H8SF-H@u|3nhnm_`eU$=$ZGif}sQISZzOQ@iG%9z|0 zYi4!+I?&;<;OJ1N8zTqd3XV{%br592W6`dnl=DvR9TC)eY#aE%=o2Y2dQhA3M;4JP zDo|CJ5Yn#U^Hm3YvWs{;AAs0;1ilJzenZS_T5Tp=ekuIHNbi5dnX=rS&H6?hL`gP} zOe4P?50lMr7EpXxC(A$)YD42zQmlw&kc_c6d8~Y3gAA_hKWa&ub#_e6`++`SE$-!oDpa=J?txIm2D?1$C@l{mFhYepBcuPxCs9yKSS{mzH zExNUGt62TzU2FntqseVBo@eW4&T?%+3=>|7@Q_K#z#aJRIbijhic?|mKY($16fe_# zV5p4Ai|c%yGlM|2l#hgHTO3AW7YONN!8l4W+?(2K>41@2< zDq*W&h3_Q^xGqk%os!Tw@q8cqJjhe#lL0)EnG+4QZG=whwv*zdibt3@HuKL)0Bg}+ z>Mg{m++0J>vyMrY1vtz%6`d`-i9b9rJ>x_VmB>N zW^mW;U~x;Hf*t58r?QBje)~yjutyJ>+6h_;kBQwFSsDs*bpiA`=N0PLWe&>{YP8%HepZuQ zQ3ok5pKcslG;3oHi{Rv7xBD0zab*4CNNB;CUPh*+1Zm2RKTnvFbnP?wbZscY^P<0J z*|?G04|fZvi^U->jmBpTj z2kiF^K`s>AD=ap@6!bUqY=rN6+Z(#o*VH+cD!s{{hvy(PWCdV0aIN3p>|$03Q&uj5 zMQ4#|RTISsYqdi+A0MF9My1-u|zVl z13~+&Ag%IbHk3A}A!-bfzU4yyjGn+fEPT^n9Rlzu7@7OAz3XB`7-2YSlVfZQTx27i z-^}U-8sNUrbPREK&0%{C#%51SsO02FL=ao%3S5132Vi@bCIx(rRrqLiwiKG-NZxRq zqR-O)2Xr`-pPE_iggPbfx1N~>Uz*3MJ-rmi#OzF-pYKwK5DHxpD=AE35q6+HEp`q+ zr@Sy)cp$k<0Gtx9vII5;gzDR zz5yy;6D8MbhrxQkN2xh!CBNj*c0`>&xOdn=F%|=IX#@Cp;1iTk#ybf|jbPdL`e;BM zZVj&+_&A%zBQfvM$d#RzR_MGD^*s@!3@nt!5i4ZzcjOzuuI^#p{+YsnO(uqT`e>i1 zo1s5{3K^F8P7}_uv4lV!)HM-IV*FxV`>AdToaeCW-G$3d(eHGs?-o~_k--`U+=hAhy z>y!3|zTmF&aVcp`4$gf0L?b+x8%7N$IWXEwLAIvwaglA5+olz}Rg;&nSg@_BO7? zx!=kk28&Y#Yv2n%dS##9JmQ5~(-q#|_k1s_?CM|hHo>wvc`Okr=;#kZDYMM=QcH(6 zrf(4Sa%wkO8hX$KVRFj$-j&LN0P5q!s5AV6CIKr)^#SVxrTdig*DeY$xclK#g)BS% zk#~8wc(LF-eJZ^W;pO*2pVU!dqpvYiWSKdxU)JiyK?aiK3>$*@TU-oB=%@3htmfWW z^vY4~Qw?uH8_16GeSjk54z&ZU_MSFEcUZIP6uOd)4 zxb7<|Gf;8GhPTX3QX{<5&FyF%Tbc>bD%fW%?obzJa(#MaHjN46HMLKSu0WS<7(dzR zf3!42cfh?WlOHY~*LL{K#2(~IGf`iZM=pA?D_*hvdP(ya-BPVmn)fW=M>?-%M2H~w zSc!C=Llxtc^tYYJObm?InjIMjnB9u}o6+y%#PhSQs)SzDs15D)pl9rCq>&Fc!-q@h z#VZ$%1ZH!G0Pk~!JFK0;sEXLg+`xienG2eg8|~>={CvlX(y2UyK|1oY!+pC5!4|VN z@wl%+lnxAmws7l$q^s@qC)c#(@Fg<`kM~t(i%v2WJjh{X*PmdSlri*tG(uB0|zq>NV z!O6?;q+<7BKc6?8be;b+w~Rn7T2v`}zdhm)Pxh(=6=5@gmb)>+xn{rP9F;ubQ#V&; z-o#9dox9QMDQMHd`EpA*L0+W3VaLmMyKT*Bxa7erP+2#4#sf4{e?6Xr*%4tjVzLh@ zU?^ij-!pLv>2K4Wdc*x8;c96WgQtnX8SZalAVHyP1>E#i?htP7_@HkWXyBmc`GgHH}(A(+3VPA{smjz?G$Yqqv~9P6D8 z-<|ziz;ZlG1Yzgg=-j)~zAiC6)|e!{qD0+j!Gdt67t(bu%wQ9Nd zouo$xpXt%D0Wn?(kRh`n=yh%V;KD-M$_NVtsGP@zh(c=cV|=>LMFU#+vpG$TBSw=X zX#;-GS6Q-gIml9ccWmPzO&HGsq_ZRFfmytOoykCMRbe{F2k6#e^0`@hJ=`<}`1fi` zf+vfgs#L$wm=Bf%YlAI9#BVDtg$9fT7HwHX=HLF5@GOf#Okg%ToTg>{FvzBpb_obt zH@2!A;G^5^HE(rld#-k^$WOYRWCueG_Oq^ZWZTL)~e?S~dHhwC7=ZHRh zrk!EF>gQ*!yL&wNH+tahOouoz+z9%oCCbCh|knXKmcNFK^7FJ$uQn+rSl)p4D(9&X3o0 z_QTl6E*(d(HaMg?19n(0$!}A47*#ODU<0XhXCIB?J6DA3+t3ofXCiA!QO7g_9?QxE&;%|( zCB#lEXNt+0o}?8CrgjmoM+FZ9d*^3olg^ERe2)42i2rTONO}SH)FR2!s83D4K}Mfw z3`A!?} z%Rxw+AXn!gHx-uvw^IXs|MU z|2M%#{eko;f&Whg3t#u3VCMigfR?N8EjO6HxASc`b2n$#hyJ~8YNv+)`bcBlDs9Z8 F{{S81aohj^ literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-icons_454545_256x240.png b/gui/slick/css/lib/images/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..59bd45b907c4fd965697774ce8c5fc6b2fd9c105 GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@f3_WCF#rGn literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-icons_8c291d_256x240.png b/gui/slick/css/lib/images/ui-icons_8c291d_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..168def7426de04faf27d2a5bc4956e842b675175 GIT binary patch literal 4549 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 E087Rr^#A|> literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/images/ui-icons_cd0a0a_256x240.png b/gui/slick/css/lib/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5b6b0930f672fa08e9b9bdbe5e55370fd1dc30 GIT binary patch literal 4549 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 DTfr$v literal 0 HcmV?d00001 diff --git a/gui/slick/css/lib/jquery-ui-1.10.4.custom.css b/gui/slick/css/lib/jquery-ui-1.10.4.custom.css new file mode 100644 index 00000000..55170ddb --- /dev/null +++ b/gui/slick/css/lib/jquery-ui-1.10.4.custom.css @@ -0,0 +1,858 @@ +/*! jQuery UI - v1.10.4 - 2014-02-03 +* http://jqueryui.com +* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.tabs.css, jquery.ui.theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=%23ffffff&bgTextureHeader=flat&bgImgOpacityHeader=0&borderColorHeader=%23aaaaaa&fcHeader=%23222222&iconColorHeader=%23222222&bgColorContent=%23dcdcdc&bgTextureContent=highlight_soft&bgImgOpacityContent=75&borderColorContent=%23aaaaaa&fcContent=%23222222&iconColorContent=%23222222&bgColorDefault=%23efefef&bgTextureDefault=highlight_soft&bgImgOpacityDefault=75&borderColorDefault=%23aaaaaa&fcDefault=%23222222&iconColorDefault=%238c291d&bgColorHover=%23dddddd&bgTextureHover=highlight_soft&bgImgOpacityHover=75&borderColorHover=%23999999&fcHover=%23222222&iconColorHover=%23222222&bgColorActive=%23dfdfdf&bgTextureActive=inset_soft&bgImgOpacityActive=75&borderColorActive=%23aaaaaa&fcActive=%23140f06&iconColorActive=%238c291d&bgColorHighlight=%23fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=%23aaaaaa&fcHighlight=%23363636&iconColorHighlight=%232e83ff&bgColorError=%23fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=%23aaaaaa&fcError=%238c291d&iconColorError=%23cd0a0a&bgColorOverlay=%23aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=35&bgColorShadow=%23000000&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=35&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px&ctl=themeroller +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-clearfix { + min-height: 0; /* support: IE7 */ +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + filter:Alpha(Opacity=0); +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; +} + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-button { + display: inline-block; + position: relative; + padding: 0; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + overflow: visible; /* removes extra width in IE */ +} +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2.2em; +} +/* button elements seem to need a little more width */ +button.ui-button-icon-only { + width: 2.4em; +} +.ui-button-icons-only { + width: 3.4em; +} +button.ui-button-icons-only { + width: 3.7em; +} + +/* button text element */ +.ui-button .ui-button-text { + display: block; + line-height: normal; +} +.ui-button-text-only .ui-button-text { + padding: .4em 1em; +} +.ui-button-icon-only .ui-button-text, +.ui-button-icons-only .ui-button-text { + padding: .4em; + text-indent: -9999999px; +} +.ui-button-text-icon-primary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 1em .4em 2.1em; +} +.ui-button-text-icon-secondary .ui-button-text, +.ui-button-text-icons .ui-button-text { + padding: .4em 2.1em .4em 1em; +} +.ui-button-text-icons .ui-button-text { + padding-left: 2.1em; + padding-right: 2.1em; +} +/* no icon support for input elements, provide padding by default */ +input.ui-button { + padding: .4em 1em; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon, +.ui-button-text-icon-primary .ui-icon, +.ui-button-text-icon-secondary .ui-icon, +.ui-button-text-icons .ui-icon, +.ui-button-icons-only .ui-icon { + position: absolute; + top: 50%; + margin-top: -8px; +} +.ui-button-icon-only .ui-icon { + left: 50%; + margin-left: -8px; +} +.ui-button-text-icon-primary .ui-button-icon-primary, +.ui-button-text-icons .ui-button-icon-primary, +.ui-button-icons-only .ui-button-icon-primary { + left: .5em; +} +.ui-button-text-icon-secondary .ui-button-icon-secondary, +.ui-button-text-icons .ui-button-icon-secondary, +.ui-button-icons-only .ui-button-icon-secondary { + right: .5em; +} + +/* button sets */ +.ui-buttonset { + margin-right: 7px; +} +.ui-buttonset .ui-button { + margin-left: 0; + margin-right: -.3em; +} + +/* workarounds */ +/* reset extra padding in Firefox, see h5bp.com/l */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-dialog { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-se { + width: 12px; + height: 12px; + right: -5px; + bottom: -5px; + background-position: 16px 16px; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-menu { + list-style: none; + padding: 2px; + margin: 0; + display: block; + outline: none; +} +.ui-menu .ui-menu { + margin-top: -3px; + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + padding: 0; + width: 100%; + /* support: IE10, see #8844 */ + list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); +} +.ui-menu .ui-menu-divider { + margin: 5px -2px 5px -2px; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-menu-item a { + text-decoration: none; + display: block; + padding: 2px .4em; + line-height: 1.5; + min-height: 0; /* support: IE7 */ + font-weight: normal; +} +.ui-menu .ui-menu-item a.ui-state-focus, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} + +.ui-menu .ui-state-disabled { + font-weight: normal; + margin: .4em 0 .2em; + line-height: 1.5; +} +.ui-menu .ui-state-disabled a { + cursor: default; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item a { + position: relative; + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: .2em; + left: .2em; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + position: static; + float: right; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + /* background: url("images/animated-overlay.gif"); */ + height: 100%; + filter: alpha(opacity=25); + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Verdana,Arial,sans-serif; + font-size: 1.1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Verdana,Arial,sans-serif; + font-size: 1em; +} +.ui-widget-content { + border: 1px solid #aaaaaa; + /* background: #dcdcdc url(images/ui-bg_highlight-soft_75_dcdcdc_1x100.png) 50% top repeat-x; */ + color: #222222; +} +.ui-widget-content a { + color: #222222; +} +.ui-widget-header { + border: 1px solid #aaaaaa; + /* background: #ffffff url(images/ui-bg_flat_0_ffffff_40x100.png) 50% 50% repeat-x; */ + color: #222222; + font-weight: bold; +} +.ui-widget-header a { + color: #222222; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default { + border: 1px solid #aaaaaa; + /* background: #efefef url(images/ui-bg_highlight-soft_75_efefef_1x100.png) 50% 50% repeat-x; */ + font-weight: bold; + color: #222222; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited { + color: #222222; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus { + border: 1px solid #999999; + /* background: #dddddd url(images/ui-bg_highlight-soft_75_dddddd_1x100.png) 50% 50% repeat-x; */ + font-weight: bold; + color: #222222; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited { + color: #222222; + text-decoration: none; +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active { + border: 1px solid #aaaaaa; + background: #dfdfdf url(images/ui-bg_inset-soft_75_dfdfdf_1x100.png) 50% 50% repeat-x; + font-weight: bold; + color: #140f06; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #140f06; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #aaaaaa; + /* background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; */ + color: #363636; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #363636; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #aaaaaa; + /* background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; */ + color: #8c291d; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #8c291d; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #8c291d; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + filter:Alpha(Opacity=70); + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + filter:Alpha(Opacity=35); + background-image: none; +} +.ui-state-disabled .ui-icon { + filter:Alpha(Opacity=35); /* For IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +/* +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-widget-header .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-state-default .ui-icon { + background-image: url(images/ui-icons_8c291d_256x240.png); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon { + background-image: url(images/ui-icons_222222_256x240.png); +} +.ui-state-active .ui-icon { + background-image: url(images/ui-icons_8c291d_256x240.png); +} +.ui-state-highlight .ui-icon { + background-image: url(images/ui-icons_2e83ff_256x240.png); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url(images/ui-icons_cd0a0a_256x240.png); +} +*/ + +/* positioning */ +.ui-icon-blank { background-position: 16px 16px; } +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 4px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 4px; +} + +/* Overlays */ +.ui-widget-overlay { + /* background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; */ + opacity: .35; + filter: Alpha(Opacity=35); +} +.ui-widget-shadow { + margin: -8px 0 0 -8px; + padding: 8px; + /* background: #000000 url(images/ui-bg_flat_0_000000_40x100.png) 50% 50% repeat-x; */ + opacity: .35; + filter: Alpha(Opacity=35); + border-radius: 8px; +} diff --git a/gui/slick/css/lib/jquery-ui-1.8.17.custom.css b/gui/slick/css/lib/jquery-ui-1.8.17.custom.css new file mode 100644 index 00000000..620035d1 --- /dev/null +++ b/gui/slick/css/lib/jquery-ui-1.8.17.custom.css @@ -0,0 +1,567 @@ +/*! + * jQuery UI CSS Framework 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } +.ui-helper-clearfix:after { clear: both; } +.ui-helper-clearfix { zoom: 1; } +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + + +/*! + * jQuery UI CSS Framework 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } +.ui-widget-content a { color: #222222; } +.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } +.ui-pnotify-icon span { background-image: url(images/ui-icons_222222_256x240.png) !important;} + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/*! + * jQuery UI Resizable 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*! + * jQuery UI Selectable 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/*! + * jQuery UI Accordion 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/*! + * jQuery UI Autocomplete 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.20 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/*! + * jQuery UI Button 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/*! + * jQuery UI Dialog 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/*! + * jQuery UI Slider 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/*! + * jQuery UI Tabs 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: 0em; zoom: 1; background: transparent; border: none;} /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: 0; background: none; border:none;} +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap;background: #FFF; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; font-weight: normal; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; background-color: #f7f7f7; border-color: #CCC; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a { color: #454545; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: #f7f7f7; border: 1px solid #CCC; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/*! + * jQuery UI Datepicker 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/*! + * jQuery UI Progressbar 1.8.20 + * + * Copyright 2012, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; overflow: hidden; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } \ No newline at end of file diff --git a/gui/slick/css/lib/jquery.pnotify.default.css b/gui/slick/css/lib/jquery.pnotify.default.css new file mode 100644 index 00000000..5fc8b5b9 --- /dev/null +++ b/gui/slick/css/lib/jquery.pnotify.default.css @@ -0,0 +1,101 @@ +/* + Document : jquery.pnotify.default.css + Created on : Nov 23, 2009, 3:14:10 PM + Author : Hunter Perrin + Version : 1.0.0 + Description: + Default styling for Pines Notify jQuery plugin. +*/ + +/* Notice +----------------------------------*/ +.ui-pnotify { + position: fixed; + right: 10px; + bottom: 10px; + /* Ensure that the notices are on top of everything else. */ + z-index: 9999; +} +/* This hides position: fixed from IE6, which doesn't understand it. */ +html > body .ui-pnotify { + position: fixed; +} +.ui-pnotify .ui-widget { + background: none; +} +.ui-pnotify-container { + background-position: 0 0; + border: 1px solid #cccccc; + background-image: -moz-linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: -webkit-linear-gradient(#fdf0d5, #fff9ee) !important; + background-image: -o-linear-gradient(#fdf0d5, #fff9ee) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -moz-border-radius: 7px; + -webkit-border-radius: 7px; + border-radius: 7px; + font-size: 14px; + -moz-box-shadow: 0px 0px 2px #aaaaaa; + -webkit-box-shadow: 0px 0px 2px #aaaaaa; + -o-box-shadow: 0px 0px 2px #aaaaaa; + box-shadow: 0px 0px 2px #aaaaaa; + padding: 7px 10px; + text-align: center; + min-height: 22px; + width: 250px; + z-index: 9999; + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + line-height: normal; + filter: alpha(opacity=85); + -moz-opacity: 0.8 !important; + -khtml-opacity: 0.8 !important; + -o-opacity: 0.8 !important; + opacity: 0.8 !important; +} +.ui-pnotify-closer { + float: right; + margin-left: .2em; +} +.ui-pnotify-title { + display: block; + background: none; + font-size: 14px; + font-weight: bold; + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + line-height: normal; +} +.ui-pnotify-text { + display: block; + font-size: 14px; + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif; + line-height: normal; +} +.ui-pnotify-icon, .ui-pnotify-icon span { + display: block; + float: left; + margin-right: .2em; +} +/* History Pulldown +----------------------------------*/ +.ui-pnotify-history-container { + position: absolute; + top: 0; + right: 18px; + width: 70px; + border-top: none; + /* Ensure that the history container is on top of the notices. */ + z-index: 10000; +} +.ui-pnotify-history-container .ui-pnotify-history-header { + /*padding: 2px;*/ +} +.ui-pnotify-history-container button { + cursor: pointer; + display: block; + width: 100%; +} +.ui-pnotify-history-container .ui-pnotify-history-pulldown { + display: block; + margin: 0 auto; +} diff --git a/gui/slick/css/lib/jquery.qtip-2.0.1.min.css b/gui/slick/css/lib/jquery.qtip-2.0.1.min.css new file mode 100644 index 00000000..9e1ab087 --- /dev/null +++ b/gui/slick/css/lib/jquery.qtip-2.0.1.min.css @@ -0,0 +1 @@ +/*! qTip2 v2.0.1 (includes: svg ajax tips modal viewport imagemap ie6 / basic css3) | qtip2.com | Licensed MIT, GPL | Mon Dec 31 2012 14:55:17 */.qtip,.qtip{position:absolute;left:-28000px;top:-28000px;display:none;max-width:280px;min-width:50px;font-size:10.5px;line-height:12px;direction:ltr}.qtip-content{position:relative;padding:5px 9px;overflow:hidden;text-align:left;word-wrap:break-word}.qtip-titlebar{position:relative;padding:5px 35px 5px 10px;overflow:hidden;border-width:0 0 1px;font-weight:700}.qtip-titlebar+.qtip-content{border-top-width:0!important}.qtip-close{position:absolute;right:-9px;top:-9px;cursor:pointer;outline:medium none;border-width:1px;border-style:solid;border-color:transparent}.qtip-titlebar .qtip-close{right:4px;top:50%;margin-top:-9px}* html .qtip-titlebar .qtip-close{top:16px}.qtip-titlebar .ui-icon,.qtip-icon .ui-icon{display:block;text-indent:-1000em;direction:ltr;vertical-align:middle}.qtip-icon,.qtip-icon .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;text-decoration:none}.qtip-icon .ui-icon{width:18px;height:14px;text-align:center;text-indent:0;font:normal bold 10px/13px Tahoma,sans-serif;color:inherit;background:transparent none no-repeat -100em -100em}.qtip-focus{}.qtip-hover{}.qtip-default{border-width:1px;border-style:solid;border-color:#F1D031;background-color:#FFFFA3;color:#555}.qtip-default .qtip-titlebar{background-color:#FFEF93}.qtip-default .qtip-icon{border-color:#CCC;background:#F1F1F1;color:#777}.qtip-default .qtip-titlebar .qtip-close{border-color:#AAA;color:#111}/*! Light tooltip style */.qtip-light{background-color:#fff;border-color:#E2E2E2;color:#454545}.qtip-light .qtip-titlebar{background-color:#f1f1f1}/*! Dark tooltip style */.qtip-dark{background-color:#505050;border-color:#303030;color:#f3f3f3}.qtip-dark .qtip-titlebar{background-color:#404040}.qtip-dark .qtip-icon{border-color:#444}.qtip-dark .qtip-titlebar .ui-state-hover{border-color:#303030}/*! Cream tooltip style */.qtip-cream{background-color:#FBF7AA;border-color:#F9E98E;color:#A27D35}.qtip-cream .qtip-titlebar{background-color:#F0DE7D}.qtip-cream .qtip-close .qtip-icon{background-position:-82px 0}/*! Red tooltip style */.qtip-red{background-color:#F78B83;border-color:#D95252;color:#912323}.qtip-red .qtip-titlebar{background-color:#F06D65}.qtip-red .qtip-close .qtip-icon{background-position:-102px 0}.qtip-red .qtip-icon{border-color:#D95252}.qtip-red .qtip-titlebar .ui-state-hover{border-color:#D95252}/*! Green tooltip style */.qtip-green{background-color:#CAED9E;border-color:#90D93F;color:#3F6219}.qtip-green .qtip-titlebar{background-color:#B0DE78}.qtip-green .qtip-close .qtip-icon{background-position:-42px 0}/*! Blue tooltip style */.qtip-blue{background-color:#E5F6FE;border-color:#ADD9ED;color:#5E99BD}.qtip-blue .qtip-titlebar{background-color:#D0E9F5}.qtip-blue .qtip-close .qtip-icon{background-position:-2px 0}.qtip-shadow{-webkit-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);-moz-box-shadow:1px 1px 3px 1px rgba(0,0,0,.15);box-shadow:1px 1px 3px 1px rgba(0,0,0,.15)}.qtip-rounded,.qtip-tipsy,.qtip-bootstrap{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.qtip-youtube{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 3px #333;-moz-box-shadow:0 0 3px #333;box-shadow:0 0 3px #333;color:#fff;border-width:0;background:#4A4A4A;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,black));background-image:-webkit-linear-gradient(top,#4A4A4A 0,black 100%);background-image:-moz-linear-gradient(top,#4A4A4A 0,black 100%);background-image:-ms-linear-gradient(top,#4A4A4A 0,black 100%);background-image:-o-linear-gradient(top,#4A4A4A 0,black 100%)}.qtip-youtube .qtip-titlebar{background-color:#4A4A4A;background-color:rgba(0,0,0,0)}.qtip-youtube .qtip-content{padding:.75em;font:12px arial,sans-serif;filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);-ms-filter:"progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#4a4a4a, EndColorStr=#000000);"}.qtip-youtube .qtip-icon{border-color:#222}.qtip-youtube .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-jtools{background:#232323;background:rgba(0,0,0,.7);background-image:-webkit-gradient(linear,left top,left bottom,from(#717171),to(#232323));background-image:-moz-linear-gradient(top,#717171,#232323);background-image:-webkit-linear-gradient(top,#717171,#232323);background-image:-ms-linear-gradient(top,#717171,#232323);background-image:-o-linear-gradient(top,#717171,#232323);border:2px solid #ddd;border:2px solid rgba(241,241,241,1);-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 0 12px #333;-moz-box-shadow:0 0 12px #333;box-shadow:0 0 12px #333}.qtip-jtools .qtip-titlebar{background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171, endColorstr=#4A4A4A)"}.qtip-jtools .qtip-content{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A, endColorstr=#232323)"}.qtip-jtools .qtip-titlebar,.qtip-jtools .qtip-content{background:transparent;color:#fff;border:0 dashed transparent}.qtip-jtools .qtip-icon{border-color:#555}.qtip-jtools .qtip-titlebar .ui-state-hover{border-color:#333}.qtip-cluetip{-webkit-box-shadow:4px 4px 5px rgba(0,0,0,.4);-moz-box-shadow:4px 4px 5px rgba(0,0,0,.4);box-shadow:4px 4px 5px rgba(0,0,0,.4);background-color:#D9D9C2;color:#111;border:0 dashed transparent}.qtip-cluetip .qtip-titlebar{background-color:#87876A;color:#fff;border:0 dashed transparent}.qtip-cluetip .qtip-icon{border-color:#808064}.qtip-cluetip .qtip-titlebar .ui-state-hover{border-color:#696952;color:#696952}.qtip-tipsy{background:#000;background:rgba(0,0,0,.87);color:#fff;border:0 solid transparent;font-size:11px;font-family:'Lucida Grande',sans-serif;font-weight:700;line-height:16px;text-shadow:0 1px black}.qtip-tipsy .qtip-titlebar{padding:6px 35px 0 10;background-color:transparent}.qtip-tipsy .qtip-content{padding:6px 10}.qtip-tipsy .qtip-icon{border-color:#222;text-shadow:none}.qtip-tipsy .qtip-titlebar .ui-state-hover{border-color:#303030}.qtip-tipped{border:3px solid #959FA9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-color:#F9F9F9;color:#454545;font-weight:400;font-family:serif}.qtip-tipped .qtip-titlebar{border-bottom-width:0;color:#fff;background:#3A79B8;background-image:-webkit-gradient(linear,left top,left bottom,from(#3A79B8),to(#2E629D));background-image:-webkit-linear-gradient(top,#3A79B8,#2E629D);background-image:-moz-linear-gradient(top,#3A79B8,#2E629D);background-image:-ms-linear-gradient(top,#3A79B8,#2E629D);background-image:-o-linear-gradient(top,#3A79B8,#2E629D);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8, endColorstr=#2E629D)"}.qtip-tipped .qtip-icon{border:2px solid #285589;background:#285589}.qtip-tipped .qtip-icon .ui-icon{background-color:#FBFBFB;color:#555}.qtip-bootstrap{font-size:14px;line-height:20px;color:#333;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.qtip-bootstrap .qtip-titlebar{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.qtip-bootstrap .qtip-titlebar .qtip-close{right:11px;top:45%;border-style:none}.qtip-bootstrap .qtip-content{padding:9px 14px}.qtip-bootstrap .qtip-icon{background:transparent}.qtip-bootstrap .qtip-icon .ui-icon{width:auto;height:auto;float:right;font-size:20px;font-weight:700;line-height:18px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.qtip-bootstrap .qtip-icon .ui-icon:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}.qtip:not(.ie9haxors) div.qtip-content,.qtip:not(.ie9haxors) div.qtip-titlebar{filter:none;-ms-filter:none}.qtip .qtip-tip{margin:0 auto;overflow:hidden;z-index:10}.qtip .qtip-tip,.qtip .qtip-tip .qtip-vml{position:absolute;color:#123456;background:transparent;border:0 dashed transparent}.qtip .qtip-tip canvas{top:0;left:0}.qtip .qtip-tip .qtip-vml{behavior:url(#default#VML);display:inline-block;visibility:visible}#qtip-overlay{position:fixed;left:-10000em;top:-10000em}#qtip-overlay.blurs{cursor:pointer}#qtip-overlay div{position:absolute;left:0;top:0;width:100%;height:100%;background-color:#000;opacity:.7;filter:alpha(opacity=70);-ms-filter:"alpha(Opacity=70)"}.qtipmodal-ie6fix{position:absolute!important} \ No newline at end of file diff --git a/gui/slick/css/lib/tablesorter.css b/gui/slick/css/lib/tablesorter.css new file mode 100644 index 00000000..591dc7a8 --- /dev/null +++ b/gui/slick/css/lib/tablesorter.css @@ -0,0 +1,100 @@ +/* Variables *//* Mixins */ +/* SB Theme */ +table.tablesorter { + width: 100%; + margin-left: auto; + margin-right: auto; + text-align: left; + color: #000; + background-color: #fff; + border-spacing: 0; +} +table.tablesorter td { + font-size: 14px; + padding: 8px 10px; +} +/* remove extra border from left edge */ +table.tablesorter th:first-child, +table.tablesorter td:first-child { + border-left: none; +} +table.tablesorter th { + border-collapse: collapse; + background-image: -moz-linear-gradient(#555555, #333333) !important; + background-image: linear-gradient(#555555, #333333) !important; + background-image: -webkit-linear-gradient(#555555, #333333) !important; + background-image: -o-linear-gradient(#555555, #333333) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + color: #fff; +} +table.tablesorter .tablesorter-header { + /* background-image: url(../images/tablesorter/bg.gif); */ + + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter .tablesorter-header-inner { + padding: 0px 15px 0px 4px; +} +table.tablesorter th.tablesorter-headerSortUp .tablesorter-header-inner { + background: url(../lib/images/tablesorter/asc.gif) no-repeat right center; +} +table.tablesorter th.tablesorter-headerSortDown .tablesorter-header-inner { + background: url(../lib/images/tablesorter/desc.gif) no-repeat right center; +} +table.tablesorter th.tablesorter-headerSortUp { + background-image: -moz-linear-gradient(#777777, #555555) !important; + background-image: linear-gradient(#777777, #555555) !important; + background-image: -webkit-linear-gradient(#777777, #555555) !important; + background-image: -o-linear-gradient(#777777, #555555) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + color: #FFFFFF; + /* background-image: url(../images/tablesorter/asc.gif); */ + +} +table.tablesorter th.tablesorter-headerSortDown { + background-image: -moz-linear-gradient(#777777, #555555) !important; + background-image: linear-gradient(#777777, #555555) !important; + background-image: -webkit-linear-gradient(#777777, #555555) !important; + background-image: -o-linear-gradient(#777777, #555555) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#555555, endColorstr=#333333) !important; + color: #FFFFFF; + /* background-image: url(../images/tablesorter/desc.gif); */ + +} +/* Zebra Widget - row alternating colors */ +table.tablesorter tr.odd td { + background-color: #F5F1E4; +} +table.tablesorter tr.even td { + background-color: #fbf9f3; +} +/* filter widget */ +table.tablesorter input.tablesorter-filter { + width: 98%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +table.tablesorter tr.tablesorter-filter, +table.tablesorter tr.tablesorter-filter td { + text-align: center; + background: #eee; +} +/* optional disabled input styling */table.tablesorter input.tablesorter-filter.disabled { + display: none; +} +/* xtra css for sb */ +.tablesorter-header-inner { + text-align: center; + white-space: nowrap; + padding: 0 2px; +} +tr.tablesorter-stickyHeader { + background-color: #fff; + padding: 2px 0; +} diff --git a/gui/slick/css/superfish.css b/gui/slick/css/superfish.css new file mode 100644 index 00000000..90a7564a --- /dev/null +++ b/gui/slick/css/superfish.css @@ -0,0 +1,285 @@ +/* Variables *//* Mixins */ +/*** ESSENTIAL STYLES ***/ +.sf-menu ul { + background: #F5F1E4; + position: absolute; + top: -999em; + padding: 0; + -moz-border-radius-bottomleft: 5px; + -moz-border-radius-bottomright: 5px; + -webkit-border-bottom-right-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + border: 1px solid #ccc; + width: 10em; + /* left offset of submenus need to match (see below) */ + +} +.sf-menu ul li a { + padding-left: 28px; +} +.sf-menu ul li a img { + position: absolute; + margin-top: -1px; + margin-left: -22px; + z-index: 99; +} +.sf-menu ul li { + width: 100%; +} +.sf-menu li.spacer, +.sf-menu li.spacer:hover { + background-color: #57442B; + width: 15px; +} +.sf-menu .first { + margin-left: 0px; +} +.sf-menu .navIcon { + padding: 0.6em 1em 0.55em; +} +.sf-menu li:hover { + visibility: inherit; + /* fixes IE7 'sticky bug' */ + +} +.sf-menu li { + float: left; + position: relative; +} +.sf-menu a { + display: block; + position: relative; +} +.sf-menu li:hover ul, +.sf-menu li.sfHover ul { + left: 0; + top: 3.2em; + /* match top ul list item height */ + + z-index: 99; +} +ul.sf-menu li:hover li ul, +ul.sf-menu li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li:hover ul, +ul.sf-menu li li.sfHover ul { + left: 10em; + /* match ul width */ + + top: 0; +} +ul.sf-menu li li:hover li ul, +ul.sf-menu li li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li li:hover ul, +ul.sf-menu li li li.sfHover ul { + left: 10em; + /* match ul width */ + + top: 0; +} +.sf-menu li.current > a { + color: #bde433; +} +.sf-menu { + float: left; + /*margin-bottom: 1em;*/ + + line-height: 1em; +} +.sf-menu a { + border-right: 1px solid #ccc; + padding: .75em 1em; + text-decoration: none; +} +.sf-menu li a { + border: 1px solid transparent; + color: #FFFFFF; + display: block; + padding-bottom: 12px; + padding-top: 12px; + padding-left: 10px; + padding-right: 10px; + font-size: 15px; + font-weight: normal; + text-shadow: 1px 1px 0 #000; + text-transform: capitalize; +} +.sf-menu li a.log { + font-size: 11px; + padding-top: 10px; + padding-left: 15px; + padding-bottom: 11px; + line-height: 19px; + padding-right: 23px; +} +.sf-menu li a.config { + height: 28px; + width: 10px; +} +.sf-menu li a.config img { + left: -7px; + position: relative; + top: -14px; +} +.sf-menu li li a, +.sf-menu li li li a { + text-shadow: none; +} +.sf-menu a, +.sf-menu a:visited { + /* visited pseudo selector so IE6 applies text colour*/ + + color: #FFFFFF; +} +.sf-menu li { + display: block; + float: left; + margin: 8px 0 0; + text-align: center; +} +.sf-menu li li { + padding: 0; + margin: 0; + text-align: left; + /* alt row light brown */ +} +.sf-menu li li li { + background: #F5F1E4; + /* even row tan */ +} +.sf-menu li li a, +.sf-menu li li a:visited { + color: #000; +} +.sf-menu li li a:hover { + color: #343434; +} +.sf-menu li li li a, +.sf-menu li li li a:visited { + color: #000; +} +.sf-menu li li li a:hover { + color: #343434; +} +.sf-menu li:hover, +.sf-menu li.sfHover, +.sf-menu a:focus, +.sf-menu a:hover, +.sf-menu a:active { + outline: 0; +} +.sf-menu li a:hover { + background-image: -moz-linear-gradient(#777777, #555555) !important; + background-image: linear-gradient(#777777, #555555) !important; + background-image: -webkit-linear-gradient(#777777, #555555) !important; + background-image: -o-linear-gradient(#777777, #555555) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#777777, endColorstr=#555555) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#777777, endColorstr=#555555) !important; + border: 1px solid #777777; + border-radius: 3px 3px 3px 3px; + -moz-box-shadow: 0 1px 0 #888888 inset; + -webkit-box-shadow: 0 1px 0 #888888 inset; + -o-box-shadow: 0 1px 0 #888888 inset; + box-shadow: 0 1px 0 #888888 inset; +} +.sf-menu li ul li a { + font-size: 14px; + font-weight: normal; +} +.sf-menu li ul li a:hover { + background-image: -moz-linear-gradient(#555555, #333333) !important; + background-image: linear-gradient(#555555, #333333) !important; + background-image: -webkit-linear-gradient(#555555, #333333) !important; + background-image: -o-linear-gradient(#555555, #333333) !important; + filter: progid:dximagetransform.microsoft.gradient(startColorstr=#777777, endColorstr=#555555) !important; + -ms-filter: progid:dximagetransform.microsoft.gradient(startColorstr=#777777, endColorstr=#555555) !important; + color: #FFF !important; + text-shadow: none; + border: 1px solid transparent; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + -moz-box-shadow: none; + -webkit-box-shadow: none; + -o-box-shadow: none; + box-shadow: none; +} +/*** arrows **/ +.sf-menu a.sf-with-ul { + padding-right: 1.8em; + min-width: 1px; + /* trigger IE7 hasLayout so spans position accurately */ + +} +.sf-sub-indicator { + position: absolute; + display: block; + right: .75em; + top: 1.05em; + /* IE6 only */ + + width: 10px; + height: 10px; + text-indent: -999em; + overflow: hidden; + /* + background: url('/images/arrows.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */ + +} +a > .sf-sub-indicator { + /* give all except IE6 the correct values */ + + top: 14px; + background-position: 0 -100px; + /* use translucent arrow for modern browsers*/ + +} +/* apply hovers to modern browsers */ +a:focus > .sf-sub-indicator, +a:hover > .sf-sub-indicator, +a:active > .sf-sub-indicator, +li:hover > a > .sf-sub-indicator, +li.sfHover > a > .sf-sub-indicator { + background-position: -10px -100px; + /* arrow hovers for modern browsers*/ + +} +/* point right for anchors in subs */ +.sf-menu ul .sf-sub-indicator { + background-position: -10px 0; +} +.sf-menu ul a > .sf-sub-indicator { + background-position: 0 0; +} +/* apply hovers to modern browsers */ +.sf-menu ul a:focus > .sf-sub-indicator, +.sf-menu ul a:hover > .sf-sub-indicator, +.sf-menu ul a:active > .sf-sub-indicator, +.sf-menu ul li:hover > a > .sf-sub-indicator, +.sf-menu ul li.sfHover > a > .sf-sub-indicator { + background-position: -10px 0; + /* arrow hovers for modern browsers*/ + +} +/*** shadows for all but IE6 ***/ +.sf-shadow ul { + /* + background: url('/images/shadow.png') no-repeat bottom right; +*/ + + padding: 0 8px 9px 0; + -moz-border-radius-bottomleft: 17px; + -moz-border-radius-topright: 17px; + -webkit-border-top-right-radius: 17px; + -webkit-border-bottom-left-radius: 17px; +} +.sf-shadow ul.sf-shadow-off { + background: transparent; +} diff --git a/gui/slick/css/superfish.less b/gui/slick/css/superfish.less new file mode 100644 index 00000000..9000efed --- /dev/null +++ b/gui/slick/css/superfish.less @@ -0,0 +1,211 @@ +// Config +@import "config.less"; + +/*** ESSENTIAL STYLES ***/ + +.sf-menu ul { + background: #F5F1E4; + position: absolute; + top: -999em; + padding: 0; + border: 1px solid #ccc; + width: 10em; /* left offset of submenus need to match (see below) */ +} +.sf-menu ul li a {padding-left: 28px;} +.sf-menu ul li a img {position:absolute;margin-top:-2px;margin-left:-22px;z-index:99;} + +.sf-menu ul li { + width: 100%; +} +.sf-menu li.spacer,.sf-menu li.spacer:hover { + background-color:#57442B; + width:15px; +} +.sf-menu .first { +margin-left:0px; +} +.sf-menu .navIcon { + padding: 0.6em 1em 0.55em; +} +.sf-menu li:hover { + visibility: inherit; /* fixes IE7 'sticky bug' */ +} +.sf-menu li { + float: left; + position: relative; +} +.sf-menu a { + display: block; + position: relative; +} +.sf-menu li:hover ul, +.sf-menu li.sfHover ul { + left: 0; + top: 3.2em; /* match top ul list item height */ + z-index: 99; +} +ul.sf-menu li:hover li ul, +ul.sf-menu li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li:hover ul, +ul.sf-menu li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} +ul.sf-menu li li:hover li ul, +ul.sf-menu li li.sfHover li ul { + top: -999em; +} +ul.sf-menu li li li:hover ul, +ul.sf-menu li li li.sfHover ul { + left: 10em; /* match ul width */ + top: 0; +} + +.sf-menu li.current > a { + color: @swatch-green; +} + + +.sf-menu { + float: left; + /*margin-bottom: 1em;*/ + line-height: 1em; +} +.sf-menu a { + border-right: 1px solid #ccc; + padding: .75em 1em; + text-decoration:none; +} +.sf-menu li a { + border: 1px solid transparent; + color: #FFFFFF; + display: block; + padding-bottom: 12px; + padding-top: 12px; + padding-left: 10px; + padding-right: 10px; + font-size: 15px; + font-weight: normal; + text-shadow: 1px 1px 0 #000; + text-transform: capitalize; +} +.sf-menu li a.log { + font-size: 11px; + padding-top: 10px; + padding-left: 15px; + padding-bottom: 11px; + line-height: 19px; + padding-right: 23px; +} + +.sf-menu li a.config { + height: 28px; + width: 10px; +} +.sf-menu li a.config img { + left: -7px; + position: relative; + top: -14px; +} +.sf-menu li li a, .sf-menu li li li a { + text-shadow: none; +} +.sf-menu a, .sf-menu a:visited { /* visited pseudo selector so IE6 applies text colour*/ + color: #FFFFFF; +} +.sf-menu li { display: block; + float: left; + margin: 8px 0 0; + text-align: center;} +.sf-menu li li { padding: 0; margin: 0; text-align: left; /* alt row light brown */ } +.sf-menu li li li { background: #F5F1E4; /* even row tan */ } + +.sf-menu li li a,.sf-menu li li a:visited { color: #000; } +.sf-menu li li a:hover { color: #343434; } + +.sf-menu li li li a,.sf-menu li li li a:visited { color: #000; } +.sf-menu li li li a:hover { color: #343434; } + + +.sf-menu li:hover, .sf-menu li.sfHover, +.sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active { + outline: 0; +} +.sf-menu li a:hover { + //-moz-transition: color 0.2s ease-in 0s; + .gradient(#777777, #555555); + border: 1px solid #777777; + border-radius: 3px 3px 3px 3px; + .shadow(0 1px 0 #888888 inset); +} +.sf-menu li ul li a { + font-size: 14px; + font-weight: normal; +} +.sf-menu li ul li a:hover { + .gradient(#555555, #333333); + color: #FFF !important; + text-shadow: none; + border: 1px solid transparent; + .rounded(0); + .shadow(none); +} +/*** arrows **/ +.sf-menu a.sf-with-ul { + padding-right: 1.8em; + min-width: 1px; /* trigger IE7 hasLayout so spans position accurately */ +} +.sf-sub-indicator { + position: absolute; + display: block; + right: .75em; + top: 1.05em; /* IE6 only */ + width: 10px; + height: 10px; + text-indent: -999em; + overflow: hidden; +/* + background: url('/images/arrows.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */ + +} +a > .sf-sub-indicator { /* give all except IE6 the correct values */ + top: 14px; + background-position: 0 -100px; /* use translucent arrow for modern browsers*/ +} +/* apply hovers to modern browsers */ +a:focus > .sf-sub-indicator, +a:hover > .sf-sub-indicator, +a:active > .sf-sub-indicator, +li:hover > a > .sf-sub-indicator, +li.sfHover > a > .sf-sub-indicator { + background-position: -10px -100px; /* arrow hovers for modern browsers*/ +} + +/* point right for anchors in subs */ +.sf-menu ul .sf-sub-indicator { background-position: -10px 0; } +.sf-menu ul a > .sf-sub-indicator { background-position: 0 0; } +/* apply hovers to modern browsers */ +.sf-menu ul a:focus > .sf-sub-indicator, +.sf-menu ul a:hover > .sf-sub-indicator, +.sf-menu ul a:active > .sf-sub-indicator, +.sf-menu ul li:hover > a > .sf-sub-indicator, +.sf-menu ul li.sfHover > a > .sf-sub-indicator { + background-position: -10px 0; /* arrow hovers for modern browsers*/ +} + +/*** shadows for all but IE6 ***/ +.sf-shadow ul { +/* + background: url('/images/shadow.png') no-repeat bottom right; +*/ + padding: 0 8px 9px 0; + -moz-border-radius-bottomleft: 17px; + -moz-border-radius-topright: 17px; + -webkit-border-top-right-radius: 17px; + -webkit-border-bottom-left-radius: 17px; +} +.sf-shadow ul.sf-shadow-off { + background: transparent; +} \ No newline at end of file diff --git a/gui/slick/css/tablesorter.less b/gui/slick/css/tablesorter.less new file mode 100644 index 00000000..da90e01e --- /dev/null +++ b/gui/slick/css/tablesorter.less @@ -0,0 +1,91 @@ +// Config +@import "config.less"; + +/* SB Theme */ +table.tablesorter { + width: 100%; + margin-left:auto; + margin-right:auto; + text-align:left; + color: #000; + background-color: #fff; + border-spacing: 0; +} +table.tablesorter td { + font-size: 12px; + padding: 8px 10px; +} +/* remove extra border from left edge */ +table.tablesorter th:first-child, +table.tablesorter td:first-child { + border-left: none; +} +table.tablesorter th { + border-collapse: collapse; + .gradient(#555555,#333333); + color: #fff; +} +table.tablesorter .tablesorter-header { +/* background-image: url(../images/tablesorter/bg.gif); */ + background-repeat: no-repeat; + background-position: center right; + //padding: 4px 18px 4px 4px; + cursor: pointer; +} +table.tablesorter .tablesorter-header-inner { + //background: url(../images/tablesorter/bg.gif) no-repeat right center; + padding: 0px 18px 0px 4px; +} +table.tablesorter th.tablesorter-headerSortUp .tablesorter-header-inner { + background: url(../images/tablesorter/asc.gif) no-repeat right center; +} +table.tablesorter th.tablesorter-headerSortDown .tablesorter-header-inner { + background: url(../images/tablesorter/desc.gif) no-repeat right center; +} +table.tablesorter th.tablesorter-headerSortUp { + .gradient(#777777, #555555); + color: #FFFFFF; +/* background-image: url(../images/tablesorter/asc.gif); */ +} +table.tablesorter th.tablesorter-headerSortDown { + .gradient(#777777, #555555); + color: #FFFFFF; +/* background-image: url(../images/tablesorter/desc.gif); */ +} + +/* Zebra Widget - row alternating colors */ +table.tablesorter tr.odd td { + background-color: #F5F1E4; +} +table.tablesorter tr.even td { + background-color: #fbf9f3; +} +/* filter widget */ +table.tablesorter input.tablesorter-filter { + width: 98%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +table.tablesorter tr.tablesorter-filter, +table.tablesorter tr.tablesorter-filter td { + text-align: center; + background: #eee; +} +/* optional disabled input styling */ +table.tablesorter input.tablesorter-filter.disabled { + display: none; +} + + +/* xtra css for sb */ +.tablesorter-header-inner { + text-align: left; + white-space: nowrap; + padding: 0 2px; +} +tr.tablesorter-stickyHeader { + background-color: #fff; + padding: 2px 0; +} + diff --git a/gui/slick/css/token-input-facebook.css b/gui/slick/css/token-input-facebook.css new file mode 100644 index 00000000..a166be82 --- /dev/null +++ b/gui/slick/css/token-input-facebook.css @@ -0,0 +1,122 @@ +/* Example tokeninput style #2: Facebook style */ +ul.token-input-list-facebook { + overflow: hidden; + height: auto !important; + height: 1%; + width: auto; + border: 1px solid #8496ba; + cursor: text; + font-size: 12px; + font-family: Verdana !important; + min-height: 1px; + z-index: 999; + margin: 0 !important; + padding: 0 !important; + background-color: #fff; + list-style-type: none; +/* clear: left; */ +} + +ul.token-input-list-facebook li input { + border: 0 !important; + width: 100px !important; + padding: 3px 8px !important; + background-color: white; + margin: 2px 0 !important; + -webkit-appearance: caret; +} + +li.token-input-token-facebook { + overflow: hidden; + height: auto !important; + height: 15px; + margin: 3px !important; + padding: 1px 3px !important; + background-color: #eff2f7; + color: #000; + cursor: default; + border: 1px solid #ccd5e4; + font-size: 11px !important; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + float: left; + white-space: nowrap; +} + +li.token-input-token-facebook p { + display: inline; + padding: 0 !important; + margin: 0 !important; +} + +li.token-input-token-facebook span { + color: #a6b3cf; + margin-left: 5px; + font-weight: bold; + cursor: pointer; +} + +li.token-input-selected-token-facebook { + background-color: #5670a6; + border: 1px solid #3b5998; + color: #fff; +} + +li.token-input-input-token-facebook { + float: left; + margin: 0; + padding: 0; + list-style-type: none; +} + +div.token-input-dropdown-facebook { + position: absolute; + width: auto; + background-color: #fff; + overflow: hidden; + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + cursor: default; + font-size: 11px; + font-family: Verdana; + z-index: 1; +} + +div.token-input-dropdown-facebook p { + margin: 0; + padding: 5px; + font-weight: bold; + color: #777; +} + +div.token-input-dropdown-facebook ul { + margin: 0; + padding: 0; +} + +div.token-input-dropdown-facebook ul li { + background-color: #fff; + padding: 3px; + margin: 0; + list-style-type: none; +} + +div.token-input-dropdown-facebook ul li.token-input-dropdown-item-facebook { + background-color: #fff; +} + +div.token-input-dropdown-facebook ul li.token-input-dropdown-item2-facebook { + background-color: #fff; +} + +div.token-input-dropdown-facebook ul li em { + font-weight: bold; + font-style: normal; +} + +div.token-input-dropdown-facebook ul li.token-input-selected-dropdown-item-facebook { + background-color: #3b5998; + color: #fff; +} \ No newline at end of file diff --git a/gui/slick/css/token-input-mac.css b/gui/slick/css/token-input-mac.css new file mode 100644 index 00000000..18522f05 --- /dev/null +++ b/gui/slick/css/token-input-mac.css @@ -0,0 +1,204 @@ +/* Example tokeninput style #2: Mac Style */ +fieldset.token-input-mac { + position: relative; + padding: 0; + margin: 5px 0; + background: #fff; + width: 400px; + border: 1px solid #A4BDEC; + border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; +} + +fieldset.token-input-mac.token-input-dropdown-mac { + border-radius: 10px 10px 0 0; + -moz-border-radius: 10px 10px 0 0; + -webkit-border-radius: 10px 10px 0 0; + box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); + -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); + -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); +} + +ul.token-input-list-mac { + overflow: hidden; + height: auto !important; + height: 1%; + cursor: text; + font-size: 12px; + font-family: Verdana; + min-height: 1px; + z-index: 999; + margin: 0; + padding: 3px; + background: transparent; +} + +ul.token-input-list-mac.error { + border: 1px solid #C52020; +} + +ul.token-input-list-mac li { + list-style-type: none; +} + +li.token-input-token-mac p { + display: inline; + padding: 0; + margin: 0; +} + +li.token-input-token-mac span { + color: #a6b3cf; + margin-left: 5px; + font-weight: bold; + cursor: pointer; +} + +/* TOKENS */ + +li.token-input-token-mac { + font-family: "Lucida Grande", Arial, serif; + font-size: 9pt; + line-height: 12pt; + overflow: hidden; + height: 16px; + margin: 3px; + padding: 0 10px; + background: none; + background-color: #dee7f8; + color: #000; + cursor: default; + border: 1px solid #a4bdec; + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + float: left; +} + +li.token-input-highlighted-token-mac { + background-color: #bbcef1; + border: 1px solid #598bec; + color: #000; +} + +li.token-input-selected-token-mac { + background-color: #598bec; + border: 1px solid transparent; + color: #fff; +} + +li.token-input-highlighted-token-mac span.token-input-delete-token-mac { + color: #000; +} + +li.token-input-selected-token-mac span.token-input-delete-token-mac { + color: #fff; +} + +li.token-input-input-token-mac { + border: none; + background: transparent; + float: left; + padding: 0; + margin: 0; +} + +li.token-input-input-token-mac input { + border: 0; + width: 100px; + padding: 3px; + background-color: transparent; + margin: 0; +} + +div.token-input-dropdown-mac { + position: absolute; + border: 1px solid #A4BDEC; + border-top: none; + left: -1px; + right: -1px; + background-color: #fff; + overflow: hidden; + cursor: default; + font-size: 10pt; + font-family: "Lucida Grande", Arial, serif; + padding: 5px; + border-radius: 0 0 10px 10px; + -moz-border-radius: 0 0 10px 10px; + -webkit-border-radius: 0 0 10px 10px; + box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); + -moz-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); + -webkit-box-shadow: 0 5px 20px 0 rgba(0,0,0,0.25); + clip:rect(0px, 1000px, 1000px, -10px); +} + +div.token-input-dropdown-mac p { + font-size: 8pt; + margin: 0; + padding: 0 5px; + font-style: italic; + color: #aaa; +} + +div.token-input-dropdown-mac h3.token-input-dropdown-category-mac { + font-family: "Lucida Grande", Arial, serif; + font-size: 10pt; + font-weight: bold; + border: none; + padding: 0 5px; + margin: 0; +} + +div.token-input-dropdown-mac ul { + margin: 0; + padding: 0; +} + +div.token-input-dropdown-mac ul li { + list-style-type: none; + cursor: pointer; + background: none; + background-color: #fff; + margin: 0; + padding: 0 0 0 25px; +} + +div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac { + background-color: #fff; +} + +div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac.odd { + background-color: #ECF4F9; + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; +} + +div.token-input-dropdown-mac ul li.token-input-dropdown-item-mac span.token-input-dropdown-item-description-mac { + float: right; + font-size: 8pt; + font-style: italic; + padding: 0 10px 0 0; + color: #999; +} + +div.token-input-dropdown-mac ul li strong { + font-weight: bold; + text-decoration: underline; + font-style: none; +} + +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac, +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd { + background-color: #598bec; + color: #fff; + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; +} + +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac span.token-input-dropdown-item-description-mac, +div.token-input-dropdown-mac ul li.token-input-selected-dropdown-item-mac.odd span.token-input-dropdown-item-description-mac { + color: #fff; +} diff --git a/gui/slick/css/token-input.css b/gui/slick/css/token-input.css new file mode 100644 index 00000000..fb9a8437 --- /dev/null +++ b/gui/slick/css/token-input.css @@ -0,0 +1,136 @@ +/* Example tokeninput style #1: Token vertical list*/ +ul.token-input-list { + overflow: hidden; + height: auto !important; + height: 1%; + width: 273px; + border: 1px solid #999; + cursor: text; + font-size: 10px; + font-family: Verdana; + z-index: 999; + margin: 0; + padding: 0 0 1px 0; + background-color: #fff; + list-style-type: none; +/* clear: left; */ + border-top-left-radius: 3px; + border-top-right-radius: 3px; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +ul.token-input-list li { + list-style-type: none; +} + +ul.token-input-list li input { + border: 0; + padding: 3px 4px; + background-color: white; +/* -webkit-appearance: caret; */ +} + +li.token-input-token { + overflow: hidden; + height: auto !important; + height: 1%; + margin: 3px; + padding: 3px 5px 0 5px; + background-color: #d0efa0; + color: #000; + font-weight: bold; + cursor: default; + display: block; +} + +li.token-input-token img { + padding-top: 7px; + padding-right: 4px; + float: left; +} + +li.token-input-token input { + padding-top: 2px !important; + padding-right: 4px !important; + float: left; +} + +li.token-input-token p { + float: left; + padding: 0; + margin: 0; + line-height: 2.0 !important; +} + +li.token-input-token span { + float: right; + color: #777; + cursor: pointer; +} + +li.token-input-selected-token { + background-color: #08844e; + color: #fff; +} + +li.token-input-selected-token span { + color: #bbb; +} + +li.token-input-input-token input { + margin: 3px 3px 3px 3px !important; +} + +div.token-input-dropdown { + position: absolute; + width: 273px; + background-color: #fff; + overflow: hidden; + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; + cursor: default; + font-size: 11px; + font-family: Verdana; + z-index: 1; +} + +div.token-input-dropdown p { + margin: 0; + padding: 3px; + font-weight: bold; + color: #777; +} + +div.token-input-dropdown ul { + margin: 0; + padding: 0; +} + +div.token-input-dropdown ul li { + background-color: #fff; + padding: 3px; + list-style-type: none; +} + +div.token-input-dropdown ul li.token-input-dropdown-item { + background-color: #fafafa; +} + +div.token-input-dropdown ul li.token-input-dropdown-item2 { + background-color: #fff; +} + +div.token-input-dropdown ul li em { + font-weight: bold; + font-style: normal; +} + +div.token-input-dropdown ul li.token-input-selected-dropdown-item { + background-color: #d0efa0; +} + +span.token-input-delete-token { + margin: 0 1px; +} \ No newline at end of file diff --git a/gui/slick/images/add-existing32.png b/gui/slick/images/add-existing32.png new file mode 100644 index 0000000000000000000000000000000000000000..c580950d5be6e6de54aa5383174853735e131428 GIT binary patch literal 975 zcmV;=12FuFP)!sjXesjjc6-u@=K* zLYRprf=rDd6Oa;gDTr8bA*3N>VIYi)qKr%oCXgXXF|;tjSyrgDR%k&NiVbeu4QB4W z@3`npolf6Ol4fkW@P`ZU-gnOVf6hDS-giY+*-Mx`W&dBmlOQ0vl|iXg>M_QofD^#; zz^@{59r&)dw|8Z?0;E+Jl*{G)o12>#MdaN!{zYTV`FK43dq)MVt*v#d>NVgvP*K&3 zKuJ}9ibNtuRka8B5ZDj=37qKb>$}@A0n5wFUx~;$;D)NcJ}@wFXJuuj7x>Z`b3Tzs zTrL)i2P2WlH$V?is#GdxhlhuKNUWnGayyJXnM}$H1fI{@DM zGphQmh`a_|9vmF}V|8_P*jjrNh{s~Fw}DIbIE#ym&lqD)i^#{Sx|B+#QjI)IOG^qN zU0|(ESZlG?ex6RJf3B}rt5vD3OMR`szkkCy_o;IZ?|q_1oL^X2P*wfGdq3u!`#Ktp zzSYd*oC89-z*>72Kt#ST6bd~e@+u%eyk>H0Zf@=ZfH9`*oGTk+0L}n1G&Ga}GR<*A zc>WcT&*vX11Y^uC?|o53jyJtJSsMTwl}hDES63InfqXt6Y(<>OWCWTrP@gp6h^mf@ zNRoRQI8`IQ4y@N~uEt`qV=esK;sF8mbTr|mY&QD|a0MWj%UuwWlfZg5oBg0}l*{Gb z6Ok}~TCFznnUy!Riq@TXR^4~#nM&+P>4v)1NkW@Zl5 zY}TD~cdfNo0VXFWyQ|geCFk6sRszDtPBMUVE?%uxZ%$23y<@HYWqf@6p!fdT^z`%_ z(P;EXYi)WbM ziwrzjpJ2}gY|(}-v77p6&VUCZj~s1>7#kZqW{kPjDBy3P`*8^ff?y;Ff^QoI+~D4E z`(NYs=;-KYB9c|r(~SbYP}LXd@I@u0MxFy+_TIlxC=`B!hQH#Gk&&c`jH&8j5jhMz x)d39-_zTzouBhrVus%OOfB#Hxc`S_LUcWoKK=jz002ovPDHLkV1lv&w^INB literal 0 HcmV?d00001 diff --git a/gui/slick/images/add-new32.png b/gui/slick/images/add-new32.png new file mode 100644 index 0000000000000000000000000000000000000000..26cfcd10cd570f3d083fdab5c424bb4c54527de0 GIT binary patch literal 1365 zcmV-b1*-aqP)x(4zp$0b*3bq6uTw{n`kj9XjXs}HxG|>bf2;C|P;eo&=M&N-pHK>3A z6HVKwlr*i0F0m?Y*+3|;3;TEd&di-*mIZZjH%|8Kx%bYw_nz~epL>UK&ZYnJky8<# znwt7@dV0EQr}y*@GQL#SR8tX-L?UNoS^jilV&V{E?A?lriYSdwPEM*o@*KvFgN~)L zCQH=?V`F0vD2n1G<>T>qod%;Ud$CSPRn-P4704I@0)@TUY!37qx_{7EEEbc{9}I`X z`_T=g6#<{mR|uJ6Sh=4#hE9SW+Ch97GVPH46-xPm)Ldm{vr)6f-FfWzJMrSGOlA;PrYB0=l0p z){R5!o8STA*MMj*5J$iTW@cuVii(Pqf`Wp*kR?|YVhxIsLda=EZOA`{_OoX0%kopT zwY66gf)ES1LDakhdbPg3{^CEGQ&m-Epm0mjj?cir0Hx>0pnE}Y(jF!PcEkB1}SSR@>Y zf#VkmheDyHl9H0^*h*SixqAxhe+b&Za*x#2)de&J*4Njc#$vSj@A>)p{Z%iU#cn2@ zWw*b---9%Mn_L5a2z*pi0M?fZYlh&Pa9dm3zOwT2XCzK~YdD#UXf4jPF(x<{B3xpk z!O+qtb0IT(b#}U=qhqP3r)L!6F6>omDgfw8Mc`c~-rnARn_i~%)H$v*>~#g3yU;8( zgOCsqfv82M$K!d?ZqL!)=}E#2+eu4fP%;gc%&v}xA#Ir!3NQso0{CCnL+?Y23J>C$puLYNQh7yDbd;4>7*0x z?;pe4+jT`?uuWVPMdhunt-i&@MH?z%5&|?L&(F_44t@=S8AE`gUl_-&LAU^x5C2eP zUOWBX>BCHs?OHCw&sr)c7J`Hn;EY)Vp319cy)LEy!^jn+_au0kh_5?V1gP_3hy7Jux&xHk2KvdlYs{*%$ zTp9g!cX#{2{Fy)iZZ6Xc9G|zwz*X`7Kub%@{iGdEyXPV7h;y#{k#FWVx5NXZvw$-T zK*Ikt55tP8O0j6{7W$V!2VnifLi7i#0+&Q!WP#csbP|)k;l^oX97;w=u`RhLf=(aN z4=FAb39f~5ahwPBx%`|tlk@LQ1yCM;gvC^Zs7Ag4`o(Uyf6~>}wUGwYgAEN04%{nF z!LXxZY;AdYc{brn=5o2d1$!bYA21c~)^u35CUQL}E}t7B%hoNo z@5_UOgX7y?%WGDSr z1<%~X^wgl##FWaylc_cg42%k%E{-7;x8B^^%XP>=g!RFeu1CMWIL5@fuyc3$hX@?J zdh}xZi^m=NuT}&JPrSY5=(U3nV=OKld8TY=5zD-GtI<>y&wm2P3m0f=m8O0Kd@eIUAXCqry~ciGW& z{@H&dZ)|yY?d{q9`LXXV=<+q_?mJpzZSq*)#vaaR%)bw)`EEQk@pjVBCBI+(UFG!k zv69CG1;-{9P9YVnjDz2v?%HnsWJTQDlFO|7Z~x@G literal 0 HcmV?d00001 diff --git a/gui/slick/images/banner.png b/gui/slick/images/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..8ae6c94eec5176b38fb7f895ca02612696fe8089 GIT binary patch literal 155703 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

`)eUeLzsxBDbT;xJC9%NhYky}S?Rv$hCe#^! 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

NHnC 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 G2~7ane>CU- literal 0 HcmV?d00001 diff --git a/gui/slick/images/closed_captioning.png b/gui/slick/images/closed_captioning.png new file mode 100644 index 0000000000000000000000000000000000000000..9040ce266512b016240bcd3424e3c6cc92e7894a GIT binary patch literal 880 zcmV-$1CRWPP)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy32;bRa{vGh)&Kwv)&Y=jd7JeSaefwW^{L9a%BK_cXuvn zZfkR6VQ^(GZ*pgw?mQX*00Oj0L_t(IPrX#zOH*+iKSv@dL?|y)x1HUNm!{@)x)21R zkbQg)qpi6GwW`W@`T_AtM*}6W!-u*s z9tdDzVF62viwK9qxPSK^YHcb5>va`q6+k0H!-z&ASYBR2WPTna!^3O@@d=ng$-*OD zU5Kx&h%)`XlF6iYeiaO|Orzb7FXBhpwf22YJI{Wd#eRD|hfbmxR+N?@I1yxlbUF>c z&xiIl7e0qVh{xlI#bR)^IB~=8*FYYOj55f?_)Dw^V-kr3E}p-@p^(U}8mkS_XoM9A zq)h<@a?S?R3xWzAby7K(h3wf%7++?HMTQ zHjTcI>k~WgxmryFMKL8LRaFflZtn&C%y(dmWPh`o&E8*nF9_E{KdDdv0000S}{rU-#^xW|9%5S{`_G8k=zVG=|5luWB>#JF#yj01oZa& zTu&JQ008~}|NQ&{0055x0sR95`v3p?1_t~7{`v!N`v3d-{`&g=`T6amqXIBA$0h)T zKokWRkpoMx|Go@O4FvhR>O1p+i7`B6t^3)y2dJ<#?4I?d4x-E}Az98Z`2`TmzkmP! z{`(J9{pauh-+zJD{JOYLhW+QSzkh#x`Y&wke*WLjpZ~u9`2XuCr@{^OJ|MkZb_UGR@Z=V>fB*iaq<8P{*B}2u-uMnu#J~U$KrBDL0bT$1_irEqiZcM6WEF7g<|*+% zzkjHi-TwRc=f7_t9|K*?`1?07lmG&V<)V$@{}>pUYZ(~+fDw@M3(WY1!T<=sp}f-o0K!lJ3<>Jc!&VtMslE3ph2^H3FGe(F z4|^}slF1@l1Nxc}^5hjjU=0la|37)k@b@neJ^1|l@87?_{{z(l6@kcKe}Db@_Y267 z<&g#201!YdV6*>2R0EZ*bYA%%2Vi7me5m>mAb?naPGtnD20MY__n-f`0mzg8{s9CK z*hzmtW)s%H$oS{aAAkS?JLxaT`2W9u;n%DD1Q-B%#%TuGpFSS|0000&5HW|5#c7{r(N){s9YCi84$~U|{$Glm>AD0*K|^yLU}ZO+eP) ze;~;4`#0mCzs$dX{r~-&?f370zkUTM{{OB1_1E8DKmYz*JbN)f0I>i8Q1#1Kum1f0 z{pZggpt}FRe*ORX>;JEx|9}4c_w(m__W!pfKK=atLxM{ZXbC_7vHbh@@9*EgK-ECy zzkh)Y{?EYhFEQc&-#`EN9{7Lq7*OE*@9)2U|NQmmC(vO40VtezBLF}U2%?OI(TG)& zJC>!~;SYmN-)zb6gc(7A-^Q(#z0vHb9!CJ#T#ii{@&pjek8j`pfX)5|H00+GpnLvt za{MtfWBC4qk%R63j~{=2{QLgr`wyTb*amx2hce{;{QL3a|BhWh#6A5bKmf5of*%NgdVm^$Zuo!gI_LQd|G=96g51yWl0Agf71rLE? q3XWqq@&Lw?Iyk0*94-cc00RK~MQKxxUU$F%0000= z`}|7!`YQYT5C8xIh~*yx1DgQ1_jkSr_QgN{Gn)!7=zkRT=l(yS{y%^Jd$>%yrP!)vVq~xpZ~xA{{HjZ>hB|)Z~OQoBLBm{yCqA0{k;C`&+mV~|1$jj15^wU zKukakbkF}kzkmk({q_6zmUTZaUWBOraqa5!?(V-pgMR}R{04?0&`AIR#PSE^hrdi> z;*7t4gLVFSJ$J5DTibsorq@%ai5h7B2l^1G@*gM=fUW@uAjYc<48V{DX@ijvE(11_ dg@FMezyQzuBHsGv+i3s*002ovPDHLkV1jTADB=JB literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ai.png b/gui/slick/images/flags/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..74ed29d92616c86757d3c0ec04378301c8f591b4 GIT binary patch literal 643 zcmV-}0(||6P)ocPy#thD++(+#W%SS0Qvp^`1%0+_yGC)0QUL-|M&m^ z`T_tk0M7pe&iDc7fh@K74M*k&0{8f*88BG;;GY6ve?;&4{{Q>_{{8&^`u+g@|Ns5} z|C?Nv0*Gb#mu+n4z6ZW~#qjy_|6ji&ZeIEMk16oyzH)i@Pk$MNxLARR?a#kwpMS72 zF)}cG2M8dRUN*~81wCz%$A2$f`_IL|A|w6j^RHtc7{2`lYG-KkQ{(*knSqh%3kzr7 zs%s1kKL7#%F#yj00-^B^D;pD^^AqC)4C(?1m>@q26ceiU4*2{4`u_d~@vQ*ykp&A1 z3h$o${r~^~`vQo?Pm-bY@cm79zVQG5%l!B6)Riap%L`bGemnT<@2|iAfl64!%YWS~ z`p0YY_dig_cYpw5WYAmG*lPLk!;jy8|NZ#~MF0Q%{rCG1ko^Di`(Fhkd3F{?py0c9Vg{{gA~^#>F<|Nj5KapBR^@Bf~CXSi|t;lF=C z8-4)<5DUX^V9+rDCI3RuUy#}V{s46X!}R~}@4ug&fA|+@;n!b(1zCZ900KKMX({{sIILBZE*UQbc|SngJt$+`m9Kz!<;5 dBm+Qz0RWL%NC2%sdjkLf002ovPDHLkV1lARHI@JX literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/al.png b/gui/slick/images/flags/al.png new file mode 100644 index 0000000000000000000000000000000000000000..92354cb6e257be2cade71cb825027ce8d9efc06d GIT binary patch literal 600 zcmV-e0;m0nP)PbXFRCwBA zyv)hK@{fUmi2(>${xJOc&A`II@PmN?BKC`c;SU)710$d~Kmf4-r6niy16BY3`}g0! ze=L9h&Uybegp-Ns@87v^zGQMU|NZla@z1Y+zkdVKmFbHB0*HkH4F0@)&iwE1;&GRLuzkX(OGXMMa``@o$|Ni_2x(y(Jn3#TnHT?el|IhC;U%pHK`}6Df z@2@|9J^lXU=Z~KvfBzi*^!4A*U;lv`e*Fge3Lt=(82$q_`~m9z|ND;$!(WEqze~6o ze}X|JFO$H(U+VvX#{c{avi3L7@c;n?3L&6l7=Hix`}emN<6i~#|7+iUWBL8-&##}m zKKx5zXJr5LA80nvkwCM6egFs{po9Y?& zL6B;olm7ns#=rm&Kp-3b{RIXY(1{??Ha=$NKfkS+|9@us$Mfg+93j@fzkY#y2y!;i z&kO(o1PWH5>zPHwn7|>;0Mz;WPl13iP!Y(WKYy4&4hBXMSPugOKmaiw2gk!dq!|4J mj$lZE0R~eis zC&uN{cDQ8`!@ZNLOqwtoG6nhzPx}SV-d6yzFfcIz75{(rngJyDkKrFw8iaoThHCr$ zo8k9wMhS^O3=9AP!~%5B|9}4(ASQtkLN$m1CV&5705X362095KfLKJhW;OjWdGY7l zzrX*$DuLu*pcFC#NdEr)SL!$SY=)lz0mSm_*B_u)|AM4JP)(}33zy1Lc&_o7? zKL7y)bkd){fBym<_v`mxpbeRs`+WRVot-5A{r$IX$CJFg13u{3eX_{0R++j zR}GCkSy{&4zk!krKoTg(2n-k?g31B}5JW!NMq0d0000q< zM7LZb@rX?|r)2RP-+aO3(7q?c3+$-Vv0E)PxM3SDV%@s`#GkZvw_x^WBa~uq3^l}t zWdf(j(=(>^SgETc#5#EZT(4ObRkfxbzP9G;yza0;Ygc8-_*?EP(ca#`l6-Z6D0{tL zQ4|~MCSi!9Q9YkW=V$ix#EqZ!rc?eWA0TwdVID+3aqrYUXUhCI)Ad5!(cP!BhhW$Ayb2&r8kK!bz*2`~UE W(Ndrek0Jg50000NL7TW{{R0! zJP>i}(MpzaSkj z=eqvqa`^|6{{QbQRQ11q3~Vg_kG}Z}5I`(hw}ncX8D4$|h64jUK>or*=^r$dfI%n0 z$3MKz;!F0w91GjkkV%_X`@4 wKR^hm`X5LwD9*v?4;TUC6Bz$&3;+QJ0QLcJ=WT{TU;qFB07*qoM6N<$f>3bX%K!iX literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/as.png b/gui/slick/images/flags/as.png new file mode 100644 index 0000000000000000000000000000000000000000..32f30e4ce4eedd22d4f09c4f3a46c52dd064f113 GIT binary patch literal 647 zcmV;20(kw2P);Rmc0RI30 z|Nj5|{Q>>`0R8>{{QLs@`vM01^D6+%Ap+Y10Qw3Sr3ED)s=c}b05Jg0{{#dC0RR60 z)z$y}`~dv>0Q&p?0Q>ne0Khr|#}EMN1`-ttJvaFq6VTDg`OMJS*4F}vg#m0fQ1$QM z42u6QTCg3Kt8+Li1J#Y_zUd>4Lw{URe1tEjLbKmY(S0M7pd(g2qsJ0|z;{R`~d z`n<6E*3bb41p*Zr{{R344LkeqyaMyV01O!W0PZ0+TjlEQ0st`p&i?@b0Q{Gi0m{n% z`T6-B``1JQx+4kM0{rp_FfRy7P6Qq%_1|&<`|JPx`Uew8u)+%h2+ zdiAI7xt}_}e|$CmbI9$2>u h*D)|iF)#oG7yty8`q2#I8zBGy002ovPDHLkV1j5VEF}N{ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/at.png b/gui/slick/images/flags/at.png new file mode 100644 index 0000000000000000000000000000000000000000..0f15f34f2883c4b4360fc871d7105309f1533282 GIT binary patch literal 403 zcmV;E0c`$>P)@|4`Xj5kLT%`al?B=W5I`&prl$WjwHQRjfmQ&G0jUOA z@&|Dug_Rm`2Y251|$~)1M2@@6mI}!8O6olw6y^Q z5X--d7nzS8`+x5q12kBmVFD!~j6c5_fMKno0(1^Q0I>i=is|LjXX40RRttS6cG0UZ?;7002ovPDHLkV1fxUnjZiF literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/au.png b/gui/slick/images/flags/au.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 GIT binary patch literal 673 zcmV;S0$%-zP)>fJ3En$GhGS>sbE%%m3$AD)q?8M9y>88-}kR7#RKlk!P~Y_PLuF7~U~3`~nC7 zF#yj00ZUDdpLsm{7ajP|&HwoK0Usg|6%f4L_{`Mi{rvv-`ukf=Ed&Gs-sA7L!Q7*a zj{*QO0M7pb%?Sw^g@yy{>ihEY{`vU@3=8@G0rvO$i3mOL`~mv-`W+b$Mmr&io5dg< z5v!7q0*L95jt`TzK8Kd(Utv)OSp_aLv){6ccV+Z`{Q2+asKUU&aO3`Kpz6wW8wp`< z28M3{0mSqnB#A*-c*8%1=RD#sSOwMznKA3=e&iEzwo{cA=PgXK`2OQ}gqId83!|%* zA_Kz@fB*n70M7pdECCwp4H&@R`1|(w-}M5x*74i)0}%fAt;XafA{48))#>Z>?CD#}*e}Ret0tl$#*RMZ7}Jl7Z|M45`5*URzH9L z{rmSnPy;{!u>dsyO%meg+00000NkvXX Hu0mjfN{&}S literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/aw.png b/gui/slick/images/flags/aw.png new file mode 100644 index 0000000000000000000000000000000000000000..a3579c2d621069c8128d7cf16440d5e45a3ab3cd GIT binary patch literal 524 zcmV+n0`vWeP)^}0h@W9fA9JOn#opKkr#VO<{LPm{QLg}EdH3Vb1Zzpp zqiZ+XNBm%5{`ViKi{bCTe}Dh~2a+HyfB%6Q|9}7eKVjxEfB<6Q<6r}-{{7;G=hB{; zLB+p+|Ni^;|DXT={s75;AoBO$f4@PDf8sps4FCQC1Q64wUw^h*hy4HZXO3U)@85qw zD*pci8U|DWQu_BVi2MUWKoOv;00M{w=;|*lY_o%kegGx^{`&*A{SSok_usF-P)oof z|A86+0*K|;FQAM6fB*FtoEI&bZG5mq328#as{}<$F zWDQ{Ffz1MH001phxCBNdC_2H6U$AI~GQbEJqg*Ti0R{kQ(yH?TRrCY^ O0000^@RCwBA zRL|V|7QjV)*ul;Rlceqc6W0{`~_8AeMg& z|LUXE8U8c=`}dziv6P|mEu%JjM}pqh@65md|Ni~w->=_)fBgZXe?Nc!ot?WGAOHX{ z0M7pe`uG9>{{ZXo`u+d?{`u+u=j#9V2j%Sc^797z|N8p+{rLO+`TP9&`u!FW2mk>3 z0#G;xDFDDQ2vg|)-@5Zw?JVTrAxNs~5&|AZ;5uWfQ`vUsMGm`>aGWoI7=P|oW>%~E z|Kk8dq@aG@HzdsB>fj@shYzX-a%=q<(frSYmfLIv5{HbzQ${~M_P_y6C&m>3uU0*DFd0+8#0#Gk)^|NLQBRAyCBeB9H+Wn{=Mr@*PJ_ZKV< zB>w@GFfafF5Ks>TBP0ZV{bBt5_ve*sKkwd`OiO#eX6=u=cfX!E#rX3NBT(umNC7Yu z0Ro8S7X#4ce?Xr63$phg)Bk64X8r&5``_O`AFf^jc>p5y?+^38KVKLa00M}`wU!~x z=I_1Fe}Df4D*yZI@1I|PfBgnRptt`0`2{iqMpRNPo|?TW>MPOFW(r1_!xlT-yep5|G*@e%^SFxf#DC32@n7=0M7pe00011 zNe=7o{FIuhzQ(sjF~t7>`T+s_0sj00{`>*}`~Uy^|Ni?^Z7Tcx|FW0O0tlpm;s5{T z+df{s^E1rDZN;v4VP>0|8GkY`{`&t1s2YfV{r~st=KUYCl59Xr00M{!Xv@F<41fPH zoWA^R$>xvtF5yd$xc~X{7o-}f=ig7DY9RXc``_>1K-c{N2q2&ahQEIq{`~z1RCDs; zw*~7zIJ!sAKj8J}&!7K)enC|K{|nUc|Mwq|27mwp*#K1f8;Jh=2byv8+}GKw-@AGz z%-rMu^XK3HKtBLA{Qvdq*I%FsKn(x^1k&&qY(LP_Uw?q)|3jz0PF?=a(?4bU?qHzN z5I+E=z&88?2q2IKpz*){`~&I%+VJc5-=Dw#?LYB#!lHLRL7BZ8-NZ5x*TXaKmf6TZ20qEQj`^F;~x-W z05U+*fBxNj@_W(7kJ(ujGnWgh$g%(Z2hso#K#U9wI~hQ+`3Dk_7z`j1tL#*2FTcgW f@C+EF009O7>dRn2w6d?H00000NkvXXu0mjfueTzu literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bb.png b/gui/slick/images/flags/bb.png new file mode 100644 index 0000000000000000000000000000000000000000..0df19c71d20d7fdc06e1cba01028983439b2bdae GIT binary patch literal 585 zcmV-P0=E5$P) zj51&U|NhG$_=oZTA7 z0mJ{l|Ns2{|Nr-Y#^3*c{=WU_!>_-;fvROCxPdkR1P~M0Xa=C_KR`47{sXG+pY!Yf zqu=)*{%)W0>;M0szkdJy_507SKYxDz`3KYh5I`&-cY{^``2$3Z|NsB`^ZWO@y}$qd z{r%_nFQBC$4Is{6hz5WF0@(mI8^j0N`~Tl>LzQ1Ye}a&q>MtPo*RQ`|OMu4x1!@2Y zAfSdne}TsT{`c$8-(P?J0c~)w`~?J`zx?#Dg*yp^z&88=2q2IKpt(TRKniTbum8-y z1bBWi0e#F0wgIH{FVJ|Pxj-8L0tgsNfByUdJMs7b-@h3^8h-!E3i%CU{QCW$1*GB6 ze~`2PfHeF82q2&aU>N+96yg32bmdP5238q{|Gydk0=52OVEN6!@<&OA7Z~7wL16>b z@DCt>7#SFn85mf=5eY;LZ#OUe_l@D-2Zn#Y82<4v{9|E|jkRQ8_`$&N0jL_N03g5s XX0T^_9W~6o00000NkvXXu0mjfXpthO literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bd.png b/gui/slick/images/flags/bd.png new file mode 100644 index 0000000000000000000000000000000000000000..076a8bf87c0cedcce47099c6b74b59f2c9d1dbce GIT binary patch literal 504 zcmVCcfPV}OzZe+)fYC1)`hmpw%>WR9L@~Dk00x0r!@5ksR;+hV0>ZLfIcBS@orh;x zv}95za5W)x_7^}bV3YqpdH?h;NZnuSC%?V#{+0gl`~RQckJx{&l>NO~;@7XgzkdJz zEh{VwR0LSuiyWGR{aKQ z00-R5+27mwp+3@G@Um)kt zzdstU{yWl9SIB_0ft3II3)BD*KrA2|{``^Tm;4PDy`=a1tTre>fEI#8 u{{2z<2NVVaum*qtVq}m+iAaI~Aiw~?reC_kVQV=60000gsB+3J~Dn`pdxgmx19A{hgns>oXkhsL8>j&wfIu2Rsv+R_ zAB5T1GyoL?1Q1BWpFe+p|Nf1n;TJ-~Kd@?uhChFRHUI<=#0HS!U%!8$YJib28yLY( z0tg_G2B7i3e*FSj@aq@44gY_`jRywQ69xu=0D?FP=vyd&x*M*V6|CV8P{Uu4OBfgc z0tjNmA4y3`us8lPG6H?}8%zRafgb(Cp!5f*6oP{xAq} rF#LPR@IoIX4%E%Yz;K6w0U*EtuUcjA`-_J300000NkvXXu0mjf+>pV; literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bf.png b/gui/slick/images/flags/bf.png new file mode 100644 index 0000000000000000000000000000000000000000..ab5ce8fe1237a18d6809a5570024eb108cb14a3e GIT binary patch literal 497 zcmV@|4`Xj5kLT%`al?B=W5I`(ov;U*021-Lr1*!W5(gW7O z@cTDV13&<=05Ky_HBiN$KMcQt819e>gHP`g_|Np;&&;0(C^$RHS>olZ*Q41X9v27}ar6#W9}0h{^{OajIK0?h(y z_zOe~zZd`lhy{p$|NA4!EeST}?;nUxkP49VfMx;1;V%&U|N9rH;SU2q05LM8GXV8K n(H~UyA0);fa6B_H00bBSQ>$p&WfB*UmB!B(-`wPhZ^#?@C^U5EbbPyl_g=3Hc01Sh${{P9=HB%4| z34*<3-m=C?^;L%miR{xQv2*hU;8+Y&0Dxf-W~KjsusWFAC4@j0#9_j;X5z6SjRhH> zd}sd(7FPhVFdSi!*Zj@;_Sc`kfByUdk|3A-`STmZ_yb~qxIp9o{E-p)bLt=iKmf7) z+|Ix(`{&<1pm88mK&}8g1WG~}e||Ik`OB#Cw~m1UAb?na(Zlrn4}+v6P!1@{@CT$5 z&-#|8y{IY2iKmf5omHz(^qAp)ym^JhN+jk7Vet{H$(Z8=>|AV=V zva&!M00M{!p&AHub^kXuF^G#pRQ&(-8^nMkpk@XJfB<6o_wOIv5C1P;X6Wwu|KUB< zc%X*g2-OTg#J~U$KumBafq;(A|A`a+OH08N{X($;=pP0KfB<5Fs|GR7oM!0i{{QYB zSm|$=!=N@Wf}I2qKuka<{f7YtBjf)QCj1u{`~UM7nrdKh0c`*VF+c!8{Q&j%sZ;-Z zd;dRshENS5{{S`og~Sg)05QIL^-54s5b7kL(8GuS8yfz9{>%Ui`+q-vfW*P*^_43C z0mK4S`s2qBh&}(NP5W0_$$%QQ@R)`GfB*vkck5Jby^kNv00000NkvXXu0mjfy0pt~ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bi.png b/gui/slick/images/flags/bi.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc2e30cfc47452d5bef949628e955a522d59e50 GIT binary patch literal 675 zcmV;U0$lxxP)$wbBBJ zMTk#;k4<3e#ePFE;{?TciOx=-NpIdg`t|#dcz^$YFqm+of7AU<7UGr+0t^5F#PsJM z(2)${Jd)SmT+KY5@!|h>po)L5-!r~>3uJux|0`&Jz~QGy6a*CiGyVtq1|Wc#zWw|0 z_y6C2|NnAvaR2)A>-NX%|3Ci{R?!hvH~jzU``ypCK7Rkq&&~h)FDNvCApj5nF#yj0 z0_X_*{{Q{_|NQXv@Av-qBMmR$teo!O*6-%u-J+8r3n~2s`s?uP{Qmp>{`~+900M{! zNC9;}eE(3IS9-C{62AZc<>Jx>%af}0@?r&05Jg0 z{{#T;0Os`NWh`ko4>SM%|Kw(60099Kad7|t0qcf^`tR-^sIP`Fhru7lkI#w#>Hq?W zkzqQ+@08y_|9v}t;{CEE%)%nTc=-MC@P)7S@!~g$((Ud|+28Q224FCZIGXF0FQ1zcbfB*dX_lJRr z;s3wCNa|2D02KoSAbE^!0Dxf-mZ69ApkCb5fP^9ydGO$cm6w`kGj(t#`M{tFlLo%j z*4%mm2&CaJSn02SzkrtfWBLcO;r%bLy5Gnoqrh)qC;VKmZT`F#yj00W%wG zw4zx17##T6*Z=hN0Tvey7!|wG?K;V)0{r{_`}_X<{Qmp<|NQ*_`}@YSvI2-@&cAgG z*R?p0?_>V(@&EVlEP?{x|1esA`||VNU68t8zyJRJ_3zg&hTp&0WMzR?0R#}s1|E|% zRV}tRkH6o2#3;(nsVMXI-pgBmh17ms`TzTu!pfBl%*_9R;OEbWDJei#0R#}sGpDd$ z96Spi@~bn7G5z{~^_!ZLy2#s;5B~o8&G`G*|6f0Ap0WS=_rFd2C(ubi4FCZEF#yj0 z1a!1=2e0}MwgDi3SU@2S4mePl{012eQ4J-3 z|Mm`933BS6zyJRJ1;ztF0D(08|NVzmQWB*4&)@%$um=Y`lmy1W-@hDx{{qQh3=9AP x#JH7#;TJ3-|G=X54_FW_j)5c_0|P*S0RT0dOSD~(4;cUe002ovPDHLkV1hfJDkcB` literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bn.png b/gui/slick/images/flags/bn.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb09849e9b5712e9cdd8a2c25035da201535cf5 GIT binary patch literal 639 zcmV-_0)YLAP)8n_8%|dG+hlCr-g% z|9<~wU<9iE{r}%DMphZ1Jpcj3%*DZBWo-@72DFWlk(-gj@!ngb-$#D&C_i9e{QvLY zw|{?r|NHlgiHY~?^IHG`05Jg0{{(k=dF}7->+9=cXlNG}79t%T{rC3_t(pA#`tSX# z4jKOh|NsB|;rr`({{a5__y7Wk5omBxQSrlv5B>nb??0VZ8qCZrpS+?}gatn>o%-+B zPl=+||6st##PspQ2Y>)#{Cu5(QJ~_^?faD-pMV;E|7MwLubjQ@B-gLso$mVYgECpU zxpfp2fEt*XnBKpC4-fz`0M7pb@zVeZ8g>5r-~k2r`Sbhd;{WmN02I(80QmHEv)Ik{ z>H7Nm`}_MdF)?FhWi>T50*LYBMFw`s0-y$le?J(QfB$Fr_2c8e-`_!j`0PG|ckZ*_ zzkY$-`sc5Tips@{7Xbo@1sGC5IYwrQfB%2{|MTZR!ygX*-%McG4cZmTY ZzyK0(F$K@T-Dv;-002ovPDHLkV1la=J3;^e literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bo.png b/gui/slick/images/flags/bo.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7ba522aa7e948d581478432643c230eed1a658 GIT binary patch literal 500 zcmV^3LvnC{|x`%yaFl$ss8ha0V@6XKS=c-5cwO(_{}IL0ki=i zfLOjo{AE-9^-mn=h(G`Tfz|!{{r?|W+uz?{^yeR#!Nm9NlRN`J0I_^YV&Ikj@%Q)F z|Ns9m{0FN3^Z!3k!*8HnFvf4N5xas50L!z?-wXsAPk7$ ze<1l+iQ((fPYeJ7#KQ200VpKFA^{3Nph^G!{9^b86oDW}(Ek1R7ZiL9e}Ret0*H}e qBRB&8AR!3%7c6cef(%d+Aiw~vBYd|xMihYn0000j-HAXl7XJGjM{~r+i{r~sxzrQwG-&h#_Y&p;L z=ieV7_s^f-zyJOD{rC5(+EoAn1k&)I;s3Kw&;LT?{{2}P{Pq8T&j0^^J4?LvUd;UK z&+k8ffB*XXONL(tXahh1fi?X94^$0Q>Z$uRRO)Y4)uapmB!2(-ul(c1=C+V!kAF`) z$PCo;`_FHns{jIs3Fu;wy-Z(c2YwAz{&V4aXk?bejFO*Op&u`@i~PecqBpL@DIoojb8mb+WHGK%fG2>)a3=iVf_~v+`s?*1;!`?Kmai^I3i*ZIYtpN f{g(k500bBS@Ns{bTs^2gCr95H^s6Fo1}O2_S$Nfl}4;<}o-r{^R8Q_xtzX z|Nnu?|Ni^;2gm@D3=F@4EC#P1& zzuV{ie)#0qf2Lnh)j(~3VeG$ufPMl9Aczeh3x56n#l!R`HRQLfpFjVwfkN;%I39k( zVgne^e?jDThF>oL0*Hk{T6(^^8pGqq44*zhqZ1OZzkZ>_F(mFeH~<0+0A4S6=>Lb* QN&o-=07*qoM6N<$f&=*Yr2qf` literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bt.png b/gui/slick/images/flags/bt.png new file mode 100644 index 0000000000000000000000000000000000000000..1d512dfff42db1ea3e7c59fa7dd69319e789ee12 GIT binary patch literal 631 zcmV--0*L*IP)?&DC3JV7l?ccjcgB=Qq4l4w|Q;eOZ4z|IjsEI`#PYSloM|AFHF zfy)2>XZQ=$@t;lU|F1tRzpnmg{PUOLH{-8A|F{4CvUU?d0I>k|0TuuM^_1cNUy$nm zzZn?*{^!*ACzSEy$NyhHzB0Wn`TXRU=!%=n%Ci4h82|!^32gR%glZtk^6USnb00o@ z{`LDW>%U)&BK_|-y-75RkKVi&O=|xC<=6keK+72b0*D2q;Xlai|Ns9mF#h@fM(h;aV>^!x1-zNu02XV-n@ zm3imZ@&EI0hChG)|NZlafdL?Zn1I0yH26P<=DUx29QQsc%}izF;QV-S-hYOl|1V4z zX|a-<=Kf#g*Z)7i{{y|szyJ_HEKEEM|C#>$KmJzoZa)M2-~Wm-e7Cl+vi)L|kY`}} z&A$F20RV*|BkB*O Rz6SsR002ovPDHLkV1m;fPLlut literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/bv.png b/gui/slick/images/flags/bv.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 GIT binary patch literal 512 zcmV+b0{{JqP)O=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d00k6 zPW&$KB`I@TtA?2x@Q~7pdcWi#1>DDZ2>MuG0I@IumHuaV^&7|soAMvT0IK){RtF@1 zgH;3B;_Qq-34j1%{P^)BFE1~|NkA(gBv!!4$aw$$eSiRB1ga=2D|__l(H|iA4T2Ex z>lc`SQ9x2&UjE?0g8%`<0`lvhzd$}*14J4{IhY2@0~G@V5J82%q9;EBlXu0U&@_82I`BfBC|Yn~P8llm?myQ3_K18=`^X_ivyEfB<6p_xd%%#*GZ! z-C&_V5IGPDK|g;X*gypg3;+Sd!XPTj0Q7fK5>&$Y{sHB| zjK9DB00sa3QR4q|tc?L6fSCSm+3>HW`NxbYpP7GsX8sK%KS9yYPfWi)GJ)AFzdp14 z{>t>1fsFwmfLQ*Ci!yxq#8guv=_mQ;-(Rp{AoSPbXFRCwBA z{KboB21 z`ppP*BG3|`!vO*asNvt=e_;3gWsp&PA@E<2jYs6ilRy6-zmSku5?~OOP=5aV@4sI_ zSN#QP00zQ!JD>SpAKYgR_QStF|9~F;2M|Ck zz%U1e+FyoWe;B_0VVclq;}vp_kNy3hKMWrj7*{kqJbMcaQ;_Pve;I)x1Q0+h46j}> zeiN4E1lkA+>|e|*mzJsW^M3)l^W_^hf&c&c`Mv->`48yHFF-%s0|+3-*GLfwiRNz% m3}3(u4lrUsie?}H2rvLBbQv(L;??y40000e`b1WGV} ze#gbd^&bp=ef-GykAYc$@BhDltSqdeSy?RXJpcawy+5fJAb?mHcsPJ&{d@EF@4HtJ z)qno||1xd*zaM|Ot4f#|8A1AQ-~Pubz$7IBv;-i4SQvovfB*ge{fFVtAE4aNE7yPi z`^Eg=5yP(^Ur(Q5`TLjM%#`8#_rHuB|9}1hItd_vSpNO`#qjs<|KGp=|NIHm@MXqK z79K7}ZvOwQ9Df%s{`~lX*xI%KzW-!k{Lc96Cr|@G0I@Lq`0?-epMSr9|NHeD?&umBG}6iH(DSogJte zDERNk_kV0Zng09%Itd_vSb&=T{rt@+B*66dJ0my{fpNkvBm!jpV_;xnVgd@XDk?Dx zh=IJyzyJ_HjJJUrz)|>#fr0nRl^;KTz#|yK`2G9$BS%LzureS32rvK^u`=B;c)+&+ O0000Vbu`-)NXk-Y`p?2$B#e1 z{(buQ`}e;;zyJNd_UF(2w_nb@VUiUP2igD-Kuin_BL6vl`zgIQV*mR8|8G|2U!T7I zn`-)Ow$bxne}9LGfB5z5*XcJ*K(;aeSD>o^0st`p&i@1e@&c~g4N@7~{}B9V!5sbp z`j|K8<@Nq-&kt=P>@pAZ`T7Q#;RiPl^j;kSgdzX}05Jg0{{#R8=f>y-z~LG0`u_d< z{QLg=2?6_k)DH^)`=sFo8YTUi-v;{r`o8J{6Wj>^)c^vB2^cJY|Nnmc_5b@He}DY@ z_51JdufKoSslWR1>-W9)3`r;XfsXn0`_Fc($H!lT!V@5Xn1Igu{qOIuf50&L{qg7D z?|*(LofMGa_%_k-*{}b_0g?9mMSwvE)Bq4bEIr*1})*zF_+U)&LMdEMOb{Nb-vOh6FrNC(tkd{&4;N%g_D$&)>g> z0^hO}m?z%iIsOJ1mka;_#K>R{i_RZNQ42x8VJSe8f#Ern2@qfa%&RHCyvg>Q00000 LNkvXXu0mjf=TkSf literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/cd.png b/gui/slick/images/flags/cd.png new file mode 100644 index 0000000000000000000000000000000000000000..5e489424884d2ec9e429f70d69af00edf242a077 GIT binary patch literal 528 zcmV+r0`L8aP)JkPqeYl28iLgD=0{><0$P44T5yOrT$dE?(KkwMFdoG^-J zGv9P)Kk|i5`lcNgUUAbboca5{hI)v&h!9!~`Yg)Ld}$VwYqqXn@gVLi>3LSVGm1W? z3qnDJAk6chH(u7f~FohUBCxfQDx8?5BQsCcprAnfVhO SHC~zk0000@|NZ~|iEi8i zh~?j3h8^dV0y&$fY|i?}`2XK;hJSzm|G$6#|L@;V)&KqZ3sU;$?>`_ZF38C6g#jRd z7@s_ODJ3Nev=9gw8UKSQhX4P)z5oCE{eQ>y|1j|H-+x9%#`EXT0R#{W1H*5i5@u$g zs{agN2m-%;fixfipeaCQpFe*F2q2cU!)f`}`5%6M06O*WzrTN({{8*;CkCkD_wPBk z=llWket~@P=ieVecEOTuB>(}$vTge|RYlbYUmpDW_v_E!KfnL|{{8n?G|>28zowm@ z_UrGj-+zAtrGTUoztWctUjPD#h2amw@BhDn5OHz(52cFPg zot=T34qlT?57Mzkg5?0ssOG0Ftp>paW8OyZ`_I07*qoM6N<$f+2k} AjsO4v literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/cg.png b/gui/slick/images/flags/cg.png new file mode 100644 index 0000000000000000000000000000000000000000..a859792ef32a02b41503b5ab5f216191af397e02 GIT binary patch literal 521 zcmV+k0`~ohP)i@P`2b{=v9^Ktp0uZ001fLMSM)r!?%mH+B91 z=ii?+(ckX8zrd=&8g~5t-|*}I50LQ;KzRlRfB=Hn08;wv->)Q*Kc0LLgTdsU-~VfV z{r~#=|1XdRMzE6r0tlo5X#B6gzhXrG`18Y*0!g6iieLY~Kvgqz}`W zLWO>Z3Lv@r7+CdZpiy8Ae}EeP0z(_<2Y>)#Vfe-1#`njMUlORAfdMG=o8iiD#%aG9 z#Q!h|feZ$rzkeYJ=p=vuV)VVru?7U|?FE@Zm|i>fBlzF zc~M_qKf%h=bAcoS;}NE7f8|yFe%B9?;;8%o@BeG_!|(4qhyo=(h-XBmKHXpc{~y!A z`THH3fsDVeudko)ARzm9UL&JI!+~uEM*rBES1=kd6zV%LH0J*N$gIQAc0y}k9qTFv z4h1oVG?rB#zNY^8{QUp5wE>>R#S4NZQd1i@F)*?OF@6y}@zmk^!Gr7L9asuAf!ae1 z{{CbBBH^Az=(+fAb?mHzA!MjRs*H~|NF=I z{~td;@BjZG-hUVsqZ#w(|L@=b|NQ>{d(*K^00G3pzycQk`jp|{UxvSb;p*Vv_V?Sr z{{Q;@@3$6WKrBG#F*5vR z`2XiW&+Xo6{KsbP_-SF+DJF`pL$*;0gaz z7NKVhyo`U;4*0+SK#>rfFFfafF5DUYXKh;r+@n*scPQUy6`!63S zGXn!71H*qtMn-04W+o=4|487=moEST#KiEAA;m(3;Xgy1iO{3BKc9a12~-UM7^Z`) z1qdLZI~bN-c=z}J|D88K{QmR*&tHcBxB*ZDKmf5Ya0q<-!`is-{h$8~f7m(x{QZSX zH3Jv`1P}|uy*o^wIGI2G`1kie)4zYe_&EQ6|NftW0ohon1}3I|Z{7d|5aVBMp0ssVo0Ek~;W>Z#0SJsA+2j`G% zv|UVeYYs-#Sn6_J90h1VosR?LBU7{U1rQ6+R0f9sPrg3=`~UA>#=n0a|7Q67_y6zT zP{j57|G!`V{{zu)Mn+knB>(|98e;E17s>tTLaMG-~Y>h{r`!g0jL-tfS4HmF#P%V_xIo5zyJLP zk|2W%e*G8w^1X|KC618W{eAoCFX+EI literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/cn.png b/gui/slick/images/flags/cn.png new file mode 100644 index 0000000000000000000000000000000000000000..89144146219e6fbec7eaa89e1bf4b073d299569e GIT binary patch literal 472 zcmV;}0Vn>6P)$bmtfBa_T{rmsVufH!rO2O)W0!b+P{TrwO zAb?mv&i(NBbu;G`sX*)cv$d*%>MiL-(QdhpkjakVmyu%k;sfcNRj;yhJaxT5MTg0u5&QfH8#Bf O0000XbC_7v4G9~kE;3? z$h?1GrT>4y7{3|*{r>Zd0U&@_82$jY{AFPH^Plk#hy=QU5o|Ds0oDLyFn~2M0QE2c z1P~*G;PKK9g@-SH{rUU<_aC4k|G@~v`1Kn|{`&=C|M{yZ!G37cNq_)iVfexD=MNA8 zh5p0Hf4_c1v;p<}|Ak}_F!%rh2&CcXZ-(!`82&@8$XA^gF6?xq}zd#y5N`WeVBbyB+frxZH0- literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/cs.png b/gui/slick/images/flags/cs.png new file mode 100644 index 0000000000000000000000000000000000000000..8254790ca72f98d9e79d94bdfcb8839b1fd434ad GIT binary patch literal 439 zcmV;o0Z9IdP)|s3jQ%L{DG0k=ogG+0SLgMnA-pV!aytqt1(q3VU5g2cTadE%W~lnu`}m; z-504zOD10s2K8+~RqF^K7O;8$o;>*sR0>r0`!|sM`x~eNg#P~i_4n8BzrTI~MgGdl z@-i@d0|+1%Q&SyHO(9WHu7Cgk{{@--A8b6x2B1zb1BygNIks=N00WJ{7y^0)%zz1kWJN^&bany+5X-;o*O`wU`+x5q12BMq=+`e0f-vAB ze||Ik`OBc90(3J#0I>iAmFf2%21!Yv97q%>_xm>^i2a8FLV}HlAfRG^0AlbRVNjfdgKH->)<41fMG{Q1Z53yA)}NHF>VM86o=*Z=~EMTLRklg;&|8vY-+ zh5rBh|L@=bKM?ZoKOp1JpMQV<{rmmr|L=eQfFkpA_5cJB<7Wm2?&_*f&z|!oCH%Iq zVPN&@1^xa7gnxhi`TP6#zh6KNfByZH;9_972M|CY z4S#m*VEXjw_teQhfB)LctFzlGTKpda#8eRa1F`|=V+j!s1_l{`0AhU0z`&K2_5c3; z?|=UACdB;@3Hy%?Ffai9!1(6P8-M@;JL%7#4}bn}Wu*W1^8Nqk|9@zxfJk8Yg2Rge z5=!5G`~e6c79IwMkAMHSMfCl8%kXF6O^EHl82Alg`~}6s-@pI={`>#;Kf}J}IRF8~ zc$$I1RCFdZQi0L={}0epF!T#d{sWT?V3G+SzyRi{Q|!NXWpDrh002ovPDHLkV1m+z B7Bv6> literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/cv.png b/gui/slick/images/flags/cv.png new file mode 100644 index 0000000000000000000000000000000000000000..a63f7eaf63c028615b2ded5878b5e14a7dbe962f GIT binary patch literal 529 zcmV+s0`C2ZP)*82p^=00=`tlmIeOf&y&dk@6oT z&CV8YCOfMzZ7b-;WHc4ffO0*K`UGc#9pHKW{n=1`s=Y4`sB0UGuD|F2(+4xFrs{6A+r|Fh*S$P>SRGs(%l z+O-QHfEa)O{tdAK=ovi517(5A-n@AO5I`)f0sl(Vm><0RZzq2;(QtLuuFT6X6;y@p zb-8u)9gSFj-3}5^z@SqUX4qfA01!aT3<}j|#!Osn3@^V(zxysO&hx#~ZN`f)vS*$d zpLlA?$HBnM&cM&k$j1o^^oKjY0t65vgZ)>ehy*ei5K#*ZyWju7F%Ll?01#jRixNU5 T4U6zw00000NkvXXu0mjf>cZT~ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/cx.png b/gui/slick/images/flags/cx.png new file mode 100644 index 0000000000000000000000000000000000000000..48e31adbf4cc0074f40e95f87c1f103b91fe270e GIT binary patch literal 608 zcmV-m0-ybfP)Uz~~Q*L}q{yKmai^Fs!d`Rbj9@@=xl~KZbvQ|NZ^*|L@=bfBpc` zKOp-38^rz{DEepVv)`L`Yyt=%76t}3hHqR?<~aN{I`!9n&u`}MKs~?z|Ni|Cihlk3 z1w?Q7fI4M?HUI<=3&<7!82Y{{Q;@?^mDN?|=V) z{r~^ll=rtu5CcE}F#**BRkyY(adR>Mc_H{~T5^XRV~oVFSgBv#s=t2z{grn0SJIVV z|Ni~D^5u8)5(a<(0%_pmV<{@S{pr)+Nt0E6|KyV7{&xHKulY}Z0S*2Ic2cIyuhSoY z&3*a@=p=vu0%~ALNs$10lZEA9e*W!WzkWV{%9A7hYlh}ewm<)V{rd@2{rBIm&Idr} z{RV0P2mmnv&i?}d08{q%2kh+oUtbt0DGA2L@2{yn^Xv%Q%_4hjZ2Q{KfBuh*0fWjOcoPYi>{Qk`ejtlm`TPy!Q@c0|K1n4Ay00P>u ul!4(JQe+}W>@P40kp+Sq42=5$0t^6?P(4CrvcmZQ0000s1`2Y9I{~ve$KWO@Yukru?KTxgz{s9CK3*7Y} zZC_6Qf4TJkuQ&gHzW)Di+kXz$|9k=eg(Cm|XMz~|=g%L20Ahjo4`KiVr|y5|U;qEV z`p@?NKb!P_9;^R?@o<+hfSm*oKp+h;f&YIQ*bg)L>I;A4WVP82*P-nR{;Wu@%{Vvyu7@~4txIf`R>OD+-01E zIfRil07L2S-Mat*#Q65@TRuKMWMi;}EJy%|ff@h;2;_%%@7_UT@edf{0+7H22rvMY Ws9gjvbyTka0000? z0048MLcfb{@Lpld*gfdL?Z zSQvhRtN^J#x6%GQNHxSfxHgc;AD{-1tAIKH0tl!9q}uD*5!1Kl8Kk6va!f$;fJ%WL z`2Cv^NdEc54D$xi27mx!VfgXqT8ME7!~2)OPy-`SXu#NiAkhzFFflLy1Q-A_8F>@M S6G{sJ0000h!ZNvLM`<}kPiIA3?K?Zl!VJuS0ABN12uI2v;s z000mK68GQM4oDR3?|C6;zBc4LR82Q1eETXSa+3nD0Ad8%4|Ml`Fn}2U{~ypshW{9V zk%{T!hYtV&#KHiVV*o?2zW>+&Bgm+K00G4EikX==E9>w5`yf~S`o*<00G4K6dZ++hy)_Bw{QPEdi2K7 l5H1Kw2asrHVqgFWFaQRwS@oh;XP^K8002ovPDHLkV1foV*8Tth literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/de.png b/gui/slick/images/flags/de.png new file mode 100644 index 0000000000000000000000000000000000000000..ac4a977362738ca7daa20784717f10f9617136b4 GIT binary patch literal 545 zcmV++0^a?JP)h<6BFn%a z@b8~2SoNP@zd$;E{sbbRuHQd?{QCI=sNwhbA3*&Qe}GP900=;09NYi^fU@pUdVa9*13;+Sd!tjgXKhXQEMobL97(p6<{RLvMGBN!7 j!N9=G@a-1^K!5=NcXWu!7_DDe00000NkvXXu0mjfeQx^H literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/dj.png b/gui/slick/images/flags/dj.png new file mode 100644 index 0000000000000000000000000000000000000000..582af364f8a9cb680628beae33cc9a2dbe0559f4 GIT binary patch literal 572 zcmV-C0>k}@P);we;9uK`S<6~zaM{qBL9B<0yBR7V`E_e2q4D) z|Nnpa!Ep64!{fLA8NdLj;oraifB*mg`;Xx-kn#6Fhzn-q&in!pKrBENJRA&WD*ySo z7*5@0`26EP69WTC_22)0z>5C-g{l_hVFa245I`UeKudt6h7^Mc@BgDW81BCO4-x~L z`sXhc{R3+I%fRsKA3y*x{R6rHsA1>M|6jifb2E4w{z{xB{`~z5CPC;Y7bk|9<`c2PXgjR$^CT@Hzz$KrBEfF#?VC z^aSdB^z+g5SJMxCJOGqNsQwQkfr0#&=?~CJ009Kjz|71H^!MIRd#Ajb^76;aUyQ$y z%m(TN#spBq-#`C>zGeUjAdrR+|30kwu=eoBL!3-pGMq9%bs!`E|ACMovw

4;Zk2 z8GbPU1Q5%#7t@Nb6*GKbU;u{yA29j{CVzn$|6qa)V3LCYAiw~8(_SNKujRx50000< KMNUMnLSTY(1rd4x literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/dk.png b/gui/slick/images/flags/dk.png new file mode 100644 index 0000000000000000000000000000000000000000..e2993d3c59ae78855f777c158a6aae6c1fb5c843 GIT binary patch literal 495 zcmVh!ZNvLM`<}kPiIA3?K?Zl!VJuS0ABN12uI2v;s z000mK68GQM4oDR3?|C6;zBc4LR82Q1eETXSa+3nD0Ad8%4|Ml`Fn}2U{~ypshW{9V zk%{T!hYtV&#KHiVV*o?2zW>+&Bgm+K00G4EikX==E9>w5`yf~S`o*<00G4K6dZ++hy)_Bw{QPEdi2K7 l5H1Kw2asrHVqgFWFaQRwS@oh;XP^K8002ovPDHLkV1foV*8Tth literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/dm.png b/gui/slick/images/flags/dm.png new file mode 100644 index 0000000000000000000000000000000000000000..5fbffcba3cb0f20016c9717614127b89db4c9664 GIT binary patch literal 620 zcmV-y0+aoTP)yt}{r~U(pZ|aU z{rk@#!dhJXj+vP`D&$&!2yPR?Jud5I`&tqo00z_V3?cpb$_)%#~li z5Bw?p&G@T5&5h~tB<;UIJ-`3_mgbQL+5iwhOdtm^{QZlh+Tg>NcGo{qR#UR9ewx4g zlzHy^uRp(j{rmOj?;oHBfB*n70M7pb{ow!s5r+W$=Kufw0RQ~_o$a1N^GPoTT-yiw z&XGVBSbe$r0&xrf|M~#~9P-zx0st`p&i?@b004Y@cH`sX`~3X;`}>j`1PlZ1WGkKd zF1~FN+w&9T}cJeJULy4V8r?0tNHM6WN&<2126ppbC05A-~q$vMCOd&N)3^rn&3WaiZo>@dB zxpL5=L>h@#UjVT%{Q39iA58Ths0J3s|NohoLF&Lt!8(8c18V>XAjZFc|1vT%{s#lF z^Kb%2CZ>-cJ^%y|<6Q;@;r#qR4;}z*|Nr|B$h_ab1b6QI%fu2>dIV_O?>~RRu82tM4=f|&Ke}8;oX5+eBw}y?G6)5=s|Nnnr@aNATAPEpaEN{Mj=m^OD z&%p5S|G&Tg{{H#<7bL;LEGj9<&cFmz{_j5mJbLs9Ab?m{m{|TZ{D1lB9Z2clKfnI{ z`ThHs^2c9)q;CF`l>Eoa3N#g>nv07INCE^93jWH3lKe}28-VENu!{qxMpm&svFOiawo%#4hT5U&FS z5Yzu(KY%Xz`RDh~-yl6N|NT~b@qz9A2lm1$Hf43G`D-AmnZXVNY5)izCWas1fbRMA z8?52ykLBVV-&q+tkKFpbbOC=r`2SzOfQo=l0_p*hfB*gk2q2IKpzD7Eo%H+Hk6%A8 za57|Q3rv;f;d1r)FDv_xg9F*eKs^8f#KQ37)2~0jMR){${rwHH2k3S7pO3`Z{#jf7 z{|`16Y&=9YkOT-IMh0&|hF9+yelRe6V}O#tcxPkSx96}BCoe=1&?OKCkOT-Y05IoG U$(*n^qyPW_07*qoM6N<$f?|9Y@c;k- literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ec.png b/gui/slick/images/flags/ec.png new file mode 100644 index 0000000000000000000000000000000000000000..0caa0b1e785295d003869330fc4e073dce07e7f6 GIT binary patch literal 500 zcmV1sCzZm}g`N!}J$oTi?|G$4gL7*^D3`7C}Kmf5Y{CmeN)&f@km*M|^ zrvE_l-~a!AA&BAspa1{=fXIJ9!9O2vbOQts3j+fX{b%^|8m0my0Yd-4N`WN9@BjaR z=no^SIM8~400P%s(0a|A0FHhM?*o#se9Q zEZ;b|7ytr@MWm#zEz$bb`!9d~{{Q>$@1MW_!07MqKOpw+zkh)g(B$8L|49h*Ov!x= z5I`*NZ%IAX?Fbu$UUAQCA3`wxix_2=I& zAouq_SzðCcuS!~%52Kai0?gF&VORsRAR2~rJG2PFT1^!)w@)C_d-AAkU2Vc75Z z*R<@y`9z1vevIh)-p7{p`5C+7f|6l;f1_&?! X)GmJPc-xs)00000NkvXXu0mjfGFPrC literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/eg.png b/gui/slick/images/flags/eg.png new file mode 100644 index 0000000000000000000000000000000000000000..8a3f7a10b5757b006948ea4436fb242d02dc9a4e GIT binary patch literal 465 zcmV;?0WSWDP)LAHVtk{r`=k{y)(2e*gi*sIRYISXlV_^=qKp{(!;n-+xj9 zUjemETFMXP0$m6sfwJP_;%#kh009JYeOg-Dy?gh5gTXH_fG|KLm<2Qhs6|CZ<>JMQ z009IFR-loRl9E6vpeV=!FaTTi8)D~Q7yv2;2q2OXK!5=N{?|@pNV(X=00000NkvXX Hu0mjfG@sA` literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/eh.png b/gui/slick/images/flags/eh.png new file mode 100644 index 0000000000000000000000000000000000000000..90a1195b47a6f12c70d06cb0bd0e4ea88d7bfb03 GIT binary patch literal 508 zcmV`hKmn*~pz%QT=MPXRKmaj;?1ifa0xhloNlE|L zuK&--1mwx?-uoV+`qwW8u#*4+i1F_GyFwg7fByafIr{%Uh)$p>Ae%w(|Nq~=m~|`# z{`_H7QhIal96$iEC^sml1*F~kc<(nb4FCQ91q_kDz!3TkBLDsd`Sky<|4qNomi`s~ z`xoeVfB<3v8uI)9A4wibp!A=AfB%5B0nwj-e?TNKsQ>@@`|oeijK3Q@{{o!^5I~F! y*$fQd7#Mzm(H|HCnf(WhfND7yc3x%x2rvM-AWsdQI)rrq0000!E|`n6Mz6>fhdBj29g(UfB*aM-=Dw#|NaG$fByXc1LXhxFC@THKjjKQ05P&# zA9gbr+SsEBRPB^?1!&T?30hEBFhHFGv5AR^>DH}B00G4E=NHV45I6k$@0N4rAH*g9 z{zDN+_&*OP%Y{RC0Ro8e#fvv0A_7PTA~XKMG0?q08}8kE2oOLl>koag&}IJi^WT4% zN&g{c!yE%t3}J9_Fdy0V1t5S}4xV|TB*XjR%dfvcU;YDm6wdeu;Q~GU4{qW|y?pud`Sa)3|NY&vWd%S0u>b>P!2!lUe;6EF*#G_c zFVXVt@6Q{uX@40W{p0iY2Aa+A^Cu7i8KT+YH}2j52q4BskM2rJ$^k9;2Xxc_|Np=M z&VaLlA*IO5FlECMfB<5VUNC{tBZO(|zW*;@GJN;|bTJ71`0*d;`d`2P!x=ymOA`2> z+y@9C##^^8%gd{MW@Y91_2d742B2~OQNf=-zkmD?Vqkdk_wPTUNeuu2#KPTG{_;O4 v7C%8E5*DLB7#Kb?Fnj}}-(W6879hX?8lYRg`Y`<~00000NkvXXu0mjfD6Jtx literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/er.png b/gui/slick/images/flags/er.png new file mode 100644 index 0000000000000000000000000000000000000000..13065ae99ccace42df97be8b594049f9f40dcc4f GIT binary patch literal 653 zcmXw1T}V@582&uljzg!GcrmAG5$1(Rvt>&(jx%j7OGE_~DVuFcQkgj@33fJv($pjj zgoNxWFM>pG#K4X+%S_Ys!f>f$mib36%ekHNec$;y5njB{!+Y`YzVGwA&4mTVh%ikU z03gD2Hn&LPeNu%hDG7PUvzrphs|^(-as$IIo1LmPya%Hc0Qn*6qc4XX3oKoa+Z)_XBQk8 znPA)XelBh#6J<)fj|w>7X+~Yun^@Bp4$+N z6L8rb{%QnJN{fql*fJH1L*2YjUlB~CXS&&LY)1V3h&68|x1_5-(4l3HUgs~3JvLXI z$_D=zL{dTnq9RK`-w~w|sCYqqA;@OoAE0!{9Gi+cF%zA>5*8OAiXWs z!A~!@Tb_6WJ;mn(q~>CYJ~Oq(|Mc`miY)G1d$)?S_lf*=dz3nd-8+hwz5w#U=!7L- z+Ve0W8Werm#o=KvYxRVVNtM9!poHk%m;Y{gxKdXC|Y{ fc0^aUlspXz7vm>S7OoCUZUIwXLGJ6E%Z+~lY(hhH literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/es.png b/gui/slick/images/flags/es.png new file mode 100644 index 0000000000000000000000000000000000000000..c2de2d7111e3cb59cf6511dd2ab045e824bdb43e GIT binary patch literal 469 zcmV;`0V@89P)@|4`Xj5kLT%`al?B=W5I`&pe;NKW0^Ri&h`xRJ_x;0v zUa?=y?0^3M|NZ~}FE9c#{{3cP{Qd6}13&;Vf!z&M{pZWqKYu4MFm$tgedF}w=P#IQ z7-9gT-$11R0mKA$(qEu4%ok$*y!^wMRm*x;`R7|k6yu?K{s8?55I{^|9{?Tjhec2I zv+6&FhFWG_BbNVc|Ns94tNRJp!0`V!Py;{!F#$2enB#XZaohg-5%Tlk#oa&nzQW9g zl0Y{D4gK?n0U&@Fe=;yIr=|V7caH%YEYL84k`Tt9-wc2LGODP&y?7BIfLMT@X8Qey zK~fSFpuiXa$^kk7RCwBA zWQbH``0|MX0{;DB`1Ob3-!Fz=zZw28fY1*HhF@R=VQ?@21P}|ur+3w` z_wT=dfByab`{x&s{PXYspTB>919^Y{{Qd`I{N9v10U&@_7=ExZ{APUe{`KE~Al1MB z{rb!Jhml3<_uqeCzux)%bv7|NkFAvw@aK@N+YWG5`bsF#yj00sZ{|0ReUZ0OJ4u`~d&_lgxzd z_7grGtKje;)ax=32IqJ>VE_O6|Nr{|0Uz@6!2*a0?AgCSJ_s@V{`!jztXlEUzkg2h zOW%AK0ILQg2A~)NKmdU>0L=y=29PKt(~s@sMWK)O87MU|4G0ImPt*+y7s`{{I1L_{;G9FVHyv z0R+;(^!pEkq$JpwzYKqVGyVRp{reTr#sB4{{{Q&{G@Ah!GGGK$3=lw!Ux87Egcwk{ eXi`7`5MTfy3O%OUuKb?>0000SU^I57#IKohy|#uQJDd#=|98& zUrgMLRb~JG{$u$2m+|*M=0AU#{`@s%|H#1h=ih%I`g`z86F>lpk-UOTf}FCMD80)oDIYC+&q4vMR0s0&DpH|L=c>-#`S^3sJ`m zRPz_88i@Y=|MmYr*an6_AO0`^1P}|uzkh%JGXi;k8UFtPIt#4m|G)nbm0000FP2AE)Ir2{}>qlLBSs|`Qg(SfB<4)VqlOE;Q=cD|Nnn$ zna02W|Nj1E&`=Tpav_4q;M$#E00G4E4{SI@`q`VGKvVzz{r4XmU}R+c_2(Zz0I~c7 zs`v*r?Dty(;z&PFFXX zRA5t=4x{1SIibD)Vqy6A2V^D4P_SySA|L?j2ip1XFA)9%V~_%1r~w2J3=}{2Oiu1 f7(RXZ0uW#T>&I!FfdIJb00000NkvXXu0mjfj-u42 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/fj.png b/gui/slick/images/flags/fj.png new file mode 100644 index 0000000000000000000000000000000000000000..cee998892eb316c3293ef2d52afec9218bdbbc03 GIT binary patch literal 610 zcmV-o0-gPdP)2C05Lr?a%1G+Sb3M_ z-f!*)-&mJ@lxC7weD@!u;s2li|9<}wjr{Zf&o8mqKR`Cn4*&rGF#yj01QaSLwCD}R z0w(ww8v*|PzTN}jB`Pj8{QK|!{{8;|gOCLd|L9jy6{oELG6Dcq@B)aDq496GGsCmb z5T7wXTnzN$?|=Wl{r{i6vr6{G)xV#={AXc)t!L+QBoiQjSb+Zc`=1dU2n>I~p8E|B z6OfY_{`1$ji1Pn`9_T5yZrhJfj0}g~00a;V(9A!7nZZWFG{8az7^c++|9dI@cmDl* z!Nvb)UorrL86bdIfbsI1fk}{;;V;BV|AE?oY(}v2K-{x07*6Kx`SfB<4-V2A|A=r2_C101z~ iU~vp#0R6xN5MThlzdwv9U#bcK0000}CO1*!he@c;k+ zfB*mg{rg{#hxPwIh8G{d0|o#7{Raep|AEAFCm#U_AQp((@4x;AD*Xo({rB(3@4q1y z(m>63@(hzyJPYWMEi%>@iRTXyxzU zAo>qT2S^W413&<={Q1WKlmMyz`(Hzv@8AD_R~~+N^7b200Z@m&0zc4{Q@7rNwftxJ z^$Q??fEu9g1Db8CAq;fMkDq@pJa`8*&sI~^TtyHla^%`8uswf)HUI<=3()%@Pl0^! zf8Ui?K|l%XeRX{Qd(n@juAHz(D*15I`UefB!>$cK-hRUqIf!|Kj}Y zKt+#Ue>r^ZHOMRf{y`i940V72V*2%m0pg)Q5O4ka4>U8*PAAEH2(%ZZ;ol#C0AiF(UW*)& q3=s4Oj6m#vP&UxAe?ZIt5MTgFMVEBke8_SD0000BE0lK=nzFYgc)d0A2*B+AFf z2joHok-@WP&j1351!6Wt`q9fjf1W;g`1ALFY=DuG5oiNI0I|ST{|2JJ|Ni~?`|A$_ zRt*pr0t5gt0M7pe4IJopi4@}M{rvp?{Qds``}+I+|3-D|`uqR;{Qmm<|NHy?`uqO- z{Qn;q1i_Qs0*LV@1A}N|@t-FT{{IC^{`vn0sPGp^)o&2vABgb_!eEtCyu9%!Kmf6* zGhfda5_|CT&#%8A#S0%rhKer*8VNG{57cZ3sU*g7is3Rq0I|G(Bf-nd3vr@r@vHy8 ze*OIQ@9-oMOb-A(eJ@7=Ab?mP;SCW2x*O<#U%#>Y7zqCS`2!F@APw*!ml9!S{vjhP z$_zA&0R;fLP(1(v#Q5^%OL#2G%0Af7VC%@R_vTF*lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Zk)EZ(2O=d>QH$KN3zEi7S9u{+2K>GX4ds`2QcM z=+A$K-~a!^(JwH9Fn%*K{{Cdb01!YdV9)*qi~a#?`wdg{8%Z^Y!NB>w;@|&31~6!UgVU(k2*|8J(R-+sudaynhucHbwAMTnor{mwqO^w7JHzaBsT z{O^B8RYf5+LvDs&KmRKVd78=o{`1#HTiEo_OolaGleS)G+IQ#sUI`b*pv<`1zCJ=H0jd{{2S>p`ri%{LsXJ%FbMS z$#S`6f|?OG!^Jxczkf6Q`UNF{l0Sd`ad7zm>({^EzyAS6{{CgrkluOb3l1A>ZU2~A zK+FZ=zkmP!`TOVhpFbzBzFaPmD2$N3;+$pK?>zdet`f0002ovPDHLkV1gy;I?Vt8 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gd.png b/gui/slick/images/flags/gd.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab57f5489bb9ebb6450cb27f4efe0cfb466144e GIT binary patch literal 637 zcmV-@0)qXCP)@|2i2MUNJEAGBA`g{QJZ3ub1IpEW7h{~Z4K zJ3#Qa=Q1XS-;5h0el2+U>(Te$zyAID&HDTIKad810Ad2W{jW5`@9y)AKr^5J{4Kqa z;cw*UKQW)B)-pW&@%z{RUqB7N{{H&&_Ycr?fB*vd;rG8kGw%JlqX`uK!_D~nn&&T_ z*-Q+-7;nUX=6mt$`7e;3-;BTi{QC{m01!YRC;j>JdmqEEKMa4Icz%Tm{+4F_^}h({ z_1{sye%WyRp84|E^4Gur0Kxx1e;6150*D2Oe>41%=Kmef^V^IA7&yOx!2%AYU;o*D z%dq`!;`!w)_PhDb-(PS30!;@9Adn3rpZ_$9NHVegX88Y?;V;N+#{WPzFy?-P;*ar< zJ?CFrnZE^h{{CWM00h;Fvzl@K2fHp9I6dqaaxb00=Mu XLcuQ~?TP?t00000NkvXXu0mjf`7udf literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ge.png b/gui/slick/images/flags/ge.png new file mode 100644 index 0000000000000000000000000000000000000000..728d97078df1d07241ae605dff2f2cac463be72e GIT binary patch literal 594 zcmV-Y0^8x|9^h-OG^F+g7@$L?BC01YQ`Wbb?43;K=s|G$6#bNnb!1Cx>Qe>QfY2m>?Izi&U8 z1o&Rm*8l_%%a6%3nS?}u4*37)&;Q?l7=Q-<`}?1Z>;KQLY|KmGQ@ZWEch0Jnt zUmm{%2p|@g=ujpTGX@n^21dqzKYxO4`1a@2NuYivJ4XgKw*UYBFf%g!{qd7YP>5~& zE`R_4F#yj00OjT7{QUg;`}^~|xBB|}`T6Q!vcs262Lz;t$n|1+qbnVARhhy8{z5C(*C%JTg?tEV3%;s64O@&5h$(1-*>2%Ak`A87BFlP7^( gh&l)WvH=1N0MfQja}g1cO8@`>07*qoM6N<$g4hNuZ2$lO literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gf.png b/gui/slick/images/flags/gf.png new file mode 100644 index 0000000000000000000000000000000000000000..8332c4ec23c853944c29b02d7b32a88033f48a71 GIT binary patch literal 545 zcmV++0^a?JP)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&ZRCwBA z{Lg>@|4`Xj5kLT%`al?B=W5I`(ov;U*021*0XgD3^5{teN< z@cTDV13&-@;@|`T5QYI@3O)ok?1DO<2trehc#kXh!0Z4iC6of!=I9L4Jz5Qk(jP`l zJOKo8(qFLXAF#IH8`u5XwDI@PAHNy@|4L4RsD^0x1N0+605O4m05bkR14QCiMDQ;; z>0h$aKjWi;+@CNFzZm}i25JBZAQt8_hOB_!_dovn^Y72^zrTL{{r&6TuiuWpfB*e$ zwD}j1{Ph<^0%eu?|D0`P00`k|9}4iHT+`$2p~p=WCoxfpgkZGj{YEt g{DC2GLI4Ob02tU}a;hkw5&!@I07*qoM6N<$g4!w08~^|S literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gi.png b/gui/slick/images/flags/gi.png new file mode 100644 index 0000000000000000000000000000000000000000..e76797f62fedcbfca8c83c51951680d6a6e9081f GIT binary patch literal 463 zcmV;=0WkiFP)VoB37QQ+R{;bN6GSUi z+kb{HA3p-oUOth}-@kwP{0U71P%%INK{Y@H82)oDp3V0Dt?T`39Pi$;RTl%zL?{P4 z2_S%&kW~Z0x6qjPzkeV9`s>}VU!Q7P|1&Wm)PrpR2q2b!5Hle5FfeebsWZ)5spT9vc*+3O2}Iw&|Nr{sqx*C2&8&?7c>c4n{QvVC zD9-TjFQbI?+i42`0*K|`>)%Y*uQL4o{r~rGhChE9{`~$Pz`@Ka$@uLpb; literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gl.png b/gui/slick/images/flags/gl.png new file mode 100644 index 0000000000000000000000000000000000000000..ef12a73bf9628ff5a67b81bd980d9c5d2b2c0f05 GIT binary patch literal 470 zcmV;{0V)28P)J{teTOL@z0+>00G1VRSiT77W_YWkm2*^|KGm- zfAHXcOY8ruSJ7+$Itd_vn4oTd_U!+mLkz$F{Qvdq|L@-*^6S_C%a&nk00990)`(*=-xesBS%qG0|gf?f~#iu^9N|j9|i`10Ac}ZUz>% literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gm.png b/gui/slick/images/flags/gm.png new file mode 100644 index 0000000000000000000000000000000000000000..0720b667aff506d7892c5c301af04e6bbf932751 GIT binary patch literal 493 zcmVwRhhvIeu00_fCKU~B)yH$s9sXS^B!W{?M(W&}hPbMwO z;*cg65E@7haJ!!XVgYOW|Le(9kkY?@fpY);{sqc`6amR!K*q2CzkUI^Y_hUI(*XjA zMdSH%VNp?r|Ns620Z1T|}fB<6Q zlw#oF`Oo_sVk+2%KTsoq3?TP6gz@)3Ki_`_=6?VI#CZSdeQ9y&f57m8xf%uh13`xW zAjrhTbmsgSfB<4-$Y)3kNW1sx-tWJ^f#}!YUqA$5fJva>FJQR-`S({vK;>fVMSuWe z0mcW=Ig;FxKxv@ppTFP`1*!N0BL9M&0|dYz`1hCL7Xv^5F*2kxF#KQuvOqEU3km&! jiTr^fV1zR<00bBS-TrJ5MX@2w00000NkvXXu0mjfGz`_@ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gn.png b/gui/slick/images/flags/gn.png new file mode 100644 index 0000000000000000000000000000000000000000..ea660b01faefde01ad2527a6abcf7d1a5c1b0526 GIT binary patch literal 480 zcmV<60U!Q}P)@|A6>41A`El{SSoRd}EL3@|NdrR`1}9=ZwUJP z@AvHwzkdDu1yn7|BMY<#Ab?oFX8(t({tZ$6>;L~hU=2XVuU~(E|N0Bk07O6y00G1T zbT=bV^`Afg|NLS2{ReI~M8m&-NE-fuGynt;*hzmtW+Q3%1=j#1fvO=I{`~y|)Bq4b zU?=?r84r{KY4``%041R|`~%zYhXEjfz)k`h|LYgXRlk0r+3@c_)IERx{rUUv4^RU@ z0D&|xgN*;p0Mzyy>QQ8EKn=iP{qyfH5CNS85I`UeOuzpyNJ@hA{P_#yFfjaPWc&?| zr{By>f0X$D{QV0G@4r9|{}=!Qi18~pg5ikaD#Jf9Xfy-Svu_Nh0nj)GNi#731Q-A_ W8E1tdJ(&;y0000P)fLk0D%}*I7ff3uKv?i+N*~ULWZ>4 zW5%k%a3T{@*`z6pma6eF$JtK+F@C*&o=d^t|Ns9GOCXH@*Z?CVuP#7nB5Y|1kmu|NQ^=?>FP0zrYX%2q2aZH;)P`n*#-K1r9WbfYOYN z??RUX1P~*`M}`*mir*mb{sxCVG>rbhqT(MY2L1y54rHu+wi6(L7#SX-$0bVa{(;3h egu%oB5MTiLH(5{VMZMqv0000u-`~Ig{`~p> z=MRwl_xtx>F!}G#@4vq{&D;bKKrBFA+{}CzK0Nsg1pog2{{I_D14*DX1pWH^3y6RW zSzcL&Zwvqd#Pa7K10w^wlkmIISh(4kI3GTJhN2$mzJLD! z0*D0|DC|s(0(}1j8UFtJ4HA_S5@P=M@9)2VV#30}-~k05FvNkXnV5ck`2-L^EDTKl zn1259n3DG7^QXUm{{H**3#f!E|`n6Mz6>fhdBj29g(UfB*aM-=Dw#|NaG$fByXc1LXhxFC@THKjjKQ05P&# zA9gbr+SsEBRPB^?1!&T?30hEBFhHFGv5AR^>DH}B00G4E=NHV45I6k$@0N4rAH*g9 z{zDN+_&*OP%Y{RC0Ro8e#fvv0A_7PTA~XKMG0?q08}8kE2oOLl>koag&}IJi^WT4% zN&g{c!yE%t3}J9_Fdy0V1t5S}4xV|TB*XjR%dfvcU;YDm6wdeu;Q~GU4JP)J`S$qz^!f=A3G?{>83*rF;63vB|NHv-`~3j>`uzF%_#GV;x3_Tu z05Jg0{{&$2KZ#9J4f5RdzRdzC6Ae5p=(o+T{uB7y^ZNSwN=h$cVmJ#62-nx+ob%l!TKAE1V~I16T$|E1+i#l`u&y!03t z7ytqQF#yj01Tv_Ick58z;rzG}_y7F-%)*RRAv1X@1^f8;`}+eA4+yBm#PKA>w6y_L zQ&a!|00ICp0M7peY0>I$KneW(?7rp&{QCm?`vUdU)NRiG`uYI-`}gbY@;Dai8vP{| z4h7uY=>Px#0*Hx$0pxvffc*LW3+PFp{}_J#0ty11^n2!vLjod>mX_Jy|Cz2{eHy3% zAb?mH7=HZ$2N_TWSP@V&gaITO7A`uvc=2f<_uIFxDk_pd4FCZI)bI_+mz3lOl7E0f z{^u`PGlT&Y`3GeD{rm6lUtS;y)Bq4bz=+dkVE6#Ehk@Y-82x6z3jhKP0OI&0DF;s+ Q-T(jq07*qoM6N<$f)`^cRsaA1 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/gt.png b/gui/slick/images/flags/gt.png new file mode 100644 index 0000000000000000000000000000000000000000..c43a70d36424b66f1627216ad988cd23a4be9285 GIT binary patch literal 493 zcmV|9}7f|M~m>&%ghRD!%{(5DNnfNcHoNKp}=7 ze;EG#|IZ9j4hBF)cVB@t{Qmo2T96TF4?qC109^ty;2+Qi2B0xObN{1)Uw^{8{`KJ4gZ0H zP(J{D2s9NSfWR7{27t^!x8NVhN&g{E`Ueb#e*ggla?+pwj3Cv27=VUhwE^V&zaVoN z82$hR5DUYve}Dck14V%vK+Z)23?LgAK*7ZT@-zbjKmf4-BkT7+CNVw+pd~+kF)%WM zL>VCz0|PT7gS-eZm>Gd?16jcE4PH%g~!@=<9&!2x_@aEGW jS9>vVD)6R*AQp(xFW-Wt{{mJ2|NHk};Jc-)O#kPzME?5A`1{ZQ-#|To{!0im{$XGM z2p}eq*?*y`{{RjC%V7Pj<(}hvo^Z>=hrJ-xK=d0#0&M^~2_S%&fR6tAp8=>2$p8C? z0q7F5H=q9h`}OesIT^OczkdG%sRkpU6i@>|0I@Lq1-k@j0La}yZU2}V|JX_T{{Q!% z>EEtDfBydd!vuBJUq+w?fB<6o2X+#W53~WS;s2M<|9d72Yseq)`11cZJHs!aS-+wF z1}X*!ASNLG{ST%Ze}QTk7ytqY@{}>p)on&BOV)*xm;om>72$%sP!HhqD7ytr@1teTu4J7{m`^Wh2AGglm{~UiA z82u;s5_9PZ|FH1)~3de={)r1*?FgUtsi`kx>?C4?qC1 zfX)8@|LZe*d2K>lZN0{{I4*^b@QIr~;(tA5`a`e}Ddhy$ldQAPvkwr9kh3`~WiS7Zcc2 zh-#qDKOj^7{QC<;3||-k0tlpm>GvN7NlB2NKYyjTe{-?^h8PLd@aHekus?tQg2Ee! zfN=^CK#X6(5e!Gd)(i|h;JEn(j5jcXFhHq*fkB7?Aiw}&uW^ngBcx#f0000J&k9ol;AaCAG*Vvs6lsG2f+AJUecp&K4&zS7@MzJZZ+RCHJO2~-cn~)8*ZB# z%#~(Seaqctb3On>xdArM!+zLfe2=iS%3k1HK82I)yo62#|&;D2*%o~N(LQ$HrxFU=@<#wgQDty7s|5?>qxBTrc>UoBZ!}1le z#)a`Pq~$aEPO=D0fO80I7h5SSMqU=q48*j9Qb*%7#+Pi|ervSf?0bSFwKsAPn1FO| zKH_&kh#AJmvOUSnl~!1AmcaNJM5awz`0DF46>zWZuCh$z(7uBp0to4w2iu-uj zV9oc#M;CkJ!OT_8;~(;r&Cw`0K3r=(%@VWyiIA#;S}+n)^}q>|)QZ|IaYyyY!;frq z6mATysX~aM!z!n$rJ$=27fpoIr3iB{q|Gr32uDRa3PcNj==OQGHve|07^1DbtUgzuEQ=j%rDF literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/he.png b/gui/slick/images/flags/he.png new file mode 100644 index 0000000000000000000000000000000000000000..31b61bc7a7345cddeecfb0790d3898a1539d6314 GIT binary patch literal 326 zcmV-M0lEH(P) z`2`SRiUSq1Ff%hFoBj0N_jx;S{`vclk&$uFg{SFWn$kj?a9N;YCN$RqrQdw~5$&iF z<)HlR?KfoA5Ws@QfAIR-@4x>hZoIo;!DrfoK4XX@CF& Y0BRSm_{szt5&!@I07*qoM6N<$g7~(P(f|Me literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/hk.png b/gui/slick/images/flags/hk.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c380ca9d84d30674f05b95c2f645b500626c07 GIT binary patch literal 527 zcmV+q0`UEbP)00;JD`K-EmLvOuK( z0R&e6?>|)a-@i;iz|8zVIqAQ;I)|_@BNM~FU%wy-s0ZjAfB<3vx(uZH&mV?Ae;64V zIcsYEzkmP#{)7J;N}0Ju0muUq%~ z^Jl0Zz)k`PASO^y0(FCg{s2v4J zf4+RlSW)rg;lp2_Kl2?q^5yYkpazCNzyJOD%k=jzP%%INf#Tuc?>~%^l1w0DfWH6z z1E^V4lvz;l%d1x`a&jQQ{ROE8h7C|LKmaj5WMKG(8n4KVKd5of#=rm&U;y%qJ?5>3 RVzdAN002ovPDHLkV1mTk^F06n literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/hm.png b/gui/slick/images/flags/hm.png new file mode 100644 index 0000000000000000000000000000000000000000..a01389a745d51e16b01a9dc0a707572564a17625 GIT binary patch literal 673 zcmV;S0$%-zP)>fJ3En$GhGS>sbE%%m3$AD)q?8M9y>88-}kR7#RKlk!P~Y_PLuF7~U~3`~nC7 zF#yj00ZUDdpLsm{7ajP|&HwoK0Usg|6%f4L_{`Mi{rvv-`ukf=Ed&Gs-sA7L!Q7*a zj{*QO0M7pb%?Sw^g@yy{>ihEY{`vU@3=8@G0rvO$i3mOL`~mv-`W+b$Mmr&io5dg< z5v!7q0*L95jt`TzK8Kd(Utv)OSp_aLv){6ccV+Z`{Q2+asKUU&aO3`Kpz6wW8wp`< z28M3{0mSqnB#A*-c*8%1=RD#sSOwMznKA3=e&iEzwo{cA=PgXK`2OQ}gqId83!|%* zA_Kz@fB*n70M7pdECCwp4H&@R`1|(w-}M5x*74i)0}%fAt;XafA{48))#>Z>?CD#}*e}Ret0tl$#*RMZ7}Jl7Z|M45`5*URzH9L z{rmSnPy;{!u>dsyO%meg+00000NkvXX Hu0mjfN{&}S literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/hn.png b/gui/slick/images/flags/hn.png new file mode 100644 index 0000000000000000000000000000000000000000..96f838859fd2aed975f5f4134050fdbc0486ce1e GIT binary patch literal 537 zcmV+!0_OdRP)yNpn^YtfB*U? zE6K^g@B<)#SlTBTcsfda`|@_0R#{e$UZ3l|Ic6l=B#}T zWCl5lg}RFY8S^$g{qgfJOdc2ve*glAv3c@IFK6|y-~NDH^$#cn3{a5k!L9^_5>O@B z$^W^zSlTD;0tg^R28Q0WdbfK|zW)9V43odV{`~*->+kR1AO=tbO#T4}-G3E1?u#4x z0Ro5x7#++k42m+GppXWk{}2W^;6Y*k7i(1vOT1`b$6{=&w9#5#oJ b00=Mu*}Zhb7k&Za00000NkvXXu0mjfKokPk literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/hr.png b/gui/slick/images/flags/hr.png new file mode 100644 index 0000000000000000000000000000000000000000..696b515460ddb670acb7e9de4438aaf21fc5fb77 GIT binary patch literal 524 zcmV+n0`vWeP)@|4`Xj5kLU3fF!G{fyDoR{}_Q36Vv~H|Ns5{^Z)NZrr*Dqe*gae=g)r_`DNuw zfB*t(VEF(4$y0{Ee}M=nS{mB(NB;kxJOBSE{F_{n`2Y8>|G$0##TjK~fi?gH5EIz! z|8Uj6|NiY-l-<0|OxA@1MWlzkmOI;leLR z$De1;{4g{7^y$;LZ{NOt{rct07a;lk`E!5(f@%OM1_PkhC8`eE9egqWbga z&p;hdpFRZ$Adm)#>fe8W4*Ct02B|hR1*-n0rS<;(dx&bFRY1n$$BzL5h>;=uaC^Mc z(+@v?|NZ~x@4w%F|9yUZW7+yTpo@LH>e(bUfFghX{rmIxzpNnpimU?w0mQ=a>kp9s z8>AGffmuv7DrFgv!3yU7{`2q8f1ngFoPlxn4AoS-S!;e2821p2q{((sbfB+=MK@k8U5Cg$|VB~~? z2XKWZk_lAZtGhi{|56nPieMKY$Bq=4KgZ0muK;2JYWn}5;nka8K-GUCa!{rJenZIL z|9<}gF~mh#ftCOS5DU<%|Ns8~1)2?0{RgZLWF&|Ls)lL+iU2hL1Q5&LKMX(>AUTM^ zNU9+S#0FXN@8@rz^Zx+^5DWL07wmsTIe-5EX@IBzTJ`52%kO`z5F362$-h7b*KaNc zh6exv#P}EJiR%3Sk01R1^NZmZ(C**=fB*Xb3rzn04HN{CU^bJS()(Sf00M~R4FdxY z(0f3MKYtkh0!g5OAQFsz{e$TF`x|H}%fCO*7#IKo2o$W~FaxWA8VofRr202h8w1#j zz=!|{Ah3qte;CCj89_$={rBfLBSbS$5J>(7`GW}-*g)q41Q6q6a2)=FMdm+9l%onl dL?8elzyJ+{hsuy4pm6{I002ovPDHLkV1hP90PyYjz{{0J*12TXlP$`i71!VmC|LYf!%PK1iv=Z0I@Lq zVgLrRB#$I8Q2qeT`3KSlX8!?(3s3+U9e@9T1Mx3N13&;VGFUSJ^?=Y13Wr{r~&-|6d^ahvDC! z|G)qK`}^nrA0Ybu|2K$nd)6X=0AgWa1{?O`IRi-PU$8V7{r&w9sOb0ae<0Pr|Nr{M zEF}%J0U&@_82&N|Y=e#y>zg27mx!0Xgp5*S}vr z{r~fq0csvl>92pk!P<5VDfB!NI2#TFQ3lKnzfB%Al=06ZHfFW+c#KiRe{d<4_V)^&)A0s0pNIe5S)eu>r zF8~6F38(?TQZ#J<0R*xEXct5e0}KG|WIzExE=U%r7$AT^8h-rv@ecwRzz_$3Xaxu` Y0RLik?wUgPu>b%707*qoM6N<$f;0ZTz5oCK literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ie.png b/gui/slick/images/flags/ie.png new file mode 100644 index 0000000000000000000000000000000000000000..26baa31e182ddd14106e67de1ac092a7da8e4899 GIT binary patch literal 481 zcmV<70UrK|P)1Ab?mHSU}=WzCQi??=KL1`SXRBmG?g! zeExSVgb4YXfjasA0Ybs`#&c5^XvcLUqDM3{{9AP00d^^H2e48-+%sM)d02u=%hct8G!N( z3;+QH((o5-_OE}xfO;@2_y=+i*h!3FCjkTyNW*WSt$#tPfB*dj3@CIxKqoQ$2DuvO z1O^6x00KJ+r1UogVe!Ksu!etsL5P6?Ab?navG)7lA4zUWkT?GPWdcP410y3N0|YR! zFo-FE!v&-P=p=vuVq_>~VE6=zV^DnmVAx)=U5ZNz6vaS)0m(NHWW2-wfs+9Q00bBS XO2cxg3=*#z00000NkvXXu0mjf|9Z^l literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/il.png b/gui/slick/images/flags/il.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca772d0b79b255872cde2fb29060bbbbad950f2 GIT binary patch literal 431 zcmV;g0Z{&lP)WlqUuh`uiUU82D1+EBLb>EWz|Nj3k zj6%@>aVJ0ku|Ql5RsEk~{?`9D9{=ZO{V&1vKX2lHHJSgJ0SFC1p8y096I?Y|?05b{XcgblKTHZ zfByjpAQrd=h&?HOAa>`R|6Hv9XB30N3RxDY7$AV4en1PH(j<7uAT&Tc4G=&q@-F{c z8i9e$01Rv(35=ybe;NM%WdxES!M~uG0dj%y@b5pvikg1_0mOLw_HE>d#AF}?ph|!M Z0{|%qc@l5wel7q2002ovPDHLkV1m6PxaI%= literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/in.png b/gui/slick/images/flags/in.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d7e81a98d705da8d7054e77e7d311805659678 GIT binary patch literal 503 zcmVl^KlW*80IEmzVa(K3*_6 zG7fg0I9Zj&0woGah`r_&Kwu3FK=xChQigwjfh>?7kc!_h@)sEWW@MKI+5iwhEdRtz z89B8WSj7JS|MwrL=l|b3uZ7Osk^B4auaUxSRgtG4v;Y11_x}$gi|9Y8?EnG9`1|i) zCPv2p|ADsrhuF4k`@Nr^zUpfTpS$xp!A}Wj4A3Yb2~_s}<0pUsVqyY2p8>1`g1&zJ zsVvR4Yya)fUw{4wtNss>0tLxGfB<5GmnRH!zxweH8<(Mq0N7e&^ba6_ z7#WHgIs!VLeti1p-=9B!fB*jb=l8$ge}LrQ-#`%%`S%Y9{re-sFSERHIY0ohF#KVF z2*K4Ml>Ykz*ZJq)UtlmW{9*tIAQm77@e!0?Mfa}mS!7%=x2KmY(S z0M7pbTSu9imq`K?75n7n_u%3MB_szB3#hl|A07@E6$<6-<>30S5egmg@cSkZL+Ix9 z0st`p&i@3O7{&wE8wU3C1oia^`T7CwI=ckcau@Q71iA1L?!*;{7^Nm*&$?GLJd|NjPb3=0E0KfCb4 z#nAu(05Jg0{{-+tQ26`)!^rI-{P_e371QGlF%9qW_x;Sb;QRdk{r*xJJ*zy?_rWgu z&$=$1lYjzR(%pFe+p|Ni$IOoG{eTR0XemVUia$~;LXXZeDO z0096o0M7peXKyl1N+90g@dyY5ARP|N&gc{s2^<#+#>?j*9u48*^A9U5-*(6(kqBPq zC^|QM0*Gbi#3NFYyicBf1{wyk;Wx-spzFb0kX0fvuWZ`CzyHEKd)}3G%ew&r05Jg0 z{{dZPvvzMc=Kqyj=IHYZ2nGGUe(f)J7ZwZK+v5TV s=!a5B6v9X#`iH^&14cjw13-WQ0BQ>oQ(TIK+W-In07*qoM6N<$f`&OQ@|4`Xj5kLT%`al?B=W5P+gNxB&nJfgpGfTOih;e`=>T z5jZ8;?_>v5xi(~iU^udv!6f5$jpNVh2O?$m1OPDr&i?@Y{r&#_{`vm=wBfh>{Qda+ z{Pz3$!R5rm=Ee2+`0e-d?)LGV)1LD5^!4@i=jZ1F2;wA$U5|F$_;B;f&rf1p(qbG! zCte(9VPa-y5lGpbZn4ZFhzcT9$vfdqmuG z@j$ZG>u9())mkwqmYHSd7eFi*FJ3%$?AX0~_kM%HFED^GKqQ#;=g)7T_f%9=fX)F3 zAdr)QMoCIaf{X{6{|BNG$o>N%f#5F;02KoS5XlH2zyJ$0KZ{``H1_}i002ovPDHLk FV1nFR>VE(L literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ir.png b/gui/slick/images/flags/ir.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fd136aee534ecb59914e336cad18d18ead2a4a GIT binary patch literal 512 zcmV+b0{{JqP)r;gUH{1e{Y(x2_S%2fSMQ?7@vH7`tSc=xS~J*|Ni>>`_JFszyAFKs{8d9NdA)L zm1AIH00;mv0M7pew_3Ln1`-ek5ajjb8VVZW^Whu|9pCfc910uY_2L}~8{YEX9t$4Z z@!Kj9D)d(L0*LYN-@lBEj6f&-|Nox>4F7-s`Ty{t|Ns8~x3>Pz!S){pfXY67`UDU_ zOc38f#US*GW&hv2{?Eqpf6;>f$N=n5fB<4bR}BO)G5?=F{eR-b|HMQT_5c3^H2?$< zb1geNgNn-kGiMln{`!CM;{TsNL8PAke-;*?JV+Z*eYOvhv$==KunT1sF?AKYlWZiGf7_{AKv_o8k9wMiBcC z1B3*kzkfmK*Ds)AfB<6r3XWMgVnF4hNdW;sfB^vU;z%SnI0)(h00004s{hykP}!$Xp8x`g@iqg4NJaUd z$B+Mm%>4cD_iu*Zzrl=O|9^qF|9<`Y547mdFIIVlOMCYL1Q5sui18rvfj0Ph3vJwt z)dnUeruXmP0|XEYv&@95W{1bGfWG{@sKWZ+FOVO6s`df7U=M&0& zKrFzJ{`2=AL>j0Rra@ocD)4hB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFq(O~IEGZ*N=lh=;=qSyMwWku z27eMOW_|f0uQeek^e_9g7KH|eq{JVG0^UaP2Jy4}|L^JL_3uCblfVD@mnS9t`~UCn z|MT(+KT|KOfz%~1cG~~^_2vEk{SFNQ?Cjg~|NsBWy<%2im{vp^YdeS=hk-Cyo6U`Hgs{l4FR(w#{P`G0;a3G2@YSmzI~fu(ZE1> L{an^LB{Ts58L6#6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ja.png b/gui/slick/images/flags/ja.png new file mode 100644 index 0000000000000000000000000000000000000000..4fbc123814ef5e2b2af77e93591ee53715954319 GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~o!2~3KHq6QcQY`6?zK#qG>ra@ocD)4hISV`@ ziy0XB4ude`@%$AjKtah8*NBqf{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^!jq{sKt+lm zMb1U3i6xo&c?uz!xv30B1_q{91{PLEmI{WZR>qcA1_l$YYyue=7{xtZ978mMODFE` zYjO~2lU$?FcL^AeZqrL(;_-pAHzC?I5{s20R9`R8|;XPZo_ znT(4c{6ClLa@pkIi7nTjT(q*2nC_FQ%hB<8h6@9a#hWKPd;71Q+O*|>NAH8O!{=pd z+n)-(-WtxW*tIA@p-V|z`ry;1$AVr9U(fvc=fJ-N38qgr{I!4QxOmMu|Dw8NZtcE( zA8UT8c&)r(@;v*<>(r$p^EP~!?r;BV&C|^IoO!e4p$XcGnYTZAna!7GbWJ_b&i~?c zN!MAnw+u55ZHv|st4mT5D~(n6{1h&sYBRTB@20A)hw|D_9$~mrGA-4~Yv!_*zOQC2 vOgbAAvpa@;FHcCQ=`N3>(|`8Qto+BcX;O)GGW$$WOfY!5`njxgN@xNAeA2c5 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/jm.png b/gui/slick/images/flags/jm.png new file mode 100644 index 0000000000000000000000000000000000000000..7be119e03d203695325568174b72522124bb2f12 GIT binary patch literal 637 zcmV-@0)qXCP){QLU}0{l%6`#}@@_VD{9F|q;xF#yj01gpgWJ+A*m zGUYZW{T>4SpXmF{^Zon(`}_X;`}_MY3j1pm`Wy}V&B*(tydCWT00ICp0M7pd0000m zGd#J&@cQ@tG$8vu6a54J`qTCN{{H)06Z&u*`VIU0o2UAMn)~_v4c^|~0*D2u;qTwS zKYspMz5CDEtAAp>e+Mf5)@1$t_wR2Fu3uNK{_0!&`}CDxK-+|V{{|`s2p}dP{`2SW zZ!oxe=XdSY-}fK=Qse!l!T0O_!(X}WAk`4?=MOLh7ytr@32Xz9{pZ*3U(#Z~DiVIl zOa8j^;n%JAKjo!$j^Xni)Y$z6WB&k?3JlvV7}WR}00ImE Xyv9Bjb9W)}00000NkvXXu0mjf@Xt#6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/jo.png b/gui/slick/images/flags/jo.png new file mode 100644 index 0000000000000000000000000000000000000000..11bd4972b6d5f134045d4e8ce134601ea9b5654f GIT binary patch literal 473 zcmV;~0Ve*5P)M00|Ni~>`!`VeZ#eh`f&K#;fdS|pfB*tJ>FU-06DIsWc#z@uumAs9{`&>~&q~MQB#;&cfB*tH z31sk|Jq+K!KjiuK-^&B5YLK~LCjkTy3s3{|pFco7yH$Tr@L>D>cm1y|D}MvS>F@7f ze}Db{_vg<)5c|)+zsmedM_Y~p1Q1BWd$vDo!X?isvq}Pk|KA^w>VH5L!1(y{_x~TD z9$-NK{r~sxzrPHB7ytr@v6F$JJdlAwh=Ji34E;f3{DCq4fk_4ifB*vkxQ1J~H9>i| P00000NkvXXu0mjf0T$ba literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/jp.png b/gui/slick/images/flags/jp.png new file mode 100644 index 0000000000000000000000000000000000000000..325fbad3ffd3075a4a84d8d898ad26ef7d3e0d56 GIT binary patch literal 420 zcmV;V0bBlwP)9whYk?f=!Q|Ns8||JN@lTD;`{R1ZWk|EGa3dAO8ObDh3E3Cb;oH_5X#1 z|NHy@|M?558b}5Q|Cf`4hZv9q2p|@?lb|{i68>{>{ol0lx`{mi O0000=G`P)0NEt6k^VGA)9E1hT9ocRoN>wSfaWv)?-raRm?)Slj<6Po6w} z{P+i;{`~nD6~!ec29@~tkBNo($fnHz0mS%{fq}QS{_m4#|Ns2?|K~SQUHy-* z`HU>AfB)8feAoK(-@hL}|Nr_0bQ_Dj+^xMk00K}f2RQ&hFc1JYLgN3=lsJ)M+p3uR zWC5ydAM*!ly4H1hsiEFvIU^1)HH_GYz!QMsIYt5i1c4ZMLC4DfztdU-q)WGxxg;|L zi3%uAJ2fm~N8&I2%AdL;`{4^9#;e!&D=C-&Lk8;9|NlO`c*HPy9@C${KeOWnB;`P2 zATRu9VP-jSWFD-S8kh{*zoh2aO#pT8A2W0o(w3 z|5bef!~)j#|KF3RAf-U``!@sYUq;#A42-}3UHtv;%kTfcfBpOQ3nmTE<|1vNq z0ns0zZx{dq2xP;5h!=kY&G_~A;V*`-zy9<8Vi5ZI|I4p`PkusG11$kMn1KNxfWUtE z{TpHc!>?a|&i!W8{>5bQ`~TnHf3N=fz5nHq%!z>% literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/kh.png b/gui/slick/images/flags/kh.png new file mode 100644 index 0000000000000000000000000000000000000000..30f6bb1b9b6c5bf355f67a17531fa73beafa6639 GIT binary patch literal 549 zcmV+=0^0qFP)P;@arD~1pHxO_zPr1&>t9y%wPZrAQpyS3=Ms1K-T|%K*j%o>i_=z2W0&D^Y8ax zhQELQ{rLl7|Ns5_-|C4+00M}Gf#D0s|6k8u{RAokD*W^JKSaeZAp18+HBcQ8{rdA) zTAYJ{;SE3lu^j&CtN66?*W<_k{(=kvTJiVSPc{h&pyuy)ZZrJ(`}gOM|G$0#rP$=; zY#H_d1P~L*>3>1SGXDMzbOE=49-9EaM0J&9T`emwH;=g~P!Ocy*DnU30tNVGcpOKXK;IXGH`G*aB%Pig@_cF{AXeP^XnG~{rU5QfdL?ZSim;?VE{Sy z7c(ax6CWR+s|%BWAkauYPfsQR0VXz9sPSMM00M{!7+@fO0fqklmFn#S3Nf;>{s#gU z7DjgV{|pRrOO`MKef9?wUO?vn1P~(w!@{x_lZQ{f0d@UhVEX<0FF08K{sNMJKnNIa zzrX(mdR{@6d*A9+009Ja65pra?7SkZU^!3-{)PrTC`>`Y0b%_6|LHH#J`sQb0@|>a n0T_AEh(trkF%3aX009O7j5IT?Rho+J00000NkvXXu0mjf2r}#E literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ki.png b/gui/slick/images/flags/ki.png new file mode 100644 index 0000000000000000000000000000000000000000..2dcce4b33ffe1f40d490cb1a2e03efe22ea56155 GIT binary patch literal 656 zcmV;B0&o3^P)8t@U|NsC0_uv12fBrK4XN%za&+zB_ z{P)aXfBpaa=ii?{|9}7d|NHmt1seeZhy|?e|DWei8UFwK|L5=jKYtkh{P{kK2}m(L z`||tm?|;94|Ns5#-_IY+QnEm+00M{!r2OxHhJR4iK=k+TZ>A77)*#lue}Db^^$Tb= zko*TE|NI8J3LpSOb8Z9x2m%4nC$a{*Gqe90@enzQH`ta%tA$7d{Sv5iP&~x@8dMF~ z(;dfh&fyCHF#yj00oRR-9sTeJMNR(n^YxvS3U`G57YhIQc>VqR{rPSM@(uBDU=5F+ z{|5&5hj_*A{sI6o0M7pbe|x2IYDAmA_)R$v7XIy^!u#*~18PtP{r&xWnDPVw`hiji zey{rM^8J)$5m8%@0*JA9=57`qRaXnayHCFDJ@r1pR}vUfQ&&Fu_xE3Vu+-%{U$!58 zQy3!)avcufO?mzv0@a%gl z1HS+N7!IC&H?5`#AOHX{0M7pb00(zPR4BWp;5AJa{{8^XwcY>#`eSh{`1tyzm&^bF q{8L{tuE6I1;oe7AG|b!z0t^7P6ga05`yJ%~00001r;P)}L!W`0l>rF;|7So3KrTcC!ho;=0*Gbf0S0@;YBwbYEs=i=3_$ev|Np-X41fOr z{{tp}0~v7g%iT=?0mQ<{9!@# z-(SD~{`vL)_wRqdfBpaan?+XX#@15+0mRIp%kY{1qrJR?xs-YLhQhSVzk_f6;`sgh z57Tc3#$ODKzZsZ*F#y?2e^`Y0-&}tV5I|5HD)yDjz7nmS1pU~~aVF#A6wD&YtO00ImETIDprOD_2B P00000NkvXXu0mjfKOhx^ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/kn.png b/gui/slick/images/flags/kn.png new file mode 100644 index 0000000000000000000000000000000000000000..febd5b486f3f90056637b23caa26d838fbadd7d0 GIT binary patch literal 604 zcmV-i0;BzjP)h(K@ANy8uaQvQ^_nWcs z*Z-GL)eL_?t_B7*Kmf7KbznHW;LqhtK<$TZ9ej=*TGLweOZn#S|EVB#AOzI#2dDw) z)4xDJ00a;t5ND<*{rU5ogY7p9)8EGU->gS|Gwk>cG!LX2Y%nmu8NlfEl`8-N#0ZOI q248)K1w0H4M?n#d6+r+%fB^s&Q!OA|2rzyC0000i~IS$uax?|M7>Eeu|^G>?S^VR&too;Ww>7B{m#iC2#9yd zt|~ABH7KLm936+=#qqE_-mcu}tAG(f{{%f3;x=4r5*4&~RvPsAd{D4lWP|SMV7rrP zho!ftMi1vR9*@YQGS@v|6Y@O&@({-{{*7dxNR_KF3agC@`kHE~20{p0tuC}lBH&Aa Z0RY#&DAxr!P{05H002ovPDHLkV1iS&g&Y6? literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/kp.png b/gui/slick/images/flags/kp.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d509aa874809a323ea99f3b37ece8a02201f77 GIT binary patch literal 561 zcmV-10?z%3P)Cs@aq@DuRlQczuzDZ5@KTj2q4CTH~*`MftCON|DS>3-+w6c z9|(gO{~7-O`v>9vKX&5_Kmaj*WME|P@B8=S6~kYUnG7sU|G#_z>G}QV|KC3#^7rq5 ze}4b}^_xjb^7)+E00G1Tlwy4KiiwGVIVgltUY_yi&tI!o|Jl8p;n#15-@icU*KbCk z6Mz3^`1ON{fdL?ZnEnBs@%JyYzyH5mxBfr4|7*t%=AfYeY;6C2{Q{!DKY#uG1wwy- z+}}Xm3;+QH(!lWNFN3HElfM4XRjZk-tp4-xFo=l!{|(XrbkBdVP9XXJ&!0aG3;+Sd z1adCWtuJ2w-n@w=AmGpT?F`?)|9k%Y-_M^QML&N+RfBB+Dh3E3pdT0*fp#rf!j_o$ zUs8faP3>oG?f*A#7{O)(oeuE;(0C>wVqgFWAQqr4|9E)*J$m%5y#o|bz~KAxm4S=v zKP&4$usU!k0b}RSKS4oYgaHH)%c-;9wWL`3={r0|OreK!5=N4TMk7RCwBA z{P_JV0}}Z6?;n_iu%H+Q{s1vR05Jij`8c?M=-GouSI=K${m;n9!7aeW#m~(x$j!^i z%zXLG*~fS9it_V|2?zl-00a;V#NgMjUvJ&I^~3uQB4T37ii-d5-u?gQ&wmw_XD?o^ zUAsm=P*7M%NJdr`Xazt3fo%By|Nn;%AAbM-ZD?YwEG7BBxA%WR!T-FR|8><0Vxn$d zUT@yKdH&)BP#Mq$fB<3y`hl076R7Rgt5;mSyo`Gea7>-}|M%}Nf0%y${3VbO@hKwm zAWK?W z+TGp#<;$01Vv<1pdP-ancZ!Qkd3bmLHK?nrgX5I}Ab=R3zkQ1wk#LIP517FKVgLC9 eRt>}e0R{ktF&Q^6#MUGL0000@P)xg`upqGzh6Lx zERQVE2><~E((v!!|G%IA{@M07EI*V_ln=0RjjdN{oM|h)7EO z{{7?6U#34`ML_iD4-=RKMg|km5|FijfgS(|AV#2u+YAh13=HqUkqe1m1{eb(!T=Kl c0)PMm0G()MDW>>^I{*Lx07*qoM6N<$g4p`a`Tzg` literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ky.png b/gui/slick/images/flags/ky.png new file mode 100644 index 0000000000000000000000000000000000000000..15c5f8e4775b2b68e0360c1f4ff1f37e61611276 GIT binary patch literal 643 zcmV-}0(||6P)0{QUt82Kj15^L?rd`uqE`oNxjFF#yj0 z1e^fI2i-9Q(8&Vs@%;Dq2on+Z{QuwM00sm0@b~}!1OzrH#hk+X+Tt}E6bb+U_yPbi z0M7pcvI;2tA|wYPA^Z*x0300&EGqR875n@A_WS?(`uvdQq*oFTSt1&p=b-!h{Qv;{ z0st`p&i?}PGCBeX39IA)-~tZg`v#`;6$Tz2`uqI%`ThF(|NnA-^wR?L!uSAshx_~g z0000205Jg0{{tif814-hz}E2g`1#%M`@GEN)${-9=jr|Z1Nim(?*qH%B39iMC&AR2 z>ggNf+PVUWW##cF5^jI~{P}h24a1+`jKBZ?zJB$|uU|aB82|la`WF`1`0wBUe?VZ- zRnf8uXahh1u`n?Z4sYX?@pO{;x_8g;0tl$# z2T+})81L`j|Nel$KOpz_zrTNegN!(Tli}h6pb7teeq#K~3=Aa(fB<4-V9 d!wLWb3;+YKCC*ol*cJc)002ovPDHLkV1loTFLeL_ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/kz.png b/gui/slick/images/flags/kz.png new file mode 100644 index 0000000000000000000000000000000000000000..45a8c887424cff6eb0471f5a1535139b965e241e GIT binary patch literal 616 zcmV-u0+;=XP)g01!ZoKn?Fz`<^k#?O_Q1 z`=8<8e}=z6_5c2{{QvRuAM+0emcRf01JR%V|9}7gKjGLHfB<4)U|@L0AiL;yFw=jq zasNSbGXHKG{NMlfpWxpAK41Q^gEaj6FV4=$@arEy05LIu!2gi{Gync$`1$|;-~a#q z|NCw7f0xa__4fbPn*ZDO{onuJ|3JnA^#F|o2q31v4F4ql-&_7K9cVD)|KCjiesKSP ztM&iLe}uy71TZ z|DRv){|H?Bqoe!x=x?wkfBu3(0w91`fMN3Vzue;gQUCt^|MZVr;{RRU{|DCmOS=6} z@%2BU5C8a_|1a6~&;1YB8$b;J0mKBvKpP_e^#OhS_CN2(f86)~DtrE)Yx94t!v9OT z|MTDe69TJd_zQH>zdry01PrBrQvYt3|7!q-C@@&>{!_XBPnqZ6E6@K61pYml`M2uu ze+NdW22lI}1Q5_kK)3wPV4bt}e=;a?{xkdrMUmL?|7pP3c>kYY0b~&4U$AjN34j1% zWLW#P{SRLy(>r)v0s|Y${(}_LK*N79FfcIy1Q-CnX{(%t#68R664G@6GIJN-*24NrwB3rW+v!ydOp^Ef6{n_)(btIFVjHa=pdp6)} zz^!@$h^2tpKUmc4)64h&|Ni?2LVth#{QKwk-@kwU{{Q=j;qSk{fBpc`pWlD@C4}l3 zHUR_xF#yj01d}3g9TFqw{rUX<|NZ>{`TG464+L38761SLpR(uO=J){s0Q&s>`~3bJ z6bIb^kphT`;m^O{e;I!LWBmP>@yDNkj7*H>@iN-VTtHNrD96Ue^ySz8pMMxZ=pRTg zKmaiT)&Bj@@b3@E4ZnZ>72sjw}n?8s2>T{qV)lKMV{%|NQ?241(YPff@h;hz00Cp!a_N2HF7% zr}y9gR8D)C;wJ_Sx5=xYz5MWpi4mv-=yjk&KmiL7K#aZ&_9^w5@1DH=3l15e)xUl~ z-0=7B?|)4HL4sh3f5LL21siGr0*GY=!$H*K#ZR;BJ~dv8zS`wDeeIR3;>1y|KC3hK=RLTAp0Mf zWcc&@%EC-|_DIyI;S5 zZoa(f#*3@};Q;9GfBygi2&4h78pxV*WHQhn|Nk-k{`>pa-{0-~I{v`b{|EZ(4?qC1 zz%@X;G0|`0)6dV-R;K{9rJ5v|%9;KB_nVP{8R7~c2@pVx*BKb3t8)H6dH@UxP=NgY z{qNULVEFv`^^@@rIK+N~gX`}f7I~!;+fM-m5DPFa{(t+%C?E(7W+q^;{`t)a3di3} zzd^yz010JK%>4cT^&8LzfB<5=h#HaqkRlk)Wq^@D01#jR5K~0vg#SK#00000NkvXX Hu0mjf%Ubyh literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/lc.png b/gui/slick/images/flags/lc.png new file mode 100644 index 0000000000000000000000000000000000000000..a47d065541b0d998da832e1981b479097a9b36aa GIT binary patch literal 520 zcmV+j0{8uiP)#-NSZgwz{Qh@GSmETWyIzrrS!pkkqDDw`CEYY|A1Dxfxke?UP9EWUlaZ{K@! zXYTRdfWyFioqIm+xW_M=V(hYvbO?~5ZHkEt37xh?rY1@PqM%`P+i2w@_wXJJO#nzA zheNt~+w1B3H|fqGMx=x!lms6SMy;uqQ4R``NH&49%B_cditsDHI6DHXLNubec}E0~ zb8dy|txA`rTkZMN{rCM3FV`MqlfuwZrz$X1)+?ntF|UvTkD3M?FxSaem74ag}Vzy5sA+`s~GjvDl6>(E?=UGu{=w?r5#MJIwhn?GrT#s zeRSo}v&#TUmcjL&mxEF>2%EIxN+SI=O=izlM$T5JH;yv-C%^zTfK|9CLa`qJ0000< KMNUMnLSTZ|5$YcR literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/li.png b/gui/slick/images/flags/li.png new file mode 100644 index 0000000000000000000000000000000000000000..6469909c013eb9b752ca001694620a229f5792c7 GIT binary patch literal 537 zcmV+!0_OdRP)sI{|q~>>TZ2$qp!tjsj_dmuxH+6SkQv+K1^Dpafp!@&+{r#8W&u@@le*a|z zk$)I|{ss9HAb?mjKkZQc#wYOgBhb-*|NQ;?=l9<~e?U(E{r5MB3DgSYf*4|4g1Z=I z0R#}sfv@v<-|;cLeDMG8um8XQ{Qv#?|LOa4L zz5|hefaLFgf557NB#8Tm`R|`M3=9AP!~zPVKOloaN+E`UP5lQo8*B+s^WVQre?jpA z5I`*dz#16EB$cmd~05Jg0{{#R40Cvt10RRAw z`u+d`{`)-+^5ON`yb$y0|Ni^@{rvm=`~3g>{0I^G8ZGb(2;2e)q~Yi9|KETAVEFqN zi2na)xwe&yo%hS1uZ%yx{Q;WF%<}W+mp@!0-yWP|m)B$h2q2(_|NnsK|6hiGKudoE zUGn9{-`6*oEmQ72y~rUb^YQPmzn@?Idwh=T>wA{p3V#3shzY3p@87?_|NZ&@_cy~| zpmRZP`1kJ@JI^@8AFa{s9OeCZO+ts{j1?4b<=-Nd5zA z`2GL?FD{9%H@9*#{QvEce@o8hC9n7wpg7QIfB<3vS^!iHvfyK-U8V5ZH#le}4S|yXQB^Nt}W|`Q?5-JjKDn&hY;a$Df~n9-WqyG5z}b zHWMS`AAkU20!9tv|KD6JO#c`e|FbePFfi-*z4`Hxjg_16|9{rM|5*PsvHt$a@%k1I zzvO#v;hz8j#Q5o)BT__yf)$AVfxHBa6HpujodJ?%_y>%AV59*A7yy`5b5c`Z!JhyC N002ovPDHLkV1l?nIh6na literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/lr.png b/gui/slick/images/flags/lr.png new file mode 100644 index 0000000000000000000000000000000000000000..89a5bc7e70711575c1ee3b83cc2be7f0e1fb29c5 GIT binary patch literal 466 zcmV;@0WJQCP)2Y|A4{o z-@kwT`t|eY&mTX2eEM}Kp+i!_T03wQQEla((gZiC0cs^;{c3|jAkj>009Kl@aN){ zC);;k0UG-E&);Xo*&wq)roznr3pD=Ezu&)DC1p;}S_BY4jKAN$W)>8Nm;toyKW@Ot z#Ps&Y4S)b*xg;zq)7SR<*)x!NAa?^@4{|ZkY%l|8FPQu15397y$%U%{0*LYZ>zAxx z8}J(slm+_X#f@tK0mO1iR9wET{^!#tU}GSb{Q3uSG}s1+e?a74b~(9Y%Qpf95aZY9 zPuWDo(ENa58%O|%pI^NU5I`*FB&GkLM&}>Ys6}P~0YHEO0B+J}4VS0Fk^lez07*qo IM6N<$g3a05u>b%7 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ls.png b/gui/slick/images/flags/ls.png new file mode 100644 index 0000000000000000000000000000000000000000..33fdef101f74e38e2422bb85dc8a31bbf1da326b GIT binary patch literal 628 zcmV-)0*n2LP)NT^udI6UX~&u_xA`izWBNXkIq%g^6Y%Pu{8|3yZC zlYxl^Ab?nacHcU-^!@XD|Nj5|`r(zVwkHE4BV6^xC+~{3+xxCp=yQ1PA~B|JUd6PoU1p;PCnS`uh0!`Wt}y4#)fi z@&Nb%0tn=Xmv@c{N@*}KFh0M&kIP1>YRmQG4?lbdn);9N*SEXB6{h}Te)Ie9Zy;d! z#Q+chF#yj01pfa18Ye&*C_n-K{_XVnU82h1@caA!0{i;;`V*Y{7}WX#^!xhz{Qms? z{`>&^00Ic4fsvW@|G$6Ruf6C#{P_EiKfi$f`+Dz}{FL7;Z+`vz4fMjFe?Sd?fe5Gp zAb>y`UVr&E@!c&!7K){sO`Ozkh)melY+9 z5KGUl3lpbYV0iHf6xF}JF{n*t;A3C_dhHtn&^!?O1t$N2Nj?UE00RIWZBXJNY9>Gc O0000 zKY#!H`S<7dzuzGA_xCRl`Rmu;Um!M^l;`6=xPSp5fLIuQF#P%V7sv;y25A5(1xW+7 z{Q_w~Xakza@Pz>&fLMUe`uqRSpZ|Y=>VQIE8-4+ehiC(l5cdDyKm=3_5I`(zTN!l! z|Nj0Es0O49Xx6_!5M^MM5b`fj@gGk4KbtNx00a<=83P0Vn?HYFf{Xx4|Nr&tKga?w z11|FC_y0eCSvdcCFfafF5XlYnMRN&=-B{`>{W0U03nA0WvHB!TYz`r< y{$OAL2q4DW;E4VQBmbdt8IZ(*2pDGo0R{jiB6maa(%qQ=0000! literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/lu.png b/gui/slick/images/flags/lu.png new file mode 100644 index 0000000000000000000000000000000000000000..4cabba98ae70837922beadc41453b5f848f03854 GIT binary patch literal 481 zcmV<70UrK|P)?-#?r-wgj45C|ZESQtLMVW?~Zs{a4) zALIXj41fOq2a1uNeOQW%&E= z|DQh$fB%40fEE4z10q3;-;ClCKpOx8h=su~@}N>;ErcnO|V^hXG82+5i4Q+5aFU0|N&GK!5=N X;lz1sunOP500000NkvXXu0mjf*7env literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/lv.png b/gui/slick/images/flags/lv.png new file mode 100644 index 0000000000000000000000000000000000000000..49b69981085ff54568907cd51a56a1e5d8b01ada GIT binary patch literal 465 zcmV;?0WSWDP)TuF);jrk;v#5jAUY900)zv`N|Ns31p}&9s{rUUv@1OsF{`>=? z-@pHYNg(_0@82^wZ2|}&78a1v|Gz$Y3Q`J0Kshi8lm?N%fQ(=Ne*FS+xn*U6mIDM3 z3(!4({{8=rtQsf{G!?8Agn$gN2Dab7KQS->1Q6rPlP7uPKoY|E^ZWmwzrbJwx)~sVSb)*-|Mwp*NlCCVfB*i0>4ZfB zFhYR-gakS;`Tzomv6O+~6D%TsAw}vh)M$o8KMw-~K!5=Nd?C`~#DJkl4QvBtQTT<=hAW5C&pkLRXaMS_oX@ePCublh%7`S0>4^BHJ{X z&jSWU1bzAnAdrUt4F8|~c=q?-U!ZD;3Wy>I`UNEa{sJFg8g4-`_wR00IcC z0c`wlknw+DNZ2$-$7NDlT|NlUo0ap!i1F~k2r~my1Y5)izkcK~h z{{rRU9);Krw*=%9uq;py&^Z7B1lI8X4~o-~jQ<6)85pKOHYf~%iU9%$qyZ=)&LIKv z04P8aRsoF!DgoLL3cdee4gVMb0*H~J5hWs_B!uw~i3^Ex1_pot0|0+0kn{N-xWWJc N002ovPDHLkV1lkWn<4-J literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ma.png b/gui/slick/images/flags/ma.png new file mode 100644 index 0000000000000000000000000000000000000000..f386770280b92a96a02b13032e056c3adfebfa18 GIT binary patch literal 432 zcmV;h0Z;ykP)@|4`Xj5kLT%`al?B=W5I`(ov;U*0{`Ko0*gOW1x?dnY zU=0kve*-lD1P}`lGXhluRs8wG@Eb_}{{H{>S-s!?{`@vR^^5K2FR(pO4M5WY0*DFZ zqCZG(`2G8?)UU4`zrJw%x*-cw4MBhY08Ix7Ah47E{sH^x7s!U+ztwL3`tbkv-#@=J zum1jzWCJ7ENdN%^b`n?!@|4`Xj5kLT%`al?B=W5I`(ov;U*021*0XgD3^5{teN< z@cTDV13&<=05Ky_HBiN$KMcQtBo?#b8i1w)1P}`YD=UMn?0*)P|9^oV_=9jUlG7n1 zgOt?2g9iZui1GF7*Fr)<|ABx33~>V{CZ_AxuLA@S%fEmBAbhajaRP`eP%%INfiyrk z1T_G`pFe*90tjjYTn_{=GBPrt03a7C3lKmc4KH52_yY$2zyM+rgbiXafFO_o^aD@| aAix0StzUbk+v2SN0000M*00(~<{@!wBU}0eR!0_)M!#^$%c|o1wA4mpD0t66HlA)zv9Z3HD2a;wKuKxf3 zKLhV?#{Ykr|9@us&njQ==l`GI|Ns8^_xsQFIm-b82&94GKf}}4zyJRI4@Cd}JZ511 zyk#BtzrVk|eZKww|NG~I-~WGu5Q~)bF9rsH0Ad2#1T-6>`p@704FCVWdiqyE_S>%? zzn?t&`v3p0|G$6zgQ7n`R{;bN6VP4%{xkdmsRoGvjXbc2Q*ib#i+$e?>}LD_@7KRy zzyJOE_4n5=pu>QE00u!g^X8F}1){Re7)$pq2>GzRP>hz5WF0{Q`{ z7%1`&WXbP;Kox)fFb41M1d2p!76A1_RfAN3oCFX+Kn)0M$tdvjY9_8yH^9QVjn@nfZP*{rmI(|3?O9b~d@cVAX$tK?&3V z5I~F!3@gDg2t{v?r~d;6^$&1NgV7;ZP#i-L5C8-i0C2iwRaxXp%>V!Z07*qoM6N<$ Eg62#MXaE2J literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/me.png b/gui/slick/images/flags/me.png new file mode 100644 index 0000000000000000000000000000000000000000..ac7253558ab939481a85cc06dcc4d73503afb9f0 GIT binary patch literal 448 zcmV;x0YCnUP)l$FJ^m&#tWvBA4C(n)b76qu^ z3TjKJi*u=MzAs;^(tHqT@6cZ|8AHxz+0T%zR}I9mkc`8faCz48MN^H2?$<3((yN)j;^`52o304M1f80R+|X9}Iwu*X+N)@cjDs2c+lU z?_dAGBv9wyKfl@e{~Tjr001}1@4rADVDj%Tpgtwu-=}^u z00a=o2DtG+^6#HtKYxRyQB?o^{pa7Gzs!FaUNHa!5W-0i5^f%h1nT_t=O0kRUm#-m z!vGLKP#fTS#5u+P{rv~@0nkXGhChFS;q~V)5d8o97pUPE13&;VK7Rc89~k`k^9M+( vx2Q8b0Y@nl1JFDW`UNKcfk_?)fB*vkB(P&2-J7g<00000NkvXXu0mjfGX%sy literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mh.png b/gui/slick/images/flags/mh.png new file mode 100644 index 0000000000000000000000000000000000000000..fb523a8c39d40401b9abcfb144a73cbb2d76b286 GIT binary patch literal 628 zcmV-)0*n2LP)qpJCu1p{#SASZ=3QjbPhlO05Jg0{{#T~{M_a8tGL(@4F<^6===Qr`uzX+`vVjI z>RSuFND|!tCprH%UjG&-`Tqfgkh}r_F#yj01OWa1_W1j+!`}P+|NQ*@_xS<*{r*D) z#ao8o+xY#_%t@QS?0~yfBW+Wj{_zyJQv%*f2f%)|)v=^uaq0&4j6{l|Ybrbh`TZ`2ITPyN!~wBya;Q+wXO z|N8qsP{n^H7N*~zApZOB??0dhfB*t%@KJoPW~Y4ZyXB%oU++J<@%!g5F#%3te)iws z==lAQ0jwGr+CT&T00a=DyL0x5XB;1||6pKv0FF^K^bd&vjBEyg00RK!=O6aq+V@KU O0000p}y_ZxVsQQo9l8qD!tQ%&&F2zEbEdU-v3mY$p-gb*;wwp?LFG<9EeNpZLj7Q z>zeacpNZ>XJG@0bcmXcALo;Ad(L@#C92p0~G#aM!FfF0T7^YIJVVFaIl|0gRpSyF_ z@0dgJ{oT}qqUk#4;-a-U9Fej5EJ`tIE9)E!qDfL@GEq>vEDI}q@P8EmenIHxu!*Cc zLK?@%1j7u0A`mPlm`kyT;5daWs;EH!+LV0IWO0Zyj4+sHxRqia#e9ki#cu?^6YQn9 zOfZ8&4uw%r9nR_}FG?tJ1sBpnAsdGMh7pA$Mlm3ABvgz9aj&GrxaT8{1^YB+UzPEM zQQ5*0;(QnblJRNh>E*%16wccXl466KPu9Lk=M%$}%9~Z3xs9na6KbZ+^U;AoQ+JVg=BO3kgY$Vuu?iP6r(sQV=EH;Iwf|hcN2Nd zPl_EfW;$kS3zh=H4ojC&X!7Bd!`~OdX{VxLp z5dC3f{KL%rhe`hT|Cm4jfB*jf2Sk3^vlaWpqpU2@27mx!VE|eEAE^2d5dHlPWd8sE>;L~hU=6?i|N8~f1J=Os z`!`SnKmdWv|I6_A575egAcQa*n+Bj_fB<3vdK75(@4vtQ{Do`yh0yRHtQw*LD9^wE z5I`Uef5B$|`u7W{2T22%M6!Vq>?D8y0%`dD|M#!IAl1MB{`!Yz!@u8fUYwuxex*z#9GlH2{4I3~mO10Ac~g+V6jVB)KI)-uUyEi4o|t-;5vX%A}^sE-TCS?;peW@7xO)zGwLT z>;Lb2Aa%cf{|B;v0lB{!Wo3aj00dxJ4sHN|VGstA{YR$4C2D_2_!cBcz(8l;%*ju; z_5-pDt^fjRVEX=(;rPk#zkV}({q}dw+K<0~Gco-B2UY|%8?FIpIzRw{{P+Lo&pY>j zzJB!i)2Bb*-v4F%#qjU=2Y>(qX<+*Ohe1*jY|LMVKOmiqU?UkIBoO`m3qe4|00G4K6*VFmu*EK13J3rK Z3;;9iRuWt9^;rM_002ovPDHLkV1h$@)rkNA literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mn.png b/gui/slick/images/flags/mn.png new file mode 100644 index 0000000000000000000000000000000000000000..9396355db45a8ee040c790782209868acaad4b85 GIT binary patch literal 492 zcmV@{}>pU8D26lh`@M2^zAEy;6E4#hyVhJ1te8n&0xjw|I|OmAOC9q@qGTx`1kMs zKYtki{9$JJ&B6L7=Kt^CKt7QCvS|}Q0D(0y{Qoccl;O=^hIfA-|M~k7Bn3tPfBpOS z`}Y4|zknP@Sy`YB00G1VQttboLEtY##9yH3?>`J++5f+PL6rRiQNLgu1_potVgX{t z{eKx$|NOuHhk@zOpC3@OA=>```VZI207MK7009KDfg$woe}>=xgMa@Q`TZMV99$1f z=+7UZ=>P!)^22||KmS$!{Ac;a@cR$YT8L7JY6c`57{N{g2q3VN{s9Bw7X!l|paf9r z=TC&I7$7zP9Rm!dKY#u(FaQJ)NCWfVKmVWoW?%y` zm}dTA_#*kA1?Z>0QqoLZAnySq0pv->KTM2<4My5DUW>hHBSpkmCRUfavf4zkmMxWn=;={POe9 zpZ~vq|NHajABg<@_xGlmn*aic1*nOE;s2AbPk~B-;NSn>+$?|p{{I~>&N%tu*Drs5 zfBO0B*Z*HY)v`RYKsx~fhzW>+Cjb5S_s>6&>Le+qufKnBv&bF%YWVBlABO)w3uGC7 z{rLq%Ks`WL0R#{e(EPs)fB*akI^_5N|9=)g|N8#t9~WuY61}otf4Tqs`!(tD7m$X( zzkdG%X#fZyCZKPCW&?Et`7z=QS^~DI8Yx-=nhgK{7whGvYgWDg!B8&G1k~{7FHk81 zKmY(S0M7pd06qXVA~x>%?)v`v$?y7WENVL!I|c#<=Jn<;5-<%03=swpg4MkH|N9RH z59P$=0*D2u3CIB%01Ag+CC5rQSvY_G`T70NcNRvLcR${}{{9+hIZ*cRKadRo0R++j zv0Gk5I)>DQ+oULEUYSww-@{VeP#&z`*?j4i%tcfB<3v#u_k;CAlSmszIWE zes6rZ@!!9HKqG(r{Q)GE1e8GG4GeUkhF=T-0mR5q%E0gm7LmVTk@^EErhg$tKMw;y afB^u%K|axUkwLit0000IqP)p`2X)eQ1zd`|Kz0p8A$%R z`bTZnZKVTj3KfeK`2Ky*5B&e@&)?sFfZ#7s13&;VG5q=W=RZg_5SU54z5Mv&imk%` z|FW?#NF2HHZpKX|PKHOnfBpIO`|qDW|9~0*0*DFdzkh#$Hv9ux`j_+Xe->2}ZC)XM zHV0!dKPS0Ur}$Y}|Nr_6wBa96o`K;HKmdVl_zUt7(16dMgtTSeTz>rQ?Z?ko?mjsC zklD%d+V79-zd^=BZ2$-$7GT%`Z2%eY=kMmT9MVkp=Y%mFes6g9+4CZ|=Y~?>`*tz_ z9Sja7kOqJN0yzojravHW{k?SeQ|&okK5=fKkARLe6n%c?uEf?;0ubZ>f;9XA2p|@Q zU%!CHiwJW41sn7GB}e}J|9v$?qW1mmH(Bw2pdk4RbO%twKY##YWMEE2jz}>2 jgG53Y5Cqh~01#jRFwa04;J&RL00000NkvXXu0mjf4K^ZQ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mq.png b/gui/slick/images/flags/mq.png new file mode 100644 index 0000000000000000000000000000000000000000..010143b3867f21e7791b8254e806b325c13b2895 GIT binary patch literal 655 zcmV;A0&x9_P)$g8u&g1qF5h0Q6aJN-{1Mbz`Ie0O|k$ z{sM@ZfzzR@(T$Ir&B098+eukMUeMl2+1^x^fq~&CAE%jZ{^O4ipMU-bgNM&P{`mQajg9%ivrm#DT>t+4XJGgP z5I`&pzyAFG^Do#{Ra%^vg_(hwneqG2-w+MozW@IH=Wj)-86P+6=Wo9l8G*Kb0|+3- z*{jc+=}JF+`H7W<>HmKQUT#*P1{)(8poaY?9|3*x^4(W97N$Rc|4EDS&R=&5Ab=SE z{{73y$Ox4F`Rgyx2o@H`|EK_{=f}^#%*+g|tSlctd;ka_mU(L~nd(ak@UpY9GCq0n z(2rN05Jg0{{a96b$W_S@ACL(Rxa}M z`G=gy|Nj54lTiQv|3YG^`}+MH7z}h_G^4TA+~V=RqI&{}iQ&&bpkF?J{dw&CQ*JI+ z5dlsHn4|vw{rBhJzZb8+p1k+fF;B_XE! z42<9q0s8Xa-+!garV_&3Uw`~!Vgv;%KmY+HvKbgYfiyF)F);jMVE6!x-Ip&{0DU4U p=>-f&1_my$6wo1$fFwYG0RX)13*@;vt7rfK002ovPDHLkV1lt{Hh%yB literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mr.png b/gui/slick/images/flags/mr.png new file mode 100644 index 0000000000000000000000000000000000000000..319546b100864f32c26f29b54b87fe1aee73af21 GIT binary patch literal 569 zcmV-90>=G`P)rBb0vs`uywH-=91j zzd+y*NDt6q00G1Vbl+cwzkmM!`SbO+m+YTk|9<^u`R%^_m*bXSzgT|#{QE0P`4>nh zQ2ZZA13&;V0loO=-(MgHX#3gMzn3`u{`KzHucyC$Kl}CT<*&8wzt6n|ss8o%*Pp+C zfTjZk5DUl#p#T2<`NjV0^vyqym4EMy|26&E??3;3WoiC?{O#A4)4zWSfZPMI0U&@t z8bCe+8UPFj-d`E(e|zZv%GLeN@c(z$rC;+8f>rHtN0D&|BIS>OtI{AOC zx$tZGDUcCBkzc|7XAeyp!)#=hy@sHz%Z8Nmi!G71?uGb{rk^vkcEsO8W!D1Ad0T=%Vj%gtVfB*vk>3V2g53(}_00000NkvXX Hu0mjfpCtxQ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ms.png b/gui/slick/images/flags/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..d4cbb433d8f9fe49f06585dc46ee15593e3e621c GIT binary patch literal 614 zcmV-s0-61ZP)w!6%f1G{My^>{rmp(`~Up={s8&+{Qm#<{R63-jRF8M0M7pe zp74|h+7SfEy9M#{{`U3;5)b(M0y+2j#`QMv`vWF8IQ;$o{QUp?{QmLR&;S7V0*Gk~ zkHv3!H5OU9Kb*Y(q-ELEH9vC;U*%N({+r?VuV26a{F4-VqagC^H&EN}zd$De1Q633 zj~FHafsLPJA96}RV-#A)X~v?X^MOAye@1K9u&05Jg0{{zeC zH7h(V@9+2F_Xpti2mAc}=j!&)<^S{h0sZ;_Q7ob~2($C-{v8Cq(%>lF*}4LV2^e-j zV}AbzqQAd@=ogUu2Vs2v^{02G<;{1(|2aQ(EV23Z2N=G800M{wXv^O}|A7VrH9+)$ z7=NG)mcRcxm)QV402KN07wDuv009Kl@CPU%A;t|Pff9c}I{*Fo2PXf3L>PYm|M&kd z6T{yxzy1Ri0|XEw14AS%MzNxQNDQDd27mwq0OfZ^Ej7^!+W-In07*qoM6N<$g6Gg9 AMF0Q* literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mt.png b/gui/slick/images/flags/mt.png new file mode 100644 index 0000000000000000000000000000000000000000..00af94871de66cd0fbf0ca8e46dc436d66e2f713 GIT binary patch literal 420 zcmV;V0bBlwP)Io>l+&W2PtRx|M&0z2M_*#`0)SN z@BhDl{r~j~sG3n$7H9)N0I@K!uxMy#e*W?mp&AJO{R1fisrv=e1J=Os`!`SnKmf7) z1AD;K%nYO&458rnZ>;h=xCZfJy-Z2&4h30>ylo1|%C8 z!A=4QAQtS#|N9SD2R9xVP=6R000Ic%Boqz*|DhQF2dLpM!{5I^H2?v`f~*=Iag5B& z3^Fndyu3hzLFn&a2m+c75I`Us-n@D94+enNf~Z%o__l08i(?1?2rvLmwOi|Xk;8TX O0000wT1SlAdCl&Y)$gVg>5qW^#Y{{Qp$|KC6V{`~n5M8AIn z$$wxH$UeVm6F>m5>|$VWV&MJy|4IE<4N06-W9 zfN4+=|Nq*iiwn$Q2C&jbT&$=TD3oCSlHOGFpRx(;BY;>KBo9alsWSh04>T2o{{H<9 zq`@}){__Va_~#GM1}QP2gACgN0*LYNU!Z^U|NnpRpWzq7|3Cl#|Nj5~7gmyqN$LIj zQvdWzhA$B4g=Z%5I`U&fgJtk z_g|1x{{H;?U6oxK=&at?J**6@V8K5Oe}Dh~1#%?NbbtT?*#Hy-y7l+}Kff9N{$pgg z_WK6Ie}+7v0!uEdpa1{-Wc>4s0pu$NunhnK1op#kuysJ&8U8Z;`FH#0jm^LQ>Tv2E z__*)izhD3U{sq|pR0FmFAb=oF`osMFS8?ijP~d>v`s?4X6Tl#928Ghke_*>=zWoA* zI8ZS_0I~c5+3<%^Qj!Z4rNibE_6+kRtZU3J46>yw zfWS`r^B2emYGC;Nhw;yEHn21ZK^Q<1%m5k+3<-b$0%`dF7h*inus>j>Kov-;VIf zD*pWek$*v<0SxiK|NjEzfQkVEh>@X`f#DO--wX`DVCWAL;}4AS4@`0~00bBSj-y@M TF2~k{00000NkvXXu0mjf^ET$> literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mx.png b/gui/slick/images/flags/mx.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc58ab3e3552b74d990d28a0f500e9eb6209dfe GIT binary patch literal 574 zcmV-E0>S->P)LFc1LT4cKmY-iGBrkbGB7ay`}g

Nzrc?B z!}RAj&|v@p#KiFL&)@$*g@6D2{reke@BjagZ=QH_|HA5tt#{7v1Ul>guV4Ru|Ni&u z_rKqNfHnXG5DUYvUm)ZE{sF26>H%tC6A=5t#K$G4Eg-G_A87rbKVS#^0WyF#00a;d z1Ca3#WHt~1jRI=eclPL04k1AU{avRH{sTG*Y{UOQAO!R;KmY+XFaVtnvEdic(+vNe zOr8IIc?-17*~$Z`|L?Eg|G`fB4^+g!01!YxCouq>54Pd=FQ6a({TC7tjr5F#2GXxz z|3N{=01TJ^fBykB00a<7!|#88#Ce2)8ovGh$;ikEv=>5x7)(s8a literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/my.png b/gui/slick/images/flags/my.png new file mode 100644 index 0000000000000000000000000000000000000000..9034cbab2c02704b65fba6ecc4a7a1c1d053b6c5 GIT binary patch literal 571 zcmV-B0>u4^P)Z-xKO+5@Bcl`=5c~|G$6#Vc^TNX8-{JF#yj01a@w+002>mTdm0Dxpa1{C#)An)W@eTA0)PNwiNI_f1h_u_DTrb&+z}xv;{Wj zFGj0Cgf$G002ov JPDHLkV1gu%1+M@A literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/mz.png b/gui/slick/images/flags/mz.png new file mode 100644 index 0000000000000000000000000000000000000000..76405e063d43f2f3b5b9cae4f76d9f1c73cea25b GIT binary patch literal 584 zcmV-O0=NB%P)d!0?ZO;SY>NM!#Sr3j;s^4&s;y01$=&U~zyG1R{bN8&$-J2AZUB z{O~2s*67}BSLujJh!l{(TM_&V!SLx<0I@JIFetqFAHVYHe9OP56#xDPD){#oDEIpx z82$bI>))?me}4fPvfQ#j8vp_bq~ZU+|9p&pvv&RstuJJil>ZL~|9}umff)b({bONa zxh{1bAb?oDF)-ZV`m5;k=ljw>l6BpeezVN}{rlPPKR~N~|N8X{NCKH4>bI<%?516t z00M{!=o3jd#=5m)yzyNB8Nca#eH--U&Fe3(f#?+keR}os(@P+F`}Hl*IRF8~0t}ng zTmN>%etWlrgX7)b6MtD}{$cp_8-#v?7>pqD50GU3{f7;x0U&@Fe=;yIS7rUbaG!zu z&%cJ+j{>}Z{{3SByBg&1|Nj_3~Dr2e;Gh>zZrofD5`!lF#Z7{ z2B7#~hM#}`y~Cfd!0!j9&~4{}>qlfDw=_GI6Spo7yiaSL1(R34j0qF#yj00RRApetkm@ z3-<^I`04Bn_xS?+{Qmv@{`~y?GBy}bOB@O2-v*J4|MK+z`}_2=vH}QbDjOT??*y+^ z9PHma=D0k1DE9l$Z%$6;=mbqObq>D1hX4By|NHgp|L;GHwRPtz;{gH)sDXiz;U6Qz zZ)V2dKoY20MNK$ASA+NcQ;z)f|Igq2|MmO7w9@DL!aL%O?v>U60R+_W>(dw3rWqbw zY+vs`7YYhj_p}$}TRP+a`c40T|N0L!J1pWwjPJac>kgmX!|;RwAb@}x{`~&)@5xJE z5fO>bZXLnj?>WlS|KEEGbn$;~p|4%Vx0QJ+&gI^Ic|%b^5f~5v0R*z)@87>RPSSB9 z(mdPNGA>^D|K~4|Gn`ysXGCuKcCvq8=a*k!egj?m?>8{m00Ic8fvd1cUx@iTXM5HE z^H)FyGjo2eEq-FG+;YA1)Puvn7=8hj{`vO@7;-=x00M~R?)3!82NxK-n*V?K1yZeJ z{HiGaByR2;1J+usHUNMy48Q{FH!M8N)Pwp9Y)wTFo81A^+}-HTA|tp~ zO4-IyLWKVGUAVv#KrFzpU^vb8&*4vW%&*_Sfp-5+Oa#jR{(FIy5oqwQKVTa`BqPut z3=9AP#KLU;d%N^MnR|>Uj{MoN{TEQv&!4|iQhqnS=35v13ux)DKYxDz{qyJVA7#|2T literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ne.png b/gui/slick/images/flags/ne.png new file mode 100644 index 0000000000000000000000000000000000000000..d85f424f38da0678471ef4b3dc697675118bc7e0 GIT binary patch literal 537 zcmV+!0_OdRP)pTI(!tjlO;rIXl@1HV&)cpmDGW-GR z`3+L^2aNvy`v2$G|KGnEMPz|W00M~d>&=s#l8OvKbwEpiHvESG2>tK>|GyyO9|$ut zvpzk42q1u17-V!9I61+pfvQ08|BZwH@16Yr=jVTUlmA*S|6zcEk@1g`6+i&7`~&$E zYA%%V^7j8zTmS$3{hyirzos*?2B2bq00L=%yMh7Y5+V8jy0-s+|NJkm_8$o_f}Hjb zAb?n|yt|^zto-ZmuYW+t0)q+&<<KJ>BgrQT zRQ>1Q-#;J~AoS`6pHRCwBA zU~p!DquG0BzkdJv^XJbWKYo1u_VxSs@1MSW+P$@#L70Jomw|zm0SEvBhy{qNbE|>m zzkmO1v}^=;1(+C_zx@3C{m*wPUMbGM98Q`}5v}3B|NZ&>_xGmUO#lG|(!jv*|H=EO zfB*gc{`33)|Nj{n|Mza|{r>BFYe?(AfB!%K_3?Y%L>Z^l>!7{V2qIffI$#e zz5f4~?wt{_jNwA=k=tvV8m;04hxH1ClNsp|jaD0d_yUND;Sa;#|9^ps{`~n3bQJ?5 z!?D}Pp1*tk?A@~oJ0>vvX8@W7)C|%C)&LMdARGSt{R`y$`S<5P0|@TEy!-p_?>~S2 z1lj|1A`hhCuT1`^U1^@yK06yzfAV)~#?EnA(07*qoM6N<$f^cITh5!Hn literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ng.png b/gui/slick/images/flags/ng.png new file mode 100644 index 0000000000000000000000000000000000000000..3eea2e020756c41abf81f765659a864c174f89db GIT binary patch literal 482 zcmV<80UiE{P)E-@kt#fq(zr{dlL|rVbPb$^K$sU||3VAQpx%4ArjH z5b1ya|A`BUvomopF#HDspdkBi_LzW}KMcQr|NHa%@9#}BHvt3?3s4hK`pMU)fB*dj z0+88E|KR{Ac>Ck+U;lpn{`Xs!M;2%gKmf4-G0FZ zKmdWv|I6_A&;LJv{(%shYM_N64Szv401;3FKmf4-Jp?oxsQb@fum%PU8~*%)I0>i# zs2CuCKpOsn%?64Bg>X9QKhy?*00Lh)xZD#`v33$e!wuw~|G$AI0?h>~ z1_&UqlR!#;Ll9OQ{s1-n2ZahyF+c#Z0Amdp#**BUAaDHn%gD$G3dPzV3};X@Gl13bFaQJ? Y0MmSSAW;3b&Hw-a07*qoM6N<$g7#LQDb&XuwlP!fzJKM z`1`}(|Np-K;|B=>MS!;cWf13KY+LvSAb?md?)rCHn)&`aU^p;VI>1V00D#b-){yc34R8!1Sqb680000@|4`Xj5kLTv#?55wQzKoX38|NjLffBpXj6#2y{D-E;(Ab?mHL=FGT z$TP6>fK>na1GWK({(upf0nrSU5*Gz(00%w4e}91F-@gjtJbOE500a;V!?RECzy5mt@dro_q~YJM-#~SLe}OeX zNT7y4|NilCvNABd0|+1%hF>6clER!2lYo}|1|zVkK=SXOfB*mf{rC6ZKVbL)odgg- vjKFAPVE6?_e~=h|kVO7~qZmRm0R$KTYszPUy89K;00000NkvXXu0mjfB$dbi literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/no.png b/gui/slick/images/flags/no.png new file mode 100644 index 0000000000000000000000000000000000000000..160b6b5b79db15e623fa55e5774e5d160b933180 GIT binary patch literal 512 zcmV+b0{{JqP)O=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d00KAO>U2WB)$@6+CBT{3ok>^7H@y{~6FRKmalQ{r8#S z4^Xx6Je&%q%J2@E@iKAb=Rv<(vO+e^|@#56B5{*~0Mg z>UitA{$OPI`~Tk`F#7!u z%=q{3H<BYX7n!%ts-g52=?&#%8AHvnDo=g*(t zU{@(f3Lcro01!Y-3_uV4{%5PNloM>zp5gQNALI8Qf4=|z|KsPsAHV+n`1$wy&wt;4 zfzU5-=mP{0FqD1)U3&iJ)0b~Q-+l7x$B&=CVSxxV`w!S3U{3%6(9;Y60R+_W0~jFx z85t(6Ir{$dcL`zMKcF!E2U7}WK$QOlX#fZyMg|5;)aZo7D4hMD0TloQ7ytwk}@P)zKX@%&%DST%gMqDF&nJ<9}^SM9e)7=i1G97Xij+!pc8>s z0}TKw06GH{9{>J;c@WiqflO8wrXNp!0t65X1H*raF>uuoM}q1_&UQ zzyE+PV}l7nR6|1@Xe}f}K_mmn5Fh~%KtLN9K+(a>4Du5*FzA2|{m;zE0Q4slD+}03 zKxJTefLQ+k0*D1@+|Oq}Kt_TL2e}yHXa<;L{(_vY&wh05Jg0 z{{*4}t^?F62l4F%@9_Wk_yrLV`1}4n_xiEzG57obO$p>A_3H5V5SZl@9UBk;0Q>>~ zF#yj00jE58tx;oDUfVAO7ZA^g)(IQ}Y8G-;ZB^s|2r!a55}@Ef&J{K=uDyPxdE3 z4FCZEF#yj011R$m=m{0X((d>7`QGgNy~*X%==~K4{m|+BO$p;F|LeE!5zX@o6aMwK z|0Cnry8?)1@m-dDW`RF^3@85Z{`vj)H~*iTuYX^D_V?HC|LG63e*OOQ`}ZH9+h%{4 zR^kLX2_S%&fc^l6#;?EsK&pTL{q^hL&)-1T|AVLlN&WsC!*d@f`}fa3pay^dVgYLS z^XKpHUw?lCNw6Z2x?f-t$o}(Zg7`(je_wy{{yg~C5U2qlfPfml0Rvc4oChck)CmlD zkWL^2sNoMV9{$c|wex0wa`2z{-@pGE82$nT5F-OaFayIEq`3SAj@n=l%a5DE9w9oI(Q6o;?Ey zAdrT?A3yTg*!;YE_t&FGSk*xQBO~LVKYsuMhzTgoEGG70+cq{OrGLMF<5CR)KqmnN z5F^kJDrIFqfoA{t^Z)mszkh!J|NR@N^WQHZ-f!>?ZqK&!y&{zFIzP0wn(b{R37FH0BS}Z;-(ZzkW0R z`o;JgO8$qifBy!003d+C8bA*C^$+NzU%!${e*gOW>-S%fvmgwhvw&=%Tb23#oNZ?S z2p~`>{R0^fayL*XP!U2MkOb-c1#;`ZzkmMzW%$Pc5I_(c{;*0)g6#S8SB49$^)FDx zACSQydx0wd{{073{+Hno13&;Vu4Mp{AoLGRCWbOF`~tJSfrb9TxDaUu27mwq0KDvZ UcsT?Vy#N3J07*qoM6N<$f`X&bC;$Ke literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pa.png b/gui/slick/images/flags/pa.png new file mode 100644 index 0000000000000000000000000000000000000000..9b2ee9a780955566cc7dc2f59ce175f32d3731a0 GIT binary patch literal 519 zcmV+i0{H!jP)|lVPPN>g8sl5Km-s#EI@faK0YA%?%RKmGG2!N|AD;!zX}Teef|3X z_wWCI{=muCn>GOi5DUcMXP^GBIsf;|&;M~|Oj3M||NsC0d;h_|&!7JP`u*?sum8V( z0aY`}$^xwd2q2IKptK|}gRT_Am!FIf)j$AI2PS_*H2ec11_potVu8EfUYUvEKf`}G z`1lE^`X5*+Sm$r%-@k!200a<=Rv$}~=bu-f|Ns5_|IfewfBrH6Nrpdvs+^pde*a>f6qSrfAZn~Z?Fa+2||AuS*t4lqXH%-ra!^K00G3r z@ax~7e+)2nAoSxWko^y??$?YNza~t8coi7j009Kl08{<<|1U847wF+XP}P60U;n*# z@9*{N{$9Nb{(u|?WHSN*&{SqkP0pSkP;|=6L&63i zfEXEE-vV95@Z%rDuRkCLl>P7efnPxL{(%8d!yj-G00Mvj0{}mHT?%@XEt>!U002ov JPDHLkV1lK4=}rIu literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pb.png b/gui/slick/images/flags/pb.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1a5538b264a295021f4f717d4299bb8ed98d98 GIT binary patch literal 593 zcmV-X0j-HAXl7XJGjM{~r+i{r~sxzrQwG-&h#_Y&p;L z=ieV7_s^f-zyJOD{rC5(+EoAn1k&)I;s3Kw&;LT?{{2}P{Pq8T&j0^^J4?LvUd;UK z&+k8ffB*XXONL(tXahh1fi?X94^$0Q>Z$uRRO)Y4)uapmB!2(-ul(c1=C+V!kAF`) z$PCo;`_FHns{jIs3Fu;wy-Z(c2YwAz{&V4aXk?bejFO*Op&u`@i~PecqBpL@DIoojb8mb+WHGK%fG2>)a3=iVf_~v+`s?*1;!`?Kmai^I3i*ZIYtpN f{g(k500bBS@@|A6@UbB2E)`X3x9D*gjYK@dOyv49j-R|ARv|Nb!om5Pi12buAo@&A8j1_q}8 z|NqCt{Qv#?|DQiV^2?@8009Kn!0`Y7lcx-S{{qo}h;n3b`}Y4|zksS4Wo3aj00a;V z*zEsM)xUqEs|Es~YOn@|-@kzx00M{wh#7&Zfj0j6!|?mhe@uX+0cadR0D+zK=P$&S z1T_5l12i2VfWS`r`v>f&U-&gJf}I2qKwu{UjsNuvF#Z0+ASnqp<}V}$85tQ7(W#^a2}2+PDh3E3#;-`R r2#VqJ=b;e{^dbb<+Crtk03g5s0zF}bJ8sS=00000NkvXXu0mjfKVzU% literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pf.png b/gui/slick/images/flags/pf.png new file mode 100644 index 0000000000000000000000000000000000000000..771a0f652254b4e891fc73910aab38967864da54 GIT binary patch literal 498 zcmV3lobsI zohi_A`bB&J!~)dH$ngL7lczwX3_#UDxxarw>LBRX?|;94{rmL`$Yzn1{l&ll5I~Ht zU%nI;6$RPw9|VBf|1(_vbYnFmA3K-0+yDOt{~_StKSoBzkDopP1Q63dnCt(82%zd$ zpFb}6I_2!oo##J&nDhVtbEpQW0tSEpVuGrMivIupee<8UpWZS`Uj1hH_v_am-&g;K z1CTfW0R#{WvT7jw$rQ2Wy6P|4+kZd)xq2}(*g=aGrk)Yxu73al#Db(Bq?4D0-N;b? z5G()RfB&pB<@s4TkY)e;`2!F@EcYcO{->q=ymt>64xqsK^^5b@FIO-F$h{9?`~e2* zUv?FhqZcm%1P~}#|Nj2NBq_=8`#0mCzd$+0-@loGnqiRuWPl>)F9-k?0|XG`aR!E8 ou!#JF#Q1|6-w+1S#{dBa0Kx%7Vg$%BF8}}l07*qoM6N<$g2}Akn*aa+ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pg.png b/gui/slick/images/flags/pg.png new file mode 100644 index 0000000000000000000000000000000000000000..10d6233496c10e52ead975c5a504459fad68ffb8 GIT binary patch literal 593 zcmV-X0Hv=@BjaQ|F{1AU+wpQ{$Kys{`!CTH>0fVKL!SX0Ad1a`1cQJ=-<7ptZmH9SAnX3 z{Q_yQ`~BbL*ME+m|K)!Dcl`DLKS&U$0U&@t8vg$M`{&P}#F!W*N5{%vzvln`{r&f^ z{||ospYrSf)?fc0{rZ3A*Z(w-2B2bq00L=XVPVP4%$zZO`i8aZ($dmav$E#>{B`Z@ zum6{R{h$5&|A}A!9e(}a_zUO_pbY>4IGm#s06-9cg3a4XeYH!D;D>_*`V5R3;NTtr z%*@^Mq=>M$LXVh`5jChqDeaf800L?F_U+sH_3M8E<^KOyQ&ao$p literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ph.png b/gui/slick/images/flags/ph.png new file mode 100644 index 0000000000000000000000000000000000000000..b89e15935d9daf25173f89a36d8111824fda5db5 GIT binary patch literal 538 zcmV+#0_FXQP)N~0_Y@w0Al+04@f;`V3_{@|8#9F=K6XQ9UY*azdwKd1Cc)=8bAo50U&@_7#Kb? zFg*PK|H1$NTnr5Nxw#FRn^&xvtbK0f`#-;cuKxpc)t_H~fDExeq6ZmH0|XFI1NZ;` zGXMXp{AUnj_^>}zDz4B$`$1}#7U0X2MOU=aELU!7sY=Kr&1{QvMCSsj$|2dLpM12Fg)7ytqY zsKMy}yX6c^FZ@4woIyZ63`(G)I*8l(j07*qoM6N<$f~Z~XumAu6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pk.png b/gui/slick/images/flags/pk.png new file mode 100644 index 0000000000000000000000000000000000000000..e9df70ca4d63a979e6bcea2399263c081ce5eaeb GIT binary patch literal 569 zcmV-90>=G`P)`{xe>ko^7oADI06=l8$gn`UeR2p|@S@&Et-|M&0Ts{jIsi2(+HrUEqpC9EW^)CAOaJl^^9-%lBC8BHP081)#ChQGgo zHUI<=3(zGH+B`^Tu)Z%{q{PpYS&%;j+KluCr=pK*_e;5D)h=t+bKO_wx|Lu6N(?HnJ zN6`lu;-7zgR^V0GaA(7wCwqWF2h;!%KrH_l5Kj8_?>EpHKuhXR);;uSzaAK9KY#yZW@T0p zQ2G1+FVF^n0AhUp{`o&J`0?k5YKbbt8;l4>j(9ExfB*vkhsr>Vq>*li00000NkvXX Hu0mjfu=^7c literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pl.png b/gui/slick/images/flags/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d413d010b5b097c4e0a4604eba86dad79567ed16 GIT binary patch literal 374 zcmV-+0g3*JP)Ab?mv3iQ8Nu5A{|6C_|Nk>HFfjc`0biay0|+1% z2B@O{$c+Ek03##gzdwHf0*Hl3)etG5lK=vU1?W~rxN0!OqXDP`Ab?mH`1u+7`u;zA z_W#cxhChG)!_n{G|9=A+zrl>(AX#bYe+w4^1Q6Is4VEzI_51&? zUm!LT$@u9L&^Z7B1a=Zw2xL66B2?87%l|Mi00a<712fnG3~)u5+Wr7F{AKw27w8;- z00L=X`u&GNQW9*;Uxq&*os3{386YGO{rw9;K*az7#P}5)xp2gQ%0-g`0)PMm0MPYZ UsK>Njp#T5?07*qoM6N<$g4HXSwg3PC literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pm.png b/gui/slick/images/flags/pm.png new file mode 100644 index 0000000000000000000000000000000000000000..ba91d2c7a0de26e554979f6351d42a1a4e22de3b GIT binary patch literal 689 zcmV;i0#5yjP)#D@XkmAv!xDMMW8-mEZ&mK%|%B2@pa*J{pUD?(_ahBqlG}*TVt; zF#yj00{;H~{{a8``T70x^5Ww5-{JLFN2dS#-{Io#@$TjE?&8zZ_V@JO>E`A8`2YX_ z`~rx{;oS`3$G61pUY_{!-0$E2{{CbX;QPSJ^3BEStfg-V`n;-q6+;t+Xyw zOy)sS^8$#8OF-b~@87@v{bTs||L?z_Zq~=&zGIaZd&b4_{m<{;|Ns5^`sL5xKflEU zUjXHSP67x3F#yj01nBVe84eEr00I90|NZ{}FelkBB-0BC^O2xB85HWz)f)HsDi#s! zMLEolpK<^Iq5=Rh0M7pb=>Px;h=2d#;^FNBZtPGJ5bKP1n*{>+?(qio_5k|){tF25 z`1Sjqtv%A&PR-7P0st`p&i?}b008M5=kFQg|M&R&{r=?U4x6PnhWa{`B$w z?CApk{rU?E^8f<&008;|hy@rKe}6M^a>=kt2+9et{QJXr>zQ5ua`W#$8JQS={rbi5 z^Ctr{)6XBj7@3%V17i>%fEb@MFnj<<;{gVSbOv{z8Q{qN1r~!u@ISB;HgNQF0R$KT X>6#2<48ze<00000NkvXXu0mjf$fQr4 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pn.png b/gui/slick/images/flags/pn.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9344f575bc92f4c1a5043e6e7d0a8b239daa64 GIT binary patch literal 657 zcmV;C0&e|@P)$VEDzr@CQtS7ytnPF#yj0 z0a0(~eP|Fd7x&oU`XvhO+V>M05dgm54eRCe)!y3s`vCp^_5Az)`uqj_{QRhrlmY-T z0M7pd#W4OILofm6?eh2PFCO>E*7Xbx0@lgN z0st`p&i?}F01o{F1pxvB0QdR->g@pe`}O_>?Enew{R9F2_ajBO3l7@{2K78Gz9u`z z008^~05Jg0{{!Vds4FN77!dx<`5YAi^1B#F4D8&$5I)oT72fOU?&Jm;1k~m5*82ws z?b$fe$;$!&F#yj01PbEP9OVUy$0!>9?*iHF&;9=9{2wXIjNS}D{P+g={1WdM4-6DF z>gCe?_5uI^`T_tk0M7per>)2uHb&;=(#87${QNQl(a`kw{Py}Y1nctu{`UwC>ihis z2n-DS{QU(1_5c9-0*DC|aR2`P{`;Tl?{DV6zkmJy$H?%Xjq&fFKfk|zXRCbma58?r#f z00G1Tv;`<3F2eQa&)+|P|NZ&>@AqGj(m#Ly0)zk56?XydpHmj-@bfY4J_0oTA3y*x rGBBhgM-@1KAF z|M~a-&+mVKfs8*8^zZj?AObQ@tXl^VK#U9w|7)um9zFT5!1JoGnu}M2{r|uJ|AC@F z;y(;9F@d=M{=L6-3m|})KsNsS&&$bh^PO0375Ag3EPt6;7?_!X=sz3*^#j#0Gyh{@ z0SF+Vlm3Z`F-Ar(?BDbM+y#c5od5B%>y$nn=KcNZ|L>nr$AC#T8JS}%RsaMLPy>UR z34^BAe{Qb-hmSD)`~82~jewZHH;sOtVgB{~2T_Lx z^M7~ue_6TzObGu%0nl7VM#g8?t^ouP$PYjMFazDG!uzbThlgL98zlelKgeJZ;~z*Z zSPxJG!?$k$0R+;(`ulr=6P)M00|Ni~>`!`VeZ#eh`fLE8Q){QmQQ=eGY$|NqCtU}^v=1iBd@fS3^8`SJ7r@8ADF ze*C{^(f_{w|JZZ@y#o+HED**2KY#i6{~yEeU;qEJ{Pzp|pOucqNnlF=0*DFdB%s0n ze*I+l{{11(um4^iSXF}z{SS2YKY#!N`GNV*AE2Jys=p_Au>JnK{@0e3zk%WO_xG>A zzkdJw^XDIk{pa6bWqzfjEk^+Y2&CaX+n+VzlIN6JC4s^J?+-}zKcEU=eEj+Q{|`_P zFrfeb|NHmfUxq&n00G3<$-qz^$iN`P!0-!({va{_z!?9)Bm)CLfB^vHpj0t%_B3$- O0000op82)aAGO;3n0AgYI#891D4N?IF|Ns4E{L7&Dm*MXp#y@|U|NLS4 z{rmr)KmTFmmra`h0*Hly38?u0llM=#nEx6H|J4!x{U`A6pVzdvv{Rd?JIrI9L zs`Fos+0`Q4a^C}Q0+k5A1KaQ$>Lf<6lK=vUh2aka(D+|}f9<^YM_B9kC$A?0Z|}3+ z`ptao7t>dSY6f5^0o~2O01!YR8-T_G^}PA>yZ7X8cHUpx=KlJ_{+sC?ST#h$AD{+c zSpNn30U&@_7``$5{_{tYU-I{#-$2g*Lz_YNHw#c5FVJd`!65YaF9ZRd1Q0-s48{x$ s?-&?Px# literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/pw.png b/gui/slick/images/flags/pw.png new file mode 100644 index 0000000000000000000000000000000000000000..6178b254a5dd2d91eeaa2a2adf124b6dba0af27f GIT binary patch literal 550 zcmV+>0@?kEP)~nkZ zGRMDC%7~XK0S0Tx8Wd7-QG59jKr9SQAk|O4{{Q=*0jSzY^rW5C9>)KFc0aM(`^fh9 z|Np=Kfe=u&EDs~YzkdJ$!~!z=-~YcrJO42FE6xsAYGq`2_Mbt_P-yG_e|4Mhx&31J z|LZSE!|%TgKvw|-5ED@OU$BE2n0|Z9O=M(v1mpqrFfl%gR9?uy{Oi{rkOq*RfB%6# z1PCA|pp${Bfd()#{N!P|4fj41<69Aq$E=K>;Tryc4F(7xpbZRv|AD;q^*8I6-->Vz zfB*5n`o{nM2Peo6f5F}W+3*h_fS7<7;^vxc*?8?`g7w0kCk@cHxaHDByoH$n$~K0fYN5BQR!wAqjL2Kmai^lz(OTgcO%Q oK%!9YKcr{|u^AZn7ytqc0H_5zuk@Q*SpWb407*qoM6N<$f;OS^T>t<8 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/py.png b/gui/slick/images/flags/py.png new file mode 100644 index 0000000000000000000000000000000000000000..cb8723c06408828ce68a932ff472daabecc64139 GIT binary patch literal 473 zcmV;~0Ve*5P)@|4`Xj5kLT%`al?B=W5I`&pU%&omV`KRD53KJ$2txq_ zg7fbmh|k3I@68*40Al&@kBy(1nSq%Zss!k?M~{APS@-YvZ#JJG201x|0gQ}qez5@r z5EI0wa6>`h%cteq@9Mue|Ns2{KQdro`19u4 z9*F+^0|+3-w;#WAv9bOIX#?r_2Xj8qX@CF21pWab0}C_Lljko10*H}8@M3d^)Z>@G zf!6*0!vH4#gGo5!|DS*V{{HzdC&9L6!fAj26p=v+03Zy*=I{f8|9_}7o838uP_pBd z=z9{Sra^iHOE|+IC{ z-`~G~{{ZRVfB*dX11A6d`CYbrEkFRVK#Yg0UeQ$d`q2ZhA|Uz&)bIy{egR1#X&Imb zfB<4bR{ihazwp{dkXn!mkfPsU#_wMs1hfID1|Wb~;Esc6TU=EJGWFLlunkbN!Q9_} zL0)432p}e)sSwo=4bd$f5a~a^fBpd(3|0LbOac`E1P}{Q!+)sq|NsB}pI=e{a>g%& z)4?|U{s;0mNCQ9sG5v!Z57O~Jp}QY!5N0Be0)lgG%);U`26kn-@hOg zU%!6+4+cOs(0HIde9xZz`}Onxub&LUB0x(30+2WcIRJn#2ut|?gWYu1Cf+!-K%B8# zdf?1WA}#uZ8oj7u>$I1i0Al&`=O0k%-@icgAIJnM0xA6maSq6BK-ECw|NZ*S`0Lj% z1_pot6puj;05Ax`F!=umqj7^frO?t|3^&I1kxUq9yECc+jQpY84SWH_0#pxl$?v~F z@*hy-KN0|X07U)z`4{NpU%#2aHUI<=%a31wK(7Du52Oc(|3O^?R1IN+RRjI-n*kVB z3=9AP#PZ|EACPLGJ%9cJNh|>9B%spYzZw7h1%?tp0I_@ndg9MNE>313@6R75NcceF zkr51-#U+7;F#`Sf7i0rK0I_`g_NQ&Zji7_t0d_@@ozArL?Su`s;*Q{AKpRQ~TD44PX+*q00taD0I@Lq1k(S2nt`tR{g)9*1H=ZfhCe_Je;NM%1^NLXfPkU&2dGq1gcanC zzsyWb(hLmW7#V^70~+_6f#nZ_(jSmgFakOWAb=Pd7`8Gn`~pjZT=;x%FbfOAzdzu3 l1(F{a{)I#17yR-T)##NTdjqb^wzQ(`1@?t)Ix4MUXz556teM9A7Ic zq_@itH|pv>q+zrjZJ^Hx5bj=fD{5McI3ol<@^-l_@~tZGV7p>1CU&qG~{YccyC-q z$8~P)6sG{nMmQy85K$E6L33rja$x-b9$ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ru.png b/gui/slick/images/flags/ru.png new file mode 100644 index 0000000000000000000000000000000000000000..47da4214fd9edb383687c1d4f84fe8b42a51ceb2 GIT binary patch literal 420 zcmV;V0bBlwP)X|NRSO0LlM<{-BURBqYRGSojej zfLOL~|EH_V_~;P>Nc10*D0|Jxss< zFi1)Q<$$6LU}rIc*dU*QNFV}+9T))>0|XG`SD?F)5CbX~O$rDA0t^5@iDe$xIAIn5 O0000N_~0!B1ZtR02zJmAl3i>|Nr}+@!x-t zvcLa8?7#n*fB$3p|L;$z$Rx)9zm`4EX`B2HAb?mPX21FhQ~^@@2dMNf!=L~E|NQ+A zWdHd6KUK1c=hsc9f8Rnyezh^=0R#{e(Ek5GMIci_s{j0D`2GL?@4p}ozrlKzzsUIh zhw0@n(cNzYfer%*AeP_1{{8vS`0Fp&84w#lmi+$#)ARI~X!Y&+KyeWsW`<9n00M~d z^G^m==F0#79{mS71ZX;t`~_q%fY`tPf!Mzw;*3o4FJA8j2p|?NkT1UdXZrG=;TOYy zh@M|qNhT&CJ~jq`0Ac}pl#vl6#K7 zFA)9u_3syi0VMzY2QmHtx&Qtu@&7&0&HxaAAvs6^7=(cU7?W7&6Z-$piRe`dyDK`^ zN$WO$zWL=wEu!PO?Vu9@iVSM&8cWvf2p~p=WCn&G3_$lI&>tl77dYY}Tp)vm0U*Et X__=7oxWDB`00000NkvXXu0mjfV`BRN literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/sa.png b/gui/slick/images/flags/sa.png new file mode 100644 index 0000000000000000000000000000000000000000..b4641c7e8b0dd79aafaa73babdb525d3d2dc6a8e GIT binary patch literal 551 zcmV+?0@(eDP)4!1u&@QJ10&`rk^HbMk8Ee|uIe&H zS+;4$DbWCt7$DsBz5oJg0IGiW@flDZ69W^F_wDDmUw?kFvatRB^XvPsAO9KtfBpI8 z%a6}8Lb5=`00G1TbjJVx|9}4ZVWnuJEUfzZ$EVZx<$*voWzTGcp~$d(=+V{_?X+ z3y#kPS_RYq5I`UeU<=TsD9Bk~@o?qi&=DPd(?v86a{(`&&3I*E&g8|Wo?Sn;v*0j086Wc~d66UYT>00&^E24DBZ$$%)DV9SRUYEY{Wn z85tspN%!Z^Q&_X+!-^Gee*b1;`1hkUW~HJ2(d(c7|`w2)m##KhU^#|s1eh2YzMVW-Z(;)C{QJl7?-Rp6DTaSP8U8UK5I_L2Ffe?nu66~hU^Xzg zV`^IR|NmbGhChsd{xGln!xZ`Z|DQkqe?!SHn>GOi5KsdU{eSZ0I}_6%bMu4$|G#2j z_zP0e_xu0e-~WI8{{Q>e|6jj=B8;-KKpOx8hy`TyKZd`5nT(9?%F2RO|M~TQ@}K{E zz)C@?e?v4d{QeEp01!YxcLP=bXJGj0<#nFn|DXSVfvSK1-v%}nhwkOu|GvKejg0<-0ptJwK&1cy1oE`H<`Z?5M+~$7{9gq& zn~(3mv&(;P@Bi|05T(EW{(k!9>4UEid{_Ab1OPDr&i@1e0Q5gX)c>UW0I2)_6d3&w~i*%}NQ0G05Jg0{{#gAwk6j%|K36Wcrx-Z zDBuV5-R-~I;@8;l*yr}=_xShx{`~y_{Td7!{r>#`1^@zxvDKIVAJ?B1c2ZXvZZlkB uU;qZ}2Vg*eW0eWa_yywvNgf7(00RJ0?>)A@UfIF`0000`tbb&P~tyW8d(D~GxMiUp8x`gh2bB=pZ|ZjUUI!&{yK1G;4d%$ zIuA;MS%3cg{`2Rrii*m`ix&X`h=t(`1IH^)u0vdsLXv;@{sQG7;18Jf2Mqqg05F6A i0*HaZmVqPy5MTgGElxU<64PS<0000a|fPuet^$h(7pHv_{jfB<3vn*8q{15ov!pR5qo|Ns4BVf^v!57RHO zo?l?}`yWs<(7C?=0*LYNK?X*pGKOD3v;Q#s|MUOfZxH$qCjb2cBQWFtZ$@_cPkRpn z1P}|u9|n-AAQdnT|9?TXAyk7H4FCQBl>h_~&`AvcLF)bhMS(&{8jwh^2qVzve;5D) zh>=0RIIAq+{+o}$pxEl(3%2T)`P!1-fBt~{@Pp~sA7J?W`}60ovKZgl)=2;X#KQ37 z&mWM7{{H^+4`$e}UqIEMAo>Rk|KALM|1kdh!vsX^3=B^I0*D0|DL|!?{M^6*VPKPH z00z{*-?BnHps)wJ`QKllIe-8D1EGJQNCgNWMh3}bctpOPvlbWzK!=K^+cJPc;};D5 g19O2S13-WQ0NlBGh$rR(5C8xG07*qoM6N<$f_QiWUjP6A literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/sg.png b/gui/slick/images/flags/sg.png new file mode 100644 index 0000000000000000000000000000000000000000..dd34d6121073fffcb2fcb5b9402b3e6361cded35 GIT binary patch literal 468 zcmV;_0W1EAP)dtOYis{Le*Dj#JuDs`KNc)tl9OYUmifJZ zA4uJ=-~WIA`uFP>kj*SB3$z3vfIu4l|NYA>FaP8D^M5;ba1<8<4f|GC2UPm+H&ER# zkRGsxe?Y{*01!YRC;dKnkj2`X)zkCW_8s5b+Wvn23^5y|0jv~A0#!5q{{4%A0U&@_ zfL8pya^=_l{r?#l8F+XY{;)G~as30ko(ZTFY%s&0Ka9WsFiJ`S6$1niy`;Hnv5 zfRT}r0R;fL{~@sn5I`&p|Ni}W_wFAQ`~gBVzyJ~jk&qMs5MThRyiZo6SsHx+0000< KMNUMnLSTY6dB!#X literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/sh.png b/gui/slick/images/flags/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1d2a29107be96413eb86e64a75ac7a3ba5793d GIT binary patch literal 645 zcmYL{Z%9*77>Cd9?woAXO+#E-F%m^1b0Xy*Qky9{B^@hJqB6}jOKKPc70u1CS|Ug( z7>SA^1`5-}4+VvY=3G*k2%(8O!OWTIn!4?td(P>GANugV4?p-l@2B^fCONIbD;IAODX_{rV|BCn_NC>%qlWoHrzH=l|0Y^Rhgkwr%>N3 z(d)FjlCqjgyY4&yRH!;rb)|Z-v~HjxIkvar`*JLyzxBc-B?Ix`3*qGz4q3JAd`#LY+Xw^k(ph!n`d2H7`aI`Eh(LrOLs%9g zj93;8ws%s88WHkIqXqnSf?YSjh=@dF-}4L7dS0HFB@iNj8OY*&4>%Dn8t&*i)aXz6 zSX_wQ?~e=9UcwhrAtAf8XLVoTbE5+<^|-KK=D&>)yX6u!zrPCrbEr|4Yi(XyIGTQI zFEDsraAY{)DhUd*DN;Q?!uSxvkoT|31dF#>2L0DGeRcNZNehm>xm~}-9q?gtV@Qz` zv-lB19|m}3LHcg92}TUOb+%v(0bnUhB(5rQI9?ZY)h~Hw=%2Au&~WB@t;^kVE@F0Y z%=8f1ZN}R1MniiNxkJ!a;3!XFerfimE2A;1XJChGXJ=)MAVRubE8WFo1T(1Cmhdfa ztzC{Qms6asjkstFkFp5L#maeek84Y+NtW^Wf=SRytjpC1=BCX4NH^VxnQ`+YXocAv zR?lKskkKZN7D>{S3>4;4+gPYYq0_5iq@jsB^}M0yMT0|p`lM;R_dwbVrBg^4RRbsq Y$WB%-43-yHbAJTXS^1gPjGK@C0`m$%7XSbN literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/si.png b/gui/slick/images/flags/si.png new file mode 100644 index 0000000000000000000000000000000000000000..bb1476ff5fe8e0d3af4fc6bd11e513d95fd9cccd GIT binary patch literal 510 zcmVm9@#;PEzrU@Gx(rNA|FHo^Mn<3|00G3vEO>ZAhtlWIf1*N!=PZ8p<;&lH z{~7-L`S<7dzu$lU0~x=8==VP$LqeQ==EOq)0mSn6{g=m2e$<)X`O9Zpu5&$Np~P9Kn=gZ0kf<1I-4a zUtk1c`~{K>fBu3(0U&^Y8d(1RW7^4V^6LZG89>!QBmXe{`pfY9FT=0Dj8O6)!|#7g zK*az7#L~(TO=a{vExMP2%`MCSoB^FIcLe_%lf;|~%E5I`(IQNh}3Ao>6Q|DFUXMn*>AqQd`w z|1kXd^B;tM|Njjl{{hM0zwd6?1Q0+hV1xeud-4=Wy?p-%sO`^#2S61Jzk!N?s)6X& zzhA%p|N6}=D+{y%Ab`Lc{sL9~1=0UN4*CD*7s%9KAf+JHKs~=eB-8KTKvw|-5R1&; zzd&a|ob(5%^Z$Q=wHy9p13+aOpFRNu5F>N&`Tk_-7w>=n{RejQzkfh&Kn{rf10?_b z{tFTZibx5v&dxav5I~H7|Ney-|DWN1$%1FyagzUW0464;_wU~W1Q5$TW@eGxtUvee z3vAf*8|igK9~@*rr66bh|NrkNM8z+V zAV?>O@ek;bKfu6d002F*|Nr~{=Pyu%qcHbB24G}l{PX7zKmY(S0M7peLS*D^UKK~y z+6(XH|9gD^r>6bY*OZ>+`2GX^{Qmv@{`~#_{QUm>{r(dW1b1xK0st`p&i@3&%J4-( z6Giy=|7vRh4-WrbUHx`??d0*<@CX3>{QLa=`~Cm?`~Ld;{u~zu0R89!i0SVi2B1U! z{r&fU#+3gbKmA|6l!@v8=U+^J{{8>`mjUR&KfnL~{sUtC1qTg400I5L26X!4i0my} zo;{uZo#CfPX{7DT1DwDAf(-fnkMZ|^ra%9I0mS$d6bftr0mQhUfkCOfiE zM%HqlKU{maemr>kAILSo!3gZ8-+$N@WcKe}3J^dnRtyZx@9+FOdynDWy$P0%j62V; zZC)?>`}hA}zy1SB2;@n0006p>>h67sJD!pI8@uK6+#GPW%ce@CEFZM znTD)%K!F4J_qpc@AQp(ZPk%rA2T{TB=kLG2fBygZ4O9eD_xsnsUl6u5yEM=SfB<5# z6|+@gR}o|u1R4pn+XF1YrQf2oylS zAbS3(sBkhcTmc9mV6grHN=r(zLW3F{=D&YK84x>x_WT70A}|U80*H};VI?9O(a}F7 e1_Utx1Q-B;QgQb4eH!Wj0000PEol7!5I{@}e;EG$`~Mq){{FvoV+so& z6Zek;JYV*``O13q$!wq?2!V|I&+z9TKmf4-@!$W9Km&lr1Ie!(IeUNcyZo#F`{&0p z?&{CqnEw9%50U)~((nf$fIu4l{AK07*qoM6N<$g2hARp#T5? literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/sn.png b/gui/slick/images/flags/sn.png new file mode 100644 index 0000000000000000000000000000000000000000..eabb71db4e8275a5bfb7b1b8f3a8374d50da95db GIT binary patch literal 532 zcmV+v0_**WP)6{xSen|M~Ox&!2yPfTn)={d@hr-#`EU4p90fz>J~+=oo+i0%`d3@9*!wzk#ZO z2WQUEDXOGe*gO;$t?-?1~^z5 zels!xNuY7SApXOk^arFAjDSu82p~p=WCoxfknArIdOZOgs+`19}IpFa%0{xSUi1L7diFBr+f01$veIX40Tgn<}np4MoMn3N`o$god9 zrkzn;+j{#q5F}xeh49xZuI$05IKi0v3Lq917Le*!UxBJYN`Vr8|1$jj50VD5fvSOw z-(ZF~46zx($8#~-kUKOh9u19TNY0I~dG z`1hBA5y<}g_y4cI3}({*g*gAq^Z#dL_#dnH|JmpNJMaAe2etv|3x;0|00G4G>kr86 zzYquf`+xk=e@^EAQat}9xc>97{@;He<|?3qzo3u+2q2a}APrzwf*tnl_y6c6m z5?7266~G|=0}2mdsDK;{bP_-SF*1~XW%vY(NDyK`u#uw~6h{mUJPZH<1^~BhckWKq{Jk|L6Yw|Nrm*vcLXk{sL#*k)f0!)jRF?KX6FHLLC_7zyJOQ#RJf}AnqSv4E_E0 z_d>^cfB<4-C}v>z1dGUDNRj#r9OZBkNc8hC00bBS^Nnc?6(4BA00000NkvXXu0mjf DM=x{`~^7feaw| z@9%GBrr%pd7ytr@3Fu&;D>$G0;d%9&ckUlP_FsJLznOpkI<);49~%fU|NOOg<1c>p zU%YI;<@gu?0tjRS1JJ?0e*b^_hvDg;|Nnpg`SWY#%HJzjff!!CzZWj}wP?w&U%!5b zMg95nhXEjfKpOu4{R2W=zZm2}8km@V1qJfIu3a z^ZvQT`ny}__wU`%Fad@Sg!~P3A(#OSI%WR9r+OFw0*K`e1H&7RKZ`vj#ee<&!}=E_ z2M*0Ye}N7Llfc;c2aF@2)L(`#3;+SdxR!w-xR`a|fPuet^$h(7pHv_{jfB<3vn*8q{15ov!pR5qo|Ns4BVf^v!57RHO zo?l?}`yWs<(7C?=0*LYNK?X*pGKOD3v;Q#s|MUOfZxH$qCjb2cBQWFtZ$@_cPkRpn z1P}|u9|n-AAQdnT|9?TXAyk7H4FCQBl>h_~&`AvcLF)bhMS(&{8jwh^2qVzve;5D) zh>=0RIIAq+{+o}$pxEl(3%2T)`P!1-fBt~{@Pp~sA7J?W`}60ovKZgl)=2;X#KQ37 z&mWM7{{H^+4`$e}UqIEMAo>Rk|KALM|1kdh!vsX^3=B^I0*D0|DL|!?{M^6*VPKPH z00z{*-?BnHps)wJ`QKllIe-8D1EGJQNCgNWMh3}bctpOPvlbWzK!=K^+cJPc;};D5 g19O2S13-WQ0NlBGh$rR(5C8xG07*qoM6N<$f_QiWUjP6A literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/sy.png b/gui/slick/images/flags/sy.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ce30dcb79b443ebc1615fe4889cc26e2d762b1 GIT binary patch literal 422 zcmV;X0a^ZuP)@|4`Xj5kLT%`al?B=W5I`)SK7Qoo3V-qKd5l^# zgv$taFhBq?zJ2?apPwJU>mjm?jEr~g+yMw6Mj$IKE$!aDd%wZp7Z^YoAQH^_^XK=U zKYvwJR4!h;2oOM^VEz63kEEm|Pzoptl!JgjVAdZn_zMF-#Q*_BG6D!N0MDLEDh$KY Qwg3PC07*qoM6N<$f z|Nj36M1Mf!|33`>e*gaqWCO|HKwFtO#a&sZ0t5gt0M7pel4t!zdFAutyc%F2ByLSib7d z-@iY8{9s{WsjaVha_-{UlG^LGvEO)A^**!$6$1ni3ljqaFhGRYPy6$qf&JG{kKey{ z|N8ae_ixs}{}``bdDhkT?#VOp#VvoBm>H#|fo1~)5aY*A1~#Xrf1jTKgW~`H-wePI z{Ri~aZw6pM{r$!84-_k)u=@Ltg1)Cf2{xiF#iKZ95W~`fDE7~ z|1pDN1{?_>vH!pR*Zxoe2p~qo;+=0k{eVOy5dHe~@Bg1a48OqWACLsaJOfY!7)!uZ dz{3I%U;rfUVNTmRI(Yy9002ovPDHLkV1m_xKPvzL literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tc.png b/gui/slick/images/flags/tc.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc1156bec3389e54d3c5bb8339901773a881e68 GIT binary patch literal 624 zcmV-$0+0QPP)Mt z2Fbqp@bUfi_XiXZ_x%As_WHU2H1hfc9TM^w3-JC0{^0Bg`~MgK0Qv%mWs{6kqN+Cc z+b3Uc-enXLWmi^s_2~6APR{Qy8GilxQ)j#p({t5y7`^LQ4&lw9Z0Ra5^`SSP!?%<&3?fU!$2L%N9{QCa@0Qv%mW$D2m zA^~iFet$Uihac>@UpF6ozx?O#ufL4HfBpRUndtzp5U;>@#TUPR{|1KG4}bt-0)`aO z`@jDF|MM3p^6S^{zdwKf{q+mXVfa4fgq7?27ZxvH%|34Sm*EEk!#{ukVgYLS^A{)$ z3^fq>3urc&4I=;kz4MwgW4X`2zkh%J`Om=vauPrQ0X6*k{pY`=2p7%A_P)?P zUwuVdAkKe=-@h3}_C6p$AOxEwQo+UIeHT5%mg3lYGL;@HP(LjqG0$?6F}(Ht8A z0K*^*BsuTDFa|;zm9Mc;PRcq|KMMBO%8|{GkrU*a2x&r-3HS3`xnqW1|R~39RolBu`vAj19S<{HjoWK z4L}tj8-Qm20eTwfuYbROLyY(bwgDi3SQvf*HG+%>>H*pSauQI_zkmNAP67ugNCPlf z{{97O00g6G8FFbZ~XHln?_bqJeH^V)*lb;YTJ&0)m(r7ytqc06HRil3NF`RsaA107*qo IM6N<$g5!7R+W-In literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tf.png b/gui/slick/images/flags/tf.png new file mode 100644 index 0000000000000000000000000000000000000000..80529a4361941e01d1def5d581bf2847cf99fef6 GIT binary patch literal 527 zcmV+q0`UEbP)KfiwinSYl|od6I(APxT+{=azr6>87_{|pZw{QvzM zh#vfW|M&NwU%!FG-`~IfN=xzq?EwhD!Wi2C0Dv&)|Bp?Zs+hPi0R-LQn75%cY-O8s zAPsw;Q!9X27=Hcx_y6DDzyCn0!4P6RP{Xg^fBpb%_yyDhbQs7f8-Qku33L4cS@IvK z8OZ(n2kOgTzyGb@ek0IRW9ouaN6$P0x*s5bfH4)06qlIj4>;1{Yyp4(0|4dQTo>gF RMrQy3002ovPDHLkV1fdR=hFZH literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tg.png b/gui/slick/images/flags/tg.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa00ad4dface0a9c23744ab451cec0443f187bf GIT binary patch literal 562 zcmV-20?qx2P)@|6mN}b_RwI3=Dr@=ogG+VE_mq7La^(HIVqv%*^=nCj$%1|9}7Uoj(8m`RC6+ zAo~61@1NiQe*Xrt|Nh=Ea}z)Sfi-Y&{FjhmFg0aZxaj}$=L~=U)(L)O`TP6-zu*7= z1Ib@N^zYwqCU)6YF9v`BVgi}{>lcH)J%gU!|J)p)>i@rg^Kt&>WCWsLoQyxgk29dnvBpN5vQb0*LYVQ3gi&tp7jnGyMMp z@*mKbe}4Uk_!#8f-w;8De}5R+mEP<>2M|CkH{LKvi2wQh{WmZi827ytqc0C8?ZF&p#S!~g&Q07*qoM6N<$g49|K A6951J literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/th.png b/gui/slick/images/flags/th.png new file mode 100644 index 0000000000000000000000000000000000000000..dd8ba91719ba641502bc7ffda16c25dc71b2066c GIT binary patch literal 452 zcmV;#0XzPQP)@|4`Xj5kLTn#2^O%5QJf({+!S7KyMr1NSdb0?wsyYS6cNVdko7wub89?$EL;)x)00Ic8;m6; z*ldXL$Yz5{poPB}7`^}m5DPc2nu@9r4=+1782$pC1a=$HjDKJ@i17#P6G=(#Q>V-T z0*LYF&!5c9%>VxV!xcCX0F(uW(%ZLh0Ro8SA3Hl!NeKhQjeq|#{05SL7=Ql;MhF4{ ujRQ&nZP~jQAb=RZqDCa1IEDa#00RK>mSUL#9?hx%0000(5Af|u+{y|g&!S9Ft%(8imf-XR*|Ns8{XO&`< ztN44b9;zJZ^?&~W0*LYB$B#TbJpUo){|D*(`>^x>w|gKB?9z<#wQ%E^n3(S0zYh>V zEO6uD3`W^f29Wmu3`mZF`w$?27#UO<(rVJ~y}I}N&+p%VfB*XP3y6U1Uw^?QNbuL6 zzrX+d{i`Cbal7Zfib@b53s27mx! mU=U|u;Adc9XCM*)1Q-C-v^a{iiydVE0000+lNu{Qmp=|FW6D0*D1<1Ovm9m%kYQ|7p*Yo3ikU z7~kiESLFZv{{Q#iA0zqwf4<*Xu-*CD8$MYncA&8U0mQ`ckKy0n|9}7f|MB&2MbDkQ z1j{KKBL!IA2(Z7F;(zkuBe#mo9TT;SzkoLU{s(jwKmai@{QdX$=kGt?etVi7(p9*e z(|o73K&5wiaQBkXEB9so{`tH8jIplb^d$ZPi5h|uLD4*o5RnOS|{Qd{@Cr~j!0D)}y0}8T#$FHit{lE#dc*g~k_utsL zxj&Wpto`+k?f2h5mv;mM4gK>M6!-uE1hnA~P_?8O+wWh(`!4wX{Cn2j=z=is`~Uxb zzx=@K_DcEUJ7IZAUZAu8{sn~+Kmai^Fsw$4O9qB73=GeJhA}V*Ffg!yW&gnt6F`6g Y0QOrYft$MNbN~PV07*qoM6N<$f;FEW z@b~ZkKS1)&|37~i{`~p>`}cn&^2?@800G1T)Nta$zvt>t<757@uK4@^{4bCmpb7~3 z1tfp{|Md&VW|Wov$G`v(Kp+kO{{26+>+jbuf7A2+upj>Wf7$Q%RxoV1$N0e}Fas1Q1BW)@@rKJa|xATBWA`D>(WW1JFHv zzy7cP0k+{MTm!^O009K@!>LoJmn~avX#S_9;5YZ-KmTX``u`YaHjD&?*dJiPF#rS* zNW;&cKP?=87yABYZ~OCq-%n(9P{tpi22h9t6$1niNQ1e-pD1xDrvBdy@BT2zfI@>2 zY$OAO1fsuxAqeOsfB<52Wnfst00RHO2+qJn5C9Nh04p0wT74^6IRF3v07*qoM6N<$ Ef~oTCkN^Mx literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tm.png b/gui/slick/images/flags/tm.png new file mode 100644 index 0000000000000000000000000000000000000000..828020ecd0f6fc73348373c9e7a235fdced09de7 GIT binary patch literal 593 zcmV-X0VKiqu&g@GZ_kb&V31Gky(*8`UselaloV1SZ886W^4001!n&i@1e004Y* zk0R&!|NaLC5DIk$@CyeC@AU9ebDYiJ)zswL{Qdm<{`>p<{rmm%TMiuO{1voVt6d+$)WVk%^O){nwx0zkdJv^%rQ#Z=eQ%0Ac}Z`19}Y zkI%oqe*ekA`2WvehFzDBOo*xZ{rB(cQ`_&qdGhP`Z=jyvAOx}jAb?nae){+CFDvWc zZ(siLa{c@D=g;LQw^HX+sY@u`d-M3!$G1SGAWQ!Ifj9{ufLMTG0<_`#=U?|Ye)D|< z8pH7G?=PVA*@stt1I-4xpA0e#40jk9 f${7d%fB*vk3(!F(w2U8u00000NkvXXu0mjf+94t7 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tn.png b/gui/slick/images/flags/tn.png new file mode 100644 index 0000000000000000000000000000000000000000..183cdd3dc98c6957bde83f375a431e543a3ce9e4 GIT binary patch literal 495 zcmV@|4`Xj5kLT%gT|L_r@28Q3iff@h;hzaCwplYy<4FCT9KXmB7 zhQ|Nt)Bg(#gN*m^{Qvt8$Of<_K(zn?!~}BDpT8hi0uj&>pxItt|NHv>A2{&e(C|Mm zFGw7s;m;qS=>P!)((wQ9AF!W(0sZ}7M&|#9_5TYB{zpfHZ20g2t^wjCfB*tH2_nSs z8?4R7=Kq6S{f9wP5^T(0hI#XVIvK%6GC)WrB}fdh6SO{nUiXv3iAlW}aH!uJM5J&?vILH{_iZHeP0c!XQ3PuJ7 zfB*t%VEX-sK~fTI%wL8-Af1e0BN-qh5dHlNK|sX-0mS$fH6j^sMDRaYQUC}r0RA0L U-~OCsp8x;=07*qoM6N<$f)6&Rz5oCK literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tr.png b/gui/slick/images/flags/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..be32f77e9910c0896c1ee8e7ed4f0edf815a517e GIT binary patch literal 492 zcmV@|4`Xj5kLT%yy% zCxE~j7#aURc>+`lQtjr(@bBOM9XtMi`UFz<>-YcPzyAOF1!ObI$^vZw2q2J#|6qeb zs-vSBOie-Rl$HN?bb!_U0_g#3VEFwTr~x2=m_Y6Zss`GqsL0^t^nd#F|4B*zH*EO- z_3QuT%m4H6g6)A?0#pkSKujPf{rCwIb#eU5`( z{s2t}2q2J#|9}60{Pg58FvR|AYlEDjruP5RC6KEgJ^H_IA4CJhNdN)F0>q49OBog~ z{?Etvzo-c07$As@{Qu?4|3!FoS~(Xu$ujuK&Ki|5;f$7pYF;Nfxh(xqFs zZUMDjzjMbfEbRY>5C0Dx`v3aP|JSeozj_5kj66I)?%V+g05Jg0{{w&k0RJ5w0P^!X zSy|WJ-R9=z(aMV97z{4myy=pj4$^bx3|zy{hYtY)h`Ao9!QA5iyLbPuTmkB_PfP?Vee~$j z!-o&gUAyj)n+wu&>J&%=KmU)%j{yP*q=CWA45Z=rFNTYkfO?!$Q_o+&{s0WlT)E;? zRQUhj|NkdWF!J+%fBF<4fS7B68jOwqzkLe|6QI@S&;S4b-#s()-1Y1C!Qjl5tA6F> zpisYc>&x@!00G2Y!@$5~Xb92(47=Z8{{bD%z~Ggi4>bPny?b}>+&OjWQc!g@0~6Et z-Maw-h`Ac5K~JB7o9jOp7XvpB0}lu>-nqlT$mpA&|LpDCZ{NOs`t<42?c44-IbZwx z0Rjj;B7x{N1H(%OhUW|nPgz+XA3Vr_1a9x%4G>@ep<^{rq?UTJ00000NkvXXu0mjf Doa;3l literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/tv.png b/gui/slick/images/flags/tv.png new file mode 100644 index 0000000000000000000000000000000000000000..28274c5fb40e5d3bacd7c05d9a1b8017eeaffa6c GIT binary patch literal 536 zcmV+z0_XjSP)mzpv3Mmw05Sgm{~xFtLc$sUu>nR##!sI<0R#{WMEdpj-yJ7j ze)|0V&%b{_!~X#7`1>EofS_N0|E)GoUH&SsFy}2m05O4F@}ffYb$qvjbfSUipMQUU zgY^9U_4m&&5D8KZ)HC5u^uad<48Q&W1P~L@hOIAb7eDp_T4W)^*Xg48{r4ZBJ-_}k z{QCPJq~Q-pPnz693xQJ%zkUG(5aZwHtqd&u|9`*u&+TyOvq{_Ghd=&6oB?#w{~Yv(xYPgr|NRH*haKioowt*& z{dC`3v>70P7=Ql!$;`|Q@(GT>fdHT^FqGcDeG3pkjNS|k>E&sEfzAeo{ckY&=g(gd z`CCrwmxA8!XLtTy-uM6CzrVnM%iVPzAb=R%ks=j>et^j`MFs;Wh8c4i)_^1XKP)u> a1Q-A&>r+tW$-Nl>0000<~s!0-E7R}a|Ns2?4|9|}gs%Dgx1=;`*KrBFO{{8#+``2Fv2B6@-@8AFY{`(K80jdYk13&NH4;SYnOGgJvc0I@K9VW@Vk1}Xmk4~YK$|NH0P z-@pI<0D+Rop8&DnA}oIvEc_iD{O9-Y-=|4+U?1uFgf@9*z_zyJRJ z%fS3QR^zuR^Y0tyerNXndi(YlP_?gzto2+5fB<3vIsj-gQ0X6_*?&Q*d^>boB3^zoi8Kq^tbl{qlR!{9jwQ|Nij< z=(=A?F~8j-MSe1{Hl8Yc@zaXo%Ljk}VgUvb(2HJbe?0kqy?_3vsPXrUmq2rWE6M!I zE@4*I;Mw}vw&7&iFGdC>zW)rr{s9CK3xfnhrsi*1wqMhx{@J=6sPgxpU%z6)f4fBr zzxpd#a3tyYE8}0lKnA+|-+zWbe*glA<)R0}-=}{Pnt#7~1q_Mb;=;f3i~oshNgsS> zIr~z~(_bRL|NZ|1LO_>;A_pLVSoBpHQd9nLa7ao@{lMMx#__lBLe9Cjx?EiU z71{s)`Oon8FXP|;z>s7BItd_v7-5mj(Adb}701wVj$!S*>kNN{fN~5FV)t0eYh-DxnQ(+0I@JIfmA>F`X8wD?>`2h#NWRRzyE`zA&Pzh5tt#% z!^rUCA3y+sZ1@LM1hf`pHc0ia|NsB|1uKPX0CRu;1-SztfLMSo`wOxir1}rsY$VlC z667idh7Sw?0mQ-}a!Q0#;n&}vAb0=!_Zy@WNd5!6=O2ju7s{65Vq=gx0uVrqe;+b1 z$mIY3|KLBvF9x7j{{!v#g_UGtQhI;<6hHv607H@yECdWlR7EJN!LomVp$!l~APvkQ z4p0cL2#YobhQA>6hXEjfKpL3-19eKmL_s!=;22W8vpXP)6RGKQPvx1q)UK1Q6rb{|u}Q zRsa7#{m<~1f#L7}|GzNK{&HxZVEKJ4>jAefr9{u_M=MTegAo-i2ynN}MJ5kZm z42KRel$J95{>|{~*Z<$Y8RdVo9Ap3pAeIsa2H!t_KmPs=bot-kKnMR0GBy2s>sC=w zQFmwO;@`jj{`v(%zkl=p`BTQg01!Yd{Xp;j{qx|@pI^U!0X_En_iwRd$6{h)tX8f( zaOhC?&!0e%U%!3phy1#1%V=eK#YHXK~n$!{#(ib5I~Gyfqpu4^P)1J@ZrOUii!$=0Ad7ci1(2A^!3kwFaT->5i7Ttz54h6XL$JkA3s3o z=g)t?e>01U3h&zo5I`(I-#Hr#t~u}$WXZu-Kyv1Rm&rE5wcB1YFI@@=0EYkn8G$4- z^Xb{M0Ro8S57@^*QJ}#<$Im$M^4iKw z00a=@`Sa(sw6y;I{R{T)e~6KA2AmBHF`#D(ii!XNh(#nN}rF)(}plRy9vU;su%e@J`J?dSji002ov JPDHLkV1n4Y8}|SJ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/us.png b/gui/slick/images/flags/us.png new file mode 100644 index 0000000000000000000000000000000000000000..10f451fe85c41c6c9a06d543a57114ae2f87ecc1 GIT binary patch literal 609 zcmV-n0-pVeP){qW|y?pud`Sa)3|NY&vWd%S0u>b>P!2!lUe;6EF*#G_c zFVXVt@6Q{uX@40W{p0iY2Aa+A^Cu7i8KT+YH}2j52q4BskM2rJ$^k9;2Xxc_|Np=M z&VaLlA*IO5FlECMfB<5VUNC{tBZO(|zW*;@GJN;|bTJ71`0*d;`d`2P!x=ymOA`2> z+y@9C##^^8%gd{MW@Y91_2d742B2~OQNf=-zkmD?Vqkdk_wPTUNeuu2#KPTG{_;O4 v7C%8E5*DLB7#Kb?Fnj}}-(W6879hX?8lYRg`Y`<~00000NkvXXu0mjfD6Jtx literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/uy.png b/gui/slick/images/flags/uy.png new file mode 100644 index 0000000000000000000000000000000000000000..31d948a067fe02d067a8c2e69f28cca446bc7c57 GIT binary patch literal 532 zcmV+v0_**WP)_vmzq~N}&z08z z0*LYY{pZr+B0$d}2MCnI@DC;m3N;oM#uMkR0R#{ugY)L9Y<*xj0QCR^`!^)W!R$Za z5CobHbl5+T3;%B|S`QFFjQ1Zt|MTw;G#Vi+hCg5i(ELAtfD|ak8UBG;ObiSF0R{lf Wla#5zB1?M!0000JMe1P}`Y1HZufM;3|NZsr4^XwNEI-g5fB<4iWtjhPj`qjL zFGT_P{{Q>;-(R370Ro7T!5$Ws$Po%5A+Zb!3j_cNFaSC{Z(fWD@s$7o002ovPDHLk FV1jsy^u+)G literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/va.png b/gui/slick/images/flags/va.png new file mode 100644 index 0000000000000000000000000000000000000000..b31eaf225d6fd770e0557c2baf8747c91ce88983 GIT binary patch literal 553 zcmV+^0@nSBP)|05Jg_ z#sD@3Z1&&(|Ni{{_Zx)%v%Gr!NnLzkb;C z@#QWhJ{xI9$+*)bNX$S?E90e{K^EMkYok78VXhR-hjM0*K`g z$j^Tmm_>oEVgxdn{xJOg$-v0L$jHRN$OsH@P9Y&+^ne@=1^@xXcy~X;zaPM$WdOPj ri2i^{AeYDB@IM9-1r;P))4B5XW#s0WPsWLbObPT z00IbN14#96puqp%TKvBf)PA*{`~CO-uM~~n%6z|m{re4Z55!3T0R+GV5`UO(`=kK4te?c|?1P~}#f$jmC10=!0@{8gBFK@Zu z-~WJALqveC|MTzfA7GIDVE_mqkOrW8BqZ2?K4D^#WMJTBVE7%b47BbKBg1c?EHl#| zW&XdQF#ikE01!Zo3=CVrargu%_x5NZPzVyc@Ms2-@*Gr#1lu5DU{kh6%sopXB}uDxAo`@Bt_a*7F+) z{Q{%kjEu5C8vp``Wse8Lf5q7h438n|z~nEOsZga5l7ZnjPy;{!05Jg0{{a91!FF~d z;^O)I`~dv>{`>s@o}L{E2?GEB|Mm6!N=n`P`~Ld+{`>p?A0G$7!M*~B3FM_eAU;q6 zNCH*w+4I@c^Ny?Q?QPpWZQiU1R1HBuWkA0H1P}`l|NYDG=gP=Ihyj(0CItil0R{kn^jdV2 S*Eqib00003_-&c2+@O*Bba;fM%rBo$$qwJnuekcf#0k*RG7MM`2+5Y7dK4k?R% z*@ue~6f;u_A~T0evP6qS=VxXnGS_mt>CSmS&gmG`kLSL)e_Vf_=c&!fKB7`4C;*C(7s2O*P zOs1$U0urzb3<=a`d9ABG4Q$eK<6~5Cg~V%B8`UqrfRSN8f&?QTVICs^VT=&p*?Eut zt4Ur&-BL_ON(Z|Xfgo93lf|gRkT$Mz-7^OQoD^XMF@}g>R?uoU0094KbXv)l?aF0E zh@GXQVr04m@05R(Rjxq*p|CCIRfv;QJmH1kf!hsqX*sha?_l;f%e5i5I~4YG#H4;6sPG2&U~bv( zNr`eMXGIX9?wP^zPQP(6+&$05Jg0{{;N}{t6CR|M}we`P%>f+X)5&j)Fc04NUj< zI`HZ2Woe@k6UF22`V|Qe2MTi(6bb?WF#yj00*Hv<{QLmnFd+P z9@fS%;@9^E|H1b5`Vk8^2@Yw;#}(}C_yUN9iGkt%y>Cxm>T2lO13mifZBc!n`jhHL z!MK>$6Z_d%|GfHMapIVnqod%T-`{|q1_&S~IR%b4Z+;63vi@iI?>jBz=eJjkjQ{>J z{QUQa@gMhBW_GSe5B=V~`@+h~@c%z3lmG&V@$K8U{QUg?|NjRX|KX9x@@rf{MxIY^ z?fG>3gQ&3ruaE-Yw>fW_PfAH~0~Or8dmA8tSRg?T(ZDLQOiOw%6RWM9%$i>kkAMHu z-oH0qLBYb*loP0ck&zJ?LI42-(g0BnBsn<*tTlsx%zxbLe*S!R<%*E3>|Z7(9Y#iG zpdch>0Ro8e`Sa&!arp;m4%k`<1H=Xjf<=G;Aix0Vb{`Xo7A9K&0000@|4`Xj5kLT%B_22*h{r-RE_y1qN|Ns8=|JN^|IHRmA&<212VgZ}|A4N4# z+WpUe-rxU^{Q|504bi~x`!`SnKmf4-F(Xhl(8fQ1fG+vp^85d{-~aW0|NsB{f9tRR zg1`PJA~XO^2M8drlm7gLxRT-bpa1p0|1bLmQVm3Azy5pw{{IQ;B%q-{(*XjA3FM@| zf53hMJK)W)|CK-uK=ku}!>|93eu7kk5yVLV0R(o^Z;+)RSAk6exg_KF|98LtFaPy_ z#c#OrKtum9FaQJ)NCPuC$bbfbRI>n`@$3IHusZAC|2cmD|MKhqAD{+Mr~sV<5I`Ue zOuzpyNJ@f@0s0=KlTj9AB*>SXe;D}wK*A7+fQkVEi190GMB<5K2mlB$03I1qT8uIj Q5C8xG07*qoM6N<$f}XY6qW}N^ literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/vu.png b/gui/slick/images/flags/vu.png new file mode 100644 index 0000000000000000000000000000000000000000..b3397bc63d718b344e604266259134e653925c9d GIT binary patch literal 604 zcmV-i0;BzjP)7(YpZ_rO%ce~L0mQ<@*ghnz= zZvXM=_iyVze?clB=ogUu_5ar|Ae&KE_8$WSKmaiTHT?Vg|MaE5OE>+VAUAUr;?j4FCZIvLVX%uQ>mocOU*NTK^}%njy93_oP3+fBpUa=kKpye|`ZO zzyE?r`Mc+5Xcyo_v6>E-#|Nl{r(LkAS94bRQz)6 z1Oq?-fi&zp{`>yDUnV+0)eJF{zWfaN_0t9DjNiZhfxY|}ME?2z=O_CghC>Vh0R+`!~0W%8&aG{{H+4 zRPp!M??1nPG5q=k)Wabw3seITKp+kO{xLwc{r>&$?_UrCGJgGL;^k4Qujka#`tk7L zjnovNAkb9+0R(gvNCCu>f4~1QF);xde}DY=^Xr#I=|`5hhp|NZyp>({@(egUPqbabS$v+tIbNu;L>xVSv%=>ggR z5I`*V_U`A@(fj`3!N1?XfHr^}17rYw{OcFcC69Z0BvMmfELgy8V88%&5l9HrLN(5b9xs8l&q^Gm-@&XkD1Q1BW|346ee?wJ+H2_`p`^l3V z+1Wtu|3AMO{`_T8Q2{Cj2q2bUARGR$NlJo(=nv2bFrDDw2U!bb{QV0-KNuJQ0*G-b s1H(6@xcrC2{sj~H2V-zBFaQJ?0G2^Lae{Q+uK)l507*qoM6N<$f;6K8u>b%7 literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/ws.png b/gui/slick/images/flags/ws.png new file mode 100644 index 0000000000000000000000000000000000000000..c16950802ea95b40a4e024be6cce870b1991f40e GIT binary patch literal 476 zcmV<20VDp2P)>E69JA<-5ee*C|6>(%ey48MQ<`3*E1sOaY}WDP*a00a=wNxxYB{9yb2 zOU?HFZD2h;3gJl2w`NO~f5I`Ue%-|qnfGfh(_6MlpFT>xzKtBKk z5J&^l?>`KZl3-*0GW-GQWCR<@03m_s?_UT4Dh3E3#;>Rm$$$~H$WlN65MTgr(_Ikn S3@&c~00004%P)h=Z!r1m*T3JtfNUmdS)dI70mLHE z+xy?%p5eHez0mS(A>sL-rPOy{yGk_s3 zz{tq>=+Ps90Al&~?;k`pNCN|I|RMxbJV00L=%3E(v!XamT}{{RArWx|9$7Z{pWi2U{IKN}lRCnF;x&=P&!(V3Rv&T;|GP6K500a;d#1A^U zy8js%fB*jT=jRXRU*A|5K#2L*r(ZvQ{P_O!=da%umKG4l0|XG%NkAKznV4BvSbj4y zawHV~fBoj~uiyXJSQwZYIoR0QIXM3O{tc7`Dgy{0# literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/za.png b/gui/slick/images/flags/za.png new file mode 100644 index 0000000000000000000000000000000000000000..57c58e2119f402072640ca758657798b621f3fb1 GIT binary patch literal 642 zcmV-|0)737P)Cfuwe;F7c=r;qyPX>nX3=Cfx7(O#Fd}LsF&%p4OfdL?Z7#j~W z{9>KL@b8bfkaUokt?1q(EJu$q{Qdp^&mV?AfBydlG2rBvO`8A$h{fmzgIW0J+B07s zK74uV#pQB`MAdI!SdN|k|KJ`--LK#OfB*Xb>lcvCC@cGqfdL=@05Jg0{{a910Lj6A zAt&mC*9zzO1pWQ@b1`Tn1`iV6=KuBe|Nj2}{{8>`{{Q~|0SOB6tE&PCq@k>=Oh@B| zgDu0v2b@p;u)h2C^Y4EK4rY$O|Ni{`3qc?^$?%A8m^2X}fLMSU{`~p7aqHLD@0rW| zzIWc|c>Ry-$DePXKfn0(_xG>AzksTL{re5n#{Tyw!wUw000L?F`}dEV6O*(3zu6Di z9{gne@#pKG|NpqSh1vf81DXBz&mW+Me}8zmL>PD&00Ic4!QY)xLzl7RCikV!EWdtz zoorLj&BXoYF88-DfB*gk`{Eza7yo#;S!C4G00M|*elvr*8B6X-zBgb0FtGkEHc8mM zoOScs_b*;Q0~!ksq<=swfJjA!^Ww!_00G4E&x@hvA~zQkvxU59n3VsHd7Nj?ec|R~ zkmuqAx#JHo0{#K*`TG}00$uYDAb=PdGJ(Ek5Vx?d6PS=4{E7kSFNS|$^b5xL14ayB ck_{lh0N_F{UmK66LjV8(07*qoM6N<$f>aVd=Kufz literal 0 HcmV?d00001 diff --git a/gui/slick/images/flags/zh.png b/gui/slick/images/flags/zh.png new file mode 100644 index 0000000000000000000000000000000000000000..89144146219e6fbec7eaa89e1bf4b073d299569e GIT binary patch literal 472 zcmV;}0Vn>6P)$bmtfBa_T{rmsVufH!rO2O)W0!b+P{TrwO zAb?mv&i(NBbu;G`sX*)cv$d*%>MiL-(QdhpkjakVmyu%k;sfcNRj;yhJaxT5MTg0u5&QfH8#Bf O0000Lz(k0+Rp#|Nr~{@4x^5fB>iy$Oe)U zA3pkg`SAPSuU~)vaR2(F*|!oPfLI`Azxw(Lr25~#KmY#x{rl(7|GyyW-|wp|{||Bf z=)Cuc_0O*fYWnY`7ytr@1!(pEfB(To0uBE22c#NA{{8#+_rKq)zyAFG`zKdY6euFW z2yzlY0I`6SGJqWbGV%`;{r&ytA5hcp-u`P`AAdOg`t|1D?}h2=^+y>10tjRS&?yMj zfBygt2HEouXg1LCzyJLD1w#LR1MLR}1V8|>0KE@nffPa916Bvu_V4#Epof105yNkw zzknJ50tl=DS->P)FK#X6%e&u3i|I74$@9uP0*YE!se={)r{r~?r68Z&3 zzZn^2KYiK`5I`&p3=IF7JHD>uaSofgtUAf*-w!6nU;qF7`S<(x|35&+uYZ4j|Njjl zS;T)|pU40ZKrEjoRWbQ1@P?oGFzcPCjLiCzcU8ZC{rmejNW<@6e}U*1kPT$~=Kk_~ z83O}A05QHjx|ikdd7h}_|NsB_wl9j+&d<}^`}fbEzkmP!1q4tEL@O#P9zA*#Ab?m{ zv`qe9Isj6Ah@Z*IdsTw}WYHgB8-D!*lmGvK*?)d>i2vThzyJ_HEdLn(@uk-N0|t-& z`$Yv&?#y3UfPVP*`ya#a|BS!>G5-DsFR)1c1&eHCHYDzO7ytqc0P0;>l>h9)WB>pF M07*qoM6N<$g71PE`~Uy| literal 0 HcmV?d00001 diff --git a/gui/slick/images/glyphicons-config.png b/gui/slick/images/glyphicons-config.png new file mode 100644 index 0000000000000000000000000000000000000000..53c24e486e7448d72d56173ce6ed5391f8077a73 GIT binary patch literal 2920 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/glyphicons-halflings-white.png b/gui/slick/images/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/gui/slick/images/glyphicons-halflings.png b/gui/slick/images/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..79bc568c21395d5a5ceab62fadb04457094b2ac7 GIT binary patch literal 13826 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/ico/apple-touch-icon-114x114-precomposed.png b/gui/slick/images/ico/apple-touch-icon-114x114-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..a412bd550e30714b4348341fc08881b721e5dd53 GIT binary patch literal 22156 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 TVDM^s00000NkvXXu0mjfbj(c! literal 0 HcmV?d00001 diff --git a/gui/slick/images/ico/apple-touch-icon-144x144-precomposed.png b/gui/slick/images/ico/apple-touch-icon-144x144-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee6393f5bd14f843190043c4ed088d11fb4c86b GIT binary patch literal 30799 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 e#dH6E0R{jrAbChJmoq8=0000L2nvKa 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

xuBg#=_KoiM!fkj*XM zhcT7uy1qgB-Glc+uo<|@8MyVT!~$CY*tc)qPD_odn5wkY@_tu@FU0rs;LmWL2wpCN zRz?ism|zUx1izr&BWob2GPy!ho8&;4ISv}JFmXc_7Q#AAi}!X({>G6$o-8oqfjxWa z$-{3Ws?X5Bd+3Wah~Rqrsx=tjES;abNWXvIBQ(%emM!ZhG_ZeogDNk>D$I_&mH@UU zjl8YI3}bUv<%TtrB-ImS>P@iRn#P;zay_faD)h<@zneE~h8gk6m&o@g^+p(zdcc+L z+`5Yj&?d$lm0!WRcvmrR`(*XSxdKGYF@rB_0?r@SYZNpZv>Dn{%w}}5jz6!;cLMgj zH3HX`E$6(YKsvH81}jHJ5Wd-^3Y~}P|EJ%4h;AC+f?#uj_KXhG#LOky0h+PDuOyvh zaobb*a1g^Xgv8ygYP*{+uHMx9{7spGIcI{mysHd4(7OaJRn}1(g#@fhLmS8`^-5qD zz~t8T4p7$c$g6!UC7kYjQ9$uHT>o>hb&GL}dy9DIbFmD}aCD&+`ox=WWrwn-f<^9j zXE1NoDWfxeylY6dAtXZK=5{eFU&a)2?~dLjX*#^AuSGAMI7;_}kL?H7Y9l;a4W6?K zCL19@-2q$#$)on{grX912Z>OE^6sJaV9;gJ8ZL23)2cuYIG5Lc&ulckr&$z|&X6i( zl$sjEfEn-+kV_logOLi{|7iLS{w($N~=bAS3{$`7m~8(Kq=+F8j9S%kT9 z!mt4W8q(I|p90}|()!{(yWk|vdS6f1L#9^0EMk!oG{@ix${zWMk~E$-H$gtfEQU%; zG6OGz(Cr!?re1ivJ`O>cbaAgyz+sBcul`|(>^uBiwX4PJrPTSW4 z-mA(h162;HOVq~Gz{-gSgK%Y19ryo<+1ttH{y-N2^oD*z{H$P=IzCW)@cH+0((8rPbr) zx&6;A%+Gy`tFTEzIhdKR{)-^nf4Xb+W-h5J{NVhkt?uIF&tC*@nU!u>n{S{*%5(8* z3BO@i%%;WdBCBl2=CQ{QAsu**<)m0*xJboNqGy_kF(!8yOmZ83N^fo)QyQk%F^ z_5V3|kta?o$r;D7F*#R@AFR}xCpgPS$$bJaxe$U0II?9jXs8f`tB~?HuVi{t5#7QD z+~VJf2F9xGJ!aBKx(ATmzo{CzV||YxNq?Bhwj@&o6nAXQ70@I=(vWZ~~jBL#kWZ|J%lS$aEnKs6uyouMUSWfJ#O88IkPs2%&|{h{b!glY0Q^l@%Cj%Xe-a9La2JF9t(t zad6xaEsdpjNqHr?o(Kq{j4tDvIVCg(bIv$o3_*2TfwSHdpWGcHh}ypA2h;W1(tAzc qc&=8hKNBKcD3r_BOb7oz0R{lRZ>6+p;nL2nvKa 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/imdb.png b/gui/slick/images/imdb.png new file mode 100644 index 0000000000000000000000000000000000000000..961177009aabef915420ef26fde96679d31d7c68 GIT binary patch literal 9158 zcmeHMX;c(f7XD~xXqu+`HDEX0P)&Cgn>+4`8Wj~3P}G1Lm#AahV%&{OSOi&QHKHh} zxNF2{P~#r=T@$03ER)P6Gnswn%#w5FocZtE_X>=Y)3nx^$%#Msig(|;OI24ry5GCs zEx-=}U<}k7FkcU(0*H)M^?QLpGuhm3Rc|r?t4u&rQj2Z|TpfT!I)^R+3KQ3%u1)Ad z%+Q$`^f3wyU3$TsIT_}0Q(>L@I;=An!TQ=VSQo5>b?loA=i4XrF=h8Tj#L!1O~n9FdWccDv1Hiy)XxPA9k6TP&uiDAk~b*dl^y zl?n4VAQT9&(n`a110A8TAP80%Ne`qW6pkmlKm1{alk_0r*ZJ#&Zh$@@gs)n(ewoE} z91gDQTwF(h15Ss>?T(3Yxg<%7j^_6gE(}jB;o%<7(;?wM#Q$?9A3s*tSz4Mw%P&1W zEyh0Jrw@cKl-Al%3-nQL=%ab_Krc~q$uM;6A=Y1G-ytye8wz9pVK5G$mYf3Pz~L|s z8UgdDi7=;65^J<&%oJF%rou9Q8Y~m0!;(D%)`@drojecLDGOkoM(g*hZ>VedtR=9{ zUW$l$YZ0-0J?twgz?L|22F`l&Z950K?gK~-C&3ynz_s%<c6$y!hydtsVP_O9NX}DK(>O9gb zI(JD+Lzt76vm`h}X#QgDw4^7cb?KU(j_@dm!$e(x9WtWQyLQXSKtwde5sJRh+et)c zbnBj(i4GDi??y;w^hcnbgp}F6=a@0Dxe%lag3E$|2(puKjp^BY>{!@i;1}bE7zMa=s1`K!grD-jSbo9xM5Yq|o(A z(qF5e4^_XS&{%21uUNxc{W^X}h@|Ti{fVS=c&CKfzW3|A_-(e>Sc;A1k42R6>GMgG zV{Nv$xL_cT`z7A!WBloU$>s@`;^Ln2>*7>DNxe9SXIM5{e0;1V#mkZ;#}i5911VOu z#S?4}F58CVnf?Tya5#Lr6CBaL{n0MpewQoJCtPly?nL)9{chi&+5Sn9NT1HR_DpKe zlc(rRoNt@K^A)e0J244{uDxMOraWd?2IVm?!np^wIoIa3QqH%hErfMCac<7LXHe~Q=3+!FDp0xh^6e_$ezOs5)h?BH zuW8ATIRDPw2bQ;Ao?B@=_heQ|={gJq~&Ed9bbL zAl07~+@95+gR9|v$XkiGH=KuS`zf&PRO78Dj^E1ncedng#QWtPSKw}>*j>c?cb^5@ zP5Lfg51?9ss0UnyYwvkAuiHy`-M$Nu_uLRUo_inp4vqI$yV&qTh+ z>k9IP&!JrS1(b_aU%2#3C|7<38=qB`}R->Nl-`+tD)A=Moo{0Yj( zRJZ0i<|kBx_>}6`ybkfjKSa){eDxiDBir$!%s{M0#EsE}xOmPspC9oFUTJ2V#)QO4 znvmG>6;0^aX}TtK>hhWU#tn;do0t09=%p*La*L$YC`WmYc!!x z-?yF*Lthnfef#C+<_@DDV?ZwDb>KoBwERAeKNG5%az_(I=Jp$qmzOu3$LCS;9eI>Y z4i|%#crtNSpeKb6NY2mC=kFy0@@*vZDLz#Ucmz-0@CH{c77{iJO&(ZKP%w%VeSw{1 z0X2K;00sPnQCt-^JB1D$R9IM;P8NM3udWwTW32-e()&-ObCtgpMI?m|8eCLVlu3%d z$U#z!_@Iayig`zU{2gTG-%;U4T>J)-PUm8+UQZj)o zfhAESc@v_94@&5rEG7uM5EMEjrL?p(hs=Sc(Ioks5fVTtHI(xB9Bz*mf>H>Mf--Wyk%@^3EC|BH0+1e%UKWt1fB*h5kOM$^S^oc{zyP3LmcRf0 zfP{jCEL{ualWV?*43`1yGXb-X+3n9&#s#-##qN0)Zj`j>$IhnV) wxw)p0WWe>?*Fe-KAl?bY#X$TESsoz30QWzgi>+(DasU7T07*qoM6N<$f>)-k(EtDd literal 0 HcmV?d00001 diff --git a/gui/slick/images/legend16.png b/gui/slick/images/legend16.png new file mode 100644 index 0000000000000000000000000000000000000000..fe9567cbbba61f87bbfa3d8436f8df4580d2e340 GIT binary patch literal 443 zcmV;s0Yv_ZP)}^c!{bq8jaS6jYebl z3jj%yaCLpkU%!t8AdX|QYP|u#)8Ghz*>u9e&BJ~GRo$vPn@*TVO8~mvE>RRwtyZbm z>x{=^I-L$d5a7D*W`k9O;Q3{XJ{%6We5=(0pjNB>9}(c>?lJWSl4kLpfYl3WrK;rG l?e;k^NE^1+QYw}1e*rXDWHx}-W8(k-002ovPDHLkV1n#Gx_f4d3(AzhE&W+PB_5#&B@U5gM8P+ z2F`A!z#OZMnm*1++zWTJr};85GavR>S)Ev+uRKX9#Vj!FvirkeHa51lw>%u%58gQO f!;+b~nVq5WfmpQF>2C@^V;MYM{an^LB{Ts5C=)0` literal 0 HcmV?d00001 diff --git a/gui/slick/images/loading.gif b/gui/slick/images/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2a116c7280b4d9786ddb960fff4439a542866ec GIT binary patch literal 9427 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 OhM#~I&wK(i`}3bHw&zm- literal 0 HcmV?d00001 diff --git a/gui/slick/images/loading16.gif b/gui/slick/images/loading16.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/gui/slick/images/loading16_333333.gif b/gui/slick/images/loading16_333333.gif new file mode 100644 index 0000000000000000000000000000000000000000..25b1f60458debdb6c505a076a895cff58ab32e91 GIT binary patch literal 1849 zcmb8wdr(tX9tZI2z31lM+(&YVNJFGf2tkvOm_Q&zvGgW@U|?CG3N4Q%5yKh^HBb=R zB9aF}kf%~DF1~iz7C~FU*KW5UMn>&++!fc^o$hXDq(eK}S_({Rj4GjfWE?>SpKR;hz zUtd{SxwyFKa=D&7d2;8@ozc-zQcDr!HbXj@`kzPKgf1?+~@OS_?G{pjUc??SO5Ox=6O#(dqQ5pSe5>4BqLs|9)Ee_7UsVCh; zerSSSlby56GlDSfSftgtTQ2TSv&C{!yz9mTXVw{#JPya3rnaIkf5QvDaOhdp6w`*Y z0Qfgv`NVtRrSQt0Fpz_m%P^dBQhKwe$ORyvJIb1KcxPLKA2S|LE=dkaX$n$4 zW&#wDPG-o+-pNj{XC|ReJ@(A0+PvBDcC-}<7gt^ITbGQGM|>&rbC5LdjK~tHrK-74 zbz;ri>{89vBJtwFrm38~;S7BoN7cE$-41ziPk|NTHCB2M1F z=sZW>e8)PMr#NCDJ@coIOO|$MznAh!TBQbFCBPJM+A>-7FWa;SRHm2v_aE-0vj@65 z%S!zn|^T&h=EBo5{xBX2CP3sBnE(#+H}f@%J4)MWvYd!qHZ+?3PI?LUWY_hvl2 z4W}aBU9(ub21@P^e>Gu0!F;h}Pj*6iQSmpQbQSt8#8>^g2-vy$hAgeN(fWLwud*fP zknf0L;BZVxKuZwtM|A+;mXV%i$*hVxkis|%&c~wO@faO%_?Y#ybVjn_TE(DZI0756 za9q^7E6-fLC<>Qox+XS#rj$BVHGmsZivszw4~6 z;)>he@jZS&Ov-q_j^)k)h&P@sR!X7QS&b>E-gejBb3G(k`(1--bp$~atgqlfK4B$< zN~MA!Fyhty<(59sky>6VAT|gxYm&(>d1%ebK(A;}mHMDmF{_$Zd~Z%F5ygvFO-g@X zJo&e6w%yUZ%%h|BCh_Z&4=uV5`xV2CpDS$MF@}TX#P=_y*G#s>$_2N6^QBYFQ2bH? z&qS~$KA+u(aB-j+Fbparo{OW1_`@20hAj!LR))5$B%>T!7&)=QG?abj(0lj(*{%NV zr5^;~urH%jQSBKzvpywB+I>(1-lwzE2o=-`^Zi<&6G+_R@=!~>w` zn#Y-y7!L75K8$4@7=a0el(VEj*33t{P*TtzLk*&Qp#gUkH&!&Ne!5R98g=%7>hYyn z^x%l@ByBsE@{fbJ$5*{%bnUbzK6qt#9qk`6??l`?|I`#UjjJcF-VKYK?msp0QN;AE z)eCb9zKFOvHU6v=&?GOGO2r74#A${~Pys@ScA`9?Lq+qoIKCMU#>p{kZ)i!4U5$eQ!y0sQYh9~kh?`qV{LFt{B|KMfss literal 0 HcmV?d00001 diff --git a/gui/slick/images/loading16_dddddd.gif b/gui/slick/images/loading16_dddddd.gif new file mode 100644 index 0000000000000000000000000000000000000000..190582b822618e226f1beed6cee1135fcfaf5984 GIT binary patch literal 1849 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 BtRCwBA`2YVu12Gr~CIaz)3~?+9 zLBvFC;@Avkgi4|SMn;hEe@0w<6oALcAmRj+_Qt6Wj{ygunn8F8UIT#OCX!-e@lALb zfcyv)cm~8cUu1F=64|A5K~fWrmJzmpjVgCkJ2g|Jv*LXvz% zgaP-_1&|H+MuY*M@fpC#Kn6fIfSU;Qd{DX%n*riP7@z{g|DXX0aW+ykz6atR(7^l( z#DAe`*rCy=0K_gp%nZa4K)f6|8YxRilmLJL0|3+P1e|&S>Ei$Z002ovPDHLkV1hVc BaYO(B literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/addshow16_over.png b/gui/slick/images/menu/addshow16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..b67aa7c1242b0de29d85a1037764069b9dcb18f1 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XZhN{ohE&{2`t|?6J+mRhio8elCPx$Wb}{}}Oi&VI{+BFx z*o0yBqyH9jIEB&1H)_v|>1JPRmO*>`~P;q3pO>j;D<`#p6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/backlog16.png b/gui/slick/images/menu/backlog16.png new file mode 100644 index 0000000000000000000000000000000000000000..8e91cbdf18f8c46da460a8521af8231fa9cb8b3c GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t36#DLn>}1rz{XKxO9lYRbik1 zI>vbpbNG+QJ&|Czw1=<5pJAi&O11+g#S9<$HGD%V8d-Q7e@O88zQ{5>#IACJ@ffEATZ*HoeiGp~!W?;ZOfjhKL`38YG+K3>2In zHCEX1F<;=_d}z85r{o5Pj>(?Br=B<7U|1&E@qc0#gNA_o0h7h-N`?x89pZ;fCMPoh Z-5i~x=(4)kI0EQw22WQ%mvv4FO#pMOOlSZA literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/backlog16_over.png b/gui/slick/images/menu/backlog16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..a07fd0206eea32cf79652b4ac3b8130bfcb82f26 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2R&UJLn>}1rz{XK2)f(w|Nnn& zBO{}G>ZchNr1>jMRO75r%QIW8 zgn2_NzsCelkMpdLSd@5fFsAsi7;Rr%&3JPHw*zb24Iai-xA~XoG+1z?aTF;W;t6D6 zRhsZ$zFTs`ho6kbEVfdPZAX|@pFK8UxND$2M{^}1{rUgjo>{e_v(d@m1Dk=v;Rg1O>kJ?BCkSkm zSR0`RWH%Bvuv|=7bcIJ<~3fCHT%VjZi%y4Mw-|n!Nn@M;AZ$sv@MlB^4 zwFT{r94{Q^w(F;EblA%o^jZ35gFwcC2|^RHFC1=&_#-WqZKJTaXK`gCqrw3O%iHCN UX-!wp0A0i2>FVdQ&MBb@01A3eZ2$lO literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/backlog_view16_over.png b/gui/slick/images/menu/backlog_view16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..2496a61662ad4258073fb8900e482d6f25f53f68 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XIy_w*Ln>}1{rUgjo>{e_v(d?*g69F_BU6Vz(jEUNH#Djk z2sBolt-o|2UEv#}JHwTR`vIL28uH?7jnWQl7=@ju&2Vrq=E!GElGCVW+QevZ)+WHU zg=ZGS)+vmU0qn2#{I4+C8bKDG! aYz&(7CrAFbyS57GCI(MeKbLh*2~7Y1`%hp1 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/bittorrent.png b/gui/slick/images/menu/bittorrent.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5ec7bc2713f8282361c56d76b374ed6d4b3ae6 GIT binary patch literal 11215 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/bittorrent_over.png b/gui/slick/images/menu/bittorrent_over.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5b7eb3ad112d3684465f58913962d70d59e118 GIT binary patch literal 18112 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 aO#z0#Rbb=XB!8IzU}x=U_3KLSAN~!^U(UY( literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/config16.png b/gui/slick/images/menu/config16.png new file mode 100644 index 0000000000000000000000000000000000000000..199b2b86b2274023b535796d49f6a1987381f5d7 GIT binary patch literal 403 zcmV;E0c`$>P)S3$c+bY$!<) zb`)0rWqeP5uXwJBTc765z2}~H&VAPl{XRTY;0>qgf`b23dalF~-jR>H!1|8_Va%Wq z!|2ej#q?qubJ)S8D?tfPkg2zZzpSOyimg2<_Qush65R@(#f3Ikp;Pe*OuH(`z=Q%u z5J#=nHgJXk^kCjU3qL`-`p?6?-Y|+L%`Kx(F}CLxgIMwtBy=#I%3eV$qR7&Qaf~5H zdxkLOCn!R*`YcBm7O<}kW$4%3t}5EZW$+N&tSoI@L<^p=s!v*~vsrf?qCIb+UjHAl zhY0GBt$CY^=~I78kc$Jo#mXyI={62=jYgcK1`n=#P@prgTi2jc?Q>O!KCg9539ei% x1c%-KHN2>;S65KF1QE4h6&(9L|0ltp#s|2&PZ3(yW-|Z)002ovPDHLkV1n#rwj2Ne literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/config16_over.png b/gui/slick/images/menu/config16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..c7d1d32aa94dba444d8afe88d957bc1db656c0f7 GIT binary patch literal 432 zcmV;h0Z;ykP)a}=_dDmi*D1<#GMS8nX@XzJac=U}Io>8tMt(CU1!)Ko zf6dP42#^e5)}b2aVOZ8`CLjr$aDqtGPaurBh7#Qx$R5sCQSKAMh&=nPu!R{@@dn(h zxdld4KTGqP-vq^&6)S)R=z(^nkKh)jVH~#Iw{X-vr2Q-54eW+R=v8bFCRJlSFEE2h z%oVU(qe|M?`!E2tP^yMySb}m*HHW~eD^P>!)1Hkm3OjJFh6b2Y>{Jsa5P0xD;vgob z#$D)#FF4RAt+%(KG4A(><{v|+LLYDjLFj-o#Vr;=B<&Tbz+C8-1k`DCJD2bT-EaqO z2)z6K2UYe4B$N1E_;LLQt;ABqA|`!ndtO(~n=>e*!_RU=v)qI~Oca a==lS3V~7!F#vOP70000}1{rUgjo>{el^;kkmipoiq1xI@{*b*3fetb#Z z(J;X&hE3S0Vd4t|iPD1|WsJhitqrX%&y%etUV6hLkibyTAZQ*sUGpK(I0jEwKbLh* G2~7ane>CU- literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/config_index16_over.png b/gui/slick/images/menu/config_index16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..adbbad1fd4ce17f5f44637a3aa997b98df7a9b30 GIT binary patch literal 158 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/failed_download_over.png b/gui/slick/images/menu/failed_download_over.png new file mode 100644 index 0000000000000000000000000000000000000000..71a722db9317cf9d4731c8cd55dc646bb5b4c5f9 GIT binary patch literal 16132 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/managesearches16.png b/gui/slick/images/menu/managesearches16.png new file mode 100644 index 0000000000000000000000000000000000000000..99578e5a5555e41a243777ca1cd54275ff31ed80 GIT binary patch literal 347 zcmV-h0i^zkP)_WpgbsQLse5Wb30qjkP}ArZmU0tVJXNei%Ye2=SxK6^_C=0b*BP{sID|;})fgNh1-BQZk!#41Pb;002ovPDHLkV1gKunri?6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/poster16.png b/gui/slick/images/menu/poster16.png new file mode 100644 index 0000000000000000000000000000000000000000..5bf1249940c95488a7e6302005331300a81ac53a GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X3OrpLLn>}1{rUgjp4pWlg@K3ppzj0$#u{N){#lF$uH_qV zlya-}uW9FOKU^oI*><_%e#DWwiAe|Km5vrjeVFcHIEU?zauCmQ#vYfhhb9f35nFfg zBpg&a=GDcxW{T7SwmA-aMe)44$rjF6*2UngED- BMt1-J literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/poster16_over.png b/gui/slick/images/menu/poster16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..853779342678a241dd3aea36e66509006c399381 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xay?xfLn>}Zcn9Y?CcImz6H$PsR&0%}j9DTFjwxK;YrTM_cjNR-OC)paia|BMLG&fA( zWooqTZrFHn5qrnp11@Ib2LC_JT=L!eJ`)c^-}D_5Mc!Pf0b0!9>FVdQ&MBb@0Im{G AN&o-= literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/postprocess16.png b/gui/slick/images/menu/postprocess16.png new file mode 100644 index 0000000000000000000000000000000000000000..93521d93351b456959957089bfe0ab09c18e4ccc GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ii4<#Ar-fhQx*sqOj_~Jepg)( z?}3+1|1(TB9elCv&<~#zdJbj@k^=6Nvl-5O`~O5@gJ1{q1QET)T`hHb4t&iTHjMrk z7@Qc^Gw$y&U|_o;(c$CqU-H9}2q(5b>Py7pyPU&5%TJG6wW~pgfx+gKs$iY0*(#vD N44$rjF6*2UngElNIjaBw literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/postprocess16_over.png b/gui/slick/images/menu/postprocess16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0e3cc7b68ce6e7643224d78a51edaf2e430b08 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucLCF%=h?3y^w370~qEv=}#LT=BJwMkFg)(D3 zQ#}*A-ZN!DMdh9@jv*HQ$q5V8fAq7hNH?E!@P9*&fE$~Ep~PQt4bDUVAL=<6Cvd8= zHTbGtZ{R)A$YjFuOlZ;`hl$({dh9pZHc8$MOR+oXaAdipO8fPO`3|f{l3Yw4c?W8I z^v$~D+~?O+b@8%gPrqtx!%_~Zj&&0?c%Nu6G58&0Fg330^aDD9!PC{xWt~$(695PX BQ>g#| literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/restart16.png b/gui/slick/images/menu/restart16.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a563c31fa72d18afdf466674d07182b488829a GIT binary patch literal 360 zcmV-u0hj)XP)obO|w2abos!Nf1T;DO^l&-cD}5%b52{8vB^rjbAc54b|DRX``!kyA*+ zS$jbqhj{k|M6rt%lyHnYg^XhvgV;v~pW%R%((R@NltbP1;RKUd!l@h3fqTR-p$>dC zfLk3WiSHmFp@1W-wivuU!W!cCM?t_Sida;ezm?s5fGOOx^A7U5r7_#J8}Q|PUusa# zq0L>mMn8t}<_jokKvmD*w~)mSHr-nY0$z0!_KNm27h5CP(2Q&cb4IVy4LDcoHfHdF ziq?8f^Qte9##6A#4d_PQG+*Q_<}swTN1UOcVB-sDt9}51#y}D5Ga+LD0000q_Mo1Sv4!(2F_uf7CYPvdH=3fN9??(tzkd&WLhD&42OIrbr zy@VCmgorlV^$0mQK=l4iKyweF09o+h2yRs}4jCAPJy=Kb5fr4wu1)h4R0Cf(Kqx{A z7Reuf2}pJmN)Uz#lHL!qi4kseJ7d%}tRSg^Lmn=*n>w|!g=L7#i>zRTP=N&=7Jm^) z^FB;cd;RBofFP%*G>V|)4)N2eJJ&%y1e!yHD~Q4{`L|XAPY3ke;_cgn4ak$<3Lc{f zUiBp8h<0@@vJ$W+Gtw`ZwYSn0oD#&k1Jh84Cr$T*9Q7Hj(tL0GTtOd+n%>A6n1dlr k-@yr7P*Zoe)$zZv2@GL;5%4$EOaK4?07*qoM6N<$f=aiZZU6uP literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/shutdown16.png b/gui/slick/images/menu/shutdown16.png new file mode 100644 index 0000000000000000000000000000000000000000..b20ab6a2932e411684107387685c30398e4ab65a GIT binary patch literal 371 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 M07*qoM6N<$g0cfM0RR91 literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/update16.png b/gui/slick/images/menu/update16.png new file mode 100644 index 0000000000000000000000000000000000000000..07b3f378ac69fd3833c1001863402fe61de5ecb9 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X_IkQFhE&{2`t$$4J+o>r>jeZiZP4rlm}Ja7DAF2K%csJ_X&aHoSnM?b?yd4+q7 zqUYT{@i{U(ILLIwJ0BHW$f_5}*5Du|VBgrr$ZW}Gz`W6Rn#4ha2G-dsnhk{qjD?S~ cF|bH5SOpgC2mdKI;Vst0OCwuo&W#< literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/update16_over.png b/gui/slick/images/menu/update16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8e0c541582b1e2141eef61a402f0e2603fabeb GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xc6z!vhE&{2`t$$4J+o>nrs1ok(cZc2J+&(e^gt`Ns{ zxQ;vvD70`hbKvU8cf2{dafW=ydFGG#3VcjSek$D?q!<>lHvZrc_|N!AHsE893NH&U zLt>#q9j|CK%aNWXQVfSO9saOLvGF{SIKXq{+l#J^k_~hCPMi|aQBhfRaN|^5VIcqj literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/viewlog16.png b/gui/slick/images/menu/viewlog16.png new file mode 100644 index 0000000000000000000000000000000000000000..3a58f21b32a81b8a6aa82d4a465aa9ca371f43c5 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%``JOJ0Ar-fhQx*sqC~f>Nyijb( zF|LmO$3_hE6@483hm7qDCQgqcFT4|LkZ#~O-TKX8twnwugLlJ< z;AM{H2R1VcFW9Thd5XQ6b%RTu!@hvxAWb_z1>>Lv@?`-BehMbMa5?)+dvAl6XhMkj YPU&R9Y5LPH0$sr1>FVdQ&MBb@0P`_FXaE2J literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/viewlog_errors16.png b/gui/slick/images/menu/viewlog_errors16.png new file mode 100644 index 0000000000000000000000000000000000000000..6e55d22ebe4996bbcb6b850fbdd8c4ed5a1944fe GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xrg*wIhE&{IGMSODL4m{d?>X|t>{gyhF`!dI#Gt?@@eZOE@(#3y?iDB+Zk(0NbL*MhuANPuWBVo6JX#vMI zu`^4w4urFER85cQKVd4d`sAW}-dqPR3kciaf4PKliQ=g{n;9lYPL02;`{E2=(-+Af pWohXb#QyEt!1N~WxqAa6gHKMnSzut}f1vvqJYD@<);T3K0RW_mTe<)M literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/viewlog_errors16_over.png b/gui/slick/images/menu/viewlog_errors16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1b93627a35ce64e99518f4e8e10c1847c1546f GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xrg*wIhE&{I65Pn!pun@ZW%-x?@_XFWy7e?!5?@Smo4Y2P z-NEJ1{Ejbr!Z&8EO$uP;H~GY{>zR%PSJ`Uj$OnE41KZqn|6h;s=$>{_EsSG{`!unx zR*?t3j8^w_r>EbpFrJcN^oviA>8`i-rR6?;QEzxpd91Lg=3I47#eSD=!SgnjcamGm o+>AZAm-87j)$BYsoq?I5%ehkh6yt^mK=(0ty85}Sb4q9e03T{sc>n+a literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/xbmc16.png b/gui/slick/images/menu/xbmc16.png new file mode 100644 index 0000000000000000000000000000000000000000..adbc5ae8228d7afecdbb8c52c76f18ffbf0bd193 GIT binary patch literal 491 zcmVU-kb`eTu#62$bufY_n7{#A zWo}#{Dn(yZyx;m`3t4!Vgi#fLOL+FhbCR6F3GUQ$ffTG!F>kU0Ws-cUVs44GtJq$A z%Tk~UbMZs@O2002ovPDHLkV1k6L);s_J literal 0 HcmV?d00001 diff --git a/gui/slick/images/menu/xbmc16_over.png b/gui/slick/images/menu/xbmc16_over.png new file mode 100644 index 0000000000000000000000000000000000000000..2f0e01cf25fae13c129c247d9d8a44ad94521bcf GIT binary patch literal 488 zcmVP)!)%kdjE*D32wDjTKudQI^z{vJkeCWMQGq$gm>gmB)BsH)qcI&-vf$b{xm`&ua=f=+&WDjk{2UOU&XO>F7rWdSrnwykHGmE>nRR$D|5rTPK0deksXf{TA8h?aLIw$4Nmn$kM#Xo zWtnmhtIV&)JE%v#UBHw(s3yEfo1!Ya#U2__@cR9 literal 0 HcmV?d00001 diff --git a/gui/slick/images/minus.png b/gui/slick/images/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..5a673ce04aa48f20dfc82cf244c488f7633674a9 GIT binary patch literal 3630 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 A^#A|> literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/1live.png b/gui/slick/images/network/1live.png new file mode 100644 index 0000000000000000000000000000000000000000..c427bbca41e9f12c3bb2d3cdfc544daecb479877 GIT binary patch literal 866 zcmV-o1D*VdP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;=t)FDRCwC#ncs^|Q545N_uM3hxYwq=6om#E-Irq$%U%BU7x4ZW`Yp=8S zckR8_+MPt9P@t6IQR0XRhzW=ZhzTfZqyWLG;mlw`vL3&`puX%z;Pqn2pklBA8&y}0c+R*G^>6d*bE#2)`zV9JFpiRNU5E$ z{U2EGQ3Nb?yu8dYW`RR50dza$CxI@9jb@|U1N;W|0866m{*+?w3s7yCKP{8;fFYm? zIObT;2i5*;o_!Ph7FmaE4sZt;1g0u^6L8AtR?05YI1w-hivfR5sSu^tz*&dX^q><G18R+|$@CuseF1i#11o?! zU^TE@VpHg176F%m{o@$H{Q!GQ&a%dC)t&-uu|Yk=ZZGfz=mZ`CPyJmIMnH{3;~f)_ z%KCxZMy7N1CKDq7+CuEr1NVUrA)wtKpNcS<_Y;)QTaB0Nfw|&MTev&}-h|ky0@gY* z)8J&T1aCNMj&<_C%|X_Pj$3LH6Yv$dXYzcV1iR_OBwzq|CxJaFDL+461mtBg7UdDf zwip6-0;`P9OW;)zI}d@zz-nlWQ4SoCz?Kv*T#rz!AbJ;6f4=;pMt>jkq;Bwcz)vZ- zhN2MgNwq&lC^9Uj0hb&FPj`f|eZT{tA?!{Q!OlY9rXw(BqY%&_9`t~jqqJ-C!>A@( zLI~&rUX0-VSsMd9a}UsH3_3pwvyFF)A?e8D1jw!d=R%H%3$;bwKf|wqd;)S(NK{MP zmc*V)9eKwY?@;|t;4bhhpw#u`vePSiIgu62rApT!XMn}ZrYG~d7_h)LU}eA@$|MWq s021+cff7edKukbPKukbPKq=$T0KOlUW7?#q!~g&Q07*qoM6N<$g8HO!CIA2c literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/33.png b/gui/slick/images/network/33.png new file mode 100644 index 0000000000000000000000000000000000000000..b645bd3de4eda9c048962a285f63bca7dd758fe5 GIT binary patch literal 1033 zcmV+k1or!hP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZf8<8xmtRM;s zA}pbriV~_ZGRhzt)Jmhs5Tge~MMe3+FR37rVKr&W)Hv7M2iL&naPOV_IG1z51&6!O zKKuU9+5f%vTK{!UsZyypknP}R2KV>(PsTJHl+*qH!z4^byDL$`7)FMMhDJL=0A9r{ z=*fwIoiX`oIpLM@7Up$|fEn0~hl24^iw|0fV>Q0U(>Zum8B1_^$F@K`4kg1b(zWkhQaWFv84ZDT+txrYccsU7T_cthUrNFzPH(c*C_&?NZOmwhr4h` ztp0FveNh8=$Ks}O?G@YUSL}`qG&6}S^NJ?mWL%V-FUFn>A@3yT$2WjEGik4`F=lOY z|3YIx57s5F{za8By-9m}1DHGT`2^WxeByrHg=m3 zlEi_Ru`&dV$PAz0$rkXo$7euoao;c`F{mI?xq(a@CzQ#8E;`Chf7V8SeO*(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>NJ&INRCwCtnQ3TTRTRg6Gm}gft4Ug&SX`>6wgxfONEMeTuB})otul>%v??Ml z)D0CkgknHiwXq;rRNT;fXu*w8N8F-dP}_ zc6S|D8UVzA3nKPy1{MI10bAAg3g9N75@-NY09@ zITf_XVPIVCYJph-HmVeWF5nqpr(dIZ$RJ0J9hkIsY%lOA&z(o{TO9S3BHKg2dungWslaEz zJiXh2KUFsjtOp)c{%(1#aX%BtiE*QtpE-?>Z^b?z#G78 zj{1dKJit}JHCFvsM!FifE{Fq0fyd=jHv>N#bw2>F10Mh{0q2U4Ou0z!LzV{QwF_fP z699%Slg3!hj{0L(emsQ8&k5sz4x!y-*!hT%&V^{ja=i~bCi0>+<(DU_qOljp79k0Iw*@0(dvV;%@~`32}i3#S^~(cc|s_5zrA z#Q83eH<>c=`|yue{+0-V#}XqyiYV#5u;q6H#TdToYI& z|9>^m9niNgpl-Mbu#?6-MtoR%m%-ixIslm`)VvX2#LLlugbpjOM7**PJ88fExmB7mii@Pmi_Q2TzoLLS4bFBPU1uTQwogqhnV;*$o2N0VL zKpyxOcwT)ymT%Yb)m+>t@T>BVC>nLe8ac}w6>S2iTgWd_xVuZLHy$w7n^s?2=4;|@ zTJRjbGsc-7#S<=@uQ$T&)d3qib+S)WE_bwR2vN^=0fVl>GIE{sq&;a1 zU{~0@4|qy(iTA86h69q03yx)C^@N3VE%3B%fo*wK6YmAi0yNen{obqb4_fz{~eAq c&E@X_00 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/3sat.png b/gui/slick/images/network/3sat.png new file mode 100644 index 0000000000000000000000000000000000000000..94afd57dbe0c8b6f26f75b5c0cd360ebb1a7838b GIT binary patch literal 1246 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/a&e.png b/gui/slick/images/network/a&e.png new file mode 100644 index 0000000000000000000000000000000000000000..4e70cd0918ffa123c542154c2154c194b8ce74c5 GIT binary patch literal 996 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZTgh@$6J=FF=gi(~x zcR_Cj5n&O6M35RpAcaysRFn@=4?&O;i3UZ5o0{5cxji@wm&?q(b3b+!?EkWJ&p9)9 z=Ir^L8;C}ujAbM-#*w08l$4a{t}zZ+1q=c@=9B?+0reL0^MDP&2Vls<`GP=CO-)U+ zV+A1XKufFO=5JY5}8cHc)MLtOOy)~0#g;dXTV+weHO4xkwtC-IY66)zst17sE7ep!SA&&<3S1U zoP^c|90uAYyelTl`7;_6kRg0kg$C2F5nC0}UWRf>fz_9=QrH3^3tl_$MvQBLEeZuK z0p2Ormb$r}3&2=fp7rGWi5{9*B7I=LX|d~fTbo{Bd|cD z;R%Q~w_hU*M1&GuD_QNTfs zi;k1xUkONDOjWji7yf+H9ZtxLUFFL*< z;Iqb@6T+&pHQ&+gB?#&Szgiz+QM=~hV+YE!2(G?mfpp||bmqq93yDVQ({e z8jDvla%cwjXvn3xjRAKV{(uotq@g6>1tW_p;5{%=aRU{!OR0hXUx&vy{tW=_gQ$Q~ SQ`Kw$0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZTgh@$6J=FF=gi(~x zcR_Cj5n&O6M35RpAcaysRFn@=4?&O;i3UZ5o0{5cxji@wm&?q(b3b+!?EkWJ&p9)9 z=Ir^L8;C}ujAbM-#*w08l$4a{t}zZ+1q=c@=9B?+0reL0^MDP&2Vls<`GP=CO-)U+ zV+A1XKufFO=5JY5}8cHc)MLtOOy)~0#g;dXTV+weHO4xkwtC-IY66)zst17sE7ep!SA&&<3S1U zoP^c|90uAYyelTl`7;_6kRg0kg$C2F5nC0}UWRf>fz_9=QrH3^3tl_$MvQBLEeZuK z0p2Ormb$r}3&2=fp7rGWi5{9*B7I=LX|d~fTbo{Bd|cD z;R%Q~w_hU*M1&GuD_QNTfs zi;k1xUkONDOjWji7yf+H9ZtxLUFFL*< z;Iqb@6T+&pHQ&+gB?#&Szgiz+QM=~hV+YE!2(G?mfpp||bmqq93yDVQ({e z8jDvla%cwjXvn3xjRAKV{(uotq@g6>1tW_p;5{%=aRU{!OR0hXUx&vy{tW=_gQ$Q~ SQ`Kw$0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>iAh93RCwC#nQ3fPRTRg6)9I9@g|Q1Dve}3!#R#Ns)u2H|1rej5H7Z1iAt;8# z!~~mYRjkGsmneqDfEr@zRwdDhF{l+6q?oi8CCXAOAXK2VbfKZU;|Kqb+}_?d^V+ZN zNhUMzoO|!PXZxRX?}TEp7(19E{ceH6GEcmTNH;#U9-z^A}e z;CWyzP$T&y;B81e5FXuQDeuut;2Vqgouxd$Wx!*O`4M1D z94}v^h&$in=L0*X&xoJURfp0mRN>fav--ilqQclxN8a^6?pM z;;A@evK1M%0dssVumdOn_9+rPYF2*N0t=Ob^Ci1O-`&=FM_g4PC&4DlfK3+fFz|)N zn=J55M3)W#FWyd0fDG zmjhAd{!D>tp&?IGYE%OsDn*_JMhh1_d@(6k;Mm6iS=OM92|QVAAoj}%lqgmS9E<@L z0kA4*%oM-XV11LWQ zr~`gCcqf4Gf#rJM30xs$e?;kWivf&zz(_^KDwWYKTIU>~MI7aCBJha-#15fjl6lk$ zyy=7P8_cH5Dtn2j5qQVJpJ&X!7PvrZ;zh1Wb&864O5u0S^iDFuCG0Q&z)Ow|6gha0 zJ8+}TP@ruPZTMM*>>P(|yb)FZC?%T>!$g3wR!_3S-ea;+gL@sVDGuO6<Q9IpxfcSllpdbZR;H&{e(7Z z(kKHUdn{Q`0OhBv0s2X`Jzwt_DR0-wu+xnc&Qg!j0UUCGJFWHBN$|KnBLr|!V84#qhcs@HoN`8cY}0W$23#rQ z#ei>t-X!agFi?5{*ygApdmK3)c7%5#YLd6Y>IL@7+hf(~jgq`xQ8HRl6PA%0fWO46 z5HL;**VquJVFL^sV2IOy0{~GuO_2DBMk@dS002ovPDHLkV1mwV#N_}0 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/abc family.png b/gui/slick/images/network/abc family.png new file mode 100644 index 0000000000000000000000000000000000000000..d62eefd18d1efd0b81e99aa8a17108d7e2225143 GIT binary patch literal 1139 zcmV-(1dRKMP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<`AI}URCwC#*;}YpRTKu`?^u~>T9`#xSw4hTT2lE?hNd84lm&*_<;Ak73@NRM zsOa+0OBYnMh&-WE%Bd(z)1vUGBUOC5kZ0CfQB036YBG>jcPwk`cB7=iv7|A|#tik8FO z_@<_&e*mZ<-SHI0qiYTQPneEp{udrlk@N5#PTR}(&cxFgiBV{)ni___ScA_G@ZOKd zWoW>M*~8`0t-z*^0MHvN(WRZ6xB{PKBUO1Gcci}x7am{$&d1{P2V!$+d^Hw!gaj8= zjNgb?@yA})7=kBjJTHu&hj9nNdw<2tn1c=IRnoP)zApoC6$VxGU*e`Vc%Uo~qesa# zU#PsJ(A|uW(2UgquGqtUSb$sbIKIONIq7RNUV%xOzccG>!R~}YAv^FO-psm%OwO~J z#r%fW*482m{FueAK{vdOlhF@j@ELBz{aI`Q?nTe&W@Owur&E^a@C{~Vya^|zKRrgR zz{Tx6xU;Y|ZV%_C|69hVVoGVR4HeH=h7nCoP5+{Qb}3E=XMqdw1-9c248Q|H@7tV8 z|D?k{=$zBskPYp~+K=XYr^nbUW?&oLfp^*Id&7mG>8NEFP(( z^PZ*glqw0Hk<%LzV+%r@5SRWTZaf@!M>hiRX70*_OM&wDaZC6m{U<`2V=%uI7F#Q) zyEs{6S2E33ydT}>fVZz0?~9-DbwX%pNw+SC{T~k49rybxC%zWj!tOgUJ9FMi3LF}P zcVRsmvsSUO9;LO9OWTMgxGhG$)&^k}z@3=3rG{?zJ^<)a%0w^`ccnkK774D#OEIiF zE)5XF61S6Z4BiSDjfvsTL3>O1qLyq-JHAA=m3X+`1^Q2gk@> zrO+#T&Iy%RRtld&I#)cYTiR`S9oLr%r1fnTLX)u^H`GA%l6X0{PBhl)&1m`ug(?Y#|d4Es+^JwKqvoTYd+F?uM=V;#8;7cwKC zfvFLC<#&MPRVF>0rJ?@ENc~6AIskP5>HyRMICACh0RXZ(_5^(l^&(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<7fD1xRCwCt**fOnbA3P5UYiN8DfHPHC-_)cF(->@r2Sm_y^Gnn zGySiMBfL8-8LVSHUtC(n&RpA3zh!-Yc zL8`)&B*WxX-_J{_#-wSc0adxJP@Xvy&1DjwPQZpMS{ly51F`_3T2H_!U0I n2Vu{oNY_;VJKSxG%Rd7EypE@=Tlw1r00000NkvXXu0mjfTBWCb literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/abc.png b/gui/slick/images/network/abc.png new file mode 100644 index 0000000000000000000000000000000000000000..eaea79e9b2370f0f04078d582edf6bf9d30b9259 GIT binary patch literal 913 zcmV;C18)3@P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<7fD1xRCwCt**fOnbA3P5UYiN8DfHPHC-_)cF(->@r2Sm_y^Gnn zGySiMBfL8-8LVSHUtC(n&RpA3zh!-Yc zL8`)&B*WxX-_J{_#-wSc0adxJP@Xvy&1DjwPQZpMS{ly51F`_3T2H_!U0I n2Vu{oNY_;VJKSxG%Rd7EypE@=Tlw1r00000NkvXXu0mjfTBWCb literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/adult swim.png b/gui/slick/images/network/adult swim.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb702509683c984d3ac5948bd2317e968824b4e GIT binary patch literal 1004 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 Ef^UPm>i_@% literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/animal planet.png b/gui/slick/images/network/animal planet.png new file mode 100644 index 0000000000000000000000000000000000000000..310db8cd804cd097a6d3d9a2436fc6ce7de5cbf2 GIT binary patch literal 1743 zcmV;=1~B=FP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?RY^oaRCwC7nOkgCRS<^1b2xBXij_-2?rlLSSWAI`RzpBE;w7krh{mXi@BqQ6 z!51|=7}SUlLZWD56!8`lqtPm0Vvv}C5Q>Nr#c&Z2td>?TwzRaRr4}FfcQUT5eQ9YY zIoW&9UY9-pn)T1DIjMyU7vjhgU#F4%}th9tA!P9x~2AdB9r{6IB`jCIYK;zZNLfb6>Sv<@EgBbfV4AEVa!BVnEPgPKNR>w_osn2Pu~XMUwTJsb0x&jaqA-A_1LtG^c@7W0$bz>7tOm4 zphe?0>V3Wzq#PI(Gj=f6RYo`5dDkNVWYy*uM_&f)i|IR7+h%S=n|{C)dDLWJAkaU- zLU!s}U~~n&0YKmdE&!8&Yr5!dLu6!N@Dz=c>W1qN@_c`h15S?tQ0&na0TXl|X273X z(KWzS;5tQ&%aIO|nvG0#;`z_k4v$_hv2>p@*;JViJx<-Y%?zs0};5}fYKnRm7b^Q&E# z4=OTY4PduedQ=SQ6aYT}d$iv(3Fn(5V`{bHKWWY%G%LMxPh}UyQGpJN5Up zYt?lR@K1tJRjhV1fRVaZ05^ye21fMlBLhbZkU$P-{$~|NgYOB(%IyjOJ_6h=eTmTx zbTYwX$^q_(0l>Qd31EYMfs7F#6#}Oe7#uU^B>mRu{Nc_u(s-%`(+hx)-S=trOC0?e z13-&VkCR4CK27W$Y?pSRN#0f|5*x2=GD99R*^{-pV+S7ijR9b&nJbW!;)}b1kK;Vx zKuCNaul*d5&&~t@9Mv4V6DBtGGAt(nd3KuAH|wOsCp`c0@6wH*b_ z1fCHQKIa*4oEZP2Ja4smcZ<&XO^$wnjQCETRiSTKX$bth-u3Y$X&LJQJ^-psg~ulo zh5QQOVbA;56h4<2qxTt4u(HER!{-27b^oo=FH)^>K~2&ywn<-*q0eca#{VW*h;W9EL1TTd9Jx^2Z zF=h64j`6&(dcrA1id2M`!~)PMqXYTGV@Ot$*gr@Ps%?X=^*T7=*)GBAXH8hW&EpxJ zrlzGS*09(g$ZS@d>EqN%cZ}v0_J~H`~5+Il#(Z|P*JAYc++|rnkRBR lWWFJ6>uxt~>I3C}0{~v>Xec&gMbrQQ002ovPDHLkV1oH|AWHxM literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/animalplanet.png b/gui/slick/images/network/animalplanet.png new file mode 100644 index 0000000000000000000000000000000000000000..310db8cd804cd097a6d3d9a2436fc6ce7de5cbf2 GIT binary patch literal 1743 zcmV;=1~B=FP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?RY^oaRCwC7nOkgCRS<^1b2xBXij_-2?rlLSSWAI`RzpBE;w7krh{mXi@BqQ6 z!51|=7}SUlLZWD56!8`lqtPm0Vvv}C5Q>Nr#c&Z2td>?TwzRaRr4}FfcQUT5eQ9YY zIoW&9UY9-pn)T1DIjMyU7vjhgU#F4%}th9tA!P9x~2AdB9r{6IB`jCIYK;zZNLfb6>Sv<@EgBbfV4AEVa!BVnEPgPKNR>w_osn2Pu~XMUwTJsb0x&jaqA-A_1LtG^c@7W0$bz>7tOm4 zphe?0>V3Wzq#PI(Gj=f6RYo`5dDkNVWYy*uM_&f)i|IR7+h%S=n|{C)dDLWJAkaU- zLU!s}U~~n&0YKmdE&!8&Yr5!dLu6!N@Dz=c>W1qN@_c`h15S?tQ0&na0TXl|X273X z(KWzS;5tQ&%aIO|nvG0#;`z_k4v$_hv2>p@*;JViJx<-Y%?zs0};5}fYKnRm7b^Q&E# z4=OTY4PduedQ=SQ6aYT}d$iv(3Fn(5V`{bHKWWY%G%LMxPh}UyQGpJN5Up zYt?lR@K1tJRjhV1fRVaZ05^ye21fMlBLhbZkU$P-{$~|NgYOB(%IyjOJ_6h=eTmTx zbTYwX$^q_(0l>Qd31EYMfs7F#6#}Oe7#uU^B>mRu{Nc_u(s-%`(+hx)-S=trOC0?e z13-&VkCR4CK27W$Y?pSRN#0f|5*x2=GD99R*^{-pV+S7ijR9b&nJbW!;)}b1kK;Vx zKuCNaul*d5&&~t@9Mv4V6DBtGGAt(nd3KuAH|wOsCp`c0@6wH*b_ z1fCHQKIa*4oEZP2Ja4smcZ<&XO^$wnjQCETRiSTKX$bth-u3Y$X&LJQJ^-psg~ulo zh5QQOVbA;56h4<2qxTt4u(HER!{-27b^oo=FH)^>K~2&ywn<-*q0eca#{VW*h;W9EL1TTd9Jx^2Z zF=h64j`6&(dcrA1id2M`!~)PMqXYTGV@Ot$*gr@Ps%?X=^*T7=*)GBAXH8hW&EpxJ zrlzGS*09(g$ZS@d>EqN%cZ}v0_J~H`~5+Il#(Z|P*JAYc++|rnkRBR lWWFJ6>uxt~>I3C}0{~v>Xec&gMbrQQ002ovPDHLkV1oH|AWHxM literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/animax.png b/gui/slick/images/network/animax.png new file mode 100644 index 0000000000000000000000000000000000000000..0f5ec81d7e7901ec0caeee52aed0bbd2cd0d694a GIT binary patch literal 1396 zcmV-)1&jKLP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=`bk7VRCwC#nR$qoRTPJx8J9FQwK8*yHq9(5E%zkTaLcH)rWLG=NDIjdgX)ip zu*E1TGRbEREC>8*@pltOj&+G?y{I{&`+Fy?o!KGvfj?2QK&h&U@$H zd(Qox-#Pc4yi6uTb(VapxzsqI#sSq_Y9|i`1qDZA{W?Hnpb1dl{nP?7z&}74unX7< z?5N6xr%s*vUk4l}IRR)3Tm+m2v;rFWZm-7f*Vz5QKHt@{Z=jRv`nxW0yv|q$d|dVXAHZ+Ga$qB{1tzX3BWxSNrMjn8-U5d_{BhfA@|-fV*KgCeXA%PoO(YJn0F`+xYAg94rr||W32TO zS^!-nszllW%~Er9050_TlECska;$x}Y#)iRdElLET_?)d_TB7f1JhGu`T|cJj0462 zGgFKFDzi@vy5Yb#!Lto?+6IkIWD@YQh*<_)=SG(R^HXa-WLkT~-}Ov+8+BYWV4CX; z3jA{_a7!vBj?ZG-XyCZ=9PkeCU`n@Df>{%E^?}!X?rM(T6;5n%Kt{&gogk@2KuMo4 zPdDIcpOf_VmZx7IcnMepjP>0t-~&l{BJh4{-#c=o)q1%cFbcReM>rIxbcOZ{>>st? zZQm65+~@W7e}{g*j!BR-Mq?6LV*W31o_&U26VdU!<8A=H@?Ba6WzqczY|rL^#$nPZ zUz*FKbOi>QgZt>|JAnbfCg4d6oX&1+r~%m!8)y9t~h59FLk zOQ3z03^yhRsb}SYZh@Sl%*~>k9%_Q&LaMeXXbHRsT;`Ywj#-SP6Zd#E`^dRQNZRGeghHevpGA&dylo0H1{TXGO$t1Kka0{9dd3fvWltf%$=1;7sy z8sVbTFvMXU;3R+FEh0)qRdRyGqGz}cD^dT8L^@2Atu|{c5}h-`0VHxi@K||iaFxWB zmYV`H8X6|6Jgr_XI4ER?4H^&dtb}#IO&6(OXV{daN?tS~Igrl4HP#=4B|GGS$(FiU z^vn?nOT)P2j?f)=;b1DkA#T2T>PGj8M!p(IF)br>&ZcmyL&AE+i%`ZKzg|?#%reg# z8nHPzh2WesMMF{0w+-Z*$XaWd$%k?mD7Ijk0$d*S1I_ncfcvZovPrIMX&k>kWQ*N7 z#;+-7&l^(*c5iC0^MN(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ2Ga&fvq33)IKOb%?28KBa$gS|&ROg3bvWl= z!(QvZfws0bdh*db91jf!gPmR44@d*v19crOE-EVe>+jm@KRX}_7zOMEt^wP^<&^FK zz#1Uk&@}_az*e9{0JH+jBMpG-z(L?ch~FE5y+AB*3OELwh!g-yfZ4#S&g40;7^nr7 z0vBBepa7Vq`_EmlyRU1G>VuO2j0HCN&iTlV;IA-23P7CeZE&=c?gg)I;D{K)EZ?S#q z5&-vrpBDWjL(T&pSW?DJl?I^9B>;W^XDs?D#_o_O-DV^2(+s=J-XpS;%67&$WxGl9* z16%N@@KoTF(ybnt2`m!;3BWtmhY`REML;bc7nlyb(KA|I+67+A^K<3#D&R11OQc8% z9!VPIn-aeR$Hfq3DEwnoAWs8#T>{{(@;o4KCMv9(fXBc`aR3#n{*M#|xzgQGT2v|Q zV+j*89Ig~-A6>8NOwlygpc7wr*xnN)34{y2=TwKA5eoG5zsLU!0L=)dGukrm+yDRo M07*qoM6N<$f+Ng?r~m)} literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/antena 3.png b/gui/slick/images/network/antena 3.png new file mode 100644 index 0000000000000000000000000000000000000000..00ae07bd7ccc7f16738a7c171c15bb1fc325c797 GIT binary patch literal 1108 zcmV-a1grarP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<+DSw~RCwCt*;|N}RTKyC-;8EvmRhN)K?6=jg_fourBaCrMRt*=vBqX*sStY_uz?d|mipbjz>i!dKYV+Q76 zCpPB!9P97~whpNgun%%PZooxl`9I_Re1C%z@?4O-7jYXt>d($K_p|X=P!0W)WmBVEZXN0XG-s=;CYSW0j*DyP7AAHW zvH(oM_$s;=@IhJLC>&Upw;7LDsbdschcW=WYv_vm``KC5x8QqhO91pVE=-wAYt*xA zC4fRFvsj~F?M0K017+)^4Gb+~N zl``Ek;SNI@fIG^zxh2^akLyDnloI;ihncHI2pwpQ}R~yAmEh+o)_1p1{fRVsB*|&h4-Gf1m*?=T z5Z)ZDP7Edh@ZKP|KPXdRZ!)Zp<(mc)fEif45ABV}LU&nc@C4kIP3x74cHyykHner!1MSa9bBw%3_c~`+!rIS z$riW~8*o~vZ6{U-tPVUF#lxk+J$T{t*iZNaxCgsC}RT!62`_s0dypF*W4#aWLA{O*Lw z+Y@DW#R0FTPp$ni1x}4I_s7^-8UDL761viXrj(l;gJ;FNd-BYT$JVFbiSgVfgP`nh~p7f|ZzviD|;r^XCEEKqS)HXJCj){>?Nsml=Owj@D?d{!l1>nCb a{|o@sh}n)k<%Mqm0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;97#k$RCwC#**j=dK@+O6pDob(Mlu{I}ucj5#n0x3EW~~E%tHmb$?i9ckXa!&Oc|) z`R8n*QmJSZip8QPVIFp2H;$Cc<rKnKYc>IW;obvSoyIiN zECO~U0$L%>dA896EXCt!Gl52@n}u02z8M5e${4y@Jl`w)%rgPCWa?*}#>&Y1sgmD~ zUd)`t_j|aGTlk$wi?i}fzz>|jRlKY5d}iL$;9DH+1i=mg9Riw(%Kt>bL#)LrJc_A{UW7=h#1*g3>!i%cE{&C#_>7~{)DY~gOR*tfpgKGjCMu1`jb$RA46GAACVq> z#kVXIFrC64U_Q=<{907*qoM6N<$f^r@i4*&oF literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/arte.png b/gui/slick/images/network/arte.png new file mode 100644 index 0000000000000000000000000000000000000000..13ec9ce9a1aa1bdce932bd5770fd555f00e1e56f GIT binary patch literal 919 zcmV;I18Dq-P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<9Z5t%RCwC#+1rcNRTKyC&v8y26syt3un2}Qqf&whe5j<06(Ly&O(F#m)T3fO z_+Ss=Lp=pC|AEy*7Yw>u5JcnzJ|t!s6b^)<_ztb-P`Ij3ovf4FL@S4FL@S1C7?$*w~d~%XPR5GsyPlRs`uN{#uNe zwy&UI+=~MRa}VL$|9c7iKF7I5%YY5I9XDec&f+wF#g7F#OEHq9a2G?N`!`nOQFJ1r zlei&L{nip&ZVM7RQ6guOcjPgOb+`$$A^Qt{t3$wz*n=&xP!W#fGrS(oWq1E4L=7+Eg&qUyQ;Rrs&o0#rJz-D}ave2VKM zf|+qs1#+uPvTt@CCAHJnee20vsv83FrB6ee)6f`rHCV0=c_g+BHEjeY`OmdH&O z)qUWTEDGy!Pl3?JAOP;fu^#CSt7;m*3tvSIW==eYt8hQwDbU-7Ly>9I(GOn0${wYn zyA$W(8|=WlJ!H4HBTe##4M%3Y5nIq5kpc6;rxo)fC3CA{`%Q66f$Y|3(o2)ztSxGc z=`QeWboB>nbmh5VA=g}=~W%OTYaoGyFfOrXk%{;=O?4C z#!8r<_r_(I(VUn`hfR&qYbqf?{N4OOghE;4MYrtSnj?=e2y zZ)18Z>ie3wX{An0C%@0&!O)q>8FwtcXU%jbM{+kVP*r#z-^I2&o9G`dkl%t$A)DPi tPxRGznm(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZVHn3hXR{4iSqizuFmny%4}|<`ytnf^zxR2*@AG`0 z_xJ*V0A7{^JTC2mEy&Bui^qGU$r&}#ez4!~|1S{G2=oF{fD*tD>;*b`K+}Q~Ch8K&=-LkPMsyegI#9O~75?rdP5+Gq4@_3Df}@>Sz8F zSs+dZ*kO&G0$u<D z2L#nxV7klvLCv?Q?^C-)?F8w7v`>(~ZaiZqa1FQz^bPVpgMs}(PoNOE6-xu80|iEZ zHgML(gW<|3%K+DbD?ko#8JO0}cW-F(?|_G~MnIwTH*xkgE(XW~x+~Q=oIe}L2kL=h zpb1FSeBvJ>|2&~A2iOLzb6ImnoBs+7(Qn1n0E?xIft|n@U?A|?@}67alP|*^4e__? zfaSn$U@h>?LxOxguu^0FjZ6@;`+y`PzN}h7Wu&|d+B`zR8@109=1p=q23Tt3{Q6ebIcaK;*kQE9i3K&lENd=X zI>q25Q8hpxV7%IggRDI-KHk=pXjh$?1`BPm=HD1BbaIG{G%N#bF#^=(AZuHI6ULbx zV9lpWcO$erzfz;>+#ts1CcBN}w+omOEd%&~u8QX1>IjLSs)HThD~}oNvHLag0#ck2Ux~P-pqP d{`dIr0RU_)%~v`nkRAX4002ovPDHLkV1isN&?x`_ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/at5.png b/gui/slick/images/network/at5.png new file mode 100644 index 0000000000000000000000000000000000000000..110c315f95538416184431c5acf892608909ad50 GIT binary patch literal 885 zcmV-*1B(2KP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;`$(Ep2cI-OqvY;Ydf3w&2( zmB1xnpGo&1a0>Y0f`CDw0r*x>3$VHWuv||wjirF2z_22#1*W^4Vp~ z*Kz5O79#;WfC>kCdw|n&eO;RBLY*f4w?MN^MkpEr%;w(@yav{o=keVxMz|t2I_&QK4MTEFxRDf1{wsL#3WVp0QZ3bjee_7 zOC52kKOQszy6E2}zgIM4&Ba;@dm&&3u-PQ*1Fp(-yC!ef0-HiyS0czDxD$wIi0sJW zdnuqhkBb}uZYlFeC2azH36cPv`OgM+J0LFQWn*K3H=0T_a2KcnHuxx*ui5Ym}{y9B^&S~R2`mugYP7Wr~Rc_bnZtdQ0s78*zl zSOBcm$lIj)GUJSf0OX9|oKoI;E@CvO2kro?f^dQT8rfZo#REJ7K5OI$lzC$oUsM-l zonj@hJqQc9D7&=mX-)<3GRHj)Qo?4G1*;3Z3_JsVird63s=jMNW-l;Bc9f04LYqpp zGv5UCcreNL(yTBjEf=~qHN+9%wx%cpm=o54NFiYW7c9my6-p6Ku*jPrmnv0e(E zUWp@1CFQNN(C;WU0?zX9(U}#xB(Rp03pjnx0k`{u|Ahc2r^(MH?S3sa0%qCd`|MXg z2`mFX2E7+31SWu+z(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ8VrK8%+iX=N*knJi~b)RE}y<<`JO%BA3n}K=exuE z{`cN<&b==X32WewJjt>0^q?89Y2OcMKjLio6`N znk-7p?}!)yd5-=K$W?i(X5SAhC8tZ;6)+5#EpP9^>nGdT8YBz48DlUoHPQr3cJ!aX zV&DUCvWIrpflgq)^d|Ez%{fB10F5e-H}-dq^h0~3FGT!qdL{t}!)RM=+P65XD%a>& z3^A5)FCx^6_(Z4whsrV|x&lTzv!5!~E5c}7tHTmTqCTu+^}=M4;{?44>oi-+Vtu5q z#D+Qh^rLJ~^@KvBemrt!L8Z19&lFj_PTw4*c*5bNihLQ`bX(q2Bj70qKtZLw&pqvwf>MGj#cUe3NdJqK4iQ;GW@w zVR+^4(5b^x7Vt}3;YhUa1OD||{Fgr9Z~EzS4ni?`B{l}Q;5et4LT_izz3$F1ho870 tpiPIKfXGO2!eY!J5bysEClKfOJpg=*wyadRr1$^;002ovPDHLkV1kU!!D#>h literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bandai visual.png b/gui/slick/images/network/bandai visual.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5f6f6b6c73c6c9188debbf06057f8087052f44 GIT binary patch literal 1420 zcmV;71#|j|P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>5=lfsRCwCtnSE%MRT##9?_5)t%#U&^!OCC<~AK>x&HY*ad?^F-o5X;!EPAm zyw9F( z;Xodc3-lEPbp8-f2kZg90d@l0frd^K0d24x;3nWYpa|%73S;^M!+^2DwZDLmfwjQu zWJXD38A+Zm7ntuVE(a!`qVp%SKERE@YrtM$o)Oh40hkTc0uKRaq#&vW0p&j9-p&NT zS-@6cK|5EwEm83T@L@85ZZ80%fNEe&2PoK8Kou~gqW~x}OZV1GjI_w3mED>-vdty&?2v`2VOCemAZP11#%Sdm9p1EfTsbcIre}#AQM;ubOSyI zDuL^PpMXEp1;9FBsm^4`#f`u+pdQEu?gTb_|HZ%^{(i%2F9II`?*Q)uHNcMG87qLt zfepYpzyrW4|Ca~MwN`jWVAcXxq=N#NSlImL?;XHCvve~MQ@=L{V;;609LOcW)sD~B zDS*2jf3wmz7dRd`k5WqzZHIsY;Ouk&P-c7Bb^*}S5WUa-LjU(1a0_tI@QeU>(3J)F z!!ePakT%QxT_a5Z9#sOHf$sv)eh;KLr2u3A6YY1iy+)1?1J(e$1m3d$Sg-&qgL@)BCZ`&J^DJ}Y>wsA%#$OE2FAVdBKqb~$!~h%# zC{U;)(YEwQ;1kPefDtCz?ouP#KvjC3U~Hc6kum`K1pO%N#>@LHYV$}rTc`6IfqYlH z+A;qI^E3sakIAeE_!M{vm?@CQ+(2y*oGRcw#~cji8=S7q(DNp`db9LUV5*MJcE$Ds zldR`oc6Ca1u--&^KQP^Q$v2ti0^_`Yw-jh{kCADvndmbMgJc*FZqfm$3;M;%(3_T~ zlYnhHJHvans^c4#yRW?-Q~T!up8-?kZ#D3xE4{(mDY+X=imG&-htIp5S>0(s_$47JTF$W-!%|366*Qz```S~R8SKZcPC=nTa zJLpff-D11R_V!@z%YbX`_p)dymI7fEX4~e=>HS7Pu6ZHkcaM|2+nRLL0SklvnR4(S z;4ULzpgAFml)i?40q}@b;gP_ZthhD?ylQ_H@I(OafZ(3iY*9J@*atk@N|m?F1XLF2 zH%cQW%xO}gJXpo7xWa0eC3cqkgOUJ@`XG|xtvr#vK%%?BvOv@{+3j7LG0Ox!D7juq&I#pvedEBHp+`O<&uvRFm30bTy-vwGZ79RwBVFD}f8#&+kluR^gb{Jo=e>T0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZyLd;J)Mrfob!55d+PN2J->6F zr|0=Tzw2`X@pzn}+)~_{sJgn^VzYtY9<4V7^a9avIGkJn0CRu~zz87f;eq`C_5x>< z4S<8dgal}9Hn7Dl0D>+qESf;m{ovL_ZUWGsKmg)y+LT)@AleMHXznNw15$yxK&A10 z1h}k2*Z_=@{2K5={f&~f0C$1uz!EnPF2#e>Ij@a5wJX3f@jHPg@#(-G@yCEx@rA%* z&36WFK@IRy{8Ldgq`r6C6jD4m`E9@gZP=;`2Y`91a>XxISWE-*fk`T?iZ!+z zIHJwZ{EMSZDibI*!k$w*Zt#6Tmz>=pLtbecv)$H@C8G&gYPny$`J@B8ZQoY`8A^F0 zhJ3ch97se_;e`)~8tHAh^7jGYuyOjIY?)xaLs1p=D*#p;UkE%9Oq0B|agcNnQ{uWiEs&y+VLym<*g+`-v~fCgy>N|C3CZ*bee{ciwF6>b+TQgPD{ zU$Xmt@cw-H-mS0R+{@x{0wD(CF(yE&GWkk^ccB)mQvYfU>Gn>P7&aS zlA&+Xj2Ljy2&Y|s)qs3pj5g9KyDwAa*QWX)OQEp`n6FEaqrh8WqWnUM-vF?j-X;d` z_(F!5}feeEWIb?`-`M<0uEg1nwtwW~yCrkhU002ovPDHLkV1fbetf>G1 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc america.png b/gui/slick/images/network/bbc america.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc entertainment.png b/gui/slick/images/network/bbc entertainment.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc four.png b/gui/slick/images/network/bbc four.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc one.png b/gui/slick/images/network/bbc one.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc prime.png b/gui/slick/images/network/bbc prime.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc three.png b/gui/slick/images/network/bbc three.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc two.png b/gui/slick/images/network/bbc two.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bbc.png b/gui/slick/images/network/bbc.png new file mode 100644 index 0000000000000000000000000000000000000000..92fd9dea2444149f05cb7bccaa7c6be640c6c865 GIT binary patch literal 977 zcmV;?11|iDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ zV5WhCITxPA&k-Yl_EuAT_C0GDI+EWFcgo{?vO_b`dCaR{ej zIacBPmirGj+7La`V$BQ>g*Y2}RQxS`m^1zqZovC!^vL}V9!+9J9xla4n4b-_d)V37 zjcema2e1vFV|BCh3-J7%7_3&M09l~e6z;kYKj6(sO2+X<2?18(k4SN+@JR&59T+XZb6&Iu zV%4hL1Lh|RFT}05E5=?g=>eI=j>5%wJI*IU>~3&H5|B6cLx4p&W4pQxptE64&e+zL zLZ#b6>E-Bei{RX@sGGvW5jeXJf}6t{P5d5f?iX?Gff54j#&hwU>2Uo_fE$x#u^X(z zXOTy|80q#JT!>?1{h!3UasQRw2=G;6m906~A5RjbBG?=4p0GwMu8L%(D8^%D8pDrx zq0N04M6Bs3z!-i?ilLcs+cTpqUD~7NZ^lW9i)V$_iMT8ZmR@l`Zi}?~)3E$uoQ!jW zdsSXAnwLZNSc%{^+dN;}qvy=&GI<-p9dUGndG(67#cF-pZtK_9UA+<2UX@#78SafD zrK&A4Nwi;4)s|Ro_|MRQV<^B-fS~|`jsFG!Ho2~^3l)sK00000NkvXXu0mjfnVQOi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/bio..png b/gui/slick/images/network/bio..png new file mode 100644 index 0000000000000000000000000000000000000000..81cef4d75f879414b22211a33545c80daa5365ef GIT binary patch literal 1405 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/canal+.png b/gui/slick/images/network/canal+.png new file mode 100644 index 0000000000000000000000000000000000000000..5a2778b2b355c6eb52a12da376d1f420b12be7ac GIT binary patch literal 1025 zcmV+c1pfPpP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZbQDy~diDk>AL<^Jc5`{>6gI!FE)kHT%QMO-H zM2Qi2F_uM05?w?{7Ew191c4$^IT=y3Y1uM`*f!bJOf#C(&3WPQ^v*c<-*;em&w1Ww z{h$9i=Xt+r8yg$b%+k>0(gL6bKns8t04)HTS=ze0yE}0J{%x|e?}y=bY{bD$N`S!z zhMPD7hTAbx^WtkfgUtcZG+cnCI3e{L!c!4GZMX?Xr1t}OHrAMn8`Hbruok0Og!76$ ztjCw3FT~>F{W@&Jblg#s&wjxz_#0?LFYL^K{-mE%^t-RHcLY;1dn&mi*jLJNsr|(9VxVNeJxT8^?BzwcEDxZL z#G&{MTlN9KR=g12`zo~`Q+R)U=x3o1e+9UwNBj0vwT>@XI)EtwTHeQ-*b{8)#L*=H zJMmuVoyFnHO%5jNuMFy686fP!A@T0J!c1<$-kJN?0jHG`)QSD5zKMQY#r`rOQzR2pk(?*A*dR&ON@laeugoi7+Kk3_I zT;-%K;{Y%(>5oNjnS$S=0>M$ijw%Ee)dA2EC2R*aU=409lGdE?{@w)Cr3FBJ$(sYA z&yMGFu^B0b=cfKIrFm|zNw7mWFadCQ?7NaXi!p1%DW?YO_E`mblYU!NfvYheuSff; z6uV1sIl9szH^=kWG*@+Zn1h>(HLC;Mo7ygkIlHhRg;!Myze&uxC_K8fDBbKM6!um8iWZDoJlp_O#S*YFv;$2)!dh zX=TjYRm?jB&qquz3*n{00000NkvXXu0mjfpbXxM literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/canvas.png b/gui/slick/images/network/canvas.png new file mode 100644 index 0000000000000000000000000000000000000000..41de681beebd43200a92e13179da5b4c12561786 GIT binary patch literal 874 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 LNkvXXu0mjf;cKcn literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/cbc.png b/gui/slick/images/network/cbc.png new file mode 100644 index 0000000000000000000000000000000000000000..ba132800a2a57e5d7b8c0dda50bd33e1d00a127c GIT binary patch literal 976 zcmV;>126oEP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZNHT!2-Wj>m)FjfG7l;6^MiJbx4--Wg{7B)p7$ zv$l9nJ8o!F8axC`OW3xG;8$h0Vn+$PKJlS31e{xeO~WNE>^&dHRN&_|$pv0SKfcBv zNptIS1NOld?1?G)5x&B&I1GPgejdKa|2PGoHHCov@&&f!c|jujy;xny4D&HFabYbU z#VeVgg&wSlE3FIOfuHK^0uSJsjOWCcm*EUdE(EnNJE?FaTQp3nd!cak7uAt~4R{a-7JRlSX=mgYTsQ)W z8*y|AA4-E$v9fU6YA1wxB7}xqVj`|fR`{_{-L1q`=?qOs@v}VY5&ptUDV&yKXYeZv z=hRjSZj1Dtj&G8~`y*@TrrP@)&nB(4XKo_SigfPBV^NdGMmcUACN|Wv7MO?oOV~N- z4a^u}?^axj=S%n<+24q2u&QIZuGIAz&Q{{%3jFCNmBU*jYs*E_LoMuGTyZm(MFuy9 z00~~V6av^x{DYJ5L&f@EaAwNlSq1!_(dq_`c1sNIO!d}P5J78jK+@#Udx7^8^^2nE zGQ2%neSondKuX^g8BaF&USM+~|Mv#l;`^rv>cq9BeuAbGP`>6n6Va>ek)**fv#};% yyTQKT69!+6%}#;Thlk?|V`^>xza1Xu_U{0qc)8qMX*{|B0000P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?8A(JzRCwC#nR$@Ubr{EA>!{7rrL07b?roDo!&Y)tiV~uloFOJDY0{yT3>7sc z?|0+! z^Yb~GM=?(FQ39Y%n>Mk$#s`5zKq`=PJa3$qmKM_pC$@`d;TjF=nnJ+Rs-i7 zOj84kj9x%<;54`21zvZ43b5Px%|I=nd@O1}Dd1w2dTkK=2;e$kDR2fbA6OD_dNEK1 z7z?})oCnPCeyKn;;B(KN1#D6fGl2A1NI+vNTn@#lVpbXH;Dt-(s z1GWZs7SV(ceQu3F?7njz2P_2I1Fr?o8x+hd0~@8wZpCp1FvY}=J<$o61hf#oTMazh z-w2bE>$#7boF%|)U>$IQC|K_~Yk)q1ASa1{NJ6>+6@WR?>1PXYi|bDnQ7?(K6PkdV zfP1ZEE|3Pa208=dfXnRG5`ts_Yy-|UAb{n;J%{S+i>!2Q;C_!Km{fpg4X%q$uuI)Z z0WPvn=yW`7FsT6hdf1HT8fKW8}KIZfC{eu9gCwfFGqmybzwLP;S=uX9A}i;0M3}>2(130q7Yez@`1|1CoJD z)TGwZBF`i&6>UXEz&u5(o&xuW_EHJ>9cW`<(W8OY9}Qe3Mbe#Da3MW`OAR(ci>HAm z1~mrwNLVidc4~2vD%P_vXe)j81v)d|wdH8Fee6Lh+k6!X0gdJI(O}aF*diL@tq#Dc zz=Ghs9H2*lk`=;zSpoMPSqK$#qgv$1dXlA7dy&^sB&C|zmQrN1 z*R-|0PPIF&sLLceKPm#^Jt=(qI@5=AGw`aw^uXVj%Cm_2&sNblxi3*I8RP;x1NYby zBr9;Ey?=%kt_}eMoyU(${; z>pn|@CMerpqpSVG;i7yG=n8!5 zJ9rnntupoj8H!SFjDAjE?njqV+G(DMuCA3A`Gd$Lf6cV59R2@$Vt-@-cNFEsxc~n< de3Fkp2LN1#xd#AMD9-=@002ovPDHLkV1n@)1|I+b literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/cbs.png b/gui/slick/images/network/cbs.png new file mode 100644 index 0000000000000000000000000000000000000000..35fbf96cd68464f25c9e2b6501b2c2b8ae1a5a0d GIT binary patch literal 3966 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 Y095%G0F=%)<^TWy07*qoM6N<$f=Yr_AOHXW literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/channel 4.png b/gui/slick/images/network/channel 4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee145b59d7dda736c80aad1ad4b59156f1cf2b0 GIT binary patch literal 1035 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/city.png b/gui/slick/images/network/city.png new file mode 100644 index 0000000000000000000000000000000000000000..979582dbb49462d5b3cc1703179e1ad3650f493d GIT binary patch literal 4048 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 b>F)smUchdUeBy^b00000NkvXXu0mjft!UuM literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/comedy central Family.png b/gui/slick/images/network/comedy central Family.png new file mode 100644 index 0000000000000000000000000000000000000000..9c398af3acf32d738463874888bf9aaed0b3ec61 GIT binary patch literal 1055 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 O|CmYlrBzYFQvM72*z3mt literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/ctv.png b/gui/slick/images/network/ctv.png new file mode 100644 index 0000000000000000000000000000000000000000..434c8bf40fd4b0d1f44239260de6489814c0f668 GIT binary patch literal 1172 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 Y0J6-unex$;qW}N^07*qoM6N<$g8SRa`v3p{ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/discovery channel.png b/gui/slick/images/network/discovery channel.png new file mode 100644 index 0000000000000000000000000000000000000000..28b7ea73f955d64e5abb4370665b36922b8a7512 GIT binary patch literal 1091 zcmV-J1ibr+P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<$w@>(RCwC#*;|NJRU8KJ-{@Fl(~Z)+JXDZ&A8IU&j3`UGf|WI6L>H5E!YE6u zp&}|PGsU6{m6>4_T_qSo(o%|iuzD!E5E4k(1+%L)S~^TlFW-jEVFr5$gPFbHu-E>d zz4luF@Be+@Ui+N7o}L~9xeYSFTLnM`Km|YrKm|YrKn1|SZFMazExpAj;!5nF&kn4| z3;4c20Z?Caz8AVN2GbMU6{bwagJ{Du{ZRsE;Rp=IO3c7XIj=)AHew0JXUwHIF8xt> z0P}D>_AcFf5*FhYj4Z`Z$e6ovWMZdaN-t|I&vgbK!(0q474I^PE?qMQmt#WBy^h8; z7+Of+LfnZCY{I%es6IFhS%+3^#*KJA;6P)J6C#_}(9#R=v+zVsd@8nLHLk$RiO&r1 zC*xE+UK;Z&4#%Ha+oxe|Gj75(j7t%V_6PPu!=ND8iuMfNj4i1`E6z*e@OKt>I!;XN zE6hpa`(~nv_$1YB37dwXDGa$j$uG_P2jOkJiXZU|gyFMtzNkoIV=BEA2j|N} zLbsy*Ug}?f&r@MI2Jhqi-0x|8hcom2re35p0^9rWrEz#M{Y!9d`tRVV^k)U|hXVR5 zNxm^ms%?v+`-T9yAu>>p-;&UEsY+WYJ}iTmq(Z~-QqZ3knnG6$Z&gf3DtQmy3|*&3 zqau?xVou}nQQ`&L*5bMTVy(kCnCifGv4+JskJ#3axj>H1@$VJelN+#NWlYcrVqT9nH?i zBe|{_j|SZBScoq}_2t=c!Be;)35j>CjpuAA0ojzb+#bd*4>Jd4J*)eW*21uS+3t3N z^|@JBKil;#$P-~iSkULYK=&R>epJl2*f2F^fd}TiHU3e!etR}+#Z#%hwCOoJ>?!st z&82zTqWyL}Urzr2ei<4P*KRB&IlLsx5!v7rraG)-%)2l)@+=Inp#;F#j4z&2O_A8N zfBQ1Dr{71q|Ld2$0J?Lx7gqlZR6mGR08{`}08{`}01Vjn&j59%;m9b8op1mE002ov JPDHLkV1j3Z_MZR% literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/discovery.png b/gui/slick/images/network/discovery.png new file mode 100644 index 0000000000000000000000000000000000000000..28b7ea73f955d64e5abb4370665b36922b8a7512 GIT binary patch literal 1091 zcmV-J1ibr+P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<$w@>(RCwC#*;|NJRU8KJ-{@Fl(~Z)+JXDZ&A8IU&j3`UGf|WI6L>H5E!YE6u zp&}|PGsU6{m6>4_T_qSo(o%|iuzD!E5E4k(1+%L)S~^TlFW-jEVFr5$gPFbHu-E>d zz4luF@Be+@Ui+N7o}L~9xeYSFTLnM`Km|YrKm|YrKn1|SZFMazExpAj;!5nF&kn4| z3;4c20Z?Caz8AVN2GbMU6{bwagJ{Du{ZRsE;Rp=IO3c7XIj=)AHew0JXUwHIF8xt> z0P}D>_AcFf5*FhYj4Z`Z$e6ovWMZdaN-t|I&vgbK!(0q474I^PE?qMQmt#WBy^h8; z7+Of+LfnZCY{I%es6IFhS%+3^#*KJA;6P)J6C#_}(9#R=v+zVsd@8nLHLk$RiO&r1 zC*xE+UK;Z&4#%Ha+oxe|Gj75(j7t%V_6PPu!=ND8iuMfNj4i1`E6z*e@OKt>I!;XN zE6hpa`(~nv_$1YB37dwXDGa$j$uG_P2jOkJiXZU|gyFMtzNkoIV=BEA2j|N} zLbsy*Ug}?f&r@MI2Jhqi-0x|8hcom2re35p0^9rWrEz#M{Y!9d`tRVV^k)U|hXVR5 zNxm^ms%?v+`-T9yAu>>p-;&UEsY+WYJ}iTmq(Z~-QqZ3knnG6$Z&gf3DtQmy3|*&3 zqau?xVou}nQQ`&L*5bMTVy(kCnCifGv4+JskJ#3axj>H1@$VJelN+#NWlYcrVqT9nH?i zBe|{_j|SZBScoq}_2t=c!Be;)35j>CjpuAA0ojzb+#bd*4>Jd4J*)eW*21uS+3t3N z^|@JBKil;#$P-~iSkULYK=&R>epJl2*f2F^fd}TiHU3e!etR}+#Z#%hwCOoJ>?!st z&82zTqWyL}Urzr2ei<4P*KRB&IlLsx5!v7rraG)-%)2l)@+=Inp#;F#j4z&2O_A8N zfBQ1Dr{71q|Ld2$0J?Lx7gqlZR6mGR08{`}08{`}01Vjn&j59%;m9b8op1mE002ov JPDHLkV1j3Z_MZR% literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/discoverychannel.png b/gui/slick/images/network/discoverychannel.png new file mode 100644 index 0000000000000000000000000000000000000000..28b7ea73f955d64e5abb4370665b36922b8a7512 GIT binary patch literal 1091 zcmV-J1ibr+P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<$w@>(RCwC#*;|NJRU8KJ-{@Fl(~Z)+JXDZ&A8IU&j3`UGf|WI6L>H5E!YE6u zp&}|PGsU6{m6>4_T_qSo(o%|iuzD!E5E4k(1+%L)S~^TlFW-jEVFr5$gPFbHu-E>d zz4luF@Be+@Ui+N7o}L~9xeYSFTLnM`Km|YrKm|YrKn1|SZFMazExpAj;!5nF&kn4| z3;4c20Z?Caz8AVN2GbMU6{bwagJ{Du{ZRsE;Rp=IO3c7XIj=)AHew0JXUwHIF8xt> z0P}D>_AcFf5*FhYj4Z`Z$e6ovWMZdaN-t|I&vgbK!(0q474I^PE?qMQmt#WBy^h8; z7+Of+LfnZCY{I%es6IFhS%+3^#*KJA;6P)J6C#_}(9#R=v+zVsd@8nLHLk$RiO&r1 zC*xE+UK;Z&4#%Ha+oxe|Gj75(j7t%V_6PPu!=ND8iuMfNj4i1`E6z*e@OKt>I!;XN zE6hpa`(~nv_$1YB37dwXDGa$j$uG_P2jOkJiXZU|gyFMtzNkoIV=BEA2j|N} zLbsy*Ug}?f&r@MI2Jhqi-0x|8hcom2re35p0^9rWrEz#M{Y!9d`tRVV^k)U|hXVR5 zNxm^ms%?v+`-T9yAu>>p-;&UEsY+WYJ}iTmq(Z~-QqZ3knnG6$Z&gf3DtQmy3|*&3 zqau?xVou}nQQ`&L*5bMTVy(kCnCifGv4+JskJ#3axj>H1@$VJelN+#NWlYcrVqT9nH?i zBe|{_j|SZBScoq}_2t=c!Be;)35j>CjpuAA0ojzb+#bd*4>Jd4J*)eW*21uS+3t3N z^|@JBKil;#$P-~iSkULYK=&R>epJl2*f2F^fd}TiHU3e!etR}+#Z#%hwCOoJ>?!st z&82zTqWyL}Urzr2ei<4P*KRB&IlLsx5!v7rraG)-%)2l)@+=Inp#;F#j4z&2O_A8N zfBQ1Dr{71q|Ld2$0J?Lx7gqlZR6mGR08{`}08{`}01Vjn&j59%;m9b8op1mE002ov JPDHLkV1j3Z_MZR% literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/disney channel.png b/gui/slick/images/network/disney channel.png new file mode 100644 index 0000000000000000000000000000000000000000..1fce4c0abe543007ce73affad1d1f96e003f35b9 GIT binary patch literal 1428 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/e4.png b/gui/slick/images/network/e4.png new file mode 100644 index 0000000000000000000000000000000000000000..a057842a1fcb7b932cbbf311acd414d2dd2ae7bd GIT binary patch literal 1124 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/endemol.png b/gui/slick/images/network/endemol.png new file mode 100644 index 0000000000000000000000000000000000000000..82b37a45f6ef9227eba4fd0f2d0ffa741f5d5032 GIT binary patch literal 1161 zcmV;41a|w0P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=4@pEpRCwCt*?EXnbrc8i&zLopl}nMP2o+>bWiy%BMp+ivN{eM<(ej5>gjy10 z1D1g)VYIJMMo`o=WCf){lI=#(RMKivR-pkb(^ZTCVR&{rG8^|=cm_;*Y%;;-A_QYQC+=U&*Y|_-!R2~KNl8(X&sKb#MgM+Yl zjBiIPHsNc0jQ6m)-&jBqREK(;hhy@XKN3e{TC{g!1)jmHeaYCM5(|DlR^v0w&r|qp zAL>H9f)8*;e^hM^f_6Mc7PnR|BJFHiJconc;Qfjlg$qypXzx0R#~S?2B=_eMO5 zr?DstU)SNsJb5@2Q!0T0_hCYY{=@NAhW@t1^Nl(7t;Uns7G5JCx)|@2(*lmbyewlk zW$ACsbMH-YUsC`-j+e@* zfMV8tgDv6ydR$<8@JR+QQx*&OPO46qJQ4@u{s6pvLIET2eSE!|5Uw?ZUld8vmH@vxoEXVfOT-$J zur(sX?P)x;;PgsXgk~k47l+xlM;ltc;EU^bVqL$P*u!-fkat+4jxM2LPrEModJm3;)`w#=Ep@w_y@j-v)vUq z(H$S8XU(5cIjT*R)JEfVOqZc_UWu~!!%`*fI}(hFBfx*P{-I&wJ#=t{#K}3*+QZ|L zh!YlswN*S6PSV0K@0}$K*H}0#F*s@@-sgL=4F~D?s0I&Y40QezLeNu$G z8;jVZD_rS3sfusCQ~|YQREn~Ab6mo$ofN2F6RtA(3#>hYm<<7<%@ISCjj9Iv-{C<9 bIQ=^S1xw@>0*jvV00000NkvXXu0mjf`=%Tf literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/entertainment.png b/gui/slick/images/network/entertainment.png new file mode 100644 index 0000000000000000000000000000000000000000..c1dcd7af0fc26564383ff6bcbf0d1253876c3069 GIT binary patch literal 1319 zcmV+?1=#wDP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=tw}^dRCwC#nOSU9WfaGMowgLTwpJ|)MW{teYZXwd#sz(FMKK1_L5&(r1Z_|; zByMPYQc{euackX(M6rSkQE>}WB`6WCXboV~x*%YILeXwY?LxR>!&uLN?nqY(HCcnvrNw5h8|7B&DkX#WDBISjy$I#4S` z;_ENqpa_?Va;@mr0KaI|ey=`Ymmo}6ek*V{@U~29Qm$DY7XotvENa%4RX`Q+ly(3- zC##kj)z#{X19TQ}67Z7yYK?e@GHt+KU?`#yu|O`Bh-gPBck-qF7L{Es6|VyBv}NX* zV*rzk!Y6`Lt`YU>$W~7Ts1Vq49atoL@_<>u!|GoGbSwL!(QOl~DLUQYmFc90p|fbfS*jYJ?gAc-#G0!m==vj zrvZ;yWXgeWb-KWfM|>OXGg{#`)SV1-K!yMedA}2QT_zk8C^~t-E6xcqC&xnbeXq35 z2~3Vl&E>y=&7QT`cU9hRvTn?`9@ImWAeto^*)eGvaf_Jm^ z<~Lj4cfi*UL+vu8TF_@&6cd^P^X#1i8qnxa6kY|uSgU=O{db4XO}3i%DYw>2oh}R3 zIZl_zf=PCX8qZuVyE=S+ye)RDx}Ucz)B>+25&(c}Wx*j?Q3!l9jQkb{ogv#&r4icX z-#RC;4Zt*~xs{HszdKK~T1VEKW)-re%J-WEV5N2C32RcGAUtFmB z-0OH5(SbNadYuh&b)a(?Hbnx3_XOFrJ0vq+HuMC7H8{-vgfL)#2!MV6V{gpCBe+@v zzq002ovPDHLkV1k8`HAMgb literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/eredivisie live 1.png b/gui/slick/images/network/eredivisie live 1.png new file mode 100644 index 0000000000000000000000000000000000000000..b501f562ca6802a792c1ab56978fd2b2668b199a GIT binary patch literal 1388 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 R5<~z1002ovPDHLkV1n%$AR+(& literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/food network.png b/gui/slick/images/network/food network.png new file mode 100644 index 0000000000000000000000000000000000000000..e5f4c39a092d69e4e6138999056630c18ff9bbbe GIT binary patch literal 1400 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/france 2.png b/gui/slick/images/network/france 2.png new file mode 100644 index 0000000000000000000000000000000000000000..82c1584bc837ab1b9591fefb9b7a673745bb6910 GIT binary patch literal 733 zcmV<30wVp1P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;V@X6oRCwCt*<2d+|Q!ciwZJ@9+ISf8J9v zG&E!~qiie}Z)s`y*CnQ7pslTKuqX)_1!}MY4OoSFScZ>zBw#+4qA?t!j;`#lUg@;&)Hz9@l zA(JY+ELH-BVjEW^Y|C*8UFgGAtVTC(MO=7fm>CYY<4gS8brCNLG2>m{2q@q<&V}aFSb~$-61(6--U!%(i@&-46kBlu ziz7hhhJZU6&aV$gZ{vBwek^2?D+ydk&9|W=F|S8wV*Yuo3zhN4jnsT&YTlTeZg3bJ z#S2V{I$=%X+N;P2xhCMiF!r0+m67%;@itEq$ik5*kkZb#M=30?1U!hKcPgWMyo>FT z5_3tw={N`IOxc_9B>IECh!eRZ;2;hq=F`xEXSj@oVJ{!+I5iPL@EXo!l)laA!M$ja zOYuogPK1)k>h2z6??i0HiI6~7hHY?yq&O}Fq|fwv{6{Do2j^#}Y*#|tr6YK^zL3VZ zVkO{fq`RgFbg=F(*Vtdo68I76t|r>u9cYb)Xe3hTjWu$S1-fH&B%WRC*GX_gRD^X= z6BJO9$7ZO2?@8g6JA^NkA4}<9dwNu#G7JC6oR0_|E|Vx~g-aSshan P00000NkvXXu0mjfaCAiO literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/france 3.png b/gui/slick/images/network/france 3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f723b7b0a1a5343e6c047bbbbff0e1b45dd87fd GIT binary patch literal 749 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;b4f%&RCwCt*-MCyQ5XmC-#2F5%TS1!aS4ktqZlTN&5Tl%oo2&IZacD27FLKP zmlO*-q6{e|8yn@4g@s#om`u}1GLv%2WyWG2b$VmeXnfvxo_cyu=e*}V-}#^O{LlY9 zU#Y*p-$=H~;rw`8Tif4$Vl?{N+uOh85`ZDt0xU)|R$>~K;(ZYTn2JU;#e|yzfUJGZ zZ3tw>X~Yt&iOJ5w*gy2^K`GAwRNyq$W9AV0SK~{b0T_qvnYul(s;lGq9TV^*LZKUT z@c?xJ+^f6-(2w3&$)8q_YY_t7xQSMDM0rt6{t~tXSG>wI2V{lDMr=YAK4L3oC+(fF z^1CnvM~gs$slCGse8Bkdj^K+5jKNDx!X3OV8UQD8_@V65kU8>p;6_rn z9JeDRJ`EBwx#fV=S~HUuqNfGtB0Q>#yaV=NTc)l%{4O4%b~v>_xdGUU*O(mfejUe> z_Tv!>h1~(LFDbX+KJFDQACTS)c1DJ$0)04936YH=XSUvR7FN-#@$ z2jhmg8w=5uw2eni(EvCUcl^{Y2H`!={I)BYo_7GU`hE%?VZ$Kfx5PVZ@htBg@GBuR zBcyI89^*|Amyye_Od8UtzZC0G{EI%T$h zc?@=iUr)H9ApxY>Ktgn4(r0qfbU;=VJq(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>jY&j7RCwC#nR`suRT#%V2nmLgN?Eo{vr<_m#wI4vMJ%*=$(ezx7ACdI#I0Iu zt*DjQqFQK0x|O3FR&UW|t(FZbvos=;yg?UTAtNUikvFXH?T@~{?dr1egmX#+?ZOw*VIdJwPt-ljECl zDqoLrzVm^#z$ri*@G-D2-Vm@-8- z;AZ`vuWx<>wgS%sHvp#_-)91M0j;F0PqFy zoKR4qx(1m@k)p&dV6wv7dBAL7v7SXzQWfyE&m6OXYG7c5H7o?Ch;%hMkh)mw@)Yne zkgq6J2$UfKq+?na|kg8VET8ya{y6xhAN7 z7jRg=e{qcA5wTXIZlCpis}#@?iwOX{4@>}dD~y%O&c9N$$Toa{DILHb>9;=bC5={MO#J!OBLrg$SJP!VVwZWBWxZa z?3g;iK0u|H9|4EN4O}OaAw-z)dRk?@`gZ~gM6w!w021F2TtksuaY4jeev3Yew^ zZ2-18+EakXM4OYOpa&K20kTwjG5=mU!ZIrw^cbEz&u1;=B2D-Zr=$Od0`gU^cC_^e zHYpkMSZ0zXf3m~s_lXh0T#{({3{%EC(BbVX`JXbu#0c;j7iG)^5#l+( zXh+-0QO5jS<=sM;$pNmna*Z(}MqXYM5ea?`yH%d*XxkQLv3?%=ca;MiClxKJsxVBg z4p=XRhK#UVB?UDDgT(<>TG?w-Pz8Lda;BqgRg}e6`_y~L*<(>)&#y$1Rv<^T)^nN@ z4D-pB;!6yYmSymh6yq``kPmpzps8sV(P@)6U*hOD57_CbPX;cvOuQmt95O*R`-u3Vy6Y#+;VNcOXFk; z1^Wg2Hr+!E1?~f;heDy!pj7yPCi0S*H!Oz~L?#=XU+4&{E0kMQ$kbYN!aEfQsy6@%xG4l?f&L#U5uW ztu7ODY|`y>G4O~`vQ=vxW=|f;2e@RSQrK)@L=?r<3U)2=bOmPrGn5o#{|24Br;Hg& toJPn=HYzT!ksZdpB>eyHa4(m?1^}GuT`HyK5K#aC002ovPDHLkV1g{dt}Orn literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/funimation.png b/gui/slick/images/network/funimation.png new file mode 100644 index 0000000000000000000000000000000000000000..11260597304a00e6acb94e4e23c3bf83e2dd09d9 GIT binary patch literal 831 zcmV-F1Hk-=P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;#Ysd#RCwC#*jtEKRTRhZ&p2L2iA+blCTZFQ4CWypO;Zq!va)C_yFK`z4}w9F zhKLE_1rs4i6hwmx@sB7J-Gc-}$YN|V3rt0AD$`JDAjP!t<@d*xDkUf63scjfz#KRKMIr47wh7ijfe3h{)}%B`r#zbR^|^!15PBi35PPa3X77{ zfHbNZcjF5j#3X!x3%DWR21nID*$>z`4XV zry$soV`CI>JMKYm46PKl5)<(oevV4EU}{uzA!^y1X5EYjaT8ji-ZS_RyHexksP=CF z_C!X@lKk8h0$)|)&f*9Bp6iWS{N*IqBZVAB|H$&!P=5j2lh{1`k&b>{QOT@8S(V3T zH}+R@kvxx8u0M%_PgK-68b<={KGdS5DFJllCWyO|cndn?t4n`Il4%OP2At2>6H&p_ zcr#!+17cu`9D>*IEM^8+&+HAuFh8oO?>9rS2IKL0 zUbVp<&qi9eHHlNXPe)}xS(eV8#+QNF9002ov JPDHLkV1nhob5j5S literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/fx.png b/gui/slick/images/network/fx.png new file mode 100644 index 0000000000000000000000000000000000000000..563e8d8e40be5be0ed50d751c18e74eee98ef839 GIT binary patch literal 1162 zcmV;51a(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=5J^NqRCwC#*;|NJRTu~G-;BpGlQhHb^T#(FiNV(#T9u$nus-&N$P{cVMwO`|NYZQG=O3Y}VRq ze`~F?zV+QtQ&(4)-i&6w9DNMvV?ZxQQ@LDjMkkukg&T1OIx@8VqMd^Fgn6COj>oas zo6v8>Obo}ZLEEU+?T6QKCN9Iy9GYeLJTrbCT9euKWs1_&-pQ5B#U(= zb0%SG75aaJ0q5X}eYmKVSci!PbcbVG^1c{DYS2$;MjKv824~`@D#W{ko1F;*;M$zS z!_U#~*hfhnhVSuA0o^M}|DJ-wzl#@}L!9pq5v$6q88_3?txI%XdlCx8gw^f zX!NJmpxcJA6(hJc1{Wm+^RYg8-^s6T^Fye>yOkma=E_ZWI?64M(*5Mf{n2ja%MuHdMrOa3>rtb&+ zK018-di;?*>+vHFtuc2Bme#SyYTVXnC_EzRUyjfAql;?^NoYx){-KIZ1@rHyV~>g5 z$px-Y`qv$#PdEsca`CC={QL+--7BqL3|(T?yA)$n}e2#uuv zb0P}NWx)1W_!7LDj1R_)NK0q*FatJ6s@w>M==|`+GPc-Mo_DFTi&N(N#Ho_TqRJU{#e3K8b!u z14WO$b<*Axg^oOo300bx^Zoe9Dxa<}U{L7a1Nbm=yOm6ENhA=#uPOc&m>!LdI zLwJQX5i?Y3bywmMTo^UF)~FiIEx6etb-5)n)LJ+s%5W9@Q;@PxDuvM+61Q|5PKtI5 zzKjCHD*O_+T!e-3439uX*p|E;en+O@QHx1aYq-T_nZpZd9bLmM?riG&Ypj=}j{$uQ c=;iot0O`-_Iv~`_v;Y7A07*qoM6N<$f-bfj(f|Me literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/fxnetworks.png b/gui/slick/images/network/fxnetworks.png new file mode 100644 index 0000000000000000000000000000000000000000..563e8d8e40be5be0ed50d751c18e74eee98ef839 GIT binary patch literal 1162 zcmV;51a(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=5J^NqRCwC#*;|NJRTu~G-;BpGlQhHb^T#(FiNV(#T9u$nus-&N$P{cVMwO`|NYZQG=O3Y}VRq ze`~F?zV+QtQ&(4)-i&6w9DNMvV?ZxQQ@LDjMkkukg&T1OIx@8VqMd^Fgn6COj>oas zo6v8>Obo}ZLEEU+?T6QKCN9Iy9GYeLJTrbCT9euKWs1_&-pQ5B#U(= zb0%SG75aaJ0q5X}eYmKVSci!PbcbVG^1c{DYS2$;MjKv824~`@D#W{ko1F;*;M$zS z!_U#~*hfhnhVSuA0o^M}|DJ-wzl#@}L!9pq5v$6q88_3?txI%XdlCx8gw^f zX!NJmpxcJA6(hJc1{Wm+^RYg8-^s6T^Fye>yOkma=E_ZWI?64M(*5Mf{n2ja%MuHdMrOa3>rtb&+ zK018-di;?*>+vHFtuc2Bme#SyYTVXnC_EzRUyjfAql;?^NoYx){-KIZ1@rHyV~>g5 z$px-Y`qv$#PdEsca`CC={QL+--7BqL3|(T?yA)$n}e2#uuv zb0P}NWx)1W_!7LDj1R_)NK0q*FatJ6s@w>M==|`+GPc-Mo_DFTi&N(N#Ho_TqRJU{#e3K8b!u z14WO$b<*Axg^oOo300bx^Zoe9Dxa<}U{L7a1Nbm=yOm6ENhA=#uPOc&m>!LdI zLwJQX5i?Y3bywmMTo^UF)~FiIEx6etb-5)n)LJ+s%5W9@Q;@PxDuvM+61Q|5PKtI5 zzKjCHD*O_+T!e-3439uX*p|E;en+O@QHx1aYq-T_nZpZd9bLmM?riG&Ypj=}j{$uQ c=;iot0O`-_Iv~`_v;Y7A07*qoM6N<$f-bfj(f|Me literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/fxx.png b/gui/slick/images/network/fxx.png new file mode 100644 index 0000000000000000000000000000000000000000..7da506fec8eb88014825b3f9efeac11d0667181d GIT binary patch literal 962 zcmV;z13mnSP)%0h7l6)A$2XRM4mhiV$NinMGq|BU%It5iHWFg#<+~h!-UxdfA(2 zv%w&lyG`7^+-e?7vCKDbX1@8}+cyKu*#B+pZyi{cwTFl*Jx#{gIsj$vXNHL0jP-HO zKXi9@xBcNeK}1o7ub)DQQ-8aD-3JmI8DlG_#6J7YKM}z+%|6?&JY0sU;;MYGI6h%mX>&*XD~60zdM!_lhyq05+(kAB{#^{aj#>3djf{DpZ~I_4Vc1 zY_<=;VvqhtIOls)sg(3{k<*q0J32bP1K16KJPtYTr}T@F1SNp4ieXQL5W4^%7K^nJ z(SZWf^hcx7C4QfN&j2VqeWT+z4*^sZz<$>>ZAChr{`5~MV2pgnaUOWsJOGsE za=D9P3xOX1F1t+Xn+!Q7PMuZSeLWm|!)7AmV_>enpCX>n8p$h>wb`N`m zO8|X}zNJG$Lx)0{1B4Lw06g+=%J+%rV4nVzVHit7nFKlKCksHb0|Ntl+&6)z3d|hN z`HfH#Af-$dfXu3_tlZ*~bu>?zyxBC(?WJ-VdZ!@r+xQRDG}i(sxM(7}o=7B~wYRsw zvMlQ^fLhhN0f2|oUI=-yhK7bnCX;y$pvL2yzi!sUI;9#TI&AX@DTvu1O z;-4TO9*(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=mq|oHRCwCVnQMquRTRg6Gv4uz=A<}{OldMrtPSw%fMv#*_wq2W*u_2@*gU`#=QIoB+&sYZz>xv|QqAqtHsEWu zTY-y>@wqABiYoZ}O@?KJ$hDR?^!x;L%T04vz^_$MfbZu`Kzl&$An=;wcCBg`HOGs< zW?)jDG2lL6gV8qv3;~0B@6&s~o*`fu7?td(7Jir(f1>7j$D8+B<9lxbf2%#;i9s&4 z$z?yvO96ix{FT7V&gMtPaq`D$6W@CL8&l#%LQ4#pzku)Zw16uEyl;TjIhg(r0p3Z# zya2x+*f_?z0PX_%@{9pzgz!ZL*-U4*eVhm^9)*vR?7EDzjl(R+@OWwOv`D##|w z5{ke?wR?aA~^+sOq(T$QzN#*yc(%Yl@u-B(%;Ctco3j_VTfOFIi_3!bD zs4Eaux<;1_P;Xfo^f8%QgOR`Y$uS zwYkjr5v72EjB}plz*g5?e18s6ufadr;D1@J0%BaCC&PSgI=zGrH*R*aUY}c~_O5Cu z;34Jrv1kd0{w;E8u2Pau6Em!_IVDRBR6_v(kLbo{hta>7|K9470)-ngtT7EvAE=fB zlC(Atc!EQJO7;tCE&$#&##sN>%*pWGnv}k2)l@)&3s&d`s6{w?dq%{V)b6qLc}mbc zsv21!3qJ6v3%E!N9n_d^Jz2i92zXGzuud`LH{gqM74Yu>qJ-;P57mFx00000NkvXX Hu0mjfvkzaG literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/g4_2.png b/gui/slick/images/network/g4_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0cfcf9642d17e6be8ac082358f123f803062d463 GIT binary patch literal 1297 zcmV+s1@8KZP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=mq|oHRCwCVnQMquRTRg6Gv4uz=A<}{OldMrtPSw%fMv#*_wq2W*u_2@*gU`#=QIoB+&sYZz>xv|QqAqtHsEWu zTY-y>@wqABiYoZ}O@?KJ$hDR?^!x;L%T04vz^_$MfbZu`Kzl&$An=;wcCBg`HOGs< zW?)jDG2lL6gV8qv3;~0B@6&s~o*`fu7?td(7Jir(f1>7j$D8+B<9lxbf2%#;i9s&4 z$z?yvO96ix{FT7V&gMtPaq`D$6W@CL8&l#%LQ4#pzku)Zw16uEyl;TjIhg(r0p3Z# zya2x+*f_?z0PX_%@{9pzgz!ZL*-U4*eVhm^9)*vR?7EDzjl(R+@OWwOv`D##|w z5{ke?wR?aA~^+sOq(T$QzN#*yc(%Yl@u-B(%;Ctco3j_VTfOFIi_3!bD zs4Eaux<;1_P;Xfo^f8%QgOR`Y$uS zwYkjr5v72EjB}plz*g5?e18s6ufadr;D1@J0%BaCC&PSgI=zGrH*R*aUY}c~_O5Cu z;34Jrv1kd0{w;E8u2Pau6Em!_IVDRBR6_v(kLbo{hta>7|K9470)-ngtT7EvAE=fB zlC(Atc!EQJO7;tCE&$#&##sN>%*pWGnv}k2)l@)&3s&d`s6{w?dq%{V)b6qLc}mbc zsv21!3qJ6v3%E!N9n_d^Jz2i92zXGzuud`LH{gqM74Yu>qJ-;P57mFx00000NkvXX Hu0mjfvkzaG literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/game show network.png b/gui/slick/images/network/game show network.png new file mode 100644 index 0000000000000000000000000000000000000000..126bb57e39d7fb16cfe2677240ceb96e83e09163 GIT binary patch literal 1050 zcmV+#1m*jQP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZgbd?)%3PBDkzCs6fG*qpa*0`LocmGwde&ss8$t} zAe7L97Ljct+GG(f1Zh!1L=-_UiXx+jy)8+l(kZovGj0AC4mW4+g@!tj2Zp)#eBXTc zod5mK|NEaaY4LcR|G5QH6{w`7#JLOsKL7{WOd#rV&r*Mv?$d!7(CPBak?R{0O;@$=c{~^wN4uW z_$S++1|Tg(K2`$I&%>S#1bxKGly9=u*G2#yde}b#k9@>=sgjqhy|u9n?oyc>>mso% z;5~2>Xa;5iMe29hJVWB?qJTQ3Y#HB8tY*cs4uBYNSxlb|gf;jmP^W<-ffEJ>0|PYq zPx{=HPaL=;pBCAIz)0YZ0JRQ)wGt>!YtjUrXB?IYssjp)(%264H+~lerYIW{wQ69g zZ5-eX=(OSv6`_q&e?)K4nfz+K)v%cVuKK3{%Z!RJP1kk0uLYLam;nQosw)-u4Di87 z*H=n+fcskKOMq>_c_7zVN~U1C0aOCZb^qDQ-JnWSrLJ3aU#3i`*K&x-K1kV7t?w<8 zzzzUzsk=&`IYels4oEX57}DCV0XB>HM$7gC7!EW72Y}l^AyA$`2$ccTfkV0v+6usD zy(woOUn^pC%3QiKE+9Qn0!%U{e#;O-nMT|K7a?}p3P7U>?W_j56xgbBfQZUry8%c& zFb`M(Oa>}s>oB+?2s~3+J*Hh^Ut2k#0+=tdS`IvxJa*RhZXJA_0~U%DTYxrTjC>lT z1){(Ppw&qEO~5*Fz(E@Us0Dg!y@r$x-&GkN81gj&Oa$`e7m!aIa7{kjF^PQw zFw4l4MC}4F3fPgvXO6LKtN|d;$2K?QBhFa7&--$0tO8LFdq+1aueio+Ggy z0PF+6YhCuz^Sq9{vpq->ypQ1j3JH20Qp6>fGd%pB`*>ETjR2GaBUJ9(|L47vEdC~y zxKEPyyDJl~XybGXSfsr|%oVE%*lueEEJ(0RG=))(K3;Elv5#24zlHtZ{~rH20CLOP U4kPP>o&W#<07*qoM6N<$g7JUCO8@`> literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/global tv.png b/gui/slick/images/network/global tv.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2d133cc27413e6c7b5e6bd876d94cda7dfa486 GIT binary patch literal 1159 zcmV;21bF+2P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=4M{{nRCwCtnOlrbR}{y8W(Fx?2$iW4*SK~f6s2yVF%S42JeVRKw}x@)Ad$F~ zMiaMrARd?m4T_L4kv0)DWQbv^orso+1aVCeM(a`%mzEh1{ySOOb3WhsGJTovte3OS zKKtx__J6JQUu*Bvpr)pVC`*P@a&vR*%QrU!{;TUCB_$;Qq}4;CwFR~St^bd~>LUOT zfPCOGFg%I?R0CB&E1(ScK576o@VqB`fp)2u24?|Nfqz5v|3U;gA=NlwH_#LKHALU0 zKnYNkY9x3=WVa?{|GB_9phvCEkSCpim=Jym{0 zr0)g3l3psy?gSETZJ)&pfvMi&4+CeU_W>%*vpc%}mBhz8@NU)7_1&D0y!Pk7m%!{0 zL|O}g#=th|_kmu(IADl?0r=PqUhNMCv;@8bjsia^=7J{9kmZg5+kt^zzf53>3{VDa zHaov+;7!2XR<69*QGu&^@}&(c*6d%>=LuoxB8=chW)D&rik!oF!kIwm~8lEBk?o27r4C zALqs^v>^fL3ryESmjF-HUIu(Cy*aQ+VE0z_b`0na4AZ#H)c0iw%THD|X#Ac&=|KQo zGjZG(_)}z6F2ak+10DttkFCxB@bu{#v!U^pa?_{M^T_AQL^-DYjdu-_7QhCDQzH2w zCC@ln*A)smDqla9kuHT;R4nA; zPuabM^?)b9GR5Wq6*zn4n)z{dWdI+^H7i7RYgMCXnwb4jA(N^59EHklbEI`e9^&eQ zD&V4s?~^!lCo6?oBk?N1LM?a!&{fAx)(z8ncPfjX19a1Mq6(ZW!vO$i&7|E;`zmkl zSpum@Mi`-;pOv--bbIe}moHTc#b4e>f=(8S(I<$M9w;Q9s?C+X^Hg@8GsR60dCOo~ z^SJW7lLBRvv-Os7 zfPG$Dfr_YF;(m-|q|i~A4T1BjMJ`0?OwjEDi1cdvEP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=0ZBwbRCwC#*=vYZRTKyC-`vK@NCWLjrXj|F=Fn8wC!_2^D20Vxdm>@qhRD7| z4A&jPM34eJ#+6cUYQmg z_C05>z0Th2uKi#CwNFc>QZb&TWSmP&xm-To*Kh`=VJe1j5Wf~3+=|yQ9fMVoQNknG zpLpJZ)$yW}iRTmXF;?MuT#aJ|Cw~H8V>3P}IPdduCl83f;(P4EHoQ|S0uEzx zM*jkQl(=7n_cC-p!$L9MBWlX84+cM|1S2V?8dZVfS-99#OLp z&*4CgF?R&OYaK%e4B+>wXR9N#EXV-8&KmZXM5+_OcpUHJiAdou<&0m8j#?3LuGH)+^`W?t;3X#^TOO>3ccahYHwvF}BGjEKB=SnvDnS$K~j=73Vr@8db3*%}}?8US2rwg_ks6n{0R?wFsFow8(KwAW_zAFkzqpu+iP<0WJjq0DD?+f>BqMXL_nIeyRo$nTW{lbh0NPB!=N*{!SL+F4;fY9oT%=Oj=*Mj@P_-c_T?c=$zg&?8O&gBE%-Bj z{}JPgd~~dY{+`I~Zx&#tDy&tBAAT-6xaI$^!{c239RSA!(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=d`Uz>RCwC#nOlgJRTRg6=jchRQPi2z?B*>~OY@SJSr8>^S*cW~XdviDzvYie#flV^JQZ(6MOK1YV$=3DUb z?X}nbzWwe0UhBWsJ}1}L*T+DXJOf-Z05SkF05SjuvDPgdiAOP#*MJd_76a`v5C z%<0H;z%^=L60xt4s|UH*+4uDWfNNcdZL8)1)13abX^#WWarTqI=fHY-LEw*^-sKni zG_VAikcju?z$V~4V7##%iFm--dQTVdZRCAJ9RSV132kIK1;A9Ne`MNz_dE2$6~G(7 zfyny~0hbwlwtyUw*s=Qsz+~s4&89sccobL&j8b0{@Cxv<^sNf#(T)#}Xv3DpLf`^j zR&v^nF~A~cYZN~`0_<0edwD&Qd6oio2>_PpUUvPT>i#&e8z`E^Bf!=J4@ke+Egqmo zUR9F{foYKsdPhL@x%dS5#F5mqz^x+6wgho?$s=k^2(`J7of}DsCEyBRoePV-z-U+`7lL-QzC=U5Kx7Pt(_h*Q4AKLH`TWt{3xK+2vATlkOX@9;vi3|M7rv5oSJY+E+!2l0gv{->Uo7z?;st1^B?EDht@ha_d+{+2Y7H zglmi13l&PO+WDj65i8rPod*5xm(A`V^6+VCWF(B%0h_g;A`VbrtFpFB_ua-eQRnt<**bIzoFKhZS9tahal{%uyTK6cFpW7OFZ#`W;7hWF zxk4%alQwCW8{aG5S)g(}$P;?M4e5P4e*atMhW`bM#bTWqm>0u_g61q$T4j;UDJ`-# z@*_z2fuu9RIko1;mT;EvQfI2T_DKAX2QD`Uv11iH@D|+<06+R4L~_|5BiWCl82}jo g82}jo16TeT0EJ2x>f(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?J4r-ARCwCtnP;q2MHq&krFTR?5Jb2%Q4!E6MG*unS8UO+VhO1D13N~E1ym3v zfF?vF!~#ZR0Sm+q3U;K3qJl_~rqX-wEb9-Rg~@uB%i>-jagvjrojEh-%vav;{k{`R zCX@W1TPz-rcLVAJWq^H!_^hJ92H2?N>7;`1~jcd=PM#{W`!`z|BA-;9j6Ka5r!% za0_rN&=Gh5cosMjm<*Hvo>Ztg5kNLTP$Y1b*kP_MrY83R3CF$$cItlHfR7#T>7L7g zm0H3K*Uka@0w=g<&IGX6{utm~P3&KI0n`G<0rzO0Re?7&=M@>&)CS&Ci=nW0`dc0- z8LV05q1yq?frXB*^m%Q8&A>0Ybb*Qrp}%HXBg6fF0s}lez-rfgt8k*)EMTzxQW5is zH1ORnMw|`Q6F32O_+A$)?3@UoNSaor0TqDh5%+!x3#=ldGvm@4w2F?mBD#~5< zrH$9n&j$l98l3>DsGP@v5rOh@B7pQ4niMfU{t)|Y1*S%fzke9-&_E%jT2Q~-V@1>vx5%dq#ZTxuX2 z3%E|Al8)p_V7F$OO{)S7)x_TddKnS=>pFXZnLtB{(HIYZC9nWE75H1gtOQ&uc+U{5 zPxSXEqgP9Tx~$_gMKk!kD4C~JmK76HCNuyIu5u`(li?Q!viN| ziY>H~r^Svlfe(!?3&oXWwir-YAlOyST^{g-gnZyNpfhl%n6NU)EK^bG6yVo@UYBrg zLy%_-2PT+L%`~U3k{EzcdVen$0jbSifkSz;zaK4QRQC;(m6nW~Pg&^p~ zWs2QR>tjGS8R}#$s2tELSeLa66jUt97Er4IF93_w+$a;CdcZ42hCLo+v-N>g9bs5t zA+Nixs|<348Xsz?9ANmYs|BnGQ~F~W1(pK6gZ~49{>-31Ep6TOh-B@(wEwdMmjQSx zZQt0DxIkgGawa$D9K~lQkC$BFd^Pn8aFIaU$gq~w|0kJ(pQ`3kq^Y%GvLbMe_cV|( z?gVZEmgu^9L7Klr);bxOpUDC?W(b3aYMUd*Ru!=31%1D-F0ex?e3D@JjKxrbdvNSk z>w=q%5^FW}Nk)Qvv)bkgd6iVYE-=t%MY=#~%TDR7V*!A6VZ?anL#(+d2y>{}*%ny7 zH%Ay7ke_-oyp&+y44C2&E#N`@xpD{Upi0s z)ho;t8$_(R+81aTG1nw0t)nuZCA=~!_1!?2Daw4n0*W3b)GrFd)Lum^4<7g2>)~_7=3Utg{?En6G{GR~;d&j7doXqC600000 LNkvXXu0mjf)9(?j literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/historychannel.png b/gui/slick/images/network/historychannel.png new file mode 100644 index 0000000000000000000000000000000000000000..a854b5a101ce5c9506e8177e2a6fa69cc7c5bacd GIT binary patch literal 1717 zcmV;m21@yfP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?J4r-ARCwCtnP;q2MHq&krFTR?5Jb2%Q4!E6MG*unS8UO+VhO1D13N~E1ym3v zfF?vF!~#ZR0Sm+q3U;K3qJl_~rqX-wEb9-Rg~@uB%i>-jagvjrojEh-%vav;{k{`R zCX@W1TPz-rcLVAJWq^H!_^hJ92H2?N>7;`1~jcd=PM#{W`!`z|BA-;9j6Ka5r!% za0_rN&=Gh5cosMjm<*Hvo>Ztg5kNLTP$Y1b*kP_MrY83R3CF$$cItlHfR7#T>7L7g zm0H3K*Uka@0w=g<&IGX6{utm~P3&KI0n`G<0rzO0Re?7&=M@>&)CS&Ci=nW0`dc0- z8LV05q1yq?frXB*^m%Q8&A>0Ybb*Qrp}%HXBg6fF0s}lez-rfgt8k*)EMTzxQW5is zH1ORnMw|`Q6F32O_+A$)?3@UoNSaor0TqDh5%+!x3#=ldGvm@4w2F?mBD#~5< zrH$9n&j$l98l3>DsGP@v5rOh@B7pQ4niMfU{t)|Y1*S%fzke9-&_E%jT2Q~-V@1>vx5%dq#ZTxuX2 z3%E|Al8)p_V7F$OO{)S7)x_TddKnS=>pFXZnLtB{(HIYZC9nWE75H1gtOQ&uc+U{5 zPxSXEqgP9Tx~$_gMKk!kD4C~JmK76HCNuyIu5u`(li?Q!viN| ziY>H~r^Svlfe(!?3&oXWwir-YAlOyST^{g-gnZyNpfhl%n6NU)EK^bG6yVo@UYBrg zLy%_-2PT+L%`~U3k{EzcdVen$0jbSifkSz;zaK4QRQC;(m6nW~Pg&^p~ zWs2QR>tjGS8R}#$s2tELSeLa66jUt97Er4IF93_w+$a;CdcZ42hCLo+v-N>g9bs5t zA+Nixs|<348Xsz?9ANmYs|BnGQ~F~W1(pK6gZ~49{>-31Ep6TOh-B@(wEwdMmjQSx zZQt0DxIkgGawa$D9K~lQkC$BFd^Pn8aFIaU$gq~w|0kJ(pQ`3kq^Y%GvLbMe_cV|( z?gVZEmgu^9L7Klr);bxOpUDC?W(b3aYMUd*Ru!=31%1D-F0ex?e3D@JjKxrbdvNSk z>w=q%5^FW}Nk)Qvv)bkgd6iVYE-=t%MY=#~%TDR7V*!A6VZ?anL#(+d2y>{}*%ny7 zH%Ay7ke_-oyp&+y44C2&E#N`@xpD{Upi0s z)ho;t8$_(R+81aTG1nw0t)nuZCA=~!_1!?2Daw4n0*W3b)GrFd)Lum^4<7g2>)~_7=3Utg{?En6G{GR~;d&j7doXqC600000 LNkvXXu0mjf)9(?j literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/hulu presents.png b/gui/slick/images/network/hulu presents.png new file mode 100644 index 0000000000000000000000000000000000000000..abad0a88974356eaca00c6c866b0c6911887afc5 GIT binary patch literal 751 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;bxA})RCwC#nLB6{VGzfEcb6EVf(Q!n6(U3n1r0_73lSCULO_X4KB%8~*HgmEWW|#ZUyBywre^`#0?=iFg z-FbX_nJ^4VGqR){o&Zlk%Fzap&*v*-WP#tJF9FTWkQpE+K7>F!Fk4Tb3WdVoH=qM} z1$+RC^82XC4`*A%pCT{{oNve*AWwda8r#%l0+s@+lx}UKazF@7sIf0iCScakefLSw z6R>au{7g+5j6n}@1L%&FqZ}|L72_W8##na&*b7X{{sC|tm{jx50S9GXR?6NP;Jt(Y zH-TQU(GHA@t+JYT1?U52WZon&00c<{bOWbj#*P4&fwRDMHFf~lp>#_O0`>!Ylx~G1 z0Rup%(w#5}I0md%x|2ZguQ}kFaT6bvTmt5dwPS`ZaI`;S>}fShMJ0cghOaJ3@M5dx z0DxiOb)-e^mkuq8-c}`G1lSq#>UKrsoFuUS^2)lJKrVKqErnmhoh& z!B7or25a>3l8(8I5hpz{i`Of8osz!+yB*K&4}hym*I7j@zXc9CR-z%XH!oq8<#4l1 zZEoR?oD-7b_JuS^r+{5XvZ`Q8oVjg`eFB~t;id5q*eJHPC*1fra2L2guZ;MAhWrN+ hPk<-D6Ody3835gFf9ga83NZix002ovPDHLkV1i9HHYNZ7 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/hulu.png b/gui/slick/images/network/hulu.png new file mode 100644 index 0000000000000000000000000000000000000000..abad0a88974356eaca00c6c866b0c6911887afc5 GIT binary patch literal 751 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;bxA})RCwC#nLB6{VGzfEcb6EVf(Q!n6(U3n1r0_73lSCULO_X4KB%8~*HgmEWW|#ZUyBywre^`#0?=iFg z-FbX_nJ^4VGqR){o&Zlk%Fzap&*v*-WP#tJF9FTWkQpE+K7>F!Fk4Tb3WdVoH=qM} z1$+RC^82XC4`*A%pCT{{oNve*AWwda8r#%l0+s@+lx}UKazF@7sIf0iCScakefLSw z6R>au{7g+5j6n}@1L%&FqZ}|L72_W8##na&*b7X{{sC|tm{jx50S9GXR?6NP;Jt(Y zH-TQU(GHA@t+JYT1?U52WZon&00c<{bOWbj#*P4&fwRDMHFf~lp>#_O0`>!Ylx~G1 z0Rup%(w#5}I0md%x|2ZguQ}kFaT6bvTmt5dwPS`ZaI`;S>}fShMJ0cghOaJ3@M5dx z0DxiOb)-e^mkuq8-c}`G1lSq#>UKrsoFuUS^2)lJKrVKqErnmhoh& z!B7or25a>3l8(8I5hpz{i`Of8osz!+yB*K&4}hym*I7j@zXc9CR-z%XH!oq8<#4l1 zZEoR?oD-7b_JuS^r+{5XvZ`Q8oVjg`eFB~t;id5q*eJHPC*1fra2L2guZ;MAhWrN+ hPk<-D6Ody3835gFf9ga83NZix002ovPDHLkV1i9HHYNZ7 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/ifc.png b/gui/slick/images/network/ifc.png new file mode 100644 index 0000000000000000000000000000000000000000..5a35c0ae712c776e83ef50602e392cdee9c6f62b GIT binary patch literal 979 zcmV;^11$WBP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ31+&gEkVf>Sm zd(K{K@4NT^thLu#`!t%(rumEo<~bI^z`(%2b^eE;A4}qS6eIX4)p2-u_%8y&5-!I< z$ooViXE7gPS3IACld-P`OZ*kDR?zLo^;m{8(3g|{j?eKnHsZac1;p=56({=$*2Mi_ z5LX9Aad3j9^|&oF?;+p^bq#OpEt1>uVr-h)M(D%m&lIC zD_GjWxR=B=h99^OBS9k~CRnWZ!tBYJ9kDIX*zo9qwfJNc=yDKj08tjNS zS%w}=`3~HN=Vy`$PPU#hc;YEEi8LDr-XP3Vr-O+d4t2%5`f`how&^MKyW{oaJ`k+q%&%p$&s#q^fw zG{XAEGHoM?aZitUpTe=Jv1Xfqt2zvYA13726;*Zx_$I>OP?W`8cY#g`-kgx1l1PLE zK?g)g-Gn!AMYjp)bhFxxHxoJ=aaIf2D%_E4yCB?VYt>@tpT@eFbQ!ttYyAIpc%I|W0RZ0atTKz+Oilm*002ovPDHLkV1iUa B%6|X= literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/itv.png b/gui/slick/images/network/itv.png new file mode 100644 index 0000000000000000000000000000000000000000..99bb506f218f1c3172fb2dec5c38af9c9472b097 GIT binary patch literal 3794 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 IM6N<$g6PK{?*IS* literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/itv1.png b/gui/slick/images/network/itv1.png new file mode 100644 index 0000000000000000000000000000000000000000..6a945805a3d0513ae8069338b1d33265dfe7fa70 GIT binary patch literal 915 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/la1.png b/gui/slick/images/network/la1.png new file mode 100644 index 0000000000000000000000000000000000000000..274dd0e45f4d3f67ce3e061c48c64b9f421e842c GIT binary patch literal 740 zcmV(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;YDq*vRCwCt*YN|Mv|nIKarFy<$^6*Zg!!B3pY}e z{KB3$>erg>_xyg(_B`xUPyIU2_nhZE@83Dk z`JC@5=;`S(k~KQlid9uraXh;?{QiNid>U(PY#d$y5mkicScY=Uz%+~v_rIY7?P$d# z+z;jH906HsF>0^@QwN9}AMP*2#!&ViO}K!EL)F2;A!@fAH}M#?gS`CTG$p`$fLo~i zR{-q8^YE|7rL}0r!L$Roj`|4k@6d+NS;im0Z4{&tz`cz5n~nBjCQ5NOLcP^^k~RQW zu_DXZRxH91{LEMeqo@*h(gI*RHf0%m2=nl?PkC_;&s~MOqyd!RT*PS-r%qx*k^t%= zdWj}X49nZnm>}#)5|0PQJyk55SeXh{)(mLveY#jBWd5hZ!F(}5RB`GC`T)Xnt& zoq4o#CP^c73ST0`f56eOY`xAXugA82_6UQi8^@Cb&=odA+3H5HuFv|cBAvK|ojJI` zuVR{qx#}7kP@P3=S=hxD^^?^2jx`at;0^h9KCYx_jouvIx=Hf0lkEp@H@2k32@bR@mBukYGjthqa3W1scrcSx6F?l!(J-~) z80KPY$RotAp*|UE!~Sqp=sg-M(|d3-31dRsuiz0{@lx+eQ1ftj=z@`cI$UUk>-PXz WZ*S>$K{;Ol0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;_en%SRCwCt*Rv35d|u0X%tZ+D*1ulganCUN(JIlDyWMjUF3x# zD$-4$7N`*<7J;8Av=tGQWEVxCL4F|Qw?-EUi<%!rel5GWUF@@Pc&UBQdB4ty{lmbV zInT_Q`Jb6*{_{*zS67$5i~*HaY;JC@#kU7Vz8#&_G}hYM+E@ZIVjyPVIZVJ9jKYw3 ze-~}Igp>FQKSp^mXFy6!LknKU$X@Ioj`vgWYLs2Y*Vuu>_3B{1I<-3iU*TsgFEjZ6 z!tfyP5DsAK|Am0H_$B^&tuPx$@lMeR_!65k*x$tEaDr*@Hoiqu5efJqv3|>852oX> zaEOoNt&~K(h$BTK;B!2m(sn%-#~|*Y16S}No{h3{n2Li%Az%sSrL;YSjfv-%@Ot9; z99E@lYZg}IO~8ZrB&F^B634g?-(WwEB{acK+)ml%2Y4h;0#;Col&K67Qy9 zY(f=Y$d`=B=Vh@iNE9dmBeyL zgJI!38&1IF8aU7kn1~aJvJDlqGbs-O9<6flpJ6=CCdv+0IIAAYgMexR37gRz8UUV( zQ{b#d#{;S%;8KP4c9(eWc{m-jp;G*r2LZ<`sM8k0sRwU_iX2$wk360S0l(vX#yann zobW!b!7OgWsl0T+_Kf!5CGv}73%s64SMf*2Hb2T!2yMfyl(y}0^zFf$7>dz}G$!`+ zdl}^Q);tO5ELqdNp`*lE-NawI<9A zu#}|X7@YD5zO&lS*D5I55*?pYM*i-t(f7W`{GvsK=3-X^w9BV>p=c4I9xM&#)?SB! z-^WV4Rum=J+qU#{E!JlO`|%9kFOn24Cz4u%h<7UxOd>w8B_#4f{92EW*867YBGyHk ztov$gobHR0p^4p~BZ49)aYpw|(9uR5hMM~N?QlPR9RCae%&nMm)7{{O00000NkvXX Hu0mjfp1hTD literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/lasexta.png b/gui/slick/images/network/lasexta.png new file mode 100644 index 0000000000000000000000000000000000000000..195a7c943f34d909583451dcc21b58c05084e3fe GIT binary patch literal 1195 zcmV;c1XTNpP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=F-b&0RCwC#*=eYiRTKu`=c;wh+3S!~nP!AqgayqS6b=z+{jq*zBS=sgg_;>u z(q#Q9DjJApinvW?MQK?C31;0=A&@MGv~03L)2_qy^rQF0$LXlm?bp3$!C{|opZ%@9 z*Sp{KuKj(du2d>%&(=XZw;BL70BQi#0BG0N38qe+y1y|u;Yobe)`D+rZ2S{|0|Y+> zJ+K_B&v68zpaDS}n( z#_W7E8gLjsZZBo; zRM=YRJ0w0^l0pL95qJ<+7RFwRLD*I38<-T?SvZ6pg)Lb_k$t^0uDpicVeqf%>y{F} z2kZC6fcc^PmN*!Pb1@rpF#$c}bW245Wou45GZkbF)?!6+^XtNH73~S!j&E~)Kfb}| zVai+SKPPj~%JnH>>~)xvz7YXv9S+KG+p?B*+0cQN01QamE1z=NE2H{pf~dzYq4L-& z0BlQpb*O#?<|U2Z%;ekidkKpIVVIQurZD1|N&tS27!3{>yKs3@ zVq>T`IP~k2K%T1tz>jGcR4f9%OuHdzH9LARE_00wXv;IMsp9_K1wVHtEtlibLIo4r zm#s%icco~rs3wAQBW$Gr@EE3r@_jetwuU7$JZJrsXq@uhWU+)xlwrK0~c`s}! zD)@bwy9M7B1g#^^%l8wKUMmX#>?!z|m*8)Rj_kp*0RJ};Y{{uM5 zVC}0E^~(1((T)x|?5r*LUWKz#4o@$fEt(1eEXK{*;rgTlyo8asC15N`|K5B?MZAX= z*0MUgUOp&o|LfpWDwQhV2P{af-;6`!v||=M5zpo^xoADJTQA_ksO_LC0QJNJVOFIr z40HNr!3`C^PfAda1e}SuEKFUN6q*!2WicEX=2lxvr^d#{mTJ!e(?Y-I(6cUS(SWBz zt7_$M9zF}@$3*D5M?;#UAv(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=eMv+?RCwCtnSE@IR~W{Bt&bU-DGM3148vqTrs^Xtn~@SS=>*-n&4x^(Tc(=? z8Ji4Yk!=!e@ex7|;Z3#{)!If;y0Wckmqm?{MI-B0^^stWTKCWO$epvc@B847KJA?} z=YF1Zp7Wk_-PgI!eNLmQtE*|u*3>>ECnwj{HU{Vblmva!p-||KAMNA2R=_G?8}N8T zVSpb1N`YxWidfL6u>k;3ZP@U!kMEuao~id55P^+0e#;2jzW{szQ~`T|GGH}uGpGQ( zX8dzu+CBy3%I^eR6oc}CV|qUxco^6mgeA~X5%nxTO#7`WU)JPL0H=Xs)8WqjZF(DF{JWNI zx84BI0+?u?w>$Ndfk)-{0G^Y-!HIUR**;TDUApm`0jGe>`Xquc8P%@@vQ6C-U?VU_ zO8#`49-z>P>~59uzegwJ`2y#%G~qI^-}K>4 zcnWY3xD9O4u8{$}u6ARA&gQ!jKwoF9?*e}UUn*$Ro%#X5P`?1oHU4#AXASIFEdMC_^0Q@Q-hKZRuCK-Dl_(VBO#0;>}FV^;C z!TDY9%N0FuQmM-FR%%-utTZ|uXl|ljWcu4Lpk@JcfKfnuAPd-~9pWmG2t1}#8`XP) zdKNe=fO3FG6twMP-#kCtV0%aW);RT5=3OgM(W8H<{51W>4?qR*skER(QMTuaGT?2c z&6NTz7nq>>sS?mz=C?|uO9xDbdS2g*6>9+Y3Aq1Rl)VyjZiHr;OzyT0E$%6pu!wzA~o-V<75y4h`tYf#3%zRZwL&y8_QG<9!QI7 h?Ef8(rjgr!0|3Ux4VBWw85RHl002ovPDHLkV1jq=LJI%@ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/m6.png b/gui/slick/images/network/m6.png new file mode 100644 index 0000000000000000000000000000000000000000..dc59d9913683156373488e9f82cc8c0680737de3 GIT binary patch literal 978 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/mdr.png b/gui/slick/images/network/mdr.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0366aa3817722546ec64391d8a37e5baf04ea7 GIT binary patch literal 916 zcmV;F18e+=P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<8c9S!RCwC#*;{B_RTKu`Z%kr(Nv*}Iq+UQNg5ZPIjzzqi78FDTZAgV8BBF@k zlXykM2aB)u!55WMywHfg2%@4OS}3UC1q@!WplvN^y`ZsCj5EIc1G~edCX-Af&ipX! zGkcwV)?WW!``_!#RO;_AmB(5L}eBPe1|<)iII#c@ijieDqLO!(h7(0 zDSpGrxFG(Q;*VKmWUW}d5AiM5;jDI5cnU)~1y-So^>`!ptvC%gVN=HKD4uf-)?za@ zMpU0};qM3BlAuR$11?G6_eAke&%Nj3``DJ@Ol-h~@qai0S8*fG#s?%jo3kZ;Ehc^*KF%s{E>4$C z3BHo8w4r$3Z6Uo{+`ktm;-k*#?%Uoy6NS?5+FK zP87kH*p8oby(jm~K)-$L q;QJEq6jXZu4faH^M?hEOp8){bNSoXC@P=Lh0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;%t=H+RCwC#*k6cMRTRhZ&t#>BqDF+~pTs{oW?2@AXazkK^kh^_LRy9)Xc9DG zX@3~e^hH!K5@RAk3u+>!9zv4np^`L92+RUQ0!f9brXo{Qxjpo|aJt;F7ZEyh*2~>% z?|shQ>wDJv?R`#5tya^Y?GpXmDgYIL3P1&*U)!b7*4Eb7_$=IttMCK%;b2*U@9OIM z2S5{>j}@5KWNa5+2#ivez!vQ2BY3z6U*O>~0$7bD4Shcq+NaQy_8XX2CIHvr#fI@m zF`;2jN5MZ)3K5JgZx~yJ?YJfW92|)-!p#4<4z!?F1aN1e-H~#D%P||D$3KQeh2SUS zd(`k8e#1^Yk5{lMWwQZ~C5zt1Ni4%wypC=76ZJs|TZMvsPJA#O-;Uk2zOxEEg+w(8$g!hc1$*JDs1oh@p> zz(N_U?jvOeH26>9ar_+r4xG!A8-(s?#1(U6w{%Pj18r;04xL%-{sjFNp1{)q@GGV!wcp3u%yg2h Qp#T5?07*qoM6N<$f_^1-+5i9m literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/motorvision.png b/gui/slick/images/network/motorvision.png new file mode 100644 index 0000000000000000000000000000000000000000..90d57f417f05495a060f377841fecc1f3a5446ca GIT binary patch literal 838 zcmV-M1G)T(P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;%t=H+RCwC#*k6cMRTRhZ&t#>BqDF+~pTs{oW?2@AXazkK^kh^_LRy9)Xc9DG zX@3~e^hH!K5@RAk3u+>!9zv4np^`L92+RUQ0!f9brXo{Qxjpo|aJt;F7ZEyh*2~>% z?|shQ>wDJv?R`#5tya^Y?GpXmDgYIL3P1&*U)!b7*4Eb7_$=IttMCK%;b2*U@9OIM z2S5{>j}@5KWNa5+2#ivez!vQ2BY3z6U*O>~0$7bD4Shcq+NaQy_8XX2CIHvr#fI@m zF`;2jN5MZ)3K5JgZx~yJ?YJfW92|)-!p#4<4z!?F1aN1e-H~#D%P||D$3KQeh2SUS zd(`k8e#1^Yk5{lMWwQZ~C5zt1Ni4%wypC=76ZJs|TZMvsPJA#O-;Uk2zOxEEg+w(8$g!hc1$*JDs1oh@p> zz(N_U?jvOeH26>9ar_+r4xG!A8-(s?#1(U6w{%Pj18r;04xL%-{sjFNp1{)q@GGV!wcp3u%yg2h Qp#T5?07*qoM6N<$f_^1-+5i9m literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/mtv.png b/gui/slick/images/network/mtv.png new file mode 100644 index 0000000000000000000000000000000000000000..3912b5eeaa4390ffd2c18a19a362cbcdc730c16d GIT binary patch literal 1049 zcmV+!1m^pRP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZLM0^_ zMF`nL1O`C}SytF((uOi2D(az(UepqrNa!M{QPahTW=hhmaeA2b!RF(5?&tWO^|J5l z+xx%QUbn9_K0dAz_4oHL!ZY|!V^qQfIpC~U$t_^uHKwE(bB>*xUtV-Q=LJUlGNZ`gv1v7=rFN9a5~ zh40bZ0$%6hZG0QxX4F$;09yIojL$GO<1~DTS8-R70caIv8vIAxgaLejM{zB#Z-ovh z0&T%4E(?p1QKmzV#&w|wwng7&EX2FrECKIh7Up1n8L{3S<>HWlZOPaT*xQW~uopw& zdu)up-mv#e%FKNMui&km$vqV-x(R@#*bvUmX!Koyhp+(0lv%S9pJQIm)GiIF`L$aB zcnQzu`d$ptuD1W%lJ??|oYS$VRgO@*>E$v9t>y4=cj5-07wcx#dicYw1i!*LiDJtx zV@@1?6gT6EL#*G5HA%cN5N2<7VfHo_ z-4)&!!O((eKabTo16M|0Cej}#>psiz`3BpgenEh@?r^%KwbFd7O5XXs$=F#@Ziw>g zoVcg-W)cl94+%M`8vw}O=b8#iZa4Nv(3H`pq`p6-2A&LX2GG|H0DK+qyeO zEGM?GcC^Xdec`@`c~m6*?L&9nrdLIE&R$K2G@ zJ1zlbWuh?eOvW#dWC)F?>)H;$k`UusvP$F0?H`-tkxy_u9OW-XNla8a)azmQ50)8U zfwfWJlid2GWKId^C+*&d59H<*5`ZjrKQT<+W69Xl;pP1s?Ohf2G&8BsO(dk$>;@-y zKmvqD9|`mKceEdmu^BlN`B!N9G!wlDuSNZYR&KCU!O(%^pwH#TG6nW$ln3!;q_k28 zYGK&?TU)uYPMX27DpHch^uuN5y%SE-ylw@c8qH1Wvpcolc0Ykqa{JX3*7QhYO~s`R z>YBmD=Rs_yo2`s5%4h)p?*=gR4Fh{{}y8mjv`Q0l?b0nM)!N zs^lv)Lbu?)2(H=&!0+L59;oxJO-U5mt_t&Zm`IKNQ|I2NnD`ZTJ3eU?!T$#Uv$427 TyZl;_00000NkvXXu0mjf?YZ<) literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nat geo wild.png b/gui/slick/images/network/nat geo wild.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd896fc6ef39056dfefe6b3e06325a083583fc1 GIT binary patch literal 1273 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 N002ovPDHLkV1jfi1qA>A literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nbcu tv.png b/gui/slick/images/network/nbcu tv.png new file mode 100644 index 0000000000000000000000000000000000000000..72dc3409e4c35e05b01e6633777faae199aaced9 GIT binary patch literal 1147 zcmV->1cdvEP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=0ZBwbRCwCt*=vYaMHmP0-)7onrHfK_HOfq+V#~t%P(g%68zmJkTb2+KsSrVa zh%Q!I8P%7fMI*Wxq-(39glT3(*4hPIH0)}oVnnGeTGX;@>%M*PIWQc~>O%W2?~4P6 z+4Ic2vorsB=KuVkIW?tH$&p-+?yrFw8XEdzm}Ak|*Ul|1E&ux;9yP##KaOqKfw_r& z96rV`_y~1X=K*~vk79Q6{xJ676|^PxYw;CE;Uh z7=(*ZixN5t`i#IzEGcNqc7F`cuQmX#$IsY|?YIul74+MTpKw*qz8jxlA%2KH&E=SH zIRH2lYj94ypMnpu6~E{DeiL&zJ!hYXskk$-HR7de0AOM-_ABvb&eo1Ua>t`1yk>gA z7cN+|4}Vo+I{bV*BXA%GKzp*-;gKt3 zWgnK}?VKv?E{FIjCjci0;T5UDVK^<+;67Z6v=yb7^>L&0d8J>8ZHZl87qNdu*bhWqN&sjMu+~O+9E<%JkDKDC)FqO6b)|DaHfAZV z!Inn~yD(f_0)jZ(dn5jz8{x4t6rj)zJFAHVvryNKm+@dQdnpNd5)YUWkK7Jl67@P| zF6GDu2gfrrvO?hj>4$@ws22nWObQ|NM&t^uNeW$c0A#y6GLoK~6VJ#4uqMv`(zpT> zypetJm|cwkWaXHI&96>KaDUS0?5Jx)-DT~Ig8;|J@9Sc&rV|(E)skq7PvcS|2l+Fhl8KNn!-y?3=lTq^@J>c zjQrq%5J;mPydGar=>W_*MB9es@AZ8cYd>Cyr?x*XK=P&LNdG+k-vA~v@;~AV!&LwP N002ovPDHLkV1jfi1qA>A literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/ndr.png b/gui/slick/images/network/ndr.png new file mode 100644 index 0000000000000000000000000000000000000000..cf53154f0b36b936e5016e066774280b87b1cfc5 GIT binary patch literal 787 zcmV+u1MK{XP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;nMp)JRCwC#nN4UDK@`V-vE2lXQmrjTJotf#A2&q=y{L#6EA*hzyC((pDvD4K zD(Imqh$lZFA~ih;)uVV2q$q-d2qHyO>PIf37Td0HZ*kZw#mx0Byh`psQH{ zm{9wpSpo1?VgO`7p$7QawM(3ot2d=kJk zPzaf~9Y_K0Y3&;@?h^yDKwg(U8EpkV03*N_U^(za{k(I%0ggNK_B%dyTtATZ1%Ni7 zMQ`<*!+=2S2*iM2rXPrbDPSFN1vud_tJU!hfDYgwaLX3}#*E$p9FuOTI~B6!3czEB z&X=`a+;hWS;50C3YzG9AcR}!i+R-Y04}qP)8qvEf`$Bxr0_XMHS7Yz;5r8z%0}NO3 zOR4<`+%)#hAq?7}Ewx8mh=?H9B@2}0C$K6hT$4W4* z02TGkd^h^8kbT`^Y^Q)72COWw$;VQ78Sor<8^L!YuwPl@kg*Sj`0f_I{+4| zJrcop8!!NzG`1lD7{)Gui^kTivihF`u*&FV+CBnage>4sQTr9J*YsB#y<8mKamHNr zAq}2Wz?%X-IhERBrLPjuYp9zr_n!n_0{5MHdx5nYJ7iL0H?Upy5g!1^R(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-g-Jv~RCwC#nY~WKFcgKqn$CzvfDQ2qz=mK#2nj{B{0$71VCM~Z2Zj!%Do_O` zMt(M6WkS3MFe1W0BSolj5}MrWG@R)wwj?lA z906BZ2K&BWY6rA{GhiB+0WN{vsw{zh;AF`2Q($Y{31|UrOM6e+3C02CRh?iQQC`gn zMp^kM;6c*~Mp5~5U>;bs^yvY6WhEeK&39ws-{=(S1f#g-CnNEc)}CM#ln*fx6N^>{ zqoDjK$bC=9lYots%8!Z;u+yYAl zCf^)X0;kUb_bHw5857%-zbMN|FpU#FBJo>7-$vfbOMD9?IpH7@A0{Z@FKUu?ibd#z zyCH3>!0Vu-%~_Q17db(R`v990W-ZBY7oEHm0e`6u4SsHo85aVwR0k2|H3&%K1Tp2c z2ne09qOH6p0RT6^0`LsH0Bh39hp7Gk9j-XO2LO3EPP$Q{_RRnQ002ovPDHLkV1gi! B#LfT! literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nederland 2.png b/gui/slick/images/network/nederland 2.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb4a472ef6e5a879d24c15433accf616be5aed3 GIT binary patch literal 708 zcmV;#0z3VQP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;N=ZaPRCwCtnLSV2P!xtAJCT^6{SzI4k%1NX4~>f2BE$rpO8F`b?Eob}BO;JM z9XgaWpehV7GO{34F|f1~6AWD|U_fe1+<{~1D!RT2PJHcdC@irHVK#nmTTy@2+Tb+0w#fv_vrt@mL;SugTDq+lKO%QkXxW#EP;S{ z(KH13;4gt^z>$*sb>ad4fF5Ai1_@CTFa@m0eGWLd$Jj$jjqim7SKOj$V!(s~9$+BE z9BOsA5LIAIM+81s@va~E37i3CjSHm2^k<|GK$|8oxPmKO;;@Au!eQ!f!`7%5<`Fkd@{5bL-_EOp)C(=8d7O2LGX{E?JUH6 zorbpCq`80x35fFw1E8uMs;FIv8#&d+cEv0Oq3U33?tANkhR49)B0z1H<=KZv7@HVnQkbINk qXh|x<72tCmia4$Qci5%H<^KSMjCUOTDODH%0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;)k#D_RCwCtnY(KgQ51*2T?3+mjb%DP5#kf$AD~fCV-y4zd|Sp?MYBGmg;BG_ ztZSiQVUw73!&WhgiekW8L>o<1Yz)|1NFEZAu{i^W!|VojtjWI)L;%Z~2aE2rdD106oUm2DAo1xLRvDpaZyTY&(Isa{LbXpsw8p zyb_^ObskVod;@R-_y}x?A{^=>6u$=e^gM2_i=P%?1o$iv zJOklcwE?&gknnu*>wzZVH?RTtBi9cA!vdkfK)4lFVoZi4zPE(44bUaWTY*{S z3B$mIK)@u%&bR|;FC!jcxw3aE2-}n=v;d<5VUy{rtI`lE3E&iPPo2*JyG49GuueoB zH4ttJgzdmDu{Q(HB_ZwrrVNC0aRZP59tF$*W0KS+fp5SeU=TQ_{&!s;hgJ zPi+VK;yMfT0jG`a1+Z5j^co09ObI+=#E+T2&I9-3UJCas7=C*xo{&}v5};_rH;VWs zsTHjFT(wk!{lH0M(-5-entt=n#D~2W7?72o4TokE4pZ{x$6bqeu^P-vGJK+Jqf+;$ z<@h`BQ)1q!cvl-D1M+Jj_$4o85?(Is!MWNI3W6{K+>kXuPZZ)^0`MVt3I literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/net 5.png b/gui/slick/images/network/net 5.png new file mode 100644 index 0000000000000000000000000000000000000000..8d6fdfe2f0a2103f9d41ee7b67516877aeb357ef GIT binary patch literal 556 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 Y0ID#V0Kq-y>Hq)$07*qoM6N<$f+N2+#sB~S literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/network ten.png b/gui/slick/images/network/network ten.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd8d2916b27506f9e47743f53f7a64ede673af0 GIT binary patch literal 978 zcmV;@11(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ%lwBT_ZX`-Y43b5JRt6Ck zM0d2irDbS$vR;a6pg?+v2(w;Fykr?+Jp>jLU39V-CyXXf5A#28kfY&rzSDPb!DfA& zv%meV{oiY?z5aVws@1B4Sw=Nuke;5Nk-XN4ae4j?g9kc5Z*Olo05|}-4s&rD#-iqa z73{)RypC5|WzZol`p#ku;5m%Oi?{|e(&pyBQCJZ$9%-8p*pHlwHR!@3Jc+*=^xK4Y z@h}d>LOg^UaUs5FM-R9HUtt3}uw);T-&_6;P@VV~pJPtD0Wcfy;GR5>bgQ`vx8n`; zv`Yw_gw?ngk2PVu<VXZPQWE8qK2>y^YJ{El?{Lj_GH52WAMyOyplMqQ zn_is~cr%Vj%wL9y={JP?>fRrX_i-j(ja}m#d}mz7sK#qbl>`THWy;_4!UcX$SKL=&w5j>B9E7eI+Zsqro@UCxrS!no0%0CR`sLKRYWpDK7g>UB9=}x-;==Cf`?= zP`i^<_m-JSri0Bgx|sm14EOIy{Pw5qOSYvo$|w6<-6^=djD^sL(Mt;~f|f+DE-M$9 zk6W_u7a@1z)-sc!Rro$}+H6^$T(Pq3Cqh#UpZY%A#4(p*D$Zz!6QN&mE=^p{PdJpGdIzB4G&>~NT*I`1o#T|Gi4Da7$BA&+1)CrS{ zntYKSP?PN;JoE5i&Iz{0Gd6||!m&6jUNbpiw7~EMN}h($07*qoM6N<$f=*bu A7XSbN literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/ngc.png b/gui/slick/images/network/ngc.png new file mode 100644 index 0000000000000000000000000000000000000000..5eff610df6bbf0b873fa05c339df14734249efa7 GIT binary patch literal 1716 zcmV;l221&gP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?I!Q!9RCwC#nR}3rRT#%V%VO8MLf)z!u;bP!sqa zs0iE+tOLpexj-7Q8^{1I0=fYUfK>0x0)IGfMIg!d#sPJl3*Z`H2e9i*jfe++1WKMI zfK!2v!F?+5jct{HuYkrr+XM{o`J+G!V7q;~08axy0qcRaz}rAqU^=iDXbLO^o&uTx zHv@M7vw_Njw-|T<_%Id<9L|FW9gVtQ3#0&b-Lc604Sn8L16u-_z-t=5A1DJ%1mK;fSg!0ATpqO~#~hEEZ<((9J#a}tkB8j#!+}A^ zfTCV!2uf98kZqIokiqV18Zbgn$^Z%jrGY+y7aoX}%JISV24LqIj@x~T_N!dXN5D#V zurzS52DjF2SIOUq2p0y9*p?WzzFhm&7m!xE_;mt1N;)M0f5!?y7zHklVO-)V+RFnK zfOhioZs1{eK2wTxw{J0jxbusF)d7F|N{i0~Z4b~%{#TMBOQjF$OI9%Fc?pC2fa-zU zBLJ@euLGTdD+Fn?yN>55Z1sEofKkFd?Gk|Y_Ue4177%pg?70YLU9|SEX3gpMp zJ_tddyWkwT8KGHKUA0LtuBC#yPaV2bZ`tPa7D3;(My+^74|O0>8YCGycb*RbcDaLX zfJN?PAq}V?AZb8tIXu~MI|3l8179kzmjPEAs>5h?0{F-4%D(eAjozbHWJ{sq(xh^b zqx`qV{HDMVcdjQeFbH2$fyeZQuI38^1gw_*#+V}vkS=k+eBeFla=-mr0f&Igy`K$? zmnxmSjzp4C?AttMUTG#(%)KPhk` zN>j#}u5Ncx8{};mrivQp!=xy|vGsN9S?+od;6~s9YlG&F*#JDD_;nZPEx<^lL22oP zx={FBg~2!F^9|m20~)Bz*=tcoGA8*sJYys7|}G3EVL@5lk3wS9~s zGspBe4VVWkmv%)I*O3bFedi(y%mZEozBAv?QoWlQt9z;i?SV=BdErzJD;VEG{J_B_k+N=boXl<5lyq zL1q_bl#PKE8dAcL7jLbQrKi-9r{Oob=D@YUr}DO}21N>=O;M$84U?a+2B@OJf9V}b z&QUQasjF%4vi!~ikmuVqKFQr#7;qlr@y1|G#L&h5BD=RI=(8m7+Uh_lL5@DsgX_Ki z2#iNB8+|TP;r=qZ*!SM5nLKb;Pl5QBu84`@gkqokWWk9b}ZaJ!^{Eb@ITrA=a90Ei0~ai&Ms zN!kXPgv<@7upW3W*wIBks|~zlj7Nb>b!?KMEg5)U7k?~k4>0P%qc z)zy8AoMue6ih8oSqCb!n*IlQZu^lijcQynzw@+!S$05f4DXycC>)K=%H%b0y84-@y zFDEYmM1*kcS&R>pnsPTQl9iy}O!dGPA_cgh|l^0m?OVo2k+DOoWD7 z-A$BMLoJqu3sOv<#p}3}Ct@_Xs6|J5RC`mPkzaWCD{8y+hGfNTQ{X{$b?Nlr>rNGU zUCOjJM<9~@X3)q!YotO`^N)p5pXpBzz=i(?3;1yXfPxOdzXJe5thqxB-n#?<0000< KMNUMnLSTZbb_-Sj literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nhk.png b/gui/slick/images/network/nhk.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7a9b56993b3450e5a444bc9d49b9b2983e2a87 GIT binary patch literal 3254 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nick at nite.png b/gui/slick/images/network/nick at nite.png new file mode 100644 index 0000000000000000000000000000000000000000..c1509ba8d93bc56a78109f891bfd61214f0a2be7 GIT binary patch literal 1415 zcmV;21$g?2P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>4M{{nRCwCdnQ3fQMHq&k;x#nT3e?CZ(25NTibP^?L$C;nCK5y1y3pVTYJV6} zB1%vrC>l*LL2)-O35qRl1>7jbKqD@Qid03=Dndmih=_;_P=D~8WISHdbh*8kH@P`8 zXXea3^Ub%s-*>Va8yjg3N=r+dn$iJS06YS$XkzXNU;@w!=m~TNz5(6?wgJn5`sTb} zWo2cv_LHFP(Fha)r9d9ABQ`z>moW}3xS`3-kv7F zAmGVh?!&-rU@K`tB86+00QUpyfop-kfu|f>uNJH(%}Atp{b|5yYD0t?U@Wkg3_zkC z{^RhV{UI=#3_^z#u6-7;P7MIq4UDqgC&_!90OTBM0yqxHKFHYBz==VBf52jyfLlC)#W4ZA6STt! zuwNz^vB8CE!*KhL0{6N3mHLxBoohbuwJbAQ|2Bo4)-brsQ~m=uEU^Cw=R}lU)h-Ig zUIK>M-s}la3rN*qpwOHl%XeQ3bkhuHXG$2{CmoK^;I+_`19%4bAog6HJ_X8nhU%I934Ej9T?f( zQ6S-Ic26=kOJ5KoGKDjPm)-~b6wIjrx@zN*fO-UGvmCe*xXDxB6GW9s?Ja;lz(zMv z=?P3$g>O$XKVo;qUZVu)`&fQ(UXV?04miQ3hR#*M4?4=nfa@K9NI|rl02(ANH|x1a z0#8U~lObY*pS!sw_SXVS6=Xf|9q_yH9Nkjx z@GNja!03qCcY*D`p6-9%A#j>ql7zBuv7$;?D4A*)y-TfZc15VQQQ&Q9aE0V#OOiSH zGCq=QK2rItfHcK@O0H@j@`ng>6#B+=QQ`VnUO!r25XUvKeit=o7%&ESUhQbq{acSr!yJKHDM_+v&##{zR){I=mO?cjyBXm@7eGF?2-uqTlsWLwpqf@NO^paSz zlJ){mdOmQfYQIKy*BN-g>uzfW3Dv(AID-S<8J6lSBgc0P@MA!ZGNvR}#s9wvp!yb@ z3#i0Swi_EsAYE zM*++PKJ{L0;1`P3hB|YIU*rNi%{ST{sS-dhv%4#jREs8>JH#>F46rsyy)k9@cL1PP VIZ?I+dWrx5002ovPDHLkV1ja6cxM0r literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nickToons network.png b/gui/slick/images/network/nickToons network.png new file mode 100644 index 0000000000000000000000000000000000000000..ad98d9221e625268a4a3fd5144a10a0f70276639 GIT binary patch literal 1495 zcmV;|1t|K7P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>T}ebiRCwCd*?FwpV;%1 zV8CA33jG4ywi_ETwF0mP)3F#^WP@8^ckG0Zuq9Sua~y#m@hN@^aD%YV#sWZ72cGGJ z@AKUoJLCTtkklA~mG~q2;}rZ4k6|G;#flO~togkFuuV2~U%dYirefcO_<Xwb}*P8h7S*mx}9~;OG3^4Oga)EX>%7tbIiI7S|hq z-U+|uI57+BsGW(Uus@cTZ2lq~AE5h{6yyKmDfEmZx)%W02VXS;fbB36vvF-5Qt<0+ zeqhpZdNzL_{{Abedt^Sd@i|_{W_jluji>>;B?7MhmBrO!o8!@Fhr?6gZm9A71MqMP zY;&V)KyzrXsZIdwozH-z!r3^e%4g?Adwd-xx+3Y>Fc$b2Z)0#KuBYvv?{#hdIb4EW z!y=a_B3tk@uE8-$(QQkLYTanCImMg>0WaLEW^7MV?SnsS=sah zdHG~aiso;L7nbEbupppK3Xn*2UB8=n;ZAC03!nd375YMd7U z2WH;s^=5(XlY;|t>Vr#jC>j<|jmG2g>c!#c`PtNXJd3v6Hz)MhZr9-xoR05uZ?~ku zOHqHV3IACEa!AD*56bwKjVOXEa%j0fix>3g=1{XH@0%7bzdbp-Fg=8m69qk^0uPOs zdSH0rT=7s+;+5oa(T3Le-nLrQ+j?wdEt~I%5?oT~2v14K55kNMTzHp) z-0rA7kowZMkpL8JY`$lvBDYj?{$7Wz#@%6!=R5HHdl6S%Lxuf21AunhDs=c*MR(}) z@Od@%bHZ18hqILb@1ZPpMuaj)q()7|mz@c~VryI8d*IcKU6o=vzsh&?$Wa*HiITi5 zqH0D7olU@BlR8VnFk`X~wKPoYb*^tepAQQw%)wc;D6*))qCJ?-P@gnHhehH(o)h4= zh4fJnXAN(Pt}l$+i{p;CH$}4Ae4JbHdsRVgu8gv5x1Q-HJ+h&T?y52NMH;8?RC)iX zL{OiSYnzlfYI&74;x_}J-R_KTSf9;F17vj$J7tlzq)`iOGyw27Yg^o{B|U?&>HI88 x0b8Y$t*MjdxhphzPns9w@E>b?_rIzAG60i)Q)=M^i#z}T002ovPDHLkV1kwJ*j4}l literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nickelodeon.png b/gui/slick/images/network/nickelodeon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad98d9221e625268a4a3fd5144a10a0f70276639 GIT binary patch literal 1495 zcmV;|1t|K7P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>T}ebiRCwCd*?FwpV;%1 zV8CA33jG4ywi_ETwF0mP)3F#^WP@8^ckG0Zuq9Sua~y#m@hN@^aD%YV#sWZ72cGGJ z@AKUoJLCTtkklA~mG~q2;}rZ4k6|G;#flO~togkFuuV2~U%dYirefcO_<Xwb}*P8h7S*mx}9~;OG3^4Oga)EX>%7tbIiI7S|hq z-U+|uI57+BsGW(Uus@cTZ2lq~AE5h{6yyKmDfEmZx)%W02VXS;fbB36vvF-5Qt<0+ zeqhpZdNzL_{{Abedt^Sd@i|_{W_jluji>>;B?7MhmBrO!o8!@Fhr?6gZm9A71MqMP zY;&V)KyzrXsZIdwozH-z!r3^e%4g?Adwd-xx+3Y>Fc$b2Z)0#KuBYvv?{#hdIb4EW z!y=a_B3tk@uE8-$(QQkLYTanCImMg>0WaLEW^7MV?SnsS=sah zdHG~aiso;L7nbEbupppK3Xn*2UB8=n;ZAC03!nd375YMd7U z2WH;s^=5(XlY;|t>Vr#jC>j<|jmG2g>c!#c`PtNXJd3v6Hz)MhZr9-xoR05uZ?~ku zOHqHV3IACEa!AD*56bwKjVOXEa%j0fix>3g=1{XH@0%7bzdbp-Fg=8m69qk^0uPOs zdSH0rT=7s+;+5oa(T3Le-nLrQ+j?wdEt~I%5?oT~2v14K55kNMTzHp) z-0rA7kowZMkpL8JY`$lvBDYj?{$7Wz#@%6!=R5HHdl6S%Lxuf21AunhDs=c*MR(}) z@Od@%bHZ18hqILb@1ZPpMuaj)q()7|mz@c~VryI8d*IcKU6o=vzsh&?$Wa*HiITi5 zqH0D7olU@BlR8VnFk`X~wKPoYb*^tepAQQw%)wc;D6*))qCJ?-P@gnHhehH(o)h4= zh4fJnXAN(Pt}l$+i{p;CH$}4Ae4JbHdsRVgu8gv5x1Q-HJ+h&T?y52NMH;8?RC)iX zL{OiSYnzlfYI&74;x_}J-R_KTSf9;F17vj$J7tlzq)`iOGyw27Yg^o{B|U?&>HI88 x0b8Y$t*MjdxhphzPns9w@E>b?_rIzAG60i)Q)=M^i#z}T002ovPDHLkV1kwJ*j4}l literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/nonetwork.png b/gui/slick/images/network/nonetwork.png new file mode 100644 index 0000000000000000000000000000000000000000..60831a77ec7922979497dfad885ba8f82dc7d4f9 GIT binary patch literal 2085 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 HlWl(kHaO(U literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/orf.png b/gui/slick/images/network/orf.png new file mode 100644 index 0000000000000000000000000000000000000000..e9deb388ba60cf8e6a2173755692d7d338392216 GIT binary patch literal 921 zcmV;K17`e*P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZhNy@Z#VHCP4 zs6|kT1VM`|sO%vTE{Z6^UW-7Arq@tW(VK`sv*=;jZP9n-aJX~txpzhv-uc5}=A8NN zch2|CIsfl}W+Ikl5oSaQIdTCiDk|)L1Q_aDqCdvAwzmHX07d|}ff&#?#1oJMbOB|+ z_gp0_r6Jn+lO*PT4zMIEVL_LD3_?$W*(%`E{twUrJOsLd3BY_I6cgM5dVoA_+>%xZ zOgHfJ0Z0P*9(IaHx9BsS>sCV%-%*UeZ zf#)u@d{9X6q?~ybO~5PQsl0A;_&i}S_Zs1n1n>apl&!Dguwfh*#MgbTC4jrY;-DnB zTkBr}Rw?~rU>`6JXw>-PjEC0uSa2$G+_XUP=bO2MNO4;ZW&M69-fENy1)(z!K0zLwtfQc^lH-TnJR0QY+&I50J z%xPnp3x8b+nt-T-25`e~?O89P>XeoW3xG{&a@>z}NN|SMKjq=8U3p&wj1RczJfIf1 zl>w6fnGOdOih{Z){j0z+pvJ+r4tT2x9xsfPBw4~YYKdzGhWiM#1(+? vRa8^E+@8Yl&(K%(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<#Ysd#RCwC#*jtE|RTKyC- zCi)(nKLzKNup3+P5A^l*{SN@zu&qHO;u^di^A5a^UDy|gnv5*LZP+v}0#Lzz%xORX zhLid6;iM(_V+w11j)3Ic}3(GJx#kIb{zejLD9r+3y@nwK@8CK%-0xzw` zfq1SGzqz;>=Vs6UjCB#hX&6`ETZ8%8JBvd9MWkz0F2Vf)&Z=1N`AC;hw8s8+g#Ocs z0`M&E%5)#&NxX_{GXOT!SZ5u!U}>WJ1uxdIeN_PfXXD2BJ(EPiLR=s7RWaUPW8DL| zH?>_0fNja)7sPxRk75t5!%sLPNu?9;J8lS;9>ROU;0^h~hpXd&TjTi7EI&mc~iirLV@74q0p%^c~*NOh7INYA_?8XAJ+7t%iK6K;P z0OzCvTN@^s$Fm~(hQj9Z0!-yJq4Z!mL9_E zq3aAU7s;~dKStv~k702g0FJ{O1^SVUOW@1|0O$<>76p()wE$>MLMfMn*)ur+Ycu`H zk#p@eY<*C`)QgW&6?O(-W9Y&uHF}uQ?0;7htz-2fpa*ZpVOHS8(EotvV!pISxtbpy zt)|Z1L2Bxd}zZL-N1Au;0WaawD1V!ynyics6iM$CT3Q9+Udno!w&0_IAjIXEnN^FLt?zk}za7zWt&Q?G z9JT$EAh*=}`(wU0#+SqJ-gsxAAdLh;PDDBr9-5VT7Um_oju#3NCe($ZSJ z*tJG_?TGTXb6hx8Di!5&xjn+Yy8&C_E8+r_=KMQTY~8nnGgs%g!D@MFL`lhQUPM$6 zzMbT4a15tbufll>lyImZv>QRv@Ad=H*=>%4lqR{(X>q?f0)WHuL8L9~s2bsm)$Zi~ zq2Qsp1%1dws>fjPz<3U5eiLj0&;+0fKofu_0Mk?c8vu#~;l-C;fS~{Y002ovPDHLk FV1h0c^IQM` literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/oxygen.png b/gui/slick/images/network/oxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd16ef5c86478028144f89875fe724f98c5fdd5 GIT binary patch literal 3757 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 VkI>5)J<|XH002ovPDHLkV1gkbU77#@ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/private spice.png b/gui/slick/images/network/private spice.png new file mode 100644 index 0000000000000000000000000000000000000000..bf590f7473e35fde9e0d1f56853897445387cf81 GIT binary patch literal 1358 zcmV-U1+n^xP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=)Ja4^RCwC#*>|YcRTu~G&wJH|wrtq2D2%q2N_&8nr45kQm5R!!w6MKs5z!!M zlSNsyMeLR%8)&vIGb=O95F2L0mS#iK%F#dH7fx^YQb}|J-v=(|_dCBczu)Kip69%` zvSP&wtFkp%#jOrN9e_FjbpTdrYg>J2Y;1fC+u<90hYI$=Y>dLacpfY8W9m0Scg({Z zxE%9w9InPE8NMUl!q+%F8J%%i`fiO&@Hi&oOB|Kg#=+=;g_w&Ao0^)Y{Q-b7q#PQc7h(Uj`xKM082zvVw#T&E z5IDE!1cS2i@p(T0{lju~0fW&Cx20~Kc+PmNizTT)Ev(*!Zp9pTU^-sI)G*dLfZkKg zbyLXt3{$WbhM`@)zZhWOjOX;k2L;I2$4ie75ns2Y0ZUUZ#0Y$kKB>DPWhLd8LH1`{ zk(p%t6(jzndiKK+<+Sr&*Shq z#$XQka|$|^J74qSzSb>dK+wPY+Tu+ zv{Hn{`o$6VS9VG^)Fz(TA+9_QJELnnXj;Ik+7);KlL~PjkTHe_z^ZMDi?IRTj_59i zrlzJpdBDnAd7u97Zvr+p9`|Y9*UYzBIpZ&i%T~qr{xCQL*F?-FVI+>s+20;d;2cJDcy4q)f!FR}!&X zqxchwv4;et4XR|d1^{1#!4VO%Nsl1nmPLSPMk_9fkj^gJKA*q&$vGzA zMEsUhX=>W_O}MlQ01L2dQrZEjTNZZv=hT_gOuzRN2H!^Lev7*|XKN)P+BF*RYeIE? zHvVC2hJdiRM>F*cab=B=RoB@yM_pqCt#9&)K{aiACWLMdU|nmzZ;_0$)oz1rv#{=2 zT-RiB2PNLW#d^_z&dCE7CKtIq>G^_ed|((}JtBB#z&SPJ-xqJF9ZxS1Z34u5@tozY3BZD|(@-3t zZIkDJl#Fmm&i6`0^RuFVm!!9n+1;O8AUsiw`D#3=H#SZ_F{8!b1O7u>T3lF~v!1z2 zywSq<*){LKhVho{xxe*;$p6SjMy>x7tJME7QvXr34nQ4%IskP5R$cpj04{b&C!>UJ Q4gdfE07*qoM6N<$g4LRVQ2+n{ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/pro7.png b/gui/slick/images/network/pro7.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe0b7cf4431d351dcfcc97c2359e9829ae691c9 GIT binary patch literal 462 zcmV;<0WtoGP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-R7pfZRCwC#*}p4AVI0Tt*F_`)2Bjn{lEFnLi@}0YrW-NI;tx<#Hsya{Fx)cS z9gE#RaThjqXXVFrEN8GN!#Stt+~2kX=j_ zSodUbIsmtrz-JB(f2UtN-L%&b0qjSu1ane+D_F!FrZIv+G;z?007kKcEv#Yek9E~f z15m{=b}{^q^)H<=0`oXe8;|M^=*I<4V!Q;`ah*EH=#=0Y9z$uq=o3)S>gFyZfO~Al zDuf=e5vv=lhunPL08T@k`Jw=<;xe}PfZrzOt}Jda4**xGYl{-V0uIac9*{MF8zqY@ z0qkM9pt{FH6hhmnPyZ-Dyfs4vaD=zAjX)*#-{U_60EFN#YykLU5dZ)H07*qoM6N<$ Ef`6sC>i_@% literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/production i.g.png b/gui/slick/images/network/production i.g.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ae817a29d78356dbf288a27fc3f1d1cc839c81 GIT binary patch literal 1058 zcmV+-1l{|IP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZpvZ|8M!9 z>j?w`H09QeCf=Gyy3p(OHpcyT0ZstDfDE8AIFXy18}kU53X}m;fD|Av7F?h&uqc9c z3xEqiC*#>*AkFOt7zdmLc7|Cq12`RGZll``FjoCKV5!4=f1n_Y{wy~eAl`!iN{2Oj z!{~nl&L|+d(g0(C*4EojFyubKv=F+dfXRRtcoUU0*Z^&mC3ghc0zV`>xx^1(G;qs! zR_j&-46x)%;DaI0anPA<9p2Sxu!ki-1pFFz2Zmbn1;E8vDuoj*+4SX+4(nIP8W#v> zfI-&W0pNM886e)0KN;iR*4&|3WP=Ho{M8u88RO5u-B>h0Vi*LNmlpScI@Jux4MvBf z+&m6@c@V+?6~?n7A*Ed7VvSvAfOw##b;xTL?1QaJy$`4sf9M9x18yidZUyeR4FMiQ z&T}Y=Lb1Oj)d|~x70MW|+=hVfDtv-`-ln@nAu>X-krulO{(t2HjVTBQVg3>*wdNih z2TOI({Up7pW`Rw>IUrq@?*JSWcV7YI10#UxdK(*n%RmUs{V%nE=l|E? cCf(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;ut`KgRCwCtnNNsKQ5?rV?|McODX~B#nX({L76^q#M6r5hft9A7lG%`r$t-3k z!fa&0%t9Vh8XAnUkp)6ns42=UEIc)O^0%3}Hs71m>E8G1dFPzRoVuOgJ^$YMe((49 z`<;7VE{+MhkwT$R@6=hUzt%IkR4V=T-lKrzp9MYxWuW(;RzMwP7-%>4Py|*0 z+kI~&3JAUeYy;k?y40A>QqfmOg_rNwDViSJ#LkoO?_ zjlf%A4=@f40kQmlDewh&ZOmN*v;g;kL&jReF3t%q6mZLu{Ud?D3ET#@sINzTuYi4O zI}N-59_xOtYj=nofZv_s^8>&)*;`ewHRi2Xy~!W~pwo3sXe0qW0zaM-@P3JeMB+1m zR-?aFZEd^^SOAL~0zjYYicWoVfDeZI%(vFq>jS*Ylb}sP4D_q5tSia;OGL(ZU>p;bA;J6l9#D;h(U9PMei5=sNV3C7 zNbs&>K&`-7)`qwASE}|{~rH604PGBzYR#%b^rhX07*qoM6N<$f`&|2RR910 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/revision3.png b/gui/slick/images/network/revision3.png new file mode 100644 index 0000000000000000000000000000000000000000..366013a12fa495b35b3ff6e6b5cd236dc243fef4 GIT binary patch literal 1215 zcmV;w1VH(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=MM*?KRCwC#*n8}jV;BeU&##jtsYWHsA!#FYAmlKmkTbEy9HTA%a9G1;Gn-oc z(a4bLk7mxwq0(Ywa#s9OlAM)^GUs7J@%rcc*zNUOMr_&dy|;Jw{anxeJoj~fukZD} z?&oc))oNOEYonF71^^8J8UQo^Xw|J9j2%06OY*5VzQGUw^+K~}&)y;#FbJdTY}=zp zYe|8}&;k7l+eqyDe+S@Lbo+}rJ+s**IHa)ujMx4%4M;m3eX>|Pe2#_q_+MD(L7aw< z&>ugwFsB>dMHgI&=W!rjMt6L%8S9^kBhiE>aZfz}r{ew=9^8O&xOX!F*fagkn_%5m z**pxxG@Of03C2HZTVWoKE^Oyu1TH93V5efjn^=}{`=HgQ?!_I@_HPQ?CFqOwg?*c1 z{3!>+S4-Luh;KFuX`hD;)zQxzL zBaXrRq)g>x=g@dkO50u-kb4KNP#j)z0lfs7CSR5UA8?&;}U9bq(U}pUK z5I5xc1D ze_R)5FN>ouCO8u@7Apey#zgd9tigLYC_hD-O$@kGuq$dw^YNMUOc?Py1IoNyhUPd5 z9|V9|xqdY0H{p#4)yaiUj7eXet{yHnyu1MF>i{znx8SWJt=i|E*G51)rHUMi`;x;$ zt0>~fFr_cvkL{%NwE*-`alV*W32{q;GywZ&JU!zba7=6+F*&sBSftHeg@BE~ez~5C zwHbH9%0l(0VY}$V>QK5`<2$?*{n$47JvTrs3V_`+e`Nx;8jrWY;8!rCD5cZ#o<9Nb zUa^r{sPYYVEar^D)rn3oEY0tUpxPr*ZyOrEpU8*~G~@8l`UpIdb$b`lYn%1IjgOOy zi1tc#QZS}gmzt6yJLB?zaUllBPq@A%0D7kM%nZdJ%)({v-(94@kj$B%d-oO571R}x zS|56^%E@kUM5`Yzjnmb^r$c~Wio|HVLMi1O+Hv?3MZm8{b>tUEfDr#c{gR`|0bir+p=9vUF~7IW^eg4I;3 z)vC|oF{znL>dpkaCE~xtHX@X46IEYOP*DWys8ov$g{q$raMoe>Xi1;s|DBn)M@r?K zLQqdnDQjCWWlnsm{BADNr%fuz;)2D4qBrf54$al)a8u)N@y1_b4FDPdGyrG-&;XzT dKx=Kk4FJj417-923Gx5{002ovPDHLkV1mHFN+AFM literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/rtl 4.png b/gui/slick/images/network/rtl 4.png new file mode 100644 index 0000000000000000000000000000000000000000..95b1d1857510fcb13ba87d5baa885db9bcdfde0a GIT binary patch literal 1094 zcmV-M1iAZ(P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<%t=H+RCwClnOlfWQ5?p9!?<&hUP8ZsKpxHE$=IA`W~@ZYsst#!^mXRTv2U!B^0d)@Z8*81O0Ry-c3 zsHlimjw3)1V3|smmX;Es^&X8_u?;ty{R902w!+(ux{{~$mwU;}U{gLCu* zwi@`;KtW3g&=FV!TmhZ~$AJ|YoUaa;V|jNtc<^llx&U7-@1_HnH10_XW3K}S15L{2 z)h0Pb<-l2BmB!DKE7BP8bkt@8Yk^0=VoN*ITv;LK=m(rM@CQQlEinj?4GahFyIg^; zzy&$Z=YTPystr+xxk?P&2Vi@MzHfmS20q`_2K1HP?xb+vGH{o>>i%1>KZP;g8@OCo z0qP7~CIr}G;2Oo6heh0WB~ACT6EGJT4Rn__A7vp?V3@eDK8C(CfOev86>!k;<0CSc zj^jWqg>kZMqUZw50nUh@*0ECr7zGqtCK{-``{Y4@)j)?tZVV3!2N(~OS=xO9n&tUx z$g!V!SlTf@9P<uJ()d~l<>OK( z2xHJ=ssQCuZVJ?jgp9X08Uz4XDZV_GU!?%x=r^ukZOo#H2_ybww;OgM~L7i z@Wa&&Vn~ucCuy_U!e6vhm|Tz#+_1dc;v)`72QMwheZ3T2e4-vWYT(zYsd`KNHFjRh z^@}BTh(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<*-1n}RCwClnR{rBVI0RlXFJSg*a(X$q?z0n`G*$&A~bCOC^EN9E{#^?E*80m z_(K{JizSMr{K232L#A1qFcV{Qnaga(>yQ0Ty`G-uJ?FgdGt<6x>YU&EJJ0jH-}iU< zKF=F+9EZHTJUTh{1AT#fx3RRelrWtin}GH5{iEwU012J=#=8T1fZZ-zAyDu?5HJ8( z2kdRfIr;$`HTL7c@Qxs$C$Ipx1iSza0n6HPzFHv1aBW}Yi|rcF8)!6Kn*p3xY?U5k zr2sqRAvsazO$6==xo%tqP5~+#rw6S8gXC!^yKG-Ar;{!J zcP4_v0gH?Zn*^k2Y|X%X&4WtV#ib_BZa8mlTiY-FGcwnhvqG7IU4FL&A*4Vx%zkkc8 z)$b(kP?`*s8E(EoCc>l5sdyGJ1^Q@g1tMn~fyclJAS1{mZURc8w7N(b^@?%q5djHE zHHfJcS;H7fho{npeIb$pV+{)~2W|=LksNy<`g$5LMe(l?@sR{n2P7a?qC+z0P(!tpYZStW^oPExRupNRQKho4VbNhX7qSsE#5*b+w|u#WvU^;aw>r=d(oC zL}04Mf4W42nrmHR2)*`1zK5ev6=u8+0rZ;3cXKy1G&j^%zJB zCtA?^evxTdd*i<(z_C!c{1(RxhE30FzeUgwo@;E`Ko8)%g&WNVMoIfklmeS2YE`#W zyx}JWBLs9chz>8@(b&2IM?Iu68YyeSMyc$vVyBWT49 z`2@i%loug_>yb`n^SwY7@F|MV27~>a;e;uuUbtqsR%Am6`9X~#+}FyXi%opc>=yu5 zySM5c@oMZ0u*>y(sb~k=GWxqj+;*4k2yo1n5)6W^vT=D!+dGB!#17hCjrXPPF!wL~ Z836GV#N32|%eDXj002ovPDHLkV1l41<7@x` literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/rtl 7.png b/gui/slick/images/network/rtl 7.png new file mode 100644 index 0000000000000000000000000000000000000000..226156a42bd5bf7f779626528e4b1d87f26cf8e0 GIT binary patch literal 1049 zcmV+!1m^pRP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@G~ zMt@+Z!k-87IzoV+z%t+_Pz{_0)~0a04?v-%?0EFWwGZeGe6y6z1+E+13rpQnU?|`v zF?Jg81i0$s?f@5o^+w%=vP7CQ9GO}HunBkutgzJ6#)??#9s#lf%;lLO0Kk4lfJ|UK z@F>g@=p%zw1DAm*qN)w8N%Z|PgxQ<;1iVxD+^{}isQlYGKJL3i2NncBEc|DM%MR-U zG__p`@EYg={8Gx=#Lo-|x*27!Ed6=5C8-IJ11th21AV1V9k5-@c${ouLzK4jWK!9{ zbKqz|0rJHMXv?Mr7y!Ig%C1@Zi`Yal1th?0ZxSK7N~o zvncy|eUJ{L7BImw;VR(1BoR@Qd@S+x9AKtV|G5Mo+2Y7tq7XQt@H>FYpq=^!Fi{Ik zR6OV_V7G*|rT`Bl`*Mw3%ksS74{O6Lfeg!5vdlPb zBmXIh$_J(?{CpRkr#b#WF9iZ@P`FE$K+LHC@sJ)e-cJM(V7euzr=tb%Yzc;A=VwNo zjlk2+Ab=K%&XO43<;jtjgS5F8Aj@)s6AKR&E(;-~ba(45=&rM06#K9;Xj5w5Q(A!SOVOV3~;JtJFJp` z%lrqAV%*pmZI;U#_GG?alAPZ@i}_c%5+E9?j+V)_#yGC30G1m3DsiaSl{R%2K2a>N zgv*scQ`l_~B}r;bAf3f>k~1U)F~nU<*>)FkKoGpQnERHX`Fsp~mBSMgoBgSJM_i3v z0S@_o7fbBmI*e`-i`(zx&H(4M^ML=2y|mvVeWLwNA(c2l`_*_q+7EO8!QTM@q;Ir9 T%rR5d00000NkvXXu0mjf=~vb< literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/rtl 8.png b/gui/slick/images/network/rtl 8.png new file mode 100644 index 0000000000000000000000000000000000000000..9c43440561ad29c6429762dbaf114b1046a1b28f GIT binary patch literal 1048 zcmV+z1n2vSP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-o`H|c{g#>ezLKT`AD{Q!`<=P> zf6w`!bFaQoC`3F<0&y-$I%PpY!N0J!dSD`u8&>%J{v;kEf*ng_gRRd!jbAU_S@>8R~YK%$XqXS#h1hh#&Z{Q_x1!yuE zUk3~ab}0IFz;-VINC#E`SwOxC05g^LFAICUfWyE_P2UdS8c+f}G2wtxAl0Co;gtuB z71S3SbYD!yb^;R|rsuoBbc-=_fCs>2;F+fX4zSSB?(Y=`j8hih=7P(q{Vz-sM7z*Z2(ka8)#wUl15kMFkE!?d80mgR&e+`JLmD?6MGEVlqE$Iu=khptkS@q6USkc*c@*_6jN;Z&=sU2b@l z1&ngQV)5aLsj>;!Vq>>O$hHA^WV84RV1q_~=uZG(C!KU(PU>RWEzyzPD&T!j03f^* zHHP*gi)*cDq!L)KoEMJ9S_-=@Wl~$*0nU41zYZ8r_kCrVrMvw9?{J*U?*RbJOSKPl Sj{lVa00007tO_ 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 Z836GV#N32|%eDXj002ovPDHLkV1l41<7@x` literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/rtl7.png b/gui/slick/images/network/rtl7.png new file mode 100644 index 0000000000000000000000000000000000000000..226156a42bd5bf7f779626528e4b1d87f26cf8e0 GIT binary patch literal 1049 zcmV+!1m^pRP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ@G~ zMt@+Z!k-87IzoV+z%t+_Pz{_0)~0a04?v-%?0EFWwGZeGe6y6z1+E+13rpQnU?|`v zF?Jg81i0$s?f@5o^+w%=vP7CQ9GO}HunBkutgzJ6#)??#9s#lf%;lLO0Kk4lfJ|UK z@F>g@=p%zw1DAm*qN)w8N%Z|PgxQ<;1iVxD+^{}isQlYGKJL3i2NncBEc|DM%MR-U zG__p`@EYg={8Gx=#Lo-|x*27!Ed6=5C8-IJ11th21AV1V9k5-@c${ouLzK4jWK!9{ zbKqz|0rJHMXv?Mr7y!Ig%C1@Zi`Yal1th?0ZxSK7N~o zvncy|eUJ{L7BImw;VR(1BoR@Qd@S+x9AKtV|G5Mo+2Y7tq7XQt@H>FYpq=^!Fi{Ik zR6OV_V7G*|rT`Bl`*Mw3%ksS74{O6Lfeg!5vdlPb zBmXIh$_J(?{CpRkr#b#WF9iZ@P`FE$K+LHC@sJ)e-cJM(V7euzr=tb%Yzc;A=VwNo zjlk2+Ab=K%&XO43<;jtjgS5F8Aj@)s6AKR&E(;-~ba(45=&rM06#K9;Xj5w5Q(A!SOVOV3~;JtJFJp` z%lrqAV%*pmZI;U#_GG?alAPZ@i}_c%5+E9?j+V)_#yGC30G1m3DsiaSl{R%2K2a>N zgv*scQ`l_~B}r;bAf3f>k~1U)F~nU<*>)FkKoGpQnERHX`Fsp~mBSMgoBgSJM_i3v z0S@_o7fbBmI*e`-i`(zx&H(4M^ML=2y|mvVeWLwNA(c2l`_*_q+7EO8!QTM@q;Ir9 T%rR5d00000NkvXXu0mjf=~vb< literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/rtl8.png b/gui/slick/images/network/rtl8.png new file mode 100644 index 0000000000000000000000000000000000000000..9c43440561ad29c6429762dbaf114b1046a1b28f GIT binary patch literal 1048 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/seven network.png b/gui/slick/images/network/seven network.png new file mode 100644 index 0000000000000000000000000000000000000000..a74bb8732f4af491d873e3bdcea9ca8cd0935c59 GIT binary patch literal 628 zcmV-)0*n2LP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-`bk7VRCwCt*-wZ~VHn5p&-EvoY-XpVl&}+}>}+RmaaW9@F%&71Xvm+iK+%{| zBxNwP(3R!FR6B?~5HLpT=qRg>h<~%hVd1@bB0@v472SFjYeaz0ALwjhQa^J8EY5^@f|mlSOHy;g7be4r`(0y^A%GdrT6q zz+bg1jWcYFtR2qbMQQ-%)1wIQ7o19I6YQjMtc~#RPbm#{)ACM6_}_%)s4@ViB6Iq# zlq$haT94fk{)eH*s0@I6J@gi;0$@9~MEFme=V&ZN0JkE%pK+$h!ITZ)LYr2%^rinl z0IbCE2>+|dB5B|O+==v$mNBTZ0Bq}`)t##uysZ*|=}7;+vX*5T01jbwgnvTw>ry2E ztkXOii%EOu%S=l}ABc>FB4)PBi8xSpQBpL3i#Vov@G+38E%eXhe+B>z=UAL(-MPpB O0000(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=-AP12RCwCtnR#qgMHI$=uc)-PB7zhV3PLbdDu{|=+)xaa1Wa78{(;6NMuTxd zg}BAUxYU@Sh{h;?sKnH0nnn{hqzN`ID4Uv~pjc2KP(&#erCLiD|L~jeWpexSXxjH` zdXks9_uQGecg~#io$t&`b#`{rpXG?d9Z*qGkq-<2@_;}4+JdU9s}HMxUN_!xEzks< z+{N>;z+7PB|G@*gV}KT*4*0r@=YIoLzy=^?`YK=zaH{Ff0qy~2qU1z#) z66XI^?O&#ARlCS^4*{^MD|0mA{*S%cE4bQK`~%^K{@W;CRy|dB|Y39zx+d zW|t+vCAl&{keUQM$rl!Qd^Z@AjCa;$r`lbn3q~u8`i{_h2j|iNw<`b7H{CSterpD# zDqh%h)fsyu%A90?v1%ve(f}bGI*gUwF64G1G+eDOEbQ`|28O=@TddC`z%X53n2?SU zZ^%wLoI#~n2^^h3R94F%6M;dxE)!l11s(>TFm68*xCyvl3~;>kvo&|2Krp;_rHq#o z0}Rp!OflVwzz+h*dMzd}y^^TkZeWb)Y?WNT*f8T0W0~93*X0V}BVcK+Lg2+{@j*&~ zkIlUcqs4ptZddx8ZHo_px&*k$%I$PqA?pS>E~*5VsiF%qN)#C2+=TH{&F#ZHO$rO2 zcd=TpMBi7@v_#}6Cm3)>bpN0Vp2`Tt>wr@%{k5y8DotR8dE)wSsLDLX0Mk?JoeBwZ z34%MK`_VGM3ISQlsC)@vurP4|z&WrnbzQE@*m@>DOUuM+mO0h=&m zEhGSDCiD%9{Z>d`E_ypq2AF3laEQESo@jJZ?eL792Mo(44_K4oyMh7gb;yBIW(bX~ zB0_C8?j?)=baQw16$5lt-IWU10M_XgDad5Iu2WjwWV-oX6g_K!4+MlcB|=|DwL8Eo zzzH()!l>#S6Ooo;^}A9ATn(J2+#b#XAJby}Oz~cw4v}jEY*2nKFtoloN?`}>{`F}5 zP*La_!-z@1W&HQ&OA&`ooe%URb?vDTXxD*6$n~S5ooWEiPBZ>|fnbM~y)%JJIdst3 zY$b4z_ke_ zph9!DtFCVr7PM-&LN)lPuD??)&@7Bt0DLI#>5#kclXo;}%&hJre&TstfB$zlkA5!y Z4ggRv7EhQ$k8J<|002ovPDHLkV1lgLXzc(1 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/showtime.png b/gui/slick/images/network/showtime.png new file mode 100644 index 0000000000000000000000000000000000000000..7018d77618a662809ab7b6bb8d1eeee50124e329 GIT binary patch literal 1324 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 LNkvXXu0mjf1vha> literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/sky1.png b/gui/slick/images/network/sky1.png new file mode 100644 index 0000000000000000000000000000000000000000..4f6d462b5b2352b2144159ed6d30bce1777206c0 GIT binary patch literal 1353 zcmV-P1-AN$P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=&q+iRbd2TqKOuw7&R?IDnzZtrKBA{@PFod^4^;_^QP_S zKbgEacfaS}bI$+Vf>bI+b#*l{a1U@JPy`$SZUDZZYfuD~0Hwe%{RRTPfdp_6Xae>D z-vPUU&Y;2S>+4D6U{Q;J{*GLlV+HinMn?ccfIj*j1Dv4$CjlcRyJ!X)fQ`T#euL*i z0sD;te$V0N3xHyv9oP#bf!2`ry@88>nfjgV{Qne~3+!||6y{)&opc>iy4K(7*P5pN zVc;F$dSEQD-Km=Z>;R_bS^@cruYe1I4^8=Ind$#t0Uj>X&2aH_kPk=zHNYjn(10u6 zOILHQY%&T40W0LlIyA;%;9g)?n!c|9qa2?w2{@F20@{HWfm)|*x}0mPtAGL8(8!1b zPl%|1f96l^sLC<4lWq-z4}GuS-9*Ad$#12&Js*7G5K zA2#xpz@J$tpe3lny8*+2DNgw>n!HmtBcbc(^=Sg$4k0TZ8h~;WBI|+KPT3rpN23{M z9B_^!Hv%8W;1Vv5h$Q_>0oHC_0}f;{S(CnRDJHw91U>*p0~JpB>%f>ar@uIcBOGhw zZ93$CqQGv`V6X_ze%a3wUNnMiyuR-|J+{114$(?gJh*<+Z?Sv!NQ(=2_8Nfcs6|V=*>A1ek2rxZaNk zJO|t<${B`A;BzN5xnuMJmizdJaX#a`1bpJ71b|zdvNnyGEuJy*95=LEBD7qQV4|+% zM&O5lf$Q}B%W#B7;0n|B8eo2et2tBj^?0XjSq!>;madaJwn1Fg~R&#_4Z1V^xM_gCoR{dWo%}Z=0CcfPf?@NQqBL zf$sI+0-R~utpsL?w_B`=kN^eYWy3!v`|$x+0h@sHGMHeCzI}aCSPxV6IN@Oo@Hnv0 z^qCHPspyjn=eJnq(5&#z%&NURLQHx9Kd2~oh0z#XRkL7>XV6f7frQx6)MVjl2_ zBhQz^C7l8qfZwzj`#YqQ+$P&Db8P=J_4`#0Y^RxH1+YQHtn z%gLtFT>aq+Z#PM9mao_lX8}E}fM#HAnl^*w-D@2u`h=34_P7g3kiQrO+@%Z^7MnX?@?ORGby>a#=Dh;?DrcAtTJy^pH!aE?f82D_x=jH?wOWq00000 LNkvXXu0mjf1vha> literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/speed channel.png b/gui/slick/images/network/speed channel.png new file mode 100644 index 0000000000000000000000000000000000000000..631fabcfabd57b148c53f614ea5977702b66e5e3 GIT binary patch literal 1493 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/starz!.png b/gui/slick/images/network/starz!.png new file mode 100644 index 0000000000000000000000000000000000000000..18c5d66c1a9804a8635e9ed0e9c930c9fa6fa882 GIT binary patch literal 1198 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/sundance.png b/gui/slick/images/network/sundance.png new file mode 100644 index 0000000000000000000000000000000000000000..980aaa07f2b91fe33112a9de1334672d7993a864 GIT binary patch literal 1761 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/super channel.png b/gui/slick/images/network/super channel.png new file mode 100644 index 0000000000000000000000000000000000000000..3de33fc2a9e70f9c16feb21b62b2d086cc7b1b58 GIT binary patch literal 1398 zcmV-+1&R8JP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ={7FPXRCwC#nR#qfRTRd51En3Pc9DQ06^Y`8fKpVff`S^5x>bVgqVfl*iBS_Y zF)^_wnix^g7%&J*P-}FEibe@&N(GFHO4=yOq6S1nWsy*}0)_Dpe=oT_rY$ZZY0F6_ z@6CJn-gnPA-}jyKW)kUin$~P>XytYy0IfX$SpXwPj%*FSo(7Zx-GJplWh#~WI{+=* z>0!Xl9&@~Y07wGqmKuOQK)D&u$#DNCAl;HQpai%-_&yQ1wE^b=mK~u1&C~`1gM@b; zFb=o}NCAl^=B{kcRiL-W!@yXeBXBlwB`_1%37p#!1MsHK7Xg0&U4hF~_2+;hIbHwxShj1uaRuvM7tUw~eYo9}TJFvjt5tF{U>D+CPpI1D%k=x(O-1Lpyz z0Fw+@zT)^QuqPO^s=0N7S(dfP_5*vvECzOs*-ry2q{kh=83u7S@bOWdV1|2x}5g&zQ>1KWT#2BAO!8e?P+18p6j1oj!Er+{xW zY-$B?x#!b;Mra=aLxD0kdBpyN^;F<=;KCq-2Tfq)(ASp4--7vFfSZ7UKtG@mILkeg zN~MmVKo>Vy1$1&!A+X4dc5>W|ST+G(0xt4=t{F>u-rsveb^c`_+l|izhM4^*%S%OC zu@pT?wZFje(|}7{qb%6V5}ls{dU%d6_CD}~!uXB%rZ%D{ zRToWH06~LAlMOFik_(t z(c&tjyF`iujzyyp!h} zr0Aj8GkYqAMOK^6K5x&lc3AN;7`BQ_|AF&az@xzn$ROY=OVvDKIUrE;VyjC+G5anM z%W_pcYJbN8HyRv##BzXm5$^_pg2v{Et=-JQ;}T<9=V@v6sOZ=v&)h>611< zTclFdvDI09a)fhxq5qK3uC^iC?f6A@g~?1Jcf5ZUZl}_(0Zs-UQ{+m3=gk^6DkF5{ z9ZTf-mbxA~J5BBmw}~0*8eiBLeG+?F$}(8_#~T5m)d|rT6}TGvh|RvQM}n6RT&k$< zvjZJ%EB&iY)g<}6RXuvz(znTs=h>TlV4u-J5wB^Y8ER4l{|_q?T^k#?pEOvZbr9;I zWfH##xrNeXn|(xfAcVEYDuRg<{|&ZsI}w1^9)Q0F0JShcQm7{fP5=M^07*qoM6N<$ Eg4(@t_W%F@ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/syfy.png b/gui/slick/images/network/syfy.png new file mode 100644 index 0000000000000000000000000000000000000000..a22d1d0b1439a0d05ca7afe7bfbc7049608578d7 GIT binary patch literal 1323 zcmV+`1=RY9P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=u}MThRCwCFnSY2>RTRfRv+g!&U=d`6Wy01bw9*ePur#dH(umSUnNS49xzh{)i%Slh~-HC9twAGqTl+H2bxdw$+kpu+?U%t-I#T>yP;k+%EUdyZh$7 z{la5r?mh3_bI&{Hd(J(Ri=qgCmX;PQ%m8i%E&|2^b-)4O3!npdpX_lfFbkLnoCZX? z8h|Z8Ytjc73Izb_9dmi$WnivjZY*#aumsouECh~bu<~Az)qk! z;NBa7U3xpmQ{4RJz_tLnztdQ(&iegI;N~ls0KAmq=1&CPV;Er?U?MOt!82NPZyHzz zoD?WKKJ5^=(<8GPco--GtAUvgnMJ^TDd@AnGyWsc2^^Nr^*~qJ25553|0Nc#V3t_e z#=H~^FiIh1V<&KFRv}OyGoJ@80CpQ=Hvy9k_Rj+{tCOM$ik1!l_-_ZwqAj(PsdFJ5*!$1}O5l zWrX3v$OJ|Usst-&2O5D@7J>PUa5C^iMw=Z}h#b<@FP$2)GyuRqDu5bAI{T~0-Xr-e z@RW${Y+#%|+p;(eP1OPw*BT*~{StUoZ+a=P)?xh_K*5v7q8fEPsJD*e;FhWZo=|~f z;$t06D{TIx^8HFn?o{A(F>~IU>kr5RaTQ`HB8Mj)2@QeoJ-L0HHFk=pWd22|(#9C; z_jxIWM&$7d+hC2M26)F)3h$8X&yfeXYW{AZ$7Aj1R3SF%IrpYyfbSe*Ip8&Ua+5rD zPG|^p053Ss2V;PzW0ZMSpC3A^t|s7v49Kxtm+ev0Je6v!2MhprCs5=Q;9Y%RG0gSA zgK4M1XH^4);(+C1yHx8Zg^NQ*RFUt{m1-T(sy7*zzBU0DItrzS99bd`Ma8d6pSTXu ze1&eR{eYFgi5; zu_s_3i)4gWV2alGjdFi+5->eUL!?J7u+@e#$EwKZEU)P@7{9?dy)ASYV6-+}3t4vR zvUOeKFhE^sN2uDd*5#@jjhHQIQ;#WJ%!)JQ6c>jH;;R88j0Q#Id#zf=TSeBB9{PbR z9plr1+th5CqMm}w+lGoh&*nY?ZWlq%Rhe#MPZkC!i2zr5PM6hCNU+}Tl>f(A;NX*u zG54+yISnSk+61+JPYtQ;fduz#!f2_dZGb`k-$oC?>>AeF$I$*D?FDWL?FS^qr;7Xi zF>-r>ODw`lf_51pt{<_Ta)Qi<4rZ3F?8vrEx4ZzElr33%~002ovPDHLkV1oP#TfqPT literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tbs superstation.png b/gui/slick/images/network/tbs superstation.png new file mode 100644 index 0000000000000000000000000000000000000000..10d49bfd55e2d8054524ce0a065b222a2372ea13 GIT binary patch literal 851 zcmV-Z1FZasP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;*-1n}RCwCt*;|NJRTu~G-;8OXC}tobD3YNhfhB05Li!+f86w5T=;Dj?5CuvP z7730NmKRFIUh2VzrXHFI1#cOmWS55^v;qZ19}=bVRyt7H==9+Kz~(Sw)H%c6oevgk z?QgC9&7S}I?x(H4zh5iUZH*Mx+1WV^x1$e#6t-&ozwqaO{X0E9Jq`Qj_67smh0{2M zp#$)H%BBI024E~kVnS}aMt6mO_x~M$-pqYigXMYtCG#PS#(P*+X$A$h(Z&*B+87T!bHU$~shSd`I?rDfKD8lA&~n40G?nWx4H zPKl3L8UCYKk@freu6NLeQCN_@=kP!k0Jws0akLNxYBVRR-G`0X8~*ckXD7y|z~=#D zGJdK807L4cKrPugfx~rYKPYGiypnlQe8-R267xBZ^Hl(#p4u{>8DQ_X!g_o{<-_xR{XlRh-?m_>!eKm2>x$8G!aeLezyP!rK%3g-_6dd$BdP4QmU|Z#F)Q_n(|w zAD{j0WzGXW%#F4u5rW~V3+7=LreR0jdn>Uo>qoE?GXg@9-ooxO1Mp3fn~vCTZy_Z< zoxO!gc19&4?8M1}j9)P`K+H+zcqGZu(JEwu-)G#6wq@Lk_GDD57HI8$0A9mP{zHD^>4mY}5tD~Qj8J0Q}NzQCQ?zknZ7PVdIq!77H@TK(7I dmM@3@9srzLnNYl?E_(m~002ovPDHLkV1gjkh$sL6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tbs.png b/gui/slick/images/network/tbs.png new file mode 100644 index 0000000000000000000000000000000000000000..10d49bfd55e2d8054524ce0a065b222a2372ea13 GIT binary patch literal 851 zcmV-Z1FZasP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;*-1n}RCwCt*;|NJRTu~G-;8OXC}tobD3YNhfhB05Li!+f86w5T=;Dj?5CuvP z7730NmKRFIUh2VzrXHFI1#cOmWS55^v;qZ19}=bVRyt7H==9+Kz~(Sw)H%c6oevgk z?QgC9&7S}I?x(H4zh5iUZH*Mx+1WV^x1$e#6t-&ozwqaO{X0E9Jq`Qj_67smh0{2M zp#$)H%BBI024E~kVnS}aMt6mO_x~M$-pqYigXMYtCG#PS#(P*+X$A$h(Z&*B+87T!bHU$~shSd`I?rDfKD8lA&~n40G?nWx4H zPKl3L8UCYKk@freu6NLeQCN_@=kP!k0Jws0akLNxYBVRR-G`0X8~*ckXD7y|z~=#D zGJdK807L4cKrPugfx~rYKPYGiypnlQe8-R267xBZ^Hl(#p4u{>8DQ_X!g_o{<-_xR{XlRh-?m_>!eKm2>x$8G!aeLezyP!rK%3g-_6dd$BdP4QmU|Z#F)Q_n(|w zAD{j0WzGXW%#F4u5rW~V3+7=LreR0jdn>Uo>qoE?GXg@9-ooxO1Mp3fn~vCTZy_Z< zoxO!gc19&4?8M1}j9)P`K+H+zcqGZu(JEwu-)G#6wq@Lk_GDD57HI8$0A9mP{zHD^>4mY}5tD~Qj8J0Q}NzQCQ?zknZ7PVdIq!77H@TK(7I dmM@3@9srzLnNYl?E_(m~002ovPDHLkV1gjkh$sL6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/telecinco.png b/gui/slick/images/network/telecinco.png new file mode 100644 index 0000000000000000000000000000000000000000..f315a7e4c999fb76fae27e107a66e9227805a6c6 GIT binary patch literal 859 zcmV-h1El(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;;Ymb6RCwCt*-eO+RTKyC->Yd(Ip`E7C>nm0k(o#>3_lVC%UXmeBW+SaRJ4tO z3U0(jEs6*vL|llvl95pS%yFS07HTAF$e81pnkHyXY0ijaye-}{^e{ZHGefh}a1d|i?hs6o z{#b`Y*o6k%z#ZI0OG0-bhM*NUa~TCvrnro%&v~Y+?4jCc?aOQ$&O z$ytsuW%Ms#%Kzmq&@RtoHzt(X@pd_Yd2va~{aqj_zs5JqExrXG1!ri@!l0}@;LjjB z*D);7ejD3@ApMf1L60LR2=B#p_Z$vmPk@uTJT3sf!|Qs0^wG;DD**aF;@g8BF|MZ4 zo?5Ai*Tq znGxP*DRTV7XZFaloy6aY*xw(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZCspvz2K}6vP z3rVD?h$yf=6lg?5R0x$&5EMj3CG-%4EF{y!G_fc!rPaQifoZt+&g}Yj4-7kV_S`e~ z{O8X9oO8z)3Y?K1<*AM(4dZj%O=78tG8=wK`6z)** zM+nFS@*Vn*zD64Bl(K(rd>r4R*!0^Si(^ zAQ6}jtd(Y}26zWFO1|G<$lu{gOn1ylkb#BYMf ztTX7ZfCWIO#wNvaod&FsW091~uZ8(DfCa!3VB$bN$=(29p&O^M`2ut}bZtPpl*hTi zAz+r|{@>DJHYt2H4aF>A0g$1w=>YBnK}VUKA~nD~(QN^i$p%X!FjwL0x?wJ{5%dYM zF7b_0=(_E%l$`{#4UUdD07$o;C)!?>6iwg&RX~N|9wEbj-!=MQZvDPO=d;IcC#6+D zlEzWJ^xmNeS6a1HkGRwsDtRx5N^ThZRceSm2^gaSzz-ZWID8;a_lodBr_>E0#nCPQ zR|7|dEPuKHa00mM(7gpV8OAgSuwNB(-L4rk|G(uB3mitcES1Ae#yo)UCYS+E2t>B}X{Y3Ec5u z7YFQgD@-;5r-yL=GN~71%bl6QZ(#k4{TM`^OGeO14p57EA5bR;9GT3uG~F*1-kLrP zJQ+A6WVa1?g8ROnB|C%@#>wyAFz#CjT=2Rh{y#7H%o9l_W%BKy9X9FTG`f#{U>0I-}W{yhF~ Y0J6-unex$;qW}N^07*qoM6N<$g8SRa`v3p{ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/the movie network.png b/gui/slick/images/network/the movie network.png new file mode 100644 index 0000000000000000000000000000000000000000..17426e051c6e8d6b6372982855503bf9aaaa823f GIT binary patch literal 1044 zcmV+v1nc{WP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZDtY{+-S__ujcPci~&7bN>JH|DSXI-~Vqv zfk-66|BNn)Os=S?urIp-5go}w7SL)pLZMLd2>|kdlfWb`K5X0zM41~aSplDKe*~-m zo~1+rfE~d66iV<^;JD5yAz-LS|6Sk=kn6I8KY=m8;uznt3-|_P8}nxXv(z4tG8+JV z_vpW-5BEbkkRN5tIiS*||FuED_e2&DOppLCJzfc%2C98_Xh#gsul49JZig-D6au_Z z2rSYfYdpprFs--?ZUGNF+lU0|e0aU14cO;1ubLEoT)gVKknDHAG?fG#(vD1%3ba=@v$VVMR(G-! zb(0-o1dr&*NCZ1!e%ClRAm|cQ1(HQTq7qOG6eyhqt5RzhN0tNqX|<1mH063aj3@4Xf1t7T78&$kMywMj(;D z!^Y216NTE(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZwyg5Zv^-D2daQ;z%4@`1l9q& zfpkOP9vBY%0-llpasz<9QQZ3+H~~zQ-Bh4a*Iofxw)^V=KQI><2pk0-y9q!m7oPDd zihCCTSAl9^5>On0%@bgsJf{>m;57i6qa(m+$*JO>#YZ~WZ3KM4P>qX$JYb1!`FI+D z!@w%wqsD&>*9Q3JVA~y7q_w|Ox;H=%AQ!ll3;?VZ?1_*-LEO%G_*OlmYK4_Gbv3vg2&=4k-Z#B0R6ivNf)3z=D>8tCbD06L4mv@L}? zTTqOY4jJ;4WQYOXjM)O{7sV0?7;*zJU#SovTiKz?>j3l?x60eT;#Tp~*11F2(>}i}eC?#ILBLv#1LA?qIhP*r0x48Zch^N`X3y_?=_| zV2M!|Y*#mDRfK^sHs)q!ks%j|pG}4|XwqdPlINq6Ku5{P9G<<`)>WQsCat!J2c&D3t^+fr+pnsxSnJ;E=q>}l4ci@2 zyyv_`AezuMWTumHvpI{PYT3n-;U5BXpQ7b6+AVB&JLfGKys@R s48&pU*RMeJeU9SCa{eEoC5-+J0A}97q*Tg+b^rhX07*qoM6N<$g1Wcd^#A|> literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/the-cw.png b/gui/slick/images/network/the-cw.png new file mode 100644 index 0000000000000000000000000000000000000000..5b30d3f67ae54f5a2341fbbacf34da8fb86d50d9 GIT binary patch literal 1054 zcmV+(1mXLMP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZCspvz2K}6vP z3rVD?h$yf=6lg?5R0x$&5EMj3CG-%4EF{y!G_fc!rPaQifoZt+&g}Yj4-7kV_S`e~ z{O8X9oO8z)3Y?K1<*AM(4dZj%O=78tG8=wK`6z)** zM+nFS@*Vn*zD64Bl(K(rd>r4R*!0^Si(^ zAQ6}jtd(Y}26zWFO1|G<$lu{gOn1ylkb#BYMf ztTX7ZfCWIO#wNvaod&FsW091~uZ8(DfCa!3VB$bN$=(29p&O^M`2ut}bZtPpl*hTi zAz+r|{@>DJHYt2H4aF>A0g$1w=>YBnK}VUKA~nD~(QN^i$p%X!FjwL0x?wJ{5%dYM zF7b_0=(_E%l$`{#4UUdD07$o;C)!?>6iwg&RX~N|9wEbj-!=MQZvDPO=d;IcC#6+D zlEzWJ^xmNeS6a1HkGRwsDtRx5N^ThZRceSm2^gaSzz-ZWID8;a_lodBr_>E0#nCPQ zR|7|dEPuKHa00mM(7gpV8OAgSuwNB(-L4rk|G(uB3mitcES1Ae#yo)UCYS+E2t>B}X{Y3Ec5u z7YFQgD@-;5r-yL=GN~71%bl6QZ(#k4{TM`^OGeO14p57EA5bR;9GT3uG~F*1-kLrP zJQ+A6WVa1?g8ROnB|C%@#>wyAFz#CjT=2Rh{y#7H%o9l_W%BKy9X9FTG`f#{U>0I-}W{yhF~ Y0J6-unex$;qW}N^07*qoM6N<$g8SRa`v3p{ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/thecw.png b/gui/slick/images/network/thecw.png new file mode 100644 index 0000000000000000000000000000000000000000..5b30d3f67ae54f5a2341fbbacf34da8fb86d50d9 GIT binary patch literal 1054 zcmV+(1mXLMP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZCspvz2K}6vP z3rVD?h$yf=6lg?5R0x$&5EMj3CG-%4EF{y!G_fc!rPaQifoZt+&g}Yj4-7kV_S`e~ z{O8X9oO8z)3Y?K1<*AM(4dZj%O=78tG8=wK`6z)** zM+nFS@*Vn*zD64Bl(K(rd>r4R*!0^Si(^ zAQ6}jtd(Y}26zWFO1|G<$lu{gOn1ylkb#BYMf ztTX7ZfCWIO#wNvaod&FsW091~uZ8(DfCa!3VB$bN$=(29p&O^M`2ut}bZtPpl*hTi zAz+r|{@>DJHYt2H4aF>A0g$1w=>YBnK}VUKA~nD~(QN^i$p%X!FjwL0x?wJ{5%dYM zF7b_0=(_E%l$`{#4UUdD07$o;C)!?>6iwg&RX~N|9wEbj-!=MQZvDPO=d;IcC#6+D zlEzWJ^xmNeS6a1HkGRwsDtRx5N^ThZRceSm2^gaSzz-ZWID8;a_lodBr_>E0#nCPQ zR|7|dEPuKHa00mM(7gpV8OAgSuwNB(-L4rk|G(uB3mitcES1Ae#yo)UCYS+E2t>B}X{Y3Ec5u z7YFQgD@-;5r-yL=GN~71%bl6QZ(#k4{TM`^OGeO14p57EA5bR;9GT3uG~F*1-kLrP zJQ+A6WVa1?g8ROnB|C%@#>wyAFz#CjT=2Rh{y#7H%o9l_W%BKy9X9FTG`f#{U>0I-}W{yhF~ Y0J6-unex$;qW}N^07*qoM6N<$g8SRa`v3p{ literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/thewb.png b/gui/slick/images/network/thewb.png new file mode 100644 index 0000000000000000000000000000000000000000..8056ee95f70683eb07d0b493ff022597e23b3ea7 GIT binary patch literal 1074 zcmV-21kL-2P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZwyg5Zv^-D2daQ;z%4@`1l9q& zfpkOP9vBY%0-llpasz<9QQZ3+H~~zQ-Bh4a*Iofxw)^V=KQI><2pk0-y9q!m7oPDd zihCCTSAl9^5>On0%@bgsJf{>m;57i6qa(m+$*JO>#YZ~WZ3KM4P>qX$JYb1!`FI+D z!@w%wqsD&>*9Q3JVA~y7q_w|Ox;H=%AQ!ll3;?VZ?1_*-LEO%G_*OlmYK4_Gbv3vg2&=4k-Z#B0R6ivNf)3z=D>8tCbD06L4mv@L}? zTTqOY4jJ;4WQYOXjM)O{7sV0?7;*zJU#SovTiKz?>j3l?x60eT;#Tp~*11F2(>}i}eC?#ILBLv#1LA?qIhP*r0x48Zch^N`X3y_?=_| zV2M!|Y*#mDRfK^sHs)q!ks%j|pG}4|XwqdPlINq6Ku5{P9G<<`)>WQsCat!J2c&D3t^+fr+pnsxSnJ;E=q>}l4ci@2 zyyv_`AezuMWTumHvpI{PYT3n-;U5BXpQ7b6+AVB&JLfGKys@R s48&pU*RMeJeU9SCa{eEoC5-+J0A}97q*Tg+b^rhX07*qoM6N<$g1Wcd^#A|> literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tmf.png b/gui/slick/images/network/tmf.png new file mode 100644 index 0000000000000000000000000000000000000000..91b64eaea53326ca46443daf04b45ee331a1ca00 GIT binary patch literal 814 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tokyo broadcasting system.png b/gui/slick/images/network/tokyo broadcasting system.png new file mode 100644 index 0000000000000000000000000000000000000000..10d49bfd55e2d8054524ce0a065b222a2372ea13 GIT binary patch literal 851 zcmV-Z1FZasP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;*-1n}RCwCt*;|NJRTu~G-;8OXC}tobD3YNhfhB05Li!+f86w5T=;Dj?5CuvP z7730NmKRFIUh2VzrXHFI1#cOmWS55^v;qZ19}=bVRyt7H==9+Kz~(Sw)H%c6oevgk z?QgC9&7S}I?x(H4zh5iUZH*Mx+1WV^x1$e#6t-&ozwqaO{X0E9Jq`Qj_67smh0{2M zp#$)H%BBI024E~kVnS}aMt6mO_x~M$-pqYigXMYtCG#PS#(P*+X$A$h(Z&*B+87T!bHU$~shSd`I?rDfKD8lA&~n40G?nWx4H zPKl3L8UCYKk@freu6NLeQCN_@=kP!k0Jws0akLNxYBVRR-G`0X8~*ckXD7y|z~=#D zGJdK807L4cKrPugfx~rYKPYGiypnlQe8-R267xBZ^Hl(#p4u{>8DQ_X!g_o{<-_xR{XlRh-?m_>!eKm2>x$8G!aeLezyP!rK%3g-_6dd$BdP4QmU|Z#F)Q_n(|w zAD{j0WzGXW%#F4u5rW~V3+7=LreR0jdn>Uo>qoE?GXg@9-ooxO1Mp3fn~vCTZy_Z< zoxO!gc19&4?8M1}j9)P`K+H+zcqGZu(JEwu-)G#6wq@Lk_GDD57HI8$0A9mP{zHD^>4mY}5tD~Qj8J0Q}NzQCQ?zknZ7PVdIq!77H@TK(7I dmM@3@9srzLnNYl?E_(m~002ovPDHLkV1gjkh$sL6 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tokyo mx.png b/gui/slick/images/network/tokyo mx.png new file mode 100644 index 0000000000000000000000000000000000000000..b6d6a8fab9fb771317ee46ec1a420813130d6ef2 GIT binary patch literal 854 zcmV-c1F8IpP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;+(|@1RCwC#*h{FDRTu`~XIE;+BUWP38Pq@!E9?TML4!htE{ZfL&cHzsB}7qn zK}n;iK{<#7p`nCEQ0*d=q&t*EW?ER9m$I@>Q0lShm{EDc-Q?Y|`q_j7XJ@^z+5h_f zwbuW?@B4k<+U!=R(=nEDnlX+lKoy`0Pz9(0Q~|00Re&nMSj8DII5-HGqA&4bjK^6S z|BP?Y!b6yfb=Z~r=VLOyD)yd@gBZY2u1n0vb{xg!xD`jR>J)LiIPbr;5ub>8*wk*f z|IL7LcmeO>O?->JcpaOu7*jBUrC5NScsT1HY&_^LY{S`Dgr5pA;c2`Z@^|C2?71|t zY5zm)$(T@LMdBqcz(-hC#LmGnJpP{yz-Uw%kH16y9o&NnAuxm;xHfBU!UjBtAMjV= zkLCf3lOem}_OIy2{dfRZ#`$ML{*A2Pf{$@-5As)pEWC!@m|2j2F~-2#7(_d+zZ9WA z#N4I;aJaZWfc-d>@l{Flfnv@^ydN@~@g<(cZE=32n0qze!uKhkYw&3t`k)}+o!iOx zmWBX3l5KtX0vAQ#l`-J+lxY_)XYL<(3~O-T$uz+UajT0~55W|hw{T`Mr<)y3Tp#kw zLmG}}U5RnUy%O8gi&o=_l-RzAv?}qDWKW5kllBK<&VYWl}ijJ7(RPWKpW9u+6>XAg01$>I&g(bgBYj}`MK z<2-y_#QNhxGrb2=Hb?NvDLMvc;79z{;s5{u literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tv asahi.png b/gui/slick/images/network/tv asahi.png new file mode 100644 index 0000000000000000000000000000000000000000..be86e926272a8d579792c4ee56ac1334b4063788 GIT binary patch literal 3797 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tv tokyo.png b/gui/slick/images/network/tv tokyo.png new file mode 100644 index 0000000000000000000000000000000000000000..045f9d0dbaa51183af015c7533d11da17129f551 GIT binary patch literal 1221 zcmV;$1UmbPP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=OG!jQRCwCt*=vYZRTKyC-)K5nMwS@%ut}_F63Qs8FpwUW#T3=lh*VhAhaS-5 zixuKDR#X#}=!Y_pw5X_|DYPgbrAAmyjj2PWMOvAn7Ck9V)0sZF4s0$ndS~X|>kKY9 z>~;3pd!4=3UT3ZUUZ`LX*n_`{`J#q~hIae=8~~$Vhqtf; z|KKW@76; z=A46CtPPKt)>{p50p{cAaPJ%OWghdIaTPAayBLiL#aLi5W5AX8D3pI0qw-WfrDZq* z=VD23GQcHR5d3W1)D2m?aa72Bv^N;wq-3||3?BDKG)A;^FAK4~OEXxW5Nmg5Q(K`aYDcOWrd%3;{o5U?{&nWKK)Q4eN>lw!{Kv z$H4_!LV?<3TzwpH;6wZp{5xof1CMb3MLF2M89M{_i`}gVz9R9!EStQT%$#~2#}J1 z-CE2v*orsX>0gk?+?5GGD%$g-U56ioUyb*Y0DElkwK-Yohk)FfF-J!`CKh^I@s;+@M}Bia%k{Fk_EpO{H*Y#ljDA7qUgx@ezzrV-an#yWAcva(LNLHsUdSl z+`p8>m@XM$cYIGR5g1d%*ANGm<#?o9@kp#baNsz4$Spy`#2ZuI?%`A>PTI~3n+77PLQqc$@PHdNR=%Gl({TYvcMhN zdU{3Z(%7{(3Lxw4s1pi=*Vr3MVp*QAP9k+@sT>QFbH*cut_l^~0Bh_mY)-~kk)!ja z@%EO?v%13VIS{;87(ifzN*sr80^L<5usWqdxF)c}Vw@P*<7_-%jK!7e$H=-k=GMjW zHY;&&55Te~kmBH+IZsA$rD#;jKSNn@qb^C4<8Vqm+ksC4VJ^hSrC3m@4Ukb|P9!gD jr|eb|Dm&PJkN-aaS8fNzVfCKy00000NkvXXu0mjfnTkCi literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tv west.png b/gui/slick/images/network/tv west.png new file mode 100644 index 0000000000000000000000000000000000000000..5f7a4d45760d9dde3e442c942ca4439471e7f4fc GIT binary patch literal 810 zcmV+_1J(SAP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ;ut`KgRCwCtnNNsKQ5?rV?|McODX~B#nX({L76^q#M6r5hft9A7lG%`r$t-3k z!fa&0%t9Vh8XAnUkp)6ns42=UEIc)O^0%3}Hs71m>E8G1dFPzRoVuOgJ^$YMe((49 z`<;7VE{+MhkwT$R@6=hUzt%IkR4V=T-lKrzp9MYxWuW(;RzMwP7-%>4Py|*0 z+kI~&3JAUeYy;k?y40A>QqfmOg_rNwDViSJ#LkoO?_ zjlf%A4=@f40kQmlDewh&ZOmN*v;g;kL&jReF3t%q6mZLu{Ud?D3ET#@sINzTuYi4O zI}N-59_xOtYj=nofZv_s^8>&)*;`ewHRi2Xy~!W~pwo3sXe0qW0zaM-@P3JeMB+1m zR-?aFZEd^^SOAL~0zjYYicWoVfDeZI%(vFq>jS*Ylb}sP4D_q5tSia;OGL(ZU>p;bA;J6l9#D;h(U9PMei5=sNV3C7 zNbs&>K&`-7)`qwASE}|{~rH604PGBzYR#%b^rhX07*qoM6N<$f`&|2RR910 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/tv3.png b/gui/slick/images/network/tv3.png new file mode 100644 index 0000000000000000000000000000000000000000..273ed7043003d2442ea5ec41e6187fe678d64daf GIT binary patch literal 1003 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 Hu0mjfp1hTD literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/upn.png b/gui/slick/images/network/upn.png new file mode 100644 index 0000000000000000000000000000000000000000..85fcd8cd0861cf39b26e1e7959462491685bbfce GIT binary patch literal 1113 zcmV-f1g86mP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<-$_J4RCwCt*=vXwRTu{FpIT{YQQ6HmwUA2Yi8#kwDW&EJT{Sc##S_79t{sCWFqM2yI_X9C7S1;9gi0b_Cdzs&7{2e1Ka z@N%wyfeRu(RRB_Z0H$C(hG1?xY{o~jsVG-UgLfaUe9J#ty z`iDV{p+9_VodI|W)A1sP;~X?6&db={(SYvQp6k{4nwSBc)v)%w@KJRI;6D6;;$L8Sp_BqC@4OR-*U0JsAmMIMcX zg(qKyo;lyxU;=vz5Kbuk0Q73mg5HI^qiz5U#>~h)i`d^S8qg=_>l#w=9)-44b5<8~ z&TDvv0Jow}01U|&{j5k{W)|b?i_PsSI z04$4&4#WHuK^1L?k0|5&-cn22X3|ipT`^SI=}jGs4=fU+y`}NEp-}zBb*%>H7f!E{ zn%aruouM&tl;S+c)wv-uAu)YYJ7eFaKA5@}>)ncXiuC#N{ZY4fWlwNn8W&Gu0X{9p z-p|oldJL0`ykTTQqB?7Ubadbo+`JF>kBBK%n_sJ~b-rkSwXM1ufK|9A@*7ELI#auk zN~>!DE-R9qrlNdScN3`S16-BP&-FQ$rwz6|wZLv|t@5VWc2h&i`zW4w0BC>x7nrN9 zcQ;vEZ*WMF3v@&)@LD#$$pNDM`D0{@wm$w7@eL!i{q^Y=)7z=-7uZ*6b(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<+(|@1RCwCtnOjIyQ51&1@s@VQihM}RQt3h%(TymGii9MH9-1yn+CxQI_E1nS zy+l+7MIi(wL`4RTFPSM(8ATCk1{q}cJ9fde3zTK)^e{^pHs_pu&Y3gLgFg(z-h1tJ z_E~%Fwg0t_FBlBcpAkntM*@J~?~em=fh3??kx2r+0M9M-Dt00bn!GuEdOeKxwQE zFkCZUD%VtjOZ``Xl?MGkSFN?``V&&{rPNV-odK#l^?F)cXXO7eU~Tb0Xw3ATw%8Y=(G?@d?0VV3$d@sKYbh zpwgFZb8e;+19WTdZmVl;m}Wc)*blsx{9vg?(q)7)v63#OXQtXd#y@$%+v+xNz+>(RWP>7&)=FYALNjNP1O2tKyQhJ*7IHT)4=P$BVVz6!C(---|u80DPacqL+lVQ0kStC`{`6cAP@){pg*JE ce;xim09N0|tjaO)x&QzG07*qoM6N<$f(3TwlK=n! literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/usa-network.png b/gui/slick/images/network/usa-network.png new file mode 100644 index 0000000000000000000000000000000000000000..4439255e4e0b7f94a637c14078f4953bf6cb90f1 GIT binary patch literal 1110 zcmV-c1gZOpP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<+(|@1RCwCtnOjIyQ51&1@s@VQihM}RQt3h%(TymGii9MH9-1yn+CxQI_E1nS zy+l+7MIi(wL`4RTFPSM(8ATCk1{q}cJ9fde3zTK)^e{^pHs_pu&Y3gLgFg(z-h1tJ z_E~%Fwg0t_FBlBcpAkntM*@J~?~em=fh3??kx2r+0M9M-Dt00bn!GuEdOeKxwQE zFkCZUD%VtjOZ``Xl?MGkSFN?``V&&{rPNV-odK#l^?F)cXXO7eU~Tb0Xw3ATw%8Y=(G?@d?0VV3$d@sKYbh zpwgFZb8e;+19WTdZmVl;m}Wc)*blsx{9vg?(q)7)v63#OXQtXd#y@$%+v+xNz+>(RWP>7&)=FYALNjNP1O2tKyQhJ*7IHT)4=P$BVVz6!C(---|u80DPacqL+lVQ0kStC`{`6cAP@){pg*JE ce;xim09N0|tjaO)x&QzG07*qoM6N<$f(3TwlK=n! literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/usa.png b/gui/slick/images/network/usa.png new file mode 100644 index 0000000000000000000000000000000000000000..4439255e4e0b7f94a637c14078f4953bf6cb90f1 GIT binary patch literal 1110 zcmV-c1gZOpP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<+(|@1RCwCtnOjIyQ51&1@s@VQihM}RQt3h%(TymGii9MH9-1yn+CxQI_E1nS zy+l+7MIi(wL`4RTFPSM(8ATCk1{q}cJ9fde3zTK)^e{^pHs_pu&Y3gLgFg(z-h1tJ z_E~%Fwg0t_FBlBcpAkntM*@J~?~em=fh3??kx2r+0M9M-Dt00bn!GuEdOeKxwQE zFkCZUD%VtjOZ``Xl?MGkSFN?``V&&{rPNV-odK#l^?F)cXXO7eU~Tb0Xw3ATw%8Y=(G?@d?0VV3$d@sKYbh zpwgFZb8e;+19WTdZmVl;m}Wc)*blsx{9vg?(q)7)v63#OXQtXd#y@$%+v+xNz+>(RWP>7&)=FYALNjNP1O2tKyQhJ*7IHT)4=P$BVVz6!C(---|u80DPacqL+lVQ0kStC`{`6cAP@){pg*JE ce;xim09N0|tjaO)x&QzG07*qoM6N<$f(3TwlK=n! literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/usanetwork.png b/gui/slick/images/network/usanetwork.png new file mode 100644 index 0000000000000000000000000000000000000000..4439255e4e0b7f94a637c14078f4953bf6cb90f1 GIT binary patch literal 1110 zcmV-c1gZOpP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<+(|@1RCwCtnOjIyQ51&1@s@VQihM}RQt3h%(TymGii9MH9-1yn+CxQI_E1nS zy+l+7MIi(wL`4RTFPSM(8ATCk1{q}cJ9fde3zTK)^e{^pHs_pu&Y3gLgFg(z-h1tJ z_E~%Fwg0t_FBlBcpAkntM*@J~?~em=fh3??kx2r+0M9M-Dt00bn!GuEdOeKxwQE zFkCZUD%VtjOZ``Xl?MGkSFN?``V&&{rPNV-odK#l^?F)cXXO7eU~Tb0Xw3ATw%8Y=(G?@d?0VV3$d@sKYbh zpwgFZb8e;+19WTdZmVl;m}Wc)*blsx{9vg?(q)7)v63#OXQtXd#y@$%+v+xNz+>(RWP>7&)=FYALNjNP1O2tKyQhJ*7IHT)4=P$BVVz6!C(---|u80DPacqL+lVQ0kStC`{`6cAP@){pg*JE ce;xim09N0|tjaO)x&QzG07*qoM6N<$f(3TwlK=n! literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/vara.png b/gui/slick/images/network/vara.png new file mode 100644 index 0000000000000000000000000000000000000000..5a358a7ab5d61ea9af571a9832301569c061e858 GIT binary patch literal 1164 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 U=$1c^`~Uy|07*qoM6N<$f{_yYRsaA1 literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/vox.png b/gui/slick/images/network/vox.png new file mode 100644 index 0000000000000000000000000000000000000000..58c60ced98928f77a74c4a0576bb17cb7f587c5f GIT binary patch literal 970 zcmV;*12z1KP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZjt`M#ms6+H^zxmWroHxFduDo?`NJ@? zzi)ltUhBWt{w`~Vn$4zu#v%F~0|EvF^f{(Z{umw}{=e@v69+TL9vPp{@n@TEO2W^~ z7+V(AXJZ2Uq0wmkLjbm5KK>{$oPwWm7RD0JSL4!xNzB2IxELSRAZruO#1CyGOvQ&- z8jFD^a9(2WlbD7foH9wkzjgq2;KGWDZNzm6=MR$XX@O?seV!WPJco=u(WP!J^tHRkT%xk&cloI>$tp58eEg%^xpWMTjD&mD;~uIIKD+T9T#9vJk=tbgB>jX3oNT!2keTS zP=<3NrL0cq_u$h4`O3%?DIA8^aA=#niB~&_A&V>0VzLm*i3K}xZ9?~ULVjz8-#H1A z-m6K#QjB(53GT(V3fp5783Dd7kS)MbnUh~!Ap5q);#c6^ZcE{{T?C%r6IEE9?c0vu zYS=I9MKACrp6QT)`HA8t7oQc#X4SC2CYAQ;HbWaaBw${F>;Rt6w0|M-3e~}eAfhV* zM)61o1l(ToT8&rOZcgl$Gdh^Z-I1}nYKL#AdDAya(o!Y3t*UsoVsn5YkO@FEsf zw!~CcvUntvxAVWct2rtPnWIu_J~XSJ0SpWiYHSwep{5cIe0ui zRk#SJCv;aw&9JD#$BgK9k7;S4Yn=%F8m(|n^z9{1!&3>}dfXQs<9LRzqw!`pM`9a; zh!h%8d-n=!qLC@W9TDK*8=RWyb4h!9U59{)=*q^TF&U3KyNRFTiSz;s@ht97=%2>* zZL%FWzv4t_63cO0oDOBjfYxBNC91L+EltZW_^w9;OyEh}Tu@OCl@wH4W1CO+-*d$F sxOc?g4hR1X^*IIv37oB>(^b literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/vpro.png b/gui/slick/images/network/vpro.png new file mode 100644 index 0000000000000000000000000000000000000000..7699e22a957c1aa58d3985081480285426f1c474 GIT binary patch literal 1561 zcmV+!2Il#RP)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ>pGibPRCwC#nR`r^WfaFhKlq8)QZT6yBX!+3%hph0)dpw#jrY9I z^FEjFbI$ji^APCl?4&zO9Nk=c0O;-j1hTWUk9Uk-Knl=d-n9WofOhGsqYT>z{E z&I>bGAD{&o18fV??=oPd!19w6;8XRn(gDl_N@YQQk_kYCe*W+?a0qxp z@4k_VJQilqVxZR9{1{*zupGES?<$yVpYSlVaY z$BXCFW0>KqRf_qEu>i0WIA9R0QiOO=dZq?1l|B@BQppp*ARkw8 z<#dNMF=Kghr+MBWvONQsCo6Sj8!+A^M$NL2m}-GiGnmKJ9w5^l;wcb2{~`SgV4=wG z9H7$pwdLr;`2m`JS# zgfes570TcWfVJAV7e4cW?-gddl7+yvCW8fdNOKS?30hgM6I*NEjSR7Qz=j;s|wAQ=}%EwdpLr+<5^{i83OAc zy%b$7ppt-FeDd<$Mjvm;(Sm$P&%;$Bf2S0-!t{GZRR38NTq7Ny86gl}RXwp^ z^+G_`c&F-low>~6-vXdYIsY#GUE`4AAer$BpKtf5hG>xmHJP?cmGai<0>&lOd$h*u zbqDC(K7XZLW&MABEgq*|dx$>0y9kZ{3kmf6Z?Kz74*=aAfWHR-UEO0!Tt+C`00000 LNkvXXu0mjfVN}RP literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/vtm.png b/gui/slick/images/network/vtm.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd499b23497407765ba2dfbc292f99f9c2c6390 GIT binary patch literal 898 zcmV-|1AY97P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ<2uVaiRCwCt*{&XtpNakW+!<7S~UQmRR%!qN&%Cv20FL0zgnkqQ2`2e+hv%({aSOI$dCq<}KEzIZovGXR;T3F%`QO-%y+LsW zP^*K^_f_=@yn$O1`i~O2x4HoT#sd8>SccDYq~$nX4S@G!5N~G|59b58hpWy3TNAqN ziRhoLApczG@VgyYfm0_qW^V!yi{Tzr7#%qY?m`crBrSFUC*1 zi2m!?7G39=62IqT%a_R_Y)k~FEeEPdf^FG^cM=uiXhA-hhgtY00a_dQqXoHP7gol6 z5bG0u!`K)1&*4%0lk*v`k_X&`7Zdu&5{raSur#61Zp-Tu_WLu7ho=kvPj*KRMW3IS zX;l-UEeYLU3Edn#fpZDl7n%FPggqa%(*^(KRIbAtpG=}?cIkgRo|?eB^+AlY6SfTj z%tHLwsa-8;(OXrt@spv#+dA0qz^b@kSyEP?!RD#h3p^MJr&ILXtZqp!o(H^Jpr7mi zhpM|v%G8tv;PEJPDe{q*S@;eQOz_!1=jP`N{6=#*;J1WNM{d%*4DddStBEnpP<*6* z4}QR&;O_k{oz>@MED~*2<_F8{%LHsJ$M+in{<+MWF5t;43BXWXlQ|RUM&=|4SZXJ4 zyw(pydMXF>EC7ufthrGJz(5TE7$^ha`x*dn!lf_Y$tv(t7$1t-+Do6xnmC4aS>?Y2 Y0QbL+Me2KV?*IS*07*qoM6N<$f`9v&X8-^I literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/wowow.png b/gui/slick/images/network/wowow.png new file mode 100644 index 0000000000000000000000000000000000000000..1c460eaee67dd2b0fc39b30b11f7b0621122c023 GIT binary patch literal 1743 zcmbVN4NMbf7``D2;?OA!7?I^xP+>^hYw6#OQfUhU@>`fRNCroH&;xpRw1+Jy_=}EA z7&1fw4QON<6hVY4(IDVJaRxR6g3L{)4jfEjA}apit_W^Rj7xU8yYG9yd!Oh1&*epg zt+usswgCXZHYiZ8px0IO16t3c--iz5Y^RrxD1RjtMI=!MM27-?Y9bK@gS1F8sz4ES zW_l;;0|0Z9uxKTv3=M%*gqDezb(lsiNuvS4M`9!qRVqq>iD)v0iy5P5&oe+wEoQ{< zLfN6D4Ao$PSvoW-D=b=-m8ue{84_R6#|YB|T9iUSqc#oK!$vVpxBQM>i4v5y_v7WXg6cNVP(t+QyqP+=lA^lT3Pw_`PW43He_FTI= zu}^s?wxPrN(YA5&1KcC5=CNwft+m85yEK(;arK~Wb0<;|Yd7Y0!?g7`4OdX99EA~H zL!0-d`i__sS8+mhM^0pX^?=J*uqyleqT02S4|<*_wuha(_B)oJI|bo&vjjQXyieQwHGk4n zBdT*?)m3D$=OzW7iEHnS;2ZOt`+=K?>$%)JaChl2*F!%n>Dk{m1`M`pdP};4*NsmV zOk_;8U-^RRp$~4H8iHf<;VjW(FVb;g%PObZV##qmk#eD_5S-Z3@UUi)+enj#eDlb| z@)K#E(eXtaO;&?XeT(+wnX2YqyIuZg`oQG^o8G0HvI)0K@qLvQw^@%quRdISGW!#Y z;*oQuRBWwb@ScyN%w^kfVdmMMj^eiNM=zd-?ATRXQXB1ZP_2DYohVRx5I^O(sKT#* zcnYtom-JQgTJ0+?Dm)LhrAK8Txy9qsu3KdPaR$69W^D+jbmAP5y!7LRwB?iY#Q0WM$Xt-d!6mljkp$jf~by+;2~L4CmN<_V4EV?#Rm}34m#D^RaK@ RBbnx3Opt$={Dd@N>tAu(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ=_(?=TRCwC#nOkgCMHGg=)1FdV3RsFIs6d2>P_Ctl!Nfa?cnK1*3YcmX6=DpE zC`L4z7~w&UJZPc`QHhAA7aAg>C|EC`7^@;R0W?-A70`GKm5bqWeECmYS($zIX?mg$ z?VmJzpV@1#nfYhUTL0`OQmGW(8F_Sb^bpY92}q`Is;jI2>%I&1ckut3d~I#*zXaq6 zj{$vvlRz2pye3!)>;lG$^w)qZffk?&_#CJJe$t;sKVTfN6-WTrh`9QkMnDemGH|PF zTMA4Ez61IL*8z>d#Xt$r3Y-m`0B!@m1$F?3fUALDfVIGK;8nfb3z(2A0&7)jk2iylV$Yuzz(Y<#JxIu$y)GpMwVwstsFm+fbler=tKHnM0cJ0D!ki}=fLf4i8t~b9Y#`xZ-tzq#c zu*&V@t8^U~5t#F2=2?k6{1f+dX~r3Z?%?T)Md4>vX)$_Mu-f!e45 zILGx-CZh6G5%wr)`b2(t)Z{xuz?;Akg^$OgfPD4)b)*eD?f=C}a`tSnJ+OKWBGixd z9h1Wj19Kgr04o*#T~>l?w0a(UBw##72WqrWLOucZa=%+mCAl_c?Aw$#`a7HTxsbw7 zsHB9#e;{yLpgpbvGzD_XUKgt63SWRpG5$6w+&vC-^)NIWcqGH~K1w_b-D=wkZ~~~6 z@W|KxZvmD$U*}7v{vf?y0z3}97f^B^Df*J?uTG~+Vxp>31WZ!s$6=oKb9x0TR0Zr{ z=eT!DB!R6oZ8sHTfbNSF31>P&FA9ufXrOJfwnwM8K&ez+HYj%4*Vq3qOkaf}y)r_X z&DHtB=9n>xv@~`be@W>8fUg2$Tk1+`?`#S980Z`EEL2kN&9MJ((dxDX`!z}Ld#qM! zb%4Bqu5F0&MY|4AA7)5+<@yk_K_6X4WJ5r`SdS7s6BULQRlukS0!{@^*Qv5pB#a7_ z$@2pJ)#>zS(N~&cuzVjhI$~ACHlHpX(Hcj@s1nY zH1?~c-mJ4mg~qlnL_nhFUt`@IJp}X+(9QAB06@tTRNFDVr~m)}07*qoM6N<$g0hTp AK>z>% literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/youtube.png b/gui/slick/images/network/youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..3f38f81a67a7a9380188a681f3c5535ba2f0ed20 GIT binary patch literal 2342 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 M07*qoM6N<$f|34Gxc~qF literal 0 HcmV?d00001 diff --git a/gui/slick/images/network/zdf.png b/gui/slick/images/network/zdf.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4acb7e8e178d04aaa828b879fbd43b4bcc4316 GIT binary patch literal 986 zcmV<0110>4P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ*G}F=6^u4t$jKwm5Qm1PE#Dy>IwAr_BQgIV{kPt!2+C!nb?D!*oqIZWug@v z7#Juo~U^2)HQ;W@TgJzxFkl$UWEO9NRF2?p*(0aXk&EVlAGp zBG-vge1U3N+gzL+W9fJ|cHze|2)G-wnk3-5I*XWrd+|6{jUo3PUc{QD?Mj@{38brY_|*Rg4@;$V!wfDNq-f@hW(ba%$?PY*@jPj{NyOE=zWBz8^Hdb}GxIu>rn zgAF{Z+OB5)p2t;XS->9!33xcUUyR$r#781%Ev&MuwQxq2zBlk%E`OMTZ^|NIM?nIz z9N?s|hDNZjhVt{0--lxTn~IdzjS%o*K?1tsdP`Z~#Xofp7t~N1!{5vm#6E zN@|kDI047EIu-s2pW(bF=g5@ZierO>JOQIv8G#bkhfHV4cOlB8YHQ1s-xUPilgs{kCZZTxk4Ks`w>N`?nPbSz!IQWmx7*qKeh8l? z$3>fzUT&rj%iz}tAXMY+PlaVS5jCqj1y5oO}i zD0SQ7NGz-G`%9R67?(vopq&U1x%cuK2}>gwj1qgZNk)02)cRTd2eK5dZ)H07*qo IM6N<$f^T`nXaE2J literal 0 HcmV?d00001 diff --git a/gui/slick/images/next.gif b/gui/slick/images/next.gif new file mode 100644 index 0000000000000000000000000000000000000000..410d7da580f6e89d7d58959a09b490f74a45a958 GIT binary patch literal 898 zcmZ?wbhEHb6krfy_%6j@;}Do%RDb!(jWcI2rKFdB`SNw{{1ww?E_(a+{f{3%14B|4 zE?Rx!MWu}i$%W4D5tY>)7B+qiqhK@y zhExbB{$ycfV31 URD`W5aBy<%_Fv4!!@*z;0EInLmH+?% literal 0 HcmV?d00001 diff --git a/gui/slick/images/nfo-no.gif b/gui/slick/images/nfo-no.gif new file mode 100644 index 0000000000000000000000000000000000000000..fba19585f82f616c6c90e0341738e100dfb02965 GIT binary patch literal 98 zcmZ?wbhEHb6ldUOn8?iV`0?W%J9d2d@PUDWLGdRGBLf37gAS0*0Fq~5GLGq6nf-u& zv5mux?&4+QUy~c-MW->Aajle^uu5~8cKE*6-J93VX*XZXnHO~^>G%c@HFj18YXC|e BBC`Mh literal 0 HcmV?d00001 diff --git a/gui/slick/images/nfo.gif b/gui/slick/images/nfo.gif new file mode 100644 index 0000000000000000000000000000000000000000..c43c309e1b3500497274bdd7484fb3ca61aeab3d GIT binary patch literal 98 zcmZ?wbhEHb6ldUOn8?8J|Ns9}r%uh9HH(3PLGdRGs|b+R0b&M_JOh*Qk-nALkN6kc zDBb8TUMBuExiMaJ8gm)jN~;O0G?!_I?|a?7dEK0L^R=9LQHPR_Z}3oKWM!}h06@ng Au>b%7 literal 0 HcmV?d00001 diff --git a/gui/slick/images/no16.png b/gui/slick/images/no16.png new file mode 100644 index 0000000000000000000000000000000000000000..707f5379753bb37edc8dd846d209549b20f95526 GIT binary patch literal 2931 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 Eg2QVXivR!s literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/growl.png b/gui/slick/images/notifiers/growl.png new file mode 100644 index 0000000000000000000000000000000000000000..a270d46ba1012980a40cd16f5716c77cf8af2668 GIT binary patch literal 1783 zcmVP000;W1^@s654Bdt0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&nMp)JRCwB~R%>h=R~7zd=FZHHch|e? z-Np8rUE4|4c{oZP>?DoT#EF6v(ojku1^P-&Br1{q0E*g5X$$<|)j}$@Qi~J_5Vs1g zs#eup6`)vyAlu*SsPi}cB$JqZVt69_ zuEAQsF(&?V5d06Lbey3N;ebdwyHN>8PPMkIww~_2^g`&uuUe~J0yL8>9fUKB;B;!( zWNxgP@_S7;QRT$0H{VU2iO83*W=%7Gd%XK|-wOQg;Vo_)O%y(Di?A$n%aQ?0!vzCt zWX`*l*x(>Z^+KT_eqf=13|~3`2QRR{(TNj(>OG4OKe&MD$#J;boQE|g-3^Za6bz}X zblzmov5*VJZ>KYG?NEE|)_?ed8UwI(Hztn85ilA2w~NLHnHx zYhyEF_jE}8lAMLD=w;CC3&VXi3NxR<_rDxLumKntAx(l=x;YJus)Ad#6?|Yf$bknR zrJx**Jq;5gxUF^PNk!N0>plH8CPqgvzup3@SP6Gs6$H!N{*l2rrl}x1n)C2CoPkUl z(bBO3$^JR$nTSgh43NAEdBt6D-+huQlX`M+ZxJpb0hY=$saUYKdGNJV-#rh#+U?j= zRRt{b$bfh|AT+?Nfk8gs76w?Lokvklq5ee#z0!}b$W0B+~9eL0Unab9^Zev zet0oXr0qXUVIet;{xKfUf6of17jP#{$SRc^61XxN!srl-;L50?tLA$a3Ra~n2+OH< zRWp+;%Z7;6V!+1DLn2Wy1Y3xzeSx8rVnuu2D)CZ#Qwlxr&!GE+3=h@xksl<0N*RZ~ zXyA>D3B;y{(O{vWj_D$6;hz^dbuL`2+q{rAH>tXT3Q=k&g`xr|F$8xU+Lz%6U$^CY zIVl*RwIc}RIXq>~Atq0w@1uEa@KN$}CgRr&Y+K9V?VqaX|Ovul?LKbHpQ6j14=8RuIAu(i;q^Hlc3RE;TE<3%KL29Ev(NM~}mf8QWX-GN>H zQPjKibDY1nb~2Vz2RSv3-L-xFbzWVO73TAs8w%LkoIzVX6{J;#%_RY!U5SP8YV`Cv z@M2E_$9iVaXjz1>Qb)i;&^ut@?;+r^yEFLa9br@v_RYBn|0MITV!W}f89%-2IvPDG z%8+!%W5#JgWI3K^X#6!SYm+cM)rdVmszX-Rkf%were|^I#w<=fqeD*+ET&n^#8uR} zOz1^nT#?BJO*PZyQmcN&)_ zHB?y(*wmuq@B^jF3Va-9q0_d|>?i08;p&fH)pkYFTG}q&Y!eWvS`KU@7^3o=SfEU( z@y*Mb)m@$BgwM;iP)2C1(crE$5ltKL(2`TxNC`waOoj+ll|`0j!}(GD;j^fF~x>Sr+jWgD}m{u~~iW&mZc47??3%xKRrJ z*$}m*fNRnN(`v%Wc2JwpeOMW#gqVDdlfV2D$bBfKa-=@-J65q?bWT%+>Px|2CMVlKez~ Z0RY=8#4@cVpy&Vq002ovPDHLkV1iqhSoQz_ literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/libnotify.png b/gui/slick/images/notifiers/libnotify.png new file mode 100644 index 0000000000000000000000000000000000000000..55f6873dfc2eb4b71019e3f62bc215dab7548cdb GIT binary patch literal 1375 zcmV-l1)%zgP)&6JMwOQF!X-k?!ghm&?iWEiq!|V zwY0XiUnU45aPo&+R?S^726kYYU$s9VDy@*D3~Nxfh`qLg=L^9Qm+Y!vVd?n@*|Gnk4Tcj z8zQaX^96R7i$zcr1xS)`j_c_g`cTyrkR%CA1c8Ab8;MdOcgYE8nWhu4w}1E1a3uPs zY3ZFiy7rwm4H<1>C7d8ZRpe@MC3`y*3M0$|FIHA7&OQ_2%rGusi|qNCsp(rd0upG( zgV8P*1Oj!Eh)R$p8A2f@hNIHU1@?;D;|7kcTuLsk@PJtqN`Wy=1Fc%%Vrbx3*%xuVDg^}yigJ; zf-=Jm@m{yr_pE7Xz?I79rYDo*nM?xJXacdTXZT~UpBQ4?-mcVA;w#jQ+YICJ zOitYCNX*YCJd774S%i3VODGzPjj5W}Nf3BvXZJu$F`rYpa^ZolQQywZPCt}ou9hU> za2&Sp=sg#S1;>+#M?Lo^Cvy$a*iOW~&!Vx$*KH!>#2Og{o=1G65j`ld8FWv&zRo%vqLDVj=Ld|h@Or#u`=_mK+dok?6=YF#l!0N`Cc4^w#7~&I_wZO^?%wqp z8b4+s>=_#Vy0N+OOoihda@Q8J3d?ONzomq7>jXh0~ zK#(Nps(v$ykN(2pPqFm!EZwOBftNoQ)-oq)|PQ6Ei{ zgSM3Z&u|=fl2@earAk>py||b)G+o~u(BpPvHuFs-J7X$TyaZS@uxfE0d;rH3;`^W7eeE#}Tp09u+%SbsDU}!o~=l9oQXq%?X zsBGh**Xy?|+&E;KXmFyS7!J>%X?>KU=vkki{s0|!VjX9+y{fCqsX`&kt=~VJ7~Is< z0jQ*pR9*huhQfx_E*&+_$y!G=vHcj10Zr1crIymaag`O=LVD|5BcZve9ej1(AxTj# zpgf13l(KV(0a=>zzQdMRZshan%~#S^_Y}HYAQ%jTZdwOS%RGXRZeN24zeQ8j_vI2- hEfiCmc>Ava0{|5#eYA4Be}@17002ovPDHLkV1gM{kV^mn literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/nma.png b/gui/slick/images/notifiers/nma.png new file mode 100644 index 0000000000000000000000000000000000000000..15dfa7f4a362418bd5a240a051d8c25a6fa8bd1b GIT binary patch literal 1739 zcmV;+1~mDJP)kb zNAisWe-3Yd?{HP~Xx^6_5}z&y33}3_l^YWCoicF%=xTg z2BS{Do}Z3He55?u=pdIAJ+D4l{b*{Gp}M(*%oPq_$wl*g3-L||;kpVrnX3%r!yIG7 z0xk(hW?6XmHGzCOy5qiQru3>Bx2HH+F(Nzxf5`Q)U%&6U;G@X|c~j%m@jwNtVn86EB5_K?8@&SWza@f7fSMK)OkucxyTljQ>p1hag`JxPMh7+6l9eq8)j`J+iRIg}cx0D~{l5y} z?=LF|)=8Y)%h9&j_v>3%Sc@k{nN;q7tO-+B*&_#jsjRZeWG?Mu`C~d(Y%tKX)kg1D zmAv(1**X==)(hNxk3h86hcgEi{9!wT35n!{gR^fiaGyg^vBuBb>6|5qhD0a^ zF?fKjxiTVA*Xn``j)4ObC-zI6?+@bPULWq+Xkl!$fW&DBj99yC3&-m3`?2Sze*EQU z#Krq1m_%$a#-Wgb#2JQ>Q&_*?ZtND)Kv&|7TqLCfNe~D>FmjUPN7LC4pJ9r=}@3(l*;N=gq-3f@@X_)GfDcXrqvJN7>eH}l1IO=Pn4&5N9(pzm5#-qU zw2Sr@hdlRWKh|lOi!2qKS=6cpC53B~Tb54%KEmuGlPNNdRa_EAk2~?QmYKrwz5+0s1XR;K3scO zewe&!V9{;0c;dx6)VH#7u{lI?^qB~TPgr>B8%2y=%p%@GWINLa3erN$O~J8njX2G@ z!Y*{)roKa6hC-F(jjVWnrGN$95&Ys{8{U5XL-g-YBb}sb&PnWfDTzyoEMDyIK;0}q zCQ^m6oVSZPLV}>}yj?qN=}7TR(nj}JLa(%bN?>B51h3diMYEia-`d`Y+8PJZSP1df zAcB;pT7YAAX9zx_VO~3@B5OcNw+MGHI*G|_37=k~qU+A8zD!brmk6)=7IoM1EwLdN zIw>bFiI4iYr_8~?i9Fio6KS@EOBW0z&KZQQM02N$Q$u+~YN@kQYcUP#0$J0e7%LyH z{j2Kdhb_~s%mbk^)HVA)|KqhEym|cfB>es$5zA{-Fii)BS;UHs zt@*7zvv0X{ULWxqX}MjSB?rZ<^VYWB_6L7(pV2pbDnr$(Qf0W6`T2>fGUYrD?^w}* zP0zJFFfnG1xOT;OIWLK5OkTC1DD34Q{b}BYFRX4Le=6a6qCOv+aaW96W#y|LYED1i zH}`Ag=)Qc$zCLiSPc+UMybCSJ2k%}}f3UGF(4M+%cBIF3BF~v|dj=LRjbigp=KS&N z-)>qvnY4~&(-MkcGtcD8baROlj(EG~8C>~p|J0hHV^hmU2J@|6l#CpyZ&uN9OK4=_ z9g#!xKNo$KxH>eR(94$ literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/nmj.png b/gui/slick/images/notifiers/nmj.png new file mode 100644 index 0000000000000000000000000000000000000000..e0eecef9ba5bdc54ee7c23286e5ad8fb7a13f366 GIT binary patch literal 1117 zcmV-j1fu(iP)nF4wrR}}FukY<-;maSM+&A|<=RW5-=e*~<7x)h;w5lF>@qgsd0b?g2PZL6#$(u*B&#s42tTt%149~KRVr)F#=d^o5{@H0|TgS|c ze3mk=q2AP#V_}OY9f^VU$k>zb@z);Tlm6Q35Br`n94F)%Lc~f!Rb|T9)oJ~{_2^w) z8}byT|Kd^~_BQHUKI+`^)jfB!JC+ElD)qY$?l*PNEt4{g4QyK^*GSVZ}ATTopC8t7uMU{~URM42RZ`UBk zDS!c|m*|rD(HcDU`$u64VCK6Qd(>_2$hM0{l{Ur|FnWp zX2AZ#CMb0c@C{!_MtURKTRyvZ;IONfSvs({Idr!@!Zh^s5@eokhUB%v^E*M|o@)4q z2asJ>0ngPQl+-;5)6RR#sLKGm8lt5G`0W;M#bWn)T58qqIA=&Np5=_85_!}l6 zKg({AEHvXeM*_|*8WeeR)6jqZQxyDq2@7AI!^DNJ!E7ytU7Ul9!3fBz$g)f&U`wO( zq2FA9xd-pZAALU|SpO)-atw$)Q3vggUGNgzSQA;6X#q}on9>%aP#KI+J@+gW)?(Xa{yK{WL-)!R%W1Q^F?B<(!kLP*b=UX=C%Jr};yMD^#hG(ZvZR}DM zCBj_}j(;8u|9>#XU^{j;kr>&X92$LGRh2Pze*4Fw)KqLXT$uaCvzJ;w%Mnq|ncL=ot;EZAlN z5=B!ur#k~vH8^yNg!osF)x&XI_@%mpMv|}`2`2GXuGrpbiPN$P zWT_GEIPHz@HI9BIW6dvRS+f7qGe=ZWJcjqyQZX~+#Cm=zZh891(Y3xcWuX{ z?{`D?2fzct2_bL@3M=Ibn5LmLJd&5SVCyEsa`jBsfJqC2hwRV@8W(or+7~us+GPt7 zo6-y|(U0QC@51_SFEC>k%BxqPAcw$@9E3&UDA+(gUqmifL?%~&X*rN=yDTfdnVaN* zPv?$9t#NA6K_zcOs}G}gdJ{NRIC*{t+HP5f<|~#W(|rWF?VAa3B76OuOFeFHKn390Qb0woQ&<7RM!LI3p-BqE-XOa)l7qQEVg63l7U^i;xtyuEN8sySp3~!?(Q!WATS_!G=M<_%*e14A) zi4vep2~^@hBH;>oN|FplvMZ;vn76bYk8Zvbi&o6XO&e~6uW34d+H(jeKG+F=OB)t$ zydDFG2aw&f6S!_2csK^N`ztU-1E)$w2b|cJylfMdGZHdc1@u@w_Px6Y^XfXWqGK&S ze(y6peD6xUy6;V@Fp9koJ%OR#F>48 zI=5YrcOY*RNEHPvS}+$^ceLT`u`}5B)*JZYWDbu#umZ#(P$J z!AFPAVDA^ZNRAb3dF27LcP_;{ukS#%LbJAf5qSC>Mt?g^q@RyKjSomB;MPx}p$iby zuIF7|Y(|v}c?$i)uVKkm7o$K^+;#JVShjov?z;C$uZvaJb-?Nyq%j3%&z=UDMcAbr z>SokKqk!Nh&=e+_%8(hV=18#>k6h0{CDDqfqT?q{;m4ynBD4bskMvV`6N-3?hHmQ% zuV8F2g~)j=NPPP>a{WDIegXJ@-Vb}=Cny3GGDFdTh^+|91wxRP#`%>Vg|4$b)2J1|q6~GWXMtRwwl4Z89Q- zOWrKH5dskf35aF6y8YiT&r_00E~$`w6FxjBM@`hUlXDNF>tT5Nl|0C*DzI#T#``YSgx{4<`Nf??O~9 za2ETo2qb>niQ literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/plex.png b/gui/slick/images/notifiers/plex.png new file mode 100644 index 0000000000000000000000000000000000000000..ca35df8064e63ca4467d07e66863f6ca8e8c0d93 GIT binary patch literal 1759 zcmV<51|a!~P) znnvj(jh)60wZ|F9^S0-8XYTv5CmK~vYL2v}8J&C9-g}+B)?x68#j-5&`6=jn1b*Oy z=Xhv}govi>lLY>8j^}a=z`3rwZaMCotxoT62A90W%2Q-IsV9TF`(j`?Zk3yt3KxUhMRo7O)-KeH~0pW|4_U zpW+1J95Xs2*28M`i_Jh-+AhULMEVW=SyG9Mt?T|~5X9iC;K`fqXLOrueU<2WB< za`&cVkR3^Wn~x;VDhD6tg3#%CYGdEXnpZZh>x*9q(noPge``k&`;c*oH_-pu17be%K+PY9 z#c+^YD_>}Jx<3qn;BEq4ksntRneX)X9*5hkfN8A3x7rA?4n`Cc7p}JP%+VC|xB*mc z#P%?>$KkKn63C75u=qF}R)Gu~;=}>?n=6{%t$%1b?jp-lVLXFl!uWpbM<#$<;8;L( zyWj&G%Ai2r!}osC2h!63O%G~1zJA=su{oN5E{=3UrID4;s}x|HRQHYp5C#5uiRZ>S zS>R?VPV;k5O;}O_Tx}VW*8y)+kl0v`Loy=bqqPpE(M=N=s%&<6+C&=MwHuv*C$={%5a*u$!0tVvP!aI zB%Un9W_;hFtfFN)=ve_g&LJ)>L}VW$H2VtU!Ztj_Qc*l{I0M{SA|6~I7U0s~9a6cE zfH%;pTL`oqL_G;}upa~-OTKf%x6NCs>_SLQzzqbj)PZ9;sMMO+s#OsadvI(Er=H!1 z^b}oo;W}M-8!H6^XWvke9EqR@9kwOZs zhDbbuRwxfEK8xPi5#pY-So|jl{3oXC-(Uwq+v;@BNrCkNSGf#B%R)%*1tY3t6(*K8 z9DMERIQH%_fi-fz9U7`d0cZZE;(=-MA~gdeltZKBA~LfdBb#r*SzmIS-TrUxu?iZg z`j~8;C|fM#{3Ap`4b^4`N0Jr1{0#!HmIvwsqyXQ2HI7PaWB2f)vY9C)YehfLi z3G4D7P$=9!ZJ6f8dlHa2-3W)I#Dvm4TrwHN@`r$K11EFuVn@4-Yd1JphJ-iXk@50X z9odvX8gWSVEV7?{1WH6g=^w9S>4U{TZB#3#x3%lRnwy#aWqdsQOe-;mFQh zeWFYJR^(Z9d@_H>0Pm2Sl1H%u3sKXdC?Tk%e5tgE^;_5fb#rC)%L6hfR0`w%1RBNY zaMRH>?b(^>=@(+DSSE;0!lPu2sL=tRoVH6ab@1I9y7i6b^774}*PETQbZ+pJ(M6#| z(Y`+cGwdQdjKPO7RhAx_9M2q(C2>TO<;Xz)mT9#u)2!bql^0q@|4sU?LLm%6w52DAmk-}3N`IV@nX#9`&$b|C)~U;w~A+uFB`qFev~002ovPDHLkV1h53 BL?{3N literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/prowl.png b/gui/slick/images/notifiers/prowl.png new file mode 100644 index 0000000000000000000000000000000000000000..c28641ffb7ea0fac98e29ddbeb7dd55e7c229035 GIT binary patch literal 1913 zcmV-<2Zs2GP)hcW&TP0&apP1K|@8Y+oDY}M7ONQ3~^ zHVE66g~IN_-sZA%=5}W0+;6^f2w(Eemz*=-`+e{8Jn!=!=4WSqf?z~}*K$te$I?eU zKN$90-*)ks!ZAGvQ4XBMG4zb}{h%7lq+Tx; znm;;z@MN7i^Se_F-&go|Opy2Jwhl9Bg9Qa~WC((U>|_-4b2X?X9lH zPSvE~JfyhLJ&$I9zylb|fz@&g*P7MG_{^C8qN@6PHYzJfrZf1+Ly8FjOjL_WXw$!)Lls@{0k z@LTB5jp3=;=aEb1;rJ#lyn7a`w=h#qhV<prXSHXvaTM6~xQe(|#@btT z%$;7x{r8%X5&;~?c6mM!gM9WwcsMk(g+`@@WGV?pVkrX;U-{k;UOCpm%STo0cw9oK zEkcrjgNIBU+|S_FGJ_pk9Gp5?#=i;@KJ{D{txb(M@xl8h1A&pk;GV5vq;DG}K}M;t zf&B0&TFo~4MnpV+W(&^#@Gf5aWd~30?!o9NgJ1o^#u^3hv_1S$b8+E3gWXT}5FakI zmJ5z2J?{Ga#7jFTKAn!sX*jNhIG=);h~VnoH%N{?GU*;Dih_8K!xNtwMy7{BrJ%yp z3>5BJ_{*PdY?OGcG~?L&%|T4M|L8Dd-F9s@zn%4jzxAjio^g9KOp7QTnHkG#rM(D zYT&!v{^q~m#njjghBJ>Kl1#(aHB3)Dh3&aLIClIwY|RbhqlY9&GD86za14vV$pmJ; zFpO%c15LG1Th(B8ELet#j-f)gX}T)d7@GwhjFWFZjqAlXLoURa9Ih{X>pPg--VY^l z6(?Re1*5_vnGw-yXjogUV6#w%Qm&z`sc3r@)Pq%QnoB4(mr!ezVYi8gZPT%rBrl$B zstPXMI)@L+Z$bB}cz5wX`2Nd3Mr=&Qz8AB2`>$)b|3Lw>UmL(b|8N7>uP)-l`(%`B zMKs$AsZT{9xrovQpo9G=guA|W`GK46-(l08JE2*hClYNd_Vx`s~0KrBm~ z#YHks8Z6I*9@1T1!-ZZqp>C=u->Z{5GFZ5>iQ=+~NB8wYDK)7!40uGGr!%2-D}@?) z51C&+f!x+Kamb^yY0yDB*luc?LIKx1s4l6fE~=yy17e&A%_bnHIsEDL0{SNsc=U5U zSearx{zk~yCC z${~+xp#xWU$#;VA!YsAA2-#}*(x>LqQ4A)TQoRsN?1h1wL7F zoS^8A3%@R)aI;1BEFs<(3mcBnpcdH*SQeh=hx6e9U0Axan|W929Ay)4 z#I=o_{tT~cre1AW(~O-t9ZA^-NZ;we4FccxgI3AL-meeg{HtZ=+=)e2DH@({2ax3l zUl9+76n$_g;Z8{~nicqO%hlw!ow&L2e*p#n0iK;2^vt9!00000NkvXXu0mjfJGY$d literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/pushalot.png b/gui/slick/images/notifiers/pushalot.png new file mode 100644 index 0000000000000000000000000000000000000000..f1d9008c1e6078ebc2275fe1b28961fa1143ee70 GIT binary patch literal 927 zcmV;Q17Q4#P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O%3;baP00009 za7bBm000ib000ib0l1NC?EnA(8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L z^m3s900QqxL_t(YOP!U^OH@%5$7dJ)SY?To2~lk;s$~%^q=iI8qAj9L5fMdE`42?3 zs)a}`A|gv(XK%oSrnSY(UEE0*RNG6je z;)#gpnkX}AB{Za5+HM3AJ3&ASaK*>Opu0l2ypLeC&W7QLUyS{H3Z95?G{Cu7d`&pL z4_MneeAGCEwyQ|m^ML16aP({wGl2%vl@gKIvS{qzrwzI$E~aS+PoSPXq^?Gp?*L&+ z&Mr1-F>Q<58n?ezn>P;Z$H1W0g(C}mCu;3oe5bUu-9|MWbJd3*OJ?xmW``%vXuX@H9slXK6w82mG0YD}elq?mczSD02?UK?ePiMcA3 zo1poP2E)akRI^nTfT_KR#*^<_{8A!ebG5y3NB=! zl#gi$51V=;@E|Ya0H<8w_?26}RJlUEo#vO%Lj&xFg!te*A?AY}|1^lS^TE&DYxDvw zG~jAVlBvb1sPEmb`RF>W4e7VBMp`QmaF+&b2O&e!68e0o0rcBSlLCFl_o%nI(onGE zKL)&Ja|$f-0H3B*ng$N?X&J&vQ3L2V<(dW#r0FF=uv^-11QNx7Zp$QgbZ@}}Y}e+B zx!-O2jZYx~&P!W!pl}If9g@ZTy0o(n2GH8e(C- z4qku)*`9l#i3ZW4zhn$FfEyrR$}PfX`wOKhK&vCQiFp73002ovPDHLkV1loc BnK%Fd literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/pushbullet.png b/gui/slick/images/notifiers/pushbullet.png new file mode 100644 index 0000000000000000000000000000000000000000..a0446315efbc81c74ca963d5f0c80811c223c0fe GIT binary patch literal 1878 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 KMNUMnLSTXc5;0@| literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/synoindex.png b/gui/slick/images/notifiers/synoindex.png new file mode 100644 index 0000000000000000000000000000000000000000..7aebaa1988ca985675c30a131c5d2ee224e286c7 GIT binary patch literal 1667 zcmV-}27LL6P)P000;W1^@s654Bdt0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU&B}qg^N0RT%%x;#s{Wb`m=+ zP1-bR8x{ctg(AVBoRNySaY8~|_yd45NJU6o5E5`eAaS5l1qX!0a)1LIK!`Q8(9kqV zYdedV@hqPG&G0$4(}oiVp7iwQz4_+%t-tRL_vGU%Sg1`ymSwcN2BIj0B=E?pDv~gS z?>HLm3yLHaC7#Q(C@hH_SCcZrlq^ccFsoHI`fMu0C6(D~^$pYYE_0xf;$Vnj9M8#` zdX6ROOuk&6DT-W4O;Lod6cbIKc@FERmcarMsg{MPDL{q?6M%re za}uB(0lOY>T?bBYX*kD4xYcfBUBprpMMs)@ojUFqV$ZT;$F?zlqz0kBhSi3H?;fb3 z7ywxp(E5Nv;2Cm1i~*C*4LY|;Ntyw+!YT?*j9-5J9rDV<&{SoSa1SfVX-YE*eOy~_ zz+C?mx#=Ik7B9dfYb65FWl|uKAUzKPpbb2teaL`5d1c5s2(=S<(CtxPCFrWWNRj$l z5QN)G94}n;$V5fckg3grXJn#JfCMh_WGx|cB9I&HbEG^a@PQEu$;J5$%-jrm*Ka~k zBxs6yA|nqLZ!~s3`{LUlKAbA$;jt7^XB&#=AtJyo0U2zl=tvegGYOPwRh5Bx z!}FBZAUBQU)gq=UlZaSc<#`Swc`}{^g~YV%&)P;0d$tdy-$m^1VU56df?+Ny1aykP z&#AQ1^IS;E+CY&aKXH>R<>uis2b(wR1jDhKurFfoNJc(fY8hSrB zkXb&4G9@}s*6U?;YPxNTdOrOBB>c76_e{e9FLmymb1ka4$3z=9jcU60hm$qB4MR)Z0kJ!*F2R>a}(pv3zWHa9zi*@<;bluEE{dx5cpFjEXT z!;fXD8XC53;g5|Lf}IUW{s?e9`5{3?Dq~^5lQE&Gh#2j~>PZyIWQqnDWAg(AR0M<@ z-&WH1yltN6QLdIz<^l+|F$5ZWAr9M&OlOiXiUBuzuTfc7mSA-(I9`BSW%3?=R9RIb z=s~!AKit$51zMI&wcC*W7Q9U9z>5q?R>u&YaVa;(;>@SaVXy zqOg=OR(SEHmrUO@4u$JRw`bzYjXKV2Nh_B)y|E zl*!1m_aQ!hFM@7+KuYn=*IzyV+Qo|+$8&{)G}291eq!b97F}XmrMrpWpM3{co_d;k z`|$k?d2yVatZ*LGI6~-pNa>0w6NhxW1Du?S8eJ@RenQTF3^R5Q6~6;La3HjIpc>ndTpPh&6TIDl7wJ9(#knivKwN&0ne`oTX`v?r9VM!}v#l0RVOw38+)p16}|C N002ovPDHLkV1oLj0B!&P literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/synologynotifier.png b/gui/slick/images/notifiers/synologynotifier.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec497da27b874b8ae375c3080ac43002d4ebba0 GIT binary patch literal 2041 zcmaJ?YgiL!8jaZHroa{=a@gUOgMiPKprf1Rv$aP5W*uuD9o!LK91;zsAUYWgVnP+rHV`LJ$x=ZH zC{tv8&<}3JV3y;RF>y$oNXV2!Dw52CA?Z~bl#Rh`4AE<3@-z^^Z39!4Y8HOBvm1|7 zDp>efnusFOaKPwU()8;a}=9(Ya-t zjK{r%AZaZ8?@7gp#5fKFgE$%~kSM1B0FF*40YNl69SFctDFBsBL0>u%2x8LcOlmOh z)q_W)!HN{7gd6rM7P?~Lw^uWk^nT8CID3+2Ifg;iWhpJSs z(ON_T{*mwh6xPOMX+W|B)Iu4s9Bo_*!4gWtF$HQZB2&vj0hfhG6-Y{@f=LbJtOo$vddm9EGyvdH8H_-HLt%u{ zDWSZuP&#dq%Z20_Do~9qaut7Y8B204R#0is$XpOsW`c?^7*gS0mdsQxoeO+1#65Wq_MZGLcJ7Dp(#`yUYtFI!=1@c2M;+<@*nNN6 z6~Vh>{n4Gjjnw)_jn=CaeUZg?dp~6be&O_ZV12~!8l`^dd;M6K?&qAz>Yc={;2fJ} zO=XGk!EbkWMfD0#Sa*l_W`3N|O7VJNK5Mj1z&_DSgZILN1m9NQoM)0Fd0lF&Jcp}C z+g2GKQ_t=Gl6p&JocmAd>IV`*RaZq)pVJi8{N?wIESDcvVgi(|r?y;4j(`7If2J?# z-cz&FhE&sGx9XFIHSTRCH379ER~-549R{EF{j=u7hh1HTo>Z=9^PReKA_wagDH|Tn zY#lwcS#!rk?Vih>^@vEYUh&D%vXx`kV(ltVh$rs9mlOpdepv+JyHpRxsr%TI=` z1Kk(!HWVPV&BL>Jt?Q#R;d}Q>S3$yY%u#7gU;%+uVjB16#Ri%0EliJ6*`HtfQM`-r z#kCv7=L|O8WbB}eT}`lS@6|`|42%Vssh7z;L37u~-u7Y*hO_BWmseunp?RHPp`RY>@w7BZl(x%bEr4iTB)mA>0B02MwG$8pYNTDkc+RwaM3;v%`OhhX@w`Vm1| zSiiUXMqcC9`?p&;`i0%$pP7b>ukCS^2AflhYnZ0_M;TYa%TRmb|x8;d&?IjnHBMVSF@6OTi zO&v}9;?+Nhr*{@78Cx4uKcuNTw6e`Tt8$Imzsn^* zt;cTzb5Eh(doUvBU}DDd_>ugiVq;uEziDXxLemNso3W8lH~c|SBa||?mE0DPIyPQV zZk<5>DM_ I*_@pB8}hwAM*si- literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/trakt.png b/gui/slick/images/notifiers/trakt.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd7bf3b565e86c09e0bf668c4172729f28ac642 GIT binary patch literal 850 zcmV-Y1FigtP)ya9xA1zhe8M5?(BOr-+MFj_8Vb)dmG_!*fcme=&7r#i;j+t+Vy(9 zcW-YG8yg$w=;%N&7{uo0CeF^zU@#ca*w~2G)m3zMc7lAcv$JCv8ykCjets^Sot?d3 zQc|)a%H?vjw6uJlnVEU4)oK$xJw1y~r_-OwWOOw(H4sG+q$4Y=^IUChEiNxF4ddhE zU;6v|KM=;Z`T6-r4Gj$|Y$wtp4h{}bSXlUp7Vb_=OgPro*37iQ*X8Bq*VWb4ipt7L zB$G*8Utgo5qJoEJX=%x2wORwaySqlW+x=vEdRkA1^f4A=3V}cXi9|wjQmIr>C={Sj z;P?BTQ&UsV^YZc{-QC?!3H;;f=_&U2_pR&e>+i@;93CEi(bd)EJU%`~JRX-)m7kxF z($Z20M@L7}2k(-VqM{6zN$b%_Bm$bd zNfY~Ws^nClXFi|rA%!ZVQ>O$$Ksueq)zwv+A_!3-J)bHnGBV$STuE73ne>)`sZcos&fYE&e@XrW|Lefa zXt|OsmITanm@5f|Leg8#|2VZ43=9mwWHLz?oVg;)7t8~{61KUxxZozi%!Y-91son8 zGO+j6IH>VjI8bVuJ+pS>}S7U2y3r3?6)XF5Cdm$6QNHnQp zqvGOX=yW>#xDmIQ+eE2UqPe+QYH1pcM)D!z=M<>~YUM#{_3A$@7Pqx5i7_ZQ-S+nO c@OJ?Q0QD=YJDOyfGynhq07*qoM6N<$g4R}t{r~^~ literal 0 HcmV?d00001 diff --git a/gui/slick/images/notifiers/twitter.png b/gui/slick/images/notifiers/twitter.png new file mode 100644 index 0000000000000000000000000000000000000000..685697ae5564e0eae1a360980586a60a194f3614 GIT binary patch literal 632 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 DPfQA9 literal 0 HcmV?d00001 diff --git a/gui/slick/images/plus.png b/gui/slick/images/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..22161c46f9e2d7da01683407ee88bec0498ab0a6 GIT binary patch literal 4657 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/poster.png b/gui/slick/images/poster.png new file mode 100644 index 0000000000000000000000000000000000000000..906fb562870499fd5cde7c8d1c605dbcb0b4d337 GIT binary patch literal 683472 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 {B~n`RsSy$jHOyu$W~vB$ z34U{g^vXwF*u=oV#sU1nw5Dx|nU(zJ_}9pd?`l|E0pmZ4Quo?xuOXzq`s%B^@*aON z7D4t1OjA*wh!aze^E%1?+gr1`Z>>9G^atdCbp}O91y^l}dswi?#R_eO9B>*dk|XZS z6ZpM%k=2z*7VtoTB;454JJ8?LrMueGhG-Fur5Lrkxt*L+(r^O1ecreS<5AU&p}Rbn zV<%@dP0?ul)2b?WPG^$$D_D5k+FauyNU>bFK9t%s6WWD6jjCnfmgrTpaRZwc~q`A`3NvW#MBYJnV5_DVl-J11|~d2F2xY0W01jcwM@w%E++ zO?UAZRKYBD?QwJV3i@V*LneoPGynH`F`er%vmQxntA<;?6z(xdKDOB&7s8F^YRuoK#; zU_QqQ0b(!=b$3C6oVc>ULfka@Er+_D$9LT9?YuwLcg2^QmY-+4UwG7H(tgDO?DOn9 z!#pFZ#+2Q*MH{;3L@z6Uz!k*%6vuwgVi6)Ui=;|9vKN#f8kPx{;BZ3F#-SLZIj7~>!6 zAAaZFyM|0==N>HFfA6igZoc>4Z6Jeo_dsaG7P%rMc30jykq4q`$vWB8w^rBJW)Y5O zXW{8kTRg0cbG5b>o1F*2E=^8{`+@~vx&%@MoI}c^-I_^px5_$o;dkT@?MjD@>i{MJ z*S|0~D^*8vVv3iRL`mr*2o$kCB1111J`yN_rcA4K95>NT?a#H+e5$ra?E-hY5GvaJ zqsEHoV%B{Z${>rToPe20tC9=|)A`wHKBB7fFh<1#vcog*NNg2e2m5;2k(`N`0||rL zQkH;yq7v^ApV~Te>Po8~Q)<(WmqHAEgMqbGD|msMH=Mi-Y}6);mBBZ-sPr*la~ z{m?xE!p$LZFV%t=1asv$+9Xu6#A;o*z*rg3aGVs9O#=fmNloN*xeM8ApA}J|T$7Q( zLDV|Sk>Z}2e(6AoI3doG@gm5ld~3Rgt4rx8`_C0l9J}`vZ?8GF8~Lk_KN}EZDf`io zep|xrVP+$?p5QN7KG|L9#|w{_*pJ*1AY#rZQjEze&?N`0dl6>Ko3)+Nff1rcj@Ee& zj?1Y%@5cTpJux$>~J+TOYtq- zea(<9{AgkrN-dYobbOK&%EylD_GDh(9>RCx&s~d^*sUh9{M8vPY%_3zHaFH|>391z zhp|-t!W(Z?CvIkRa$))Yi!uKF);<&jH&=BjEI)X#y!05a`r^HN=&u|@>3{U#fn+Kx z47ii*bgB8d^5n*i8yo9uC1Cl&1;i03u3RQ1LK?T@S%)JuL@3oLSYPl)^?fVu3)~4Y zFr-%=>|#EZ_p4l`onU%m?7`A9jQERR{35*g%{SlV^^G^)zyb93yYEqwL-+Kn*RB#$ z&BhTn81}F4k0#1*wLn*sQ?sMh$*B72MF3?JLQ{ae#j@l=OnTZ)OB#24^A>V7I>#$s zSo6o|CAZMPJ~C9CBGSY=^9xW|QzI^4y2#ZzS^K>=ZDZl5EBUp4rb9r%rNkBP6+V|w zWcn6I+STFeeH@JAyHH2Z&G1GpZg2xPGCfx&Dn)kW@$E1O^8UQ8g9!mpd(cg@7ZLR= zHH`{w^sy5570n!&pfc6wuf+OPd&yt11pz zlX!o49PBz~{@8=K*Dfd1b1_C5&!^wljr{r94NS+#N(ZMmirjZqMLqv_ocrMPb|i*l zr@?H_$TTG-weGmovuLt%cla6v-e(xiRrc0? z(3WQZXpWMkzZz$N8-fxPV&zJvkJI}lCjH$d9UouJOaPhhhd-VPQV=v-7$6M*cG4-p zfaCt>w2koo76{%gOO05BZ3{n}?qREABu~p*b1CTtv35F7kH)I|87%zAy2Bji9J)_W zS$MKsV(57K%>SuDTQNegM&cgcd-q+uk(1-4+%v455G81-rdAOZ$%7#D3R=izK$HQ3 zgJ3NOlhzxB!L(~)3%`ErHcQodY`V@*(84{MF{es|{1&XGyYqK(Z5u7ltJY!*zumrl z`%7PX^Y-mKR30xH_4E`(oBSyV6ik!%UWyKol7r1vfuMVGY@~JhGC!uHI$~?leBMdS z{89y^yT9F}e=5sYCQZvB8hl?*7lMj=2c_6NpxI1myLzTecsdUB<)&BT~DmaaEHEOm?bh$ z&R_!5w$tQ}M*b6erHvhy4-bSti5AsS2yqGNSMjJyGiurFR2f)v0hEK&*piy7F=Z&$ z=zVUGmID~qu}pg_RCZ>$@7y`lJEbi2ipQ5@!C*+kSEN=`Y=*0X88??lp2Sz?2pk(e z9W6KVbG7kUa`fVUTjjd)eI8#XqiE{&^5b_a}PtCj*@W_c?R`!QwWXI56=3$6zY z7ZWE)Ida=rh?OhRMCmbVhh7~$P^$_i&myUAf=n3HIfyoF?3;nc;v75stSkc7T69lQ zwF20e7ZQ}OK6pM?=*#&dKAFg;wK4+c4-J95`cpczQxGASstbv-tD{4sUg8BXeCC(# z6NtZ~wZCHZ;cf3gA8;c5hT*DV;UYFQN>`tJv^bi}e_4{A1;7A!9*y1#o^Me`oqP?={MHKU`YD zl0f2^@E!cDqkb%yGu@J$IcKMG`g~OjG?thyhEjV5BX;hntX@pFHg~5vkyM9PEFd$~ z`4x@}o*zC%doI9`#N|Gj%`k#xHy-(hQ<{-Y>KZ@wJ{`HfG)T%z1S#WSc7R`{c9?j4 z=F^89&DZ5ubcv-Pv_72?#5bFD>bRz)9NKZ^!a0bM^$YX@Its=aa4Av$3S|HXZG3EP zYa7KP09&>ZGFGAz-^B~($s_}X7bV|%yAK~cDAXs472RLFFEBG?C2HkmxQcT9reHyV zrm&H<(e}*Cf{|A za=L4e!9rCMsUg%d8ry;TDe&qd}pqK1eX}D{n=S0FwTTb zZI-xt7)!N~X*2M`huq`b7vF8#-mn<(QPZ6!;)!A8_$f1rjVFiUbRK^N??M=r-|F5L=cO=Vu{|oE61|WSXv0ZPJ_qd3pQo zw~IX~%G{{F8*7BzrVb<@s+)AkmY zY-n_)CPLj+X;Pd@vy&=jkurfk!j1}AmVqfSd}|xV47LYhnMFD=Hi}k(U5H0kxFLSz z?CfkQQ#&#=&Fka@c@`9p0umlzzP_%;K-AzdVkK*qr$eNcSE=tn$E2ndS{$z+gFa78 z-*I98jcj4*rT+kifP%nBg(@>%7zKr%tc3a;r2*O_{z6DSq2G}PRw%6JS1l5jpD+o> z>9!ZOpJ&`z@))NHd%HonJgFH3CJGLA7gr)*i8z}UELnbv*Jl4W!ql5dRtEVW%cf8N zd+}ED2-sVm3k{y`I&`VE7*&vrKig6uQlR**25RTYhPZ6as5L1m=L(CF-EiaPO%xJ* zC8C)L#Mb_6_5Pl)4G6V4J~oP`rLfx@2rZmZ0~8^uf;n<7&~5O%@^ds`RxDW|}z6H%WzZP$I>aO7;Qd(XYA1xKf@H_9aDX!nR2?PLR#rapxpDhufSFfGFa2`!} zByz)I@cX)ZyPXTO54>hu`D1yHL-|zjyQN8XXrV@1>asEg&CT_-s_Za4Ff=zYyS=;p zVi-Pe&%gIHNoh^b&e5a80Lk!3(kI;w`5*=|CDm0#&#FaTJq5;}qNF%th@b84?dKQH z7m@+YifV5xM>5QLALY?YoxOqnK2k8?YsB?kxq5|wJAk^m?$YWy%hFJ)_Db1_hRnR9 zbWzuXz@0bWe2e)qv<{nhEq+cM$#%xUX(otS2%erSMEla0zQjd-{nvk;S1!xiE*5Mt z#lVMW1894PB(>+WW{sIDFG)XT&8FHPR!~d zp!(EaL%8ShF_;6ZyRoy!k{FL77Wm{DAK1Tj=e(NvEtX5DF=(UwFl_QLJ{m{xN}f7f zdGNX7{Fy;D!ez9W^$nuj9h2}17pXG?OKYxuhFnm#>NYwRF3|IjW0k_d^Sm-!f0ed} zQe$ao2=^VT4;wX$sn|R_DKC!@p=7&2KEYbRb>V!Ae6y!8>GLgFf*a?~Wo-yCz%#K& z$(2jO-(5VgQON|yjRWmC_)|! zXb1%=J15sFH`=P6l&UZhWe%TYG$kvAQ8J;%WC|1#rQ2HLE?luMrVl|OP%I~icolM# zye{DV_pD(B&@j}Mf6BWY z;y%H85-(C!{|L=5Bun0)^HQ5VvfjeY&zS*Z@_2c*+0{$QZaYs}M|5$Y1=^Km2e0=zsFX&wbv&XKpT#zO$anzWMwId&K~wb_&H~tPq1x zR&XCM9Ej0uD`Nfb&EMs{#aB6#Y+Lq{5;LGBTzChuJ4&))E42nGNwu511!qM{sNHuz zGT}Q`hGR(}ieW_{#?W*vZmsT@+#ze)?d}(sO@5n(Enm5qSm~@%@8D2iMPT{y+BJRQ zigiW7ESel2!?Y{XegaTeLs~KiG5rnlV96P;nTiJ6)|knH=8e&L*hWxuh>XCh5E9V7 z`&OJOsRdWwjmDc^WUKWJzV)dzTJn|S`0VO_<21%EtPNyzs#N~IXC2<;rf7^Ju%4Xv z-EQa4u4HZo;Q|bZB?)R0e3j0^9f?VS*ZQSu;xKJw7&>KqT#fPD40;miaAJIduLuj* z@LL-sW(|M~;(e%L!#aR-i!K+DTzf!+MeUD5EI4T8W#q?l`9_l{FNme`5PZYwt4T!Z z-AuqlbU3{G&s2Tqbnkxsr+S5$rs>fU>hQt<_^9E5gNW_C={Nq?3OY)4k-dosmPk{! zX9Nk(t(byox>OYJ9xN_;JP~6Og8{mXY9--F@aZ}rK^Rn6mIy8c)sm(UJ75dQEf50A z-m&g#Y(|p)!PCjLp)r4t7GkFNs+Km+so_vfcQ5Nx)aOP6UP!Na^>~6?oM<1YHV>WN zG8JNaVtn!O5=vD#r&|pdcKAoDGbKUih(;9mj#wUJafQ zZ->R7)WDxU6~Gug4-U$ zVP0EZE7}(+zNl_dv)jr~T$Ho7@A%@cMpBQ z%>ZL2QXL9|e93xa7?BLQR9ES2k0Zc}6>VCte(DkyP^fVQ|`6URuu5 zI|Yd^+*PVxDUj6)=i5XspPiWn!{J7NHMw9Kwn`y*1$U)+8H8rV#FVQNB{977?y@<5 z(ltCe%LjYIqfSP#VQt--LaNm%2BL8f9g60jITo1+#~Vx>9AWozUkj5+c46dCqU5VS zY&$CcSMmuJ5uN>vrMXGMUBPTPSzY-UmCGZ~%J{1x!3+Y<4lw3!-niiyS<@mMrM(s@ zIf3z?oGzHrh&rKtz#3b#Iio?`Ey`Y{iQUxrVoZoNa;E*FUHvxU= zsC`doghzyI-+J0I200rI8@P_!oJEU7qbrM4Aw_PT$o2C`+GgYyE+JoCCVYiLpw#70 zeA-;|#ssmCwB>MG>Z!>+^*34Ri`X%=fsv?xD0V$qjhHdl!UHWu7>OWYsFl2`8IIfJ z^c@y(dktM<7RcA`M$2r0hrW##Yc28|rj}cbEWdjrs zYb9VxQz>Q{lcA2JMT&>wyPeQ&IBsb!+Cbp?SxyZ8&9{JIV{$|VXBXL}_Lc7k6S~fx zJ4eF6_)r0>M#W;6k{OY(DE602X;3tOy-@zBg92y^G6r2`Ln8oiE_xvR4`aa4C<4JK z2T^(5Sr)u8aLU=uW$P3}f;guaL1bd$$;vWC=QN$dX@k`^KmL)AUYwrFo!Hgv{`t@U z;@Xxv-t#psd2i|d5B=^x4%JE`_$yy}`%7=Wm5~JU{`~(T^yu!MmZb9+E(Tt2x5^3I zg)U)UMLK78xISrD*wEQ)N}>GLT>x=wDy_y|MpeY^ptaA)V_B_)k0*sO`H4y7}R%B{-S<6C)11 zNX5)}2!zR9Bzb7JNnF%pPKmvGQPV#g009|;#LYW*xsk4MV`AA94%u^f_hn$6QVmY6 zf2duP*A(BXq5G)XOg5HD`sTOoJ<^$-gvQ8WG#a~Nq{XAa(!v=-PMZ>5KuN6x58nz_JG#h<6@(Ec(9jgW-6Yz>*4C63chWI99 zFs+-M9e{dr1O`A8YfmpSw2{> zyy3?bH$rbI=H;>-VtHq6ah3|ffD&l$o?uo2Wrjk+k9Bp|S8lE%`{q#4!-tO^q1jJP zPjQgyJBI7?6HzV-;qL80h`zPBXpKFx>&VAP+J*$-mA5k>ad|-pHL(^l_FjgTptIbC z-;NIrEG|DGSV7`$z=UUZ#5ar0-p|)Y4q^ObSkUjoPBw;`PJlXgcrHE+5?9aA41{81 z3$p|)0FYpAu)c{gJQM3O!aoel1$X?(*>mS7rlub~c&LNG5BN!MI)x0lT$Mc z>Lc)Qwzu!zxlQgq`FqUk!u&l}_x^s_kHlSsu(HjDp(RTB=+p z2KV&D0=8KUiI!X}DPolY5s`>tkKWa`tu)pW8@$Rr(*wv7;y9*Ra0@hm89vl!tD)e`Bs!OSZgA05%yv$J1vf4M!5VH%YUpq`@o^mGlZt`P}2 zL<9sUM>1YlBZ5dX`95)HtHwb4Blb|b)^sXAM?`VsIZmSgR@%k*MYuzzYzmZ%2qw3t zwHE|?fi+s?AzFspvmsCxYtBe!gxDnpmXX$TAIT1#p>LdK{j$7j14pV;lp$txD~4SR z-HFkH`3%6Mj~NNmJwegR$jGfN#G(_&pmFcQp5dFCyz@M;`_HWIAKw%MjA|j)1`R%K z(Y&UCPNJD(Ds#n#q%Ddi2X!;*wE}qA8RE9^`lg*79iQq|!wFg8YBTRoeIy{(yUC}K95K296#>f<=qvBUJeJGh-IglTfm zcQi?L?2?J{7iOlGH?}O<9VBAaCNW=l$&5?B(-kS2nkri-EsV>Oy6VNOUiJ`3E7uZEb9= zZLH6nox6SW1|z`Q=1Y3afZV!qqne64Iy~~be#-GBnI= zNFFrw8;}`Z&f-F%w8==IqTRZF9h)VveXI)j7Y2V!6m%ZZoYI20`4{gm5*)8x5ba&o z4h6MBk^pDT0AW;W7xe+>H)andR9#UFJFPt-L-h>egLj|R!XW3AxmG3MoWMG@j-A9! z8t(1nygVLj*c5-Gd<4Oa!atj_M-GWww^tV=C;VO;Gm{hC27xa3t@Z&SJ_uvM*9cI> z!{rq&E#c$R+!)QCKJlLVNGod_Skg8a*}(r{U7EO`)&jQ#AKL*7wUQ~(*oP=nxcz}y zeP=~SBOyqc^NSCRqfuhgF{Y;25i>wxUjlc$!h3pmtAR+ylo~>kt0eOa5WHagI(o}G zOU&m=w-V}KN(5uRFnfX7u{IRvYb@eD`;dd{fu59bfh=^E6B2@ospTS=XtuW#C#u1o zDXqF2+Gdb56W-GPw{%a|dipHwG$Vi2;@1`1AlaDrcE_5ql)usM?wQ8X2ne5Zk+EP^ zt}km0i2-HiiD`0X*`YaUZ^s^py`3ct(2D%By=AGS#l;7VBccK+6$@QmOOfZI+fvHT zM>ZV}Gr_;;9Hwv`1Q`^@SERhdNapX&^A!af4#Ht)lr9r`>Y%5BC;@_d68)>A(NT;i z?YepM78e8`f;$?xGaVq)Ko}Y&7c%P}@0I?M5;b?92=QA(gtO>=c`mJ1iOFNm5#*R> z7mg4np>@|sQ)J5$M&?F1LF>_q2z3-8sH?G%MaDJ|c$BL|SdvS*K5D$S;hUiN4w+IT zo#Y~!eysWZ?76e|=I?2e(G0`NF-j3e4lRcFGiBO2I7-S7V~h3T@!AGT2sg5~D(O`c zl)Nn52P4$xrU)J+S8Fp4dv+W>NoKD%f!>BGx9E6+T4pr6TLuQ!9l77}L`BM!VyN{Y zmLg@Izj$GGcJA_(%MTu4-FN^&*vC0e%bASAQI;@WU3mgKxp3+7yKlYKRq8sH*(7id z_R%Uqe}`L=p|~&!66lDK%+K4%L%8>N;q?oz?6nRr__0@B=5`EhOqXu{vX@yfEM7K6 zPstD~BCv!aiK8e-zwPsXHXVuu@2b2Ni-}H@XQ785wOiSwuon%(pOtpu~jYSeqMHHwN$*?Sh zbce-LEg7fIt&^t4?Kq85oe1Q1Mh`PJ-Ba1BJ+!QdCg_lrS~NLAmb*e}!w4zEgTA~H zVDAumam1V&XOpd-;Rr^CZ%1pd;-w7@wZ@Df0~$Ef-s|gf&!m~_S;F-jr`h}+G=YFy z6|=K*tH&##AqR3Xd++YZ{c}UI705X`A)qgv`ZO?G$l1vqVPuvv0kbP^0ls04)g5!K zIax<3_l2IqGOu2_!p!ytXe$Q^?9q4N+5ks)5*CZ${h&A(+zFGnR$FaMs7#%u0t03p(mj4?Jl)LL=tcn4 zC~0L1GDN^E@Nh%wiR|1o10pye_%aA+F8GGiNM;=k3xslac>h7O#F;DKbrKhO_AW~c z!fsRYK&Tb}zzT{`eBr`&!^elHtCLm+|J1Z`L{1z=U2{j7MC5Jlm53emRyx2b^exk6(*&EGA4k1poq|}mZr@UGarwLAT=PNO zS*QiG&p2g1uCJ|!Lb)rNG;?HxUi|ui(GzSVc*H^M>BdfERNe(Fa{0;CmtR8l=P3vT zhFS78%Q&qf3^v=Ye_#;S0D9c)g>wYDvOdWl)g{n7(0}9ht*htH=G4!O&D>vpFg-f; z0*rqPjhZ!sI(}q;L@K0U^2TN%S#IA%sT!FWo0y&=qJrlN;h>~E0Bd)D^&Y}HV!^$; z^XS$*0#D~khT!W)WeODI+R+RW?ZB3XDBpJ?1GywhwJpY;vC7qM-4g;XSz~O^ghxv+ zQ+qnM9Gy4NVRohXX?h0badbo8UudOfc7LgAOZXf+T(+TEUQsavk71D3=woB2<_jcDs&UEU$&w0EsmbUQk^Pc zbQx!TGm3R5Ai~+wzo?suH(2k5VKHq3>cdB3Ah=q)vM4P;s4oCzK$^cr*k)(;L#{F` zQU03jDuXB3kcv@wj}i%(cwzyiIf1psQv;j~h7Z?4&*L+NKv?m!J~?Iu*lnz0=>2dH zZb46+ASph9ZaCoBPFrC!WVsR?5Lz{k{_+&~3oyksqewvsm5M0_0*gEM2Grwm8-%-a zCRf9@ytKZ>qFUKPx`5OS@Y$N_C)}nnVVIkG@ZFp#jPS+sE$pkSGyarE%tF0adDPxnH92st++;467 z(zn5ZGRrKF^t^`L;Pt!p>A;Dj1*ybbTv)6tnU5M#uvOGj`1oj+5b(yg?k%{C8JSu{ zn7W|8VNUig@cT0}1v!U6^xgeEhl{%MF!;#31MFeX6ns9ho;2EZ$Ltf$3kund>(?(` zzH)AEmaZ)=KSq8+fMDrn&3>*%t>~?dO&t6eE?;`-!>_;bE1xZfYsya~5*$l#yjqZ%< zf;|Xpn3=o&mVjlYkQ%0fVgIdg25B~Da8{zc9ul7`ME9*H@H^~32+bUE{nx6!*}SIn z>s|Jb;J_d{it1+PD^>6j_W|sL5gzI7!5Yl3p!U?}S>HWGSvWT}X;$9FnQ7L+`tCkS zFk*g$zZwD;V8AI_f@`HJ0l+1>g+#nEe z7uFt$vP-LLwpLe5T2{^b&!sB@)pi8FvC(({yf}^=WVd9XK&OuonW}3c^>g)gUeRx0 zQB7KOo=rz5iG&`BiWue!imR&oA68Mh%xUitflm1-1L_qXx zfkTe0S4bjaG&g1()7ZRi}f+Nu)nW%}VFZnHux4W1Mm~Ip`ZpXK)jn$&l?*)cfUs=ipW3EU6 zg?4dm!~yh`(1x+{E-@%QREfQK0hW)j%bZvIBJAt^&Gij30v;?Z3=9vRo10mA<>h;K z?oiZlU}S{F`Jer*zx6kM^1PYzFP?rgnq_|(eA6P{sbFE!vDBpt$`*?k&suyB;1 z%b6JpR5Jc|7VhtD@0>k5$G5B}mPoi`nt&HUhuLvlEwV9NV#f)2%Q@1hXXgERs593# zi_OGQc|;BfGi$xN%I-V)%Js_2L~ZlR;z=A&Xa!Tu678<(l*~t#(lKWbEl|ujI1}rD z{)rL_z%t!sEX?o`GPc6rS}H3Ds>WEEE~UwW>u4=G73lZO2WvTGox$KTy}qFrvosCb z>_=^_8c%9HEVxJk?7&kyF}1FCd^C+HWa_PjyIpWAug`V({`~ntL;;hvsu!$w_{g!c zi;r#c$d_{viby5?QQ3lGLql1iS&<(Xk%}yOIYI-v3tb`%lW+C?FE6ifP5qQ7BrSN* zRDMlNW3<8kI|~n38$2Dx1|EuQ5+8(mWgx|L3Cn5_9J(1GHi+90N~{iCA=XJVp?uw7 z*6lq#m*Oa%U^j3e_|C1KJ(Na6=Hyj1o4-r6p5bY3ee55RkC|vb;vM8!T=VFRJf=v= z1p4vd`$x7hUpsPr&f(Q=bj5mu(C|21)}Sy3k~47uFsy7xVRxAXrrq)C8k1#s=Nt@=?{qF6}^ zj>TLb25q7iN_0Y?L<1Cup3V9&8bGZ*g-a)cX-DMXF=3+P5q4U_hmX=M@k5by-n;T- zDq>LTYF{i&RS*3Uj3F#dAq>44F31WT93IkTz+EIzThTay13WPFpu>6(GX;zoail*U z7AdwFGRpkjyK|UK0wUrd930f4Mwys@|9uo~0Zv+uWH<#RH3yMTyL)CA?VDdUVx=`R zMLWCz`!wB%{Ix|I$}>iXhaN}XzaqZhx>gzai3wacgW4?7GvpM`CjaTb=NR{*tHh~b z00=u`DIJ1{gLcbDp3&f=+&IEMavYq1*FW+RQd7``AvioWell9dX$mr|s>Us2}Bq3L90A+Nl_G3DH4$TB}(ZN2! ziSxH_j|`1)#>LB5Sgia4!wUh7eLVQ=%tj>HQm?P9z|k=*BcUZi6}KGz3gbPQ_jf)g zzi_&#=gX#$T&bOlE2EklS3q)pF?GM4>$iWK zF$WbAS;oi`rFA=h#HEIHy-*E3j*cPEc!Ihw`DTdNN6Pyg)Pa|P>bw$X?yMh|QD#mW zp_kNHgOgpDouU6|S`Z2G|MfL$!ES~%!g3nHo5$gRJ`N`%50bpg?gbcQ<)|C z>996=`I!=u@V5}hz^f^PFK~@J3rdQ-3rWEyfh~w$9ZZ_VKy`7{7`dLh|_;}yuiNaDh5V5$g44+J3Ah8L2JCs9UDu}B>cn>S0PYujmP zWA>7HKT3QU7bMQiWN|z25kLdt7CC_-s%njh7@`qK?GQznBUAWT(oD7YgW4nNV1mLr z!ej;7L|Ld=f&gxXJAjYs{Kbne zy>x}lMO-j&{rzI0*`RzSNe4)Li}x3Ldi$A2`Z76Hg6SyeM+3}&@ETSlmmD4*LNqkv zDWfP}SnroDnrSR(z4l-i0P-bY>CZZa#UC#hND`}?OV&{Qh8|R`kjSP3zF4^fH(rNv zPdE-?UF>A5NWJ{>%VZ%#XtFGrlt^NsW|^E%>9r%_ws^2e<3=+nTUbG^oE=tHZSVDq ze1Ho1nSoQQnQJ#x2x=MgT0seFWo)$ZT8+CMiH4ST3#SmJ6KAuYk-Sj`9C0s35~9Yf zPnKrX$hjbHT{?-^lN4USUyUo)nnK?MWrCygkz#s?EG#Ao92}ZkBR7!B41E+MnWu#( z3#(ji5w%>8D`4w-1>%>-$DO~%ZwLAwt*og-!0?2i4~u0>Tm%7pFbQHL48vo|7ngSu z_e-6tbF(u99~us3!i-GUYUrf|+40yuS=AJKBZC7q&q1c?sKV)hQKVKSp?akpUb;;h zC%$|xs7Z#)?gfw0E<)=+s)Lt_f~hFC>-yGW2j@^$2me#OhDl&_q0wiJA|i1B>Q1a5 zPf_&+nhOqf^U)ZbuIMVn8ZR*2LmEh_#Z}~(w8xzILu`qU*Gu%cu5MX%Vt&Etd2mb` zTuO6M+Tm&H>nhU<>s79^9|$K>qmu8iZw4J%JU90)UV#0cDYZ|E3<@{ZWR-ohR2Y#i z;|xLh4+gy?l3*izw+6)d+u^~XpbWd>##CW-)KRTE4fDgyYfVKiWOV~Aw|dID5f3X7 zNM0f}JAp*e=|Qy{>FK7gq8S1~he-{zb^#*6`acNKT-Oi$7T#|qY#RG3H@q!*fARs8 z&YJ!6INoojXvT0MNqVj;ZDt1ew24gp()ZEsb(Wm6dyqq=|G1MN3rtOb_4S&?L)Do5 z{e_K<^|TeZ4zY_j`WvJz3=9neCp9yBc5!imGg!c>+5rlL*#Nm1XaC)sH(q=F^_M^L z5grnk%9GXgDmPo(S|?)S_QSg`R-=y@Tv}i0?@6$ERp&i;E1QGZ&9fITB6lxuZr{Ci z2N{(3gY8m7?@?j&e{gboauyha2#w^yivqzvsKLQrvf=z+{Y@U| zbf{Jl9%2H-O@_T|-$83?<#eAUJe=~Kizwf_F|9@Cu^7H+SqrD^=Vq~;`eQmrUOvC^ zD|bFItZYA#VQ973`%}5Icxo&)WQg+!5m7?;+}SxK{g=t*It7>nZ>AlAl#L| zZDWwncOdca1gOc=atle|YDIn2b)eluW6{r!rc}>Q`~+hj;b(r#T6XCs@JzVA7?WwE z&X|K*j(Y+?K8Pm%jN>nW%$eYq`i-a_5oxK9Ap{Jyq7^m+hLbo!xUv}I9OuS4iAMQ# zoW1Vg`aJ%*nJG@bIX@3=zI*?HSs3jhVKNMr5*Bn~tiE^sz3b85eES{P54Ef9GcEuK zJ|j$3Y5E4mh5eM)DLYQGs+knl0-6LtVaeJvA{whPIZjAO49*Ef|D6jS1YjSzzC(@J z!Be9mGvmC%ML5}=!tZpOLF_tmefcPNH-)dDWjuPs@pI?TTWikrZpMUsZsZA`70;xs zG%Fjy+`LpO@gl;SnwP6w1hn?qnESQ811$OYjEt-8i)e$gBL--LFnhKYP+&@{UQXwxGgv2E&07A5 z1o`v=l99y{zTxfS{owk2x}mFvPHPS@AKtuuXJl;T!=L!X z$k-@)w#jccc=q(jl+|^gx6zgP$M~hff{mMX{ZsDXDi&6aGy|y z_07Yg(s`UQRM9=DSl(&hr5jFtCiho~{u!M<$N#G7yl!deF9Z&_b{^CMjuVqpB?xE*kTbcTJ7|BqM3n!AJipz#x&TFgyqT8>VT zwr1+$HDugpMAUQh72j%G@1^Pb#%=tZMpzlL9A!CrIMCBawY1t&{Uz;zy|D z5jojoLj!vUXP&IDGx8S8SJB~GcC0#a@TNK17%tbj%tv$U1RSDxJ@G$)?^A zi^^L~z;HQ@69_$tqDof**-$E)nwX%683`qO;&^VgZ1!_-xP)rcA8x_zQmw%Si31|h z&??!8^)!9R1m+XEktr<@MC1lUtI=48Fc1AHd_|NZK^q#qa%yUR3Fa3w1niS5@D%9r z{1nRv>lvP>M~O>u$%*M{)(OLCS{Gl5Hy|>g3zGLNA@ih-i{vz!VusgnDOf)Jb8FXd z_?0s055bV8<~xv{WY&;LdM59reC$`+$<#>919YjV_nYV9_|)8O(x5}n4ua#v7)t>U zg@Kke_QZ8I!w5e$Izl)Zaw@kd$hf*iBl=;RX4*aW>Zm%yt+bl(^X}5R@Wh90zh!D1 zv6+t|1_eroF6eG{_IYi8Q`q+QE?8cX_)r$l-GzeeHbeN{qsIhiuv3U*Afu9+SS*F* zaGFd-tY37jaFPvkWI8(_Rpo0qQLW?7O&Vsl)P?D(hnNZDrs*l5t9;7@)a;w-=1C|F zUu4j371Prpg9tH}Dxxfh z2%_#Ktsens?%Y`nygOU#-}9~CiupOMQ2+c3zx3vvw`Eb!)m+uT^ON5=JTP3XqV#KT zzcX|8-1_Ru`O8;E2K#T_yv<}aBg?{&;#L^BiInBJ9zT3Ytj2y!9Ei#+EPVgS=mj4v zre3Mt**T^)o~v|>(#F}T$;C&H*a&iHsgP+h^sqrY{XU()OY|2xT@~uS>)h2>G7a6u zL}Nd126jOY58Nza{Cq?ygk><9epIbwU5^cydTty^_??=B+A;M@8X>+q=HB;j+=S>` zb5CF&OK7mXkOjD`C4Fb7CJ_Ha*6!D#tFXeh_nOsmDIIrAwP_o-4hqYF0n)maj9%eZOiYy7nfgKD922zGdeq}E$fvB)9n2;vxThR|{lL()Nj%QH=c-vg4 zy#AJzX?_|GPUem&Rwzm1b~X5sVMN*G1hizZT4C}C3O+kCWfg7hqI4ePnYlB%nHUvU zg%hE#I_fYPb(mFlL>{*ta2s z4twSqyB`%7gdWOFU|TBXj3FXFISf1lOd}-1mNVftNgyMb&m6_W4qBl!m$jiyj&;)= zk~eG>S&Hdkio-)xfP*-O)q3wRzrOgn;AgCP?hE%ajXo8S_EOK)NKE9#ix)4A4fJ91 zWMx25%1$lo4pBA-Ya%}AG zy#+mzh7k-!L3ie&?JnjgG~2G4vQGJzR8nI;ltf!dcPJ_x2~S$z*kl222X7&q4rSMi zQ%hJJPfzXwtIthp{hp9e&)~{3$ANxcxpE1&;B0^5^;`1<(wpQYwN+v=C zsA3!q%;s*l1M(!Z!F%?7Ql6Ugvo_AB^8RG}YnZ{M9ySU^*G*@Lw@qR*@P%LiGm zFjierRkMHB#Mz538Xrj`zt9|(A>zkohR_vwh9D+TMwODnI|qlv5Y<(wYH}Pfs7?W^ z3kWjIE7~^kW!##tJb~NND{04>V9BsgZh=Vz%E)pD8baf?ulgXZab!r5$jPj;6BxfL z2FL?RW2RCH7T5I5oIh_#M*yHI4pe7W^=l0_8Q`FD1-_Bl zKr~bM$dv@d86qGy1M9qXvG>ZPn~~o zStvT=#^b{zjCZpJK^5{X^F^`4v$tVsc?;R6cB!(=OfXR;YBaM9l@Ee0uBC*7M&6x| zinsQBHOgL6P~6-LH<+)Aa-#@LSz4N|`>4U7tBmSfJsT2<#o^)K}jPBUDH`BEkk zVoW$W9$#6L(`r?`Jw6=PCf2jopo*}hJqU1CgBs{R(oqYu%WCg`vy{J32$ZE05Jqr8w5bQTP6ZigtdTs$tv(bL3U8_N%VO6 z@}<@7T?{zb1{l34z%zhsOF{S0Oq%qho~n8b?>}9oJBs0efP&skd66^e5~3PxWav3@ z^~J&vw^PGBqhYfq(V-mR_~^P~)bO~)I>EOx2txmIQpKkM4^@WylC!)3Z==^9=6F%HCUo6)>XlWt-&^<%wyr8Y?@~a8Csw+fv`lSl;p_pUUvjA?VS;2?MB(q85vTL054#(O^0nC%7LP z$1{Gz*^p6S45};~=b)Mp*7V5;R=_)Gbfpgk@6<}%M$a2UwHqbd438Z~Je=Q5kQ$-L z6?z|6jF|{P6@}71k(`K(UX+43;ff3vJS$kZ=RlY!BTu@2Y;>4e7YR!_nm6{1C*?h7>PV`ITI>}?SbxGyO#~dZ4~4);VZ-z}o{88==1UQoRc8V;P8PH5 zIG4xawGrJgt4%B^gK2Cr4F*ZT*GmoyGeQm$e@Hc!r7nA|DfEpckPo3PGdhov=VU`K zgYozbX62+#mWJ*|GCBXsz6(zoGX=2%&un37<kY)zS5Pv*|74#)dbcM?!Pg{o&_6a3tkP*a-Qo$}bO4Xh_cfM7;8zpeBxHT;e zTK+p}ZL6Bqwm|M-7YYk%JMVCCW0f7z!#dgViDT%p5n z&);isuZ>MCMh_PjAevfj(e-t?MhT*R#4;KpKHdoYHJ}>tIDs31;khs!k@@RUcJ=Jy z=khbd3I|wS*!dS8Jb+TM3zCEiuwPBaISJzYSQ%e68;U)|)oLl?T_5@6S7{Jd2hGi+ zGZ<+O3-DmHzR>2ON}S1sj2ORq=|VFsGgNkTCyUO;zHNVWEgNj4!T!F5#RrHvY-0_l z-n64lB!vLExVg*FN=Q7;U~YPU@xHiwiUQX2hVS^C+AVmr6Cg{u0c8dWUl3g`d%}Zo zL8iyJ^b@$gM*hdqlBeoJfm2RSPBB(o3T}Z4EAfr>w1aH`I>KH(F2bA<IZjBR!R zA94_aE0hu=_(50KHww=V>nI#WZfX@Zma{#Pg(wGP_qa7Di{Yrln5KWd)}Jf~!cutW zz3US9D*Y1C3@wfxB7{MzSx%xF>n21((boy1Et!qg=PI zz$X;Lg_##ABq?m^Y$61d0cS~sS#dAR$Z{rQxD)E8d+*5B*X;_F5h_<{wzYUJZ-9bf zvIMze%-mQVllK(2v2a-Hd1_=BAnwOhMcCVA5C}=5Z*&QW%gMmwB(1^}%1g5|%d6{| zzhI93sfs=~JD%k?@`MymX{6L+pcefpqg)BzM(JV1n3NiuKe?sxA3uwDw*n;zUaQ^9 z+9AfY8nr4%=ht%+^4M_FJY_!hS-5qy&qWBf$$N6WlsDidtO^1WQ#Ee{)^ zaiq4XvX*XjSklnV?}ca$^Vs%>Kl0(xzMj>cz5C$3;Al9CliG_MISdg<04zly7dN*7 zuq#OG=EaK3UPV#K}A}qAJsgGysWxM8y_XS3pP5!$5P{J2Wn~UeMRxen55x zD@0GjVd@dhZ@lU+lOP}OA3D7!?n*uQJjGM8<4Yg@7<5f@VuHR&Ziq03!m_Z;Ebr|p z*MQeD7Emi=o#2`Hv6q%tVBT_NjR9?pzhUSAbdW@V_ix_9k!jexT5q+scNN*!gW2Ry zK8(H)lnjnM3DU`{{!v`K5FLst_6B5)+)jzOHZ*Be7z}VLakIT?5?}5D!?TRl3FtT9zT}l z*T1lgA-s0s;ls$n=;aJc-BVFUz468JWSwg+UL{z5gdt$)!nVOgb5kwKP6W@|(?5W) zh}fQ0C9BueOcek-`>06x23XQqfSAZOmMJIepxF9nYgG=WScKf*P&4VwGInf~c-|Kz z+MYhp>Dd@aF3Ky~1x?mxCoVl+9xg#b2L^;{Y=ABa2X1sHLPKiU$%i|ql(vqw2>82< z=AlgL{K9?lH?vM_!R_dnWmF$5A78N``{8ac+XUr-Xm+bWak;9fl*0-=*w`u|76#}r zqdaDDBuz~1g))iUvxj+HDcLa&P!`6ge`t^&ym|M|H-GZWGd*W$VDQsl{N)?>Z@oY& z|9&XS-|+FTBfc*O;G>r=|C2X9ck|tM85u|@Jz#L~Zj#97Df%S~JK+)7^&6X|w0`@5GX81|CI$e$av{NicqRHlbG>zCQXcXmF1((; zf$^~d2FH8BdTE|!))3b>&>aPq`>7*xFf}ZPaXY|{gfXDIuwmUvycW(Il$z5tHYgAA z!;`tbYt=$(ObUD*zPGvGB011xPFzai*Y8EvUEA*K}6b7oUu00tR)=mRD1 z_kW#ec@_w$f1N*9^C@Hj4eHiy19{|prc{V3kv~j(em$12ZIkD+;c*@;76?ub5s94s zSDG%9a3B|zA1cQF;bHlnLr`yg`MCB-C0Z*`bY<4!!a7`Fs=}i&bWP3~=xY2czxAst z>G<8u!T<8<|1YV1FHrIP*5aMt_o?ri8l9*{HT=Xc{6dN3k6c&L6abtz3dV8fEqObZ zUSr1@0?AkFt7{mm5*w%EVEV50%=vpB=nlq*-xho0+wZ*>T5(rmgg_`Pv#SE!#;`d3 zgCX2&zEwwO4MC@}ppK^3t#L(6s^4@ru^bre6q0x*tmLj z&6J_)@5v_jn^R-}QSz!9)K{7rqz;xE(~yoJqqWZ$KT)mc3jN(p?xux< z*EG+JhUz1mH?dG_O{M^3p`G?t?LTiTs`If}`MUa;5zbIH%8Y02;kW?!RzDwvuPtS% zkphh}gwcikkg2hz9FhcQn1!4rb9DRi&&TBY#lN$;H9IjDd8fVntHS1FCIagdh!(6q zW;d~d(gvutIfX@TL_i-40N)eS1g-!{5H3Z#O-~J{s&Rc=a(#QN0!@Q74**zsaE53; zMvU8S1r#99fr!Zo{G^Xe`T&Q=#tvpaKe66`J5%J;lN9}DX8GxW;156pmLN=2hG$D0 zs?&IU{+)hi_-^(MLviEKkT7_!Xxts9`1MG3C8ZYLNtYb+v``!6z+1yq+0?9qOP4RQ z5n3(2HD~PUo3{$T*NDZp)@F@l2NpotO_3#4b{Q6Gy)6Wha^^4?PvfKL`d80im@1@T z0FXXT5GhPOXzEW93G=du1R!zXj9^^i+D*dU$@Q=tvMgSIW)~IKCL1ipm`|y5~`n(z` zSESRR)UcfT@cV?3SPj}sllj0$E(lxQTHkoIvf9;M7)KSce}t607it6?{^~oQ?K3mW z{`3xP6c=I3(!)<8?ivA4NMZi7F`M8ztUg%{2CN-0{&nf0i91}iTg$DCU)GX$$}(bAtFK*A4NCX0@ptY0 z(zHwcW2koCrIt9ytQ!sn3qe)l4e&C&Ub%7wf~b){tIcML5v^(=^or@^rOtxX%+rWgzmcCERHm)yoL)=W6PX@{9@-Z76V5f&ER@qucbytOTTCfl+;s zj$Apj_=xl3*%3sx_6~rR5I3nWnu-*$2fZN;4A25FL>A7s1~YTyv{hLDd;*@GP((;h zYg;?jIBlVMsUj8NtUF3zw0b~G% z+CellAd!~(iq;)Hlt@~un_CpHVL6#tC_7R|&$<$*XtE_`KAZ)XUd;h;{U1Mm`G_r% zh8YA_QEaHjy@h))dqrw)L6#z(V0=qrVv-JprS#o*-&?r9uo{TJc=cH=Jc*q=MbUp| zmhTA>&QWYLs}UfX0KMruJC4(*h;#BEC&DwV?B|ct%*e#SM|s05asXVCJ#2Ag_6715 zt15VTE9}OVSTq>V5tb;siNSpMU=ad&@$x13bXIw;@V?@TW_VG`4+3ex2uiH?nr)2k zv^*epy*1G~8#>I(0#!vR%yrP#ey?|$+) zy*s934S1-KeW`BW(1s`bwr7Mr@?QCtXu3$^V(a3ag$2!%mj1Y1A*kg$}TY9|YMAyk+ z<5VJgI`5aO!iAVY2$Wt)6VW&vSTdgvZ;AovMP+R{>OuT5l zFw-GE7V${4volWU4NNip>%9Sk$RJ<6d7VV^Ut zjb`UlXp>~QY#{gI4L_sPH7jlC%0*}8`rN40T4ZBCd13}yUfc)|s_Ld&oGMz5W&1rZ+58KnQ)_Dx9wR+#Jaxv| za8dF-2n^y${e`Gj%a0$MMtBg>O`_S`4~@eNZ=lK--p`@Sb91}1vkWhHiAaT(r;2Gv zq98kTaCNOGa(!7~AkHooFro&6j2?&1YP%Au|-7*TgH^HN&E zvKsJOF3s^^$op}pmTL*^7(`+GMaH;sf-!FDB)Nj>H3XC6dQ#_7E`s#t*N52?Z~(Y6 zg0Hnv4ruYn3GtM_u3jTm?(CJUS^*^cCZB;|GA#m4nvoYTzUIY?MM{;xpG$lNz9j8o zVrm*68BnW;wi$S#(VzQrgs$#YI_%tS?QV|^QuSlw1sFf3f_Lv-PdcC!f*f9iA?w-a zh?WlRmnZgZZnCiDv~7JypKj-QbwpkV^Hi*Uhs($boRN^VnhuO#7`3NHL-lhJUaE|) zV^=&6hwWtE&wzVDeW0e7m)S*^Mf8wk$;qtsV#vMjd=+9rX*{?VjSJCx-mv{xF10Ac zBrCMR-cr-g>*q9!?t(}TSEhcjs9U*$?C1 z6-a+xFjMyRNnvflY)39W=}*de)ku-X@iBUS>=c5nbA&^V(^Tu}$3=YxRrX=xK3l5TSioEHiTd_2ayf4ZWdcHWw9AQE4A99)nMt?{1p zl=}Wc4NAhY=e2IZHuT|4)Luef?@a>(tfI&qhyqOSDEm(Jqq05yW5AK#%m`RpU0bGn z-`F_pJ#ZmfsZH@|FXEzSrlv1ny#iq=53NlmpqezzqKc;1WF*(3aY4?z~4LPyzt{~0$sMBio2Q_#m2e)V#^Qi2;%R+V1FJ# zo0y)O;oi7gDHr6P=%DO-tkdzdk{qi?RYN1Q9TSb4D0$XKp~E>j$?{BtlJ#W47Zd~5 z>XT?Dj#anT34*xr0L%i+o?QtG#{CUfI#k^ED^_T^Umj`YK`yT(GaZ%M1`}b{((opK`1t^S5jO zacR64sxzJ0+|;Q&$=q}rhP512o3K|Cmk`h%FhfkI7Jl627pZ`I_|91{ii13LO}O5T zX3`+D1JAfPH+%m41@6VKj@z9wa#xW?h+Kr)33#tbpPy>gQFw*MF+s3=<{kMGbPG0{ zP8p>He7$ZTJ~Ce%!Kv?(P6(Z@X8Gq(7;AZ&dH*?BzC%z=38 zJ^IF2D0R7aI-0c&8?s!OP63W=M(!nRtnk`Ol8;SJ!;o?gx)`83L zWYtyf#9RF%m2u1I^X>6Ce7-)bN5GpjUH_swHUhFD1IcOH-r5VnLs&}Mp|uvB=u^D< z8JoO@20~U5kxVQb7j3zjT@$c-nxH2EJl807eSU3lDznvht zWOZRFDGMF)N^kX8sE;D8Ycmk_Q>Re|DDdzoI-`RFW>Je#m_1c|5lski8c=MBFu)rM zp{WKvDPM~%7~xtazx?OUS#M zjvwBehm<|ED$kV*=Ud?;kV9tyz~|KOj};=t+bQ5Vdk5(cQoYd7Qd6K$l``7jn!BF~ zgqjfgqiNwU)|8=4tT@DpVu;3v3fV&zsd;dW9*4gQ0Yq*RwN=pi8D968!&vQK!rpOr z%gZVgmw}BHqWJ4Nu}YJ{G5Chj;HPOL!-VD27v|g5F0C{?SRj|cuGvItDWlhH+_-lkI)7E&}`? z_cfej6PZnBC<9CDE=-PZHw(Z^0dgm1O`$NXKgmB5oU&cfcj@Q0If?g&rZ@obGs=kw z92y=pMv^YV{E9x5Td}F;(=3qK*#RFRKk4ju`l~~&Fy&*Wbm#U=$OLj6LR7Vzyc}lk zEMn>01iiobELjP|KzbmiG`+R^&P;@2q^(*6anXR?E01{IR{FEEN#X4(k0PX>Fn&w{ z$yp|dwv?*?|e!+O>pq56VmcD0aQGgzs&SEX5XK{ zl_XOq-%MW{6cWYu27bYA3BNjs+P$*Iq?*C!o(HNxf*s9&*~q z;6T_s4&yF)9J&h25#bKWL-A0zU;9YD@T7`}f|=pL(z1*yviSBzIAAJI;`9#1@w-FD z!!wHPmPsrHSu@=2mZ>&XX)96{4DVpLc>I;gDRu%;xSU{5s>xvJ*?niqW{!aHMU*@Y zBzzTio$e}zsl=K90@_Lx2;hRe$FzfC*=n;+G&41Kc8-sP4YJq}J4{OSLQl4LN!!#} z=0Iga3LoqtS)6P|ZCBPHW|J@uE@mgOHc-!|==(aAe3WH2yAa#WLge8$BOd zNSN{Q`(XUAES_i8)B<_5qP!mTglb>|o}Zb;GHh0A#LxS^o%4fPf<;x>4G?~|LOe*9 zo>-khbcV<}G#s4$Y|?=C8i0Z_Eyz8F+^=Ii9UY-KiZTk=0I*e76iJmmU36vxoI3qk z==9+UF8?LtKB`P#>=68M47oAW3Ur`18@lGra!fyd=IrI5%YIwwPxilR^4o=Z?RuHSd@QfngHYY@oIr?9&jvLE&;YAV{5coQUJ>xiOVD-Pt7nlPVLqX zggo8a)9QhqpIf!5w5X7nsr(iw*8Ig~>CO zynx9}6(kuoCk+Fl-0ViyvWVjT)|L^D^clgQib>#^6Q0dQ>Hq+Zy3L~+S9tQnFeILt zVb3B(qdp29L!>txU7Jrcieq{jecRkAtfF9yM1r4UhoykvWGO$kdtMqJAgs^CQz#4c z2Z~dT)|M-uYS=$j-M5GUj{r4K7fiJ@k%f!_hGP;F>R)M(m93C2#BcTLGF>a9TUwXd z2U{+ZHU~^BtchQdmw1*^u)Ha7tbholb$`8>kt5mVUhoVPP&cAd5sM4lJ%}uSsd^%oWl)Gd3VitmJ-&zt zqEK^2+2#cB?}i@CM8Ln{{Zlj3hAyIp7?;iu;enjM>~u%`Il_uH%HZGYo9lt+f2dMt zdOO|Dy(H30>VIkj(x&95>A2Ut)UNmE{yf>_#=WK8&?3@xpaeqC(s&A&6Ies0IA$r& zX2c}jy?cjJ$O{YifF$Qvnzfrxo04QuX$3%}VLW9~=sfHctQv^FB==+E)VhY^$dO_Q z>Gonu(NX!LtMLAXyYmZo?+uL(U;EJOKqHVQM^zp!%FI?YiXNu8N}k9yef`p_KGX}u zmR?`DVOc_(&r;FZ%i~jAX7=Lwk9^`2*Iv4Mj(t5hN5IF~^XFfF<&_JUFMagOKR$yo zuYjXZAn1S>$++^s&F-4_sUD3{qiDzR3#DyVgTym^i=L*lnBx`RUksLM9mmcsRjlpA zr<3mrET9;1W~F7`9IuCcpx&Jlgrwnx8GYvu(Y!26Faz8S1>rR*DMgr-@tno?-kOM1ni(H6&p$JYoY$w$SD zhfh|A(f$Vdor0&%jLML>4$e+b&B4u)u>uMe!_;gPtQ+m`Lz?6biy7<@Y6lJW_u>yG zPCl000G$;mFn8cVz_nI6xZBSK$#P|1I*f{I$2#>-!tXl{ST_Nb3Y(?pbd{(SZfG}n zQvRaySZK_g7p=zTpO5sm1+nHeO!m{Mxxc%oZpk4}>58~?5_w?TtnHl5R`Sr`f7-r{ zz%UsDUo%G{TW^Px`-==ci#}(X2UXSa6`>4pFMh(STC%J(YC&}ilh66qBH{wd(Q11Q0 zp<9mP&K!mAK~?e|=|IWlBUrHig3l?6ZIEa>fA`+}y}R$fe;t3>%^NphDD;E=U`5v{ zBj-zvpF!vfJH(xv@85X$ItKqsFTXN#{v2uj{ZQS$-h4bZ0tSf&S4avBYVPiqb$VW) zO^!_7c{pD^@&n)VujWMX($_yYGB$SYwO3)}@4tWZtuK7xH-7cAZ+-p?Z+_tmR2?%x z<17p4?AdFtyz=VnA2JtoINT`xL!^866^T_BUaXazpyPI5dsZ+{4b%w>uU$*T+vPOL zuroGV#=${JM;$jdPL}Lwvj;|&KNW9((i=^Ux43IHqGnK-kY^v9>)X6+A5Y;SBEd_iV9_qw1!&B0MKV8~=|6K5Z=bMdz?Tpy5K{boF3po#>l7hC66Vwh;BW0&7(^W; z=MeR;hu3P~ED;8)fLIqqBP5bG#=`~axi&P$a4O*UdE@t0$0yMmx9{G$c;Nygyb;yj zDX_-%SuIS{Ui5+YL)~3#JA0I|upR;O5C;dM)AXmB8st9o4*6n~A7mUA(?`>_@2{TG zykFNYjt@b~TH6m-*R9GC6-W=@u=0|KU)ygF=6BJi@OOMmxuZVvHY3ie0E9q$zcgWc zciV3=!77|_doUFUEux^UP*Mp)wKGG7EAmmdgwB4Lb}M{dj1sl;Y5VbL`+;x4)%Xa%AEQz$#x_!; zH610iDi=8tW(r*T=Jt)Z-{Hvlm#)6_;g8;W?_E&L$O3wD=F#q!KILK`DAxYUPXEw_ z*H$-IM+Zk=fblyc#^HGAyt(uRM^-4;Xsg&@%I4Q-}Ud zY;q=s55!q6o`6I>(R9^+z$PbFO|;63)%-B!@!tF;rb@^>I-t;me);mt*BA)+Duhqw zYE!mC-baDsy||Ur6JtUFa!uHC8e?rH^Qg2%9$?GVtWtD5U_%BX8NoD7^mV#->-H_a zq65}rASS=BdjQA}v{#f)PVlk`gXsKW7A7ccx-kus4yUO#W-%T?(bI=#d){pR_HXSW z&YBwlhD1xGAVr+4s&{HV(N2ZPZB0yAV>_jeQQc&n?<%lA%uZHMwFZok7c`w)HRV_e zsPI&9VPjRa%a2jXuY`-UCjk|LWdNhCP=f4;5CErU*vT~jt%*=hX4cdi78o-?8A4$g zga@{`fDh2lxkF{$M)XhAhvT^ZNs9h6n^nrrZ=QMo{{5mHge6JW22X_6?>?;>wA?9r z)1K+U%Pq*UIn8vZ1X7Ak_5}*XF1G6 zR%C2pAlg5(Ls$1L*&K}g$aNpppE(8>M5u#w1oB!pvmXxTGa)V%nI2KU;^Ot^2R>;I zPg_2?w=li_X@|cpo;{KajK^!Lc3NVC!sL8b#`2Pk5F!-kb61R;fD{>9mmQ+Q#n9)9F2 zzv|*EF9TV9@767B{=0qK>np2~C&t=hOr4QZ6>yj|fENYtV|l+b|K3L~zm`Wnj-!Ei z9j-Y#hLx9$EnGjuaV*@qL#-fi2QfbNj*UV&5j0tAQi&Vyzt8gGeAX4A0Dw5-gE)Wg z>W3^JmP8qFw=+yf=X*DbtfWe=|AE#0dSqWZ_`SZH-{495 z@d4F+joS{Qg`$%I^OYcX#sOFj$id|e<3ep;F#MJSP{=rd>VS&ZXvjK+y}2y7zr4pB ztq&$omX-}hU3@IS!On+xMLZO{8%lw?9E#~a6?gbKu2w4SS~i=X6yTTcF5m?zGiWEZ zZ=-H-LX~eBGesX*jxrVD3NkoD$?>EyJN;litPhVK#_f%rVkr?_lFmR!j1J@diEDvT zJ%u?5`YZII9I-uWENh1OrY2l6x#wo*2=N0yRijSrHfi&>P%Qe9W&?}7)sO}ZiUC3Z zbS=X4j+|u03I{;gOqHoi` z#tPipKZ7Wvfl)<)(^!N^bv4UPMg}qDB2)1zC;Ie?A+g0&G5aEyk~Jf{!?a58!e_wSKV1MC7ElxI#*45wJgGd4=U~l&K z75gZCriL3&4BQ)?=gn5ch(+Y00HcZyN2Y)V7v*E71xOQJ2Kgp^C1sp7*+U3G=vwxq<^2=M2ae16I1bTo7em8=c4w$R*TOf? zCFulLdqjmN^b--ulUH|o8{>7I+@@2TyS@aJB8EIg6Xmf3y zSzcLNo&-%H8m6F^&%VUWmi77kjjW^l%Mbc{2iCXNkHUO*uU@$_IC~Z#2a32-P>$a1 z?;SXj`{DgzrYtL5Y$^!I5kv{tG7O&CBs~NUGCncJQz1MN&q!@_q-R6a7!CG53~n>P zQi*o9U_Iuds_tJ!CxoIxvgT%{(Q_c(hZf=pZxjfGFc*<_Iwr~I)spM0ogS56FPlzC zV4<>gkBT>AO_nmb+&J}1-hW^tf1NS60fwAO#+d+WAH))keufeT@giawN>GcNOI=x; zFt5T*Ao9~Cd^r$4<^bNG&z?KVDdD%gau>Y@lyZrT|GrxJBfg!UDZv+#b&>}8<9t>y z-8(-sO->Q{LdkBX*RnJNHFEQc|UJUyx( zEUZt!5Cr4*Zr)~#_V*MK-nc>%aMK#xS=~>|*E68YF;Kc0eTa4mLXjwQ&(h{%P#7j` zHYbcCr?YA zYeVU?V@6OWx7(hR>(|ZurvX9g|05l!=oZ2|IyiJyE!+&cRQEMHV(MVIT9(s-LzUfn zQV(DZd?hRcn?dRWXc!5|fLsi(0zFBcp_fV@IGCjD?|lBA1E%!Y&HEnG1@2UL(*6 z=U8}uroxj3b@syf^OF;+yIi6G(?Ymm46`#+58->HIUKdqrG4UDL}X68xl$Cg1LAd-VikO-NMeBqU? zyHC&hqL_s^0VK*`HNj%aGGO|m0(B9s;2fbW7CoNFVEk%g2O%;W{HSdbl*4) z7v%cZ{kyj(=kUs0pkE6&Z;niiV;;fUvhe7UjNjd~wzUS=M6rGW#y`;0|MOq`^uPJ7 z-`f>ohKBRK_GKSK>w5p~cW=G>Zqwmo*%tt5eK7Iri2KG`f4#*GhD`#pAY>h+))10KrtE}lILw`b{M32CgAEDS=mxJWyIkQ=d?B27X!YjuW;+M&Tz)bv;r~^ZGwv7=Jq~FwX|myl|vx+STSS zt$AT}-)8;EgaA^=w)Zdh}s>@Rx&|0p>X)Mh?cgFU~YzW1; zS|UimChqWWJUsW1E&9pFc00KYLwHA3BI3AtIwX1?6RmwJ@;n1av**EsMaozp&jng= z(LeYhE5XdMG*j=>f+4Ap@v0D$uKf?j^{;_r7_GV}qoF(8Eojfh zJa+Bs)a-OuPuFrJk%p5_g|(H1^|p%=Hi|PA0uP2HWqSdD4@tCdbYdJ6+I|G{@9pk& z_4N`OO8s20T(}E_kEcPA!` z3W%?PhDrx8;N#^Lg5G(2AU+V*IS31hM>U_j~8${p$SLKV2lic7Y0= zQ7kexSQk@?VUk#M0vDujoWmbKWh5KTdQCn-`gFu_KJH;O!7!ne@}yXXF@#`bWC0+^ zmH?XmJ{|`l*r+q15~6;UB1CCkUk1j4!YIRBa%)ZieRCjOIgjrzPRvZ7yKtgPMzmjyx@2K*027L zf9$`x_0BtNTx<+b2`UL;0#Upxaw=22Umn8rALh!UKKxcz#W?VR@gaf)F9#F`f{$nd zADy4S8>Kb7(fiI)9(`m4Qi(HUkjV=5I+vJ}s{+Guct0AsN`C@=uvHa&xo_%J9eF?B zvp3Q8)x@Ml;@GkX5m}G|Rf>#m=8aOgTdCVPBO?Mj>)$V`lIzGH>g!o}_*g4zdKLwH zSLJ$PZC{5jW5<>8!6fHyckVifsVUkwQNDFLq~==dgGqGQLz$RRvP*D#2FKbma*}F5 z)DuFvK)GjpVf>aInwg%)6@w7Xfc$2~=mvh<)_&_K{;SJc^4=Zh0e#TlWcgVg#*9)s*LS!ctKJUc``bn8RQiXkr=`4P*k zg5fOZGx&J;^`WOrOOK(nbLY-on3;lJLrfzFstNTCMHVhXX=An|jDG^X6_H_}uM0;$ zf?6Y%3YKkb@GeE9JzuE1s_lp>-r z8py&h-~yH$N)DrkiD+VSax^?9a1o|}!dZ+YE2e3!Cp+n7<9(LvWq#;DPyfKs_OlnO2@}tMBu1l}Hj6Zzk(L=V&<0mV{Ja80_x4yOU^&kD3zx^}+(?IWY zGk%8R^Ebcrxf@@+I(s>*^}IeivvMy$YI%x@@z(BsKayfFb`})Nk(I_1@dnABLseDZW%W(hfNcM)a-}-jHhE^bMgutduAFd^2PJ#9|9Ch>G_b=f?_8nDwIJ=j!6Km zoYvyE&RzcJhacZ`!%gwIV*+hHVUK?89Ve&<*_){YFqcAO}5B+j3gPFHmV7|?kXC&zev64- zb8g4*J&(sN8erp~tXm4GP=LPf4C#jvXiYgvRn@=jwC5W2v*GLAtIW!~@9kW^1P7wV z>%#m!%+eSDT3e;=bI{Nhh+|VTGsQS}P|VR2Q%cA|z)MhlUS+D@u`#u8mKP zjjrQBjU7!OH!GwHv{G7DpbbCQ*u?ng@YoO@UjnTM`yQ;&sWrl-VuS2U<>)ZRfZd&K z`o?(PDRH}lB)}0P0?<=eZ}<7LXZPrE5%P-e#Zay+FO>unj7d=k67K-tmNgk!?RMgf z-g16u|00HopVKR>h->Q`u(8~#q?wT{r-2HYCZor-Wmgn^1IU~3ayT3=3C`yW{qb^r zb`xF_ve*aM9pUIr_}PBahI^A?R59_wc^mFmtMlX#3P{au*fKq2jj;_ zfCKP01V=B= z*f%hEpp0dlMXMzpCftw5ED7ENgV1UQ=gIOC$M^Sk(1@X9EH+nvas>6sh{-Q`CH!$F z))M?1?xv9dl;r(KA6Dnj>f!o0#yRs}NCdMZx#vVUr7ECPHeE@l}u8p-wwD~9R zPs6zwro76*xe?q@C!<~f1PJbh>dy)3w)P5LgA+4+cwvN|X{zW{t$)U{)>AER$QA(@uvcz2|#(6HBy!|!N^b;x*+{A*M}wN9%k zB60$5fk~e!)Y8k6@Cx!s4l=>)BInpbTizGypS60~D$L?>j6Yku_TCwCwSK&DBID1G z7A5M&B?q%3{X;vyf+eK_Y4kRRB}b_Y1xgsPhs9zM6iPEs4b8X4%aZG8m_aPpsLMAR z!8pJ*5U!a-mU1wa3L28JvSH4GkEJP7P z7UW)N)y6RJm~QFXWjk?wXSZ|J-jp89R-Xi-ZetUlw*g|V7AP9bl0F<>E@B;gFk|{K zY!YJ+flIi?JX4}iQ*O3UB%$D%LzM5W0Mr$bI2u}z+%i0(LxI{vfr*mv3KJmfamx!c zGu#PS-?HCfLQ$fZUC+fCMv!;eGb>BW6ov_Q)z2=2yThT;k6AWo?H4XxCbFAS)@(~` zJkWP|7-}xJ7xI_p+k)ynJb3NW<$wEM|JOh9`pawE8&6hNSaI=sGBEVsN*h#+);ndzB{NyyKn{6NE!fRq)O-ndCmu{VIm6WA&ND}JaK6~tTw zDY7J3my9i^bqC@vN-GnAQcF+yGnvOk_P}N;-Nsy|Ic8&hjkq!jSBy-~8nt&xbC>ROhb#<)8Sk;aD%g_<4|5&RzY^ zulY7q-XxYk@e7|`+t`xW&}~k_vCVN-$Rzccso8YyEGviAjtE7*9})geA_9A4ZEP92 zAjfG)358P(+NWf%6%8c;?;7AA1TgUU0dHEYQ#qp=O?hoax(#VHh|3!4ZN_+Vos3fF zB1sd{VXZSdOxoR6Gq+p|N7#%o{%Q%HdQ7x$J~-FUW}mnpRJHjuV2H+H^U#D5NUre0 zY3Dv?GQ*B%YHu-kvZY8L&9H`W3@@vPb(Ap^B~Z|@d`1qMl7VQ?W9p}8xG&7js@Zq7 z3MWfs->TDER_8dtpPKA_OS?upefUp5?v1MR{d{44LIbhlmPG5TU=SH%ZJrw=Rt`of zOrszf1isw}qu*@*Y~1t|aK>h7U2)~Y7+~S1LayE487^8M0d^elqz?^BE z!`em9VM6pxLr$vZ47kcDxH-&`gcEm+r=dQM^!4H>MlJ0rtrv@KGvf0Z2RhYd+R;gP zh;`{zoNbB&VSZhTTC{hI2VszF!iJQOr$}Pu^sqo!4l@HVrp=)#=eO1X`YYjKSIVv=W$|Aq+ ziSaiv&+BFPT}WK~Nbe_Ezqp-o9DuG5`WxJas&tK5cqI)#YG87FaAbI_zyH>an;gVE zFpR!iEHYFp3NV5<>wY2F~tG zoJ?2%gEl=i4M)J1@Y2Qe%NyG$g_r>tH%&+U+`-9=zOvEwu?qsg+k(3<-d}8WEBN}8 zy(rt$hY?#2gs4F8lI3UmK7HaB{2W;}l-2H5L`$F$BR9Z1`Um=0`3JEXnX;`g?;~gM z2u1$p;$br=4=j#h#9b0NdH(X1p|R0h?_FmL1NwtG;q|Zh*Brs z*Iqu@+y(RU2R`+w+3|_poeje%YnIxrovn-0=NDHV2-o;rjR%}xS}e7IvxRt?CJ;RD z)a_>E@!gD#j-vxG^|)pOKZpL5aA}|(sq*)5@c}Dc6=-vPogebPue(G66aMR#;dU8M zT|DdIsGYximw}p_ElM@f0Q@||H#0B``hy_Fl+8?xpTBqkgBGiTk4Gltl6V3&P@fS< zRB-yh3@C5l^c=wpCW+H!&y}sC%W08&)hQuBjsG{%$nPO~4=JIF33f5`KR&uN3G_3d zF}(64?YRmx3Dfi8_vX7Gd9{nkpI}H@iIXOF1?MhfI)cho68s`4Z0EQqf-o@pT7WGL z%uWdCm{LV|CvY^4_W|0CpAg(6C55(XkWr$S_;MQO?}^PG?Jxu*Y+p&m>zWXY%tvcK zBhIS-hE`z)C&2Sbc%P2vFI<0Sa{S@rC6-Yok)aTGlx8}klxmk;*;uF`TLK-jJp|NC zzSOQ3J6{35TQVDoQDxP_`k4;K%6c`Nh>gJ_d(2?9rim{{9ViwTx>{1yMn>7sCa%zP z!TwapI1PD%B5as>CP;RImq)M#)QWfevJ4?uOWe9%a^4XODhc zrZ4jtfoWsBf4o#GxO=Y3y}>=YAxyhZIF^LRs0E33g-yaAW_hYe>|WPY(;W%4RxRRz z0{mdT6`;Ejz1OUQ16$5UI2~@sbBW-@Xz+?Mgz&*XDJRb(3le|=ONMi&<0dX!szeH^Q~HyFf29mo zcacJt@h~!a0vKb3?&I;#pBtZ;#Kyy-XD>LRq;@QY#TZdIA|lPe^vM*Snl28)7+?SL zk5l;&5w93Udi%I6mX+yqb1>4$!Ty&oUHqZ%`aQqzD?jn6S6}+N54}dB5Cs#Ci$9*8 zoctgD>HlYWU6l9dYo<^B(Qo~}3WiVXCx79W9zR({dJ5-GYjS4h{N+nLFH`~|3{bze z%*4-^ZfKE3uY*mL6#cE8-YD%hQ!?>}=o(XCHcH-FQ^!j-!E}WQ z>usKSZ(%`}kam9Y0bvX^zz}1P&HB|T{sL-ha{cP7{E6XHr>veYCO=#p{$v<4-8P$| z-DVJBN{6)pXCs1!Um-Osrtuyc&R15B!Q^IX5FNMa*MynbA5N1|b1$4=>Pd#0*KRGj zw-!$Enjd+W`De#yr{K4xRowOrRu*SX>5}d_ebr1VPQWqaeQ_A_8lZtg2MRf!ubm<5QMLD?`a7OlIn9Q483;F&+&P z$w5--xGy_`_hHq~PV$Zy1K7hd5g2Ox3d?H2P1-NMRYgpk@tj9LNu$FI&G;iATFV^$ zn~?;F9(JWzPn-c}b!zKzgzd(vDs{o9xO7sTd^_^ia^uE zd*TI@AX))ptbqgOcOGv&0=l)l%3|0bz;rg&M^VwC*4`iZJ>U8DufL?+@r-WehmRkP z^o=O)ynx0J#KO|ra)0V7QC~O|i37If%-r1c*{B5-2s}J}~$ATROtFV$v5tP$0~vn zI|Hw3syh>m?!;h5LHa2=snr43lsb^ymzF6K9Xb?~g7|-$1k;jF^Z>Ai| z{wZlK(X6BIZ>^YzLdKcQ;8?Wd)cwRd)Ktf2V1I><)vUG4~u5E52g2bk6`E*KM8jBAa3o$e5TaO1yCfRxcE0_0r|b#1e8@_%wP_ zBMhy?nsHg{@r(}igQ*$XPq>F7CyhVeG<$g0W1e35E|O8nnd8l7#5Q+@>xfm#eYqEY z_ags|j{MN?|L#Ba`@gHsKUklgLuU>ypF8_ApZN@lRwT$zm1&+s*ui1XB!-b`-`NQe zCkLU-k5eD%9*%#@G!V|ysLRrv933SBj=tg%XX#=Vf@C;WMkTXQAt_Ae_{cC~5Hyp# zI%Rr8F|b+Ecu;~H8j+~U*Qtw|)v^&uLtN0XbBr_8s-X`|0b@>e1M(-?6)ZD;10#3u zbGj)^)?CtRg2i%tYHET(IDcVwa(utLYlpo2+qbDx{n6K7rv~(2`N1E!IyLbuihI>e zOYqA-edFiey8G^PyZMD*+ur=a-~Gp`^za}4%4ZiAA2FC0uU$QN=^{%5n+9GUA$3fg z$N=Mp^A+@hG2xMgPhjs6oZ8>lPh%`uUc4oQ!9B&v8LlJ)T3cP`M(i(E9mod;7bA@& z&F9KU;~ZkvKm=#Xm@iDlioy!r&MaL}qt4p#R?}sLWEmP;Gumltx{UufkL%NnM8L`i zAv5_q)ecLl(>cYKN~(P~IsukX6=)Wk@rTc#?l%+~OhDR+wh_&kJ_ifBV^~wItFAMF zeW)CbzM;Kc-e0}B+7gjj5KtZp9z59ByR`!{*b2R!nwcd~h1gUXzi4RK(dZmzfP@!p z*C4Vh?Lc#m68z)h#Y@oa0CsMYs9uDs$%&r+g4nN3n8$=l_C!l3?#X3%Sm~!QewTG$ zAB-PEv>69ZmyOQQCC~Mad4UqH5_xf2&T5Qb8#TfqSCFhTp3pBy6{}mx&j25plczj70Zo(aJ5=D(mIDGfs+f{{@Ui&t-JS-9-geN8@NEe4>Ig7ZDuOl;z9$X)Xpr z;<*Br>Zqf*$Erhs*bhG_AJOxfsIwE}dqLAm=4de{FX>3h7nIWaj+ z=fjXQ%0g!(SvIUbh&${7Iw)Os^dfvOfv(*!hwdk%gAx1qZfLXv5;||0m4Ns(#GAz#J{=ZQ8C5>B z+_)ODR8e@t&=OS|8g?Ug{TX&E*g4$Qxs&>8rH6bo{VYfZ)95_Jf5?T<5$#XsLG?YA zYK{n<(%Gh;pa1{O_|*kxrY0UQEekuJlg(a8r>`s_zX}4kZF)WQ*YaF#ck}#gO}UW{ z6~Y)r$)&NZW#`@w-*ChVH9LltDK0RxR9e+OY2WnTRqgFCGq^1Gg3Mu&M8K?bl*q4|YK7{wZl;q!HUzazf1L4=OMc=|!_c#B{zoSlU z8|dwS;LV)`>Q|s*Z=-u%q!=Gto)UZKi+%0?f%cIA!R_tuKf zYlk1BF2h2?aodfFt`+&N)C+*7Z-tOyWj(U288d9iv`mK!_J5d4htUTU(b>rfUJV~R zi0~9ufxzyCz?K359HDw-gsQA*ljjVzaL#0fa1biE9l)%@eWFluXT11)q%$xW2B{H* zk)1*eFR^UsuU+C$mHCQh+`e32Sxs9@I02_-&t7`zxw7|*FOAVPHu1a~vj0NA`axYgUWV$oM}v*U!u`GZ!IAiy`SJ!!X2J z%~h2vF&YINRu<+t86z1#i|mA&ymE`+9Pp0E4zZe(28KpliawxoaPTI`(;8jDCt(_dOyroqEVjD)hXHVgxE1QaG5 zM$n;P)!0<931fXmPk;uZr}AcGyjUQR&sq@xg+-m6dH>#hd)uXG+dMJI#8pZn+k{(tu${j<;g{L1>1hpUev z?sp&E``OQbdU^fHZ~O39S1tdj=D+;KH(N)A?=;1u?=iM+J*$M!CAKZ>f!V}ofg}yz zWiin`4YX;;Z^R(+>|}dRjE*sp=>0`5h%v=p6@j|F4kO|br$Si*b7?~mDjJti-8cA>t3o)OHHS|0{?W;)S3maA ziJ`%rW;c{;)$~3BWy%Fa2?%nHu=jVR>$Ns_J{Ih@i&;66%_-DWJ z_Gb~T?mU{Oi2g6V^{Y1*@9^el-uT&f=da&bxczfq`1IoP;+Yp}6chSwANlH+&RtE- z?ZYp>{&zq93+Jw0+uB@%t;;yeOUn~7H8cJg**GDQ5O{T_g!4-mG#_HNyPH9TnJg$6 zOPWp1S8{ITJO&?le*|dHFu+hM{ihyBUx*;F>uX&_h^_LaWN8V%r zV+kex&Eont#T*~l$4hmPW)V3p@c9c_FDkMy>3lZe|70VNadxOLhSoFU7Uk1wsSqHx0`?cVx~$ z@q=x{x`YJgvUEua+ zD+hHFuFu2rP>F%VWrgR{@I&ks2ho+4Q9?y%3T+D&aU>;8axy+Dit(X)pxcN`8Zk7C z=f#T`uUxorYyKXOBT^n;*|h`*G$IdIG!-S5pR6bhWhgE&90V4enJG%4s%LHAN9uN| z3nwMyBcsahAOV_QG3N9iQI7d77`3KJq5RCV%oXKYe-n!VmwRKe4*8cF0REUZCe2+q-c;v=pKE zTl)cB5Fi0NFk@1~IoZJvI@Fw+p5g8f?%zjNL&A4C^9AN9Mumx`pm5KXt5gMJ0}@6A z@7>-C6Gc21%d&f@NOqYu6O>Yw}Gf3*Y4 z9~fR-dH8)l`U7_!%){m}>;uu`lAa!&@|>}uQP&6IcK`D~|9h-j3-rBMBOT!O!}+RK z+}hoqCOS{K(`SL4lF`7kHCkc%VjT2n@T}Hg4x<)t_FZ3m6GZ>ujH&$4JT3%Epkml9fyH{9O`DBc`LUhf*8yP!?`19E-O(8JA!Cn0wE$*KS>880Sq zfn2Rh#D#+4$qlGhxzXrt%UgJ|N*g9n*q+AH%yZM?ox%Lt59!0nm1#9@tH|n}0C<@V z%tzUP>c9z17LJ0jC4+!g$g>b3R*ZV*$M(<3#8zKOi(WQ^>Jx!@rHO^ytMorx4l@+qqm%DEpa#%m_JUpq#e$PbJ& zESaI^`jV}z?KU@u&NInqI8(eBj@KT12SsB530w~-%4Rn4Cg~Mo-$-!%SgA@0#WsLd zfYaLS5)EfWY(CyI5iA?B=3<1m(yKB`V^xt1Mq*fBPcznxPnWT;yec)Sb|;v0>fc<= z;-p%wj(`^GK@redW`AyC{O-biWKF^{+zx)P`#Exi7|#;-4i%tx$RbfhYfN4qI*2Ix zC3izvAzfoC&55!g{vbRXCW^A`Zu!5BBOEc{Q2>z zNlZNKA0~qh586CYt3xBBSoOIwFnn0`11Wv*%C)P6ygh#O7*=OC)Lx{ue_}W zpmFdBT+YNZsC=B|SH$0bCr;>!k^kTPFMkj#al6V<=;rpu_|WJ#eC+G1$A9*VUj&o) zjJNPWgf+Rp^ieZ4Cnj{R{YhB2j0!X}8w-Jgg^HA%Ud_^7=Ml+44wwi}F8sfg0c)c6}l2|YB;UO3i zB*t~XPt?%DyufyNlX3X4Sl+d}AUMZyBkYm6=RLd-ZHe~) z`8`@$QE_oJg~ zIzGQNex7g;CK|hr7tcgi20`fc2-+W@Kh~T*+EArRm^Vv*ft*`ylJl|llw8V4`Q^CK zhZ(R`D0hquI4$4>ZSL%uwyIoSgou!zIDx5QOu}I|U>Q~)6y^~Odq0dcFe>U$l*X-b zI#8!I`~{&h9&Rz`teGBt8y^r*2>vXt{gIJ@-tPO$%Lr@K4ZnByE+OKgZje2NjfTYx zHZ5-Hs~0a4WQyAwG8?gJ8_4Ahg)Ber5d5AGzA=Pd2F59c?BD&CKl@!@xcQ~g!4ZR6&io(Jw)b`}&s_Yruli>8UGkV;yM1S6eKTE= z45*x56n76-Ya(;h6LfZ@+G$uAykGHG$YSP>F=9qiE{`H`2d+&8>kt9QR)eI&BWls> zu4nfntAgn!h?~JT#K+9rs%9Tte4O_%eptH-bLM&R73+p;#Zcq~MK#*~ zu8)7!*QgM9IoX3@Vxp!$SFRtwwF5!NeLX0)}&Gq!XO`Cui$K~W0b1~tZSWGwHlUbzb6 zVS-}1Lr-cQaAYr(YjXj{C#SgV-TAv538zn&bk2Mjb1Y%!!Ta~D-A6O*fGfK;_$uao zFE#iY(lL)iyL@)`;gce4K^*1!ytqDjOm-&XHVc&tGOg)xqd9P zZ1|pdEV|)b=dkDvfj98XPzs2036Zm<${sW=B1}v6V&C8pqvTc!`qlKBR)5gB$Y63i zxD(@mdaA$|s7+mP7siI?W`Kx{U{rDJ8#gYeO}BMs1b9@|LT}3oB)b_rbMWeS_HN(0 z2_rf?IZiAL_oCO-ak=u+OO$He+Am143<|)i2LhH%aW>?4Q5!rJwoS&!3Px{?fT?-}_C!pT$to_}|1a?oWJ3Uo5>Q#MOe(TY?7% zBEq-Ts)kag@MR!pf&lW_0m%-xl*m0jz5CJo=rb2&B^S_sK&&sn@(L#mkB$M!GXLH? z)ersgnxap5#J~I3f8;Oyy&r?+TV(J5$i@I)n!fP0ANg(4OppD_^;^q`Q!4lQ zDznccG@K);^gCQ;EL#D&*&w5YynN&|1Yf>NnozFg)uTpH*+&~9ES2S`4uf>dDFA|K zuB+LfWsb67rj>n4bDv5HQ|Q;ajHV%GMhV6m93bUvI2@XMB;yp@5le_x@6AbP3sq?$^^D?>o%xjSS_lARao$oOd@i5jY`$RPPvVM=!Zx6s|o8?ljvhvOqQNeBy=X4Xthy=pJmTl)hdf58POM~83Sy^F3x z|Me)_Jzi}Q2H&y+>c<(bpJGH-OfllYgmraR-fTt`5Nvomoah)QpnzIs?0hZdkB-^- z(cvLzia84z6o!XY{;C1fwNcMYj0P`+)j{bvB%dQJfJt*$%H%E;2?>)4J>=tVR4z%i zv6c{M$i4NM2D%$h);B@~>}8KJ_$&aXPN0kegLYo|;HdG1mH-6; znfGy+{Pa^~9x^O$+`bDB#_s0wqbCAB;`=WvGj=7w?e53g|fs=KG@LYJ#=s89L z#+h#GXsAN?>E|lZh&_Ek79#lx^5xUHDtIG)oQnQT!GvUAa&+DVr*BjkyfE@zYX9=$ z=FwNf1O316Q@=IWE3^GiKlk%L_xVpBmpIPDUYWi4ZJ+#>>R$WDpZh$yJc`N2__=jB z#ZR=f>4A($PFWS6*oRBpc6OFe5^5l^6YCH;;V7@Raj!ld~ z1oxxrF{?H5@jN>v6Mv@|RNTgHTW&{hb>7Em#_koXSbzY6a}?@qPtWAc+{}gZ+>WF; zTrnsTC|-Z{2ZQTZ+RDb0ANp(m-Y>rSD`Z8U`Ipf|O#1%c^}WVs**OcG3=K{RD z8FBkE{Z#t-D1)yl{SB4=ga;)!<57g8VLFv$CVXg;bmo+;MKonbU5K2Gtk4_a;z)uj z{WUyYYkV`~o{!s?`qu0S*KJB|R(gb6jSUUrDdUfQxD-G*Rt7-^XKC@*3@#29OEcu) zov=0yP@=lgKa35nFB+7EfEVg8LQ-L(a8tOxA-ihB75jO;rQWFve>f-?OEA(Ex^hIk zk)aS?Fu&?pOWgE148_oHd8g)0!v)3yH^bln1t@tKq^hbFWlO6=-jTqlEPte_nM=X= zd1?bCi0ft=b=#)}Li#0#HV`bK>kK1@>t{?Ro6`F`)Kz&A*g@jlY z+B3C9cSnwRfYMBe704MT#R=x4@R`DmVu2jU#!8?^vOVZHD%AAY2q#$)82*G{P|I~R zAaOW~M1@H?ea~lPV+@@U114}=AS5SIB?79g>4HXI={Y_p_N19DScy^c17D@f5n~Yi zdAquAbUIxf!%Z+e$X)|Y;nAbV%oj2nJ;X=D5D{fYm$*AO;?}IgtS+c4!HG!KJ>MNy z2Jbkyp464uGK71)cjKmEgU%rH!usSZ2FE0>`~XuxtiNsTDk=1ulAacRT)Yey>Y#ou z4zh8S{1|FkJNMJ5%L2n_Ou!uKzedgkQb=^gaHTQyKVjfa|K%5*0qhx ziJKCxkHSrgopshdhrf_l_~^s-NMF?Dlstns{= z7#@7^xH!39y>|81;vzRdBOwN4Y-*C*Ah(ib9{FY^qOip+bmyz?7a}X0=VM3!c7i_e zxyv`SE_y}e?00_ESL7oP_YeKWzx!8+K|4<4=b}IO9e)hBaf*N#i2mWPe{MhJ#sIW) z0FKP;=~E1uM1M!>ZGqoHz-%ag`$2X3a9hFS>2$EJmM$l-ghSxMI>io?)yR~rJ;At^ zmYW&=n-r7=7<3EnKYD&L}e2Ip|t0o(>DkT0zXk)4{+DFRqetR+PgQ)rq zEhVufc%S8$ju7G_Q(wNWvQz`u6T&sNDrS|U$C^}?XKAmobT|`4V)>($C(uB%+1b%_ zk7a`X3DE=aYAZ^{v#wY}$k~OqpeFT?O_`p{4u?L1M#ropsz7d7j@AYcd0RVt#^l@S z_5vPi{IrR&5w0f1_Z*onv>3Y01$kf7#cL$dD){J&!inpo(q_WXCoLB}FyLU(F`We> zhjUI%@3iS?kj-;hh$~Wvx|A{SG%ijIl!glIt4VJz+9>&gN+5P z9699WI!#y#C>=B7W4jSa2Y1nZmG*ui?TnuQ=Z>y2w)z?*tAbRp#Fac0o6;O^*)a?G z6bp?}`uqDl1*=Og4u>}4&voUM&m5BwD67LK!jyq!#1;4AEH(x{a=aT{idDhIVN`S* zP@apF;$AO}d34gX-{eJ)t00hT@nrdck1qJx**Rde7Va<54c7+uqF0#XLU-R|IF9G~ zd8F#fX%a#abGql`8VjP0#0ZA&5OWjhNHZA0MWlD|$naR>;Hsg(XqnDFTpwqD@4z5J zD#?uM>+M(>CW#U6$19H(Zkis?atUZeiB_?Br{3>D1@1tueEHQ^Cnv_)Fz?^G4F%-- z;jJh;3vL9K1|Tpz9<}oc61si!CT59)P|9`)Nxye5GGlwpiQ>}Q_9NLWb^WyPb6nof zM^%6R4lCV3w!h=Ie6o`Hz4;e@{4ZNoxntYh+4}R}_a7POZ+o)2^)qk2<%V|l1kjT# z=hSLWkIt01eca?Q4;L6Op?jMS*3Gwk-V8)JV*p{vl&hhr9ncn(@Nt8?LY*VMMAq8b zh!jCIE-)4NA+As^*wAfn$08e|w;xSofIUm>BmzArYa->_LPh)VHx)}2v3p$VmDgSc zOLAg%mS7x8?v7$r?dwNIBZ`>tr9b<7zOAOPk)iiT|MCyv0MfkwFRRfjpcg)I?PFCz z4J+(F{=yfCVW|t-sr2)rtwwuIn()g@8ADHpA%Zgj3Bnztai>Z|_@o^wFg#Ye(hPPa zauGI;#vf$1xcoXs)U}MCE!axqOh>IAtS)~onud=U)FlWC6i!#2F;YkXCce4r#qFSP zCAcr`z@q#U#>M;j`I5VgK)^-iVIVT%7*@YDTbkA$`F5_RUBSXcFllL4ji4(Zz$uYD_<3@A#sxkKR}>RP&&!0b!Df!0D8}z|% zWPS=6g7w1l;UZ>em=CJwav+*ciXmjRXpN(A4Ysa)j*m`2&QTb~3%&OHvxrh5 z`TM`}(?9VmKP_MH*j_$+_4~f@4^;Wwuim`##rXx_2XW6Op*g)J!*?{98U!E0cd%x` z#i5~IO2=@KN{5RvOpWqGs6+t`P3OQu+ZT39$89iU?91 zb{5n{5iY>#qXaDmGOU`IQZ8LMKR7mym3M4n68Nf1SFh4RZ1^AjicdoAF=9bPFsqJC zj6Z((sDFq$h(iF)+blOL}R(c`t{@A*%^e`9-7N$_88(*yOde*Jf`PI8ui z>Am+6*Q%yjmf$818-tl7^A8UnTMSW87ubb2{yzA0+M z*z9?)sLI8)-2Y6!R$N#q55Vu&Ha3war^ZLm1olYs=Jud}I&C5WB$)LlM2TOCvZAJ& zIHR^2GJjV9hG?Xfi9$f3bht}-V7uIj(NL!B)r$ z4}=Y1%3UJj9U)g18*;&xEg_nAFVQCq3+s-iC~9;9edY}m5cQXX$}8g8)c_C=f@gy& z!XBry3Wl^A?}51R6_tXpIBW+fGWX4^Np!ZhjUp_eml}tRd}I(ngr!%eZad(s(fEle zMzyhNSNH7+4~39Kx&>k^wYD$?F=D9xEN8qJT$a!aqF4vIn)+S&30Fsk!@%rZOF8T6 ze&@S;w0^FwYO@XW;^N@H4dh=ebq+FFtSCYmSP6_(?YF0L{roR$Zzt_wI^`wdDI~j_K#hP&&IwZ^&7gzjGV9f%YsKtiP*z=d^LI ztv%sUMc0Q$^94|@fy7YU9Bd@<3LJ6$@qo%Pbf{cRIrZDo6!D1!;p&Z3#NlZgs(JD9 z<*A9O;qkHF{yzM;_+Mw)*nmLy51yNu>KPp3F$#F_)C4K&qyZ22_mt8}C|ZL9{A6=` zXRN2^FPOYnf#mzaAN$i-`2Wwq^|NNj@A}Gbs-$T&{^^(ABv7R~K}k(3O26}#=>4Je z`y!Bm201U1r+H2#K^;MDJ@RXkV5qnPqD%#TNT?b$8@F?id}tIfbx0h1P}jDeR^BjO zo1wLeFNd8>u$I(#y>C|aOs=85oa2S@SMgRe(Kexg4RJTtw@~~hl(a~QeDrepYSTU} z!=Roa7t>De>NcE2HPli){-g%RYJYrS&*2UGA7vd%$5*1gDjA^LaYT8?KDX;<5=1TJ z1Ok$xM9>5X81PiC57o1#4q}R&iNcHg3cXP&$&08Mb#wwc0uH+TSS>RRO>Im=rJQgF zl46RTpL5Lt)5m7L1IV|73BBkDvXlAf3{Iv?IJ+1C=(+G=N(0^^f36uoMVxR`v4({9 zs}>0q=}9B`QHa^@W+iXJ(=d1&&K4Dv1LCfhV0z-;uC#w7Y zgmgy|z_%V+DMEoa0Q{`0x-xP$u%}Pwm9h^NyX3 z{Oz6ey%Bj#6O#GOJ9peWE>|Q}#*N#(FxU6`IwBKSKoC76B^g7u15*r zs@qTplMyOtemghdPu^dl^=L%A0w z^1$3J%$pnGm>|I1gk4av!g5}``%FbT`!mWfjyL0bqyK1KW5dJW@yUes$f+9Esnr*FL%4&$t6sLh`~I(rFo%gxKY5Dku!LcM$(od?cH zF0pcwc{D{+baT;ni7`75gCC-~G0P02(t^Kp52nqZTVaXBp1c)s(PB-i^m9Q*8x0Pk z03J2fQd1XEN@)D4);Kgd$hbVI5Nss>c*6^ zweh`Q`!#dpW7RPJ|Lgzs7yj-q{*);~|EFlJ!Z`o*@Bbl)RUZ4r>o-=`H)1Cw3}UGc z+(?d{>3n+q-7W`yU*6gzdwyi4yGcFANrCqPK|$1N`uMe+A#5YkO-+n*`dVbA?Fb6e z))2Hro`n&R-OXMG;BsYUS$8mekQ*c0saY|bgnwCk$^2fqm?DVUHK(zDR0jCiH9B)n z&$mHa(&d`xCLO~T2F4qO3%onL1AK)c8qtPtt1O9Ndrk&<1FmEKw2C-q$<(ctu2)!7 zxu)Z4Fq%ekWfn+0Jd%6q?`L}~K3EhLS;@fbx06@PXZ_%49UPi9?Dce z%>G=*k!1s#F(?(IC)`xZ>vlaE>Bv3b4v>&J4n}Xm9+;flcW!f2MnJ+*%Q*iIRFeZ)5v%7ZzoixQ)|5WZ{(pv z7MMQhlf!O@RQUYp$sFJnmBkpqS|F!Roo6N_#K=!}!tZshM2(RY%%Pcsf5*jg^SaPJ-y zngI&TEGMyaPIm2|!1c2XRrOqzZ0&PdK1#8SCrz<~`<|bkCJ?U_acNcaEfX7qU0tMb zI0TmAnekERM1*S`ur3p*+?Om&z(fGhWgP^4ThyB`pbimce-JT1=PsPbf4sW(1VacS z5k!Eb{PCgw(cwXO2^=10A|hJ&DI437*%-EHdeO%;aUIZzz{Ws;Bi(}~6`>^f2sImV z+kJ9EkhK1P+`R>yEXBR{e@513*4_8Ga&UKdNgyEv2qA|F`P-Y<+rXcPHm8B)RXu&ocD%v{YAh*Ynfo_nR+$_PnExK7HRk z5TN^U1BF7&<>O3W91(DOzt5@uiUfqt@umyUW7r&ozg7FrZyxzQ%Is_)05g#`ls(AQ9vU{7$w+~6%2Zlm8Bf0_^k9}Ucdocg;~FGDA2{! zM4lFzjVjK|s0qvYa1I3(nUl_zUs%K-w&V9T_`w$Kq7D%&FnU3_wY{^cu3j1E$R%8! z+Inqm?Sy$VYDn$vEiI;I)Pmk(;GC;k~DCHv(Lr& z&yIGWy}b>XS2`by%N8WuE6eKf{0gS<`f_bKf)g+oEGLMK(5j}E7E|prKcB?DVJqU} z&}1J(2N%)~W&4oFRV{~+eA(l6VV&*HL~XD^K3Zm2UJh}pyFhWTl|T^4F-=V-E4s3@ zI2J1sjk&Ex-|rf2OwG}Bb_Q8#Vnsy-km)I~<`Xc;3!vCKxwn}?bajpu;fdhN5%KC+ z4#Yjoc5M+}CMou;lKEgcby!k-=!*svQAA{H7p}WXcQlnIQH@O!hB`~__d?Vh;!P5i zN(F_HtObRtL^IkU12vv$l?;#=qyv&Kx_1M&){VkcE73}jFa9Q07-)Xwam3*wMN%#w z%;q!(fNvI`giU<&4#{`W~A_72s^kz*bR zqs`KcRmw4#nvU>Mx3v~hKk&&?{rlNIF)Dr=UjaVqtgI`~KU;$ppBP4}J@deQK6KE2 zd~F{X{N`Wo>?L?57PWy|0z4Ob7h^RC&$XswfdNgV9&T11m!Azks){Pg@=LuY0Spc? zzvB3!xXyX=;yzwIW0c?;T!;U&0XQ~RWILULwDc15A2J#{TC@llH7mfraSIqG#!tnB z#N2Pj+HY7&$sVo_28r?R>FOp%z{C6MOsW+hQB!YJEVV@|*j5N!crbI?1nS*bk0PmruvS5=jkl{VBj@D+x3 zfs}UBhs!P|^3HPBfk@(h@GD?bCOwpXMK?1i18}P6smy)`OQ)SVOGP{YNEXubgnzQA z>%#G=uxhQB5zgM;-An2@k_gXnLJeT40zzme<@A&w*bfpYFwN<^Qrv+Y&c-LvhH@(? zfsjQiz6e~Ey};SDv*HF^tCCb7)-7RZ+UC+;aPG7R`v{p|B?RU&b^eR9o%4G5g#JMIH z5ek!?{o98|$Hf1j(eX+Z3@AIRfHJd2TB;dSoy4WWCrBa!81E*bh}VvuL_(5#f*vA7 zPER98RVNxu@hZEl7UP5QzGh1I>83Zns^Ca zZ_EDV-FdcvzT{$o40nJr4?m)Wb0LevRefqpryJT%t}81FA{uvUGv88}*4f8};(IB5 z7(1(Z2f-z>lQ|Na@vy0EiEY*Aibv0&js%+B!cmF4FxoL{qO>9U1OmXwxP zEMB&}q^um{d~RNTNl7uVRRl**VPSE;QE(MKz#qCk5XD!6wl;E22_mW?s9FHD8JPgO zewrbtK9C5KW`)uhmRH>T=}%mF{)eYakn{(CMVX-+KXKkw7o5ASqTGNe&%X-I@n=l`bVx=V(kMjiC$K90G;~hV-BnD1G=Dmrr zRqD051gk-|5Tj?S@um`%4@pBfH>aec%I0SViLv0isp%nt{w%3;CwGwwCRxqc@X&I2 zI24@*B;UF1@*#TfJz89X-Me23vkGe48t8qurJ|_Bz`hN>?rLw{wr<_F4I3J^ZtZAo z4FuEt<`JFDMD;5ZHDF(PZD-YXw+-fHhoEKYfr$?$Y1Mh*3_QJjz&4=*7H<9)@cFFi z6fZz)Ya73oS60~grtD8SKv(+T){G^3Px*hxpzrl7Ar32P>Ho97@;sf zKllyUu&Z)~#XpLzQd#>6;Hn~E=>0Gtf+bk<*g?F%UL{*jcSF3>(_5IE4TP(-jF)v^ zv5S%q>g((4>gw1ZE5gVmW2=G;1VwD*Ct#9iS4f$>NU*yQEd)GR2lb%@uq-jAOcKyV zvlWy8Z7dj!+(dL3{mX^&v$JTk#tg8W!4I8$@g>`+({drePc9i3d?A)*-TRKf{EV0@ z?}j&>LDWp(I$jvD-|*F;l$dTobd{K+x8)slr1BXkJ)6G1f-vBC><#zuK>RzVbEhP8P81IR;b!x*M8#D;U)`=TOI9f7`?r0 zBs#Op(U-jLt|+CS7z;W3^{)9W*0@`hV;Fm*w(-7pboCH8i6ty<5kxbdOb$wZ0fvin z^C*p9l%0)sG&DL+Y#~vN5b|WD1Sp^f{XS#Fq}XGvaklcNub`-yK?K66BtQZ&D5x+r zyb*wq6$pg=ej|(6GWh@xFvF+c%&1 zQmGuTd+J}GyDKAgR)w`7JMYB3kM(Z(>2t3P!qjVW5Y*Tjz|P{&VU!*Jfv_K2G^S9Ju#n-1@MRE(2K-?K`8 zjt$6VBP7gam6iB|ZAxTnb3+3qMso}DD34?_KaGUJV6V%ukqXE5xeJOOEGBn=ZIXnBisQ2$Br~oXfHzd^*?4_no z5cQzHue+mDMiz^=N`m0eTa}n^RuJF}maK)cM~(FjO$`mrjg3uB4RBUBHq?`~0Z8+Z zlY2?~6Dm}>tU|7VTt#j@Kuh>b0Rff46j8={qpDq<4iJG!o6RaZDl0hW70s8TDJ9P; z>rDygv}6YOam@hvRCbm$aZsEiHScrBqQm2aUJw!uh|&o_M}C4&l#3~^OyUNMvId1` zK=r`LI93G23wKLiX9jKH9(9Nc&u`zp9faPzc{A!7Ag$dTPpugAcEs8vp9gplN)1lL z<{?ZdO#tfxD>Rs!l|7tM?dUOEXd7Pv^MHI3nfn0$zD5^ub9+-S6ol6xdu_rmw zUoSW*Y*km+I-gok@KCTq=?GWu$d<0jE@dpr%ayvBZqthul4@f)Bf6-n(IAWT4-W9W zW?9l@4>zj$P!cJqpIqJd$}Mhd5+OipJrPem!=7}wNyq;z=T9Ecm-quMvGuF6dFA7F zQO7#)cIhfe__}NPn;B(Wzb7J6WQBm}{)GJcQ#P=Q2M&!4fr${n+3U&!%?^SU!_Mz5YE`5tPI5`@@R?=-txj5FTOA_04jiz1N;W@E+=45R?z?J z^FCZ%kPn_EbUCg8@19))J=BIzB1h~}y)t`hr8p!P3QBTeaKIYp6+kfg)l9kyEmRd8 z?ZCQH4{SXgTaJZ)E((D^P6%iaK&)O-MT;{sGLNGSb5%lDT8_A7!LIajR z8{cwYPuKX!m{(@v27dS0pAkyl4LlEx4ijCm*P`9OeEMg8apC39{q*4Uld%0(!k=tXZo`ih19W zr<*CKg5KNLZ<#A2*xT5R=O0Y5-gNRZh7Inz3B#WdxMw_cSh{(k*uSi#I6F5R;AfT- z(8!%9YB&t43ez@1YO0CUb}9kaC1`D&#WL}^+ z?WybXwj@VceF#g0`k)}?gb82_bYf*y9inW=~XPUz<=31&QUz&4^G5e7WmAUzK397J8K2@S)0ZJ3@1RJ)c>J(CK}6}2$hzZjS?AUOsn z`%;W5EK&PU>p}I^3}nMeV*0d|cRP4#m7Rg=H;8rF8MgTvE*9QIx4=zL^8Hn>Fn&1UgAi|ZFW$c zC}opm7Y_CH_qQ~+=sg{P%Gaj+;IU(*NYTSe4|1T*D-D!kIGZ|~U)uC)b9ZZFM-%qyoKTK8mkjId z1MjShPP`E{#l0sl=OJDY=D2g58&I65lVEWABqm!5RtqOt|v7x1O7?t!6E{7IlJ z1A_b97O!(;Vd^wbXhD2ZceLbw+8Jqy@kBlYFr=Q17MbD-J_R4Os09i;9SvMjx$SxR675rqMC+sdK?Yp-(+2JEUzgW;PhlPik^vDa3`{-BB`0T|e zUU0~&1C~`RfnH!`)$-%^I*M-H+O{1_z?@6_AaU-$Y@b6`9mvhPjgP&(hKlO=r0A?s znDv52L$6-6$dW4s` zZW7AQ_+E2m2BqH;Ba(i}fFe=|0WFNi3GM@lq~%*$NWWUc0HG8y%#Qd0yqg_Y4m z#wUZRrDdrJ35(wq5K|x$^B4-2Fk2)5;=osenUcc2UFW0 zA(G%iCV+?&ih?FVHS`wZW8KjSxZT`7|5DKxkstjfqQJC(ucv>2Ue>R1dvY2;r;kPB zViZv5gox$a?1JmT87){`VfeXe{nINN&_ZGkXoJ_W%|<0qOjqBNS5S1TPFj?}D2(^K z3=usp+J{kd<`ZE*1Ra+ z;&zdvfrS;tA}m<20CQGWdYUXlm^~OE6-0q%sMRcOzzcUM%K?i3Ts{JcgCG_jC^G%j z3{^RD&o+A}A0RIzCrQ5d+H8;)`^P5eF)`wCA+Svd&AJYpn`>V$h4`TK0!D@UQ+M<8 zXG4wnNon+w3?!FOJB_WdF0$Exu1g;ClI!`+y@Fx1cp_qW@q{Rjw1-bgrQ9#6G!aY4 z9kOYJ=s?&gA+_l0=>pO^I@=o>>iY-!f@xUk4WmBvP#oCBz;xPLin9g{^4c$4a^071dF;0I zaJm;KuKMuldCW_b{lvX6Q>A!b2NdV0*S(M=o}U!|Js0gd6?@|KTemhh*0nS=V3wzp z0$mWN;a2sh!RC)^1Z3?Gn(aaT1SDHcJtc^xkrAP)9>50V*rKi}e4=cRTUAG0BURIy z5CRAo%|^bQsII8QvSNCOa~U5z!!KulKtAL+*ucZ0r0t-eNJi9p+Kr;mq(j0*2-pY& z!NvaG{;r|n>WcEp#S4*`33?(6mQmAPu!FTy2(jjs7ZzRj=}&q)=cb2#H!?mlS6}|T zlANMne&UKRyzf)HFWeOXK=mimf)%6zl=ZKC;B(h~>Sz7K{qMr%AMfbz&KsCeZ*YE&FVT&qM2X7@4gAqoh9G7oE2-v^*D<>`fg9No2AI@?(1hCR5UIu zwa<(F3dB>|J;DeL1ps6lm|?8k;t>TL@+HZk*Ud>@k@Qex7sKl^Y8VX#czmkM*hd+9 z+z~sITP#u_ie;$;f};?SemMuIPvYulQSp97_UU%*%;?|A;MK(a9m79{1W>TsCMar) zes-N~#iKMCSJaV=yyPJTlBgiz^gKItpkx9@pGbSvl~?(h1l+Q*q9u3)ii(N>FsP+V z3-T5$Scn9`=+u+}^JcptO$vv&Mh**%n4t`a1tg_8QYshNkq~RCC`HF8<;0`u)JfCV zXa7-avswkD?q~RYSiBV{p@Pw>Ss)|Ibme|#+t5s??*`M1lu+O8qxMK_SH|&V7A^?k z_TnUnN<{m^vJP1KrF41<=&~y zHhITA3xv4;c;SI0Zndud?(~!l3H@6B_V)U%TWXu@>RXx`JK9=hv}cLShHv1XITx^( zC13DwF+V*6Oyxu<)#!~V7~3{)ZmMr=Zff9hNel67DzgEjsK`FoC-S!NT#+G(BN>vi zit3tDQ^K2zr(vcR$$^sf7$$u4+&XDsQ1qzSbaq~TinY9gf}voFVGs&1D5=ymBi~vs z25P~PFv&>KW<&&z@*0X$%oY3zMi;6W&xw#R#5=juw}u4-Gidriye^l%-~nRxz`$d_AKOc$at$K}*g(Ly_r$W`1kd{d_Ld357G zvL5iB*nrb{DzL5^2b_%Cp|3CkabCS>%79JG{+9dIlMKwRaI_dt_H2{0@$-^68qVn+*z#)xlfKw_*82pM#w#k zg@i@|Dx4hkF*7|?iETXI642;nnj{ag0_)g~4pLzr*IzVP=NE5J634>M+5m*aG?GDb zg#p>(9M~)~pWQkH z8^y28yEjRiF_pg|5!BuGWT@|o+PQra!QZFFZ$^3QUH~u;K34Z|S_+iLwhVj3Y8{KmnS1TwJqkAgr0z+;O=_Q56)0ymV6 znRUbu3PYiP-*sl8F-tX(@(kRaczijb^UYe)cu6q=`^JD@Z@2DC^ioX+y7lk4iThd6FsY3e#KYE@Od_~>3BI+w=z0id#l z$^s>Y1#D4K6KBvStWU_Q3I~Ih?iV*I?f|DiOB+^Y9hCr>0=HUu7ukIx3<#&DaA_4% zlw#*4)7>$bK_ZGc98fYOPXnLa=8O>MTsDq#&=p2vx<`5C*^($Q{rc)v#9Q@b%xdZh z4-bdRm_hk!j4m{^rK1bU4^aSbN+TO#_Zy#}WF(JMW@-vu&0`I&umgn(<%k&^Hv^%v zaw1gV>-4^Hm5>~LvM4N)s`$PgxBu(55+YJ@QSdNZ7r1D1%hX~0h*ux+63}+p%j~6iRc=qnuLSGq_fstXTc(4Sd zdRX_bKIa1!R>UmH&N_VgVy~?5_vi0R!jgey;`9SgiF#&F5MziL2_K5#T2H}|0WgD? z7T^tP#=(9I{{nLEh_;dxhb^q5wXLzPuDi2?_M3>X%up(dWH^)F7#l(&Fmk!ZOOgMWdY!wVf@E4coT2H8;bcz_X1k3&s_fl~q(#S1zb7C@dn}l0;U( zQS`rhM|DcAtHWg7*UW7B(MP1R@|8CWcvWmW8WC8AZY|Y9&Ti~>ZALmYPmUBV*0)bG z5#fE?-q3(F(B9R}{7EBGft=Ply_BwM zzz!h2uHwahCPXFob0C-m_BS;*VJjxXG@)fK{7v~tQcMXirE8?t>!NJMP!EWrGV+ul zNeBqlWxyAWK}wKeUsJP#4YunBF_^H9xdP4;SISl%3Qu7C+@XHDab6L8s?C@J5d&gH@1gV*YI>2cjVRwBtpS43N>K zKnqT80kBAawXWcH5iq2dlz>c(KG7Z&};03**L-({8&-8Zj5XIEDVZ%An|UJ1(xmM$ZZ zSEAvZG!__x>x+#96ye2SjzcFU;2Uc-@ka>vBZl$RhYJa72bAv&D1I7w|3=L zRutpr<;f?xv7$7joD=c_el-95!Y21}B5jP1j&0k#h4~!|?}Fva>$h#A9-A%8G@^=} zw48X@!m?7nj#|fcaYY4%Ljc463B%3=ApK<5J5^4diF$eBhw{^HWkv3W{QpG2NFK zptsg<|K?TKLZZCAp$WSPFu{vJsTcD)11o0UPLcgAXkK|K*>OikCWt`*HkfLO7D`G> zWn@L#6X7PaK?=Ot#usCtjo#+v61++wRM?QpVM=XKg?=qu(bU`J>GH8|rx(kdp#bga zwq9xP!5Mk(I6$cd4l|q&Rj1}xWD{B~s1R2XTbS}(Xr9uJ-6Ds&%<1CosVpl2|6KVX zZ{h%7m6o751(t%GEXuh8($Y1-d$0ssS!H<{?jVA7!TxZFV3`RK06@>koufV?-ROiW z2jayo-6rh;=7llBLir$Aaj5^E*!i`)q7KP^rkES|uG(u(SV6DT&`OFBmIKL!s_#5z{bVlL z&z^sbDM*Y)T*9&!%hiXe+Az$xd_vciN%-^Ce-?BT_es9)z9d)o<^I5{O{6*oBw4@I z=c3NQNg)y0H;Ll1Ew#0`skAOnuO0V9jVC^X9H0_20eKT+He69}KFK^>OWS$%P^2vI zJ12lZ*T@RI1t4fiZg#Y^3}Z5yH$5z~nXUn@DC-vuJu{rCz#`PcaAwxL_V$>S@8P${ zw@9v+9Nt4?W5i^jo^olMLgtT6azQGITso_(-Xn!aD{-?1{2SDV!?tqag1oHoNZe;~ zZjqmC?jP81YW4PZd;15wz(Fey`1=d@;M$)J08#>}*FAXi>iMfm^Gn?Oe$m1EXK^Uf`b?9ZAW^T)4~1(ZOLt;n1g$04z9iuK}^*noC4rxi-;_ zSd!C2X$@Pp5&{h{2Q5c38+kFXm!+oK;bS{-vYp-7v{BaW1djw6BdX4FC$S;!WI?v^ zh5SX|M6{`)k+E31YM1hwnwG{!I4&}Ca)1*K=M`hB%mAfAso2fhTU!guD{7W4AsUdh zR%Aia{8sF>@0wR%A{=AYuE<3dss8wBM;!WUX%Qxx=QnQZ_0Q`a7(@yb_Ae+a^XeEh zwQsm@4yaFO{`ma=rJ|2_;}!Qj*xlPTo|!u~GP-Jhxs^bjS3Z8s9*4iY`E{Z!ciz8Yud0PuQA z{8s#Rp%MZNcSpp;DIyYcE_V&_MMBy}Lb9mV*k7p6&67mOpuh!+^C@V{Xxj9LYZ#7di|l-A3O7q)A76L)o^qA)Piyu zFK&2sw)4<4A3ydyWjDCRsOr&)v51dYJPe6(=L7cx(W=gp9-|M^(EfcSeFf9g2+m@z z=QxCu4rT2u z7?hB6?u&LS&Mib`_w9U0 z0gyqi<`>WSw43=EP{tj9AxR1!+Go$I{9MsKCYuw?EIM}Cr!U^r*!-7AAFrhdr*VG= z;M79t2fSGE5c8T3(I~5o7M6gL62pYs*wonGHr8hsf}KGD0BEp(fKLz;X@KWMkV<=S zjs+%_Re+3;b0M#yeli(KHZC>lK-?)q<+=qW$e%0CNR74i9%0JqSE3*?grQ4;KVrn#rf&4 z>~M&OTj^mLsVPHa6OfJL%m%TTTTKW;(6597cSqnD=B()s5B3+8y-UKDUq30j&wXLq zRaPWbWx0^leGw={8Vyi_f#3Hnw;@Wqgf=D~L^FlEkil`ul2$2d6gATztf|mrOw579x7WF-k z!(^E#_6M6`3*o91i6I=Rt*w>xR(dyL5+WohC|GAWGB1zX`5eLqxLU~_Cz#o9pB2Jq zLYc(8%ylx<&~VRi^wf)EPB=ccEc~H!86{MG8wCfc6I!oNB!>czjX9<2nA-c3J79=nvN{K9Mgv(@+|0w{@&i&jT>p9(dTT1CE8=r!=2aG z-eD>>4irOgFflfP`Un_=^KwnLL^#CB*#qPJg5}E^YPS;6YU&`TrGp%l*g;-^V*{50 zZec|7NMQ-y?ZQk$Ms{oJXa;?uhk$g17mPY+Q4mzmd}mh$Ca{_>`;e#u#7R#Yy{OwYt~F^4&rhXhMl zYiE0IX11HYzJBs?1QSG)#taIB5+={3mE|8l?X>S*eHCTEjG=zq5Gq=eo3Za$iOpr( z7~IrPycEP?kf@xOn+K@bn1d*SIG%2%eSnGG1Ud-ugl>QWjBlzE$}D0kG)-oIXOI>^ z2%x2>X$JQC^@So{_*VoT8G6C#9P%n64mi!my6VjSasUgh<-()|s&DJu57Q5q?;HeV zf0~8XPZp!&Id_=Ev8X0=4FNuAOQ628%M78frFa{(W(k~Vgfh}=iu6|S7xrXMrM}Q~ zY-EvH?nQ*JelaIR%rZB9KKVx1z0A~L24)q7QwU*1fgtunH=GV*WNc@LS(I3j3~BDr79zv6g7Flr*T2)y9>)tLzO2wk6tq2V=|~@ zq;f1;qb-mKZLYE0DovkTcG8TC$hOjj3HYLG>xfM5>xFNh*u6kUCkNtRr7wGrW2apGd$9`trjq&);opy@-j=Xl%$12jA?&w&p6Y) z-yorjty@yL=;+-KyZ!0Ak~^3iI~)J}^qpTg?NbE*&xr1v@s>ybfcS($HscwJvI{E; zDi|!sTdJiv)&JSumSY`h8W{Y;x=q+ZMq{F4HCbMr&8?j+Ekq{(21o$7V}=F?7<8h+ zv&(WRng>D?yEry72o{jl4{t6AWN}8FWwBq8nQ_)5fz%)y2oFR8Lk@1OZ;aUFPUO7I zJnS(U911!T6JAtaQ5uaBGz%OdN5k(6?zOcvn=naJZqeV}-jO;lMvmI`pZWyyqfkG| z;=)aY`fec);vX;FKbL4bpYOE&PxL1JGU6@m&8pbMg-BB10V3XqOS@tp#RY|M`~3Nz ze^X`son6{`+x^q(oJ~i4iP_=IP-{m!1_r>ZZ>XO)0-PqG!OglAd0AgQ|NJjpb~(yE z)1hj%t5C#L)f)VY0>{P0B}|*}_se=`r1p@pbV2UROAWe-C0#N-4G?clnzaD2sDAx) zMa~PXYTJZeW|+)8huQbfgdPWc)6)5rxGz`zjIiwhOtse%e4ijFe8@y^i9CG9!=?Qw zjEkT!xhTB4xC?fZ4TMI}K?*8VXagvY#3bte=9X3_N49gHYP@)V2@R8k;R+umODc^S z8A?SA=KvK+QnM2BN|nBkApm$lhrdQ7YeEh60FsutX$8*$4G9Mdb5lTvdLW5J;@u!N zROx)INWGTvT;r%1c+Q$|B6g-X5WHw4NuoMXX&niXglwnxSX?bZY{jnTAvR3_40KH|)W(Kz!+V<=m&gfD)V^&s1 zTQx&QLU1fP6qzU}E-J68WG@DeRHVX^lFI4@eC1A&OK4|Czz-Wgj!#a7(k7m{$)fnm z*|SV2_VFWJd6(6z_uhSvRf`uNv-|1;Ybwv%b;bQZ_|_f&^SN)IdVFbaHp(c`Jn6<2 zl4hDg&QfoicbEo-2ETg7=g8fUB{k2I+V_ViZ{N_k$u~>nIZ*-+zy8E*sLzOW40PV` z&@G)9w29c@77{e#$V6F2+W+je`m_7(Q=O9)PBqV2ds9pO*3E>)DbN-D9!owwSyWM3 zvwTI>k|hPDWmxr1%1kIc7O}Ca2(?5P@=`Myi^52pKMb^$z{%W0B*0o(R8~>BU{U3w zh4>~_ca@DK-xpU_@fXU;4yOh4OUo$Al$sGD5x^EeCObcqiI_u3nq5*;^|N!&zUut5 zLH!x0L2ypOrS3Ngw*l#tbI9F4ZU2*Ki+AH|n>Ke34$%|fE}!71f$EO7fQLvCPNQ&I zXl|&l>(+NPCXYtQOb_>s^t0RfKfC0+fBey@Klt!5-+cf7-29#2KK7^9-ZpxJ#ev`A z`Bm_UQ#Klq<`*G=bQk`dA(WvlC@kbnC%v9zX5h`vpN2F6nNNOLUO?e2KM_qkZvFDg zgo+RoV1w-ixfK< zLj)=w&B-UCcpzV&7$+4J2KebG)dZ5{0U+vroWoe~BiccIHNZcI87K=GhhR>Lnh+5oN%&zD zSD}njo^>vs6qw`Q?UG#p_|n4sQCrs>7|YDcWR$B*i-#kz%927usXA(88p^@hdoea` z+GCelsg`|7)qO1rV05)`+>ts;VRtk}v#0aUh=5OqD71eUtl$ko1lq+ZNgoR1>2vM^ z+ZgA!vND~gmWcq~Kq>YZzO&A?y^6jdAG}rgh5gZ#7(qJ5>)e&rm6e@SSX?x(!)HwQ zHjLN0A!3v~2;-nhO_`V%*w)ZcR9sS6R7w;xwgobpIAs3fMW~nv3-gyOrjcAnOtjpu zKZsR&T-OruoY=T|X{jc@YJSayM;wOoV?y7h(rJlIfHS*PRo-y^Ic%51)gNS54UUfv zVTn#KW#wh%5*Gf0+kZw!af7qL3?^lC`o(37u>412iI%GM4I7ixlw;&EXkT^j4NtFq z;g_HIQAI%+z#h@KPkk z!-E5i87yq9V9si4tg`}KDxE|an>npWsQF*OIP&uf3%S9LmL^8OuC}(Qth9W=0&L?A zTeo4r@9O9ze6Oamv~zHjqC14^^NK}np&f%96C)GDLqta-)0O4toVw>8hp$*N|%Ft4lK*f-QSzqlI1JK{ss@=#4r!GCGfYw!ciji7gQYOL|!pM7C;B1Vsy2i0b6 zumUz1QNS~lm4y`p!-EtAngj6TNukX)DJD82<6-oNb z$qaGfzM)~Irv)_0r>58m-&%P?A-s5iLW<3$^4kC}&cM2XEd>iCx9z$~a`r`U8|Wjt z8Yai!-0~wG`KtpAN9Kc#E@T&)4z|q}Rjz<=$q<5npxv_8r?L*hDWOgbbW0b`M^P4D z3e<&~!T^aNQW=FqT3A~>!Dj9P z)K@;FO6u`r@@Ii_O5z!^3v(9hqGVw7>2wh&aq{VQehyS?iSefMISN&^u&9uY8UhYM zYjM(E)Gj!e7$XT=VtrsZm;^95&Bu2ozlD>~;6s{4X?nSYTZRPIQ~ z?I;xR#^L55)Paq9GM%)+C~$l%5_6~1i>+ioWkS-i^c(y0N&kQrbg(!U5yC|2g`)() zTDqBvh6;>yR*PIF`-JE+f3VD?53qw93Y^UR8C0L9l=lw}oOj%ZZ-4gg%`ID#3>&QP_q_DbN&6gk z+@42If0FKh<&lBmfy|__;)pU&zw_J?UqAV<)dwB5+hO}G-E&p-3Obx2Ca%KU@B@qU z4=y|O`e@|&E!&31QN=C42;7uqWf_?v4Dx&(vZY#y1sm+?CE$q2zR{t9ln@Gx;=he! zSaKc13Bv_O6pRGna2D};+cs|C8K~X3nF*t?w4}dpptq}w4sUO1?OV2tx3amuo{$S3 z3|=L43p$(p>FC%vtc5U2{o*5M#i!|V5GDX`7_`59d3t^uIrwUQ^ z)5+)kc2RJEO6j1>f=W+d4WKU!{%FvqDf=6o^uW zELtSHfD-}=tWtVHG@1&<;2l6AE-oklp}8rXTU>?huAgQUnj|z#65s^66te;pKyaRL zEyI^NSr`{LHn&L+az!E&kp_xvZDm;NZK%f}Z8n}AtKhPQdr_bJtWuJMHPKrLU-mBL zg3_h5Nk=KK6%!31S3J_3oc2ls);Sf>r_(zfL1I2I52CA(AdAF7PRKbZa*tX@N*=ey zXoiP}89EcZ?bj(1QJ+@n#3F<U`MTy#U%(xgYjivbxESL9i&Vsvt4UvQ*&?NaOkp zv1Mm6@&R%{tT{H4mv7PtZRl&=wp!*d*x%X)z?%jesyPAwE1FNtq(DV!Az_0>hEpqc z^+g}EkfUyWZx$a*)c3UyeC~o@eJ1AP!Jbv=52amn0~QV%@f#BEl@FuBvOs5t;d-5_xIJ*%okk}h#s^z zBWsGh6$~3r8IFVO2RS!4FIRQ?N23864+L4kFG*2)kN|a{lwUD3@D-RNfD~Fyx|f3D)D`FapsNBE zVQpg2!CdZ^c8V2;o}ZBhz%k@<@R)u60nTw-vd9UP8bst&tPvEdr&->JJ=Q(SzI6SR z37hLkOO)HGK?GtkhZs7btZbqsnH`P15{+Pk<)Z8$R~ta#PCeN`j4yj*oCP7`Bmz{m~VFw+#YPnLOW&>|vmBabeJ4ovRB<>M|0i&MWL>K+1 z6Mw$r*}KsG&pYzNdoJERJ0px0$0bn+|7&uyZoT+pxNe?lX@9x7rFVRyt)Z#4p`O%# zTdZB~e~-*zOfAmK1lPa>K8~8|N=BigFgJi9EgXvSNk&&VtEsjY^0>T`lE%92P)Ejn z<2)i0aU-IkE~>O_x*uRm|Hel?RF;#OVBc0@!1lh*KRkKI^$*^Rc>r|h9+58G4)Qxe znRoLezc0-#JpI7ahCM!!0Fi<=*=A<}7-5Ty3>$SD*Os+yUDV%<_733?k)^P}^02jT zCDS3|RnmHf`yx>d)=n=O>Bi5fp_gCdwT*B7^zT={Rl9~LMb0VIPd;^HTl(Wuf4%hN zPlW8w8mEH%f`+z^c~NhQ6BA36rMRRtGb43866@^fAOPuAngRK+He57z=W9003CS z*bOj1?bmRE`a7tXb2vzV0Kq413*&VgpHLJPUzx$dLfx!#1Y%Y{-of;JUs5~2oEk0` z!SU{?pIw$Cn{`wAjfH-|{zH?vYvmny&npd*gB+Wo_05|_8F7k*b{Ti>av+VXB%9oZ zp)`Hw2+9?L-{r+dc|v_>il)I#*&1A)X399=yij?WS--sCoY{@NhSM0n{oKr) zXV<)#9nL0#y1A>BpO#iEZ0Kx6vZ*Sp%*qarQ;gk&3(Ts%;D-3d2fz5t+7~0S3BlEj zgGE5VjSv3zh}DNsTGt7e=@KGNU8hc)~IKzR5hkf~+h||Ce8QerR4C zSFj%K;pK}ySJx0CxF>0jJ^-S+l+C~;Df!gp&=+g&d{udPIf?Zhq*|@1J+Jn>qJbuq!qjaC#1uL8u>FTedTH+^bGYP6z;er0guz~9{FuS_Xdp7cr<`!hFRJ zEv>CY@AE1F=W^OIrBs@_FhLfc7+{TRmPiB0_pr}#YS6Uu=4^70fsWGP9$Xvp*9(nSrbWLL93aYp&@sW{Sy9 zW_&eEeKZ=0k&91fAP32AABL=IQVABk(QiBT1W0Q{A_>EHJ!mKg5Hi42?7#9!=VWD( zjW%Rifw{rKp+Uxs9*9jYapw}=c@8N$MCk)M*c)c16@bLj6dEdZ7d^*{lGOPrVi$$` zy8{(iE&?1N){;q0(0KhM;urC|@#&3$klZFB*jYf|=W;CN03Npq<%7nWlf$nFv#6eQ ziuSSkcL-*Qtn^gu`J4?7xQw8GaBN;@dnaIDQCuXw2KT&SVX`&9xwv>JZENERLX%jV zFd&tel>rGGY8z0^0a_jmRbEc?4S2o?jFk_fo7Qy~eI)X64Dpi>TAc|dtV8QyDgrh1zS@6Gp*JACbK zE3bRx$)16}fsye^K^zZb%$t3I;~_6Q=Vu=}o%{{wJkaEgC-{bo&kqFCHgtA;b=~@m zlt3EVKc?WG9#*WD8Npnfnc~k#3;pUNAL2k7n$Z8S*S)#zouA)*?NjeOOK9GX5aGeE z_rivkpIi4*_2JdXgN{70sjDTh^BR9nIA?MBLhqKBx7A@eCK4ioY0yqhSd6e+>cg{r{{qBYH-(JH(+=3BY(K{u|Ib9gRI7#v9nc#2Zo1kd*b$sj{hjpf7*89 zK?nc%x?jVD$S_WfMwt4582A#1o1rvRXCD~SHyK)Mr{D1jGqsG3!hy-FjiQV54miUk zfE3$ja4kZI&|pWqE<~S>{c}+L6+};dL3?)(K$e)t&muKlCG6NJsvx=5!4i;C>Kz-W zU)hoQhyb4qtHOMv-bs%KCpZr)4%K8x5Qo3Y0P@xO6hIh+2EMXq|B&HE1)*sMCue^} zm?t;9%R8*BHVy$oDEQXU(uTfEOE|-b<(Uy(JhLndrcpj~bF#5^l7J3!C?wt(BrVsC zS}sPN*bavUxXP^{KX(BL=|F{EOKFBG2Wy1TNE$!Cy9CG?b#WOyVm3cenqt%v6bk0q z0f|99EY?_VoE2FDP~c`9L3z7rm+nsF@N~YUIxd8Gij+#TND3G64uDG1Dnvb02vG4J zE`*YZ-G<($0~tdW3Qi-wjm74n<09remkQ^f9%mpKg)^h;^YgZC+juO|)Rl!8v($bG z0g37{CA@1pZR2a)J^~0;^b}peM9HxRM|+Kxo}>v>UK?JTgPBUv3DlvnMW^vMzJ$8WKHG_LBqT_bz}k2WpUxP2Fx#{=HI{`_^rk z7I~BmFu=A z|MJF`x7zwTtb=)s?NGlFInO!UdpkI7I3qkTI>;2ybMmKu{_UaH9^ZArs#Eqm{sRY| z7D)9|8E85c4-p>!bH-=xd*$Kofo|HFL|wy9d(z&=?XzqTMSI=;%$?lNyI8C&o}RU} zZTrvuel>Z6%PW_>Z~v1|-uE~jq}X^2nmIQ?(|0S23a&ZlgXDex<%L(CT2D5?7>Z4N z68qBw{spDw-#`5%vSN}*9K;1I$dU;1^R7!d&712-~7j??f~yW{T-Kbc32S*0+F?qw~fcnAVQB)DIpLY_08<0Zy#+~2X*u>o-kQvM0=!7LS%dp(F!?;1w zk_|_ATZpP75$AA#NI?J1)oM@IS+M?iv(e1@!c>9CGppyg~t(0Z4-o zjzLe5%sNdm8go@8vlYgC$5Nuj4U;xXzo!?N#mb1R9vCDkT+Xe#^ZpJjog-~UZ>)*fW0o0`y^AiFG24QYCI~<;f8GTFP@q`mHZ?dzPScJ#IMONs7+3fschoIll#z;D+ zd$(@g<`b8&#{{B6FF1T?08pUPt_i2q7U#~#C<{xGVvJ^D7aBnVu~ah5}S34KOipikj4S_5rcbAO+F@ zL{3ibn02Xul$_SpP(ZMB;Oe~LIKW`LgvEMuT|L)AOa}9G`(E}vv}FI}c5sEBqyg5> zA&ZDPm4pM4=mDr&cRqE!b$}?(STU6yGs8WD!>~kfv-0}0c-v;^jKJ4|0vHL}x_cnS zv*`%|{VbAWh`PXjPR^b}=!Bv>pm$?EHjDv!7y(dE6m~K~=jc9e5fy=SL_&e+L+tPj zth@tq6FI72M-+sR0I3eo>hcvUsF1zAjr_7&o;ohY(36HI;WA*u@pj*9FU+6Ywr=4- z&Z%%fn#w*r3aslAj*7>#;`eg$kFC9_krhd*4mysl=$y0X2IE z`|khV9lI^qg?rSNeLjE0SY)RYq^k=nAN>B`yrDc-Kl8#SeB|E6=6E3lRAgp+<=CUZ zKWDKx>3`4K(y~=Uyt9iKcyKeln;{0j&pGVOADsIQWr2#a>Cg|IH85f#!%zSSC5Bf& z7t*sdoLM7VHf;ni{5Jd7#O+&pRZJSonpvaUnic3 z_4=MvYD<(;5jC)O=Mv)Z)>~`|y5AH+H_d9y}00ux^GL7y_asU?We;TYR!L| zVQ)NLc6-{U_Xle>5=q<&WVQwhHxkuwixyCR5LzKYM`n3;rb~IqqZO6Kx!JLj60XZ3 zywv#W1lVq(x5ke_0&{p`d0KcrQPBmA){_z=(gG0-=^k)WpuUHaSI8;yK?Fxue2V8F zK$6}->O%YH>I83tmvp;@=YW-#VlEZMLB1K~aT690#$l0>k;N^~^Qn3e=+0Y!^8&FO zv7oiJ4VXu-NDpQ3q|twR7i29MH!Rb&r)mxz>5b`uc=+67KJ@3O|Gu_veG(m% zVyut8`P9R2JaO87C${vo6SAI8y#0H(@QlMLgd^iu_g;V3i}&ukWUq@)ykOUbtB9iF zx$-_a%z8CB;j2G#=9wKoubF$bf2M}OzgsJWLZ9QZPO z*wh$jp^ci-GE=HDA|qo{+0?XIM#`OCWY~X~3uY=@gcv-$Ly3JZC6onT5lNGm8JaND zyI~-ph$XX^;C$4~=f-G{i4zT$M*NC(Po|#0OXEn~p z4y*o_sW(WSErPUx1IrK}(7bF`0Cl0hpjX7du40W!iHkaSN310RCwVb}QfxJVx;zc? z<%?uk#Qu2nxeB|{M9ke7KlKw$#9xqZk3|`xZGZ*%BSAy<=UGud6vjeOR%EpNx~68d z%;t7d=v4(lmfrEs@L# zBoK(cP!5;bJR*`9*jZ{HW5H?3;3smP75a@16Ca4TR`nE_?t$LBUbyelU;ocD@4Nt76G%u8s14p(d6&wvJr^wj^`|>W-rm0U#Z9mN z_>NzF=Z}~F{rP)e-SS5FKo8j*-u46yqwfTtED0`cZ2NC*U;Eh`zWVWBeY&~371Vz> zfX9>SQhkX1kiK|-)31EFUL^FCWJB#ORiaA<%Zrqm8lWySyALVo|= zi}#SOqGfAiV|HFaZhjs-4M1bu6eBRvd0T4hdb+z@wzgAEL3QP_5z*Yz+}hsL$INCx zVUidCMFOz^AV@O#?-X;N%kq^5%PIyx87BP-M-mS%Si&B{W663-$aY&?37^@nt*mr! zkprO)ll!1e>t}YBkip5ttE1}*s*x&CxmZaH`q{bLE|lZ}T+KY5Zt%XVZ-9NgX`%cgVgUmAuwHcuByU_%^@_KTXvGEbV{v9?ZT;Wax)A9A#d^|-Vkt5-7?#-%22^>m`}h= z$xmX@VWhZa&ddt8FC1b4uxU2%$%?vbx}9G{hqzs8YHG4=I==NsY{i@a_{ljW&Ry`F zLE-A0Qz`xuU^s&UK>#hS$S4B3u&^$2CrOQbvYp*TM(w>%txFh%f_KQW4glWXpnAO< z*wzq|un8d_FsAahh!Q|R%dZ%dI7zYf+$;7?8F$DBJlzV|)N974+D70MjmO8-IWSn7 zm&cxFP-1paJe0cJ3$5abr601>Q(^IBLIhJ~mJzKUYk)T|8zal30%%*w)er81ouD#= zl;{c)L}&-W;UwH6axqxA0BrG(fXoAC(QM%NX^VhK(WV$Pv$#`SR4GA}h}PB?hCDZv zLGV|Q$<$_LKn{YZl-)4Bm}`+qXftS|*2lp>BOJ^G`F@{PXbIo=DQGxl@p0U6(fMph zh@yYwjVC{U)7O9f;LY5NxKQ5x!d)UyFvM5gb3HV=ct#!C$?JUJ>V4mLz)5lG*0ZLQ zrL3u6|JUd4zWasyh%J~c3*Z}Pe({U%yYztN`_QFG37XAzd{G1F_bn~k&b{)YGcG^x z2e<$9mCdiyeFQN~i;0UT03mcSSKf8)7jF9cX+QYzHTU26r>Fkg50Z&Tm-BgxFJCw-qJBh*6MMJfIuVG!PKI%U5ThS0YEdkaL6JQd#O;qGT& zfcz4FUNmZh6)bRcw6#MS0$l3Vn3&1|4~(!6vObpX_SUxHp%E8AtvoVNX$NTK5aLy<1EgkEG717$zPE{kMg#bU|3O!at zGMkMzbhHQRErF{#Nq9_mWM`S;H#`TrqFUs-2o-gDFthqwvJNN$94f;?m2$EzgfO)$ zh993Uwr;@^5KcQIwo-lq@H>7t%)gw(NLQ)B;jsw?aw_DI;C$LF$2n+?ZJXwSWvr_o zY$Mro%n3J+kWuve;w3~lkr_$Kdc+C=Q)&M_z@K6Y*Ouhv5#m8r7y-W`&lJy(I8s<> z_yE*zvfI1B6v^5Onq!?V#SFkcSlj3{und6!QGk1ty+QJs3mXsyFutMe96ToS=}0)B zmD+<JrxUZM{h5)53gBfUT%6Q3{ecT_Q2rK zqGe0NDS;TBV&8mvYJNp2QAxxQAgA)iDTBx-$oC2I9p8S?qJDs{Y|hQf`qf9zN}C#t zMp*kb_xGyo*!d(Go_W(nNxaZ*lg74I#KsGYw-`x7nL$5!+v1xO5 zM)u;e`Sj{+mI+J||8whikxNM3z&@ckR;&e_ijo1(t$&d%E2@^JBe2Hf2|dF;r0U)A z>^~41UflR9W&;7wyI)A?Cm}-fhCGH3yz;2B`*v#KxhXFw-EZmM&S$ZzqVl<|TSjC4 z?Hf1OZQMw)yTZ~kgM2aYa;!MNpgb$=bws|h`Hh~z9<}5@ynqDwz@hdK$$;H^p-;TKvO<7rJ^CRD>EbA&0%<-XMg&Af=?G7sFH4)_XV^ZuGl&m z&-oRRLRGyTxPtnwd_GN5l^ypL{j#p91$|vb**VrzeJ61dLeqX^Mo?cOh^MNGS){*m zxNt%#@<0Mx(7n`hcVB`rmx85Uk}*Js(89X9`o^~QtZ=xhs!B-;{6sSnSc(PbvT(pA zE8W-GQFs)9b8gdiMGA}dPZ&s*aTHMLtNbJMvs$hm1DjFth1u+oGA(YywF)fGvP;lD zX40Oyy5(ISmQRRJZ!INHv3#Ed0=3hjxLc=54%F2=5&JmQpN$imcuzhNT~O?B3-L@6ZoJ|`y_H_3k z|M~4iAd!jIGWY@G4RN!#s|4crLOy@Qb#qX8MJ45J*wh7WQAa0-Baim>^=D>bj6_|F z&<5hjdPc`_0xem&V%h3lh*BfDuqWIA(AP?Vn~S$jL8AR+>JxVrlu@fFM>GL`g(xskZDRK;jyB zSQVqku}na01O?HtII}@zpP6~V4H_g`W0z$p@RJXoRiO)uT;Njl!El*IN9;1aJ=_TG z&kCgjegsxbj|1RrI8@k3Gq~jnmhy5;+%#LT4bVHj9R~?sMVV?_4|hLwguvo#PB9q238 zX@=|D1Ub+vM$imKhoR@}K$b4bC-wtfQOYs91EQozxXJ?ROxbC6L}yE~?iCg^^b8_2 z*XYU;5PdfIU*&nYUp*2UquIEAozx@)j2)3;txKll@p5viY!w`-5m)aac0gCa16NR3 zM4R-8y7MbbMXXAs%kwLx?n$Ks;58QPu4Zs0z}RnvOKAg2lMz!dCzW8yeOvB4FxUh6 zc8yOh&b2R22;y)sZV^iiJU4dtw70d>Q|aLh#u2d(_|Hl)Q9K|!>O7W!^;@^V^iIPn z%FE(GKVBfqp=Vz#`sP`S`kzO`+(47!l^z-#-55@%-wds^nsaiX6^@Orr;`*q^%ZY8496!m|0l z`otACfA$)33YanaMg}AS%t6^Dyb+3m4UL=OjJx{28zYXp(-RwU=E3iSEeC*~t<$iP z-t^G#esbqksR3iY1>iAVtZ&@>m0Q1i?$184y{(=A!}k{OGSkAJKkZXaM+Yp3wVVTO zpRzniyrc+_cPN*YmgWZI<@4t++jEck%a*x--?#`>V^MFU=V7}X$Qb=sfIplTK6;NM zyiuiue-rTAjMKNFj?6uXQagJ4u(I;*p42wqB;1)l^$VpB&QpXD7kADkMsiSuwLz!=&L zD8dXYd4h$Fz!JgD_!u}XQSm|!)@A2cqM)=uar8Q6SGda-2`|#L*k4-X^d<>22>4%cjcL;<1qJv7ly%tb%!k-z5SdVaFWLXEYiv83T7I#e>RecKUv8w zs?ZhVnwgB}CQu(N;}zQNAmSi-(|0f!{Z7vJl;rjTs-Lu`YuVMjTPEsvv9ALU&*EjvGJ}EMv2mC{qVu98 zUU0*V8HxXx69`fWXJsP@VnoQu%Is@ysok~>$0RB~9b%FZIFC)OG<0&bO%4SSkV@2G z#jYWiQ1j)cslfJzjkJ*gI=67Wg}W|Np#^9}CUzzj%GZ{eJ7} z>zdm-nA-`{q5eWk(~wdBMuyGA3(6Rh;8+5Qj=s3g;Eq^W^&ogGz5_}5GZ){RX-~Zc zX2P^@x+_;J{W-wIrz~xu4pX_XNBGL8*j}ek=mKU@thi#h%ClE#796XbO_qGn1(?Cq z321?KK&dD}H4DpIOkc1?{sm#G?Eex4xDdO6YL0t(`l7oaAOPYdS`xD7@z}H@oH-{K z|8BM>Wf9{zJx{c$SSDPRIS~Q;-jEtJl{z&>@`4%?@A*r=rss1<=UKWSO8o>yjIgw7BL(tFabH z%jYX@WJ1GeD*BxegrAZSIO|ySMWO!iL=;m2LR)2tF@V#Jh-?b=hwq8)1J++fv>n4b zY-=ZSYqV+#Tk#IAdmnc-lIH0*y8ys+ha-q|@p?4O5$Pv4i}@16PR$oZDv@R}fsaU9T3W1Qs|m`}BqdHRRZhQy;L85i`xP zF(Y9R!GOa8%HGb-_Q9wRZJlsGPHIYD+E*2h3nN$g;^-*Gk?)KO4)R6oV#$%+5&pMLb%8&CdA)F)7GMb)wcm+yP}fu~UKgf{|d7c(^#;ySuJy9RnNAV0hI z#d}|VXiM|fP*Q&Z=RvidPSj2GEV@P{Y=`r4K^=0LAGI672ORFQaEJ3;$nzWtW% zv+uIKART&o%?md^bPJTdm_g`G`ekRu3pj@V_|Lz>C-{pCFQ?MH9s`Z_iTfP;m#6P+ zmpx+^<1S_u2>3|NXI7*%ewY#eH!OoALnrNX?8*Ba@9hv;MftviSL}E1D-S8saHket zlUKI9PND(TdNd{SP?>boSoc6YK-RE*&|{!jaYicWAy9PvM!clZ_dmHX#J|4e=X);N z&D#%udFW9l@VLFBn9{-nCVq%~Ct(5N_!Ly0j{P$T1GDRA$*K5ft>R}iRmHg@aLexQ zG^ilHVNishg|a{h6Q97Ioum>;!JSS|kAqcC0d}AUwRV%K0Q}=Ju0XzO?1CT)7gwox z7YoLUE0(I3vA@d;kTAjFOkvW_XM3x4bug0ipzf>94mLyuXkygEVcGD#{tI1BoH=-S zWjW_4`iIU@DS9PBu!Uc_K|050PB5hw06>V`1C~HGz@8Y2ZNHD%Gpo}g%DYoZ+;WHk zii)@ppu(OmTaRw%-Jl=1eFlXN&ddr6hUMp`aV9R^7;GRwL}6`r`3Om(F{H`4;m0mr zUQxj>)EOmz%oy$I=SU2%hq-!JcLridMmo4dV@uMP!r_tLX=VY5JrbgdaebEvu+6g=b6M# z9w(eZhy}gTKAsZ(lu56E9T1mtZHo7#TPn)R=GV;UccoEq5*6t4PmjqF>c>onsQLgH z?8+~wpHT9kt!I8@s#N7#9v=KeIXQV?_xweRa>C(0n@2(LuDwSecu%V`g20j=^J7+C zZq35QY{|~c?clwz0zY?5BS1qpStXhE2)`F0vpYo zF5k01Ugue_H9Gpu4}B4uHsES!{lU9buUJrAJzbvA5aUOu53tyuanLD8?{>)DFFkng z%MZS>^=-OjZWU`@-0;emZvN&UzIr1;xUO>ilFEf>^Y9yTtt46LbPGoBKs4}gLVX7R zBS)SESxrK3aNV5DTxt_P_QpSXEa!0Ax3{k&2od0SC;aqbhg^Q&y#vD&@}P&}QR=kr zw|MD6^DDi_QXpV${RY9%e`ev{c|LEr^p}V4da#$U4>WrI&9|F6x}qd7!@&qd5~N_3 zfHC9Ssw+U27*N?VyWa1z@@G)i=YajwkG84$Mq!rY*b8=sFh>qf00uBa=To}2&LRi- zjNQ%tV&CHopuX&=pqerO6(uKzdAaK4Ta~5SF{#l@RczNbVja3hi=;9!w8SgrwfaPbQ4DP+>3{b?uu4rZ?8&$!c=benL2g#(8)(d_KOX}Nr}$yWE#2?zunLig$< zEFP|>6WCWW-r~{pgT@E!J_;R(Qe!M;bbVt&v-P^=%lFGv&TaB%!~OV#VD6faoH;c} zJ_GM^a?}So4q17?RiC`#0|%YDdj3jmyxzbx)}8SQfxx&$qmj>^dhul+`4%Q0w(wOu zyR#ML6hY%NBRp$T-fhV)A3W$(<+knAEKhZSB#Fu{l@tu1p6`Xne&ohWe@W3l_=f5H zIS9TikG=WNcebwgUKFDpb^qWQ{FjIS`@-C~qfZ?B(aX;J){J42-2Mj+KDB4KcW$u` z&0Q_GKKe&UPdqd@6J-U(6-cS`CMv_JODpDo@#v#K{e=7d!JmIZROWv&d2eOa@+W?D z-$5()6Y9I=lFP1mW8Iq3;gSBn-hsY;R$#Q_4__h0z`&ic(Gka!>)iW(Th$PBu%W($ zg&9O}{>16@tTUzXCHt;T(|_drT*)PVdrQRz<@v_2jC)vtW0RF$XJw&RE)#GCuz_kK z-4nN(W=~fDp7Vo_?8bcAYlH9=9Y^edO<@?{@t4K@mxQWMNdyC?d|4F0bwCc@OLsSO z+|;6TseNs%a(i9tUK&Pyg(kL$C&XIf++lu!~jkZOhKI@BGH;#nkBXH>1G)u zo=j^jL6yWnR9aj>cQ;vn=$a_!S-OB>J*@QV^>cp}o%+v})#SrW!4xt%|`lV2X+ zaC$mvZ89b)rGmCdvec95ZfCX=CO0;q^5Qd+5)L*~1xunakf$sU6zZ|g4&~;tF!UXr zrqmFLb1GE91MIn`II71v1!ra+0C>uZiz=(D2>tErA8efmHy^P)S`4 z85i$~dmnr2=dWeFl7KpqC|@}J5-QF24-f3Pf{4?dqOsoCy^euF{G35kkuM)~^2(-& zBNHQo+|&=w|K@_S`A@#}^qTq&)UreJ+9^CnUk3;mmo1oD?Y^uaD<8v#8vmbM5X+X9 zFZ$;d_g58Gus-8Hs^NR!^8MbdeTPW)IV1=E?b*A3aPHToIp~BR-G3j5sUqXULBcy? z5w;}|IFicvx99JjLuH`3MK&-ldoJ4bhadU&{Nk#KsSoX+?tiGhzK-bqh|Ob?366Ja z+(tNSLh^X(WwbL@@Wnb$)&kanQJXAnlY~b>V`<$832`98m1fmPQnP>Z?|_1HAB%U~ zfjL(Xsvs-?23GN1azIiIO**S7PhzUG2h3*55@VYc_a}F#N~{VK<8Cn_@RKetg_u(? zVI`dXT`%GZhUvrK*4rxq$KkhA(07uLOJYhqV(CQ&okCK=&%|i^bVXKvM|t03C3btM;c-1qhF)xIki!>!G8Sx#y4adUtL;Ek{?!hn^R!AOO2D=3)upFeK;I~ z83K8Z&=Z&)Fz5J;giiP8+f>`3MN609fPsY zZvE>scPBx8mam-txvzfcbMSM4`ZK+)LBC-p9@BVvi&diX68-m!PyDE(w{t_&mX|lZ ziuQl*ksrdfKOOahX`zXc0hjv4pp@p8eCouH|M+jeWal093a?(UibOuIj(g*?FTPV> zhudsnWfh?e-#GCE|HKqU+{ERL`95&aX~g_*ZrXOwOAiod#|%JCpdEz&-XY3tOeu2; zz3~An_9aGV95Vd>_;SgKAHU?J3kkmm^^@TPNX%&r&-ctrWXOnu1WF3H@3<2w=Y z=Z=wRWjRv4iCvSa;|&cBia(Eg!i$oJ#xS{v69CvixasL11lRyAbb4$6()htY6Oo=0 zl$yw05z?0u&*S6DeU}bPPj!Sy_49<|QlCV>&V7l+R=e zzANnLa~^&16v>obURuhQ{*kecj&>VN2h_s%jvgo>G-9hr<t-WV=uf|)B1lnSm4SR^%vzH^e{A7&{P|PF+hZelf&q3&DA-Eyd~%B1qMX8u zPBAF{6x^;6cb)(!yY{DNs_AFxNcQEswH}-2E{6fOMja@zC@xXA* zzp<@zb4$zBZ@l%}`quXT0oMQ*ftiz$b?7b!{`}(0UjNn8Uq1aa6#mDB&u%-S@n@%p z6WkW-8a8zFb^M1RA5>UaI-gFMv0QH;CEc4rgW5`XrVQY7Sa9&){K#$VYB&DN9-`a` zg^y4B;fJxu{9A8deBOwa=N^9Mec!zu5tB&Igb}>su_uw{*KFEifZf?Rb@)tV`T`5| z;mWG&lKg_o?)LAy-;zjl3)i?4~$dUAv!k&=SEm@iO}on2a9N$DL5^=xlzgHaI@{;t7cB#GP* zFOwnN1FgmXAGh~KCZYjv?n1C_Es6}1HL*KtoAZ)j2@s;`oLo_%49uboGuIL;kvf-d!Ke=JtLXe# z5>yS4-!UN3nIy}BwZw1f{L=DDFLOFZ9EYG^)OZP%;m=U1kCwUeP{rlPQVp` z`i^gguld=TrG@#x8s;g$RX$^o8Yx7Vuv7;@G=7mMGMuh_0M`ZAunOSN;**aZ(DQe~ z3?TkQqzn@397m9>US4S|dHO#8W()Ci^(r83;!`h%e$y~}ITpo{z#ys(7)2!YRSQ;i2xXUcv?1T3WYm*-V&cKVcSQk|RlvzXIO4)0rc{q3+0~yv zZlnB0M#quq%#%h^D5m>RMj?3tOf6KYBXc2uiXW6HKnIDij}=ZO4*3N7yf!~h-iF@Z-)(CccT;MT#UHqFOI>$g zC&ew8bbH9W7%`bI`cbmo(fb?@%_^P#FSWg;WsBm|W;^jLX^O{QLQi5%tn2FEHavV= zQ`<{T9sX$^ZY;ytMi!J*pL6sFe|EtS(4i3s(2QpUTEOPIOMad}9*hJ{I-iuY|K!5s zy5G{h5(*RCy{-O*^=tn4)N_w-X!y$S|KzQ5d&ug8x(9pb9EAX*Gh9Yr|Lyl)-S}pT z4UF(jaw>C9VkbX${nu7qvOoEIu=V{L?>dUrJ!M7ZQU>eRFI`hpT!nl&&Hf*|{^7^_ zh6mfax`ANS0j11OH$scAgLxJIHasy!ETzTh^dw0&H#J)Bb5kzFMkq%KL?amr8vt20 zYuB!=t=+!0u8!Dkl?7ige?fJ16%$ltMFkE)(s8j_hwLKGd&OhT4F7KNM8qq?K!Bn{ z91bN@E}g?blw`}7FQo3wRCixGpoC3E310j`HgUe4Snp{Ee1F2);4`zqV ztSnX#OBE^tgCct-X!$brOU|5?XM%lnfkd44yLI}wsIYJ>KF`V=DSA#ASXNwgq;IZa zea@z55*9LI%F%b)8}R8ZpbTc}5t5BT?FWW=$jb_gm;$0hQC@O-&EqQayBUC^(4faz z>|-FJJ;Vjo;lS{33NTvoKFWDPtV^^91VCXMM*=G?B4E@mTn<`3s`7I!rNZ*w8^_Sl zFbq8WN=s;%>VAs&Pmij(9Wnm$y4i~|X%S;|<+*1;>CX;wYnXZf!PK|v>woq5lcN(6 zvH+(ufqnb9BN8ZdV6#b5Ssx?+$B#XS&_TClaBTGEwHtgnx#6-hIzjdz=b!^t`?|Ve zG#-NjB|G%%P1|4vIDgrq45NQecl!E&yR9)69UJNE?DeGuBa}_$*l=PeoyN0hjyA8K3*+ zhrcvvDBGswv%IkB)vc|y^zDDx&VR(}gDVQl#ymszk2l_Kn-^;t8Z#4ARQy-w+0YH< zX62l5;HiIm?jLi`CnOnUP2KuWT=Q9C=uX=In6924r0A@QGP57djV5kX<-2rY1B^} zFz^~x@iWI;s!#B1Mz6mR5M>*U6j1h3od$O#>?&^cOHA1aGJw5_L5R%*(H(8R=|}TGHeh4B)=$~&V6OF zWMwj?Yokl#6F6b~7iFQeQ{@FvdBr3>rW&LPT3}8ngpazWTcC@eWLZ#EQB+*awKyRL zBap<|B-tm|5-uSLrkYy|6y_1~osa8?25=sX`6fZbGA3~x8XzJhEO-P}qfi>`w>j|W zmPnnF+xR|pI1C^mUGf|gYXS(VBog3($5_0!ngx7G;`Ut-yBhEJ?xWul6ZvQfBbXZw zHFtE<)kI8+6xlvG;|}cSk_9rA7X$fKRg5|L%)FPL0t&3?Ue*65Up^8+khL5G0Z!%u zM4Y+7j%i#Qkh*x~5F^-v_gs@FJURd;DL_079UYy8#ifiUMTZ!1LyhQH9x1y7nQN%I zzzXUnrvu;wmu$!PZwNyGdmmRBLjhH&ftPWQPkIoYJ~NbY?fGY8m~zU1OQzy)Wl6ye zXMf=HcRkQeGLnZqOyia_)gIf}+491Mmr+<}n^He>$|prh>z1$l{lT=7qOy|mocscA z3xgDml&^~DgRb_r+O_Lh&&bRyUobzfuz)%4nm6AGLZz3Vdq{a1_6xwKdwA%r!O?A< z9h9+e8;@bcD@I_-$X}M5cMzqwBcsy|_^TEzhhqIt|NNVT{@Gx!sjG#3zWBaNU=(m# z@8zc*|381br=hpshG?Z>;wmi2qwz$+7;{K={^oU?dS7{Yyr}5l{G9ojA^OyNX(X|l zlIpL0=<`GyJoNJ8uWx-TJ0q(&w}>%0?}!g$>zM-P=vbePm+P5mrLU@aUUQOo+8}PIEYVKP*Ncx$+ac&EI8V*}@mr zzZgX`9PE9U#KS_tBn;44EONuSC+>C3=im3KlH8&hlP4c|{^fg~c^W=A-lcHRP;qcR z>=MY?Lw_Unh!Z469{Gl;V(IJsQygsV4Uim>Wl!>j6r|K7;p5+p@Q5Tuz%3=$oZ!` z+QrnX6{l&@6eeN-02?X5h6$z}?75KI z0s|+ZZPVMKa=luI$%mqX_;H!m?b8tVYSoAiB$H&p+E!FZm_=T0cEoxX3i9)c3c!xS z?DRA~sTN~c|NOq8@d;3$!?B+;D1Z=W!Ah@+__Ef3=6Z%a?O}_k4$SSSih|hk72}|L zPHx0k?9@a^k{`cEMZshY1$wrnB8_Xqc2JA3ASnnNKOl+w=(nmbZJ4^ke4 z8`x%OHRjiFc6R5$NNrDVbZig|m@(y@0ME>n%#R**_SKjEopRD_Tj-sDJ}$#0O)$TF z*oqyn3s8r4s4Q@lBBT;{UcEJDq$P^Cj;Bg?{`YDDoD2hhX1I57$W_-Buxb5Y;el^Q z?EJ3gUd${O0jC9oV{8Xgr6TJ(L7(B#5^RyDN_4RpqVq&VZIh%=7^&W~4`VCe4d!ktu1)mXd`?AVBTAL$sG8YPkwQZ+dv9LCX(tiVR1CkQ{}sHja} z6ZZn&vFL~Z1F&Zkvm0||RDh~Kh3Q$yC-ownk$&XrRX2V7+!<|VED2dsAKq*CoKVYqyf(=uk_K$I`)vk9 zOut9`sbjv>{@6Ui0Q+OUfs8`v6-kgy59fWPrmP?k|CbV8URExteM0UeQT=0)@!vdp z8{v3f8on#ucU%!k{FZ&Czo$0>P+?}Xe#~$tz6GO)6{ZH$!a2!plM4NVYma8k81YAc zKE3w&JDceBS!zR{bhfVM*1ZeU|JYJHfkz zYDG1^CzM18yubPE)xZ71uTS3RSmZWj8fMhazD`m?@Ev^X%r9Sl-gj>Q+AT{f7AII- zgyLVk`uZ>Y;#ZG7@nmODKVV0Wd)>Az?aj^I9UU_3li1Cmt3Dzd+&zE`$nl^ag?C_A zLrRc4UvwRsb^M-6ZxcqXipuuRVsO}FIR^g4f}?aW%hnpf*Z?jdPf!?W-MaOC{r!2_ z*#v}XALdDoln4GrOB!IVAYmKV1A>BsUB8(5nT&+=3P;B-4ZDj<>ap0`{CVW&g{^UT zVAzxqbO~KfRn>eAHeej)6LCvff^Ih%DA>q_-a~a?p@OuN`$j4EhJfjX7i_7Ypk1=u=FHb+2m0 zpv#gZ@s1w)msjyhQO-N(N+bF_L#a_vFKN4u;GOL1?nVJ(bh2!bK(Zc?THJxoh+&W{ zVDeVg9-?)50J3tjRnG}G4XJv_0cJN73e%bwPS49P;8b$xfaqX6doq%&^Fmo>o`A%F zakd~FAOLW@>Gdh0_?RZK{O9NA!L4!r!TTk20!j~^+tS@e(RavLOdVKHJkZr=oLrC{ zc5xReQxo|*`#ayLeLKk{PDFI?V83_c4Y_3N-926CK5icZ6u$KSPpg*T|DA>Ey%hzeyD!}3`p^F2 zsUJP?vkQKB^JlMGfBnl>ee%aI{Nj;|jz9l|y^c}@Ut%E3Ew_E*il45p-P+MdDD6=F zmMvS>t#8`CeHedhJc5bKgv}b|XT(+C5r23E-c&1EF>SRxT|V_q_Nzd0(T84my@9&lS-J&;cTAf87jD0ofy%p@wO zZsg8L4CG=5Ngj5#O-rQ(0H@Shatb*`UQRYRM`{^Ai7lTK5mE%qfFI)07ZHt%(G$F> znmZ=(#-^sOt}f>YR}DHc#phrhN-iWY7xRz1BIBHxHEHB5GDs-#EXjEt9wb?$eJVXc zU%kHy?3@UqlF^U=FrI)qQgii_3^ZI?y8+|~2MCp% zT%3u_`A7imZEXx!YinCma})j-8y;xpO+-?*x3_nITddgmSE8QJ`{x$5P3pcCL}E^> z*UHQp`CdzaH@iRSAZnyAEMZ}w%?j&dQHnX8h8bKa>kd)RfS1I@u*k`h{IPKx%$eye zdd9vjY{T3jFAUqIyaTj6^jzK@2c}8@1BQvN$Kq37QI41|X+UxQ`~y?Pf#b;k!4iw^ z^Fr2cFViuWf}Fg3wETJYgjDqD8;jIbR+Lv(aU>!FIh5uMQn2jtxR#Znr;_<`OA}8E zrReL^P)B8iiYqHt@3;S=6dHc;Q?v>%*(&XpIIpSSGLuboI~oaoey z{I4H-B#aHh+mluO?z@39Bf1QY?_5MO_?7Zzot@0pjqPhM6+up#Hx)MLfbPzYaAr19TEin_-93GaYs$|#^q@nE@)C4+ z7zk{2N7FE!`Cn=jxc`axQ?vi`8T^N=I;r*U^XXa&UGi8_ACu*i2>93M;?7aq}0i zz3J`En;JWNVm2UFp}odJJ}_j<$^;CEMj~X-qP7w>BNM+<2$;`#VRN#w+uGX*+`%h8 z6+BGrEe=AS)9hTs^0WlCM6waj*>SAuU_g39kWz~#e0Et9bG=pImY5er~PO}2}X86h7 zNP@oW-GN2JlTacE_Xqh@*iNi+nF2UWg?yh2^b^w4aNq3C zmH>6)!mL;qKy9L@fFd!jFj89Km9aDu)nrzFw_RGTF+-G1uFq#9 z40dvu65oyKwcjkrsYI~Y)Ga{xrZQK>DLw2 zs|umWX4o=lJgxR)B><$j5hA6jluyQl3TdR{2C|Mi><5H%5*$a5nDLP1!)I;ya^&j| zyyq?i`Eu=Z`Jf@otXZ~n*Oe>NvqC2tJm7kL!w<8rj{?sjqX{9Y5dii${I=mT&*#MS>-JY{B!)^pte%fcts6G=SZOTrxJk zS6OO1W#`{(@$TN30|2e7vxBap#sdly<6_<0v7u<}zL#I(>2+hxWAcgP&kv=A)$;%P zvZQ?BK1=s-W8r9^G}ldUB7V}(Uwgx4zq#ej4eQBu75grA>?WvzVu6-<64W=b^ut3S zI`QuidR<-Da z2@LLLGPioT3dy=EJHiwexf>Mntc*UUEHrT@BCsFGw^~y$AzBL$Ef+JjUWZ3Y2?Z-E zHo6MPjqh1?;eb!6O=Hn`zs)IRg-ZcfXsgP?=e!Q}RmV?w;4Z^P=bUhI3bD}tuE-Q? zB&6jenb8Y$hYTi2K=P(1QTN}i*&z||grUX?G8F+8mu|A&3C1UCufMM!hYjN~o4quu zpgx}&Z^&{fLf_QXNOzKzS6EayY$Q(;z)1Xm0jhA83D?9K4+?N;P==`x81ma86T^?? zk(O;d1&F1U#_?l|%nFhdQ$ePpIe??BZiDBW!$m&)Q^HCoZDMX8txJ&6Rxg^u_|!2x zqRNfjzI^IDpY(zfBekdV%VKNTOJGx|O?)E~8yK3oU*hVcQi2@t?- zL2IpJJ_Tk41P(h%_^}qk6Un2fn!HY7ofFd9)@{^yxB&jSE_olRqI4h5J_5tXy2a z5X5!Y#S#NK9SwW;@%dR9Va9Pw^R^wz4p3!;J&yDu_vdfDZGc%lH8e6biX*(JygVy6 z2Zf zHpV>Su5wYKv$C0c*{rFU1xp~UW%l7Lvela>A;3Z^#Bt*1E-b1cB$U@#-I0O{oabePCfEZ?(3c!9LBoc?_JKMGt zupiX7riI899b5=+7t>}}+t3tno4|?15!z?E5TNaepYeo!68sxpp}<0yQO-uZ*i9qH zZQQ6q3M>JW4hVKuXc&j-ndB`sxStTU$GJQ*2jA!ufjaTtI*^;9yL8J~2#1Gws`Er= ziTJ8xy^R-z1G+Nj>FVkPnGL;eaZyW35I2h7>g8;VTMZ+{R>bG*IPa~W&(AE8gOJ+N zB2x<0ck(Ru^N!SQtL@Fp#{gJZS_(4{2l8B#wJUXB(RMy-brh4XOW313Fc|oPCI+&o zvT87xvSt1HlvtDr$s6?ay+8g4~_c^w}i^2@u;@g{-p9nCF$U0u~nmuBYVU|5LC$K*S+Y)cybmORn9;E=(BHl z=vFveW`kIIlUh5!dH6Pp2m{7WXZYXa4*%arpRPk3>*xRiOViW7cg&#)H-7ztxBSno z-zmy2bgAvkgUwy7jh)Tw>Nh_6=9Az>Yi}EJz`-l_|H;SxH!GCs4mTQGUTM$JrnwQ| zYcj#aecq905y^Pr(N=y$&da&2#F z#+Mh9x)6<%sLddP{g!59f|rbdR6aH7@!_OcfxlK*1Dn&p_JFUUwMEHEQHv~`g}uR3 zm2p=H9lR8d35{KKaXx?{K#WjbIv;%-I6<#qas$Qqosc_lqrJTiL>73(T(WvfkWU`W z)=&rn0G#tJEzMHn9rg=?(S-Sg7!A7vbh<&#qG&s1@gaI32XG?U?I#Shn|P}M+jKxh zmV_jQ^<;}+Pd-(W$7?r#_kd3`60-Q{TzCag_hmwKjQZRvjRX=B4p*MNZJwWXc~Ewo z)miASFg-bjqe|YhDla{QY^4Tx0M%TSP&*);6g&`@x!$Hn25q#6u+QaS#B~+vxM;M% z6~19&PI#OT(FK`0QxvaN~Q(-;g@9( zTL`uTY+VS^M)sOkEq!OmXt&+mC~TSXn9RF_6lRgX&a$YeM9+0xjBOc1!VFV|3@r?L06EYbbVzP za0wbg>rpsz$?GgB%Pz=cQJ|BJUYg>%o++~EGXk3vD*eeU{n79El;!M?u6ZQJ^~I)i@mG$cUXPwxDsBaU^-J(?~C_RDU+@(1UCgVAwM z;z0l47vFd3-7ntXJ=l}nVsXc_cb&Tb@%t{_+igs-6GdjwH|m4`Y&76Y_r^Rz^7_E5 zkN)EB>p=ZPFJwxp`k!8MOnanx>y5o))z zViA#g{lon`m|IUk*|LhILVdT$F=|pUpo(hm#MEE9pr*C45s3{y)IZ;TV`EeEd0~4)FfF~KVf*2`?Hci?eEXK)QaP6*9r)>B zuaKXfPhqGCqP4}U^nikxnPQ&jE3VW#_R%y&U&)NeH>gtt$vP|fHi-C?+QJ6FI*W3$ zrc;}7O2x_9JaB{7nKl#*f=-+Qf)Y-Gi5?&ZFBFCxlOs~Ob%8iPf%njHj^^c~B_c35 ziag=95~IL=0>jIT3jG1QxVSu=1bE89MS&Pz*^3d;Er!gA>6QFxOJ;SC6M%tA6**>#%2(bMo`%FI>2I$&$*dswMO1Q&M*E zl0^#^E-WjrsF}Y2O9MWI43krCYW4A9kMuh~y+%xD*7hkK=eF_Zxv(2AO*fnxKo*6t zf(+Z|Lsksi6Gg7mq&D`{=&3={4|RHUN;j@yB=mYAkAqr;;$bAGC7+!mNUs1!Xz8 zd)g`J?#&WhUQ`gYls53+mDSXgRaXq2&1VaAHT6;e z+L<%WxEALW{qMP7-+%c&I2!(2F@4m5+;7?5-eG-h^VXM|ns0sT>0jJ=&v`%j<%fT8 z`Pxle)^Fb0(bZ$Mdb7}aAJD*`OUKq<+@PwpADW*gH3w(o*LqxN0`>zjIGRT+Bx}kA z>3PkmzQgp6;)41lld!j7Xgr}*$>cORZm|`;A6p<0V~-OxTnM!s$W!zm2;|62#k59f zAp|f`xY$_lU_u!@fJyMp1lZL-;Foz^W%#usQNUX#LmP#55+8u2Iq2?lIK($?@$RS6 z1rU=d%RmkuO*(2JtrnTCmoNmKZr2(99dPJBb6#(@q&rhyrQAr6VAn?<08`_?CSZG>n-Mah)MWAfLSvgq&Yo?}D zB)Rx(7tC`s3@toF8pD5=HVSp?XdM7;s z1r{kurNVDFglsmpl!FN|<0b^;3YAab z0T3#2IERRDh&{Ok@PKg}CmdOl1m`faaotrgsQ5_2f<&B<7fS2y>gM60&ABjoXJlY` z1F#Xm7q3{cX!)`#I2Oa9?$L4D$z_dzNzHx+RMC6}?}MV#=My_%aaGld<;(j=$6t8v zg$?h#{l@bzY+1W*fh0CjqC1j>cOa`UBcVlHK|S`!MQqTS-FX z+Iu^_Jecp>bI-Iu&|=9%^Y*$CNF!oKP?igS#^Rrh8fMSBEt`9~JC&%(WV>5Mxkt%{ z3AG2Zmn6*~OfQ@f@@~X9^PwZ&zxR?oK;Pu4eNVmf?8C1;MpU5Nkz4-o?#n;A-@YH- zeV3^+QvlY#9aA2h;Ux9#y0rwuyJmz#;i|&Qv7Il)d+Eua`0LkxcgnuU<6ls``nHx@ z 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Æ`SgQMF3K*H^E(m# zLB#yh&%XbYnHgEXy!%?b8^|KyXy172Kxap0TE-VwFL48R@;=91@wZ>{HqGtU08yR_VBkFj=0Ykj zA9vpK>tAZ=X_X%Qo}5{_DZIjG9C*rSPPvGVf>Uz(ZnwYq+EZ`8149|`%GL3kkH&}U zHg2*78qj=vOiyteVTbRJKJZQE6-n<$4aVMHQd-(QI9yk|HONBFn+>&ees`WaP~UjL z1Mqo&}y-c$}V>v0AZB9xK>fV&Ftjfeb5IuXaD~GK4R-5HPyvb9h+C) z*4m=@I4Z6vTwiK7Gdz{K(4)KDtIPo_;G~sMgv9c1JFho1KH6Epk1_`ls`F zam{{4m>e+CE6zP`VOO>52uXG&=0!3l>BtL`9ECAkXHa$$JJX}+B-k)$Dxd?@5-R6s z5q52=yI{K1&jH-?w8Akc-p5Vh!lG)Mb#zB}rwBQqKF^uaJM)Zl#rD*=fEPDTb>2IoX->%Syasi$Z_VHJ|_6 zbN>Lv(c0(s(((pM8bEO$oiIp;J@eVMFG67c%YXd(fED}fwqTci7Vk-=kfQv8cqBe# zjhxO^MDG0 zH~`XuJ}m8Aiyg43()zZR7V-*^tI#&ElCgfouFGfUUFq#4vM&i28-?tcue^>x=A)Xz z;)49L({{@|^z_psqZaMrW}hUeAG8G0Xr(-*z5RW;mIAhCpcm*(vz{+}`7^?yN?=@a z(#IhL>>TJyQaga2Lg4$^o!4A-=@lybJ7btP8p{U`JY`AQf}j2U8d&iyvASQp4m(q~ zeyFOjva+D;%J1K`xN4zOE|V{01HwqSg9UFABhgOzWLhxQ>p{5u)pz;_2D7RvM+S%U zN-OizQoJZznqNXC`_0W;g?+t8AmzROcygbza~-}MSmQVB=`$D^2SWq z668+N*9xCdH-We)G+VaU0)8Z|0Qq9(=L3}HJj~DF95{snzz!y-z?O2xK@Rq#0DxRU z%a3lR5nHE2Mg?&Na5=DmEo_jYi+YD!oN6Ew6J-@Bz4--X2XJ+4?|9<%%wu?DhNnu6 z;_^seuB@oUae$CvL&pM+UKfurK6W(tkX=;1P6Dwk%>WI$tE$M-9C`E=?M_@dW&>sz z?r0JO9rjJB+dHX>$Hi@9Y}+x@LYMasdt1yJKhlk86y}O-WIZ??rDajU%)$iOV(X(w zETxONB|wqOu;NgEZtA`kwL7`czz%Xwc#mSt#_dA*Tdy@3xC}#et5?EMlD(&dkx#To zDhiBupT1^9@u+lmb}y(bXGjQxR7nOJgtDZ=R$f0dHsV2s@iz4Ve3#hp4VEd8( z3H9xY!o*y?U6%mHr{eip;}Bc0`7f7!$J+zFgMG(;=L5BEb<*A6lST8d7J>tqCjPnR z`Ik1mMj;a#MVT*xrT1OB*Pe@agIW~`kwam+{D#oZd;I-l4&m3|z4A5&gZ0}R+d4Zj zjbK$n(yCsxD6cRd107oeHoPvb>^?gjGV!HmWDE}tHf-O{=v0(fAU(7+)H5m2@5;`f zoRMvZ8T}}Q5I#AYJYHj81 zSyWm&i*6Su7ObtWgU+8ZCJTB#;?G@L8dK7Dk3Lk228?&0e)8zN%=FBG;enj2>`e_@ zar$%*_CEO9W6ad3eMESys9Xk3UIu-gmd=>YFR8&N%~a0NCuGO%wqzGV&2N3|k1+Dm z)FdW^yI!~#j-b7k?1njKHq{d>JY@9&`>opRsW+ax_vHtn8Afp@`ULm3yi4v95(Fg! z@r_@N%V6dHNA7ya!7C5gcjcaF`7@$^N?LeqsMjA%@!BL_-0CmiWqEsPqE^4vIc#Lq~U`q(`B@I77*+3kRcZALF5a+{c~q`7rH78C7_Ef)g2of9+_t+ z$RouwMQHnSfz&Vig zKVCq?6z*}@i!&Fz01dI#gV|*T`IS}G*cZ_Z)6?*02^?ugOfl*716g@siVK-1nwxWy zJBCf2bh*hw@S@*0x$AuT%{9dhJgbl|B2`2Rv|s$3@VRmI`nGm9R+p8ko<8fGpMVJr zqTD!E1i4FQcrnuK63)oz>gnaA^o0)QFx9tJ!u@pP;f!16oTcNn>L)k?6!b^iaLkkx z6>{6)bcQv*c-i&c{O+g#6$${eQeJ++)-7A;XrwtJ__F#3x_eAw23jdh#^Pkfo(vM> z>?ar>3jt8TBd9=q#Y{5A`$q#jc`0lk2Rb84+;_D3PMhcOm@PD}az1#CBnmhoKr3v) zcKyIFuSg)}xa^Lf)ps;VS^qaJDKt*#ft(bJHg>hN_O?Ip>Z3eU^b}v#z zN|3KP1qC?h27CLsR$E&K@qNX4IcNjzEv-oUj4VREhZ@MnVW=UpL1^Tx?5$BNC@Bf2 z_}*E+rLDPz-~*(YvG#V(6N$D2Y6F}fuSCVd1%wwAmXyq|s_YvcIdthF&ORL};UUN{ zk(IvLO#P(N?GxF{pZFfdlSprzHWbciZg0i!bK4Vt>Fn>m=Dr(|+t89*x?4%{Ai~2^ z{HCs}-}w6{|HAZLkd;sF*@BYl1D5Z5!d^$ip98+?-qlV*PcAt2+=pL(VtadCasq#L zzU=m&-TS|P84-!+EV1$Zg9EG_ymG(8Rv(050sGDRhK+C4uHDkI?Tu}3lgLg0O3x5x z;rOD``4l3eqYheiz=GoHQ};h{S@~kxk8U`lZ9g*4|J3HqU3G62FWmcxh1Fi0$DPmJ zLyq4ZlF>hS@cR~-mlzwKfU9T#!`x*BEI#5K3(qg< z*~s^4*69XRI%-i(C3w{%wmvbiuroVwv_`upW(C=<;BWO}ZaoFN@{F4ER2qPSI_$)SDDb_JXLnJP~WCYhKE0xMY>=)w$_X3FPp20+y7O{Pk;}gB$4FpZIQ019#;3y7dW|dV{Z|+}9JSMUoWq*T<7QqV46M{b;bvMHJ#pNlSQfDzH#a|AQ zPzDk`&pDSUC@Sn49BpZAWDv2P0SwuB89d`@K|g~?_6LlNYhHgH(&Yje9r6n*Yij1r zl9z=pzTdLFHZ^TV*`2Wx=1mX%?ucCvtuCrao`ny(SPNwMjZJS8>Bdo5@BZ<^{S>_g zMDYr>_jRB|bjg9zidNi zv~7kmB`rwe`ygHPud3`XuU>NJH*dS){#);V^^q+twNNBRvQv~#RuTbGg8 z7&dG~0(c7W%UiD$f4(9yfGrB|i`WG$b%uQx6X+IgbF|!Ir!C6O=4;>J5DG9DLY@@R z1}t*3T$IaYWn>IZM3~dqLcf{HJH<;^PY>pYp9ffd`|Y=_3tadVrQi)m68OeOWGH6} zlRbee$wxrogRnNao!|Rh>Jl6)CPMegNkm?_efxGUngIMt*u%?0t^#|Kw16>(A4rhn zP%rRf44^OPFIYeazVr55yY99-uHUWO>tLA2D75G5)dOQ=TefVbzvylHYss>uG@z%q zhk`DCYg!;mTrOXW=%TKZW^cFnlzXN~J=yuq_HZ~WH$M-;3Z8RVx4982;o`gj`$=QP zMe4UjmTWy)V=Ly&M2bG}(;s>nLJt1Q32nXY^Zt8_?g+qxxD@OrGjK)KQsM#6IOvq+ z^Or(oMKLs>Vz#4s5F5I?KY!zIB?O*b)I(M1H0aQ_DYU=nkpMm6M-qDjC@k;3zT!3B#GcXb~Kr#hKx@zJdDMT7E)q z!1n0w%{!&Cf=!HS!WC7OdAZqa92muylmT<)n=ieLUBNuApr9q_r%8U+Z8RS%W257= zBqJ*aCf`3_a^Z}9foc5*xBu)9Pu$M6W}Mc$2D;8U;zM74|7RAISMxN&XU9fKz{ssw z>B;v)3wd?J8|}TFzxu~@BNJoj%|r%(lylH-IXMM#R#q?n)Cm_rLWeYvFcqBlvx{HZ z{CaYP;9kfYf9A&z?0oo`EEb>uP6|VZrE)bfTZYw*$czih*Uc}y^jdTKP|UO~!yh|m zuRV`kSnW=`sd?MU-}@l){mwQCZ_EAPyMv0iZc9UN|MwnztP8a)kb=x_UvYnS%Dmrw z^jrd2Ty>n^JbW8vismp1^c%T3cYNhmRRo@GVJaX%1kC>JV}AmVvBvGXVCA_-oC$S5 zWty1)ldDxUS{zOAB>wTAfBok>&ten8btq~hSFQ$Q9;--}cpna2vEO049C*Us$L_IY z^^976OK;!hcRx_yP~XoB6|>%RmBD4rLO*|wjE_}8yGnz)2!6={tm!Avnm(*vFh4&l z{LHh@nGk(d938VDO=O9h+B{CmykhXzMRaI470?#;^;r8Sy z2}V019p`s}>JoNj(w>oPKVi*n5aiQNRkvBZcyVT0YFGb&82Yg209Z5(OLj?KPF)Ke zhRu8JxhLrrU=4X~G&{^JIz7csK>+}{Q@aJ^_F_RmlpPXq9Xp0tb@{cZ(AeH}Z^==g z#iii$iB86d%2_DtB8eS{CoZnR#mxzjFwS$gw5O!F82Ils)%^OnF-T{pBp)iu(NzD- zNU^3EdK&+bAZ^TOML2%K;%fv~0@kum8$f+!1Nv!|tJ0{$g!GQZ)vbw`##V)?TDYL5 zynHBXj8{V=LwQ9-K+*Ejr9+W<%a$!^>+Pcy1J~?o>xf%wWQ=29KI;r`|6n}CwXbO5 z|JI_;r%%WQkVP8v>~rg0`p3%;TzJfRdoS4?MKdRyg$hESN1_Q-Cvmn_EEv=qyzl$f(Kgfr6*nZ=^MU+w1Kph z*2`?{Jp4#o2Im9mdVEuQa9Zfx#u z_RT4Spt7i(00^(w@)u7&H#jyCq=yaqM6BZupSKA?@Z5;O{^*>tE5*@USzLj2Z8i$$ z=AKqKg6@CiVX77tW*36lU{!Nh%gY;IgK6NnJ&yYLaUY>Qz+sZNm?ksCC+&0WsRx}f zG&oGXCCUKedEw;96AMaes0&q|S4Po4&i{=wzli?@{{`#QQJ*{gpFjT{O6(4sf6Lz_ zezPv5XNh^@^(Os@2}MA(ov-#oh`@Wsh`{|B# zrFBIxs#96mGFLIj@&z;jCXDqv%FAo=0140`9~f&q5JTXLDdx)%Tidu^?2gV(hP$S; zWH39Yudf%W6ok_C;x?j-#v&xK0=Sl#K)-TZEw_h(VCU&hZ@%F!)hU|3$o-Ff zgWWJlSVGn~@nz}OXwMjX$PJ=0A(+rdJ0w_>FkEOOta3ToIT&p~1|#wLY`G^qvRFt= z7-Twb7$fXk!d)-wTaH_{IX}I4o#tUx%`GUXt|;&58E9#0Ldy@N8s#3(H17yz>MmSR zMFq>smkvxs=dWDd*4RKEX?lL{k$dg#WlAvx+%V7nA6vLvWRdNy^1O`1%m9Bq5c6p{(m4fsTd60sbYjEpXOq|93Cd5i3bFz?X0N)~_%91#xYT zG!VD_VY?ng$=&;2c@T5dY>2LC%ili!=d%tyo!EQg0sjLgsLX=$k_CHitKBvd^E--Y z?+!IZRY-bskc8kHAQ8YD@HjX!>NCl)DP=V^T`kSn>Wr5EoU6DLTOKyJj52PnNv-Ww}+h`;iyt++nB(H9M6G|vh|D#8LIKe7B9YW;j z@s0a{t52TrvE%nXx@VxLFsA^Z>Kf>Qi5Z;3uvcDOO7I@=2kK8h-S__S5P_~eLj=V+Y#hZJ2L~mz<1fqZvCjPk1tkj)_c{w#7 z*%OZgKe>GUU}_Mr3?qaA1e+IK2(Pf!@M5+(QmejZ)xNAUG_^&-Y@e&_9$+S&)xLZ5B~W4 zPhI!L-#q+#V#w)Dj83y4Q=F$4QXsNiKY!A(fBgJKfBF2U{`#d$@BHc){`R#m{q%y5 zoVwqh~u)-1m&=QKVee0Im&6^PtiN0y7Z@`vN3%9h- zkR@;5R?BmRLB6$bu)emwx38D?mZ;*mor&~dufJCSyKew*6qp_jh7=F@% zNN)@;e8B#oO!~pNwRz|&d`B{fN$=oGiV;t+%j6!K#;>bO9li>` ziiJESfIP=DKzpl}EU8|yl&=K%uW4-Z%IGj+A-&G+RjO-mAT=~Wc3~2sZ1Hj5KK-YE zzY5ex2%t|A`ay;nTu8S(`iDE7zAMxF?8)$rM9bqe?LY>UUV?!Kt5Qu-H7Onxg|bR& zoHP*PD8a?)28^dS*WUc*+Tnn&v%eoarV6>#{kRDB5dwt&9H_im;l0Xpax%Hc?RJO# z&O`5t;)B6#>g(wN?Kl-fi+7*6b;|j`NiOfU_(F9ads=5gaR2G#&Zr>pFus2k_Gb|r z54aAKzwU*se1gX0Znx@Rko|!twqPVj_y9*Z(18#ThCUpz1znk8tSiA3kEI$YXgG}$ zjdh>*|1OM|4{zC6??`ceT}VO?>p&GU3hVe6(COKMOS^P;)&-p^@5^Q~{b&p(Z2|Sn z)%gHj0l)10e7c&!V*GK%dA$Mll0Ia6rzy$ReP`k45IA$#S&cR&@+MCxHeVDwv~Xv5 zm=S)Qm4awS>MT{)%rD5#=PvlFd|Jkn#sH^vn<2>d%=z9)F!(#41JsL+s~hguID!WG}t-qqLBo1G8o zuaOj}%buN`OVRqfZ@!*HRM1bLuG)9DzGTF!Rb&68*~-BAKe*_D)vPBK1cMKK-**1?BnK@JD81MzgGfk(p6pa%0Sz1eO)$Eh|3Y0)If(LSq|9N$(sVXUQCpjuczq!B30PD{Nu~OcqV)jfjI1n9i0O}{8Ec#2 z&yn{4`zEZia>4xmiRjji8`0)DEn^n9&n3FN7zi=OGL5EL>sdib8BY!lNoFWB+0uZm%pTKkvx1uqe1B zt|gU=&OG>iH$3!Pq5+aTibiyJ^Pi8r^3)N#9z3d8yxD6H5+jB>MW>;#a))`@xeN?Z zisTw#aK*69{7PI4Mh=|c%PJOQ_=#RaqTNGAFORyKR9Ao0+YLPxL>L#-0|$)$M1DCW+Cv#;l>BAy@_XjadGLH z`|Y!Lb?J=70^C?z(3yFrB{b~!>o&EtchHt7SZrgNQ*7v6)Z)EO#+#z(qg`nW{}Z}9 zgTFqU((h&xaqJT`2g-q876{mC08iCn>}hl=Z$O_H;LQy<&D#B>U0rY(|938IOnsc3 zoO{v9U{@Hoarm*Qxc{Pr31cKDn9LN5x6Jtw8%*Yg9u|0<$iR@n{$KzSQ44ViMX|@8Zt7Q2)-lpflI-|&oj|)&qIRQM1Q|&fG|Ui znJhyC!+cR`Y1M)ShSs-#fM2?YhG|`DdK%3mWRG*+_0u1!q)KFbI05r48)Phj!RVQ_ zFAy1!70R0T|IUICKo~Gd!yo_Erzsh*ta8z=^H=V_e7{vy%ZQC)F189nEIH!ICg8|| z$dE?}hn4Tzb3PDP44`>zQhD0{{@QB~y}gDlfITlR&>LfTP#SEYEb=6^xzNuPK^9?> z8y_`NGor1P#a!WkGvYQug^lK9cTj>x)I|EQnw^(V`fxZWo5rvMDTrwN zRfw<{tqA|Ivtcl4KpA1`mz;XRO%MOJv#(2D!2dhTz{tRTFF(BZl06oeEhJb$8*z2P z$@=gcPpqw9pDeY{XX0Uga_6s(-u+M+=VlaoFkqm?Qqk`Ar|%>ra7Fb}OzT~P-Ql#% zn&QfuqDsmHkkS6)##aa|AQ6!P&CSe)G3L~LPdH|uBai^#%kr8Zj+$TYTTm$^@g_#X zZmD>Moz3N|##<4OxGi_K_7qmnABoHx85#~}Wy_tPS6nzYJov|M;Uv-gvTas1L~B!H0z0wx;fu=Qq5J3*P~MN_v)&bYt_@ zwYFYy@BN{)l#d*+|1qmq$V0J%%jS-*U)}eRpJMR5NRV;G$6D*_ViOUXW*&I`N#S-Y z0uzV#J|l5EnAi4%P<*Wi>{L$;4uWcdSkx^U3o!nW2Pb8nlR1ocD!z+$S9G6u2RF|; zWm{MV^Z@Pru@PGx24EQlxTsO1p=FC2{Q@i?FMu>}f@;AFbWzLA7xAXr0bV?og!*x2 zK!-CE=!V|kgp;@5UdwY9Zq>WCN2 zPJpZp_Dm&=e;^tqO`0nTG;lpQaYX1$?486WUSv_TTd`m~n4pNeW2Q3n`Lqsy21>9R z?c)2i!nNra*4^O_`n_@cx+~-nL>OIBhhQXk+`SSzSmarljS|4+`>Ab`AwYM|OnDoU zIJqh{7_iZe#D`_aBlZtHo)O9kWo+2mTwGET$_$eMIWS@>7;AaT-mBi=@x9HZm1QlXx7A_=q@AdWT21#axIXSN|N>)-%c6uoNA6H%h zg2i{{edEN7$`*vl#rl73p-&Wz*gMqw{Q8$4e(i~|i7U}*DCTkg(H|yP3au_O78x2F zAt4E!0ZjeZ^+qRMPL692lL@BiQ+HW*>gp9(1rR6LHWKsw{gqdrdS~6xSk&5ygJ~g* z^M%vn8t;`&t<=M7qeCXbS(!Kjatn&cGGmUw z{6nlF=?ugLAZ*txTb5l|NHieFhPn5tZe#TIm^Ia@bC5rNcEJzM{^=*I&J_H=GjL=L zytMf>a!0@LzE2SX;mqdnJAM3^bHD%RpY{#+B}pqq0^ZQL>4pb?`>B&IK)y*33kcV` z>L1tN`TV^A8yde-^BcOFNPWg7#A&e;;AsXvQJRARHl@(}>^3|$O3~W~Uwd@72UlNs z>_;dzUzAfs&wGrHiE<>F&EUlxOl2t6yDnJegdS;5P<@xwRFk#~@Zi`dkpw!lqKeA2 zp00$b`(0{QY;UWdLk=M?0%;oD(bf0d`1>dRLQW>&2IlP4OV`@nhQ00Ny^nPp@uu-K z_LAw&jl|{+bobx*?DG$9+%(eLd&5N+#3Ez1c#;LnNp0ArN+MqMMJDdwuxVp`V?#$b zamP%RW=>|nh9Q0rV16eMM~&t;l(BE9e~H z2&jyj3IHoEEnt~3-H9DxD_MfHUuNv8lA?*?V&GP0a?$oV8+q77!iB9Ek%EJUFODG> z2+PgQ5s;Bj$l)0QKbiWRpPiwXH3*x^niH{4{buKQ3sR8}o`2yJPZax75bfBaJ)kaiOK1WHF7vmm64cLiS zo;|Tn=(^5~Kcl*@*1Fm}DqLu2+wJ%ffeFB4;!qd?avQsW_c+=S1u*w>BV5|h0L1eA zIk{YoatQ71+)FWa8d3wiC%(3}R*?e=+VcP6f`AE!jEZHE81`oE z+e8D<+k_DjMLfT_2H+<;y|S>JKzBM}#A@U+0wwn=yI_1p4Cs4?KYq@>d!D=hK6L52 z#>SsM@F*61d^gDKNXl{h65AT_CMek1`2#jRwJpnB+>Fx$6na*%K3w5XW63ujxqO?15UW-#Rs2V z|KjXfcB;APzwOD}iSlFI-9u}~V&lPIJsyuTG2|e+%Tht^;m?U3{ITK++xzs-teF(A zH@Cm@#hbrL$UOz}Pd(_wBwYQCZOzyxvNN)FHnNY78X6xa@54iE6^IOtNJYWKr1&&o z03zy?i7{`7qg1(a#&cMxVtmg_4{mR-M*!lHm_ryxI3x7JhL;%wC$#zenmql6U(>cW z#v55!41#|5`Bzb_YuBy;E#AM|irp71hU9&Cc>HU(|J{e8S&*NdoB!r(uhuMD9JTzV z%+65`8)xc{TAKYRXhHT(jFp(6J|^3~{mMlJ_5vCy>d{F%{50g&7mM7mQy@w7c6IS$ z$_5Q&pa)C!i`(N}rz;ItUIn*N$fvWqM0mc4j{!q7Ro2i8$qprO7e2SYDL;%)n|p8Z7CK605wxk&9>Hw6kJgeIZjcR0#CCsV93JnAax=F zQcYv-lLSHbgHq|lC!o{OO^UHsiC>k}^U$6qF6wBN(8U14r#KLludj0=ThW!sJ0iuC zAO`m9W|9*EDjdO99vsj_%;7W};Aa3tgG_W@%yOwRmD3pH0|GU1;al&3F+UKF0TUeI zkDP~n_}bmuP3Z-6cLqT69o7hRmgsm?MVcJyvrz$kFvg??eDADV-{0R$UZ9>ESekD) z%)9X!OMqbWq+UKZu%Th|!qOThL`YYN_r_gk2q>dQlwMV{JTomM<>~+Fg+5fSGb?NA z)+4-cY}`V~I`3Rzc0L{f%*({C(;Io2x!5_772x{DTZzjVO%XexD!YR#dTNtdaVIs1 zm6a90{p80q)wB-`e&N6H?{Y+C(%T?5nT0my?Fn}jyl@~gj1UDt=e}m zq0^tB{+t=6aSCvcRGIqhjbB5cIb_uV+#s*X^gX#f-0etXJDaQ0H#C6gnI1}W-Y5{x zj}quJhDotJDi#On6sjmUHEE7MX`kbMdC&FXolm|6>7QQnJaPlC|C|LusX$(FIc_Ug zjra5sBLMR>CaZ$tQYbVlmoLu?VPhC>?Cc^c<>nXPnD@*p{XJdWETS#9nKM2fNKId` zY*~;gGtKbmq2Ggl*xBe_z|t7Ou!dtxumUAlay0u+>33O~+Ag?vVf+GVuc_ZA(fOD* zK|*TZ;pE`ls?BXL8W$@7->0hcI)S!&i}WXk5c%w4S#d`}3T5Q$5YFlfUMbp)Im%_U z$vZG?bw#n>P7>D|9Cz5SkU-h|K~^jT3o0wXU67oHa~54o$|}+W*jJpF2Xb*Z4tuQ8 z+$I}|E@TUV&r;Z`3S)v zvuoA=411cc&5fpg)W#3LfeL&sL z&J)+%cT-DG+gsb-K`mpj->!WJB0NxkzomPgdC2Kh-Xq zb=H@G>POyqg8FGZ8*>AD?ggl8?`uDN^&v!4e&FEuAxAE*T-e&#R$5SkpMr?XllD1= z7%}R`!Z7plrZ-6aPfGY7y8eM%Z~5ZY6Q1mCI_-c}`yRFHp?`nzUa&UF_>vyBX8Ssa z`cgzlH2?YC*W%w{hj;n>5GcTHfB!E(Icm4Vetz-g_y-cS0x)}fdjsVyuq*6rXHp+) zW8>xnmhIzS+z&5Y@QXETV;~aPV{OQ?Lo(dM^I{XYh~neg6S-tr<Re`$>8ts&@{&z#!m+dgPfONNM&jD zgSnxMww@m5TV_$?<(_l{&_M!yI|^FSFNrW8clhsFb^Q#i@{&@vKmaV4pEC@&_<0~n z`@5L;Q46gF7J!9N7OfIZU}Bd?YT+>$j~fM@^diX|>Mlo*OX@$T%FoJd>+Zos&4K(3 zYg|cj3EP1iAQE)!9~nVPP?#RNXkkI2!u^<$Ff6OV{3=vUpaf7-01B9&YJFKzA)p5Edl?ZqjHr0fTHbWmHNIH_eX)2b$zEXr>KAl!Df-A3MvAcr&AROB za*)gh8`lsqw9Tsfg(YR2gkrK>4%A0pI{Wxz&OPCn z1dBIe$=jQ^{`J|re|68VOLB`K;bL#A-$y`qo6=K{ixgTeRNmF|SM9!N^=bQ^2O> zP|z3fYH@~HcvRxJ^8Rqi1+3lq>RXSzvu*&=>hV|*?;%N^1%=%M{Y*t*JV%Qa3q`+d z{(K|=D>(9?FzDvVfWSvHkDBkDSZqL$-+ODlgS{Md_lx(#mwwQy{RW4J^b?vTC;93J zK6}c($A9wL&tm~XlTKbd*J~~0aO_41NvG|9QcfuIf@9932NssqK<3K)Nnkw5=&ZYl zLY~#bb~^|U%O$`562|-_S3%k(KXc8t^*o1O3`67jhn_qOOIB4a`w9{e7+YI7tw~6rWUj_b`i$&sfC>cvh3sB zNUpx-6nDO7)#18~BH&J%)oDRQj!fV~b^-q?psE!|0f(o&thiV)Y6?M{(Il-jdXdLV zYmeJv;#PKKHLCCec0iQ}&g_|oX;i8$5Yyh#PFwhupP&T>LxtI_h))(eVIFV5j;~x6 z;ogh-)8U_A70jqn(~?Np3jhPmToPp(9=vVawt>wK*g2lthNFPpxINwObl_JlCh-}` zi!bqt{lnJvE^`7M#z{DZfSf(C!Z_lf#2c_`HwRW%SMvq7UF0A!5>(Hxp-)NWr?WT^ zGs3bZi^)9UD=}G|k%^mgN;0w`glRrY7pwZb+^p0)oWTeIEbM>@fZvgDX%7vsBB#># zS(Lzsx=)3+@UDCBOBl#Y&pg9A3-ZE!zxdI#`YYqVdF1!-qNB57@&5nVI}0#Niu3F5 zbs2Y`Rlzk#h!6-t5<-X)cUKbPZvUtYad$$51foO;65N&*R%P7Xu7AI(^GrQGckayY z&hBC##n9WgZ%cJ`-#V|JcYmffS<9^ zPgBI^M$nVXS@TaJb`+nr>-ax->^cW~yp0!r`1yD5x|i6--@NxnA^TqCsj&aN`???h z`&a+ld!=r{)GK#T!aycNl*gD*LtNo#Ug_3*DOuN>ni{c@-?!mDZiHj$yaH!XMlO4|LDUw^C<7Q zjb@NXIWM4(Kbz_u#&Qu4`a9d(7zXS|=bUy*9_pi^_73-7__0gA_=j)soP_%OlfX@d zN6_n0)Sn+MNEjf0z$bbqhV*F2WI$cF@g}(EnqId4;!nKrW54|DPyYSu>+ZXedUPne zV#&xi2xn4Np}@~y^WvYp;)Q1(ePmHMM9hz|9XHZ&AhRPgfir1?`0=f0cY zPIA70+W?PbZACS3j^*ZEKl(5t1uhIPdeOtj9&yTNU-r>&zVVA6c;02te%v!oTmP6i zc8*YtCZq?h|K%77sC*3SYdYAc4;wsN zQQz{yCp{NWKbKx;HyC7Z*!VwcnB{#%k-e8c72Q#vEmZLSwe!DrB1@NX|(BdYIY9Ssbaf@c0(shKOWs$5UrN{m^};qGj%%4v0GD28rG8P- z$hN}nN_i7Yp7tSy8GYEp4pg}5OYaB2dY{*0E(7#o>81dpiwn>tMV=2%3;Q`-wvjyK zV(i$#MH1Se`Y3J!?qA+_L>}&$^RU84)f*7%=k-{JD;ZH`0~Kvyy#|J3ADre}WC7(= zuor_Zb@BZz_r(Sk8fqNwfn3(6=KSI_=o5V7P7gImUVEA``cHI@1egFM0 z{=#csclq1j_tTF-Xv&MjAE5(z(4qfddi+u6G}S|8sk+H>#o-p^O>lVbJ#5i+O>t?D z!^;QC;^^UBy7GoUe)N~08JsXyeJ_A<8I0i$evb@1+q-+mDaK&sT64p?47FL=M~?B`SX zj(#qZ6pqmw@wbpuCJurBY3m*X=oUQoDJPzF-ic@DMXvpO!wrP39CE0`t?=)Auex81$&h5$K`?T zNt<%uRBf7IRhI$dg{c}EU|a5aCpyq;*7aOP2v`v6-|3i|YEuBXS1o*TiuSH-6gKXcdkhAS$@VR}fWNZrWO z_0iS7e)adh^v7?iBFm%gfpK%n%0f^#_7Y}rm}v2!KmEhc|Ke}Iv8`)oI%@)_(ZA<< zVRH@sWxssmYtB0QNMrl7)qUc{rHaq@Kz~91Va~gczJ*oT3zp@@9fM1rA~zwM$_41+>!Aq3X-AxrNGHUiiW-eMcTrsNVZ}-WLT~%yUte?O z)tCJ6r!V`}?_Yc6pI-l)s{t?9AMB_^1|&1dMMCJgqRMRMHKzZQ*Bt-(SALw@Fx)9N zcJ&Gv=^Y`!@NwUN%h%|zc6Ql-m;d>Dvi2VGMuzvVum2rMA{tMj?~2BjmG#S)!quP4 zL1j;oToeYk>EhN#($|{StUltz6I<7<4Fvg07HU7&V%5t~gj<))hzB0^33GYPc`u^_ z-i@FC=k>dG?P=S-eb4<{cW>I%-r3vM)jK{kj3j6##YA%2Fpe;{r!5ap#^$zhPZ>UD zh+do=heattqBBr5HD#>&b_WOBvu=2AzP?snww|!Yi379$0{3oX&L`&r-i4m-9w9HA z#diyz1Epl`tLQ`X7qZHH3j}a5z@em={7Kx20`sccdUvpp;ekfBu(TkkjcU3>kei(N z@ySVm3^?Nem8|ntq7$$P=4c_y>~0d^V-cu!5zcgGTbn;39d%%E04^D%0fh~+gg}-C zyaJT4g<`tqC`l41rNF&-c~x%Tm5x!9s~UqheZyYDDA8M%oK|%B+%`K0Ii5YdDfr1G zu5>fRIMERcVEW}UTthK>I<*Y-D)YyKkNsI zg*(nC|KYUU0FYlC4YRFpXoQP#Mdj}?5KKF|TLnWF#SL|LB4P6gY!(1Q6|Zx?NhS~O z{Z0;G&GU-n8TnZT%ran$9^iLq@9aXKyy^@8mj^;W{m-vI`@64D`0_zi+#hY|)?n(b z+wQny$30ix_{Wo0AOHBHPCI4Y$*byCV6O&5-RnSI|93p)tb5zLh`*yWB%YQT;+P7! zuohSSS@Vx1rc3-jNB_=6zn=I`d9Vy4FwpYPyZ`fnpMUaQ&w6V^WgR%mmb~y)Z4t3o z!X=9@nm==O_ds<;>HXWbUwg;BL~NS^LNb45a(J(b!$EH-LUP8i5C#_JnPFtsG^|8Y zE^sYdc%BTDAHD7Jzuon(n`~SHX#!)@6CZowdrv;%1O$}4{ja>?DmZx#6YDS%6)7Q* z4y~+fMby*K5h}H+cKN?^*D(?Y>ON@i@3?jA?ME$N2jP=8E)V8P2#$kGAQJOi<0>14 z{c&B6 z0n5(oQ)ZBg&ZIotan9!Nw}E@4d=qCzk}t;s&(d!>L}%8$f+0Yp(bUr{h~_hNRA3hO zB^4Y*!w(vcRaZCE){MsEM8zqmU0&vlZS#uv7@A}yD(68M$1)lu+Y5p@zX*#& zE2L8?D&J54)D?FI5%nma9*`!+6ElU*;&t|mWp8j`pvN|Pk7%RoNeHU6jgPv7j0AY} zktfV>&&mOd{|>psfaT2<>Q5$2BtLgTA>Hzd3RjN^u#dsVS6Zsb@R_uElMrz%H@Zl?L@6bmV)qVMi>9 zmc%2Z3H4od%QbKR-UrVA@Uvfk`K6oN?vI6{UQZV4^p9Tl+$-Pk%Hmj5HnM_t{>2*} z{yT@py{i1W#?@;ZR-?fPT58IwufFwf@A%&PEv12}0qs0u2h_m(5B%$fkKS4QbUir&+ zfB$EfeTU$KYd-$#bxmtP{rQ5|xBmKra3Fm6U=J_P?{EGSfQ?+`TmXc8>IM(A!6ae0 zCX?P{eG$TwlW0CBzek(USE|FIrdTvDXbKm}18?Ob|Khjr`H8GbuKnunO;c%;ySuR*QhY?U zCWecq1Ukl}&Kk>)T(uG$X9q+UVxjim{3;YlefN&ztEAs{4AeYHDg2Vm3^tGCU-DhRi|@ zmd2(=WGG|^f@zCmVczb#`ua6%)*vNxc6C;i6xUSO*xEM%Y#mPB_aMDp$@|B0Sb7KA zQS~_^zji~ZDk(FCjd^)aJ?1EH$4Lc#-e+H~q8AU5_Glb{{60hilJ?b zH?i2?e$$txlGENn9#15wM~Pb~V=I(QO^oC0%%(EHo^jigtYnS+pg1pw03L(C19%bd zJ4!ygq7SkSnEmAI*FJ0kjkRKycAe%R-)i`_Io+RC`@u>iL6k*euza>@nB`~({u$Ve zxPhJHK9|KSmNZFTF&l@@3ub%n-1+mSc69?Vl6FqH&W?^wQo~dm7Ayz*hlfYFsFY)t z1p{dO7SGUfDGH;)@xT+FL2GgjyGznpsi0ZwgBH6!ORzs}T1w<~j&Gj*rDMY0OGky6 z-fDdd!@o~cjdJmts;fq(ruXjMyJ_<#idJvhw2Ac%n>KfM_w4HIW(>vrzkdCCe{FS@ zJOO|xXyy=CMRH}*$E{IUQ;pf*W#xHOAnbugA?Aj_d-ezWQR}HIfWd%KcAzdH0C9s0 zEv`Uu390)ugp{z~pgvCsrvqIzqQg!*Ry01S!3#IV!MGv;Y+qYq!fjs=T6Jgf9$&_n+!qI0?O5aOy zfl5kF^e?Wv@+Dt<{rMk$&T~KWvd{eXD}TT1-+0RRi^(p)OcP6GeMu&CGyD6f6OW`> z(?D9e-d$Zii=E#;*UV0&At?`w;5r!u4Hb0<8d~9PimUzX6<_)M@4of`;2&bj_pbdJ z5{By!rhW!|X|eI0Lp@jC^hYugys{cfS%rUDJeMl-XPZmQ-@K-^1_z3#QU3gkzyHPq z>DME^@-b^p{QJj$55Z;LSMR&}+M&_WB$b86V8|RzOdI74uutK>8XudQ7)znT&7s-1 zW%Vr#bI%6cY^1#uXEw2yL;*g_jGtcsm!>6~8SiICMz=KC*7=yd60xx>Gyy4shh}qWD z$FW%HISG<0Qi6}R0NQH=Rh`aO6)I(ax`9!VvMj-b8;!*QxWJ%sE9 z$5Ef0N8c+F@aJXgQ{jE2I|Pc_%JTPId_kVo@s(eF^YG+|P~@T99t{Ho{t?N4`QIzM zhI?NA3UXc}+*f&Ixl4Jn&4k z^NOhlSs9ubhUxaUZFfEKn8#jl@;Unx2M5?k;$?7PQNxD1DJTeNJ}7-fr6qdd4c|~M zQyz<8&-ltk=X$S830DG8$TcWjp(yQOYeVGn z3J+2de|U0KkrRiz0Sr_$xbzuseEt)jMWjfcaq;y(`)%LQkcq`lnuRsPr!nK$$=xdV zj8{fzZC3pv%ng`;W#S|V7-yP=%MWZd)vabou?`w7%s_*{P*w2s$t_)>9+r6`p=5%r z2a~hf%q3_F9T4{=J#zjgEdQ!B{oHY(vEbB2&%H7}9|uuH+p@H&xT$f?O!t>{=`!u(kQ}>;be^v;97nlJj*CaUi1~0$ndpB*qRR=#T+N17& zLhf(dddHi-{jLxE^pmK1dY~S!fBJpLuDxj0@?w~MHIX>P_j^_RtXo&Q@Vz~KUh6SY zUhHDW+kc#G zKp9_J*N;SoF-wW!=QFUxy1;>60lw@@^g8=_LuVBDPy**@gj*4*aIIRKRXBq3Id#q^^;#8n?DZdvUnW*8RZ$kM)?-+ zmP-3@Q$-O&+l8@#udqhb8Di4mtm7l~_e7cpu*z9LK)!tZK$|Rg^ZooXQ~-|nyKBo! zh15gi6DZ5-yt{qZaIbTyJOaSCpWX}(50{pfAzy@S^CB^)13ndGi1mIdkz}}u4#?7+ zPOyJ6wN9IN6ErX9zgTtYA`Qa@&IPVBHZ_Bp!l!|@T_V9mPmW&U$S2d2Qo~qII3srf z{8L|_p-1nR)Pgafppyhh&x`4EUVU#UU!L(_<$0*Xd+F2W@bYrGAN}i>qUd?Jv`3rI z7Gq_;x$>qzyyctkBGsOl_VC<{{}W4N=QcHjkXRP7J^=#%gH@kgKY>6dP4 z-&!0i+D~O&sSUs)dS;_krXT>{P*H&yb#!QW%l4ha1K6?K)6D!nYMoTAU$YvNUA1;~MR}!l zlZE}fuXdW|aO((bt@qWlOfpaIy$Kt(t_GD2OR@#>Od#4O;ysium79Z#4% zIK$*K%N`-T$}><~#kh=wJFas7?mf8k_w3!%Zkyz%`KYX(E0>SMgO>4r5T;U2B%*#7 z!6(#|s;yG`*xLdAmWFx+%3H7TuD*WlFE5c#O9=aT>6==b^KSX8fBZH^RI$W7WSb&yc+X+pjD~%T5avKaErS6zDvaU( z*U0~P35j7F_kQ}`JsTm+34|jcnG;EmuP8a8y5dWlwvEi}7nWSJx9garR=P2VPezmA zLg4p`b6$vs3i#!L%5VSsr}zK#<7Cxu>)3JL$>%`rN6kidRb_!1nPmUpxK;zGu z$?V@x;tFB|p}V14@hi@G@!0fO*I+l}4^#)1#C(V7hEu<*zlWYEqwj>3$Nu4e*DOux z2Nmea*RTE#ghelV@{5>GD30JoS(!JsweN(Kb94JvUG(rZJE|p*JM#3)p7rMS&1;CM zoL~6hO~3jB@RQEjQnPYyTAM!5q;=`R`ltvxpas+`Ei0>vhj;94@9JouoEV1&5n}&X zQGCyi9mJX;j4~(J)z={etZr?ZOx2H#3>Ov65MGx^&R_wUQ5Ar+G2n}mCo9jG%mO)Q z*w;KuC)}4=b`RLOcgBj3LVk%0QoCSN#n@b1Q;S|Fh6yO_bTW2?NznP>oi_oLVcp6G zDMT4Sjgv@*5Q>2^;0qb(+?N>mA(FGYvfoA5staCvCQ-xrTOl?qkF_3AZYD zJ}!0!1k*a}TpWd2oOLvLpEI+?Zj>ZnRaHrd1Jc3Zz@UoC%6TnP`T1skn~@)>tE*?5 z;tbSh?wG@5d-Ks4E9Gjc&$hWdVPEqxC$k66hUSL)j_w|AVB97%FUTbG?fI^|oJXwwD$R#P&qy)!lC6}>f$4)SSW84WfE|epf>J{}2W!wp~gO z)Rx!c)_wCuuOUMn>_4EKH_``Q_0_k~lZCW-?i6kE1DCvGpNVj2ERT8HlQC zJOuF>^E#DQ zaUszvD$99-x8HmV(OTt4WQw_tkVCy)@N_boF&Fbw_Uk%C0E~i|NY{3$;o@~GiQ^R786ccdAX&J z%g#B0*6cRT>mUW?x2S>-mhn**YYwsjXMvcl3L7^hZ&Bb_N$J2R${~=MCz^}QpRRbz z^ohoY1L+tZ2Tq0e!|Z8WRb}Pi&=7WX0u&fk1wVS!U<0i2SX`WV3YI5Mx4hhF-5f<9 zoTHpAR-VXutq$Tg03w@es&_%l*xls_1f5e`P{$?wwgH6Pxa0}RD=f{80HxdsJ_bM? zh*j9UyO=YoiymM3c#RDWsQwH(>5ub)U!nWT22>$o4n){N4Cg-etuPj^0lN{3uewPl z|AA(o;`nrefk@e=yFzNBtFB;=891AZneOPsNI=gO&&GT z>8~yij80?`13`pP!n}X@f-{dfV{Ox#|7^J7 zmaTVu^UvQWmEf?VK2H`j#V7(LALS2Vax94YAGqe9aWb=_QS!7#heyB($RE>*X`oIp zFU48}`>Zo(0!S1!Ew8L74Fv`#rYd8Ro?&L%1ZmNr0wa&k4lpp7B!shtV?n!-p+Nwi zk``?wkJQvKv9nKoO-<4eI#o=fr1=^~nc*$14SRwM$z@cC52A2$Y3Jyd0l>>~&-po| z*d~`DaM*q2LC8g{Pa119)V4AycxZAQQ>;FU#6AG%;2K7qmbMA>uw)-AwUl7PP<=Qe z9gRSv%rRF8K9?Ur2N;1$Qt_3$uj(@@jYCciSQa-e#&7|y02{ppE)`Dh1Y*Ih#Yz*1 z3c#yLNgf;=V!O;0T#KW`4kY~YauFeSU`_xrN!uenk4ys2>8KLbI94h*58Cw1K141^ zzyv5MWjH8=;}$?!-0F^-FR#*{`oW$`qCi1k-qcWCT{AH;DMml9y3a?v9Sk%>pwfKR zWu*i+QtnS2{`8yjIb5-(x(bvJ`^}pKC(m>`L)4|UHyFb{&rh9p5|Fn`hQ`O*Ob}5K zb$tP!;tHkdD=9HAX1`!C|J?9>&x-!E8qf;C+VO_QrjI=L>7Loa2QTbx+wXknsQU@) zDvgAF=baL1tqVT)%xKqOwyD~mOrbzv3o-&h*t)F8r*c7SYn!wa#VJRGk6Rt0M8S@Z z%so3&w{1xdm|C^SJO3ZK0DQB2e;@h9ry*i`_p{#$^rvU(_iKW=Cs&pJYiMjHt9m^1 zi(UDJLn<`leiTQxuDfB=&Fnwls*KUQp|V~O?luDOpw4`ymLQV9-}SFs?!W!HkH7f6 z&v~0K4E51O9phZxhM*iNl|92I$VP5A_)8pZIS^)TyrywA*=Te-FVC>7s02>KcmMdqsJRFF)D$I70Glh1^qj{(13Sl( zfuCkDGF(NH!VjQ6r7^ryb%qSsXx zmlv#z@awxaUcYrm^~%wMgQdV zrroq83oin>^{% zQ3v~8+m+Sz!6Pi~)}9{_-HLM1R0uvAQ6YGPi&n@0Qqq{>1z~wKf9fhy4=BT^05>2P zkOX)^g2S~q&~WeDK!LjQ(rK%&@>y^$l@W1DE_r8Alnmi@h^ywWgbzkrJpA-ccK5tn zCb$w*g^i}9=$Qg7)!=zAu1SJn#n=QN+M4T!gfmv9=c;sigp^&<-<_`2S z_AR9DdsFxfBcYNeLm_CR&wc!3^N`}JSAR?M;Dg?#W^(BC$E*q+w=($TlZf^9m&ANn z_{)lX6Vo~EgY>KB`SrPhk(Td!+%dt^j|^Y@xafa3B(J+C**Bb-N)Qw9{}KBzQR0({ z$*=tBn`;_ZJ^hq(y|dNHHI+AvASopTHx}UY^ZfC&dQ}HVrpdo5Xk%wnZCMSdpBL*l zFg`rrcj?>>nK* zpP5*sg1*lA^*4Mz&vyW7ObmAr%3kS7{9`6XhbH;~9;79VDlz~6`P9{*CP-GWD-ht6 z7nS;#6ezc@c}>t`0s+pBZeG8(VO9G;r|btyYc4GciiM&`5%Y}F8J65Yg%_Rmg0Efk zo!qP>2dugakw8drC6NEMJq))|OUP8$Mbv%PL2%9>t}id{0mB?(N$%rYbzDb}p0i=``mvTNs6pzunytHJPg1;bZCL{h?DY$cd z{dPd;0C8=Vl~ri5S(~|_UzS|vAVRUPSY_;Up4vLzO8V>xTB4Dn>(d|A@3DsDQVi+z zN18f-D!VcW1x^w74WfI0XkP4>R~qX`+>+^Xa!?7s02FwLBcMJwm`NMa0oyxb4i#OI zEri@cF8naWF3^$R{njqP#o-A;H)vk?d^s z#>I2aGTXR>OdVW;p&&4hpFqmq4#5G2kk|15$cE1ys?2b~^4^??VKP{2Eh;ej(HM(7 zRfFC5wxg@Nxv_!XQ{9%!Gc4Q{15{R8lC>mCtb_Cf?GwI%gu*#FIVB4t*2%1(LUoTz z@KOEolI(I?)#bwiuc5)n&%k+9C9Sy)`BZDV0E4bohxuC9s#`|mMa5-hFMRxI-UmVu z(0#i%qg6b(E`06)i`t8y5Q6W3YBI4OU{Zt{fy|n zJ5ztXb>^1MsiJ5;_VY|Edy@d@MliijcPjoa;G7Z+WqKaC`{5}sgX#m?91n`avPDs z@7=SB*rKIry5D{CSFvp@LT`ur6Z;vn=Mp&VR@bj^qopA|e$BDVYg*g-I}XV!0qh-; z_v&enIq#z{elMiRSKs>A?cKY!v~5jhQb=-0Z#5-VuRs44rycQ_Gmn29hJC$q-Ugaq z_J_ZYV^I$VYwGH1%S!sjCiZOInn@aN9{jcj=Tm7*!Y_}0&a7DcN1BYqqK(xRy<=m$ zwr@wZ^x1;2>D5(F7#d3^Xa7siK1@rwC~*f-B+=}l;6Kz$~O2YT7#j|rb~ zbodKbOx&@RYHV}P+*}jja@#x8*a@%}1Rhz$MOb<JuBb zpgSPMI@EVIf8NHN&s#t?+EUZZ;R^|fsJR%B9j649_|G~1%D$i_}?obaf82>pc6{#QWRjHvEoFn|M7#rIOE9EROHvSH~r;0Vz#Gq;rh8~hu%P` z{-qVZgJurD{^F#zH*UQ3s$2iO1O*+Gd*ZQ=qcEUX#s|Y*ecns{a_2u3D)FEBmHls10s`crst8}@9vclV~Vj(r?(`-Ed2i#3Ig7k20W?Y|JvjN1tv>+9Z;(Y|<$ zd!$&K-v)bIrP7oU0`o-9;oZ4)8^!f`Nf;{S@ryv0)3O~T<}Ib4%-wuz zLcTb^-+;ZJ?#qr1j?UJAaN+MtydvC<^@Obew0rli(Td8ZrpDIB#&#dMZ6*egiggB) zbd3EE4C51F0f0qyO$~8*pv)|1Em>5i^cvbW?qGC0_7q!#>9+Ik8yq!AAc(1^>4%lhvXf&_iLVI~v1zP|vpTJWv)Ef>$;$me*CD2I^xb8vOB}4x=HHP$!UHNMgk=q9A}&)(ndB9OlnTV(8tD;B1r(n885y?2!N_ko&w#K z>KX8@{4TCmQa%}gmY&<@X1t^9sgzb&3Q!j5yi?8AWf3#4t)AlI`FY?NY@hYS$9c~~ z#Lf5r{$t?(K}pO5gNfRE(K+!izp3n{=f(-kr@z4Pp$;-aDa_$NdD;2#XP+6xo8X={ z*D5LUz3G|p_r9>?gf$RuyEMszyS0as-VgM45BI+HJMTdY7puP->Bk>DX6*^pm2>wu z7Cf|tAog2N(G;ACKs(m{f_F=O{kwPFr%E=`jM34bc+BIV{Q=$glWY!)0$yQi;371D z`uh{Ie!{9_fAaQkAG_k{Jk-DR@7H6ToX#$bSoO*)YT)hOuxH~EfFGgfGcW&$tJqtR zq=<~Z*M0r1{w2}i5E}V}V;`Gm*-NBTPdwpqCzH@mFu_Bk)m7B4ZC%CSBd8(j5h3{G z!qetzoG|NW~8TP%ztd4u^n^-8u$vpCb^to*!uc9kdkBZGqd6t zeMHTRX#tx%*pE6(VpRx*NO6LXPU}rNs4ufe;M~KRAlCLCP4)4wFB+GUpfcst`OM8RD32+{LUaZydAHOs2n^l^r{U0Z+bmA~}L(Da0ao@9_7<?cM) z@ygQozp&(@GonQ?-{2VY8lbt93o+?UBU?Db%|oM6)%T;n{PdQ#`w{X0W+xUry{SHA zP*6Y10KOnzmAEmVX1hm5y(oKB>k)7{7gXH)M*GL6#uPuOhK6$9$xlA_q$lGPKOkHB ze(p)i`}(G}Uw_?a0h_$9K6}%h)5!$*1N_1$_J#AF=>7JJ8-5R(EFmxM{FBe2Bp|@N zkbs5m`;sreema#{0uzn}34j0K!2J1&gv_tK?z6~44+Yc*lb&$Y={P;}vM4d>%gj4p zQ5%??dizy>`{m8Ib@dMz7rCvMpRzp7;@m~ZWBSB8kCIL0c4+ynlJCmsDLT&pKe5<2 z=sWkeSs_95masp|p{xV>O^r?U4fP~QV=$kMJokaqEzPaasS$Wj)l>e%iJmb63VrZ} zKqN3eXF8`+K8n8gTM9J}N0IAn@8CM*a8XcgY;=^b9Gj1uGV9g9Zo&k_2P8v(;1AWYNA(OdarI0mRUoP;K5{?)KZV*S0 z?oOb^x-#-~X@-Kof@knHzgDE;GqQ4NaCTL@FK7aGf&xw0EXG065pW&=QtZJ#TQwP| zM^15rBEN`^m48K61jI3QK-*n7A<~ntFspxIK`B41FF%XV6GGwqVYn_H^ zCFF5!%EbDUfBotKw(}FIS5@kN-wTT_dtT9V&Ww?UhYJ3{TpBPYjNrLXjJ@lU;xmp8 z4UFPWHUh^D8mH4%^fg!qsKhqxbUZ5Q~Jc?!blae zUOW^Un%TcM-0+s~ymulsN&1GHp#9nOTaQ^+T@+Pz@#xUt=-^Q2o;@9V_7VY*7dC(T z`cn$lY$Or%>sNo5SZJ>itEIY$go2Y+0nCT8(E;@PFTV1VfB)3)hychlyubDD|J^-2 zJdw(1UdXE!9P$URxZ!t8(8zNj)S9+*iCnwVqSAsg2eyzW zAAcsP6AwD@V~lyvb1vP_8H3?^(-nWb>^FZTU3+Y7f?7MolEEf#h)c)D0C>{-(9zQ> zS31S^X|nCDcVD2MWkq_qs-c#b6!niz;g2?~YqNCy*a(mqpjRPM9hRQbGC)0y9Kd#f zgoF{!2`KQftQ=DO3bbhQvubK;6+0HRjbMXHilkc=-=UqQ@iqFJ>fKR1CLRoM5wvDH z36cwVoJow`Sc3hNsSLT|=<7(&G$q0VW-1L2>QhFyy`vp-GTQ~`(ij0hgd4z^Zm>UE zKIns;0C5465Bqo}s{+cT(9Q0F3`9*mR)8NY)4&j^ywz1zs!Efy!EkJ0HyQaSW)g9W zn|X*+NVH(n;#z9qujECbo-YOJe6x)^MY^IJiU-Vx`-MOI-Akq$Ksb^SgKLOGnC)KN zoX^S6QE&%hYH;R`BHI{Qa zy!71Ir(RR?gySNORRL-F4`frV?bVIJkG#C(wNEdqC^0{S_WtZuH$snS1`MdKuL!*A zsqwGBwe0m5#o2R_=)(Cxz~TS8D^XSAzw|jpZ@idd2)^;@9B1I74{nn-wyAx~hko*Z zM9W7#uJ@8t%l$hxZEV}Ny=QORWxu@AtCHezUs>16nF`Y1Zfv`M z!}d+Q)!v{{qP@QH`Y%w~uV=V-CN*>LcL5E+C6B+j|Cc*1dE&F?7t;Op*4@O|j3?9j z=m$A`bL?cJ(_^EP6HAbEQ3tC_tLFoMNxT@_!v!CB?xo*-FS5?T#NNN_nQtvf(5rxn zH(vNEF8-ja`|o}3JMb3m)5nzyL@xd9)vx&3mED6wWX7YtLK?v`2_D<}aYorkn zi=YOl35veRWB8ayHQ`$T`x!s(jR7IV0D>ycfH=Yx#}Y|w9(eufDpB}AB)hXGC2p|| zAY0(1K;!k>=8*uFi2eDA=T?zd+#<-xCv~1%L)>A6)4+pk`-cCyN-@LA*l}J}?NyM! zT>g3e$k@hqdE({Kk(2;b;}k)1v?8GqLrfi@P>|=%sp!6({R!J9cyUdWRYYc|tfKi? zig+Q9UxkwpxQKvB{3jA9Z!P8{Q)_@0rA1^#@UfT&|4!X^wESLm->x`nAD6zbLH9!) zl^6E)$6NlQsp@bydQ6brnx??#USIOe$H&Tx{Hl=oU^PZ|>QNeUXVq2?baca7!W8VcIZsSjBx?EQ z0_QVNzmQ2}0b_OMHQ%_Da9n`OtM{*NSn<8LeD%XGcyCi>BVJ+VvL(dQn;CF);K-JB z_g#MT7hd&A2w&%)=ZdYn?%cZdNcHg5vS$2O$%@ z?E4>F|GLL)?c9Da!FL$RU--o5fbIpqmHKhQisRnb6^|zP);3s?g21dq76*Gi$K3C_SOho`#uJlY+7>|)Z zCv;~YmQwUJL0JA=O9q!MEiYjQ=yw1`zLi%VkVaVqu!-XXLV$b@^DE*`f|Azl2jCAF zVBRx;ZRu&rz`{~XSQ)^>o`40}{6xPIE})<_Ng$w<_2-%jtI+9H7Z<@D1Tu%MF+i{; z;INv#A3W$C9I7cPf-MK8-i-72+YmXQ5X5GpsqzhAPrZ4NtF3LX!tT80ak&HXfYtkY zxL5%x(7dQ50svG(eInDj90D;$3%;!=iVLb@P|6OE08-pF$!o|2(okKNoO3iR;@V%t z?4K`?*k-ICHql)U3n{CBHLLD)`w9PZfL}^EIE@NkXUh!BynwQsC!)wh59+&60CMnv zWXH*fyF~!6q(-Xylob~tOt6DeDqUhUS6rm1kN3tos@c&Q$OY{wA1CHq0X8Nsa2weK? zB9^4R7j#>^;OrQ?Wjwkiq{8>_OW;!>MuAO2zlNIMAYK5u|ksp(FTr`PDzj z&8=x^DdMy5xcH5~e)kXF`OLQ>XexGTpG^RRRi7&oKz{XyfBolA{HCU~k}U=IN73t^ znD(jykj#{YgI?~S;fc|JFR%pO`|Vvj2gV1zw*6mS|GVlJuD|8%q1_(%c4YI~pSI7tCWhF-z91O3jK-`aSEc=uem}+CGcgDz0CIaV3=@aSJ45 zFJKg)#cp3)TW6BijLRS;61|*5{hXSss>dRWW+~b`PL1AGSy{mrRpSGp2?7Ar0a~i3 za(!y~q;1bd5QMeD7~Ur)sqq@JS@l9kuX9~>?LcuT1_C^Nns1PXkZfiEzCxub}lF-GiD91Ww(C;~u95#DF8 zh_d3o<`Co^o(h+v$`SNKJKKz#hsQ%WDBVNvU%z@~Q&Tg41gG$D*b}b{(fF)~4E2FA z131#2e1Xbs(JJeHZS(VI&J&z7R%25WhdcNTLjzy*9<}c<^+bhvcyl=;P>BM{^6IFoU}HqGGGr%Lvz8$5B=@$|Mw??;5<`# z?xPo;2g3+8rkYo+YFV?ova$XgvL*SOpy0L9h^G| zWEDj_kHaPJqobF0I-%qk5ClUq;KefLU)DD|h8WXqA zK9F%}3efY~21F(dzUtwz17qPbXBa`Y%j<81*i;7U9-0mZ$QQ55@1{%M4;c>#E+IUm zt-XCWo!h$??8nE`)7`sc$BxaLH?h8b*IpzNWWd_G+I8#K*VNV_k>Um5S_E2$O|nPW z3NeTRCO5+;k<*({;R)-bIe~zR#dDccqo4To=MOh&50dM%&y0QPjb$t91M-wV#F``f zTlW03Vy`$qe$Vz4fqtNM9)IwvhTunD24IJV#^>lf#Q%T)FVj>Lc;5?)pLSYgVhWJU zsoV_&LchCy=IZ}V;|>V;nauz*lTvuriII0ax9GGZLl2_fuLSyU{^bY1yXlY2at@(0 z>6!1n-*#!>bhuhP@Inh>o|C z*!Zu!_A_68?WaHa(htAv$uB&0-HD_K0`M5Ri=)Lr8u5dVJ>t~wy!p%DdgGU_|IA+r zsUwVBN#TpPm!5F+r_MdAgqdu%syqo6c?PpcFskg~17*>Ne;0t^7M}g_m!9*%ixF8s z{X-IX@%$$~6N-iXEC%?*6V7=31urj-l{inw15il!sMhsAe*3rPb1H<(%1J42Z|kh9 zfdjT0zy{qBD~&dv%UDFusG_d?^y1(3SsOhc9rwP0K&?1tezVD}2nN`n2@qLfWM~*L z;WG>7@Nn>=`effZzkE4rWZpIP1 z+kd!_GRw-!%E@44J7F#WIio2b0YgOOf%=Bt&$uDn3{OtU;|})Au&p?M-3uWI8mamH zI3TmX&m*j0o?!*o1|zS|GpO=q(A*h>{riM}|9sr#Tq+s}l(u(wV>-ti6tlM{?q3ao zIDc4Tz_-40AM40*q8-j!lfD84kcl`I9t1jy`vBZ!=y~cwSzTRA*PNKcNo-zewX!Nl zCZ{+LU-C*RjFa8Kb*@60VCn#E+<4#i?b|v#I(ccxYg}$h9k;Gsw+`pi@|7!)18^1~ z3ZTIgIT8-ruz;c%J)f7wr!i-XpUG~`+#>cd~%F=fWL=w zqkD;T?ir7Ze()tFKl}SsD46fjr;=@JUEp2MFFNgrkTer#5{L$u{p=r8K+T6=TKvgZ zm0%voSWhJ({mgq`ziR59ohi8wbRaelA_`ydR6KI zQ5fgv5vbw@1#i{kLxZ7o3Ydf*7oDpptSYy{ zy!qJAb~QR9a$Kj@JDb1T&Wcj)=@cd@D9jE!{{|IChBlv zLl(-@<5b{!Lwy6`oz>-KNK^4}h)_UY8o=5zrT8Unh>d|4#b;ygNT5V4Lgs?80k0C^ zPH$l~BKWYern(fbRCP5Wfna}0X(@MvMu}BZ*(svdLaO8+hJcQ-PS1b&$q#sD=kS-W z`sU{L``PnwfGA-0{Ig@9eQhc049~-(iF3Xpz;b(g8v8%4H?OUWp^b+9C#(sP;=gfs z%F+HKuBDr{*pl;d{x%x&vP!?$t#YE*n@J2g>(r>=+ZC9}7W zQ1AzbH<7o7TJn^VJO43HE{T?qg)jI&tt@^UUyO~kZQnUQIP|=ekMk5uocZsDo4SYl z7RiVcx^LLM2|~B3l8U2Nt_K4=5n;0D^SengXIZyslIx=MH&xY(M&3llE}Uy$94$g* zxp()*ojrRf@lMzQN6Bfb%kwL`VC~AMv^G5Lh;`bihH2r4|NI4%16=MvlkDN2r&_<_ z?+#Ua+GEcB!P_q1pROQ3F^RJzIf9{k@<~sOhhm+BUG$0@JRF5|N%~mdxaMOodfz*q z^Cr@N@&XG!dh^|TI=e^?1|XN$R9Y&tzHwM-{eA|EkSJUDQEa<_ylJylcKDO2U)FeM z)z513myKBk>x9F8TV1QJp#c+r+uprkh9cJiHsa9$l?-RjDe+!-uS0=!v*K0p9jfHH zqTDnn^-aCvLTqP+5I!)1*A=h7K@A&Or9yTMRh21ACa;)oFYu{GfZs+Dg1bbS)s&Vb zZ1|z838yaTsu~M!$NG^Ytc%zm%(6B36Bd;-G?e(-+8W>tXah$`)F)M;vZ}Ho7A1d= zuF!3&3rVNttTUF%P?r$D94A4`$M%dkfN5OdmBLA3ew3zh?4n_Pw8GfGkm^spe;~EF zrmAlkcg-NkC?Y?x-Pl~d+&r*fG;ENy z?~WAaeM$D;xU`H2L9c5cyTaIH?wXrtet+W(W&kV%56b-xj167-j5oaDf>%@&S2)!Z zS@N~N{bPUs5Y^4Ec*P4{X*-N(ulVAd{=MOPgob@eQHC)$IrF_Yf91TB&xwXjT=78` zL!ct*-k$cWZ~Ge^ptfvfam9+dme-#D$_r0F7a*LPnFeYW_f?yZtIvBW zg>><}%#S7fY4^y6?b~+Vzm>d(s#;v^Caj{jvkjFMb2At-H8E~9elh3Ulsp;>)|HoU z6>}>}%iYd0!v>EKz|w-EO7sE|CmnS}_wdNp&0ElR*oa^OO0HeE)@EHXH3~s3lxCd* zX-=(={0Z*e|I*E+Mho~ksgk_d#wGYdz5p3+F_rgp_nx6s$r0!BcpL12q8Xu~P9_;o$ zE*p^(j`DN%;xRHQsVvyu-NT!~Zdmep8l)OJrauHi^<3 z!}ddM8_cb53BLWg#mB4+@em)rt+_Txpb~U`t4M{NC)psg9lyqq-Q9ja#XrpVst!!P zVoOb+s+5Q5Thkn*^uPtDMUH3<)>rta64@I!n4QW}~Vi(lXHd%Ou)p~XP;kGuYT$F_TrTIwrn*>fT1H$A~+ z@ayY;512iuPNfV^mXE&heII%0dywoGr}W`=Zrysv7yocM;W+=e``;r|W8i21*kJEy zFX9?B$-YCKum>yiv(I?OS6}y;#~pbZAqDe=lDGchZ_%m>ti|w_F#Un?q~gOx7YZ@& zu)#9eK}4Sw7|W55My^{`&$8~@{9)VFA@z_OktF~S(T!+-N0iH^g1?`I!uJ*@ z@#PN)rkhQ*wf!R_Dqo}vvBJn>=`JfR6LuF+>ld{2dyLhNd6%8I4LRVEH5gDXJY^dj zF%Y>VMX@nsd++G(>FVy{*pZP@IyW*tX?5td5(GGq`c5MgQym>06ca=^(#a*K5xdMM3RfAFoKJ-UK&FI=-@XsCjfHJBZmdy zqkH!3-n(np#(VA^8XT&xsb0BmEoK0JC_qx6s|tWUZcTHe*T9Q&k(w)qyn_C7&y0Qb zEoIeZejxDSi~2x282p6eqUFU<3L^Ly@MV<5{4Y8uMj=6p1*h4?)&kzRJN@hbOb7hR zzOlQ-{f|2)Oo4#!y|etQZ!O`>J38lhbEN`3?eyr&&W#a9@SvnTptz7;|GWQP{kJ>+ z1s#psUW!n1+J(*aEpuJ?;pMfhllx5{OPSsA>G5y=`TNiOzZZYps+Ou86cD zUKCBE4x1gd6w9J0lUf{v`|VAC`sgn|bMzY@`}6-?amS9k$;xw%20)Zq?8Ys(y!IP! z`{*w|3kVdXml2d;;-cc;gXl;?C_$P2%4F6dmX%xYzvH=|e%Ynpd;cGA z{WC%jLm^2W4LBB#@hd)rsISD%Gmn1UPu~8m|9iy;@wUuo3GAMn{z2zpq_T2oY@EWi zB;V5q;@&}elpLcYr_!v$$LGr`e%I~%F4Z)m#gKoz2$=q z@k`5OAZ40|2+#m7tV7qHm%pvc%5SBLEo9A=S*y3ca#Ou54d{een(NEU>MP1BsT$0& zsdNcEgC!=7yd)f?;5%G0mV5ho^IZ8{|_hbN27{ADO6>!Lkiv6>Z3(4}MkOa2O z2Y#;36%o*Q;5&Ejygn?nOt-2g3foqo)_WRRiVZz|84i9;qXL^VXb^|zZ1Oq%UVnl?ZM0tqt$Au7MRQ~0WHQy+-fo@WSqtA;V3-Ie`G$2y9W@L29_)1+ z*_szor<&=;Nt6S>#gosbIjLo{h5O|ErAInas6m{ytjL^!fzs9T5KHjHov?xynlb9- zuqP2zs)9jZwDWjr8E`%}lfbf!V|rj`$E`}Y#Bvk62YnUE_bM{iJ2+@8+2Ifp zz~JZ@JprC1aByGr$lDVaoghe7Zwuh*ftXD;IhSnZUht?S*G6O4Bcj7lHA% za5A!3mcahekukc2m?jm<$(KyV2Z6g>MXFuaZXFA&U66LpI?b?>rt9NhP z#;Db`w05<3yylq~&JE`dUU}11QmPI~BbMzI7sQ@_c3hPEkBFw=-UTt(u_Qe9n8^FW z{;U5t^S{kWnErU7e)5m0)>{8#j)=%c=+IqAgkhkdE;uohrECEw{Q0#r6(#KRz+-=a zM2}Bj`KAAR#fKJAMhP)#u5P3P8%g#DloiGcjJq0_e@A~8bpj2frIOeW)-N zn@CT%^pD^E&1XLDLh=&v*)Nn3fg9p8SAOM+>wiBqF^qu1_#9vppl&}1r`1?tH*J&^)X4`f)4imm40}RbSCI#B4BH{7pfanv-y*k6^v+~EH9ds^pRd@J zB_lB3F)c1vg|Y+HHkRCvf`?cmz{`ppa9M!xFTM>|S8`fH3RFxF_}AeR;}c*cBLYT% zEQEFuny2b8)3%zetrHs(QXl~cBbCdLr}xj;=HlGlz<68XjT+l|n{_2EybXZ|_8O+P zJ-xla9JeU~BS&l_0CfVBq8gEkKr|)0DPnzoSA45ZJ_AbvUlZ3bIW<|t$!z`}HIy*3 z3%>#W*2en2p%G4se8fFt-eH}ic%L~dPhBTY**s2NQY?(Nyp8JHx*C8pjF&o;*XS}x zzjEbDgwuQOzB^!>8%G{CC*yJB*2^vlS1X6bU-0NO`)XL?avUuZ9df$bpM2Cu^ zha&ptJ|@Bo|Nm$6*}(pf{Alc+o#|-U6ai|j4L;-X(F-3N9h=M^Na1{w=>LB|8^6CT z9hQaY0dKt{eYbt--z(~tBj_$<8~Eov|9Rs#-?=mf2r!|lxEwFF()=XaqSW%bMr|w$ z(1A#*DRpT>K!*Lrr$6oO7r$Y3!zynnTh6wnecOc}y9As013aX!J^$rjdiAH!trv+u zD2^5V>bl?I6X_Z0Bm5A~!6h&Np1SsAoCw!#yb0q9q@2JBq62!W8~NZ_+t_1d-TKn63HTCJHm4hTdFL19|H z93De@XHP507l!HhdBnZWj-_=iSXc2B@%ekU&OvbIa{#!zyG!&ft_(lQ+uGHuhet*L z6z;*8))xqP0~esvU9o%xlli7io7m#`tp&Zf9wLA&BeD31Eb(EIkECMf~XVw?pskL|mqQik2{otG59{|DnR z2S-8=3X^}?JHGe+zkTX=6izEB8nW@YmB#`hOMBjk`-2lQa;k!aPl4*A+CL?klP0wj8x%L(|H3Bg@?^w|O~3AuApGp+Q- zwyf2IJqCX*X)FZK+Ty_(?EFCt<0V1g*1hcjVK^28=S0Iw9W<%y!ga4%UMoVnIVvb? zvJK?v!1g4}>1@h->)gTWs7fabAf!pFQtRaOba8PB5QCdTFw9Z&&m!g+jwKLZIwxo2 zq(VLf2#WOJut2ZlR1G!NU>?E*z^|hOCBC4~LQ;sc>h~h)S;>B&kF~7;Td8?BqHYx4 zqBT39g>vYX8d-p`CzpRpZJ!-?pi|sA);eyC-)Afv#q1Z0zX#}zq?*S8`12tG$`XabTEWh4-eEVm+F zfnpqLmDSbFt*vn)N{onV-bF{+55Ed0YTv!PqpKfx!}4|O`~r9nUHRYc{O7@=zC`mU z92@@s9QB>EgLwWAzL;`<@rJ5E$ol)g@SBO>{dbx)zev!x|8^A^HcQNJ7yg`ncFw#md4 z0Pu$o{EWiER6||}_2~@xcyIsq`(OKwOK;zHCwloo$|XlMt!u2S2NIYri3mUAh*K|n z)|=n`oVUI4sjvFPOWyzYPyhadmt6Levo1OPh?5-^;QY~h*FSH1-(UaJJupB$TSg6V zH$h@1k|>dwqRw90%;hSXYv^fbW~=BD_Ts6auPv;JtxvJ`j-rRQtiZaAz_R))haMK4 zWX?zW5|QC5)(1dZ>NA6Lvi3Wy64JZ6ev-Jo@a_dI?{@yzx@R$GAJZ&Y>sZ@zv!$J!uM=XZ{C}}dq?tD|DGP7$zJ@pSWP)H`+gw~`~i4=%$l+) zO_!Q0Ph0<(f8KLl_^|2yTx(=<^rJ6)@1@Uv1J%42ik1N289QhbfA*hWlWU+Y2cIa| zTHCBEx`Z~$7`gxg*O`Sp4&S+J%ckz0{-Gh`-vm6xoNp`V*add}T-KVSm3&VCKN~IB z3cg+by;*qIh46NOw9)>#b%(pE)?-`1hCNk8LVJ7r0kcRvLWh7!@(2*@Kn2;oflzm> z2y>7K)cELi_B%=+ucKP>fxD<21tQYXy1ta64+!zE7Y7tdiCvm08a~>IiSd-xQ!PE; zoG<}J04Sag%Prlms;g_Ls~t6MgfjzM#JBQ+r=tk}^3qZyY*pJ6gB*t|u~1;dT(vkDj<>=@fDf|I&%`YYhF=*ZD{vZO4`s_I%i zB3aXNY|L1?%Bq?gkRET26e(V79T+5sYILk^$Ih|InRi}%fminY;k7?k5tM^$bo2u+ zEQaF#(dMNw7@5dcmINr~3z@;s-(T_dx0Wui3*EdadGF2x81tatchTdchQiDS254cQA%IUfqYhqChpXs682`+odUBDI~qRbNqiRLeTB>hQVq z&pqkv-k)!K)6-rJ%5uepZ2Nz^3Dn3^jFhFsuql^hac zko7E)d;n-yi8waWFODUpoP*)~A^M#a^26oorW>fQJOpr&K~}P%=zBpozNO`5BMOqx zfi2rRf7Prj5>B-Nu_jAp<$o`5FJ5ofyLlnTUIs@3H{DY|9Z;hEVys|HlsToRNE3rT zf)x5Q_l~l>5O-gY6>KBi2Ky;?4{e(>^88q5Wbu@^i^{peHKgmit}b|!a_20%r+aT~ za%7lF%kb>8t~XEipK4nUAY&}^`Gd>$!uKZoiuIB4Yb2wCM`Pa|^O!@1O}YxPX=He) z$X1x5zA(`pIFSDf7iBqzxeyh@7{Iq*z^R_$suvNX%49@sUSX|49NpH z$RBwBKW`-acX$#RGhpalV5Ln1-Wiq96}PTs;9()M9c|Q75%t!kE$TflCl3psUH3UQ zJt_L$_&FK&v(6hYtOkTQ4d67EO2N+$II)XM3ILb^E%xDBLV>KUImxsSUa}X?-m2=# z7_X?Hk(1{6vdxA$etyEZxEtj<>1`Pw8v{R>ONB;6)FV}hJ>4nO=IS;d9LFwLQ&(P^ z$IR1+ldGKR2N5#qWr8p2-p}z+n2Hwzeo;JH5Uu@*Rw0+ z@^}7yC(DUPNbEJ5OaytlD32JRluV@GEdCU38OB>#L1h2-LZs9F{ryA3^d8rH*ze;2 z3RlbQUsA-d1rZrkXs3U8q|TPf;p`IY_8;|q^IC!0yS5=`=%r!Z6>BOkEnz$0tz5Dsa@CTYQ}dFH z!qPPSfso%mO1M2j(W1Bi`+x8F=MAs@STRV z`epEEyF-2H_bk{Byh>RY2-vSR{Yy%)kZl(}!M|O4Yv*RY_I7_L93 zrL!U}3m60h*eoj!q4iU=>FF^hzTpuMpDb`wAe!B!<6GyinW#rBwOmh6FC6WVvXd*% z=|pvh?VbG{Evy#;WK`~<4Ublpm)6(Sg92jF@y`wO($P`BQSPOHsUECN4o?Pr=A-&U z!>h|RfMN7?9uE3=KG5bPMn30_P6DG$X*}LPVrbpB?Ap!k?Sh7Gbc{1|Ypa?XAO(Un zmqPFnO9dzzV3sQUMw^fD3&Ey$A-@J!N!tfHKP-QiQjhx$IR#ZB5ps`0{b_lcet@PN zHzEKLD-a(>Ck?|9@W>-zuyFk20)WpByMZ`)f>y$UdXK|EVtHcrX9m%~i|?R9LyGKE z>V=bXjkF;wZ8l8IDhZFOxr)7{xk zs4dS8lK^(FJWURtANPKc>i(x*R;E?gl``>4sejy&WJe%nF%;egJ)mu8Y0q7cnK|E=j!a7$TSGr(Ua4fI9_S6Zz;rJ@L5AO9$PqU)D zH3dKu6OGF|7ziP!ICHcx23?4=N5kP6R#YB9+M%>yU1+Y0UnmX`fa_!9W6axZb;K|z z#RS*`#@sC5N|P zAI^{6Ui}0<2NPWmBdDO>&wq+`;4{zz<=?K(Zu$cp za8ckNaO}15lAr_)Co)SM0ku_?V-u6~#)?nV?99@}Qe<7QnpPN@#k2Wo93`_i^&UiB z;6f-IpAFq$Nhht*CE$%dVLea8;BbqoIYm79#s4R(MH)j�Y5e1|b2ocXcbRuCcC` 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

uLd6EiA@WO4_U&Yx6s=l5LO~ydo(4ztKeP01z8| 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%0DK`7o;85=XgL<=(ZK->gV)hz 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/prev.gif b/gui/slick/images/prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..b751a137ed3134a0ff7a062717cab35bb2f213fc GIT binary patch literal 899 zcmZ?wbhEHb6krfy_%6j@;}Do%RDb!(jWcI2rKFdB`SNw{{1ww?E_(a+{f{3%14B|4 zE?Rx!MWu}i$%W4D5tY>)7B+qiqhK@y zhExbB{$ycfV31#ODQ+%`68vMR0H|a| zw8m8;`Z`TvOi6|?CJRKfR>x5z+9eSndeX5GB07wzQM%EPX{9A&WSW-(_EhnC)8j^Y)jv=%72EM#Bwigh( r;v+UaG)!~aKmya#ztzCQ^%GzK>IZEl_?-r700000NkvXXu0mjfRIiI2 literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/btn.png b/gui/slick/images/providers/btn.png new file mode 100644 index 0000000000000000000000000000000000000000..923f5bf93891f42e8c2076cdb61042227a13db13 GIT binary patch literal 945 zcmV;i15W&jP)RTPH5z0bMloO^HY zqqN-HLa3w?R6v4C2x=t8RB-}vKw?7&YBU;+F&H$48b+o%DPm$UCWe6od`6up0UBhW z14V--NFSn9tEKIw&-=dTvA4Sybl{%sWUsaU{r~G$3gzg*p> zyl`9S`>#YnaF9?P5}`6>Vi~|kMLseSKVf^`UYSZG9f|TI77OzR)W%IEkX`~&jp8gV z4vKuTEeOMYEd^4jPGVkuU*NcV!?qSe4pUAgsY(0h ziqH>9Lu>OjB)=zM>Z=cE-E$H5u>?6sa9pQ0dtQ(L+X|-%$@$UnY$Dl`cd zaDP8nz74!^y4$apKEWSUTH5c}g-{70UEDwLI=Qm<5{O1F)fF)$n(EI!yv zSSqsS&6mM7pLXZaUF|HJz3T9Of?A20`}e?t4^f2ngDZmfPH&<6wx4j5(6)luH)pu@ zz#f84+xdHEpTX92o;pr)^gLs4d`|uD9w^K}Sg#pVyF_ykj}9GYM^7IUQ?RlVd*lKg zAHPL>X2MLUrq;2R>E3+=>+gVBljC`iOumXzuU`jPw{ZnWzWjk)S2r^zp}o^Qn$SW4 zVJ@A`HOHMf6U%qN$c3|<{i4SJa2;TI54P@Dtq0yeqgSonK*g~0jZR_RSQRrAj%iAZ zhrImD*F3-bVKq4(EQhRr0n%6hEXh+J4uuVW4awAcGOYsFZEhT)0lRXkEdid?4De^&Z`lH7EqKxG=6Ses@j<{@|D}Z-k4oEEFo=v~VT*qIV8+6*R6tqF;A?Io z<*w%T{A|Cj+5E(VLN0UCoE$%Lb9RpGv`iqg%C5Zutcss_Xo!x5N8C5GQMO|@#v22a zB_jOb?qr)H-?f&A{hK~GeBj5S%jZ2)_A*}7NzdKxCAO5I+~wxn*BAIKVxz|#W=UG$ z<&3`8?js%#b`)q@a;N8*kq?p7J*jzR zAH7?SGSv4aJEUQhmrfu@M_x5$CDp!%MJ|~m1X2kuhihnWx{sKa8JKaCZ26G0*>jxf z4f1_l!?$TC^`VQp!4}e@&1TFA9;sEx;qkdSv*Jgbe}FH3jYw%LHI2<&jr_*D*HvC~ zEb>YDue|L})6jLCwH1kiSRGyuQi=W>&TsBbOm=^D2bbSZW^Rhr)eHwZck?hB;f*E- zA9Z^9y-;K_IZaK;R(zg@dR;fQo`dXqajdza>*P*5^Pv!_@hAtkIjImWeB2`N`K}_u z%qUCaSFxq@)O#Ab)-@YMnIm6ZA31+|Fzo2)Y-e&sPvOs3I29;mB5Nnm8j#=H)B3*7 zyZA4&@C16o3ZI@Gj_tpbcwDUtHkv)G5~FO|LvdtgirhL{syw=pZUpO|DpfzkM&o6 z0onh-z<%au`Hqk0pZ)=|K{hNn`|H8`f5_%tc>cG*h8@B#*bK6HK`57j6f?p}Q0p+j zgd;zJ#x=Nb1ZcBDM3^8H&;}ras{?ufNN%|LyJ61{pi;PPPz^vK0Zzt*)!!hV2C4>X zh6Dr989>KCltSFh2nkl8BA{Upp8e%uV2H3`2fD#w))$C=ETIGepTGS}neb^lEM#y2 zMtH;(&iZl(Y@~!B(+ik?X6N%>xc6u3=I=oE<_3O{5VCHc`VSBrp1=DW(eV*(+mub; z&VyqK2$-Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iyq_ z2@fNDe41(i00I9=L_t(I%cYY)YgADX#ea9-d%H_kl~ zf~8<#X<7?EfLP=c2mvb#MFcIhQb9>TLjnd;SeV_nZ|=W07WcWE+T3Oa=H5H!oH=7w z-hWf}aB}Az1_LOn24hG$27>~I6tszE^jLx1JI~$_SO-A6$gv@PX4Fs=8Quo~CMVjc zLaZZY)J*!H0kqA?6uAL_!EyabUoD&+^J!@;u|n^g$M{&GYQVYeXC^Yc0-MQ25gy z&>xiS^!uoSbK{!#j^I5TzqVQ1*y7Cbqlh#JoSUT6E_i(ZW>Os`%QBpIBe6s(>Y@N( zYx_6Thk6XFid-teT8CK2!za(_vP4&Yn8PzNtyBUYzC2 z>JL7B{!UTkWHaY4EyX%AC@WUiH>tHI#y}lw*48%}Ruv)C?4O!IW6jGqA9(fdBP|0V zM9kuYB?TJeDn?Vp7*NF+gQ|kreFrpYJ$B-MTiLtB6GlyUt&ujh@dBBqy_$q1cYbfn Z^cN`yK7ssClsfKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000ODNklP3);B4}QkpRj+R|F7?h zMFMouJk&vgw6)cZU9aQDaqQZbWRW5%&V{oNF$qa_b{}?u_F)eo5E^mLd~+_}IY(rS z!5>)|{@_AifBiLV+pbnBm0P~=e`#6PePhgLLI`NBK}4D{W{7BHV{Un43}sn{EX$yj zLY8IFS|eXG#uU%-eHS0b7z5{=EX(>QW9$_X{hcxPk6(ZNwabk$RR9elT1k@RZXCy- z4F-cnDJ8Nj1Ay#50n9;YtznEQp2Gmg_YLi3j4@c2MXu{I-}i;*d1piv07$tp<}+i= z3K9L~qW@udgEr0z7&0TMpk|-CgwIzh$Tq$K~t*t!RbAZ)q6}NBS#>0mXadviwAAb1Zl9EcLf;)Ha;NHD^ zI5|0iloAIA2bi0i!=p!!aR2^&ynp{5?RFblYcR&(c^;;wrqFCQQLoprv9W=jogG9` z1f^7=JIgX6B8xM|%ms~@;fx|8Se6CLvcMR_$Fi7+z!)n&mSw^7JWNhbB8nnxY;559 z^XG`;7@p^0etsUGfBrev*4A+2#tqbJH4qVAzkXeK=;C}sMBuLL8r!xFW1~gof;?f{ zHW*_gx64IJ38hp)%sE)gvfwxlf*`==<|dv#eTpy)Q7V-%H#Y|RZ2!a4X5Fm;o z2q6%LA@=w8@$I+Y;+t>2!HX9!P^naK_wHSM^2sOTWKNc4ftN}pOiWB*+=2jLSr%;D z#_a4YR#sNf@ApSY_{NPJn4O)4Wm!;4K?qS)l$@@TBte>{Md_1LVry%wuxPW{#N6B* z>h(Ho+eTi&wAS!_AKZ0a;+)gR06LC?rKKf2e*73qOG`y5Q%V)UEz5#2rT}sg7tyxUP#zrGieUlLMqmr2_6aP7!D0!a2vp#02W~I+mB0Q7)HZ zjDeIALI_;Db`AA<9bp(2F_{BVN)BLr`RzI90Dw4-(dl$RM37Po@avbC2Zlo9|E4G?P+h z{9_a{OdZ{B7h79fc=hU4ku*|DG#U*M5lW>Jq?987^9x*+{fsgAz7OB`!5D)O0&yG{ zachi$5CT$4aC0G7aa-<|qoX5y|NZy)?z`_sl4N0F0lx2}*=#}xF#=Es0mfKi$#MOa zN(I$w6|U*#bk*xlVlyWJk|7fEYP zTnIr*DH`v3b1v)m`$&@H$~evGMJa`0PvmQplapvRn~38WNs_?xJk;xTtgNhHc6JuM zUJpP0^b>yk@kewzoe|v^Y(QK}nFG9pASc$`bysC#PUg04!?LWA>~Az0c<|r>Zr!?t zEX&}!F3ROHvMj^N$q8P+evQq|O&lB?AWhRtV*wEn2Ox|w5`djI3sOpiVTirGJxoqc zqSxzPx*-6hX^NwxBM=e7FhslEMv^4x^?KOd-7T`%^Spw((lo{U_wVuM%^S2@EgT#i zjD)~Y_!!4=BNKr_Vz~DU@#aUNfMl&pO3tIg=CK7DA#pUo+QZ@V@xe9EUdYRrq&+x^?Md7;cGo{qucpS&iN~KbJVPRpaTrU5aF*dokw^zyw zwlU^I}H5!e#rBZ2aWo2b)Fc^>!f`~}xAg>s_N9N*TDjGVNjsHGWaVX0&#u$Tb+s1L6 zea`uo*7_NMmqgU&L=+NH2B776-lXSwPOVlmQ4~>{rUk%%GmO(!!}-v6_OZb}%QDhh zGtN0&*EPnN-6TmiqbOz>%07*qoM6N<$f+4>V AO#lD@ literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/iptorrents.png b/gui/slick/images/providers/iptorrents.png new file mode 100644 index 0000000000000000000000000000000000000000..d767a681647508057e3c756d7b8c4811a6a551d7 GIT binary patch literal 406 zcmV;H0crk;P)JUzpp--pU}sif#k^c zBv1^p}s%>lVt%HUB3y3GW{&zG$RUp+8jkK^E|z zPI*vVphPwofEpPf^%+QGB-9vXfHK5ju~-0} z{Bf=%+h4ZCk_9}F&*$I}h=_;?g9t+dHa7r)GBq__;y|PI#Txp&C>Ea{sn6nRFEfw; z9)ru|@R@8DbcvDf%MRmPz{Q^a3?YO=q5LLh@qQ&roH9ftor6FbAQ2%UOL6_s=J8#D z|G4qD+C29t4uEh4ciEeeIjAhBqqu?Y%gib9$ajg3u6Hdq3NNWd&}{2dl!N{YL?|AaR)AKf49C^_&q!TOFS`L@o2af_Ur|LRxXf9c=yP@4lib~230=qMvPAQ zeOzL99htc59sclUM9Gbbd&&P*D*q4f_j}MI7D=g`IaO z=N<N2@68f(rauEp;bnw&q;2cOpSsk$cE}E%>I_p+p|8)X#vc*FrB;OvT+SlM=j;NwPVYU$)ggLo$AIeE)F#SH3LS z8IQ}Y{UW!f_6yxgIqM)MEyVbtTN|K3zq!+PV!>{2|I@1mS=ryj_W06V{SD&f?3xim1-;^V0Jf)%^u z(?|SU>hS`_i!lWn7x&%YB~g@tZto7Aq*01f8rds#vvOcQAH2O2_af~p!|e+6YKj|L z*R(E9o$c2?cJ$gC|DxThg=c!M?|x)H=#wPbzmpi$=7rg-Ug#Dp6xq$-(I~2`kNE?L zRJ2)ZrjwylG0U$YmpLe!%PxXT_pz?{dr_Pc+;7zf%MDq@VJ0BSXf#)cXeyF)`q-*RcdY zuG+>0^+PqM`H$DU+efYN1Y2ev+LL2_fDv#f`&|C&+FVP~!sD;d4})L8l}g&dl0!b= zQ_!a#kanML+2QOyYcuyJQtMZsQ!>mT3KNbhgZ!u%V3V~02KTs4Q=@^^sCw4sP}%le znAB0t=gC>4vdPKgKGmt+>&C8i?5gn?Zf{xx%R23!Uc3&RSuZKo&6FFkS4}Zm7%%S` z83p!y`SoRyuNisGL>vOnokYrmwW) zQ5qn7*OEysoy^~!vi=jxv6w?`eH5>(#JKs)dH+nAAwLHW29zljl|ocGV2>Pw#zS-T7|iQM=18p|%jE zxP`_C*4@3l1>pl9q44E^%{MAFUvSf?IxduOsAOy-br>_z#XVem_;@JA9Bck+4yls4^+1NsGbH@kZs_?Tf04HN0ChOVQsqgvUfSBrN;$;KTo6$P9C-yZRPTA28Jbl-;^oLEhaVAv~_QwAkx}P2Q literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/missing.png b/gui/slick/images/providers/missing.png new file mode 100644 index 0000000000000000000000000000000000000000..b559061cdbf941100eb31c4fd1196bc9fab9e448 GIT binary patch literal 236 zcmV(l~Z9aUu}|PN)nLxQ)>TIRMvyD{!Rpe)IBTI?>e0;iE0@{a*@c z17nOApU1g4?XqJ!5HqbqjG%4q2Y|U%8;}tJy%_sGNJ zMn(i;cSBn{a1$WoCHUVN%;-p&I`zR-yDKP?T0HLMiA+F&0DXhhTrC2qKCfg8EzaL($e+EmT59 zL`u^@(#Eudc{I<-B)OTHd+*$HJSl!OxM9Kh*n91>*V-E$eCH#egn*UG0<&x&lmUPQ z(QfC$FgVq2hc9ZBo*`8GCXxV;6tj@z6n?yN1yJMzh6h8+O}HxgEY___JDGW7`?gZ2 zl}LR}7{3?^SqaIFN$hbG2 zd1CupQbtq=0bv*d7Kr2}rbjT-$Cw#=zY(;*i)lF1-&^|RPK)gLzPh$6K(y9uwqAO+ z^7sjXwR7XM%Xe+tKG9X|a4C&B??!+QJMp+Nu&-}y&huYgkbG#k2B(^>W~1V0d|N#K z?FHSsIXvrqwm3Ia#}bK?M_&Fk9k+^<>86e_PA$~e;o8__fhF9@IyXA0&Y&*?zjxW( z8`*%P$dIqp<|f7$7MDf}POMT$TcD=klxPfu65z4U0{p$W8V}}I9A?-fh3+m|HQlGG z8z9!_mu`*U9GwY#e=jwx3b!3VN;XBH9Apd$>u6PG{I*4x}DBHC#C$;jM-q>352QAfGPs1o(RE3gk?t%!QO`IVi=}m zTyLy~aA>g^jk$4)an5&ctkzC4!vd!Gu@ce4ibNt{ir{IC;C$T|=jKD|Wz$I`mvYSY zP=+PfJ~mL!@90k3%}lBH15GDDxmd#z(2&~o{f?zy5E6DPoJlY=(34~b5G6t)g!7#d6zySTESiMm!Rk#2E002ovPDHLkV1fa8 B)=2;W literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/newznab.png b/gui/slick/images/providers/newznab.png new file mode 100644 index 0000000000000000000000000000000000000000..ab633940e5237fa935a1e4d383dd64475884f1a8 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XvOHZJLn>}1`Q)W5aBfg2eiriQ_$rO1&4TCBoF;ERH;GNj z$IOqHg|Uox2Al9U#_4iemM>pyS*~KuIbBZdk70ujcPFn~h0o*b%>CACYc6``_#|I# vRy)xWFLjwi&BiTh>x9+?i!U-bG%zxVRLUj(k<70L+REVR>gTe~DWM4fD4;== literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/nextgen.png b/gui/slick/images/providers/nextgen.png new file mode 100644 index 0000000000000000000000000000000000000000..1bba1164881c2d56630b5bc86ef9bf0ed26b9366 GIT binary patch literal 1150 zcmeHGF%E)25F8Q<3kyt)B{5X?zQr#Pe?V)=TlfN%)_%b+P}|`Q?2^qz5^Lj?RG0eb*Pf+=REJl$yb0uX-1TI@=q5z;#`S9#7k!I!ErJ`;ms8~7b_ zEusB;t2o4?akLv#!`XA@aSl-Xq zd?H6Z_?@M%h;(1Yy2r_S@)>s)&w7ishv(v6z3QovTNCPW{{AWFA5Rk)2Eb9=fK3Lh R3FuD{w5Byz;1#&8c>@{4xxxSd literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/nzb_su.png b/gui/slick/images/providers/nzb_su.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcac66833d5cf690a0637544def21feebe17d0a GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5X5}1J(;{ZRe^PbLa~_6>BFlu6tjfpoNdu$pYE3S z_=GG)tSPVIv{O@~;5?HLuN&E=gbfq>jWZLjHmjXz liI=*};TAO6+@XPy!C7AZWYUZMr+{`bc)I$ztaD0e0ss$8KePY< literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/nzbfinder.png b/gui/slick/images/providers/nzbfinder.png new file mode 100644 index 0000000000000000000000000000000000000000..ac45d833b21f9eab7a136f513698d2d1aa9fff12 GIT binary patch literal 877 zcmV-z1CsoSP)b{3qw;Jm);m z^E=P~D1eD49Vn)xG?aZlC(a#|-aC&t@@=ac3Vt>flXJu2Jt88qx@x(6TusVi|xU8z&5s{`Vj>yyo8E~%+`Q?f;7N&`@N7BE@Z_vz<* z=5Bf$Q5nt!ecjAS#TlPB2cI5>=&vskx%pxTGZ9*vTlTLnwn?qeDQ2rCMMVWN(EW>i zvT0+kgG7J(^gCn|0PNYdLwYZq$62+E#@(B7`^pDLp=fZSe*G zHhfUqZteVOP4_}St4j-USi*R0QASfMdHAn1Eh_gd`TF?jfC3o#<9qV$USxcbOI=Ao zp_%gwn)lX6E4FUo`j5YH<9MwyE#BosQn65Lh&NWu!{S|xLD%)|exE~D zxvjFZ{v)Y;*)K9Nf~4ZK1%o6bzfb$%|7yE>_2gUSMJE~#eM!n!#_+TF#Q8I4m54^# zFmSsI$+}pZG6F_?5MyirV|0Koc5K@gcNFqrz^;;d60^-74Fp!AO!;Ug3$Ir#Cu_*O zY}GsG-eE=kZB*VYYb-H>t|^`+%GMXyOoT#LJgZ)-q^{ZpBIL?vr_kBxr}du3v6e7t z5h^_%nPoF$G8^iz!5FWU+cD>vx&QYlGk-#F|3CZ(v_WeIV|ttW00000NkvXXu0mjf D++mQ^ literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/nzbgeek.png b/gui/slick/images/providers/nzbgeek.png new file mode 100644 index 0000000000000000000000000000000000000000..0a2ddb86ae3071e9442968947c4b9e42fd4221a1 GIT binary patch literal 747 zcmVkHg{lTaRG2GAYPHhfh*@i}G;rmc?>e2HxOa=JCE4~r ze;yp#S9KE)E^&OWUa5Q1uHI;W6^g^Bhdw?zpX@v+C!szf2-`;!@pYC-?nECqeTOZBOha{ez9eekU zbD3K?Ni54kjG=h&??G4H1EUZmDCFYxUw-=GN2r&}l^`)syT2_iR>~DJmygfA`F02)&9Yogf`E(yI$VI-P;GYR_2%yG!{)97 zuTGyl|H*}z^ozvhn=3Jva@8ObLC|4ll}g|HAAFc+z5W*tYf%6N07t&DzWVpQdkznT zn?`ex1m#)USzTM7m^kifmm-n8wQ}?J+S;AFo8}Gxjv#^W%)aIh5&%>!1i}9%0C#u% dH*^qiJO?z)Sv~)ejGq7i002ovPDHLkV1f#9St}<31sAAP~8>Oa?JOYygZ25U29lkAA{Lb?6M#EKMYpn+}SHC>u^YYr#C_TrtZ|j-T z<+nYnm}|^`e2)5I{o)%^XO~ZZaQDWxK#RW*7q5+NU}U&h;{0)uyv97B^$eb_elF{r G5}E+zi%-%3 literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/nzbs_org_old.png b/gui/slick/images/providers/nzbs_org_old.png new file mode 100644 index 0000000000000000000000000000000000000000..d096f66710ca556fa096a26d248cca1120b27884 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XialK%Ln>}<31sAAP~8>Oa?JOYygZ25U29lkAA{Lb?6M#EKMYpn+}SHC>u^YYr#C_TrtZ|j-T z<+nYnm}|^`e2)5I{o)%^XO~ZZaQDWxK#RW*7q5+NU}U&h;{0)uyv97B^$eb_elF{r G5}E+zi%-%3 literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/omgwtfnzbs.png b/gui/slick/images/providers/omgwtfnzbs.png new file mode 100644 index 0000000000000000000000000000000000000000..3de01dcf10bf94f13f431506982115c99b5c721b GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ z@ErkR#;MwT(m=s4o-U3d7QJ&X8hSAYinKn|KPgf0Cg)Cz633#ju(GDsB?W?y;_fs= zxOBEI5#Z*wp1z>>cfbsZ^+#- zahmqk;A(<{;%v#j(H^Q{*+&T`L&XjM?)VlidX0>p0!$_Qy{zh hg)Z|6Lyv!5@?u4y7felGOb7a(!PC{xWt~$(696AtiwXb$ literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/publichd.png b/gui/slick/images/providers/publichd.png new file mode 100644 index 0000000000000000000000000000000000000000..abe067d9593b736d36ff1e0e46f099310b0cee05 GIT binary patch literal 335 zcmV-V0kHmwP)01dhNF#>(Ci*jdXQKw@h-M__Gb zj=&XM!NNkUc&|UBQo4hvq`T|)-c(oD81tuO#9ue<1CB1%kT&Fkb;83~2V%TeJ><<+JpumO;qq0H;7*VTl}sZj!kJV^lbgQCwQ0m_!3 za2<^|Q34O%ifq0}RK9tIHLkOaqTy^N0-OVuT>_jepIA*$zjP4FPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0zOGZK~y+Th0n`N zVo?|X@biDPD3G$U1bbeJqJpAKgSeX>i)hgzYSBtFdVp0Vn0eKl6Al*_L-X-le2??N`9P&o5jQse7dAeg2?XF{AZluQpRA`x zIW*)J2y)S=Wo-?JsML2T1_whL4aQ<=P&9gVWm{hdqSn?bX=kU1MkC8A`}TI!Y_8^3 z4kw6VK-|_=r5qjg93R`aw&3PDf{5GOVe<=*my5;Dy1QYnotq=FS@3~QCuwJ9%Ee;D zXtZx`ew><;_w{|{^Pjw4_$zsTKhEdB9evJV)Jpq&-qX`h)6-FtNsFR>snjQtJU={S zgF)zRLEhCxGA}K`R@`P&4G((`4-+^ZF&IK>wfo=z_F*I(4sd}Wq#F(=etiuGxkx00 zVb;~v&nSAsX9lDayQj?E5;#RLt(NFwoQKweb1* zgwa^cWZ?Lp0f=JJ%wUl0OlHbrNm;G0<#M@DD8%F0`+HbEs?{-tf*^=LT+ppXB&nh@ P00000NkvXXu0mjf(6&28 literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/sick_beard_index.png b/gui/slick/images/providers/sick_beard_index.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba4d236a4bc8196a9574bb4282530793ddbab4a GIT binary patch literal 844 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 N002ovPDHLkV1nldwD$l2 literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/thepiratebay_.png b/gui/slick/images/providers/thepiratebay_.png new file mode 100644 index 0000000000000000000000000000000000000000..681ab05476dbce5c0ff55c1f450b15fbd7ab1f6f GIT binary patch literal 1609 zcmV-P2DbT$P)Px#1ZP1_K>z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy2XskIMF-gj6cQUS1oL;d000HFNklWM)=lst1^E;;=~?UFSlN1K<#bMJ=qdO01im=*b;k715B1o@~sNbL(AVm0!p8<#M@8 zF$`Nc4RIzUEQ0?08KHF?}|NKz3xa z3mJy?N{K#c9l48gE%yyl&}U^VvrFkR=q`8;@V+x@L9GL63t2^eax$RjFvxa~5APc+ zHxeC%nro4C#MGLnPVX(z-rky}=pyGU3__7l!=r>Vq>F>8yeccopv>rfn-8T_+a=x& zX+rGH94xCoOJ>U)Tp}uJUXxql_TbEw z^=|Ya00Oh-qd6aAhCzIz1L5uR;n#K+;C-EbJP6)D-Igs6_m=3s8Z1vGhAPa&oxgfjskV$ZSc4+Xt>qo$HTh|@gvY5 zI8<#V4py3p10gd3V?)zI?FGt_F29zjccMGzJWbs`4W+w8H@bhlkqpa&-hl4A!LrnI z2P({DSXyE1*t-!c3FsijTC*_?h~Mfd))Lirsb+3~U(N3=(G#7psJ#F`)L&{izpvbQ zyU8v0Y;(zy`pZ&7Bb)35EvKw}ohgb`1T;1_&W9uRDml5) zEQ@JyAq8DUnxkYM$m0pg{b{>b+1OEtf3P)2vAfNyZUxb)ZU_r0PR1Vq4{OsTf>{9( zn?PBUCJ;x`g^AnqRPTWIL{G7fAd3sy`*2deg&h0>V&8-4by67W;vS3Y0FbiwtH1~NY6;fTS3T4k>&~MahG31bQIx_VK-ACIt8`y zki0&&=P8NJ8OU#ymL&G9d8kQ~)V1VdM2iO_wr0vFV9}%YeAPXG{R|?bO>jkQ%0L@H z=vZ}{xO0nB_GMG1{Qedfa=j*9av_o?`Y~YOeUXbX6K8}}T0|dKT198VR^d0B9Ma!O zkLsMrwK^AavEGHA2f(E&o4BUT$ZrT)g@8kVS9;ynImSM2WCXbQQkOL~P;S7%_?Bf;LgSH#;R^ zF9=>KP;(|h^frX$PL7g2m8D=k%s?48Y@)bN)toho*#Ps%iF9u4>t-?C<3t&EA(o@y z*{|u6_@iz)^K!O=^*CRZNVw&!CoUP|5!gJ1al(Nx2$PUDX%xf~I49;Kj2*2+=u{Cx zr!-6BsnO4X3TDje6gIU5432BLYfpgjO_P8&VG+_MY+~9?t2pi!yyW+oSx6f<31i2N z{MhSy-nuccAA@yc7@Intl0dzyNQl0QGAW-+8LLkrGz$7BacwxK!Lv{i00000NkvXX Hu0mjf4?5>m literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/torrentday.png b/gui/slick/images/providers/torrentday.png new file mode 100644 index 0000000000000000000000000000000000000000..13b8942fcc86b6cde43c46dcc597d30789ac278f GIT binary patch literal 816 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 literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/tvbinz.png b/gui/slick/images/providers/tvbinz.png new file mode 100644 index 0000000000000000000000000000000000000000..00ca93bd81dfda021ef680d69a29465d5482ab48 GIT binary patch literal 349 zcmV-j0iyniP)nSuO5cZk&SH9I=DeqQ=Nu{wLxhmyIOs8^ zY09#U0EWG)s-M?YRn>LfbzKkyaMJfZ0KTnPmL*wbS-xJ;*CSFJz_#sIf}$t@L{Z$f z?S~+WBH|A?Ns@V--TGKRyUDv(+kMolt`ysvr`@RF1 zrujft;~zVDCY$n!i!QMab?(O~p0{sb5RI6PD^C3DP!00000NkvXXu0mjfqCu3@ literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/tvnzb.png b/gui/slick/images/providers/tvnzb.png new file mode 100644 index 0000000000000000000000000000000000000000..800b3f66f3fa976abc7ae5f102272fbc476cb727 GIT binary patch literal 754 zcmVg;&%=R}MU*SMsBG>aAMVK}#}$s%la= z1m^*4+s4w;D(adJL14`ZN~Iz$jt<4n=1v{9<099Vg;K5I&*BO^?jxJYAeBruCkO%` zBC$sm9M?m6OQA4>qNtE*{$x^sB#H68If3sV2t*ZC-Gt`{Xi24zNJvB=(Rium1b%Rk zV0h#le9Hy`4#)P8j7Ve=Jdm0bFj`oGT4XdrrbR~J*qHd><47k}Wc#YJQ<#6tL+q(O z@p2f~FMor?Igi^G7=uZYS)l=$+8!KAqcs7fO%0j$)~HgP>jn*ik0ZY!&#DkK%|vCZ zN(xj_R}DlYe&Okn#VYHkR_3uByM)6#UqLgMEIjC{F@h>#Jey;erYzzGCXlQ1}gPDxsv z2vUT$FR~aXt*oq~rYQ7u1f;WBuKfisbVE*4H8fNR_DDEI-puTv>Fa2dEzHlU1k8bzbwuf*NKiqb kLr;R(m`J#kgMR`H0CbN(8e=x3ujSlD{E^JQz6%H;gPHs*{6HO#0Cd9>26B2?TXqBQ=0w#R7w4w+tz5SrQ zxA(TMFEj$i#LdJryvdt$&U2pUoCp4OtgL3l-}2V|pTsv+#1d)LY>r~FgoP@DBh%#a zdEs`slwWm^pN$B=uaVxX=M`&oCMo6@S1}BOx%p*+t%vA55y0tiV6)j6k0x13ZtM=3 znOhTiIY2GcW-EhZv!e5OGtLGV8|fl}qaOPD$M`%I!|QG0_RSvdJs6@|u0v5QSnL`% zu7~Jf@xI9s3o~flkj*7hohdhU_E|+3AekE;WrCpbNb#DblsE<8cw$& z0R(1Mkja#!W-HODA{(h3mqKlnb(Q#6mF2}89#7MLfC_3x!|StBHftc8^1ls$D)=y& zr2FC-S*P>x$uNaN1C|5jJqdc*M9pbv z3N~{4B^XlkR-q&*S}`jigrJZw$|KulR`4#oMQSroBpN4~kV{f@4p?di-F4T}@|t)% zk>IemmD%|(^mL!bZny8`N}A5c=`8C%VqCl2g~KT&$js+7So{zF l_dSn@v2axI-^EV>1_1j4GnJgD;}rk^002ovPDHLkV1oD5K)L_` literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/usenet_crawler.png b/gui/slick/images/providers/usenet_crawler.png new file mode 100644 index 0000000000000000000000000000000000000000..5c48557d044c1aeef61c47d19261d7274008610b GIT binary patch literal 818 zcmV-21I_%2P)jp|a^VC`AKB0}+&EP#FdVQa#vPAVC8aL=QnDMh^{?FF{aAM$jbEM5RT8X=T}M zQgOKEd{6)B+&CLHo3-}(|Gn0~);3Jj1kOUJUuPt^M#AfpoB2|`k>m+^^mT!04)E>6 ze&&~4C4G4_1QZ*gz0E>cDT{eMUe^!1R zPn@6G2W3ZVH>&Iy2KDFkK;{1?W?qnJeY+ z*xFvQ6Rv&O|WbQY~2HCv%-@pVH;m*9{krV zs9}GmOVHI8!L5^xWKJD}e}nx$hzft2pw%i{vg-#_a?%YJZdcIit}wwFyLJ5?OSpZm z9K)SK&K!v<#oZEnP-%Z^fZ8f$=eon1ovTDHXVL!*%EK=vX%+%rYO6~Kb}pu~E1kh! wx3cKP9TgxeyONw4r!kaCWaPi^{8xYh0H*xtHVHtB6#xJL07*qoM6N<$f*vMz!vFvP literal 0 HcmV?d00001 diff --git a/gui/slick/images/providers/womble_s_index.png b/gui/slick/images/providers/womble_s_index.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb053c6e8d4fc95601bf917bba2cb5bae610b20 GIT binary patch literal 268 zcmV+n0rUQeP)_(t6eHFyw-iW?pp`(Nwk~WSoiVAh8Z|%Lv{nJjdkC#UwC(X1sDLB;9mx2#a#9v~eB31tiKF}hD)`G1dQmcZcEfiD& zZ9^i>#$-2}O|m<)b6=i2lT0^F()5oPK4!R&@0{nRGlD^-TDB}9t-Yod zK6DGfXZNV}6+C;%c|`~uPPB3#Eq7({MFo|{(LEkDd*WXQwj;%z8breCIw6SVT~st_Ic!?^<* zqnS)DpUdQ7RP1@Ib)7^pEaig2MQW6hn5$Lo{zs4RRA*O&sOjT9ILL2G=MhR=kNM5U zQchT;l9X_w;~s)W_z|saPZaFE;C9FbOm%j4xpw0%kuQyJww0pqGnZ~Ba+`RdT%G~* zF!bY2@jJJRehvG`YgZ@+p$r6-WpNOO$LAsTY#Luj1(>$$kU7+>C=zEqQ(m z-haQNv}#W0IK;e$<7FvKjp4)qS?o<27ecVOM3xMkdSo*C?myRuP&X5z<@wg}WT}@F zu$Ti>f!e>*&PO4l$fSi`w9-{9zm?>~z*rKNwaE8R^}=7&s8@8f$A(F9Dw#xq!Mq6- z(kd=HC%?Kk{WLhaW~laDBhME!LL!fZlYyqxpfuDI1O*73MCU?V zfjWlo3IsFkx5U7|uZy24LSu7bJ@KSIrKl1N2Cl3&GBkD{ksBgcam>~A-1$mEWtcyA zLLEyC(5Tga)khndfRe+g8e$`jlA`b#Y#+ZnAs-mqiiKJTzpRp?kQVe$M^NQ8H2&6K z)koCmjqSRt{aE@qYiEOg7UZYa7m8(um(%ISj5$_l+^x)yva4uvD?TU-6B3|Jd{ z8-Lt;%YB~}S$})69jQq~35}Vh`}=ZHLX~vdCt0aNW51Dhj$E1gI}AT7}X~n3M7Y@rfDLzj&uJjqr&8 zH#4xD{9Zi7``L4;-RxdAh&HyBu4PATfiBUaxq@rvg85FJHfPjDn!U_VWn^^M_H1k* zQA6k#yBz#dDcdXFU!{D=B@J~^2#9*2R*7RICH36d=V zWuShvAiEDW2qs6h;sYDd$KlISO9r1M`Lwj;JdVX}uDbwD2HC(*ycgt4t?ty+@+wPUlR;uUiAH4mbx%Td3O?Q*$ zf&zQmF8}g8dC^~1Y@56N`Id%svugXbOJqMzNq%PY>BN*-n!)@W7LRXkPCY$Kvh?pylS=lQEeJmx&}%I_=-`FKFUe^aWI+!LPc+s5;Ys_!vxdGhVg=U0pN)oi@O zH(|f%$AZ)c_dD2+Fh64a*igX$#11wJasvDy3=tjxDF+*z&Y+=G2RoXV5q8l~>f;U; zSXkqU26{?8VjPWfP)eX#Y8W|De&GL-eKmQ98S63@?fZFZo^AD{N4pM&9@*aVN_Vbp z^|qYI$u>urZReRrZ&O^TJg>~`(x&v&vs8m8`Pvvv*_d*2mhSJFey=A#Uy1q3A9|9{K22WQ% Jmvv4FO#s~6iZ1{F literal 0 HcmV?d00001 diff --git a/gui/slick/images/sickbeard.png b/gui/slick/images/sickbeard.png new file mode 100644 index 0000000000000000000000000000000000000000..14494ffea96aa92e2b8e0d746fb1055f8868f38b GIT binary patch literal 15068 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 IM6N<$g0VGqUjP6A literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/bierdopje.png b/gui/slick/images/subtitles/bierdopje.png new file mode 100644 index 0000000000000000000000000000000000000000..349eb3bc88c197c8b916f94781291284f637fb34 GIT binary patch literal 947 zcmV;k15EshP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipY! z2>=>4!fdPn00T2gL_t(I%UzSrYg|~ zsAz+=UAPfNP>35>e(YSR=pSIk55$E+QK*fpN&~i~k&-}KV?#AbC)#wTlgWIXd+xdC zoYzG%pg!>M^1}Ojp4AIu42&_*T6;<iuH!I5zJPa{%9Qx>K=t|3H-@pDLySw-h zPkJ9cbElfCxZaZxrV6+7IB3TxOwUn>(f6?N+a;LV8p7ljGRmQ=gV3M?-1y`fR~Wv^ znN7nOthSIe5h}w7dgIgFawm1yTP9c)k>>S;d^?nY(_c4Hbl{V!pYzrbhS0GbVSSb*%V7_~nSvW10(;q;HQ zCm!U}Z)XRlcp!fVEq;Z-HbJdTuvQ(&2+#mB00yAW*k-R>e#Gk;o)x7*tO7YqxehmXuO zC%>LVVdRqMc@R+)C2sf7qUzeWQc0R|asBkm83CaNZ$r!iD#tS<c25IoEc9XG*~rv;K{Y z_vg39J9dvae|W(y#OZa}9)3qd>m5sucCTwse~Jr~Lrs-&UYv36WP`nXlhMg%bX`NL zBIJg~&zPrdM=p{53gBUuGLC-t2>#>Ro<3Dd3u}z#W;OU7I$7F#m2ENFL zHjwieG}0gXLXQ2X`vB;Dw(355?5G9KM?1}5-}^BiFZw$VLrvs^WsK|d=48~p9W<(( zFyIB(^8!a1q4vN2`c?`rICn~XpnU3b5lfHMT>vjR6)u^!SNBVVCva0+6_G9CrmeLy z4zC3-IZ3Zmgy`y--l`#u_;UXCcYR&?SXlB_f_~oh;rHxc7Bg^3tu7wytd$cFdO}}- zz`CDX^wgi#R3Vq0{H%GlXR}{Z5(Z67+96Vw!lLH67I0kiz9e819VY*P~63VCU`Dx-%e z(&y^M*;X^GW!AozcWw-*m@>j%iH+_`{(0z1!t>GqrrxZ1Sv literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/opensubtitles.png b/gui/slick/images/subtitles/opensubtitles.png new file mode 100644 index 0000000000000000000000000000000000000000..14e264828dafb6c5555774c1e63b3220afdb4d0e GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Rz?nM(*?;_egTDcd%8G=Se(8( zIgt0T0guc1w5HKiTL~}91M@z z;usu+o}Bx+t?uEnClfjP8AD7z&y4(*y|$y{i_#;m7kl5&bWu=RK5u5?yz~x^w!{P5 za+hmzG`u?(rQKhw+4^o?T(<7s{;lGI2ZK&=3J9_sxF*HF)B1Sf9;T}IAy-X8rk>s; z;P8(9&5SoJ3=YPpXP?pe{d$*?(xutUH22C^vj6`pe((B<8_#FIYXt=pgQu&X%Q~lo FCICY(dzb(K literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/podnapisiweb.png b/gui/slick/images/subtitles/podnapisiweb.png new file mode 100644 index 0000000000000000000000000000000000000000..c640d0db289a978589e5e97355f1319e0a07e237 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)RwfP|>FnlDzCfW^PZ!4!i_^&| z4GsT!jxf5#FcmQ0+gsfpx_rU}fiUM89GNa`0jB>qN;RY~`!y_iW`9zz;pF1g$ts2d zhF>-*+*VLgX}PXyP?_?6k_g+4D-%VyZ(QNs!|j&b$OUxeghe(rA$;bGffg}%y85}S Ib4q9e0LQXJ<^TWy literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/subscene.png b/gui/slick/images/subtitles/subscene.png new file mode 100644 index 0000000000000000000000000000000000000000..5dde8e2bbfc9988143c87264da7864db7f62dfa1 GIT binary patch literal 1159 zcmWktX;6~~5Pbn52SdNXZOv%o!Q{CryZ1NEE)hMuA`j`fsAdV z$P!-9h<=U$>J3Ma-vEVO+eSh}lp0aoah-FD1LTDMvGMgYBH#DDqsuAao(>QY2&_p7 zoC5Bc0OBiv1rK2Qgk7#a3CQBC^Lcxv1JH3$Rkf6-n?U&h7{*XygRBRdAry?DWDIpn z8kG&IKG@En=t0Q<%BCb&U(`sMGFp(+g`FQsMjI-Jpk_h!2$9ow-bLGw6IWq#8ze12 zQ-Q6KkTbyD48#q9SmSmk_!DsVg|RbK zEJ(~F*kcMg9pum8aV4sxdt9CXy0SO3a3dbK;&JF2@}!i^Rbm0g{r^z4gli$-3FMyj zz~&Cv+`WN`P&NYd7?rFAbu*CJBO~ z85I>39UUDL6B8R78y6SH=kw#^;}a4R5)%`Xl9G~>lT%Vso%)Y6ciK|78Vs16&Dwml$4Z~mX?*3y?XVk zyu4f>5D10B*RNk!R8&+}R#sJ2RaaNn)YR10*4EY4)z{ZIG&D3eHa0aiH8(f6w6wIg zwzjpkwYRr-baZrfc6N1jb$55adGn^Hr>D2Kx390SzrSB35)BLtynXw2aBy&FXz1O$ zcf-TOBO@cDqoZSEW8>rF@87?ln3$NHoSd4P5{tzWiDY_udS+&3c6N4dZtlZ}5A*Z$ z3kwU2i;GK3OUuj4D=RCjtE(SBeq38yTVG$_*x2~=>C@)s=GNAhR4Q$f-VY=GW}a)u zIe)kR%hnVAvZUQ|ZHEsX6eoLni9EeDQhybh&ux}o9Fwd}hw33R zkrR6aHkB+tvPYDfp+$XogZqQY1}~AnkBY?B-uAZl&&_{n=2reb6Z%)Lvh9xbxU{gbQ8z(ye}0Yk!+>kn8|5K&&IYpz*$f%+Q@_U6zJtq;Pd*I__+fog zc;VX-${O9!w?$$-NjlTA;<`_p>$)3`7g-uIIKHNV28T;@d!53Agm`f6PupeMUU~FC D_y_h_ literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/subswiki.png b/gui/slick/images/subtitles/subswiki.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0e0834f1c5be9be91117f13e6302cf0b637319 GIT binary patch literal 834 zcmV-I1HJr-P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipc3 z6Db8Qg>qT|00P2EL_t(I%Wae0Yg=^~$3N%fv?o2udHJ1_r0Lr9ETwO2a5}Zf1Yb~g zp@O*EA*kS;=(QKV)HzW6FT5IxunS+1Ii^glD8)(9)V9nnCM8Xqq)pakZIk|fUQDr? zeBilxE84uQu!3suxCiqrwO0=a5qJ=o3#O`~WE>nxOaSmzd0kB!x#W4AV3b zK|pP5i^c0dW13MEcWVgW=i9HZl1>ki5*~KU>JmiWeCzGG`yM)tloDN!U^_OBXR?8s6x5Y`-s*0HtA!-ym8^ZF1afNC+~j%VaG9a9e{GR#+|*r zyE!!-ZM9HThYFgl7LDB&`|S=9O~;Oz#0Lf_Z&q2aHOVAh?wuOv_q75yH|n%Ik|7bt z7#|%0;6`zsrL}e5z4#rmXdmx9{}_h{`+Rt1k!!yedFsJ2EYqM|+vWX_=ZWY#7hZTA z{hzpj=Mtto#s)o_tplo!+g$&n!oq49$Li<%e36w>osI2V+}ZCiG3=8T&c6aDW|8n* zrbYrf9my{@Hu?0&Rg8$vOqie}6_u@5Iz%mW4F5aY2 zX^;z(y!PxY<3m2nr5f`~C2Y%Na@farjtBsRV>6m^5b-EdDh5o0=T1*zMWdX3c#=p& zLrO);wa6r0Ts!_>!GLL!5)McnF^hVm$wGda(pHmW37gs6G=b~z7wkec0QCJG0{{R3 M07*qoM6N<$g7ABTQ~&?~ literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/subtitlesource.png b/gui/slick/images/subtitles/subtitlesource.png new file mode 100644 index 0000000000000000000000000000000000000000..827a48a73c5a7858d8fe86ef6bae0de04dae92fb GIT binary patch literal 485 zcmV1B&!Si?W-dhp!!R;6K$0Yy zBuXh!O38RUmS(dlaU4sMBpPuX%Wyc9X0s`i$wc!-ME*S$ec#tVl*?t5QX040jeI_j zh#(^PzOS8Vfm*GGh!6z9$6iH*>2wM}yY`e$Vi*RtZD(8XJP!cNvRJKFBuSz%pU-h! zmsjp{`dZ*swNxtU`g*-`KA*|uayn$&wsoCx0C2nAG#-x!m&=9w{mv)uM+b|=f-npT z!;sBplgZ+ht3&Mf`fbrZ$r4)u?WR~W)^IRt5 buj~8`$y)er2k#@Z00000NkvXXu0mjfeV^H* literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/subtitulos.png b/gui/slick/images/subtitles/subtitulos.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbd40d0fdf9bfabb8a2433c59132583a89b9da0 GIT binary patch literal 642 zcmV-|0)737P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipc3 z6DKg{wVU?<00II@L_t(I%Z-ygXj4%bhM#lq%}cq@XB85M4?~brM~i zbSj8L2XQC_bWtZOICKylI+#V2Vv7_N!A1O`2(`8i!BQ|Orft&XCO65wpF?OAleBr@ zzzgS`m+$?~cVK&@g|4Hux;go1TmW7_cqo8;9Dl-(XU`i<)Rwq^ZCEmsGpwW*=mL7s z>A;N#@E~{*G(f1LWAhv6JTq7`h+)W4bi7)Hh!!NMG=fUUZ#yU*Tpo?8t*}I=CD>SlwZI_eXK>4&l)hx>LoOD67eg;1`5PghLaHc3M; zilTEpy+k|Yfz_8U=(uo|lFtBt5Y5h;IDk^B>8dwNDFVR8hff5s$lDg)NCeHw6{v`V zh#*pH^1u53H&rBAI@g0~l?aEs(8}daD4T6X*j!sD^L>s)e}F6&fq~;_w&Ux%b*pp7_!ru c9cgCp2XTA_AuJ|&#Q*>R07*qoM6N<$f;|Zs-~a#s literal 0 HcmV?d00001 diff --git a/gui/slick/images/subtitles/thesubdb.png b/gui/slick/images/subtitles/thesubdb.png new file mode 100644 index 0000000000000000000000000000000000000000..69409549684a7f58a1bccf7eeab7cf0333058add GIT binary patch literal 524 zcmV+n0`vWeP)+t>B{Q!i9JRUWK^w8oUa7 z4_OLXWEDCf2;#<_x(I=^HIeE}n#?4bpYOOxidZV7G|yhn+MutFKDJO;3U z>?&ayTMAGjB3f%MCQ(XZ7|R<|BJ%liGZRP!G+-*Q6lj4Q$QRZeHP@7g1ORaylW9$H zV}p0S5%0S{*)F(*Y0B9&qhK2pZ5!86IHuzJaKiIjB~+``l6JdIyc81i^;kK>&u z)Ln}p(`>ET9Q_FCMN?ky+~w2RIVIcTJk97&60Ag6_FsqY&M&3tJNx==i$08jYfmgqXWdU_%H}T864ca zL9T^dAj&kAHJh62a5_m)zVD0g`&23wegy%wa+&*(PPj#0>?>2 zK~y-)t&=}U8vzu?zsp_Bp~*E7l(s?%@n1j(F%l>ihl+)Q;9x+72rk8?gDCA_#l;R5 z917whZD|8i(Luq%E(YQtf>*?v~3rUhr4Z|SAFzDjqf)*DS)6r=3)6vn< zS4C0o-w7WdAHUt%+4(RyICwHQH%Gdz)6mcmdA(k0ZEcljW@ff?x!j?mC=UU^bQ{iQ zvrlDNt{)#Ce-aLdE2pQYkxV8Li9`SZx~`XnLLpCSX{l3|<!8+z9~4vW!BZfP6lW!^1ejb@j z2CJ*90D$J^=FPFOu>%tTq*AE|X0y3aEEXvk45Fu}2Y$aF8yg$&csy8JTZ7N%Ln@WJ zS=VN>B{fYem;m7XT&ffVK~@wcwy?19Q`0mM5tf&iVYOOORaJ$(y*>2y_M*JJ9D*Rg z>-Bb6ES7B!0631jOeT|$48!=?-rnAvNF;gzFixivTU%S0n3%xT)fE~W8xaTuKtw1M z3J?TgkpqDG`nve!M&OUrY=-+w_w_c}W}F*P*>UDv@d4EFc;k;!CWx7$HP zuWdHl`Av)?Bg4ZrH8tUtm6ab24GmX5pAS6Gqpq$FCX)#zB_;W$rlthX^M)izZ(J_d z?9DF(gF!};B-8J^U{qDLh@$wiwzhV_?RM9SqIkeC%=btn!njB|mLR_uH>}|vyZKNFR<=q_Q zTpfUp<*U!H{e*FLS>;K=s|Ns5_ z4-CLjFl<6#ssFrPK+ml7ba4!kxIDFgH`gHt5!Um2Z`#E8HZ|S2*(t`zxoB_v1NR@B zzi~Nn9qdS`VNua=yBn*`YHfSh$FyDT$GipqTQ%No(sAZraCzy&?8Mw{b93w`EjVhl z<7n=)psT!&B=Y*a`w^#|!gAfFhiR76XKSxW24?xTua~EbUz}+2S>5;N8&C{*y85}S Ib4q9e0Iv=j{r~^~ literal 0 HcmV?d00001 diff --git a/gui/slick/images/tablesorter/asc.gif b/gui/slick/images/tablesorter/asc.gif new file mode 100644 index 0000000000000000000000000000000000000000..fa3fe40113a4482d2d3ff9b39c9056067477999e GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcXc|NlP&1B2pE7DfgJMg|=qn*k)lz{J}lzkvJ2`CGHoFJ`Og HGFSruQVtDe literal 0 HcmV?d00001 diff --git a/gui/slick/images/tablesorter/bg.gif b/gui/slick/images/tablesorter/bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..40c6a65aa2862b0939e2707b4d9c1174225f21c1 GIT binary patch literal 64 zcmZ?wbhEHb6lLIKXkcXc|NlP&1B2pE7DfgJMg|=qn*k)lz$D(&-*B4qR#HWXQPG{y$RItVO#VLt7eq@1SoZYH0_uYXOHcz1KFiHp+m4jxG{pJxjg7_0$v CDIcu> literal 0 HcmV?d00001 diff --git a/gui/slick/images/thetvdb16.png b/gui/slick/images/thetvdb16.png new file mode 100644 index 0000000000000000000000000000000000000000..cef1f96d89c5687c193caaa96fbad947cd6f9203 GIT binary patch literal 817 zcmV-11J3-3P)1` zc~>86znk7(_@cC0WsHGY6#byI_6m@;ebm!?!D=~w$-c}O2LlkVXc}ycpKJ>U;|U?1 z`BFf$=;4FbM0_79e%Q@vNHmao%hu&u14PPdPD>@=&-Ti+ki`v*wQu-FrBbCMAO!rH z6Jv#fhFA@Y#S^SuDP{!&(PoWE8=1wg8vmQUk_w7KAOquw(G^}Y&R{;JrZ&?`g)0cu zCv~gO6FCvELzNgAvb!4-1T`~%g%k*+fSSmLgh3QV3F%cmxw@#9yf%S`W27r+$2u*K zAM#FCZtbj(DEo9es3%M=O zB#P%sLTJPQa8&#L^?QNGoP!^kne-qSB7P%ew2D-RLqWfk63Tqxs*620#$Bl}X-cS= zTN-=CZ$2!0+S0}%=m*HcrDYf*AlQBqV3Zd<+ycr7N06xdjulaucSm#IEpAz$g#;M= z=*&!xI>V--<`d%t)|Q>M-z!tOOm4GDYoSZUi-u~?*2UVpQOrGVs$$y+@L3GMdAV~N z{8EW8^ z_8dz{3k86lem-dV04P)IWXJfGJZhYHU0 zdy{~D@)yr?Ls-fO2x8&gK>{8xkkqtH vWp>h;)s3GXshvZ~nJJ`dcK+MjzXA*Z7~nw5^8}z^I`So9nao=+^}Qs?Z?lLp1FAR?4`9^cb&O- z<>${|8+YzozkSc46Q_3_Ji31S?qlaJeg5+G*qQSyH*Wj?|NqRHGZ}CL#h)yU3=HB7 zIv^z=I~iCjACwAmI2*DnuFHA7j?Lk$al(dctNS@^FLF-R*k0_K(bv^1CK)x)@6l7v zy&`GMo~}kSM8ht95U6<>Br?B7-#mJiBG= literal 0 HcmV?d00001 diff --git a/gui/slick/images/xbmc-notify.png b/gui/slick/images/xbmc-notify.png new file mode 100644 index 0000000000000000000000000000000000000000..a657e4f8fce5ef385e2ffa247737a2cdc2f77c9d GIT binary patch literal 8616 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 Y_)34>tx#4;po17ZUHx3vIVCg!05}~|L;wH) literal 0 HcmV?d00001 diff --git a/gui/slick/interfaces/default/apiBuilder.tmpl b/gui/slick/interfaces/default/apiBuilder.tmpl new file mode 100644 index 00000000..d942a55d --- /dev/null +++ b/gui/slick/interfaces/default/apiBuilder.tmpl @@ -0,0 +1,378 @@ + + + +API Builder + + + + + + + + + + + +

+ + + + + + + +
+ + + + + +
+ + + + + + + +
+ + +
+
+ + +
+ + + + diff --git a/gui/slick/interfaces/default/comingEpisodes.tmpl b/gui/slick/interfaces/default/comingEpisodes.tmpl new file mode 100644 index 00000000..e3418b44 --- /dev/null +++ b/gui/slick/interfaces/default/comingEpisodes.tmpl @@ -0,0 +1,354 @@ +#import sickbeard +#import datetime +#from sickbeard.common import * +#from sickbeard import sbdatetime + +#set global $title="Coming Episodes" +#set global $header="Coming Episodes" + +#set global $sbPath=".." + +#set global $topmenu="comingEpisodes" +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#set $sort = $sickbeard.COMING_EPS_SORT + +#if $varExists('header') +

$header

+#else +

$title

+#end if + + + +
+ +#if $layout == 'list': + + + + + #set $show_div = "listing_default" + + + + + + + + #for $cur_result in $sql_results: + + #if int($cur_result["paused"]) and not $sickbeard.COMING_EPS_DISPLAY_PAUSED: + #continue + #end if + + #set $cur_ep_airdate = $cur_result["localtime"].date() + #set $cur_ep_enddate = $cur_result["localtime"] + datetime.timedelta(minutes=$cur_result["runtime"]) + #if $cur_ep_enddate < $today: + #set $show_div = "listing_overdue" + #elif $cur_ep_airdate >= $next_week.date(): + #set $show_div = "listing_toofar" + #elif $cur_ep_airdate >= $today.date() and $cur_ep_airdate < $next_week.date(): + #if $cur_ep_airdate == $today.date(): + #set $show_div = "listing_current" + #else: + #set $show_div = "listing_default" + #end if + #end if + + + + + + + + + + + + + + + #end for + +
AirdateShowNext EpNext Ep NameNetworkQualityIMDbtvDBSearch
$sbdatetime.sbdatetime.sbfdatetime($cur_result["localtime"]).decode($sickbeard.SYS_ENCODING)$time.mktime($cur_result["localtime"].timetuple())$cur_result["show_name"] + #if int($cur_result["paused"]): + [paused] + #end if + <%="%02ix%02i" % (int(cur_result["season"]), int(cur_result["episode"])) %> + #if $cur_result["description"] != "" and $cur_result["description"] != None: + " style="padding-top: 6px;"/> + #end if + $cur_result["name"] + $cur_result["network"] +#if int($cur_result["quality"]) in $qualityPresets: + $qualityPresetStrings[int($cur_result["quality"])] +#else: + Custom +#end if + + #if $cur_result["imdb_id"]: + [imdb] + #end if + [tvdb] + [search] +
+ +#else: + + + + #set $cur_segment = None + #set $too_late_header = False + #set $missed_header = False + #set $today_header = False + #set $show_div = "ep_listing listing_default" + + #if $sort == "show": +

+ #end if + + #for $cur_result in $sql_results: + + + #if int($cur_result["paused"]) and not $sickbeard.COMING_EPS_DISPLAY_PAUSED: + #continue + #end if + + #if $sort == "network": + #if $cur_result["network"] and $cur_segment != $cur_result["network"]: +

$cur_result["network"]

+ #set $cur_segment = $cur_result["network"] + #end if + #set $cur_ep_airdate = $cur_result["localtime"].date() + #set $cur_ep_enddate = $cur_result["localtime"] + datetime.timedelta(minutes=$cur_result["runtime"]) + #if $cur_ep_enddate < $today: + #set $show_div = "ep_listing listing_overdue" + #elif $cur_ep_airdate >= $next_week.date(): + #set $show_div = "ep_listing listing_toofar" + #elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date(): + #if $cur_ep_airdate == $today.date(): + #set $show_div = "ep_listing listing_current" + #else: + #set $show_div = "ep_listing listing_default" + #end if + #end if + #elif $sort == "date": + #set $cur_ep_airdate = $cur_result["localtime"].date() + #set $cur_ep_enddate = $cur_result["localtime"] + datetime.timedelta(minutes=$cur_result["runtime"]) + #if $cur_segment != $cur_ep_airdate: + #if $cur_ep_enddate < $today and $cur_ep_airdate != $today.date() and not $missed_header: +

Missed

+ #set $missed_header = True + #elif $cur_ep_airdate >= $next_week.date() and not $too_late_header: +

Later

+ #set $too_late_header = True + #elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date(): + #if $cur_ep_airdate == $today.date(): +

$datetime.date.fromordinal($cur_ep_airdate.toordinal).strftime("%A").decode($sickbeard.SYS_ENCODING).capitalize() [today]

+ #set $today_header = True + #else: +

$datetime.date.fromordinal($cur_ep_airdate.toordinal).strftime("%A").decode($sickbeard.SYS_ENCODING).capitalize()

+ #end if + #end if + #set $cur_segment = $cur_ep_airdate + #end if + #if $cur_ep_airdate == $today.date() and not $today_header: +

$datetime.date.fromordinal($cur_ep_airdate.toordinal).strftime("%A").decode($sickbeard.SYS_ENCODING).capitalize() [today]

+ #set $today_header = True + #end if + #if $cur_ep_enddate < $today: + #set $show_div = "ep_listing listing_overdue" + #elif $cur_ep_airdate >= $next_week.date(): + #set $show_div = "ep_listing listing_toofar" + #elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date(): + #if $cur_ep_airdate == $today.date(): + #set $show_div = "ep_listing listing_current" + #else: + #set $show_div = "ep_listing listing_default" + #end if + #end if + #elif $sort == "show": + #set $cur_ep_airdate = $cur_result["localtime"].date() + #set $cur_ep_enddate = $cur_result["localtime"] + datetime.timedelta(minutes=$cur_result["runtime"]) + #if $cur_ep_enddate < $today: + #set $show_div = "ep_listing listing_overdue" + #elif $cur_ep_airdate >= $next_week.date(): + #set $show_div = "ep_listing listing_toofar" + #elif $cur_ep_enddate >= $today and $cur_ep_airdate < $next_week.date(): + #if $cur_ep_airdate == $today.date(): + #set $show_div = "ep_listing listing_current" + #else: + #set $show_div = "ep_listing listing_default" + #end if + #end if + #end if + +
+
+ + + +#if $layout == 'banner': + + +#end if + + + + + +
+ +
+ + Next Episode: <%=str(cur_result["season"])+"x"+"%02i" % int(cur_result["episode"]) %> - $cur_result["name"] ($sbdatetime.sbdatetime.fromtimestamp($time.mktime($cur_result["localtime"].timetuple())).sbfdate().decode($sickbeard.SYS_ENCODING)) +
+ Airs: $sbdatetime.sbdatetime.fromtimestamp($time.mktime($cur_result["localtime"].timetuple())).sbftime().decode($sickbeard.SYS_ENCODING) on $cur_result["network"] +
+
+ Quality: + #if int($cur_result["quality"]) in $qualityPresets: + $qualityPresetStrings[int($cur_result["quality"])] + #else: + Custom + #end if +
+
+
+ #if $cur_result["description"] == '': + Plot: +
[There is no summary added for this episode]
+ #else: + Plot: +
$cur_result["description"]
+ #end if +
+
+
+
+ + + #end for + + + +#end if + + + +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config.tmpl b/gui/slick/interfaces/default/config.tmpl new file mode 100644 index 00000000..a99f525b --- /dev/null +++ b/gui/slick/interfaces/default/config.tmpl @@ -0,0 +1,36 @@ +#import sickbeard +#from sickbeard import db +#import os.path +#set global $title="Configuration" +#set global $header="Configuration" + +#set global $sbPath=".." + +#set global $topmenu="config"# +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if + + +
+ + + + + + + + + + + + + +
SB Version: alpha ($sickbeard.version.SICKBEARD_VERSION) +
SB Config file: $sickbeard.CONFIG_FILE
SB Database file: $db.dbFilename()
SB Cache Dir: $sickbeard.CACHE_DIR
SB Arguments: $sickbeard.MY_ARGS
SB Web Root: $sickbeard.WEB_ROOT
Python Version: $sys.version[:120]
Homepage http://www.sickbeard.com/
Forums http://sickbeard.com/forums/
Source https://github.com/echel0n/SickBeard-TVRage/
Bug Tracker &
Windows Builds
http://code.google.com/p/sickbeard/
Internet Relay Chat #sickbeard on irc.freenode.net
+
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config_general.tmpl b/gui/slick/interfaces/default/config_general.tmpl new file mode 100644 index 00000000..b5db2aef --- /dev/null +++ b/gui/slick/interfaces/default/config_general.tmpl @@ -0,0 +1,327 @@ +#import os.path +#import datetime +#import locale +#import sickbeard +#from sickbeard.common import * +#from sickbeard.sbdatetime import * +#from sickbeard import config +#from sickbeard import metadata +#from sickbeard.metadata.generic import GenericMetadata +#set global $title = "Config - General" +#set global $header = "General Configuration" + +#set global $sbPath="../.." + +#set global $topmenu="config"# +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if + + +
+
+ +
+
+ + + +
+ +
+

Misc

+

Startup options.

+

Some options may require a manual restart to take effect.

+
+ +
+
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+ +
+ + +
+
+ + +
+ +
+

Web Interface

+

It is recommended that you enable a username and password to secure Sick Beard from being tampered with remotely.

+

These options require a manual restart to take effect.

+
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+
+ + +
+ +
+ + +
+
+ + +
+
+ +
+ +
+

Advanced setting

+

Here you need to know what are you doing!!!

+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+ + +
+
+ +
+ + + +
+ +
+ + + +
+ + +
+
+ +
+ +
+

Date and Time

+
+ +
+ +
+ +
+ +
+ +
+ + +
+
+ +
+ All non-absolute folder locations are relative to $sickbeard.DATA_DIR + + +
+ +
+
+ +
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config_notifications.tmpl b/gui/slick/interfaces/default/config_notifications.tmpl new file mode 100644 index 00000000..6379a953 --- /dev/null +++ b/gui/slick/interfaces/default/config_notifications.tmpl @@ -0,0 +1,1304 @@ +#import sickbeard +#set global $title="Config - Notifications" +#set global $header="Notifications" + +#set global $sbPath="../.." + +#set global $topmenu="config"# +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +
+
+
+
+ + +
+
+ +
+

XBMC

+

A free and open source cross-platform media center and home entertainment system software with a 10-foot user interface designed for the living-room TV.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+ +
+ + +
+
+

Plex Media Server

+

Experience your media on a visually stunning, easy to use interface on your Mac connected to your TV. Your media library has never looked this good!

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ + +
+
+

NMJ

+

The Networked Media Jukebox, or NMJ, is the official media jukebox interface made available for the Popcorn Hour 200-series.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ +
+
+

NMJv2

+

The Networked Media Jukebox, or NMJv2, is the official media jukebox interface made available for the Popcorn Hour 300 & 400-series.

+
+
+
+ + +
+ +
+
+ + +
+
+ + + + + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ + +
+
+

Synology Indexer

+

Synology Indexer is the daemon running on the Synology NAS to build its media database.

+
+ +
+
+ + + +
+ +
+ +
+ +
+
+ + +
+
+

Synology Notifier

+

Synology Notifier is the notification system of Synology DSM

+
+ +
+
+ + + +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ + +
+
+

pyTivo

+

pyTivo is both an HMO and GoBack server. This notifier will load the completed downloads to your Tivo.

+
+
+
+ + + +
+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
+ +
+ + +
+
+
+

Growl

+

A cross-platform unobtrusive global notification system.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
Click below to register and test Growl, this is required for Growl notifications to work.
+ + +
+ +
+
+ + +
+
+

Prowl Prowl

+

A Growl client for iOS.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ + +
+
+

Libnotify

+

The standard desktop notification API for Linux/*nix systems. This notifier will only function if the pynotify module is installed (Ubuntu/Debian package python-notify).

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ + +
+
+

Pushover

+

Pushover makes it easy to send real-time notifications to your Android and iOS devices.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ +
+
+

Boxcar

+

Read your messages where and when you want them! A subscription will be send if needed.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ + +
+
+

Notify My Android

+

Notify My Android is a Prowl-like Android App and API that offers an easy way to send notifications from your application directly to your Android device.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ +
+
+

Pushalot

+

Pushalot is a platform for receiving custom push notifications to connected devices running Windows Phone or Windows 8.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ +
+
+

Pushbullet

+

Pushbullet is a platform for receiving custom push notifications to connected devices running Android and desktop Chrome browsers.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
Click below to test.
+ + +
+ +
+
+ +
+ +
+
+
+

Twitter

+

A social networking and microblogging service, enabling its users to send and read other users' messages called tweets.

+
+
+
+ + + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + +
+
+ +
+
Click below to test.
+ + +
+ +
+
+ + +
+
+

Trakt

+

trakt helps keep a record of what TV shows and movies you are watching. Based on your favorites, trakt recommends additional shows and movies you'll enjoy!

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+
Click below to test.
+ + +
+
+
+ +
+
+

Email

+

Allows configuration of email notifications on a per show basis.

+
+
+
+ + +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+ +
Click below to test.
+ + +
+
+
+ +
+ + +

+ +
+ +
+ +
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config_postProcessing.tmpl b/gui/slick/interfaces/default/config_postProcessing.tmpl new file mode 100644 index 00000000..92af7816 --- /dev/null +++ b/gui/slick/interfaces/default/config_postProcessing.tmpl @@ -0,0 +1,630 @@ +#import os.path +#import sickbeard +#from sickbeard.common import * +#from sickbeard import config +#from sickbeard import metadata +#from sickbeard.metadata.generic import GenericMetadata +#from sickbeard import naming + +#set global $title = "Config - Post Processing" +#set global $header = "Post Processing" + +#set global $sbPath="../.." + +#set global $topmenu="config"# +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +
+
+ +
+ +
+ + +
+ +
+

Post-Processing

+

Settings that dictate how Sick Beard should process completed downloads.

+
+ +
+
+ + + + +
+ +
+ + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + +
+ +
+ + + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ + + +
+ +
+ +
+
+ +
+
+ +
+ +
+

Metadata

+

The data associated to the data. These are files associated to a TV show in the form of images and text that, when supported, will enhance the viewing experience.

+
+ +
+
+ + Toggle the metadata options that you wish to be created. Multiple targets may be used. +
+ +
+
Create:
+
Results:
+
+
+ +#for ($cur_name, $cur_generator) in $m_dict.items(): +#set $cur_metadata_inst = $sickbeard.metadata_provider_dict[$cur_generator.name] +#set $cur_id = $cur_generator.get_id() +
+ + + +
+#end for + +

+ +
+ +
+
+ +
+ +
+

Episode Naming

+

How Sick Beard will name and sort your episodes.

+
+ +
+ +
+ +
+ +
+
+ +
+ + +
+ +
+ +
+ +
+

Sample:

+
+   +
+
+
+ +
+

Multi-EP sample:

+
+   +
+
+
+ +
+ + + +
+ +
+ + +
+ +
+
+ +
+ +
+
+ +
+ + +
+ +
+

Sample:

+
+   +
+
+
+ +
+ +
+
+ +
+
+ +
+ All non-absolute folder locations are relative to $sickbeard.DATA_DIR +
+ + +
+
+ + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config_providers.tmpl b/gui/slick/interfaces/default/config_providers.tmpl new file mode 100644 index 00000000..94722088 --- /dev/null +++ b/gui/slick/interfaces/default/config_providers.tmpl @@ -0,0 +1,513 @@ +#import sickbeard +#from sickbeard.providers.generic import GenericProvider +#from sickbeard.providers import thepiratebay +#set global $title="Config - Providers" +#set global $header="Search Providers" + +#set global $sbPath="../.." + +#set global $topmenu="config"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if + + +#if $sickbeard.USE_NZBS + +#end if + +#if $sickbeard.USE_TORRENTS + +#end if + +
+
+ +
+ +
+ + +
+ +
+

Provider Priorities

+

Check off, configure and drag the providers into the order you want them to be used.

+

At least one provider is required but two are recommended.

+ + #if not $sickbeard.USE_NZBS or not $sickbeard.USE_TORRENTS: +
NZB/Torrent providers can be toggled in Search Settings
+ #else: +
+ #end if + +
+

*

Provider does not support backlog searches at this time.

+

**

Provider supports limited backlog searches, all episodes/qualities may not be available.

+

!

Provider is NOT WORKING.

+
+
+ +
+
    + #for $curProvider in $sickbeard.providers.sortedProviderList(): + #if $curProvider.providerType == $GenericProvider.NZB and not $sickbeard.USE_NZBS: + #continue + #elif $curProvider.providerType == $GenericProvider.TORRENT and not $sickbeard.USE_TORRENTS: + #continue + #end if + #set $curName = $curProvider.getID() +
  • + + $curProvider.name + $curProvider.name + #if not $curProvider.supportsBacklog then "*" else ""# + #if $curProvider.name == "EZRSS" then "**" else ""# + +
  • + #end for +
+ "/> +

+
+
+ +
+ +
+

Configure Built-In
Providers

+

Check with provider's website on how to obtain an API key if needed.

+
+ +
+
+ +
+ + + +#for $curNewznabProvider in [$curProvider for $curProvider in $sickbeard.newznabProviderList if $curProvider.default and $curProvider.needs_auth]: +
+
+ +
+
+ +
+
+#end for + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+ Advanced Options +
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ + +
+ +
+ +
+ +
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+ +
+
+ +#if $sickbeard.USE_NZBS +
+ +
+

Configure Custom
Newznab Providers

+

Add and setup custom Newznab providers.

+

Some built-in Newznab providers are already available above.

+
+ +
+
+ +
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+
+#end if + +#if $sickbeard.USE_TORRENTS: + +
+ +
+

Configure Custom Torrent Providers

+

Add and setup custom RSS providers.

+

 

+
+ +
+
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+ +
+
+
+#end if + +

+ +
+ +
+
+
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config_search.tmpl b/gui/slick/interfaces/default/config_search.tmpl new file mode 100644 index 00000000..f1e9a9b4 --- /dev/null +++ b/gui/slick/interfaces/default/config_search.tmpl @@ -0,0 +1,455 @@ +#import sickbeard +#from sickbeard import clients +#set global $title="Config - Episode Search" +#set global $header="Search Options" + +#set global $sbPath="../.." + +#set global $topmenu="config"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +
+
+ +
+ +
+ + + +
+ +
+

Episode Search

+

Settings that dictate how and when episode searching works with Providers.

+
+ +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+
+ +
+
+ +
+ +
+

NZB Search

+

Settings that dictate how Sick Beard handles NZB search results.

+
+ +
+ +
+ + +
+ +
+
+ +
+ +
+
+ + +
+
+ +
+
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ +
Click below to test.
+ +
+ +
+ +
+
+ +
+ +
+

Torrent Search

+

Settings that dictate how Sick Beard handles Torrent search results.

+
+ +
+ +
+ + +
+ +
+
+ + +
+
+ + +
+ +
+
+
+
+ +
+
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ + + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
Click below to test.
+ +
+
+
+
+
+ + + +
+ All non-absolute folder locations are relative to $sickbeard.DATA_DIR +
+ + +
+ +
+ +
+
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/config_subtitles.tmpl b/gui/slick/interfaces/default/config_subtitles.tmpl new file mode 100644 index 00000000..4d407a21 --- /dev/null +++ b/gui/slick/interfaces/default/config_subtitles.tmpl @@ -0,0 +1,157 @@ +#from sickbeard import subtitles +#import sickbeard + +#set global $title="Config - Subtitles" +#set global $header="Subtitles" + +#set global $sbPath="../.." + +#set global $topmenu="config" +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + + + + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if + +
+
+ +
+ +
+ + +
+ +
+

Subtitles Search

+

Settings that dictate how Sick Beard handles subtitles search results.

+
+ +
+
+ + +
+
+
+ +
+
+ + + +
+
+ + +
+
+ + +
+

+
+
+
+ +
+ +
+

Subtitle Plugins

+

Check off and drag the plugins into the order you want them to be used.

+

At least one plugin is required.

+

* Web-scraping plugin

+
+ +
+
    + #for $curService in $sickbeard.subtitles.sortedServiceList(): + #set $curName = $curService.id +
  • + + + $curService.name + + $curService.name.capitalize() + #if not $curService.api_based then "*" else ""# + +
  • + #end for +
+ "/> + +

+
+
+ +

+ +
+ +
+
+
+ +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/displayShow.tmpl b/gui/slick/interfaces/default/displayShow.tmpl new file mode 100644 index 00000000..5d6a49a9 --- /dev/null +++ b/gui/slick/interfaces/default/displayShow.tmpl @@ -0,0 +1,314 @@ +#import sickbeard +#from sickbeard import subtitles, sbdatetime, network_timezones +#import sickbeard.helpers +#from sickbeard.common import * +#from lib import subliminal +#import os.path, os +#import datetime +#set global $title=$show.name +##set global $header = '' % +#set global $topmenu="manageShows"# +#set $exceptions_string = " | ".join($show.exceptions) +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + + +#if $show_message: +
$show_message

+#end if + + + + + + + + + + + +
+
+ +
+

$show.name

+ +#if not $show.imdbid + ($show.startyear) - $show.runtime min + #if $show.genre: + - $show.genre[1:-1].replace('|',' | ') + #end if + + [tvdb] + +#else + ($show.imdb_info['year']) - $show.imdb_info['runtimes'] min - $show.imdb_info['genres'].replace('|',' | ') + + [imdb] + [tvdb] + + +#end if + +#if $seasonResults: + ##There is a special/season_0?## + #if int($seasonResults[-1]["season"]) == 0: + #set $season_special = 1 + #else: + #set $season_special = 0 + #end if + + #if not $sickbeard.DISPLAY_SHOW_SPECIALS and $season_special: + $seasonResults.pop(-1) + #end if + +
+ + #if (len($seasonResults) > 14): + + #else: + Season: + #for $seasonNum in $seasonResults: + #if int($seasonNum["season"]) == 0: + Specials + #else: + ${str($seasonNum["season"])} + #end if + #if $seasonNum != $seasonResults[-1]: + | + #end if + #end for + #end if + + + + #if $season_special: + Display Specials: + #if sickbeard.DISPLAY_SHOW_SPECIALS: + Hide + #else: + Show + #end if + #end if + +
+#end if +
+ + + + +
+ +#if $show.network and $show.airs: + +#else if $show.network: + +#else if $show.airs: + +#end if + +#if $showLoc[1]: + +#else: + +#end if +#set $anyQualities, $bestQualities = $Quality.splitQuality(int($show.quality)) + + +
Originally Airs: $show.airs #if not $network_timezones.test_timeformat($show.airs) then " (invalid Timeformat) " else ""# on $show.network
Originally Airs: $show.network
Originally Airs: >$show.airs #if not $network_timezones.test_timeformat($show.airs) then " (invalid Timeformat) " else ""#
Status: $show.status
Location: $showLoc[0]
Location: $showLoc[0] (dir is missing)
Quality: +#if $show.quality in $qualityPresets: +$qualityPresetStrings[$show.quality] +#else: +#if $anyQualities: +Initial: <%=", ".join([Quality.qualityStrings[x] for x in sorted(anyQualities)])%> #if $bestQualities then "
" else ""# +#end if +#if $bestQualities: +Replace with: <%=", ".join([Quality.qualityStrings[x] for x in sorted(bestQualities)])%> +#end if +#end if + +
Scene Name:#if $show.exceptions then $exceptions_string else $show.name#
+
+ + +#if $sickbeard.USE_SUBTITLES + +#end if + + + +#if $all_scene_exceptions: + + + + +#end if +
Info Language:$show.lang
Subtitles: \"Y"
Flat Folders: \"Y"
Paused: \"Y"
Air-by-Date: \"Y"
Alternate Scene Names: + #for $one_exception in sorted($all_scene_exceptions) + $one_exception
+ #end for +
+
+
+
+ + +#set $curSeason = -1 +#set $odd = 0 + +
+ +
+ Change selected episodes to + + + +
+ +
+
+ + + + +
+ +
+
+ + + +#for $epResult in $sqlResults: + #if not $sickbeard.DISPLAY_SHOW_SPECIALS and int($epResult["season"]) == 0: + #continue + #end if + + #if int($epResult["season"]) != $curSeason: + + + + + #if $sickbeard.USE_SUBTITLES and $show.subtitles then "" else ""# + #set $curSeason = int($epResult["season"]) + #end if + + #set $epStr = str($epResult["season"]) + "x" + str($epResult["episode"]) + #set $epLoc = $epResult["location"] + + + + + + + + + +#if $sickbeard.USE_SUBTITLES and $show.subtitles: + +#end if +#set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($epResult["status"])) +#if $curQuality != Quality.NONE: + +#else: + +#end if + + + +#end for +
+

#if int($epResult["season"]) == 0 then "Specials" else "Season "+str($epResult["season"])#

+
NFOTBNEpisodeScene #NameAirdateFilenameSubtitlesStatusSearch
+#if int($epResult["status"]) != $UNAIRED + " name="<%=str(epResult["season"]) +"x"+str(epResult["episode"]) %>" /> +#end if + \"Y"\"Y"$epResult["episode"] + #if int($show.air_by_date) != 1 + #if (epResult["season"], epResult["episode"]) in $xem_numbering: + #set ($dfltSeas, $dfltEpis) = $xem_numbering[(epResult["season"], epResult["episode"])] + #else + #set ($dfltSeas, $dfltEpis) = (epResult["season"], epResult["episode"]) + #end if + #if (epResult["season"], epResult["episode"]) in $scene_numbering: + #set ($scSeas, $scEpis) = $scene_numbering[(epResult["season"], epResult["episode"])] + #set $dfltEpNumbering = False + #else + #set ($scSeas, $scEpis) = ($dfltSeas, $dfltEpis) + #set $dfltEpNumbering = True + #end if + " + title="Change the value here if scene numbering differs from tvdb episode numbering" + #if $dfltEpNumbering: + value="" + #else + value="<%=str(scSeas) + 'x' + str(scEpis)%>" + #end if + style="padding: 0; text-align: center; max-width: 60px;" + /> + #else + N/A + #end if + + #if $epResult["description"] != "" and $epResult["description"] != None: + " /> + #end if + $epResult["name"] +#if int($epResult["airdate"]) == 1 then "never" else $sbdatetime.sbdatetime.sbfdate($network_timezones.parse_date_time($epResult["airdate"],$show.airs,$show.network))# +#if $epLoc and $show._location and $epLoc.lower().startswith($show._location.lower()): + #set $epLoc = os.path.basename($epLoc[len($show._location)+1:]) +#elif $epLoc and (not $epLoc.lower().startswith($show._location.lower()) or not $show._location): + #set $epLoc = os.path.basename($epLoc) +#end if +$epLoc + + + #if $epResult["subtitles"]: + #for $sub_lang in subliminal.language.language_list($epResult["subtitles"].split(',')): + #if sub_lang.alpha2 != "" + ${sub_lang} + #end if + #end for + #end if + $statusStrings[$curStatus] $Quality.qualityStrings[$curQuality]$statusStrings[$curStatus]
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/editShow.tmpl b/gui/slick/interfaces/default/editShow.tmpl new file mode 100644 index 00000000..1062f9a4 --- /dev/null +++ b/gui/slick/interfaces/default/editShow.tmpl @@ -0,0 +1,180 @@ +#import sickbeard +#from sickbeard import common +#from sickbeard import exceptions +#from sickbeard import scene_exceptions +#set global $title="Edit " + $show.name +#set global $header=$show.name + +#set global $sbPath=".." + +#set global $topmenu="home" +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + +#if $varExists('header') +

$header

+#else +

$title

+#end if + + + + + +
+ +Location:
+
+Quality: +#set $qualities = $common.Quality.splitQuality(int($show.quality)) +#set global $anyQualities = $qualities[0] +#set global $bestQualities = $qualities[1] +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_qualityChooser.tmpl") +
+ +Scene Exception: + +
+ +
+ +
+

This will affect the episode show search on nzb and torrent provider.
+ This list overrides the original name, it doesn't append to it.
+

+
+ +
+

Exceptions List

+ +
+ +
+
+
+
+
+
+ +Info Language:
+Note: This will only affect the language of the retrieved metadata file contents and episode filenames.
+This DOES NOT allow Sick Beard to download non-english TV episodes!
+
+ +Flatten files (no folders):

+Paused:

+Subtitles:

+ +Air by date: +
+(check this if the show is released as Show.03.02.2010 rather than Show.S02E03) +

+DVD Order: +
+(check this if you wish to use the DVD order instead of the Airing order) +

+ +
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/errorlogs.tmpl b/gui/slick/interfaces/default/errorlogs.tmpl new file mode 100644 index 00000000..08b21c22 --- /dev/null +++ b/gui/slick/interfaces/default/errorlogs.tmpl @@ -0,0 +1,32 @@ +#import sickbeard +#from sickbeard import classes +#from sickbeard.common import * +#set global $header="Logs & Errors" +#set global $title="Logs & Errors" + +#set global $sbPath = ".." + +#set global $topmenu="errorlogs"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if +
+#if $classes.ErrorViewer.errors:
+#for $curError in sorted($classes.ErrorViewer.errors, key=lambda error: error.time, reverse=True)[:500]:
+$curError.time $curError.message
+#end for
+#end if
+
+
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/genericMessage.tmpl b/gui/slick/interfaces/default/genericMessage.tmpl new file mode 100644 index 00000000..f62d0809 --- /dev/null +++ b/gui/slick/interfaces/default/genericMessage.tmpl @@ -0,0 +1,14 @@ +#import sickbeard +#set global $title="" + +#set global $sbPath="../.." + + +#set global $topmenu="home"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + +

$subject

+$message + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/history.tmpl b/gui/slick/interfaces/default/history.tmpl new file mode 100644 index 00000000..7b0212c3 --- /dev/null +++ b/gui/slick/interfaces/default/history.tmpl @@ -0,0 +1,216 @@ +#import sickbeard +#import os.path +#import datetime +#import re +#from sickbeard import history +#from sickbeard import providers +#from sickbeard import sbdatetime +#from sickbeard.providers import generic +#from sickbeard.common import * +#set global $title="History" +#set global $header="History" +#set global $sbPath=".." +#set global $topmenu="history"# +#set $layout = $sickbeard.HISTORY_LAYOUT + +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +
Limit: + +
+ +
+ Layout: + Compact · + Detailed + +
+ +#if $layout == "detailed" + + + + #for $hItem in $historyResults: + #set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($hItem["action"])) + + #set $curdatetime = $datetime.datetime.strptime(str($hItem["date"]), $history.dateFormat) + + + + + $curQuality + + + #end for + +
TimeEpisodeActionProviderQuality
$sbdatetime.sbdatetime.sbfdatetime($curdatetime, show_seconds=True)$time.mktime($curdatetime.timetuple())$hItem["show_name"] - <%=str(hItem["season"]) +"x"+ "%02i" % int(hItem["episode"]) %>#if "proper" in $hItem["resource"].lower or "repack" in $hItem["resource"].lower then ' Proper' else ""#$statusStrings[$curStatus] + #if $curStatus == SUBTITLED: + "> + #end if + + #if $curStatus == DOWNLOADED: + #set $match = $re.search("\-(\w+)\.\w{3}\Z", $os.path.basename($hItem["resource"])) + #if $match + #if $match.group(1).upper() in ("X264", "720P"): + #set $match = $re.search("(\w+)\-.*\-"+$match.group(1)+"\.\w{3}\Z", $os.path.basename($hItem["resource"]), re.IGNORECASE) + #if $match + $match.group(1).upper() + #end if + #else: + $match.group(1).upper() + #end if + #end if + #else + #if $hItem["provider"] > 0 + #if $curStatus in [SNATCHED, FAILED]: + #set $provider = $providers.getProviderClass($generic.GenericProvider.makeID($hItem["provider"])) + #if $provider != None: + $provider.name + #else: + missing provider + #end if + #else: + " width="16" height="16" alt="$hItem["provider"]" title="<%=hItem["provider"].capitalize()%>"/> + #end if + #end if + #end if + $Quality.qualityStrings[$curQuality]
+ +#else: + + + #if sickbeard.USE_SUBTITLES then "" else ""# + + #for $hItem in $compactResults: + + #set $curdatetime = $datetime.datetime.strptime(str($hItem["actions"][0]["time"]), $history.dateFormat) + + + + + #if sickbeard.USE_SUBTITLES: + + #end if + + + #end for + +
TimeEpisodeSnatchedDownloadedSubtitledQuality
$sbdatetime.sbdatetime.sbfdatetime($curdatetime, show_seconds=True)$time.mktime($curdatetime.timetuple()) + $hItem["show_name"] + +
+ "/> +
+
<%=str(hItem["season"])%>
x
<%= "%02i" % int(hItem["episode"])%>
+
+
"> + #for $action in sorted($hItem["actions"]): + #set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($action["action"])) + #if $curStatus in [SNATCHED, FAILED]: + #set $provider = $providers.getProviderClass($generic.GenericProvider.makeID($action["provider"])) + #if $provider != None: + $provider.name + #else: + missing provider + #end if + #end if + #end for + + #for $action in sorted($hItem["actions"]): + #set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($action["action"])) + #if $curStatus == DOWNLOADED: + #set $match = $re.search("\-(\w+)\.\w{3}\Z", $os.path.basename($action["resource"])) + #if $match + #if $match.group(1).upper() in ("X264", "720P"): + #set $match = $re.search("(\w+)\-.*\-"+$match.group(1)+"\.\w{3}\Z", $os.path.basename($hItem["resource"]), re.IGNORECASE) + #if $match + + $match.group(1).upper() + + #end if + #else: + + $match.group(1).upper() + + #end if + #end if + #end if + #end for + + #for $action in sorted($hItem["actions"]): + #set $curStatus, $curQuality = $Quality.splitCompositeStatus(int($action["action"])) + #if $curStatus == SUBTITLED: + " width="16" height="16" alt="$action["provider"]" title="<%=action["provider"].capitalize()%>: $os.path.basename($action["resource"])"/> + / + " style="vertical-align: middle !important;"> +   + #end if + #end for + $Quality.qualityStrings[$curQuality]
+ +#end if + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/home.tmpl b/gui/slick/interfaces/default/home.tmpl new file mode 100644 index 00000000..b56df031 --- /dev/null +++ b/gui/slick/interfaces/default/home.tmpl @@ -0,0 +1,270 @@ +#import sickbeard +#import datetime +#from sickbeard.common import * +#from sickbeard import db, sbdatetime, network_timezones + +#set global $title="Home" +#set global $header="Show List" + +#set global $sbPath = ".." + +#set global $topmenu="home"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + +#set $myDB = $db.DBConnection() +#set $today = str($datetime.date.today().toordinal()) +#set $downloadedEps = $myDB.select("SELECT showid, COUNT(*) FROM tv_episodes WHERE (status IN ("+",".join([str(x) for x in $Quality.DOWNLOADED + [$ARCHIVED]])+") OR (status IN ("+",".join([str(x) for x in $Quality.SNATCHED + $Quality.SNATCHED_PROPER])+") AND location != '')) AND season != 0 and episode != 0 AND airdate <= "+$today+" GROUP BY showid") +#set $allEps = $myDB.select("SELECT showid, COUNT(*) FROM tv_episodes WHERE season != 0 and episode != 0 AND (airdate != 1 OR status IN ("+",".join([str(x) for x in ($Quality.DOWNLOADED + $Quality.SNATCHED + $Quality.SNATCHED_PROPER) + [$ARCHIVED]])+")) AND airdate <= "+$today+" AND status != "+str($IGNORED)+" GROUP BY showid") +#set $layout = $sickbeard.HOME_LAYOUT + + + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if + +
+ Layout: + Poster · + Banner · + Simple + +
+ + + + #if $layout=="poster" then "" else ""# + + + + + + + + +#for $curLoadingShow in $sickbeard.showQueueScheduler.action.loadingShowList: + + #if $curLoadingShow.show != None and $curLoadingShow.show in $sickbeard.showList: + #continue + #end if + + + + + + + + + + + +#end for + +#set $myShowList = $list($sickbeard.showList) +$myShowList.sort(lambda x, y: cmp(x.name, y.name)) +#for $curShow in $myShowList: +#set $curEp = $curShow.nextEpisode() + +#set $curShowDownloads = [x[1] for x in $downloadedEps if int(x[0]) == $curShow.indexerid] +#set $curShowAll = [x[1] for x in $allEps if int(x[0]) == $curShow.indexerid] +#if len($curShowAll) != 0: + #if len($curShowDownloads) != 0: + #set $dlStat = str($curShowDownloads[0])+" / "+str($curShowAll[0]) + #set $nom = $curShowDownloads[0] + #set $den = $curShowAll[0] + #else + #set $dlStat = "0 / "+str($curShowAll[0]) + #set $nom = 0 + #set $den = $curShowAll[0] + #end if +#else + #set $dlStat = "0" + #set $nom = 0 + #set $den = 1 +#end if + +#set $which_thumb = $layout+"_thumb" + + + #if len($curEp) != 0: + #set $ldatetime = $network_timezones.parse_date_time($curEp[0].airdate.toordinal(),$curShow.airs,$curShow.network) + + #else: + + #end if + #if $layout == 'poster': + + + #else if $layout == 'banner': + + #else if $layout == 'simple': + + #end if + + + +#if $curShow.quality in $qualityPresets: + +#else: + +#end if + + + + + + +#end for + +
Next EpPosterShowNetworkQualityDownloadsActiveStatus
  Add Show
(loading) + #if $curLoadingShow.show == None: + Loading... ($curLoadingShow.show_name) + #else: + $curLoadingShow.show.name + #end if +
$sbdatetime.sbdatetime.sbfdate($ldatetime)$time.mktime($ldatetime.timetuple()) +
+ + $curShow.indexerid + +
+
$curShow.name + + $curShow.name + + + $curShow.name + #if $layout != 'simple': + #if $curShow.network: + $curShow.network + #else: + No Network + #end if + #else: + $curShow.network + #end if + $qualityPresetStrings[$curShow.quality]Custom$dlStat
+ +
\"Y\""$curShow.status
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/home_addExistingShow.tmpl b/gui/slick/interfaces/default/home_addExistingShow.tmpl new file mode 100644 index 00000000..35719ed4 --- /dev/null +++ b/gui/slick/interfaces/default/home_addExistingShow.tmpl @@ -0,0 +1,67 @@ +#import os.path +#import sickbeard +#from sickbeard.common import * +#set global $title="Existing Show" +#set global $header="Existing Show" + +#set global $sbPath="../.." + +#set global $statpath="../.."# +#set global $topmenu="home"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + +
+ + + + + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if + +
+ +
+ #include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_rootDirs.tmpl") +
+
+ #include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_addShowOptions.tmpl") +
+
+
+ +

Sick Beard can add existing shows, using the current options, by using locally stored NFO/XML metadata to eliminate user interaction.
+If you would rather have Sick Beard prompt you to customize each show, then use the checkbox below.

+
+

+
+
+
+

Displaying folders within these directories which aren't already added to Sick Beard:

+
+
+ +
+
+
+ +
+#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/home_addShows.tmpl b/gui/slick/interfaces/default/home_addShows.tmpl new file mode 100644 index 00000000..61be06da --- /dev/null +++ b/gui/slick/interfaces/default/home_addShows.tmpl @@ -0,0 +1,42 @@ +#import os.path +#import urllib +#import sickbeard +#set global $title="Add Show" +#set global $header="Add Show" + +#set global $sbPath="../.." + +#set global $statpath="../.."# +#set global $topmenu="home"# +#import os.path + +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if + + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/home_massAddTable.tmpl b/gui/slick/interfaces/default/home_massAddTable.tmpl new file mode 100644 index 00000000..d6713a6c --- /dev/null +++ b/gui/slick/interfaces/default/home_massAddTable.tmpl @@ -0,0 +1,48 @@ +#import sickbeard +#from sickbeard.common import indexerStrings + +#set $rowidx = 0 + + + + + + + + +#for $curDir in $dirList: +#if $curDir['added_already']: +#continue +#end if + +#set $show_id = $curDir['dir'] +#set $indexer = 'Tvdb' +#if $curDir['existing_info'][0]: +#set $show_id = $show_id + '|' + $str($curDir['existing_info'][0]) + '|' + str($curDir['existing_info'][1]) +#set $indexer = $str($curDir['existing_info'][2]) +#end if + +#set $rowidx = $rowidx + 1 + + + + + #if 'Tvdb' in $indexer + + #elif 'TVRage' in $indexer + + #else + + #end if + + +#end for + + +
DirectoryShow Name (tvshow.nfo)Indexer
Manage Directories
#if $curDir['existing_info'][0] and $curDir['existing_info'][1] then ''+$curDir['existing_info'][1]+'' else "?"##if $curDir['existing_info'][1] then ''+$curDir['existing_info'][1]+'' else "?"#$curDir['existing_info'][1] + +
diff --git a/gui/slick/interfaces/default/home_newShow.tmpl b/gui/slick/interfaces/default/home_newShow.tmpl new file mode 100644 index 00000000..a3395a8a --- /dev/null +++ b/gui/slick/interfaces/default/home_newShow.tmpl @@ -0,0 +1,91 @@ +#import os.path +#import sickbeard +#set global $header="New Show" +#set global $title="New Show" + +#set global $sbPath="../.." + +#set global $statpath="../.."# +#set global $topmenu="home"# +#import os.path + +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + + + + + #if $varExists('header') +

$header

+ #else +

$title

+ #end if +
aoeu
+
+ +
+ +
+ Find a show on the TVDB + +
+ #if $use_provided_info: + Show retrieved from existing metadata: $provided_indexer_name + + + + #else: + + * +

+ + * This will only affect the language of the retrieved metadata file contents and episode filenames.
+ This DOES NOT allow Sick Beard to download non-english TV episodes!
+
+

+ #end if + +
+
+ +
+ Pick the parent folder + +
+ #if $provided_show_dir: + Pre-chosen Destination Folder: $provided_show_dir
+
+ #else + #include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_rootDirs.tmpl") + #end if +
+
+ +
+ Customize options +
+ #include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_addShowOptions.tmpl") +
+
+ +#for $curNextDir in $other_shows: + +#end for + +
+ +
+ +
+ +#if $provided_show_dir: + +#end if +
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/home_postprocess.tmpl b/gui/slick/interfaces/default/home_postprocess.tmpl new file mode 100644 index 00000000..8f9ca7f7 --- /dev/null +++ b/gui/slick/interfaces/default/home_postprocess.tmpl @@ -0,0 +1,49 @@ +#import sickbeard +#set global $header="Post Processing" +#set global $title="Post Processing" + +#set global $sbPath="../.." + +#set global $topmenu="home"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if +
+ +Enter the folder containing the episode:
+Process Method to be used:                      +
+Force already Post Processed Dir/Files:  
+Mark Dir/Files as priority download:           +(Check it to replace the file even if it exists at higher quality)
+#if $sickbeard.USE_FAILED_DOWNLOADS: + +Mark download as failed:                            +
+#end if +
+ +
+ + + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/inc_addShowOptions.tmpl b/gui/slick/interfaces/default/inc_addShowOptions.tmpl new file mode 100644 index 00000000..055fa2e0 --- /dev/null +++ b/gui/slick/interfaces/default/inc_addShowOptions.tmpl @@ -0,0 +1,46 @@ +#import sickbeard +#from sickbeard.common import * +#from sickbeard import subtitles + + #if $sickbeard.USE_SUBTITLES: +
+ + +
+ #end if + +
+ +
+ +
+ + +
+ + #set $qualities = $Quality.splitQuality($sickbeard.QUALITY_DEFAULT) + #set global $anyQualities = $qualities[0] + #set global $bestQualities = $qualities[1] + #include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_qualityChooser.tmpl") + +
+ +
diff --git a/gui/slick/interfaces/default/inc_bottom.tmpl b/gui/slick/interfaces/default/inc_bottom.tmpl new file mode 100644 index 00000000..02ee0e8b --- /dev/null +++ b/gui/slick/interfaces/default/inc_bottom.tmpl @@ -0,0 +1,31 @@ +#import sickbeard +#import datetime +#from sickbeard import db, sbdatetime +#from sickbeard.common import * +
+
+ + + diff --git a/gui/slick/interfaces/default/inc_qualityChooser.tmpl b/gui/slick/interfaces/default/inc_qualityChooser.tmpl new file mode 100644 index 00000000..6a0e91e6 --- /dev/null +++ b/gui/slick/interfaces/default/inc_qualityChooser.tmpl @@ -0,0 +1,47 @@ +#import sickbeard +#from sickbeard.common import Quality, qualityPresets, qualityPresetStrings + +
+ +
+ +
+
+
+

One of the Initial quality selections must be obtained before Sick Beard will attempt to process the Archive selections.

+
+ +
+

Initial

+ #set $anyQualityList = filter(lambda x: x > $Quality.NONE, $Quality.qualityStrings) + +
+ +
+

Archive

+ #set $bestQualityList = filter(lambda x: x > $Quality.SDTV and x < $Quality.UNKNOWN, $Quality.qualityStrings) + +
+
+
diff --git a/gui/slick/interfaces/default/inc_rootDirs.tmpl b/gui/slick/interfaces/default/inc_rootDirs.tmpl new file mode 100644 index 00000000..fcd2ed5c --- /dev/null +++ b/gui/slick/interfaces/default/inc_rootDirs.tmpl @@ -0,0 +1,28 @@ +#import sickbeard + + +#if $sickbeard.ROOT_DIRS: +#set $backend_pieces = $sickbeard.ROOT_DIRS.split('|') +#set $backend_default = 'rd-' + $backend_pieces[0] +#set $backend_dirs = $backend_pieces[1:] +#else: +#set $backend_default = '' +#set $backend_dirs = [] +#end if + + +
+ +
+
+ + + + +
+ +
diff --git a/gui/slick/interfaces/default/inc_top.tmpl b/gui/slick/interfaces/default/inc_top.tmpl new file mode 100644 index 00000000..7096d723 --- /dev/null +++ b/gui/slick/interfaces/default/inc_top.tmpl @@ -0,0 +1,298 @@ +#import sickbeard.version +#import sickbeard +#import urllib + + + + + + + + + Sick Beard - alpha $sickbeard.version.SICKBEARD_VERSION - $title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#if $sickbeard.NEWEST_VERSION_STRING: +
+
+ $sickbeard.NEWEST_VERSION_STRING +
+
+
+#end if + + +
+
+ #if $varExists('submenu'): + + #end if diff --git a/gui/slick/interfaces/default/manage.tmpl b/gui/slick/interfaces/default/manage.tmpl new file mode 100644 index 00000000..a4837151 --- /dev/null +++ b/gui/slick/interfaces/default/manage.tmpl @@ -0,0 +1,163 @@ +#import sickbeard +#from sickbeard.common import * +#set global $title="Mass Update" +#set global $header="Mass Update" + +#set global $sbPath="../.." + +#set global $topmenu="manage" +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +
+ + + + + + + + + + + + + + +#if $sickbeard.USE_SUBTITLES: + +#end if + + + + + + + + + + + +#set $myShowList = $sickbeard.showList +$myShowList.sort(lambda x, y: cmp(x.name, y.name)) +#for $curShow in $myShowList: +#set $curEp = $curShow.nextEpisode() +#set $curUpdate_disabled = "" +#set $curRefresh_disabled = "" +#set $curRename_disabled = "" +#set $curSubtitle_disabled = "" +#set $curDelete_disabled = "" + +#if $sickbeard.showQueueScheduler.action.isBeingUpdated($curShow) or $sickbeard.showQueueScheduler.action.isInUpdateQueue($curShow): + #set $curUpdate_disabled = "disabled=\"disabled\" " +#end if +#set $curUpdate = "" +#if $sickbeard.showQueueScheduler.action.isBeingRefreshed($curShow) or $sickbeard.showQueueScheduler.action.isInRefreshQueue($curShow): + #set $curRefresh_disabled = "disabled=\"disabled\" " +#end if +#set $curRefresh = "" +#if $sickbeard.showQueueScheduler.action.isBeingRenamed($curShow) or $sickbeard.showQueueScheduler.action.isInRenameQueue($curShow): + #set $curRename = "disabled=\"disabled\" " +#end if +#set $curRename = "" +#if not $curShow.subtitles or $sickbeard.showQueueScheduler.action.isBeingSubtitled($curShow) or $sickbeard.showQueueScheduler.action.isInSubtitleQueue($curShow): + #set $curSubtitle_disabled = "disabled=\"disabled\" " +#end if +#set $curSubtitle = "" +#if $sickbeard.showQueueScheduler.action.isBeingRenamed($curShow) or $sickbeard.showQueueScheduler.action.isInRenameQueue($curShow) or $sickbeard.showQueueScheduler.action.isInRefreshQueue($curShow): + #set $curDelete = "disabled=\"disabled\" " +#end if +#set $curDelete = "" + + + + + +#if $curShow.quality in $qualityPresets: + +#else: + +#end if + + + + + + +#if $sickbeard.USE_SUBTITLES: + +#end if + + + +#end for + +
Edit
+ +
Show NameQualityFlat FoldersPausedStatusUpdate
Rescan
Rename
Subtitle
Delete
$curShow.name$qualityPresetStrings[$curShow.quality]Custom\"Y\""\"Y\""$curShow.status$curUpdate$curRefresh$curRename$curSubtitle$curDelete
+ +
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/manage_backlogOverview.tmpl b/gui/slick/interfaces/default/manage_backlogOverview.tmpl new file mode 100644 index 00000000..5a2cf395 --- /dev/null +++ b/gui/slick/interfaces/default/manage_backlogOverview.tmpl @@ -0,0 +1,97 @@ +#import sickbeard +#import datetime +#from sickbeard.common import * +#from sickbeard import sbdatetime, network_timezones +#set global $title="Backlog Overview" +#set global $header="Backlog Overview" + +#set global $sbPath=".." + +#set global $topmenu="manage"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +#set $totalWanted = 0 +#set $totalQual = 0 + +#for $curShow in $sickbeard.showList: +#set $totalWanted = $totalWanted + $showCounts[$curShow.indexerid][$Overview.WANTED] +#set $totalQual = $totalQual + $showCounts[$curShow.indexerid][$Overview.QUAL] +#end for + +
+ Wanted: $totalWanted + Low Quality: $totalQual +

+ +
+Jump to Show + +
+ + + +#for $curShow in sorted($sickbeard.showList, key=operator.attrgetter('name')): + +#if $showCounts[$curShow.indexerid][$Overview.QUAL]+$showCounts[$curShow.indexerid][$Overview.WANTED] == 0: +#continue +#end if + + + + + + + +#for $curResult in $showSQLResults[$curShow.indexerid]: +#set $whichStr = $str($curResult["season"]) + "x" + $str($curResult["episode"]) +#set $overview = $showCats[$curShow.indexerid][$whichStr] +#if $overview not in ($Overview.QUAL, $Overview.WANTED): +#continue +#end if + + + + + + +#end for + +#end for + + +
+

$curShow.name

+
+ Wanted: $showCounts[$curShow.indexerid][$Overview.WANTED] + Low Quality: $showCounts[$curShow.indexerid][$Overview.QUAL] + Force Backlog +
+
EpisodeNameAirdate
$whichStr$curResult["name"]#if int($curResult["airdate"]) == 1 then "never" else $sbdatetime.sbdatetime.sbfdate($network_timezones.parse_date_time($curResult["airdate"],$curShow.airs,$curShow.network))#
+ +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/manage_episodeStatuses.tmpl b/gui/slick/interfaces/default/manage_episodeStatuses.tmpl new file mode 100644 index 00000000..8bcb9f02 --- /dev/null +++ b/gui/slick/interfaces/default/manage_episodeStatuses.tmpl @@ -0,0 +1,86 @@ +#import sickbeard +#import datetime +#from sickbeard import common +#set global $title="Episode Overview" +#set global $header="Episode Overview" + +#set global $sbPath=".." + +#set global $topmenu="manage"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if + +#if not $whichStatus or ($whichStatus and not $ep_counts): + +#if $whichStatus: +

None of your episodes have status $common.statusStrings[$int($whichStatus)]

+
+#end if + +
+Manage episodes with status + +
+ +#else + + + +
+ + +

Shows containing $common.statusStrings[$int($whichStatus)] episodes

+ +
+ +#if $whichStatus in ($common.ARCHIVED, $common.IGNORED, $common.SNATCHED): +#set $row_class = "good" +#else +#set $row_class = $common.Overview.overviewStrings[$whichStatus] +#end if + + +Set checked shows/episodes to + + + +
+ + +#for $cur_indexer_id in $sorted_show_ids: + + + + +#end for +
$show_names[$cur_indexer_id] ($ep_counts[$cur_indexer_id])
+
+ +#end if + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/manage_failedDownloads.tmpl b/gui/slick/interfaces/default/manage_failedDownloads.tmpl new file mode 100644 index 00000000..e94b5dd5 --- /dev/null +++ b/gui/slick/interfaces/default/manage_failedDownloads.tmpl @@ -0,0 +1,91 @@ +#import sickbeard +#import os.path +#import datetime +#import re +#from sickbeard import providers +#from sickbeard.providers import generic +#from sickbeard.common import * +#set global $header="Failed Downloads" +#set global $title="Failed Downloads" + +#set global $sbPath=".." + +#set global $topmenu="manage"# +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + + +#if $varExists('header') +

$header

+#else +

$title

+#end if + +
Limit: + +
+ + + + + + + + + + + + + + + + +#for $hItem in $failedResults: +#set $curRemove = "" + + + + + + +#end for + +
ReleaseSizeProviderRemove
+ +
$hItem["release"] + #if $hItem["size"] != -1 + $hItem["size"] + #else + ? + #end if + + #set $provider = $providers.getProviderClass($generic.GenericProvider.makeID($hItem["provider"])) + #if $provider != None: + $provider.name + #else: + missing provider + #end if + $curRemove
+ +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_bottom.tmpl") \ No newline at end of file diff --git a/gui/slick/interfaces/default/manage_manageSearches.tmpl b/gui/slick/interfaces/default/manage_manageSearches.tmpl new file mode 100644 index 00000000..cc0420f0 --- /dev/null +++ b/gui/slick/interfaces/default/manage_manageSearches.tmpl @@ -0,0 +1,42 @@ +#import sickbeard +#import datetime +#from sickbeard.common import * +#set global $title="Manage Searches" +#set global $header="Manage Searches" +#set global $sbPath=".." + +#set global $topmenu="manage"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + #if $varExists('header') +

$header

+ #else +

$title

+ #end if + +

Backlog Search:

+ #if $backlogPaused then "Unpause" else "Pause"# +#if not $backlogRunning: +Not in progress
+#else: +#if $backlogPaused then "Paused: " else ""# +Currently running
+#end if + +
+

Daily Episode Search:

+ Force +#if not $searchStatus: +Not in progress
+#else: +In Progress
+#end if +
+ +

Version Check:

+ Force Check +
+ +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/manage_massEdit.tmpl b/gui/slick/interfaces/default/manage_massEdit.tmpl new file mode 100644 index 00000000..9f443295 --- /dev/null +++ b/gui/slick/interfaces/default/manage_massEdit.tmpl @@ -0,0 +1,125 @@ +#import sickbeard +#from sickbeard import common +#from sickbeard import exceptions +#set global $title="Mass Edit" +#set global $header="Mass Edit" + +#set global $sbPath=".." + +#set global $topmenu="manage"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $quality_value != None: +#set $initial_quality = int($quality_value) +#else: +#set $initial_quality = $common.SD +#end if +#set $anyQualities, $bestQualities = $common.Quality.splitQuality($initial_quality) + + + +
+ + +
+Root Directories *
+ #for $cur_dir in $root_dir_list: + #set $cur_index = $root_dir_list.index($cur_dir) +
+ + $cur_dir => $cur_dir +
+ + + #end for + +
+ +
+Quality +
+ +

+ +
+
+

Inital

+ #set $anyQualityList = filter(lambda x: x > $common.Quality.NONE, $common.Quality.qualityStrings) + +
+
+

Archive

+ #set $bestQualityList = filter(lambda x: x > $common.Quality.SDTV, $common.Quality.qualityStrings) + +
+
+
+
+ +
+Flatten Folders * +
+ +
+
+ +
+ Paused +
+ +

+
+ +
+Subtitles +
+ +

+
+ +
+
* + Changing these settings will cause the selected shows to be refreshed. +
+ +
+
+
+ +
+
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/manage_subtitleMissed.tmpl b/gui/slick/interfaces/default/manage_subtitleMissed.tmpl new file mode 100644 index 00000000..72940ff8 --- /dev/null +++ b/gui/slick/interfaces/default/manage_subtitleMissed.tmpl @@ -0,0 +1,65 @@ +#import sickbeard +#from lib import subliminal +#import datetime +#from sickbeard import common +#set global $title="Episode Overview" +#set global $header="Episode Overview" + +#set global $sbPath=".." + +#set global $topmenu="manage"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") +#if $varExists('header') +

$header

+#else +

$title

+#end if +#if $whichSubs: +#set subsLanguage = $subliminal.language.Language($whichSubs) if not $whichSubs == 'all' else 'All' +#end if +#if not $whichSubs or ($whichSubs and not $ep_counts): + +#if $whichSubs: +

All of your episodes have $subsLanguage subtitles.

+
+#end if + +
+Manage episodes without +subtitles + +
+ +#else + + + + +
+

Episodes without $subsLanguage subtitles.

+
+Download missed subtitles for selected episodes + +
+ +#for $cur_indexer_id in $sorted_show_ids: + + + + +#end for +
$show_names[$cur_indexer_id] ($ep_counts[$cur_indexer_id])
+
+ +#end if + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/manage_torrents.tmpl b/gui/slick/interfaces/default/manage_torrents.tmpl new file mode 100644 index 00000000..5f60f739 --- /dev/null +++ b/gui/slick/interfaces/default/manage_torrents.tmpl @@ -0,0 +1,22 @@ +#import sickbeard +#import datetime +#from sickbeard.common import * +#set global $title="Manage Torrents" +#set global $header="Manage Torrents" +#set global $sbPath=".." + +#set global $topmenu="manage"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + + #if $varExists('header') +

$header

+ #else +

$title

+ #end if + +$info_download_station + + +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/restart.tmpl b/gui/slick/interfaces/default/restart.tmpl new file mode 100644 index 00000000..55a57fde --- /dev/null +++ b/gui/slick/interfaces/default/restart.tmpl @@ -0,0 +1,17 @@ +#import sickbeard +#import datetime +#from sickbeard.common import * +#from sickbeard import db + +#set global $title="Home" +#set global $header="Restarting Sick Beard" + +#set global $sbPath = ".." + +#set global $topmenu="home"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/restart_bare.tmpl") + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/restart_bare.tmpl b/gui/slick/interfaces/default/restart_bare.tmpl new file mode 100644 index 00000000..70de6fca --- /dev/null +++ b/gui/slick/interfaces/default/restart_bare.tmpl @@ -0,0 +1,44 @@ + + + + + +

Performing Restart

+
+
+Waiting for Sick Beard to shut down: + + +
+ + + + + + diff --git a/gui/slick/interfaces/default/testRename.tmpl b/gui/slick/interfaces/default/testRename.tmpl new file mode 100644 index 00000000..17213484 --- /dev/null +++ b/gui/slick/interfaces/default/testRename.tmpl @@ -0,0 +1,83 @@ +#import sickbeard +#from sickbeard import common +#from sickbeard import exceptions +#set global $title="Test Rename" +#set global $header = '%s' % ($show.indexerid, $show.name) +#set global $sbPath=".." + +#set global $topmenu="home"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + +#if $varExists('header') +

$header

+#else +

$title

+#end if + + + + + +

Preview of the proposed name changes

+
+#if int($show.air_by_date) == 1 and $sickbeard.NAMING_CUSTOM_ABD: + $sickbeard.NAMING_ABD_PATTERN +#else + $sickbeard.NAMING_PATTERN +#end if +
+ +#set $curSeason = -1 +#set $odd = False + + +#for $cur_ep_obj in $ep_obj_list: +#set $curLoc = $cur_ep_obj.location[len($cur_ep_obj.show.location)+1:] +#set $curExt = $curLoc.split('.')[-1] +#set $newLoc = $cur_ep_obj.proper_path() + '.' + $curExt + +#if int($cur_ep_obj.season) != $curSeason: + + + + + + + + + + + +#set $curSeason = int($cur_ep_obj.season) +#end if + +#set $odd = not $odd +#set $epStr = str($cur_ep_obj.season) + "x" + str($cur_ep_obj.episode) +#set $epList = sorted([cur_ep_obj.episode] + [x.episode for x in cur_ep_obj.relatedEps]) +#if len($epList) > 1: + #set $epList = [$min($epList), $max($epList)] +#end if + + + + + + + + +#end for +
+
+

#if int($cur_ep_obj.season) == 0 then "Specials" else "Season "+str($cur_ep_obj.season)#

+
EpisodeOld LocationNew Location
+ " /> + <%= "-".join(map(str, epList)) %>$curLoc$newLoc

+ +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/interfaces/default/viewlogs.tmpl b/gui/slick/interfaces/default/viewlogs.tmpl new file mode 100644 index 00000000..1f3bfeb2 --- /dev/null +++ b/gui/slick/interfaces/default/viewlogs.tmpl @@ -0,0 +1,49 @@ +#import sickbeard +#from sickbeard import classes +#from sickbeard.common import * +#from sickbeard.logger import reverseNames +#set global $header="Log File" +#set global $title="Logs" + +#set global $sbPath = ".." + +#set global $topmenu="errorlogs"# +#import os.path +#include $os.path.join($sickbeard.PROG_DIR, "gui/slick/interfaces/default/inc_top.tmpl") + + +#if $varExists('header') +

$header

+#else +

$title

+#end if +
Minimum logging level to display: +
+ +
+$logLines
+
+
+ + + +#include $os.path.join($sickbeard.PROG_DIR,"gui/slick/interfaces/default/inc_bottom.tmpl") diff --git a/gui/slick/js/addExistingShow.js b/gui/slick/js/addExistingShow.js new file mode 100644 index 00000000..18498488 --- /dev/null +++ b/gui/slick/js/addExistingShow.js @@ -0,0 +1,78 @@ +$(document).ready(function() { + + $('#checkAll').live('click', function(){ + + var seasCheck = this; + + $('.dirCheck').each(function(){ + this.checked = seasCheck.checked; + }); + }); + + $('#submitShowDirs').click(function(){ + + var dirArr = new Array(); + + $('.dirCheck').each(function(i,w) { + if (this.checked == true) { + var show = $(this).attr('id'); + var indexer = $(this).closest('tr').find('select').val(); + dirArr.push(encodeURIComponent(indexer + '|' + show)); + } + }); + + if (dirArr.length == 0) + return false; + + url = sbRoot+'/home/addShows/addExistingShows?promptForSettings='+ ($('#promptForSettings').prop('checked') ? 'on' : 'off'); + + url += '&shows_to_add='+dirArr.join('&shows_to_add='); + + window.location.href = url; + }); + + + function loadContent() { + var url = ''; + $('.dir_check').each(function(i,w){ + if ($(w).is(':checked')) { + if (url.length) + url += '&' + url += 'rootDir=' + encodeURIComponent($(w).attr('id')); + } + }); + + $('#tableDiv').html(' loading folders...'); + $.get(sbRoot+'/home/addShows/massAddTable', url, function(data) { + $('#tableDiv').html(data); + $("#addRootDirTable").tablesorter({ + //sortList: [[1,0]], + widgets: ['zebra'], + headers: { + 0: { sorter: false } + } + }); + }); + + } + + var last_txt = ''; + $('#rootDirText').change(function() { + if (last_txt == $('#rootDirText').val()) + return false; + else + last_txt = $('#rootDirText').val(); + $('#rootDirStaticList').html(''); + $('#rootDirs option').each(function(i, w) { + $('#rootDirStaticList').append('
  • ') + }); + loadContent(); + }); + + $('.dir_check').live('click', loadContent); + + $('.showManage').live('click', function() { + $( "#tabs" ).tabs( 'select', 0 ); + }); + +}); \ No newline at end of file diff --git a/gui/slick/js/addShowOptions.js b/gui/slick/js/addShowOptions.js new file mode 100644 index 00000000..ae5b5d88 --- /dev/null +++ b/gui/slick/js/addShowOptions.js @@ -0,0 +1,27 @@ +$(document).ready(function () { + + $('#saveDefaultsButton').click(function () { + var anyQualArray = []; + var bestQualArray = []; + $('#anyQualities option:selected').each(function (i, d) {anyQualArray.push($(d).val()); }); + $('#bestQualities option:selected').each(function (i, d) {bestQualArray.push($(d).val()); }); + + $.get(sbRoot + '/config/general/saveAddShowDefaults', {defaultStatus: $('#statusSelect').val(), + anyQualities: anyQualArray.join(','), + bestQualities: bestQualArray.join(','), + defaultFlattenFolders: $('#flatten_folders').prop('checked'), + subtitles: $('#subtitles').prop('checked') }); + + $(this).attr('disabled', true); + $.pnotify({ + pnotify_title: 'Saved Defaults', + pnotify_text: 'Your "add show" defaults have been set to your current selections.', + pnotify_shadow: false + }); + }); + + $('#statusSelect, #qualityPreset, #flatten_folders, #anyQualities, #bestQualities, #subtitles').change(function () { + $('#saveDefaultsButton').attr('disabled', false); + }); + +}); \ No newline at end of file diff --git a/gui/slick/js/ajaxEpRetry.js b/gui/slick/js/ajaxEpRetry.js new file mode 100644 index 00000000..1f10c3e5 --- /dev/null +++ b/gui/slick/js/ajaxEpRetry.js @@ -0,0 +1,51 @@ +(function () { + + $.ajaxEpRetry = { + defaults: { + size: 16, + colorRow: false, + loadingImage: 'loading16_dddddd.gif', + noImage: 'no16.png', + yesImage: 'yes16.png' + } + }; + + $.fn.ajaxEpRetry = function (options) { + options = $.extend({}, $.ajaxEpRetry.defaults, options); + + $('.epRetry').click(function () { + if ( !confirm("Mark download as bad and retry?") ) + return false; + + var parent = $(this).parent(); + + // put the ajax spinner (for non white bg) placeholder while we wait + parent.empty(); + parent.append($("").attr({"src": sbRoot + "/images/" + options.loadingImage, "height": options.size, "alt": "", "title": "loading"})); + + $.getJSON($(this).attr('href'), function (data) { + // if they failed then just put the red X + if (data.result == 'failure') { + img_name = options.noImage; + img_result = 'failed'; + + // if the snatch was successful then apply the corresponding class and fill in the row appropriately + } else { + img_name = options.yesImage; + img_result = 'success'; + // color the row + if (options.colorRow) { + parent.parent().removeClass('skipped wanted qual good unaired snatched').addClass('snatched'); + } + } + + // put the corresponding image as the result for the the row + parent.empty(); + parent.append($("").attr({"src": sbRoot + "/images/" + img_name, "height": options.size, "alt": img_result, "title": img_result})); + }); + + // don't follow the link + return false; + }); + }; +})(); diff --git a/gui/slick/js/ajaxEpSearch.js b/gui/slick/js/ajaxEpSearch.js new file mode 100644 index 00000000..5185b81b --- /dev/null +++ b/gui/slick/js/ajaxEpSearch.js @@ -0,0 +1,52 @@ +(function(){ + + $.ajaxEpSearch = { + defaults: { + size: 16, + colorRow: false, + loadingImage: 'loading16_dddddd.gif', + noImage: 'no16.png', + yesImage: 'yes16.png' + } + }; + + $.fn.ajaxEpSearch = function(options){ + options = $.extend({}, $.ajaxEpSearch.defaults, options); + + $('.epSearch').click(function(){ + var parent = $(this).parent(); + + // put the ajax spinner (for non white bg) placeholder while we wait + parent.empty(); + parent.append($("").attr({"src": sbRoot+"/images/"+options.loadingImage, "height": options.size, "alt": "", "title": "loading"})); + + $.getJSON($(this).attr('href'), function(data){ + // if they failed then just put the red X + if (data.result == 'failure') { + img_name = options.noImage; + img_result = 'failed'; + + // if the snatch was successful then apply the corresponding class and fill in the row appropriately + } else { + img_name = options.yesImage; + img_result = 'success'; + // color the row + if (options.colorRow) + parent.parent().removeClass('skipped wanted qual good unaired').addClass('snatched'); + // applying the quality class + var rSearchTerm = /(\w+)\s\((.+?)\)/; + HtmlContent = data.result.replace(rSearchTerm,"$1"+' '+"$2"+''); + // update the status column if it exists + parent.siblings('.status_column').html(HtmlContent) + } + + // put the corresponding image as the result for the the row + parent.empty(); + parent.append($("").attr({"src": sbRoot+"/images/"+img_name, "height": options.size, "alt": img_result, "title": img_result})); + }); + + // fon't follow the link + return false; + }); + } +})(); diff --git a/gui/slick/js/ajaxEpSubtitles.js b/gui/slick/js/ajaxEpSubtitles.js new file mode 100644 index 00000000..99094ef6 --- /dev/null +++ b/gui/slick/js/ajaxEpSubtitles.js @@ -0,0 +1,49 @@ +(function(){ + $.fn.ajaxEpSubtitlesSearch = function(){ + $('.epSubtitlesSearch').click(function(){ + var subtitles_td = $(this).parent().siblings('.subtitles_column'); + var subtitles_search_link = $(this); + // fill with the ajax loading gif + subtitles_search_link.empty(); + subtitles_search_link.append($("").attr({"src": sbRoot+"/images/loading16_dddddd.gif", "alt": "", "title": "loading"})); + $.getJSON($(this).attr('href'), function(data){ + if (data.result != "failure" && data.result != "No subtitles downloaded") { + // clear and update the subtitles column with new informations + var subtitles = data.subtitles.split(','); + subtitles_td.empty() + $.each(subtitles,function(index, language){ + if (language != "" && language != "und") { + if (index != subtitles.length - 1) { + subtitles_td.append($("").attr({"src": sbRoot+"/images/flags/"+language+".png", "alt": language, "width": 16, "height": 11}).css({'padding-right' : '6px','padding-bottom' : '4px'})); + } else { + subtitles_td.append($("").attr({"src": sbRoot+"/images/flags/"+language+".png", "alt": language, "width": 16, "height": 11}).css({'padding-bottom' : '4px'})); + } + } + }); + // don't allow other searches + subtitles_search_link.remove(); + } else { + subtitles_search_link.remove(); + } + }); + + // don't follow the link + return false; + }); + }; + + $.fn.ajaxEpMergeSubtitles = function(){ + $('.epMergeSubtitles').click(function(){ + var subtitles_merge_link = $(this); + // fill with the ajax loading gif + subtitles_merge_link.empty(); + subtitles_merge_link.append($("").attr({"src": sbRoot+"/images/loading16_dddddd.gif", "alt": "", "title": "loading"})); + $.getJSON($(this).attr('href'), function(data){ + // don't allow other merges + subtitles_merge_link.remove(); + }); + // don't follow the link + return false; + }); + } +})(); diff --git a/gui/slick/js/ajaxNotifications.js b/gui/slick/js/ajaxNotifications.js new file mode 100644 index 00000000..8f1a12a5 --- /dev/null +++ b/gui/slick/js/ajaxNotifications.js @@ -0,0 +1,25 @@ +var message_url = sbRoot + '/ui/get_messages'; +$.pnotify.defaults.pnotify_width = "340px"; +$.pnotify.defaults.pnotify_history = false; +$.pnotify.defaults.pnotify_delay = 4000; + +function check_notifications() { + $.getJSON(message_url, function(data){ + $.each(data, function(name,data){ + $.pnotify({ + pnotify_type: data.type, + pnotify_hide: data.type == 'notice', + pnotify_title: data.title, + pnotify_text: data.message + }); + }); + }); + + setTimeout(check_notifications, 3000) +} + +$(document).ready(function(){ + + check_notifications(); + +}); \ No newline at end of file diff --git a/gui/slick/js/apibuilder.js b/gui/slick/js/apibuilder.js new file mode 100644 index 00000000..8f7afdc3 --- /dev/null +++ b/gui/slick/js/apibuilder.js @@ -0,0 +1,641 @@ +// Chained Selects + +// Copyright Xin Yang 2004 +// Web Site: www.yxScripts.com +// EMail: m_yangxin@hotmail.com +// Last Updated: Jan. 31, 2009 + +// This script is free as long as the copyright notice remains intact. + +var _disable_empty_list=false; +var _hide_empty_list=false; + +function goListGroup(apikey, L7, L6, L5, L4, L3, L2, L1){ + var GlobalOptions = ""; + $('.global').each(function(){ + var checked = $(this).prop('checked'); + if(checked) { + var globalID = $(this).attr('id'); + // handle jsonp/callback global option differently + if(globalID == "jsonp") { + GlobalOptions = GlobalOptions + "&" + globalID + "=foo"; + } else { + GlobalOptions = GlobalOptions + "&" + globalID + "=1"; + } + } + }); + + // handle the show.getposter / show.getbanner differently as they return an image and not json + if (L1 == "?cmd=show.getposter" || L1 == "?cmd=show.getbanner") { + var imgcache = sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions; + var html = imgcache + '

    '; + $('#apiResponse').html(html); + $.ajax({ + url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + GlobalOptions, + async: false, + cache: false, + dataType: "html", + success: function (img) { + $('#imgcache').attr('src', imgcache); + } + }) + } + else { + var html = sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions + "
    ";
    +        html += $.ajax({
    +          url: sbRoot + "/api/" + apikey + "/" + L1 + L2 + L3 + L4 + L5 + L6 + L7 + GlobalOptions,
    +          async: false,
    +          dataType: "html",
    +        }).responseText;
    +
    +        html += '
    '; + $('#apiResponse').html(html); + } +} + +// ------ +if (typeof(disable_empty_list)=="undefined") { disable_empty_list=_disable_empty_list; } +if (typeof(hide_empty_list)=="undefined") { hide_empty_list=_hide_empty_list; } + +var cs_goodContent=true, cs_M="M", cs_L="L", cs_G="G", cs_EG="EG"; +var cs_names=new Array(); +var cs_supportDOM=document.createElement; +var cs_nav=navigator.userAgent.toLowerCase(); +var cs_isIE7=(cs_nav.indexOf("msie 7")!=-1 || cs_nav.indexOf("msie 8")!=-1); +var cs_isOpera=(cs_nav.indexOf("opera")!=-1); +var cs_isMac=(cs_nav.indexOf("mac")!=-1); + +function cs_findOBJ(obj,n) { + for (var i=0; i=0; i--) { + list.options[i]=null; + } + } +} +function cs_refreshList(list,opt,df,key) { + var l=list.options.length; + var optGroup=null, newOpt=null, optCount=0, optPool=list; + + if (cs_isMac) { + var l=list.options.length; + var iCount=0; + + for (var i=0; i options[i].idx && menu.items[options[i].idx].type==cs_M) { + if (!has_sublist) { + has_sublist=true; + cs_emptyList(content.lists[idx+1]); + } + var subkey=cs_getKey(key,options[i].idx), df=cs_getSelected(mode,content.cookie,idx+1,subkey,menu.items[options[i].idx].df); + cs_refreshList(content.lists[idx+1],cs_getOptions(menu.items[options[i].idx],list),df,subkey); + } + } + } + } + + if (key!="") { + cookies+=(cookies==""?"":"-")+key+option; + } + + if (content.cookie) { + cs_setCookie(content.cookie+"_"+idx,cookies); + } + + if (has_sublist && idx+10) { + cs_initListGroup(content,content.cookie); + } + } +} + +function initListGroups(n) { + var listCount=0; + for (var i=1; iarguments[i].length || listCount==0) { + listCount=arguments[i].length; + } + } + } + + var _content=cs_findContent(n), count=0, content=null; + if (_content!=null) { + for (var l=0; l0) { + cs_initListGroup(content,content.cookie); + } + } + } +} + +function resetListGroup(n,count) { + var content=cs_findContent("cs_"+(count||1)+"_"+n); + if (content!=null && content.lists.length>0) { + cs_initListGroup(content,""); + } +} + +function selectOptions(n,opts,mode) { + var content=cs_findContent(n); + if (content!=null) { + var optss=opts.split(":"), menu=content.menu, path=true; + for (var i=0; i').text(first_val.current_path).appendTo(fileBrowserDialog); + list = $(' +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. +Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. +Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. +Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. +Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. +Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. +Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. +Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. +Line: 1 Col: 58 Unexpected end tag (blink). Ignored. +Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. +Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. +Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. +Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. +Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. +Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. +Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. +Line: 1 Col: 99 Unexpected end tag (select). Ignored. +Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. +Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. +Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. +Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. +Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. +Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. +Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. +Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. +Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. +Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. +Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. +Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. +Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. +Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. +Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. +Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. +Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. +Line: 1 Col: 151 This element (img) has no end tag. +Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. +Line: 1 Col: 159 Unexpected end tag (title). Ignored. +Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. +Line: 1 Col: 166 Unexpected end tag (span). Ignored. +Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. +Line: 1 Col: 174 Unexpected end tag (style). Ignored. +Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. +Line: 1 Col: 183 Unexpected end tag (script). Ignored. +Line: 1 Col: 196 Unexpected end tag (th). Ignored. +Line: 1 Col: 201 Unexpected end tag (td). Ignored. +Line: 1 Col: 206 Unexpected end tag (tr). Ignored. +Line: 1 Col: 214 This element (frame) has no end tag. +Line: 1 Col: 221 This element (area) has no end tag. +Line: 1 Col: 228 Unexpected end tag (link). Ignored. +Line: 1 Col: 236 This element (param) has no end tag. +Line: 1 Col: 241 This element (hr) has no end tag. +Line: 1 Col: 249 This element (input) has no end tag. +Line: 1 Col: 255 Unexpected end tag (col). Ignored. +Line: 1 Col: 262 Unexpected end tag (base). Ignored. +Line: 1 Col: 269 Unexpected end tag (meta). Ignored. +Line: 1 Col: 280 This element (basefont) has no end tag. +Line: 1 Col: 290 This element (bgsound) has no end tag. +Line: 1 Col: 298 This element (embed) has no end tag. +Line: 1 Col: 307 This element (spacer) has no end tag. +Line: 1 Col: 311 Unexpected end tag (p). Ignored. +Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. +Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. +Line: 1 Col: 331 Unexpected end tag (caption). Ignored. +Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. +Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. +Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. +Line: 1 Col: 366 Unexpected end tag (thead). Ignored. +Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. +Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. +Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. +Line: 1 Col: 404 Unexpected end tag (dir). Ignored. +Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. +Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. +Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. +Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. +Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. +Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. +Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. +Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. +Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. +Line: 1 Col: 471 This element (wbr) has no end tag. +Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. +Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. +Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. +Line: 1 Col: 524 Unexpected end tag (html). Ignored. +Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. +Line: 1 Col: 531 Unexpected end tag (head). Ignored. +Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. +Line: 1 Col: 548 This element (image) has no end tag. +Line: 1 Col: 558 This element (isindex) has no end tag. +Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. +Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. +Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. +Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. +Line: 1 Col: 610 Unexpected end tag (option). Ignored. +Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. +Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. +#document +| +| +| +|
    +| +| +| +|

    + +#data + +#errors +Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. +Line: 1 Col: 10 Expected closing tag. Unexpected end of file. +#document +| +| +| diff --git a/lib/html5lib/tests/testdata/tree-construction/tests10.dat b/lib/html5lib/tests/testdata/tree-construction/tests10.dat new file mode 100644 index 00000000..4f8df86f --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests10.dat @@ -0,0 +1,799 @@ +#data + +#errors +#document +| +| +| +| +| + +#data +a +#errors +29: Bogus comment +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +35: Stray “svg†start tag. +42: Stray end tag “svg†+#document +| +| +| +| +| +#errors +43: Stray “svg†start tag. +50: Stray end tag “svg†+#document +| +| +| +| +|

    +#errors +34: Start tag “svg†seen in “tableâ€. +41: Stray end tag “svgâ€. +#document +| +| +| +| +| +| + +#data +
    foo
    +#errors +34: Start tag “svg†seen in “tableâ€. +46: Stray end tag “gâ€. +53: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| + +#data +
    foobar
    +#errors +34: Start tag “svg†seen in “tableâ€. +46: Stray end tag “gâ€. +58: Stray end tag “gâ€. +65: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| + +#data +
    foobar
    +#errors +41: Start tag “svg†seen in “tableâ€. +53: Stray end tag “gâ€. +65: Stray end tag “gâ€. +72: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| + +#data +
    foobar
    +#errors +45: Start tag “svg†seen in “tableâ€. +57: Stray end tag “gâ€. +69: Stray end tag “gâ€. +76: Stray end tag “svgâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +| +| +| + +#data +
    foobar
    +#errors +#document +| +| +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" + +#data +
    foobar

    baz

    +#errors +#document +| +| +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +
    foobar

    baz

    +#errors +#document +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +
    foobar

    baz

    quux +#errors +70: HTML start tag “p†in a foreign namespace context. +81: “table†closed but “caption†was still open. +#document +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +|

    +| "baz" +|

    +| "quux" + +#data +
    foobarbaz

    quux +#errors +78: “table†closed but “caption†was still open. +78: Unclosed elements on stack. +#document +| +| +| +| +| +|
    +| +| +| "foo" +| +| "bar" +| "baz" +|

    +| "quux" + +#data +foobar

    baz

    quux +#errors +44: Start tag “svg†seen in “tableâ€. +56: Stray end tag “gâ€. +68: Stray end tag “gâ€. +71: HTML start tag “p†in a foreign namespace context. +71: Start tag “p†seen in “tableâ€. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

    +| "baz" +| +| +|

    +| "quux" + +#data +

    quux +#errors +50: Stray “svg†start tag. +54: Stray “g†start tag. +62: Stray end tag “g†+66: Stray “g†start tag. +74: Stray end tag “g†+77: Stray “p†start tag. +88: “table†end tag with “select†open. +#document +| +| +| +| +| +| +| +|
    +|

    quux +#errors +36: Start tag “select†seen in “tableâ€. +42: Stray “svg†start tag. +46: Stray “g†start tag. +54: Stray end tag “g†+58: Stray “g†start tag. +66: Stray end tag “g†+69: Stray “p†start tag. +80: “table†end tag with “select†open. +#document +| +| +| +| +| +|

    +| "quux" + +#data +foobar

    baz +#errors +41: Stray “svg†start tag. +68: HTML start tag “p†in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +foobar

    baz +#errors +34: Stray “svg†start tag. +61: HTML start tag “p†in a foreign namespace context. +#document +| +| +| +| +| +| +| "foo" +| +| "bar" +|

    +| "baz" + +#data +

    +#errors +31: Stray “svg†start tag. +35: Stray “g†start tag. +40: Stray end tag “g†+44: Stray “g†start tag. +49: Stray end tag “g†+52: Stray “p†start tag. +58: Stray “span†start tag. +58: End of file seen and there were open elements. +#document +| +| +| +| + +#data +

    +#errors +42: Stray “svg†start tag. +46: Stray “g†start tag. +51: Stray end tag “g†+55: Stray “g†start tag. +60: Stray end tag “g†+63: Stray “p†start tag. +69: Stray “span†start tag. +#document +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| +| xlink href="foo" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data + +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" + +#data +bar +#errors +#document +| +| +| +| +| xlink:href="foo" +| xml:lang="en" +| +| +| xlink href="foo" +| xml lang="en" +| "bar" + +#data + +#errors +#document +| +| +| +| + +#data +

    a +#errors +#document +| +| +| +|
    +| +| "a" + +#data +
    a +#errors +#document +| +| +| +|
    +| +| +| "a" + +#data +
    +#errors +#document +| +| +| +|
    +| +| +| + +#data +
    a +#errors +#document +| +| +| +|
    +| +| +| +| +| "a" + +#data +

    a +#errors +#document +| +| +| +|

    +| +| +| +|

    +| "a" + +#data +
      a +#errors +40: HTML start tag “ul†in a foreign namespace context. +41: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +|
      +| +|
        +| "a" + +#data +
          a +#errors +35: HTML start tag “ul†in a foreign namespace context. +36: End of file in a foreign namespace context. +#document +| +| +| +| +| +| +| +|
            +| "a" + +#data +

            +#errors +#document +| +| +| +| +|

            +| +| +|

            + +#data +

            +#errors +#document +| +| +| +| +|

            +| +| +|

            + +#data +

            +#errors +#document +| +| +| +|

            +| +| +| +|

            +|

            + +#data +
            +#errors +#document +| +| +| +| +| +|
            +| +|
            +| +| + +#data +
            +#errors +#document +| +| +| +| +| +| +| +|
            +|
            +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data +

    +#errors +#document +| +| +| +| +|
    +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| + +#data +
    +#errors +#document +| +| +| +| +| +| +| +|
    +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| diff --git a/lib/html5lib/tests/testdata/tree-construction/tests11.dat b/lib/html5lib/tests/testdata/tree-construction/tests11.dat new file mode 100644 index 00000000..638cde47 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests11.dat @@ -0,0 +1,482 @@ +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributeName="" +| attributeType="" +| baseFrequency="" +| baseProfile="" +| calcMode="" +| clipPathUnits="" +| contentScriptType="" +| contentStyleType="" +| diffuseConstant="" +| edgeMode="" +| externalResourcesRequired="" +| filterRes="" +| filterUnits="" +| glyphRef="" +| gradientTransform="" +| gradientUnits="" +| kernelMatrix="" +| kernelUnitLength="" +| keyPoints="" +| keySplines="" +| keyTimes="" +| lengthAdjust="" +| limitingConeAngle="" +| markerHeight="" +| markerUnits="" +| markerWidth="" +| maskContentUnits="" +| maskUnits="" +| numOctaves="" +| pathLength="" +| patternContentUnits="" +| patternTransform="" +| patternUnits="" +| pointsAtX="" +| pointsAtY="" +| pointsAtZ="" +| preserveAlpha="" +| preserveAspectRatio="" +| primitiveUnits="" +| refX="" +| refY="" +| repeatCount="" +| repeatDur="" +| requiredExtensions="" +| requiredFeatures="" +| specularConstant="" +| specularExponent="" +| spreadMethod="" +| startOffset="" +| stdDeviation="" +| stitchTiles="" +| surfaceScale="" +| systemLanguage="" +| tableValues="" +| targetX="" +| targetY="" +| textLength="" +| viewBox="" +| viewTarget="" +| xChannelSelector="" +| yChannelSelector="" +| zoomAndPan="" + +#data + +#errors +#document +| +| +| +| +| +| attributename="" +| attributetype="" +| basefrequency="" +| baseprofile="" +| calcmode="" +| clippathunits="" +| contentscripttype="" +| contentstyletype="" +| diffuseconstant="" +| edgemode="" +| externalresourcesrequired="" +| filterres="" +| filterunits="" +| glyphref="" +| gradienttransform="" +| gradientunits="" +| kernelmatrix="" +| kernelunitlength="" +| keypoints="" +| keysplines="" +| keytimes="" +| lengthadjust="" +| limitingconeangle="" +| markerheight="" +| markerunits="" +| markerwidth="" +| maskcontentunits="" +| maskunits="" +| numoctaves="" +| pathlength="" +| patterncontentunits="" +| patterntransform="" +| patternunits="" +| pointsatx="" +| pointsaty="" +| pointsatz="" +| preservealpha="" +| preserveaspectratio="" +| primitiveunits="" +| refx="" +| refy="" +| repeatcount="" +| repeatdur="" +| requiredextensions="" +| requiredfeatures="" +| specularconstant="" +| specularexponent="" +| spreadmethod="" +| startoffset="" +| stddeviation="" +| stitchtiles="" +| surfacescale="" +| systemlanguage="" +| tablevalues="" +| targetx="" +| targety="" +| textlength="" +| viewbox="" +| viewtarget="" +| xchannelselector="" +| ychannelselector="" +| zoomandpan="" + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| diff --git a/lib/html5lib/tests/testdata/tree-construction/tests12.dat b/lib/html5lib/tests/testdata/tree-construction/tests12.dat new file mode 100644 index 00000000..63107d27 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests12.dat @@ -0,0 +1,62 @@ +#data +

    foobazeggs

    spam

    quuxbar +#errors +#document +| +| +| +| +|

    +| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

    +| "spam" +| +| +| +|
    +| +| +| "quux" +| "bar" + +#data +foobazeggs

    spam
    quuxbar +#errors +#document +| +| +| +| +| "foo" +| +| +| +| "baz" +| +| +| +| +| "eggs" +| +| +|

    +| "spam" +| +| +| +|
    +| +| +| "quux" +| "bar" diff --git a/lib/html5lib/tests/testdata/tree-construction/tests14.dat b/lib/html5lib/tests/testdata/tree-construction/tests14.dat new file mode 100644 index 00000000..b8713f88 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests14.dat @@ -0,0 +1,74 @@ +#data + +#errors +#document +| +| +| +| +| + +#data + +#errors +#document +| +| +| +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| abc:def="gh" +| +| +| + +#data + +#errors +15: Unexpected start tag html +#document +| +| +| xml:lang="bar" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| +| + +#data + +#errors +#document +| +| +| 123="456" +| 789="012" +| +| + +#data + +#errors +#document +| +| +| +| +| 789="012" diff --git a/lib/html5lib/tests/testdata/tree-construction/tests15.dat b/lib/html5lib/tests/testdata/tree-construction/tests15.dat new file mode 100644 index 00000000..6ce1c0d1 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests15.dat @@ -0,0 +1,208 @@ +#data +

    X +#errors +Line: 1 Col: 31 Unexpected end tag (p). Ignored. +Line: 1 Col: 36 Expected closing tag. Unexpected end of file. +#document +| +| +| +| +|

    +| +| +| +| +| +| +| " " +|

    +| "X" + +#data +

    +

    X +#errors +Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end tag (p). Ignored. +Line: 2 Col: 4 Expected closing tag. Unexpected end of file. +#document +| +| +| +|

    +| +| +| +| +| +| +| " +" +|

    +| "X" + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| +| " " + +#data + +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| + +#data + +#errors +Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. +#document +| +| +| +| + +#data +X +#errors +Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. +#document +| +| +| +| +| +| "X" + +#data +<!doctype html><table> X<meta></table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " X" +| <meta> +| <table> + +#data +<!doctype html><table> x</table> +#errors +Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> + +#data +<!doctype html><table> x </table> +#errors +Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x " +| <table> + +#data +<!doctype html><table><tr> x</table> +#errors +Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " x" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table>X<style> <tr>x </style> </table> +#errors +Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" +| <table> +| <style> +| " <tr>x " +| " " + +#data +<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> +#errors +Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. +Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <a> +| "foo" +| <table> +| " " +| <tbody> +| <tr> +| <td> +| "bar" +| " " + +#data +<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> +#errors +6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. +13: Stray start tag “frameâ€. +21: Stray end tag “frameâ€. +29: Stray end tag “frameâ€. +39: “frameset†start tag after “body†already open. +105: End of file seen inside an [R]CDATA element. +105: End of file seen and there were open elements. +XXX: These errors are wrong, please fix me! +#document +| <html> +| <head> +| <frameset> +| <frame> +| <frameset> +| <frame> +| <noframes> +| "</frameset><noframes>" + +#data +<!DOCTYPE html><object></html> +#errors +1: Expected closing tag. Unexpected end of file +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> diff --git a/lib/html5lib/tests/testdata/tree-construction/tests16.dat b/lib/html5lib/tests/testdata/tree-construction/tests16.dat new file mode 100644 index 00000000..c8ef66f0 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests16.dat @@ -0,0 +1,2299 @@ +#data +<!doctype html><script> +#errors +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script>a +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<!doctype html><script>< +#errors +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<!doctype html><script></ +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<!doctype html><script></S +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<!doctype html><script></SC +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<!doctype html><script></SCR +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<!doctype html><script></SCRI +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<!doctype html><script></SCRIP +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<!doctype html><script></SCRIPT +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script></s +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<!doctype html><script></sc +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<!doctype html><script></scr +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<!doctype html><script></scri +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<!doctype html><script></scrip +#errors +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<!doctype html><script></script +#errors +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| <body> + +#data +<!doctype html><script><! +#errors +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<!doctype html><script><!a +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<!doctype html><script><!- +#errors +Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<!doctype html><script><!-a +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<!doctype html><script><!-- +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--a +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<!doctype html><script><!--< +#errors +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<!doctype html><script><!--<a +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<!doctype html><script><!--</ +#errors +Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<!doctype html><script><!--</script +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<!doctype html><script><!--<s +#errors +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<!doctype html><script><!--<script +#errors +Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<!doctype html><script><!--<script < +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<!doctype html><script><!--<script <a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<!doctype html><script><!--<script </ +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<!doctype html><script><!--<script </s +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<!doctype html><script><!--<script </scripta +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<!doctype html><script><!--<script </script +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script> +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<!doctype html><script><!--<script </script/ +#errors +Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<!doctype html><script><!--<script </script < +#errors +Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<!doctype html><script><!--<script </script <a +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<!doctype html><script><!--<script </script </ +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<!doctype html><script><!--<script </script </script +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script/ +#errors +Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script </script </script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<!doctype html><script><!--<script - +#errors +Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<!doctype html><script><!--<script -a +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<!doctype html><script><!--<script -< +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -<" +| <body> + +#data +<!doctype html><script><!--<script -- +#errors +Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<!doctype html><script><!--<script --a +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<!doctype html><script><!--<script --< +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --<" +| <body> + +#data +<!doctype html><script><!--<script --> +#errors +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script -->< +#errors +Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<!doctype html><script><!--<script --></ +#errors +Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<!doctype html><script><!--<script --></script +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script/ +#errors +Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script --></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<!doctype html><script><!--<script><\/script>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<!doctype html><script><!--<script></scr'+'ipt>--></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>--><!--</script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-- ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- -></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>- - ></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<!doctype html><script><!--<script></script><script></script>-></script> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<!doctype html><script><!--<script>--!></script>X +#errors +Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<!doctype html><script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 59 Unexpected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<!doctype html><script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<!doctype html><style><!--<style></style>--></style> +#errors +Line: 1 Col: 52 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<!doctype html><style><!--</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<!doctype html><style><!--...</style>...--></style> +#errors +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<!doctype html><style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 66 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<!doctype html><style><!--...</style><!-- --><style>@import ...</style> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<!doctype html><style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 63 Unexpected end tag (style). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<!doctype html><style>...<!--[if IE]><style>...</style>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<!doctype html><title><!--<title>--> +#errors +Line: 1 Col: 52 Unexpected end tag (title). +#document +| +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<!doctype html><title></title> +#errors +#document +| +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<!doctype html><noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 64 Unexpected end tag (noscript). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<!doctype html><noscript><iframe></noscript>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<!doctype html><noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 64 Unexpected end tag (noframes). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<!doctype html><noframes><body><script><!--...</script></body></noframes></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<!doctype html><textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 64 Unexpected end tag (textarea). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<!doctype html><textarea></textarea></textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<!doctype html><textarea><</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "<" + +#data +<!doctype html><textarea>a<b</textarea> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> +| "a<b" + +#data +<!doctype html><iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 56 Unexpected end tag (iframe). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<!doctype html><xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 44 Unexpected end tag (xmp). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<!doctype html><noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 60 Unexpected end tag (noembed). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script>a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "a" +| <body> + +#data +<script>< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<" +| <body> + +#data +<script></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</" +| <body> + +#data +<script></S +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</S" +| <body> + +#data +<script></SC +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SC" +| <body> + +#data +<script></SCR +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCR" +| <body> + +#data +<script></SCRI +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRI" +| <body> + +#data +<script></SCRIP +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIP" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</SCRIPT" +| <body> + +#data +<script></SCRIPT +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script></s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</s" +| <body> + +#data +<script></sc +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</sc" +| <body> + +#data +<script></scr +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scr" +| <body> + +#data +<script></scri +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scri" +| <body> + +#data +<script></scrip +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</scrip" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</script" +| <body> + +#data +<script></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| <body> + +#data +<script><! +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!" +| <body> + +#data +<script><!a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!a" +| <body> + +#data +<script><!- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-" +| <body> + +#data +<script><!-a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!-a" +| <body> + +#data +<script><!-- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--a" +| <body> + +#data +<script><!--< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<" +| <body> + +#data +<script><!--<a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<a" +| <body> + +#data +<script><!--</ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--</script" +| <body> + +#data +<script><!--</script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--" +| <body> + +#data +<script><!--<s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<s" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script" +| <body> + +#data +<script><!--<script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script " +| <body> + +#data +<script><!--<script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <" +| <body> + +#data +<script><!--<script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script <a" +| <body> + +#data +<script><!--<script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </" +| <body> + +#data +<script><!--<script </s +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </s" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script" +| <body> + +#data +<script><!--<script </scripta +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </scripta" +| <body> + +#data +<script><!--<script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script>" +| <body> + +#data +<script><!--<script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script/" +| <body> + +#data +<script><!--<script </script < +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <" +| <body> + +#data +<script><!--<script </script <a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script <a" +| <body> + +#data +<script><!--<script </script </ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script </script" +| <body> + +#data +<script><!--<script </script </script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script </script </script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script </script " +| <body> + +#data +<script><!--<script - +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -" +| <body> + +#data +<script><!--<script -a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -a" +| <body> + +#data +<script><!--<script -- +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --" +| <body> + +#data +<script><!--<script --a +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --a" +| <body> + +#data +<script><!--<script --> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script -->< +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --><" +| <body> + +#data +<script><!--<script --></ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script --></script" +| <body> + +#data +<script><!--<script --></script +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script/ +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script --></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script -->" +| <body> + +#data +<script><!--<script><\/script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script><\/script>-->" +| <body> + +#data +<script><!--<script></scr'+'ipt>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt>-->" +| <body> + +#data +<script><!--<script></script><script></script></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>" +| <body> + +#data +<script><!--<script></script><script></script>--><!--</script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>--><!--" +| <body> + +#data +<script><!--<script></script><script></script>-- ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>-- >" +| <body> + +#data +<script><!--<script></script><script></script>- -></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- ->" +| <body> + +#data +<script><!--<script></script><script></script>- - ></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>- - >" +| <body> + +#data +<script><!--<script></script><script></script>-></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +#document +| <html> +| <head> +| <script> +| "<!--<script></script><script></script>->" +| <body> + +#data +<script><!--<script>--!></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script>--!></script>X" +| <body> + +#data +<script><!--<scr'+'ipt></script>--></script> +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 44 Unexpected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<scr'+'ipt>" +| <body> +| "-->" + +#data +<script><!--<script></scr'+'ipt></script>X +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "<!--<script></scr'+'ipt></script>X" +| <body> + +#data +<style><!--<style></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--<style>" +| <body> +| "-->" + +#data +<style><!--</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--" +| <body> +| "X" + +#data +<style><!--...</style>...--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 36 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--..." +| <body> +| "...-->" + +#data +<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" +| <body> +| "X" + +#data +<style><!--...<style><!--...--!></style>--></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 51 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "<!--...<style><!--...--!>" +| <body> +| "-->" + +#data +<style><!--...</style><!-- --><style>@import ...</style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "<!--..." +| <!-- --> +| <style> +| "@import ..." +| <body> + +#data +<style>...<style><!--...</style><!-- --></style> +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 48 Unexpected end tag (style). +#document +| <html> +| <head> +| <style> +| "...<style><!--..." +| <!-- --> +| <body> + +#data +<style>...<!--[if IE]><style>...</style>X +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| <html> +| <head> +| <style> +| "...<!--[if IE]><style>..." +| <body> +| "X" + +#data +<title><!--<title>--> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end tag (title). +#document +| +| +| +| "<!--<title>" +| <body> +| "-->" + +#data +<title></title> +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +#document +| +| +| +| "" +| + +#data +foo/title><link></head><body>X +#errors +Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. +Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). +#document +| <html> +| <head> +| <title> +| "foo/title><link></head><body>X" +| <body> + +#data +<noscript><!--<noscript></noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noscript). +#document +| <html> +| <head> +| <noscript> +| "<!--<noscript>" +| <body> +| "-->" + +#data +<noscript><!--</noscript>X<noscript>--></noscript> +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<!--" +| <body> +| "X" +| <noscript> +| "-->" + +#data +<noscript><iframe></noscript>X +#errors +Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. +#document +| <html> +| <head> +| <noscript> +| "<iframe>" +| <body> +| "X" + +#data +<noframes><!--<noframes></noframes>--></noframes> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (noframes). +#document +| <html> +| <head> +| <noframes> +| "<!--<noframes>" +| <body> +| "-->" + +#data +<noframes><body><script><!--...</script></body></noframes></html> +#errors +Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. +#document +| <html> +| <head> +| <noframes> +| "<body><script><!--...</script></body>" +| <body> + +#data +<textarea><!--<textarea></textarea>--></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 49 Unexpected end tag (textarea). +#document +| <html> +| <head> +| <body> +| <textarea> +| "<!--<textarea>" +| "-->" + +#data +<textarea></textarea></textarea> +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <textarea> +| "</textarea>" + +#data +<iframe><!--<iframe></iframe>--></iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +Line: 1 Col: 41 Unexpected end tag (iframe). +#document +| <html> +| <head> +| <body> +| <iframe> +| "<!--<iframe>" +| "-->" + +#data +<iframe>...<!--X->...<!--/X->...</iframe> +#errors +Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| <iframe> +| "...<!--X->...<!--/X->..." + +#data +<xmp><!--<xmp></xmp>--></xmp> +#errors +Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. +Line: 1 Col: 29 Unexpected end tag (xmp). +#document +| <html> +| <head> +| <body> +| <xmp> +| "<!--<xmp>" +| "-->" + +#data +<noembed><!--<noembed></noembed>--></noembed> +#errors +Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. +Line: 1 Col: 45 Unexpected end tag (noembed). +#document +| <html> +| <head> +| <body> +| <noembed> +| "<!--<noembed>" +| "-->" + +#data +<!doctype html><table> + +#errors +Line 2 Col 0 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " +" + +#data +<!doctype html><table><td><span><font></span><span> +#errors +Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. +Line 1 Col 45 Unexpected end tag (span). +Line 1 Col 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <span> +| <font> +| <font> +| <span> + +#data +<!doctype html><form><table></form><form></table></form> +#errors +35: Stray end tag “formâ€. +41: Start tag “form†seen in “tableâ€. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <table> +| <form> diff --git a/lib/html5lib/tests/testdata/tree-construction/tests17.dat b/lib/html5lib/tests/testdata/tree-construction/tests17.dat new file mode 100644 index 00000000..7b555f88 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests17.dat @@ -0,0 +1,153 @@ +#data +<!doctype html><table><tbody><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tr><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<!doctype html><table><tr><td><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <select> +| <td> + +#data +<!doctype html><table><tr><th><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <th> +| <select> +| <td> + +#data +<!doctype html><table><caption><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <select> +| <tbody> +| <tr> + +#data +<!doctype html><select><tr> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><th> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tbody> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><thead> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><select><caption> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><table><tr></table>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| "a" diff --git a/lib/html5lib/tests/testdata/tree-construction/tests18.dat b/lib/html5lib/tests/testdata/tree-construction/tests18.dat new file mode 100644 index 00000000..680e1f06 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests18.dat @@ -0,0 +1,269 @@ +#data +<!doctype html><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> + +#data +<!doctype html><table><tbody><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><tbody><tr><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><caption><plaintext></plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <plaintext> +| "</plaintext>" + +#data +<!doctype html><table><tr><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <style> +| "</script>" + +#data +<!doctype html><table><tr><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <tbody> +| <tr> +| <script> +| "</style>" + +#data +<!doctype html><table><caption><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><table><td><style></script></style>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <style> +| "</script>" +| "abc" + +#data +<!doctype html><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" + +#data +<!doctype html><table><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> + +#data +<!doctype html><table><tr><select><script></style></script>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <script> +| "</style>" +| "abc" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><frameset></frameset><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><frameset></frameset></html><noframes>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" + +#data +<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <noframes> +| "abc" +| <!-- abc --> + +#data +<!doctype html><table><tr></tbody><tfoot> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <tfoot> + +#data +<!doctype html><table><td><svg></svg>abc<td> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <svg svg> +| "abc" +| <td> diff --git a/lib/html5lib/tests/testdata/tree-construction/tests19.dat b/lib/html5lib/tests/testdata/tree-construction/tests19.dat new file mode 100644 index 00000000..0d62f5a5 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests19.dat @@ -0,0 +1,1237 @@ +#data +<!doctype html><math><mn DefinitionUrl="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <math mn> +| definitionURL="foo" + +#data +<!doctype html><html></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <!-- foo --> +| <head> +| <body> + +#data +<!doctype html><head></head></p><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- foo --> +| <body> + +#data +<!doctype html><body><p><pre> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <pre> + +#data +<!doctype html><body><p><listing> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <listing> + +#data +<!doctype html><p><plaintext> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <plaintext> + +#data +<!doctype html><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <h1> + +#data +<!doctype html><form><isindex> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> + +#data +<!doctype html><isindex action="POST"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| action="POST" +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex prompt="this is isindex"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "this is isindex" +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><isindex type="hidden"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| type="hidden" +| <hr> + +#data +<!doctype html><isindex name="foo"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| <hr> + +#data +<!doctype html><ruby><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rp> + +#data +<!doctype html><ruby><div><span><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rp> + +#data +<!doctype html><ruby><div><p><rp> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rp> + +#data +<!doctype html><ruby><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <p> +| <rt> + +#data +<!doctype html><ruby><div><span><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <span> +| <rt> + +#data +<!doctype html><ruby><div><p><rt> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <ruby> +| <div> +| <p> +| <rt> + +#data +<!doctype html><math/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> +| <foo> + +#data +<!doctype html><svg/><foo> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| <foo> + +#data +<!doctype html><div></body><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| <!-- foo --> + +#data +<!doctype html><h1><div><h3><span></h1>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h1> +| <div> +| <h3> +| <span> +| "foo" + +#data +<!doctype html><p></h3>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "foo" + +#data +<!doctype html><h3><li>abc</h2>foo +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <h3> +| <li> +| "abc" +| "foo" + +#data +<!doctype html><table>abc<!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "abc" +| <table> +| <!-- foo --> + +#data +<!doctype html><table> <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| " " +| <!-- foo --> + +#data +<!doctype html><table> b <!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| " b " +| <table> +| <!-- foo --> + +#data +<!doctype html><select><option><option> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><select><option></optgroup> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> + +#data +<!doctype html><p><math><mi><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mi> +| <p> +| <h1> + +#data +<!doctype html><p><math><mo><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mo> +| <p> +| <h1> + +#data +<!doctype html><p><math><mn><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <p> +| <h1> + +#data +<!doctype html><p><math><ms><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math ms> +| <p> +| <h1> + +#data +<!doctype html><p><math><mtext><p><h1> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mtext> +| <p> +| <h1> + +#data +<!doctype html><frameset></noframes> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html c=d><body></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><html c=d><frameset></frameset></html><html a=b> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><!--foo--> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <!-- foo --> + +#data +<!doctype html><html><frameset></frameset></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| " " + +#data +<!doctype html><html><frameset></frameset></html>abc +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html><p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><html><frameset></frameset></html></p> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<html><frameset></frameset></html><!doctype html> +#errors +#document +| <html> +| <head> +| <frameset> + +#data +<!doctype html><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!doctype html><p><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><p>a<frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "a" + +#data +<!doctype html><p> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><pre><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <pre> + +#data +<!doctype html><listing><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <listing> + +#data +<!doctype html><li><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <li> + +#data +<!doctype html><dd><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dd> + +#data +<!doctype html><dt><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> + +#data +<!doctype html><button><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <button> + +#data +<!doctype html><applet><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <applet> + +#data +<!doctype html><marquee><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <marquee> + +#data +<!doctype html><object><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <object> + +#data +<!doctype html><table><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> + +#data +<!doctype html><area><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <area> + +#data +<!doctype html><basefont><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <basefont> +| <frameset> + +#data +<!doctype html><bgsound><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <bgsound> +| <frameset> + +#data +<!doctype html><br><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <br> + +#data +<!doctype html><embed><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <embed> + +#data +<!doctype html><img><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html><input><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <input> + +#data +<!doctype html><keygen><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <keygen> + +#data +<!doctype html><wbr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <wbr> + +#data +<!doctype html><hr><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <hr> + +#data +<!doctype html><textarea></textarea><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <textarea> + +#data +<!doctype html><xmp></xmp><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <xmp> + +#data +<!doctype html><iframe></iframe><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <iframe> + +#data +<!doctype html><select></select><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> + +#data +<!doctype html><svg></svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><math></math><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg><foreignObject><div> <frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<!doctype html><svg>a</svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <svg svg> +| "a" + +#data +<!doctype html><svg> </svg><frameset><frame> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> +| <frame> + +#data +<html>aaa<frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "aaa" + +#data +<html> a <frameset></frameset> +#errors +#document +| <html> +| <head> +| <body> +| "a " + +#data +<!doctype html><div><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!doctype html><div><body><frameset> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> + +#data +<!doctype html><p><math></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| "a" + +#data +<!doctype html><p><math><mn><span></p>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <math math> +| <math mn> +| <span> +| <p> +| "a" + +#data +<!doctype html><math></html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <math math> + +#data +<!doctype html><meta charset="ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| charset="ascii" +| <body> + +#data +<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <meta> +| content="text/html;charset=ascii" +| http-equiv="content-type" +| <body> + +#data +<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> +| <meta> +| charset="utf8" +| <body> + +#data +<!doctype html><html a=b><head></head><html c=d> +#errors +#document +| <!DOCTYPE html> +| <html> +| a="b" +| c="d" +| <head> +| <body> + +#data +<!doctype html><image/> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <img> + +#data +<!doctype html>a<i>b<table>c<b>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "a" +| <i> +| "bc" +| <b> +| "de" +| "f" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" + +#data +<!doctype html><table><i>a<b>b<div>c</i> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <i> +| "c" +| <table> + +#data +<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <b> +| "b" +| <b> +| <div> +| <b> +| <i> +| "c" +| <a> +| "d" +| <a> +| "e" +| <a> +| "f" +| <table> + +#data +<!doctype html><table><i>a<div>b<tr>c<b>d</i>e +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <i> +| "a" +| <div> +| "b" +| <i> +| "c" +| <b> +| "d" +| <b> +| "e" +| <table> +| <tbody> +| <tr> + +#data +<!doctype html><table><td><table><i>a<div>b<b>c</i>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| <i> +| "a" +| <div> +| <i> +| "b" +| <b> +| "c" +| <b> +| "d" +| <table> + +#data +<!doctype html><body><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <bgsound> + +#data +<!doctype html><body><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <basefont> + +#data +<!doctype html><a><b></a><basefont> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <basefont> + +#data +<!doctype html><a><b></a><bgsound> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <a> +| <b> +| <bgsound> + +#data +<!doctype html><figcaption><article></figcaption>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <figcaption> +| <article> +| "a" + +#data +<!doctype html><summary><article></summary>a +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <summary> +| <article> +| "a" + +#data +<!doctype html><p><a><plaintext>b +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <a> +| <plaintext> +| <a> +| "b" + +#data +<!DOCTYPE html><div>a<a></div>b<p>c</p>d +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <div> +| "a" +| <a> +| <a> +| "b" +| <p> +| "c" +| "d" diff --git a/lib/html5lib/tests/testdata/tree-construction/tests2.dat b/lib/html5lib/tests/testdata/tree-construction/tests2.dat new file mode 100644 index 00000000..60d85922 --- /dev/null +++ b/lib/html5lib/tests/testdata/tree-construction/tests2.dat @@ -0,0 +1,763 @@ +#data +<!DOCTYPE html>Test +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "Test" + +#data +<textarea>test</div>test +#errors +Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. +Line: 1 Col: 24 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <textarea> +| "test</div>test" + +#data +<table><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 11 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> + +#data +<table><td>test</tbody></table> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. +#document +| <html> +| <head> +| <body> +| <table> +| <tbody> +| <tr> +| <td> +| "test" + +#data +<frame>test +#errors +Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. +Line: 1 Col: 7 Unexpected start tag frame. Ignored. +#document +| <html> +| <head> +| <body> +| "test" + +#data +<!DOCTYPE html><frameset>test +#errors +Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. +Line: 1 Col: 29 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><frameset><!DOCTYPE html> +#errors +Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. +Line: 1 Col: 40 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <frameset> + +#data +<!DOCTYPE html><font><p><b>test</font> +#errors +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <p> +| <font> +| <b> +| "test" + +#data +<!DOCTYPE html><dt><div><dd> +#errors +Line: 1 Col: 28 Missing end tag (div, dt). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <dt> +| <div> +| <dd> + +#data +<script></x +#errors +Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. +Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). +#document +| <html> +| <head> +| <script> +| "</x" +| <body> + +#data +<table><plaintext><td> +#errors +Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. +Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. +Line: 1 Col: 22 Unexpected end of file. Expected table content. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "<td>" +| <table> + +#data +<plaintext></plaintext> +#errors +Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <html> +| <head> +| <body> +| <plaintext> +| "</plaintext>" + +#data +<!DOCTYPE html><table><tr>TEST +#errors +Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. +Line: 1 Col: 30 Unexpected end of file. Expected table content. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "TEST" +| <table> +| <tbody> +| <tr> + +#data +<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> +#errors +Line: 1 Col: 37 Unexpected start tag (body). +Line: 1 Col: 53 Unexpected start tag (body). +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| t1="1" +| t2="2" +| t3="3" +| t4="4" + +#data +</b test +#errors +Line: 1 Col: 8 Unexpected end of file in attribute name. +Line: 1 Col: 8 End tag contains unexpected attributes. +Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. +Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html></b test<b &=&>X +#errors +Line: 1 Col: 32 Named entity didn't end with ';'. +Line: 1 Col: 33 End tag contains unexpected attributes. +Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "X" + +#data +<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 54 Unexpected end of file in the tag name. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <script> +| type="text/x-foobar;baz" +| "X</SCRipt" +| <body> + +#data +& +#errors +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&# +#errors +Line: 1 Col: 1 Numeric entity expected. Got end of file instead. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#" + +#data +&#X +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#X" + +#data +&#x +#errors +Line: 1 Col: 3 Numeric entity expected but none found. +Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&#x" + +#data +- +#errors +Line: 1 Col: 4 Numeric entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "-" + +#data +&x-test +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&x-test" + +#data +<!doctypehtml><p><li> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <li> + +#data +<!doctypehtml><p><dt> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dt> + +#data +<!doctypehtml><p><dd> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <dd> + +#data +<!doctypehtml><p><form> +#errors +Line: 1 Col: 9 No space after literal string 'DOCTYPE'. +Line: 1 Col: 23 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| <form> + +#data +<!DOCTYPE html><p></P>X +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <p> +| "X" + +#data +& +#errors +Line: 1 Col: 4 Named entity didn't end with ';'. +Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&" + +#data +&AMp; +#errors +Line: 1 Col: 1 Named entity expected. Got none. +Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "&AMp;" + +#data +<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> +#errors +Line: 1 Col: 110 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> + +#data +<!DOCTYPE html>X</body>X +#errors +Line: 1 Col: 24 Unexpected non-space characters in the after body phase. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| "XX" + +#data +<!DOCTYPE html><!-- X +#errors +Line: 1 Col: 21 Unexpected end of file in comment. +#document +| <!DOCTYPE html> +| <!-- X --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><table><caption>test TEST</caption><td>test +#errors +Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. +Line: 1 Col: 58 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <table> +| <caption> +| "test TEST" +| <tbody> +| <tr> +| <td> +| "test" + +#data +<!DOCTYPE html><select><option><optgroup> +#errors +Line: 1 Col: 41 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> +#errors +Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. +Line: 1 Col: 76 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <option> +| <option> + +#data +<!DOCTYPE html><select><optgroup><option><optgroup> +#errors +Line: 1 Col: 51 Expected closing tag. Unexpected end of file. +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> +| <option> +| <optgroup> + +#data +<!DOCTYPE html><datalist><option>foo</datalist>bar +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <datalist> +| <option> +| "foo" +| "bar" + +#data +<!DOCTYPE html><font><input><input></font> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <font> +| <input> +| <input> + +#data +<!DOCTYPE html><!-- XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX +#errors +Line: 1 Col: 29 Unexpected end of file in comment (-) +#document +| <!DOCTYPE html> +| <!-- XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><!-- XXX - XXX - XXX --> +#errors +#document +| <!DOCTYPE html> +| <!-- XXX - XXX - XXX --> +| <html> +| <head> +| <body> + +#data +<isindex test=x name=x> +#errors +Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. +Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! +#document +| <html> +| <head> +| <body> +| <form> +| <hr> +| <label> +| "This is a searchable index. Enter search keywords: " +| <input> +| name="isindex" +| test="x" +| <hr> + +#data +test +test +#errors +Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> +| "test +test" + +#data +<!DOCTYPE html><body><title>test</body> +#errors +#document +| +| +| +| +| +| "test</body>" + +#data +<!DOCTYPE html><body><title>X +#errors +#document +| +| +| +| +| +| "X" +| <meta> +| name="z" +| <link> +| rel="foo" +| <style> +| " +x { content:"</style" } " + +#data +<!DOCTYPE html><select><optgroup></optgroup></select> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> +| <select> +| <optgroup> + +#data + + +#errors +Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. +#document +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html> <html> +#errors +#document +| <!DOCTYPE html> +| <html> +| <head> +| <body> + +#data +<!DOCTYPE html><script> +</script> <title>x +#errors +#document +| +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. +#document +| +| +| +#errors +Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. +#document +| +| +| +| +| "x" +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). +#document +| +| +| --> x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +| x +#errors +Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. +#document +| +| +|

    +#errors +#document +| +| +| +| +| +| ddd +#errors +#document +| +| +| +#errors +#document +| +| +| +| +|
  • +| +|