User Tools

Site Tools


projects:routers:tp-link:tl-wr703n

This is an old revision of the document!


TP-LINK TL-WR703N

  • Version 1.6

This page has some information how to upgrade the ram and flash memory of a TP-LINK TL-WR703N router.

Initial installation

Installed via web menu (default username and password are: admin), (following this advise): http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin, wait at least 5 minutes for this to complete.
Then the router reboots.
Configure OpenWRT: open Terminal, type:

telnet 192.168.1.1

This should give the openwrt text (Showing somewhere Bleeding Edge, r32130).
Set the password:

passwd

And follow the instructions to set your password. After this use ssh to connect as user root:

ssh root@192.168.1.1 

To prevent conflicts with the main network infrastructure, change the default ip address of the device which is 192.168.1.1 into 192.168.1.10:

vi /etc/config/network

Then restart it and connect again:

reboot
ssh root@192.168.1.10

Update to the latest version. Since I could only connect to local addresses, I used the webserver from OSX to serve the sysupgrade.bin file (However using scp rather than the OSX webserver would be making more sense.):

cd /tmp
wget http://192.168.1.110/openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin
mtd write openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin firmware
reboot

After the reboot all your settings are gone, so repeat steps from above: connect with telnet, set password, and change ip address.
Type logread to see system messages:

Click to display ⇲

Click to hide ⇱

