From e4bb0b00ba535d95161d29ac62ebda015dadbc58 Mon Sep 17 00:00:00 2001 From: Rekushi <170186554+RekuNote@users.noreply.github.com> Date: Mon, 31 Aug 2026 20:33:10 +0100 Subject: [PATCH] feat: port Hatena server to Python 3 * Update server-side database and dynamic resource code for Python 3 * Preserve existing Flipnote, UGO, NTFT, CSS, localization, and Hatena assets * Port Flipnote upload and movie endpoints * Update front page UGO menu generators * Preserve existing database and sample Flipnote data * Add regression tests for database operations and binary formats * Add server resource loading tests * Maintain compatibility with the original DSi Flipnote Studio protocol --- .../74CC1F_0D3AA40F2B3A0_000.ppm | Bin 0 -> 4448 bytes .../Creators/913304C0CC74CC1F/flipnotes.dat | 1 + database/__init__.py | 161 ++++ database/new_flipnotes.dat | 1 + hatenadir/css/ds/basic.css | 830 +++++++++++++++++ hatenadir/css/ds/camp100618.css | 863 ++++++++++++++++++ hatenadir/css/ds/common.css | 808 ++++++++++++++++ hatenadir/ds/v2-xx/__ntfts/News.ntft | 1 + hatenadir/ds/v2-xx/__ntfts/Special Room.ntft | 1 + hatenadir/ds/v2-xx/de/confirm/delete.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/de/confirm/download.txt | Bin 0 -> 486 bytes hatenadir/ds/v2-xx/de/confirm/upload.txt | Bin 0 -> 424 bytes hatenadir/ds/v2-xx/de/eula.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/en/confirm/delete.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/en/confirm/download.txt | Bin 0 -> 486 bytes hatenadir/ds/v2-xx/en/confirm/upload.txt | Bin 0 -> 424 bytes hatenadir/ds/v2-xx/en/eula.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/es/confirm/delete.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/es/confirm/download.txt | Bin 0 -> 486 bytes hatenadir/ds/v2-xx/es/confirm/upload.txt | Bin 0 -> 424 bytes hatenadir/ds/v2-xx/es/eula.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/eula_list.tsv | 1 + hatenadir/ds/v2-xx/fr/confirm/delete.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/fr/confirm/download.txt | Bin 0 -> 486 bytes hatenadir/ds/v2-xx/fr/confirm/upload.txt | Bin 0 -> 424 bytes hatenadir/ds/v2-xx/fr/eula.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py | 73 ++ .../ds/v2-xx/frontpage/likedmovies.ugo.py | 73 ++ hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py | 67 ++ hatenadir/ds/v2-xx/help/info.htm | 1 + hatenadir/ds/v2-xx/help/post_howto.htm | 1 + hatenadir/ds/v2-xx/inbox.ugoxml | 20 + hatenadir/ds/v2-xx/index.ugoxml | 29 + hatenadir/ds/v2-xx/it/confirm/delete.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/it/confirm/download.txt | Bin 0 -> 486 bytes hatenadir/ds/v2-xx/it/confirm/upload.txt | Bin 0 -> 424 bytes hatenadir/ds/v2-xx/it/eula.txt | Bin 0 -> 386 bytes hatenadir/ds/v2-xx/movie.py | 221 +++++ hatenadir/ds/v2-xx/post/flipnote.post.py | 25 + hatenadir/images/ds/kaeru.ntft | 1 + hatenadir/images/ds/list.ntft | 1 + .../images/ds/theme/basic/background.nbf | Bin 0 -> 49232 bytes hatenadir/images/ds/theme/basic/foot.ntft | 1 + hatenadir/images/ds/theme/basic/head.ntft | 1 + hatenadir/images/ds/thumb_down.ntft | 1 + tests/test_database.py | 59 ++ tests/test_formats.py | 98 ++ tests/test_server_resources.py | 124 +++ 48 files changed, 3463 insertions(+) create mode 100644 database/Creators/913304C0CC74CC1F/74CC1F_0D3AA40F2B3A0_000.ppm create mode 100644 database/Creators/913304C0CC74CC1F/flipnotes.dat create mode 100644 database/__init__.py create mode 100644 database/new_flipnotes.dat create mode 100644 hatenadir/css/ds/basic.css create mode 100644 hatenadir/css/ds/camp100618.css create mode 100644 hatenadir/css/ds/common.css create mode 100644 hatenadir/ds/v2-xx/__ntfts/News.ntft create mode 100644 hatenadir/ds/v2-xx/__ntfts/Special Room.ntft create mode 100644 hatenadir/ds/v2-xx/de/confirm/delete.txt create mode 100644 hatenadir/ds/v2-xx/de/confirm/download.txt create mode 100644 hatenadir/ds/v2-xx/de/confirm/upload.txt create mode 100644 hatenadir/ds/v2-xx/de/eula.txt create mode 100644 hatenadir/ds/v2-xx/en/confirm/delete.txt create mode 100644 hatenadir/ds/v2-xx/en/confirm/download.txt create mode 100644 hatenadir/ds/v2-xx/en/confirm/upload.txt create mode 100644 hatenadir/ds/v2-xx/en/eula.txt create mode 100644 hatenadir/ds/v2-xx/es/confirm/delete.txt create mode 100644 hatenadir/ds/v2-xx/es/confirm/download.txt create mode 100644 hatenadir/ds/v2-xx/es/confirm/upload.txt create mode 100644 hatenadir/ds/v2-xx/es/eula.txt create mode 100644 hatenadir/ds/v2-xx/eula_list.tsv create mode 100644 hatenadir/ds/v2-xx/fr/confirm/delete.txt create mode 100644 hatenadir/ds/v2-xx/fr/confirm/download.txt create mode 100644 hatenadir/ds/v2-xx/fr/confirm/upload.txt create mode 100644 hatenadir/ds/v2-xx/fr/eula.txt create mode 100644 hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py create mode 100644 hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py create mode 100644 hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py create mode 100644 hatenadir/ds/v2-xx/help/info.htm create mode 100644 hatenadir/ds/v2-xx/help/post_howto.htm create mode 100644 hatenadir/ds/v2-xx/inbox.ugoxml create mode 100644 hatenadir/ds/v2-xx/index.ugoxml create mode 100644 hatenadir/ds/v2-xx/it/confirm/delete.txt create mode 100644 hatenadir/ds/v2-xx/it/confirm/download.txt create mode 100644 hatenadir/ds/v2-xx/it/confirm/upload.txt create mode 100644 hatenadir/ds/v2-xx/it/eula.txt create mode 100644 hatenadir/ds/v2-xx/movie.py create mode 100644 hatenadir/ds/v2-xx/post/flipnote.post.py create mode 100644 hatenadir/images/ds/kaeru.ntft create mode 100644 hatenadir/images/ds/list.ntft create mode 100644 hatenadir/images/ds/theme/basic/background.nbf create mode 100644 hatenadir/images/ds/theme/basic/foot.ntft create mode 100644 hatenadir/images/ds/theme/basic/head.ntft create mode 100644 hatenadir/images/ds/thumb_down.ntft create mode 100644 tests/test_database.py create mode 100644 tests/test_formats.py create mode 100644 tests/test_server_resources.py diff --git a/database/Creators/913304C0CC74CC1F/74CC1F_0D3AA40F2B3A0_000.ppm b/database/Creators/913304C0CC74CC1F/74CC1F_0D3AA40F2B3A0_000.ppm new file mode 100644 index 0000000000000000000000000000000000000000..df5680a28c776ee1c7c4d9ce04bfc14ceea51ef6 GIT binary patch literal 4448 zcmeHKZ-`w-6+iQ4bLVY3xp(`vm78$$-py_(#aftsuhLt2?!Lq#DJ&9JLkS|>#E2Tw z=B6#lD>m6u24qX>1o=5XKDLy*v6S>&e(z0 zH?Qeu&NR%UtqmIngji^A5NVhw;UT8-C*x*L72KUG5~@{C93m3~OT8 z;yV4wOXkks{6{^_vD+=YxEic#VGmzX!0OgynIu*Q9$D@>`a4KdYP;)ILK@xTB zKq-B}WLa_mJFK$Gsc{To;;x0H4n7zfaKgs~W&k6xMmk_srABcz)49`Orn{9UbYyfQ z0g7Ne(V={eC=bj;s0ENnAI9!3YgpCN8jJLyuL}vtsU7ol*UPE*BVePf(770oygBOq z%%-`Kh4gcAAokyu^MZN{HcgG}N-wL#X{z37e77WRc1-?M`leE(R_<+o4dej}Qv5}D zNjI}%JUtC=+FDbH1>wPBa2cNxba5Zsq?iYl zj`D`F&(6{8zmD*#EQe{@PlLoZV435Bgk>&6m8paqT2Q)=m6?-iC1gc*yJeM&u;(0Q zWjL?g@1f8+Xl}?k2$K-io$&F*8O3BW9FkM`KBk#=RXY{ws#AVgrS%o|d@rQ+8(9Uu zXB_a9@1?Y2ily?5wzO)B`;aM^!ZlzC`WDCnH!BTEPT?|osaXUzCb`7OWZ~2c(q=eHj5HEdxFHZIUon zwpq}Fhe=u(9!dHLXvBaI^Y8xG-kJMT0Kww!F6cBA6(x7he@gNSB_l zysEn(b);>*kdY~wAXyL^0qkcIS!otyRN{r&&s8Q>o1U00RHz$a;HAoVejTS&Qggvv z;B_&y7w|Nwb84uNh498fU6J$1SNo5sKQ`QC9(LQ=f6$wkERE+45N$n};5mE#rX1UzwgtB5H^R)zFaNaK8;l3~S8&tMrzJ7~rVsU_{| z09c7sMw1=pT=<5n8#(i2N`q6JNRatLGr;6j#ur%2`4Z z(%J!Jo)F+Lr5uJ-=2844xl=BKkixgi|(9hEqSZmIjzAc}0WI zy8@wU@G!JUB6{pF498x4+El}Z#GWQ=u1l+H0B6-_aDEkH!SKy>5F>m-oV!)raLPkP zfyV*?H^!`-N?n-2sZb0j_N6OL$N&(D6PXh+;h<6{awiHWx>TVdQ+F~8AdSIga>_~? zA(JNv!4Zn{r0Z>`*!J34lBk_nrY8?1)kOaNJP9%It8hF)cJS%qdD6d#CK6napg~vP zCVe{MFDA}J}wu_q*q;=&8{5wndIDurb>8?i(x$)jJum ziv2=XiJoO_S)zW>YKF!EuZBZBi@Y{yMd>yCw1B?^h3>Zm)g=T6PFht;aXki8kZ~z2 z#T3__JX%LdT2Dun550qqu?$?6+vP%!Q9Egp*jkZ*VT(+Mz$4C6s!nk#)6ml3S(_n2 zWRVqg*I5fcvp|`1FPyqtXEc*MOIBbO#Mu;3U+1D9Zz*zIWr!@IZiq^eIwP003M%x{ zcH+km%rCt8+u7r<@?(>`*1h_}`)9k~`snK8E4K!pKECtn^!I-GyY1h`h`}W+o_TbNd^2$?h{bBEKUa!Bf=gr?wpLqJv!<8?1 zAOG`gwsMnw>cXGixv=^lo4 5000: + self.Newest = self.Newest[:5000] + with open("database/new_flipnotes.dat", "w", encoding="utf-8", newline="") as f: + f.write("\n".join("\t".join(map(str, row)) for row in self.Newest)) + self.new = False + + for creator_id in list(self.Creator.keys()): + creator_dir = os.path.join("database", "Creators", creator_id) + os.makedirs(creator_dir, exist_ok=True) + with open(os.path.join(creator_dir, "flipnotes.dat"), "w", encoding="utf-8", newline="") as f: + f.write("\n".join("\t".join(map(str, row)) for row in self.Creator[creator_id])) + del self.Creator[creator_id] + + def CreatorExists(self, CreatorID): + return os.path.exists(os.path.join("database", "Creators", CreatorID)) or CreatorID in self.Creator + + def FlipnoteExists(self, CreatorID, filename): + return os.path.exists(self.FlipnotePath(CreatorID, filename)) + + def GetCreator(self, CreatorID, Store=False): + if CreatorID in self.Creator: + return self.Creator[CreatorID] + + creator_dir = os.path.join("database", "Creators", CreatorID) + if not os.path.exists(creator_dir): + return None + + with open(os.path.join(creator_dir, "flipnotes.dat"), "r", encoding="utf-8", newline="") as f: + raw = f.read() + ret = [line.split("\t") for line in raw.splitlines() if line] + + # Current format: + # filename, views, stars, green, red, blue, purple, channel, downloads + for row in ret: + filename = row[0] + defaults = (filename, 0, 0, 0, 0, 0, 0, "", 0) + while len(row) < len(defaults): + row.append(defaults[len(row)]) + + if Store: + self.Creator[CreatorID] = ret + return ret + + def GetFlipnote(self, CreatorID, filename, Store=False): + for row in self.GetCreator(CreatorID, Store) or []: + if row[0] == filename: + return row + return False + + def GetFlipnotePPM(self, CreatorID, filename): + with open(self.FlipnotePath(CreatorID, filename), "rb") as f: + return f.read() + + def GetFlipnoteTMB(self, CreatorID, filename): + with open(self.FlipnotePath(CreatorID, filename), "rb") as f: + return f.read(0x6A0) + + def AddFlipnote(self, content, Channel=""): + content = bytes(content) + tmb = TMB().Read(content) + if not tmb: + return False + + CreatorID = tmb.EditorAuthorID + filename = tmb.CurrentFilename[:-4] + if self.FlipnoteExists(CreatorID, filename): + return False + + self.new = True + self.Newest.insert(0, (CreatorID, filename)) + + if not self.GetCreator(CreatorID, True): + self.Creator[CreatorID] = [[filename, 0, 0, 0, 0, 0, 0, Channel, 0]] + else: + self.Creator[CreatorID].append([filename, 0, 0, 0, 0, 0, 0, Channel, 0]) + + creator_dir = os.path.join("database", "Creators", CreatorID) + os.makedirs(creator_dir, exist_ok=True) + with open(self.FlipnotePath(CreatorID, filename), "wb") as f: + f.write(content) + return CreatorID, filename + + def AddView(self, CreatorID, filename): + for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []): + if flipnote[0] == filename: + self.Creator[CreatorID][i][1] = int(flipnote[1]) + 1 + self.Views += 1 + return True + return False + + def AddStar(self, CreatorID, filename, amount=1, color="yellow"): + starindices = {"yellow": 2, "green": 3, "red": 4, "blue": 5, "purple": 6} + if color not in starindices: + return False + for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []): + if flipnote[0] == filename: + idx = starindices[color] + self.Creator[CreatorID][i][idx] = int(flipnote[idx]) + amount + self.Stars += 1 + return True + return False + + def AddDownload(self, CreatorID, filename): + for i, flipnote in enumerate(self.GetCreator(CreatorID, True) or []): + if flipnote[0] == filename: + self.Creator[CreatorID][i][8] = int(flipnote[8]) + 1 + self.Downloads += 1 + return True + return False + + def FlipnotePath(self, CreatorID, filename): + return os.path.join("database", "Creators", CreatorID, filename + ".ppm") + + +Database = Database() diff --git a/database/new_flipnotes.dat b/database/new_flipnotes.dat new file mode 100644 index 0000000..20df4ab --- /dev/null +++ b/database/new_flipnotes.dat @@ -0,0 +1 @@ +913304C0CC74CC1F 74CC1F_0D3AA40F2B3A0_000 \ No newline at end of file diff --git a/hatenadir/css/ds/basic.css b/hatenadir/css/ds/basic.css new file mode 100644 index 0000000..d24c935 --- /dev/null +++ b/hatenadir/css/ds/basic.css @@ -0,0 +1,830 @@ +@charset "UTF-8"; +table.profbox { + background-color: #82c300; + color: #ffffff; +} +div.prof_out { + margin: 0 11px 0 11px; + background-color: #82c300; + border-style: solid; + border-width: 0 1px 0 1px; + border-color: #82c300; +} +span.more-f{ + color: #ffffff; +} +div.notice2 { + margin:0 11px 5px 11px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#82c300; + background-color:#fbfbfb; +} +span.url{ + text-decoration:underline; +} +span.comptxt { + color:#ff8a00; +} +span.star0 { + color:#fdc556; +} +span.star1 { + color:#138200; +} +span.star2 { + color:#ff455c; +} +span.star3 { + color:#00b0f9; +} +span.star4 { + color:#a411b9; +} +span.star0c { + color:#fdc556; +} +span.star1c { + color:#138200; +} +span.star2c { + color:#ff455c; +} +span.star3c { + color:#00b0f9; +} +span.star4c { + color:#a411b9; +} +span.orange{ + color: #ff8d45; +} +span.green { + color: #82c300; +} +span.gray{ + color: #666666; +} +span.white { + color:#FFFFFF; +} +html { + margin:0; + padding:0; +} +body { + color:#333333; + margin:0; + padding:0; +} +div.title { + margin:0 7px 0 7px; + padding:7px 5px 7px 5px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.description { + margin:0 7px 0 7px; + padding:7px 5px 7px 5px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.hr { + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.hr-tab { + border-style:solid; + border-width:0 0 1px 0; + border-color:#82c300; +} +span.timestamp { + color:#999999; +} +a.timestamp { + color:#999999; +} +a.violation { + color:#333333; +} +div.box { + padding:7px; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; + background-color:#FFFFFF; +} +div.more { + margin:7px 0 0 0; +} +div.pager { + padding:5px; +} +div.num { + margin:5px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; + background-color:#FFFFFF; +} +span.new { + color: #cc0000; +} +span.price { + color: #92cb22; +} +span.date { + color: #cccccc; +} +table.detail{ + margin:0 7px 0 7px; +} +table.fullsize { + margin:0; +} +div.item-term { + padding:3px 0 3px 5px; +} +div.item-value { + padding:3px 5px 3px 0; +} +div.item-text { + padding:3px 5px 3px 15px; +} +div.item-tcom { + padding: 3px 5px 0 5px; +} +div.item-com { + padding: 0 5px 0 5px; +} +div.td-body { + padding:3px 5px 3px 5px; +} +div.comlist { + background-color:#FFFFFF; +} +div.comment-text { + padding:3px 5px 5px 15px; +} +div.comment-memo { + padding:0 0 0 15px; +} +div.staff { + color:#FFFFFF; + background-color:#1a1a1a; +} +a.staffnam { + color:#FFFFFF; +} +div.notice { + width:226px; + margin:7px 7px 3px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.colorstar { + margin:7px 0 7px 0; +} +div.code-box{ + width:226px; + margin:7px 0 0 0; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.code-data{ + margin:7px 0 7px 0; +} +div.mail-reply { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.lett_txt { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0 2px; + border-color:#92d300; + background-color:#ffffff; +} +div.lett_to { + margin: 0 11px 0 11px; + background-color:#92d300; + color:#ffffff; + padding: 1px 0 6px 5px; +} +div.pad0{ + padding: 0 0 0 0; +} +div.pad5t{ + padding: 5px 0 0 0; +} +div.pad5b{ + padding: 0 0 5px 0; +} +div.pad1b{ + padding: 0 0 1px 0; +} +div.pad2b{ + padding: 0 0 2px 0; +} +div.pad2{ + padding: 2px 2px 2px 2px; +} +div.pad5{ + padding: 5px 5px 5px 5px; +} +div.pad0-5{ + padding: 0 5px 0 5px; +} +td.pad2{ + padding: 2px 2px 2px 2px; +} +div.pad3-5{ + padding: 3px 5px 3px 5px; +} +div.lett_from{ + padding: 3px 11px 3px 0; +} +div.pad11{ + padding: 11px 11px 11px 11px; +} +div.pad5-11{ + padding: 5px 11px 5px 11px; +} +div.pad10b{ + padding: 0 0 10px 0; +} +div.pad20b{ + padding: 0 0 20px 0; +} +div.mar0-7{ + margin: 0px 7px 0px 7px; +} +div.mar0-11{ + margin: 0px 11px 0px 11px; +} +div.mar0{ + margin: 0px 0px 0px 0px; +} +div.mar5 { + margin: 5px 5px 5px 5px; +} +div.yaritori{ + margin: 0 11px 0 11px; + background-color:#ffffff; + border-style:solid; + border-width:0 2px 0 2px; + border-color:#92d300; +} +div.gr-tit{ + margin: 0 11px 0 11px; + background-color:#92d300; + color:#ffffff; +} +div.kadomaru{ + margin: 0 11px 0 11px; +} +div.lett-note{ + margin: 5px 11px 5px 11px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92d300; + background-color:#ffffff; +} +div.pk{ + background-color:#ff3ab7; +} +div.blue{ + background-color:#3acfff; +} +div.gray{ + background-color:#cccccc; +} +div.gray_box{ + padding:5px; + border-style:solid; + border-width:1px; + border-color:#cccccc; + background-color:#ffffff; +} +div.vio-intro { + width:240px; + padding:7px 0 7px 7px; +} +div.vio-memo { + padding:0 0 10px 15px; +} +div.vio-text { + padding:0 0 10px 15px; +} +div.vio-note { + color:#999999; + padding:0 0 10px 15px; +} +div.vio-submit { + padding:10px 0 10px 0; +} +div.info-head { + padding:5px 7px 5px 7px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; + background-color:#eeeeee; +} +div.noborder{ + border-style:solid; + border-color:#CCCCCC; + border-width:0 0 0 0; +} +div.info-body { + padding:7px; +} +div.info-msg { + margin:0 0 7px 0; +} +div.news-head { + padding:5px 7px 5px 7px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; + background-color:#eeeeee; +} +div.news-body { + padding:7px; +} +div.news-h1 { + margin:7px 7px 0 7px; + padding:7px; + border-style:solid; + border-width:3px; + border-color:#91C900; +} +div.news-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#91C900; +} +img.news-memo { + margin:0 10px 5px 0; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; +} +div.info-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#91C900; +} +div.num-box{ + background-color:#cccccc; + margin:0 30px; +} +td.tit-star{ + background-color:#e9f8c3; +} +img.help{ + border-style:solid; + border-width:2px; + border-color:#ffffff; +} +div.list{ + padding:0 0 5px 0; +} +div.star-det{ + padding:5px 0 5px 0; +} +img.sc{ + border-style:solid; + border-width:1px; + border-color:#cccccc; +} +td.border { + background-color: #82c300; +} +div.border { + border-style: solid; + border-width: 0 0 5px 0; + border-color: #82c300; +} +div.border-c { + border-style: solid; + border-width: 0 0 2px 0; + border-color: #82c300; +} +td.space { + background-color: #82c300; + color: #82c300; +} +td.tabon { + color: #82c300; +} +td.taboff { + background-color: #82c300; + color: #ffffff; +} +td.tabpager { + background-color: #82c300; + color: #ffffff; +} +div.on { + padding: 1px 6px 3px 6px; +} +span.border { + color: #b2db59; +} +span.border-gray { + color: #cccccc; +} +a.taboff { + color: #ffffff; +} +div.comme { + padding: 3px 3px 3px 12px; + color: #b2db59; +} +span.text { + color: #333333; +} +td.gray { + background-color: #f2f2f2; +} +div.message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.error-message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#F5C8A7; + background-color:#FFEED8; + color:#9B2E2E; +} +div.ok-message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#C5DABA; + background-color:#E3F9DB; + color:#517B29; +} +div.guide-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#66ccff; +} +div.guide-h3 { + padding:3px 3px 3px 3px; + background-color:#66ccff; + color: #ffffff; +} +div.select-t { + color: #66ccff; + padding: 0 0 3px 0; +} +div.select-b { + padding:5px 3px 5px 3px; + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #99ccff; + background-color: #ffffff; +} +span.border-s { + color: #99ccff; +} +span.color { + color: #ffffff; +} +div.credit { + padding:5px 7px 5px 7px; + background-color:#eeeeee; +} +div.rule-tit { + background-color: #82c300; + color: #ffffff; + padding: 3px 3px 3px 3px; +} +div.rule-ind { + margin: 0 0 0 10px; +} +div.hr-prof { + border-style:solid; + border-width:0 0 3px 0; + border-color:transparent; +} +table.send { + margin: 5px 0 0 0 ; +} +div.icon { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #cccccc; +} +td.username { + height:20px; +} +td.mystatus { +} +div.prev { + padding: 1px 0 5px 0; +} +div.next { + padding: 5px 0 1px 0; +} +div.prof-det{ + padding: 0 5px 0 5px; +} +div.catch { + margin: 5px 5px 5px 5px; + padding: 5px 5px 5px 5px; + border-style: solid; + border-width: 2px 2px 2px 2px; + border-color: #ffffff; +} +a.still { + color: #ffffff; +} +div.head { + margin: 0px 0 0 0; +} +div.send { + margin: 0px 10px 3px 11px; +} +div.link { + margin: 0px 10px 0 11px; +} +img.button { + margin: 5px 0 0 0; +} +td.theme { + margin: 0 0 0 3px; +} +div.trial-h1 { + margin: 5px 0 5px 0; + padding:3px; + border-style:solid; + border-width:3px; + border-color:#91C900; +} +div.mar-b10{ +margin:0 0 10px 0; +} +div.cam1{ + margin:7px 7px 0 7px; + padding:7px; + background-color: #ff2828; + color: #ffffff; +} +div.cam2{ + margin:0 7px 0 7px; + padding:7px; + border-style:solid; + border-width: 2px 2px 2px 2px; + border-color: #ff2828; +} +table.xmas2009{ + margin: 0 10px 0 11px; + background-color: #c70606; + color: #ffffff; +} +div.yellow { + margin: 0 11px 0 11px; + background-color:#ffe800; +} +div.sttr_mes { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_gacha { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#ea475c; + background-color:#ffffff; +} +div.compsp { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#ffe800; + background-color:#fff9b7; +} +div.sttr_war { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#F5C8A7; + background-color:#FFEED8; + color:#9B2E2E; +} +div.sttr_price { + background-color:#FF9933; + color: #ffffff; +} +div.sttr_item { + width:226px; + margin:0px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_theme { + width:226px; + margin:0px 7px 3px 7px; + padding:5px; + border-style:solid; + border-width:0px 1px 1px 1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_back { + width:226px; + margin:0px 7px 0px 7px; +} +div.gift_l { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0px 2px; + border-color:#ff5252; +} +div.gift_h { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0px 2px; + border-color:#ffd616; +} +img.shop_icon { + margin:0 1px 1px 0; +} +div.help_guide { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#ffac3e; +} +div.guide-head { + color: #ffffff; + background-color: #5abcea; +} +div.guide-title { + color: #ffffff; + background-color: #5abcea; +} +div.guide-main { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#5abcea; +} +div.green-title { + color: #ffffff; + background-color: #91C900; +} +div.green-main { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#91C900; +} +table.method{ + border-style:solid; + border-width:1px; + border-color:#cccccc; +} +div.search { + background-color: #eeeeee; + border-style: solid; + border-width: 1px; + border-color:#cccccc; +} +td.keyboard { + background-color: #eeeeee; +} +table.key-tab{ + margin: 0 6px 0 6px; +} +div.keyout { + margin: 0 7px 0 7px; + border-style: solid; + border-width: 0 1px 1px 1px; + border-color:#cccccc; +} +div.on-ja { + border-style: solid; + border-width: 1px 1px 0 1px; + border-color:#cccccc; +} +div.off-en { + border-style: solid; + border-width: 1px 1px 0 0; + border-color:#cccccc; +} +div.off-aa { + border-style: solid; + border-width: 1px 1px 0 0; + border-color:#cccccc; +} +table.camp-detail { + border-style: solid; + border-width: 1px; + border-color:#cccccc; +} +table.center { + margin: 0 15px 0 16px; +} +div.codeborder { + border-style: solid; + border-width:0 1px 1px 1px; + border-color:#82c300; +} +div.codeprev { + border-style: solid; + border-width:1px; + border-color:#82c300; +} +td.code { + background-color:#ffffff; +} +table.codetab { + border-style: solid; + border-width: 1px 1px 0 1px; + border-color:#82c300; +} +div.codetab { + border-style: solid; + border-width: 0 1px 1px 1px; + border-color:#82c300; + background-color:#ffffff; +} +div.c_tab2 { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color:#82c300; + background-color:#ffffff; +} +div.topic { + border-style:solid; + border-width:1px; + border-color:#fff273; + background-color:#fff8b2; +} +div.icon-green { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #82c300; +} +div.p-block { + border-style:solid; + border-width:1px; + border-color:#000000; + color:#000000; + background-color:#ffffff; +} +div.clstar-help{ + background-color:#ffffff; + color:#82c300; +} +div.ugo4th{ + border-style:solid; + border-width:1px; + border-color:#c4260f; + background-color:#d52515; +} diff --git a/hatenadir/css/ds/camp100618.css b/hatenadir/css/ds/camp100618.css new file mode 100644 index 0000000..24246c6 --- /dev/null +++ b/hatenadir/css/ds/camp100618.css @@ -0,0 +1,863 @@ +@charset "UTF-8"; +div.head { + margin: 10px 0 0 0; +} +a { + color:#e63333; +} +table.profbox { + background-color: #353535; + color: #ffffff; +} +div.prof_out { + margin: 0 11px 0 11px; + background-color: #353535; + border-style: solid; + border-width: 0 1px 0 1px; + border-color: #6c8ff2; +} +span.more-f{ + color: #e63333; +} +div.notice2 { + margin:0 11px 5px 11px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#139a2f; + background-color:#ffffff; +} +td.border{ + background-color: #000000; +} +div.border { + border-style: solid; + border-width: 0 0 5px 0; + border-color: #000000; +} +div.border-c { + border-style: solid; + border-width: 0 0 2px 0; + border-color: #000000; +} +td.space { + background-color: #000000; +} +td.tabon { + color: #ed5151; +} +td.taboff { + background-color: #000000; + color: #ed5151; +} +td.tabpager { + background-color: #000000; + color: #ed5151; +} +span.url{ + text-decoration:underline; +} +span.comptxt { + color:#ff8a00; +} +span.star0 { + color:#fdc556; +} +span.star1 { + color:#138200; +} +span.star2 { + color:#ff455c; +} +span.star3 { + color:#00b0f9; +} +span.star4 { + color:#a411b9; +} +span.star0c { + color:#fdc556; +} +span.star1c { + color:#138200; +} +span.star2c { + color:#ff455c; +} +span.star3c { + color:#00b0f9; +} +span.star4c { + color:#a411b9; +} +span.orange{ + color: #ff8d45; +} +span.green { + color: #82c300; +} +span.gray{ + color: #666666; +} +span.white { + color:#FFFFFF; +} +html { + margin:0; + padding:0; +} +body { + color:#333333; + margin:0; + padding:0; +} +div.title { + margin:0 7px 0 7px; + padding:7px 5px 7px 5px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.description { + margin:0 7px 0 7px; + padding:7px 5px 7px 5px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.hr { + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.hr-tab { + border-style:solid; + border-width:0 0 1px 0; + border-color:#82c300; +} +span.timestamp { + color:#999999; +} +a.timestamp { + color:#999999; +} +a.violation { + color:#333333; +} +div.box { + padding:7px; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; + background-color:#FFFFFF; +} +div.more { + margin:7px 0 0 0; +} +div.pager { + padding:5px; +} +div.num { + margin:5px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; + background-color:#FFFFFF; +} +span.new { + color: #cc0000; +} +span.price { + color: #92cb22; +} +span.date { + color: #cccccc; +} +table.detail{ + margin:0 7px 0 7px; +} +table.fullsize { + margin:0; +} +div.item-term { + padding:3px 0 3px 5px; +} +div.item-value { + padding:3px 5px 3px 0; +} +div.item-text { + padding:3px 5px 3px 15px; +} +div.item-tcom { + padding: 3px 5px 0 5px; +} +div.item-com { + padding: 0 5px 0 5px; +} +div.td-body { + padding:3px 5px 3px 5px; +} +div.comlist { + background-color:#FFFFFF; +} +div.comment-text { + padding:3px 5px 5px 15px; +} +div.comment-memo { + padding:0 0 0 15px; +} +div.staff { + color:#FFFFFF; + background-color:#1a1a1a; +} +a.staffnam { + color:#FFFFFF; +} +div.notice { + width:226px; + margin:7px 7px 3px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.colorstar { + margin:7px 0 7px 0; +} +div.code-box{ + width:226px; + margin:7px 0 0 0; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.code-data{ + margin:7px 0 7px 0; +} +div.mail-reply { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.lett_txt { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0 2px; + border-color:#92d300; + background-color:#ffffff; +} +div.lett_to { + margin: 0 11px 0 11px; + background-color:#92d300; + color:#ffffff; + padding: 1px 0 6px 5px; +} +div.pad0{ + padding: 0 0 0 0; +} +div.pad5t{ + padding: 5px 0 0 0; +} +div.pad5b{ + padding: 0 0 5px 0; +} +div.pad1b{ + padding: 0 0 1px 0; +} +div.pad2b{ + padding: 0 0 2px 0; +} +div.pad2{ + padding: 2px 2px 2px 2px; +} +div.pad5{ + padding: 5px 5px 5px 5px; +} +div.pad0-5{ + padding: 0 5px 0 5px; +} +td.pad2{ + padding: 2px 2px 2px 2px; +} +div.pad3-5{ + padding: 3px 5px 3px 5px; +} +div.lett_from{ + padding: 3px 11px 3px 0; +} +div.pad11{ + padding: 11px 11px 11px 11px; +} +div.pad5-11{ + padding: 5px 11px 5px 11px; +} +div.pad10b{ + padding: 0 0 10px 0; +} +div.pad20b{ + padding: 0 0 20px 0; +} +div.mar0-7{ + margin: 0px 7px 0px 7px; +} +div.mar0-11{ + margin: 0px 11px 0px 11px; +} +div.mar0{ + margin: 0px 0px 0px 0px; +} +div.mar5 { + margin: 5px 5px 5px 5px; +} +div.yaritori{ + margin: 0 11px 0 11px; + background-color:#ffffff; + border-style:solid; + border-width:0 2px 0 2px; + border-color:#92d300; +} +div.gr-tit{ + margin: 0 11px 0 11px; + background-color:#92d300; + color:#ffffff; +} +div.kadomaru{ + margin: 0 11px 0 11px; +} +div.lett-note{ + margin: 5px 11px 5px 11px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92d300; + background-color:#ffffff; +} +div.pk{ + background-color:#ff3ab7; +} +div.blue{ + background-color:#3acfff; +} +div.gray{ + background-color:#cccccc; +} +div.gray_box{ + padding:5px; + border-style:solid; + border-width:1px; + border-color:#cccccc; + background-color:#ffffff; +} +div.vio-intro { + width:240px; + padding:7px 0 7px 7px; +} +div.vio-memo { + padding:0 0 10px 15px; +} +div.vio-text { + padding:0 0 10px 15px; +} +div.vio-note { + color:#999999; + padding:0 0 10px 15px; +} +div.vio-submit { + padding:10px 0 10px 0; +} +div.info-head { + padding:5px 7px 5px 7px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; + background-color:#eeeeee; +} +div.noborder{ + border-style:solid; + border-color:#CCCCCC; + border-width:0 0 0 0; +} +div.info-body { + padding:7px; +} +div.info-msg { + margin:0 0 7px 0; +} +div.news-head { + padding:5px 7px 5px 7px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; + background-color:#eeeeee; +} +div.news-body { + padding:7px; +} +div.news-h1 { + margin:7px 7px 0 7px; + padding:7px; + border-style:solid; + border-width:3px; + border-color:#91C900; +} +div.news-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#91C900; +} +img.news-memo { + margin:0 10px 5px 0; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; +} +div.info-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#91C900; +} +div.num-box{ + background-color:#cccccc; + margin:0 30px; +} +td.tit-star{ + background-color:#e9f8c3; +} +img.help{ + border-style:solid; + border-width:2px; + border-color:#ffffff; +} +div.list{ + padding:0 0 5px 0; +} +div.star-det{ + padding:5px 0 5px 0; +} +img.sc{ + border-style:solid; + border-width:1px; + border-color:#cccccc; +} +td.border { + background-color: #82c300; +} +div.border { + border-style: solid; + border-width: 0 0 5px 0; + border-color: #82c300; +} +div.border-c { + border-style: solid; + border-width: 0 0 2px 0; + border-color: #82c300; +} +td.space { + background-color: #82c300; + color: #82c300; +} +td.tabon { + color: #82c300; +} +td.taboff { + background-color: #82c300; + color: #ffffff; +} +td.tabpager { + background-color: #82c300; + color: #ffffff; +} +div.on { + padding: 1px 6px 3px 6px; +} +span.border { + color: #b2db59; +} +span.border-gray { + color: #cccccc; +} +a.taboff { + color: #ffffff; +} +div.comme { + padding: 3px 3px 3px 12px; + color: #b2db59; +} +span.text { + color: #333333; +} +td.gray { + background-color: #f2f2f2; +} +div.message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.error-message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#F5C8A7; + background-color:#FFEED8; + color:#9B2E2E; +} +div.ok-message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#C5DABA; + background-color:#E3F9DB; + color:#517B29; +} +div.guide-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#66ccff; +} +div.guide-h3 { + padding:3px 3px 3px 3px; + background-color:#66ccff; + color: #ffffff; +} +div.select-t { + color: #66ccff; + padding: 0 0 3px 0; +} +div.select-b { + padding:5px 3px 5px 3px; + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #99ccff; + background-color: #ffffff; +} +span.border-s { + color: #99ccff; +} +span.color { + color: #ffffff; +} +div.credit { + padding:5px 7px 5px 7px; + background-color:#eeeeee; +} +div.rule-tit { + background-color: #82c300; + color: #ffffff; + padding: 3px 3px 3px 3px; +} +div.rule-ind { + margin: 0 0 0 10px; +} +div.hr-prof { + border-style:solid; + border-width:0 0 3px 0; + border-color:transparent; +} +table.send { + margin: 5px 0 0 0 ; +} +div.icon { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #cccccc; +} +td.username { + height:20px; +} +td.mystatus { +} +div.prev { + padding: 1px 0 5px 0; +} +div.next { + padding: 5px 0 1px 0; +} +div.prof-det{ + padding: 0 5px 0 5px; +} +div.catch { + margin: 5px 5px 5px 5px; + padding: 5px 5px 5px 5px; + border-style: solid; + border-width: 2px 2px 2px 2px; + border-color: #ffffff; +} +a.still { + color: #ffffff; +} +div.head { + margin: 0px 0 0 0; +} +div.send { + margin: 0px 10px 3px 11px; +} +div.link { + margin: 0px 10px 0 11px; +} +img.button { + margin: 5px 0 0 0; +} +td.theme { + margin: 0 0 0 3px; +} +div.trial-h1 { + margin: 5px 0 5px 0; + padding:3px; + border-style:solid; + border-width:3px; + border-color:#91C900; +} +div.mar-b10{ +margin:0 0 10px 0; +} +div.cam1{ + margin:7px 7px 0 7px; + padding:7px; + background-color: #ff2828; + color: #ffffff; +} +div.cam2{ + margin:0 7px 0 7px; + padding:7px; + border-style:solid; + border-width: 2px 2px 2px 2px; + border-color: #ff2828; +} +table.xmas2009{ + margin: 0 10px 0 11px; + background-color: #c70606; + color: #ffffff; +} +div.yellow { + margin: 0 11px 0 11px; + background-color:#ffe800; +} +div.sttr_mes { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_gacha { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#ea475c; + background-color:#ffffff; +} +div.compsp { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#ffe800; + background-color:#fff9b7; +} +div.sttr_war { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#F5C8A7; + background-color:#FFEED8; + color:#9B2E2E; +} +div.sttr_price { + background-color:#FF9933; + color: #ffffff; +} +div.sttr_item { + width:226px; + margin:0px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_theme { + width:226px; + margin:0px 7px 3px 7px; + padding:5px; + border-style:solid; + border-width:0px 1px 1px 1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_back { + width:226px; + margin:0px 7px 0px 7px; +} +div.gift_l { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0px 2px; + border-color:#ff5252; +} +div.gift_h { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0px 2px; + border-color:#ffd616; +} +img.shop_icon { + margin:0 1px 1px 0; +} +div.help_guide { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#ffac3e; +} +div.guide-head { + color: #ffffff; + background-color: #5abcea; +} +div.guide-title { + color: #ffffff; + background-color: #5abcea; +} +div.guide-main { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#5abcea; +} +div.green-title { + color: #ffffff; + background-color: #91C900; +} +div.green-main { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#91C900; +} +table.method{ + border-style:solid; + border-width:1px; + border-color:#cccccc; +} +div.search { + background-color: #eeeeee; + border-style: solid; + border-width: 1px; + border-color:#cccccc; +} +td.keyboard { + background-color: #eeeeee; +} +table.key-tab{ + margin: 0 6px 0 6px; +} +div.keyout { + margin: 0 7px 0 7px; + border-style: solid; + border-width: 0 1px 1px 1px; + border-color:#cccccc; +} +div.on-ja { + border-style: solid; + border-width: 1px 1px 0 1px; + border-color:#cccccc; +} +div.off-en { + border-style: solid; + border-width: 1px 1px 0 0; + border-color:#cccccc; +} +div.off-aa { + border-style: solid; + border-width: 1px 1px 0 0; + border-color:#cccccc; +} +table.camp-detail { + border-style: solid; + border-width: 1px; + border-color:#cccccc; +} +table.center { + margin: 0 15px 0 16px; +} +div.codeborder { + border-style: solid; + border-width:0 1px 1px 1px; + border-color:#82c300; +} +div.codeprev { + border-style: solid; + border-width:1px; + border-color:#82c300; +} +td.code { + background-color:#ffffff; +} +table.codetab { + border-style: solid; + border-width: 1px 1px 0 1px; + border-color:#82c300; +} +div.codetab { + border-style: solid; + border-width: 0 1px 1px 1px; + border-color:#82c300; + background-color:#ffffff; +} +div.c_tab2 { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color:#82c300; + background-color:#ffffff; +} +div.topic { + border-style:solid; + border-width:1px; + border-color:#fff273; + background-color:#fff8b2; +} +div.icon-green { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #82c300; +} +div.p-block { + border-style:solid; + border-width:1px; + border-color:#000000; + color:#000000; + background-color:#ffffff; +} +div.clstar-help{ + background-color:#ffffff; + color:#82c300; +} +div.ugo4th{ + border-style:solid; + border-width:1px; + border-color:#c4260f; + background-color:#d52515; +} diff --git a/hatenadir/css/ds/common.css b/hatenadir/css/ds/common.css new file mode 100644 index 0000000..04949bb --- /dev/null +++ b/hatenadir/css/ds/common.css @@ -0,0 +1,808 @@ +@charset "UTF-8"; +span.url{ + text-decoration:underline; +} +span.comptxt { + color:#ff8a00; +} +span.star0 { + color:#fdc556; +} +span.star1 { + color:#138200; +} +span.star2 { + color:#ff455c; +} +span.star3 { + color:#00b0f9; +} +span.star4 { + color:#a411b9; +} +span.star0c { + color:#fdc556; +} +span.star1c { + color:#138200; +} +span.star2c { + color:#ff455c; +} +span.star3c { + color:#00b0f9; +} +span.star4c { + color:#a411b9; +} +span.orange{ + color: #ff8d45; +} +span.green { + color: #82c300; +} +span.gray{ + color: #666666; +} +span.white { + color:#FFFFFF; +} +html { + margin:0; + padding:0; +} +body { + color:#333333; + margin:0; + padding:0; +} +div.title { + margin:0 7px 0 7px; + padding:7px 5px 7px 5px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.description { + margin:0 7px 0 7px; + padding:7px 5px 7px 5px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.hr { + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; +} +div.hr-tab { + border-style:solid; + border-width:0 0 1px 0; + border-color:#82c300; +} +span.timestamp { + color:#999999; +} +a.timestamp { + color:#999999; +} +a.violation { + color:#333333; +} +div.box { + padding:7px; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; + background-color:#FFFFFF; +} +div.more { + margin:7px 0 0 0; +} +div.pager { + padding:5px; +} +div.num { + margin:5px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; + background-color:#FFFFFF; +} +span.new { + color: #cc0000; +} +span.price { + color: #92cb22; +} +span.date { + color: #cccccc; +} +table.detail{ + margin:0 7px 0 7px; +} +table.fullsize { + margin:0; +} +div.item-term { + padding:3px 0 3px 5px; +} +div.item-value { + padding:3px 5px 3px 0; +} +div.item-text { + padding:3px 5px 3px 15px; +} +div.item-tcom { + padding: 3px 5px 0 5px; +} +div.item-com { + padding: 0 5px 0 5px; +} +div.td-body { + padding:3px 5px 3px 5px; +} +div.comlist { + background-color:#FFFFFF; +} +div.comment-text { + padding:3px 5px 5px 15px; +} +div.comment-memo { + padding:0 0 0 15px; +} +div.staff { + color:#FFFFFF; + background-color:#1a1a1a; +} +a.staffnam { + color:#FFFFFF; +} +div.notice { + width:226px; + margin:7px 7px 3px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.colorstar { + margin:7px 0 7px 0; +} +div.code-box{ + width:226px; + margin:7px 0 0 0; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.code-data{ + margin:7px 0 7px 0; +} +div.mail-reply { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.lett_txt { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0 2px; + border-color:#92d300; + background-color:#ffffff; +} +div.lett_to { + margin: 0 11px 0 11px; + background-color:#92d300; + color:#ffffff; + padding: 1px 0 6px 5px; +} +div.pad0{ + padding: 0 0 0 0; +} +div.pad5t{ + padding: 5px 0 0 0; +} +div.pad5b{ + padding: 0 0 5px 0; +} +div.pad1b{ + padding: 0 0 1px 0; +} +div.pad2b{ + padding: 0 0 2px 0; +} +div.pad2{ + padding: 2px 2px 2px 2px; +} +div.pad5{ + padding: 5px 5px 5px 5px; +} +div.pad0-5{ + padding: 0 5px 0 5px; +} +td.pad2{ + padding: 2px 2px 2px 2px; +} +div.pad3-5{ + padding: 3px 5px 3px 5px; +} +div.lett_from{ + padding: 3px 11px 3px 0; +} +div.pad11{ + padding: 11px 11px 11px 11px; +} +div.pad5-11{ + padding: 5px 11px 5px 11px; +} +div.pad10b{ + padding: 0 0 10px 0; +} +div.pad20b{ + padding: 0 0 20px 0; +} +div.mar0-7{ + margin: 0px 7px 0px 7px; +} +div.mar0-11{ + margin: 0px 11px 0px 11px; +} +div.mar0{ + margin: 0px 0px 0px 0px; +} +div.mar5 { + margin: 5px 5px 5px 5px; +} +div.yaritori{ + margin: 0 11px 0 11px; + background-color:#ffffff; + border-style:solid; + border-width:0 2px 0 2px; + border-color:#92d300; +} +div.gr-tit{ + margin: 0 11px 0 11px; + background-color:#92d300; + color:#ffffff; +} +div.kadomaru{ + margin: 0 11px 0 11px; +} +div.lett-note{ + margin: 5px 11px 5px 11px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92d300; + background-color:#ffffff; +} +div.pk{ + background-color:#ff3ab7; +} +div.blue{ + background-color:#3acfff; +} +div.gray{ + background-color:#cccccc; +} +div.gray_box{ + padding:5px; + border-style:solid; + border-width:1px; + border-color:#cccccc; + background-color:#ffffff; +} +div.vio-intro { + width:240px; + padding:7px 0 7px 7px; +} +div.vio-memo { + padding:0 0 10px 15px; +} +div.vio-text { + padding:0 0 10px 15px; +} +div.vio-note { + color:#999999; + padding:0 0 10px 15px; +} +div.vio-submit { + padding:10px 0 10px 0; +} +div.info-head { + padding:5px 7px 5px 7px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; + background-color:#eeeeee; +} +div.noborder{ + border-style:solid; + border-color:#CCCCCC; + border-width:0 0 0 0; +} +div.info-body { + padding:7px; +} +div.info-msg { + margin:0 0 7px 0; +} +div.news-head { + padding:5px 7px 5px 7px; + border-style:solid; + border-width:0 0 1px 0; + border-color:#CCCCCC; + background-color:#eeeeee; +} +div.news-body { + padding:7px; +} +div.news-h1 { + margin:7px 7px 0 7px; + padding:7px; + border-style:solid; + border-width:3px; + border-color:#91C900; +} +div.news-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#91C900; +} +img.news-memo { + margin:0 10px 5px 0; + border-style:solid; + border-width:1px; + border-color:#CCCCCC; +} +div.info-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#91C900; +} +div.num-box{ + background-color:#cccccc; + margin:0 30px; +} +td.tit-star{ + background-color:#e9f8c3; +} +img.help{ + border-style:solid; + border-width:2px; + border-color:#ffffff; +} +div.list{ + padding:0 0 5px 0; +} +div.star-det{ + padding:5px 0 5px 0; +} +img.sc{ + border-style:solid; + border-width:1px; + border-color:#cccccc; +} +td.border { + background-color: #82c300; +} +div.border { + border-style: solid; + border-width: 0 0 5px 0; + border-color: #82c300; +} +div.border-c { + border-style: solid; + border-width: 0 0 2px 0; + border-color: #82c300; +} +td.space { + background-color: #82c300; + color: #82c300; +} +td.tabon { + color: #82c300; +} +td.taboff { + background-color: #82c300; + color: #ffffff; +} +td.tabpager { + background-color: #82c300; + color: #ffffff; +} +div.on { + padding: 1px 6px 3px 6px; +} +span.border { + color: #b2db59; +} +span.border-gray { + color: #cccccc; +} +a.taboff { + color: #ffffff; +} +div.comme { + padding: 3px 3px 3px 12px; + color: #b2db59; +} +span.text { + color: #333333; +} +td.gray { + background-color: #f2f2f2; +} +div.message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#BCCDED; + background-color:#E5EEFE; +} +div.error-message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#F5C8A7; + background-color:#FFEED8; + color:#9B2E2E; +} +div.ok-message { + width:226px; + margin:7px 7px 2px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#C5DABA; + background-color:#E3F9DB; + color:#517B29; +} +div.guide-h2 { + padding:0 0 3px 7px; + border-style:solid; + border-width:0 0 1px 4px; + border-color:#66ccff; +} +div.guide-h3 { + padding:3px 3px 3px 3px; + background-color:#66ccff; + color: #ffffff; +} +div.select-t { + color: #66ccff; + padding: 0 0 3px 0; +} +div.select-b { + padding:5px 3px 5px 3px; + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #99ccff; + background-color: #ffffff; +} +span.border-s { + color: #99ccff; +} +span.color { + color: #ffffff; +} +div.credit { + padding:5px 7px 5px 7px; + background-color:#eeeeee; +} +div.rule-tit { + background-color: #82c300; + color: #ffffff; + padding: 3px 3px 3px 3px; +} +div.rule-ind { + margin: 0 0 0 10px; +} +div.hr-prof { + border-style:solid; + border-width:0 0 3px 0; + border-color:transparent; +} +table.send { + margin: 5px 0 0 0 ; +} +div.icon { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #cccccc; +} +td.username { + height:20px; +} +td.mystatus { +} +div.prev { + padding: 1px 0 5px 0; +} +div.next { + padding: 5px 0 1px 0; +} +div.prof-det{ + padding: 0 5px 0 5px; +} +div.catch { + margin: 5px 5px 5px 5px; + padding: 5px 5px 5px 5px; + border-style: solid; + border-width: 2px 2px 2px 2px; + border-color: #ffffff; +} +a.still { + color: #ffffff; +} +div.head { + margin: 0px 0 0 0; +} +div.send { + margin: 0px 10px 3px 11px; +} +div.link { + margin: 0px 10px 0 11px; +} +img.button { + margin: 5px 0 0 0; +} +td.theme { + margin: 0 0 0 3px; +} +div.trial-h1 { + margin: 5px 0 5px 0; + padding:3px; + border-style:solid; + border-width:3px; + border-color:#91C900; +} +div.mar-b10{ +margin:0 0 10px 0; +} +div.cam1{ + margin:7px 7px 0 7px; + padding:7px; + background-color: #ff2828; + color: #ffffff; +} +div.cam2{ + margin:0 7px 0 7px; + padding:7px; + border-style:solid; + border-width: 2px 2px 2px 2px; + border-color: #ff2828; +} +table.xmas2009{ + margin: 0 10px 0 11px; + background-color: #c70606; + color: #ffffff; +} +div.yellow { + margin: 0 11px 0 11px; + background-color:#ffe800; +} +div.sttr_mes { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_gacha { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#ea475c; + background-color:#ffffff; +} +div.compsp { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#ffe800; + background-color:#fff9b7; +} +div.sttr_war { + width:226px; + margin:7px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#F5C8A7; + background-color:#FFEED8; + color:#9B2E2E; +} +div.sttr_price { + background-color:#FF9933; + color: #ffffff; +} +div.sttr_item { + width:226px; + margin:0px 7px 0px 7px; + padding:5px; + border-style:solid; + border-width:1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_theme { + width:226px; + margin:0px 7px 3px 7px; + padding:5px; + border-style:solid; + border-width:0px 1px 1px 1px; + border-color:#92cb22; + background-color:#ffffff; +} +div.sttr_back { + width:226px; + margin:0px 7px 0px 7px; +} +div.gift_l { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0px 2px; + border-color:#ff5252; +} +div.gift_h { + margin: 0 11px 0 11px; + border-style:solid; + border-width:0 2px 0px 2px; + border-color:#ffd616; +} +img.shop_icon { + margin:0 1px 1px 0; +} +div.help_guide { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#ffac3e; +} +div.guide-head { + color: #ffffff; + background-color: #5abcea; +} +div.guide-title { + color: #ffffff; + background-color: #5abcea; +} +div.guide-main { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#5abcea; +} +div.green-title { + color: #ffffff; + background-color: #91C900; +} +div.green-main { + border-style:solid; + border-width:0 1px 1px 1px; + border-color:#91C900; +} +table.method{ + border-style:solid; + border-width:1px; + border-color:#cccccc; +} +div.search { + background-color: #eeeeee; + border-style: solid; + border-width: 1px; + border-color:#cccccc; +} +td.keyboard { + background-color: #eeeeee; +} +table.key-tab{ + margin: 0 6px 0 6px; +} +div.keyout { + margin: 0 7px 0 7px; + border-style: solid; + border-width: 0 1px 1px 1px; + border-color:#cccccc; +} +div.on-ja { + border-style: solid; + border-width: 1px 1px 0 1px; + border-color:#cccccc; +} +div.off-en { + border-style: solid; + border-width: 1px 1px 0 0; + border-color:#cccccc; +} +div.off-aa { + border-style: solid; + border-width: 1px 1px 0 0; + border-color:#cccccc; +} +table.camp-detail { + border-style: solid; + border-width: 1px; + border-color:#cccccc; +} +table.center { + margin: 0 15px 0 16px; +} +div.codeborder { + border-style: solid; + border-width:0 1px 1px 1px; + border-color:#82c300; +} +div.codeprev { + border-style: solid; + border-width:1px; + border-color:#82c300; +} +td.code { + background-color:#ffffff; +} +table.codetab { + border-style: solid; + border-width: 1px 1px 0 1px; + border-color:#82c300; +} +div.codetab { + border-style: solid; + border-width: 0 1px 1px 1px; + border-color:#82c300; + background-color:#ffffff; +} +div.c_tab2 { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color:#82c300; + background-color:#ffffff; +} +div.topic { + border-style:solid; + border-width:1px; + border-color:#fff273; + background-color:#fff8b2; +} +div.icon-green { + border-style: solid; + border-width: 1px 1px 1px 1px; + border-color: #82c300; +} +div.p-block { + border-style:solid; + border-width:1px; + border-color:#000000; + color:#000000; + background-color:#ffffff; +} +div.clstar-help{ + background-color:#ffffff; + color:#82c300; +} +div.ugo4th{ + border-style:solid; + border-width:1px; + border-color:#c4260f; + background-color:#d52515; +} \ No newline at end of file diff --git a/hatenadir/ds/v2-xx/__ntfts/News.ntft b/hatenadir/ds/v2-xx/__ntfts/News.ntft new file mode 100644 index 0000000..8dadbcf --- /dev/null +++ b/hatenadir/ds/v2-xx/__ntfts/News.ntft @@ -0,0 +1 @@ +’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Óςς’Ó’Óςς’Ó’Ó’Ó’Ó’Ó’Óςςςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Ó’ÓĻ‚’Óςςςς’ÓĻ‚’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’ÓĻ‚’Óςςςς’ÓĻ‚’Ó’Ó’Ó’Ó’Óςςςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Ó’Óςςςςςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Óςςςςςςςςςς’Ó’Ó’Ó’Óςςςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Óςς’Ó’Ó’Ó’Ó’Ó’Óςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Óςςς’Ó’Ó’Ó’Ó’Ó’Óςςς’Ó’Ó’Óςςςςςςςς’Ó’Ó’Óςςςς’Ó’Óςςςς’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Óςςςς’Ó’Óςςςς’Ó’Ó’Ó’Óςςςςςςςς’Ó’Ó’Óςςςς’Ó’Óςςςςςςςςςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Óςςςςςςςςςςςςςςς’Óςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Óςςςςςς’Óςςςςςςςςςςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Óςςςςςςςςς’Óςςςςςςςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Óςςςςςςςςςςςςςςς’Óςςςςςς’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςς’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Ó’Óςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςςς’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ \ No newline at end of file diff --git a/hatenadir/ds/v2-xx/__ntfts/Special Room.ntft b/hatenadir/ds/v2-xx/__ntfts/Special Room.ntft new file mode 100644 index 0000000..cbf8957 --- /dev/null +++ b/hatenadir/ds/v2-xx/__ntfts/Special Room.ntft @@ -0,0 +1 @@ +’’’’’’’’’’’’’’’»ćšŪÜė’’’’’’’’’’’’’’’’’’’’’’’’ŻļyÓ«®Š®Š®Š®Š®Š®ŠŠ–5»»ß’’’’’’’’’’’’’’’’’’ŻļV殊®Š®Š®Š®Š®Š®Š®Š®Š®Š®Š®ŠńžšŪ’’’’’’’’’’’’’’’xĻ®Š®Š®Š®Š®Š®ŠŠŽņšŸń’ŠŽ®Š®Š®Š®Š®Šņ¢Üė’’’’’’’’’’’’5·®Š®Š®Š®Š5£š·žĒ’˒˒˒˒˼æxÆŃ’®Š®Š®ŠÆŠšß’’’’’’’’’’Æ®Š®Š®Šņš»»’Ė’Ė’Ė’Ė’ĖW«®ŠŻĆ’Ė’Ė’Ėy³®Š®Š®Š®Ššß’’’’’’’’VîЮЮŠV§’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«®Šń–š·’Ė’Ė’Ė¼æŠ’®Š®Š®Š¼ė’’’’’’šŪ®Š®Š®ŠW«’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«®Š®Š®ŠÆŽ6§ŻĆ’ĖŻĆŠ’®Š®ŠŃš’’’’’’Š–®Š®Š4£’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ÆŽ®Š®Š®Š®ŠÆŽy³’ĖÜæ®Š®Š®ŠyÓ’’’’™×®Š®ŠŠ’ŽĒ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš¼æ5£®Š®Š®ŠÆŽŻĆ’˚·®Š®ŠĻ’’’’’ņ¢®Š®Šš·’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’ĖžĒW«®Š®Š»»’Ė’Ėņ–®Š®Šš×’’Ü뮊®ŠŠŽ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’Ė’Ė5£®ŠŻĆ’˒˚·®Š®Š«’’WîЮŠ5£’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’ĖžĒŠ’6§’Ė’Ė’ĖžĒ®Š®Š®Š’’³®Š®Šš·’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’ĖŻĆń–’Ė’Ė’Ė’Ė’Ėņ–®Š®Š¼ē’ņ¢®Š®Š¼æ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė4Ÿ®Š®Š™×’њ®Š®ŠŻĆ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė5£®Š®ŠxĻ’њ®Š®ŠŻĆ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė5£®Š®ŠxĻ’ņ¦®Š®Š»»’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖŸ®Š®Šš×’5»®Š®ŠxÆ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ėń’®Š®ŠÜė’yӮЮŠ5£’Ė’Ė’Ė’Ė’ĖŻĆxÆŸņš6§»»W«ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖŻĆ®Š®ŠĻ’’’Żļ®Š®ŠÆŠŻĆ’Ė’Ė’Ė6§®Š®Š®Š®Š®Š®ŠŠ’ņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖW«®Š®Š5·’’’4·®Š®ŠV§’Ė’Ė¼æ®Š®Š®Š®Š®Š®Š®Š®Šņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖŻĆÆŠ®Š®Š»ć’’’»ć®Š®Š®Š¼æ’Ė»»®Š®Š®Š®Š®Š®Š®Š®Šņš’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖV§®Š®Šņ¦’’’’’³®Š®ŠŠ’ŽĆ’Ėń–®Š®Š®Š®Š®Š®ŠÆŽ¼æ’Ė’Ė’Ė’Ė’Ė’Ė’Ė™³®Š®Š®Š»ć’’’’’¼ė®Š®Š®Š›ŽĆ’Ėy³W«ņšņš6§y³žĒ’Ė’Ė’Ė’Ė’Ė’Ė’Ė»»®Š®Š®Š4³’’’’’’’šß®Š®Š®Šń’Żæ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’ĖxÆ®Š®Š®Šńž’’’’’’’’’xϮЮЮЮŠw«žĒ’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė’Ė»»Ÿ®Š®Š®ŠŠ’Żļ’’’’’’’’’’š×®Š®Š®Š®ŠŠŽ5£š·ŻĆŽĆžĒŽĆ»»xÆ›®Š®Š®Š®Šņ¦’’’’’’’’’’’’’¼ė«®Š®Š®Š®Š®Š®Š®Š®Š®Š®Š®Š®Š®Š®Š®ŠWĒ’’’’’’’’’’’’’’’’»ßÆ®Š®Š®Š®Š®Š®Š®Š®Š®Š®ŠÆŽVæÜė’’’’’’’’’’’’’’’’’’’ÜėxĻÆŃšŠ’Ļ’Š’ņ¢5»»ß’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’ \ No newline at end of file diff --git a/hatenadir/ds/v2-xx/de/confirm/delete.txt b/hatenadir/ds/v2-xx/de/confirm/delete.txt new file mode 100644 index 0000000000000000000000000000000000000000..f53d3fa1e88c8ecef37d321c1e44160e88dabdc2 GIT binary patch literal 386 zcmZ9IT?&IR5QOKsr^s91JVhxzKraygXhDsrSbF<@6BVS0*<^QiW@n#z>8)8ocXixG z4N6+nkooZL_=3v(t~on?S8KAZCa^uX5yVVx)|J;oF=GZ|AlHCf^I7Pk8@Dq{zoRGA zVpgk&!#>BMJ<&D8n&7g!nf@oXiv>Sc4>?+OV`$(D^d(#ks3cJKV;|-WnRm^**s`9% nRqKsltiDxBeRG$!?9KioaiQB&o;SB`^KcQ_SqrAxxeBm98BazG literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/de/confirm/download.txt b/hatenadir/ds/v2-xx/de/confirm/download.txt new file mode 100644 index 0000000000000000000000000000000000000000..9850b6ae80f3f40873230b0b85e6123d2945b746 GIT binary patch literal 486 zcmZvZU2eiK5QOI_K0w7OP}L`1AnJ2~0Iq@)ISEp3&$s@OTBstg*ZVU&J82ZutJB2i zI3xZ^UKh?uExBGRnMnMqg;%Q?|4i(dGP7>HoetQjd%_v$cWUrEec+90Mw{M_-ho)a z&fH6hP9Q%D@+bA4u3Tg69Mu8)nsM5LvViHSuvwMQd*xT*9=M&pnRNu&r+o}R{)_*& zE3>FGc65i-AIer+_;_$G1+OJ<`i*dm*dc9e`_%nS{VR-mVwpqD{Kn3TSJXPc1LcRV S72VA@J+t zh8it8RD5mtUL!DW_^O%ptT|j5ANkMO5t;LhJLV=B;5wcg>vz&&#m<6#`!{-;4`hmW z;#W~IXK#3M6TLHTv<+(8HD#R9v|D7>bCaR%F=eEy(!|-gfhyWUTAvE7sjHH%i;TW+ y&z|H3bpr1wup_Jd(7Z7P zdIfbFRVmX^c|w6VQ;m(h6%{461UKXzi}-^k{0nF+^PTBvezLA{k2~&QcY9L6&l9Vs zbmSd1f1yX>>Oql6ggeuTsAsyr(jHtVrXIZGd{+l5#y>qDRU-^7$C|8RqIO8!6?z6T s^PCayN-k=X=5~vwmY8?qT@}f?DlpF(|IrF-&~0Iww`4o-$b0gA1LW31+5i9m literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/en/confirm/delete.txt b/hatenadir/ds/v2-xx/en/confirm/delete.txt new file mode 100644 index 0000000000000000000000000000000000000000..f53d3fa1e88c8ecef37d321c1e44160e88dabdc2 GIT binary patch literal 386 zcmZ9IT?&IR5QOKsr^s91JVhxzKraygXhDsrSbF<@6BVS0*<^QiW@n#z>8)8ocXixG z4N6+nkooZL_=3v(t~on?S8KAZCa^uX5yVVx)|J;oF=GZ|AlHCf^I7Pk8@Dq{zoRGA zVpgk&!#>BMJ<&D8n&7g!nf@oXiv>Sc4>?+OV`$(D^d(#ks3cJKV;|-WnRm^**s`9% nRqKsltiDxBeRG$!?9KioaiQB&o;SB`^KcQ_SqrAxxeBm98BazG literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/en/confirm/download.txt b/hatenadir/ds/v2-xx/en/confirm/download.txt new file mode 100644 index 0000000000000000000000000000000000000000..9850b6ae80f3f40873230b0b85e6123d2945b746 GIT binary patch literal 486 zcmZvZU2eiK5QOI_K0w7OP}L`1AnJ2~0Iq@)ISEp3&$s@OTBstg*ZVU&J82ZutJB2i zI3xZ^UKh?uExBGRnMnMqg;%Q?|4i(dGP7>HoetQjd%_v$cWUrEec+90Mw{M_-ho)a z&fH6hP9Q%D@+bA4u3Tg69Mu8)nsM5LvViHSuvwMQd*xT*9=M&pnRNu&r+o}R{)_*& zE3>FGc65i-AIer+_;_$G1+OJ<`i*dm*dc9e`_%nS{VR-mVwpqD{Kn3TSJXPc1LcRV S72VA@J+t zh8it8RD5mtUL!DW_^O%ptT|j5ANkMO5t;LhJLV=B;5wcg>vz&&#m<6#`!{-;4`hmW z;#W~IXK#3M6TLHTv<+(8HD#R9v|D7>bCaR%F=eEy(!|-gfhyWUTAvE7sjHH%i;TW+ y&z|H3bpr1wup_Jd(7Z7P zdIfbFRVmX^c|w6VQ;m(h6%{461UKXzi}-^k{0nF+^PTBvezLA{k2~&QcY9L6&l9Vs zbmSd1f1yX>>Oql6ggeuTsAsyr(jHtVrXIZGd{+l5#y>qDRU-^7$C|8RqIO8!6?z6T s^PCayN-k=X=5~vwmY8?qT@}f?DlpF(|IrF-&~0Iww`4o-$b0gA1LW31+5i9m literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/es/confirm/delete.txt b/hatenadir/ds/v2-xx/es/confirm/delete.txt new file mode 100644 index 0000000000000000000000000000000000000000..f53d3fa1e88c8ecef37d321c1e44160e88dabdc2 GIT binary patch literal 386 zcmZ9IT?&IR5QOKsr^s91JVhxzKraygXhDsrSbF<@6BVS0*<^QiW@n#z>8)8ocXixG z4N6+nkooZL_=3v(t~on?S8KAZCa^uX5yVVx)|J;oF=GZ|AlHCf^I7Pk8@Dq{zoRGA zVpgk&!#>BMJ<&D8n&7g!nf@oXiv>Sc4>?+OV`$(D^d(#ks3cJKV;|-WnRm^**s`9% nRqKsltiDxBeRG$!?9KioaiQB&o;SB`^KcQ_SqrAxxeBm98BazG literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/es/confirm/download.txt b/hatenadir/ds/v2-xx/es/confirm/download.txt new file mode 100644 index 0000000000000000000000000000000000000000..9850b6ae80f3f40873230b0b85e6123d2945b746 GIT binary patch literal 486 zcmZvZU2eiK5QOI_K0w7OP}L`1AnJ2~0Iq@)ISEp3&$s@OTBstg*ZVU&J82ZutJB2i zI3xZ^UKh?uExBGRnMnMqg;%Q?|4i(dGP7>HoetQjd%_v$cWUrEec+90Mw{M_-ho)a z&fH6hP9Q%D@+bA4u3Tg69Mu8)nsM5LvViHSuvwMQd*xT*9=M&pnRNu&r+o}R{)_*& zE3>FGc65i-AIer+_;_$G1+OJ<`i*dm*dc9e`_%nS{VR-mVwpqD{Kn3TSJXPc1LcRV S72VA@J+t zh8it8RD5mtUL!DW_^O%ptT|j5ANkMO5t;LhJLV=B;5wcg>vz&&#m<6#`!{-;4`hmW z;#W~IXK#3M6TLHTv<+(8HD#R9v|D7>bCaR%F=eEy(!|-gfhyWUTAvE7sjHH%i;TW+ y&z|H3bpr1wup_Jd(7Z7P zdIfbFRVmX^c|w6VQ;m(h6%{461UKXzi}-^k{0nF+^PTBvezLA{k2~&QcY9L6&l9Vs zbmSd1f1yX>>Oql6ggeuTsAsyr(jHtVrXIZGd{+l5#y>qDRU-^7$C|8RqIO8!6?z6T s^PCayN-k=X=5~vwmY8?qT@}f?DlpF(|IrF-&~0Iww`4o-$b0gA1LW31+5i9m literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/eula_list.tsv b/hatenadir/ds/v2-xx/eula_list.tsv new file mode 100644 index 0000000..63798b1 --- /dev/null +++ b/hatenadir/ds/v2-xx/eula_list.tsv @@ -0,0 +1 @@ +RQBuAGcAbABpAHMAaAA= en diff --git a/hatenadir/ds/v2-xx/fr/confirm/delete.txt b/hatenadir/ds/v2-xx/fr/confirm/delete.txt new file mode 100644 index 0000000000000000000000000000000000000000..f53d3fa1e88c8ecef37d321c1e44160e88dabdc2 GIT binary patch literal 386 zcmZ9IT?&IR5QOKsr^s91JVhxzKraygXhDsrSbF<@6BVS0*<^QiW@n#z>8)8ocXixG z4N6+nkooZL_=3v(t~on?S8KAZCa^uX5yVVx)|J;oF=GZ|AlHCf^I7Pk8@Dq{zoRGA zVpgk&!#>BMJ<&D8n&7g!nf@oXiv>Sc4>?+OV`$(D^d(#ks3cJKV;|-WnRm^**s`9% nRqKsltiDxBeRG$!?9KioaiQB&o;SB`^KcQ_SqrAxxeBm98BazG literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/fr/confirm/download.txt b/hatenadir/ds/v2-xx/fr/confirm/download.txt new file mode 100644 index 0000000000000000000000000000000000000000..9850b6ae80f3f40873230b0b85e6123d2945b746 GIT binary patch literal 486 zcmZvZU2eiK5QOI_K0w7OP}L`1AnJ2~0Iq@)ISEp3&$s@OTBstg*ZVU&J82ZutJB2i zI3xZ^UKh?uExBGRnMnMqg;%Q?|4i(dGP7>HoetQjd%_v$cWUrEec+90Mw{M_-ho)a z&fH6hP9Q%D@+bA4u3Tg69Mu8)nsM5LvViHSuvwMQd*xT*9=M&pnRNu&r+o}R{)_*& zE3>FGc65i-AIer+_;_$G1+OJ<`i*dm*dc9e`_%nS{VR-mVwpqD{Kn3TSJXPc1LcRV S72VA@J+t zh8it8RD5mtUL!DW_^O%ptT|j5ANkMO5t;LhJLV=B;5wcg>vz&&#m<6#`!{-;4`hmW z;#W~IXK#3M6TLHTv<+(8HD#R9v|D7>bCaR%F=eEy(!|-gfhyWUTAvE7sjHH%i;TW+ y&z|H3bpr1wup_Jd(7Z7P zdIfbFRVmX^c|w6VQ;m(h6%{461UKXzi}-^k{0nF+^PTBvezLA{k2~&QcY9L6&l9Vs zbmSd1f1yX>>Oql6ggeuTsAsyr(jHtVrXIZGd{+l5#y>qDRU-^7$C|8RqIO8!6?z6T s^PCayN-k=X=5~vwmY8?qT@}f?DlpF(|IrF-&~0Iww`4o-$b0gA1LW31+5i9m literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py b/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py new file mode 100644 index 0000000..2f98138 --- /dev/null +++ b/hatenadir/ds/v2-xx/frontpage/hotmovies.ugo.py @@ -0,0 +1,73 @@ +from twisted.web import resource +from twisted.internet import reactor +import time + +from hatena import Log, NotFound, request_args, request_path +from DB import Database +from Hatenatools import UGO + + +class PyResource(resource.Resource): + isLeaf = True + + def __init__(self): + super().__init__() + self.pages = [] + self.newestflip = None + self.newestview = None + self.Update() + + def render(self, request): + try: + page = int(request_args(request).get("page", ["1"])[0]) + except ValueError: + page = 1 + if 1 <= page <= len(self.pages): + path = "/".join(request_path(request).split("/")[3:]) + Log(request, "%s page %i" % (path, page)) + request.setHeader(b"content-type", b"text/plain") + return self.pages[page - 1] + return NotFound.render(request) + + def Update(self): + reactor.callLater(600, self.Update) + current = Database.Newest[0] if Database.Newest else None + if current != self.newestflip or self.newestview != Database.Views: + self.newestflip = current + self.newestview = Database.Views + reactor.callInThread(self.UpdateThreaded, list(Database.Newest)) + + def UpdateThreaded(self, flipnotes): + def score(item): + i, (creator_id, flip) = item + views, stars = Database.GetFlipnote(creator_id, flip)[1:3] + return int(views) * 60 + int(stars) // 4 - i + flipnotes = [x[1] for x in sorted(enumerate(flipnotes), key=score, reverse=True)[:500]] + pages = [] + pagecount = (len(flipnotes) + 49) // 50 + pagecount = min(pagecount, 10) + flipcount = min(len(flipnotes), 500) + for i in range(pagecount): + pages.append(self.MakePage(flipnotes[i * 50 : i * 50 + 50], i + 1, i < pagecount - 1, flipcount)) + if self.pages: + print(time.strftime("[%H:%M:%S] Updated hotmovies.ugo")) + self.pages = pages + + def MakePage(self, flipnotes, page, has_next, count): + ugo = UGO() + ugo.Loaded = True + ugo.Items = [] + ugo.Items.append(("layout", (2, 1))) + ugo.Items.append(("topscreen text", ["Popular Flipnotes", "Flipnotes", str(count), "", "The most popular new Flipnotes."], 0)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls", "Most Popular", True)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/likedmovies.uls", "Most Liked", False)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/newmovies.uls", "New Flipnotes", False)) + ugo.Items.append(("unknown", ("3", "http://flipnote.hatena.com/ds/v2-xx/help/post_howto.htm", "UABvAHMAdAAgAEYAbABpAHAAbgBvAHQAZQA="))) + if page > 1: + ugo.Items.append(("button", 115, "Previous", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls?page=%i" % (page - 1), ("", ""), None)) + for creatorid, filename in flipnotes: + stars = str(Database.GetFlipnote(creatorid, filename)[2]) + ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename + ".ppm", Database.GetFlipnoteTMB(creatorid, filename)))) + if has_next: + ugo.Items.append(("button", 115, "Next", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls?page=%i" % (page + 1), ("", ""), None)) + return ugo.Pack() diff --git a/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py b/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py new file mode 100644 index 0000000..4ee9df4 --- /dev/null +++ b/hatenadir/ds/v2-xx/frontpage/likedmovies.ugo.py @@ -0,0 +1,73 @@ +from twisted.web import resource +from twisted.internet import reactor +import time + +from hatena import Log, NotFound, request_args, request_path +from DB import Database +from Hatenatools import UGO + + +class PyResource(resource.Resource): + isLeaf = True + + def __init__(self): + super().__init__() + self.pages = [] + self.newestflip = None + self.neweststar = None + reactor.callLater(2, self.Update) + + def render(self, request): + try: + page = int(request_args(request).get("page", ["1"])[0]) + except ValueError: + page = 1 + if 1 <= page <= len(self.pages): + path = "/".join(request_path(request).split("/")[3:]) + Log(request, "%s page %i" % (path, page)) + request.setHeader(b"content-type", b"text/plain") + return self.pages[page - 1] + return NotFound.render(request) + + def Update(self): + reactor.callLater(600, self.Update) + current = Database.Newest[0] if Database.Newest else None + if current != self.newestflip or self.neweststar != Database.Stars: + self.newestflip = current + self.neweststar = Database.Stars + reactor.callInThread(self.UpdateThreaded, list(Database.Newest)) + + def UpdateThreaded(self, flipnotes): + def score(item): + i, (creator_id, flip) = item + views, stars = Database.GetFlipnote(creator_id, flip)[1:3] + return int(stars) * 110 + int(views) // 10 - i + flipnotes = [x[1] for x in sorted(enumerate(flipnotes), key=score, reverse=True)[:500]] + pages = [] + pagecount = (len(flipnotes) + 49) // 50 + pagecount = min(pagecount, 10) + flipcount = min(len(flipnotes), 500) + for i in range(pagecount): + pages.append(self.MakePage(flipnotes[i * 50 : i * 50 + 50], i + 1, i < pagecount - 1, flipcount)) + if self.pages: + print(time.strftime("[%H:%M:%S] Updated likedmovies.ugo")) + self.pages = pages + + def MakePage(self, flipnotes, page, has_next, count): + ugo = UGO() + ugo.Loaded = True + ugo.Items = [] + ugo.Items.append(("layout", (2, 1))) + ugo.Items.append(("topscreen text", ["Liked Flipnotes", "Flipnotes", str(count), "", "The most liked new Flipnotes."], 0)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls", "Most Popular", False)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/likedmovies.uls", "Most Liked", True)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/newmovies.uls", "New Flipnotes", False)) + ugo.Items.append(("unknown", ("3", "http://flipnote.hatena.com/ds/v2-xx/help/post_howto.htm", "UABvAHMAdAAgAEYAbABpAHAAbgBvAHQAZQA="))) + if page > 1: + ugo.Items.append(("button", 115, "Previous", "http://flipnote.hatena.com/ds/v2-xx/frontpage/likedmovies.uls?page=%i" % (page - 1), ("", ""), None)) + for creatorid, filename in flipnotes: + stars = str(Database.GetFlipnote(creatorid, filename)[2]) + ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename + ".ppm", Database.GetFlipnoteTMB(creatorid, filename)))) + if has_next: + ugo.Items.append(("button", 115, "Next", "http://flipnote.hatena.com/ds/v2-xx/frontpage/likedmovies.uls?page=%i" % (page + 1), ("", ""), None)) + return ugo.Pack() diff --git a/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py b/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py new file mode 100644 index 0000000..84a0910 --- /dev/null +++ b/hatenadir/ds/v2-xx/frontpage/newmovies.ugo.py @@ -0,0 +1,67 @@ +from twisted.web import resource +from twisted.internet import reactor +import time + +from hatena import Log, NotFound, request_args, request_path +from DB import Database +from Hatenatools import UGO + + +class PyResource(resource.Resource): + isLeaf = True + + def __init__(self): + super().__init__() + self.pages = [] + self.newestflip = None + reactor.callLater(4, self.Update) + + def render(self, request): + try: + page = int(request_args(request).get("page", ["1"])[0]) + except ValueError: + page = 1 + if 1 <= page <= len(self.pages): + path = "/".join(request_path(request).split("/")[3:]) + Log(request, "%s page %i" % (path, page)) + request.setHeader(b"content-type", b"text/plain") + return self.pages[page - 1] + return NotFound.render(request) + + def Update(self): + reactor.callLater(60, self.Update) + current = Database.Newest[0] if Database.Newest else None + if current != self.newestflip: + self.newestflip = current + reactor.callInThread(self.UpdateThreaded, list(Database.Newest)) + + def UpdateThreaded(self, flipnotes): + flipnotes = list(flipnotes) + pages = [] + pagecount = (len(flipnotes) + 49) // 50 + pagecount = min(pagecount, 10) + flipcount = len(flipnotes) + for i in range(pagecount): + pages.append(self.MakePage(flipnotes[i * 50 : i * 50 + 50], i + 1, i < pagecount - 1, flipcount)) + if self.pages: + print(time.strftime("[%H:%M:%S] Updated newmovies.ugo")) + self.pages = pages + + def MakePage(self, flipnotes, page, has_next, count): + ugo = UGO() + ugo.Loaded = True + ugo.Items = [] + ugo.Items.append(("layout", (2, 1))) + ugo.Items.append(("topscreen text", ["New Flipnotes", "Flipnotes", str(count), "", "The newest Flipnotes submitted."], 0)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/hotmovies.uls", "Most Popular", False)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/likedmovies.uls", "Most Liked", False)) + ugo.Items.append(("category", "http://flipnote.hatena.com/ds/v2-xx/frontpage/newmovies.uls", "New Flipnotes", True)) + ugo.Items.append(("unknown", ("3", "http://flipnote.hatena.com/ds/v2-xx/help/post_howto.htm", "UABvAHMAdAAgAEYAbABpAHAAbgBvAHQAZQA="))) + if page > 1: + ugo.Items.append(("button", 115, "Previous", "http://flipnote.hatena.com/ds/v2-xx/frontpage/newmovies.uls?page=%i" % (page - 1), ("", ""), None)) + for creatorid, filename in flipnotes: + stars = str(Database.GetFlipnote(creatorid, filename)[2]) + ugo.Items.append(("button", 3, "", "http://flipnote.hatena.com/ds/v2-xx/movie/%s/%s.ppm" % (creatorid, filename), (stars, "765", "573", "0"), (filename + ".ppm", Database.GetFlipnoteTMB(creatorid, filename)))) + if has_next: + ugo.Items.append(("button", 115, "Next", "http://flipnote.hatena.com/ds/v2-xx/frontpage/newmovies.uls?page=%i" % (page + 1), ("", ""), None)) + return ugo.Pack() diff --git a/hatenadir/ds/v2-xx/help/info.htm b/hatenadir/ds/v2-xx/help/info.htm new file mode 100644 index 0000000..5cded24 --- /dev/null +++ b/hatenadir/ds/v2-xx/help/info.htm @@ -0,0 +1 @@ + Info
pbsds's Hatena Server

This server is a proof of concept server. There's not much functionality yet because it's in early stages. Please enjoy your stay.

\ No newline at end of file diff --git a/hatenadir/ds/v2-xx/help/post_howto.htm b/hatenadir/ds/v2-xx/help/post_howto.htm new file mode 100644 index 0000000..acaf5b2 --- /dev/null +++ b/hatenadir/ds/v2-xx/help/post_howto.htm @@ -0,0 +1 @@ + Post Flipnote
Posting a Flipnote

Posting a flipnote is as easy as pressing the button down below and selecting the flipnote you want to upload!

\ No newline at end of file diff --git a/hatenadir/ds/v2-xx/inbox.ugoxml b/hatenadir/ds/v2-xx/inbox.ugoxml new file mode 100644 index 0000000..76b19e1 --- /dev/null +++ b/hatenadir/ds/v2-xx/inbox.ugoxml @@ -0,0 +1,20 @@ + + + + 2 + 1 + + + <label>Inbox</label> + <label /> + <label /> + <label /> + <label /> + <num>0</num> + + + diff --git a/hatenadir/ds/v2-xx/index.ugoxml b/hatenadir/ds/v2-xx/index.ugoxml new file mode 100644 index 0000000..348465a --- /dev/null +++ b/hatenadir/ds/v2-xx/index.ugoxml @@ -0,0 +1,29 @@ + + + + 0 + + + <label /> + <label /> + <label /> + <label /> + <label /> + <num>0</num> + + + + diff --git a/hatenadir/ds/v2-xx/it/confirm/delete.txt b/hatenadir/ds/v2-xx/it/confirm/delete.txt new file mode 100644 index 0000000000000000000000000000000000000000..f53d3fa1e88c8ecef37d321c1e44160e88dabdc2 GIT binary patch literal 386 zcmZ9IT?&IR5QOKsr^s91JVhxzKraygXhDsrSbF<@6BVS0*<^QiW@n#z>8)8ocXixG z4N6+nkooZL_=3v(t~on?S8KAZCa^uX5yVVx)|J;oF=GZ|AlHCf^I7Pk8@Dq{zoRGA zVpgk&!#>BMJ<&D8n&7g!nf@oXiv>Sc4>?+OV`$(D^d(#ks3cJKV;|-WnRm^**s`9% nRqKsltiDxBeRG$!?9KioaiQB&o;SB`^KcQ_SqrAxxeBm98BazG literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/it/confirm/download.txt b/hatenadir/ds/v2-xx/it/confirm/download.txt new file mode 100644 index 0000000000000000000000000000000000000000..9850b6ae80f3f40873230b0b85e6123d2945b746 GIT binary patch literal 486 zcmZvZU2eiK5QOI_K0w7OP}L`1AnJ2~0Iq@)ISEp3&$s@OTBstg*ZVU&J82ZutJB2i zI3xZ^UKh?uExBGRnMnMqg;%Q?|4i(dGP7>HoetQjd%_v$cWUrEec+90Mw{M_-ho)a z&fH6hP9Q%D@+bA4u3Tg69Mu8)nsM5LvViHSuvwMQd*xT*9=M&pnRNu&r+o}R{)_*& zE3>FGc65i-AIer+_;_$G1+OJ<`i*dm*dc9e`_%nS{VR-mVwpqD{Kn3TSJXPc1LcRV S72VA@J+t zh8it8RD5mtUL!DW_^O%ptT|j5ANkMO5t;LhJLV=B;5wcg>vz&&#m<6#`!{-;4`hmW z;#W~IXK#3M6TLHTv<+(8HD#R9v|D7>bCaR%F=eEy(!|-gfhyWUTAvE7sjHH%i;TW+ y&z|H3bpr1wup_Jd(7Z7P zdIfbFRVmX^c|w6VQ;m(h6%{461UKXzi}-^k{0nF+^PTBvezLA{k2~&QcY9L6&l9Vs zbmSd1f1yX>>Oql6ggeuTsAsyr(jHtVrXIZGd{+l5#y>qDRU-^7$C|8RqIO8!6?z6T s^PCayN-k=X=5~vwmY8?qT@}f?DlpF(|IrF-&~0Iww`4o-$b0gA1LW31+5i9m literal 0 HcmV?d00001 diff --git a/hatenadir/ds/v2-xx/movie.py b/hatenadir/ds/v2-xx/movie.py new file mode 100644 index 0000000..c4c98cd --- /dev/null +++ b/hatenadir/ds/v2-xx/movie.py @@ -0,0 +1,221 @@ +from twisted.web import resource + +from hatena import Log, ServerLog, Silent, NotFound, as_text, request_path, request_args, request_headers, client_ip +from DB import Database +from Hatenatools import TMB + + +class PyResource(resource.Resource): + isLeaf = False + + def __init__(self): + super().__init__() + self.CreatorID = CreatorIDResource() + + def getChild(self, name, request): + name = as_text(name) + if Database.CreatorExists(name): + return self.CreatorID + if name == "": + return self + return NotFound + + def render(self, request): + request.setResponseCode(403) + return b"403 - Denied access" + + +class CreatorIDResource(resource.Resource): + isLeaf = False + + def __init__(self): + super().__init__() + self.CreatorIDFile = CreatorIDFileResource() + + def getChild(self, name, request): + creator_id = request_path(request).split("/")[-2] + name = as_text(name) + filename = ".".join(name.split(".")[:-1]) + if Database.FlipnoteExists(creator_id, filename): + return self.CreatorIDFile + if name == "": + return self + return NotFound + + def render(self, request): + request.setResponseCode(403) + return b"403 - Denied access" + + +class CreatorIDFileResource(resource.Resource): + isLeaf = True + + def render(self, request): + creator, file = request_path(request).split("/")[-2:] + filetype = file.rsplit(".", 1)[-1].lower() + path = "/".join(request_path(request).split("/")[3:]) + + if filetype == "ppm": + Log(request, path) + Database.AddView(creator, file[:-4]) + request.setHeader(b"content-type", b"text/plain") + return Database.GetFlipnotePPM(creator, file[:-4]) + + if filetype == "info": + Log(request, path, True) + request.setHeader(b"content-type", b"text/plain") + return b"0\n0\n" + + if filetype == "htm": + request.setHeader(b"content-type", b"text/html; charset=utf-8") + return self.GenerateDetailsPage(creator, ".".join(file.split(".")[:-1])).encode("UTF-8") + + if filetype == "star": + args = request_args(request) + color = args.get("starcolor", ["yellow"])[0].split(",", 1)[0].lower() + headers = request_headers(request) + if "x-hatena-star-count" not in headers: + ServerLog.write( + "%s got 403 when requesting %s without a X-Hatena-Star-Count header" % (client_ip(request), path), + Silent, + ) + request.setResponseCode(403) + return b"403 - Denied access\nRequest lacks a X-Hatena-Star-Count http header" + try: + amount = int(headers["x-hatena-star-count"]) + except ValueError: + amount = 0 + if amount < 1 or amount > 65535: + ServerLog.write( + "%s got 403 when requesting %s with an invalid X-Hatena-Star-Count header" % (client_ip(request), path), + Silent, + ) + request.setResponseCode(403) + return b"403 - Denied access\nRequest has an invalid X-Hatena-Star-Count http header" + if not Database.AddStar(creator, file[:-5], amount, color): + ServerLog.write("%s got 500 when requesting %s" % (client_ip(request), path), Silent) + request.setResponseCode(500) + return b"500 - Internal server error\nAdding the stars seems to have failed." + ServerLog.write( + "%s added %i %s stars to %s/%s.ppm" % (client_ip(request), amount, color, creator, file[:-5]), + Silent, + ) + return b"Success" + + if filetype == "dl": + Log(request, path, True) + Database.AddDownload(creator, file[:-3]) + return b"Noted ;)" + + ServerLog.write("%s got 403 when requesting %s" % (client_ip(request), path), Silent) + request.setResponseCode(403) + return b"403 - Denied access" + + def GenerateDetailsPage(self, CreatorID, filename): + flipnote = Database.GetFlipnote(CreatorID, filename) + if not flipnote: + return "This flipnote doesn't exist!" + tmb = TMB().Read(Database.GetFlipnoteTMB(CreatorID, filename)) + if not tmb: + return "This flipnote is corrupt!" + + spinoff = "" + if tmb.OriginalAuthorID != tmb.EditorAuthorID or tmb.OriginalFilename != tmb.CurrentFilename: + if Database.FlipnoteExists(tmb.OriginalAuthorID, tmb.OriginalFilename[:-4]): + spinoff = SpinoffTemplate1.replace("%%CreatorID%%", tmb.OriginalAuthorID).replace("%%Filename%%", tmb.OriginalFilename[:-4]) + elif tmb.OriginalAuthorID != tmb.EditorAuthorID: + spinoff = SpinoffTemplate2 + + entries = [] + content = '%s' % (CreatorID, tmb.Username) + entries.append(PageEntryTemplate.replace("%%Name%%", "Creator").replace("%%Content%%", content)) + + content = 'ā˜… %s' % (CreatorID, filename, flipnote[2]) + for css, value in zip(("1", "2", "3", "4"), flipnote[3:7]): + content += '
ā˜… %s' % (CreatorID, filename, css, css, value) + entries.append(PageEntryTemplate.replace("%%Name%%", "Stars").replace("%%Content%%", content)) + entries.append(PageEntryTemplate.replace("%%Name%%", "Views").replace("%%Content%%", str(flipnote[1]))) + entries.append(PageEntryTemplate.replace("%%Name%%", "Downloads").replace("%%Content%%", str(flipnote[8]))) + + if flipnote[7]: + content = '%s' % (flipnote[7], flipnote[7]) + entries.append(PageEntryTemplate.replace("%%Name%%", "Channel").replace("%%Content%%", content)) + + return ( + DetailsPageTemplate.replace("%%CreatorID%%", CreatorID) + .replace("%%Filename%%", filename) + .replace("%%Username%%", tmb.Username) + .replace("%%CommentCount%%", "0") + .replace("%%Spinoff%%", spinoff) + .replace("%%PageEntries%%", PageEntrySeparator.join(entries)) + ) + +#templates: +DetailsPageTemplate = """ + + Flipnote by %%Username%% + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
+
Description
+
+ Comments(%%CommentCount%%) +
+
%%Spinoff%% + %%PageEntries%% +
+ +""" +SpinoffTemplate1 = """ +
+ This Flipnote is a spin-off.
+ Original Flipnote +
""" +SpinoffTemplate2 = """ +
+ This Flipnote is a spin-off. +
""" +PageEntryTemplate = """ + + +
%%Name%%
+ + +
+ %%Content%% +
+ + """ +PageEntrySeparator=""" + + + +
+ + """ diff --git a/hatenadir/ds/v2-xx/post/flipnote.post.py b/hatenadir/ds/v2-xx/post/flipnote.post.py new file mode 100644 index 0000000..5a4c104 --- /dev/null +++ b/hatenadir/ds/v2-xx/post/flipnote.post.py @@ -0,0 +1,25 @@ +from twisted.web import resource + +from hatena import ServerLog, Silent, request_args, client_ip +from DB import Database + + +class PyResource(resource.Resource): + isLeaf = True + + def render_GET(self, request): + ServerLog.write("%s got 403 when requesting post/flipnote.post with GET" % client_ip(request), Silent) + request.setResponseCode(405) + return b"405 - Method Not Allowed" + + def render_POST(self, request): + data = request.content.read() + channel = request_args(request).get("channel", [""])[0] + add = Database.AddFlipnote(data, channel) + if add: + ServerLog.write('%s successfully uploaded "%s.ppm"' % (client_ip(request), add[1]), Silent) + request.setResponseCode(200) + else: + ServerLog.write("%s tried to upload a flipnote, but failed..." % client_ip(request), Silent) + request.setResponseCode(500) + return b"" diff --git a/hatenadir/images/ds/kaeru.ntft b/hatenadir/images/ds/kaeru.ntft new file mode 100644 index 0000000..7032be8 --- /dev/null +++ b/hatenadir/images/ds/kaeru.ntft @@ -0,0 +1 @@ +’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ3ƒ \ No newline at end of file diff --git a/hatenadir/images/ds/list.ntft b/hatenadir/images/ds/list.ntft new file mode 100644 index 0000000..9fb2b0d --- /dev/null +++ b/hatenadir/images/ds/list.ntft @@ -0,0 +1 @@ +’’’’’’’’’’’’’’’’’’2ƒ2ƒ2ƒ2ƒ’’’2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ’2ƒ2ƒ2ƒ’’2ƒ2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ2ƒ’’2ƒ2ƒ2ƒ’2ƒ2ƒ2ƒ2ƒ2ƒ2ƒ’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’’’2ƒ2ƒ2ƒ2ƒ’’ \ No newline at end of file diff --git a/hatenadir/images/ds/theme/basic/background.nbf b/hatenadir/images/ds/theme/basic/background.nbf new file mode 100644 index 0000000000000000000000000000000000000000..dc7f3b65502415177a96c98719ecc8b4d567e387 GIT binary patch literal 49232 zcmeI4&2rl|6onz$q$`sqEz7bNZ(q(RRAXvNN4#`a9EQm)$k1G_TRV zO1tTUw6D_kT!7$@Oi7MHT6E@MCK3n&7x#R)xPZLKi|3zx=_#c?#Xt3zQs+mLlSz0H z-XtGRZ>~R@emsA2{X~ED=*8owkAAs%`RtqbzkU4O2jAcP@buNQUqAWn`R`x+@%5iS zzW)60pZ@vz-ytVH+<=9mXpRTdpumVQSG9w z`7@=rD04Yx59wyeqzkQWHtOMzncBK^(RRMC@M2tFfvMK~>OyOqjrZ2(dDF+PMaJkcF>c2~x z-`J>a{ae1^K?h)bS(~H?0mbxL%75_Nq_`MfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-Lpmzd6k|aUzvkY~DaHXZJ!krFAdaF0JQeH{Df~VI1@Mteb5-CqEzclW`b5*_iV*e@K;KXgi-WYi=|TY zqSaCfJmF13p-ta?2*Az=}P@H~w|=$V^U%t8bOx&^=z z2BLEjhx1(G#P+vNL8Yg{+^n^UJ{alKwxsLbDw z>~a?PQh6-OUG78>%?ST=f1zg39++RzVYg9P#IHnEdq_6{D*C?rwQU)B$;U(&lh zb`S~k!kc3MhZC6Uu3wG~wbD866V_(E zZf7)~C9uN4{d{5Fivs_wH%iVUDM$@w`^zB>7N%4Bb7>3qzzUoAU~%Fd()mtn6>z zgt#7UE>V({H{7!Bo8!kfFQRRuH{0bK5+DH*AOR8}0TK`b<|g_Mf9zW2cUZcSwo5