Showing posts with label 6. Show all posts
Showing posts with label 6. Show all posts

Sunday, June 25, 2017

Download Test Drive 6 PSX ISO High Compressed

Test Drive 6 adalah game PS1 balap mobil keren dengan modus carrer yang menarik. Ada 40 jenis mobil termasuk 4 mobil polisi. Arena pada permainan yang menggunakan tempat-tempat di dunia nyata. Test Drive 6 juga termasuk salah satu game balap mobil terbaik di PS1.

Kali ini saya akan share Test Drive 6 PSX ISO High Compressed, silahkan download bagi sobat yang ingin balapan mobil di game Test Drive 6.




Screenshot :


Download
Test Drive 6 PSX ISO High Compressed

Download Emulator Game PS1 Untuk PC
disini

Download Emulator Game PS1 Untuk Android
disini

Read more »

Sunday, June 18, 2017

Download Tekken 6 For PC


Minimum System Requirements

      • OS: Windows XP SP 3/Vista/7/8
      • Processor: Pentium 4 @ 2.6GHz or AMD Athlon 2600+
      • RAM: 1 GB
      • Hard Drive: 8 GB
      • Graphics Card: 256 MB with Pixel Shader 3.0+ (Required)
      • Sound Card: Windows Direct X 9.0 Compatible
      • DirectX: Version 9.0
      • Mouse and Keyboard

        Screenshots


        How to Install Ths Game?

        1. Extract the file using Winrar. (Download Winrar)
        2. Open "Tekken 6" >> "ppsspp64" folder.
        3. Then double click on "PPSSPPWindows64" icon to play the game. Done!
        Tekken 6 Game Download for PC Full Version 
        The Lord Of The Rings: The Return Of The King Game Free Download For PC Full Version
        CLICK HERE
        Game Size: 721 MB
        Password: www.apunkagames.net
        Read more »

        Thursday, June 15, 2017

        Download Tekken 6 Apk ISO CSO Android Rom Highly Compressed For PSP



        TEKKEN 6 the most Famous and Addictive Game of PSP with 100% smooth gameplay for Android . Tekken 6 Android Apk (.cso) rom is now playable for android. so download this game and play without any lacking .
        Tekken 6 is a fighting game developed and published by Namco Bandai. It is the seventh main installment in the Tekken franchise. It was released in Japanese arcades on November 26, 2007 as the first game running on the PlayStation 3-based System 357 arcade board.

        Also See :- Download Dragon City Apk Mod Money v2.7.1 [Unlimited Gems]

        The game received an update, subtitled Bloodline Rebellion, a year later. A home version based on the update was released for PlayStation 3 and Xbox 360 on October 27, 2009 and for PlayStation Portable on November 24, 2009. This game can be digitally download via PlayStation Store to play on PlayStation Portable and PlayStation Vita. It is the first Tekken game to include multi-tiered stages and bound system. The game received generally positive reviews, especially the PSP version, which got an 82.60% from GameRankings and 82/100 from Metacritic.


        TEKKEN 6 sees the return of many familiar faces as well as new characters to create the largest line-up the series has ever seen. With a growing roster of fighters, each equipped with their own deadly techniques, moves and attack combinations, TEKKEN 6 will be the best King of Iron Fist Tournaments yet. Adding to the already rich gaming experience, a deeper character customization feature will only further enhance the incredible fighting intensity as players go mano-a-mano. Players can also take the battle online for classic match-ups and to compete for world domination.

        ALSO SEE :- Download 8 Ball Pool 3.3.0 Apk [Mod Money] Free For Android

        FEATURES

        Tekken 6 features bigger stages with more interactivity than its predecessors
        such as walls or floors that can be broken to reveal new fighting areas
         The character customization feature has been enhanced
         certain items have implications in some aspects of gameplay.
        A new "rage" system has been added, giving characters more damage per hit when their vitality is below a certain point


        DOWNLOAD PPSSPP APK
        DOWNLOAD TEKKEN 6 PSP ISO ROM



        How To Install

        • Download PPSSPP.apk
        • Then download  Tekken 6.cso psp rom.
        • Run PPSSPP app and select your Tekken 6 rom.
        • Play and enjoy the game.


        Read more »

        Friday, June 9, 2017

        Download Survivors The Quest 1 6 400 Hack Mod Apk Unlimited Money

        You are about to download the Survivors: The Quest® 1.6.400 Hack Mod Apk file which is a Adventure Game for Android from Allcrackedapk.com

        [highlight] Survivors: The Quest® 1.6.400 Hack [/highlight]


         


        DESCRIPTION


        Three strangers find themselves stranded on a secluded island. Abandoned buildings, an old laptop and other findings suggest that the island was used for some sort of scientific research. But who was behind it? And what else is the island hiding? Playing as each of the three characters, help the survivors get along, avoid starvation, unravel a startling mystery and plot their escape!

        You can unlock additional bonuses via in-app purchase from within the game!

        ● EXPLORE beaches, lagoons, jungles and mountains on a beautiful tropical island
        ● FIND, ASSEMBLE AND USE TOOLS to gather clues and resources
        ● MANAGE WELL-BEING by improving each character’s Stamina, Hunger, Fun and Comfort levels
        ● LOCATE INGREDIENTS AND COOK FOOD for your fellow survivors
        ● SOLVE PUZZLES and a thrilling island mystery in order to bring the survivors home
        ● Google Play game services support

        Head to the island today and be on the lookout for regular free updates with exciting new content!
        ____________________________

        COMPATIBILITY NOTES:
        ***Note*** This game performs best on high-end smartphones and tablets.
        ____________________________

        ***Sign up now for a weekly round-up of the best from G5 Games! www.g5e.com/e-mail***
        ____________________________

        ***G5 Games - World of Adventures™!***

        Collect them all! Search for "g5" in Google Play!

        Adventure:

        ▶ Twin Moons Society™
        ▶ Hidden City:Mystery of Shadows
        ▶ Mahjong Journey®
        ▶ The Secret Society®
        ▶ The Paranormal Society™
        ____________________________

        VISIT US: www.g5e.com
        WATCH US: www.youtube.com/g5enter
        FIND US: www.facebook.com/g5games
        FOLLOW US: www.twitter.com/g5games
        G5 End User License Supplemental Terms: http://www.g5e.com/G5_End_User_License_Supplemental_Terms

        WHATS NEW


        Your gripping and sometimes dangerous adventure on the mysterious island continues! Download the new update and try to make it off the island with other lucky survivors.

        NEW FEATURES - Look for the Chests full of valuable and useful things. They appear in the game every now and then, so play the game every day so you dont miss out on this opportunity!

        FIXES AND IMPROVEMENTS – Your favorite game is only getting better. Check it out!

        ADDITIONAL INFORMATION


        Name Of Apk : Survivors: The Quest®
        Updated : March 24, 2017
        Current Version : 1.6.400
        Size of Apk : 87.4MB
        Requires Android :4.0 and up

        SCREENSHOTS


        Mod info:


        • Unlimited Money

        Download Links


        Download Userscloud - Mod Apk [87.4MB]

        Download Dropapk - Mod Apk [87.4MB]

        Download From Google playstore

        From our site you can easily download Survivors: The Quest® (MOD APK, unlimited money).apk! All without registration With good speed and without virus!
        Read more »

        Thursday, May 18, 2017

        Download Tom Clancys Rainbow 6 Siege Game For PC

        Tom Clancys Rainbow 6: Siege


        Tom Clancys Rainbow 6: Siege


        Game pc Tom Clancys Rainbow 6: Siege, yup.. Itulah judul game yang akan saya share kali ini. Tom Clancys Rainbow 6: Siege adalah game yang bergenre tembak menembak atau peperangan yang biasa disebut dengan sebutan person shooter. Video game Tom Clancys Rainbow 6: Siege ini dikembangkan oleh Ubisoft Montreal dan diterbitkan oleh Ubisoft. Game Tom Clancys Rainbow Six Siege ini dirilis pada tanggal 9 Juni 2014 di E3. Game ini menggunakan system AnvilNext game engine.




        Game pc Tom Clancys Rainbow 6: Siege dianggap sebagai penerus dari seri Tom Clancy Rainbow 6: Patriots, Siege menempatkan penekanan berat pada kerusakan lingkungan dan kerjasama antara pemain. Tidak seperti entri sebelumnya dalam seri game ini tidak memiliki kampanye dan hanya menawarkan modus online.





        System Minimum:


        ·         OS: Windows 764bit

        ·         Processor: Intel Corei3 560

        ·         Memory: 6GB

        ·         Hard disk space: 30GB

        ·         VGA: GeForce GTX460/Radeon HD5870



        Cara Instal Tom Clancys Rainbow Six Siege:


        ·    Extract

        ·    Run setup and Instal game seperti biasa sampai selesai

        ·    Play game


        Password: www.download.ir




        LinkDownload Tom Clancys Rainbow 6: Siege:


        Tom Clancys Rainbow 6: Siege

        Read more »

        Download Tower Defense King 1 0 6 Hack Mod Apk Unlimited Money

        You are about to download the Tower Defense King 1.0.6 Hack Mod Apk file which is a Strategy Game for Android from Allcrackedapk.com

        [highlight] Tower Defense King 1.0.4 Hack [/highlight]


         


        DESCRIPTION


        Monsters are gathering now. A bolt of arrows! Colorful magic! Powerful Explosion! Time of battle is back.
        Build a defensive line with a powerful tower and defend your kingdom. The destiny of the kingdom lies in your hands.
        Play the best-selling Tower Defense game of Defense now for free

        [game features]
        - 25 maps created with various themes
        - Three modes to test limits
        - Five bosses to stop you!
        - 12 basic towers and 9 special towers to increase strategic choice
        - Colorful magic support to eliminate enemies!
        - 15 strong upgrades to defend your persistent enemy attacks
        - Check your global ranking in infinite mode
        - Support fast monster eradication with fast forward function.
        - Challenge Mode Support
        - Android tablet support

        Homepage :
        https://play.google.com/store/apps/dev?id=4864673505117639552

        Facebook :
        https://www.facebook.com/mobirixplayen

        YouTube :
        https://www.youtube.com/user/mobirix1

        WHATS NEW


        Skill rebalancing

        Endless mode rebalancing

        ADDITIONAL INFORMATION


        Name Of Apk : Tower Defense King
        Updated : 29 March 2017
        Current Version : 1.0.6
        Size of Apk : 33.6MB
        Requires Android :4.0 and up

        SCREENSHOTS


        Mod info:


        • Unlimited Money

        Download Links


        Download Userscloud - Mod Apk [33.6MB]

        Download Dropapk - Mod Apk [33.6MB]

        Download From Google playstore

        From our site you can easily download Tower Defense King (MOD APK, unlimited money).apk! All without registration With good speed and without virus!
        Read more »

        Download Resident Evil 6 Full Version

        Gamer mana yang tidak mengantisipasi kehadiran seri terbaru Resident Evil? Franchise raksasa yang sudah melekat begitu kuat dengan Capcom ini memang menjadi bagian yang tidak lagi terpisahkan dari industri game itu sendiri. Pada awalnya tumbuh sebagai sebuah game survival-horror, Resident Evil mulai menggabungkan unsur action yang semakin kentara di setiap seri terbaru. Dari semua seri yang ada, Resident Evil 4 boleh terbilang sebagai yang paling fenomenal. Bagaimana tidak? Inovasi gameplay ekstrim ala third person shooter yang ditawarkan Capcom di seri ini ternyata berhasil menarik perhatian gamer, memuaskan para fans lawas, sekaligus juga berhasil menjaring lebih banyak penggemar untuk franchise yang satu ini. Lewat seri teranyarnya – Resident Evil 6 berusaha mengulangi keajaiban yang sama.
        Sejak awal kemunculannya lewat beragam teaser dan trailer, Capcom memang seringkali mengumbar bahwa Resident Evil 6 akan menjadi salah satu seri terbaik RE yang pernah didapatkan pasaran. Anda yang sempat menyimak preview kami sebelumnya, tentu sudah mendapatkan sedikit gambaran tentang seri yang satu ini. Menyebutnya sebagai seri terbaik? Impresi pertama kami tidak memberikan sinyal demikian.
        Walaupun datang dengan beragam fitur permainan yang menawarkan sensasi action yang lebih kentara serta cerita dan setting yang jauh lebih masif, kami merasa ada sesuatu yang begitu “kosong” dan membuat Resident Evil 6 tidak mampu tampil begitu kuat. Sebuah misteri yang akhirnya terpecahkan, seiring dengan perjalanan kami menyusuri “mahakarya” dari Capcom yang satu ini.

        Berusaha untuk menjadikan seri ini sebagai yang “terbaik”, Capcom memulai usaha ini  dengan menyuntikkan plot yang jauh lebih masif untuk Resident Evil 6. Jika seri-seri Resident Evil sebelumnya hanya memuat satu karakter utama dengan satu plot utama, Resident Evil 6 datang dengan muatan yang super besar. Ia memuat tiga karakter utama dengan tiga cerita utama yang semuanya hidup dalam satu timeline yang sama. Gamer berkesempatan untuk menikmati sudut pandang Leon, Chris, dan Jack dalam chapter cerita terpisah.
        Dengan cerita yang terpisah seperti ini, memang tidak mudah untuk menangkap keseluruhan cerita yang ditawarkan Resident Evil 6 dengan hanya memandang satu sisi cerita saja. Secara garis besar, Anda akan disuguhkan dengan plot “klasik” yang selama ini memang melekat kuat dengan Resident Evil. Sebuah serangan bio-terrorisme menyebar di beberapa kota di dunia dan akhirnya berpusat di Lanshiang, China. Varian C-Virus menciptakan monster baru – J’avo dengan kecerdasan yang lebih tinggi serta kemampuan adaptasi yang lebih baik. Merebaknya C-Virus menyebabkan kehancuran, bahkan menewaskan presiden Amerika yang pada awalnya berencana untuk membongkar misteri Raccoon City kepada dunia.

        Misteri semakin menebal seiring dengan perjalanan Leon, Chris, dan Jack untuk menyelesaikan masalah mereka masing-masing. Kebangkitan kembali sang ikon – Ada Wong dan kemunculan sebuah organisasi baru – Neo Umbrella membuat kemunculan C-Virus dan berbagai serangan yang meneror dunia bukan sekedar kebetulan belaka. Kekuatan apa yang sebenarnya berada di balik beragam teror ini? Siapa sosok Derek C Simmons? Siapakah yang mengepalai Neo Umbrella? Bagaimana peran Ada Wong di seri terbaru yang satu ini? Apakah ia merupakan tokoh antagonis atau protagonis? Mampukah Jack, Chris, dan Leon menyelamatkan dunia untuk kesekian kalinya?

        Walaupun datang dengan tiga cerita utama, Anda masih belum akan mendapatkan sisi cerita yang sempurna dengan hanya menyelesaikan ketiga cerita utama ini. Sebuah sisi cerita berbeda dari sudut Ada Wong akan terbuka, berperan sebagai katalis yang akan membuat Anda mendapatkan gambaran secara utuh. Bahkan cukup untuk memutarbalikkan beragam teori konspirasi yang mungkin sempat Anda simpulkan di tiga cerita yang sudah Anda nikmati sebelumnya. Sudut pandang Ada Wong akan menjadi pondasi dari cerita Resident Evil 6 itu sendiri.

        Minimum Requirements:

        • CPU : Intel Core 2 Duo 2.4 Ghz or better, AMD Athlon X2 2.8 Ghz or better
        • CPU Speed : Info
        • RAM : 2 GB
        • OS : Windows Vista/XP, Windows 7, Windows 8
        • Video Card : NVIDIA GeForce 8800 GTS or better/Radeon HD 3870
        • Sound Card : Yes
        • Free Disk Space : 16 GB  



        Download Resident Evil 6 Single Link


        Download Update


        Read more »

        Download Ultimate Soccer Football 1 1 6 Hack Mod Apk Unlimited Points Gold

        You are about to download the Ultimate Soccer Football 1.1.6 Hack Mod Apk file which is a Sports Game for Android from Allcrackedapk.com

        [highlight] Ultimate Soccer Football 1.1.6 Hack [/highlight]


         


        DESCRIPTION


        REALISTIC, IMMERSIVE & ADDICTIVE. Ultimate Soccer offers the purest football fun with fast paced gameplay, most realistic physics, astonishing atmosphere and tons of replay value!

        Build the best squad on the planet and lead them all the way to win the league champion or World Cup of FIFA! Ultimate Soccer is the definitive mobile football simulation, featuring simple controls, smooth animations and insane actions. Pass and dribble around opponents, take aim, shoot… GOOOOAAAALLLL!

        You can also control every aspect of your team through the management system: trade in the transfer market, train your players to improve their ability and put them on the path to glory.

        Game Features:
        - 1000+ players available to set your lineup, formations and tactics
        - Polished 3D graphics and high-quality sound effects
        - Career mode, World Cup mode & Friendly mode

        WHATS NEW


        v1.1.6: Fixed some bugs in the last update. Thanks

        ADDITIONAL INFORMATION


        Name Of Apk : Ultimate Soccer - Football
        Updated : December 6, 2016
        Current Version : 1.1.6
        Size of Apk : 14.9MB
        Requires Android :4.0 and upUltimate Soccer Football 1.1.6

        SCREENSHOTS


        Mod info:


        • Unlimited Points

        • Unlimited Golds

        Download Links


        Download Userscloud - Mod Apk [14.9MB]

        Download Dropapk - Mod Apk [14.9MB]

        Download From Google playstore

        From our site you can easily download Ultimate Soccer Football (MOD APK, unlimited money).apk! All without registration With good speed and without virus!
        Read more »

        Monday, May 8, 2017

        Download Winrar 5 00 Beta 6 Full Version Activator

        Winrar 5.00 beta 6 Full version. Siapa sih yang tidak tahu dengan software yang bernama winrar ini !? Winrar adalah software yang berfungsi untuk compressed file-file yang kita inginkan menjadi berformat rar atau zip dan tentu saja winrar adalah yang paling populer diantara beberapa software archiver.
        Untuk sahabat haramain software yang biasa berselancar didunia maya dan hobi mendownload, pasti biasanya yang didownload kebanyakan berformat rar atau zip karena memang oleh uploader sengaja dibuat menjadi berbentuk rar agar lebih aman.
        Banyak para uploader yang sering mengupload file memanfaatkan winrar. Selain winrar bisa kita gunakan untuk compress file, kita bisa juga memecah suatu file yang kapasitasnya besar menjadi beberapa part sesuai keinginan kita.

        Screenshot :


        Link Download :

        Download Winrar 5.00 Beta 6 32 Bit ( Embedupload 1,6 Mb )

        Download Winrar 5.00 Beta 6 64 Bit ( Embedupload 1,7 Mb )

        Download Activator ( Embedupload 248 Kb )

        Password If Need : Haramain Software

        Cara Install :
        1. Download sesuai kebutuhan PC sahabat HS ( 32 Bit atau 64 Bit )
        2. Kemudian Extract dan  install sampai selesai
        3. Setelah install, Extract Kg Winrar 5.00 Beta 6 www.software-word.blogspot.com.zip
        4. Jalankan winrar KEYGEN-FFF.exe
        5. Kemudina pada kolom Name ganti dengan nama sobat atau apasaja sesuka hati
        6. Kemudian klik generate dan klik save
        7. Selesai. sekarang sudah full version.
        Selamat mendownload dan semoga bermanfaat untuk sahabat haramain software. Jangan lupa gabung di Google+ admin HS atau follow dan like facebook fans page untuk mendapatkan setiap informasi update terbaru dari haramain software.
        Read more »

        Sunday, May 7, 2017

        Download Tekken 6 Game compressed

        Download Tekken 6 Game compressed
        < b> Tekken 6 Game compressed Download < / b >

        Tekken 6 game System Requirements:

        Operating System : Windows XP SP 3 / Vista / 7/8
        CPU: Pentium 4
        Processor: 2.6 GHz or AMD Athlon 2600
        RAM: 1 GB
        graphics card : 256 MB with Pixel Shader 3.0 (required)
        space hard Disk : 14 GB
        sound card : Direct X 9.0 Compatible DirectX
        Windows : Version 9.0 Keyboard and Mouse
        Size : 700 Mo

        < / b>
        Rar password: www.pkgames.net

        < / b>
        Part 1 Part 2 Download Tekken 6 Game compressedPart 3

        < / b>
        Download JPCSP emulator < / b>
        Read more »

        Saturday, April 29, 2017

        Download Tekken 6 PSP ISO Android Game Highly Compressed PPSSPP PSP



        TEKKEN 6 the most Famous and Addictive Game of PSP with 100% smooth gameplay for Android . Tekken 6 Android Apk (.cso) rom is now playable for android. so download this game and play without any lacking .
        Tekken 6 is a fighting game developed and published by Namco Bandai. It is the seventh main installment in the Tekken franchise. It was released in Japanese arcades on November 26, 2007 as the first game running on the PlayStation 3-based System 357 arcade board.

        Also See :- Download God Of War Ghost of Sparta Android PSP iso+Cso [Eng] Gaming Rom PPSSPP/PSP

        The game received an update, subtitled Bloodline Rebellion, a year later. A home version based on the update was released for PlayStation 3 and Xbox 360 on October 27, 2009 and for PlayStation Portable on November 24, 2009. This game can be digitally download via PlayStation Store to play on PlayStation Portable and PlayStation Vita. It is the first Tekken game to include multi-tiered stages and bound system. The game received generally positive reviews, especially the PSP version, which got an 82.60% from GameRankings and 82/100 from Metacritic.




        TEKKEN 6 sees the return of many familiar faces as well as new characters to create the largest line-up the series has ever seen. With a growing roster of fighters, each equipped with their own deadly techniques, moves and attack combinations, TEKKEN 6 will be the best King of Iron Fist Tournaments yet. Adding to the already rich gaming experience, a deeper character customization feature will only further enhance the incredible fighting intensity as players go mano-a-mano. Players can also take the battle online for classic match-ups and to compete for world domination.

        ALSO SEE :- Download Naruto Shippuden Ultimate Ninja Heroes 3 psp iso+cso Android

        FEATURES

        Tekken 6 features bigger stages with more interactivity than its predecessors
        such as walls or floors that can be broken to reveal new fighting areas
         The character customization feature has been enhanced
         certain items have implications in some aspects of gameplay.
        A new "rage" system has been added, giving characters more damage per hit when their vitality is below a certain point

        DOWNLOAD PPSSPP APK
        DOWNLOAD TEKKEN 6 PSP ISO ROM



        How To Install


        • Download PPSSPP.apk
        • Then download  Tekken 6.cso psp rom.
        • Run PPSSPP app and select your Tekken 6 rom.
        • Play and enjoy the game.

        Read more »

        Saturday, April 15, 2017

        Download RESIDENT EVIL 6 Full Version PC Game

        COVER PHOTOS
        Download RESIDENT EVIL 6 Full Version PC Game

        Download RESIDENT EVIL 6 Full Version PC Game

        The Resident Evil 6 is now Available to play on internetfullfunda blog. Just Download and enjoy the fear and horror game.


        Download RESIDENT EVIL 6 Full Version PC Game
         Download RESIDENT EVIL 6 Full Version PC Game
         Download RESIDENT EVIL 6 Full Version PC Game
         Download RESIDENT EVIL 6 Full Version PC Game
         Download RESIDENT EVIL 6 Full Version PC Game
         Download RESIDENT EVIL 6 Full Version PC Game
        Download

        System Requirement:

        Operating System : Windows Vista SP or Windows 7 SP1 or Windows 8 (both 32/64 bit versions).
        CPU : Intel Core2Quad Q8400@ 2.6 GHz AMD Athlon II X 4 620@ 2.6 GHz.
        RAM : 2 GB
        Memory : 120 GB HDD with 20 GB free Space.
        Video Card: Nvidia Geforce GTX 260 or AMD Radeon HD 4870.
        Read more »

        Tuesday, April 11, 2017

        Download uTorrent 3 4 6 Build 42178 Extorz

        Download uTorrent 3.4.6 Build 42178 | Extorz

        A pretty tiny bit-torrent that does the job with such precision and accuracy. uTorrent has proved its cause and is rolling on every PC nowadays, including downloading games, movies, softwares and stuff. If you wanna download something big like in gigs, use this 6 mb software to download thousands of files with so many features like schedule downloading, proxy options, peers options etc. The software is really a great hit for your pc and you can download it right here. You can download utorrent movies and torrent games too. Actually, there is a separate utorrent search where you can download several stuff with just some clicks. uTorrent mac has also been released which is really a great thing. For your consideration, a utorrent plus has also been released which welcomes you with even more amazing features.


        Name: uTorrent Build Free
        Release Date: Jan 2016
        Genre: Utility, Downloading
        Format: .rar
        Size: 4 mb
        Language: English
        Searches: Download uTorrent, uTorrent Movies Download Hollywood etc




        Download Game
        Read more »

        Wednesday, February 4, 2015

        KirSizer Flex AIR Image Sizer app Part 6

        In this tutorial we will add "Please wait" messages during file and folder selection, as well as the ability to select all files using Ctrl+A.

        The "Please wait" indicators are important to show the user that the program has not stopped working, but actually is working.

        First lets create this message. Go to declarations tags and add a new TitleWindow object with an id waitWindow and a Label inside of it called waitLabel.

        <mx:TitleWindow id="waitWindow" title="Please wait" width="240" height="70" showCloseButton="false">
        <s:Group width="100%" height="100%">
        <s:Label top="10" left="10" id="waitLabel" width="220" color="0x000000" />
        </s:Group>
        </mx:TitleWindow>

        Now go to the existing folderSelected() function and change the doFolder() function calls to startFolder() function calls, keep all the parameters the same:

        private function folderSelected(evt:Event):void {
        var file:File = evt.currentTarget as File;
        Alert.show("Do you want to select subfolders too?", "Recursive selection?", Alert.YES | Alert.NO, null, warningClose);

        function warningClose(ev:CloseEvent):void {
        if (ev.detail == Alert.YES) {
        startFolder(file, true);
        }
        if (ev.detail == Alert.NO) {
        startFolder(file, false);
        }
        }
        }

        The startFolder() function adds and centers the waitWindow window, sets its waitLabels text to "Selecting folders..." and adds a timer for 100 milliseconds (enough time for the message to display). When the timer is complete, a function called onWait is called, which calls doFolder() and removes the pop up window:

        private function startFolder(file:File, recurs:Boolean):void {
        PopUpManager.addPopUp(waitWindow, this);
        PopUpManager.centerPopUp(waitWindow);
        waitLabel.text = "Selecting folders...";
        var timer:Timer = new Timer(100, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, onWait);
        timer.start();
        function onWait(ev:TimerEvent):void {
        doFolder(file, recurs);
        PopUpManager.removePopUp(waitWindow);
        }
        }

        Now lets do the same with files. Go to filesSelected() function and add similar to startFolder() code:

        private function filesSelected(evt:FileListEvent):void {
        PopUpManager.addPopUp(waitWindow, this);
        PopUpManager.centerPopUp(waitWindow);
        waitLabel.text = "Selecting files...";
        var timer:Timer = new Timer(100, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, onWait);
        timer.start();
        function onWait(ev:TimerEvent):void {
        doFiles(evt.files);
        PopUpManager.removePopUp(waitWindow);
        }
        }

        The doFiles() function that is called contains the previous code of filesSelected():

        private function doFiles(files:Array):void {
        for (var i:int = 0; i < files.length; i++) {
        var alreadySelected:Boolean = false;
        for (var u:int = 0; u < selectedFiles.length; u++) {
        if (selectedFiles[u].type == 0 && selectedFiles[u].path == files[i].nativePath) {
        alreadySelected = true;
        }
        }
        if (!alreadySelected) selectedFiles.addItem({type:0, path:files[i].nativePath});
        }
        updateTotalFiles();
        }

        Now, lets implement Ctrl+A selection. Firstly we need to add a keyboard event listener. To do that, we first need to listen to creationComplete event of the root tags:

        <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        width="300" height="460"
        showStatusBar="false" title="KirSizer" creationComplete="init();">

        And the init() function adds the listener:

        private function init():void {
        addEventListener(KeyboardEvent.KEY_DOWN, keybDown);
        }

        In keybDown() function we check if the combination is Ctrl+A and create an array of all the indices, then we set this array as the value for tileList.selectedIndices:

        private function keybDown(evt:KeyboardEvent):void {
        if (evt.ctrlKey && evt.keyCode == 65) {
        var arr:Array = [];
        for (var i:int = 0; i < selectedFiles.length; i++) {
        arr.push(i);
        }
        tileList.selectedIndices = arr;
        }
        }

        Full code:

        <?xml version="1.0" encoding="utf-8"?>
        <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:mx="library://ns.adobe.com/flex/mx"
        width="300" height="460"
        showStatusBar="false" title="KirSizer" creationComplete="init();">

        <fx:Declarations>
        <mx:ArrayCollection id="measures">
        <fx:String>%</fx:String>
        <fx:String>px</fx:String>
        </mx:ArrayCollection>
        <mx:ArrayCollection id="actions">
        <fx:String>Fixed width, fixed height</fx:String>
        <fx:String>Fixed width, proportional height</fx:String>
        <fx:String>Proportional width, fixed height</fx:String>
        <fx:String>Proportional sizes to fit specified sizes</fx:String>
        </mx:ArrayCollection>
        <mx:ArrayCollection id="formats">
        <fx:String>Same format as initial file</fx:String>
        <fx:String>Convert all to JPG</fx:String>
        <fx:String>Convert all to PNG</fx:String>
        </mx:ArrayCollection>
        <mx:Fade id="fadeIn" alphaFrom="0" alphaTo="1" duration="300"/>
        <mx:Fade id="fadeOut" alphaFrom="1" alphaTo="0" duration="300"/>
        <mx:TitleWindow id="waitWindow" title="Please wait" width="240" height="70" showCloseButton="false">
        <s:Group width="100%" height="100%">
        <s:Label top="10" left="10" id="waitLabel" width="220" color="0x000000" />
        </s:Group>
        </mx:TitleWindow>
        </fx:Declarations>

        <fx:Style>
        @namespace s "library://ns.adobe.com/flex/spark";
        @namespace mx "library://ns.adobe.com/flex/mx";

        #contentStack{
        backgroundColor: #313131;
        }

        s|Label{
        color: #fcfcfc;
        }

        s|Button{
        chromeColor: #636363;
        }

        mx|ComboBox{
        chromeColor: #636363;
        color: #fcfcfc;
        contentBackgroundColor: #000000;
        rollOverColor: #aaaaaa;
        selectionColor: #ffffff;
        }
        </fx:Style>

        <fx:Script>
        <![CDATA[
        import flash.events.Event;
        import flash.events.FileListEvent;
        import flash.events.KeyboardEvent;
        import flash.events.TimerEvent;
        import flash.filesystem.File;
        import flash.net.FileFilter;
        import flash.utils.Timer;
        import mx.collections.ArrayCollection;
        import mx.effects.easing.Linear;
        import mx.controls.Alert;
        import mx.events.CloseEvent;
        import mx.events.FlexEvent;
        import mx.events.StateChangeEvent;
        import mx.managers.PopUpManager;

        [Bindable]
        private var selectedFiles:ArrayCollection = new ArrayCollection([]);

        private function init():void {
        addEventListener(KeyboardEvent.KEY_DOWN, keybDown);
        }

        private function keybDown(evt:KeyboardEvent):void {
        if (evt.ctrlKey && evt.keyCode == 65) {
        var arr:Array = [];
        for (var i:int = 0; i < selectedFiles.length; i++) {
        arr.push(i);
        }
        tileList.selectedIndices = arr;
        }
        }

        private function actionChange():void{
        switch (actionCombo.selectedIndex) {
        case 0: case 3:
        newWidth.enabled = true;
        widthMeasure.enabled = true;
        newHeight.enabled = true;
        heightMeasure.enabled = true;
        break;
        case 1:
        newWidth.enabled = true;
        widthMeasure.enabled = true;
        newHeight.enabled = false;
        heightMeasure.enabled = false;
        break;
        case 2:
        newWidth.enabled = false;
        widthMeasure.enabled = false;
        newHeight.enabled = true;
        heightMeasure.enabled = true;
        break;
        }
        }

        private function addFiles():void {
        var file:File = new File();
        file.browseForOpenMultiple("Select JPG or PNG files", [new FileFilter("Pictures", "*.jpg;*.jpeg;*.png")]);
        file.addEventListener(FileListEvent.SELECT_MULTIPLE, filesSelected);
        }

        private function filesSelected(evt:FileListEvent):void {
        PopUpManager.addPopUp(waitWindow, this);
        PopUpManager.centerPopUp(waitWindow);
        waitLabel.text = "Selecting files...";
        var timer:Timer = new Timer(100, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, onWait);
        timer.start();
        function onWait(ev:TimerEvent):void {
        doFiles(evt.files);
        PopUpManager.removePopUp(waitWindow);
        }
        }

        private function addFolder():void {
        var file:File = new File();
        file.browseForDirectory("Select a directory");
        file.addEventListener(Event.SELECT, folderSelected);
        }

        private function folderSelected(evt:Event):void {
        var file:File = evt.currentTarget as File;
        Alert.show("Do you want to select subfolders too?", "Recursive selection?", Alert.YES | Alert.NO, null, warningClose);

        function warningClose(ev:CloseEvent):void {
        if (ev.detail == Alert.YES) {
        startFolder(file, true);
        }
        if (ev.detail == Alert.NO) {
        startFolder(file, false);
        }
        }
        }

        private function startFolder(file:File, recurs:Boolean):void {
        PopUpManager.addPopUp(waitWindow, this);
        PopUpManager.centerPopUp(waitWindow);
        waitLabel.text = "Selecting folders...";
        var timer:Timer = new Timer(100, 1);
        timer.addEventListener(TimerEvent.TIMER_COMPLETE, onWait);
        timer.start();
        function onWait(ev:TimerEvent):void {
        doFolder(file, recurs);
        PopUpManager.removePopUp(waitWindow);
        }
        }

        private function doFiles(files:Array):void {
        for (var i:int = 0; i < files.length; i++) {
        var alreadySelected:Boolean = false;
        for (var u:int = 0; u < selectedFiles.length; u++) {
        if (selectedFiles[u].type == 0 && selectedFiles[u].path == files[i].nativePath) {
        alreadySelected = true;
        }
        }
        if (!alreadySelected) selectedFiles.addItem({type:0, path:files[i].nativePath});
        }
        updateTotalFiles();
        }

        private function doFolder(file:File, isRecursive:Boolean):void {
        var picturesInFolder:int = 0;
        var childFiles:Array = file.getDirectoryListing();
        for (var i:int = 0; i < childFiles.length; i++) {
        if (childFiles[i].extension == "png" || childFiles[i].extension == "jpg" || childFiles[i].extension == "jpeg") {
        picturesInFolder++;
        }
        if (childFiles[i].isDirectory && isRecursive) {
        doFolder(childFiles[i], true);
        }
        }
        if (picturesInFolder > 0) {
        var alreadySelected:Boolean = false;
        for (var a:int = 0; a < selectedFiles.length; a++) {
        if (selectedFiles[a].type == 1 && selectedFiles[a].path == file.nativePath) {
        alreadySelected = true;
        }
        }
        if (!alreadySelected) selectedFiles.addItem( { type:1, path:file.nativePath, name:file.name, num:picturesInFolder } );
        updateTotalFiles();
        }
        }

        private function updateTotalFiles():void {
        var totalFiles:int = 0;
        for (var i:int = 0; i < selectedFiles.length; i++) {
        if (selectedFiles[i].type==1) {
        totalFiles += selectedFiles[i].num;
        }else {
        totalFiles++;
        }
        }
        labelSelected.text = totalFiles + " files selected";
        }

        private function removeSelected():void {
        while (tileList.selectedItems.length > 0) {
        selectedFiles.removeItemAt(tileList.selectedIndices[0]);
        }
        updateTotalFiles();
        }
        ]]>
        </fx:Script>

        <mx:ViewStack id="contentStack" width="100%" height="100%">
        <s:NavigatorContent width="100%" height="100%" hideEffect="fadeOut" showEffect="fadeIn">
        <s:VGroup width="100%" height="100%" paddingLeft="10" paddingTop="10" paddingRight="10" paddingBottom="10">
        <s:Label id="labelSelected">0 files selected</s:Label>
        <mx:TileList id="tileList" width="282" height="100%" dataProvider="{selectedFiles}" itemRenderer="TileRenderer" columnWidth="60" rowHeight="60" columnCount="4" allowMultipleSelection="true" selectionColor="0xff0000" rollOverColor="0xff8888" />
        <s:Button label="Add folder" width="100%" click="addFolder();" />
        <s:Button label="Add files" width="100%" click="addFiles();" />
        <s:Button label="{Remove + tileList.selectedItems.length + items}" width="100%" enabled="{tileList.selectedItems.length>0}" click="removeSelected();" />
        <s:Button label="Continue" width="100%" click="contentStack.selectedIndex = 1;" />
        </s:VGroup>
        </s:NavigatorContent>
        <s:NavigatorContent width="100%" height="100%" hideEffect="fadeOut" showEffect="fadeIn">
        <s:VGroup width="100%" height="100%" paddingLeft="10" paddingTop="10" paddingRight="10" paddingBottom="10">
        <s:Button label="Return to file selection" width="100%" click="contentStack.selectedIndex = 0;" />

        <s:Label>Resize options:</s:Label>

        <mx:ComboBox width="100%" id="actionCombo" height="22" dataProvider="{actions}" selectedIndex="0" editable="false" change="actionChange();"
        openEasingFunction="Linear.easeOut" closeEasingFunction="Linear.easeIn" openDuration="300" closeDuration="300"/>
        <s:HGroup verticalAlign="middle">
        <s:Label width="50">Width:</s:Label>
        <s:NumericStepper id="newWidth" height="22" width="150" minimum="1" value="100" maximum="{(widthMeasure.selectedIndex==0)?(100):(4000)}" />
        <mx:ComboBox id="widthMeasure" height="22" width="50" dataProvider="{measures}" selectedIndex="0" editable="false"
        openEasingFunction="Linear.easeOut" closeEasingFunction="Linear.easeIn" openDuration="300" closeDuration="300"/>
        </s:HGroup>

        <s:HGroup verticalAlign="middle">
        <s:Label width="50">Height:</s:Label>
        <s:NumericStepper id="newHeight" height="22" width="150" minimum="1" value="100" maximum="{(heightMeasure.selectedIndex==0)?(100):(4000)}"/>
        <mx:ComboBox id="heightMeasure" height="22" width="50" dataProvider="{measures}" selectedIndex="0" editable="false"
        openEasingFunction="Linear.easeOut" closeEasingFunction="Linear.easeIn" openDuration="300" closeDuration="300"/>
        </s:HGroup>

        <s:Label/>

        <s:Label>Output file names:</s:Label>
        <s:HGroup verticalAlign="middle">
        <s:TextInput width="240" text="%initialName%" />
        <s:Button width="35" label="?"/>
        </s:HGroup>

        <s:Label/>

        <s:Label>Output destination:</s:Label>
        <s:HGroup verticalAlign="middle">
        <s:RadioButton id="oldDestination" label="Same directory" groupName="destinationGroup" selected="true" />
        <s:RadioButton id="newDestination" label="Specified directory" groupName="destinationGroup" />
        </s:HGroup>
        <s:HGroup verticalAlign="middle" width="100%">
        <s:TextInput width="100%" enabled="{newDestination.selected}" text="Select destination..." editable="false" />
        <s:Button width="80" label="Browse" enabled="{newDestination.selected}"/>
        </s:HGroup>

        <s:Label/>

        <s:Label>Output format:</s:Label>
        <mx:ComboBox width="100%" height="22" id="formatCombo" dataProvider="{formats}" selectedIndex="0" editable="false"
        openEasingFunction="Linear.easeOut" closeEasingFunction="Linear.easeIn" openDuration="300" closeDuration="300"/>

        <s:Label/>

        <s:Label>Output JPG quality:</s:Label>
        <s:HSlider width="100%" minimum="1" maximum="100" value="100" />

        <s:Label/>

        <s:Button label="Resize" width="100%" />
        </s:VGroup>
        </s:NavigatorContent>
        </mx:ViewStack>
        </s:WindowedApplication>

        Thanks for reading!
        Read more »

        Tuesday, February 3, 2015

        F1 A10 4 1 1 Updated firmware 20130319 2 0 6

        F1 (A10) 4.1.1 Updated firmware 20130319.2.0.6




        DOWNLOAD OFFICIAL FIRMWARE
        Read more »

        Saturday, January 31, 2015

        Creating a Flex AIR Screenshot app Part 6

        In this tutorial well work on the url-related GUI elements.

        The path the user can enter can be either an internet URL, or a local path. It is important to know that www.google.com or google.com alone wont work, http:// is required in front of the link. However, we dont know whether the path that the user entered is a local path or path to a file on the internet, and we dont know if http:// or something else is required, so we can just put "http://" by default into the text field, so that the user will just add his link to it (or replace the content completely with the link that he had copied, which is more likely).

        So, find urlInput text field and put "http://" as its text value by default:

        <s:TextInput width="250" id="urlInput" text="http://" />

        The user should be able to enter anything in the address bar, a long as it is not blank, so lets add a check, which disables the two image buttons if the url is blank.

        <custom:ImageButton img="@Embed(../lib/b_cut.png)" over="@Embed(../lib/b_cut_over.png)" toolTip="Crop area" click="goCrop();" buttonMode="true" enabled="{urlInput.text!=}" />
        <custom:ImageButton img="@Embed(../lib/b_screenshot.png)" over="@Embed(../lib/b_screenshot_over.png)" toolTip="Take screenshot" buttonMode="true" enabled="{urlInput.text!=}" />

        Now lets add some loading information to the crop stage window. Well add 2 label objects, one of them will contain the url, and the second one will display "Loading" or "Loaded".

        Add these 2 labels, set the first ones id to cropStatus and the second ones text bound to urlString,

        <s:NavigatorContent id="crop">
        <s:VGroup width="100%" height="100%" gap="0">
        <mx:HBox backgroundColor="#999999" width="100%" height="24" verticalScrollPolicy="off" verticalAlign="middle" paddingLeft="2">
        <s:Button label="Back" click="{stack.selectedChild = loadpage}" />
        <s:Button label="Continue" enabled="false" />
        <s:Label id="cropStatus" />
        <s:Label text="{urlString}" />
        </mx:HBox>
        <mx:HTML width="100%" height="100%" id="cropHTML" />
        </s:VGroup>
        </s:NavigatorContent>

        Now we have to make urlString bindable:

        [Bindable]
        private var urlString:String;

        Go to changeState(). In the second conditional, add lines that set cropStatus text value to Loading, as well as its color to yellow. Add a listener for its COMPLETE event and set onCropLoad function as its handler.

        private function changeState():void {
        if (stack.selectedChild == loadpage) {
        contentBox.setStyle("horizontalAlign", "center");
        urlInput.text = urlString;
        cropHTML.htmlLoader.loadString("");
        }
        if (stack.selectedChild == crop) {
        maximize();
        contentBox.setStyle("horizontalAlign", "left");
        cropHTML.htmlLoader.load(new URLRequest(urlString));
        cropHTML.width = contentBox.width;
        cropHTML.height = contentBox.height;
        cropStatus.text = "Loading";
        cropStatus.setStyle("color", "#ffff00");
        cropHTML.addEventListener(Event.COMPLETE, onCropLoad);
        }
        }

        The onCropLoad function sets the text to Loaded and color to white:

        private function onCropLoad(evt:Event):void {
        cropStatus.text = "Loaded";
        cropStatus.setStyle("color", "#ffffff");
        }

        And thats all for today.

        Full code:

        <?xml version="1.0" encoding="utf-8"?>
        <s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:custom="*"
        xmlns:mx="library://ns.adobe.com/flex/mx" showStatusBar="false"
        width="450" height="300" creationComplete="init();">


        <fx:Declarations>
        <mx:ArrayCollection id="headerTitles">
        <fx:Object step="Step one:" description="load a web page." />
        <fx:Object step="Step two:" description="set your export preferences." />
        <fx:Object step="Step two:" description="select the area you wish to crop." />
        <fx:Object step="Step three:" description="set your export preferences for the cropped image." />
        <fx:Object step="Final step:" description="please wait while your images are being expored." />
        </mx:ArrayCollection>
        </fx:Declarations>

        <fx:Style>
        @namespace s "library://ns.adobe.com/flex/spark";
        @namespace mx "library://ns.adobe.com/flex/mx";

        .descriptionText{
        fontSize: 24;
        color: #fff;
        }

        #headStep{
        fontSize: 30;
        fontWeight: bold;
        color: #ffffbb;
        }

        #headDesc{
        fontSize: 30;
        color: #ffffff;
        }
        </fx:Style>

        <fx:Script>
        <![CDATA[
        import flash.events.Event;
        import flash.filesystem.File;
        import flash.net.URLRequest;
        import mx.events.FlexNativeWindowBoundsEvent;

        [Bindable]
        private var urlString:String;

        private function init():void {
        addEventListener(FlexNativeWindowBoundsEvent.WINDOW_RESIZE, onResize);
        }

        private function doBrowse():void{
        var file:File = new File();
        file.addEventListener(Event.SELECT, browseSelect);
        file.browseForOpen("Load a webpage");

        function browseSelect(evt:Event):void {
        urlInput.text = file.nativePath;
        }
        }

        private function goCrop():void {
        stack.selectedChild = crop;
        urlString = urlInput.text;
        }

        private function changeState():void {
        if (stack.selectedChild == loadpage) {
        contentBox.setStyle("horizontalAlign", "center");
        urlInput.text = urlString;
        cropHTML.htmlLoader.loadString("");
        }
        if (stack.selectedChild == crop) {
        maximize();
        contentBox.setStyle("horizontalAlign", "left");
        cropHTML.htmlLoader.load(new URLRequest(urlString));
        cropHTML.width = contentBox.width;
        cropHTML.height = contentBox.height;
        cropStatus.text = "Loading";
        cropStatus.setStyle("color", "#ffff00");
        cropHTML.addEventListener(Event.COMPLETE, onCropLoad);
        }
        }

        private function onCropLoad(evt:Event):void {
        cropStatus.text = "Loaded";
        cropStatus.setStyle("color", "#ffffff");
        }

        private function onResize(evt:Event):void {
        if (stack.selectedChild == crop) {
        cropHTML.width = contentBox.width;
        cropHTML.height = contentBox.height;
        }
        }
        ]]>
        </fx:Script>

        <s:VGroup width="100%" height="100%" gap="0">
        <mx:HBox backgroundColor="#333333" height="46" width="100%" paddingTop="10" paddingLeft="10">
        <s:Label id="headStep" text="{headerTitles.getItemAt(stack.selectedIndex).step}" />
        <s:Label id="headDesc" text="{headerTitles.getItemAt(stack.selectedIndex).description}" />
        </mx:HBox>
        <mx:Box backgroundColor="#666666" width="100%" height="100%" id="contentBox" horizontalAlign="center">
        <mx:ViewStack id="stack" change="changeState();">
        <s:NavigatorContent id="loadpage">
        <s:VGroup width="100%" horizontalAlign="center" paddingTop="20">
        <s:Label styleName="descriptionText">Enter the link to the page:</s:Label>
        <s:HGroup>
        <s:TextInput width="250" id="urlInput" text="http://" /><s:Button label="Browse local..." click="doBrowse();" />
        </s:HGroup>
        <s:HGroup>
        <custom:ImageButton img="@Embed(../lib/b_cut.png)" over="@Embed(../lib/b_cut_over.png)" toolTip="Crop area" click="goCrop();" buttonMode="true" enabled="{urlInput.text!=}" />
        <custom:ImageButton img="@Embed(../lib/b_screenshot.png)" over="@Embed(../lib/b_screenshot_over.png)" toolTip="Take screenshot" buttonMode="true" enabled="{urlInput.text!=}" />
        </s:HGroup>
        </s:VGroup>
        </s:NavigatorContent>

        <s:NavigatorContent id="screenshotsettings">

        </s:NavigatorContent>

        <s:NavigatorContent id="crop">
        <s:VGroup width="100%" height="100%" gap="0">
        <mx:HBox backgroundColor="#999999" width="100%" height="24" verticalScrollPolicy="off" verticalAlign="middle" paddingLeft="2">
        <s:Button label="Back" click="{stack.selectedChild = loadpage}" />
        <s:Button label="Continue" enabled="false" />
        <s:Label id="cropStatus" />
        <s:Label text="{urlString}" />
        </mx:HBox>
        <mx:HTML width="100%" height="100%" id="cropHTML" />
        </s:VGroup>
        </s:NavigatorContent>

        <s:NavigatorContent id="cropsettings">

        </s:NavigatorContent>

        <s:NavigatorContent id="export">

        </s:NavigatorContent>
        </mx:ViewStack>
        </mx:Box>
        </s:VGroup>

        </s:WindowedApplication>

        Thanks for reading!
        Read more »