root@OpenWrt:~# logread
Jan  1 00:00:11 OpenWrt syslog.info syslogd started: BusyBox v1.19.4
Jan  1 00:00:11 OpenWrt kern.notice kernel: klogd started: BusyBox v1.19.4 (2013-02-02 00:21:16 MST)
Jan  1 00:00:11 OpenWrt kern.notice kernel: [    0.000000] Linux version 3.7.5 (openwrt@OpenWRTBuild) (gcc version 4.6.4 20121210 (prerelease) (Linaro GCC 4.6-2012.12) ) #1 Sat Feb 2 09:15:39 MST 2013
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000] MyLoader: sysp=3dd7cb87, boardp=f0717c55, parts=4852ecbe
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] bootconsole [early0] enabled
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] CPU revision is: 00019374 (MIPS 24Kc)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] SoC: Atheros AR9330 rev 1
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Clocks: CPU:400.000MHz, DDR:400.000MHz, AHB:200.000MHz, Ref:25.000MHz
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Determined physical RAM map:
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000]  memory: 02000000 @ 00000000 (usable)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Initrd not found or empty - disabling initrd
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000] Zone ranges:
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000]   Normal   [mem 0x00000000-0x01ffffff]
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000] Movable zone start for each node
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000] Early memory node ranges
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000]   node   0: [mem 0x00000000-0x01ffffff]
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000] On node 0 totalpages: 8192
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000] free_area_init_node: node 0, pgdat 80309e60, node_mem_map 81000000
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000]   Normal zone: 64 pages used for memmap
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000]   Normal zone: 0 pages reserved
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000]   Normal zone: 8128 pages, LIFO batch:0
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000] Primary instruction cache 64kB, VIPT, 4-way, linesize 32 bytes.
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000] Primary data cache 32kB, 4-way, VIPT, cache aliases, linesize 32 bytes
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    0.000000] pcpu-alloc: [0] 0 
Jan  1 00:00:11 OpenWrt kern.warn kernel: [    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
Jan  1 00:00:11 OpenWrt kern.notice kernel: [    0.000000] Kernel command line:  board=TL-WR703N console=ttyATH0,115200 rootfstype=squashfs,jffs2 noinitrd
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] PID hash table entries: 128 (order: -3, 512 bytes)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Jan  1 00:00:11 OpenWrt kern.notice kernel: [    0.000000] __ex_table already sorted, skipping sort
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Writing ErrCtl register=00000000
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Readback ErrCtl register=00000000
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] Memory: 28788k/32768k available (2231k kernel code, 3980k reserved, 586k data, 252k init, 0k highmem)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] SLUB: Genslabs=9, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.000000] NR_IRQS:51
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.080000] Calibrating delay loop... 265.42 BogoMIPS (lpj=1327104)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.080000] pid_max: default: 32768 minimum: 301
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.080000] Mount-cache hash table entries: 512
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.090000] NET: Registered protocol family 16
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.090000] MIPS: machine is TP-LINK TL-WR703N v1
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.350000] bio: create slab <bio-0> at 0
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.350000] Switching to clocksource MIPS
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.360000] NET: Registered protocol family 2
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.360000] TCP established hash table entries: 1024 (order: 1, 8192 bytes)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.370000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.370000] TCP: Hash tables configured (established 1024 bind 1024)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    0.380000] TCP: reno registered
Jan  1 00:00:11 OpenWrt kern.info kernel: [    7.970000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    7.980000] cfg80211:   (2457000 KHz - 2482000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    7.990000] cfg80211:   (2474000 KHz - 2494000 KHz @ 20000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.000000] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.000000] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.350000] usbcore: registered new interface driver usbfs
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.360000] usbcore: registered new interface driver hub
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.360000] usbcore: registered new device driver usb
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ath: EEPROM regdomain: 0x0
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ath: EEPROM indicates default country code should be used
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ath: doing EEPROM country->regdmn map search
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ath: country maps to regdmn code: 0x3a
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ath: Country alpha2 being used: US
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ath: Regpair used: 0x3a
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] ieee80211 phy0: Selected rate control algorithm 'minstrel_ht'
Jan  1 00:00:11 OpenWrt kern.debug kernel: [    8.970000] Registered led device: ath9k-phy0
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.970000] ieee80211 phy0: Atheros AR9330 Rev:1 mem=0xb8100000, irq=2
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.980000] cfg80211: Calling CRDA for country: US
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.980000] cfg80211: Regulatory domain changed to country: US
Jan  1 00:00:11 OpenWrt kern.info kernel: [    8.990000] cfg80211:   (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.000000] cfg80211:   (2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2700 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.010000] cfg80211:   (5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 1700 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.010000] cfg80211:   (5250000 KHz - 5330000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.020000] cfg80211:   (5490000 KHz - 5600000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.030000] cfg80211:   (5650000 KHz - 5710000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.040000] cfg80211:   (5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 3000 mBm)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.110000] PPP generic driver version 2.4.2
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.330000] ip_tables: (C) 2000-2006 Netfilter Core Team
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.560000] NET: Registered protocol family 24
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.570000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.580000] ehci-platform ehci-platform: Generic Platform EHCI Controller
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.590000] ehci-platform ehci-platform: new USB bus registered, assigned bus number 1
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.620000] ehci-platform ehci-platform: irq 3, io mem 0x1b000000
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.640000] ehci-platform ehci-platform: USB 2.0 started, EHCI 1.00
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.640000] hub 1-0:1.0: USB hub found
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.640000] hub 1-0:1.0: 1 port detected
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.670000] nf_conntrack version 0.5.0 (453 buckets, 1812 max)
Jan  1 00:00:11 OpenWrt kern.info kernel: [    9.920000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
Jan  1 00:00:13 OpenWrt kern.info kernel: [   13.840000] device eth0 entered promiscuous mode
Jan  1 00:00:13 OpenWrt daemon.notice netifd: Interface 'lan' is now up
Jan  1 00:00:13 OpenWrt daemon.notice netifd: Interface 'loopback' is now up
Jan  1 00:00:14 OpenWrt kern.info kernel: [   14.440000] eth0: link up (100Mbps/Full duplex)
Jan  1 00:00:14 OpenWrt kern.info kernel: [   14.440000] br-lan: port 1(eth0) entered forwarding state
Jan  1 00:00:14 OpenWrt kern.info kernel: [   14.450000] br-lan: port 1(eth0) entered forwarding state
Jan  1 00:00:16 OpenWrt kern.info kernel: [   16.450000] br-lan: port 1(eth0) entered forwarding state
Jan  1 00:00:17 OpenWrt user.info sysinit: 'radio0' is disabled
Jan  1 00:00:18 OpenWrt user.info sysinit: 'radio0' is disabled
Jan  1 00:00:18 OpenWrt user.info sysinit: 'radio0' is disabled
Jan  1 00:00:19 OpenWrt user.info sysinit: Loading defaults
Jan  1 00:00:19 OpenWrt user.info sysinit: Loading synflood protection
Jan  1 00:00:20 OpenWrt user.info sysinit: Adding custom chains
Jan  1 00:00:20 OpenWrt user.info sysinit: Loading zones
Jan  1 00:00:21 OpenWrt user.info sysinit: Loading forwardings
Jan  1 00:00:21 OpenWrt user.info sysinit: Loading rules
Jan  1 00:00:21 OpenWrt user.info sysinit: Loading redirects
Jan  1 00:00:21 OpenWrt user.info sysinit: Loading includes
Jan  1 00:00:21 OpenWrt user.info sysinit: Optimizing conntrack
Jan  1 00:00:21 OpenWrt user.info sysinit: Loading interfaces
Jan  1 00:00:21 OpenWrt user.info firewall: adding lan (br-lan) to zone lan
Jan  1 00:00:23 OpenWrt authpriv.info dropbear[972]: Not backgrounding
Jan  1 00:00:23 OpenWrt user.notice dnsmasq: DNS rebinding protection is active, will discard upstream RFC1918 responses!
Jan  1 00:00:23 OpenWrt user.notice dnsmasq: Allowing 127.0.0.0/8 responses
Jan  1 00:00:23 OpenWrt user.notice dnsmasq: found already running DHCP-server on interface 'br-lan' refusing to start, use 'option force 1' to override
Jan  1 00:00:24 OpenWrt daemon.info dnsmasq[1012]: started, version 2.62 cachesize 150
Jan  1 00:00:24 OpenWrt daemon.info dnsmasq[1012]: compile time options: IPv6 GNU-getopt no-DBus no-i18n no-IDN DHCP no-DHCPv6 no-Lua TFTP no-conntrack
Jan  1 00:00:24 OpenWrt daemon.info dnsmasq[1012]: using local addresses only for domain lan
Jan  1 00:00:24 OpenWrt daemon.warn dnsmasq[1012]: no servers found in /tmp/resolv.conf.auto, will retry
Jan  1 00:00:24 OpenWrt daemon.info dnsmasq[1012]: read /etc/hosts - 1 addresses
Jan  1 00:06:39 OpenWrt authpriv.info dropbear[1028]: Child connection from 192.168.1.110:60907
Jan  1 00:06:46 OpenWrt authpriv.notice dropbear[1028]: Password auth succeeded for 'root' from 192.168.1.110:60907

Increase ram memory

The original ram memory chip (Zentel A3S56D40FTP-G5) has a size of 4MB. To verify this, the free command should give you roughly this amount. To get an exact value, use the following command:

cat /proc/meminfo | grep MemTotal

And find this hex number: 4096 kB, which is 4MB.

Now remove power from the device and remove the original ram chip. I used an extremely thin sheet of metal which slides between the pads and the pins while heating them with the soldering iron. Remove extra tin with solder wick. Solder the new chip in location. The best method I found so far is to use a 0.4mm tip. While pressing from above with the soldering iron feed small amounts of tin to each pin. If accidentally too much tin has been supplied and there is a short circuit, remove the excessive tin with solder wick.

After upgrading the ram memory chip (Micron MT46V32M16P) it should be 16MB in total. The output from /proc/meminfo | grep MemTotal is now four times more, 16MB.

Increase flash memory

Before removing the flash memory, first make a backup of the art partition and the u-boot partition. Once done, you can use the following script to build an image for the larger memory.

#!/bin/sh
# This script generates a 16MB flash image for the TL-WR703N
#
# The following files are required:
#   original uboot, from issuing on the WR703N: cat /dev/mtd0 > /tmp/mtd0.0x00000000.backup_u-boot.bin
#   art partition from issuing on the WR703N: cat /dev/mtd4 > /tmp/mtd4.0x003f0000.backup_art.bin
#
#   uboot_new from http://www.tech-blog.pl/pliki/u-boot_for_tp-link_AR9331_by_pepe2k.tar.gz
#   firmware from openwrt: https://downloads.openwrt.org/snapshots/trunk/ar71xx/generic/
#     search for openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin
 
# u-boot:
uboot_bak="mtd0.0x00000000.backup_u-boot.bin"
uboot_new="mtd0.0x00000000.uboot_for_tl-wr703n.bin"
# firmware:
firmware="openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-factory.bin"
# art:
  art="mtd4.0x003f0000.backup_art.bin"
# result file:
 outf="wr703n_image_16MB.bin"
# offsets:
  mac="0x1FC00"
model="0x1FD00"
  wps="0x1FE00"
 
if [ ! -f $art ]; then
echo "file $art is not present, quitting."
exit
fi
if [ ! -f $uboot_bak ]; then
echo "file $uboot_bak is not present, quitting."
exit
fi
if [ ! -f $uboot_new ]; then
echo "file $uboot_new is not present, quitting."
exit
fi
if [ ! -f $firmware ]; then
echo "file $firmware is not present, quitting."
exit
fi
echo "This script creates an image ready to flash onto the TL-WR703N..."
#   Create a 16MB file with 0xff in it (OSX has problems with sed and null characters, so use perl instead):
echo "  1. creating an empty 16MB image filled with 0xFF..."
rm $outf
dd if=/dev/zero bs=1024 count=16384 2>/dev/null | perl -np -e 's/\0/\xff/g' | dd of=$outf conv=notrunc 2>/dev/null
#   Insert the new u-boot and the original art at the correct offset:
echo "  2. Writing u-boot into the image from position 0x00000000 ..."
dd if=$uboot_new of=$outf conv=notrunc 2>/dev/null
#   FYI: From http://www.geektalks.org/category/tplink-703n/ is documented where MAC address and Model number is stored
#   Copy from the original u-boot backup file the MAC address (Offset: 0x0001FC00, 6 bytes)
echo "  3. Cloning original MAC address from file $uboot_bak into the image at position $mac ..."
dd if=$uboot_bak of=$outf skip=$(($mac)) count=6 seek=$(($mac)) bs=1 conv=notrunc 2>/dev/null
#   Copy from the original u-boot backup file the model number (Offset: 0x0001FD00, 8 bytes)
echo "  4. Cloning original model string from file $uboot_bak into the image at position $model ..."
dd if=$uboot_bak of=$outf skip=$(($model)) count=8 seek=$(($model)) bs=1 conv=notrunc 2>/dev/null
#   (For the TL-MR3020 only) Extract from the original u-boot backup file the WPS pin (Offset: 0x0001FE00, 8 bytes)
# dd if=$uboot_bak of=total.img skip=$(($wps)) count=8 seek=$(($wps)) bs=1 conv=notrunc 2>/dev/null
#   Insert art at correct offset:
echo "  5. Cloning original art partition into the image at the end ..."
dd if=$art of=$outf obs=16320k seek=1 conv=notrunc 2>/dev/null
#   Open the openwrt firmware openwrt-ar71xx-generic-tl-mr3420-v1-squashfs-factory.bin write all data(about 15.75M) as step 2 from 0x000000020000 to the file.
echo "  6. Cloning the firmware (kernel and rootfs) partition into the image at the position 0x00020000 ..."
dd if=$firmware of=$outf obs=128k seek=1 conv=notrunc 2>/dev/null
echo "... Finished writing $outf. You can now flash the file onto a chip."

Electrically upgrading the flash memory requires to have a compatible chip. I planned to upgrade with this chip:

  • w25q128 (16MB instead of 4) See here for other references to this chip.

Instead of programming the memory in a running system with the chip (except for R/W pins) connected in parallel, it is recommended to program this chip externally and then solder it onto the board. For this I decided to use a JTAG interface. Many interfaces exist, I have two, an openmoko debug board v3 and a Tiao usb jtag interface. Both use a ftdi2232 interface chip, but from a different generation.

For the system to recognize the interface please read more here. To actually read from and write to the eeprom, use flashrom which depends on libftdi.

As an alternative to flash via JTAG -and probably easier to handle- is to use your Bus Pirate. If the buspirate is accessible on /dev/ttyUSB0, use following command:

flashrom -p buspirate_spi:dev=/dev/ttyUSB0,pullups=on,spispeed=1M -w wr703n_image_16MB.bin

If ttyUSB0 is not correct, find out with following command which device it should be:

dmesg | grep -A 4 Pirate | grep tty

Network configurations

tl-wr703n bridge ap

For the following file: /etc/config/network

config interface 'loopback'
        option ifname 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'
 
config interface 'lan'
        option ifname 'eth0'
        option type 'bridge'
        option proto 'static'
        option ipaddr '192.168.1.10'
        option netmask '255.255.255.0'

For the following file: /etc/config/wireless

config wifi-device  radio0
        option type     mac80211
        option channel  11
        option hwmode   11ng
        option path     'platform/ar933x_wmac'
        option htmode   HT20
        list ht_capab   SHORT-GI-20
        list ht_capab   SHORT-GI-40
        list ht_capab   RX-STBC1
        list ht_capab   DSSS_CCK-40
        # REMOVE THIS LINE TO ENABLE WIFI:
        #option disabled 1 
 
config wifi-iface
        option device   radio0
        option network  lan
        option mode     ap
        option ssid     PrivateNet
        option encryption 'psk2'
        option key      'Your wpa2 key between the quotes'
projects/routers/tp-link/tl-wr703n.1444569615.txt.gz · Last modified: 2015/10/11 15:20 by admin