diff --git a/Database.sql b/Database.sql new file mode 100644 index 0000000..1bec962 --- /dev/null +++ b/Database.sql @@ -0,0 +1,1778 @@ +-- phpMyAdmin SQL Dump +-- version 3.1.3.1 +-- http://www.phpmyadmin.net +-- +-- Host: localhost +-- Generation Time: Oct 21, 2010 at 03:03 AM +-- Server version: 5.1.33 +-- PHP Version: 5.2.9 + +SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; + +-- +-- Database: `pk` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `bans` +-- + +CREATE TABLE IF NOT EXISTS `bans` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `username` varchar(200) DEFAULT NULL, + `ip` varchar(255) DEFAULT NULL, + `email` varchar(80) DEFAULT NULL, + `message` varchar(255) DEFAULT NULL, + `expire` int(10) unsigned DEFAULT NULL, + `ban_creator` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `bans_username_idx` (`username`(25)) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `bans` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `categories` +-- + +CREATE TABLE IF NOT EXISTS `categories` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `cat_name` varchar(80) NOT NULL DEFAULT 'New Category', + `disp_position` int(10) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `categories` +-- + +INSERT INTO `categories` (`id`, `cat_name`, `disp_position`) VALUES +(1, 'Test category', 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `censoring` +-- + +CREATE TABLE IF NOT EXISTS `censoring` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `search_for` varchar(60) NOT NULL DEFAULT '', + `replace_with` varchar(60) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `censoring` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `config` +-- + +CREATE TABLE IF NOT EXISTS `config` ( + `conf_name` varchar(255) NOT NULL DEFAULT '', + `conf_value` text, + PRIMARY KEY (`conf_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `config` +-- + +INSERT INTO `config` (`conf_name`, `conf_value`) VALUES +('o_cur_version', '1.4.1'), +('o_database_revision', '7'), +('o_searchindex_revision', '1'), +('o_parser_revision', '1'), +('o_board_title', 'My FluxBB forum'), +('o_board_desc', '

Unfortunately no one can be told what FluxBB is - you have to see it for yourself.

'), +('o_default_timezone', '0'), +('o_time_format', 'H:i:s'), +('o_date_format', 'Y-m-d'), +('o_timeout_visit', '1800'), +('o_timeout_online', '300'), +('o_redirect_delay', '1'), +('o_show_version', '0'), +('o_show_user_info', '1'), +('o_show_post_count', '1'), +('o_signatures', '1'), +('o_smilies', '1'), +('o_smilies_sig', '1'), +('o_make_links', '1'), +('o_default_lang', 'English'), +('o_default_style', 'Air'), +('o_default_user_group', '4'), +('o_topic_review', '15'), +('o_disp_topics_default', '30'), +('o_disp_posts_default', '25'), +('o_indent_num_spaces', '4'), +('o_quote_depth', '3'), +('o_quickpost', '1'), +('o_users_online', '1'), +('o_censoring', '0'), +('o_ranks', '1'), +('o_show_dot', '0'), +('o_topic_views', '1'), +('o_quickjump', '1'), +('o_gzip', '0'), +('o_additional_navlinks', ''), +('o_report_method', '0'), +('o_regs_report', '0'), +('o_default_email_setting', '1'), +('o_mailing_list', 'crazyonedude@hotmail.com'), +('o_avatars', '1'), +('o_avatars_dir', 'img/avatars'), +('o_avatars_width', '60'), +('o_avatars_height', '60'), +('o_avatars_size', '10240'), +('o_search_all_forums', '1'), +('o_base_url', 'http://localhost'), +('o_admin_email', 'crazyonedude@hotmail.com'), +('o_webmaster_email', 'crazyonedude@hotmail.com'), +('o_subscriptions', '1'), +('o_smtp_host', NULL), +('o_smtp_user', NULL), +('o_smtp_pass', NULL), +('o_smtp_ssl', '0'), +('o_regs_allow', '1'), +('o_regs_verify', '0'), +('o_announcement', '0'), +('o_announcement_message', 'Enter your announcement here.'), +('o_rules', '0'), +('o_rules_message', 'Enter your rules here.'), +('o_maintenance', '0'), +('o_maintenance_message', 'The forums are temporarily down for maintenance. Please try again in a few minutes.
\n
\n/Administrator'), +('o_default_dst', '0'), +('o_feed_type', '2'), +('p_message_bbcode', '1'), +('p_message_img_tag', '1'), +('p_message_all_caps', '1'), +('p_subject_all_caps', '1'), +('p_sig_all_caps', '1'), +('p_sig_bbcode', '1'), +('p_sig_img_tag', '0'), +('p_sig_length', '400'), +('p_sig_lines', '4'), +('p_allow_banned_email', '1'), +('p_allow_dupe_email', '0'), +('p_force_guest_email', '1'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `drops` +-- + +CREATE TABLE IF NOT EXISTS `drops` ( + `id` int(11) DEFAULT NULL, + `item` varchar(255) DEFAULT NULL, + `amount` int(11) DEFAULT NULL, + `weight` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `drops` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `dupe_data` +-- + +CREATE TABLE IF NOT EXISTS `dupe_data` ( + `user` varchar(255) NOT NULL, + `userhash` varchar(255) NOT NULL, + `string` text NOT NULL, + `time` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `dupe_data` +-- + +INSERT INTO `dupe_data` (`user`, `userhash`, `string`, `time`) VALUES +('Laserline', '42293815201319', '1287525847 Laserline picked up an item Party Hat (577) amount: 1 at: 216/442|216/442\n', '1287525847506'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `error_reports` +-- + +CREATE TABLE IF NOT EXISTS `error_reports` ( + `data` text, + `email` varchar(255) DEFAULT NULL, + `ip` varchar(255) DEFAULT NULL, + `unix` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `error_reports` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `forums` +-- + +CREATE TABLE IF NOT EXISTS `forums` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `forum_name` varchar(80) NOT NULL DEFAULT 'New forum', + `forum_desc` text, + `redirect_url` varchar(100) DEFAULT NULL, + `moderators` text, + `num_topics` mediumint(8) unsigned NOT NULL DEFAULT '0', + `num_posts` mediumint(8) unsigned NOT NULL DEFAULT '0', + `last_post` int(10) unsigned DEFAULT NULL, + `last_post_id` int(10) unsigned DEFAULT NULL, + `last_poster` varchar(200) DEFAULT NULL, + `sort_by` tinyint(1) NOT NULL DEFAULT '0', + `disp_position` int(10) NOT NULL DEFAULT '0', + `cat_id` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `forums` +-- + +INSERT INTO `forums` (`id`, `forum_name`, `forum_desc`, `redirect_url`, `moderators`, `num_topics`, `num_posts`, `last_post`, `last_post_id`, `last_poster`, `sort_by`, `disp_position`, `cat_id`) VALUES +(1, 'Test forum', 'This is just a test forum', NULL, NULL, 1, 1, 1281311594, 1, 'admin', 0, 1, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `forum_perms` +-- + +CREATE TABLE IF NOT EXISTS `forum_perms` ( + `group_id` int(10) NOT NULL DEFAULT '0', + `forum_id` int(10) NOT NULL DEFAULT '0', + `read_forum` tinyint(1) NOT NULL DEFAULT '1', + `post_replies` tinyint(1) NOT NULL DEFAULT '1', + `post_topics` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`group_id`,`forum_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `forum_perms` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `gp_count` +-- + +CREATE TABLE IF NOT EXISTS `gp_count` ( + `unixtime` varchar(255) DEFAULT NULL, + `amount` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `gp_count` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `groups` +-- + +CREATE TABLE IF NOT EXISTS `groups` ( + `g_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `g_title` varchar(50) NOT NULL DEFAULT '', + `g_user_title` varchar(50) DEFAULT NULL, + `g_moderator` tinyint(1) NOT NULL DEFAULT '0', + `g_mod_edit_users` tinyint(1) NOT NULL DEFAULT '0', + `g_mod_rename_users` tinyint(1) NOT NULL DEFAULT '0', + `g_mod_change_passwords` tinyint(1) NOT NULL DEFAULT '0', + `g_mod_ban_users` tinyint(1) NOT NULL DEFAULT '0', + `g_read_board` tinyint(1) NOT NULL DEFAULT '1', + `g_view_users` tinyint(1) NOT NULL DEFAULT '1', + `g_post_replies` tinyint(1) NOT NULL DEFAULT '1', + `g_post_topics` tinyint(1) NOT NULL DEFAULT '1', + `g_edit_posts` tinyint(1) NOT NULL DEFAULT '1', + `g_delete_posts` tinyint(1) NOT NULL DEFAULT '1', + `g_delete_topics` tinyint(1) NOT NULL DEFAULT '1', + `g_set_title` tinyint(1) NOT NULL DEFAULT '1', + `g_search` tinyint(1) NOT NULL DEFAULT '1', + `g_search_users` tinyint(1) NOT NULL DEFAULT '1', + `g_send_email` tinyint(1) NOT NULL DEFAULT '1', + `g_post_flood` smallint(6) NOT NULL DEFAULT '30', + `g_search_flood` smallint(6) NOT NULL DEFAULT '30', + `g_email_flood` smallint(6) NOT NULL DEFAULT '60', + PRIMARY KEY (`g_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; + +-- +-- Dumping data for table `groups` +-- + +INSERT INTO `groups` (`g_id`, `g_title`, `g_user_title`, `g_moderator`, `g_mod_edit_users`, `g_mod_rename_users`, `g_mod_change_passwords`, `g_mod_ban_users`, `g_read_board`, `g_view_users`, `g_post_replies`, `g_post_topics`, `g_edit_posts`, `g_delete_posts`, `g_delete_topics`, `g_set_title`, `g_search`, `g_search_users`, `g_send_email`, `g_post_flood`, `g_search_flood`, `g_email_flood`) VALUES +(1, 'Administrators', 'Administrator', 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0), +(2, 'Moderators', 'Moderator', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0), +(3, 'Guest', NULL, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 60, 30, 0), +(4, 'Members', NULL, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 60, 30, 60); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `invites` +-- + +CREATE TABLE IF NOT EXISTS `invites` ( + `owner` varchar(255) NOT NULL DEFAULT '', + `code` varchar(255) NOT NULL DEFAULT '', + `time` int(10) unsigned NOT NULL DEFAULT '0', + `invites` varchar(255) NOT NULL DEFAULT '1', + `email` varchar(255) NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `invites` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `irc_online` +-- + +CREATE TABLE IF NOT EXISTS `irc_online` ( + `username` varchar(255) NOT NULL, + `rank` int(1) DEFAULT NULL, + PRIMARY KEY (`username`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `irc_online` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `irc_stats` +-- + +CREATE TABLE IF NOT EXISTS `irc_stats` ( + `username` varchar(255) NOT NULL, + `messages` int(10) DEFAULT NULL, + `modes` int(10) DEFAULT NULL, + `kicks` int(10) DEFAULT NULL, + `kicked` int(10) DEFAULT NULL, + `lastTimeSpoken` bigint(11) DEFAULT NULL, + `joins` int(10) DEFAULT NULL, + `parts` int(10) DEFAULT NULL, + `randomstring` text, + `moderatedchan` int(10) DEFAULT NULL, + PRIMARY KEY (`username`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `irc_stats` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `items` +-- + +CREATE TABLE IF NOT EXISTS `items` ( + `id` int(11) DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `description` varchar(255) DEFAULT NULL, + `price` int(11) DEFAULT NULL, + `stackable` varchar(255) DEFAULT NULL, + `wieldable` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `items` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `logins` +-- + +CREATE TABLE IF NOT EXISTS `logins` ( + `id` int(10) DEFAULT NULL, + `login_ip` varchar(15) DEFAULT NULL, + `time` int(10) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `logins` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `messages` +-- + +CREATE TABLE IF NOT EXISTS `messages` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `owner` int(10) NOT NULL DEFAULT '0', + `subject` varchar(120) NOT NULL DEFAULT '', + `message` text, + `sender` varchar(120) NOT NULL DEFAULT '', + `sender_id` int(10) NOT NULL DEFAULT '0', + `posted` int(10) NOT NULL DEFAULT '0', + `sender_ip` varchar(120) NOT NULL DEFAULT '0.0.0.0', + `smileys` tinyint(1) NOT NULL DEFAULT '1', + `status` tinyint(1) NOT NULL DEFAULT '0', + `showed` tinyint(1) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `messages_owner_idx` (`owner`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23964 ; + +-- +-- Dumping data for table `messages` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `online` +-- + +CREATE TABLE IF NOT EXISTS `online` ( + `user_id` int(10) unsigned NOT NULL DEFAULT '1', + `ident` varchar(200) NOT NULL DEFAULT '', + `logged` int(10) unsigned NOT NULL DEFAULT '0', + `idle` tinyint(1) NOT NULL DEFAULT '0', + `last_post` int(10) unsigned DEFAULT NULL, + `last_search` int(10) unsigned DEFAULT NULL, + UNIQUE KEY `online_user_id_ident_idx` (`user_id`,`ident`(25)), + KEY `online_ident_idx` (`ident`(25)), + KEY `online_logged_idx` (`logged`) +) ENGINE=MEMORY DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `online` +-- + +INSERT INTO `online` (`user_id`, `ident`, `logged`, `idle`, `last_post`, `last_search`) VALUES +(3, 'admin', 1287651758, 0, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `online_count` +-- + +CREATE TABLE IF NOT EXISTS `online_count` ( + `unixtime` varchar(255) DEFAULT NULL, + `online` int(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `online_count` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_bank` +-- + +CREATE TABLE IF NOT EXISTS `pk_bank` ( + `user` varchar(255) DEFAULT NULL, + `id` int(10) unsigned NOT NULL, + `amount` int(10) unsigned NOT NULL DEFAULT '1', + `slot` int(5) unsigned NOT NULL, + KEY `user` (`user`), + KEY `id` (`id`), + KEY `amount` (`amount`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_bank` +-- + +INSERT INTO `pk_bank` (`user`, `id`, `amount`, `slot`) VALUES +('231514', 376, 1, 5), +('221303401880', 4, 65929216, 0), +('231514', 70, 1, 4), +('231514', 4, 1, 3), +('231514', 156, 1, 2), +('231514', 1263, 2, 1), +('231514', 87, 1, 0), +('1605225260', 10, 65929216, 0), +('1222846212', 10, 65929216, 0), +('500766777', 10, 65929216, 0), +('1326000417', 10, 65929216, 0), +('429496599', 256, 82771968, 2), +('429496599', 0, 1291845632, 1), +('429496599', 316, 1, 0), +('429496599', 1, 256, 3); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_banlog` +-- + +CREATE TABLE IF NOT EXISTS `pk_banlog` ( + `user` varchar(255) DEFAULT NULL, + `staff` varchar(255) DEFAULT NULL, + `time` int(10) DEFAULT NULL, + KEY `staff` (`staff`), + KEY `time` (`time`), + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_banlog` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_curstats` +-- + +CREATE TABLE IF NOT EXISTS `pk_curstats` ( + `user` varchar(255) NOT NULL, + `cur_attack` int(5) unsigned NOT NULL DEFAULT '1', + `cur_defense` int(5) unsigned NOT NULL DEFAULT '1', + `cur_strength` int(5) unsigned NOT NULL DEFAULT '1', + `cur_hits` int(5) unsigned NOT NULL DEFAULT '10', + `cur_ranged` int(5) unsigned NOT NULL DEFAULT '1', + `cur_prayer` int(5) unsigned NOT NULL DEFAULT '1', + `cur_magic` int(5) unsigned NOT NULL DEFAULT '1', + `cur_cooking` int(5) unsigned NOT NULL DEFAULT '1', + `cur_woodcut` int(5) unsigned NOT NULL DEFAULT '1', + `cur_fletching` int(5) unsigned NOT NULL DEFAULT '1', + `cur_fishing` int(5) unsigned NOT NULL DEFAULT '1', + `cur_firemaking` int(5) unsigned NOT NULL DEFAULT '1', + `cur_crafting` int(5) unsigned NOT NULL DEFAULT '1', + `cur_smithing` int(5) unsigned NOT NULL DEFAULT '1', + `cur_mining` int(5) unsigned NOT NULL DEFAULT '1', + `cur_herblaw` int(5) unsigned NOT NULL DEFAULT '1', + `cur_agility` int(5) unsigned NOT NULL DEFAULT '1', + `cur_thieving` int(5) unsigned NOT NULL DEFAULT '1', + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=350943 ; + +-- +-- Dumping data for table `pk_curstats` +-- + +INSERT INTO `pk_curstats` (`user`, `cur_attack`, `cur_defense`, `cur_strength`, `cur_hits`, `cur_ranged`, `cur_prayer`, `cur_magic`, `cur_cooking`, `cur_woodcut`, `cur_fletching`, `cur_fishing`, `cur_firemaking`, `cur_crafting`, `cur_smithing`, `cur_mining`, `cur_herblaw`, `cur_agility`, `cur_thieving`, `id`) VALUES +('105157704', 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350908), +('59712851', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350917), +('231514', 99, 99, 99, 99, 99, 78, 99, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350910), +('1286614266', 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350922), +('1421652498', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350923), +('500766777', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350924), +('568285893', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350925), +('500766777', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350926), +('568285893', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350927), +('105157704', 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350928), +('521970', 1, 1, 1, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350929), +('42293815201319', 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350930), +('42293815201319', 1, 1, 1, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350931), +('105157704', 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350932), +('429496599', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350933), +('497015715', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350934), +('37763264', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350935), +('37763265', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350936), +('37763266', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350937), +('37763267', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350938), +('37763268', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350939), +('37763269', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350940), +('37763270', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350941), +('37763271', 1, 1, 1, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 350942); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_experience` +-- + +CREATE TABLE IF NOT EXISTS `pk_experience` ( + `user` varchar(255) NOT NULL, + `exp_attack` int(10) unsigned NOT NULL DEFAULT '0', + `exp_defense` int(10) unsigned NOT NULL DEFAULT '0', + `exp_strength` int(10) unsigned NOT NULL DEFAULT '0', + `exp_hits` int(10) unsigned NOT NULL DEFAULT '1200', + `exp_ranged` int(10) unsigned NOT NULL DEFAULT '0', + `exp_prayer` int(10) unsigned NOT NULL DEFAULT '0', + `exp_magic` int(10) unsigned NOT NULL DEFAULT '0', + `exp_cooking` int(10) unsigned NOT NULL DEFAULT '0', + `exp_woodcut` int(10) unsigned NOT NULL DEFAULT '0', + `exp_fletching` int(10) unsigned NOT NULL DEFAULT '0', + `exp_fishing` int(10) unsigned NOT NULL DEFAULT '0', + `exp_firemaking` int(10) unsigned NOT NULL DEFAULT '0', + `exp_crafting` int(10) unsigned NOT NULL DEFAULT '0', + `exp_smithing` int(10) unsigned NOT NULL DEFAULT '0', + `exp_mining` int(10) unsigned NOT NULL DEFAULT '0', + `exp_herblaw` int(10) unsigned NOT NULL DEFAULT '0', + `exp_agility` int(10) unsigned NOT NULL DEFAULT '0', + `exp_thieving` int(10) unsigned NOT NULL DEFAULT '0', + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `oo_attack` int(11) DEFAULT NULL, + `oo_defense` int(11) DEFAULT NULL, + `oo_strength` int(11) DEFAULT NULL, + `oo_ranged` int(11) DEFAULT NULL, + `oo_prayer` int(11) DEFAULT NULL, + `oo_magic` int(11) DEFAULT NULL, + `oo_cooking` int(11) DEFAULT NULL, + `oo_woodcut` int(11) DEFAULT NULL, + `oo_fletching` int(11) DEFAULT NULL, + `oo_fishing` int(11) DEFAULT NULL, + `oo_firemaking` int(11) DEFAULT NULL, + `oo_crafting` int(11) DEFAULT NULL, + `oo_smithing` int(11) DEFAULT NULL, + `oo_mining` int(11) DEFAULT NULL, + `oo_herblaw` int(11) DEFAULT NULL, + `oo_agility` int(11) DEFAULT NULL, + `oo_thieving` int(11) DEFAULT NULL, + `oo_hits` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=350943 ; + +-- +-- Dumping data for table `pk_experience` +-- + +INSERT INTO `pk_experience` (`user`, `exp_attack`, `exp_defense`, `exp_strength`, `exp_hits`, `exp_ranged`, `exp_prayer`, `exp_magic`, `exp_cooking`, `exp_woodcut`, `exp_fletching`, `exp_fishing`, `exp_firemaking`, `exp_crafting`, `exp_smithing`, `exp_mining`, `exp_herblaw`, `exp_agility`, `exp_thieving`, `id`, `oo_attack`, `oo_defense`, `oo_strength`, `oo_ranged`, `oo_prayer`, `oo_magic`, `oo_cooking`, `oo_woodcut`, `oo_fletching`, `oo_fishing`, `oo_firemaking`, `oo_crafting`, `oo_smithing`, `oo_mining`, `oo_herblaw`, `oo_agility`, `oo_thieving`, `oo_hits`) VALUES +('500766777', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350926, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('105157704', 0, 0, 0, 1200, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350908, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('59712851', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350917, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('231514', 135000000, 135000000, 135000000, 135000000, 135000000, 135000000, 135000000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350910, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('1286614266', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350922, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('1421652498', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350923, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('500766777', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350924, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('568285893', 0, 0, 0, 1200, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350925, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('568285893', 0, 0, 0, 1200, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350927, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('105157704', 0, 0, 0, 1200, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350928, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('521970', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350929, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('42293815201319', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350930, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('42293815201319', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350931, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('105157704', 0, 0, 0, 1200, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350932, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('429496599', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350933, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('497015715', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350934, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763264', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350935, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763265', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350936, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763266', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350937, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763267', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350938, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763268', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350939, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763269', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350940, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763270', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350941, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL), +('37763271', 0, 0, 0, 1200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350942, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_friends` +-- + +CREATE TABLE IF NOT EXISTS `pk_friends` ( + `user` varchar(255) NOT NULL, + `friend` varchar(255) NOT NULL, + KEY `user` (`user`), + KEY `friend` (`friend`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_friends` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_ignores` +-- + +CREATE TABLE IF NOT EXISTS `pk_ignores` ( + `user` varchar(255) NOT NULL, + `ignore` varchar(255) NOT NULL, + KEY `ignore` (`ignore`), + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_ignores` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_invitems` +-- + +CREATE TABLE IF NOT EXISTS `pk_invitems` ( + `user` varchar(255) NOT NULL, + `id` int(10) unsigned NOT NULL, + `amount` int(10) unsigned NOT NULL DEFAULT '1', + `wielded` tinyint(1) unsigned NOT NULL DEFAULT '0', + `slot` int(5) unsigned NOT NULL, + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_invitems` +-- + +INSERT INTO `pk_invitems` (`user`, `id`, `amount`, `wielded`, `slot`) VALUES +('59712851', 70, 1, 0, 5), +('59712851', 4, 1, 0, 4), +('59712851', 1263, 1, 0, 3), +('59712851', 1006, 1, 0, 0), +('59712851', 316, 1, 1, 1), +('59712851', 77, 1, 1, 2), +('1286614266', 156, 1, 0, 7), +('59712851', 376, 1, 0, 6), +('1286614266', 376, 1, 0, 6), +('231514', 31, 6, 0, 25), +('231514', 42, 1, 0, 24), +('231514', 190, 414, 0, 23), +('231514', 60, 1, 1, 22), +('231514', 400, 1, 1, 21), +('231514', 402, 1, 1, 20), +('231514', 401, 1, 0, 19), +('231514', 81, 1, 0, 18), +('231514', 828, 1, 1, 17), +('231514', 1313, 1, 0, 16), +('231514', 1314, 1, 0, 15), +('231514', 1315, 1, 0, 14), +('231514', 1316, 1, 0, 13), +('231514', 1317, 1, 0, 12), +('231514', 1319, 1, 0, 11), +('231514', 1320, 1, 0, 10), +('231514', 1312, 1, 0, 9), +('231514', 1310, 1, 0, 8), +('231514', 1299, 1, 0, 7), +('231514', 1280, 1, 0, 6), +('231514', 1250, 1, 0, 5), +('231514', 1200, 1, 0, 4), +('231514', 16, 1, 1, 3), +('231514', 77, 1, 0, 2), +('231514', 316, 1, 1, 1), +('231514', 1006, 1, 0, 0), +('1286614266', 70, 1, 0, 5), +('1421652498', 1263, 1, 0, 9), +('1421652498', 87, 1, 0, 8), +('1421652498', 156, 1, 0, 7), +('1421652498', 376, 1, 0, 6), +('1421652498', 70, 1, 0, 5), +('1421652498', 4, 1, 0, 4), +('59712851', 156, 1, 0, 7), +('59712851', 87, 1, 0, 8), +('59712851', 1263, 1, 0, 9), +('1286614266', 4, 1, 0, 4), +('1286614266', 1263, 1, 0, 3), +('1286614266', 77, 1, 1, 2), +('1286614266', 1006, 1, 0, 0), +('1286614266', 316, 1, 1, 1), +('1421652498', 1263, 1, 0, 3), +('1421652498', 77, 1, 0, 2), +('1421652498', 316, 1, 0, 1), +('1421652498', 1006, 1, 0, 0), +('1286614266', 87, 1, 0, 8), +('1286614266', 1263, 1, 0, 9), +('521970', 1263, 1, 0, 9), +('521970', 87, 1, 0, 8), +('105157704', 1263, 1, 0, 13), +('521970', 156, 1, 0, 7), +('105157704', 87, 1, 0, 12), +('105157704', 376, 1, 0, 10), +('521970', 376, 1, 0, 6), +('521970', 70, 1, 0, 5), +('521970', 4, 1, 0, 4), +('521970', 77, 1, 1, 2), +('521970', 1263, 1, 0, 3), +('521970', 316, 1, 1, 1), +('521970', 1006, 1, 0, 0), +('500766777', 77, 1, 0, 1), +('500766777', 316, 1, 0, 0), +('568285893', 77, 1, 1, 2), +('568285893', 316, 1, 0, 1), +('568285893', 316, 1, 1, 0), +('521970', 233, 1, 0, 10), +('37763269', 316, 1, 0, 1), +('37763269', 1006, 1, 0, 0), +('37763268', 1263, 1, 0, 3), +('37763268', 77, 1, 0, 2), +('37763268', 316, 1, 0, 1), +('37763268', 1006, 1, 0, 0), +('37763267', 1263, 1, 0, 3), +('37763267', 77, 1, 0, 2), +('37763267', 316, 1, 0, 1), +('37763267', 1006, 1, 0, 0), +('497015715', 1263, 1, 0, 3), +('497015715', 77, 1, 0, 2), +('497015715', 316, 1, 0, 1), +('497015715', 1006, 1, 0, 0), +('37763266', 1263, 1, 0, 3), +('37763266', 77, 1, 0, 2), +('37763266', 316, 1, 0, 1), +('37763266', 1006, 1, 0, 0), +('37763265', 1263, 1, 0, 3), +('37763265', 77, 1, 0, 2), +('37763265', 316, 1, 0, 1), +('37763265', 1006, 1, 0, 0), +('37763264', 1263, 1, 0, 3), +('37763264', 77, 1, 0, 2), +('37763264', 316, 1, 0, 1), +('37763264', 1006, 1, 0, 0), +('105157704', 156, 1, 0, 11), +('105157704', 70, 1, 0, 9), +('105157704', 4, 1, 0, 8), +('105157704', 1263, 1, 0, 7), +('105157704', 1263, 1, 0, 6), +('105157704', 77, 1, 0, 5), +('105157704', 77, 1, 1, 4), +('105157704', 316, 1, 1, 3), +('105157704', 316, 1, 0, 2), +('105157704', 1006, 1, 0, 1), +('105157704', 1006, 1, 0, 0), +('37763269', 77, 1, 0, 2), +('37763269', 1263, 1, 0, 3), +('37763270', 1006, 1, 0, 0), +('37763270', 316, 1, 0, 1), +('37763270', 77, 1, 0, 2), +('37763270', 1263, 1, 0, 3), +('37763271', 1006, 1, 0, 0), +('37763271', 316, 1, 0, 1), +('37763271', 77, 1, 0, 2), +('37763271', 1263, 1, 0, 3); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_kills` +-- + +CREATE TABLE IF NOT EXISTS `pk_kills` ( + `user` varchar(255) NOT NULL, + `type` tinyint(1) NOT NULL DEFAULT '0', + `killed` varchar(45) NOT NULL, + `time` int(10) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_kills` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_logins` +-- + +CREATE TABLE IF NOT EXISTS `pk_logins` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user` varchar(45) NOT NULL, + `time` int(5) unsigned NOT NULL, + `ip` varchar(15) NOT NULL DEFAULT '0.0.0.0', + PRIMARY KEY (`id`), + KEY `ip` (`ip`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=4254376 ; + +-- +-- Dumping data for table `pk_logins` +-- + +INSERT INTO `pk_logins` (`id`, `user`, `time`, `ip`) VALUES +(4254356, '42293815201319', 1287447911, '127.0.0.1'), +(4254355, '42293815201319', 1287447465, '127.0.0.1'), +(4254354, '521970', 1287446648, '127.0.0.1'), +(4254353, '500766777', 1287446338, '127.0.0.1'), +(4254352, '500766777', 1287445987, '127.0.0.1'), +(4254351, '568285893', 1287445883, '127.0.0.1'), +(4254350, '568285893', 1287445743, '127.0.0.1'), +(4254349, '568285893', 1287445535, '127.0.0.1'), +(4254348, '568285893', 1287445503, '127.0.0.1'), +(4254347, '500766777', 1287445443, '127.0.0.1'), +(4254346, '568285893', 1287444890, '127.0.0.1'), +(4254345, '568285893', 1287441310, '127.0.0.1'), +(4254344, '500766777', 1287441301, '127.0.0.1'), +(4254233, '105157704', 1281662336, '127.0.0.1'), +(4254234, '105157704', 1281662511, '127.0.0.1'), +(4254343, '500766777', 1287441293, '127.0.0.1'), +(4254342, '500766777', 1287441108, '127.0.0.1'), +(4254340, '500766777', 1287441053, '127.0.0.1'), +(4254339, '500766777', 1287441038, '127.0.0.1'), +(4254338, '1286614266', 1287125707, '127.0.0.1'), +(4254241, '105157704', 1281739696, '127.0.0.1'), +(4254337, '1421652498', 1287125695, '127.0.0.1'), +(4254323, '59712851', 1287037576, '127.0.0.1'), +(4254244, '105157704', 1281740520, '127.0.0.1'), +(4254245, '105157704', 1281740583, '127.0.0.1'), +(4254246, '105157704', 1281743157, '127.0.0.1'), +(4254247, '105157704', 1281743738, '127.0.0.1'), +(4254248, '105157704', 1281744127, '127.0.0.1'), +(4254322, '59712851', 1287037523, '127.0.0.1'), +(4254250, '105157704', 1281753461, '127.0.0.1'), +(4254251, '105157704', 1281754704, '127.0.0.1'), +(4254252, '105157704', 1281759336, '127.0.0.1'), +(4254253, '105157704', 1281759553, '127.0.0.1'), +(4254254, '105157704', 1281760744, '127.0.0.1'), +(4254255, '105157704', 1281760871, '127.0.0.1'), +(4254256, '105157704', 1281761406, '127.0.0.1'), +(4254257, '105157704', 1281762136, '127.0.0.1'), +(4254258, '105157704', 1281762423, '127.0.0.1'), +(4254341, '500766777', 1287441068, '127.0.0.1'), +(4254260, '231514', 1286350050, '127.0.0.1'), +(4254261, '231514', 1286435056, '127.0.0.1'), +(4254262, '231514', 1286435308, '127.0.0.1'), +(4254263, '231514', 1286435408, '127.0.0.1'), +(4254264, '231514', 1286435473, '127.0.0.1'), +(4254265, '231514', 1286436753, '127.0.0.1'), +(4254266, '231514', 1286436991, '127.0.0.1'), +(4254267, '231514', 1286437238, '127.0.0.1'), +(4254268, '231514', 1286437254, '127.0.0.1'), +(4254269, '231514', 1286437536, '127.0.0.1'), +(4254270, '231514', 1286438257, '127.0.0.1'), +(4254271, '231514', 1286438763, '127.0.0.1'), +(4254272, '231514', 1286439108, '127.0.0.1'), +(4254273, '231514', 1286439379, '127.0.0.1'), +(4254274, '231514', 1286439501, '127.0.0.1'), +(4254275, '231514', 1286439561, '127.0.0.1'), +(4254276, '231514', 1286439618, '127.0.0.1'), +(4254277, '231514', 1286488134, '127.0.0.1'), +(4254278, '231514', 1286488616, '127.0.0.1'), +(4254279, '231514', 1286522176, '127.0.0.1'), +(4254280, '231514', 1286522684, '127.0.0.1'), +(4254281, '231514', 1286523279, '127.0.0.1'), +(4254282, '231514', 1286524053, '127.0.0.1'), +(4254283, '231514', 1286524518, '127.0.0.1'), +(4254284, '231514', 1286780517, '127.0.0.1'), +(4254285, '231514', 1286780555, '127.0.0.1'), +(4254286, '231514', 1286781216, '127.0.0.1'), +(4254287, '231514', 1286820475, '127.0.0.1'), +(4254288, '231514', 1286821247, '127.0.0.1'), +(4254289, '231514', 1286823183, '127.0.0.1'), +(4254290, '231514', 1286830609, '127.0.0.1'), +(4254291, '231514', 1286831465, '127.0.0.1'), +(4254292, '231514', 1286844955, '127.0.0.1'), +(4254293, '231514', 1286846802, '127.0.0.1'), +(4254294, '231514', 1286849133, '127.0.0.1'), +(4254295, '231514', 1286851625, '127.0.0.1'), +(4254296, '231514', 1286852351, '127.0.0.1'), +(4254297, '231514', 1286854781, '127.0.0.1'), +(4254298, '231514', 1286856008, '127.0.0.1'), +(4254299, '231514', 1286856367, '127.0.0.1'), +(4254300, '231514', 1286903269, '127.0.0.1'), +(4254301, '231514', 1286903505, '127.0.0.1'), +(4254302, '231514', 1286903854, '127.0.0.1'), +(4254303, '231514', 1286904045, '127.0.0.1'), +(4254304, '231514', 1286904550, '127.0.0.1'), +(4254305, '231514', 1286905019, '127.0.0.1'), +(4254306, '231514', 1286905613, '127.0.0.1'), +(4254307, '231514', 1286905839, '127.0.0.1'), +(4254308, '231514', 1286912978, '127.0.0.1'), +(4254309, '231514', 1286913900, '127.0.0.1'), +(4254310, '231514', 1286934357, '127.0.0.1'), +(4254311, '231514', 1287022663, '127.0.0.1'), +(4254336, '1421652498', 1287125688, '127.0.0.1'), +(4254335, '1421652498', 1287125677, '127.0.0.1'), +(4254331, '1421652498', 1287125644, '127.0.0.1'), +(4254332, '1421652498', 1287125659, '127.0.0.1'), +(4254333, '1421652498', 1287125665, '127.0.0.1'), +(4254334, '1421652498', 1287125672, '127.0.0.1'), +(4254321, '231514', 1287037264, '127.0.0.1'), +(4254357, '42293815201319', 1287450195, '127.0.0.1'), +(4254358, '42293815201319', 1287450615, '127.0.0.1'), +(4254359, '42293815201319', 1287450712, '127.0.0.1'), +(4254360, '105157704', 1287450793, '127.0.0.1'), +(4254361, '105157704', 1287450883, '127.0.0.1'), +(4254362, '105157704', 1287450891, '127.0.0.1'), +(4254363, '105157704', 1287451143, '127.0.0.1'), +(4254364, '105157704', 1287452885, '127.0.0.1'), +(4254365, '105157704', 1287453742, '127.0.0.1'), +(4254366, '105157704', 1287454415, '127.0.0.1'), +(4254367, '42293815201319', 1287454430, '127.0.0.1'), +(4254368, '42293815201319', 1287454553, '127.0.0.1'), +(4254369, '42293815201319', 1287462434, '127.0.0.1'), +(4254370, '42293815201319', 1287466598, '127.0.0.1'), +(4254371, '42293815201319', 1287467029, '127.0.0.1'), +(4254372, '42293815201319', 1287470365, '127.0.0.1'), +(4254373, '429496599', 1287525081, '127.0.0.1'), +(4254374, '429496599', 1287525445, '127.0.0.1'), +(4254375, '42293815201319', 1287525773, '127.0.0.1'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_market` +-- + +CREATE TABLE IF NOT EXISTS `pk_market` ( + `owner` int(10) NOT NULL, + `item_id` int(10) NOT NULL, + `amount` int(10) NOT NULL, + `selling_price` int(10) NOT NULL, + PRIMARY KEY (`owner`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_market` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_mutelog` +-- + +CREATE TABLE IF NOT EXISTS `pk_mutelog` ( + `user` varchar(255) NOT NULL, + `staff` varchar(255) NOT NULL, + `time` int(11) NOT NULL, + `report_id` int(11) NOT NULL, + `duration` int(10) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_mutelog` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_online` +-- + +CREATE TABLE IF NOT EXISTS `pk_online` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user` varchar(45) NOT NULL, + `username` varchar(45) NOT NULL, + `x` varchar(45) NOT NULL, + `y` varchar(45) NOT NULL, + `world` int(10) unsigned NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC COMMENT='InnoDB free: 9216 kB' AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `pk_online` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_players` +-- + +CREATE TABLE IF NOT EXISTS `pk_players` ( + `user` varchar(255) NOT NULL, + `username` varchar(255) NOT NULL DEFAULT '', + `pending_deletion` int(11) DEFAULT '0', + `group_id` int(10) DEFAULT '0', + `owner` int(5) unsigned NOT NULL, + `owner_username` varchar(255) DEFAULT NULL, + `sub_expires` int(5) unsigned DEFAULT '0', + `combat` int(10) DEFAULT '3', + `skill_total` int(10) DEFAULT '3', + `x` int(5) unsigned DEFAULT '213', + `y` int(5) unsigned DEFAULT '452', + `fatigue` int(10) DEFAULT '0', + `combatstyle` tinyint(1) DEFAULT '0', + `block_chat` tinyint(1) unsigned DEFAULT '0', + `block_private` tinyint(1) unsigned DEFAULT '0', + `block_trade` tinyint(1) unsigned DEFAULT '0', + `block_duel` tinyint(1) unsigned DEFAULT '0', + `cameraauto` tinyint(1) unsigned DEFAULT '0', + `onemouse` tinyint(1) unsigned DEFAULT '0', + `soundoff` tinyint(1) unsigned DEFAULT '0', + `showroof` tinyint(1) DEFAULT '0', + `autoscreenshot` tinyint(1) DEFAULT '0', + `combatwindow` tinyint(1) DEFAULT '0', + `haircolour` int(5) unsigned DEFAULT '2', + `topcolour` int(5) unsigned DEFAULT '8', + `trousercolour` int(5) unsigned DEFAULT '14', + `skincolour` int(5) unsigned DEFAULT '0', + `headsprite` int(5) unsigned DEFAULT '1', + `bodysprite` int(5) unsigned DEFAULT '2', + `male` tinyint(1) unsigned DEFAULT '1', + `skulled` int(10) unsigned DEFAULT '0', + `pass` varchar(255) NOT NULL, + `creation_date` int(10) unsigned NOT NULL DEFAULT '0', + `creation_ip` varchar(15) NOT NULL DEFAULT '0.0.0.0', + `login_date` int(10) unsigned DEFAULT '0', + `login_ip` varchar(15) DEFAULT '0.0.0.0', + `playermod` tinyint(1) unsigned DEFAULT '0', + `loggedin` tinyint(1) DEFAULT '0', + `banned` tinyint(1) DEFAULT '0', + `muted` int(10) DEFAULT '0', + `deaths` int(10) DEFAULT '0', + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `online` tinyint(1) unsigned zerofill DEFAULT '0', + `world` int(10) DEFAULT '1', + `quest_points` int(5) DEFAULT NULL, + `eventcd` int(10) unsigned DEFAULT '0', + PRIMARY KEY (`id`), + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 9216 kB' AUTO_INCREMENT=350944 ; + +-- +-- Dumping data for table `pk_players` +-- + +INSERT INTO `pk_players` (`user`, `username`, `pending_deletion`, `group_id`, `owner`, `owner_username`, `sub_expires`, `combat`, `skill_total`, `x`, `y`, `fatigue`, `combatstyle`, `block_chat`, `block_private`, `block_trade`, `block_duel`, `cameraauto`, `onemouse`, `soundoff`, `showroof`, `autoscreenshot`, `combatwindow`, `haircolour`, `topcolour`, `trousercolour`, `skincolour`, `headsprite`, `bodysprite`, `male`, `skulled`, `pass`, `creation_date`, `creation_ip`, `login_date`, `login_ip`, `playermod`, `loggedin`, `banned`, `muted`, `deaths`, `id`, `online`, `world`, `quest_points`, `eventcd`) VALUES +('37763271', 'test8', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651756, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350943, 0, 1, NULL, 0), +('37763270', 'test7', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651734, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350942, 0, 1, NULL, 0), +('37763269', 'test6', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651720, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350941, 0, 1, NULL, 0), +('37763267', 'test4', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651686, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350939, 0, 1, NULL, 0), +('37763268', 'test5', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651699, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350940, 0, 1, NULL, 0), +('37763264', 'test1', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651635, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350936, 0, 1, NULL, 0), +('37763265', 'test2', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651646, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350937, 0, 1, NULL, 0), +('37763266', 'test3', 0, 0, 3, NULL, 0, 3, 3, 213, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8, 14, 0, 1, 2, 1, 0, 'f5d1278e8109edd94e1e4197e04873b9', 1287651663, '127.0.0.1', 0, '0.0.0.0', 0, 0, 0, 0, 0, 350938, 0, 1, NULL, 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_quests` +-- + +CREATE TABLE IF NOT EXISTS `pk_quests` ( + `id` int(11) DEFAULT NULL, + `stage` int(11) DEFAULT NULL, + `user` varchar(255) DEFAULT NULL, + KEY `user` (`user`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_quests` +-- + +INSERT INTO `pk_quests` (`id`, `stage`, `user`) VALUES +(10, -1, '231514'), +(10, -1, '2094917'), +(9, -1, '2094917'), +(8, -1, '2094917'), +(7, -1, '2094917'), +(3, -1, '2094917'), +(1, -1, '2094917'), +(0, -1, '2094917'), +(9, -1, '221303401880'), +(8, -1, '221303401880'), +(7, -1, '221303401880'), +(3, -1, '221303401880'), +(1, -1, '221303401880'), +(0, 0, '221303401880'), +(10, -1, '105157704'), +(9, -1, '105157704'), +(8, -1, '105157704'), +(7, -1, '105157704'), +(3, -1, '105157704'), +(10, -1, '221303401880'), +(1, -1, '105157704'), +(0, -1, '105157704'), +(9, -1, '231514'), +(8, -1, '231514'), +(7, -1, '231514'), +(3, -1, '231514'), +(1, -1, '231514'), +(0, -1, '231514'), +(0, -1, '1070928201'), +(1, -1, '1070928201'), +(3, -1, '1070928201'), +(7, -1, '1070928201'), +(8, -1, '1070928201'), +(9, -1, '1070928201'), +(10, -1, '1070928201'), +(0, -1, '59712851'), +(1, -1, '59712851'), +(3, -1, '59712851'), +(7, -1, '59712851'), +(8, -1, '59712851'), +(9, -1, '59712851'), +(10, -1, '59712851'), +(10, -1, '1434781215'), +(9, -1, '1434781215'), +(8, -1, '1434781215'), +(7, -1, '1434781215'), +(3, -1, '1434781215'), +(1, -1, '1434781215'), +(0, -1, '1434781215'), +(0, -1, '380732793'), +(1, -1, '380732793'), +(3, -1, '380732793'), +(7, -1, '380732793'), +(8, -1, '380732793'), +(9, -1, '380732793'), +(10, -1, '380732793'), +(0, -1, '1772376795'), +(1, -1, '1772376795'), +(3, -1, '1772376795'), +(7, -1, '1772376795'), +(8, -1, '1772376795'), +(9, -1, '1772376795'), +(10, -1, '1772376795'), +(0, -1, '1286614266'), +(10, -1, '1421652498'), +(9, -1, '1421652498'), +(8, -1, '1421652498'), +(7, -1, '1421652498'), +(3, -1, '1421652498'), +(1, -1, '1421652498'), +(0, -1, '1421652498'), +(1, -1, '1286614266'), +(3, -1, '1286614266'), +(7, -1, '1286614266'), +(8, -1, '1286614266'), +(9, -1, '1286614266'), +(10, -1, '1286614266'), +(0, -1, '521970'), +(10, -1, '500766777'), +(9, -1, '500766777'), +(8, -1, '500766777'), +(7, -1, '500766777'), +(3, -1, '500766777'), +(1, -1, '500766777'), +(0, -1, '500766777'), +(10, -1, '568285893'), +(9, -1, '568285893'), +(8, -1, '568285893'), +(7, -1, '568285893'), +(3, -1, '568285893'), +(1, -1, '568285893'), +(0, -1, '568285893'), +(1, -1, '521970'), +(3, -1, '521970'), +(7, -1, '521970'), +(8, -1, '521970'), +(9, -1, '521970'), +(10, -1, '521970'), +(10, -1, '42293815201319'), +(9, -1, '42293815201319'), +(8, -1, '42293815201319'), +(7, -1, '42293815201319'), +(3, -1, '42293815201319'), +(1, -1, '42293815201319'), +(0, -1, '42293815201319'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_reports` +-- + +CREATE TABLE IF NOT EXISTS `pk_reports` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `from` varchar(255) NOT NULL, + `about` varchar(255) NOT NULL, + `time` int(10) unsigned NOT NULL, + `reason` int(5) unsigned NOT NULL, + `snapshot_from` longtext NOT NULL, + `snapshot_about` longtext NOT NULL, + `chatlogs` longtext NOT NULL, + `from_x` int(10) NOT NULL, + `from_y` int(10) NOT NULL, + `about_x` int(10) NOT NULL, + `about_y` int(10) NOT NULL, + `zapped` int(10) unsigned DEFAULT NULL, + `zapped_by` varchar(255) DEFAULT NULL, + `sendToMod` int(11) DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4336 ; + +-- +-- Dumping data for table `pk_reports` +-- + +INSERT INTO `pk_reports` (`id`, `from`, `about`, `time`, `reason`, `snapshot_from`, `snapshot_about`, `chatlogs`, `from_x`, `from_y`, `about_x`, `about_y`, `zapped`, `zapped_by`, `sendToMod`) VALUES +(4335, '2094917', '26052', 1281515445, 1, '', '', '', 215, 505, 0, 0, NULL, NULL, 0); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_reports_comments` +-- + +CREATE TABLE IF NOT EXISTS `pk_reports_comments` ( + `id` int(10) NOT NULL AUTO_INCREMENT, + `report_id` int(10) NOT NULL, + `poster` int(10) NOT NULL, + `time` int(10) NOT NULL, + `text` text NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4222 ; + +-- +-- Dumping data for table `pk_reports_comments` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_stat_reduction` +-- + +CREATE TABLE IF NOT EXISTS `pk_stat_reduction` ( + `user` int(10) NOT NULL, + `account` varchar(255) NOT NULL, + `account_hash` varchar(255) NOT NULL, + `skill` int(10) NOT NULL, + `voucher` varchar(255) DEFAULT NULL, + `time` int(11) NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_stat_reduction` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_tradelog` +-- + +CREATE TABLE IF NOT EXISTS `pk_tradelog` ( + `from` varchar(255) DEFAULT NULL, + `to` varchar(255) DEFAULT NULL, + `time` int(10) DEFAULT NULL, + `id` int(10) DEFAULT NULL, + `x` int(10) DEFAULT NULL, + `y` int(10) DEFAULT NULL, + `amount` int(10) DEFAULT NULL, + `type` int(5) DEFAULT NULL, + KEY `trade_from` (`from`), + KEY `trade_to` (`to`), + KEY `tradelog_time` (`time`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `pk_tradelog` +-- + +INSERT INTO `pk_tradelog` (`from`, `to`, `time`, `id`, `x`, `y`, `amount`, `type`) VALUES +('0', '42293815201319', 1287525847, 577, 216, 442, 1, 3); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `pk_worlds` +-- + +CREATE TABLE IF NOT EXISTS `pk_worlds` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `location` varchar(45) NOT NULL, + `ip` varchar(45) NOT NULL, + `port` varchar(45) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `pk_worlds` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `posts` +-- + +CREATE TABLE IF NOT EXISTS `posts` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `poster` varchar(200) NOT NULL DEFAULT '', + `poster_id` int(10) unsigned NOT NULL DEFAULT '1', + `poster_ip` varchar(39) DEFAULT NULL, + `poster_email` varchar(80) DEFAULT NULL, + `message` text, + `hide_smilies` tinyint(1) NOT NULL DEFAULT '0', + `posted` int(10) unsigned NOT NULL DEFAULT '0', + `edited` int(10) unsigned DEFAULT NULL, + `edited_by` varchar(200) DEFAULT NULL, + `topic_id` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `posts_topic_id_idx` (`topic_id`), + KEY `posts_multi_idx` (`poster_id`,`topic_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `posts` +-- + +INSERT INTO `posts` (`id`, `poster`, `poster_id`, `poster_ip`, `poster_email`, `message`, `hide_smilies`, `posted`, `edited`, `edited_by`, `topic_id`) VALUES +(1, 'admin', 2, '127.0.0.1', NULL, 'If you are looking at this (which I guess you are), the install of FluxBB appears to have worked! Now log in and head over to the administration control panel to configure your forum.', 0, 1281311594, NULL, NULL, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `ranks` +-- + +CREATE TABLE IF NOT EXISTS `ranks` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `rank` varchar(50) NOT NULL DEFAULT '', + `min_posts` mediumint(8) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; + +-- +-- Dumping data for table `ranks` +-- + +INSERT INTO `ranks` (`id`, `rank`, `min_posts`) VALUES +(1, 'New member', 0), +(2, 'Member', 10); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `reports` +-- + +CREATE TABLE IF NOT EXISTS `reports` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `post_id` int(10) unsigned NOT NULL DEFAULT '0', + `topic_id` int(10) unsigned NOT NULL DEFAULT '0', + `forum_id` int(10) unsigned NOT NULL DEFAULT '0', + `reported_by` int(10) unsigned NOT NULL DEFAULT '0', + `created` int(10) unsigned NOT NULL DEFAULT '0', + `message` text, + `zapped` int(10) unsigned DEFAULT NULL, + `zapped_by` int(10) unsigned DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `reports_zapped_idx` (`zapped`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- +-- Dumping data for table `reports` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `reputation` +-- + +CREATE TABLE IF NOT EXISTS `reputation` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(10) unsigned NOT NULL DEFAULT '0', + `from_user_id` int(10) unsigned NOT NULL DEFAULT '0', + `time` int(10) unsigned NOT NULL DEFAULT '0', + `post_id` int(10) unsigned NOT NULL DEFAULT '0', + `reason` text NOT NULL, + `rep_plus` tinyint(1) unsigned NOT NULL DEFAULT '0', + `rep_minus` tinyint(1) unsigned NOT NULL DEFAULT '0', + `topics_id` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `rep_post_id_idx` (`post_id`), + KEY `rep_multi_user_id_idx` (`topics_id`,`from_user_id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15940 ; + +-- +-- Dumping data for table `reputation` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `search_cache` +-- + +CREATE TABLE IF NOT EXISTS `search_cache` ( + `id` int(10) unsigned NOT NULL DEFAULT '0', + `ident` varchar(200) NOT NULL DEFAULT '', + `search_data` mediumtext, + PRIMARY KEY (`id`), + KEY `search_cache_ident_idx` (`ident`(8)) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `search_cache` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `search_matches` +-- + +CREATE TABLE IF NOT EXISTS `search_matches` ( + `post_id` int(10) unsigned NOT NULL DEFAULT '0', + `word_id` int(10) unsigned NOT NULL DEFAULT '0', + `subject_match` tinyint(1) NOT NULL DEFAULT '0', + KEY `search_matches_word_id_idx` (`word_id`), + KEY `search_matches_post_id_idx` (`post_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `search_matches` +-- + +INSERT INTO `search_matches` (`post_id`, `word_id`, `subject_match`) VALUES +(1, 1, 0), +(1, 2, 0), +(1, 3, 0), +(1, 4, 0), +(1, 5, 0), +(1, 6, 0), +(1, 7, 0), +(1, 8, 0), +(1, 9, 0), +(1, 10, 0), +(1, 11, 0), +(1, 12, 0), +(1, 13, 0), +(1, 15, 1), +(1, 14, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `search_words` +-- + +CREATE TABLE IF NOT EXISTS `search_words` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `word` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '', + PRIMARY KEY (`word`), + KEY `search_words_id_idx` (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ; + +-- +-- Dumping data for table `search_words` +-- + +INSERT INTO `search_words` (`id`, `word`) VALUES +(1, 'looking'), +(2, 'guess'), +(3, 'install'), +(4, 'fluxbb'), +(5, 'appears'), +(6, 'worked'), +(7, 'log'), +(8, 'head'), +(9, 'administration'), +(10, 'control'), +(11, 'panel'), +(12, 'configure'), +(13, 'forum'), +(14, 'test'), +(15, 'post'); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `stats` +-- + +CREATE TABLE IF NOT EXISTS `stats` ( + `date` int(10) unsigned NOT NULL DEFAULT '0', + `posts` varchar(255) NOT NULL DEFAULT '', + `users` varchar(255) NOT NULL DEFAULT '', + `players` varchar(255) NOT NULL DEFAULT '', + `active_users` varchar(255) NOT NULL DEFAULT '', + `active_players` varchar(255) NOT NULL DEFAULT '', + `topics` varchar(255) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `stats` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `stats_2` +-- + +CREATE TABLE IF NOT EXISTS `stats_2` ( + `logins` int(5) DEFAULT NULL, + `unique_logins` int(5) DEFAULT NULL, + `updated` int(11) DEFAULT NULL, + `hits` int(5) DEFAULT NULL, + `unique_hits` int(5) DEFAULT NULL, + `alexa_rank` int(5) DEFAULT NULL, + `kills` int(5) DEFAULT NULL, + `total_kills` int(5) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `stats_2` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `subs` +-- + +CREATE TABLE IF NOT EXISTS `subs` ( + `user_id` int(10) DEFAULT NULL, + `months` int(10) DEFAULT NULL, + `google_no` varchar(255) DEFAULT NULL, + `redeem` int(10) DEFAULT NULL, + `status` int(5) DEFAULT NULL, + `order_time` int(10) DEFAULT NULL, + `last_time` int(10) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +-- +-- Dumping data for table `subs` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `subscriptions` +-- + +CREATE TABLE IF NOT EXISTS `subscriptions` ( + `user_id` int(10) unsigned NOT NULL DEFAULT '0', + `topic_id` int(10) unsigned NOT NULL DEFAULT '0', + `forum_id` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`user_id`,`topic_id`,`forum_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- +-- Dumping data for table `subscriptions` +-- + + +-- -------------------------------------------------------- + +-- +-- Table structure for table `topics` +-- + +CREATE TABLE IF NOT EXISTS `topics` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `poster` varchar(200) NOT NULL DEFAULT '', + `subject` varchar(255) NOT NULL DEFAULT '', + `posted` int(10) unsigned NOT NULL DEFAULT '0', + `first_post_id` int(10) unsigned NOT NULL DEFAULT '0', + `last_post` int(10) unsigned NOT NULL DEFAULT '0', + `last_post_id` int(10) unsigned NOT NULL DEFAULT '0', + `last_poster` varchar(200) DEFAULT NULL, + `num_views` mediumint(8) unsigned NOT NULL DEFAULT '0', + `num_replies` mediumint(8) unsigned NOT NULL DEFAULT '0', + `closed` tinyint(1) NOT NULL DEFAULT '0', + `sticky` tinyint(1) NOT NULL DEFAULT '0', + `moved_to` int(10) unsigned DEFAULT NULL, + `forum_id` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `topics_forum_id_idx` (`forum_id`), + KEY `topics_moved_to_idx` (`moved_to`), + KEY `topics_last_post_idx` (`last_post`), + KEY `topics_first_post_id_idx` (`first_post_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; + +-- +-- Dumping data for table `topics` +-- + +INSERT INTO `topics` (`id`, `poster`, `subject`, `posted`, `first_post_id`, `last_post`, `last_post_id`, `last_poster`, `num_views`, `num_replies`, `closed`, `sticky`, `moved_to`, `forum_id`) VALUES +(1, 'admin', 'Test post', 1281311594, 1, 1281311594, 1, 'admin', 0, 0, 0, 0, NULL, 1); + +-- -------------------------------------------------------- + +-- +-- Table structure for table `users` +-- + +CREATE TABLE IF NOT EXISTS `users` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `group_id` int(10) unsigned NOT NULL DEFAULT '3', + `username` varchar(200) NOT NULL DEFAULT '', + `password` varchar(40) NOT NULL DEFAULT '', + `email` varchar(80) NOT NULL DEFAULT '', + `title` varchar(50) DEFAULT NULL, + `realname` varchar(40) DEFAULT NULL, + `url` varchar(100) DEFAULT NULL, + `jabber` varchar(80) DEFAULT NULL, + `icq` varchar(12) DEFAULT NULL, + `msn` varchar(80) DEFAULT NULL, + `aim` varchar(30) DEFAULT NULL, + `yahoo` varchar(30) DEFAULT NULL, + `location` varchar(30) DEFAULT NULL, + `signature` text, + `disp_topics` tinyint(3) unsigned DEFAULT NULL, + `disp_posts` tinyint(3) unsigned DEFAULT NULL, + `email_setting` tinyint(1) NOT NULL DEFAULT '1', + `notify_with_post` tinyint(1) NOT NULL DEFAULT '0', + `auto_notify` tinyint(1) NOT NULL DEFAULT '0', + `show_smilies` tinyint(1) NOT NULL DEFAULT '1', + `show_img` tinyint(1) NOT NULL DEFAULT '1', + `show_img_sig` tinyint(1) NOT NULL DEFAULT '1', + `show_avatars` tinyint(1) NOT NULL DEFAULT '1', + `show_sig` tinyint(1) NOT NULL DEFAULT '1', + `timezone` float NOT NULL DEFAULT '0', + `dst` tinyint(1) NOT NULL DEFAULT '0', + `time_format` tinyint(1) NOT NULL DEFAULT '0', + `date_format` tinyint(1) NOT NULL DEFAULT '0', + `language` varchar(25) NOT NULL DEFAULT 'English', + `style` varchar(25) NOT NULL DEFAULT 'Air', + `num_posts` int(10) unsigned NOT NULL DEFAULT '0', + `last_post` int(10) unsigned DEFAULT NULL, + `last_search` int(10) unsigned DEFAULT NULL, + `last_email_sent` int(10) unsigned DEFAULT NULL, + `registered` int(10) unsigned NOT NULL DEFAULT '0', + `registration_ip` varchar(39) NOT NULL DEFAULT '0.0.0.0', + `last_visit` int(10) unsigned NOT NULL DEFAULT '0', + `admin_note` varchar(30) DEFAULT NULL, + `activate_string` varchar(80) DEFAULT NULL, + `activate_key` varchar(8) DEFAULT NULL, + `sub_expires` int(10) unsigned DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `users_username_idx` (`username`(25)), + KEY `users_registered_idx` (`registered`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; + +-- +-- Dumping data for table `users` +-- + +INSERT INTO `users` (`id`, `group_id`, `username`, `password`, `email`, `title`, `realname`, `url`, `jabber`, `icq`, `msn`, `aim`, `yahoo`, `location`, `signature`, `disp_topics`, `disp_posts`, `email_setting`, `notify_with_post`, `auto_notify`, `show_smilies`, `show_img`, `show_img_sig`, `show_avatars`, `show_sig`, `timezone`, `dst`, `time_format`, `date_format`, `language`, `style`, `num_posts`, `last_post`, `last_search`, `last_email_sent`, `registered`, `registration_ip`, `last_visit`, `admin_note`, `activate_string`, `activate_key`, `sub_expires`) VALUES +(1, 3, 'Guest', 'Guest', 'Guest', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 'English', 'Air', 0, NULL, NULL, NULL, 0, '0.0.0.0', 0, NULL, NULL, NULL, 0), +(3, 4, 'admin', 'd033e22ae348aeb5660fc2140aec35850c4da997', 'crazyonedude@hotmail.com', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 'English', 'Air', 0, NULL, NULL, NULL, 1281384799, '127.0.0.1', 1287450782, NULL, NULL, NULL, 0); diff --git a/GameServer/ant/INSTALL b/GameServer/ant/INSTALL new file mode 100644 index 0000000..83c1167 --- /dev/null +++ b/GameServer/ant/INSTALL @@ -0,0 +1,2 @@ +For installation instructions see the manual in the docs subdirectory +or online at . diff --git a/GameServer/ant/KEYS b/GameServer/ant/KEYS new file mode 100644 index 0000000..b4d3bd2 --- /dev/null +++ b/GameServer/ant/KEYS @@ -0,0 +1,782 @@ +This file contains the PGP keys of various developers. + +Users: pgp < KEYS + gpg --import KEYS +Developers: + pgp -kxa and append it to this file. + (pgpk -ll && pgpk -xa ) >> this file. + (gpg --list-sigs + && gpg --armor --export ) >> this file. + +Type Bits/KeyID Date User ID +pub 1024/FEECAAED 1998/11/11 Stefan Bodewig + Stefan Bodewig + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: 2.6.3i + +mQCNAzZJoiMAAAEEAMzhUxTOC20Nprp6K4nLTiARt+EXii/dovNWWcfzZcYXi/lX +r3zpUTTZxlKQpd4RaHjFmGgoOraZE4jCRFARVcFJgYmGUKpcWJZO7YKL36WUizTM ++dyB2ycOtzlty1W5VmRL3FGqo67pKA9F/QHg3NSu9hY1W9xPPK7Kq3f+7KrtAAUR +tCBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPokAlQIFEDZSrGXHcgyK +jiW9zQEBshEEAMlG4qVjKp4/agdJG56M6izx9oaKecFLXHQJrFUy3w2PvZHFYtXc +osXKorX6bPrE8uB57MxbY2WapKeVRodlG0+j39vAf501duK8q2rktfWt9Cl4JjJ4 +DbWhSWfV1ci62u2gCxwYQe22F9Wh+vhOR5NK9RTbSKhupdlFsnrk/i7xiQCVAwUQ +NkmiI67Kq3f+7KrtAQGdxQQAlcFOzSv7G6M4uGbgvw7IGgrhx7rawtIyv9hLXgVC +7ua9xaZV8G0Fl9gh8RnbdcZ4R/aT+KIiAFaslfZ3t6hlC4MTbnAJqvdS/NO98ZkJ +YvnzZSKHflAbd5gyE7IVxBC9/xRlF/Wls5sYNwb6RjoRCaOjxN/y3WCLa3Va101v +zNy0I1N0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+iQCVAwUQOxIo +BK7Kq3f+7KrtAQGn6gP/SBACdHakA4H//otpyESSrk4PmyOaYF0Kyok43Gee2mT+ +m9+jZ3jLcC0oav6iH+otL/lhk9t/JDM8LjD2kAkdWWoIvvuPyCx97gOzojIo0Ve2 +1wuxJTF/VIjwyOtE8FzE7p4tkc6EubVpeZkV9Pq9HFRBCUcyKJDLnF4tbstScLU= +=OBLe +-----END PGP PUBLIC KEY BLOCK----- + + +pub 1024D/51898504 2001-05-29 Conor MacNeill +sig 3 51898504 2001-05-29 Conor MacNeill +sig 5F6B8B72 2002-01-11 Stefan Bodewig +uid Conor MacNeill +sig 3 51898504 2001-05-29 Conor MacNeill +sig 5F6B8B72 2002-01-11 Stefan Bodewig +sub 1024g/D1ECBA5D 2001-05-29 +sig 51898504 2001-05-29 Conor MacNeill + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBDsTqygRBACiZckNdclTlQFonLaIKBFGhMy0KKByw0x8XA4iwdbCXuF6xNIc +HIFHajJ74AHchQ4d8xtomBy6b8yvFgWVeaZensvn69BlLeqGdyeJRzfPt6TgRnzZ +2eWhb0HXdG3JwxL/2BabDhHfs4YJOrgB/vhRFQku6oCMRiBPtJj2werD6wCg0/zp +jacYTw6+CR+sVvneCNyySFED/R3j10c4RnR8djgv1jKT8CKPuHYraupI9INEe+I6 +7qWjtJ02GzvMO6TElAtUsf4aysu45GgwkwEBnuG6mYb3Pq0V2c5tJc2A3Tj3DrdR +i3HUNwurbus76I0sPyyENPu12QPeC6mvWLEsxVJ9o0hRKFayGvYUmrwWK9UFLjvp +p9cXBACDHgLn7MAVLqUdYhRrUj/M+GOUpvBikEgoJJrEUmb5X4+++dffMh5HBIO4 +5LA11qEKuM2xnKqOilP7NLYXz1Fe0ocqv0jsHB4SprFTTai7ma31uwuRQvCQXVv1 +yJ5CLqYda64h/UA2kmmR2dfopmvDogYEMz/HU5voozxe7BEI7bQhQ29ub3IgTWFj +TmVpbGwgPGNvbm9yQGFwYWNoZS5vcmc+iFcEExECABcFAjsTqygFCwcKAwQDFQMC +AxYCAQIXgAAKCRCBBGRPUYmFBDgIAKCZztXqKhK6kXOnoGy7opCNmWU0lwCgsPDa +4m+ruW3ch0rfbqtR75S52R+IRgQQEQIABgUCPD6eTgAKCRCiEVrhX2uLcqCcAKCr +1Wylqju9YjBi5Twej9ze69JFBQCeOaMgo6yjnkcV3PnVInLlaMwPr5q0LUNvbm9y +IE1hY05laWxsIDxjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1PohXBBMRAgAX +BQI7E6xMBQsHCgMEAxUDAgMWAgECF4AACgkQgQRkT1GJhQTY0ACgmZmKheHzjPJs +5hybpyvnvEiPYqYAn2+ryxdtz8XyOMExGRmHNlhG7svsiEYEEBECAAYFAjw+nlUA +CgkQohFa4V9ri3JYYACg1WN+NCptfKVP1mbrIa+0ajztsiIAnAn+m70iwRRFZCxr +jcULoY5SjyTLuQENBDsTqy0QBACfsCxJ6iCtgX8zjlVtMsMfDqu72x5sYatWKn8c +u+4Oj5mi0x6azZIhwCa+K3ihLVOyG1mCRnzztGTIxWYRhq3TESIVOfgm+NgLGrmA +XUTFyCT+21TExLCpuVZKmUHsWXLxDtfQ1diPeQpiQ8+Fvb/4jLGFjFIrQ2VjtFQn +kumkSwADBgP9H0bF4hdMuVEcSJ9imxSoJshcOOA3Vd2+YiCTZhBygWM49wY5jNos +/DArIjNCE53IlOu/UtHB2jqkSqjF0soGYsUjeCWouiTP9hLuMKPjnqj9ryJPTDKz +nTCZ4TuB5CtzrKTlWLmPCPpFsGqe4KjMeKg/mqGqjPKl97xgStK9N9GIRgQYEQIA +BgUCOxOrLQAKCRCBBGRPUYmFBMM6AJsF3FFyZGEmbt9aGG1W/u0oI9mcLgCfQyJ+ +aalbspazea4J9zgi59SSwOM= +=cBdR +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024R/697ECEDD 2000-04-06 Henri Gomez +sig 697ECEDD 2000-04-06 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQCNAzjsydwAAAEEAMpwFU/ci3/wR3ryCGp9Exr+Rx/hTQ7hWAJcVw8ejlBXlT4T +yITlRUs0HGfRWxME2J55PuXXsIEPZzjfozNtvOyq8WlLlJ7iaiyWxVRoPJ25sSEj +C9etm6wjj4E66ZgzuElZkm1m69uEsCHPPNuz1oQ/g1O+SmIVxIYirlxpfs7dAAUR +tBxIZW5yaSBHb21leiA8aGdvbWV6QHNsaWIuZnI+iQCVAwUQOOzJ3IYirlxpfs7d +AQFQyQQAj0D9G0hEL7SQGaSCkkoXwvamQw42N8+tNm+jfWHWdE4HAiVlhJmI2GyD +sdcXVAcR8R7ILIRB5AY7a3bF+qMk0r+vO6oR878RKKn9AvtaAIOnrh6tr0tiPwf5 +XDUMySxIWJEF3SmJAy9Lq3bAl5GMzZCFHiS0NW2gtWgmr/u1RuM= +=6l+I +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024R/397DCAD5 2002-07-03 Henri Gomez +sig 397DCAD5 2002-07-03 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQCNAz0i0UUAAAEEALXePN6IHne0W96YRMnR+4EXB6402QY5f8ZLcnSUZUH55Fb1 +qcZGBc3WRKlPiUvwBD+eVYgCpNSXF/H+oV1mawxNJN5XwqBEpfYmY8MRIPcqa61h +bJc3LBSm1qNf05G5Cwxeed+OgVm0r1HBy6DAgDHAqNlkC8DZ/BVgqMA5fcrVAAUR +tCpIZW5yaSBHb21leiA8aGdvbWV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD6JAJUD +BRA9ItFFFWCowDl9ytUBASNyA/458T84LUVhqq6Y9fPBAfcFMWY2kehuDWsQEXkO +46XoK+AnFZCkKuyDLqPHchVUO5pK/gZYsDK/xJkfh3u4FTDTsecb9wFmIeyayVIN +SI8o6l8EZzDX/PGwqEwzxHrbQkIgIktNn5ApIoazvdBpbkQfNj1vr2wWoMYPLAWM +8xzecA== +=UmZ8 +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/307A10A5 2002-07-18 Henri Gomez +sig 3 307A10A5 2002-07-18 Henri Gomez +sub 2048g/862B8F70 2002-07-18 +sig 307A10A5 2002-07-18 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBD02vbERBAC1v8fR6gjERpaz4UMfdy0hRVWCPSbOdF+Swm/IenjVzErco6zb +MTa13umUNrDPBy/tTWiCCZrOnqi7fgDzWqPEqrXJjKAFVLEWE6MmKylPPEPG1/bm +idkNGERSAZduvhKv777PzvEJJ/8eGe3wy/O8NbgIjCPtr4UklwCZS8cFuwCg8oMO +UdT8qZRtzdxdAyu1m5fUb+MD/3IKJYWXsdtb6iBphCU4f/BoyjVC9EZJ1ywLuiVM +siKbuaDUaXU9nWcbNKv+fx8uZ1NaadpfLokqqhnWcpnSiqw8HNR7SwsF1D33rkXK +O4FSuVss/tIoqGdWFcJyPkP4yP5shxqR335narVw2vDa0+BiWkALbA2qVsSIdZDB +LeFZA/47AMBS0U2BRk2rQT8LmMuFl7mR+wNBM4n7FUGdxsGn3TcYd4pXTNrEQPrV +YNdooKlikgGk4hgFnIFX09Spmimqgq0goFue81rttVdZZ4uep8dTghY6gwmvcOxX +jATbhWStBhdu9B35kzfHc+1QihD5Z94u4uyWIVBIzikcdiY8LbQqSGVucmkgR29t +ZXogPGhnb21lekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+iFcEExECABcFAj02vbEF +CwcKAwQDFQMCAxYCAQIXgAAKCRAZMdaEMHoQpYijAKCCP68ndU/kTXR9XAKLvibC +3S8+1QCfUFQYte3Jo+MHKaWjsu9JGptRzo+5Ag0EPTa93RAIAKlsRJ5gOGTFsmaR +W9k6MIh4c/MCy7J7HUxT5xTdHROa+3zUh+FAE/JaOx9ZtZtH863DFHA8cP4L+tpi +PjBT6g2E94dwGcuH/OiSSCT4JSBukbGbOuLLdmFXqUl8+4gsL90Xal67FtNLwyLG +1n7geLir0byD+OT7VLA5w+6G0NOpJEveV/FIa2qLgdRZ8vz73ybgMh18hBUrUmro +jncp0rln2VU7VCH1C2aClKm7kK4mGAjIFIzKbguK+kM3b8NDHmXKpT6syyCtIM3h +prkV1TUCAFqLI32aSdlTN79lpeA2zDga9k4/4X/RDHsFpRN2neRFGTNUtuUgYpQQ +E5zWBmMAAwUH/RiGxyeBsad923IwE1+GAjxFl2tqF9xWk0J6yTnSK4nfhYAE9evV +jwDEok9jRl4ILCcXx6YN/d/lWNuSbARKHz/3hLiTouPpwd3SSJ8is2x9PgpJz5JX +cD0y1SkbPLvs3jH3ZmdcxZpuAmJeI/typqFKK5pWP44oXIH+XH/8nWDtmLEBkgKQ +/ATQWenMTmZ6MIJ6aWKWGkO9QS6iYRz3PPPGQ1O8W02CeprM2wBtlb8J1Z3RxNhM +rZcg/1Qi3V3D1HI4zw6tAFmDeBb8J4PaBQzqlhzx2EBTbfwNPhV8AlPvpxHEeGGn +v+O1yhZr33SnyZdINNoNDn+owVMdmkobe9GIRgQYEQIABgUCPTa93QAKCRAZMdaE +MHoQpRsTAJ4qst3MhLm48fBAEnzuzi/BIKr+AgCfYaCB/AvPoncQbHc8BcNGRimR +P9A= +=hQhz +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/EDF62C35 2002-04-10 Magesh Umasankar +sig 3 EDF62C35 2002-04-10 Magesh Umasankar +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig +sub 1024g/B5FFC53F 2002-04-10 +sig EDF62C35 2002-04-10 Magesh Umasankar + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBDy0ebgRBADuKIKD8PuJ4wKEV1h2AprwJjxCRx8vn48XNwfLZuvhw8cpArtK +rZwhoGPPUPEEXgtTNerlKq4VwpAwcnvRz7oC/7aWkUbcR2sAyhfe2scohwPgw7Xv ++isWC0NDPdrxvXG/PUOG/cnELunr51ymybBqBxUd2gMhYIxPo67D+YPYLwCgwcZp +yc/6kJa116ESWHrti342GD8D/1srpnRs9CiS1DQF1uZ1wW4vzj4VD61tKsjdWD8D +V573R22iMDLSj4oMB536WxUH7snz8XsAKm/peqJ6G9m0smtmWA1ago5yzQj70WqF +xzWBhHn2I/YfAQ8pb2s9q1lClj8elnCxT65L27ydBAZteejb2VqjtQ6iGy86PUT2 +wRUvBADZmoV1eIZJEM5NnxBv1EtvRYZtIQEzZ8dO2A1LOS7qlVr8IypljNPLGhzX +VHNvVsjC9QMUSWeBsDedvQHQ3hJpIMnTI32XE1V4gX06gfVTZdhf2fLTtwnsHZp0 +oumqshGDVRhNJJdDYLikxWOxOfkNveKEqJFvtuBR+ZqqluQKebQlTWFnZXNoIFVt +YXNhbmthciA8dW1hZ2VzaEBhcGFjaGUub3JnPohXBBMRAgAXBQI8tHm4BQsHCgME +AxUDAgMWAgECF4AACgkQ76Pnee32LDWSRwCfeASWXvpdt7bSFPMtszU/7uPEktsA +n23mYUN5WKJA1ZreW+0CcZ2ESnOviEYEExECAAYFAj5ogYgACgkQohFa4V9ri3IW +YACgsxGig0PL0M86rJsA/IpXjBdg3ysAoJzsoUZ/7s2BxDfzF/FRTVIzS+TMuQEN +BDy0eb8QBACBVb9YDJRp9Irzmq71Jf9FIPw+4g/cWpF3t/Eb7eSzMcOvTAXyNIWz +aaOjHre7lFctHfq8ls/6gR7uqajiAnfQcfTcu7pp+F5KsU0Embt83SFzZ3aoJwET +mB/LqUyrrGDiue3lU+flJO7UmcsRvtk0+BDkyCeB9HgfdpXbBLCyuwADBQP+PNxX +4e1tg3ZJo/xNEnD2Re3HjmQRrr0RYJLUGjgQrAEONSgowx3IW8/JssmNJVjnYm0q +jSKsb8rergCFJhPNZ8Dd/k00pKcrq+IN6j7WTYLqPce87zrGAZUtmDwDSp5mxy5E +xWJJxsgBPk4YBQLzJt21A3BgK/i24Sze2VLbaZuIRgQYEQIABgUCPLR5vwAKCRDv +o+d57fYsNa8xAJ4mLfonZbd64+YY9rfvhIh3Vsl3AACeLPPKtma2K6XCfhTBEDnj +hzSr4vo= +=lBfF +-----END PGP PUBLIC KEY BLOCK----- +pub 1024D/265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 265B4C63 2003-12-06 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 5F6B8B72 2003-12-12 Stefan Bodewig +uid Antoine Levy-Lambert (Apache Ant Committer) +sig 3 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 5F6B8B72 2003-12-12 Stefan Bodewig +sub 1024g/A3060393 2003-08-18 +sig 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.2 (MingW32) + +mQGiBD9AzmcRBACMqgb7IFvC/nLxw7mUAgHENeZXY3JOQJ8wVBevIbbMEeFvzHE2 +diFydqUXocPexduYr0ahkf033WvWdAiNqDLfVW/HFOsc1TpjbHkqPUHtJ62Ya5tg +nH4UGN9BYZfMbfVDOSz41lYwmfK5HYgpZN/sBQBSKf2qgoFB+LxYaae8YwCgrWlu +fYhf7fkKbbdSf3BGS67ggNkD/0VvkXkw1SEnPaqrkKGkPKomCTb2auGxcYYI3/rP +1m+SGRf0gE1NtocmIEitiR6WvfKUjoMAXSCp5KdnUXmO9rwzkM002KCA7K5CY+e/ +2bLDuiQ3rNiD4mFfG6M+UnmZ+GMFba1p9Cp4PqLNLsCHz67t7hEsscTZQ8mZ9xKM ++GCsA/9P+XFM7JDn9MLhYab9qo1CkceBkthUP6jWGjuAZ00elmBCkpkzNv5aIzss +xih2GpaU/tmcMjw8FGp0dTwzqdpmbZBLjunRnuBTir4m4l5G9rwl4JbfK1PVqk4a +VKkh9W7/yqBcEfNcsfJO9cqaQ+PzcnCoDiD9UHEBYzUhrCKwhLRCQW50b2luZSBM +ZXZ5LUxhbWJlcnQgKEFwYWNoZSBBbnQgQ29tbWl0dGVyKSA8YW50b2luZUBhbnRi +dWlsZC5jb20+iFsEExECABsFAj9AzmcGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQ +hhTWqyZbTGMnOgCeJV2gI+1CIxMR7dcIhXjPkiusreIAn2SGOsPS0o89l0EIVuc9 +J2F03aB+iEYEExECAAYFAj/ZwioACgkQohFa4V9ri3J8CACgiGlh+td0BAnJPq19 +ovEQR2DJ02MAoLP203EF+BLPpykeTcGp8UEWmeGQtEBBbnRvaW5lIExldnktTGFt +YmVydCAoQXBhY2hlIEFudCBDb21taXR0ZXIpIDxhbnRvaW5lQGFwYWNoZS5vcmc+ +iF4EExECAB4FAj/SSwYCGwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQhhTWqyZb +TGOh/QCfbrSoipMlizyGT6c8BOPEd9zzfi0AnRRTqTDzXzsGk4CG/BJME9CCm7Ts +iEYEExECAAYFAj/ZwiMACgkQohFa4V9ri3IOVACgh2QHS1+cVjvM4eLjls1bJwWi +o5IAoLtAszHrwHS5qrhvr2rtnlyyyV2guQENBD9AzmkQBACNpBfqi2PweozCtxoX +PqzKdRDKqCw7TOrDR6lbP3z/ov/1SN5Vc0XqNzBSGqwBcmGWtneABkX7n4uzJrC5 +wvX/TZ/DkMvypPyeNVMu+/ZMlzdbx06OUDKr6Fy/NtaI7cN1rw+Igyv22Q8ilhhg +s/5Rdj84EtJkWQjVRml6wXSAZwADBwP/TqyhOC4sA5YrePYGH8i46h0SU9dXjfEF +JijC8vXZ+BNQHQVK3fjEXedZL8Zvvp1bsMu7Muz9SMnqygM1unp2NGxLRd/9315p +Qh0VStYKn0xq13ybOKr0Gsyx5yyl3Nzlu/1qAR0es/zN4jV7/IQi3R2GOvezcpHX +mkbsYiZAhu2IRgQYEQIABgUCP0DOaQAKCRCGFNarJltMYxcsAKCSJJUABlXYnLBj +b+WtmAzu0JjZNACdFJ4KIATJDK/5ajFq5+irOpodoHc= +=UomR +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/5F6B8B72 2001-05-28 Stefan Bodewig +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig 51898504 2002-01-11 Conor MacNeill +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig D6298F01 2003-04-27 Paulo Henrique Gaspar Jorge +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig E4136392 2005-07-21 [User id not found] +sig 8408F755 2005-07-21 Christian Geisert +sig 2 FC243F3C 2005-07-20 Henk P. Penning +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid [revoked] Stefan Bodewig +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig 51898504 2002-01-11 Conor MacNeill +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +rev 5F6B8B72 2005-07-22 Stefan Bodewig +sig 5793498F 2005-07-21 Tim Ellison +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid Stefan Bodewig +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 51898504 2005-06-21 Conor MacNeill +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig 8408F755 2005-07-21 Christian Geisert +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid Stefan Bodewig +sig 3 5F6B8B72 2005-05-31 Stefan Bodewig +sig 51898504 2005-06-21 Conor MacNeill +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid [revoked] Stefan Bodewig +rev 5F6B8B72 2005-07-01 Stefan Bodewig +sig 75A67692 2003-03-18 Erik Abele +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 5F6B8B72 2002-01-11 Stefan Bodewig +sig 3 8103A37E 2003-04-04 Andre Malo +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sub 1024g/24774157 2001-05-28 +sig 5F6B8B72 2001-05-28 Stefan Bodewig + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.4 (GNU/Linux) + +mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ +5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82 +EXwWOFuYMJisuxdT940iQzosm3GOv4MJdEg3oI2SgfEyRQQ6vO4Ob5rHDwCg5taZ +nrHOrXx2dIGHxpxRZ0SUl30D/jmtttFjYOQ3LBMriikz5mh2sK3ZnoSRF4o5O0zW +Ve6e2SFXOEjVjImKsH6KCbdQNelrAdgiyOoXClyQKsQ27pncbdWo6bO0E3POJZVm +XaeW7iudHVr63rU5PViXObIQrdQl0D59j5brKj4vdlTyUw8kaHPvbKPDEOwvZq4Y +LJQ5BACA1YilTeXRJqwFsNlpcxCHwlULD4QUVP496prQWf1B7Z6g0KvLGrQsO0Vn +Jcn+fEqukysTJixSXCPebosltd4RalJIupVYkp4w6MJ7biaDAlLuNhDcI/AiXTmV +dXUedVXIaM8I3Ne23gucwbAyc0Hvb+3cSAKRhl/azFQhuHBvlrQjU3RlZmFuIEJv +ZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz6IYgQTEQIAGgULBwoDBAMVAwIDFgIB +AheAAhkBBQI7EiJPABIHZUdQRwABAQkQohFa4V9ri3KPOACfdr6cV41veYBlBHiV +FxfLcX7x5OEAniK4u3g2jpNQH3E0ROubdj/RO+RTiEYEEBECAAYFAjw+1Y8ACgkQ +gQRkT1GJhQSdkgCeM6RDHUF/E334TtiLPgw7GpmNJSkAoNCLQCW/9VHrV+ZHsodn +XUnaD4dIiJkEEwECAAYFAj513wwACgkQPo+38viDQdknZAPlHNiMnR+LUavo2yOY +iJT+W9+8+qNs2grYDZ+WSYujaWT2NJrUCYXQRM6gKDyFlkcJvHI9lF2yYMkVetll +ZVN1TJkeEdtbHncNHcdq+ZUQR0NkFKTF9d1K7UI2rfWxt1y6a13TcUjpJXzbtw/O +XX9EZSI6QQt4rSFlvci9J3mIRgQTEQIABgUCPnXawQAKCRDu0eo5ImHQc0W4AJ9v +uq4wlkc6TmmmZPF/gZVLluHcTgCeItrnvzyS11xkIETk6v4b7K4gaiiIPwMFED51 +qhr9b4jGIdCnGxECRAUAoOaVZW5CdZ9oYr3PwI/i8RJN+JfJAKCmd/XIlYOCpa9Q +c4C855pM8NFw6YhGBBARAgAGBQI+d6QQAAoJEBU/oM11pnaSL+sAn1DTHmbhITeE +w0ZSgyBLQw2ZhcM5AJ0ZrRBbZ9lbgHXBKOJQiLpWBj4XsYhGBBARAgAGBQI+yi6W +AAoJENvSRfyzsqEsF/AAoNXq7Cp/0AwEmWvhoTjmtY6eVYB5AKCMFhBUdYWNXVya +lPTq8ThswNUnr4hGBBMRAgAGBQI+jc4sAAoJEMppOXSBA6N+kUoAn1Nj6YqarQg0 +sL2KrFsQROM3A6fSAKCyl40SpfVJSO33fYuPci9dHp+QCIhXBBMRAgAXBQI7EiJO +BQsHCgMEAxUDAgMWAgECF4AACgkQohFa4V9ri3IsngCfbIpJDWj6UgXY7rBH8To1 +2BgB+RIAn3jw72WJzplAtShVTmuMlRFS+FUNiEYEEBECAAYFAj6sazwACgkQqywx +6dYpjwFkeQCeOkJrnO5r2hWDhX4ACPPLObZvXLIAnR0VHAgkEH1W/t7B4zdDYdBB +Zrd5iEYEEBECAAYFAkGS8mMACgkQ5BNhMwyqaLQs9ACgio5zJcieYLppigvSYLBf +ubUVrXUAnRKZJ6MACpH6fpoz2vkc2dh69tbSiEYEEBECAAYFAkLFMoEACgkQm/Ij +RS/ii88aCQCfd1cIawDqpkYU86f3JEjcN85ntFcAni0m8WR6s+bkh3fd+EIrSRsr +u3uQiEYEEBECAAYFAkLfRQIACgkQQeoJoFeTSY8XxQCdFd+XEWqyDkCx37gaIQAG +4dHpwiUAoOZ/K5OHyTJCNFaBUDtpCh7hL8TPiEYEEBECAAYFAkLfkncACgkQAQVm +vOQTY5L3SgCgiEi5/1vYvJrKoAdl0hRWU57ieUIAn2n08BQfMZJQ439aNW/CnIK8 +jPBPiEYEEBECAAYFAkLgNdAACgkQc84u+4QI91XdNQCgoBB1ebohIflinAPlvI37 +pFHuu0MAoJ4yMtbKZMaq0xIBnxV9c5uu99tGiEYEEhECAAYFAkLerWMACgkQi5Yp +Q/wkPzxD7ACgqKnyeb/fjVS8vov4FePxeLju4msAn1SCGaiF9gEf+qIaZUnjcT7J +DJ96iJwEEwECAAYFAkLerG8ACgkQMaY9luwUC4Ea9gP/WON+0xIWOvWP7mKkg/+X +0ukW+mbjE426qKtG/B0vNrTKpElmz8ttR+oajqbg20LazoEUuA9ZXjLPfsdWA+vF +kxgV6qIdtxYPMamPm7ytEBOmgMowYXUftGteqM5fxLlceHiwdUlynG2fmtMqvPnd +2OCezSFRx3W6nvAiIjoLZpCInAQTAQIABgUCQt7H0wAKCRA34/Rf7mXjIcAUA/4n +DlQbnToSSDOZkFj1CoGL8TjsVgzrO3r3S3x38uQQTFAE/AGBY4mtHgNcYmiJaC2h +N1Y+mlEGu/80Rjv185ZfJsFEerU6Y/9tRJJ1So9AAe5AmvGpD9ysXae5geB+k+ep +IMSuf9WMeTRUCbQs9ufGZLV5a8jqstv+btcrzNaY9oicBBMBAgAGBQJC32x4AAoJ +EJrNPMCpn3XdRBkD/iNi0Y6A3afDG9ZL/K4JrOPgHUFWC/DgAEBme4AY62agUsT0 +uXlz+Mu1Ps2E0t26ejScuVMMvqpXg7iJ2+3yKzsnX0ySEXW6/696XEpe3TFn1iVO +mMElPKxakn3t/jr6SDepo9jqD5P5CJR4GsDsG3iKIisWdDf81ZXpf86y7A5eiEYE +ExECAAYFAkLeuuUACgkQMsnkzjZCy0vmSQCdHGC6jOEVo96yyospTq7bL+EEeioA +oNMKIZy5qFLXXZbSNvsj7mDRg2c8iEYEExECAAYFAkLfbHoACgkQUI6uxTAtpWhY +hQCaAvqVBsTX5s4c+sTOo06BNMdzHIUAoIwpThAKq936Szy/3Gfv8K3gs5NOiEYE +ExECAAYFAkLfbHwACgkQ3bpkuiwxLS9z8ACfYeocOK4J204xwbXgEdUJQyvHK2UA +oKz2AF1I2b8Ebu7vTUZLNFV1QMtwiEYEExECAAYFAkLgyTgACgkQXP03+sx4yJNb +EgCfRcj6QKHVHQtYVXdCYKUbrj97wAoAnimqV15cvz1siDjUK9K/aTskGwajiEYE +ExECAAYFAkLg7MsACgkQybWm7OLXdN8UoQCdFfqef8My1xhn6mLd9WTLLaIewTQA +nRXGh/Af4hVG0KwtZcJEA464nCoJiEYEExECAAYFAkLg7TwACgkQW5aAEOBPmol+ +JwCeLxZjKNisjgP4AxV5BCKR+5SU9NoAoIwPF/7B2NmGNR0t3EZze8wpNhQ0iEYE +ExECAAYFAkLg7V8ACgkQN/aP9QFa/IqerACfafKJi4s8LYV2JxNfQKHgmRXzeIIA +oNBHOzukDCdxIvmYJfamItnCP45giEYEExECAAYFAkLiYm8ACgkQbZiNF4cxXDH8 +HwCgq8P29CwMX7PKhRmY3T32APsOaMEAnjdd/WvzVBFtTcJFWkH6iF4L8EQpiEYE +ExECAAYFAkLjVb4ACgkQEy5J1OQe3H56DACcDPfWLO5cDkeKFCvIP8mc4p4KkfkA +oJITROldIRxXqUiML1oTJxieuHJfiEYEExECAAYFAkLjZNoACgkQdcqio/ObN1CI +tACgsJhqBxeZTaSrRVNk3aj6ciAJrgEAoIxPXYTvIpnWBr4/WMbN0jpV0TGEiEYE +EBECAAYFAkLkbxIACgkQjON2uBzUhh/gZQCbBpIqkCEuIbd6tqChz3PzcIGiZbgA +njluBFHl4l1/NHtP9fEYCgl8nbCviEYEEBECAAYFAkLkkr4ACgkQBJE0Quobo42f ++QCgjtO6EOdDRiruCi6gKvwM1a2eRwcAn0XUELm5AZezL5E0rEfIM2FBiMi5iEYE +EBECAAYFAkLlwh0ACgkQYRlqLjM+ToS9pwCfUEgO834XY/clWzkw/VLBfe7MLZQA +mwdz0nleOHYWFBrnYgEz53d4MxUPiEYEEBECAAYFAkLqY/QACgkQsr68QBUpJK/o +MQCfc7M9KpApCWW7eE22PlLoN1sPK+4AoJdwE8TsDM2Pmehk9K+uHIx6FoRviEYE +ExECAAYFAkLj7WcACgkQMoZOQZyFIitClACfWpH0+V/N6vuucWZ7bsMm2BcmM3oA +n3fF5qqovlog4/PcgvKCToNEF8uWiEYEExECAAYFAkLlELcACgkQUnkvr5l4r4YU +ZwCgg7vJpDpUXnuNvgc5RHgG7UYhRQYAoIEKHsrswh6XzVn5yQRkfjdB/A0OiEYE +ExECAAYFAkLlEaQACgkQa3OhBipiP3JA4QCffb8NgQssOQXaVR0dSwPCeU2nQPUA +n15EAjykVZsUi2tZWqEM08SNOKI9iEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWd7 +AQCbBpwyitQ77kd9KIT6y95Im1vmWt8AnAnkNTBctVtMfwddYTG+xLkaOllOiEYE +ExECAAYFAkLnYVAACgkQbpR1lMFSQxqIRACffQqUXTgOa4hyHYQBUwrlGEqmWt4A +nRMXVGhd47loS27MmiEiWwDlkNjJiEYEEBECAAYFAkOHn54ACgkQZjW2wN6IXdOr +9gCgh2fn26W0DSL5WZATvvQkwZeJNiMAnR6+0AlUK8uFSFIVhl+RZMnY+XFwtCBT +dGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPohfBBMRAgAXBQI7EjmBBQsH +CgMEAxUDAgMWAgECF4AAEgkQohFa4V9ri3IHZUdQRwABAcm6AKDaA//SYJv2pcXw +GBC89OSzGvxy3gCg1kx6qu6zJKaWaE1L9oFqVc65OUSIRgQQEQIABgUCPD7VlQAK +CRCBBGRPUYmFBNCzAJ9tv7tNS6NwaOZQ8cR0pGslJGKtuQCgpttMmhhRrUwyVuEX +c+dKX7rdQMKImQQTAQIABgUCPnXfDwAKCRA+j7fy+INB2Vm6A+IDxiYtMvd/mad+ +7hRoKXvD5AddB1SwnvQdJe0ewStFBYZxZdNOLXdkVngCwAJziPGZcQmocEHVMrN+ +Mxe+3OX0PEZ+3KOOsAUi+fTov2xvf8EWKgX9d0li9iEytVA4M0c52a3bPTC0Kki/ +KAY3m8oNvAmTwWB9dBSooFFDMIhGBBMRAgAGBQI+ddrHAAoJEO7R6jkiYdBzruYA +nAzvTrvDQNvoAoaDQJ+o/ydqMA8ZAJwNEOQDHsz+6ynbMPoQmKmUqfEISIg/AwUQ +PnWqIf1viMYh0KcbEQIkpwCeInf4o3C5Ykh/xBodVImrp2Cvcy8AoMn3me5p4Sl2 +rm2tjVxTJZt2sUr7iEYEEBECAAYFAj53pBoACgkQFT+gzXWmdpIpGgCgiTARP6Cf ++JKOxUaVFr0L9DC5oUcAoIxF7D5mOVK/AFcp1cxNk3BLtdq3iEYEEBECAAYFAj7K +LjIACgkQ29JF/LOyoSwAbACglNp7V2Pw4U575IuooM677bZf8pwAn2U2TcHj7PYp +rU+qYRkyJ3pa7FyyiEYEExECAAYFAj6NzjUACgkQymk5dIEDo35YPwCeJIU/monN +96nP4jJjAuflEXMbemUAoJXq7oVCYuOCqWr/T3VW0DM3W+dniEYEEBECAAYFAkGS +8+sACgkQ5BNhMwyqaLQ2RwCeMcDf4bb+OMjRUJwAk2LHN9th42QAn03fVqMUZEVm +OrVXfWILpjXNLMDIiEYEEBECAAYFAkLFMoYACgkQm/IjRS/ii8/gpQCffXXRCeZf +1Vv5ih70yE2ZXg0r/rsAoJYKsdx0K5aqfoEzyiBCj5I46JvhiGoEMBECACoFAkLh +OBAjHSBUaGlzIHdhcyBhIGpvYiBhZGRyZXNzIGFuZCBJIHF1aXQACgkQohFa4V9r +i3LxGACgiQ+wlaa9iMOue5DuhtyLPMSmuiIAoIkrciYFOf3VBBD0HLWfGVWUqxzR +iEYEEBECAAYFAkLfRQwACgkQQeoJoFeTSY/ndgCfUEQl4Rc5nnu3G4ZX3o4OywbF +7DEAn3Htv1s/on+ei+1mmS6Z/PdwgM7viJwEEwECAAYFAkLerHEACgkQMaY9luwU +C4F1JAP/epJYDZX4flU0sa8AlFtSROY/O6g3iVq5zeYm1WD3e0xOOYTXlkIntkYF +hqbBzZQ3pFYfWmbhzCW/Tc0RigACdmroEELrwyrfLIHvsnUTF7C5AL6SuFQZqG6q +oMjtHFd6KDMos2sDEZ3VXDG1buW+hpHY9rWRJKPzb/SgSetTCeuInAQTAQIABgUC +Qt7H2QAKCRA34/Rf7mXjIaxmBACiYCwxZLtxnaRfwSOBkASqmnS8oBdyIKvTad9d +LE3CziNgEW+AdfE76vQskeDxL3ZVQubhKWiaM4B7YU2nYxk4INVpok1qht9bN1Ps +y+TS3SvpPKqq8Ri8xc4ZPDwdcCcCJiXLy5iR5tx3iBsnHRM5+LMIJg+LiOqd/ZnB +sggjjYicBBMBAgAGBQJC32x5AAoJEJrNPMCpn3XdrMQD/3vFtnKssqT6mB7NOZ08 +Tcw+cC5e9gAVr5Y33X+ZgPe7BJd6uPNt+I97FDdVJOnNtTZSvnkQZ/C79Yoci0yZ +AAoHYlzRb4tXguLy4UDBjj3BlvPsCOKJZrKn7bxvtoTbeHgjHmneiIwCuyzSoA1h +AYxiPliDrwuVCQTudHDVxjl1iEYEExECAAYFAkLeuu0ACgkQMsnkzjZCy0sSYACf +X2gis4g5jep0HjKABAk31byHU0QAoI5294fLHOeIHKLCIdvKm+7gVLn+iEYEExEC +AAYFAkLfbHsACgkQUI6uxTAtpWg6BwCfVQtdTRbNPgQGFqGQSUlBJ459xfYAoLKh +j68YUwZB5VgIeIorpqt9bWR2iEYEExECAAYFAkLfbH0ACgkQ3bpkuiwxLS94SQCg +hB4+5RwGR0ZOyy2xUA4e6ImO6ZQAoIjkWwYRd1Vp9SQoJW5OdSquYSctiEYEExEC +AAYFAkLgyTsACgkQXP03+sx4yJOsAACeKo39hTRNVVyvj5y9ohT9Ye3/C+MAn27a +EKrGgxNbwq50qGxFE+p36j7fiEYEExECAAYFAkLg7MwACgkQybWm7OLXdN8i0ACg +s+aW41FnchB0K/OUdB3t0Lg4i5IAoM+l0PyxS3XJsAwI+JbCm0aR3VA8iEYEExEC +AAYFAkLg7UAACgkQW5aAEOBPmokbqACcC3in6U+mqjSwb67rB5zTY0ThYucAoI4V +7qe0XHTDUwwWOgRo/NzR7k1OiEYEExECAAYFAkLiYm8ACgkQbZiNF4cxXDGcDgCg +i5CrpyZ1Dcu0IKML05Ffvw8lPhYAn0nL0BczEo9RpNVYg2ytJ+YtjKUFiEYEExEC +AAYFAkLjVcAACgkQEy5J1OQe3H7q9gCfV5xTyo5SD7G62VSUbjYfeqcuxXwAoKAu +chsMkavYWCt0jBhgLuTJkFqUiEYEExECAAYFAkLjZNsACgkQdcqio/ObN1AdZACg +pUgi5qnnDUpVXhTsJUoo4U485sYAoOXmMbhyaOMH9g9ndYFm5aHPMbf9iEYEEBEC +AAYFAkLkbxQACgkQjON2uBzUhh9ScwCgqFELgIdNWky221EuFgjKzgEG5WoAn3cB +ZbE+PMFhAZyUhQIl2hHEbVJIiEYEEBECAAYFAkLkkscACgkQBJE0Quobo43EoQCf +RCtbvMHoTGmS7dmZ3sRyAj4W7WoAoJDfouy1wZ5tSMJT+XBm5oFtwSUSiEYEEBEC +AAYFAkLlwiAACgkQYRlqLjM+ToRAHwCbBxMHNYyvbYmAb1kTEt8ydF660oYAn3zs +rmZawTXrjvbPE/VpC+/7wpzpiEYEEBECAAYFAkLqY/gACgkQsr68QBUpJK8VgwCf +aCR45JtzFnz0v4jCuooqaFGgH80An2BcoE/psLPTECGRDKE4v7JNADnCiEYEExEC +AAYFAkLj7WoACgkQMoZOQZyFIisbBgCeJjAXLGfz5ahDdgozqDYrbOzxWG8Ani7h +FwwxHFAIe42+OsL6xweRD46fiEYEExECAAYFAkLlELcACgkQUnkvr5l4r4ZbzQCe +MBjFzDvBIFmK5VNIvvcK3ejdDPwAoLzg1ytKCg3A0OebfMX9nr5iQOxwiEYEExEC +AAYFAkLlEaUACgkQa3OhBipiP3JevgCeJGjwezorOSri8IWxMJqTt3tOzkEAoMNZ +CTo3AmcKICFhtdttgcuOZNWAiEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWfg8QCf +dYdGhkb7pBqgFhGn3uJ50+sY/QgAn1PdZCfRtVgdk/JVv35F7fJp5a1CiEYEExEC +AAYFAkLnYVcACgkQbpR1lMFSQxoJggCfQ7Du5ZKb7ooJj6CF+ne77nxVuYgAnjLF +1tZ19A1n+hPaT4A2nmfnW2tRiEYEEBECAAYFAkOHn54ACgkQZjW2wN6IXdPfvgCf +RhYzSFLrXLaM7hTa3iHktsQE1iUAn01MLep3eEdd3+VNPojrE8FlV+odtCpTdGVm +YW4gQm9kZXdpZyA8c3RlZmFuLmJvZGV3aWdAZnJlZW5ldC5kZT6IXAQTEQIAHAUC +PmiBXAIbAwQLBwMCAxUCAwMWAgECHgECF4AACgkQohFa4V9ri3JPKACfXhFOr4gM +MIQwEGvUb6J/X4asuzIAnje2H9T1r/jSVi1NbIEtQfbpmyQXiJkEEwECAAYFAj51 +3w8ACgkQPo+38viDQdmGkgPnUYJfHlDrQ2jYJWuPDve9n4pV9OvyIllKyLdfULjs +LWXw4Jm+fMQJgWr2GEov1ZYIyS2+rGDZpbz/vxaBVbgqM8TPdiXzxwU8AFq4k+Em +4fKXR58ByLSJjvLLza61spNHJennEUFp3tTpEsr4bNuuaoRYhtiKzTqNuoC+0x+I +RgQTEQIABgUCPnXaxwAKCRDu0eo5ImHQc5lcAJ9FOoAL4uHMuqHXrrxsEVPJvEJ2 +/ACggaOR62EziUqcqpdm/1Zy3P4T22iIPwMFED51qjj9b4jGIdCnGxECWssAoKnk +R63bWGCFDB5YJtfZJ+nQq3TAAKD1bzG/kITQpIHsT2vCY1yBmlWbBYhGBBARAgAG +BQI+d6QaAAoJEBU/oM11pnaS+9IAn0kFlXAzOhhu4r5fglMVuw5bTAd0AKCtYRX2 +ESU/+tsE8vuXWtsMCGeI5YhGBBARAgAGBQI+yi67AAoJENvSRfyzsqEsSccAoKqG +39X2y6xoQa56nviF5iCj/oTFAJwLKx9GyKEUbSM9f/IQ7AsZPhHT54hGBBMRAgAG +BQI+jc41AAoJEMppOXSBA6N+xYgAn1HbGamcXTDYSFjn3U5ik2vQa8nuAKC/uUM0 +1gsdn+71EiAkmrjlH6H9MIhGBBARAgAGBQJCuAqrAAoJEIEEZE9RiYUE0MUAn3cW +FVW03CDuMuA7TSUqTf/eWARWAKC/GjQnPZ0+g7NbDw68ZSY3k8WuuohGBBARAgAG +BQJBkvP5AAoJEOQTYTMMqmi0GIQAn1mpdHz/wV++rSU2Qn7R32slfNdpAKDJPqpn +mcN4MUmk90yZEeHAdJmrhIhGBBARAgAGBQJCxTKGAAoJEJvyI0Uv4ovP3YUAn1z8 +L1EnLdIYttWrT1zs0E89Lz4BAJ4sFzcSq2NO3OZsEQfh9F6CrUe3UohGBBARAgAG +BQJC30UMAAoJEEHqCaBXk0mPIUgAoOF/OCzco+n/3sGJ57m0+aqGLOwjAJ9bC86B +2hRvkaZlGm/ne3TzCgFGnohGBBARAgAGBQJC4DXTAAoJEHPOLvuECPdVsEoAn2hq +8w0JUtfJpu3SmMUkFZLBFm3+AJ48pxmjHXjoBJGpokXw4i9Cfb56BoibBBMBAgAG +BQJC3qxxAAoJEDGmPZbsFAuBGDUD93nHzcDWR6AuDxDvaDp1xR8oJZHojeZ9sWSR +QffiNJKF07vvdjGbygqiWbQmtTM9qBnAxEiBpSpJemBhvGTKivPkb9H88KQe2jqo +wDO3IJorIVMT+eUFB+4pn5c+kFLD/IhG7ohZ2rBIc47L62FFuD19esxvMcVelrBF +q67ZV4KInAQTAQIABgUCQt7H2QAKCRA34/Rf7mXjIY9vBADqrguzlNOJFkWvEkgd +VXCCH2TP3OUuPZ9JQtbJfbkg1nn1hCnMITapNJlEE3yyjB7kEpBkmUtyKv3VSwOD +spfis/ps6zJRIne/2R5xqtT38Hf/sYucoMZUceipFAoCLYOqkKJKwTpYM0401dUp +uxp1y8Lq5N0SDtTW9fKMNs9jioicBBMBAgAGBQJC32x5AAoJEJrNPMCpn3Xdek0E +ANLj3wh2FCukydsfSzqgjFDpkVjiBxbTtCep86flaLMrF3H0idckGCjMUf/JostB +sjwCpL2VlCtvhwl5ZgIzm8luceHupq2iC5hvUN0IjKuIXMLbZP7DE+Lfcvw82nKt +8JNPpjosXiMhysQZms2XfuNP6f/Ey8J5jaB2Z2JCYWJBiEYEExECAAYFAkLeuu0A +CgkQMsnkzjZCy0vBrgCglfCttIxFGqVTLTq/nhPnRFMHX9YAoM4Z05oTuPFxGWS4 +RzxCzCb3vpsAiEYEExECAAYFAkLfbHsACgkQUI6uxTAtpWgipACfTBzbyb7Vc0jr +2FZDiXJFUSBCoEYAnR+ySWmedkcJWESStqRstD8T72mOiEYEExECAAYFAkLfbH0A +CgkQ3bpkuiwxLS/5RACgm88lpYDxy0bYF9/ubFbvqCw6i9YAnjrQoOLRBtQ4QmIP +R+T/9HReOeSciEYEExECAAYFAkLgyTwACgkQXP03+sx4yJNXxQCffoccUBWO51YI +EM0mbsqpnKHtawoAn2xTiDgo3TjtbRJskADuw+QnATQLiEYEExECAAYFAkLg7MwA +CgkQybWm7OLXdN8bPwCfeKtfQWKm8i+KuFJTIoMTvAN65QQAn2A9G1wtEN4Vzg6H +fnTvtgus32rRiEYEExECAAYFAkLg7UAACgkQW5aAEOBPmonAkwCfeF3l1lE2WijQ +F0BmPMfqvkyA2UcAnRQzuc7PWyP0nydGoJvfEUHByVs7iEYEExECAAYFAkLiYm8A +CgkQbZiNF4cxXDEC6gCgqICh/djzt1i6uadJAOztZc/zxl0AnjR1OaM2JxR+wqK3 +loSTEKX1uOpBiEYEExECAAYFAkLjVcAACgkQEy5J1OQe3H7rRwCeJWLmLyPzpg3n +r65j7AxqGRJeDfUAnRT2Oa85dAM02wgdYlj3FejPuNFziEYEExECAAYFAkLjZNsA +CgkQdcqio/ObN1DA+gCeOaeMarEJDPbZjaN3y/Pf5PB/Cv0AoMGPjPSTGt/iHJ2a +Arfyd0ME/R52iEYEEBECAAYFAkLkbxQACgkQjON2uBzUhh+lnQCfVbPGF5UWlzFb +xK+xKmY2DbKXb5wAnjpoAxffSRO1PZlQUHgWlS+NaeCziEYEEBECAAYFAkLkkscA +CgkQBJE0Quobo40fbACgo9YCJXu5Hpoc/SVp3rHCYmTuEMYAoIt2q6rPL/Jbbkik +bRqausEnFstziEYEEBECAAYFAkLlwiAACgkQYRlqLjM+ToRP8wCeOVAIpaG+q9G7 +uJgVCyDZ0JbjjfIAoJgg+NrBfhNeOBuu5mS1PSGDztQ+iEYEEBECAAYFAkLqY/gA +CgkQsr68QBUpJK8HfwCfWgNlYNLBWmn/nejlx0m6NstT2CsAnRdhsusv6RbcKNoV +UudxGG4Xm3nGiEYEExECAAYFAkLj7WoACgkQMoZOQZyFIiv6jQCeMior8Tg4msrR +c+FfXfj5Uln03d4An3RTaHKU+Sv4SgEecXlW0RYlVa6eiEYEExECAAYFAkLlELcA +CgkQUnkvr5l4r4ZC9gCbB5X0rL/DtpGptiNO12DdTQqzsMMAoOWpJFg3W7zAr7al +Vjqlx0t1vS4KiEYEExECAAYFAkLlEaUACgkQa3OhBipiP3LYawCgiuQqhVay7FE8 +e05Za69seQwF4CYAnAxBVNyvXu/1aeAuSi3iC6tywvFoiEYEExECAAYFAkLmmWIA +CgkQaOuMdvjqKWfdbQCdHfDneYM+nWXT/oYOqohamLvk8iQAn1LLJhkLiCMOa9/b +iF24zKt+MjaHiEYEExECAAYFAkLnYVcACgkQbpR1lMFSQxog0ACgp/m7d/NdNP0w +605VyrJWCdogeG8An2E+FpFBQgyvJaD6klzDRNNYLc71iEYEEBECAAYFAkOHn54A +CgkQZjW2wN6IXdNgDgCfUVMGJZV/D1QEdnwrTkRmMb37KR4AnRLDWMsKtq4qKXQj +YbmuLNdHa1EQtCRTdGVmYW4gQm9kZXdpZyA8c3RlZmFuQHNhbWFmbG9zdC5kZT6I +XgQTEQIAHgUCQpxp5QIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCiEVrhX2uL +csktAJ9XkWAsu0zJ293dGa+Yban+Zr1V9ACg3b9Petds6ebqQZoiHRopckbbOLqI +RgQQEQIABgUCQrgKqwAKCRCBBGRPUYmFBP0VAKCPH0b7S+TylV1uBuYcYnWIb/RJ +zwCeJvRTMPnWNjVz+CVOvVzJTH4ol5mIRgQQEQIABgUCQsUyhgAKCRCb8iNFL+KL +z3iqAKCXRZWdGjBVbj3IBFl3kvh3xF2gsgCcD3H79mbVDRNMxpGArFQ1hqQFzleI +RgQQEQIABgUCQt9FDAAKCRBB6gmgV5NJjzHQAJ9IfkjKkiEuFxUhznsghAQ8bsBW +nACgoT0kWSB3iUepLIDoWhhGtDIS5FSInAQTAQIABgUCQt6scQAKCRAxpj2W7BQL +gebOBACAFFpEKETO3ZHbjMnPogACNr6EZCQxzGTIXrXSyWQs68VcH54wUOA4yk3c +GpfH2pgAxYjaHejTJRvDKvGrPGlKHgCZFy4+wHzo17pW9J1aKk2sUWlT67snDVdM +un/i8WxD9yz299cXR6iCxPfP2HIMEqbsxWJaXITo7drWSjO35YicBBMBAgAGBQJC +3sfZAAoJEDfj9F/uZeMhRawEAM9wfn9sBIsFzQRQbAO+ll83f8ki++A4Anj6DXQ4 +xRmClUxqahL1BjxxeQhE+Qomq1IebDJr0Se34XB0g3J7bzr/i9QmEwEqnDJfWVob +v1Ugjy+1jzErlZBhm8hnCI+zPnrWKLk0n78vzJ5RrnVaTTV+OW5r4rdVZ86yKYHt +pVSoiJwEEwECAAYFAkLfbHkACgkQms08wKmfdd0HDQP8DDD+1FQU8PPPe+Kuf2bJ +OO7Ycrej4JF1I/Gbs2HH3xXgOZsRv6WJ41M/ovxJLYrpVqQA2YF/Gxwguwrf4lPk ++4spFdabguiJK0d2/KZAtnLsjIzdYcoY01IKGT3xkPwIDErNFSmxX6bKCUePcFNH +YZ6dDBHFFcYVTsdo/wbAe6aIRgQTEQIABgUCQt6wsgAKCRD9b4jGIdCnG30UAKDC +xsPZksKIcvj7tbHQEwm+PV5+DwCg7PorUCgIvTIWnID8zRWDBG4ACXaIRgQTEQIA +BgUCQt667QAKCRAyyeTONkLLS/d2AJwM7BQIQgqLA0qA75R2EjHFXQKZWACgo7ia +ANHxIRc/Nw19j8CxNbWJRJ6IRgQTEQIABgUCQt9sewAKCRBQjq7FMC2laIx3AJsF +0Hjrm4N21EwdrmhS9PHKQL2KdgCgjlus2GyuCzafgb9JHVhBDrhelkmIRgQTEQIA +BgUCQt9sfQAKCRDdumS6LDEtL7MWAKC6rQU6ZjSS6gVnwswutaqBwfwtvwCgv2mM +GJf2hnYVaNNqV5WIFAuycmOIRgQTEQIABgUCQuDJOwAKCRBc/Tf6zHjIk9TlAJ9d +bM2HowI5oD6hGSnADhI2dKfBrQCg4O9WtFiRzLqC1TgCAsbigqy+JDiIRgQTEQIA +BgUCQuDszAAKCRDJtabs4td0311pAJ9L3yUe7GUeDqMzd3WLWatclf7ruQCeOenA +9nhyKgHASeEK/ZXQXDDBW0uIRgQTEQIABgUCQuDtQAAKCRBbloAQ4E+aibNVAJ4w +nAfcA/rtUs3+Hu9nNn8ar/2Q5wCfe6W+k9yHjd7hZWnYHdnCkAZkOMeIRgQTEQIA +BgUCQuJibwAKCRBtmI0XhzFcMezQAKCnk+So0Anm4kLDwl+srHvIB7b6jACgqROB +N5MeEGXQm+Gan2VSt+nvTZ+IRgQTEQIABgUCQuNVwAAKCRATLknU5B7cflR0AKCT +AlfhPFwHPXnBo+5IROopwNQnsQCgh2vHS9VRZRt5I9isNDaNf1biCQmIRgQTEQIA +BgUCQuNk2wAKCRB1yqKj85s3UK9XAKCELi7ymxtLxdwYfdfV3dxd63mV2wCgjgaU +lQqFXjx5mXnRsgy4S6cS9yuIRgQQEQIABgUCQuRvFAAKCRCM43a4HNSGH5/sAJ9J +VHMVwBwHD8PN3DQq8hHEumn8twCfVQSXooNY2P744K+8k6lLO8nOH6GIRgQQEQIA +BgUCQuSSxwAKCRAEkTRC6hujjb+qAJ0Z+AoGDYe122wRAOYAKayl9f9e0QCeKeto +ll6NZ+Rm/NKbFJGP6fYywIuIRgQQEQIABgUCQuXCIAAKCRBhGWouMz5OhDd7AJ40 +l37cLZcSxfPt3M7/aOPgVGpa5wCfciaEynzuHDfIQD/vtXrZb2m0+NeIRgQQEQIA +BgUCQupj+AAKCRCyvrxAFSkkrwQsAJwM8IqtXQk/TBiQi6Fyq/HHm5/zvACg5atZ +V8F+r7jVRhT1SJ+FaVsaQDiIRgQTEQIABgUCQuPtagAKCRAyhk5BnIUiKwuyAJwO +ljL2++fVQ0BSKRvFSvS+fSu3KACeJxsOhbyCd3o3rqwaVeY5FFi+Fm+IRgQTEQIA +BgUCQuUQtwAKCRBSeS+vmXivhv0OAJ0Sg/UEnB/IAoqjHzKoBivCMYDtrQCfVY3I +DKRHbbLNfWBSDERWCTpHXtiIRgQTEQIABgUCQuURpQAKCRBrc6EGKmI/cqGBAKDE +gTewzt6TjmCkI9RrYjF46a9H4wCeJPh4bmTymcfwRGn60h0a9Mz1mKaIRgQTEQIA +BgUCQuaZYgAKCRBo64x2+OopZ3lEAJ9w4EWAgRUMxf0Ud1zoygYDQedAgQCeJPHS +bk62Ej11NljNGN1zdwzRHuSIRgQTEQIABgUCQudhVwAKCRBulHWUwVJDGkOfAKCg +QM+50dTktJDaDd8gVOGBKRiSIgCgkT9gdtDac0m9s2IHAqktk0mc0U+IRgQQEQIA +BgUCQ4efngAKCRBmNbbA3ohd05uvAKCjMnn4GpnZhjWFS7iN0LIXgxm5PwCfYodj +KF5zSbIROx79dJ41Gg0/VxW0KFN0ZWZhbiBCb2Rld2lnIDxzdGVmYW4uYm9kZXdp +Z0BlcG9zdC5kZT6IdwQwEQIANwUCQsVK6jAdIEkgbm8gbG9uZ2VyIGhhdmUgYWNj +ZXNzIHRvIHRoYXQgZW1haWwgYWRkcmVzcy4ACgkQohFa4V9ri3LW7wCdEc6hdCr0 +94a8LG+chTd+OzGxfFUAnR3FvtuG8sv367Knk0ybMnpOM/4hiEYEEBECAAYFAj53 +pBoACgkQFT+gzXWmdpL1ewCeOSe7lOufhc3mfTXs7eSvqECt89oAn0VM+YgQHbfd +Vp32YE7Ht6N6GPf0iJkEEwECAAYFAj513w8ACgkQPo+38viDQdkP7QPmPZXPi7m6 +wRiLofsTlHCbBrR+ehWoSSqCmHQjN1DGRtamGE6X8QbMIttD+NLp+uTx8j/E0sGU +dPnWkky6fwt1f3AYeoAgCXNvPoewsC6mZn3FMdEo6vJc43FmhsUfumOtunvGNBnX +dM8GSCJ+RBS/ASMjRrECF12/14xwgyyIVwQTEQIAFwUCPD7aNgULBwoDBAMVAwID +FgIBAheAAAoJEKIRWuFfa4tys/4AoND5QhEdyVIypBvCUHv5SCaAKcd/AKDFthtZ +TrjF+eEYlktPLRtI9zjeE4hGBBMRAgAGBQI+jc41AAoJEMppOXSBA6N+jAIAoIcA +eCIKt2QBPnAthnUk4DhlmM7FAKCA0Iz9ZutXGb2l+p8s7hhF3+Y9L4hGBBMRAgAG +BQI+ddrHAAoJEO7R6jkiYdBzi84AnRddvByuDodl5KaCSdpe6k9aYkLqAJoC/ud2 +8X0M478KlmacVVjb+PqzBIg/AwUQPnWqLv1viMYh0KcbEQJ6DwCff918LRigFUyE +vYj04C12so87JNUAn0RNFw+P1/SR9Mr/JQmOzJVhlwdriEYEEBECAAYFAkLFMoYA +CgkQm/IjRS/ii8+wZwCfRvfW6NyBoAp7oS9ILRHNYh2GbhsAnRYGs1hSaGK4rGxm +/fmqxj+DvqI2uQENBDsSIlQQBADNUpZLxCuTKzJ1tMm7b/XjAhvPYKiL3doAZ6XA +LBdLF/nQmlh1jcuRy93QWpPxtwSfPjcwJLHy+Uq5tC1SnH1YwYhviLG1KEsniUBr +oUmV2HJyHP92fFI3LPk3xbqxvLh1NXFpzSuWjGMA66sZqeEbtMy2B8OLRwQShdHI +BWgrIwADBQP+PWkmbg2mraaUmgTswre8CGArBgcV+WYm6yaq9IC1G4V1PXmlswms +DlsAr6UDdJU46GFZMIi2WmFJHarEkIBwFN44ypSLmiEVwKRJE2/CYO0f7zQHcF6G +USwQo2TxneahrZyHs7GdvpcRcfm0YnlC/H1CJ3pl8FpfHttzzIrIJviITgQYEQIA +BgUCOxIiVAASCRCiEVrhX2uLcgdlR1BHAAEBDTIAoJ3NtpI/E345LVOruElFKrnd +uWWXAJ9Adm9Mz4yoxrosHSkp5BWzXBUt4A== +=95C5 +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/C152431A 2005-07-18 [expires: 2010-07-17] +uid Steve Loughran +sig 3 C152431A 2005-07-18 Steve Loughran +sig 2 FC243F3C 2005-07-20 Henk P. Penning +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 8103A37E 2005-07-20 Andre Malo +sig 5793498F 2005-07-21 Tim Ellison +sig E4136392 2005-07-21 Noel J. Bergman +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 2261D073 2005-07-20 Astrid Kessler (Kess) +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 Christoph Probst +sig 3 2A623F72 2005-07-25 Christoph Probst +sig 3 F8EA2967 2005-07-26 Brian McCallister +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 152924AF 2005-07-29 Sander Temme +sig 3 87315C31 2005-07-23 Raphaël Luta +sub 2048g/59066D7B 2005-07-18 [expires: 2010-07-17] +sig C152431A 2005-07-18 Steve Loughran + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.2 (GNU/Linux) + +mQGiBELb2+oRBADhgEV29jhAMg4dFJN9fjeIjN7+J0Lj3rcLBWc5RTlM33DTOCFM +BCIE9B/RXJuVhGgi7fUuB+WsHz7XMgZRn+5nqIKGecIxwEUtZCfwsaV6Id3abt30 +wccyYDTSV95gQie+bbwWF44ao7n/CaR1WUU/Nx5b26nY2EzOrQcgP1qYEwCgynnc +NU1N3zd1cIYr5hQVqvdazKsEAMbYAm5WsjBlLBrolxs/smx4vxZYJaA3gUqTz9WY +D08rDsotVIMoosYF0b4b3WxcePJ68N1pkF3U+zo8bIZJThT91nAfMh29ZAcSyRqg +Mkd25OcrrjykeF7OavuFSwhvYoDdlwsvkuijHY3weXyhpjvzi+GzvZoONo3zSl4g +aWncA/4vu6k7XZUZ6B9DbJLJ4Xqq8uhD7uT4417uCQdozIWgKE4ThM2WffhV2IgY +W6IXg+o6AqY1qiMLSYYdeRsVkQ/GVss+sR++cbsO5ijDGfvlWPfGxIcA+P+alAwf +KY9M45IB8E92DUDru6ImrDHMeOrlDNPRusxRyZ4SiSJYNcgBtLQiU3RldmUgTG91 +Z2hyYW4gPHN0ZXZlbEBhcGFjaGUub3JnPohhBBMRAgAhBQJC29vqBQkJZgGABgsJ +CAcDAgMVAgMDFgIBAh4BAheAAAoJEG6UdZTBUkMaZugAnjJVyMa1FYEm/9811Whm +K06kGzXbAJ4rgRTBOcuyVbmbOAeYCgqloOxky4hGBBIRAgAGBQJC3rlGAAoJEIuW +KUP8JD88RewAn3LmpnmnLlYnlQW7+byITmKLO9gwAKCi0GGQz0QUq9tFG4YeF7Rp +UCl8ZIhGBBMRAgAGBQJC32y8AAoJEFCOrsUwLaVof1cAoLX3ROO9ufH+QXYlBuy6 +HA5SgofAAJ9aON/jC3WmrxT9Lz/DlIBKVI9TZohGBBMRAgAGBQJC32zBAAoJEN26 +ZLosMS0vCycAnjFhGc63FoWHwzpfVoocrBm8yQTHAJ47Kle1Tr+fBnlkYsAg0xY6 +12VZ9YhGBBMRAgAGBQJC4PEqAAoJEFuWgBDgT5qJY6IAnj2jxdReXh3eBRr+easP +bboH9Lu0AKCSoT0Gt+pM+G7XM8vQbZjsyjDhrohMBBARAgAMBQJC3t+3BYMJYv2z +AAoJEMppOXSBA6N+4VAAnRfGDGvU4qDop0EdApmHCExFDHFDAJ9/3xZDnJjEeSGr +l2JyOPJfbv/k0YhMBBARAgAMBQJC30/tBYMJYo19AAoJEEHqCaBXk0mPRKwAoI0M +FDyhr2PON57N4614Po16a9ZNAJ0SGKJtMOIxgoDHSf6SYuFy+8sBLYhMBBARAgAM +BQJC35MFBYMJYkplAAoJEAEFZrzkE2OSgcsAnjKv4POPmFUYhDGH+GCcxSyM9LPo +AJ0TPnoLf74lUroWD5+rlhTPD9eMHYhMBBARAgAMBQJC5HvtBYMJXWF9AAoJEIzj +drgc1IYfdCAAoIKybYLGd4yGE8NcrvnGaPSXx6NXAJ4zrIPA9tQu23tOHarZxSqg +7AWGh4hMBBARAgAMBQJC5JCBBYMJXUzpAAoJEASRNELqG6ONWZsAniJvvMiDR61N +rV5Y7xx/3/id/ekWAJ9MNUUQAXTES1dkywQVHVp6C8QFvohMBBMRAgAMBQJC3rR1 +BYMJYyj1AAoJEP1viMYh0Kcb26oAn2JuF355Lq6PIEvnhEr+SA3noxS8AJ9msBXz +nHsORsz8mB4WZ4DMAYEH0YhMBBMRAgAMBQJC3rvoBYMJYyGCAAoJEDLJ5M42QstL +Cu0An2vCOimm9iyRJekvlh7IcsrXVDksAJ9S1iVXBgyRuWBkbcuRk9OLs/TnwohM +BBMRAgAMBQJC3twlBYMJYwFFAAoJEO7R6jkiYdBz3gkAn3b48pHpjPG5DCbfp0oT +/WN9IqYlAJ47CLk2xg7e8N53WTmYfL+F/c/ZrohMBBMRAgAMBQJC4O0jBYMJYPBH +AAoJEMm1puzi13Tf+KgAnjviBj4kvC9ABiWR70t4BU3y8kgJAJ9qmj71qWjrek/L +Cb3+fAmlASx82IhMBBMRAgAMBQJC4O20BYMJYO+2AAoJEDf2j/UBWvyKJywAnjSC +smaB18utPgHthVW0qDQ+DDmNAJ9a64uKqcDI7u1cDEbi3nL5ELztCohMBBMRAgAM +BQJC41snBYMJXoJDAAoJEBMuSdTkHtx+SyUAn19MjVdnPdxKdiXjpMRWwOs5fhTL +AJ9AGh+TvyOt877cfLVaywPK+GhN0ohMBBMRAgAMBQJC42UQBYMJXnhaAAoJEHXK +oqPzmzdQe9gAoL7BugDd1NniX/ZNqs0aD7Y1uUfhAJ0b4p34ZYPWFg1CyUduwYlx +MAOqo4hMBBMRAgAMBQJC4+3gBYMJXe+KAAoJEDKGTkGchSIrHl8An0ERlWCCDHYy +0jlbsVcQ4FOS9qe6AJ4sLF02AltG01bK1kpvnKXxHFVYoIhMBBMRAgAMBQJC5RDw +BYMJXMx6AAoJEFJ5L6+ZeK+GWEkAoIl+GM1cgJosSMsMG0NqXog9yqeKAJ9aJ0Xr +j7JP5abRyjROroIUCUcc4ohMBBMRAgAMBQJC5RHdBYMJXMuNAAoJEGtzoQYqYj9y +IawAn3TzgRnJPfl4gg2kwIlJtD/a4ql5AJ43+Bbg3EWh2RVaLB7QpA1pAsRFB4hM +BBMRAgAMBQJC5pnVBYMJW0OVAAoJEGjrjHb46ilnWz8An1WpumoYARq3Le1VG0vu +SkQcdg8SAJ488MHNQRq2fyQFk9uIstWriQfa7YicBBMBAgAGBQJC32y2AAoJEJrN +PMCpn3Xdsl0D/j7J+/vobH/4+pmWCWv3okqBbbd9PH/NJTC3B7KU+p8bFdIIZWYh +n9SPXRdLoUlbKnqYw6+x0Ktn/9oWqwTM2b1bOHoMEUy/hPDM1ZK2gGDU11BFbfC4 +zkXowbq2xCHLyaQXqj5Wju01PT/wj8bw5A0E2rzv2iUA2ilXJE1vQdx+iKIEEwEC +AAwFAkLerQ0FgwljMF0ACgkQMaY9luwUC4H6jAP+L3lvntIdecj0QlnD4gTkdLn+ +nbOPT0G9MPSjA3ML9Bqeoh/uD2TeHS0dqb67DpIzhKV/zu6vrOhsXHXNiCjR4lxR +YHBg0PoxLJkggpjdAduk5vcM2ZgRJZQojsQ9CunxnmA/YCRCEEUPFeKj/5p1aFGm +uPsl2zwggHxbdOBY1maIogQTAQIADAUCQt7IywWDCWMUnwAKCRA34/Rf7mXjITNS +A/9YB8srHD2WbpZy5P/cN6WjPshYgx0lVFOifFdXgD4AUzgJ3VmtH1NI0Rkgadcw +8PdJYAynH/Hdz4PJ8wIEkmMFEe6TKB3BCjCGY8+Ti6R/VrlkizIGL0HzAUzNc+g2 +D1NI8725Idx+XNSOSBcOBZ3mwPVo1k67X1rF8BoYAeo8TohMBBARAgAMBQJC6mYn +BYMJV3dDAAoJELK+vEAVKSSv8BwAniQzr7l/ihVvAhvNUnpJzFWfr6tfAJ93Mama +D+Fz4kgEVjnO5j8MrM6JtIhMBBMRAgAMBQJC4mNBBYMJX3opAAoJEG2YjReHMVwx +Pr4AmQGWlApW3C1VbkuRgVs8pj6/ejXqAKC1z3D5mMpj83yyejnBjxDjXTLsUbkC +DQRC29vxEAgA05PNdXcVOSTsYuizTCbdBU9i3qUBkAyqPmDE6hkWI+7fnr8KAUUo +UghWwhxqBngpv48o3mE+bC+l/cTH+DuHIOsszpSK5ydufyitXi7piYk4RS+UNbyl +b4BU5qGodwWwXC9wKBIjXL5rK2KjKh4Ovh0WogtZ1fwc5NzQkjcfbner9WsAmjtd +nmVV2vZhJdDlxf3BBM9ai2R2IRvfhF61QFZcr2ehqAdsiDix8p0ugpC/oQS8h8pg +GQebz7aNeSjh/Vb3dsdo8CaLvHp1nM5aVCDRqoCfoeKUbRfwwwKxtc1cyYzOHD1f +KG9BuvtL4y4JQ/gDCsQVKdAAoiktu8Ks9wADBQf/fGkVYIh7w0+8xSIvez1DKirX +rl1J3XNvOYIa1qlBk65hllXnFXeXqoOLQpvygcwNRfil3AGcpwzwlNloem3ozjnt +IFvYJYzB6q4SMl1/a5uLrcc2frq8tbG0RhU+ZEhWR6sIEOBQhkKZ9LZbJ1tK9buJ +M0meaIt5gVLAVbI5vf+2Lvmlv0+E/a4Zn2exl1RcBYATNZT1gC55m0z5PMzG6Bc4 +tOAhPEo3WpfNjIrFeXcB0ksk4mfDIWKlA0mc8A+faKSSMdiDpeU4H4uZy5pE/hVv +2VyE3Ej5PoA3DajRzgQ69YlojTYnfnPyJErCBZhtZXTtRY7aDm9/xBT7FZ06RIhM +BBgRAgAMBQJC29vxBQkJZgGAAAoJEG6UdZTBUkMakjEAoINKV6yLAdbBhXhvMsqK +0N6XOghJAJ4mSgdwgv+sIOaPKQqCm+PL2M0lPw== +=4TlI +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/AA0077B0 2006-06-13 +uid Kev Jackson (apache key) +sig 3 AA0077B0 2006-06-13 Kev Jackson (apache key) +sub 2048g/8A6DD738 2006-06-13 +sig AA0077B0 2006-06-13 Kev Jackson (apache key) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.1 (Darwin) + +mQGiBESOfuoRBADiCLjvY8EG8cDrfNvPaVJr1/8d8GDoLjBCeJWl50M7j1IQDB+r +rzBPXOzhoqiNRbZMkpjv8ofa5hVOQitVS4B69FA07RbuiQNTKg142h8ogtJeAI1g +eXuTZtmGE47TOpj7FMG8bHOmoJdQMkzUsdOhEAyqRu4noknuuIKgsE1kYwCgnhaH +9KBlpKaRG7Bb2BH6da+wmKUEAIaBeZ1aSQodUzDqnGjCd4hZbpzjyWg7O5BylNhK +ogMY95BvwFRD8WFdSvhvH9VKBtSuNqg/6gIkqAljRRESVxL4QrzlYSqF513kK1ds +lUTmqU9Dvaf7dkH+MYnkPVTP5tMZVCT7HEt4F6HcqlaZKlz5jsu3R53KBx6XZATc +SEGbA/wOournJ64We8sXTJGHFupvSLBy3nh68mPLaplzTnH2al1DLBnoF2giC32v +ZGG+e12kWE+fyyQ3pdAIRHgVjZ/ckPmcmxnVcYrhzbgV99fo2+JRh2SVrLrmvw+G +CKiUtNHn0HS1klBKSj+3ML1AQQlbyfrcVSf0Fefug51BqoqU+rQqS2V2IEphY2tz +b24gKGFwYWNoZSBrZXkpIDxrZXZqQGFwYWNoZS5vcmc+iF4EExECAB4FAkSOfuoC +GwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQoL/5PaoAd7BnTACff9f8Y2RFB7O7 +Wjncyb1XbEwJB/gAninrR0isW9jGx49GmSnQCjtO9k34uQINBESOfzMQCACP+GP2 +x2nE2JxjUUjj16ftOxUivbL8L9ksplx41n7yeRvu+RzOXcjlonuld0LYxprNsHGv +mbAoZj93QozHQIMfC2kfnia+hxCcBPMbev9RPCqgogpb90BtV0f9HGyWXs2QTgWG +R2hyjq/RpwtA3obSXw3pb1CnXW4stV65WAdd72KDc66wRR1gmjxKQx6b1dGcC+E4 +HyOgu2CDtr1ULPeI5U4BA4y8FLgDfYwkxp6vj5ViegGP7GlMa3bSgNRGsYX7VwgZ +pmI8WY4B5k3/Pyv2Toe6/5zTmKH8WlyZd00ede/tbFTqQLg+EylAcWJ8c3asood+ +SjCwTuD8l8a0wpO3AAMHB/9GXkbBUE8cbMTaS4yj7UL5iWRVhSPo9IzMSrzaXmZN +8ykX96ud35BCEfmYgty3USMk90Rs/PbwB4Mh3h1ZTXqRWcfOXzJ8kMabm2RANyf2 +H2DvGKoFPtpX/9I13vo9qRLRHVRENNg+3JCa1ii8cq7h8bWvTT0VxX/rOG0cl8nO +XkHTUARR19cGPf6XkHEcl+u1pAxIJGqY/gVowjyFGZs+RXFl/q/Vrgu+lvvxmryd +yEdeGdsBvQ9M0KKr98w1RiJnDUkSqI711xwlVk14Uu6Xke0oB3bbpe4UxD52avAC +yEzYY7vbpe6XS2+dOcZxWE3eur6SfsucAkj4Ib72mchhiEkEGBECAAkFAkSOfzMC +GwwACgkQoL/5PaoAd7BQAwCeJFb9yZvOWfdf73A7t2MvPXn1y6kAnRquMmA5eVdh +HbAUXWyYuT2OHOSD +=F2q3 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/GameServer/ant/LICENSE b/GameServer/ant/LICENSE new file mode 100644 index 0000000..f820d4b --- /dev/null +++ b/GameServer/ant/LICENSE @@ -0,0 +1,203 @@ +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following + * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate + * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the + * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] [name of copyright owner] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/GameServer/ant/LICENSE.dom b/GameServer/ant/LICENSE.dom new file mode 100644 index 0000000..05013f1 --- /dev/null +++ b/GameServer/ant/LICENSE.dom @@ -0,0 +1,71 @@ +This license came from: +http://www.w3.org/Consortium/Legal/copyright-software-19980720 + + +W3C® SOFTWARE NOTICE AND LICENSE +Copyright © 1994-2001 World +Wide Web Consortium, World +Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related +items) is being provided by the copyright holders under the +following license. By obtaining, using and/or copying this work, +you (the licensee) agree that you have read, understood, and will +comply with the following terms and conditions: +Permission to use, copy, modify, and distribute this software +and its documentation, with or without modification,  for any +purpose and without fee or royalty is hereby granted, provided that +you include the following on ALL copies of the software and +documentation or portions thereof, including modifications, that +you make: + +The full text of this NOTICE in a location viewable to users of +the redistributed or derivative work. + +Any pre-existing intellectual property disclaimers, notices, or +terms and conditions. If none exist, a short notice of the +following form (hypertext is preferred, text is permitted) should +be used within the body of any redistributed or derivative code: +"Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/" + +Notice of any changes or modifications to the W3C files, +including the date changes were made. (We recommend you provide +URIs to the location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND +COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF +MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE +USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD +PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, +SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE +SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in +advertising or publicity pertaining to the software without +specific, written prior permission. Title to copyright in this +software and any associated documentation will at all times remain +with copyright holders. +____________________________________ +This formulation of W3C's notice and license became active on +August 14 1998 so as to improve compatibility with GPL. This +version ensures that W3C software licensing terms are no more +restrictive than GPL and consequently W3C software may be +distributed in GPL packages. See the older formulation for the +policy prior to this date. Please see our Copyright FAQ for common +questions about using materials from +our site, including specific terms and conditions for packages like +libwww, Amaya, and Jigsaw. +Other questions about this notice can be +directed to site-policy@w3.org. + +webmaster diff --git a/GameServer/ant/LICENSE.sax b/GameServer/ant/LICENSE.sax new file mode 100644 index 0000000..006c924 --- /dev/null +++ b/GameServer/ant/LICENSE.sax @@ -0,0 +1,20 @@ +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + + +This page is now out of date -- see the new SAX site at +http://www.saxproject.org/ for more up-to-date +releases and other information. Please change your bookmarks. + + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 \ No newline at end of file diff --git a/GameServer/ant/LICENSE.xerces b/GameServer/ant/LICENSE.xerces new file mode 100644 index 0000000..70cb54a --- /dev/null +++ b/GameServer/ant/LICENSE.xerces @@ -0,0 +1,56 @@ +/* + * The Apache Software License, Version 1.1 + * + * + * Copyright (c) 1999-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Xerces" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation and was + * originally based on software copyright (c) 1999, International + * Business Machines, Inc., http://www.ibm.com. For more + * information on the Apache Software Foundation, please see + * . + */ diff --git a/GameServer/ant/NOTICE b/GameServer/ant/NOTICE new file mode 100644 index 0000000..5ef72b9 --- /dev/null +++ b/GameServer/ant/NOTICE @@ -0,0 +1,20 @@ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Apache Ant distribution. == + ========================================================================= + + Apache Ant + Copyright 1999-2006 The Apache Software Foundation + + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + This product includes also software developed by : + - the W3C consortium (http://www.w3c.org) , + - the SAX project (http://www.saxproject.org) + + The task is based on code Copyright (c) 2002, Landmark + Graphics Corp that has been kindly donated to the Apache Software + Foundation. + diff --git a/GameServer/ant/README b/GameServer/ant/README new file mode 100644 index 0000000..263c111 --- /dev/null +++ b/GameServer/ant/README @@ -0,0 +1,70 @@ + + A N T + + + What is it? + ----------- + + Ant is a Java based build tool. In theory it is kind of like "make" + without makes wrinkles and with the full portability of pure java code. + + + Why? + ---- + + Why another build tool when there is already make, gnumake, nmake, jam, + and others? Because all of those tools have limitations that its original + author couldn't live with when developing software across multiple platforms. + + Make-like tools are inherently shell based. They evaluate a set of + dependencies and then execute commands not unlike what you would issue on a + shell. This means that you can easily extend these tools by using or writing + any program for the OS that you are working on. However, this also means that + you limit yourself to the OS, or at least the OS type such as Unix, that you + are working on. + + Makefiles are inherently evil as well. Anybody who has worked on them for any + time has run into the dreaded tab problem. "Is my command not executing + because I have a space in front of my tab!!!" said the original author of Ant + way too many times. Tools like Jam took care of this to a great degree, but + still use yet another format to use and remember. + + Ant is different. Instead a model where it is extended with shell based + commands, it is extended using Java classes. Instead of writing shell + commands, the configuration files are XML based calling out a target tree + where various tasks get executed. Each task is run by an object which + implements a particular Task interface. + + Granted, this removes some of the expressive power that is inherent by being + able to construct a shell command such as `find . -name foo -exec rm {}` but + it gives you the ability to be cross platform. To work anywhere and + everywhere. And hey, if you really need to execute a shell command, Ant has + an exec rule that allows different commands to be executed based on the OS + that it is executing on. + + The Latest Version + ------------------ + + Details of the latest version can be found on the Apache Ant + Project web site . + + + Documentation + ------------- + + Documentation is available in HTML format, in the docs/ directory. + For information about building and installing Ant, see + docs/manual/index.html + + + Licensing + --------- + + This software is licensed under the terms you may find in the file + named "LICENSE" in this directory. + + + Thanks for using Ant. + + The Apache Ant Project + diff --git a/GameServer/ant/WHATSNEW b/GameServer/ant/WHATSNEW new file mode 100644 index 0000000..3f37d82 --- /dev/null +++ b/GameServer/ant/WHATSNEW @@ -0,0 +1,3723 @@ +Changes from Ant 1.7.0 TO current SVN version +============================================= + +Changes that could break older environments: +------------------------------------------- + +Fixed bugs: +----------- + +Other changes: +-------------- + +Changes from Ant 1.6.5 to Ant 1.7.0 +=================================== + +Changes that could break older environments: +------------------------------------------- + +* Initial support for JDK 6 (JSR 223) scripting. + <*script*> tasks will now use javax.scripting if BSF is + not available, or if explicitly requested by using + a "manager" attribute. + +* The -noproxy option which was in the previous 1.7 alpha and beta + releases has been removed. It is the default behavior and not needed. + +* Removed launcher classes from nodeps jar. + +* filter reader uses ISO-8859-1 encoding to read + the java class file. Bugzilla report 33604. + +* Defer reference process. Bugzilla 36955, 34458, 37688. + This may break build files in which a reference was set in a target which was + never executed. Historically, Ant would set the reference early on, during parse + time, so the datatype would be defined. Now it requires the reference to have + been in a bit of the build file which was actually executed. If you get + an error about an undefined reference, locate the reference and move it somewhere + where it is used, or fix the depends attribute of the target in question to + depend on the target which defines the reference/datatype. + +* + + + + +

Class

+ + + + + +
+ +

Tests

+ + + + + + + + + +
+ + + + + + + + + + + + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
+

+ + <none> +

+
+ +

Classes

+ + + + + + + +
+ +
+ + +
+ + + + + + + All Unit Test Classes + + + + + +

Classes

+ + + + +
+ + +
+ + + + + + + + + / + .html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

Home

+

Packages

+ + + + +
+ + +
+ + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

Summary

+ + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + +
TestsFailuresErrorsSuccess rateTime
+ + + + + + + +
+ + + + +
+ Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
+ +

Packages

+ + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + +
+ + <none> + + + + +
+ + +
+ + + + + + + + + + + + open('package-frame.html','classListFrame') + +

Package

+ + + + + +

Classes

+

+ + + + + +
+

+
+ + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

Unit Test Results

+ + + + + +
Designed for use with JUnit and Ant.
+
+
+ + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

+ + + + + + + +
+ + + + + + + + + + + + +
+ +
+ + + + + + + + + + + diff --git a/GameServer/ant/etc/junit-frames.xsl b/GameServer/ant/etc/junit-frames.xsl new file mode 100644 index 0000000..94e4272 --- /dev/null +++ b/GameServer/ant/etc/junit-frames.xsl @@ -0,0 +1,875 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unit Test Results. + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} + + + + + + + + + + All Failures + + + All Errors + + + All Tests + + + + + Unit Test Results: <xsl:value-of select="$title"/> + + + + + + open('allclasses-frame.html','classListFrame') + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ + + + + + + . + + + Unit Test Results: <xsl:value-of select="$class.name"/> + + + + + + + + +

Class

+ + + + + +
+ + + +

Failures

+
+ +

Errors

+
+ +

Tests

+
+
+ + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + +
+ + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
+

+ + <none> +

+
+ +

Classes

+ + + + + + + +
+ +
+ + +
+ + + + + + + All Unit Test Classes + + + + + +

Classes

+ + + + +
+ + +
+ + + + + + + + + / + _.html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

Home

+

Packages

+ + + + +
+ + +
+ + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

Summary

+ + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + +
TestsFailuresErrorsSuccess rateTime
+ + + + + + + +
+ + + + +
+ Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
+ +

Packages

+ + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + +
+ + <none> + + + + +
+ + +
+ + + + + + + + + + + + open('package-frame.html','classListFrame') + +

Package

+ + + + + +

Classes

+

+ + + + + +
+

+
+ + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

Unit Test Results

+ + + + + +
Designed for use with JUnit and Ant.
+
+
+ + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + + + Class + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + + + + + + + + + + + + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/GameServer/ant/etc/junit-noframes.xsl b/GameServer/ant/etc/junit-noframes.xsl new file mode 100644 index 0000000..5e67587 --- /dev/null +++ b/GameServer/ant/etc/junit-noframes.xsl @@ -0,0 +1,464 @@ + + + + + + + + + + Unit Test Results + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + + +
+ + + + + + + + +

Packages

+ Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers. + + + + + + + + + + + + + + + + + Failure + Error + + + + + + + + + + + +
+ + + +
+
+ + + + + + + + + + + + +

Package

+ + + + + + +
+ Back to top +

+

+ + + + + + + + +

TestCase

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

+ + Back to top + + + + +

Summary

+ + + + + + + + + + + + + + + + + Failure + Error + + + + + + + + + +
TestsFailuresErrorsSuccess rateTime
+ + + + + + + +
+ + + + +
+ Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
+
+ + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + +

Unit Test Results

+ + + + + +
Designed for use with JUnit and Ant.
+
+
+ + + + Name + Tests + Errors + Failures + Time(s) + + + + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + Name + Status + Type + Time(s) + + + + + + + + + + + Failure + Error + + + + + + + + + + + + + + + + + + + + + + + Error + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + + +

+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/GameServer/ant/etc/log.xsl b/GameServer/ant/etc/log.xsl new file mode 100644 index 0000000..63e5729 --- /dev/null +++ b/GameServer/ant/etc/log.xsl @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + +
+ + http://jakarta.apache.org + + + Apache Ant +
+ + + +

+ + + + + +
+ + + + + + failed + complete + + + + + + + + + + + + + +
Build FailedBuild CompleteTotal Time:
+ +
+ See the stacktrace. +
+
+ + + + + +
ant.file
ant.version
java.version
os.name
+ +

Build events

+ + + + + + + +
targettaskmessage
+

+ + + +

Error details

+ + +
+
+
+ +

+
+ + + + + + + a + b + + + [ ] + + + + + + +
diff --git a/GameServer/ant/etc/maudit-frames.xsl b/GameServer/ant/etc/maudit-frames.xsl new file mode 100644 index 0000000..7ec32f2 --- /dev/null +++ b/GameServer/ant/etc/maudit-frames.xsl @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audit Results. + + + + + + + + + <H2>Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </P> + + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + + + + + + + + + + + + + + +

Class .

+ + + + +
+ +

Violations

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

+
+ +

Classes

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

Classes

+ + + + +
+ + +
+ + + + + + + + + + / + .html + + + + + + + + + + + + + + + + + +

Home

+

Packages

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

Summary

+ + + + + + + + + + + +
Audited classesReported classesViolations
+ + + + +
+ Note: Rules checked have originated from style guidelines suggested by the language designers, + experience from the Java development community and insite experience. Violations are generally + reported with a reference to the Java Language Specifications (JLS x.x.x) + and Metamata Audit rules (x.x). + Please consult these documents for additional information about violations. +

+ Rules checked also enforce adherence to Sun Java coding guidelines in use at Jakarta. +

+ One should note that these violations do not necessary underline errors but should be used + as an indication for possible errors. As always, use your best judgment and review + them carefully, it might save you hours of debugging. +

+ +

Packages

+ + + + + + + + + + +
+ + + +
+ + + + + + + + + + + + open('package-frame.html','classListFrame') + +

Package

+ + + + +

Classes

+ + + + + +
+
+ + + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + + + + + + + + + +
+ + http://jakarta.apache.org + +

Source Code Audit

Designed for use with Webgain QA/Metamata Audit and Ant.
+
+
+ + + + + + + + + + Name + Violations + + + + + + + Line + Message + + + + + + + + + + + + + + + + + + + + + + + + + a + b + + + + + diff --git a/GameServer/ant/etc/mmetrics-frames.xsl b/GameServer/ant/etc/mmetrics-frames.xsl new file mode 100644 index 0000000..effc184 --- /dev/null +++ b/GameServer/ant/etc/mmetrics-frames.xsl @@ -0,0 +1,1025 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + Metrics Results. + + + + + + + + + <H2>Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </P> + + + + + + + + + + + +

Metrics Reference

+V(G) | +LOC | +DIT | +NOA | +NRM | +NLM | +WMC | +RFC | +DAC | +FANOUT | +CBO | +LCOM | +NOC + + +

Cyclomatic Complexity - V(G)

+This metric was introduced in the 1970s to measure the amount of control +flow complexity or branching complexity in a module such as a +subroutine. It gives the number of paths that may be taken through the +code, and was initially developed to give some measure of the cost of +producing a test case for the module by executing each path. +

+Methods with a high cyclomatic complexity tend to be more difficult to +understand and maintain. In general the more complex the methods of an +application, the more difficult it will be to test it, and this will adversely +affect its reliability. +

+V(G) is a measure of the control flow complexity of a method or +constructor. It counts the number of branches in the body of the method, +defined as: +

    +
  • while statements;
  • +
  • if statements;
  • +
  • for statements.
  • +
+ +The metric can also be configured to count each case of a switch +statement as well. + +
+

Lines of Code - LOC

+ +This is perhaps the simplest of all the metrics to define and compute. +Counting lines has a long history as a software metric dating from before +the rise of structured programming, and it is still in widespread use today. +The size of a method affects the ease with which it can be understood, its +reusability and its maintainability. There are a variety of ways that the size +can be calculated. These include counting all the lines of code, the number +of statements, the blank lines of code, the lines of commentary, and the +lines consisting only of syntax such as block delimiters. +

+This metric can also be used for sizing other constructs as well, for +example, the overall size of a Java class or package can be measured by +counting the number of source lines it consists of. +

+LOC can be used to determine the size of a compilation unit (source file), +class or interface, method, constructor, or field. It can be configured to +ignore: +

    +
  • blank lines;
  • +
  • lines consisting only of comments;
  • +
  • lines consisting only of opening and closing braces.
  • +
+ +
+

Depth of Inheritance Hierarchy - DIT

+ +This metric calculates how far down the inheritance hierarchy a class is +declared. In Java all classes have java.lang.Object as their ultimate +superclass, which is defined to have a depth of 1. So a class that +immediately extends java.lang.Object has a metric value of 2; any of its +subclasses will have a value of 3, and so on. +

+A class that is deep within the tree inherits more methods and state +variables, thereby increasing its complexity and making it difficult to +predict its behavior. It can be harder to understand a system with many +inheritance layers. +

+DIT is defined for classes and interfaces: +

    +
  • all interface types have a depth of 1;
  • +
  • the class java.lang.Object has a depth of 1;
  • +
  • all other classes have a depth of 1 + the depth of their super class.
  • +
+ +
+

Number of Attributes - NOA

+ +The number of distinct state variables in a class serves as one measure of +its complexity. The more state a class represents the more difficult it is to +maintain invariants for it. It also hinders comprehensibility and reuse. +

+In Java, state can be exposed to subclasses through protected fields, which +entails that the subclass also be aware of and maintain any invariants. This +interference with the class's data encapsulation can be a source of defects +and hidden dependencies between the state variables. +

+NOA is defined for classes and interfaces. It counts the number of fields +declared in the class or interface. + + +

Number of Remote Methods - NRM

+ +NRM is defined for classes. A remote method call is defined as an +invocation of a method that is not declared in any of: +
    +
  • the class itself;
  • +
  • a class or interface that the class extends or implements;
  • +
  • a class or method that extends the class.
  • +
+ +The value is the count of all the remote method calls in all of the methods +and constructors of the class. + +
+

Number of Local Methods - NLM

+ +NLM is defined for classes and interfaces. A local method is defined as a +method that is declared in the class or interface. NLM can be configured to +include the local methods of all of the class's superclasses. Methods with +public, protected, package and private visibility can be independently +counted by setting configuration parameters. + +
+

Weighted Methods per Class - WMC

+ +If the number of methods in a class can be determined during the design +and modeling phase of a project, it can be used as a predictor of how +much time and effort is needed to develop, debug and maintain it. This +metric can be further refined by incorporating a weighting for the +complexity of each method. The usual weighting is given by the cyclomatic +complexity of the method. +

+The subclasses of a class inherit all of its public and protected methods, +and possibly its package methods as well, so the number of methods a +class has directly impacts the complexity of its subclasses. Classes with +large numbers of methods are often specific to a particular application, +reducing the ability to reuse them. +

+The definition of WMC is based upon NLM, and it provides the same +configuration parameters for counting inherited methods and of varying +visibility. The main difference is that NLM always counts each method as 1, +whereas WMC will weight each method. There are two weighting schemes: +

    +
  • V(G) the cyclomatic complexity of the method is used as its weight. + Methods from class files are given a V(G) of 1.
  • +
  • the arity, or the number of parameters of the method are used to + determine the weight.
  • +
+ +
+

Response For Class - RFC

+ +The response set of a class is the set of all methods that can be invoked as +a result of a message sent to an object of the class. This includes methods +in the class's inheritance hierarchy and methods that can be invoked on +other objects. The Response For Class metric is defined to be size of the +response set for the class. A class which provides a larger response set is +considered to be more complex than one with a smaller response set. +

+One reason for this is that if a method call on a class can result in a large +number of different method calls on the target and other classes, then it +can be harder to test the behavior of the class and debug problems. It will +typically require a deeper understanding of the potential interactions that +objects of the class can have with the rest of the system. +

+RFC is defined as the sum of NLM and NRM for the class. The local methods +include all of the public, protected, package and private methods, but not +methods declared only in a superclass. + + +

Data Abstraction Coupling - DAC

+ +DAC is defined for classes and interfaces. It counts the number of reference +types that are used in the field declarations of the class or interface. The +component types of arrays are also counted. Any field with a type that is +either a supertype or a subtype of the class is not counted. + + +

Fan Out - FANOUT

+ +FANOUT is defined for classes and interfaces, constructors and methods. It +counts the number of reference types that are used in: +
    +
  • field declarations;
  • +
  • formal parameters and return types;
  • +
  • throws declarations;
  • +
  • local variables.
  • +
+ +The component types of arrays are also counted. Any type that is either a +supertype or a subtype of the class is not counted. + +
+

Coupling Between Objects - CBO

+ +When one object or class uses another object or class they are said to be +coupled. One major source of coupling is that between a superclass and a +subclass. A coupling is also introduced when a method or field in another +class is accessed, or when an object of another class is passed into or out +of a method invocation. Coupling Between Objects is a measure of the +non-inheritance coupling between two objects. +

+A high value of coupling reduces the modularity of the class and makes +reuse more difficult. The more independent a class is the more likely it is +that it will be possible to reuse it in another part of the system. When a +class is coupled to another class it becomes sensitive to changes in that +class, thereby making maintenance for difficult. In addition, a class that is +overly dependent on other classes can be difficult to understand and test in +isolation. +

+CBO is defined for classes and interfaces, constructors and methods. It +counts the number of reference types that are used in: +

    +
  • field declarations
  • +
  • formal parameters and return types
  • +
  • throws declarations
  • +
  • local variables
  • +
+ +It also counts: +
    +
  • types from which field and method selections are made
  • +
+ +The component types of arrays are also counted. Any type that is either a +supertype or a subtype of the class is not counted. + +
+

Lack of Cohesion Of Methods - LCOM

+ +The cohesion of a class is the degree to which its methods are related to +each other. It is determined by examining the pattern of state variable +accesses within the set of methods. If all the methods access the same state +variables then they have high cohesion; if they access disjoint sets of +variables then the cohesion is low. An extreme example of low cohesion +would be if none of the methods accessed any of the state variables. + +If a class exhibits low method cohesion it indicates that the design of the +class has probably been partitioned incorrectly, and could benefit by being +split into more classes with individually higher cohesion. On the other +hand, a high value of cohesion (a low lack of cohesion) implies that the +class is well designed. A cohesive class will tend to provide a high degree +of encapsulation, whereas a lack of cohesion decreases encapsulation and +increases complexity. +

+Another form of cohesion that is useful for Java programs is cohesion +between nested and enclosing classes. A nested class that has very low +cohesion with its enclosing class would probably better designed as a peer +class rather than a nested class. +

+LCOM is defined for classes. Operationally, LCOM takes each pair of +methods in the class and determines the set of fields they each access. If +they have disjoint sets of field accesses increase the count P by one. If they +share at least one field access then increase Q by one. After considering +each pair of methods, +LCOM = (P > Q) ? (P - Q) : 0 +

+Indirect access to fields via local methods can be considered by setting a +metric configuration parameter. + + +

Number Of Classes - NOC

+ +The overall size of the system can be estimated by calculating the number +of classes it contains. A large system with more classes is more complex +than a smaller one because the number of potential interactions between +objects is higher. This reduces the comprehensibility of the system which +in turn makes it harder to test, debug and maintain. +

+If the number of classes in the system can be projected during the initial +design phase of the project it can serve as a base for estimating the total +effort and cost of developing, debugging and maintaining the system. +

+The NOC metric can also usefully be applied at the package and class level +as well as the total system. +

+NOCL is defined for class and interfaces. It counts the number of classes or +interfaces that are declared. This is usually 1, but nested class declarations +will increase this number. + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + .Error { + font-weight:bold; color:red; + } + + + + + + + + + + + + + + + + +

Class .

+ + + +
+ +

Methods

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

+
+ +

Classes

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

Classes

+ + + + + +
+ + +
+ + + + + + +
+ + + / + + .html + + + + + + + + + + + + + + + + +

Home

+

Packages

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

Summary

+ + + + + + + + + + + + + + + + + +
V(G)LOCDITNOANRMNLMWMCRFCDACFANOUTCBOLCOMNOCL
+ + + + +
+ Note: Metrics evaluate the quality of software by analyzing the program source and quantifying + various kind of complexity. Complexity is a common source of problems and defects in software. + High complexity makes it more difficult to develop, understand, maintain, extend, test and debug + a program. +

+ The primary use of metrics is to focus your attention on those parts of code that potentially are + complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial + actions. + For additional information about metrics and their meaning, please consult + Metamata Metrics manual. +

+ +

Packages

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

Package

+ + + + +
+ + + + + +
+ Note: Metrics evaluate the quality of software by analyzing the program source and quantifying + various kind of complexity. Complexity is a common source of problems and defects in software. + High complexity makes it more difficult to develop, understand, maintain, extend, test and debug + a program. +

+ The primary use of metrics is to focus your attention on those parts of code that potentially are + complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial + actions. + For additional information about metrics and their meaning, please consult + Metamata Metrics manual. +

+ + + +

Classes

+ + + + + + +
+
+ + + + +
+ + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + + + + + + + + + + +
+ + http://jakarta.apache.org + +

Source Code Metrics

Designed for use with Webgain QA/Metamata Metrics and Ant.
+
+
+ + + + + + + + + Name + V(G) + LOC + DIT + NOA + NRM + NLM + WMC + RFC + DAC + FANOUT + CBO + LCOM + NOCL + + + + + + + Name + V(G) + LOC + FANOUT + CBO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + + + + +
+ diff --git a/GameServer/ant/etc/tagdiff.xsl b/GameServer/ant/etc/tagdiff.xsl new file mode 100644 index 0000000..38e9366 --- /dev/null +++ b/GameServer/ant/etc/tagdiff.xsl @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + <xsl:value-of select="$title"/> + + + +

+ +

+ Tagdiff between and + +

Designed for use with Ant.

+
+ + + + + +
+ New Files | + Modified Files | + Removed Files +
+ + + New Files + New + + + + + Modified Files + Modified + + + + + + Removed Files + Removed + + +
+ + + +
+ + + + + + + + + + - entries + + (back to top) + + + + + + + +
    + +
+ + + + + + + + + + + + + + + + + + + + mailto: + + + + + + +
  • + + / + + + + + + + + /?rev=&content-type=text/x-cvsweb-markup + + + /?r1=&r2=&diff_format=h + + () + + +
  • +
    + + + + + + +
    diff --git a/GameServer/ant/fetch.xml b/GameServer/ant/fetch.xml new file mode 100644 index 0000000..a0cc2a9 --- /dev/null +++ b/GameServer/ant/fetch.xml @@ -0,0 +1,236 @@ + + + + + + + + This build file downloads JAR files that optional Ant tasks use, + and installs them in a location that is accessible the next time Ant runs. + + You can choose three locations, by going -Ddest=LOCATION on the command line + -Ddest=user user lib dir ${user.home}/.ant/lib + -Ddest=system ant lib dir ${ant.home}/lib --Default-- + -Ddest=optional optional dir ${ant.home}/lib/optional (for Ant developers) + + You may also need to set proxy settings. On Java1.5, Ant tries to get + this from the OS, unless you use the -noproxy option. + + Proxies can be configured manually setting the JVM proxy values in the + ANT_OPTS environment variable. + + For example, to set the proxy up in the tcsh shell, the command would be + something like: + + For csh/tcsh: + setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For bash: + export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For Windows, set the environment variable in the appropriate dialog box + and open a new console. or, by hand + set ANT_OPTS = -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080 + + + + + + + + + + + + + + + + + + + + + + + + + Unknown destination : ${dest} + Downloading to ${dest.dir} + + + + + + + + + + + + Unknown archive @{archive} -no property @{archive}.version defined. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GameServer/ant/get-m2.xml b/GameServer/ant/get-m2.xml new file mode 100644 index 0000000..4111e81 --- /dev/null +++ b/GameServer/ant/get-m2.xml @@ -0,0 +1,121 @@ + + + + + + + + This build file downloads the Maven2 Ant tasks, + and installs them in the location specified by the m2.dest.dir property. + + You may need to set proxy settings. On Java1.5, Ant tries to get + this from the OS, unless you use the -noproxy option. + + Proxies can be configured manually setting the JVM proxy values in the + ANT_OPTS environment variable. + + For example, to set the proxy up in the tcsh shell, the command would be + something like: + + For csh/tcsh: + setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For bash: + export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For Windows, set the environment variable in the appropriate dialog box + and open a new console. or, by hand + set ANT_OPTS = -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080 + + + + + + + + + + + + $${@{property}} not specified + + + + + + + + + + + + + + + + + + + Downloading to ${m2.dest.dir} + + + + + + + + + + + + + + + + + + Failed to verify the downloaded file ${m2.antlib.url}" against the checksum + coded into libraries.properties. + The local copy has been deleted, for security reasons + + + + + + + + + + diff --git a/GameServer/ant/lib/README b/GameServer/ant/lib/README new file mode 100644 index 0000000..a056be2 --- /dev/null +++ b/GameServer/ant/lib/README @@ -0,0 +1,15 @@ +Please refer to the Ant manual under Installing Ant / Library +Dependencies for a list of the jar requirements for various optional +tasks and features. + +This directory contains xercesImpl.jar from the 2.6.2 release of +Apache Xerces. For more information or newer releases see +. See the file LICENSE.xerces for +the terms of distribution. + +It also contains xml-apis.jar, an Apache-controlled collection of +standard classes from the 1.0b2 release of the Apache XML-Commons +release. For more information or newer releases see +. See the files LICENSE.dom and +LICENSE.sax for the terms of distribution. + diff --git a/GameServer/ant/lib/ant-1.7.0.pom b/GameServer/ant/lib/ant-1.7.0.pom new file mode 100644 index 0000000..7568229 --- /dev/null +++ b/GameServer/ant/lib/ant-1.7.0.pom @@ -0,0 +1,232 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant + 1.7.0 + org.apache.tools.ant + Apache Ant + + + org.apache.ant + ant-launcher + 1.7.0 + compile + + + + xerces + xercesImpl + 2.8.1 + true + runtime + + + + xml-apis + xml-apis + 1.3.03 + true + compile + + + + + ../../../../target/ant/.build.timestamp.properties + + + + org.apache.maven.plugins + maven-jar-plugin + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + delete-timestamp-file + clean + + run + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/** + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/types/optional/** + org/apache/tools/ant/types/resolver/** + org/apache/tools/ant/util/depend/** + org/apache/tools/ant/util/optional/** + org/apache/tools/ant/util/Script* + org/apache/tools/ant/listener/Log4jListener* + org/apache/tools/ant/listener/CommonsLoggingListener* + org/apache/tools/ant/util/regexp/JakartaRegexp* + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/util/regexp/Jdk14Regexp* + org/apache/tools/ant/taskdefs/email/MimeMailer* + org/apache/tools/ant/launch/** + + + org/apache/tools/ant/taskdefs/optional/** + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/types/optional/** + org/apache/tools/ant/types/resolver/** + org/apache/tools/ant/util/depend/** + org/apache/tools/ant/util/optional/** + org/apache/tools/ant/util/Script* + org/apache/tools/ant/listener/Log4jListener* + org/apache/tools/ant/listener/CommonsLoggingListener* + org/apache/tools/ant/util/regexp/JakartaRegexp* + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/util/regexp/Jdk14Regexp* + org/apache/tools/ant/taskdefs/email/MimeMailer* + org/apache/tools/ant/launch/** + org/apache/tools/ant/taskdefs/StyleTest* + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + ant.home + ${env.ANT_HOME} + + + build.tests + ../../../../target/ant/testcases + + + build.tests.value + ../../../../target/ant/testcases + + + offline + true + + + root + ../../../.. + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + + + ../../../../src/main + true + + org/apache/tools/ant/taskdefs/default.properties + org/apache/tools/ant/types/default.properties + org/apache/tools/ant/taskdefs/default.properties + org/apache/tools/ant/types/conditions/antlib.xml + org/apache/tools/ant/defaultManifest.mf + org/apache/tools/ant/version.txt + + + + ../../../../src/resources + true + + **/antlib.xml + + + + ../../../../docs + false + + images/ant_logo_large.gif + + + + + + ../../../../src/etc/testcases + true + + + ../../../../src/main + true + + **/*.java + + + + ../../../../src/main + ../../../../src/tests/junit + ../../../../target/ant/classes + ../../../../target/ant/testcases + ../../../../target/ant + + diff --git a/GameServer/ant/lib/ant-1.7.0.pom.md5 b/GameServer/ant/lib/ant-1.7.0.pom.md5 new file mode 100644 index 0000000..b283305 --- /dev/null +++ b/GameServer/ant/lib/ant-1.7.0.pom.md5 @@ -0,0 +1 @@ +0153222de881bd75a1a03c972966f98e diff --git a/GameServer/ant/lib/ant-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-1.7.0.pom.sha1 new file mode 100644 index 0000000..8dab3b2 --- /dev/null +++ b/GameServer/ant/lib/ant-1.7.0.pom.sha1 @@ -0,0 +1 @@ +6c896738d6345ed0812c34b4392867c210dad051 diff --git a/GameServer/ant/lib/ant-antlr-1.7.0.pom b/GameServer/ant/lib/ant-antlr-1.7.0.pom new file mode 100644 index 0000000..de25536 --- /dev/null +++ b/GameServer/ant/lib/ant-antlr-1.7.0.pom @@ -0,0 +1,75 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-antlr + 1.7.0 + antlr specific task. + The implementation forks a java process, therefore the antlr jar file is only needed at runtime + + + org.apache.ant + ant + 1.7.0 + true + compile + + + + antlr + antlr + 2.7.2 + true + runtime + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/ANTLR* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-antlr-1.7.0.pom.md5 b/GameServer/ant/lib/ant-antlr-1.7.0.pom.md5 new file mode 100644 index 0000000..df33dea --- /dev/null +++ b/GameServer/ant/lib/ant-antlr-1.7.0.pom.md5 @@ -0,0 +1 @@ +a63cde1195ea76b499847d8bf698edba diff --git a/GameServer/ant/lib/ant-antlr-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-antlr-1.7.0.pom.sha1 new file mode 100644 index 0000000..2c86b55 --- /dev/null +++ b/GameServer/ant/lib/ant-antlr-1.7.0.pom.sha1 @@ -0,0 +1 @@ +f51de13649550f94e9bc2f5a03b76dee3c7ecee9 diff --git a/GameServer/ant/lib/ant-antlr.jar b/GameServer/ant/lib/ant-antlr.jar new file mode 100644 index 0000000..5b127f9 Binary files /dev/null and b/GameServer/ant/lib/ant-antlr.jar differ diff --git a/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom b/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom new file mode 100644 index 0000000..9594149 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-bcel + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + bcel + bcel + 5.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/tfilters/util/JavaClassHelper* + org/apache/tools/ant/tutil/depend/bcel/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom.md5 b/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom.md5 new file mode 100644 index 0000000..d78ca81 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom.md5 @@ -0,0 +1 @@ +7cb4be931a57998d31b68098c5d6053e diff --git a/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom.sha1 new file mode 100644 index 0000000..1259110 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-bcel-1.7.0.pom.sha1 @@ -0,0 +1 @@ +d0e1e2a885a6faf18ef67bd0b9e7c21f5e4e41e7 diff --git a/GameServer/ant/lib/ant-apache-bcel.jar b/GameServer/ant/lib/ant-apache-bcel.jar new file mode 100644 index 0000000..cdc5202 Binary files /dev/null and b/GameServer/ant/lib/ant-apache-bcel.jar differ diff --git a/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom b/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom new file mode 100644 index 0000000..fbeb245 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom @@ -0,0 +1,74 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-bsf + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + bsf + bsf + 2.4.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/Script* + org/apache/tools/ant/taskdefs/optional/script/** + org/apache/tools/ant/types/optional/*Script* + org/apache/tools/ant/util/Script* + org/apache/tools/ant/util/optional/Script* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom.md5 b/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom.md5 new file mode 100644 index 0000000..3351b48 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom.md5 @@ -0,0 +1 @@ +0790d6a5f5bd6d64c3badaada94f5d29 diff --git a/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom.sha1 new file mode 100644 index 0000000..e3a76f0 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-bsf-1.7.0.pom.sha1 @@ -0,0 +1 @@ +397dfecef5f4f2842bf9c00e3485d9afe704d479 diff --git a/GameServer/ant/lib/ant-apache-bsf.jar b/GameServer/ant/lib/ant-apache-bsf.jar new file mode 100644 index 0000000..0ee68ac Binary files /dev/null and b/GameServer/ant/lib/ant-apache-bsf.jar differ diff --git a/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom b/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom new file mode 100644 index 0000000..87b5847 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom @@ -0,0 +1,69 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-log4j + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + log4j + log4j + 1.2.13 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/listener/Log4jListener* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom.md5 b/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom.md5 new file mode 100644 index 0000000..d6dc36b --- /dev/null +++ b/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom.md5 @@ -0,0 +1 @@ +dafe68897be94f720f07fd9d217ea6c3 diff --git a/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom.sha1 new file mode 100644 index 0000000..ef0581d --- /dev/null +++ b/GameServer/ant/lib/ant-apache-log4j-1.7.0.pom.sha1 @@ -0,0 +1 @@ +b459c5796ed619217152fb18b41c17725956cd0c diff --git a/GameServer/ant/lib/ant-apache-log4j.jar b/GameServer/ant/lib/ant-apache-log4j.jar new file mode 100644 index 0000000..4c9427e Binary files /dev/null and b/GameServer/ant/lib/ant-apache-log4j.jar differ diff --git a/GameServer/ant/lib/ant-apache-oro-1.7.0.pom b/GameServer/ant/lib/ant-apache-oro-1.7.0.pom new file mode 100644 index 0000000..695d170 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-oro-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-oro + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + oro + oro + 2.0.8 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/taskdefs/optional/perforce/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-apache-oro-1.7.0.pom.md5 b/GameServer/ant/lib/ant-apache-oro-1.7.0.pom.md5 new file mode 100644 index 0000000..41f746e --- /dev/null +++ b/GameServer/ant/lib/ant-apache-oro-1.7.0.pom.md5 @@ -0,0 +1 @@ +d6e74dbe99c21b5664894d42fd3d0a1a diff --git a/GameServer/ant/lib/ant-apache-oro-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-apache-oro-1.7.0.pom.sha1 new file mode 100644 index 0000000..4e4c59a --- /dev/null +++ b/GameServer/ant/lib/ant-apache-oro-1.7.0.pom.sha1 @@ -0,0 +1 @@ +2da5692988fb4f6c3eff3f7752889d280b930fb7 diff --git a/GameServer/ant/lib/ant-apache-oro.jar b/GameServer/ant/lib/ant-apache-oro.jar new file mode 100644 index 0000000..30013ba Binary files /dev/null and b/GameServer/ant/lib/ant-apache-oro.jar differ diff --git a/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom b/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom new file mode 100644 index 0000000..31f9ee8 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom @@ -0,0 +1,70 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-regexp + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + regexp + regexp + 1.3 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/util/regexp/JakartaRegexp* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom.md5 b/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom.md5 new file mode 100644 index 0000000..9de88d9 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom.md5 @@ -0,0 +1 @@ +5167f94dce6cc78ce5e2b39e37dee499 diff --git a/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom.sha1 new file mode 100644 index 0000000..dd71622 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-regexp-1.7.0.pom.sha1 @@ -0,0 +1 @@ +78dc4fee641b98ebdf085030dacd311c5217e2d9 diff --git a/GameServer/ant/lib/ant-apache-regexp.jar b/GameServer/ant/lib/ant-apache-regexp.jar new file mode 100644 index 0000000..a393a3c Binary files /dev/null and b/GameServer/ant/lib/ant-apache-regexp.jar differ diff --git a/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom b/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom new file mode 100644 index 0000000..4e81580 --- /dev/null +++ b/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom @@ -0,0 +1,69 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-resolver + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + xml-resolver + xml-resolver + 1.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/types/resolver/** + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom.md5 b/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom.md5 new file mode 100644 index 0000000..79c8a6b --- /dev/null +++ b/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom.md5 @@ -0,0 +1 @@ +22f74f57403ad26242704320476cdfd2 diff --git a/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom.sha1 new file mode 100644 index 0000000..f18421a --- /dev/null +++ b/GameServer/ant/lib/ant-apache-resolver-1.7.0.pom.sha1 @@ -0,0 +1 @@ +8c61f8b318cb70927513fe440fa178c396185936 diff --git a/GameServer/ant/lib/ant-apache-resolver.jar b/GameServer/ant/lib/ant-apache-resolver.jar new file mode 100644 index 0000000..119a41d Binary files /dev/null and b/GameServer/ant/lib/ant-apache-resolver.jar differ diff --git a/GameServer/ant/lib/ant-commons-logging-1.7.0.pom b/GameServer/ant/lib/ant-commons-logging-1.7.0.pom new file mode 100644 index 0000000..a205a67 --- /dev/null +++ b/GameServer/ant/lib/ant-commons-logging-1.7.0.pom @@ -0,0 +1,70 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-commons-logging + 1.7.0 + Ant Listener based on commons-logging + + + org.apache.ant + ant + 1.7.0 + compile + + + commons-logging + commons-logging-api + 1.0.4 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/tlistener/CommonsLoggingListener* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-commons-logging-1.7.0.pom.md5 b/GameServer/ant/lib/ant-commons-logging-1.7.0.pom.md5 new file mode 100644 index 0000000..90790be --- /dev/null +++ b/GameServer/ant/lib/ant-commons-logging-1.7.0.pom.md5 @@ -0,0 +1 @@ +aaed374c26114170486b2b60bf987739 diff --git a/GameServer/ant/lib/ant-commons-logging-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-commons-logging-1.7.0.pom.sha1 new file mode 100644 index 0000000..f89496a --- /dev/null +++ b/GameServer/ant/lib/ant-commons-logging-1.7.0.pom.sha1 @@ -0,0 +1 @@ +82e62a4be2cdfa80658762ecdd94dfb2fed0d0c6 diff --git a/GameServer/ant/lib/ant-commons-logging.jar b/GameServer/ant/lib/ant-commons-logging.jar new file mode 100644 index 0000000..fcba217 Binary files /dev/null and b/GameServer/ant/lib/ant-commons-logging.jar differ diff --git a/GameServer/ant/lib/ant-commons-net-1.7.0.pom b/GameServer/ant/lib/ant-commons-net-1.7.0.pom new file mode 100644 index 0000000..f39af19 --- /dev/null +++ b/GameServer/ant/lib/ant-commons-net-1.7.0.pom @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-commons-net + 1.7.0 + ftp, rexec and telnet tasks + + + org.apache.ant + ant + 1.7.0 + compile + + + commons-net + commons-net + 1.4.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/net/RExec* + org/apache/tools/ant/taskdefs/optional/net/TelnetTask* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-commons-net-1.7.0.pom.md5 b/GameServer/ant/lib/ant-commons-net-1.7.0.pom.md5 new file mode 100644 index 0000000..63645ee --- /dev/null +++ b/GameServer/ant/lib/ant-commons-net-1.7.0.pom.md5 @@ -0,0 +1 @@ +c3b3ef9357dc32edf675d2dc5b8fa8a5 diff --git a/GameServer/ant/lib/ant-commons-net-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-commons-net-1.7.0.pom.sha1 new file mode 100644 index 0000000..db9efc9 --- /dev/null +++ b/GameServer/ant/lib/ant-commons-net-1.7.0.pom.sha1 @@ -0,0 +1 @@ +092cc31ddab3cd550ed0a5b384baf97218c15d98 diff --git a/GameServer/ant/lib/ant-commons-net.jar b/GameServer/ant/lib/ant-commons-net.jar new file mode 100644 index 0000000..b490c96 Binary files /dev/null and b/GameServer/ant/lib/ant-commons-net.jar differ diff --git a/GameServer/ant/lib/ant-jai-1.7.0.pom b/GameServer/ant/lib/ant-jai-1.7.0.pom new file mode 100644 index 0000000..e8a3401 --- /dev/null +++ b/GameServer/ant/lib/ant-jai-1.7.0.pom @@ -0,0 +1,81 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jai + 1.7.0 + image task and corresponding types. + jai (Java Advanced Imaging) is not available in public Maven repositories, therefore the dependencies are included with a scope provided + the download URL is http://java.sun.com/products/java-media/jai/ + + + + org.apache.ant + ant + 1.7.0 + compile + + + javax.media + jai-core + 1.1.2_01 + provided + + + jai + jai-codec + 1.1.2.1 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/image/* + org/apache/tools/ant/types/optional/image/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-jai-1.7.0.pom.md5 b/GameServer/ant/lib/ant-jai-1.7.0.pom.md5 new file mode 100644 index 0000000..1421340 --- /dev/null +++ b/GameServer/ant/lib/ant-jai-1.7.0.pom.md5 @@ -0,0 +1 @@ +bfe805489b52e51ce3a929b916a7b780 diff --git a/GameServer/ant/lib/ant-jai-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-jai-1.7.0.pom.sha1 new file mode 100644 index 0000000..c879b76 --- /dev/null +++ b/GameServer/ant/lib/ant-jai-1.7.0.pom.sha1 @@ -0,0 +1 @@ +4e6db677ed9162d6546d5057046491b4454285ff diff --git a/GameServer/ant/lib/ant-jai.jar b/GameServer/ant/lib/ant-jai.jar new file mode 100644 index 0000000..26901f3 Binary files /dev/null and b/GameServer/ant/lib/ant-jai.jar differ diff --git a/GameServer/ant/lib/ant-javamail-1.7.0.pom b/GameServer/ant/lib/ant-javamail-1.7.0.pom new file mode 100644 index 0000000..0bf6bf6 --- /dev/null +++ b/GameServer/ant/lib/ant-javamail-1.7.0.pom @@ -0,0 +1,78 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-javamail + 1.7.0 + implementation of the mail task based on javamail. + Required to send emails to SMTP servers using user/password combinations + or to send mail over SSL + + + org.apache.ant + ant + 1.7.0 + compile + + + javax.mail + mail + 1.4 + compile + + + javax.activation + activation + 1.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/email/MimeMailer* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-javamail-1.7.0.pom.md5 b/GameServer/ant/lib/ant-javamail-1.7.0.pom.md5 new file mode 100644 index 0000000..06df7c9 --- /dev/null +++ b/GameServer/ant/lib/ant-javamail-1.7.0.pom.md5 @@ -0,0 +1 @@ +0678ec4770bd91b32f80b5fb457b7634 diff --git a/GameServer/ant/lib/ant-javamail-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-javamail-1.7.0.pom.sha1 new file mode 100644 index 0000000..2d57498 --- /dev/null +++ b/GameServer/ant/lib/ant-javamail-1.7.0.pom.sha1 @@ -0,0 +1 @@ +f8cebf57009c4d99a1bf2b5223015ed320baf1de diff --git a/GameServer/ant/lib/ant-javamail.jar b/GameServer/ant/lib/ant-javamail.jar new file mode 100644 index 0000000..8778e93 Binary files /dev/null and b/GameServer/ant/lib/ant-javamail.jar differ diff --git a/GameServer/ant/lib/ant-jdepend-1.7.0.pom b/GameServer/ant/lib/ant-jdepend-1.7.0.pom new file mode 100644 index 0000000..58ea8d7 --- /dev/null +++ b/GameServer/ant/lib/ant-jdepend-1.7.0.pom @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jdepend + 1.7.0 + task jdepend invoking the jdepend parser. There is also a version 2.9.1 of the + jdepend parser available on the maven repository + + + org.apache.ant + ant + 1.7.0 + compile + + + jdepend + jdepend + 2.7 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/jdepend/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-jdepend-1.7.0.pom.md5 b/GameServer/ant/lib/ant-jdepend-1.7.0.pom.md5 new file mode 100644 index 0000000..a20fcea --- /dev/null +++ b/GameServer/ant/lib/ant-jdepend-1.7.0.pom.md5 @@ -0,0 +1 @@ +064f0e995accca15150223c1a0ae8666 diff --git a/GameServer/ant/lib/ant-jdepend-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-jdepend-1.7.0.pom.sha1 new file mode 100644 index 0000000..dc98c2c --- /dev/null +++ b/GameServer/ant/lib/ant-jdepend-1.7.0.pom.sha1 @@ -0,0 +1 @@ +0277822a1cac5cdabccefcb0473b6d31c1780293 diff --git a/GameServer/ant/lib/ant-jdepend.jar b/GameServer/ant/lib/ant-jdepend.jar new file mode 100644 index 0000000..37cd86f Binary files /dev/null and b/GameServer/ant/lib/ant-jdepend.jar differ diff --git a/GameServer/ant/lib/ant-jmf-1.7.0.pom b/GameServer/ant/lib/ant-jmf-1.7.0.pom new file mode 100644 index 0000000..260cd42 --- /dev/null +++ b/GameServer/ant/lib/ant-jmf-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jmf + 1.7.0 + contains the sound task and a soundplayer listener + download the dependency from http://java.sun.com/products/java-media/jmf/ + + + org.apache.ant + ant + 1.7.0 + compile + + + javax.media + jmf + 2.1.1e + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/sound/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-jmf-1.7.0.pom.md5 b/GameServer/ant/lib/ant-jmf-1.7.0.pom.md5 new file mode 100644 index 0000000..c356de0 --- /dev/null +++ b/GameServer/ant/lib/ant-jmf-1.7.0.pom.md5 @@ -0,0 +1 @@ +ce526c923382726fc57f5f7afaa69952 diff --git a/GameServer/ant/lib/ant-jmf-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-jmf-1.7.0.pom.sha1 new file mode 100644 index 0000000..5fbf57a --- /dev/null +++ b/GameServer/ant/lib/ant-jmf-1.7.0.pom.sha1 @@ -0,0 +1 @@ +c50b01f6634863439f9877c607807f5ccaba4a41 diff --git a/GameServer/ant/lib/ant-jmf.jar b/GameServer/ant/lib/ant-jmf.jar new file mode 100644 index 0000000..036385c Binary files /dev/null and b/GameServer/ant/lib/ant-jmf.jar differ diff --git a/GameServer/ant/lib/ant-jsch-1.7.0.pom b/GameServer/ant/lib/ant-jsch-1.7.0.pom new file mode 100644 index 0000000..e9ab98b --- /dev/null +++ b/GameServer/ant/lib/ant-jsch-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jsch + 1.7.0 + contains the sshexec and scp tasks + jsch 0.1.29 might not be available from maven + + + org.apache.ant + ant + 1.7.0 + compile + + + com.jcraft + jsch + 0.1.29 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/ssh/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-jsch-1.7.0.pom.md5 b/GameServer/ant/lib/ant-jsch-1.7.0.pom.md5 new file mode 100644 index 0000000..2d442d7 --- /dev/null +++ b/GameServer/ant/lib/ant-jsch-1.7.0.pom.md5 @@ -0,0 +1 @@ +1c1fdd8639840ec7c3b2744248b1fe29 diff --git a/GameServer/ant/lib/ant-jsch-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-jsch-1.7.0.pom.sha1 new file mode 100644 index 0000000..9727ca8 --- /dev/null +++ b/GameServer/ant/lib/ant-jsch-1.7.0.pom.sha1 @@ -0,0 +1 @@ +7e57abd0e96480d055d19e7c2f80eaf5d0dbff84 diff --git a/GameServer/ant/lib/ant-jsch.jar b/GameServer/ant/lib/ant-jsch.jar new file mode 100644 index 0000000..5466269 Binary files /dev/null and b/GameServer/ant/lib/ant-jsch.jar differ diff --git a/GameServer/ant/lib/ant-junit-1.7.0.pom b/GameServer/ant/lib/ant-junit-1.7.0.pom new file mode 100644 index 0000000..d2671ff --- /dev/null +++ b/GameServer/ant/lib/ant-junit-1.7.0.pom @@ -0,0 +1,94 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-junit + 1.7.0 + contains the junit and junirreport tasks + + + org.apache.ant + ant + 1.7.0 + compile + + + junit + junit + 3.8.2 + compile + + + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/junit/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-junit-1.7.0.pom.md5 b/GameServer/ant/lib/ant-junit-1.7.0.pom.md5 new file mode 100644 index 0000000..703d2b5 --- /dev/null +++ b/GameServer/ant/lib/ant-junit-1.7.0.pom.md5 @@ -0,0 +1 @@ +6fbd6ebb8b953980060e31b66962fceb diff --git a/GameServer/ant/lib/ant-junit-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-junit-1.7.0.pom.sha1 new file mode 100644 index 0000000..7d12057 --- /dev/null +++ b/GameServer/ant/lib/ant-junit-1.7.0.pom.sha1 @@ -0,0 +1 @@ +d1145e0fe7d39ccfc85a434da5710c631622bec5 diff --git a/GameServer/ant/lib/ant-junit.jar b/GameServer/ant/lib/ant-junit.jar new file mode 100644 index 0000000..fa43fb2 Binary files /dev/null and b/GameServer/ant/lib/ant-junit.jar differ diff --git a/GameServer/ant/lib/ant-launcher-1.7.0.pom b/GameServer/ant/lib/ant-launcher-1.7.0.pom new file mode 100644 index 0000000..38e6f8c --- /dev/null +++ b/GameServer/ant/lib/ant-launcher-1.7.0.pom @@ -0,0 +1,57 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-launcher + 1.7.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/launch/*.java + + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/ant-launcher/classes + ../../../../target/ant-launcher/testcases + ../../../../target/ant-launcher + + diff --git a/GameServer/ant/lib/ant-launcher-1.7.0.pom.md5 b/GameServer/ant/lib/ant-launcher-1.7.0.pom.md5 new file mode 100644 index 0000000..58a85be --- /dev/null +++ b/GameServer/ant/lib/ant-launcher-1.7.0.pom.md5 @@ -0,0 +1 @@ +9715be71f950b5701fca1f863434373d diff --git a/GameServer/ant/lib/ant-launcher-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-launcher-1.7.0.pom.sha1 new file mode 100644 index 0000000..29428c1 --- /dev/null +++ b/GameServer/ant/lib/ant-launcher-1.7.0.pom.sha1 @@ -0,0 +1 @@ +d628e808d19cf5f6d78d4c67f22ffe99d9c19a2a diff --git a/GameServer/ant/lib/ant-launcher.jar b/GameServer/ant/lib/ant-launcher.jar new file mode 100644 index 0000000..12a1e78 Binary files /dev/null and b/GameServer/ant/lib/ant-launcher.jar differ diff --git a/GameServer/ant/lib/ant-netrexx-1.7.0.pom b/GameServer/ant/lib/ant-netrexx-1.7.0.pom new file mode 100644 index 0000000..b44117c --- /dev/null +++ b/GameServer/ant/lib/ant-netrexx-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-netrexx + 1.7.0 + NetRexxC task + dependency can be downloaded from http://www.ibm.com/software/awdtools/netrexx/download.html + + + org.apache.ant + ant + 1.7.0 + compile + + + com.ibm.netrexx + netrexx + 2.0.5 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/NetRexxC* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-netrexx-1.7.0.pom.md5 b/GameServer/ant/lib/ant-netrexx-1.7.0.pom.md5 new file mode 100644 index 0000000..d2e5580 --- /dev/null +++ b/GameServer/ant/lib/ant-netrexx-1.7.0.pom.md5 @@ -0,0 +1 @@ +706b06d9edf81848a94159e5543ba131 diff --git a/GameServer/ant/lib/ant-netrexx-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-netrexx-1.7.0.pom.sha1 new file mode 100644 index 0000000..06bfdcf --- /dev/null +++ b/GameServer/ant/lib/ant-netrexx-1.7.0.pom.sha1 @@ -0,0 +1 @@ +c70e518b904c44bf542136925e619a9b34eccd63 diff --git a/GameServer/ant/lib/ant-netrexx.jar b/GameServer/ant/lib/ant-netrexx.jar new file mode 100644 index 0000000..d646fd7 Binary files /dev/null and b/GameServer/ant/lib/ant-netrexx.jar differ diff --git a/GameServer/ant/lib/ant-nodeps-1.7.0.pom b/GameServer/ant/lib/ant-nodeps-1.7.0.pom new file mode 100644 index 0000000..7152167 --- /dev/null +++ b/GameServer/ant/lib/ant-nodeps-1.7.0.pom @@ -0,0 +1,120 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-nodeps + 1.7.0 + contains all the optional tasks and types which do not have particular dependencies + + + org.apache.ant + ant + 1.7.0 + compile + + + + xerces + xercesImpl + 2.8.1 + true + runtime + + + + xml-apis + xml-apis + 1.3.03 + true + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/** + org/apache/tools/ant/types/optional/** + org/apache/tools/ant/util/depend/* + org/apache/tools/ant/util/optional/** + org/apache/tools/ant/util/java15/** + org/apache/tools/ant/util/regexp/Jdk14Regexp* + + + org/apache/tools/ant/taskdefs/optional/TraXLiaison* + org/apache/tools/ant/taskdefs/optional/junit/** + org/apache/tools/ant/taskdefs/optional/perforce/** + org/apache/tools/ant/taskdefs/optional/Script* + org/apache/tools/ant/taskdefs/optional/script/** + org/apache/tools/ant/util/optional/Script* + org/apache/tools/ant/types/optional/*Script* + org/apache/tools/ant/taskdefs/optional/StyleBook* + org/apache/tools/ant/taskdefs/optional/NetRexxC* + org/apache/tools/ant/taskdefs/optional/ejb/Ejbc* + org/apache/tools/ant/taskdefs/optional/ejb/DDCreator* + org/apache/tools/ant/taskdefs/optional/ejb/WLRun* + org/apache/tools/ant/taskdefs/optional/ejb/WLStop* + org/apache/tools/ant/taskdefs/optional/net/Telnet* + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/net/RExec* + org/apache/tools/ant/taskdefs/optional/scm/AntStarTeam* + org/apache/tools/ant/taskdefs/optional/starteam/* + org/apache/tools/ant/taskdefs/optional/ANTLR* + org/apache/tools/ant/taskdefs/optional/sound/* + org/apache/tools/ant/taskdefs/optional/image/* + org/apache/tools/ant/types/optional/image/* + org/apache/tools/ant/taskdefs/optional/jdepend/* + org/apache/tools/ant/taskdefs/optional/splash/* + org/apache/tools/ant/taskdefs/optional/ssh/* + + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/ant-nodeps/classes + ../../../../target/ant-nodeps/testcases + ../../../../target/ant-nodeps + + diff --git a/GameServer/ant/lib/ant-nodeps-1.7.0.pom.md5 b/GameServer/ant/lib/ant-nodeps-1.7.0.pom.md5 new file mode 100644 index 0000000..5c27ad1 --- /dev/null +++ b/GameServer/ant/lib/ant-nodeps-1.7.0.pom.md5 @@ -0,0 +1 @@ +bffd32b045861eaa4da24c9a0dee5ddf diff --git a/GameServer/ant/lib/ant-nodeps-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-nodeps-1.7.0.pom.sha1 new file mode 100644 index 0000000..5ac2ddb --- /dev/null +++ b/GameServer/ant/lib/ant-nodeps-1.7.0.pom.sha1 @@ -0,0 +1 @@ +5396eb3c49af7294bcb7c64e21929281fd30a80f diff --git a/GameServer/ant/lib/ant-nodeps.jar b/GameServer/ant/lib/ant-nodeps.jar new file mode 100644 index 0000000..2d209fa Binary files /dev/null and b/GameServer/ant/lib/ant-nodeps.jar differ diff --git a/GameServer/ant/lib/ant-parent-1.7.0.pom b/GameServer/ant/lib/ant-parent-1.7.0.pom new file mode 100644 index 0000000..66b5265 --- /dev/null +++ b/GameServer/ant/lib/ant-parent-1.7.0.pom @@ -0,0 +1,111 @@ + + + + + 4.0.0 + org.apache.ant + ant-parent + 1.7.0 + pom + master POM + Apache Ant + http://ant.apache.org/ + 2000 + + Apache Software Foundation + + + + + dummy + Dummy to avoid accidental deploys + + + + + scm:svn:http://svn.apache.org/repos/asf/ant/core/trunk + scm:svn:https://svn.apache.org/repos/asf/jant/core/trunk + http://svn.apache.org/repos/asf/ant/core/trunk + + + + Ant Developers List + dev-subscribe@ant.apache.org + dev-unsubscribe@ant.apache.org + dev@ant.apache.org + http://mail-archives.apache.org/mod_mbox/ant-dev + + + Ant Users List + user-subscribe@ant.apache.org + user-unsubscribe@ant.apache.org + user@ant.apache.org + http://mail-archives.apache.org/mod_mbox/ant-user + + + + bugzilla + http://issues.apache.org/bugzilla/ + + + ant + ant-antlr + ant-apache-bcel + ant-apache-bsf + ant-apache-log4j + ant-apache-oro + ant-apache-regexp + ant-apache-resolver + ant-commons-logging + ant-commons-net + ant-jai + ant-javamail + ant-jdepend + ant-jmf + ant-jsch + ant-junit + ant-launcher + ant-netrexx + ant-nodeps + ant-starteam + ant-stylebook + ant-swing + ant-testutil + ant-trax + ant-weblogic + + + + junit + junit + 3.8.2 + test + + + + ../../../src/main + ../../../src/testcases + ../../../target/classes + ../../../target/testcases + + diff --git a/GameServer/ant/lib/ant-parent-1.7.0.pom.md5 b/GameServer/ant/lib/ant-parent-1.7.0.pom.md5 new file mode 100644 index 0000000..b4ad53d --- /dev/null +++ b/GameServer/ant/lib/ant-parent-1.7.0.pom.md5 @@ -0,0 +1 @@ +bbb2b5106cdfce3220529d77200085cc diff --git a/GameServer/ant/lib/ant-parent-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-parent-1.7.0.pom.sha1 new file mode 100644 index 0000000..0cfd06b --- /dev/null +++ b/GameServer/ant/lib/ant-parent-1.7.0.pom.sha1 @@ -0,0 +1 @@ +9d12c84639c58e88a028235eaad5b801f6ba03ec diff --git a/GameServer/ant/lib/ant-starteam-1.7.0.pom b/GameServer/ant/lib/ant-starteam-1.7.0.pom new file mode 100644 index 0000000..fa61f9d --- /dev/null +++ b/GameServer/ant/lib/ant-starteam-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-starteam + Starteam SDK tasks + + + org.apache.ant + ant + 1.7.0 + compile + + + com.starteam + starteam-sdk + 5.2 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/scm/AntStarTeam* + org/apache/tools/ant//taskdefs/optional/scm/starteam/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-starteam-1.7.0.pom.md5 b/GameServer/ant/lib/ant-starteam-1.7.0.pom.md5 new file mode 100644 index 0000000..5284981 --- /dev/null +++ b/GameServer/ant/lib/ant-starteam-1.7.0.pom.md5 @@ -0,0 +1 @@ +5ec8ae3d5a4cb08d9137b87306dff579 diff --git a/GameServer/ant/lib/ant-starteam-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-starteam-1.7.0.pom.sha1 new file mode 100644 index 0000000..6e8c22c --- /dev/null +++ b/GameServer/ant/lib/ant-starteam-1.7.0.pom.sha1 @@ -0,0 +1 @@ +0af55275712ec4bd9fe1264e4e861a38bca63c12 diff --git a/GameServer/ant/lib/ant-starteam.jar b/GameServer/ant/lib/ant-starteam.jar new file mode 100644 index 0000000..668b190 Binary files /dev/null and b/GameServer/ant/lib/ant-starteam.jar differ diff --git a/GameServer/ant/lib/ant-stylebook-1.7.0.pom b/GameServer/ant/lib/ant-stylebook-1.7.0.pom new file mode 100644 index 0000000..aa7199b --- /dev/null +++ b/GameServer/ant/lib/ant-stylebook-1.7.0.pom @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-stylebook + 1.7.0 + executes the Apache Stylebook document generator. Deprecated since Ant 1.7 + + + org.apache.ant + ant + 1.7.0 + compile + + + stylebook + stylebook + 1.0-b2 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/StyleBook* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/GameServer/ant/lib/ant-stylebook-1.7.0.pom.md5 b/GameServer/ant/lib/ant-stylebook-1.7.0.pom.md5 new file mode 100644 index 0000000..a0e3a3e --- /dev/null +++ b/GameServer/ant/lib/ant-stylebook-1.7.0.pom.md5 @@ -0,0 +1 @@ +2a18952408edd1bab40f2eb10774e438 diff --git a/GameServer/ant/lib/ant-stylebook-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-stylebook-1.7.0.pom.sha1 new file mode 100644 index 0000000..71b5d98 --- /dev/null +++ b/GameServer/ant/lib/ant-stylebook-1.7.0.pom.sha1 @@ -0,0 +1 @@ +f7a2e311ca577b9abbbd25d74cd6ca6a39dd47eb diff --git a/GameServer/ant/lib/ant-stylebook.jar b/GameServer/ant/lib/ant-stylebook.jar new file mode 100644 index 0000000..2d6ab23 Binary files /dev/null and b/GameServer/ant/lib/ant-stylebook.jar differ diff --git a/GameServer/ant/lib/ant-swing-1.7.0.pom b/GameServer/ant/lib/ant-swing-1.7.0.pom new file mode 100644 index 0000000..06fdc87 --- /dev/null +++ b/GameServer/ant/lib/ant-swing-1.7.0.pom @@ -0,0 +1,66 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-swing + 1.7.0 + a listener and a splash task based on Swing + + + org.apache.ant + ant + 1.7.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/splash/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/GameServer/ant/lib/ant-swing-1.7.0.pom.md5 b/GameServer/ant/lib/ant-swing-1.7.0.pom.md5 new file mode 100644 index 0000000..cd545a2 --- /dev/null +++ b/GameServer/ant/lib/ant-swing-1.7.0.pom.md5 @@ -0,0 +1 @@ +6c5b44c4ee4747f711c47471a1a55762 diff --git a/GameServer/ant/lib/ant-swing-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-swing-1.7.0.pom.sha1 new file mode 100644 index 0000000..ab1bf2c --- /dev/null +++ b/GameServer/ant/lib/ant-swing-1.7.0.pom.sha1 @@ -0,0 +1 @@ +7c034ad0657f2e68c558b6855b0176bd03b1340e diff --git a/GameServer/ant/lib/ant-swing.jar b/GameServer/ant/lib/ant-swing.jar new file mode 100644 index 0000000..60c3981 Binary files /dev/null and b/GameServer/ant/lib/ant-swing.jar differ diff --git a/GameServer/ant/lib/ant-testutil-1.7.0.pom b/GameServer/ant/lib/ant-testutil-1.7.0.pom new file mode 100644 index 0000000..47e69d1 --- /dev/null +++ b/GameServer/ant/lib/ant-testutil-1.7.0.pom @@ -0,0 +1,68 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-testutil + 1.7.0 + test utility classes + + + org.apache.ant + ant + 1.7.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/BuildFileTest* + org/apache/tools/ant/util/regexp/RegexpMatcherTest* + org/apache/tools/ant/util/regexp/RegexpTest* + org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest* + org/apache/tools/ant/types/AbstractFileSetTest* + + + + + ../../../../src/tests/junit + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId} + + + diff --git a/GameServer/ant/lib/ant-testutil-1.7.0.pom.md5 b/GameServer/ant/lib/ant-testutil-1.7.0.pom.md5 new file mode 100644 index 0000000..22eb900 --- /dev/null +++ b/GameServer/ant/lib/ant-testutil-1.7.0.pom.md5 @@ -0,0 +1 @@ +66eecd286a3b244e76e3f2cd4a615518 diff --git a/GameServer/ant/lib/ant-testutil-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-testutil-1.7.0.pom.sha1 new file mode 100644 index 0000000..c432d1f --- /dev/null +++ b/GameServer/ant/lib/ant-testutil-1.7.0.pom.sha1 @@ -0,0 +1 @@ +4d8064fed5bf7b73abe3173f17562512a6728f0b diff --git a/GameServer/ant/lib/ant-testutil.jar b/GameServer/ant/lib/ant-testutil.jar new file mode 100644 index 0000000..8ba443f Binary files /dev/null and b/GameServer/ant/lib/ant-testutil.jar differ diff --git a/GameServer/ant/lib/ant-trax-1.7.0.pom b/GameServer/ant/lib/ant-trax-1.7.0.pom new file mode 100644 index 0000000..4ae1425 --- /dev/null +++ b/GameServer/ant/lib/ant-trax-1.7.0.pom @@ -0,0 +1,94 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-trax + 1.7.0 + contains particularly one class necessary for the execution of the xslt task + + + org.apache.ant + ant + 1.7.0 + compile + + + + xerces + xercesImpl + 2.8.1 + true + runtime + + + + xml-apis + xml-apis + 1.3.03 + true + compile + + + + xalan + xalan + 2.7.0 + true + runtime + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/TraXLiaison* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-trax-1.7.0.pom.md5 b/GameServer/ant/lib/ant-trax-1.7.0.pom.md5 new file mode 100644 index 0000000..27c863d --- /dev/null +++ b/GameServer/ant/lib/ant-trax-1.7.0.pom.md5 @@ -0,0 +1 @@ +a1f676a843fa52b930ade7e2f95c81f0 diff --git a/GameServer/ant/lib/ant-trax-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-trax-1.7.0.pom.sha1 new file mode 100644 index 0000000..be2a502 --- /dev/null +++ b/GameServer/ant/lib/ant-trax-1.7.0.pom.sha1 @@ -0,0 +1 @@ +35696cfd509307b50145c430df713bc0df7c2c15 diff --git a/GameServer/ant/lib/ant-trax.jar b/GameServer/ant/lib/ant-trax.jar new file mode 100644 index 0000000..ef838ec Binary files /dev/null and b/GameServer/ant/lib/ant-trax.jar differ diff --git a/GameServer/ant/lib/ant-weblogic-1.7.0.pom b/GameServer/ant/lib/ant-weblogic-1.7.0.pom new file mode 100644 index 0000000..bce83bb --- /dev/null +++ b/GameServer/ant/lib/ant-weblogic-1.7.0.pom @@ -0,0 +1,79 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-weblogic + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + com.bea + weblogicclasses + 5.1 + provided + + + com.bea + weblogic + 8.1.3.0 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/ejb/Ejbc* + org/apache/tools/ant//taskdefs/optional/ejb/DDCreator* + org/apache/tools/ant//taskdefs/optional/ejb/WLRun* + org/apache/tools/ant//taskdefs/optional/ejb/WLStop* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/GameServer/ant/lib/ant-weblogic-1.7.0.pom.md5 b/GameServer/ant/lib/ant-weblogic-1.7.0.pom.md5 new file mode 100644 index 0000000..1c95d6d --- /dev/null +++ b/GameServer/ant/lib/ant-weblogic-1.7.0.pom.md5 @@ -0,0 +1 @@ +830bea6ea96362992a71a90306839d94 diff --git a/GameServer/ant/lib/ant-weblogic-1.7.0.pom.sha1 b/GameServer/ant/lib/ant-weblogic-1.7.0.pom.sha1 new file mode 100644 index 0000000..fb71221 --- /dev/null +++ b/GameServer/ant/lib/ant-weblogic-1.7.0.pom.sha1 @@ -0,0 +1 @@ +bc2c91f7b4700a00831538b0994fc34a20ab53b5 diff --git a/GameServer/ant/lib/ant-weblogic.jar b/GameServer/ant/lib/ant-weblogic.jar new file mode 100644 index 0000000..9f0de19 Binary files /dev/null and b/GameServer/ant/lib/ant-weblogic.jar differ diff --git a/GameServer/ant/lib/ant.jar b/GameServer/ant/lib/ant.jar new file mode 100644 index 0000000..0a56a58 Binary files /dev/null and b/GameServer/ant/lib/ant.jar differ diff --git a/GameServer/ant/lib/libraries.properties b/GameServer/ant/lib/libraries.properties new file mode 100644 index 0000000..40b21d5 --- /dev/null +++ b/GameServer/ant/lib/libraries.properties @@ -0,0 +1,46 @@ +#this file declares the libraries for use in +#a given release of the components + +#if you change this, change the checksum to match +m2.version=2.0.4 +m2.url=http://ibiblio.org/maven2/ +m2.artifact-name=maven-artifact-ant +m2.jar.name=${m2.artifact-name}-${m2.version}-dep.jar +#this is the URL of the antlib library, that is pulled down for everything else. +m2.antlib.url=${m2.url}/org/apache/maven/${m2.artifact-name}/${m2.version}/${m2.jar.name} +#this is the sha1 checksum of the artifact +m2.sha1.checksum=4e7ddfdb91600e9b59bb965ff8eef2f06015df50 + + +#versions of different libraries. Please keep in alphabetical order, except +#when a specific dependency forces them to be out-of-order +antlr.version=2.7.2 +bcel.version=5.1 +bsf.version=2.4.0 +bsh.version=2.0b4 +bsh-core.version=${bsh.version} +commons-net.version=1.4.0 +commons-logging.version=1.0.4 +commons-logging-api.version=${commons-logging.version} +jdepend.version=2.7 +jruby.version=0.8.3 +junit.version=3.8.2 +jsch.version=0.1.29 +jython.version=2.1 +log4j.version=1.2.13 +#js is the javascript implementation of the rhino project +js.version=1.6R3 +oro.version=2.0.8 +regexp.version=1.3 +which.version=1.0 +xerces.version=2.8.1 +xercesImpl.version=${xerces.version} +#should be in sync w/ xerces, but not in the maven repository +#xmlParserAPIs.version=${xerces.version} +xmlParserAPIs.version=2.6.1 +xalan.version=2.7.0 +xml-resolver.version=1.1 + +#paired +jacl.version=1.2.6 +tcljava.version=${jacl.version} diff --git a/GameServer/ant/lib/xercesImpl.jar b/GameServer/ant/lib/xercesImpl.jar new file mode 100644 index 0000000..3b351f6 Binary files /dev/null and b/GameServer/ant/lib/xercesImpl.jar differ diff --git a/GameServer/ant/lib/xml-apis.jar b/GameServer/ant/lib/xml-apis.jar new file mode 100644 index 0000000..b338fb6 Binary files /dev/null and b/GameServer/ant/lib/xml-apis.jar differ diff --git a/GameServer/build.xml b/GameServer/build.xml new file mode 100644 index 0000000..8a3ae73 --- /dev/null +++ b/GameServer/build.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GameServer/compile.bat b/GameServer/compile.bat new file mode 100644 index 0000000..86c209c --- /dev/null +++ b/GameServer/compile.bat @@ -0,0 +1,4 @@ +taskkill /F /IM java.exe +set PATH=%PATH%;ant\bin +ant +pause \ No newline at end of file diff --git a/GameServer/conf/ls/FPacketHandlers.xml b/GameServer/conf/ls/FPacketHandlers.xml new file mode 100644 index 0000000..fbede84 --- /dev/null +++ b/GameServer/conf/ls/FPacketHandlers.xml @@ -0,0 +1,38 @@ + + + + 1 + + msc.ls.packethandler.frontend.Logout + + + + 2 + + msc.ls.packethandler.frontend.Shutdown + + + + 3 + + msc.ls.packethandler.frontend.Update + + + + 5 + + msc.ls.packethandler.frontend.Global + + + + 6 + + msc.ls.packethandler.frontend.Alert + + + + 7 + + msc.ls.packethandler.frontend.ListPlayers + + \ No newline at end of file diff --git a/GameServer/conf/ls/LSPacketHandlers.xml b/GameServer/conf/ls/LSPacketHandlers.xml new file mode 100644 index 0000000..5cf1d12 --- /dev/null +++ b/GameServer/conf/ls/LSPacketHandlers.xml @@ -0,0 +1,92 @@ + + + + 1 + 2 + + msc.ls.packethandler.loginserver.RegisterWorld + + + + 3 + + msc.ls.packethandler.loginserver.KillHandler + + + + 4 + 5 + + msc.ls.packethandler.loginserver.BanHandler + + + + 6 + + msc.ls.packethandler.loginserver.PrivacySettingHandler + + + + 7 + + msc.ls.packethandler.loginserver.GameSettingHandler + + + + 8 + + msc.ls.packethandler.loginserver.PlayerInfoRequestHandler + + + + 9 + + msc.ls.packethandler.loginserver.SaveProfilesRequestHandler + + + + 10 + 11 + 12 + 13 + 14 + + msc.ls.packethandler.loginserver.FriendHandler + + + + 15 + + msc.ls.packethandler.loginserver.ReportHandler + + + + 20 + + msc.ls.packethandler.loginserver.PlayerSaveHandler + + + + 30 + + msc.ls.packethandler.loginserver.PlayerLogoutHandler + + + + 31 + + msc.ls.packethandler.loginserver.PlayerLoginHandler + + + + 32 + + msc.ls.packethandler.loginserver.LogHandler + + + + 33 + + msc.ls.packethandler.loginserver.Tradelog + + diff --git a/GameServer/conf/ls/aliases.xml b/GameServer/conf/ls/aliases.xml new file mode 100644 index 0000000..4ec4393 --- /dev/null +++ b/GameServer/conf/ls/aliases.xml @@ -0,0 +1,7 @@ + + + + + Stores aliases for the XStream engine + msc.ls.packethandler.PacketHandlerDef + diff --git a/GameServer/conf/server/Conf.xml b/GameServer/conf/server/Conf.xml new file mode 100644 index 0000000..1b756f9 --- /dev/null +++ b/GameServer/conf/server/Conf.xml @@ -0,0 +1,14 @@ + + + + RSCD Config + 27 + 208.110.86.234 + 43595 + msc + London + 800 + 1 + localhost + 34522 + diff --git a/GameServer/conf/server/LSPacketHandlers.xml b/GameServer/conf/server/LSPacketHandlers.xml new file mode 100644 index 0000000..2722701 --- /dev/null +++ b/GameServer/conf/server/LSPacketHandlers.xml @@ -0,0 +1,75 @@ + + + + 1 + + msc.gs.phandler.ls.StatRequestHandler + + + + 2 + + msc.gs.phandler.ls.PlayerListRequestHandler + + + + 3 + + msc.gs.phandler.ls.ShutdownHandler + + + + 4 + + msc.gs.phandler.ls.UpdateHandler + + + + 5 + + msc.gs.phandler.ls.GlobalHandler + + + + 6 + + msc.gs.phandler.ls.AlertHandler + + + + 7 + + msc.gs.phandler.ls.ForceLogout + + + + 8 + + msc.gs.phandler.ls.ReportInfoRequestHandler + + + + 9 + + msc.gs.phandler.ls.PlayerInfoRequestHandler + + + + 10 + + msc.gs.phandler.ls.ReceivePM + + + + 11 + + msc.gs.phandler.ls.FriendLogin + + + + 12 + 13 + + msc.gs.phandler.ls.FriendLogout + + \ No newline at end of file diff --git a/GameServer/conf/server/NpcHandlers.xml b/GameServer/conf/server/NpcHandlers.xml new file mode 100644 index 0000000..00f0a47 --- /dev/null +++ b/GameServer/conf/server/NpcHandlers.xml @@ -0,0 +1,173 @@ + + + + 95 + 224 + 268 + 485 + 540 + 617 + 792 + + msc.gs.npchandler.Bankers + + + + + 125 + + msc.gs.npchandler.Aggie + + + + 164 + + msc.gs.npchandler.Bananas + + + + 33 + + msc.gs.npchandler.Apothecary + + + + 172 + + msc.gs.npchandler.Tanner + + + + 90 + + msc.gs.npchandler.KebabSeller + + + + 339 + + msc.gs.npchandler.MakeOverMage + + + + 160 + + msc.gs.npchandler.Thrander + + + + 51 + 183 + 112 + + 55 + 56 + + 12 + 82 + 83 + 44 + 233 + 87 + 235 + 88 + 105 + 106 + 130 + 143 + 145 + 146 + 168 + 169 + 185 + 186 + 222 + 223 + 371 + 391 + 528 + 58 + 54 + 173 + 250 + 155 + 289 + 149 + 131 + 129 + 167 + 141 + 115 + 69 + 59 + 48 + 228 + 230 + 101 + 773 + 75 + 157 + 228 + 1 + 84 + 85 + 103 + 165 + 336 + 337 + 331 + 330 + 328 + 325 + 329 + 514 + 522 + 620 + 282 + 793 + 113 + 156 + 297 + 624 + 788 + 779 + 269 + + msc.gs.npchandler.ShopKeeper + + + + 225 + 226 + 227 + 466 + 467 + 299 + 778 + 341 + 369 + 370 + + 794 + 348 + 267 + 795 + 347 + + + msc.gs.npchandler.Certer + + + + 93 + + msc.gs.npchandler.MonkHealer + + + + + 212 + + msc.gs.npchandler.EntranaMonks + + diff --git a/GameServer/conf/server/PacketHandlers.xml b/GameServer/conf/server/PacketHandlers.xml new file mode 100644 index 0000000..bafada0 --- /dev/null +++ b/GameServer/conf/server/PacketHandlers.xml @@ -0,0 +1,286 @@ + + + + 0 + + msc.gs.phandler.client.DummyPacket + + + + 77 + + msc.gs.phandler.client.PlayerLogin + + + + 69 + + msc.gs.phandler.client.BotHandler + + + + 32 + + msc.gs.phandler.client.SessionRequest + + + + 129 + + msc.gs.phandler.client.PlayerLogoutRequest + + + + 39 + + msc.gs.phandler.client.PlayerLogout + + + + 5 + + msc.gs.phandler.client.Ping + + + + 3 + + msc.gs.phandler.client.Trap + + + + 246 + 132 + + msc.gs.phandler.client.WalkRequest + + + + 145 + + msc.gs.phandler.client.ChatHandler + + + + 176 + + msc.gs.phandler.client.PrivacySettingHandler + + + + 157 + + msc.gs.phandler.client.GameSettingHandler + + + + 147 + + msc.gs.phandler.client.DropHandler + + + + 56 + 248 + + msc.gs.phandler.client.PrayerHandler + + + + 90 + + msc.gs.phandler.client.CommandHandler + + + + 181 + 92 + + msc.gs.phandler.client.WieldHandler + + + + 83 + + msc.gs.phandler.client.PlayerAppearanceIDHandler + + + + 206 + 55 + 71 + 49 + 67 + 17 + 104 + 232 + + msc.gs.phandler.client.SpellHandler + + + + 218 + + msc.gs.phandler.client.PlayerAppearanceUpdater + + + + 166 + 211 + 216 + 70 + 53 + + msc.gs.phandler.client.TradeHandler + + + + 168 + 52 + 25 + 108 + 254 + + msc.gs.phandler.client.FriendHandler + + + + 89 + + msc.gs.phandler.client.InvActionHandler + + + + 16 + + msc.gs.phandler.client.InvUseOnPlayer + + + + 245 + + msc.gs.phandler.client.PickupItem + + + + 40 + 51 + + msc.gs.phandler.client.ObjectAction + + + + 235 + 126 + + msc.gs.phandler.client.WallObjectAction + + + + 7 + + msc.gs.phandler.client.ReportHandler + + + + 36 + 94 + + msc.gs.phandler.client.InvUseOnObject + + + + 57 + 73 + + msc.gs.phandler.client.AttackHandler + + + + 42 + + msc.gs.phandler.client.StyleHandler + + + + 177 + + msc.gs.phandler.client.TalkToNpcHandler + + + + 48 + 183 + 198 + + msc.gs.phandler.client.BankHandler + + + + 154 + + msc.gs.phandler.client.MenuReplyHandler + + + + 156 + + msc.gs.phandler.client.ExceptionHandler + + + + 34 + + msc.gs.phandler.client.InvUseOnGroundItem + + + + 27 + + msc.gs.phandler.client.InvUseOnItem + + + + 253 + 128 + 255 + + msc.gs.phandler.client.ShopHandler + + + + 142 + + msc.gs.phandler.client.InvUseOnNpc + + + + 68 + + msc.gs.phandler.client.FollowRequest + + + + 35 + 123 + 87 + 222 + 225 + 252 + + msc.gs.phandler.client.DuelHandler + + + + 74 + + msc.gs.phandler.client.NpcCommand + + + + 200 + + msc.gs.phandler.client.Sleepword + + + diff --git a/GameServer/conf/server/aliases.xml b/GameServer/conf/server/aliases.xml new file mode 100644 index 0000000..c3226ae --- /dev/null +++ b/GameServer/conf/server/aliases.xml @@ -0,0 +1,52 @@ + + + + + Stores aliases for the XStream engine + msc.gs.phandler.PacketHandlerDef + msc.gs.npchandler.NpcHandlerDef + + msc.gs.model.Point + msc.gs.model.TelePoint + + msc.gs.model.Shop + msc.gs.model.InvItem + + msc.gs.external.CerterDef + msc.gs.external.CertDef + + msc.gs.external.GameObjectLoc + msc.gs.external.ItemLoc + msc.gs.external.NPCLoc + + msc.gs.external.TileDef + msc.gs.external.GameObjectDef + msc.gs.external.DoorDef + msc.gs.external.ItemDef + msc.gs.external.PrayerDef + msc.gs.external.SpellDef + msc.gs.external.NPCDef + + msc.gs.external.ItemCraftingDef + msc.gs.external.ItemHerbSecond + msc.gs.external.ItemDartTipDef + msc.gs.external.ItemGemDef + msc.gs.external.ItemLogCutDef + msc.gs.external.ItemBowStringDef + msc.gs.external.ItemArrowHeadDef + msc.gs.external.FiremakingDef + msc.gs.external.ReqOreDef + msc.gs.external.ItemWieldableDef + msc.gs.external.ItemUnIdentHerbDef + msc.gs.external.ItemHerbDef + msc.gs.external.ItemCookingDef + msc.gs.external.ItemSmeltingDef + msc.gs.external.ItemSmithingDef + msc.gs.external.ObjectMiningDef + msc.gs.external.ObjectWoodcuttingDef + msc.gs.external.ObjectFishingDef + msc.gs.external.ObjectFishDef + msc.gs.external.ItemDropDef + msc.gs.external.AgilityDef + msc.gs.external.AgilityCourseDef + diff --git a/GameServer/conf/server/captcha/0/0.JPG b/GameServer/conf/server/captcha/0/0.JPG new file mode 100644 index 0000000..17b0501 Binary files /dev/null and b/GameServer/conf/server/captcha/0/0.JPG differ diff --git a/GameServer/conf/server/captcha/1/0.JPG b/GameServer/conf/server/captcha/1/0.JPG new file mode 100644 index 0000000..6f1831a Binary files /dev/null and b/GameServer/conf/server/captcha/1/0.JPG differ diff --git a/GameServer/conf/server/captcha/2/0.JPG b/GameServer/conf/server/captcha/2/0.JPG new file mode 100644 index 0000000..8b7601a Binary files /dev/null and b/GameServer/conf/server/captcha/2/0.JPG differ diff --git a/GameServer/conf/server/captcha/3/0.JPG b/GameServer/conf/server/captcha/3/0.JPG new file mode 100644 index 0000000..2a8c905 Binary files /dev/null and b/GameServer/conf/server/captcha/3/0.JPG differ diff --git a/GameServer/conf/server/captcha/4/0.JPG b/GameServer/conf/server/captcha/4/0.JPG new file mode 100644 index 0000000..c93ee00 Binary files /dev/null and b/GameServer/conf/server/captcha/4/0.JPG differ diff --git a/GameServer/conf/server/captcha/5/0.JPG b/GameServer/conf/server/captcha/5/0.JPG new file mode 100644 index 0000000..fbba56f Binary files /dev/null and b/GameServer/conf/server/captcha/5/0.JPG differ diff --git a/GameServer/conf/server/captcha/6/0.JPG b/GameServer/conf/server/captcha/6/0.JPG new file mode 100644 index 0000000..26c17fd Binary files /dev/null and b/GameServer/conf/server/captcha/6/0.JPG differ diff --git a/GameServer/conf/server/captcha/7/0.JPG b/GameServer/conf/server/captcha/7/0.JPG new file mode 100644 index 0000000..7a42b18 Binary files /dev/null and b/GameServer/conf/server/captcha/7/0.JPG differ diff --git a/GameServer/conf/server/captcha/8/0.JPG b/GameServer/conf/server/captcha/8/0.JPG new file mode 100644 index 0000000..7a75d5b Binary files /dev/null and b/GameServer/conf/server/captcha/8/0.JPG differ diff --git a/GameServer/conf/server/captcha/9/0.JPG b/GameServer/conf/server/captcha/9/0.JPG new file mode 100644 index 0000000..e1067e6 Binary files /dev/null and b/GameServer/conf/server/captcha/9/0.JPG differ diff --git a/GameServer/conf/server/captcha/a/0.JPG b/GameServer/conf/server/captcha/a/0.JPG new file mode 100644 index 0000000..3f4b3f3 Binary files /dev/null and b/GameServer/conf/server/captcha/a/0.JPG differ diff --git a/GameServer/conf/server/captcha/b/0.JPG b/GameServer/conf/server/captcha/b/0.JPG new file mode 100644 index 0000000..cb0085b Binary files /dev/null and b/GameServer/conf/server/captcha/b/0.JPG differ diff --git a/GameServer/conf/server/captcha/c/0.JPG b/GameServer/conf/server/captcha/c/0.JPG new file mode 100644 index 0000000..e0ae218 Binary files /dev/null and b/GameServer/conf/server/captcha/c/0.JPG differ diff --git a/GameServer/conf/server/captcha/d/0.JPG b/GameServer/conf/server/captcha/d/0.JPG new file mode 100644 index 0000000..5a92a04 Binary files /dev/null and b/GameServer/conf/server/captcha/d/0.JPG differ diff --git a/GameServer/conf/server/captcha/e/0.JPG b/GameServer/conf/server/captcha/e/0.JPG new file mode 100644 index 0000000..5691e0d Binary files /dev/null and b/GameServer/conf/server/captcha/e/0.JPG differ diff --git a/GameServer/conf/server/captcha/f/0.JPG b/GameServer/conf/server/captcha/f/0.JPG new file mode 100644 index 0000000..a2501f0 Binary files /dev/null and b/GameServer/conf/server/captcha/f/0.JPG differ diff --git a/GameServer/conf/server/captcha/g/0.JPG b/GameServer/conf/server/captcha/g/0.JPG new file mode 100644 index 0000000..73ab4ef Binary files /dev/null and b/GameServer/conf/server/captcha/g/0.JPG differ diff --git a/GameServer/conf/server/captcha/h/0.JPG b/GameServer/conf/server/captcha/h/0.JPG new file mode 100644 index 0000000..2ba28be Binary files /dev/null and b/GameServer/conf/server/captcha/h/0.JPG differ diff --git a/GameServer/conf/server/captcha/i/0.JPG b/GameServer/conf/server/captcha/i/0.JPG new file mode 100644 index 0000000..5eb58f3 Binary files /dev/null and b/GameServer/conf/server/captcha/i/0.JPG differ diff --git a/GameServer/conf/server/captcha/j/0.JPG b/GameServer/conf/server/captcha/j/0.JPG new file mode 100644 index 0000000..98ec27f Binary files /dev/null and b/GameServer/conf/server/captcha/j/0.JPG differ diff --git a/GameServer/conf/server/captcha/k/0.JPG b/GameServer/conf/server/captcha/k/0.JPG new file mode 100644 index 0000000..8de78cf Binary files /dev/null and b/GameServer/conf/server/captcha/k/0.JPG differ diff --git a/GameServer/conf/server/captcha/l/0.JPG b/GameServer/conf/server/captcha/l/0.JPG new file mode 100644 index 0000000..46725b8 Binary files /dev/null and b/GameServer/conf/server/captcha/l/0.JPG differ diff --git a/GameServer/conf/server/captcha/m/0.JPG b/GameServer/conf/server/captcha/m/0.JPG new file mode 100644 index 0000000..7a5ab9b Binary files /dev/null and b/GameServer/conf/server/captcha/m/0.JPG differ diff --git a/GameServer/conf/server/captcha/n/0.JPG b/GameServer/conf/server/captcha/n/0.JPG new file mode 100644 index 0000000..23ed082 Binary files /dev/null and b/GameServer/conf/server/captcha/n/0.JPG differ diff --git a/GameServer/conf/server/captcha/o/0.JPG b/GameServer/conf/server/captcha/o/0.JPG new file mode 100644 index 0000000..2960f8c Binary files /dev/null and b/GameServer/conf/server/captcha/o/0.JPG differ diff --git a/GameServer/conf/server/captcha/p/0.JPG b/GameServer/conf/server/captcha/p/0.JPG new file mode 100644 index 0000000..181bb4a Binary files /dev/null and b/GameServer/conf/server/captcha/p/0.JPG differ diff --git a/GameServer/conf/server/captcha/q/0.JPG b/GameServer/conf/server/captcha/q/0.JPG new file mode 100644 index 0000000..acf4991 Binary files /dev/null and b/GameServer/conf/server/captcha/q/0.JPG differ diff --git a/GameServer/conf/server/captcha/q/Thumbs.db b/GameServer/conf/server/captcha/q/Thumbs.db new file mode 100644 index 0000000..28e8eb0 Binary files /dev/null and b/GameServer/conf/server/captcha/q/Thumbs.db differ diff --git a/GameServer/conf/server/captcha/r/0.JPG b/GameServer/conf/server/captcha/r/0.JPG new file mode 100644 index 0000000..2359f7b Binary files /dev/null and b/GameServer/conf/server/captcha/r/0.JPG differ diff --git a/GameServer/conf/server/captcha/s/0.JPG b/GameServer/conf/server/captcha/s/0.JPG new file mode 100644 index 0000000..dbfc2c9 Binary files /dev/null and b/GameServer/conf/server/captcha/s/0.JPG differ diff --git a/GameServer/conf/server/captcha/t/0.JPG b/GameServer/conf/server/captcha/t/0.JPG new file mode 100644 index 0000000..58202bc Binary files /dev/null and b/GameServer/conf/server/captcha/t/0.JPG differ diff --git a/GameServer/conf/server/captcha/u/0.JPG b/GameServer/conf/server/captcha/u/0.JPG new file mode 100644 index 0000000..2bd454f Binary files /dev/null and b/GameServer/conf/server/captcha/u/0.JPG differ diff --git a/GameServer/conf/server/captcha/v/0.JPG b/GameServer/conf/server/captcha/v/0.JPG new file mode 100644 index 0000000..28b996e Binary files /dev/null and b/GameServer/conf/server/captcha/v/0.JPG differ diff --git a/GameServer/conf/server/captcha/w/0.JPG b/GameServer/conf/server/captcha/w/0.JPG new file mode 100644 index 0000000..053eb8b Binary files /dev/null and b/GameServer/conf/server/captcha/w/0.JPG differ diff --git a/GameServer/conf/server/captcha/x/0.JPG b/GameServer/conf/server/captcha/x/0.JPG new file mode 100644 index 0000000..9ccec38 Binary files /dev/null and b/GameServer/conf/server/captcha/x/0.JPG differ diff --git a/GameServer/conf/server/captcha/y/0.JPG b/GameServer/conf/server/captcha/y/0.JPG new file mode 100644 index 0000000..3b9f9dc Binary files /dev/null and b/GameServer/conf/server/captcha/y/0.JPG differ diff --git a/GameServer/conf/server/captcha/z/0.JPG b/GameServer/conf/server/captcha/z/0.JPG new file mode 100644 index 0000000..04e5ee7 Binary files /dev/null and b/GameServer/conf/server/captcha/z/0.JPG differ diff --git a/GameServer/conf/server/data/Landscape.rscd b/GameServer/conf/server/data/Landscape.rscd new file mode 100644 index 0000000..cb80d61 Binary files /dev/null and b/GameServer/conf/server/data/Landscape.rscd differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y48 b/GameServer/conf/server/data/Landscape/h0x55y48 new file mode 100644 index 0000000..a00f0e7 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y49 b/GameServer/conf/server/data/Landscape/h0x55y49 new file mode 100644 index 0000000..c1c15d8 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y50 b/GameServer/conf/server/data/Landscape/h0x55y50 new file mode 100644 index 0000000..afb9aa9 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y51 b/GameServer/conf/server/data/Landscape/h0x55y51 new file mode 100644 index 0000000..6fca678 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y52 b/GameServer/conf/server/data/Landscape/h0x55y52 new file mode 100644 index 0000000..1253262 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y53 b/GameServer/conf/server/data/Landscape/h0x55y53 new file mode 100644 index 0000000..ad03f02 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y54 b/GameServer/conf/server/data/Landscape/h0x55y54 new file mode 100644 index 0000000..ddffd0f Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y54 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y55 b/GameServer/conf/server/data/Landscape/h0x55y55 new file mode 100644 index 0000000..9997148 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y55 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y56 b/GameServer/conf/server/data/Landscape/h0x55y56 new file mode 100644 index 0000000..765cb57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y56 differ diff --git a/GameServer/conf/server/data/Landscape/h0x55y57 b/GameServer/conf/server/data/Landscape/h0x55y57 new file mode 100644 index 0000000..8f8d211 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x55y57 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y37 b/GameServer/conf/server/data/Landscape/h0x56y37 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y37 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y38 b/GameServer/conf/server/data/Landscape/h0x56y38 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y38 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y39 b/GameServer/conf/server/data/Landscape/h0x56y39 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y39 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y40 b/GameServer/conf/server/data/Landscape/h0x56y40 new file mode 100644 index 0000000..5e8b67d Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y40 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y41 b/GameServer/conf/server/data/Landscape/h0x56y41 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y41 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y42 b/GameServer/conf/server/data/Landscape/h0x56y42 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y42 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y43 b/GameServer/conf/server/data/Landscape/h0x56y43 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y43 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y44 b/GameServer/conf/server/data/Landscape/h0x56y44 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y44 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y45 b/GameServer/conf/server/data/Landscape/h0x56y45 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y45 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y46 b/GameServer/conf/server/data/Landscape/h0x56y46 new file mode 100644 index 0000000..b54ed93 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y46 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y47 b/GameServer/conf/server/data/Landscape/h0x56y47 new file mode 100644 index 0000000..5ca176c Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y47 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y48 b/GameServer/conf/server/data/Landscape/h0x56y48 new file mode 100644 index 0000000..2647b29 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y49 b/GameServer/conf/server/data/Landscape/h0x56y49 new file mode 100644 index 0000000..714dcce Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y50 b/GameServer/conf/server/data/Landscape/h0x56y50 new file mode 100644 index 0000000..89628d9 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y51 b/GameServer/conf/server/data/Landscape/h0x56y51 new file mode 100644 index 0000000..4347625 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y52 b/GameServer/conf/server/data/Landscape/h0x56y52 new file mode 100644 index 0000000..386b4f8 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y53 b/GameServer/conf/server/data/Landscape/h0x56y53 new file mode 100644 index 0000000..a3aa0eb Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y54 b/GameServer/conf/server/data/Landscape/h0x56y54 new file mode 100644 index 0000000..ed826d4 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y54 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y55 b/GameServer/conf/server/data/Landscape/h0x56y55 new file mode 100644 index 0000000..b07c713 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y55 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y56 b/GameServer/conf/server/data/Landscape/h0x56y56 new file mode 100644 index 0000000..765cb57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y56 differ diff --git a/GameServer/conf/server/data/Landscape/h0x56y57 b/GameServer/conf/server/data/Landscape/h0x56y57 new file mode 100644 index 0000000..8f8d211 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x56y57 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y37 b/GameServer/conf/server/data/Landscape/h0x57y37 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y37 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y38 b/GameServer/conf/server/data/Landscape/h0x57y38 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y38 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y39 b/GameServer/conf/server/data/Landscape/h0x57y39 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y39 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y40 b/GameServer/conf/server/data/Landscape/h0x57y40 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y40 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y41 b/GameServer/conf/server/data/Landscape/h0x57y41 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y41 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y42 b/GameServer/conf/server/data/Landscape/h0x57y42 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y42 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y43 b/GameServer/conf/server/data/Landscape/h0x57y43 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y43 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y44 b/GameServer/conf/server/data/Landscape/h0x57y44 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y44 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y45 b/GameServer/conf/server/data/Landscape/h0x57y45 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y45 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y46 b/GameServer/conf/server/data/Landscape/h0x57y46 new file mode 100644 index 0000000..7a1ece4 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y46 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y47 b/GameServer/conf/server/data/Landscape/h0x57y47 new file mode 100644 index 0000000..2332e5c Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y47 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y48 b/GameServer/conf/server/data/Landscape/h0x57y48 new file mode 100644 index 0000000..0b63873 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y49 b/GameServer/conf/server/data/Landscape/h0x57y49 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y50 b/GameServer/conf/server/data/Landscape/h0x57y50 new file mode 100644 index 0000000..70df625 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y51 b/GameServer/conf/server/data/Landscape/h0x57y51 new file mode 100644 index 0000000..66f0b14 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y52 b/GameServer/conf/server/data/Landscape/h0x57y52 new file mode 100644 index 0000000..d3ed75d Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y53 b/GameServer/conf/server/data/Landscape/h0x57y53 new file mode 100644 index 0000000..b07b13c Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y54 b/GameServer/conf/server/data/Landscape/h0x57y54 new file mode 100644 index 0000000..15262a4 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y54 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y55 b/GameServer/conf/server/data/Landscape/h0x57y55 new file mode 100644 index 0000000..82279cb Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y55 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y56 b/GameServer/conf/server/data/Landscape/h0x57y56 new file mode 100644 index 0000000..765cb57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y56 differ diff --git a/GameServer/conf/server/data/Landscape/h0x57y57 b/GameServer/conf/server/data/Landscape/h0x57y57 new file mode 100644 index 0000000..8f8d211 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x57y57 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y37 b/GameServer/conf/server/data/Landscape/h0x58y37 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y37 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y38 b/GameServer/conf/server/data/Landscape/h0x58y38 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y38 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y39 b/GameServer/conf/server/data/Landscape/h0x58y39 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y39 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y40 b/GameServer/conf/server/data/Landscape/h0x58y40 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y40 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y41 b/GameServer/conf/server/data/Landscape/h0x58y41 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y41 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y42 b/GameServer/conf/server/data/Landscape/h0x58y42 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y42 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y43 b/GameServer/conf/server/data/Landscape/h0x58y43 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y43 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y44 b/GameServer/conf/server/data/Landscape/h0x58y44 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y44 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y45 b/GameServer/conf/server/data/Landscape/h0x58y45 new file mode 100644 index 0000000..07f83b1 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y45 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y46 b/GameServer/conf/server/data/Landscape/h0x58y46 new file mode 100644 index 0000000..68ea307 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y46 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y47 b/GameServer/conf/server/data/Landscape/h0x58y47 new file mode 100644 index 0000000..a211112 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y47 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y48 b/GameServer/conf/server/data/Landscape/h0x58y48 new file mode 100644 index 0000000..5bb1a57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y49 b/GameServer/conf/server/data/Landscape/h0x58y49 new file mode 100644 index 0000000..7c76749 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y50 b/GameServer/conf/server/data/Landscape/h0x58y50 new file mode 100644 index 0000000..f8ff579 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y51 b/GameServer/conf/server/data/Landscape/h0x58y51 new file mode 100644 index 0000000..ed62274 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y52 b/GameServer/conf/server/data/Landscape/h0x58y52 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y53 b/GameServer/conf/server/data/Landscape/h0x58y53 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y54 b/GameServer/conf/server/data/Landscape/h0x58y54 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y54 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y55 b/GameServer/conf/server/data/Landscape/h0x58y55 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y55 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y56 b/GameServer/conf/server/data/Landscape/h0x58y56 new file mode 100644 index 0000000..765cb57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y56 differ diff --git a/GameServer/conf/server/data/Landscape/h0x58y57 b/GameServer/conf/server/data/Landscape/h0x58y57 new file mode 100644 index 0000000..8f8d211 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x58y57 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y37 b/GameServer/conf/server/data/Landscape/h0x59y37 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y37 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y38 b/GameServer/conf/server/data/Landscape/h0x59y38 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y38 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y39 b/GameServer/conf/server/data/Landscape/h0x59y39 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y39 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y40 b/GameServer/conf/server/data/Landscape/h0x59y40 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y40 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y41 b/GameServer/conf/server/data/Landscape/h0x59y41 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y41 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y42 b/GameServer/conf/server/data/Landscape/h0x59y42 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y42 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y43 b/GameServer/conf/server/data/Landscape/h0x59y43 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y43 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y44 b/GameServer/conf/server/data/Landscape/h0x59y44 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y44 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y45 b/GameServer/conf/server/data/Landscape/h0x59y45 new file mode 100644 index 0000000..bee2a01 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y45 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y46 b/GameServer/conf/server/data/Landscape/h0x59y46 new file mode 100644 index 0000000..922ab5c Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y46 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y47 b/GameServer/conf/server/data/Landscape/h0x59y47 new file mode 100644 index 0000000..37a8f76 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y47 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y48 b/GameServer/conf/server/data/Landscape/h0x59y48 new file mode 100644 index 0000000..fcfbbf4 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y49 b/GameServer/conf/server/data/Landscape/h0x59y49 new file mode 100644 index 0000000..c024a82 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y50 b/GameServer/conf/server/data/Landscape/h0x59y50 new file mode 100644 index 0000000..8a5fbb3 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y51 b/GameServer/conf/server/data/Landscape/h0x59y51 new file mode 100644 index 0000000..7eaa749 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y52 b/GameServer/conf/server/data/Landscape/h0x59y52 new file mode 100644 index 0000000..367d5f7 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y53 b/GameServer/conf/server/data/Landscape/h0x59y53 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y54 b/GameServer/conf/server/data/Landscape/h0x59y54 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y54 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y55 b/GameServer/conf/server/data/Landscape/h0x59y55 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y55 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y56 b/GameServer/conf/server/data/Landscape/h0x59y56 new file mode 100644 index 0000000..765cb57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y56 differ diff --git a/GameServer/conf/server/data/Landscape/h0x59y57 b/GameServer/conf/server/data/Landscape/h0x59y57 new file mode 100644 index 0000000..8f8d211 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x59y57 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y37 b/GameServer/conf/server/data/Landscape/h0x60y37 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y37 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y38 b/GameServer/conf/server/data/Landscape/h0x60y38 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y38 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y39 b/GameServer/conf/server/data/Landscape/h0x60y39 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y39 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y40 b/GameServer/conf/server/data/Landscape/h0x60y40 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y40 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y41 b/GameServer/conf/server/data/Landscape/h0x60y41 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y41 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y42 b/GameServer/conf/server/data/Landscape/h0x60y42 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y42 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y43 b/GameServer/conf/server/data/Landscape/h0x60y43 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y43 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y44 b/GameServer/conf/server/data/Landscape/h0x60y44 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y44 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y45 b/GameServer/conf/server/data/Landscape/h0x60y45 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y45 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y46 b/GameServer/conf/server/data/Landscape/h0x60y46 new file mode 100644 index 0000000..2728381 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y46 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y47 b/GameServer/conf/server/data/Landscape/h0x60y47 new file mode 100644 index 0000000..64527f5 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y47 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y48 b/GameServer/conf/server/data/Landscape/h0x60y48 new file mode 100644 index 0000000..a722185 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y49 b/GameServer/conf/server/data/Landscape/h0x60y49 new file mode 100644 index 0000000..f274a04 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y50 b/GameServer/conf/server/data/Landscape/h0x60y50 new file mode 100644 index 0000000..91eb613 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y51 b/GameServer/conf/server/data/Landscape/h0x60y51 new file mode 100644 index 0000000..0926812 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y52 b/GameServer/conf/server/data/Landscape/h0x60y52 new file mode 100644 index 0000000..453cb4f Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y53 b/GameServer/conf/server/data/Landscape/h0x60y53 new file mode 100644 index 0000000..61ed8b7 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y54 b/GameServer/conf/server/data/Landscape/h0x60y54 new file mode 100644 index 0000000..97af79f Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y54 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y55 b/GameServer/conf/server/data/Landscape/h0x60y55 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y55 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y56 b/GameServer/conf/server/data/Landscape/h0x60y56 new file mode 100644 index 0000000..765cb57 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y56 differ diff --git a/GameServer/conf/server/data/Landscape/h0x60y57 b/GameServer/conf/server/data/Landscape/h0x60y57 new file mode 100644 index 0000000..8f8d211 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x60y57 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y37 b/GameServer/conf/server/data/Landscape/h0x61y37 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y37 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y38 b/GameServer/conf/server/data/Landscape/h0x61y38 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y38 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y39 b/GameServer/conf/server/data/Landscape/h0x61y39 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y39 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y40 b/GameServer/conf/server/data/Landscape/h0x61y40 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y40 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y41 b/GameServer/conf/server/data/Landscape/h0x61y41 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y41 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y42 b/GameServer/conf/server/data/Landscape/h0x61y42 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y42 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y43 b/GameServer/conf/server/data/Landscape/h0x61y43 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y43 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y44 b/GameServer/conf/server/data/Landscape/h0x61y44 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y44 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y45 b/GameServer/conf/server/data/Landscape/h0x61y45 new file mode 100644 index 0000000..82367ae Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y45 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y46 b/GameServer/conf/server/data/Landscape/h0x61y46 new file mode 100644 index 0000000..8ee9988 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y46 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y47 b/GameServer/conf/server/data/Landscape/h0x61y47 new file mode 100644 index 0000000..2a32e13 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y47 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y48 b/GameServer/conf/server/data/Landscape/h0x61y48 new file mode 100644 index 0000000..4f6ad92 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y48 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y49 b/GameServer/conf/server/data/Landscape/h0x61y49 new file mode 100644 index 0000000..e9b7759 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y49 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y50 b/GameServer/conf/server/data/Landscape/h0x61y50 new file mode 100644 index 0000000..7a39e48 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y50 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y51 b/GameServer/conf/server/data/Landscape/h0x61y51 new file mode 100644 index 0000000..305261f Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y51 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y52 b/GameServer/conf/server/data/Landscape/h0x61y52 new file mode 100644 index 0000000..9b075d8 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y52 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y53 b/GameServer/conf/server/data/Landscape/h0x61y53 new file mode 100644 index 0000000..ce1c147 Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y53 differ diff --git a/GameServer/conf/server/data/Landscape/h0x61y54 b/GameServer/conf/server/data/Landscape/h0x61y54 new file mode 100644 index 0000000..3e3a21b Binary files /dev/null and b/GameServer/conf/server/data/Landscape/h0x61y54 differ diff --git a/GameServer/conf/server/defs/DoorDef.xml b/GameServer/conf/server/defs/DoorDef.xml new file mode 100644 index 0000000..73247d5 --- /dev/null +++ b/GameServer/conf/server/defs/DoorDef.xml @@ -0,0 +1,2356 @@ + + + Wall + + WalkTo + Examine + 192 + 2 + 2 + 1 + 0 + + + Doorframe + + WalkTo + Close + 192 + 4 + 4 + 0 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Window + + WalkTo + Examine + 192 + 5 + 5 + 1 + 0 + + + Fence + + WalkTo + Examine + 192 + 10 + 10 + 1 + 0 + + + railings + + WalkTo + Examine + 192 + 12 + 12 + 1 + 0 + + + Stained glass window + + WalkTo + Examine + 192 + 18 + 18 + 1 + 0 + + + Highwall + + WalkTo + Examine + 275 + 2 + 2 + 1 + 0 + + + Door + The door is shut + Open + Examine + 275 + 0 + 0 + 1 + 1 + + + Doorframe + + WalkTo + Close + 275 + 4 + 4 + 0 + 1 + + + battlement + + WalkTo + Examine + 70 + 2 + 2 + 1 + 0 + + + Doorframe + + WalkTo + Examine + 192 + 4 + 4 + 1 + 0 + + + snowwall + + WalkTo + Examine + 192 + -31711 + -31711 + 1 + 0 + + + arrowslit + + WalkTo + Examine + 192 + 7 + 7 + 1 + 0 + + + timberwall + + WalkTo + Examine + 192 + 21 + 21 + 1 + 0 + + + timberwindow + + WalkTo + Examine + 192 + 22 + 22 + 1 + 0 + + + blank + + WalkTo + Examine + 192 + 12345678 + 12345678 + 0 + 0 + + + highblank + + WalkTo + Examine + 275 + 12345678 + 12345678 + 0 + 0 + + + mossybricks + + WalkTo + Examine + 192 + 23 + 23 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Odd looking wall + This wall doesn't look quite right + Push + Examine + 192 + 2 + 2 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + web + A spider's web + WalkTo + Examine + 192 + 26 + 26 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Window + + WalkTo + Examine + 192 + 27 + 27 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Crumbled + + WalkTo + Examine + 192 + 28 + 28 + 1 + 0 + + + Cavern + + WalkTo + Examine + 192 + 29 + 29 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + cavern2 + + WalkTo + Examine + 192 + 30 + 30 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Wall + + WalkTo + Examine + 192 + 3 + 3 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Strange looking wall + This wall doesn't look quite right + Push + Examine + 192 + 29 + 29 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + memberrailings + + WalkTo + Examine + 192 + 12 + 12 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Magic Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Strange Panel + This wall doesn't look quite right + Push + Examine + 192 + 21 + 21 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + blockblank + + WalkTo + Examine + 192 + 12345678 + 12345678 + 1 + 0 + + + unusual looking wall + This wall doesn't look quite right + Push + Examine + 192 + 2 + 2 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick lock + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick lock + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick lock + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick lock + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick lock + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick Lock + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick lock + 192 + 0 + 0 + 1 + 1 + + + Fence with loose pannels + I wonder if I could get through this + push + Examine + 192 + 10 + 10 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + rat cage + The rat's have damaged the bars + search + Examine + 192 + 12 + 12 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + arrowslit + + WalkTo + Examine + 192 + 44 + 44 + 1 + 0 + + + solidblank + + WalkTo + Examine + 192 + 12345678 + 12345678 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + loose panel + The panel has worn with age + break + Examine + 192 + 3 + 3 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + plankswindow + + WalkTo + Examine + 192 + 45 + 45 + 1 + 0 + + + Low Fence + + WalkTo + Examine + 96 + 10 + 10 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Cooking pot + Smells good! + WalkTo + Examine + 96 + 10 + 10 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + plankstimber + + WalkTo + Examine + 192 + 46 + 46 + 1 + 0 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + magic portal + + enter + Examine + 192 + 17 + 17 + 1 + 1 + + + magic portal + + enter + Examine + 192 + 17 + 17 + 1 + 1 + + + magic portal + + enter + Examine + 192 + 17 + 17 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Cavern wall + It looks as if it is covered in some fungus. + WalkTo + search + 192 + 29 + 29 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + the door is shut + walk through + Examine + 192 + 3 + 3 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + walk through + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Door + The door is shut + Open + Pick Lock + 192 + 0 + 0 + 1 + 1 + + + Low wall + + jump + Examine + 70 + 2 + 2 + 1 + 1 + + + Low wall + + jump + Examine + 70 + 2 + 2 + 1 + 1 + + + Blacksmiths Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + railings + + pick lock + Examine + 192 + 12 + 12 + 1 + 1 + + + railings + + pick lock + Examine + 192 + 12 + 12 + 1 + 1 + + + railings + + pick lock + search + 192 + 12 + 12 + 1 + 1 + + + railings + + pick lock + search + 192 + 12 + 12 + 1 + 1 + + + railings + + pick lock + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + look through + 192 + 12 + 12 + 1 + 1 + + + Door + The door is shut + Open + knock on + 192 + 0 + 0 + 1 + 1 + + + Doorframe + + WalkTo + Close + 192 + 4 + 4 + 1 + 1 + + + Tent + + WalkTo + Examine + 192 + 36 + 36 + 1 + 0 + + + Jail Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Jail Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Window + A barred window + WalkTo + Search + 192 + 27 + 27 + 1 + 1 + + + magic portal + A magical barrier shimmers with power + WalkTo + Examine + 192 + 17 + 17 + 1 + 1 + + + Jail Door + A solid iron gate + Open + Examine + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + Cave exit + The way out + Leave + Examine + 192 + 26 + 26 + 0 + 1 + + + Cave exit + The way out + Leave + Examine + 192 + 26 + 26 + 0 + 1 + + + Cave exit + The way out + Leave + Examine + 192 + 26 + 26 + 0 + 1 + + + Cave exit + The way out + Leave + Examine + 192 + 26 + 26 + 0 + 1 + + + Cave exit + The way out + Leave + Examine + 192 + 26 + 26 + 0 + 1 + + + Cave exit + The way out + Leave + Examine + 192 + 26 + 26 + 0 + 1 + + + railings + + WalkTo + search + 192 + 12 + 12 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + battlement + This is blocking your path + Climb-over + Examine + 70 + 2 + 2 + 1 + 1 + + + Tent Door + An entrance into the tent + Go through + Examine + 192 + 50 + 50 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + + Tent Door + An entrance into the tent + Go through + Examine + 192 + 50 + 50 + 1 + 1 + + + Low Fence + A damaged wooden fence + search + Examine + 96 + 10 + 10 + 1 + 1 + + + Sturdy Iron Gate + A solid iron gate + Open + Examine + 192 + 12 + 12 + 1 + 1 + + + battlement + this low wall blocks your path + climb over + Examine + 70 + 2 + 2 + 1 + 1 + + + Water + My waterfall boundary! + WalkTo + Examine + 192 + 25 + 25 + 1 + 0 + + + Wheat + Test Boundary! + WalkTo + Examine + 192 + 24 + 24 + 1 + 0 + + + Jungle + Thick inpenetrable jungle + Chop + Examine + 192 + 8 + 8 + 1 + 1 + + + Window + you can see a vicious looking guard dog right outside + Investigate + Examine + 192 + 5 + 5 + 1 + 1 + + + Rut + Looks like a small rut carved into the ground. + WalkTo + Search + 96 + 51 + 51 + 1 + 0 + + + Crumbled Cavern 1 + + WalkTo + Examine + 192 + 52 + 52 + 0 + 0 + + + Crumbled Cavern 2 + + WalkTo + Examine + 192 + 53 + 53 + 0 + 0 + + + cavernhole + + WalkTo + Examine + 192 + 54 + 54 + 1 + 0 + + + flamewall + A supernatural fire of incredible intensity + Touch + Investigate + 192 + 54 + 54 + 1 + 1 + + + Ruined wall + Some ancient wall structure - it doesn't look too high. + WalkTo + Jump + 192 + 28 + 28 + 1 + 1 + + + Ancient Wall + An ancient - slightly higher wall with some strange markings on it + Use + Search + 275 + 2 + 2 + 1 + 1 + + + Door + The door is shut + Open + Examine + 192 + 0 + 0 + 1 + 1 + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/DoorDef.xml.gz b/GameServer/conf/server/defs/DoorDef.xml.gz new file mode 100644 index 0000000..21eef3e Binary files /dev/null and b/GameServer/conf/server/defs/DoorDef.xml.gz differ diff --git a/GameServer/conf/server/defs/GameObjectDef.xml b/GameServer/conf/server/defs/GameObjectDef.xml new file mode 100644 index 0000000..641b1a0 --- /dev/null +++ b/GameServer/conf/server/defs/GameObjectDef.xml @@ -0,0 +1,13092 @@ + + + Tree + A pointy tree + Chop + Examine + 1 + 1 + 1 + 0 + tree2 + + + Tree + A leafy tree + Chop + Examine + 1 + 1 + 1 + 0 + tree + + + Well + The bucket is missing + WalkTo + Examine + 1 + 2 + 2 + 0 + well + + + Table + A mighty fine table + WalkTo + Examine + 1 + 1 + 1 + 96 + table + + + Treestump + Someone has chopped this tree down! + WalkTo + Examine + 1 + 1 + 1 + 0 + treestump + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Chair + A sturdy looking chair + WalkTo + Examine + 1 + 1 + 1 + 0 + chair + + + logs + A pile of logs + WalkTo + Examine + 1 + 1 + 1 + 0 + logpile + + + Longtable + It has nice candles + WalkTo + Examine + 1 + 4 + 1 + 0 + longtable + + + Throne + It looks fancy and expensive + WalkTo + Examine + 1 + 1 + 1 + 0 + throne + + + Range + A hot well stoked range + WalkTo + Examine + 1 + 1 + 2 + 0 + range + + + Gravestone + R I P + WalkTo + Examine + 1 + 1 + 1 + 0 + gravestone1 + + + Gravestone + Its covered in moss + WalkTo + Examine + 1 + 1 + 1 + 0 + gravestone2 + + + Bed + Ooh nice blankets + rest + Examine + 1 + 2 + 3 + 0 + Bigbed + + + Bed + Its a bed - wow + rest + Examine + 1 + 2 + 2 + 0 + bed + + + bar + Mmm beer + WalkTo + Examine + 1 + 1 + 1 + 0 + barpumps + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Altar + Its an Altar + Recharge at + Examine + 1 + 2 + 1 + 0 + altar + + + Post + What am I examining posts for + WalkTo + Examine + 1 + 1 + 1 + 0 + wallpost + + + Support + A wooden pole + WalkTo + Examine + 0 + 1 + 1 + 0 + supportnw + + + barrel + Its empty + WalkTo + Examine + 1 + 1 + 1 + 0 + barrel + + + Bench + It doesn't look very comfy + WalkTo + Examine + 1 + 2 + 1 + 0 + bench + + + Portrait + A painting of our beloved king + WalkTo + Examine + 0 + 1 + 1 + 0 + portrait + + + candles + Candles on a fancy candlestick + WalkTo + Examine + 1 + 1 + 1 + 0 + candles + + + fountain + The water looks fairly clean + WalkTo + Examine + 1 + 2 + 2 + 0 + fountain + + + landscape + An oil painting + WalkTo + Examine + 0 + 1 + 1 + 0 + landscape + + + Millstones + You can use these to make flour + WalkTo + Examine + 1 + 3 + 3 + 0 + mill + + + Counter + It's the shop counter + WalkTo + Examine + 1 + 2 + 1 + 120 + counter + + + Stall + A market stall + WalkTo + Examine + 1 + 2 + 2 + 112 + market + + + Target + Coming soon archery practice + Practice + Examine + 1 + 1 + 1 + 0 + target + + + PalmTree + A nice palm tree + WalkTo + Examine + 1 + 1 + 1 + 0 + palm2 + + + PalmTree + A shady palm tree + WalkTo + Examine + 1 + 1 + 1 + 0 + palm + + + Fern + A leafy plant + WalkTo + Examine + 0 + 1 + 1 + 0 + fern + + + Cactus + It looks very spikey + WalkTo + Examine + 1 + 1 + 1 + 0 + cactus + + + Bullrushes + I wonder why it's called a bullrush + WalkTo + Examine + 0 + 1 + 1 + 0 + bullrushes + + + Flower + Ooh thats pretty + WalkTo + Examine + 0 + 1 + 1 + 0 + flower + + + Mushroom + I think it's a poisonous one + WalkTo + Examine + 0 + 1 + 1 + 0 + mushroom + + + Coffin + This coffin is closed + Open + Examine + 1 + 2 + 2 + 0 + coffin + + + Coffin + This coffin is open + Search + Close + 1 + 2 + 2 + 0 + coffin2 + + + stairs + These lead upstairs + Go up + Examine + 1 + 2 + 3 + 0 + woodenstairs + + + stairs + These lead downstairs + Go down + Examine + 1 + 2 + 3 + 0 + woodenstairsdown + + + stairs + These lead upstairs + Go up + Examine + 1 + 2 + 3 + 0 + stonestairs + + + stairs + These lead downstairs + Go down + Examine + 1 + 2 + 3 + 0 + stonestairsdown + + + railing + nice safety measure + WalkTo + Examine + 1 + 1 + 1 + 0 + woodenrailing + + + pillar + An ornate pillar + WalkTo + Examine + 1 + 1 + 1 + 0 + marblepillar + + + Bookcase + A large collection of books + WalkTo + Examine + 1 + 1 + 2 + 0 + bookcase + + + Sink + Its fairly dirty + WalkTo + Examine + 1 + 1 + 2 + 0 + sink + + + Dummy + I can practice my fighting here + hit + Examine + 1 + 1 + 1 + 0 + sworddummy + + + anvil + heavy metal + WalkTo + Examine + 1 + 1 + 1 + 0 + anvil + + + Torch + It would be very dark without this + WalkTo + Examine + 0 + 1 + 1 + 0 + torcha1 + + + hopper + You put grain in here + operate + Examine + 1 + 2 + 2 + 0 + milltop + + + chute + Flour comes out here + WalkTo + Examine + 1 + 2 + 2 + 40 + millbase + + + cart + A farm cart + WalkTo + Examine + 1 + 2 + 3 + 0 + cart + + + sacks + Yep they're sacks + WalkTo + Examine + 1 + 1 + 1 + 0 + sacks + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + Gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + The gate is open + WalkTo + close + 3 + 1 + 2 + 0 + metalgateopen + + + gate + The gate is open + WalkTo + close + 3 + 1 + 2 + 0 + woodengateopen + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + signpost + To Varrock + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + signpost + To the tower of wizards + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + doors + The doors are open + WalkTo + Close + 3 + 1 + 2 + 0 + doubledoorsopen + + + doors + The doors are shut + Open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + signpost + To player owned houses + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + signpost + To Lumbridge Castle + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + bookcase + It's a bookcase + WalkTo + Search + 1 + 1 + 2 + 0 + bookcase + + + henge + these look impressive + WalkTo + Examine + 1 + 2 + 2 + 0 + henge + + + Dolmen + A sort of ancient altar thingy + WalkTo + Examine + 1 + 2 + 2 + 0 + dolmen + + + Tree + This tree doesn't look too healthy + WalkTo + Chop + 1 + 1 + 1 + 0 + deadtree1 + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + Wheat + nice ripe looking wheat + WalkTo + pick + 0 + 1 + 1 + 0 + wheat + + + sign + The blue moon inn + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sails + The windmill's sails + WalkTo + Examine + 0 + 1 + 3 + 0 + windmillsail + + + sign + estate agent + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + The Jolly boar inn + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + Drain + This drainpipe runs from the kitchen to the sewers + WalkTo + Search + 0 + 1 + 1 + 0 + pipe&drain + + + manhole + A manhole cover + open + Examine + 0 + 1 + 1 + 0 + manholeclosed + + + manhole + How dangerous - this manhole has been left open + climb down + close + 0 + 1 + 1 + 0 + manholeopen + + + pipe + a dirty sewer pipe + WalkTo + Examine + 1 + 1 + 1 + 0 + wallpipe + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + barrel + It seems to be full of newt's eyes + WalkTo + Examine + 1 + 1 + 1 + 0 + barrel + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + fountain + I think I see something in the fountain + WalkTo + Search + 1 + 2 + 2 + 0 + fountain + + + signpost + To Draynor Manor + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Tree + This tree doesn't look too healthy + Approach + Search + 1 + 1 + 1 + 0 + deadtree1 + + + sign + General Store + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + Lowe's Archery store + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + The Clothes Shop + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + Varrock Swords + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + sign + Bob's axes + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + The staff shop + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + fire + A strongly burning fire + WalkTo + Examine + 0 + 1 + 1 + 0 + firea1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks2 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + copperrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + copperrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + ironrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + ironrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + tinrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + tinrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + mithrilrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + mithrilrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + adamiterock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + adamiterock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + coalrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + coalrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + goldrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + goldrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + clayrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + clayrock1 + + + web + A spider's web + WalkTo + Examine + 0 + 1 + 1 + 0 + ceilingweb + + + web + A spider's web + WalkTo + Examine + 0 + 1 + 1 + 0 + floorweb + + + furnace + A red hot furnace + WalkTo + Examine + 1 + 2 + 2 + 0 + furnace + + + Cook's Range + A hot well stoked range + WalkTo + Examine + 1 + 1 + 2 + 0 + range + + + Machine + I wonder what it's supposed to do + WalkTo + Examine + 1 + 2 + 2 + 0 + madmachine + + + Spinning wheel + I can spin wool on this + WalkTo + Examine + 1 + 1 + 1 + 0 + spinningwheel + + + Lever + The lever is up + WalkTo + Examine + 0 + 1 + 1 + 0 + leverup + + + Lever + The lever is down + WalkTo + Examine + 0 + 1 + 1 + 0 + leverdown + + + LeverA + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + LeverB + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + LeverC + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + LeverD + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + LeverE + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + LeverF + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + signpost + To the forge + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + signpost + To the Barbarian's Village + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + signpost + To Al Kharid + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Compost Heap + A smelly pile of compost + WalkTo + Search + 1 + 2 + 2 + 0 + compost + + + Coffin + This coffin is closed + Open + Examine + 1 + 2 + 2 + 0 + coffin + + + Coffin + This coffin is open + Search + Close + 1 + 2 + 2 + 0 + coffin2 + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + sign + The Bank of runescape + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + doors + The doors are shut + Open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + torch + A scary torch + WalkTo + Examine + 0 + 1 + 1 + 0 + skulltorcha1 + + + Altar + An altar to the evil God Zamorak + Recharge at + Examine + 1 + 2 + 1 + 0 + chaosaltar + + + Shield + A display shield + WalkTo + Examine + 0 + 1 + 1 + 0 + wallshield + + + Grill + some sort of ventilation + WalkTo + Examine + 0 + 1 + 1 + 0 + wallgrill + + + Cauldron + A very large pot + WalkTo + drink from + 1 + 1 + 1 + 0 + cauldron + + + Grill + some sort of ventilation + Listen + Examine + 0 + 1 + 1 + 0 + wallgrill + + + Mine Cart + It's empty + WalkTo + Examine + 1 + 1 + 1 + 0 + minecart + + + Buffers + Stop the carts falling off the end + WalkTo + Examine + 1 + 1 + 1 + 0 + trackbuffer + + + Track + Train track + WalkTo + Examine + 0 + 2 + 2 + 0 + trackcurve + + + Track + Train track + WalkTo + Examine + 0 + 2 + 2 + 0 + trackpoints + + + Track + Train track + WalkTo + Examine + 0 + 1 + 1 + 0 + trackstraight + + + Hole + I can see a witches cauldron directly below it + WalkTo + Examine + 1 + 1 + 1 + 0 + hole + + + ship + A ship to Karamja + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A ship to Karamja + board + Examine + 0 + 2 + 3 + 0 + Shipmiddle + + + ship + A ship to Karamja + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Emergency escape ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + sign + Wydin's grocery + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + The Rusty Anchor + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + ship + A ship to Port Sarim + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A ship to Port Sarim + board + Examine + 0 + 2 + 3 + 0 + Shipmiddle + + + ship + A ship to Port Sarim + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + hopper + You put grain in here + operate + Examine + 1 + 2 + 2 + 0 + milltop + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + bluriterock1 + + + Doric's anvil + Property of Doric the dwarf + WalkTo + Examine + 1 + 1 + 1 + 0 + anvil + + + pottery oven + I can fire clay pots in this + WalkTo + Examine + 1 + 2 + 2 + 0 + potteryoven + + + potter's wheel + I can make clay pots using this + WalkTo + Examine + 1 + 1 + 1 + 0 + potterywheel + + + gate + A gate from Lumbridge to Al Kharid + Open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + This gate is open + WalkTo + Examine + 2 + 1 + 2 + 0 + metalgateopen + + + crate + A crate used for storing bananas + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + Banana tree + A tree with nice ripe bananas growing on it + WalkTo + Pick Banana + 1 + 1 + 1 + 0 + palm2 + + + Banana tree + There are no bananas left on the tree + WalkTo + Pick Banana + 1 + 1 + 1 + 0 + palm2 + + + crate + A crate used for storing bananas + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + Chest + A battered old chest + WalkTo + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Flower + Ooh thats pretty + WalkTo + Examine + 0 + 1 + 1 + 0 + flower + + + sign + Fishing Supplies + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + Jewellers + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + Potato + A potato plant + WalkTo + pick + 0 + 1 + 1 + 0 + potato + + + fish + I can see fish swimming in the water + Lure + Bait + 0 + 1 + 1 + 0 + fishing + + + fish + I can see fish swimming in the water + Net + Bait + 0 + 1 + 1 + 0 + fishing + + + fish + I can see fish swimming in the water + Harpoon + Cage + 0 + 1 + 1 + 0 + fishing + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + silverrock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + silverrock1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Monks Altar + Its an Altar + Recharge at + Examine + 1 + 2 + 1 + 0 + altar + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Coffin + This coffin is closed + Open + Examine + 1 + 2 + 2 + 0 + coffin + + + Coffin + This coffin is open + Search + Close + 1 + 2 + 2 + 0 + coffin2 + + + Smashed table + This table has seen better days + WalkTo + Examine + 1 + 1 + 1 + 0 + smashedtable + + + Fungus + A creepy looking fungus + WalkTo + Examine + 0 + 1 + 1 + 0 + nastyfungus + + + Smashed chair + This chair is broken + WalkTo + Examine + 1 + 1 + 1 + 0 + smashedchair + + + Broken pillar + The remains of a pillar + WalkTo + Examine + 1 + 1 + 1 + 0 + brokenpillar + + + Fallen tree + A fallen tree + WalkTo + Examine + 1 + 3 + 2 + 0 + fallentree + + + Danger Sign + Danger! + WalkTo + Examine + 1 + 1 + 1 + 0 + dangersign + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + runiterock1 + + + Rock + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + runiteruck1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Gravestone + A big impressive gravestone + WalkTo + Examine + 1 + 2 + 2 + 0 + largegrave + + + bone + Eep! + WalkTo + Examine + 1 + 1 + 1 + 0 + curvedbone + + + bone + This would feed a dog for a month + WalkTo + Examine + 1 + 1 + 1 + 0 + largebone + + + carcass + I think it's dead + WalkTo + Examine + 1 + 2 + 2 + 0 + carcass + + + animalskull + I wouldn't like to meet a live one + WalkTo + Examine + 1 + 1 + 1 + 0 + animalskull + + + Vine + A creepy creeper + WalkTo + Examine + 0 + 1 + 1 + 0 + vine + + + Vine + A creepy creeper + WalkTo + Examine + 0 + 1 + 1 + 0 + vinecorner + + + Vine + A creepy creeper + WalkTo + Examine + 0 + 1 + 1 + 0 + vinejunction + + + Chest + Perhaps I should search it + WalkTo + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + ship + The Lumbridge Lady + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + The Lumbridge Lady + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + hole + This ship isn't much use with that there + WalkTo + Examine + 2 + 1 + 1 + 0 + brokenwall + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + hole + This ship isn't much use with that there + WalkTo + Examine + 2 + 1 + 1 + 0 + brokenwall + + + ship + The Lumbridge Lady + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + The Lumbridge Lady + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Altar of Guthix + A sort of ancient altar thingy + Recharge at + Examine + 1 + 2 + 2 + 0 + dolmen + + + The Cauldron of Thunder + A very large pot + WalkTo + Examine + 1 + 1 + 1 + 0 + cauldron + + + Tree + A leafy tree + Search + Examine + 1 + 1 + 1 + 0 + tree + + + ship + A ship to Entrana + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A ship to Entrana + board + Examine + 0 + 2 + 3 + 0 + Shipmiddle + + + ship + A ship to Entrana + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + ship + A ship to Port Sarim + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A ship to Port Sarim + board + Examine + 0 + 2 + 3 + 0 + Shipmiddle + + + ship + A ship to Port Sarim + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Dramen Tree + This tree doesn't look too healthy + Chop + Examine + 1 + 1 + 1 + 0 + dramentree + + + hopper + You put grain in here + operate + Examine + 1 + 2 + 2 + 0 + milltop + + + Chest + Perhaps I should search it + WalkTo + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + sign + 2-handed swords sold here + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + ye olde herbalist + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Door mat + If I ever get my boots muddy I know where to come + search + Examine + 0 + 1 + 1 + 0 + Doormat + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Cauldron + A very large pot + WalkTo + Examine + 1 + 1 + 1 + 0 + cauldron + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + gate + The bank vault gate + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + fish + I can see fish swimming in the water + Net + Harpoon + 0 + 1 + 1 + 0 + fishing + + + sign + Harry's fishing shack + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + sign + The shrimp and parrot + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + signpost + Palm Street + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Rockslide + A pile of rocks blocks your path + Mine + Prospect + 1 + 1 + 1 + 0 + rock3 + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + fish + I can see fish swimming in the lava! + Bait + Examine + 0 + 1 + 1 + 0 + fishing + + + barrel + Its got ale in it + WalkTo + Examine + 1 + 1 + 1 + 0 + barrel + + + table + It's a sturdy table + WalkTo + Examine + 1 + 2 + 1 + 96 + bigtable + + + Fireplace + It would be very cold without this + WalkTo + Examine + 1 + 2 + 1 + 0 + fireplacea1 + + + Egg + Thats one big egg! + WalkTo + Examine + 1 + 1 + 1 + 0 + bigegg + + + Eggs + They'd make an impressive omlette + WalkTo + Examine + 1 + 1 + 1 + 0 + eggs + + + Stalagmites + Hmm pointy + WalkTo + Examine + 1 + 1 + 1 + 0 + stalagmites + + + Stool + A simple three legged stool + WalkTo + Examine + 1 + 1 + 1 + 0 + stool + + + Bench + It doesn't look to comfortable + WalkTo + Examine + 1 + 1 + 1 + 0 + wallbench + + + table + A round table ideal for knights + WalkTo + Examine + 1 + 2 + 2 + 0 + bigroundtable + + + table + A handy little table + WalkTo + Examine + 1 + 1 + 1 + 96 + roundtable + + + fountain of heros + Use a dragonstone gem here to increase it's abilties + WalkTo + Examine + 1 + 2 + 2 + 0 + fountain + + + bush + A leafy bush + WalkTo + Examine + 1 + 1 + 1 + 0 + bush1 + + + hedge + A carefully trimmed hedge + WalkTo + Examine + 1 + 1 + 1 + 0 + bush2 + + + flower + A nice colourful flower + WalkTo + Examine + 1 + 1 + 1 + 0 + blueflower + + + plant + Hmm leafy + WalkTo + Examine + 1 + 1 + 1 + 0 + smallfern + + + Giant crystal + How unusual a crystal with a wizard trapped in it + WalkTo + Examine + 1 + 3 + 3 + 0 + giantcrystal + + + sign + The dead man's chest + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + sign + The rising sun + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + crate + A large wooden storage box + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + crate + A large wooden storage box + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + ship + A merchant ship + stow away + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A merchant ship + stow away + Examine + 0 + 5 + 3 + 0 + Shipback + + + beehive + It's guarded by angry looking bees + WalkTo + Examine + 1 + 1 + 1 + 0 + beehive + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Altar + An altar to the evil God Zamorak + Recharge at + Search + 1 + 2 + 1 + 0 + chaosaltar + + + sign + Hickton's Archery store + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + signpost + To Camelot + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Archway + A decorative marble arch + WalkTo + Examine + 1 + 2 + 1 + 0 + marblearch + + + Obelisk of water + It doesn't look very wet + WalkTo + Examine + 1 + 1 + 1 + 0 + obelisk + + + Obelisk of fire + It doesn't look very hot + WalkTo + Examine + 1 + 1 + 1 + 0 + obelisk + + + sand pit + I can use a bucket to get sand from here + WalkTo + Search + 1 + 2 + 2 + 0 + sandpit + + + Obelisk of air + A tall stone pointy thing + WalkTo + Examine + 1 + 1 + 1 + 0 + obelisk + + + Obelisk of earth + A tall stone pointy thing + WalkTo + Examine + 1 + 1 + 1 + 0 + obelisk + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Oak Tree + A grand old oak tree + Chop + Examine + 1 + 2 + 2 + 0 + oaktree + + + Willow Tree + A weeping willow + Chop + Examine + 1 + 2 + 2 + 0 + willowtree + + + Maple Tree + It's got nice shaped leaves + Chop + Examine + 1 + 2 + 2 + 0 + mapletree + + + Yew Tree + A tough looking yew tree + Chop + Examine + 1 + 2 + 2 + 0 + yewtree + + + Tree + A magical tree + Chop + Examine + 1 + 1 + 1 + 0 + magictree + + + gate + A gate guarded by a fierce barbarian + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + sign + The forester's arms + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + flax + A flax plant + WalkTo + pick + 0 + 1 + 1 + 0 + flax + + + Large treestump + Someone has chopped this tree down! + WalkTo + Examine + 1 + 2 + 2 + 0 + treestump + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + goldrock1 + + + Lever + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + Lever + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + Lever + It's a lever + Pull + Inspect + 0 + 1 + 1 + 0 + leverup + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + ship + A ship bound for Ardougne + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A ship bound for Ardougne + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Bakers Stall + A market stall + WalkTo + steal from + 1 + 2 + 2 + 112 + market + + + Silk Stall + A market stall + WalkTo + steal from + 1 + 2 + 2 + 112 + market + + + Fur Stall + A market stall + WalkTo + steal from + 1 + 2 + 2 + 112 + market + + + Silver Stall + A market stall + WalkTo + steal from + 1 + 2 + 2 + 112 + market + + + Spices Stall + A market stall + WalkTo + steal from + 1 + 2 + 2 + 112 + market + + + gems Stall + A market stall + WalkTo + steal from + 1 + 2 + 2 + 112 + market + + + crate + A large heavy sealed crate + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + crate + A large heavy sealed crate + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + sign + RPDT depot + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + stairs + These lead upstairs + Go up + Search for traps + 1 + 2 + 3 + 0 + stonestairs + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Open + Search for traps + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Open + Search for traps + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Open + Search for traps + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Open + Search for traps + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Open + Search for traps + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + someone is stealing something from it + WalkTo + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Search for traps + 1 + 1 + 1 + 0 + ChestClosed + + + empty stall + A market stall + WalkTo + Examine + 1 + 2 + 2 + 112 + market + + + stairs + These lead upstairs + Go up + Examine + 1 + 2 + 3 + 0 + stonestairs + + + hopper + You put grain in here + operate + Examine + 1 + 2 + 2 + 0 + milltop + + + signpost + Ardougne city zoo + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + sign + The flying horse + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Lever + The lever is up + pull + Examine + 0 + 1 + 1 + 0 + leverup + + + Lever + The lever is up + pull + Examine + 0 + 1 + 1 + 0 + leverup + + + pipe + a dirty sewer pipe + WalkTo + Examine + 1 + 1 + 1 + 0 + wallpipe + + + fish + I can see fish swimming in the water + Bait + Examine + 0 + 1 + 1 + 0 + fishing + + + fish + I can see fish swimming in the water + Bait + Examine + 0 + 1 + 1 + 0 + fishing + + + fish + I can see fish swimming in the water + Bait + Examine + 0 + 1 + 1 + 0 + fishing + + + fish + I can see fish swimming in the water + Bait + Examine + 0 + 1 + 1 + 0 + fishing + + + Vine + A creepy creeper + WalkTo + Examine + 0 + 1 + 1 + 0 + vine + + + gate + The main entrance to McGrubor's wood + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + The gate is open + WalkTo + Examine + 2 + 1 + 2 + 0 + woodengateopen + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + stairs + These lead downstairs + Go down + Examine + 1 + 2 + 3 + 0 + stonestairsdown + + + broken cart + A farm cart + WalkTo + Examine + 1 + 2 + 3 + 0 + brokencart + + + Lever + It's a lever + Pull + Searchfortraps + 0 + 1 + 1 + 0 + leverup + + + clock pole blue + A pole - a pole to put cog's on + inspect + Examine + 0 + 1 + 1 + 0 + clockpoleblue + + + clock pole red + A pole - a pole to put cog's on + inspect + Examine + 0 + 1 + 1 + 0 + clockpolered + + + clock pole purple + A pole - a pole to put cog's on + inspect + Examine + 0 + 1 + 1 + 0 + clockpolepurple + + + clock pole black + A pole - a pole to put cog's on + inspect + Examine + 0 + 1 + 1 + 0 + clockpoleblack + + + wallclockface + It's a large clock face + WalkTo + Examine + 1 + 2 + 2 + 0 + wallclockface + + + Lever Bracket + Theres something missing here + WalkTo + Examine + 0 + 1 + 1 + 0 + leverbracket + + + Lever + It's a lever + Pull + Examine + 0 + 1 + 1 + 0 + leverup + + + stairs + These lead upstairs + Go up + Examine + 1 + 2 + 3 + 0 + woodenstairs + + + stairs + These lead downstairs + Go down + Examine + 1 + 2 + 3 + 0 + woodenstairsdown + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed2 + + + gate + The gate is open + close + Examine + 3 + 1 + 2 + 0 + metalgateopen2 + + + Lever + The lever is up + pull + Examine + 0 + 1 + 1 + 0 + leverup + + + Lever + The lever is up + push + Examine + 0 + 1 + 1 + 0 + leverdown + + + Foodtrough + It's for feeding the rat's + WalkTo + Examine + 1 + 2 + 1 + 0 + Foodtrough + + + fish + I can see fish swimming in the water + cage + harpoon + 0 + 1 + 1 + 0 + fishing + + + spearwall + It's a defensive battlement + WalkTo + Examine + 1 + 2 + 1 + 0 + spearwall + + + hornedskull + A horned dragon skull + WalkTo + Examine + 1 + 2 + 2 + 0 + hornedskull + + + Chest + I wonder what is inside... + Open + picklock + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Open + picklock + 1 + 1 + 1 + 0 + ChestClosed + + + guardscupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + guardscupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + Coal truck + I can use this to transport coal + get coal from + Examine + 1 + 1 + 1 + 0 + minecart + + + ship + A ship to Port Birmhaven + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A ship to Port Birmhaven + board + Examine + 0 + 2 + 3 + 0 + Shipmiddle + + + ship + A ship to Port Birmhaven + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Tree + It's a tree house + WalkTo + Examine + 1 + 1 + 1 + 0 + toplesstree + + + Ballista + It's a war machine + fire + Examine + 1 + 4 + 1 + 0 + catabow + + + largespear + + WalkTo + Examine + 1 + 2 + 1 + 0 + catabowarrow + + + spirit tree + A grand old spirit tree + talk to + Examine + 1 + 2 + 2 + 0 + ent + + + young spirit Tree + Ancestor of the spirit tree + talk to + Examine + 1 + 1 + 1 + 0 + tree2 + + + gate + The gate is closed + talk through + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + wall + A damaged wall + climb + Examine + 1 + 3 + 1 + 0 + khazardwall + + + tree + An exotic looking tree + WalkTo + Examine + 1 + 1 + 1 + 0 + jungle tree 2 + + + tree + An exotic looking tree + WalkTo + Examine + 1 + 1 + 1 + 0 + jungle tree 1 + + + Fern + An exotic leafy plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle fern textured + + + Fern + An exotic leafy plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle fern textured 2 + + + Fern + An exotic leafy plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle fern textured 3 + + + Fern + An exotic leafy plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle fern textured 4 + + + fly trap + A small carnivourous plant + approach + Search + 0 + 1 + 1 + 0 + jungle fly trap + + + Fern + An exotic leafy plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle fern + + + Fern + An exotic spikey plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle spikey fern + + + plant + What an unusual plant + WalkTo + Examine + 0 + 1 + 1 + 0 + jungle strange plant + + + plant + An odd looking plant + WalkTo + Examine + 1 + 1 + 1 + 0 + jungle strange plant 2 + + + plant + some nice jungle foliage + WalkTo + Examine + 1 + 1 + 1 + 0 + jungle medium size plant + + + stone head + It looks like it's been here some time + WalkTo + Examine + 1 + 2 + 2 + 0 + jungle statue + + + dead Tree + A rotting tree + WalkTo + Examine + 1 + 1 + 1 + 0 + deadtree2 + + + sacks + Yep they're sacks + WalkTo + prod + 1 + 1 + 1 + 0 + sacks + + + khazard open Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + khazard shut Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + doorframe + It's a stone doorframe + WalkTo + Examine + 3 + 1 + 2 + 0 + doubledoorframe + + + Sewer valve + It changes the water flow of the sewer's + turn left + turn right + 1 + 1 + 1 + 0 + sewervalve + + + Sewer valve 2 + It changes the water flow of the sewer's + turn left + turn right + 1 + 1 + 1 + 0 + sewervalve + + + Sewer valve 3 + It changes the water flow of the sewer's + turn left + turn right + 1 + 1 + 1 + 0 + sewervalve + + + Sewer valve 4 + It changes the water flow of the sewer's + turn left + turn right + 1 + 1 + 1 + 0 + sewervalve + + + Sewer valve 5 + It changes the water flow of the sewer's + turn left + turn right + 1 + 1 + 1 + 0 + sewervalve + + + Cave entrance + I wonder what is inside... + enter + Examine + 1 + 2 + 2 + 0 + caveentrance + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + logbridgelow + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + logbridgehigh + + + tree platform + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + treeplatformhigh + + + tree platform + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + treeplatformlow + + + gate + The gate is open + close + Examine + 2 + 1 + 2 + 0 + metalgateopen2 + + + tree platform + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + largetreeplatformlow + + + tree platform + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + largetreeplatformhigh + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + logbridgecurvedhigh + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + logbridgecurvedlow + + + tree platform + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + treeplatformlow2 + + + tree platform + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + treeplatformhigh2 + + + Tribal brew + A very large pot + WalkTo + drink + 1 + 1 + 1 + 0 + cauldron + + + Pineapple tree + A tree with nice ripe pineapples growing on it + WalkTo + Pick pineapple + 1 + 1 + 1 + 0 + palm2 + + + Pineapple tree + There are no pineapples left on the tree + WalkTo + Pick pineapple + 1 + 1 + 1 + 0 + palm2 + + + log raft + A mighty fine raft + board + Examine + 0 + 1 + 1 + 96 + lograft + + + log raft + A mighty fine raft + board + Examine + 0 + 1 + 1 + 96 + lograft + + + Tomb of hazeel + A clay shrine to lord hazeel + WalkTo + Examine + 1 + 1 + 2 + 96 + hazeeltomb + + + range + A pot of soup slowly cooking + WalkTo + Examine + 1 + 1 + 2 + 0 + range + + + Bookcase + A large collection of books + Search + Examine + 1 + 1 + 2 + 0 + bookcase + + + Carnillean Chest + Perhaps I should search it + WalkTo + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Carnillean Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + crate + A crate used for storing food + Search + Examine + 1 + 1 + 1 + 0 + crate + + + Butlers cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + Butlers cupboard + The cupboard is open + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + gate + The gate is open + WalkTo + Examine + 2 + 1 + 2 + 0 + woodengateopen + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + Cattle furnace + A red hot furnace + WalkTo + Examine + 1 + 2 + 2 + 0 + furnace + + + Ardounge wall + A huge wall seperating east and west ardounge + WalkTo + Examine + 1 + 1 + 3 + 0 + ardoungewall + + + Ardounge wall corner + A huge wall seperating east and west ardounge + WalkTo + Examine + 1 + 1 + 1 + 0 + ardoungewallcorner + + + Dug up soil + A freshly dug pile of mud + WalkTo + Examine + 0 + 1 + 1 + 0 + mudpatch + + + Pile of mud + Mud caved in from above + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + large Sewer pipe + a dirty sewer pipe + enter + Examine + 1 + 1 + 1 + 0 + largesewerpipe + + + Ardounge wall gateway + A huge set of heavy wooden doors + open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + The cupboard is open + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + Fishing crane + For hauling in large catches of fish + operate + Examine + 1 + 1 + 2 + 0 + fishingcrane + + + Rowboat + A reasonably sea worthy two man boat + WalkTo + Examine + 1 + 2 + 2 + 0 + rowboat + + + Damaged Rowboat + A not so sea worthy two man boat + WalkTo + Examine + 1 + 2 + 2 + 0 + rowboatsinking + + + barrel + I wonder what's inside + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Fishing crane + For hauling in large catches of fish + operate + Examine + 1 + 1 + 1 + 0 + fishingcranerot1 + + + Fishing crane + For hauling in large catches of fish + operate + Examine + 1 + 1 + 1 + 0 + fishingcranerot2 + + + Waterfall + it's a waterfall + WalkTo + Examine + 2 + 1 + 2 + 0 + waterfall + + + leaflessTree + A pointy tree + jump off + jump to next + 1 + 1 + 1 + 0 + deadtree2base + + + leaflessTree + A pointy tree + jump off + jump to next + 1 + 1 + 1 + 0 + deadtree2base + + + log raft + A mighty fine raft + board + Examine + 0 + 1 + 1 + 96 + lograft + + + doors + The doors are shut + Open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + Well + An oddly placed well + operate + Examine + 1 + 2 + 2 + 0 + well + + + Tomb of glarial + A stone tomb surrounded by flowers + Search + Examine + 1 + 2 + 4 + 96 + elventomb + + + Waterfall + it's a fast flowing waterfall + jump off + Examine + 2 + 1 + 2 + 0 + waterfalllev1 + + + Waterfall + it's a fast flowing waterfall + jump off + Examine + 0 + 1 + 2 + 0 + waterfalllev2 + + + Bookcase + A large collection of books + Search + Examine + 1 + 1 + 2 + 0 + bookcase + + + doors + The doors are shut + Open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + doors + The doors are shut + Open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + Stone stand + On top is an indent the size of a rune stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonestand + + + Stone stand + On top is an indent the size of a rune stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonestand + + + Stone stand + On top is an indent the size of a rune stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonestand + + + Stone stand + On top is an indent the size of a rune stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonestand + + + Stone stand + On top is an indent the size of a rune stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonestand + + + Stone stand + On top is an indent the size of a rune stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonestand + + + Glarial's Gravestone + There is an indent the size of a pebble in the stone's center + read + Examine + 1 + 1 + 1 + 0 + gravestone1 + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + crate + It's a crate + Search + Examine + 1 + 1 + 1 + 0 + crate + + + leaflessTree + A pointy tree + jump off + Examine + 1 + 1 + 1 + 0 + deadtree2base + + + Statue of glarial + A statue of queen glarial - something's missing + WalkTo + Examine + 1 + 1 + 1 + 0 + glarialsstatue + + + Chalice of eternity + A magically elevated chalice full of treasure + WalkTo + Examine + 1 + 1 + 1 + 0 + baxtorianchalice + + + Chalice of eternity + A magically elevated chalice full of treasure + empty + Examine + 1 + 1 + 1 + 0 + baxtorianchalicelow + + + doors + The doors are shut + Open + Examine + 2 + 1 + 2 + 0 + doubledoorsclosed + + + Lever + The lever is up + pull + Examine + 0 + 1 + 1 + 0 + leverup + + + Lever + The lever is up + pull + Examine + 0 + 1 + 1 + 0 + leverup + + + log raft remains + oops! + WalkTo + Examine + 0 + 1 + 1 + 96 + brokenlograft + + + Tree + A pointy tree + WalkTo + Examine + 0 + 1 + 1 + 0 + tree2 + + + Range + A hot well stoked range + WalkTo + Examine + 1 + 1 + 2 + 0 + range + + + crate + It's an old crate + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + fish + I can see fish swimming in the water + Net + Examine + 0 + 1 + 1 + 0 + fishing + + + Watch tower + They're always watching + approach + Examine + 1 + 2 + 2 + 0 + watchtower + + + signpost + Tourist infomation + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + doors + The doors are open + WalkTo + Examine + 2 + 1 + 2 + 0 + doubledoorsopen + + + Rope ladder + A hand made ladder + WalkTo + Examine + 1 + 1 + 1 + 0 + ropeladder + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + Rope ladder + A hand made ladder + WalkTo + Examine + 1 + 1 + 1 + 0 + ropeladder + + + Cooking pot + the mourners are busy enjoying this stew + WalkTo + Examine + 1 + 1 + 1 + 0 + cauldron + + + Gallow + Best not hang about! + WalkTo + Examine + 1 + 2 + 2 + 0 + gallows + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + crate + A crate used for storing confiscated goods + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + sign + Tailors fancy dress + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand tree-lev 0 + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + gate + The gate is open + WalkTo + close + 2 + 1 + 2 + 0 + woodengateopen + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 1 + 1 + 0 + logbridge lev0 + + + Watch tower + A tree gnome construction + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomewatchtower lev0 + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 0 + 0 + 0 + logbridgejunction lev0 + + + climbing rocks + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + climbing_rocks + + + Ledge + It looks rather thin + balance on + Examine + 0 + 1 + 0 + 0 + corner_ledge + + + Ledge + It looks rather thin + balance on + Examine + 0 + 1 + 1 + 0 + straight_ledge + + + log + It looks slippery + WalkTo + Examine + 0 + 1 + 1 + 0 + log_balance1 + + + log + It looks slippery + WalkTo + Examine + 0 + 1 + 1 + 0 + log_balance2 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + Rocks + A rocky outcrop + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + PalmTree + A shady palm tree + WalkTo + Search + 1 + 1 + 1 + 0 + palm + + + Scorched Earth + An area of burnt soil + WalkTo + Search + 0 + 1 + 1 + 0 + mudpatch + + + Rocks + A moss covered rock + Mine + Search + 1 + 1 + 1 + 0 + mossyrock + + + sign + The dancing donkey inn + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + fish + I can see fish swimming in the water + harpoon + cage + 0 + 1 + 1 + 0 + fishing + + + Rocky Walkway + A precarious rocky walkway + Balance + Examine + 1 + 1 + 1 + 0 + rocktile + + + Rocky Walkway + A precarious rocky walkway + Balance + Examine + 1 + 1 + 1 + 0 + rocktile + + + Rocky Walkway + A precarious rocky walkway + Balance + Examine + 1 + 1 + 1 + 0 + rocktile + + + Rocky Walkway + A precarious rocky walkway + Balance + Examine + 1 + 1 + 1 + 0 + rocktile + + + fight Dummy + I can practice my fighting here + hit + Examine + 1 + 1 + 1 + 0 + sworddummy + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Jungle Vine + A deep jungle Vine + WalkTo + Search + 0 + 1 + 1 + 0 + vine + + + statue + hand carved + WalkTo + Examine + 1 + 1 + 1 + 0 + tribalstature + + + sign + Ye Olde Dragon Inn + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand treeinside-lev 0 + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand treeinside-lev 1 + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand treeinside-lev 2 + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand tree-lev 1 + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand tree-lev 2 + + + Hillside Entrance + Large doors that seem to lead into the hillside + Open + Search + 2 + 1 + 2 + 0 + hillsidedoor + + + tree + A large exotic looking tree + WalkTo + Search + 1 + 1 + 1 + 0 + jungle medium size plant + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 0 + 0 + 0 + logbridgejunction lev1 + + + Tree platform + A tree gnome construction + WalkTo + Examine + 0 + 0 + 0 + 0 + fourwayplatform-lev 0 + + + Tree platform + A tree gnome construction + WalkTo + Examine + 0 + 0 + 0 + 0 + fourwayplatform-lev 1 + + + Metalic Dungeon Gate + It seems to be closed + Open + Search + 2 + 1 + 2 + 0 + metalgateclosed + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 0 + 0 + 0 + logbridge lev1 + + + Log bridge + A tree gnome construction + WalkTo + Examine + 0 + 0 + 0 + 0 + logbridge lev2 + + + Watch tower + A tree gnome construction + WalkTo + Examine + 1 + 0 + 0 + 0 + gnomewatchtower lev1 + + + Watch tower + A tree gnome construction + WalkTo + Examine + 1 + 0 + 0 + 0 + gnomewatchtower lev2 + + + Shallow water + A small opening in the ground with some spots of water + WalkTo + Investigate + 1 + 2 + 2 + 0 + rockpoolwater + + + Doors + Perhaps you should give them a push + Open + Search + 2 + 1 + 2 + 0 + hillsidedoor + + + grand tree + the grand tree + WalkTo + Examine + 0 + 1 + 1 + 0 + grand tree-lev 3 + + + Tree Ladder + it's a ladder leading upwards + Climb-Up + Examine + 0 + 1 + 1 + 0 + ladder + + + Tree Ladder + it's a ladder leading downwards + Climb-down + Examine + 0 + 1 + 1 + 0 + ladderdown + + + blurberrys cocktail bar + the gnome social hot spot + WalkTo + Examine + 0 + 1 + 1 + 0 + blurberrybar + + + Gem Rocks + A rocky outcrop with a vein of semi precious stones + Mine + Prospect + 1 + 1 + 1 + 0 + gemrock + + + Giannes place + Eat green eat gnome cruisine + WalkTo + Examine + 0 + 1 + 1 + 0 + blurberrybar + + + ropeswing + A good place to train agility + WalkTo + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + net + A good place to train agility + WalkTo + Examine + 1 + 2 + 1 + 0 + obstical_net + + + Frame + A good place to train agility + WalkTo + Examine + 1 + 1 + 1 + 0 + obstical_frame + + + Tree + It has a branch ideal for tying ropes to + WalkTo + Examine + 1 + 2 + 2 + 0 + tree_for_rope + + + Tree + I wonder who put that rope there + WalkTo + Examine + 1 + 2 + 2 + 0 + tree_with_rope + + + Tree + they look fun to swing on + WalkTo + Examine + 1 + 2 + 2 + 0 + tree_with_vines + + + cart + A farm cart + WalkTo + Search + 1 + 2 + 3 + 0 + cart + + + fence + it doesn't look too strong + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomefence + + + beam + A plank of wood + WalkTo + Examine + 0 + 1 + 1 + 0 + beam + + + Sign + read me + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Blurberry's cocktail bar + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Giannes tree gnome cuisine + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Heckel funch's grocery store + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Hudo glenfad's grocery store + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Rometti's fashion outlet + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Tree gnome bank and rometti's fashion outlet + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Tree gnome local swamp + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + Agility training course + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Sign + To the grand tree + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Root + To the grand tree + search + Examine + 1 + 1 + 1 + 0 + treeroot1 + + + Root + To the grand tree + search + Examine + 1 + 1 + 1 + 0 + treeroot2 + + + Metal Gate + The gate is closed + Open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Metal Gate + The gate is open + WalkTo + close + 2 + 1 + 2 + 0 + metalgateopen + + + A farm cart + It is blocking the entrance to the village + Examine + Search + 1 + 2 + 3 + 0 + cart + + + Ledge + It looks rather thin + balance on + Examine + 0 + 1 + 1 + 0 + straight_ledge + + + Ledge + It looks rather thin + balance on + Examine + 0 + 1 + 1 + 0 + straight_ledge + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + cage + i don't like the look of that + open + Examine + 0 + 1 + 1 + 0 + gnomecage + + + glider + i wonder if it flys + fly + Examine + 1 + 1 + 1 + 0 + gnomeglider + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + cupboard + Perhaps I should search it + Search + close + 1 + 1 + 2 + 0 + cupboardopen + + + stairs + These lead upstairs + Go up + Examine + 1 + 2 + 3 + 0 + woodenstairs + + + glider + i wonder if it flys + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomeglidercrashed + + + gate + The gate is open + WalkTo + close + 1 + 1 + 2 + 0 + woodengateopen + + + gate + The gate is closed + open + Examine + 1 + 1 + 2 + 0 + woodengateclosed + + + chaos altar + An altar to the evil God Zamorak + Recharge at + Examine + 1 + 2 + 1 + 0 + chaosaltar + + + Gnome stronghold gate + The gate is closed + Open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + ropeswing + A good place to train agility + Swing + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + ropeswing + A good place to train agility + Swing + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + stairs + These lead upstairs + Go up + Examine + 1 + 2 + 3 + 0 + woodenstairs + + + stairs + These lead downstairs + Go down + Examine + 1 + 2 + 3 + 0 + woodenstairsdown + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Pile of rubble + What a mess + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Stone stand + On top our four indents from left to right + WalkTo + push down + 1 + 1 + 1 + 0 + stonestand + + + Watch tower + A tree gnome construction + climb up + Examine + 1 + 1 + 1 + 0 + gnomewatchtower lev1 + + + Pile of rubble + What a mess + climb + Examine + 1 + 2 + 1 + 0 + mudpiledown + + + Root + To the grand tree + search + Examine + 1 + 1 + 1 + 0 + treeroot2 + + + Root + To the grand tree + push + Examine + 1 + 1 + 1 + 0 + treeroot2 + + + Root + To the grand tree + push + Examine + 1 + 1 + 1 + 0 + treeroot2 + + + Sign + Home to the Head tree guardian + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomesign + + + Hammock + They've got to sleep somewhere + lie in + Examine + 1 + 1 + 2 + 0 + gnomehamek + + + Goal + You're supposed to throw the ball here + WalkTo + Examine + 0 + 1 + 1 + 0 + gnomegoal + + + stone tile + It looks as if it might move + twist + Examine + 1 + 1 + 1 + 0 + stonedisc + + + Chest + You get a sense of dread from the chest + WalkTo + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + You get a sense of dread from the chest + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Watch tower + A tree gnome construction + WalkTo + climb down + 0 + 1 + 1 + 0 + gnomewatchtower lev2 + + + net + A good place to train agility + climb + Examine + 1 + 2 + 1 + 0 + obstical_net + + + Watch tower + A tree gnome construction + climb up + Examine + 1 + 1 + 1 + 0 + gnomewatchtower lev1 + + + Watch tower + A tree gnome construction + climb down + Examine + 1 + 1 + 1 + 0 + gnomewatchtower lev2 + + + ropeswing + A good place to train agility + grab hold of + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + Bumpy Dirt + Some disturbed earth + Look + Search + 0 + 1 + 1 + 0 + mudpatch + + + pipe + a dirty sewer pipe + WalkTo + Examine + 1 + 1 + 1 + 0 + obstical_pipe + + + net + A good place to train agility + climb + Examine + 1 + 2 + 1 + 0 + obstical_net + + + pipe + a dirty sewer pipe + enter + Examine + 1 + 1 + 1 + 0 + obstical_pipe + + + log + It looks slippery + balance on + Examine + 0 + 1 + 1 + 0 + log_balance1 + + + pipe + a dirty sewer pipe + enter + Examine + 1 + 1 + 1 + 0 + obstical_pipe + + + pipe + a dirty sewer pipe + enter + Examine + 0 + 1 + 1 + 0 + obstical_pipe + + + Handholds + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + climbing_rocks + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + stronghold spirit Tree + Ancestor of the spirit tree + talk to + Examine + 1 + 1 + 1 + 0 + tree2 + + + Tree + It has a branch ideal for tying ropes to + WalkTo + Examine + 1 + 2 + 2 + 0 + tree_for_rope + + + Tree + I wonder who put that rope there + swing on + Examine + 1 + 2 + 2 + 0 + tree_with_rope + + + Tree + I wonder who put that rope there + swing on + Examine + 1 + 2 + 2 + 0 + tree_with_rope + + + Spiked pit + I don't want to go down there + WalkTo + Examine + 1 + 2 + 2 + 0 + spikedpit-low + + + Spiked pit + I don't want to go down there + WalkTo + Examine + 1 + 2 + 2 + 0 + spikedpit + + + Cave + I wonder what is inside... + enter + Examine + 1 + 2 + 2 + 0 + caveentrance + + + stone pebble + Looks like a stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonedisc + + + Pile of rubble + Rocks that have caved in + WalkTo + Examine + 1 + 2 + 1 + 0 + mudpile + + + Pile of rubble + Rocks that have caved in + WalkTo + Search + 1 + 2 + 1 + 0 + mudpile + + + pipe + I might be able to fit through this + enter + Examine + 1 + 1 + 1 + 0 + obstical_pipe + + + pipe + 2 + enter + Examine + 1 + 1 + 1 + 0 + obstical_pipe + + + Stone + Looks like a stone + WalkTo + Examine + 1 + 1 + 1 + 0 + stonedisc + + + Stone + Looks like a stone + Look Closer + Investigate + 1 + 1 + 1 + 0 + stonedisc + + + ropeswing + A good place to train agility + Swing + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + log + It looks slippery + balance on + Examine + 0 + 1 + 1 + 0 + log_balance1 + + + net + A good place to train agility + Climb Up + Examine + 1 + 2 + 1 + 0 + obstical_net + + + Ledge + It looks rather thin + balance on + Examine + 0 + 1 + 1 + 0 + straight_ledge + + + Handholds + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + climbing_rocks + + + log + It looks slippery + balance on + Examine + 0 + 1 + 1 + 0 + log_balance1 + + + log + It looks slippery + balance on + Examine + 0 + 1 + 1 + 0 + log_balance1 + + + Rotten Gallows + A human corpse hangs from the noose + Look + Search + 1 + 2 + 2 + 0 + gallows + + + Pile of rubble + Rocks that have caved in + WalkTo + Search + 1 + 2 + 1 + 0 + mudpile + + + ropeswing + I wonder what's over here + Swing + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + ropeswing + I wonder what's over here + Swing + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + ocks + A moss covered rock + balance + Examine + 1 + 1 + 1 + 0 + mossyrock + + + Tree + This tree doesn't look too healthy + WalkTo + balance + 1 + 1 + 1 + 0 + deadtree1 + + + Well stacked rocks + Rocks that have been stacked at regular intervals + Investigate + Search + 1 + 1 + 1 + 0 + rocks1 + + + Tomb Dolmen + An ancient construct for displaying the bones of the deceased + Look + Search + 1 + 2 + 2 + 0 + dolmen + + + Handholds + I wonder if I can climb up these + Climb + Examine + 0 + 1 + 1 + 0 + climbing_rocks + + + Bridge Blockade + A crudely constructed fence to stop you going further + Investigate + Jump + 1 + 1 + 1 + 0 + gnomefence + + + Log Bridge + A slippery log that is a make-do bridge + Balance On + Examine + 0 + 1 + 1 + 0 + log_balance2 + + + Handholds + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + climbing_rocks + + + Tree + they look fun to swing on + Swing on + Examine + 1 + 2 + 2 + 0 + tree_with_vines + + + Tree + they look fun to swing on + Swing on + Examine + 1 + 2 + 2 + 0 + tree_with_vines + + + Wet rocks + A rocky outcrop + Look + Search + 1 + 1 + 1 + 0 + rocks1 + + + Smashed table + This table has seen better days + Examine + Craft + 1 + 1 + 1 + 0 + smashedtable + + + Crude Raft + A crudely constructed raft + Disembark + Examine + 0 + 1 + 1 + 96 + lograft + + + Daconia rock + Piles of daconia rock + Mine + Prospect + 1 + 1 + 1 + 0 + rocks1 + + + statue + A statue to mark Taie Bwo Wannai sacred grounds + WalkTo + Examine + 1 + 1 + 1 + 0 + tribalstature + + + Stepping stones + A rocky outcrop + Balance + Jump onto + 1 + 1 + 1 + 0 + rocks1 + + + gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + gate + Enter to balance into an agility area + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + gate + Enter to balance into an agility area + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + pipe + It looks a tight squeeze + enter + Examine + 1 + 1 + 1 + 0 + obstical_pipe + + + ropeswing + A good place to train agility + Swing + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + Stone + Looks like a stone + balance on + Examine + 1 + 1 + 1 + 0 + stonedisc + + + Ledge + It doesn't look stable + balance on + Examine + 0 + 1 + 1 + 0 + straight_ledge + + + Vine + A creepy creeper + climb up + Examine + 0 + 1 + 1 + 0 + vinecorner + + + Rocks + A rocky outcrop + WalkTo + Climb + 1 + 1 + 1 + 0 + rocks1 + + + Wooden Gate + The gate is open + Close + Close + 2 + 1 + 2 + 0 + woodengateopen + + + Wooden Gate + The gate is closed + Open + Examine + 2 + 1 + 2 + 0 + woodengateclosed + + + Stone bridge + An ancient stone construction + WalkTo + Examine + 0 + 1 + 1 + 0 + bridge section 1 + + + Stone bridge + An ancient stone construction + WalkTo + Examine + 0 + 1 + 1 + 0 + bridge section 2 + + + Stone bridge + An ancient stone construction + WalkTo + Examine + 0 + 1 + 1 + 0 + bridge section 3 + + + Stone bridge + An ancient stone construction + WalkTo + Examine + 0 + 1 + 1 + 0 + cave bridge support + + + Stone platform + An ancient stone construction + WalkTo + Examine + 0 + 1 + 1 + 0 + cave platform small + + + fence + it doesn't look too strong + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomefence2 + + + Rocks + A rocky outcrop + Climb + Climb + 1 + 1 + 1 + 0 + rocks1 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 3 + 1 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 3 + 1 + 0 + bridge section collapsed2 + + + Gate of Iban + It doesn't look very inviting + open + Examine + 1 + 3 + 1 + 0 + rams skull door + + + Wooden Door + It doesn't look very inviting + cross + Examine + 1 + 3 + 1 + 0 + rams skull dooropen + + + Tomb Dolmen + An ancient construct for displaying the bones of the deceased + Look + Search + 1 + 2 + 2 + 0 + dolmen + + + Cave entrance + It doesn't look very inviting + enter + Examine + 1 + 3 + 1 + 0 + caveentrance2 + + + Old bridge + That's been there a while + WalkTo + Examine + 1 + 3 + 1 + 0 + cave old bridge + + + Old bridge + That's been there a while + cross + Examine + 1 + 3 + 1 + 0 + cave old bridgedown + + + Crumbled rock + climb up to above ground + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + stalagmite + Formed over thousands of years + WalkTo + Examine + 1 + 1 + 1 + 0 + cave large stagamite + + + stalagmite + Formed over thousands of years + WalkTo + Examine + 1 + 1 + 1 + 0 + cave small stagamite + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Lever + Seems to be some sort of winch + pull + Examine + 1 + 1 + 1 + 0 + cave lever + + + stalactite + Formed over thousands of years + WalkTo + Examine + 0 + 1 + 1 + 0 + cave large stagatite + + + stalactite + Formed over thousands of years + WalkTo + Examine + 0 + 1 + 1 + 0 + cave small stagatite + + + stalactite + Formed over thousands of years + climb + Examine + 0 + 1 + 1 + 0 + cave extra large stagatite + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Swamp + That smells horrid + step over + Examine + 1 + 1 + 1 + 0 + cave swampbubbles + + + Swamp + That smells horrid + WalkTo + Examine + 1 + 1 + 1 + 0 + cave swampbubbles + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Pile of mud + Mud caved in from above + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Travel Cart + A sturdy cart for travelling in + Board + Look + 1 + 2 + 3 + 0 + cart + + + Travel Cart + A sturdy cart for travelling in + Board + Look + 1 + 2 + 3 + 0 + cart + + + Rocks + A small rocky outcrop + mine + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + stalactite + Formed over thousands of years + WalkTo + Examine + 0 + 1 + 1 + 0 + cave large stagatite + + + Rocks + You should be able to move these + clear + Examine + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + WalkTo + Examine + 1 + 2 + 2 + 0 + cave rocktrap1a + + + Rocks + You should be able to move these + WalkTo + Examine + 1 + 1 + 3 + 0 + cave swamprocks + + + sign + The Paramaya Hostel + WalkTo + Examine + 0 + 1 + 1 + 0 + shopsign + + + Ladder + A ladder that leads to the dormitory - a ticket is needed + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Spiked pit + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrapa + + + signpost + To the Furnace + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Ship + A sea faring ship called 'Lady Of The Waves' + board + Examine + 0 + 5 + 3 + 0 + Shipfront + + + Ship + A sea faring ship called 'Lady Of The Waves' + board + Examine + 0 + 5 + 3 + 0 + Shipback + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + sacks + Yep they're sacks + WalkTo + Search + 1 + 1 + 1 + 0 + sacks + + + Zamorakian Temple + Scary! + WalkTo + Examine + 0 + 1 + 1 + 0 + cave temple + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Grill + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrap + + + Rocks + A small rocky outcrop + walk here + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + walk here + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Tomb Doors + Ornately carved wooden doors depicting skeletal warriors + Open + Search + 2 + 1 + 2 + 0 + doubledoorsclosed + + + Swamp + That smells horrid + step over + Examine + 1 + 1 + 1 + 0 + cave swampbubbles + + + Rocks + You should be able to move these + clear + Examine + 1 + 2 + 1 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + clear + Examine + 1 + 2 + 1 + 0 + cave rocktrap1 + + + stalactite + Formed over thousands of years + WalkTo + Examine + 0 + 1 + 1 + 0 + cave extra large stagatite + + + stalactite + Formed over thousands of years + WalkTo + Examine + 0 + 1 + 1 + 0 + cave extra large stagatite + + + Spiked pit + They looks suspicious + walk over + Examine + 1 + 1 + 1 + 0 + cave grilltrapa up + + + Lever + Seems to be some sort of winch + pull + Examine + 1 + 1 + 1 + 0 + cave lever + + + Cage + Seems to be mechanical + WalkTo + Examine + 1 + 1 + 1 + 0 + cave grillcage + + + Cage + Seems to be mechanical + WalkTo + Examine + 1 + 1 + 1 + 0 + cave grillcageup + + + Rocks + More rocks! + step over + search for traps + 1 + 1 + 1 + 0 + cave speartrap + + + Spear trap + Ouch! + WalkTo + Examine + 1 + 1 + 1 + 0 + cave speartrapa + + + Rocks + More rocks! + step over + search + 1 + 1 + 1 + 0 + cave speartrap + + + Rocks + More rocks! + step over + search + 1 + 1 + 1 + 0 + cave speartrap + + + Rocks + More rocks! + step over + search + 1 + 1 + 1 + 0 + cave speartrap + + + Rocks + More rocks! + step over + search + 1 + 1 + 1 + 0 + cave speartrap + + + Rocks + More rocks! + step over + search + 1 + 1 + 1 + 0 + cave speartrap + + + Rocks + More rocks! + step over + search + 1 + 1 + 1 + 0 + cave speartrap + + + Ledge + I might be able to climb that + drop down + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Furnace + Charred bones are slowly burning inside + WalkTo + Examine + 1 + 1 + 1 + 0 + cave furnace + + + Well + The remains of a warrior slump over the strange construction + drop down + Examine + 1 + 1 + 1 + 0 + cave well + + + Passage + A strange metal grill covers the passage + walk down + Examine + 1 + 2 + 1 + 0 + cave tubetrap + + + Passage + The passage way has swung down to a vertical position + climb up + Examine + 1 + 2 + 1 + 0 + cave tubetrapa + + + Passage + The passage way has swung down to a vertical position + climb up rope + Examine + 1 + 2 + 1 + 0 + cave tubetrapa rope + + + stalagmite + Formed over thousands of years + search + Examine + 1 + 1 + 1 + 0 + cave large stagamite + + + Rocks + You should be able to move these + clear + search + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + clear + search + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + clear + search + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + clear + search + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + clear + search + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Rocks + You should be able to move these + clear + search + 1 + 2 + 2 + 0 + cave rocktrap1 + + + Passage + Looks suspicous! + Walk here + search + 1 + 1 + 1 + 0 + cave snaptrap + + + snap trap + aaaarghh + WalkTo + Examine + 1 + 1 + 1 + 0 + cave snaptrapa + + + Wooden planks + You can walk across these + WalkTo + Examine + 1 + 1 + 1 + 0 + cave planks + + + Passage + Looks suspicous! + Walk here + search + 1 + 1 + 1 + 0 + cave snaptrap + + + Passage + Looks suspicous! + Walk here + search + 1 + 1 + 1 + 0 + cave snaptrap + + + Flames of zamorak + Careful + search + Examine + 1 + 2 + 2 + 0 + cave bloodwell + + + Platform + An ancient construction + WalkTo + Examine + 1 + 1 + 1 + 0 + cave platform verysmall + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + wall grill + It seems to filter the rotten air through the caverns + climb up + Examine + 1 + 1 + 1 + 0 + cave wallgrill + + + Ledge + I might be able to make to the other side + jump off + climb up + 1 + 1 + 1 + 0 + cave ledge + + + wall grill + It seems to filter the rotten air through the caverns + climb up + Examine + 1 + 1 + 1 + 0 + cave wallgrill + + + Dug up soil + A freshly dug pile of mud + search + Examine + 0 + 1 + 1 + 0 + mudpatch + + + Dug up soil + A freshly dug pile of mud + search + Examine + 0 + 1 + 1 + 0 + mudpatch + + + Pile of mud + Mud caved in from above + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + stalagmite + Formed over thousands of years + WalkTo + Examine + 0 + 1 + 1 + 0 + cave small stagamite + + + Pile of mud + Mud and rocks piled up + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Pile of mud + Mud and rocks piled up + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Pile of mud + Mud and rocks piled up + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Pile of mud + Mud and rocks piled up + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Pile of mud + Mud and rocks piled up + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Spiked pit + I don't want to go down there + WalkTo + Examine + 0 + 1 + 1 + 0 + spikedpit + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Boulder + Could be dangerous! + WalkTo + Examine + 1 + 2 + 2 + 0 + cave bolder + + + crate + Someone or something has been here before us + WalkTo + Search + 1 + 1 + 1 + 0 + crate + + + Door + Spooky! + open + Examine + 1 + 1 + 1 + 0 + cave templedoor + + + Platform + An ancient construction + WalkTo + Examine + 1 + 1 + 1 + 0 + cave platform small2 + + + Cage remains + Poor unicorn! + WalkTo + Search + 1 + 1 + 1 + 0 + cave smashedcage + + + Ledge + I might be able to climb that + climb up + Examine + 1 + 1 + 1 + 0 + cave ledge + + + Passage + Looks suspicous! + Walk here + Examine + 1 + 1 + 1 + 0 + cave snaptrap + + + Passage + Looks suspicous! + Walk here + Examine + 1 + 1 + 1 + 0 + cave snaptrap + + + Gate of Zamorak + It doesn't look very inviting + open + Examine + 1 + 3 + 1 + 0 + rams skull door + + + Rocks + A small rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Bridge support + An ancient construction + WalkTo + Examine + 1 + 1 + 1 + 0 + cave bridge supportbase + + + Tomb of Iban + A clay shrine to lord iban + Open + Examine + 1 + 1 + 2 + 96 + hazeeltomb + + + Claws of Iban + claws of iban + WalkTo + Examine + 1 + 1 + 1 + 96 + clawsofiban + + + barrel + Its stinks of alcohol + empty + Examine + 1 + 1 + 1 + 0 + barrel + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Rocks + More rocks + step over + search for traps + 1 + 1 + 1 + 0 + cave speartrap + + + Rocks + More rocks + step over + search for traps + 1 + 1 + 1 + 0 + cave speartrap + + + Swamp + That smells horrid + WalkTo + Examine + 1 + 1 + 1 + 0 + cave swampbubbles + + + Chest + Perhaps I should search it + Search + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Stone bridge + An ancient stone construction + WalkTo + Examine + 0 + 1 + 1 + 0 + bridge section corner + + + cage + That's no way to live + search + Examine + 0 + 1 + 1 + 0 + gnomecage + + + cage + That's no way to live + search + Examine + 0 + 1 + 1 + 0 + gnomecage + + + Stone steps + They lead into the darkness + walk down + Examine + 0 + 1 + 1 + 0 + cave bridge stairs + + + Pile of mud + Mud and rocks piled up + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Stone bridge + The bridge has partly collapsed + cross + Examine + 1 + 1 + 3 + 0 + bridge section collapsed + + + Stone bridge + The bridge has partly collapsed + jump over + Examine + 1 + 1 + 3 + 0 + bridge section collapsed2 + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Pit of the Damned + The son of zamoracks alter... + WalkTo + Examine + 1 + 1 + 1 + 0 + cave temple alter + + + Open Door + Spooky! + open + Examine + 1 + 1 + 1 + 0 + cave templedooropen + + + signpost + Observatory reception + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + Stone Gate + A mystical looking object + Go through + Look + 1 + 2 + 2 + 0 + henge + + + Chest + Perhaps there is something inside + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Zodiac + A map of the twelve signs of the zodiac + WalkTo + Examine + 0 + 3 + 3 + 0 + zodiac + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Stone steps + They lead into the darkness + walk down + Examine + 0 + 1 + 1 + 0 + cave bridge stairs + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Rock + Scripture has been carved into the rock + read + Examine + 1 + 1 + 1 + 0 + cave carvings + + + Telescope + A device for viewing the heavens + Use + Examine + 1 + 1 + 1 + 0 + telescope + + + Gate + The entrance to the dungeon jail + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + sacks + These sacks feels lumpy! + Search + Examine + 1 + 1 + 1 + 0 + sacks + + + Ladder + the ladder goes down into a dark area + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Chest + All these chests look the same! + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + All these chests look the same! + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Bookcase + A very roughly constructed bookcase. + WalkTo + Search + 1 + 1 + 2 + 0 + bookcase + + + Iron Gate + A well wrought iron gate - it's locked. + Open + Search + 2 + 1 + 2 + 0 + metalgateclosed + + + Ladder + the ladder down to the cavern + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Chest + Perhaps there is something inside + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + All these chests look the same! + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + Perhaps there is something inside + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + All these chests look the same! + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Rockslide + A pile of rocks blocks your path + WalkTo + Examine + 1 + 1 + 1 + 0 + rock3 + + + Altar + An altar to the evil God Zamorak + Recharge at + Examine + 1 + 2 + 1 + 0 + chaosaltar + + + column + Formed over thousands of years + WalkTo + Examine + 1 + 1 + 1 + 0 + cave pillar + + + Grave of Scorpius + Here lies Scorpius: dread follower of zamorak + Read + Examine + 1 + 1 + 3 + 0 + gravestone1 + + + Bank Chest + Allows you to access your bank. + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + dwarf multicannon + fires metal balls + fire + pick up + 0 + 1 + 1 + 0 + dwarf multicannon + + + Disturbed sand + Footprints in the sand show signs of a struggle + Look + Search + 0 + 1 + 1 + 0 + sandyfootsteps + + + Disturbed sand + Footprints in the sand show signs of a struggle + Look + Search + 0 + 1 + 1 + 0 + sandyfootsteps + + + dwarf multicannon base + bang + pick up + Examine + 0 + 1 + 1 + 0 + dwarf multicannon part1 + + + dwarf multicannon stand + bang + pick up + Examine + 0 + 1 + 1 + 0 + dwarf multicannon part2 + + + dwarf multicannon barrels + bang + pick up + Examine + 0 + 1 + 1 + 0 + dwarf multicannon part3 + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + fence + These bridges seem hastily put up + WalkTo + Examine + 0 + 1 + 1 + 0 + gnomefence + + + signpost + a signpost + read + Examine + 1 + 1 + 1 + 0 + signpost2 + + + Rocks + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + brownclimbingrocks + + + Rocks + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + brownclimbingrocks + + + Cave entrance + A noxious smell emanates from the cave... + enter + Examine + 1 + 3 + 1 + 0 + caveentrance2 + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wouldn't like to think where the owner is now + Search + Close + 1 + 1 + 1 + 0 + ChestClosed + + + Wooden Doors + Large oak doors constantly watched by guards + Open + Watch + 2 + 1 + 2 + 0 + hillsidedoor + + + Pedestal + something fits on here + WalkTo + Examine + 1 + 1 + 1 + 96 + stonestand + + + bush + A leafy bush + Search + Examine + 1 + 1 + 1 + 0 + bush1 + + + bush + A leafy bush + Search + Examine + 1 + 1 + 1 + 0 + bush1 + + + Standard + A standard with a human skull on it + WalkTo + Examine + 1 + 1 + 1 + 0 + ogre standard + + + Mining Cave + A gaping hole that leads to another section of the mine + enter + Examine + 1 + 3 + 1 + 0 + caveentrance2 + + + Mining Cave + A gaping hole that leads to another section of the mine + enter + Examine + 1 + 3 + 1 + 0 + caveentrance2 + + + Rocks + A small rocky outcrop + WalkTo + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Lift + To brings mined rocks to the surface + Operate + Examine + 1 + 1 + 2 + 0 + liftwinch + + + Mining Barrel + For loading up mined stone from below ground + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + Hole + I wonder where this leads... + enter + Examine + 1 + 1 + 1 + 0 + hole + + + Hole + I wonder where this leads... + enter + Examine + 1 + 1 + 1 + 0 + hole + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Counter + An ogre is selling items here + Steal from + Examine + 1 + 1 + 1 + 0 + rockcounter + + + Track + Train track + Look + Examine + 1 + 2 + 2 + 0 + trackcurve + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Mine Cart + A heavily constructed and often used mining cart. + Look + Search + 1 + 1 + 1 + 0 + minecart + + + Lift Platform + A wooden lift that is operated from the surface. + Use + Search + 1 + 1 + 1 + 0 + liftbed + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + I wonder what is inside... + Close + Examine + 1 + 1 + 1 + 0 + ChestOpen + + + Watch tower + Constructed by the dwarven black guard + WalkTo + Examine + 0 + 2 + 2 + 0 + watchtower + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Cave entrance + I wonder what is inside... + enter + Examine + 1 + 2 + 2 + 0 + caveentrance + + + Pile of mud + Mud caved in from above + climb + Examine + 1 + 2 + 1 + 0 + mudpile + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + crate + A crate + search + Examine + 1 + 1 + 1 + 0 + crate + + + crate + A crate + search + Examine + 1 + 1 + 1 + 0 + crate + + + Gate + This gate barrs your way into gu'tanoth + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Gate + This gate barrs your way into gu'tanoth + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + bush + A leafy bush + Search + Examine + 1 + 1 + 1 + 0 + bush1 + + + bush + A leafy bush + Search + Examine + 1 + 1 + 1 + 0 + bush1 + + + bush + A leafy bush + Search + Examine + 1 + 1 + 1 + 0 + bush1 + + + bush + A leafy bush + Search + Examine + 1 + 1 + 1 + 0 + bush1 + + + multicannon + fires metal balls + inspect + Examine + 1 + 1 + 1 + 0 + dwarf multicannon + + + Rocks + Some rocks are close to the egde + jump over + look at + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + Some rocks are close to the edge + jump over + look at + 1 + 1 + 1 + 0 + cave rock1 + + + Ladder + it's a ladder leading downwards + Climb-down + Examine + 0 + 1 + 1 + 0 + ladderdown + + + Cave entrance + I wonder what is inside... + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Counter + An ogre is selling cakes here + Steal from + Examine + 1 + 1 + 1 + 0 + rock cake counter + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Bookcase + A large collection of books + Look + Search + 1 + 1 + 2 + 0 + bookcase + + + Captains Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Experimental Anvil + An experimental anvil - for developing new techniques in forging + Use + Examine + 1 + 1 + 1 + 0 + anvil + + + Rocks + A small pile of stones + Search + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Rocks + A small rocky outcrop + Search + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + Column + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena colomn + + + Wall + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena wall + + + Wall + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena corner + + + Wall + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena tallwall + + + Wall + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena cornerfill + + + Lever + The lever is up + pull + Examine + 0 + 1 + 1 + 0 + leverup + + + Lever + The lever is down + pull + Examine + 0 + 1 + 1 + 0 + leverdown + + + Wall + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena tallcorner + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Wall + Created by ancient mages + WalkTo + Examine + 1 + 1 + 1 + 0 + magearena plain wall + + + Gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Gate + The gate is closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + shock + cosmic energy + WalkTo + Examine + 1 + 1 + 1 + 0 + spellshock + + + Desk + A very strong looking table with some locked drawers. + WalkTo + Search + 1 + 2 + 1 + 120 + counter + + + Cave + I wonder what's inside! + enter + Examine + 1 + 1 + 1 + 0 + small caveentrance2 + + + Mining Cart + A sturdy well built mining cart with barrels full of rock on the back. + WalkTo + Search + 1 + 2 + 3 + 0 + cart + + + Rock of Dalgroth + A mysterious boulder of the ogres + mine + prospect + 1 + 2 + 2 + 0 + cave bolder + + + entrance + Created by ancient mages + walk through + Examine + 1 + 1 + 1 + 0 + magearena door + + + Dried Cactus + It looks very spikey + WalkTo + Examine + 1 + 1 + 1 + 0 + cactuswatered + + + climbing rocks + I wonder if I can climb up these + climb + Examine + 0 + 1 + 1 + 0 + climbing_rocks + + + Rocks + Strange rocks - who knows why they're wanted? + Mine + Prospect + 1 + 1 + 1 + 0 + tinrock1 + + + lightning + blimey! + WalkTo + Examine + 1 + 1 + 1 + 0 + lightning1 + + + Crude Desk + A very roughly constructed desk + WalkTo + Search + 1 + 2 + 1 + 120 + counter + + + Heavy Metal Gate + This is an immense and very heavy looking gate made out of thick wrought metal + Look + Push + 2 + 1 + 2 + 0 + metalgateclosed + + + Counter + An ogre is selling cakes here + Steal from + Examine + 1 + 1 + 1 + 0 + rock cake counter + + + Crude bed + A flea infested sleeping experience + rest + Examine + 1 + 1 + 2 + 0 + poorbed + + + flames + looks hot! + WalkTo + Examine + 1 + 1 + 1 + 0 + firespell1 + + + Carved Rock + An ornately carved rock with a pointed recepticle + WalkTo + Search + 1 + 1 + 1 + 120 + cave small stagamite + + + USE + FREE SLOT PLEASE USE + WalkTo + Examine + 1 + 1 + 1 + 0 + crate + + + crate + A crate used for storing materials + search + Examine + 1 + 1 + 1 + 0 + crate + + + crate + A crate used for storing materials + search + Examine + 1 + 1 + 1 + 0 + crate + + + barrel + Its shut + search + Examine + 1 + 1 + 1 + 0 + barrel + + + Brick + A stone brick + WalkTo + Examine + 1 + 1 + 1 + 0 + 1-1light + + + Brick + A stone brick + WalkTo + Examine + 1 + 1 + 1 + 0 + 1-1dark + + + Brick + A stone brick + WalkTo + Examine + 1 + 3 + 1 + 0 + 1-3light + + + Brick + A stone brick + WalkTo + Examine + 1 + 3 + 1 + 0 + 1-3dark + + + Brick + A stone brick + WalkTo + Examine + 1 + 2 + 2 + 0 + 2-2light + + + Brick + A stone brick + WalkTo + Examine + 1 + 1 + 1 + 0 + 2-2dark + + + Barrier + this section is roped off + WalkTo + Examine + 1 + 1 + 1 + 0 + barrier1 + + + buried skeleton + I hope I don't meet any of these + search + Examine + 1 + 1 + 1 + 0 + halfburiedskeleton + + + Brick + A stone brick + WalkTo + Examine + 1 + 1 + 1 + 0 + 2-1light + + + Brick + A stone brick + WalkTo + Examine + 1 + 1 + 1 + 0 + 2-1light + + + Specimen tray + A pile of sifted earth + WalkTo + Search + 1 + 2 + 2 + 0 + compost + + + winch + This winches earth from the dig hole + Operate + Examine + 1 + 1 + 2 + 0 + liftwinch + + + crate + A crate + search + Examine + 1 + 1 + 1 + 0 + crate + + + crate + A crate + search + Examine + 1 + 1 + 1 + 0 + crate + + + Urn + A large ornamental urn + WalkTo + Examine + 1 + 1 + 1 + 0 + largeurn + + + buried skeleton + I'm glad this isn't around now + search + Examine + 1 + 1 + 1 + 0 + halfburiedskeleton2 + + + panning point + a shallow where I can pan for gold + look + Examine + 0 + 1 + 1 + 0 + fishing + + + Rocks + A small rocky outcrop + WalkTo + Examine + 1 + 1 + 1 + 0 + cave rock1 + + + signpost + a signpost + read + Examine + 1 + 1 + 1 + 0 + signpost2 + + + signpost + a signpost + read + Examine + 1 + 1 + 1 + 0 + signpost2 + + + signpost + a signpost + read + Examine + 1 + 1 + 1 + 0 + signpost2 + + + signpost + a signpost + read + Examine + 1 + 1 + 1 + 0 + signpost2 + + + signpost + Digsite educational centre + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + soil + soil + search + Examine + 0 + 1 + 1 + 0 + dugupsoil1 + + + soil + soil + search + Examine + 0 + 1 + 1 + 0 + dugupsoil2 + + + soil + soil + search + Examine + 0 + 1 + 1 + 0 + dugupsoil3 + + + Gate + The gate has closed + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + ship + The ship is sinking + WalkTo + Examine + 2 + 1 + 2 + 0 + sinkingshipfront + + + barrel + The ship is sinking + climb on + Examine + 2 + 1 + 2 + 0 + sinkingbarrel + + + Leak + The ship is sinking + fill + Examine + 0 + 1 + 1 + 0 + shipleak + + + bush + A leafy bush + search + Examine + 1 + 1 + 1 + 0 + bush1 + + + bush + A leafy bush + search + Examine + 1 + 1 + 1 + 0 + bush1 + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + sacks + Yep they're sacks + search + Examine + 1 + 1 + 1 + 0 + sacks + + + sacks + Yep they're sacks + search + Examine + 1 + 1 + 1 + 0 + sacks + + + Leak + The ship is sinking + fill + Examine + 0 + 1 + 1 + 0 + shipleak2 + + + cupboard + The cupboard is shut + search + Examine + 1 + 1 + 2 + 0 + cupboardopen + + + Wrought Mithril Gates + Magnificent wrought mithril gates giving access to the Legends Guild + open + Search + 2 + 1 + 2 + 0 + metalgateclosed + + + Legends Hall Doors + Solid Oak doors leading to the Hall of Legends + Open + Search + 2 + 1 + 2 + 0 + doubledoorsclosed + + + Camp bed + Not comfortable but useful nonetheless + WalkTo + Examine + 1 + 1 + 2 + 0 + poorbed + + + barrel + It has a lid on it - I need something to lever it off + WalkTo + Examine + 1 + 1 + 1 + 0 + barrelredcross + + + barrel + I wonder what is inside... + search + Examine + 1 + 1 + 1 + 0 + barrelredcross + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Chest + I wonder what is inside... + Open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Dense Jungle Tree + Thick vegetation + Chop + Examine + 1 + 1 + 1 + 0 + jungle medium size plant + + + Jungle tree stump + A chopped down jungle tree + Walk + Examine + 1 + 1 + 1 + 0 + treestump + + + signpost + To the digsite + WalkTo + Examine + 1 + 1 + 1 + 0 + signpost + + + gate + You can pass through this on the members server + open + Examine + 2 + 1 + 2 + 0 + metalgateclosed + + + Bookcase + A large collection of books + search + Examine + 1 + 1 + 2 + 0 + bookcase + + + Dense Jungle Tree + An exotic looking tree + Chop + Examine + 1 + 1 + 1 + 0 + jungle tree 2 + + + Dense Jungle Tree + An exotic looking tree + Chop + Examine + 1 + 1 + 1 + 0 + jungle tree 1 + + + Spray + There's a strong wind + WalkTo + Examine + 1 + 1 + 1 + 0 + shipspray1 + + + Spray + There's a strong wind + WalkTo + Examine + 1 + 1 + 1 + 0 + shipspray2 + + + winch + This winches earth from the dig hole + Operate + Examine + 1 + 1 + 2 + 0 + liftwinch + + + Brick + It seems these were put here deliberately + search + Examine + 1 + 1 + 1 + 0 + 1-1light + + + Rope + it's a rope leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ropeforclimbingbot + + + Rope + it's a rope leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ropeforclimbingbot + + + Dense Jungle Palm + A hardy palm tree with dense wood + Chop + Examine + 1 + 1 + 1 + 0 + palm2 + + + Dense Jungle Palm + A hardy palm tree with dense wood + Chop + Examine + 1 + 1 + 1 + 0 + palm + + + Trawler net + A huge net to catch little fish + inspect + Examine + 1 + 1 + 1 + 0 + trawlernet-l + + + Trawler net + A huge net to catch little fish + inspect + Examine + 1 + 1 + 1 + 0 + trawlernet-r + + + Brick + The bricks are covered in the strange compound + WalkTo + Examine + 1 + 1 + 1 + 0 + 1-1light + + + Chest + I wonder what is inside ? + open + Examine + 1 + 1 + 1 + 0 + ChestClosed + + + Chest + Perhaps I should search it + Search + Close + 1 + 1 + 1 + 0 + ChestOpen + + + Trawler catch + Smells like fish! + Search + Examine + 1 + 1 + 1 + 0 + trawlernet + + + Yommi Tree + An adolescent rare and mystical looking tree in + WalkTo + Examine + 1 + 2 + 2 + 0 + totemtree1 + + + Grown Yommi Tree + A fully grown rare and mystical looking tree + WalkTo + Examine + 1 + 2 + 2 + 0 + totemtree2 + + + Chopped Yommi Tree + A mystical looking tree that has recently been felled + WalkTo + Examine + 1 + 2 + 2 + 0 + totemtree3 + + + Trimmed Yommi Tree + The trunk of the yommi tree. + WalkTo + Examine + 1 + 2 + 2 + 0 + totemtree4 + + + Totem Pole + A nicely crafted wooden totem pole. + Lift + Examine + 1 + 2 + 2 + 0 + totemtree5 + + + Baby Yommi Tree + A baby Yommi tree - with a mystical aura + WalkTo + Examine + 1 + 2 + 2 + 0 + smallfern + + + Fertile earth + A very fertile patch of earth + WalkTo + Examine + 0 + 2 + 2 + 0 + dugupsoil1 + + + Rock Hewn Stairs + steps cut out of the living rock + Climb + Examine + 1 + 2 + 3 + 0 + rocksteps + + + Hanging rope + A rope hangs from the ceiling + WalkTo + Examine + 1 + 1 + 1 + 0 + ropeladder + + + Rocks + A large boulder blocking the stream + Move + Examine + 1 + 2 + 2 + 0 + cave bolder + + + Boulder + A large boulder blocking the way + WalkTo + Smash to pieces + 1 + 2 + 2 + 0 + cave bolder + + + dwarf multicannon + fires metal balls + fire + pick up + 1 + 1 + 1 + 0 + dwarf multicannon + + + dwarf multicannon base + bang + pick up + Examine + 1 + 1 + 1 + 0 + dwarf multicannon part1 + + + dwarf multicannon stand + bang + pick up + Examine + 1 + 1 + 1 + 0 + dwarf multicannon part2 + + + dwarf multicannon barrels + bang + pick up + Examine + 1 + 1 + 1 + 0 + dwarf multicannon part3 + + + rock + A rocky outcrop + climb over + Examine + 1 + 1 + 1 + 0 + rocks1 + + + Rock Hewn Stairs + steps cut out of the living rock + Climb + Examine + 1 + 2 + 3 + 0 + rocksteps + + + Rock Hewn Stairs + steps cut out of the living rock + Climb + Examine + 1 + 2 + 3 + 0 + rocksteps + + + Rock Hewn Stairs + steps cut out of the living rock + Climb + Examine + 1 + 2 + 3 + 0 + rocksteps + + + Compost Heap + The family gardeners' compost heap + WalkTo + Investigate + 1 + 2 + 2 + 0 + compost + + + beehive + An old looking beehive + WalkTo + Investigate + 1 + 1 + 1 + 0 + beehive + + + Drain + This drainpipe runs from the kitchen to the sewers + WalkTo + Investigate + 0 + 1 + 1 + 0 + pipe&drain + + + web + An old thick spider's web + WalkTo + Investigate + 0 + 1 + 1 + 0 + floorweb + + + fountain + There seems to be a lot of insects here + WalkTo + Investigate + 1 + 2 + 2 + 0 + fountain + + + Sinclair Crest + The Sinclair family crest + WalkTo + Investigate + 0 + 1 + 1 + 0 + wallshield + + + barrel + Annas stuff - There seems to be something shiny at the bottom + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + barrel + Bobs things - There seems to be something shiny at the bottom + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + barrel + Carols belongings - there seems to be something shiny at the bottom + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + barrel + Davids equipment - there seems to be something shiny at the bottom + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + barrel + Elizabeths clothes - theres something shiny at the bottom + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + barrel + Franks barrel seems to have something shiny at the bottom + WalkTo + Search + 1 + 1 + 1 + 0 + barrel + + + Flour Barrel + Its full of flour + WalkTo + Take From + 1 + 1 + 1 + 0 + barrel + + + sacks + Full of various gardening tools + WalkTo + investigate + 1 + 1 + 1 + 0 + sacks + + + gate + A sturdy and secure wooden gate + WalkTo + Investigate + 2 + 1 + 2 + 0 + woodengateclosed + + + Dead Yommi Tree + A dead Yommi Tree - it looks like a tough axe will be needed to fell this + WalkTo + Inspect + 1 + 2 + 2 + 0 + deadtree2 + + + clawspell + forces of guthix + WalkTo + Examine + 1 + 1 + 1 + 0 + clawspell1 + + + Rocks + The remains of a large rock + WalkTo + Examine + 1 + 2 + 2 + 0 + cave rock1 + + + crate + A crate of some kind + WalkTo + Search + 1 + 1 + 1 + 70 + crate + + + Cavernous Opening + A dark and mysterious cavern + enter + search + 1 + 3 + 1 + 0 + caveentrance2 + + + Ancient Lava Furnace + A badly damaged furnace fueled by red hot Lava - it looks ancient + Look + Search + 1 + 2 + 2 + 0 + furnace + + + Spellcharge + forces of guthix + WalkTo + Examine + 1 + 1 + 1 + 0 + Spellcharge1 + + + Rocks + A small rocky outcrop + WalkTo + Search + 1 + 1 + 1 + 0 + cave rock1 + + + cupboard + The cupboard is shut + open + Examine + 1 + 1 + 2 + 0 + cupboard + + + sacks + Yep they're sacks + search + Examine + 1 + 1 + 1 + 0 + sacks + + + Rock + A rocky outcrop + WalkTo + Search + 1 + 1 + 1 + 0 + rocks1 + + + Saradomin stone + A faith stone + chant to + Examine + 1 + 1 + 1 + 0 + saradominstone + + + Guthix stone + A faith stone + chant to + Examine + 1 + 1 + 1 + 0 + guthixstone + + + Zamorak stone + A faith stone + chant to + Examine + 1 + 1 + 1 + 0 + zamorakstone + + + Magical pool + A cosmic portal + step into + Examine + 1 + 2 + 2 + 0 + rockpool + + + Wooden Beam + Some sort of support - perhaps used with ropes to lower people over the hole + WalkTo + Search + 0 + 1 + 1 + 0 + Scaffoldsupport + + + Rope down into darkness + A scarey downwards trip into possible doom. + WalkTo + Use + 0 + 1 + 1 + 0 + ScaffoldsupportRope + + + Cave entrance + A dark cave entrance leading to the surface. + Enter + Examine + 1 + 3 + 1 + 0 + caveentrance2 + + + Cave entrance + A small tunnel that leads to a large room beyond. + enter + Examine + 1 + 2 + 2 + 0 + Shamancave + + + Ancient Wooden Doors + The doors are locked shut + Open + Pick Lock + 2 + 1 + 2 + 0 + doubledoorsclosed + + + Table + An old rickety table + WalkTo + search + 1 + 1 + 1 + 96 + table + + + Crude bed + Barely a bed at all + Rest + Search + 1 + 1 + 2 + 0 + poorbed + + + Tall Reeds + A tall plant with a tube for a stem. + WalkTo + Search + 0 + 1 + 1 + 0 + bullrushes + + + Goblin foot prints + They seem to be heading south east + WalkTo + Examine + 0 + 1 + 1 + 0 + sandyfootsteps + + + Dark Metal Gate + A dark metalic gate which seems to be fused with the rock + Open + Search + 2 + 1 + 2 + 0 + metalgateclosed + + + Magical pool + A cosmic portal + step into + Examine + 1 + 2 + 2 + 0 + rockpool + + + Rope Up + A welcome rope back up and out of this dark place. + Climb + Examine + 0 + 1 + 1 + 0 + obstical_ropeswing + + + Half buried remains + Some poor unfortunate soul + WalkTo + Search + 1 + 1 + 1 + 0 + skeletonwithbag + + + Totem Pole + A carved and decorated totem pole + Look + Examine + 1 + 1 + 1 + 0 + totemtreeevil + + + Totem Pole + A carved and decorated totem pole + Look + Examine + 1 + 1 + 1 + 0 + totemtreegood + + + Comfy bed + Its a bed - wow + rest + Examine + 1 + 2 + 2 + 0 + bed + + + Rotten Yommi Tree + A decomposing fully grown Yommi Tree + WalkTo + Inspect + 1 + 2 + 2 + 0 + totemtreerotten2 + + + Rotten Yommi Tree + A decomposing felled Yommi Tree + WalkTo + Inspect + 1 + 2 + 2 + 0 + totemtreerotten3 + + + Rotten Yommi Tree + A decomposing Yommi Tree Trunk + WalkTo + Inspect + 1 + 2 + 2 + 0 + totemtreerotten4 + + + Rotten Totem Pole + A decomposing Totem Pole + WalkTo + Inspect + 1 + 2 + 2 + 0 + totemtreerotten5 + + + Leafy Palm Tree + A shady palm tree + WalkTo + Shake + 1 + 1 + 1 + 0 + palm + + + Grand Viziers Desk + A very elegant desk - you could knock it to get the Grand Viziers attention. + WalkTo + Knock on table + 1 + 2 + 1 + 120 + counter + + + Strange Barrel + It might have something inside of it. + Smash + Examine + 1 + 1 + 1 + 0 + barrel + + + ship + A sturdy sailing ship + WalkTo + Examine + 0 + 5 + 3 + 0 + Shipfront + + + ship + A sturdy sailing ship + WalkTo + Examine + 0 + 2 + 3 + 0 + Shipmiddle + + + ship + A sturdy sailing ship + WalkTo + Examine + 0 + 5 + 3 + 0 + Shipback + + + digsite bed + Not comfortable but useful nonetheless + sleep + Examine + 1 + 1 + 2 + 0 + poorbed + + + Tea stall + A stall selling oriental infusions + WalkTo + Steal from + 1 + 2 + 2 + 112 + market + + + Boulder + A large boulder blocking the way + WalkTo + Smash to pieces + 1 + 2 + 2 + 0 + cave bolder + + + Boulder + A large boulder blocking the way + WalkTo + Smash to pieces + 1 + 2 + 2 + 0 + cave bolder + + + Damaged Earth + Disturbed earth - it will heal itself in time + WalkTo + Examine + 0 + 1 + 1 + 0 + dugupsoil1 + + + Ladder + it's a ladder leading upwards + Climb-Up + Examine + 1 + 1 + 1 + 0 + ladder + + + Ladder + it's a ladder leading downwards + Climb-Down + Examine + 1 + 1 + 1 + 0 + ladderdown + + + Sleigh + It's Santa's Sleigh! + WalkTo + Examine + 1 + 1 + 1 + 0 + gnomeglider + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/GameObjectDef.xml.gz b/GameServer/conf/server/defs/GameObjectDef.xml.gz new file mode 100644 index 0000000..1b9f864 Binary files /dev/null and b/GameServer/conf/server/defs/GameObjectDef.xml.gz differ diff --git a/GameServer/conf/server/defs/ItemDef.xml b/GameServer/conf/server/defs/ItemDef.xml new file mode 100644 index 0000000..28ab3e0 --- /dev/null +++ b/GameServer/conf/server/defs/ItemDef.xml @@ -0,0 +1,15900 @@ + + + Iron Mace + + false + false + true + 63 + 16 + A spiky mace + 0 + 15654365 + + + Iron Short Sword + + false + false + true + 91 + 16 + A razor sharp sword + 1 + 15654365 + + + Iron Kite Shield + + false + false + true + 238 + 8 + A large metal shield + 2 + 15654365 + + + Iron Square Shield + + false + false + true + 168 + 8 + A medium metal shield + 3 + 15654365 + + + Wooden Shield + + false + false + true + 20 + 8 + A solid wooden shield + 4 + 0 + + + Medium Iron Helmet + + false + false + true + 84 + 32 + A medium sized helmet + 5 + 15654365 + + + Large Iron Helmet + + false + false + true + 154 + 33 + A full face helmet + 6 + 15654365 + + + Iron Chain Mail Body + + false + false + true + 210 + 64 + A series of connected metal rings + 7 + 15654365 + + + Iron Plate Mail Body + + false + false + true + 560 + 322 + Provides excellent protection + 8 + 15654365 + + + Iron Plate Mail Legs + + false + false + true + 280 + 644 + These look pretty heavy + 9 + 15654365 + + + Coins + + true + false + true + 1 + 0 + Lovely money! + 10 + 0 + + + Bronze Arrows + + true + false + true + 2 + 0 + Arrows with bronze heads + 11 + 16737817 + + + Iron Axe + + false + false + true + 56 + 16 + A woodcutters axe + 12 + 15654365 + + + Knife + + false + false + true + 6 + 0 + A dangerous looking knife + 13 + 0 + + + Logs + + false + false + true + 4 + 0 + A number of wooden logs + 14 + 0 + + + Leather Armour + + false + false + true + 21 + 64 + Better than no armour! + 15 + 0 + + + Leather Gloves + + false + false + true + 6 + 256 + These will keep my hands warm! + 17 + 0 + + + Boots + + false + false + true + 6 + 512 + Comfortable leather boots + 16 + 0 + + + Cabbage + Eat + false + false + true + 1 + 0 + Yuck I don't like cabbage + 18 + 0 + + + Egg + + false + false + true + 4 + 0 + A nice fresh egg + 19 + 0 + + + Bones + Bury + false + false + true + 1 + 0 + Ew it's a pile of bones + 20 + 0 + + + Bucket + + false + false + true + 2 + 0 + It's a wooden bucket + 22 + 1052688 + + + Milk + + false + false + true + 6 + 0 + It's a bucket of milk + 22 + 0 + + + Flour + + false + false + false + 2 + 0 + A little heap of flour + 23 + 0 + + + Amulet of GhostSpeak + + false + false + false + 35 + 1024 + It lets me talk to ghosts + 24 + 0 + + + Silverlight key 1 + + false + false + false + 1 + 0 + A key given to me by Wizard Traiborn + 25 + 14540253 + + + Silverlight key 2 + + false + false + false + 1 + 0 + A key given to me by Captain Rovin + 25 + 14540253 + + + Skull + + false + false + false + 1 + 0 + A spooky looking skull + 26 + 0 + + + Iron dagger + + false + false + true + 35 + 16 + Short but pointy + 80 + 15654365 + + + Grain + + false + false + true + 2 + 0 + Some wheat heads + 27 + 0 + + + Book + Read + false + false + false + 1 + 0 + + 28 + 16755370 + + + Fire-Rune + + true + false + true + 4 + 0 + One of the 4 basic elemental runes + 30 + 0 + + + Water-Rune + + true + false + true + 4 + 0 + One of the 4 basic elemental runes + 31 + 0 + + + Air-Rune + + true + false + true + 4 + 0 + One of the 4 basic elemental runes + 32 + 0 + + + Earth-Rune + + true + false + true + 4 + 0 + One of the 4 basic elemental runes + 33 + 0 + + + Mind-Rune + + true + false + true + 3 + 0 + Used for low level missile spells + 34 + 0 + + + Body-Rune + + true + false + true + 3 + 0 + Used for curse spells + 35 + 0 + + + Life-Rune + + true + true + true + 1 + 0 + Used for summon spells + 36 + 0 + + + Death-Rune + + true + false + true + 20 + 0 + Used for high level missile spells + 37 + 0 + + + Needle + + true + false + true + 1 + 0 + Used with a thread to make clothes + 38 + 0 + + + Nature-Rune + + true + false + true + 7 + 0 + Used for alchemy spells + 39 + 0 + + + Chaos-Rune + + true + false + true + 10 + 0 + Used for mid level missile spells + 40 + 0 + + + Law-Rune + + true + false + true + 12 + 0 + Used for teleport spells + 41 + 0 + + + Thread + + true + false + true + 1 + 0 + Used with a needle to make clothes + 42 + 0 + + + Holy Symbol of saradomin + + false + false + true + 200 + 0 + This needs a string putting on it + 43 + 0 + + + Unblessed Holy Symbol + + false + false + true + 200 + 1024 + This needs blessing + 44 + 0 + + + Cosmic-Rune + + true + false + true + 15 + 0 + Used for enchant spells + 45 + 0 + + + Key + + false + false + false + 1 + 0 + The key to get into the phoenix gang + 25 + 15636736 + + + Key + + false + false + true + 1 + 0 + The key to the phoenix gang's weapons store + 25 + 15636736 + + + Scroll + + false + false + true + 5 + 0 + An intelligence Report + 29 + 0 + + + Water + + false + false + true + 6 + 0 + It's a bucket of water + 22 + 5724145 + + + Silverlight key 3 + + false + false + false + 1 + 0 + A key I found in a drain + 25 + 14540253 + + + Silverlight + + false + false + true + 50 + 16 + A magic sword + 81 + 0 + + + Broken shield + + false + false + true + 1 + 0 + Half of the shield of Arrav + 46 + 0 + + + Broken shield + + false + false + true + 1 + 0 + Half of the shield of Arrav + 47 + 0 + + + Cadavaberries + + false + false + true + 1 + 0 + Poisonous berries + 21 + 15161265 + + + Message + + false + false + true + 1 + 0 + A message from Juliet to Romeo + 29 + 0 + + + Cadava + + false + false + false + 1 + 0 + I'm meant to give this to Juliet + 48 + 11620466 + + + Potion + + false + false + true + 1 + 0 + This is meant to be good for spots + 48 + 5289585 + + + Phoenix Crossbow + + false + false + true + 4 + 16 + Former property of the phoenix gang + 49 + 0 + + + Crossbow + + false + false + true + 70 + 16 + This fires crossbow bolts + 49 + 0 + + + Certificate + + false + false + true + 1 + 0 + I can use this to claim a reward from the king + 29 + 0 + + + Bronze dagger + + false + false + true + 10 + 16 + Short but pointy + 80 + 16737817 + + + Steel dagger + + false + false + true + 125 + 16 + Short but pointy + 80 + 15658734 + + + Mithril dagger + + false + false + true + 325 + 16 + Short but pointy + 80 + 10072780 + + + Adamantite dagger + + false + false + true + 800 + 16 + Short but pointy + 80 + 11717785 + + + Bronze Short Sword + + false + false + true + 26 + 16 + A razor sharp sword + 1 + 16737817 + + + Steel Short Sword + + false + false + true + 325 + 16 + A razor sharp sword + 1 + 15658734 + + + Mithril Short Sword + + false + false + true + 845 + 16 + A razor sharp sword + 1 + 10072780 + + + Adamantite Short Sword + + false + false + true + 2080 + 16 + A razor sharp sword + 1 + 11717785 + + + Bronze Long Sword + + false + false + true + 40 + 16 + A razor sharp sword + 81 + 16737817 + + + Iron Long Sword + + false + false + true + 140 + 16 + A razor sharp sword + 81 + 15654365 + + + Steel Long Sword + + false + false + true + 500 + 16 + A razor sharp sword + 81 + 15658734 + + + Mithril Long Sword + + false + false + true + 1300 + 16 + A razor sharp sword + 81 + 10072780 + + + Adamantite Long Sword + + false + false + true + 3200 + 16 + A razor sharp sword + 81 + 11717785 + + + Rune long sword + + false + false + true + 32000 + 16 + A razor sharp sword + 81 + 65535 + + + Bronze 2-handed Sword + + false + false + true + 80 + 8216 + A very large sword + 82 + 16737817 + + + Iron 2-handed Sword + + false + false + true + 280 + 8216 + A very large sword + 82 + 15654365 + + + Steel 2-handed Sword + + false + false + true + 1000 + 8216 + A very large sword + 82 + 15658734 + + + Mithril 2-handed Sword + + false + false + true + 2600 + 8216 + A very large sword + 82 + 10072780 + + + Adamantite 2-handed Sword + + false + false + true + 6400 + 8216 + A very large sword + 82 + 11717785 + + + Rune 2-handed Sword + + false + false + true + 64000 + 8216 + A very large sword + 82 + 65535 + + + Bronze Scimitar + + false + false + true + 32 + 16 + A vicious curved sword + 83 + 16737817 + + + Iron Scimitar + + false + false + true + 112 + 16 + A vicious curved sword + 83 + 15654365 + + + Steel Scimitar + + false + false + true + 400 + 16 + A vicious curved sword + 83 + 15658734 + + + Mithril Scimitar + + false + false + true + 1040 + 16 + A vicious curved sword + 83 + 10072780 + + + Adamantite Scimitar + + false + false + true + 2560 + 16 + A vicious curved sword + 83 + 11717785 + + + Bronze Axe + + false + false + true + 16 + 16 + A woodcutters axe + 12 + 16737817 + + + Steel Axe + + false + false + true + 200 + 16 + A woodcutters axe + 12 + 15658734 + + + Iron battle Axe + + false + false + true + 182 + 16 + A vicious looking axe + 84 + 15654365 + + + Steel battle Axe + + false + false + true + 650 + 16 + A vicious looking axe + 84 + 15658734 + + + Mithril battle Axe + + false + false + true + 1690 + 16 + A vicious looking axe + 84 + 10072780 + + + Adamantite battle Axe + + false + false + true + 4160 + 16 + A vicious looking axe + 84 + 11717785 + + + Rune battle Axe + + false + false + true + 41600 + 16 + A vicious looking axe + 84 + 65535 + + + Bronze Mace + + false + false + true + 18 + 16 + A spiky mace + 0 + 16737817 + + + Steel Mace + + false + false + true + 225 + 16 + A spiky mace + 0 + 15658734 + + + Mithril Mace + + false + false + true + 585 + 16 + A spiky mace + 0 + 10072780 + + + Adamantite Mace + + false + false + true + 1440 + 16 + A spiky mace + 0 + 11717785 + + + Rune Mace + + false + false + true + 14400 + 16 + A spiky mace + 0 + 65535 + + + Brass key + + false + false + true + 1 + 0 + I wonder what this is the key to + 25 + 16750848 + + + Staff + + false + false + true + 15 + 16 + It's a slightly magical stick + 85 + 10072780 + + + Staff of Air + + false + false + true + 1500 + 16 + A Magical staff + 91 + 65535 + + + Staff of water + + false + false + true + 1500 + 16 + A Magical staff + 91 + 255 + + + Staff of earth + + false + false + true + 1500 + 16 + A Magical staff + 91 + 7353600 + + + Medium Bronze Helmet + + false + false + true + 24 + 32 + A medium sized helmet + 5 + 16737817 + + + Medium Steel Helmet + + false + false + true + 300 + 32 + A medium sized helmet + 5 + 15658734 + + + Medium Mithril Helmet + + false + false + true + 780 + 32 + A medium sized helmet + 5 + 10072780 + + + Medium Adamantite Helmet + + false + false + true + 1920 + 32 + A medium sized helmet + 5 + 11717785 + + + Large Bronze Helmet + + false + false + true + 44 + 33 + A full face helmet + 6 + 16737817 + + + Large Steel Helmet + + false + false + true + 550 + 33 + A full face helmet + 6 + 15658734 + + + Large Mithril Helmet + + false + false + true + 1430 + 33 + A full face helmet + 6 + 10072780 + + + Large Adamantite Helmet + + false + false + true + 3520 + 33 + A full face helmet + 6 + 11717785 + + + Large Rune Helmet + + false + false + true + 35200 + 33 + A full face helmet + 6 + 65535 + + + Bronze Chain Mail Body + + false + false + true + 60 + 64 + A series of connected metal rings + 7 + 16737817 + + + Steel Chain Mail Body + + false + false + true + 750 + 64 + A series of connected metal rings + 7 + 15658734 + + + Mithril Chain Mail Body + + false + false + true + 1950 + 64 + A series of connected metal rings + 7 + 10072780 + + + Adamantite Chain Mail Body + + false + false + true + 4800 + 64 + A series of connected metal rings + 7 + 11717785 + + + Bronze Plate Mail Body + + false + false + true + 160 + 322 + Provides excellent protection + 8 + 16737817 + + + Steel Plate Mail Body + + false + false + true + 2000 + 322 + Provides excellent protection + 8 + 15658734 + + + Mithril Plate Mail Body + + false + false + true + 5200 + 322 + Provides excellent protection + 8 + 10072780 + + + Adamantite Plate Mail Body + + false + false + true + 12800 + 322 + Provides excellent protection + 8 + 11717785 + + + Steel Plate Mail Legs + + false + false + true + 1000 + 644 + These look pretty heavy + 9 + 15658734 + + + Mithril Plate Mail Legs + + false + false + true + 2600 + 644 + These look pretty heavy + 9 + 10072780 + + + Adamantite Plate Mail Legs + + false + false + true + 6400 + 644 + These look pretty heavy + 9 + 11717785 + + + Bronze Square Shield + + false + false + true + 48 + 8 + A medium metal shield + 3 + 16737817 + + + Steel Square Shield + + false + false + true + 600 + 8 + A medium metal shield + 3 + 15658734 + + + Mithril Square Shield + + false + false + true + 1560 + 8 + A medium metal shield + 3 + 10072780 + + + Adamantite Square Shield + + false + false + true + 3840 + 8 + A medium metal shield + 3 + 11717785 + + + Bronze Kite Shield + + false + false + true + 68 + 8 + A large metal shield + 2 + 16737817 + + + Steel Kite Shield + + false + false + true + 850 + 8 + A large metal shield + 2 + 15658734 + + + Mithril Kite Shield + + false + false + true + 2210 + 8 + A large metal shield + 2 + 10072780 + + + Adamantite Kite Shield + + false + false + true + 5440 + 8 + A large metal shield + 2 + 11717785 + + + Cookedmeat + Eat + false + false + true + 4 + 0 + Mmm this looks tasty + 60 + 13395507 + + + Raw chicken + + false + false + true + 1 + 0 + I need to cook this first + 60 + 16747571 + + + Burntmeat + + false + false + true + 1 + 0 + Oh dear + 60 + 5000268 + + + Pot + + false + false + true + 1 + 0 + This pot is empty + 61 + 16748885 + + + Flour + + false + false + true + 10 + 0 + There is flour in this pot + 62 + 0 + + + Bread dough + + false + false + true + 1 + 0 + Some uncooked dough + 63 + 0 + + + Bread + Eat + false + false + true + 12 + 0 + Nice crispy bread + 64 + 16739379 + + + Burntbread + + false + false + true + 1 + 0 + This bread is ruined! + 64 + 5000268 + + + Jug + + false + false + true + 1 + 0 + This jug is empty + 65 + 65856 + + + Water + + false + false + true + 1 + 0 + It's full of water + 65 + 12632319 + + + Wine + Drink + false + false + true + 1 + 0 + It's full of wine + 65 + 12851224 + + + Grapes + + false + false + true + 1 + 0 + Good grapes for wine making + 21 + 9386967 + + + Shears + + false + false + true + 1 + 0 + For shearing sheep + 66 + 0 + + + Wool + + false + false + true + 1 + 0 + I think this came from a sheep + 67 + 0 + + + Fur + + false + false + true + 10 + 0 + This would make warm clothing + 68 + 12288534 + + + Cow hide + + false + false + true + 1 + 0 + I should take this to the tannery + 69 + 0 + + + Leather + + false + false + true + 1 + 0 + It's a piece of leather + 69 + 16757299 + + + Clay + + false + false + true + 1 + 0 + Some hard dry clay + 70 + 15046937 + + + Copper ore + + false + false + true + 3 + 0 + This needs refining + 70 + 16737817 + + + Iron ore + + false + false + true + 17 + 0 + This needs refining + 70 + 11704729 + + + Gold + + false + false + true + 150 + 0 + This needs refining + 73 + 16763980 + + + Mithril ore + + false + false + true + 162 + 0 + This needs refining + 70 + 10072780 + + + Adamantite ore + + false + false + true + 400 + 0 + This needs refining + 70 + 11717785 + + + Coal + + false + false + true + 45 + 0 + Hmm a non-renewable energy source! + 71 + 0 + + + Bronze Pickaxe + + false + false + true + 1 + 0 + Used for mining + 72 + 16737817 + + + Uncut diamond + + false + false + true + 200 + 0 + This would be worth more cut + 73 + 0 + + + Uncut ruby + + false + false + true + 100 + 0 + This would be worth more cut + 73 + 16724736 + + + Uncut emerald + + false + false + true + 50 + 0 + This would be worth more cut + 73 + 3394611 + + + Uncut sapphire + + false + false + true + 25 + 0 + This would be worth more cut + 73 + 19711 + + + Diamond + + false + false + true + 2000 + 0 + This looks valuable + 74 + 0 + + + Ruby + + false + false + true + 1000 + 0 + This looks valuable + 74 + 16724736 + + + Emerald + + false + false + true + 500 + 0 + This looks valuable + 74 + 3394611 + + + Sapphire + + false + false + true + 250 + 0 + This looks valuable + 74 + 19711 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Tinderbox + + false + false + true + 1 + 0 + Useful for lighting a fire + 76 + 0 + + + Chisel + + false + false + true + 1 + 0 + Good for detailed crafting + 77 + 0 + + + Hammer + + false + false + true + 1 + 0 + Good for hitting things! + 78 + 0 + + + Bronze bar + + false + false + true + 8 + 0 + It's a bar of bronze + 79 + 16737817 + + + Iron bar + + false + false + true + 28 + 0 + It's a bar of iron + 79 + 15654365 + + + Steel bar + + false + false + true + 100 + 0 + It's a bar of steel + 79 + 15658734 + + + Gold bar + + false + false + true + 300 + 0 + This looks valuable + 79 + 16763980 + + + Mithril bar + + false + false + true + 300 + 0 + It's a bar of mithril + 79 + 10072780 + + + Adamantite bar + + false + false + true + 640 + 0 + It's a bar of adamantite + 79 + 11717785 + + + Pressure gauge + + false + false + false + 1 + 0 + It looks like part of a machine + 50 + 0 + + + Fish Food + + false + false + true + 1 + 0 + Keeps your pet fish strong and healthy + 51 + 0 + + + Poison + + false + false + true + 1 + 0 + This stuff looks nasty + 52 + 0 + + + Poisoned fish food + + false + false + false + 1 + 0 + Doesn't seem very nice to the poor fishes + 51 + 0 + + + Spinach roll + Eat + false + false + true + 1 + 0 + A home made spinach thing + 53 + 0 + + + Bad wine + Drink + false + false + true + 1 + 0 + Oh dear + 65 + 12851224 + + + Ashes + + false + false + true + 2 + 0 + A heap of ashes + 23 + 11184810 + + + Apron + + false + false + true + 2 + 1024 + A mostly clean apron + 58 + 0 + + + Cape + + false + false + true + 2 + 2048 + A bright red cape + 59 + 16711680 + + + Wizards robe + + false + false + true + 15 + 64 + I can do magic better in this + 87 + 255 + + + Wizardshat + + false + false + true + 2 + 32 + A silly pointed hat + 86 + 255 + + + Brass necklace + + false + false + true + 30 + 1024 + I'd prefer a gold one + 57 + 0 + + + Skirt + + false + false + true + 2 + 128 + A ladies skirt + 88 + 255 + + + Longbow + + false + false + true + 80 + 24 + A Nice sturdy bow + 54 + 65280 + + + Shortbow + + false + false + true + 50 + 24 + Short but effective + 55 + 65280 + + + Crossbow bolts + + true + false + true + 3 + 0 + Good if you have a crossbow! + 56 + 0 + + + Apron + + false + false + true + 2 + 1024 + This will help keep my clothes clean + 58 + 9789488 + + + Chef's hat + + false + false + true + 2 + 32 + What a silly hat + 89 + 0 + + + Beer + Drink + false + false + true + 2 + 0 + A glass of frothy ale + 90 + 0 + + + Skirt + + false + false + true + 2 + 128 + A ladies skirt + 88 + 16036851 + + + Skirt + + false + false + true + 2 + 128 + A ladies skirt + 88 + 4210752 + + + Black Plate Mail Body + + false + false + true + 3840 + 322 + Provides excellent protection + 8 + 3158064 + + + Staff of fire + + false + false + true + 1500 + 16 + A Magical staff + 91 + 16711680 + + + Magic Staff + + false + false + true + 200 + 16 + A Magical staff + 91 + 16777215 + + + Wizardshat + + false + false + true + 2 + 32 + A silly pointed hat + 86 + 4210752 + + + Silk + + false + false + true + 30 + 0 + It's a sheet of silk + 92 + 16724172 + + + Flier + + false + false + true + 1 + 0 + Get your axes from Bob's axes + 29 + 0 + + + Tin ore + + false + false + true + 3 + 0 + This needs refining + 70 + 13810105 + + + Mithril Axe + + false + false + true + 520 + 16 + A powerful axe + 12 + 10072780 + + + Adamantite Axe + + false + false + true + 1280 + 16 + A powerful axe + 12 + 11717785 + + + Bronze battle Axe + + false + false + true + 52 + 16 + A vicious looking axe + 84 + 16737817 + + + Bronze Plate Mail Legs + + false + false + true + 80 + 644 + These look pretty heavy + 9 + 16737817 + + + Ball of wool + + false + false + true + 2 + 0 + Spun from sheeps wool + 93 + 0 + + + Oil can + + false + false + false + 3 + 0 + Its pretty full + 94 + 0 + + + Cape + + false + false + true + 7 + 2048 + A warm black cape + 59 + 2434341 + + + Kebab + Eat + false + false + true + 3 + 0 + A meaty Kebab + 95 + 0 + + + Spade + Dig + false + false + true + 3 + 0 + A fairly small spade + 96 + 0 + + + Closet Key + + false + false + false + 1 + 0 + A slightly smelly key + 25 + 16772608 + + + Rubber tube + + false + false + false + 3 + 0 + Its slightly charred + 97 + 0 + + + Bronze Plated Skirt + + false + false + true + 80 + 640 + Designer leg protection + 88 + 8400921 + + + Iron Plated Skirt + + false + false + true + 280 + 640 + Designer leg protection + 88 + 7824998 + + + Black robe + + false + false + true + 13 + 64 + I can do magic better in this + 87 + 4210752 + + + Stake + + false + false + false + 8 + 16 + A very pointy stick + 98 + 16737817 + + + Garlic + + false + false + true + 3 + 0 + A clove of garlic + 99 + 0 + + + Red spiders eggs + + false + false + true + 7 + 0 + Eewww + 100 + 0 + + + Limpwurt root + + false + false + true + 7 + 0 + The root of a limpwurt plant + 101 + 0 + + + Strength Potion + Drink + false + false + true + 14 + 0 + 4 doses of strength potion + 48 + 15658544 + + + Strength Potion + Drink + false + false + true + 13 + 0 + 3 doses of strength potion + 48 + 15658544 + + + Strength Potion + Drink + false + false + true + 13 + 0 + 2 doses of strength potion + 48 + 15658544 + + + Strength Potion + Drink + false + false + true + 11 + 0 + 1 dose of strength potion + 48 + 15658544 + + + Steel Plated skirt + + false + false + true + 1000 + 640 + Designer leg protection + 88 + 7829367 + + + Mithril Plated skirt + + false + false + true + 2600 + 640 + Designer Leg protection + 88 + 2245205 + + + Adamantite Plated skirt + + false + false + true + 6400 + 640 + Designer leg protection + 88 + 4347170 + + + Cabbage + Eat + false + false + true + 1 + 0 + Yuck I don't like cabbage + 18 + 0 + + + Cape + + false + false + true + 32 + 2048 + A thick blue cape + 59 + 4210926 + + + Large Black Helmet + + false + false + true + 1056 + 33 + A full face helmet + 6 + 4210752 + + + Red Bead + + false + false + true + 4 + 0 + A small round red bead + 102 + 16711680 + + + Yellow Bead + + false + false + true + 4 + 0 + A small round yellow bead + 102 + 16776960 + + + Black Bead + + false + false + true + 4 + 0 + A small round black bead + 102 + 4210752 + + + White Bead + + false + false + true + 4 + 0 + A small round white bead + 102 + 16777215 + + + Amulet of accuracy + + false + false + true + 100 + 1024 + It increases my aim + 24 + 0 + + + Redberries + + false + false + true + 3 + 0 + Very bright red berries + 21 + 16711680 + + + Rope + + false + false + true + 18 + 0 + A Coil of rope + 103 + 0 + + + Reddye + + false + false + true + 5 + 0 + A little bottle of dye + 104 + 16711680 + + + Yellowdye + + false + false + true + 5 + 0 + A little bottle of dye + 104 + 16776960 + + + Paste + + false + false + false + 5 + 0 + A bottle off skin coloured paste + 104 + 15523008 + + + Onion + + false + false + true + 3 + 0 + A strong smelling onion + 99 + 15641190 + + + Bronze key + + false + false + false + 1 + 0 + A heavy key + 25 + 16737817 + + + Soft Clay + + false + false + true + 2 + 0 + Clay that's ready to be used + 105 + 0 + + + Wig + + false + false + false + 2 + 0 + A blonde wig + 106 + 16763992 + + + Wig + + false + false + false + 2 + 0 + A wig made from wool + 106 + 0 + + + Half full wine jug + Drink + false + false + true + 1 + 0 + It's half full of wine + 65 + 12851224 + + + Keyprint + + false + false + false + 2 + 0 + An imprint of a key in a lump of clay + 107 + 0 + + + Black Plate Mail Legs + + false + false + true + 1920 + 644 + These look pretty heavy + 9 + 4210752 + + + Banana + Eat + false + false + true + 2 + 0 + Mmm this looks tasty + 108 + 0 + + + Pastry dough + + false + false + true + 1 + 0 + Some uncooked dough + 63 + 0 + + + Pie dish + + false + false + true + 3 + 0 + For making pies in + 110 + 15634261 + + + Cooking apple + + false + false + true + 1 + 0 + I wonder what i can make with this + 109 + 0 + + + Pie shell + + false + false + true + 1 + 0 + I need to find a filling for this pie + 111 + 0 + + + Uncooked apple pie + + false + false + true + 1 + 0 + I need to cook this first + 112 + 16633518 + + + Uncooked meat pie + + false + false + true + 1 + 0 + I need to cook this first + 112 + 16633518 + + + Uncooked redberry pie + + false + false + true + 1 + 0 + I need to cook this first + 112 + 16633518 + + + Apple pie + Eat + false + false + true + 30 + 0 + Mmm Apple pie + 112 + 11168819 + + + Redberry pie + Eat + false + false + true + 12 + 0 + Looks tasty + 112 + 11168819 + + + Meat pie + Eat + false + false + true + 15 + 0 + Mighty and meaty + 112 + 11168819 + + + Burntpie + Empty dish + false + false + true + 1 + 0 + Oops + 112 + 5000268 + + + Half a meat pie + Eat + false + false + true + 10 + 0 + Mighty and meaty + 113 + 11168819 + + + Half a Redberry pie + Eat + false + false + true + 4 + 0 + Looks tasty + 113 + 11168819 + + + Half an apple pie + Eat + false + false + true + 5 + 0 + Mmm Apple pie + 113 + 11168819 + + + Portrait + + false + false + false + 3 + 0 + It's a picture of a knight + 114 + 0 + + + Faladian Knight's sword + + false + false + false + 200 + 16 + A razor sharp sword + 115 + 15654365 + + + Blurite ore + + false + false + false + 3 + 0 + What Strange stuff + 70 + 5263598 + + + Asgarnian Ale + Drink + false + false + true + 2 + 0 + A glass of frothy ale + 90 + 0 + + + Wizard's Mind Bomb + Drink + false + false + true + 2 + 0 + It's got strange bubbles in it + 90 + 0 + + + Dwarven Stout + Drink + false + false + true + 2 + 0 + A Pint of thick dark beer + 90 + 0 + + + Eye of newt + + false + false + true + 3 + 0 + It seems to be looking at me + 116 + 0 + + + Rat's tail + + false + false + false + 3 + 0 + A bit of rat + 117 + 0 + + + Bluedye + + false + false + true + 5 + 0 + A little bottle of dye + 104 + 255 + + + Goblin Armour + + false + false + true + 40 + 0 + Armour Designed to fit Goblins + 118 + 65535 + + + Goblin Armour + + false + false + false + 40 + 0 + Armour Designed to fit Goblins + 118 + 16750912 + + + Goblin Armour + + false + false + false + 40 + 0 + Armour Designed to fit Goblins + 118 + 255 + + + Unstrung Longbow + + false + true + true + 60 + 0 + I need to find a string for this + 119 + 65280 + + + Unstrung shortbow + + false + true + true + 23 + 0 + I need to find a string for this + 120 + 65280 + + + Unfired Pie dish + + false + false + true + 3 + 0 + I need to put this in a pottery oven + 110 + 15632503 + + + Unfired pot + + false + false + true + 1 + 0 + I need to put this in a pottery oven + 61 + 15632503 + + + Arrow shafts + + true + true + true + 1 + 0 + I need to attach feathers to these + 121 + 0 + + + Woad Leaf + + true + false + true + 1 + 0 + Slightly bluish leaves + 122 + 0 + + + Orangedye + + false + false + true + 5 + 0 + A little bottle of dye + 104 + 16755200 + + + Gold ring + + false + false + true + 350 + 0 + A valuable ring + 123 + 16763980 + + + Sapphire ring + + false + false + true + 900 + 0 + A valuable ring + 123 + 19711 + + + Emerald ring + + false + false + true + 1275 + 0 + A valuable ring + 123 + 3394611 + + + Ruby ring + + false + false + true + 2025 + 0 + A valuable ring + 123 + 16724736 + + + Diamond ring + + false + false + true + 3525 + 0 + A valuable ring + 123 + 0 + + + Gold necklace + + false + false + true + 450 + 1024 + I wonder if this is valuable + 57 + 16763980 + + + Sapphire necklace + + false + false + true + 1050 + 1024 + I wonder if this is valuable + 57 + 19711 + + + Emerald necklace + + false + false + true + 1425 + 1024 + I wonder if this is valuable + 57 + 3394611 + + + Ruby necklace + + false + false + true + 2175 + 1024 + I wonder if this is valuable + 57 + 16724736 + + + Diamond necklace + + false + false + true + 3675 + 1024 + I wonder if this is valuable + 57 + 0 + + + Ring mould + + false + false + true + 5 + 0 + Used to make gold rings + 127 + 0 + + + Amulet mould + + false + false + true + 5 + 0 + Used to make gold amulets + 128 + 0 + + + Necklace mould + + false + false + true + 5 + 0 + Used to make gold necklaces + 129 + 0 + + + Gold Amulet + + false + false + true + 350 + 0 + It needs a string so I can wear it + 126 + 16763980 + + + Sapphire Amulet + + false + false + true + 900 + 0 + It needs a string so I can wear it + 126 + 19711 + + + Emerald Amulet + + false + false + true + 1275 + 0 + It needs a string so I can wear it + 126 + 3394611 + + + Ruby Amulet + + false + false + true + 2025 + 0 + It needs a string so I can make wear it + 126 + 16724736 + + + Diamond Amulet + + false + false + true + 3525 + 0 + It needs a string so I can wear it + 126 + 0 + + + Gold Amulet + + false + false + true + 350 + 1024 + I wonder if I can get this enchanted + 125 + 16763980 + + + Sapphire Amulet + + false + false + true + 900 + 1024 + I wonder if I can get this enchanted + 125 + 19711 + + + Emerald Amulet + + false + false + true + 1275 + 1024 + I wonder if I can get this enchanted + 125 + 3394611 + + + Ruby Amulet + + false + false + true + 2025 + 1024 + I wonder if I can get this enchanted + 125 + 16724736 + + + Diamond Amulet + + false + false + true + 3525 + 1024 + I wonder if I can get this enchanted + 125 + 0 + + + Superchisel + Twiddle + false + true + true + 3525 + 0 + I wonder if I can get this enchanted + 126 + 0 + + + Mace of Zamorak + + false + false + true + 4500 + 16 + This mace gives me the creeps + 0 + 13408690 + + + Bronze Plate Mail top + + false + false + true + 160 + 322 + Armour designed for females + 130 + 16737817 + + + Steel Plate Mail top + + false + false + true + 2000 + 322 + Armour designed for females + 130 + 15658734 + + + Mithril Plate Mail top + + false + false + true + 5200 + 322 + Armour designed for females + 130 + 10072780 + + + Adamantite Plate Mail top + + false + false + true + 12800 + 322 + Armour designed for females + 130 + 11717785 + + + Iron Plate Mail top + + false + false + true + 560 + 322 + Armour designed for females + 130 + 15654365 + + + Black Plate Mail top + + false + false + true + 3840 + 322 + Armour designed for females + 130 + 3158064 + + + Sapphire Amulet of magic + + false + false + true + 900 + 1024 + It improves my magic + 125 + 19711 + + + Emerald Amulet of protection + + false + false + true + 1275 + 1024 + It improves my defense + 125 + 3394611 + + + Ruby Amulet of strength + rub + false + false + true + 2025 + 1024 + It improves my damage + 125 + 16724736 + + + Diamond Amulet of power + rub + false + false + true + 3525 + 1024 + A powerful amulet + 125 + 0 + + + Karamja Rum + + false + false + false + 30 + 0 + A very strong spirit brewed in Karamja + 131 + 0 + + + Cheese + Eat + false + false + true + 4 + 0 + It's got holes in it + 150 + 0 + + + Tomato + Eat + false + false + true + 4 + 0 + This would make good ketchup + 151 + 0 + + + Pizza Base + + false + false + true + 4 + 0 + I need to add some tomato next + 152 + 16768184 + + + Burnt Pizza + + false + false + true + 1 + 0 + Oh dear! + 152 + 4210752 + + + Incomplete Pizza + + false + false + true + 10 + 0 + I need to add some cheese next + 153 + 0 + + + Uncooked Pizza + + false + false + true + 25 + 0 + This needs cooking + 154 + 0 + + + Plain Pizza + Eat + false + false + true + 40 + 0 + A cheese and tomato pizza + 154 + 0 + + + Meat Pizza + Eat + false + false + true + 50 + 0 + A pizza with bits of meat on it + 155 + 16756316 + + + Anchovie Pizza + Eat + false + false + true + 60 + 0 + A Pizza with Anchovies + 155 + 11447982 + + + Half Meat Pizza + Eat + false + false + true + 25 + 0 + Half of this pizza has been eaten + 156 + 16756316 + + + Half Anchovie Pizza + Eat + false + false + true + 30 + 0 + Half of this pizza has been eaten + 156 + 11447982 + + + Cake + Eat + false + false + true + 50 + 0 + A plain sponge cake + 157 + 16763289 + + + Burnt Cake + + false + false + true + 1 + 0 + Argh what a mess! + 157 + 4210752 + + + Chocolate Cake + Eat + false + false + true + 70 + 0 + This looks very tasty! + 157 + 16744524 + + + Partial Cake + Eat + false + false + true + 30 + 0 + Someone has eaten a big chunk of this cake + 158 + 16763289 + + + Partial Chocolate Cake + Eat + false + false + true + 50 + 0 + Someone has eaten a big chunk of this cake + 158 + 16744524 + + + Slice of Cake + Eat + false + false + true + 10 + 0 + I'd rather have a whole cake! + 159 + 16763289 + + + Chocolate Slice + Eat + false + false + true + 30 + 0 + A slice of chocolate cake + 159 + 16744524 + + + Chocolate Bar + Eat + false + false + true + 10 + 0 + It's a bar of chocolate + 160 + 0 + + + Cake Tin + + false + false + true + 10 + 0 + Useful for baking cakes + 177 + 0 + + + Uncooked cake + + false + false + true + 20 + 0 + Now all I need to do is cook it + 178 + 16769248 + + + Unfired bowl + + false + false + true + 2 + 0 + I need to put this in a pottery oven + 161 + 15632503 + + + Bowl + + false + false + true + 4 + 0 + Useful for mixing things + 161 + 16757606 + + + Bowl of water + + false + false + true + 3 + 0 + It's a bowl of water + 162 + 255 + + + Incomplete stew + + false + false + true + 4 + 0 + I need to add some meat too + 162 + 10066355 + + + Incomplete stew + + false + false + true + 4 + 0 + I need to add some potato too + 162 + 10066355 + + + Uncooked stew + + false + false + true + 10 + 0 + I need to cook this + 162 + 13415270 + + + Stew + Eat + false + false + true + 20 + 0 + It's a meat and potato stew + 162 + 10046464 + + + Burnt Stew + Empty + false + false + true + 1 + 0 + Eew it's horribly burnt + 162 + 3158064 + + + Potato + + false + false + true + 1 + 0 + Can be used to make stew + 163 + 0 + + + Raw Shrimp + + false + false + true + 5 + 0 + I should try cooking this + 164 + 16752800 + + + Shrimp + Eat + false + false + true + 5 + 0 + Some nicely cooked fish + 164 + 16740464 + + + Raw Anchovies + + false + false + true + 15 + 0 + I should try cooking this + 164 + 10526975 + + + Anchovies + Eat + false + false + true + 15 + 0 + Some nicely cooked fish + 164 + 7368959 + + + Burnt fish + + false + false + true + 1 + 0 + Oops! + 164 + 4210752 + + + Raw Sardine + + false + false + true + 10 + 0 + I should try cooking this + 165 + 10551200 + + + Sardine + Eat + false + false + true + 10 + 0 + Some nicely cooked fish + 165 + 7405424 + + + Raw Salmon + + false + false + true + 50 + 0 + I should try cooking this + 165 + 0 + + + Salmon + Eat + false + false + true + 50 + 0 + Some nicely cooked fish + 165 + 12619920 + + + Raw Trout + + false + false + true + 20 + 0 + I should try cooking this + 165 + 16752800 + + + Trout + Eat + false + false + true + 20 + 0 + Some nicely cooked fish + 165 + 16740464 + + + Burnt fish + + false + false + true + 1 + 0 + Oops! + 165 + 4210752 + + + Raw Herring + + false + false + true + 15 + 0 + I should try cooking this + 166 + 0 + + + Herring + Eat + false + false + true + 15 + 0 + Some nicely cooked fish + 166 + 12619920 + + + Raw Pike + + false + false + true + 25 + 0 + I should try cooking this + 166 + 10526975 + + + Pike + Eat + false + false + true + 25 + 0 + Some nicely cooked fish + 166 + 7368959 + + + Burnt fish + + false + false + true + 1 + 0 + Oops! + 166 + 4210752 + + + Raw Tuna + + false + false + true + 100 + 0 + I should try cooking this + 167 + 0 + + + Tuna + Eat + false + false + true + 100 + 0 + Wow this is a big fish + 167 + 12619920 + + + Burnt fish + + false + false + true + 1 + 0 + Oops! + 167 + 4210752 + + + Raw Swordfish + + false + false + true + 200 + 0 + I should try cooking this + 168 + 16752895 + + + Swordfish + Eat + false + false + true + 200 + 0 + I'd better be careful eating this! + 168 + 12611776 + + + Burnt Swordfish + + false + false + true + 1 + 0 + Oops! + 168 + 4210752 + + + Raw Lobster + + false + false + true + 150 + 0 + I should try cooking this + 169 + 16711680 + + + Lobster + Eat + false + false + true + 150 + 0 + This looks tricky to eat + 169 + 11558912 + + + Burnt Lobster + + false + false + true + 1 + 0 + Oops! + 169 + 4210752 + + + Lobster Pot + + false + false + true + 20 + 0 + Useful for catching lobsters + 170 + 0 + + + Net + + false + false + true + 5 + 0 + Useful for catching small fish + 171 + 0 + + + Fishing Rod + + false + false + true + 5 + 0 + Useful for catching sardine or herring + 172 + 0 + + + Fly Fishing Rod + + false + false + true + 5 + 0 + Useful for catching salmon or trout + 173 + 0 + + + Harpoon + + false + false + true + 5 + 0 + Useful for catching really big fish + 174 + 0 + + + Fishing Bait + + true + false + true + 3 + 0 + For use with a fishing rod + 175 + 0 + + + Feather + + true + false + true + 2 + 0 + Used for fly-fishing + 176 + 0 + + + Chest key + + false + false + false + 1 + 0 + A key to One eyed Hector's chest + 25 + 14540253 + + + Silver + + false + false + true + 75 + 0 + This needs refining + 134 + 0 + + + Silver bar + + false + false + true + 150 + 0 + This looks valuable + 79 + 0 + + + Holy Symbol of saradomin + + false + false + true + 300 + 1024 + This improves my prayer + 44 + 0 + + + Holy symbol mould + + false + false + true + 5 + 0 + Used to make Holy Symbols + 132 + 0 + + + Disk of Returning + Spin + false + false + true + 12 + 0 + Used to get out of Thordur's blackhole + 133 + 0 + + + Monks robe + + false + false + true + 40 + 64 + I feel closer to the God's when I am wearing this + 87 + 10510400 + + + Monks robe + + false + false + true + 30 + 128 + Keeps a monk's legs nice and warm + 88 + 10510400 + + + Red key + + false + false + false + 1 + 0 + A painted key + 25 + 16711680 + + + Orange Key + + false + false + false + 1 + 0 + A painted key + 25 + 16755200 + + + Yellow key + + false + false + false + 1 + 0 + A painted key + 25 + 16777045 + + + Blue key + + false + false + false + 1 + 0 + A painted key + 25 + 255 + + + Magenta key + + false + false + false + 1 + 0 + A painted key + 25 + 16711935 + + + Black key + + false + false + false + 1 + 0 + A painted key + 25 + 4210752 + + + Rune dagger + + false + false + true + 8000 + 16 + Short but pointy + 80 + 65535 + + + Rune short sword + + false + false + true + 20800 + 16 + A razor sharp sword + 1 + 65535 + + + Rune Scimitar + + false + false + true + 25600 + 16 + A vicious curved sword + 83 + 65535 + + + Medium Rune Helmet + + false + false + true + 19200 + 32 + A medium sized helmet + 5 + 65535 + + + Rune Chain Mail Body + + false + false + true + 50000 + 64 + A series of connected metal rings + 7 + 65535 + + + Rune Plate Mail Body + + false + false + true + 65000 + 322 + Provides excellent protection + 8 + 65535 + + + Rune Plate Mail Legs + + false + false + true + 64000 + 644 + These look pretty heavy + 9 + 65535 + + + Rune Square Shield + + false + false + true + 38400 + 8 + A medium metal shield + 3 + 56797 + + + Rune Kite Shield + + false + false + true + 54400 + 8 + A large metal shield + 2 + 56797 + + + Rune Axe + + false + false + true + 12800 + 16 + A powerful axe + 12 + 65535 + + + Rune skirt + + false + false + true + 64000 + 640 + Designer leg protection + 88 + 26214 + + + Rune Plate Mail top + + false + false + true + 65000 + 322 + Armour designed for females + 130 + 65535 + + + Runite bar + + false + false + true + 5000 + 0 + It's a bar of runite + 79 + 56797 + + + Runite ore + + false + false + true + 3200 + 0 + This needs refining + 70 + 56797 + + + Plank + + false + false + true + 1 + 0 + This doesn't look very useful + 135 + 0 + + + Tile + + false + false + true + 1 + 0 + This doesn't look very useful + 136 + 0 + + + Skull + + false + false + true + 1 + 0 + A spooky looking skull + 26 + 0 + + + Big Bones + Bury + false + false + true + 1 + 0 + Ew it's a pile of bones + 137 + 0 + + + Muddy key + + false + false + true + 1 + 0 + It looks like a key to a chest + 25 + 15636736 + + + Map + + false + false + false + 1 + 0 + A map showing the way to the Isle of Crandor + 138 + 0 + + + Map Piece + + false + false + false + 1 + 0 + I need some more of the map for this to be useful + 139 + 0 + + + Map Piece + + false + false + false + 1 + 0 + I need some more of the map for this to be useful + 140 + 0 + + + Map Piece + + false + false + false + 1 + 0 + I need some more of the map for this to be useful + 141 + 0 + + + Nails + + true + false + true + 3 + 0 + Nails made from steel + 142 + 0 + + + Anti dragon breath Shield + + false + false + true + 20 + 8 + Helps prevent damage from dragons + 143 + 0 + + + Maze key + + false + false + true + 1 + 0 + The key to the entrance of Melzar's maze + 25 + 14540253 + + + Pumpkin + Eat + false + false + true + 30 + 0 + Happy halloween + 149 + 0 + + + Black dagger + + false + false + true + 240 + 16 + Short but pointy + 80 + 3158064 + + + Black Short Sword + + false + false + true + 624 + 16 + A razor sharp sword + 1 + 3158064 + + + Black Long Sword + + false + false + true + 960 + 16 + A razor sharp sword + 81 + 3158064 + + + Black 2-handed Sword + + false + false + true + 1920 + 8216 + A very large sword + 82 + 3158064 + + + Black Scimitar + + false + false + true + 768 + 16 + A vicious curved sword + 83 + 3158064 + + + Black Axe + + false + false + true + 384 + 16 + A sinister looking axe + 12 + 3158064 + + + Black battle Axe + + false + false + true + 1248 + 16 + A vicious looking axe + 84 + 3158064 + + + Black Mace + + false + false + true + 432 + 16 + A spikey mace + 0 + 3158064 + + + Black Chain Mail Body + + false + false + true + 1440 + 64 + A series of connected metal rings + 7 + 3158064 + + + Black Square Shield + + false + false + true + 1152 + 8 + A medium metal shield + 3 + 3158064 + + + Black Kite Shield + + false + false + true + 1632 + 8 + A large metal shield + 2 + 3158064 + + + Black Plated skirt + + false + false + true + 1920 + 640 + Designer leg protection + 88 + 1118481 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Guam leaf + + false + true + true + 3 + 0 + A herb used in attack potion making + 75 + 0 + + + Marrentill + + false + true + true + 5 + 0 + A herb used in poison cures + 75 + 0 + + + Tarromin + + false + true + true + 11 + 0 + A useful herb + 75 + 0 + + + Harralander + + false + true + true + 20 + 0 + A useful herb + 75 + 0 + + + Ranarr Weed + + false + true + true + 25 + 0 + A useful herb + 75 + 0 + + + Irit Leaf + + false + true + true + 40 + 0 + A useful herb + 75 + 0 + + + Avantoe + + false + true + true + 48 + 0 + A useful herb + 75 + 0 + + + Kwuarm + + false + true + true + 54 + 0 + A powerful herb + 75 + 0 + + + Cadantine + + false + true + true + 65 + 0 + A powerful herb + 75 + 0 + + + Dwarf Weed + + false + true + true + 70 + 0 + A powerful herb + 75 + 0 + + + Unfinished potion + + false + true + true + 3 + 0 + I need another ingredient to finish this Guam potion + 48 + 10073782 + + + Unfinished potion + + false + true + true + 5 + 0 + I need another ingredient to finish this Marrentill potion + 48 + 11966902 + + + Unfinished potion + + false + true + true + 11 + 0 + I need another ingredient to finish this Tarromin potion + 48 + 11974297 + + + Unfinished potion + + false + true + true + 20 + 0 + I need another ingredient to finish this Harralander potion + 48 + 11966873 + + + Unfinished potion + + false + true + true + 25 + 0 + I need another ingredient to finish this Ranarr potion + 48 + 10073753 + + + Unfinished potion + + false + true + true + 40 + 0 + I need another ingredient to finish this Irit potion + 48 + 10066358 + + + Unfinished potion + + false + true + true + 48 + 0 + I need another ingredient to finish this Avantoe potion + 48 + 10066329 + + + Unfinished potion + + false + true + true + 54 + 0 + I need another ingredient to finish this Kwuarm potion + 48 + 11974326 + + + Unfinished potion + + false + true + true + 65 + 0 + I need another ingredient to finish this Cadantine potion + 48 + 13743769 + + + Unfinished potion + + false + true + true + 70 + 0 + I need another ingredient to finish this Dwarfweed potion + 48 + 10073809 + + + Vial + + false + false + true + 2 + 0 + It's full of water + 48 + 11197951 + + + Vial + + false + false + true + 2 + 0 + This vial is empty + 144 + 0 + + + Unicorn horn + + false + true + true + 20 + 0 + Poor unicorn + 145 + 0 + + + Blue dragon scale + + false + true + true + 50 + 0 + A large shiny scale + 146 + 0 + + + Pestle and mortar + + false + true + true + 4 + 0 + I can grind things for potions in this + 147 + 0 + + + Snape grass + + false + true + true + 10 + 0 + Strange spikey grass + 148 + 0 + + + Medium black Helmet + + false + false + true + 576 + 32 + A medium sized helmet + 5 + 3158064 + + + White berries + + false + true + true + 10 + 0 + Poisonous berries + 21 + 0 + + + Ground blue dragon scale + + false + true + true + 40 + 0 + This stuff isn't good for you + 23 + 35071 + + + Ground unicorn horn + + false + true + true + 20 + 0 + A useful potion ingredient + 23 + 15645520 + + + Attack Potion + Drink + false + true + true + 12 + 0 + 3 doses of attack potion + 48 + 3206894 + + + Attack Potion + Drink + false + true + true + 9 + 0 + 2 doses of attack potion + 48 + 3206894 + + + Attack Potion + Drink + false + true + true + 6 + 0 + 1 dose of attack potion + 48 + 3206894 + + + Stat restoration Potion + Drink + false + true + true + 88 + 0 + 3 doses of stat restoration potion + 48 + 15609904 + + + Stat restoration Potion + Drink + false + true + true + 66 + 0 + 2 doses of stat restoration potion + 48 + 15609904 + + + Stat restoration Potion + Drink + false + true + true + 44 + 0 + 1 dose of stat restoration potion + 48 + 15609904 + + + Defense Potion + Drink + false + true + true + 120 + 0 + 3 doses of defense potion + 48 + 3206704 + + + Defense Potion + Drink + false + true + true + 90 + 0 + 2 doses of defense potion + 48 + 3206704 + + + Defense Potion + Drink + false + true + true + 60 + 0 + 1 dose of defense potion + 48 + 3206704 + + + Restore prayer Potion + Drink + false + true + true + 152 + 0 + 3 doses of restore prayer potion + 48 + 3206809 + + + Restore prayer Potion + Drink + false + true + true + 114 + 0 + 2 doses of restore prayer potion + 48 + 3206809 + + + Restore prayer Potion + Drink + false + true + true + 76 + 0 + 1 dose of restore prayer potion + 48 + 3206809 + + + Super attack Potion + Drink + false + true + true + 180 + 0 + 3 doses of attack potion + 48 + 3158254 + + + Super attack Potion + Drink + false + true + true + 135 + 0 + 2 doses of attack potion + 48 + 3158254 + + + Super attack Potion + Drink + false + true + true + 90 + 0 + 1 dose of attack potion + 48 + 3158254 + + + Fishing Potion + Drink + false + true + true + 200 + 0 + 3 doses of fishing potion + 48 + 3158064 + + + Fishing Potion + Drink + false + true + true + 150 + 0 + 2 doses of fishing potion + 48 + 3158064 + + + Fishing Potion + Drink + false + true + true + 100 + 0 + 1 dose of fishing potion + 48 + 3158064 + + + Super strength Potion + Drink + false + true + true + 220 + 0 + 3 doses of strength potion + 48 + 15658734 + + + Super strength Potion + Drink + false + true + true + 165 + 0 + 2 doses of strength potion + 48 + 15658734 + + + Super strength Potion + Drink + false + true + true + 110 + 0 + 1 dose of strength potion + 48 + 15658734 + + + Super defense Potion + Drink + false + true + true + 264 + 0 + 3 doses of defense potion + 48 + 15644208 + + + Super defense Potion + Drink + false + true + true + 198 + 0 + 2 doses of defense potion + 48 + 15644208 + + + Super defense Potion + Drink + false + true + true + 132 + 0 + 1 dose of defense potion + 48 + 15644208 + + + Ranging Potion + Drink + false + true + true + 288 + 0 + 3 doses of ranging potion + 48 + 3192558 + + + Ranging Potion + Drink + false + true + true + 216 + 0 + 2 doses of ranging potion + 48 + 3192558 + + + Ranging Potion + Drink + false + true + true + 144 + 0 + 1 dose of ranging potion + 48 + 3192558 + + + Wine of Zamorak + Drink + false + false + true + 1 + 0 + It's full of wine + 65 + 12851224 + + + Raw bear meat + + false + false + true + 1 + 0 + I need to cook this first + 60 + 16747571 + + + Raw rat meat + + false + false + true + 1 + 0 + I need to cook this first + 60 + 16747571 + + + Raw beef + + false + false + true + 1 + 0 + I need to cook this first + 60 + 16747571 + + + Enchanted bear meat + + false + true + false + 1 + 0 + I don't fancy eating this now + 60 + 13495347 + + + Enchanted rat meat + + false + true + false + 1 + 0 + I don't fancy eating this now + 60 + 13495347 + + + Enchanted beef + + false + true + false + 1 + 0 + I don't fancy eating this now + 60 + 13495347 + + + Enchanted chicken meat + + false + true + false + 1 + 0 + I don't fancy eating this now + 60 + 13495347 + + + Dramen Staff + + false + true + false + 15 + 16 + A magical staff cut from the dramen tree + 85 + 10072780 + + + Dramen Branch + + false + true + false + 15 + 0 + I need to make this into a staff + 179 + 10072780 + + + Cape + + false + false + true + 32 + 2048 + A thick Green cape + 59 + 4246592 + + + Cape + + false + false + true + 32 + 2048 + A thick yellow cape + 59 + 15658560 + + + Cape + + false + false + true + 32 + 2048 + A thick Orange cape + 59 + 15636736 + + + Cape + + false + false + true + 32 + 2048 + A thick purple cape + 59 + 11141341 + + + Greendye + + false + false + true + 5 + 0 + A little bottle of dye + 104 + 65280 + + + Purpledye + + false + false + true + 5 + 0 + A little bottle of dye + 104 + 11141375 + + + Iron ore certificate + + true + false + true + 10 + 0 + Each certificate exchangable at draynor market for 5 iron ore + 180 + 0 + + + Coal certificate + + true + false + true + 20 + 0 + Each certificate exchangable at draynor market for 5 coal + 180 + 0 + + + Mithril ore certificate + + true + false + true + 30 + 0 + Each certificate exchangable at draynor market for 5 mithril ore + 180 + 0 + + + Silver certificate + + true + false + true + 15 + 0 + Each certificate exchangable at draynor market for 5 silver nuggets + 180 + 0 + + + Gold certificate + + true + false + true + 25 + 0 + Each certificate exchangable at draynor market for 5 gold nuggets + 180 + 0 + + + Dragonstone Amulet + + false + true + true + 17625 + 1024 + A very powerful amulet + 125 + 12255487 + + + Dragonstone + + false + true + true + 10000 + 0 + This looks very valuable + 74 + 12255487 + + + Dragonstone Amulet + + false + true + true + 17625 + 0 + It needs a string so I can wear it + 126 + 12255487 + + + Crystal key + + false + true + true + 1 + 0 + A very shiny key + 25 + 15663103 + + + Half of a key + + false + true + true + 1 + 0 + A very shiny key + 181 + 15663103 + + + Half of a key + + false + true + true + 1 + 0 + A very shiny key + 182 + 15663103 + + + Iron bar certificate + + true + false + true + 10 + 0 + Each certificate exchangable at draynor market for 5 iron bars + 180 + 0 + + + Steel bar certificate + + true + false + true + 20 + 0 + Each certificate exchangable at draynor market for 5 steel bars + 180 + 0 + + + Mithril bar certificate + + true + false + true + 30 + 0 + Each certificate exchangable at draynor market for 5 mithril bars + 180 + 0 + + + Silver bar certificate + + true + false + true + 15 + 0 + Each certificate exchangable at draynor market for 5 silver bars + 180 + 0 + + + Gold bar certificate + + true + false + true + 25 + 0 + Each certificate exchangable at draynor market for 5 gold bars + 180 + 0 + + + Lobster certificate + + true + false + true + 10 + 0 + Each certificate exchangable at draynor market for 5 lobsters + 180 + 0 + + + Raw lobster certificate + + true + false + true + 10 + 0 + Each certificate exchangable at draynor market for 5 raw lobsters + 180 + 0 + + + Swordfish certificate + + true + false + true + 10 + 0 + Each certificate exchangable at draynor market for 5 swordfish + 180 + 0 + + + Raw swordfish certificate + + true + false + true + 10 + 0 + Each certificate exchangable at draynor market for 5 raw swordfish + 180 + 0 + + + Diary + Read + false + true + true + 1 + 0 + Property of Nora.T.Hag + 28 + 11206570 + + + Front door key + + false + true + false + 1 + 0 + A house key + 25 + 15636736 + + + Ball + + false + true + false + 1 + 0 + A child's ball + 183 + 0 + + + Magnet + + false + true + false + 3 + 0 + A very attractive magnet + 184 + 0 + + + Grey wolf fur + + false + true + true + 50 + 0 + This would make warm clothing + 68 + 15658734 + + + Uncut dragonstone + + false + true + true + 1000 + 0 + This would be worth more cut + 73 + 12255487 + + + Dragonstone ring + + false + true + true + 17625 + 0 + A valuable ring + 123 + 12255487 + + + Dragonstone necklace + + false + true + true + 18375 + 1024 + I wonder if this is valuable + 57 + 12255487 + + + Raw Shark + + false + true + true + 300 + 0 + I should try cooking this + 185 + 5263488 + + + Shark + Eat + false + true + true + 300 + 0 + I'd better be careful eating this! + 185 + 11558912 + + + Burnt Shark + + false + true + true + 1 + 0 + Oops! + 185 + 4210752 + + + Big Net + + false + true + true + 20 + 0 + Useful for catching lots of fish + 186 + 0 + + + Casket + Open + false + true + true + 50 + 0 + I hope there is treasure in it + 187 + 0 + + + Raw cod + + false + true + true + 25 + 0 + I should try cooking this + 165 + 10526924 + + + Cod + Eat + false + true + true + 25 + 0 + Some nicely cooked fish + 165 + 7368908 + + + Raw Mackerel + + false + true + true + 17 + 0 + I should try cooking this + 166 + 13421728 + + + Mackerel + Eat + false + true + true + 17 + 0 + Some nicely cooked fish + 166 + 13421680 + + + Raw Bass + + false + true + true + 120 + 0 + I should try cooking this + 167 + 16752800 + + + Bass + Eat + false + true + true + 120 + 0 + Wow this is a big fish + 167 + 16740464 + + + Ice Gloves + + false + true + false + 6 + 256 + These will keep my hands cold! + 17 + 11202303 + + + Firebird Feather + + false + true + false + 2 + 0 + A red hot feather + 176 + 16711680 + + + Firebird Feather + + false + true + false + 2 + 0 + This is cool enough to hold now + 176 + 16768256 + + + Poisoned Iron dagger + + false + true + true + 35 + 16 + Short but pointy + 80 + 15654365 + + + Poisoned bronze dagger + + false + true + true + 10 + 16 + Short but pointy + 80 + 16737817 + + + Poisoned Steel dagger + + false + true + true + 125 + 16 + Short but pointy + 80 + 15658734 + + + Poisoned Mithril dagger + + false + true + true + 325 + 16 + Short but pointy + 80 + 10072780 + + + Poisoned Rune dagger + + false + true + true + 8000 + 16 + Short but pointy + 80 + 65535 + + + Poisoned Adamantite dagger + + false + true + true + 800 + 16 + Short but pointy + 80 + 11717785 + + + Poisoned Black dagger + + false + true + true + 240 + 16 + Short but pointy + 80 + 3158064 + + + Cure poison Potion + Drink + false + true + true + 288 + 0 + 3 doses of cure poison potion + 48 + 6749969 + + + Cure poison Potion + Drink + false + true + true + 216 + 0 + 2 doses of cure poison potion + 48 + 6749969 + + + Cure poison Potion + Drink + false + true + true + 144 + 0 + 1 dose of cure poison potion + 48 + 6749969 + + + Poison antidote + Drink + false + true + true + 288 + 0 + 3 doses of anti poison potion + 48 + 16716134 + + + Poison antidote + Drink + false + true + true + 216 + 0 + 2 doses of anti poison potion + 48 + 16716134 + + + Poison antidote + Drink + false + true + true + 144 + 0 + 1 dose of anti poison potion + 48 + 16716134 + + + Weapon poison + + false + true + true + 144 + 0 + For use on daggers and arrows + 48 + 1140479 + + + ID Paper + + false + true + true + 1 + 0 + ID of Hartigen the black knight + 29 + 0 + + + Poison Bronze Arrows + + true + true + true + 2 + 0 + Venomous looking arrows + 206 + 16737817 + + + Christmas cracker + + false + false + true + 1 + 0 + Use on another player to pull it + 188 + 16711680 + + + Party Hat + + false + false + true + 2 + 32 + Party!!! + 189 + 16711680 + + + Party Hat + + false + false + true + 2 + 32 + Party!!! + 189 + 16776960 + + + Party Hat + + false + false + true + 2 + 32 + Party!!! + 189 + 255 + + + Party Hat + + false + false + true + 2 + 32 + Party!!! + 189 + 65280 + + + Party Hat + + false + false + true + 2 + 32 + Party!!! + 189 + 16711935 + + + Party Hat + + false + false + true + 2 + 32 + Party!!! + 189 + 0 + + + Miscellaneous key + + false + true + true + 1 + 0 + I wonder what this unlocks + 25 + 14509670 + + + Bunch of keys + + false + true + true + 2 + 0 + Some keys on a keyring + 190 + 0 + + + Whisky + Drink + false + true + true + 5 + 0 + A bottle of Draynor Malt + 191 + 16755200 + + + Candlestick + + false + true + true + 5 + 0 + A valuable candlestick + 192 + 0 + + + Master thief armband + + false + true + false + 2 + 0 + This denotes a great act of thievery + 193 + 0 + + + Blamish snail slime + + false + true + false + 5 + 0 + Yuck + 104 + 15663086 + + + Blamish oil + + false + true + false + 10 + 0 + Made from the finest snail slime + 48 + 15663086 + + + Oily Fishing Rod + + false + true + false + 15 + 0 + A rod covered in Blamish oil + 172 + 0 + + + Lava eel + Eat + false + true + false + 150 + 0 + Strange it looks cooler now it's been cooked + 194 + 11558912 + + + Raw lava eel + + false + true + false + 150 + 0 + A very strange eel + 194 + 16711680 + + + Poison Crossbow bolts + + true + true + true + 3 + 0 + Good if you have a crossbow! + 56 + 0 + + + Dragon sword + + false + true + true + 100000 + 16 + A Razor sharp sword + 273 + 16711748 + + + Dragon axe + + false + true + true + 200000 + 16 + A vicious looking axe + 272 + 16711748 + + + Jail keys + + false + true + false + 2 + 0 + Keys to the black knight jail + 190 + 0 + + + Dusty Key + + false + true + false + 1 + 0 + A key given to me by Velrak + 25 + 12303291 + + + Charged Dragonstone Amulet + Rub + false + true + true + 17625 + 1024 + A very powerful amulet + 125 + 12255487 + + + Grog + Drink + false + true + true + 3 + 0 + A murky glass of some sort of drink + 90 + 0 + + + Candle + + false + true + false + 3 + 0 + An unlit candle + 195 + 0 + + + Black Candle + + false + true + false + 3 + 0 + A spooky but unlit candle + 195 + 2105376 + + + Candle + + false + true + false + 3 + 0 + A small slowly burning candle + 196 + 0 + + + Black Candle + + false + true + false + 3 + 0 + A spooky candle + 196 + 2105376 + + + Insect repellant + + false + true + false + 3 + 0 + Drives away all known 6 legged creatures + 197 + 0 + + + Bat bones + Bury + false + true + true + 1 + 0 + Ew it's a pile of bones + 20 + 0 + + + Wax Bucket + + false + true + false + 2 + 0 + It's a wooden bucket + 22 + 16777181 + + + Excalibur + + false + true + false + 200 + 16 + This used to belong to king Arthur + 115 + 10072780 + + + Druids robe + + false + false + true + 40 + 64 + I feel closer to the Gods when I am wearing this + 87 + 16777215 + + + Druids robe + + false + false + true + 30 + 128 + Keeps a druids's knees nice and warm + 88 + 16777215 + + + Eye patch + + false + true + true + 2 + 32 + It makes me look very piratical + 198 + 0 + + + Unenchanted Dragonstone Amulet + + false + true + true + 17625 + 1024 + I wonder if I can get this enchanted + 125 + 12255487 + + + Unpowered orb + + false + true + true + 100 + 0 + I'd prefer it if it was powered + 199 + 0 + + + Fire orb + + false + true + true + 300 + 0 + A magic glowing orb + 199 + 16711680 + + + Water orb + + false + true + true + 300 + 0 + A magic glowing orb + 199 + 255 + + + Battlestaff + + false + true + true + 7000 + 16 + It's a slightly magical stick + 85 + 10072780 + + + Battlestaff of fire + + false + true + true + 15500 + 16 + A Magical staff + 91 + 16711680 + + + Battlestaff of water + + false + true + true + 15500 + 16 + A Magical staff + 91 + 255 + + + Battlestaff of air + + false + true + true + 15500 + 16 + A Magical staff + 91 + 65535 + + + Battlestaff of earth + + false + true + true + 15500 + 16 + A Magical staff + 91 + 7353600 + + + Blood-Rune + + true + true + true + 25 + 0 + Used for high level missile spells + 200 + 0 + + + Beer glass + + false + false + true + 2 + 0 + I need to fill this with beer + 201 + 0 + + + Glassblowing pipe + + false + true + true + 2 + 0 + Use on molten glass to make things + 202 + 0 + + + Seaweed + + false + true + true + 2 + 0 + Slightly damp seaweed + 203 + 0 + + + Molten glass + + false + true + true + 2 + 0 + Hot glass ready to be blown + 204 + 0 + + + Soda ash + + false + true + true + 2 + 0 + One of the ingredients for making glass + 23 + 0 + + + Sand + + false + true + true + 2 + 0 + One of the ingredients for making glass + 22 + 16763904 + + + Air orb + + false + true + true + 300 + 0 + A magic glowing orb + 199 + 65535 + + + Earth orb + + false + true + true + 300 + 0 + A magic glowing orb + 199 + 7353600 + + + Bass certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Catherby for 5 bass + 180 + 0 + + + Raw bass certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Catherby for 5 raw bass + 180 + 0 + + + Shark certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Catherby for 5 shark + 180 + 0 + + + Raw shark certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Catherby for 5 raw shark + 180 + 0 + + + Oak Logs + + false + true + true + 20 + 0 + Logs cut from an oak tree + 14 + 0 + + + Willow Logs + + false + true + true + 40 + 0 + Logs cut from a willow tree + 14 + 0 + + + Maple Logs + + false + true + true + 80 + 0 + Logs cut from a maple tree + 14 + 0 + + + Yew Logs + + false + true + true + 160 + 0 + Logs cut from a yew tree + 14 + 0 + + + Magic Logs + + false + true + true + 320 + 0 + Logs made from magical wood + 14 + 0 + + + Headless Arrows + + true + true + true + 1 + 0 + I need to attach arrow heads to these + 205 + 0 + + + Iron Arrows + + true + true + true + 6 + 0 + Arrows with iron heads + 11 + 15654365 + + + Poison Iron Arrows + + true + true + true + 6 + 0 + Venomous looking arrows + 206 + 15654365 + + + Steel Arrows + + true + true + true + 24 + 0 + Arrows with steel heads + 11 + 15658734 + + + Poison Steel Arrows + + true + true + true + 24 + 0 + Venomous looking arrows + 206 + 15658734 + + + Mithril Arrows + + true + true + true + 64 + 0 + Arrows with mithril heads + 11 + 9614028 + + + Poison Mithril Arrows + + true + true + true + 64 + 0 + Venomous looking arrows + 206 + 9614028 + + + Adamantite Arrows + + true + true + true + 160 + 0 + Arrows with adamantite heads + 11 + 11717785 + + + Poison Adamantite Arrows + + true + true + true + 160 + 0 + Venomous looking arrows + 206 + 11717785 + + + Rune Arrows + + true + true + true + 800 + 0 + Arrows with rune heads + 11 + 65535 + + + Poison Rune Arrows + + true + true + true + 800 + 0 + Venomous looking arrows + 206 + 65535 + + + Oak Longbow + + false + true + true + 160 + 24 + A Nice sturdy bow + 54 + 255 + + + Oak Shortbow + + false + true + true + 100 + 24 + Short but effective + 55 + 255 + + + Willow Longbow + + false + true + true + 320 + 24 + A Nice sturdy bow + 54 + 16776960 + + + Willow Shortbow + + false + true + true + 200 + 24 + Short but effective + 55 + 16776960 + + + Maple Longbow + + false + true + true + 640 + 24 + A Nice sturdy bow + 54 + 16746496 + + + Maple Shortbow + + false + true + true + 400 + 24 + Short but effective + 55 + 16746496 + + + Yew Longbow + + false + true + true + 1280 + 24 + A Nice sturdy bow + 54 + 16711680 + + + Yew Shortbow + + false + true + true + 800 + 24 + Short but effective + 55 + 16711680 + + + Magic Longbow + + false + true + true + 2560 + 24 + A Nice sturdy bow + 54 + 4210752 + + + Magic Shortbow + + false + true + true + 1600 + 24 + Short but effective + 55 + 4210752 + + + Unstrung Oak Longbow + + false + true + true + 80 + 0 + I need to find a string for this + 119 + 255 + + + Unstrung Oak Shortbow + + false + true + true + 50 + 0 + I need to find a string for this + 120 + 255 + + + Unstrung Willow Longbow + + false + true + true + 160 + 0 + I need to find a string for this + 119 + 16776960 + + + Unstrung Willow Shortbow + + false + true + true + 100 + 0 + I need to find a string for this + 120 + 16776960 + + + Unstrung Maple Longbow + + false + true + true + 320 + 0 + I need to find a string for this + 119 + 16744448 + + + Unstrung Maple Shortbow + + false + true + true + 200 + 0 + I need to find a string for this + 120 + 16744448 + + + Unstrung Yew Longbow + + false + true + true + 640 + 0 + I need to find a string for this + 119 + 16711680 + + + Unstrung Yew Shortbow + + false + true + true + 400 + 0 + I need to find a string for this + 120 + 16711680 + + + Unstrung Magic Longbow + + false + true + true + 1280 + 0 + I need to find a string for this + 119 + 4210752 + + + Unstrung Magic Shortbow + + false + true + true + 800 + 0 + I need to find a string for this + 120 + 4210752 + + + Barcrawl card + Read + false + true + false + 10 + 0 + The official Alfred Grimhand barcrawl + 180 + 0 + + + Bronze arrow heads + + true + true + true + 1 + 0 + Not much use without the rest of the arrow! + 207 + 16737817 + + + Iron arrow heads + + true + true + true + 3 + 0 + Not much use without the rest of the arrow! + 207 + 15658717 + + + Steel arrow heads + + true + true + true + 12 + 0 + Not much use without the rest of the arrow! + 207 + 15658734 + + + Mithril arrow heads + + true + true + true + 32 + 0 + Not much use without the rest of the arrow! + 207 + 10072780 + + + Adamantite arrow heads + + true + true + true + 80 + 0 + Not much use without the rest of the arrow! + 207 + 11717785 + + + Rune arrow heads + + true + true + true + 400 + 0 + Not much use without the rest of the arrow! + 207 + 65535 + + + Flax + + false + true + true + 5 + 0 + I should use this with a spinning wheel + 209 + 0 + + + Bow string + + false + true + true + 10 + 0 + I need a bow handle to attach this too + 208 + 0 + + + Easter egg + Eat + false + false + true + 10 + 0 + Happy Easter + 210 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + I need to catch some scorpions in this + 211 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 1 scorpion in it + 212 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 2 scorpions in it + 212 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 3 scorpions in it + 212 + 0 + + + Enchanted Battlestaff of fire + + false + true + true + 42500 + 16 + A Magical staff + 91 + 16711680 + + + Enchanted Battlestaff of water + + false + true + true + 42500 + 16 + A Magical staff + 91 + 255 + + + Enchanted Battlestaff of air + + false + true + true + 42500 + 16 + A Magical staff + 91 + 65535 + + + Enchanted Battlestaff of earth + + false + true + true + 42500 + 16 + A Magical staff + 91 + 7353600 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 1 scorpion in it + 212 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 1 scorpion in it + 212 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 2 scorpions in it + 212 + 0 + + + Scorpion cage + + false + true + false + 10 + 0 + It has 2 scorpions in it + 212 + 0 + + + Gold + + false + true + false + 150 + 0 + This needs refining + 73 + 16763980 + + + Gold bar + + false + true + false + 300 + 0 + This looks valuable + 79 + 16763980 + + + Ruby ring + + false + true + false + 2025 + 0 + A valuable ring + 123 + 16724736 + + + Ruby necklace + + false + false + false + 2175 + 1024 + I wonder if this is valuable + 57 + 16724736 + + + Family crest + + false + true + false + 10 + 0 + The crest of a varrocian noble family + 213 + 0 + + + Crest fragment + + false + true + false + 10 + 0 + Part of the Fitzharmon family crest + 214 + 0 + + + Crest fragment + + false + true + false + 10 + 0 + Part of the Fitzharmon family crest + 215 + 0 + + + Crest fragment + + false + true + false + 10 + 0 + Part of the Fitzharmon family crest + 216 + 0 + + + Steel gauntlets + + false + true + false + 6 + 256 + Very handy armour + 217 + 12303291 + + + Gauntlets of goldsmithing + + false + true + false + 6 + 256 + Metal gloves for gold making + 217 + 16777130 + + + Gauntlets of cooking + + false + true + false + 6 + 256 + Used for cooking fish + 217 + 14540253 + + + Gauntlets of chaos + + false + true + false + 6 + 256 + Improves bolt spells + 217 + 16755370 + + + Robe of Zamorak + + false + true + true + 40 + 64 + A robe worn by worshippers of Zamorak + 87 + 16711680 + + + Robe of Zamorak + + false + true + true + 30 + 128 + A robe worn by worshippers of Zamorak + 88 + 16711680 + + + Address Label + + false + true + false + 10 + 0 + To lord Handelmort- Handelmort mansion + 218 + 0 + + + Tribal totem + + false + true + false + 10 + 0 + It represents some sort of tribal god + 219 + 0 + + + Tourist guide + Read + false + true + true + 1 + 0 + Your definitive guide to Ardougne + 28 + 11184895 + + + Spice + + false + true + true + 230 + 0 + Put it in uncooked stew to make curry + 62 + 16711680 + + + Uncooked curry + + false + true + true + 10 + 0 + I need to cook this + 162 + 15643494 + + + Curry + Eat + false + true + true + 20 + 0 + It's a spicey hot curry + 162 + 12274688 + + + Burnt curry + Empty + false + true + true + 1 + 0 + Eew it's horribly burnt + 162 + 5255216 + + + Yew logs certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Ardougne for 5 yew logs + 180 + 0 + + + Maple logs certificate + + true + true + true + 20 + 0 + Each certificate exchangable at Ardougne for 5 maple logs + 180 + 0 + + + Willow logs certificate + + true + true + true + 30 + 0 + Each certificate exchangable at Ardougne for 5 willow logs + 180 + 0 + + + Lockpick + + false + true + true + 20 + 0 + It makes picking some locks easier + 220 + 0 + + + Red vine worms + + true + true + false + 3 + 0 + Strange little red worms + 175 + 16711680 + + + Blanket + + false + true + false + 5 + 0 + A child's blanket + 92 + 56831 + + + Raw giant carp + + false + true + false + 50 + 0 + I should try cooking this + 165 + 80 + + + Giant Carp + Eat + false + true + false + 50 + 0 + Some nicely cooked fish + 165 + 12619984 + + + Fishing competition Pass + + false + true + false + 10 + 0 + Admits one to the Hemenster fishing competition + 218 + 0 + + + Hemenster fishing trophy + + false + true + false + 20 + 0 + Hurrah you won a fishing competition + 221 + 16763980 + + + Pendant of Lucien + + false + true + false + 12 + 1024 + Gets me through the chamber of fear + 222 + 3158064 + + + Boots of lightfootedness + + false + true + false + 6 + 512 + Wearing these makes me feel like I am floating + 223 + 16742144 + + + Ice Arrows + + true + true + false + 2 + 0 + Can only be fired with yew or magic bows + 11 + 11206655 + + + Lever + + false + true + false + 20 + 0 + This was once attached to something + 224 + 0 + + + Staff of Armadyl + + false + true + false + 15 + 16 + A Magical staff + 91 + 16776960 + + + Pendant of Armadyl + + false + true + false + 12 + 1024 + Allows me to fight Lucien + 222 + 0 + + + Large cog + + false + true + false + 10 + 0 + A large old cog + 241 + 255 + + + Large cog + + false + true + false + 10 + 0 + A large old cog + 240 + 0 + + + Large cog + + false + true + false + 10 + 0 + A large old cog + 241 + 16711680 + + + Large cog + + false + true + false + 10 + 0 + A large old cog + 241 + 13369548 + + + Rat Poison + + false + true + true + 1 + 0 + This stuff looks nasty + 52 + 0 + + + Shiny Key + + false + true + false + 1 + 0 + Quite a small key + 25 + 12303291 + + + Khazard Helmet + + false + true + false + 10 + 32 + A medium sized helmet + 5 + 11250603 + + + Khazard chainmail + + false + true + false + 10 + 64 + A series of connected metal rings + 7 + 11250603 + + + Khali brew + Drink + false + true + true + 5 + 0 + A bottle of khazard's worst brew + 191 + 16755200 + + + Khazard cell keys + + false + true + false + 1 + 0 + Keys for General Khazard's cells + 25 + 14540253 + + + Poison chalice + Drink + false + true + false + 20 + 0 + A strange looking drink + 225 + 11206400 + + + Magic whistle + Blow + false + true + false + 10 + 0 + A small tin whistle + 226 + 0 + + + Cup of tea + Drink + false + true + true + 10 + 0 + A nice cup of tea + 227 + 0 + + + Orb of protection + + false + true + false + 1 + 0 + A strange glowing green orb + 242 + 14540253 + + + Orbs of protection + + false + true + false + 1 + 0 + Two strange glowing green orbs + 243 + 14540253 + + + Holy table napkin + + false + true + false + 10 + 0 + A cloth given to me by sir Galahad + 92 + 0 + + + Bell + Ring + false + true + false + 1 + 0 + I wonder what happens when i ring it + 228 + 0 + + + Gnome Emerald Amulet of protection + + false + true + false + 0 + 1024 + It improves my defense + 125 + 3394611 + + + Magic golden feather + Blow on + false + true + false + 2 + 0 + It will point the way for me + 176 + 16776960 + + + Holy grail + + false + true + false + 1 + 0 + A holy and powerful artifact + 229 + 0 + + + Script of Hazeel + + false + true + false + 1 + 0 + An old scroll with strange ancient text + 244 + 14540253 + + + Pineapple + + false + true + true + 1 + 0 + It can be cut up with a knife + 124 + 0 + + + Pineapple ring + Eat + false + true + true + 1 + 0 + Exotic fruit + 230 + 0 + + + Pineapple Pizza + Eat + false + true + true + 100 + 0 + A tropicana pizza + 155 + 16777079 + + + Half pineapple Pizza + Eat + false + true + true + 50 + 0 + Half of this pizza has been eaten + 156 + 16777079 + + + Magic scroll + Read + false + true + false + 1 + 0 + Maybe I should read it + 244 + 0 + + + Mark of Hazeel + + false + true + false + 0 + 0 + A large metal amulet + 245 + 14540253 + + + Bloody axe of zamorak + + false + true + false + 5000 + 16 + A vicious looking axe + 246 + 15658734 + + + Carnillean armour + + false + true + false + 65 + 0 + The carnillean family armour + 247 + 15658734 + + + Carnillean Key + + false + true + false + 1 + 0 + An old rusty key + 25 + 16772608 + + + Cattle prod + + false + true + false + 15 + 0 + An old cattle prod + 248 + 16772608 + + + Plagued sheep remains + + false + true + false + 0 + 0 + These sheep remains are infected + 20 + 14540253 + + + Poisoned animal feed + + false + true + false + 0 + 0 + This looks nasty + 250 + 14540253 + + + Protective jacket + + false + true + false + 50 + 64 + A thick heavy leather top + 251 + 14540253 + + + Protective trousers + + false + true + false + 50 + 644 + A thick pair of leather trousers + 252 + 15654365 + + + Plagued sheep remains + + false + true + false + 0 + 0 + These sheep remains are infected + 20 + 14540253 + + + Plagued sheep remains + + false + true + false + 0 + 0 + These sheep remains are infected + 20 + 14540253 + + + Plagued sheep remains + + false + true + false + 0 + 0 + These sheep remains are infected + 20 + 14540253 + + + Dwellberries + Eat + false + true + true + 4 + 0 + Some rather pretty blue berries + 253 + 0 + + + Gasmask + + false + true + false + 2 + 32 + Stops me breathing nasty stuff + 232 + 0 + + + Picture + + false + true + false + 2 + 0 + A picture of a lady called Elena + 233 + 0 + + + Book + Read + false + true + false + 1 + 0 + Turnip growing for beginners + 28 + 16755455 + + + Seaslug + + false + true + false + 4 + 0 + A rather nasty looking crustacean + 254 + 0 + + + Chocolaty milk + Drink + false + true + false + 2 + 0 + Milk with chocolate in it + 22 + 9785408 + + + Hangover cure + + false + true + false + 2 + 0 + It doesn't look very tasty + 22 + 8757312 + + + Chocolate dust + + false + true + true + 2 + 0 + I prefer it in a bar shape + 23 + 9461792 + + + Torch + + false + true + false + 4 + 0 + A unlit home made torch + 255 + 0 + + + Torch + + false + true + false + 4 + 0 + A lit home made torch + 256 + 0 + + + Warrant + + false + true + false + 5 + 0 + A search warrant for a house in Ardougne + 29 + 0 + + + Damp sticks + + false + true + false + 0 + 0 + Some damp wooden sticks + 257 + 0 + + + Dry sticks + Rub together + false + true + false + 0 + 0 + Some dry wooden sticks + 258 + 0 + + + Broken glass + + false + true + false + 0 + 0 + Glass from a broken window pane + 259 + 0 + + + Oyster pearls + + false + true + true + 1400 + 0 + I could work wonders with these and a chisel + 260 + 0 + + + Little key + + false + true + false + 1 + 0 + Quite a small key + 25 + 12303291 + + + Scruffy note + Read + false + true + true + 2 + 0 + It seems to say hongorer lure + 234 + 0 + + + Glarial's amulet + + false + true + false + 1 + 1024 + A bright green gem set in a necklace + 261 + 12303291 + + + Swamp tar + + true + true + true + 1 + 0 + A foul smelling thick tar like substance + 262 + 12303291 + + + Uncooked Swamp paste + + true + true + true + 1 + 0 + A thick tar like substance mixed with flour + 263 + 12303291 + + + Swamp paste + + true + true + true + 30 + 0 + A tar like substance mixed with flour and warmed + 263 + 12303291 + + + Oyster pearl bolts + + true + true + true + 110 + 0 + Great if you have a crossbow! + 266 + 0 + + + Glarials pebble + + false + true + false + 1 + 0 + A small pebble with elven inscription + 264 + 12303291 + + + Book on baxtorian + Read + false + true + false + 2 + 0 + A book on elven history in north runescape + 28 + 0 + + + Large key + + false + true + false + 1 + 0 + I wonder what this is the key to + 25 + 16750848 + + + Oyster pearl bolt tips + + true + true + true + 56 + 0 + Can be used to improve crossbow bolts + 265 + 12303291 + + + Oyster + + false + true + true + 5 + 0 + It's empty + 267 + 0 + + + Oyster pearls + + false + true + true + 112 + 0 + I could work wonders with these and a chisel + 268 + 0 + + + Oyster + Open + false + true + true + 200 + 0 + It's a rare oyster + 269 + 0 + + + Soil + + false + true + false + 2 + 0 + It's a bucket of fine soil + 22 + 12285815 + + + Dragon medium Helmet + + false + true + true + 100000 + 32 + A medium sized helmet + 271 + 16711748 + + + Mithril seed + Open + true + true + false + 200 + 0 + Magical seeds in a mithril case + 270 + 0 + + + An old key + + false + true + false + 1 + 0 + A door key + 25 + 15636736 + + + Pigeon cage + + false + true + false + 1 + 0 + It's for holding pigeons + 274 + 15636736 + + + Messenger pigeons + Release + false + true + false + 1 + 0 + Some very plump birds + 275 + 15636736 + + + Bird feed + + false + true + false + 1 + 0 + A selection of mixed seeds + 276 + 15636736 + + + Rotten apples + Eat + false + true + false + 1 + 0 + Yuck! + 277 + 15636736 + + + Doctors gown + + false + true + false + 40 + 64 + I do feel clever wearing this + 87 + 16777215 + + + Bronze key + + false + true + false + 1 + 0 + A heavy key + 25 + 16737817 + + + Distillator + + false + true + false + 1 + 0 + It's for seperating compounds + 278 + 16737817 + + + Glarial's urn + + false + false + false + 1 + 0 + An urn containing glarials ashes + 279 + 0 + + + Glarial's urn + + false + false + false + 1 + 0 + An empty metal urn + 280 + 0 + + + Priest robe + + false + false + true + 5 + 64 + I feel closer to saradomin in this + 87 + 1052688 + + + Priest gown + + false + false + true + 5 + 128 + I feel closer to saradomin in this + 88 + 1052688 + + + Liquid Honey + + false + true + false + 0 + 0 + This isn't worth much + 48 + 16776960 + + + Ethenea + + false + true + false + 10 + 0 + An expensive colourless liquid + 48 + 11184827 + + + Sulphuric Broline + + false + true + false + 1 + 0 + It's highly poisonous + 48 + 11966902 + + + Plague sample + + false + true + false + 1 + 0 + An air tight tin container + 281 + 0 + + + Touch paper + + false + true + false + 1 + 0 + For scientific testing + 282 + 0 + + + Dragon Bones + Bury + false + true + true + 1 + 0 + Ew it's a pile of bones + 137 + 0 + + + Herb + Identify + false + true + false + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Snake Weed + + false + true + false + 5 + 0 + A very rare jungle herb + 75 + 0 + + + Herb + Identify + false + true + false + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Ardrigal + + false + true + false + 5 + 0 + An interesting + 75 + 0 + + + Herb + Identify + false + true + false + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Sito Foil + + false + true + false + 5 + 0 + An rare species of jungle herb + 75 + 0 + + + Herb + Identify + false + true + false + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Volencia Moss + + false + true + false + 5 + 0 + A very rare species of jungle herb + 75 + 0 + + + Herb + Identify + false + true + false + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Rogues Purse + + false + true + false + 5 + 0 + A rare species of jungle herb + 75 + 0 + + + Soul-Rune + + true + true + true + 2500 + 0 + Used for high level curse spells + 235 + 0 + + + King lathas Amulet + + false + true + false + 10 + 1024 + The amulet is red + 125 + 13382451 + + + Bronze Spear + + false + true + true + 4 + 16 + A bronze tipped spear + 283 + 16737817 + + + Halloween mask + + false + false + true + 15 + 32 + Aaaarrrghhh ... i'm a monster + 284 + 65280 + + + Dragon bitter + Drink + false + true + true + 2 + 0 + A glass of frothy ale + 90 + 0 + + + Greenmans ale + Drink + false + true + true + 2 + 0 + A glass of frothy ale + 90 + 0 + + + Halloween mask + + false + false + true + 15 + 32 + Aaaarrrghhh ... i'm a monster + 284 + 16711680 + + + Halloween mask + + false + false + true + 15 + 32 + Aaaarrrghhh ... i'm a monster + 284 + 255 + + + Cocktail glass + + false + true + true + 0 + 0 + For sipping cocktails + 285 + 0 + + + Cocktail shaker + Pour + false + true + true + 2 + 0 + For mixing cocktails + 286 + 0 + + + Bone Key + Look + false + true + false + 1 + 0 + A key delicately carved key made from a single piece of bone + 25 + 16777215 + + + Gnome robe + + false + true + true + 180 + 128 + A high fashion robe + 88 + 16755370 + + + Gnome robe + + false + true + true + 180 + 128 + A high fashion robe + 88 + 11206570 + + + Gnome robe + + false + true + true + 180 + 128 + A high fashion robe + 88 + 11184895 + + + Gnome robe + + false + true + true + 180 + 128 + A high fashion robe + 88 + 16777164 + + + Gnome robe + + false + true + true + 180 + 128 + A high fashion robe + 88 + 13434879 + + + Gnomeshat + + false + true + true + 160 + 32 + A silly pointed hat + 86 + 16755370 + + + Gnomeshat + + false + true + true + 160 + 32 + A silly pointed hat + 86 + 11206570 + + + Gnomeshat + + false + true + true + 160 + 32 + A silly pointed hat + 86 + 11184895 + + + Gnomeshat + + false + true + true + 160 + 32 + A silly pointed hat + 86 + 16777164 + + + Gnomeshat + + false + true + true + 160 + 32 + A silly pointed hat + 86 + 13434879 + + + Gnome top + + false + true + true + 180 + 64 + Rometti - the ultimate in gnome design + 87 + 16755370 + + + Gnome top + + false + true + true + 180 + 64 + Rometti - the only name in gnome fashion! + 87 + 11206570 + + + Gnome top + + false + true + true + 180 + 64 + Rometti - the only name in gnome fashion! + 87 + 11184895 + + + Gnome top + + false + true + true + 180 + 64 + Rometti - the only name in gnome fashion! + 87 + 16777164 + + + Gnome top + + false + true + true + 180 + 64 + Rometti - the only name in gnome fashion! + 87 + 13434879 + + + Gnome cocktail guide + Read + false + true + true + 2 + 0 + A book on tree gnome cocktails + 299 + 0 + + + Beads of the dead + + false + true + false + 35 + 1024 + A curious looking neck ornament + 24 + 16737817 + + + Cocktail glass + Drink + false + true + true + 2 + 0 + For sipping cocktails + 288 + 0 + + + Cocktail glass + Drink + false + true + true + 2 + 0 + For sipping cocktails + 289 + 0 + + + Lemon + Eat + false + true + true + 2 + 0 + It's very fresh + 290 + 0 + + + Lemon slices + Eat + false + true + true + 2 + 0 + It's very fresh + 291 + 16763952 + + + Orange + Eat + false + true + true + 2 + 0 + It's very fresh + 292 + 0 + + + Orange slices + Eat + false + true + true + 2 + 0 + It's very fresh + 291 + 16760880 + + + Diced orange + Eat + false + true + true + 2 + 0 + Fresh chunks of orange + 293 + 16760880 + + + Diced lemon + Eat + false + true + true + 2 + 0 + Fresh chunks of lemon + 293 + 16763952 + + + Fresh Pineapple + Eat + false + true + true + 1 + 0 + It can be cut up with a knife + 124 + 0 + + + Pineapple chunks + Eat + false + true + true + 1 + 0 + Fresh chunks of pineapple + 293 + 16760880 + + + Lime + Eat + false + true + true + 2 + 0 + It's very fresh + 294 + 0 + + + Lime chunks + Eat + false + true + true + 1 + 0 + Fresh chunks of lime + 293 + 65280 + + + Lime slices + Eat + false + true + true + 2 + 0 + It's very fresh + 291 + 65280 + + + Fruit blast + Drink + false + true + true + 2 + 0 + A cool refreshing fruit mix + 295 + 0 + + + Odd looking cocktail + Drink + false + true + true + 2 + 0 + A cool refreshing mix + 289 + 0 + + + Whisky + Drink + false + true + true + 5 + 0 + A locally brewed Malt + 191 + 16755200 + + + Vodka + Drink + false + true + true + 5 + 0 + A strong spirit + 191 + 16755200 + + + Gin + Drink + false + true + true + 5 + 0 + A strong spirit + 191 + 16755200 + + + Cream + Eat + false + true + true + 2 + 0 + Fresh cream + 296 + 0 + + + Drunk dragon + Drink + false + true + true + 2 + 0 + A warm creamy alcoholic beverage + 297 + 0 + + + Equa leaves + Eat + false + true + true + 2 + 0 + Small sweet smelling leaves + 298 + 0 + + + SGG + Drink + false + true + true + 2 + 0 + A short green guy..looks good + 295 + 0 + + + Chocolate saturday + Drink + false + true + true + 2 + 0 + A warm creamy alcoholic beverage + 297 + 0 + + + Brandy + Drink + false + true + true + 5 + 0 + A strong spirit + 191 + 16755200 + + + Blurberry special + Drink + false + true + true + 2 + 0 + Looks good..smells strong + 295 + 0 + + + Wizard blizzard + Drink + false + true + true + 2 + 0 + Looks like a strange mix + 295 + 0 + + + Pineapple punch + Drink + false + true + true + 2 + 0 + A fresh healthy fruit mix + 295 + 0 + + + Gnomebatta dough + + false + true + true + 2 + 0 + Dough formed into a base + 300 + 0 + + + Gianne dough + Mould + false + true + true + 2 + 0 + It's made from a secret recipe + 301 + 0 + + + Gnomebowl dough + + false + true + true + 2 + 0 + Dough formed into a bowl shape + 302 + 0 + + + Gnomecrunchie dough + + false + true + true + 2 + 0 + Dough formed into cookie shapes + 303 + 0 + + + Gnomebatta + + false + true + true + 2 + 0 + A baked dough base + 300 + 0 + + + Gnomebowl + Eat + false + true + true + 2 + 0 + A baked dough bowl + 302 + 0 + + + Gnomebatta + + false + true + true + 2 + 0 + It's burnt to a sinder + 304 + 0 + + + Gnomecrunchie + + false + true + true + 2 + 0 + They're burnt to a sinder + 306 + 0 + + + Gnomebowl + + false + true + true + 2 + 0 + It's burnt to a sinder + 305 + 0 + + + Uncut Red Topaz + + false + true + true + 40 + 0 + A semi precious stone + 73 + 16525133 + + + Uncut Jade + + false + true + true + 30 + 0 + A semi precious stone + 73 + 10025880 + + + Uncut Opal + + false + true + true + 20 + 0 + A semi precious stone + 73 + 16777124 + + + Red Topaz + + false + true + true + 200 + 0 + A semi precious stone + 74 + 16525133 + + + Jade + + false + true + true + 150 + 0 + A semi precious stone + 74 + 10025880 + + + Opal + + false + true + true + 100 + 0 + A semi precious stone + 74 + 16777124 + + + Swamp Toad + Remove legs + false + true + true + 2 + 0 + Slippery little blighters + 307 + 0 + + + Toad legs + Eat + false + true + true + 2 + 0 + Gnome delicacy apparently + 308 + 0 + + + King worm + Eat + false + true + true + 2 + 0 + Gnome delicacy apparently + 309 + 0 + + + Gnome spice + + false + true + true + 2 + 0 + Aluft Giannes secret reciepe + 310 + 0 + + + Gianne cook book + Read + false + true + true + 2 + 0 + Aluft Giannes favorite dishes + 299 + 0 + + + Gnomecrunchie + Eat + false + true + true + 2 + 0 + Yum ... smells good + 311 + 0 + + + Cheese and tomato batta + Eat + false + true + true + 2 + 0 + Smells really good + 312 + 0 + + + Toad batta + Eat + false + true + true + 2 + 0 + Actually smells quite good + 312 + 0 + + + Gnome batta + Eat + false + true + true + 2 + 0 + Smells like pants + 312 + 0 + + + Worm batta + Eat + false + true + true + 2 + 0 + Actually smells quite good + 312 + 0 + + + Fruit batta + Eat + false + true + true + 2 + 0 + Actually smells quite good + 312 + 0 + + + Veg batta + Eat + false + true + true + 2 + 0 + Well..it looks healthy + 312 + 0 + + + Chocolate bomb + Eat + false + true + true + 2 + 0 + Looks great + 313 + 0 + + + Vegball + Eat + false + true + true + 2 + 0 + Looks pretty healthy + 314 + 0 + + + Worm hole + Eat + false + true + true + 2 + 0 + Actually smells quite good + 315 + 0 + + + Tangled toads legs + Eat + false + true + true + 2 + 0 + Actually smells quite good + 316 + 0 + + + Choc crunchies + Eat + false + true + true + 2 + 0 + Yum ... smells good + 311 + 0 + + + Worm crunchies + Eat + false + true + true + 2 + 0 + Actually smells quite good + 311 + 0 + + + Toad crunchies + Eat + false + true + true + 2 + 0 + Actually smells quite good + 311 + 0 + + + Spice crunchies + Eat + false + true + true + 2 + 0 + Yum ... smells good + 311 + 0 + + + Crushed Gemstone + + false + true + true + 2 + 0 + A gemstone that has been smashed + 23 + 16777215 + + + Blurberry badge + + false + true + true + 2 + 0 + An official cocktail maker + 317 + 16711680 + + + Gianne badge + + false + true + true + 2 + 0 + An official gianne chef + 317 + 65280 + + + Tree gnome translation + Read + false + true + true + 2 + 0 + Translate the old gnome tounge + 299 + 0 + + + Bark sample + + false + true + false + 2 + 0 + A sample from the grand tree + 318 + 0 + + + War ship + Play with + false + true + true + 2 + 0 + A model of a karamja warship + 319 + 0 + + + Gloughs journal + Read + false + true + false + 2 + 0 + Glough's private notes + 299 + 0 + + + Invoice + Read + false + true + false + 2 + 0 + A note with foreman's timber order + 234 + 0 + + + Ugthanki Kebab + Eat + false + true + true + 20 + 0 + A strange smelling Kebab made from Ugthanki meat - it doesn't look too good + 95 + 0 + + + Special curry + Eat + false + true + true + 20 + 0 + It's a spicy hot curry + 162 + 12274688 + + + Glough's key + + false + true + false + 1 + 0 + Glough left this at anita's + 25 + 14540253 + + + Glough's notes + Read + false + true + false + 2 + 0 + Scribbled notes and diagrams + 234 + 0 + + + Pebble + + false + true + false + 2 + 0 + The pebble has an inscription + 321 + 0 + + + Pebble + + false + true + false + 2 + 0 + The pebble has an inscription + 322 + 0 + + + Pebble + + false + true + false + 2 + 0 + The pebble has an inscription + 323 + 0 + + + Pebble + + false + true + false + 2 + 0 + The pebble has an inscription + 324 + 0 + + + Daconia rock + + false + true + false + 40 + 0 + A magicaly crafted stone + 73 + 14540253 + + + Sinister key + + false + true + true + 1 + 0 + You get a sense of dread from this key + 25 + 1118481 + + + Herb + Identify + false + true + true + 1 + 0 + I need a closer look to identify this + 75 + 0 + + + Torstol + + false + true + true + 25 + 0 + A useful herb + 75 + 0 + + + Unfinished potion + + false + true + true + 25 + 0 + I need Jangerberries to finish this Torstol potion + 48 + 12285696 + + + Jangerberries + Eat + false + true + true + 1 + 0 + They don't look very ripe + 21 + 4497408 + + + Fruit blast + Drink + false + true + true + 30 + 0 + A cool refreshing fruit mix + 295 + 0 + + + Blurberry special + Drink + false + true + true + 30 + 0 + Looks good..smells strong + 295 + 0 + + + Wizard blizzard + Drink + false + true + true + 30 + 0 + Looks like a strange mix + 295 + 0 + + + Pineapple punch + Drink + false + true + true + 30 + 0 + A fresh healthy fruit mix + 295 + 0 + + + SGG + Drink + false + true + true + 30 + 0 + A short green guy..looks good + 295 + 0 + + + Chocolate saturday + Drink + false + true + true + 30 + 0 + A warm creamy alcoholic beverage + 297 + 0 + + + Drunk dragon + Drink + false + true + true + 30 + 0 + A warm creamy alcoholic beverage + 297 + 0 + + + Cheese and tomato batta + Eat + false + true + true + 120 + 0 + Smells really good + 312 + 0 + + + Toad batta + Eat + false + true + true + 120 + 0 + Actually smells quite good + 312 + 0 + + + Gnome batta + Eat + false + true + true + 120 + 0 + Smells like pants + 312 + 0 + + + Worm batta + Eat + false + true + true + 120 + 0 + Actually smells quite good + 312 + 0 + + + Fruit batta + Eat + false + true + true + 120 + 0 + Actually smells quite good + 312 + 0 + + + Veg batta + Eat + false + true + true + 120 + 0 + Well..it looks healthy + 312 + 0 + + + Chocolate bomb + Eat + false + true + true + 160 + 0 + Looks great + 313 + 0 + + + Vegball + Eat + false + true + true + 150 + 0 + Looks pretty healthy + 314 + 0 + + + Worm hole + Eat + false + true + true + 150 + 0 + Actually smells quite good + 315 + 0 + + + Tangled toads legs + Eat + false + true + true + 160 + 0 + Actually smells quite good + 316 + 0 + + + Choc crunchies + Eat + false + true + true + 85 + 0 + Yum ... smells good + 311 + 0 + + + Worm crunchies + Eat + false + true + true + 85 + 0 + Actually smells quite good + 311 + 0 + + + Toad crunchies + Eat + false + true + true + 85 + 0 + Actually smells quite good + 311 + 0 + + + Spice crunchies + Eat + false + true + true + 85 + 0 + Yum ... smells good + 311 + 0 + + + Stone-Plaque + Read + false + true + false + 5 + 0 + A stone plaque with carved letters in it + 236 + 0 + + + Tattered Scroll + Read + false + true + false + 5 + 0 + An ancient tattered scroll + 29 + 255 + + + Crumpled Scroll + Read + false + true + false + 5 + 0 + An ancient crumpled scroll + 29 + 12648448 + + + Bervirius Tomb Notes + Read + false + true + false + 5 + 0 + Notes taken from the tomb of Bervirius + 29 + 16776960 + + + Zadimus Corpse + Bury + false + true + false + 1 + 0 + The remains of Zadimus + 237 + 15400622 + + + Potion of Zamorak + Drink + false + true + true + 25 + 0 + It looks scary + 48 + 15636736 + + + Potion of Zamorak + Drink + false + true + true + 25 + 0 + It looks scary + 48 + 15636736 + + + Potion of Zamorak + Drink + false + true + true + 25 + 0 + It looks scary + 48 + 15636736 + + + Boots + + false + true + true + 200 + 512 + They're soft and silky + 223 + 16755370 + + + Boots + + false + true + true + 200 + 512 + They're soft and silky + 223 + 11206570 + + + Boots + + false + true + true + 200 + 512 + They're soft and silky + 223 + 11184895 + + + Boots + + false + true + true + 200 + 512 + They're soft and silky + 223 + 16777164 + + + Boots + + false + true + true + 200 + 512 + They're soft and silky + 223 + 13434879 + + + Santa's hat + + false + false + true + 160 + 32 + It's a santa claus' hat + 325 + 0 + + + Locating Crystal + Activate + false + true + false + 100 + 0 + A magical crystal sphere + 199 + 12648447 + + + Sword Pommel + + false + true + false + 100 + 0 + An ivory sword pommel + 334 + 16777088 + + + Bone Shard + Look + false + true + false + 1 + 0 + A slender piece of bone + 238 + 0 + + + Steel Wire + + false + true + true + 200 + 0 + Useful for crafting items + 326 + 0 + + + Bone Beads + + false + true + false + 1 + 0 + Beads carved out of bone + 239 + 16777152 + + + Rashiliya Corpse + Bury + false + true + false + 1 + 0 + The remains of the Zombie Queen + 237 + 16744576 + + + ResetCrystal + Activate + false + true + false + 100 + 0 + Helps reset things in game + 199 + 182474 + + + Bronze Wire + + false + true + true + 20 + 0 + Useful for crafting items + 326 + 16737817 + + + Present + Open + false + false + true + 160 + 0 + Click to use this on a friend + 330 + 0 + + + Gnome Ball + Shoot + false + true + false + 10 + 0 + Lets play + 327 + 0 + + + Papyrus + + false + true + true + 9 + 0 + Used for making notes + 282 + 0 + + + A lump of Charcoal + + false + true + true + 45 + 0 + A lump of cooked coal good for making marks. + 73 + 2105376 + + + Arrow + + false + true + false + 10 + 0 + Linen wrapped around an arrow head + 328 + 0 + + + Lit Arrow + + true + true + false + 10 + 0 + A flamming arrow + 329 + 0 + + + Rocks + + false + true + false + 10 + 0 + A few Large rocks + 331 + 0 + + + Paramaya Rest Ticket + + false + true + false + 5 + 0 + Allows you to rest in the luxurius Paramaya Inn + 218 + 0 + + + Ship Ticket + + false + true + false + 5 + 0 + Allows you passage on the 'Lady of the Waves' ship. + 218 + 8454143 + + + Damp cloth + + false + true + false + 10 + 0 + It smells as if it's been doused in alcohol + 92 + 0 + + + Desert Boots + + false + true + true + 20 + 512 + Boots made specially for the desert + 223 + 16777215 + + + Orb of light + + false + true + false + 10 + 0 + The orb gives you a safe peaceful feeling + 333 + 0 + + + Orb of light + + false + true + false + 10 + 0 + The orb gives you a safe peaceful feeling + 345 + 0 + + + Orb of light + + false + true + false + 10 + 0 + The orb gives you a safe peaceful feeling + 346 + 0 + + + Orb of light + + false + true + false + 10 + 0 + The orb gives you a safe peaceful feeling + 347 + 0 + + + Railing + + false + true + false + 10 + 0 + A broken metal rod + 335 + 0 + + + Randas's journal + Read + false + true + false + 1 + 0 + An old journal with several pages missing + 28 + 15641258 + + + Unicorn horn + + false + true + false + 20 + 0 + Poor unicorn went splat! + 145 + 0 + + + Coat of Arms + + false + true + false + 10 + 0 + A symbol of truth and all that is good + 348 + 0 + + + Coat of Arms + + false + true + false + 10 + 0 + A symbol of truth and all that is good + 336 + 0 + + + Staff of Iban + + false + true + false + 15 + 8216 + It's a slightly magical stick + 337 + 0 + + + Dwarf brew + + false + true + false + 2 + 0 + It's a bucket of home made brew + 22 + 12285815 + + + Ibans Ashes + + false + true + false + 2 + 0 + A heap of ashes + 23 + 11184810 + + + Cat + + false + true + false + 2 + 0 + She's sleeping..i think! + 338 + 11184810 + + + A Doll of Iban + Search + false + true + false + 2 + 0 + A strange doll made from sticks and cloth + 339 + 11184810 + + + Old Journal + Read + false + true + false + 1 + 0 + I wonder who wrote this! + 28 + 16755370 + + + Klank's gauntlets + + false + true + false + 6 + 256 + Heavy hand protection + 217 + 12303291 + + + Iban's shadow + + false + true + false + 2 + 0 + A dark mystical liquid + 340 + 11184810 + + + Iban's conscience + + false + true + false + 2 + 0 + The remains of a dove that died long ago + 341 + 11184810 + + + Amulet of Othainian + + false + true + false + 0 + 1024 + A strange looking amulet + 125 + 12255487 + + + Amulet of Doomion + + false + true + false + 0 + 1024 + A strange looking amulet + 125 + 12255487 + + + Amulet of Holthion + + false + true + false + 0 + 1024 + A strange looking amulet + 125 + 12255487 + + + Keep key + + false + true + false + 1 + 0 + A small prison key + 25 + 12303291 + + + Bronze Throwing Dart + + true + true + true + 2 + 16 + A deadly throwing dart with a bronze tip. + 231 + 16737817 + + + Prototype Throwing Dart + + true + true + false + 70 + 0 + A proto type of a deadly throwing dart. + 231 + 16737817 + + + Iron Throwing Dart + + true + true + true + 5 + 16 + A deadly throwing dart with an iron tip. + 231 + 15654365 + + + Full Water Skin + + false + true + true + 30 + 0 + A skinful of water + 343 + 8404992 + + + Lens mould + + false + true + false + 10 + 0 + A peculiar mould in the shape of a disc + 342 + 0 + + + Lens + + false + true + false + 10 + 0 + A perfectly formed glass disc + 344 + 0 + + + Desert Robe + + false + true + true + 40 + 128 + Cool light robe to wear in the desert + 88 + 16777215 + + + Desert Shirt + + false + true + true + 40 + 64 + A light cool shirt to wear in the desert + 87 + 16777215 + + + Metal Key + + false + true + false + 1 + 0 + A large metalic key. + 25 + 12632256 + + + Slaves Robe Bottom + + false + true + true + 40 + 128 + A dirty desert skirt + 88 + 8421376 + + + Slaves Robe Top + + false + true + true + 40 + 64 + A dirty desert shirt + 87 + 8421376 + + + Steel Throwing Dart + + true + true + true + 20 + 16 + A deadly throwing dart with a steel tip. + 231 + 15658734 + + + Astrology Book + Read + false + true + false + 2 + 0 + A book on Astrology in runescape + 28 + 0 + + + Unholy Symbol mould + + false + true + false + 200 + 0 + Use this with silver in a furnace + 349 + 0 + + + Unholy Symbol of Zamorak + + false + true + false + 200 + 0 + This needs stringing + 350 + 0 + + + Unblessed Unholy Symbol of Zamorak + + false + true + false + 200 + 1024 + This needs blessing + 351 + 0 + + + Unholy Symbol of Zamorak + + false + true + false + 200 + 1024 + A symbol indicating allegiance to Zamorak + 351 + 0 + + + Shantay Desert Pass + + true + true + false + 5 + 0 + Allows you into the desert through the Shantay pass worth 5 gold. + 218 + 13083169 + + + Staff of Iban + Wield + false + true + false + 15 + 0 + The staff is damaged + 337 + 0 + + + Dwarf cannon base + Set down + false + true + true + 200000 + 0 + Bang + 352 + 0 + + + Dwarf cannon stand + + false + true + true + 200000 + 0 + Bang + 353 + 0 + + + Dwarf cannon barrels + + false + true + true + 200000 + 0 + Bang + 354 + 0 + + + Dwarf cannon furnace + + false + true + true + 200000 + 0 + Bang + 355 + 0 + + + Fingernails + + false + true + false + 0 + 0 + Ugh gross! + 356 + 0 + + + Powering crystal1 + + false + true + false + 0 + 0 + An intricately cut gemstone + 357 + 16777011 + + + Mining Barrel + + false + true + false + 100 + 0 + A roughly constructed barrel for carrying rock. + 358 + 65280 + + + Ana in a Barrel + Look + false + true + false + 100 + 0 + A roughly constructed barrel with an Ana in it! + 359 + 16711680 + + + Stolen gold + + false + true + false + 300 + 0 + I wish I could spend it + 79 + 16763980 + + + Multi cannon ball + + true + true + true + 10 + 0 + A heavy metal spiked ball + 332 + 0 + + + Railing + + false + true + false + 10 + 0 + A metal railing replacement + 335 + 0 + + + Ogre tooth + + false + true + false + 0 + 0 + Big sharp and nasty + 360 + 0 + + + Ogre relic + + false + true + false + 0 + 0 + A grotesque symbol of the ogres + 361 + 0 + + + Skavid map + + false + true + false + 0 + 0 + A map of cave locations + 362 + 0 + + + Dwarf remains + + false + true + false + 1 + 0 + The remains of a dwarf savaged by goblins + 237 + 16744576 + + + Key + + false + true + false + 1 + 0 + A key for a chest + 25 + 16750848 + + + Ogre relic part + + false + true + false + 0 + 0 + A piece of a statue + 363 + 0 + + + Ogre relic part + + false + true + false + 0 + 0 + A piece of a statue + 364 + 0 + + + Ogre relic part + + false + true + false + 0 + 0 + A piece of a statue + 365 + 0 + + + Ground bat bones + + false + true + false + 20 + 0 + The ground bones of a bat + 23 + 15645520 + + + Unfinished potion + + false + true + false + 3 + 0 + I need another ingredient to finish the shaman potion + 48 + 56576 + + + Ogre potion + + false + true + false + 120 + 0 + A strange liquid + 48 + 13434726 + + + Magic ogre potion + + false + true + false + 120 + 0 + A strange liquid that bubbles with power + 48 + 6750156 + + + Tool kit + + false + true + false + 120 + 0 + These could be handy! + 366 + 15654365 + + + Nulodion's notes + Read + false + true + false + 1 + 0 + Construction notes for dwarf cannon ammo + 234 + 0 + + + Cannon ammo mould + + false + true + true + 5 + 0 + Used to make cannon ammo + 367 + 0 + + + Tenti Pineapple + + false + true + false + 1 + 0 + The most delicious in the whole of Kharid + 124 + 0 + + + Bedobin Copy Key + + false + true + false + 20 + 0 + A copy of a key for the captains of the mining camps chest + 25 + 4194304 + + + Technical Plans + Read + false + true + false + 500 + 0 + Very technical looking plans for making a thrown weapon of some sort + 218 + 12632256 + + + Rock cake + Eat + false + true + false + 0 + 0 + Yum... I think! + 368 + 0 + + + Bronze dart tips + + true + true + true + 1 + 0 + Dangerous looking dart tips - need feathers for flight + 369 + 16737817 + + + Iron dart tips + + true + true + true + 3 + 0 + Dangerous looking dart tips - need feathers for flight + 369 + 15654365 + + + Steel dart tips + + true + true + true + 9 + 0 + Dangerous looking dart tips - need feathers for flight + 369 + 15658734 + + + Mithril dart tips + + true + true + true + 25 + 0 + Dangerous looking dart tips - need feathers for flight + 369 + 10072780 + + + Adamantite dart tips + + true + true + true + 65 + 0 + Dangerous looking dart tips - need feathers for flight + 369 + 11717785 + + + Rune dart tips + + true + true + true + 350 + 0 + Dangerous looking dart tips - need feathers for flight + 369 + 65535 + + + Mithril Throwing Dart + + true + true + true + 50 + 16 + A deadly throwing dart with a mithril tip. + 231 + 10072780 + + + Adamantite Throwing Dart + + true + true + true + 130 + 16 + A deadly throwing dart with an adamantite tip. + 231 + 11717785 + + + Rune Throwing Dart + + true + true + true + 700 + 16 + A deadly throwing dart with a runite tip. + 231 + 65535 + + + Prototype dart tip + + true + true + false + 1 + 0 + Dangerous looking dart tip - needs feathers for flight + 207 + 16737817 + + + Info document + Read + false + true + false + 2 + 0 + Read to access variable choices + 234 + 0 + + + Instruction manual + Read + false + true + false + 1 + 0 + An old note book + 28 + 16755370 + + + Unfinished potion + + false + true + false + 3 + 0 + I need another ingredient to finish this potion + 48 + 6750054 + + + Iron throwing knife + + false + true + true + 6 + 16 + A finely balanced knife + 80 + 15654365 + + + Bronze throwing knife + + false + true + true + 2 + 16 + A finely balanced knife + 80 + 16737817 + + + Steel throwing knife + + false + true + true + 21 + 16 + A finely balanced knife + 80 + 15658734 + + + Mithril throwing knife + + false + true + true + 54 + 16 + A finely balanced knife + 80 + 10072780 + + + Adamantite throwing knife + + false + true + true + 133 + 16 + A finely balanced knife + 80 + 11717785 + + + Rune throwing knife + + false + true + true + 333 + 16 + A finely balanced knife + 80 + 65535 + + + Black throwing knife + + false + true + true + 37 + 16 + A finely balanced knife + 80 + 3158064 + + + Water Skin mostly full + + false + true + true + 27 + 0 + A half full skin of water + 343 + 8404992 + + + Water Skin mostly empty + + false + true + true + 24 + 0 + A half empty skin of water + 343 + 8404992 + + + Water Skin mouthful left + + false + true + true + 18 + 0 + A waterskin with a mouthful of water left + 343 + 8404992 + + + Empty Water Skin + + false + true + true + 15 + 0 + A completely empty waterskin + 343 + 8404992 + + + Nightshade + Eat + false + true + false + 30 + 0 + Deadly! + 370 + 0 + + + Shaman robe + Search + false + true + false + 40 + 0 + This has been left by one of the dead ogre shaman + 87 + 10510400 + + + Iron Spear + + false + true + true + 13 + 16 + An iron tipped spear + 283 + 15654365 + + + Steel Spear + + false + true + true + 46 + 16 + A steel tipped spear + 283 + 15658734 + + + Mithril Spear + + false + true + true + 119 + 16 + A mithril tipped spear + 283 + 10072780 + + + Adamantite Spear + + false + true + true + 293 + 16 + An adamantite tipped spear + 283 + 11717785 + + + Rune Spear + + false + true + true + 1000 + 16 + A rune tipped spear + 283 + 56797 + + + Cat + Stroke + false + true + false + 2 + 0 + It's fluffs + 338 + 11184810 + + + Seasoned Sardine + + false + true + true + 10 + 0 + They don't smell any better + 165 + 10551200 + + + Kittens + + false + true + false + 2 + 0 + Purrr + 372 + 11184810 + + + Kitten + Stroke + false + true + false + 2 + 0 + Purrr + 371 + 11184810 + + + Wrought iron key + + false + true + false + 1 + 0 + This key clears unlocks a very sturdy gate of some sort. + 25 + 14540253 + + + Cell Door Key + + false + true + false + 1 + 0 + A roughly hewn key + 25 + 16384 + + + A free Shantay Disclaimer + Read + false + true + true + 1 + 0 + Very important information. + 218 + 16711680 + + + Doogle leaves + + false + true + true + 2 + 0 + Small sweet smelling leaves + 298 + 0 + + + Raw Ugthanki Meat + + false + true + true + 2 + 0 + I need to cook this first + 60 + 16744640 + + + Tasty Ugthanki Kebab + Eat + false + true + true + 20 + 0 + A fresh Kebab made from Ugthanki meat + 320 + 0 + + + Cooked Ugthanki Meat + Eat + false + true + true + 5 + 0 + Freshly cooked Ugthanki meat + 60 + 13395507 + + + Uncooked Pitta Bread + + false + true + true + 4 + 0 + I need to cook this. + 152 + 0 + + + Pitta Bread + + false + true + true + 10 + 0 + Mmmm I need to add some other ingredients yet. + 152 + 16768184 + + + Tomato Mixture + + false + true + true + 3 + 0 + A mixture of tomatoes in a bowl + 162 + 16711680 + + + Onion Mixture + + false + true + true + 3 + 0 + A mixture of onions in a bowl + 162 + 16776960 + + + Onion and Tomato Mixture + + false + true + true + 3 + 0 + A mixture of onions and tomatoes in a bowl + 162 + 16744512 + + + Onion and Tomato and Ugthanki Mix + + false + true + true + 3 + 0 + A mixture of onions and tomatoes and Ugthanki meat in a bowl + 162 + 5977890 + + + Burnt Pitta Bread + + false + true + true + 1 + 0 + Urgh - it's all burnt + 152 + 4194304 + + + Panning tray + Search + false + true + false + 1 + 0 + Used for panning gold + 373 + 4194304 + + + Panning tray + Take gold + false + true + false + 1 + 0 + This tray contains gold nuggets + 374 + 4194304 + + + Panning tray + Search + false + true + false + 1 + 0 + This tray contains mud + 375 + 4194304 + + + Rock pick + + false + true + false + 1 + 0 + A sharp pick for cracking rocks + 376 + 4194304 + + + Specimen brush + + false + true + false + 1 + 0 + Stiff brush for cleaning specimens + 377 + 4194304 + + + Specimen jar + + false + true + false + 1 + 0 + A jar for holding soil samples + 378 + 4194304 + + + Rock Sample + + false + true + false + 1 + 0 + A rock sample + 379 + 4194304 + + + Gold Nuggets + + true + true + false + 1 + 0 + Real gold pieces! + 380 + 4194304 + + + Cat + + false + true + true + 1 + 0 + Looks like a healthy one + 381 + 4194304 + + + Scrumpled piece of paper + Read + false + true + true + 10 + 0 + A piece of paper with barely legible writing - looks like a recipe! + 218 + 16317080 + + + Digsite info + Read + false + true + false + 63 + 0 + IAN ONLY + 382 + 0 + + + Poisoned Bronze Throwing Dart + + true + true + true + 2 + 16 + A venomous throwing dart with a bronze tip. + 384 + 16737817 + + + Poisoned Iron Throwing Dart + + true + true + true + 5 + 16 + A venomous throwing dart with an iron tip. + 384 + 16737817 + + + Poisoned Steel Throwing Dart + + true + true + true + 20 + 16 + A venomous throwing dart with a steel tip. + 384 + 15658734 + + + Poisoned Mithril Throwing Dart + + true + true + true + 50 + 16 + A venomous throwing dart with a mithril tip. + 384 + 10072780 + + + Poisoned Adamantite Throwing Dart + + true + true + true + 130 + 16 + A venomous throwing dart with an adamantite tip. + 384 + 11717785 + + + Poisoned Rune Throwing Dart + + true + true + true + 700 + 16 + A deadly venomous dart with a runite tip. + 384 + 65535 + + + Poisoned Bronze throwing knife + + false + true + true + 2 + 16 + A finely balanced knife with a coating of venom + 385 + 16737817 + + + Poisoned Iron throwing knife + + false + true + true + 6 + 16 + A finely balanced knife with a coating of venom + 385 + 15654365 + + + Poisoned Steel throwing knife + + false + true + true + 21 + 16 + A finely balanced knife with a coating of venom + 385 + 15658734 + + + Poisoned Mithril throwing knife + + false + true + true + 54 + 16 + A finely balanced knife with a coating of venom + 385 + 10072780 + + + Poisoned Black throwing knife + + false + true + true + 37 + 16 + A finely balanced knife with a coating of venom + 385 + 3158064 + + + Poisoned Adamantite throwing knife + + false + true + true + 133 + 16 + A finely balanced knife with a coating of venom + 385 + 11717785 + + + Poisoned Rune throwing knife + + false + true + true + 333 + 16 + A finely balanced knife with a coating of venom + 385 + 65535 + + + Poisoned Bronze Spear + + false + true + true + 4 + 16 + A bronze tipped spear with added venom + 383 + 16737817 + + + Poisoned Iron Spear + + false + true + true + 13 + 16 + An iron tipped spear with added venom + 383 + 15654365 + + + Poisoned Steel Spear + + false + true + true + 46 + 16 + A steel tipped spear with added venom + 383 + 15658734 + + + Poisoned Mithril Spear + + false + true + true + 119 + 16 + A mithril tipped spear with added venom + 383 + 10072780 + + + Poisoned Adamantite Spear + + false + true + true + 293 + 16 + An adamantite tipped spear with added venom + 383 + 11717785 + + + Poisoned Rune Spear + + false + true + true + 1000 + 16 + A rune tipped spear with added venom + 383 + 56797 + + + Book of experimental chemistry + Read + false + true + false + 1 + 0 + A book on experiments with volatile chemicals + 28 + 16755370 + + + Level 1 Certificate + Read + false + true + false + 1 + 0 + A Certificate of education + 29 + 0 + + + Level 2 Certificate + Read + false + true + false + 1 + 0 + A Certificate of education + 29 + 0 + + + Level 3 Certificate + Read + false + true + false + 1 + 0 + A Certificate of education + 29 + 0 + + + Trowel + + false + true + false + 1 + 0 + A small device for digging + 386 + 0 + + + Stamped letter of recommendation + + false + true + false + 1 + 0 + A stamped scroll with a recommendation on it + 402 + 0 + + + Unstamped letter of recommendation + + false + true + false + 5 + 0 + I hereby recommend this student to undertake the Varrock City earth sciences exams + 29 + 0 + + + Rock Sample + + false + true + false + 1 + 0 + A rock sample + 388 + 4194304 + + + Rock Sample + + false + true + false + 1 + 0 + A rock sample + 389 + 4194304 + + + Cracked rock Sample + + false + true + false + 1 + 0 + It's been cracked open + 387 + 4194304 + + + Belt buckle + + false + true + false + 1 + 0 + Been here some time + 390 + 4194304 + + + Powering crystal2 + + false + true + false + 0 + 0 + An intricately cut gemstone + 357 + 16738047 + + + Powering crystal3 + + false + true + false + 0 + 0 + An intricately cut gemstone + 357 + 6750207 + + + Powering crystal4 + + false + true + false + 0 + 0 + An intricately cut gemstone + 357 + 3407667 + + + Old boot + + false + true + false + 1 + 0 + That's been here some time + 391 + 4194304 + + + Bunny ears + + false + false + true + 1 + 32 + Get another from the clothes shop if you die + 392 + 4194304 + + + Damaged armour + + false + true + false + 1 + 0 + That's been here some time + 393 + 4194304 + + + Damaged armour + + false + true + false + 1 + 0 + That's been here some time + 394 + 4194304 + + + Rusty sword + + false + true + false + 1 + 0 + That's been here some time + 395 + 4194304 + + + Ammonium Nitrate + + false + true + false + 20 + 0 + An acrid chemical + 23 + 16777164 + + + Nitroglycerin + + false + true + false + 2 + 0 + A strong acidic formula + 48 + 16750848 + + + Old tooth + + false + true + false + 0 + 0 + A large single tooth + 360 + 0 + + + Radimus Scrolls + Read Scrolls + false + true + false + 5 + 0 + Scrolls that Radimus gave you + 29 + 8421504 + + + Chest key + + false + true + false + 1 + 0 + A small key for a chest + 25 + 16763904 + + + Broken arrow + + false + true + false + 1 + 0 + That's been here some time + 396 + 4194304 + + + Buttons + + false + true + false + 1 + 0 + They've been here some time + 397 + 4194304 + + + Broken staff + + false + true + false + 1 + 0 + That's been here some time + 398 + 4194304 + + + Vase + + false + true + false + 1 + 0 + An old vase + 279 + 0 + + + Ceramic remains + + false + true + false + 1 + 0 + Some ancient pottery + 399 + 4194304 + + + Broken glass + + false + true + false + 0 + 0 + Smashed glass + 259 + 0 + + + Unidentified powder + + false + true + false + 20 + 0 + Who knows what this is for? + 23 + 16777164 + + + Machette + + false + true + true + 40 + 16 + A purpose built tool for cutting through thick jungle. + 432 + 8421504 + + + Scroll + Read + false + true + false + 5 + 0 + A letter written by the expert + 29 + 0 + + + Stone tablet + Read + false + true + false + 1 + 0 + Some ancient script is engraved on here + 400 + 4194304 + + + Talisman of Zaros + + false + true + false + 1 + 0 + An ancient item + 401 + 4194304 + + + Explosive compound + + false + true + false + 2 + 0 + A dark mystical powder + 48 + 51 + + + Bull Roarer + Swing + false + true + false + 1 + 0 + A sound producing instrument - it may attract attention + 418 + 7552262 + + + Mixed chemicals + + false + true + false + 2 + 0 + A pungent mix of 2 chemicals + 48 + 16777113 + + + Ground charcoal + + false + true + true + 20 + 0 + Powdered charcoal! + 23 + 2236962 + + + Mixed chemicals + + false + true + false + 2 + 0 + A pungent mix of 3 chemicals + 48 + 13408512 + + + Spell scroll + Read + false + true + false + 5 + 0 + A magical scroll + 29 + 0 + + + Yommi tree seed + Inspect + true + true + false + 200 + 0 + A magical seed that grows into a Yommi tree - these need to be germinated + 270 + 65280 + + + Totem Pole + + false + true + false + 500 + 0 + A well crafted totem pole + 403 + 65280 + + + Dwarf cannon base + Set down + false + true + true + 200000 + 0 + Bang + 352 + 0 + + + Dwarf cannon stand + + false + true + true + 200000 + 0 + Bang + 353 + 0 + + + Dwarf cannon barrels + + false + true + true + 200000 + 0 + Bang + 354 + 0 + + + Dwarf cannon furnace + + false + true + true + 150000 + 0 + Bang + 355 + 0 + + + Golden Bowl + + false + true + false + 1000 + 0 + A specially made bowl constructed out of pure gold + 404 + 0 + + + Golden Bowl with pure water + + false + true + false + 1000 + 0 + A golden bowl filled with pure water + 405 + 8454143 + + + Raw Manta ray + + false + true + true + 500 + 0 + A rare catch! + 406 + 255 + + + Manta ray + Eat + false + true + true + 500 + 0 + A rare catch! + 407 + 255 + + + Raw Sea turtle + + false + true + true + 500 + 0 + A rare catch! + 408 + 255 + + + Sea turtle + Eat + false + true + true + 500 + 0 + Tasty! + 409 + 255 + + + Annas Silver Necklace + + false + true + false + 1 + 1024 + A necklace coated with silver + 24 + 0 + + + Bobs Silver Teacup + + false + true + false + 1 + 0 + A tea cup coated with silver + 227 + 0 + + + Carols Silver Bottle + + false + true + false + 1 + 0 + A little bottle coated with silver + 104 + 0 + + + Davids Silver Book + + false + true + false + 1 + 0 + An ornamental book coated with silver + 28 + 0 + + + Elizabeths Silver Needle + + false + true + false + 1 + 0 + An ornamental needle coated with silver + 38 + 0 + + + Franks Silver Pot + + false + true + false + 1 + 0 + A small pot coated with silver + 61 + 0 + + + Thread + + false + true + false + 1 + 0 + A piece of red thread discovered at the scene of the crime + 208 + 16711680 + + + Thread + + false + true + false + 1 + 0 + A piece of green thread discovered at the scene of the crime + 208 + 65280 + + + Thread + + false + true + false + 1 + 0 + A piece of blue thread discovered at the scene of the crime + 208 + 255 + + + Flypaper + + false + true + false + 1 + 0 + Sticky paper for catching flies + 415 + 14540253 + + + Murder Scene Pot + + false + true + false + 1 + 0 + The pot has a sickly smell of poison mixed with wine + 61 + 16711680 + + + A Silver Dagger + + false + true + false + 1 + 16 + Dagger Found at crime scene + 80 + 0 + + + Murderers fingerprint + + false + true + false + 1 + 0 + An impression of the murderers fingerprint + 416 + 14540253 + + + Annas fingerprint + + false + true + false + 1 + 0 + An impression of Annas fingerprint + 416 + 14540253 + + + Bobs fingerprint + + false + true + false + 1 + 0 + An impression of Bobs fingerprint + 416 + 14540253 + + + Carols fingerprint + + false + true + false + 1 + 0 + An impression of Carols fingerprint + 416 + 14540253 + + + Davids fingerprint + + false + true + false + 1 + 0 + An impression of Davids fingerprint + 416 + 14540253 + + + Elizabeths fingerprint + + false + true + false + 1 + 0 + An impression of Elizabeths fingerprint + 416 + 14540253 + + + Franks fingerprint + + false + true + false + 1 + 0 + An impression of Franks fingerprint + 416 + 14540253 + + + Zamorak Cape + + false + true + false + 100 + 2048 + A cape from the almighty zamorak + 59 + 16711680 + + + Saradomin Cape + + false + true + false + 100 + 2048 + A cape from the almighty saradomin + 59 + 4210926 + + + Guthix Cape + + false + true + false + 100 + 2048 + A cape from the almighty guthix + 59 + 4246592 + + + Staff of zamorak + + false + true + false + 80000 + 16 + It's a stick of the gods + 337 + 0 + + + Staff of guthix + + false + true + false + 80000 + 16 + It's a stick of the gods + 85 + 10072780 + + + Staff of Saradomin + + false + true + false + 80000 + 16 + It's a stick of the gods + 414 + 10072780 + + + A chunk of crystal + + false + true + false + 2000 + 0 + A reddish crystal fragment - it looks like it formed a shape at one time. + 410 + 0 + + + A lump of crystal + + false + true + false + 2000 + 0 + A reddish crystal fragment - it looks like it formed a shape at one time. + 411 + 0 + + + A hunk of crystal + + false + true + false + 2000 + 0 + A reddish crystal fragment - it looks like it formed a shape at one time. + 412 + 0 + + + A red crystal + Inspect + false + true + false + 2000 + 0 + A heart shaped red crystal + 413 + 0 + + + Unidentified fingerprint + + false + true + false + 1 + 0 + An impression of the murderers fingerprint + 416 + 14540253 + + + Annas Silver Necklace + + false + true + false + 1 + 1024 + A silver necklace coated with flour + 24 + 0 + + + Bobs Silver Teacup + + false + true + false + 1 + 0 + A silver tea cup coated with flour + 227 + 0 + + + Carols Silver Bottle + + false + true + false + 1 + 0 + A little silver bottle coated with flour + 104 + 0 + + + Davids Silver Book + + false + true + false + 1 + 0 + An ornamental silver book coated with flour + 28 + 0 + + + Elizabeths Silver Needle + + false + true + false + 1 + 0 + An ornamental silver needle coated with flour + 38 + 0 + + + Franks Silver Pot + + false + true + false + 1 + 0 + A small silver pot coated with flour + 61 + 0 + + + A Silver Dagger + + false + true + false + 1 + 16 + Dagger Found at crime scene coated with flour + 80 + 0 + + + A glowing red crystal + + false + true + false + 2000 + 0 + A glowing heart shaped red crystal - great magic must be present in this item + 419 + 0 + + + Unidentified liquid + + false + true + false + 2 + 0 + A strong acidic formula + 48 + 16750848 + + + Radimus Scrolls + Read Scrolls + false + true + false + 5 + 0 + Mission briefing and the completed map of Karamja - Sir Radimus will be pleased... + 29 + 8421504 + + + Robe + + false + true + false + 15 + 64 + A worn robe + 87 + 255 + + + Armour + + false + true + false + 40 + 0 + An unusually red armour + 118 + 13369344 + + + Dagger + + false + true + false + 35 + 16 + Short but pointy + 80 + 15654365 + + + Eye patch + + false + true + false + 2 + 32 + It makes me look very piratical + 198 + 0 + + + Booking of Binding + Read + false + true + false + 1 + 0 + An ancient tome on Demonology + 28 + 15641258 + + + Holy Water Vial + Throw + false + true + false + 3 + 16 + A deadly potion against evil kin + 48 + 10073782 + + + Enchanted Vial + + false + true + false + 200 + 0 + This enchanted vial is empty - but is ready for magical liquids. + 144 + 16646109 + + + Scribbled notes + Read + false + true + false + 20 + 0 + It looks like a page ripped from a book + 427 + 8421376 + + + Scrawled notes + Read + false + true + false + 20 + 0 + It looks like a page ripped from a book + 427 + 14066524 + + + Scatched notes + Read + false + true + false + 20 + 0 + It looks like a page ripped from a book + 427 + 11909701 + + + Shamans Tome + Read + false + true + false + 1 + 0 + An ancient tome on various subjects... + 299 + 15641258 + + + Edible seaweed + Eat + false + true + true + 2 + 0 + Slightly damp seaweed + 203 + 0 + + + Rough Sketch of a bowl + Read + false + true + false + 5 + 0 + A roughly sketched picture of a bowl made from metal + 29 + 0 + + + Burnt Manta ray + + false + true + true + 500 + 0 + Oops! + 430 + 255 + + + Burnt Sea turtle + + false + true + true + 500 + 0 + Oops! + 431 + 255 + + + Cut reed plant + + false + true + true + 2 + 0 + A narrow long tube - it might be useful for something + 202 + 65280 + + + Magical Fire Pass + + false + true + false + 1 + 0 + A pass which allows you to cross the flaming walls into the Flaming Octagon + 29 + 16711680 + + + Snakes Weed Solution + + false + true + false + 1 + 0 + Snakes weed in water - part of a potion + 48 + 8454016 + + + Ardrigal Solution + + false + true + false + 1 + 0 + Ardrigal herb in water - part of a potion + 48 + 8388608 + + + Gujuo Potion + Drink + false + true + false + 1 + 0 + A potion to help against fear of the supernatural + 48 + 8405056 + + + Germinated Yommi tree seed + Inspect + true + true + false + 200 + 0 + A magical seed that grows into a Yommi tree - these have been germinated. + 270 + 65280 + + + Dark Dagger + + false + true + false + 91 + 16 + An unusual looking dagger made of dark shiny obsidian + 420 + 0 + + + Glowing Dark Dagger + + false + true + false + 91 + 16 + An unusual looking dagger made of dark shiny obsidian - it has an unnatural glow . + 421 + 0 + + + Holy Force Spell + Cast + false + true + false + 1 + 0 + A powerful incantation - it affects spirits of the underworld + 423 + 0 + + + Iron Pickaxe + + false + false + true + 140 + 0 + Used for mining + 72 + 15654365 + + + Steel Pickaxe + + false + false + true + 500 + 0 + Requires level 6 mining to use + 72 + 15658734 + + + Mithril Pickaxe + + false + false + true + 1300 + 0 + Requires level 21 mining to use + 72 + 10072780 + + + Adamantite Pickaxe + + false + false + true + 3200 + 0 + Requires level 31 mining to use + 72 + 11717785 + + + Rune Pickaxe + + false + false + true + 32000 + 0 + Requires level 41 mining to use + 72 + 65535 + + + Sleeping Bag + Sleep + false + false + true + 30 + 0 + Not as comfy as a bed but better than nothing + 422 + 0 + + + A blue wizards hat + + false + true + false + 2 + 32 + An ancient wizards hat. + 86 + 255 + + + Gilded Totem Pole + Inspect + false + true + false + 20 + 0 + A well crafted totem pole - given to you as a gift from Gujuo + 403 + 65280 + + + Blessed Golden Bowl + + false + true + false + 1000 + 0 + A specially made bowl constructed out of pure gold - it looks magical somehow + 404 + 0 + + + Blessed Golden Bowl with Pure Water + + false + true + false + 1000 + 0 + A golden bowl filled with pure water - it looks magical somehow + 405 + 8454143 + + + Raw Oomlie Meat + + false + true + true + 10 + 0 + Raw meat from the Oomlie bird + 60 + 16747571 + + + Cooked Oomlie meat Parcel + Eat + false + true + true + 35 + 0 + Deliciously cooked Oomlie meat in a palm leaf pouch. + 433 + 13395507 + + + Dragon Bone Certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Yanille for 5 Dragon Bones + 180 + 0 + + + Limpwurt Root Certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Yanille for 5 Limpwort roots + 180 + 16384 + + + Prayer Potion Certificate + + true + true + true + 10 + 0 + Each certificate exchangable at Yanille for 5 prayer potions + 180 + 3206809 + + + Super Attack Potion Certificate + + true + true + true + 10 + 0 + Exchangable at Yanille for 5 + 180 + 3158254 + + + Super Defense Potion Certificate + + true + true + true + 10 + 0 + Exchangable at Yanille for 5 + 180 + 15644208 + + + Super Strength Potion Certificate + + true + true + true + 10 + 0 + Exchangable at Yanille for 5 + 180 + 15658734 + + + Half Dragon Square Shield + + false + true + true + 500000 + 0 + The Right Half of an ancient and powerful looking Dragon Square shield. + 425 + 15654365 + + + Half Dragon Square Shield + + false + true + true + 110000 + 0 + Left Half of an ancient and powerful looking Dragon Square shield. + 424 + 15654365 + + + Dragon Square Shield + + false + true + true + 500000 + 8 + An ancient and powerful looking Dragon Square shield. + 426 + 13500416 + + + Palm tree leaf + + false + true + true + 5 + 0 + A thick green plam leaf - natives use this to cook meat in + 428 + 0 + + + Raw Oomlie Meat Parcel + + false + true + true + 16 + 0 + Oomlie meat in a palm leaf pouch - just needs to be cooked. + 429 + 16747571 + + + Burnt Oomlie Meat parcel + + false + true + true + 1 + 0 + Oomlie meat in a palm leaf pouch - it's burnt. + 429 + 4194304 + + + Bailing Bucket + Bail with + false + true + true + 10 + 0 + It's a water tight bucket + 22 + 1052688 + + + Plank + + false + true + true + 1 + 0 + Damaged remains of the ship + 135 + 0 + + + Arcenia root + + false + true + false + 7 + 0 + The root of an arcenia plant + 101 + 0 + + + Display tea + + false + true + true + 10 + 0 + A nice cup of tea - for display only + 227 + 0 + + + Blessed Golden Bowl with plain water + Empty + false + true + false + 1000 + 0 + A golden bowl filled with plain water + 405 + 8454143 + + + Golden Bowl with plain water + Empty + false + true + false + 1000 + 0 + A golden bowl filled with plain water + 405 + 8454143 + + + Cape of legends + + false + true + false + 450 + 2048 + Shows I am a member of the legends guild + 59 + 16777215 + + + Scythe + + false + false + true + 15 + 8216 + Get another from the clothes shop if you die + 434 + 0 + + + Oak Log Certificate + Each certificate exchangable at Ardougne for 5 oak logs + + 180 + 10 + true + 0 + 0 + true + true + + + Tuna Certificate + Each certificate exchangable at Draynor Market for 5 tuna + + 180 + 10 + true + 0 + 0 + true + false + + + Raw Tuna Certificate + Each certificate exchangable at Draynor Market for 5 raw tuna + + 180 + 10 + true + 0 + 0 + true + false + + + Flax Certificate + Each certificate exchangable in Seers for 5 flax + + 180 + 10 + true + 0 + 0 + true + true + + + Bow String Certificate + Each certificate exchangable in Seers for 5 bow string + + 180 + 10 + true + 0 + 0 + true + true + + + Adamantite Ore Certificate + Each certificate exchangable at Draynor Market for 5 adamantite ore + + 180 + 10 + true + 0 + 0 + true + false + + + Adamantite Bar Certificate + Each certificate exchangable at Draynor Market for 5 adamantite bars + + 180 + 10 + true + 0 + 0 + true + false + + + Empty Vial Certificate + Each certificate exchangable at Catherby for 5 empty vials + + 180 + 10 + true + 0 + 0 + true + true + + + Filled Vial Certificate + Each certificate exchangable at Catherby for 5 filled vials + + 180 + 10 + true + 0 + 0 + true + true + + + Eye of newt certificate + Each certificate exchangable at Catherby for 5 eye of newt + + 180 + 10 + true + 0 + 0 + true + true + + + Big Bone Certificate + Each certificate exchangable at Yanille for 5 big bones + + 180 + 10 + true + 0 + 0 + true + false + + + Ranging Potion Certificate + Each certificate exchangable at Yanille for 5 ranging potions + + 180 + 10 + true + 0 + 0 + true + true + + + Attack Potion Certificate + Each certificate exchangable at Yanille for 5 attack potions + + 180 + 10 + true + 0 + 0 + true + true + + + Defense Potion Certificate + Each certificate exchangable at Yanille for 5 defense potions + + 180 + 10 + true + 0 + 0 + true + true + + + Strength Potion Certificate + Each certificate exchangable at Yanille for 5 strength potions + + 180 + 10 + true + 0 + 0 + true + true + + + Raw Trout Certificate + Each certificate exchangable at Draynor Market for 5 raw trout + + 180 + 10 + true + 0 + 0 + true + true + + + Trout Certificate + Each certificate exchangable at Yanille for 5 trout + + 180 + 10 + true + 0 + 0 + true + true + + + Raw Salmon certificate + Each certificate exchangable at Draynor Market for 5 raw salmon + + 180 + 10 + true + 0 + 0 + true + true + + + Salmon certificate + Each certificate exchangable at Yanille for 5 salmon + + 180 + 10 + true + 0 + 0 + true + true + + + Party Hat + Party!!! + + 189 + 2 + false + 1 + -13421773 + true + false + + + Magic Log Certificate + Each certificate exchangable at Ardougne for 5 magic logs + + 180 + 10 + true + 0 + 0 + true + true + + + Snape Grass Certificate + Each certificate exchangable at Catherby for 5 Snape Grass + + 180 + 10 + true + 0 + 0 + true + true + + + White Berries Certificate + Each certificate exchangable at Catherby for 5 White Berries + + 180 + 10 + true + 0 + 0 + true + true + + + Red Spider Eggs Certificate + Each certificate exchangable at Catherby for 5 Red Spider Eggs + + 180 + 10 + true + 0 + 0 + true + true + + + Santa's Leggings + It's Santa's leggings + + 439 + 1 + false + 1 + 0 + true + true + + + Santa's Robe + It's Santa's robe + + 440 + 1 + false + 1 + 0 + true + true + + + Candy Cane + Ooh! A cane made out of candy! + + 446 + 1 + false + 16 + 0 + true + true + + + Toy Ball + One of Santa's gifts + + 441 + 1 + false + 0 + 0 + false + false + + + Toy Horse + One of Santa's gifts + + 442 + 1 + false + 0 + 0 + false + false + + + Toy Kitten + One of Santa's gifts + + 443 + 1 + false + 0 + 0 + false + false + + + Toy Teddy + One of Santa's gifts + + 444 + 1 + false + 0 + 0 + false + false + + + Magic Gift Box + I wonder what's inside + Open + 445 + 1 + false + 0 + 0 + true + false + + + Jar of Infected Blood + This could be deadly + Open + 456 + 0 + 0 + 0 + true + false + + + Antidote + Cure the affliction + Open + 456 + 0 + 0 + 0 + true + false + + + Event Token + true + These can be traded for Gift Boxes + + 457 + 0 + 0 + 0 + false + false + + diff --git a/GameServer/conf/server/defs/ItemDef.xml.gz b/GameServer/conf/server/defs/ItemDef.xml.gz new file mode 100644 index 0000000..f4b1e06 Binary files /dev/null and b/GameServer/conf/server/defs/ItemDef.xml.gz differ diff --git a/GameServer/conf/server/defs/NPCDef.xml b/GameServer/conf/server/defs/NPCDef.xml new file mode 100644 index 0000000..de286c0 --- /dev/null +++ b/GameServer/conf/server/defs/NPCDef.xml @@ -0,0 +1,41059 @@ + + + Unicorn + It's a unicorn + + 21 + 23 + 19 + 23 + true + false + 30 + + 130 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 230 + 6 + 6 + 7 + + + 20 + 1 + 0 + + + 466 + 1 + 0 + + + + + Bob + An axe seller + + 2 + 2 + 3 + 2 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16711680 + 16711680 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sheep + A very wooly sheep + + 0 + 0 + 3 + 0 + false + false + 30 + + 129 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 170 + 124 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 466 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Chicken + Yep definitely a chicken + + 3 + 4 + 3 + 4 + true + false + 30 + + 132 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 70 + 62 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 381 + 3 + 0 + + + 133 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Goblin + An ugly green creature + + 16 + 14 + 12 + 13 + true + false + 30 + + 142 + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + 62 + 1 + 80 + + + 32 + 6 + 50 + + + 193 + 1 + 30 + + + 273 + 1 + 190 + + + 186 + 1 + 50 + + + 192 + 1 + 50 + + + 11 + 10 + 70 + + + 36 + 6 + 60 + + + 10 + 23 + 350 + + + -1 + -1 + 70 + + + + + Hans + A castle servant + + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 65280 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 20 + 1 + 0 + + + 10 + 20 + 354 + + + 34 + 3 + 70 + + + 35 + 3 + 70 + + + 31 + 3 + 70 + + + 150 + 1 + 35 + + + 11 + 10 + 70 + + + 380 + 10 + 70 + + + 41 + 1 + 35 + + + 443 + 1 + 14 + + + 442 + 1 + 15 + + + 441 + 1 + 16 + + + 440 + 1 + 18 + + + 439 + 1 + 19 + + + 438 + 1 + 21 + + + 437 + 1 + 22 + + + 436 + 1 + 24 + + + 435 + 1 + 25 + + + 165 + 1 + 42 + + + + + cow + It's a multi purpose cow + + 9 + 8 + 8 + 9 + true + false + 30 + + 128 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 327 + 240 + 6 + 6 + 45 + + + 20 + 1 + 0 + + + 504 + 1 + 0 + + + 147 + 1 + 0 + + + -1 + -1 + 1000 + + + + + cook + The head cook of Lumbridge castle + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bear + Eek! A bear! + + 25 + 23 + 25 + 26 + true + false + 30 + + 131 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 262 + 247 + 6 + 9 + 30 + + + 20 + 1 + 0 + + + 502 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Priest + A priest of Saradomin + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2105376 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Urhney + He looks a little grumpy + + 10 + 10 + 3 + 10 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2105376 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Man + One of runescapes many citizens + pickpocket + 11 + 8 + 7 + 11 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 190 + 6 + 18 + + + 10 + 22 + 320 + + + 104 + 1 + 50 + + + 35 + 3 + 50 + + + 619 + 1 + 5 + + + 11 + 7 + 50 + + + 150 + 1 + 30 + + + 31 + 6 + 30 + + + 34 + 6 + 30 + + + 190 + 12 + 40 + + + 42 + 1 + 10 + + + 165 + 1 + 40 + + + 435 + 1 + 30 + + + 436 + 1 + 20 + + + 437 + 1 + 20 + + + 438 + 1 + 15 + + + 439 + 1 + 13 + + + 440 + 1 + 13 + + + 441 + 1 + 12 + + + 442 + 1 + 11 + + + 443 + 1 + 10 + + + 28 + 1 + 30 + + + 18 + 1 + 40 + + + -1 + -1 + 110 + + + + + Bartender + I could get a beer off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Camel + Oh its a camel + + 0 + 0 + 3 + 0 + false + false + 30 + + 127 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 208 + 208 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gypsy + An old gypsy lady + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 255 + 65280 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ghost + Ooh spooky + + 15 + 15 + 5 + 15 + false + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + + + + Sir Prysin + One of the king's knights + + 30 + 60 + 50 + 20 + false + false + 30 + + 13 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Traiborn the wizard + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Captain Rovin + The head of the palace guard + + 40 + 70 + 65 + 30 + false + false + 30 + + 0 + 28 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rat + Overgrown vermin + + 10 + 10 + 5 + 10 + true + false + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 346 + 136 + 7 + 7 + 45 + + + 20 + 1 + 0 + + + 503 + 1 + 1000 + + + + + Reldo + I think he's the librarian + + 20 + 15 + 3 + 10 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 65280 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + mugger + He jumps out and attacks people + + 15 + 10 + 8 + 8 + true + true + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 20 + 329 + + + 34 + 3 + 65 + + + 35 + 3 + 65 + + + 31 + 3 + 65 + + + 150 + 1 + 32 + + + 11 + 10 + 65 + + + 380 + 10 + 65 + + + 41 + 1 + 32 + + + 443 + 1 + 13 + + + 442 + 1 + 14 + + + 441 + 1 + 15 + + + 440 + 1 + 17 + + + 439 + 1 + 18 + + + 438 + 1 + 19 + + + 437 + 1 + 21 + + + 436 + 1 + 22 + + + 435 + 1 + 23 + + + 165 + 1 + 39 + + + 13 + 1 + 19 + + + 237 + 1 + 19 + + + 190 + 7 + 30 + + + + + Lesser Demon + Lesser but still pretty big + + 78 + 79 + 79 + 80 + true + true + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 275 + 262 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + 88 + 1 + 24 + + + 84 + 1 + 24 + + + 31 + 40 + 43 + + + 38 + 3 + 12 + + + 42 + 10 + 12 + + + 40 + 3 + 14 + + + 41 + 3 + 12 + + + 619 + 2 + 12 + + + 111 + 1 + 1 + + + 119 + 1 + 2 + + + 142 + 1 + 31 + + + 152 + 1 + 28 + + + 10 + 200 + 460 + + + 399 + 1 + 3 + + + 158 + 1 + 20 + + + 160 + 1 + 20 + + + 157 + 1 + 5 + + + 72 + 1 + 10 + + + 173 + 1 + 10 + + + 441 + 1 + 10 + + + 2 + 1 + 10 + + + 159 + 1 + 20 + + + 109 + 1 + 20 + + + 2 + 1 + 30 + + + 437 + 1 + 20 + + + 165 + 1 + 20 + + + 442 + 1 + 10 + + + 105 + 1 + 20 + + + 433 + 1 + 20 + + + 439 + 1 + 20 + + + 46 + 3 + 20 + + + -1 + -1 + 30 + + + + + Giant Spider + I think this spider has been genetically modified + + 10 + 10 + 5 + 10 + true + true + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 120 + 104 + 6 + 6 + 5 + + + + Man + A shifty looking man + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jonny the beard + I can see why he's called the beard + + 10 + 20 + 8 + 5 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 15 + 0 + + + -1 + -1 + 1000 + + + + + Baraek + A fur trader + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Katrine + She doesn't look to friendly + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Tramp + A scruffy looking chap + + 9 + 8 + 5 + 7 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16711680 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rat + A small muddy rat + + 3 + 4 + 2 + 2 + true + false + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 115 + 45 + 7 + 7 + 10 + + + 20 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Romeo + He looks mildly confused + + 20 + 60 + 60 + 40 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16761440 + 255 + 8409120 + 15523536 + 125 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Juliet + She looks a little stressed + + 2 + 4 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 89 + -1 + -1 + -1 + -1 + + 15645552 + 16036851 + 16036851 + 15523536 + 125 + 225 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Father Lawrence + A kindly looking priest + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 2105376 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Apothecary + I wonder if he has any good potions + + 10 + 5 + 7 + 5 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + spider + Incey wincey + + 5 + 2 + 2 + 1 + true + false + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 40 + 35 + 6 + 6 + 5 + + + + Delrith + A freshly summoned demon + + 42 + 35 + 7 + 37 + true + false + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 275 + 262 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + + + Veronica + She doesn't look too happy + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Weaponsmaster + The phoenix gang quartermaster + + 35 + 20 + 20 + 28 + true + false + 30 + + 0 + 1 + 2 + -1 + 48 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Professor Oddenstein + A mad scientist if I ever saw one + + 3 + 3 + 7 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16777215 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Curator + He looks like he's daydreaming + + 3 + 2 + 3 + 2 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 2 + 8409120 + 15523536 + 145 + 200 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + skeleton + It rattles as it walks + + 24 + 20 + 17 + 23 + true + true + 30 + + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 216 + 234 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + 12 + 1 + 60 + + + 10 + 15 + 400 + + + 1 + 1 + 60 + + + 83 + 1 + 60 + + + 28 + 1 + 60 + + + 5 + 1 + 60 + + + 113 + 1 + 60 + + + 32 + 7 + 50 + + + 33 + 4 + 30 + + + 31 + 7 + 20 + + + 41 + 3 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 46 + 2 + 10 + + + 160 + 1 + 10 + + + -1 + -1 + 90 + + + + + zombie + The living dead + + 23 + 28 + 24 + 23 + true + true + 30 + + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 226 + + + 31 + 5 + 45 + + + 32 + 5 + 45 + + + 33 + 5 + 45 + + + 34 + 5 + 45 + + + 35 + 5 + 45 + + + 160 + 1 + 22 + + + 11 + 7 + 113 + + + 165 + 1 + 20 + + + 435 + 1 + 20 + + + 436 + 1 + 17 + + + 437 + 1 + 17 + + + 438 + 1 + 15 + + + 439 + 1 + 13 + + + 440 + 1 + 10 + + + 441 + 1 + 10 + + + 442 + 1 + 10 + + + 166 + 1 + 30 + + + 202 + 1 + 20 + + + 270 + 1 + 30 + + + 642 + 3 + 10 + + + 0 + 1 + 30 + + + 28 + 1 + 30 + + + 41 + 2 + 40 + + + 159 + 1 + 20 + + + 157 + 1 + 10 + + + 158 + 1 + 20 + + + 128 + 1 + 30 + + + -1 + -1 + 7 + + + + + king + King Roald the VIII + + 15 + 60 + 30 + 15 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 80 + 62 + + 1 + 16711680 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Giant bat + An angry flying rodent + + 32 + 32 + 32 + 32 + true + true + 30 + + 138 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 225 + 195 + 5 + 3 + 5 + + + 604 + 1 + 0 + + + + + Bartender + A friendly barman + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + skeleton + It rattles as it walks + + 32 + 30 + 29 + 35 + true + true + 30 + + 134 + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 216 + 234 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + 12 + 1 + 60 + + + 10 + 15 + 400 + + + 1 + 1 + 60 + + + 83 + 1 + 60 + + + 28 + 1 + 60 + + + 5 + 1 + 60 + + + 113 + 1 + 60 + + + 32 + 7 + 50 + + + 33 + 4 + 30 + + + 31 + 7 + 20 + + + 41 + 3 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 46 + 2 + 10 + + + 160 + 1 + 10 + + + -1 + -1 + 90 + + + + + skeleton + It rattles as it walks + + 27 + 24 + 24 + 28 + true + true + 30 + + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 216 + 234 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + 12 + 1 + 60 + + + 10 + 15 + 400 + + + 1 + 1 + 60 + + + 83 + 1 + 60 + + + 28 + 1 + 60 + + + 5 + 1 + 60 + + + 113 + 1 + 60 + + + 32 + 7 + 50 + + + 33 + 4 + 30 + + + 31 + 7 + 20 + + + 41 + 3 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 46 + 2 + 10 + + + 160 + 1 + 10 + + + -1 + -1 + 90 + + + + + Rat + overgrown vermin + + 16 + 12 + 10 + 15 + true + false + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 346 + 136 + 7 + 7 + 45 + + + 20 + 1 + 0 + + + 503 + 1 + 100 + + + + + Horvik the Armourer + He looks strong + + 15 + 22 + 22 + 6 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bear + A bear + + 0 + 0 + 3 + 0 + false + false + 30 + + 131 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 262 + 247 + 6 + 9 + 30 + + + 20 + 1 + 0 + + + + + skeleton + It rattles when it walks + + 20 + 18 + 18 + 21 + true + true + 30 + + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 216 + 234 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + 12 + 1 + 60 + + + 10 + 15 + 400 + + + 1 + 1 + 60 + + + 83 + 1 + 60 + + + 28 + 1 + 60 + + + 5 + 1 + 60 + + + 113 + 1 + 60 + + + 32 + 7 + 50 + + + 33 + 4 + 30 + + + 31 + 7 + 20 + + + 41 + 3 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 46 + 2 + 10 + + + 160 + 1 + 10 + + + -1 + -1 + 90 + + + + + Shopkeeper + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + zombie + The living dead + + 18 + 20 + 22 + 19 + true + true + 30 + + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 226 + + + 31 + 5 + 45 + + + 32 + 5 + 45 + + + 33 + 5 + 45 + + + 34 + 5 + 45 + + + 35 + 5 + 45 + + + 160 + 1 + 22 + + + 11 + 7 + 113 + + + 165 + 1 + 20 + + + 435 + 1 + 20 + + + 436 + 1 + 17 + + + 437 + 1 + 17 + + + 438 + 1 + 15 + + + 439 + 1 + 13 + + + 440 + 1 + 10 + + + 441 + 1 + 10 + + + 442 + 1 + 10 + + + 166 + 1 + 30 + + + 202 + 1 + 20 + + + 270 + 1 + 30 + + + 642 + 3 + 10 + + + 0 + 1 + 30 + + + 28 + 1 + 30 + + + 41 + 2 + 40 + + + 159 + 1 + 20 + + + 157 + 1 + 10 + + + 158 + 1 + 20 + + + 128 + 1 + 30 + + + -1 + -1 + 7 + + + + + Ghost + Ooh spooky + + 23 + 30 + 25 + 23 + true + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + + + + Aubury + I think he might be a shop keeper + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + shopkeeper + I can buy swords off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Darkwizard + He works evil magic + + 15 + 15 + 12 + 12 + true + true + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 116 + + + 199 + 1 + 11 + + + 216 + 1 + 11 + + + 100 + 1 + 11 + + + 31 + 6 + 116 + + + 32 + 6 + 116 + + + 33 + 6 + 116 + + + 34 + 6 + 116 + + + 35 + 6 + 116 + + + 36 + 6 + 116 + + + 38 + 2 + 29 + + + 40 + 2 + 29 + + + 41 + 2 + 29 + + + 42 + 2 + 29 + + + 46 + 2 + 29 + + + 619 + 1 + 5 + + + + + lowe + The owner of the archery store + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 16761440 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thessalia + A young shop assistant + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16036851 + 3 + 15523536 + 130 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Darkwizard + He works evil magic + + 27 + 24 + 24 + 27 + true + true + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 100 + + + 199 + 1 + 10 + + + 216 + 1 + 10 + + + 100 + 1 + 10 + + + 31 + 6 + 100 + + + 32 + 6 + 100 + + + 33 + 6 + 100 + + + 34 + 6 + 100 + + + 35 + 6 + 100 + + + 36 + 6 + 100 + + + 38 + 2 + 25 + + + 40 + 2 + 25 + + + 41 + 2 + 25 + + + 42 + 2 + 25 + + + 46 + 2 + 25 + + + + + Giant + A very large foe + + 37 + 36 + 35 + 40 + true + true + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 8409120 + 15523536 + 218 + 330 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 220 + 100 + 300 + + + 10 + 100 + 500 + + + 72 + 1 + 50 + + + 2 + 1 + 50 + + + 193 + 1 + 50 + + + 46 + 2 + 75 + + + 42 + 2 + 75 + + + 41 + 2 + 75 + + + 40 + 2 + 75 + + + 38 + 2 + 75 + + + 31 + 50 + 100 + + + + +Goblin + An ugly green creature + + 8 + 9 + 5 + 9 + true + false + 30 + + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + 10 + 10 + 30 + + + 192 + 1 + 1 + + + 827 + 1 + 85 + + + 124 + 1 + 4 + + + 273 + 1 + 10 + + + + + farmer + He grows the crops in this area + pickpocket + 15 + 16 + 12 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thief + He'll take anything that isn't nailed down + + 24 + 22 + 17 + 23 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guard + He tries to keep order around here + pickpocket + 31 + 30 + 22 + 31 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 11 + 10 + 29 + + + 104 + 1 + 14 + + + 16 + 1 + 14 + + + 28 + 1 + 30 + + + 70 + 1 + 30 + + + 10 + 12 + 170 + + + 619 + 1 + 3 + + + -1 + -1 + 707 + + + + + Black Knight + A sinister looking knight + + 45 + 50 + 42 + 48 + true + false + 30 + + 18 + 32 + 42 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 0 + 1 + 10 + + + 1 + 1 + 10 + + + 6 + 1 + 10 + + + 10 + 100 + 50 + + + 171 + 1 + 5 + + + 104 + 1 + 10 + + + 202 + 1 + 10 + + + 136 + 1 + 7 + + + 31 + 20 + 5 + + + 32 + 20 + 5 + + + 33 + 20 + 5 + + + 34 + 20 + 5 + + + 35 + 20 + 5 + + + + + Hobgoblin + A large ugly green creature + + 32 + 34 + 29 + 34 + true + true + 30 + + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 285 + 268 + 9 + 8 + 7 + + + 20 + 1 + 0 + + + 10 + 100 + 1000 + + + 220 + 1 + 600 + + + 42 + 1 + 100 + + + 46 + 1 + 100 + + + 40 + 1 + 100 + + + 32 + 5 + 100 + + + 34 + 5 + 100 + + + 443 + 1 + 25 + + + 442 + 1 + 30 + + + 441 + 1 + 35 + + + 440 + 1 + 40 + + + 439 + 1 + 45 + + + 438 + 1 + 50 + + + 437 + 1 + 55 + + + 436 + 1 + 60 + + + 435 + 1 + 65 + + + 165 + 1 + 70 + + + 469 + 1 + 100 + + + 526 + 1 + 1 + + + 527 + 1 + 1 + + + + + zombie + The living dead + + 32 + 31 + 30 + 35 + true + true + 30 + + 136 + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 226 + + + 31 + 5 + 45 + + + 32 + 5 + 45 + + + 33 + 5 + 45 + + + 34 + 5 + 45 + + + 35 + 5 + 45 + + + 160 + 1 + 22 + + + 11 + 7 + 113 + + + 165 + 1 + 20 + + + 435 + 1 + 20 + + + 436 + 1 + 17 + + + 437 + 1 + 17 + + + 438 + 1 + 15 + + + 439 + 1 + 13 + + + 440 + 1 + 10 + + + 441 + 1 + 10 + + + 442 + 1 + 10 + + + 166 + 1 + 30 + + + 202 + 1 + 20 + + + 270 + 1 + 30 + + + 642 + 3 + 10 + + + 0 + 1 + 30 + + + 28 + 1 + 30 + + + 41 + 2 + 40 + + + 159 + 1 + 20 + + + 157 + 1 + 10 + + + 158 + 1 + 20 + + + 128 + 1 + 30 + + + -1 + -1 + 7 + + + + + Zaff + He trades in staffs + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 76 + 81 + -1 + -1 + -1 + -1 + + 3158064 + 2 + 3 + 10056486 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Scorpion + An extremely vicious scorpion + + 21 + 24 + 17 + 22 + true + true + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 362 + 208 + 7 + 7 + 45 + + + + silk trader + He sells silk + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16724172 + 16724172 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Man + One of Runescapes many citizens + pickpocket + 11 + 8 + 7 + 11 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 20 + 500 + + + 34 + 3 + 100 + + + 35 + 3 + 100 + + + 31 + 3 + 100 + + + 150 + 1 + 50 + + + 11 + 10 + 100 + + + 380 + 10 + 100 + + + 41 + 1 + 50 + + + 443 + 1 + 20 + + + 442 + 1 + 22 + + + 441 + 1 + 24 + + + 440 + 1 + 26 + + + 439 + 1 + 28 + + + 438 + 1 + 30 + + + 437 + 1 + 32 + + + 436 + 1 + 34 + + + 435 + 1 + 36 + + + 165 + 1 + 60 + + + + + Guide + He gives hints to new adventurers + + 0 + 0 + 7 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 32768 + 8388863 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Giant Spider + I think this spider has been genetically modified + + 30 + 31 + 32 + 34 + true + true + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 180 + 156 + 6 + 6 + 5 + + + + Peksa + A helmet salesman + + 11 + 8 + 7 + 11 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 70 + -1 + -1 + -1 + -1 + -1 + -1 + + 15645552 + 2 + 3 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Barbarian + Not civilised looking + + 18 + 15 + 14 + 18 + true + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 15645552 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 2 + + + 165 + 1 + 2 + + + 436 + 1 + 2 + + + 437 + 1 + 2 + + + 438 + 1 + 2 + + + 439 + 1 + 2 + + + 440 + 1 + 2 + + + 441 + 1 + 2 + + + 10 + 23 + 10 + + + 31 + 5 + 2 + + + 32 + 5 + 2 + + + 33 + 5 + 2 + + + 34 + 5 + 2 + + + 35 + 5 + 2 + + + 160 + 1 + 1 + + + 11 + 7 + 5 + + + + + Fred the farmer + An old farmer + + 11 + 8 + 7 + 11 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 8409120 + 8409136 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gunthor the Brave + The barbarians fearless leader + + 37 + 40 + 35 + 38 + true + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + -1 + -1 + -1 + -1 + -1 + -1 + + 15645552 + 16732192 + 8409120 + 15523536 + 165 + 245 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 2 + + + 165 + 1 + 2 + + + 436 + 1 + 2 + + + 437 + 1 + 2 + + + 438 + 1 + 2 + + + 439 + 1 + 2 + + + 440 + 1 + 2 + + + 441 + 1 + 2 + + + 10 + 23 + 10 + + + 31 + 5 + 2 + + + 32 + 5 + 2 + + + 33 + 5 + 2 + + + 34 + 5 + 2 + + + 35 + 5 + 2 + + + 160 + 1 + 1 + + + 11 + 7 + 5 + + + + + Witch + She's got warts + + 35 + 25 + 10 + 30 + true + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ghost + Ooh spooky + + 23 + 30 + 25 + 23 + true + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + + + + Wizard + An old wizard + + 18 + 15 + 14 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 100 + + + 185 + 1 + 100 + + + 184 + 1 + 100 + + + + + Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Zeke + He sells Scimitars + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 70 + -1 + -1 + -1 + -1 + -1 + 63 + + 3158064 + 16763952 + 15609986 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Louie Legs + He might want to sell something + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 37 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Warrior + A member of Al Kharid's military + pickpocket + 20 + 17 + 19 + 18 + true + false + 30 + + 6 + 1 + 2 + 98 + 48 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 13385932 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 13415270 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shop Assistant + Maybe she'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Highwayman + He holds up passers by + + 14 + 15 + 13 + 13 + true + true + 30 + + 0 + 1 + 2 + 47 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 209 + 1 + 0 + + + + + Kebab Seller + A seller of strange food + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 1 + 8409120 + 8409120 + 13415270 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Chicken + Yep definitely a chicken + + 3 + 4 + 3 + 4 + false + false + 30 + + 132 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 70 + 62 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ernest + A former chicken + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Monk + A Peaceful monk + + 12 + 13 + 15 + 12 + true + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dwarf + A short angry guy + + 20 + 17 + 16 + 20 + true + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 8409120 + 8409120 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 10 + + + 31 + 5 + 2 + + + 32 + 5 + 2 + + + 33 + 5 + 2 + + + 34 + 5 + 2 + + + 35 + 5 + 2 + + + 160 + 1 + 1 + + + 11 + 7 + 5 + + + 173 + 1 + 3 + + + 171 + 1 + 6 + + + 170 + 1 + 8 + + + 169 + 1 + 15 + + + 168 + 1 + 6 + + + 156 + 1 + 10 + + + 269 + 1 + 20 + + + + + Banker + He can look after my money + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Count Draynor + A vicious vampire + + 40 + 65 + 35 + 35 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 16576224 + 140 + 230 + 6 + 6 + 5 + + + Morgan + A frigtened villager + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16267666 + 10464124 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dr Harlow + His nose is very red + + 11 + 8 + 7 + 11 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Deadly Red spider + I think this spider has been genetically modified + + 40 + 36 + 35 + 35 + true + true + 30 + + 126 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 120 + 104 + 6 + 6 + 5 + + + + Guard + He's here to guard this fortress + pickpocket + 31 + 30 + 22 + 31 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 11 + 10 + 29 + + + 104 + 1 + 14 + + + 16 + 1 + 14 + + + 28 + 1 + 30 + + + 70 + 1 + 30 + + + 10 + 12 + 170 + + + 619 + 1 + 3 + + + -1 + -1 + 707 + + + + + Cassie + She sells shields + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + White Knight + A chivalrous knight + + 55 + 60 + 52 + 58 + true + false + 30 + + 19 + 34 + 43 + -1 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 220 + + + 71 + 1 + 60 + + + 23 + 1 + 40 + + + 171 + 1 + 20 + + + 105 + 1 + 20 + + + 36 + 7 + 20 + + + 619 + 2 + 5 + + + 41 + 2 + 10 + + + 158 + 1 + 5 + + + 157 + 1 + 2 + + + -1 + -1 + 598 + + + + + Ranael + A shopkeeper of some sort + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 93 + -1 + -1 + -1 + -1 + + 16753488 + 14518442 + 3 + 13415270 + 145 + 235 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Moss Giant + his beard seems to have a life of its own + + 62 + 61 + 60 + 65 + true + true + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7838054 + 8409120 + 8409120 + 14483408 + 261 + 396 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 10 + 37 + 400 + + + 68 + 1 + 40 + + + 42 + 2 + 18 + + + 38 + 2 + 18 + + + 171 + 1 + 30 + + + 155 + 1 + 32 + + + 432 + 1 + 30 + + + 129 + 1 + 31 + + + 179 + 1 + 10 + + + 126 + 1 + 25 + + + 619 + 2 + 7 + + + -1 + -1 + 365 + + + + + Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Witch + She's got warts + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Black Knight + A sinister looking knight + + 45 + 50 + 42 + 48 + true + false + 30 + + 18 + 32 + 42 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 16 + 250 + + + 36 + 6 + 30 + + + 35 + 6 + 30 + + + 34 + 6 + 30 + + + 42 + 2 + 10 + + + 41 + 2 + 10 + + + 46 + 2 + 10 + + + 38 + 2 + 10 + + + 171 + 1 + 30 + + + 202 + 1 + 40 + + + 138 + 1 + 40 + + + 159 + 1 + 10 + + + 160 + 1 + 20 + + + 6 + 1 + 30 + + + 1 + 1 + 30 + + + 95 + 1 + 20 + + + 136 + 1 + 40 + + + -1 + -1 + 359 + + + + + Greldo + A small green warty creature + + 8 + 9 + 5 + 9 + true + false + 30 + + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + + + Sir Amik Varze + The head of the White Knights + + 55 + 60 + 52 + 58 + false + false + 30 + + 19 + 34 + 43 + -1 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guildmaster + He's in charge of this place + + 40 + 40 + 40 + 40 + false + false + 30 + + 3 + 29 + 38 + 48 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 13385932 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Valaine + She runs the champion's store + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 3211263 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Drogo + He runs a mining store + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 9465888 + 9465888 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Imp + A cheeky little imp + + 4 + 4 + 8 + 5 + true + false + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 74 + 70 + 11 + 11 + 5 + + + 181 + 1 + 0 + + + 231 + 1 + 130 + + + 232 + 1 + 130 + + + 233 + 1 + 130 + + + 234 + 1 + 130 + + + 18 + 1 + 40 + + + 207 + 1 + 40 + + + 21 + 1 + 40 + + + 134 + 1 + 40 + + + 139 + 1 + 40 + + + 192 + 1 + 30 + + + 137 + 1 + 30 + + + 19 + 1 + 30 + + + 23 + 1 + 30 + + + 144 + 1 + 20 + + + 166 + 1 + 20 + + + -1 + -1 + 120 + + + + + Flynn + The mace salesman + + 15 + 22 + 22 + 6 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wyson the gardener + An old gardener + + 10 + 8 + 7 + 8 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8947848 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wizard Mizgog + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 14535816 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Prince Ali + A young prince + + 20 + 20 + 20 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 15618286 + 15658576 + 13415270 + 140 + 215 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hassan + the Chancellor to the emir + + 20 + 20 + 20 + 20 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 79 + 62 + + 1 + 16777215 + 16777215 + 13415270 + 150 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Osman + He looks a little shifty + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Joe + Lady Keli's head guard + + 40 + 40 + 40 + 40 + false + false + 30 + + 5 + 1 + 2 + -1 + 116 + -1 + 22 + -1 + 46 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Leela + She comes from Al Kharid + + 20 + 20 + 20 + 20 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 1 + 12285781 + 3 + 13415270 + 140 + 215 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Lady Keli + An Infamous bandit + + 20 + 20 + 20 + 20 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 89 + -1 + -1 + -1 + -1 + + 16763992 + 15618286 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ned + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Aggie + A witch + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 16711680 + 3 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Prince Ali + That is an effective disguise + + 10 + 10 + 10 + 10 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 89 + -1 + -1 + -1 + -1 + + 16763992 + 15618286 + 3 + 15523536 + 140 + 215 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jailguard + I wonder what he's guarding + + 34 + 34 + 32 + 36 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 16763992 + 2 + 3 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Redbeard Frank + A pirate + + 35 + 25 + 10 + 30 + false + false + 30 + + 6 + 1 + 2 + -1 + 48 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15630384 + 2 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wydin + A grocer + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + shop assistant + I can buy swords off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Brian + An axe seller + + 0 + 0 + 3 + 0 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + squire + A young squire + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 14535800 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Head chef + He looks after the chef's guild + + 20 + 20 + 3 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16711680 + 15523536 + 150 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thurgo + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 8409200 + 8409120 + 13415270 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ice Giant + He's got icicles in his beard + + 67 + 66 + 70 + 70 + true + true + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 6724027 + 8425710 + 8409120 + 5623807 + 261 + 396 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 10 + 52 + 300 + + + 89 + 1 + 40 + + + 96 + 1 + 30 + + + 77 + 1 + 40 + + + 72 + 1 + 35 + + + 88 + 1 + 30 + + + 432 + 1 + 20 + + + 126 + 1 + 13 + + + 9 + 1 + 20 + + + 36 + 11 + 30 + + + 35 + 11 + 30 + + + 32 + 11 + 30 + + + 40 + 3 + 12 + + + 46 + 3 + 12 + + + 38 + 3 + 12 + + + 42 + 3 + 12 + + + 159 + 1 + 4 + + + 158 + 1 + 3 + + + 157 + 1 + 1 + + + 142 + 1 + 70 + + + -1 + -1 + 255 + + + + + King Scorpion + Wow scorpions shouldn't grow that big + + 40 + 38 + 30 + 39 + true + true + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 543 + 312 + 7 + 7 + 45 + + + + Pirate + A vicious pirate + + 35 + 25 + 20 + 30 + true + true + 30 + + 6 + 1 + 2 + -1 + 48 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 15658615 + 14483456 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 8 + 250 + + + 82 + 1 + 70 + + + 28 + 1 + 70 + + + 8 + 1 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 41 + 2 + 10 + + + 31 + 7 + 20 + + + 33 + 7 + 20 + + + 32 + 7 + 20 + + + 34 + 7 + 20 + + + 170 + 1 + 8 + + + 160 + 1 + 7 + + + 159 + 1 + 5 + + + 192 + 1 + 30 + + + 609 + 1 + 60 + + + -1 + -1 + 379 + + + + + Sir Vyvin + One of the white knights of Falador + + 55 + 60 + 52 + 58 + false + false + 30 + + 19 + 34 + 43 + -1 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Monk of Zamorak + An evil cleric + + 28 + 32 + 30 + 28 + true + false + 30 + + 7 + 1 + 2 + -1 + 116 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 702 + 1 + 10 + + + 703 + 1 + 10 + + + -1 + -1 + 980 + + + + + Monk of Zamorak + An evil cleric + + 18 + 22 + 20 + 18 + true + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 702 + 1 + 10 + + + 703 + 1 + 10 + + + -1 + -1 + 980 + + + + + Wayne + An armourer + + 15 + 22 + 22 + 6 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 140 + 210 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Barmaid + a pretty barmaid + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16753488 + 16777008 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dwarven shopkeeper + I wonder if he wants to buy any of my junk + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + 9 + -1 + + 7360576 + 9465888 + 9465888 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Doric + A dwarven smith + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + 10 + -1 + + 16753488 + 9465888 + 9465888 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guide + She gives hints to new adventurers + + 0 + 0 + 7 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 32768 + 8388863 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hetty + A witch + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 3182640 + 16711680 + 3 + 15531728 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Betty + A witch + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 3 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bartender + I could get a beer off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + General wartface + An ugly green creature + + 16 + 14 + 12 + 13 + false + false + 30 + + 142 + 141 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 264 + 250 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + + + General Bentnoze + An ugly green creature + + 16 + 14 + 12 + 13 + false + false + 30 + + 142 + 140 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 264 + 250 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + + + Goblin + An ugly green creature + + 16 + 14 + 12 + 13 + true + false + 30 + + 142 + 140 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + 10 + 10 + 625 + + + 192 + 1 + 20 + + + 827 + 1 + 62 + + + 124 + 1 + 83 + + + 273 + 1 + 208 + + + -1 + -1 + 0 + + + + + Goblin + An ugly green creature + + 16 + 14 + 12 + 13 + true + false + 30 + + 142 + 141 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + 10 + 10 + 625 + + + 192 + 1 + 20 + + + 827 + 1 + 62 + + + 124 + 1 + 83 + + + 273 + 1 + 208 + + + -1 + -1 + 0 + + + + + Herquin + A gem merchant + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16753488 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rommik + The owner of the crafting shop + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16753488 + 16732192 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Grum + Grum the goldsmith + + 0 + 0 + 3 + 0 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 7368816 + 7368816 + 15523536 + 130 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ice warrior + A strange inhuman warrior + + 57 + 56 + 59 + 59 + true + true + 30 + + 7 + 1 + 44 + 100 + 118 + -1 + 35 + -1 + -1 + -1 + -1 + -1 + + 6724027 + 8425710 + 8425710 + 5623807 + 150 + 250 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 30 + 400 + + + 89 + 1 + 60 + + + 96 + 1 + 20 + + + 9 + 1 + 40 + + + 41 + 1 + 10 + + + 38 + 1 + 10 + + + 46 + 1 + 10 + + + 40 + 2 + 10 + + + 160 + 1 + 20 + + + 159 + 1 + 10 + + + -1 + -1 + 410 + + + + + Warrior + A skilled fighter + pickpocket + 35 + 25 + 20 + 30 + true + false + 30 + + 3 + 56 + 38 + -1 + 109 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 34 + 3 + 79 + + + 36 + 3 + 79 + + + 11 + 10 + 53 + + + 104 + 1 + 26 + + + 16 + 1 + 26 + + + 619 + 1 + 6 + + + 10 + 18 + 450 + + + 40 + 2 + 10 + + + -1 + -1 + 267 + + + + + Thrander + A smith of some sort + + 15 + 22 + 22 + 6 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Border Guard + a guard from Al Kharid + + 20 + 17 + 19 + 18 + false + false + 30 + + 6 + 1 + 2 + 48 + -1 + 70 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 13385881 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Border Guard + a guard from Al Kharid + + 20 + 17 + 19 + 18 + false + false + 30 + + 6 + 1 + 2 + 48 + -1 + 70 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 13385881 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Customs Officer + She is here to stop smugglers + + 23 + 12 + 15 + 14 + false + false + 30 + + 0 + 4 + 38 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Luthas + The owner of the banana plantation + + 23 + 12 + 15 + 14 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 9461792 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Zambo + He will sell me exotic rum + + 23 + 12 + 15 + 14 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 13398064 + 3198139 + 3 + 9461792 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Captain Tobias + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gerrant + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 8409120 + 8409120 + 9461792 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 8409120 + 8409120 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Seaman Lorris + A young sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16752704 + 255 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Seaman Thresnor + A young sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16752704 + 255 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Tanner + He makes leather + + 20 + 60 + 60 + 40 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 8409120 + 8409120 + 13415270 + 125 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dommik + The owner of the crafting shop + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16753488 + 16732192 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Abbot Langley + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thordur + He runs a a tourist attraction + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 9465888 + 9465888 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Brother Jered + human + + 12 + 13 + 15 + 12 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rat + Overgrown vermin + + 16 + 12 + 10 + 15 + true + true + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 346 + 136 + 7 + 7 + 45 + + + 20 + 1 + 0 + + + 503 + 1 + 100 + + + + + Ghost + Ooh spooky + + 23 + 30 + 25 + 23 + true + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + + + + skeleton + it rattles when it walks + + 32 + 30 + 29 + 35 + true + true + 30 + + 134 + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 216 + 234 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + 12 + 1 + 60 + + + 10 + 15 + 400 + + + 1 + 1 + 60 + + + 83 + 1 + 60 + + + 28 + 1 + 60 + + + 5 + 1 + 60 + + + 113 + 1 + 60 + + + 32 + 7 + 50 + + + 33 + 4 + 30 + + + 31 + 7 + 20 + + + 41 + 3 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 46 + 2 + 10 + + + 160 + 1 + 10 + + + -1 + -1 + 90 + + + + + zombie + the living dead + + 32 + 31 + 30 + 35 + true + true + 30 + + 136 + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + 28 + 1 + 60 + + + 0 + 1 + 60 + + + 128 + 1 + 60 + + + 36 + 6 + 40 + + + 33 + 6 + 40 + + + 46 + 2 + 20 + + + 41 + 2 + 20 + + + 31 + 6 + 20 + + + 270 + 1 + 70 + + + 166 + 1 + 30 + + + 160 + 1 + 30 + + + 159 + 1 + 20 + + + 158 + 1 + 20 + + + 157 + 1 + 10 + + + -1 + -1 + 500 + + + + + Lesser Demon + Lesser but still very big + + 78 + 79 + 79 + 80 + true + true + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 275 + 262 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + 10 + 75 + 350 + + + 84 + 1 + 70 + + + 88 + 1 + 70 + + + 72 + 1 + 70 + + + 109 + 1 + 50 + + + 115 + 1 + 30 + + + 126 + 1 + 20 + + + 399 + 1 + 10 + + + 31 + 50 + 50 + + + 41 + 6 + 10 + + + 38 + 3 + 10 + + + 152 + 1 + 70 + + + 157 + 1 + 10 + + + 158 + 1 + 20 + + + 142 + 7 + 10 + + + -1 + -1 + 150 + + + + + Melzar the mad + He looks totally insane + + 47 + 44 + 44 + 47 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 16776944 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Scavvo + He has lopsided eyes + + 10 + 10 + 10 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 7356480 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Greater Demon + big red and incredibly evil + + 86 + 87 + 87 + 88 + true + true + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + 10 + 50 + 108 + + + 98 + 1 + 27 + + + 123 + 1 + 18 + + + 88 + 1 + 99 + + + 78 + 1 + 99 + + + 90 + 1 + 99 + + + 38 + 5 + 63 + + + 41 + 15 + 90 + + + 398 + 1 + 20 + + + 130 + 1 + 30 + + + 112 + 1 + 10 + + + 157 + 1 + 20 + + + 158 + 1 + 30 + + + -1 + -1 + 287 + + + + + Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Oziach + A strange little man + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 6307872 + 8440864 + 8440864 + 15523536 + 145 + 205 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bear + Eek! A bear! + + 27 + 25 + 27 + 28 + true + true + 30 + + 131 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 262 + 247 + 6 + 9 + 30 + + + 20 + 1 + 0 + + + + + Black Knight + An armoured follower of Zamorak + + 45 + 50 + 42 + 48 + true + false + 30 + + 18 + 32 + 42 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 16 + 250 + + + 36 + 6 + 30 + + + 35 + 6 + 30 + + + 34 + 6 + 30 + + + 42 + 2 + 10 + + + 41 + 2 + 10 + + + 46 + 2 + 10 + + + 38 + 2 + 10 + + + 171 + 1 + 30 + + + 202 + 1 + 40 + + + 138 + 1 + 40 + + + 159 + 1 + 10 + + + 160 + 1 + 20 + + + 6 + 1 + 30 + + + 1 + 1 + 30 + + + 95 + 1 + 20 + + + 136 + 1 + 40 + + + -1 + -1 + 359 + + + + + chaos Dwarf + a dwarf gone bad + + 58 + 59 + 61 + 60 + true + true + 30 + + 6 + 1 + 2 + -1 + 110 + 71 + 22 + -1 + -1 + -1 + -1 + -1 + + 14495808 + 14495808 + 14495808 + 14495808 + 135 + 185 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 89 + 1 + 10 + + + 83 + 1 + 10 + + + 77 + 1 + 10 + + + 158 + 1 + 2 + + + 157 + 1 + 2 + + + 42 + 2 + 6 + + + 46 + 3 + 5 + + + 38 + 3 + 3 + + + 40 + 3 + 3 + + + 414 + 1 + 4 + + + 173 + 1 + 3 + + + 155 + 1 + 4 + + + 73 + 1 + 2 + + + 126 + 1 + 2 + + + 619 + 6 + 8 + + + 1006 + 1 + 0 + + + 10 + 40 + 370 + + + -1 + -1 + 551 + + + + + dwarf + A dwarf who looks after the mining guild + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 9465888 + 9465888 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wormbrain + Dumb even by goblin standards + + 8 + 9 + 5 + 9 + true + false + 30 + + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + + + Klarense + A young sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + -1 + + 16752704 + 221 + 4 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ned + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + skeleton + A Taller than normal skeleton + + 52 + 50 + 59 + 55 + true + true + 30 + + 134 + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 259 + 281 + 11 + 11 + 12 + + + 20 + 1 + 0 + + + 12 + 1 + 60 + + + 10 + 15 + 400 + + + 1 + 1 + 60 + + + 83 + 1 + 60 + + + 28 + 1 + 60 + + + 5 + 1 + 60 + + + 113 + 1 + 60 + + + 32 + 7 + 50 + + + 33 + 4 + 30 + + + 31 + 7 + 20 + + + 41 + 3 + 10 + + + 42 + 2 + 10 + + + 40 + 2 + 10 + + + 46 + 2 + 10 + + + 160 + 1 + 10 + + + -1 + -1 + 90 + + + + + Dragon + A powerful and ancient dragon + + 110 + 110 + 110 + 110 + true + true + 60 + + 144 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 452 + 326 + 10 + 7 + 70 + + + 814 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Oracle + A mystic of unknown race + + 57 + 56 + 59 + 59 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 6724027 + 14544622 + 14544622 + 5619694 + 110 + 180 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Duke of Lumbridge + Duke Horacio of Lumbridge + + 15 + 60 + 30 + 15 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 80 + 64 + + 1 + 16711680 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dark Warrior + A warrior touched by chaos + + 20 + 25 + 17 + 23 + true + false + 30 + + 0 + 32 + 42 + -1 + 114 + 75 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 370 + + + 31 + 5 + 74 + + + 32 + 5 + 74 + + + 33 + 5 + 74 + + + 34 + 5 + 74 + + + 35 + 5 + 74 + + + 160 + 1 + 37 + + + 11 + 7 + 185 + + + 470 + 1 + 37 + + + + + Druid + A worshipper of Guthix + + 28 + 32 + 30 + 28 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 16777215 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 464 + 1 + 12 + + + 607 + 1 + 6 + + + 608 + 1 + 6 + + + 566 + 1 + 6 + + + 220 + 1 + 63 + + + 188 + 1 + 6 + + + 28 + 1 + 6 + + + 40 + 1 + 31 + + + 42 + 1 + 31 + + + 41 + 1 + 31 + + + 46 + 1 + 31 + + + 38 + 1 + 31 + + + 619 + 1 + 31 + + + 443 + 1 + 31 + + + 442 + 1 + 38 + + + 441 + 1 + 44 + + + 165 + 1 + 89 + + + 435 + 1 + 63 + + + 436 + 1 + 53 + + + 437 + 1 + 53 + + + 438 + 1 + 50 + + + 439 + 1 + 49 + + + 440 + 1 + 44 + + + -1 + -1 + 180 + + + + + Red Dragon + A big powerful dragon + + 140 + 140 + 140 + 160 + true + true + 30 + + 145 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 452 + 326 + 10 + 7 + 70 + + + 814 + 1 + 0 + + + 79 + 1 + 20 + + + 203 + 1 + 20 + + + 1092 + 1 + 20 + + + 75 + 1 + 20 + + + 619 + 6 + 10 + + + 38 + 8 + 40 + + + 42 + 15 + 30 + + + 174 + 1 + 30 + + + 441 + 1 + 10 + + + 442 + 1 + 10 + + + 443 + 1 + 10 + + + 120 + 1 + 20 + + + 10 + 360 + 450 + + + 130 + 1 + 20 + + + -1 + -1 + 290 + + + + + Blue Dragon + A mother dragon + + 105 + 105 + 105 + 105 + true + true + 60 + + 146 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 452 + 326 + 10 + 7 + 70 + + + 814 + 1 + 0 + + + 111 + 1 + 64 + + + 33 + 15 + 88 + + + 439 + 1 + 48 + + + 438 + 1 + 64 + + + 396 + 1 + 24 + + + 118 + 1 + 40 + + + 159 + 1 + 48 + + + 158 + 1 + 32 + + + 555 + 1 + 16 + + + 123 + 1 + 24 + + + 112 + 1 + 12 + + + 88 + 1 + 56 + + + 40 + 20 + 32 + + + 638 + 20 + 28 + + + 1092 + 1 + 12 + + + 526 + 1 + 12 + + + 527 + 1 + 12 + + + 174 + 1 + 48 + + + 42 + 10 + 28 + + + 442 + 1 + 36 + + + 443 + 1 + 36 + + + 441 + 1 + 36 + + + 174 + 1 + 41 + + + 438 + 1 + 53 + + + 439 + 1 + 37 + + + 437 + 1 + 70 + + + 467 + 1 + 0 + + + + + Baby Blue Dragon + Young but still dangerous + + 50 + 50 + 50 + 50 + true + true + 60 + + 146 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 226 + 163 + 10 + 7 + 30 + + + 413 + 1 + 0 + + + + + Kaqemeex + A wise druid + + 28 + 32 + 30 + 28 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 14540253 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sanfew + An old druid + + 28 + 32 + 30 + 28 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 16777215 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Suit of armour + A dusty old suit of armour + + 30 + 30 + 29 + 28 + false + false + 30 + + -1 + 28 + 37 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Adventurer + A cleric + + 12 + 13 + 15 + 12 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16753248 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Adventurer + A wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + 122 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Adventurer + A Warrior + + 55 + 60 + 52 + 58 + false + false + 30 + + 5 + 28 + 37 + -1 + 110 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Adventurer + An archer + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + 107 + -1 + -1 + -1 + 46 + -1 + -1 + 63 + + 16753488 + 15645504 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Leprechaun + A funny little man who lives in a tree + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 5271616 + 5286432 + 5286432 + 15523536 + 103 + 141 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Monk of entrana + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Monk of entrana + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + zombie + The living dead + + 32 + 31 + 30 + 35 + true + true + 30 + + 136 + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + 32 + 5 + 45 + + + 33 + 5 + 45 + + + 34 + 5 + 45 + + + 35 + 5 + 45 + + + 160 + 1 + 22 + + + 169 + 1 + 45 + + + 10 + 30 + 70 + + + 12 + 1 + 80 + + + 5 + 1 + 45 + + + 159 + 1 + 20 + + + 158 + 1 + 18 + + + 83 + 1 + 54 + + + 526 + 1 + 15 + + + 527 + 1 + 15 + + + 134 + 1 + 60 + + + 270 + 1 + 70 + + + 1 + 1 + 80 + + + -1 + -1 + 222 + + + + + Monk of entrana + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + tree spirit + Ooh spooky + + 100 + 90 + 85 + 105 + true + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 241 + 292 + 9 + 9 + 5 + + + 20 + 1 + 0 + + + 88 + 1 + 300 + + + 13 + 1 + 200 + + + 40 + 6 + 80 + + + -1 + -1 + 420 + + + + + cow + It's a dairy cow + + 9 + 8 + 8 + 9 + false + false + 30 + + 128 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 327 + 240 + 6 + 6 + 45 + + + 20 + 1 + 0 + + + + + Irksol + Is he invisible or just a set of floating clothes? + + 2 + 2 + 3 + 2 + false + false + 30 + + 78 + 82 + 88 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16711680 + 16711680 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fairy Lunderwin + A fairy merchant + + 2 + 2 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16711680 + 16711680 + 9461792 + 94 + 143 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jakut + An unusual looking merchant + + 2 + 2 + 3 + 2 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3180748 + 65280 + 65280 + 9461792 + 145 + 260 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Doorman + He guards the entrance to the faerie market + + 55 + 60 + 52 + 58 + false + false + 30 + + 0 + 1 + 37 + -1 + 110 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3189418 + 3170508 + 3206894 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fairy Shopkeeper + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 94 + 143 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fairy Shop Assistant + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 6307872 + 8409120 + 8409120 + 15523536 + 94 + 143 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fairy banker + He can look after my money + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 2 + 3 + 15523536 + 94 + 143 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Giles + He runs an ore exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 255 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Miles + He runs a bar exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16772761 + 255 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Niles + He runs a fish exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 255 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gaius + he sells very big swords + + 15 + 22 + 22 + 6 + false + false + 30 + + 3 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fairy Ladder attendant + A worker in the faerie market + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16761440 + 8409120 + 8409120 + 15523536 + 94 + 143 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jatix + A hard working druid + + 28 + 32 + 30 + 28 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 85 + -1 + -1 + -1 + -1 + -1 + + 11184810 + 65535 + 16777215 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Master Crafter + The man in charge of the crafter's guild + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16753488 + 16732192 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bandit + He's ready for a fight + + 32 + 33 + 27 + 26 + true + true + 30 + + 0 + 1 + 2 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 619 + 2 + 44 + + + 155 + 1 + 78 + + + 165 + 1 + 59 + + + 437 + 1 + 59 + + + 41 + 6 + 49 + + + 160 + 1 + 88 + + + 159 + 1 + 78 + + + 158 + 1 + 39 + + + 157 + 1 + 29 + + + 125 + 1 + 68 + + + 83 + 1 + 68 + + + 10 + 13 + 59 + + + 10 + 81 + 44 + + + 165 + 1 + 59 + + + 435 + 1 + 49 + + + 436 + 1 + 49 + + + 437 + 1 + 39 + + + 438 + 1 + 29 + + + 526 + 1 + 2 + + + 527 + 1 + 3 + + + + + Noterazzo + A bandit shopkeeper + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + 117 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bandit + A wilderness outlaw + + 32 + 33 + 27 + 26 + true + true + 30 + + 0 + 1 + 2 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 221 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fat Tony + A Gourmet Pizza chef + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16711680 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Donny the lad + A bandit leader + + 42 + 43 + 37 + 36 + true + false + 30 + + 5 + 1 + 2 + 49 + 98 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 16752704 + 8060928 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Black Heather + A bandit leader + + 42 + 43 + 37 + 36 + true + false + 30 + + 3 + 4 + 2 + 109 + 98 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 8060928 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Speedy Keith + A bandit leader + + 42 + 43 + 37 + 36 + true + false + 30 + + 0 + 1 + 2 + 49 + -1 + -1 + 22 + -1 + -1 + -1 + -1 + 62 + + 16752704 + 8060928 + 3 + 15523536 + 150 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + White wolf sentry + A vicious mountain wolf + + 30 + 32 + 34 + 31 + true + true + 30 + + 147 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 260 + 198 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Boy + He doesn't seem very happy + + 42 + 43 + 37 + 36 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16752704 + 8060928 + 3 + 15523536 + 100 + 147 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rat + He seems to live here + + 3 + 4 + 2 + 2 + false + false + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 115 + 45 + 7 + 7 + 10 + + + 20 + 1 + 0 + + + 503 + 1 + 100 + + + + + Nora T Hag + She's got warts + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15527632 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Grey wolf + A sinister looking wolf + + 60 + 62 + 69 + 65 + true + true + 30 + + 148 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 260 + 198 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + 541 + 1 + 0 + + + -1 + -1 + 1000 + + + + + shapeshifter + I've not seen anyone like this before + + 28 + 29 + 21 + 20 + true + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 84 + -1 + -1 + -1 + -1 + -1 + + 14495808 + 14495808 + 14495808 + 14495808 + 150 + 185 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + shapeshifter + I think this spider has been genetically modified + + 38 + 39 + 31 + 30 + false + false + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 120 + 104 + 6 + 6 + 5 + + + + shapeshifter + Eek! A bear! + + 48 + 49 + 41 + 40 + false + false + 30 + + 131 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 262 + 247 + 6 + 9 + 30 + + + + shapeshifter + A sinister looking wolf + + 58 + 59 + 51 + 50 + false + false + 30 + + 148 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 260 + 198 + 6 + 10 + 30 + + + + White wolf + A vicious mountain wolf + + 40 + 42 + 44 + 41 + true + true + 30 + + 147 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 260 + 198 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Pack leader + A vicious mountain wolf + + 70 + 72 + 74 + 71 + true + true + 30 + + 147 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 312 + 238 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Harry + I wonder what he's got for sale + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thug + He likes hitting things + + 19 + 20 + 18 + 17 + true + true + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 255 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 256 + + + 31 + 5 + 51 + + + 32 + 5 + 51 + + + 33 + 5 + 51 + + + 34 + 5 + 51 + + + 35 + 5 + 51 + + + 160 + 1 + 25 + + + 11 + 7 + 128 + + + 165 + 1 + 50 + + + 435 + 1 + 37 + + + 436 + 1 + 39 + + + 437 + 1 + 33 + + + 438 + 1 + 30 + + + 88 + 1 + 45 + + + 5 + 1 + 37 + + + 77 + 1 + 24 + + + 170 + 1 + 35 + + + + + Firebird + Probably not a chicken + + 6 + 7 + 5 + 7 + true + false + 30 + + 156 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 70 + 62 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 557 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Achetties + One of Asgarnia's greatest heros + + 45 + 50 + 42 + 48 + false + false + 30 + + 3 + 59 + 41 + 102 + 113 + 74 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ice queen + The leader of the ice warriors + + 105 + 101 + 104 + 104 + true + false + 30 + + 7 + 4 + 44 + 100 + 118 + -1 + -1 + -1 + 155 + -1 + -1 + 64 + + 6724027 + 8425710 + 8425710 + 5623807 + 150 + 250 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 619 + 3 + 48 + + + 46 + 1 + 70 + + + 38 + 3 + 40 + + + 827 + 1 + 100 + + + 89 + 1 + 80 + + + 160 + 1 + 70 + + + 159 + 1 + 60 + + + 159 + 1 + 50 + + + 158 + 1 + 40 + + + 157 + 1 + 30 + + + 10 + 10 + 90 + + + 1088 + 1 + 80 + + + 42 + 1 + 50 + + + 556 + 1 + 0 + + + -1 + -1 + 192 + + + + + Grubor + A rough looking thief + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 150 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Trobert + A well dressed thief + + 14 + 15 + 13 + 13 + false + false + 30 + + 0 + 1 + 2 + 51 + -1 + -1 + -1 + -1 + -1 + -1 + 79 + 67 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Garv + A diligent guard + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + 110 + -1 + 75 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + guard + A vicious pirate + + 35 + 25 + 20 + 30 + false + false + 30 + + 6 + 1 + 2 + -1 + 48 + 163 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 15658615 + 14483456 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Grip + Scar face petes head guard + + 31 + 60 + 62 + 31 + true + false + 30 + + 0 + 1 + 42 + 110 + -1 + 75 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 152 + 231 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Alfonse the waiter + He should get a clean apron + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Charlie the cook + Head cook of the Shrimp and parrot + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 15641122 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guard Dog + He doesn't seem pleased to see me + + 45 + 47 + 49 + 46 + true + true + 30 + + 159 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 247 + 188 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Ice spider + I think this spider has been genetically modified + + 60 + 66 + 65 + 65 + true + true + 30 + + 160 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 132 + 114 + 6 + 6 + 5 + + + + Pirate + A vicious pirate + + 38 + 28 + 23 + 33 + true + true + 30 + + 6 + 1 + 2 + -1 + 48 + 163 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 7829248 + 6684672 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 8 + 1 + 81 + + + 10 + 80 + 338 + + + 83 + 1 + 67 + + + 638 + 6 + 67 + + + 159 + 1 + 33 + + + 439 + 1 + 33 + + + 436 + 1 + 33 + + + 41 + 2 + 33 + + + 42 + 2 + 33 + + + 38 + 2 + 33 + + + 160 + 1 + 66 + + + 159 + 1 + 56 + + + 158 + 1 + 47 + + + 157 + 1 + 29 + + + 609 + 1 + 39 + + + 526 + 1 + 1 + + + 527 + 1 + 1 + + + + + Jailer + Guards prisoners for the black knights + + 50 + 55 + 47 + 53 + true + false + 30 + + 6 + 32 + 42 + -1 + 114 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 596 + 1 + 1000 + + + 595 + 1 + 0 + + + + + Lord Darquarius + A black knight commander + + 75 + 80 + 72 + 78 + true + false + 30 + + 0 + 32 + 42 + 103 + 53 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 426 + 1 + 50 + + + 41 + 3 + 30 + + + 1 + 1 + 80 + + + 36 + 6 + 80 + + + 160 + 1 + 50 + + + 138 + 1 + 70 + + + 171 + 1 + 90 + + + 23 + 1 + 60 + + + 6 + 1 + 60 + + + 202 + 1 + 90 + + + 652 + 1 + 80 + + + 35 + 5 + 90 + + + 34 + 11 + 60 + + + 526 + 1 + 20 + + + 527 + 1 + 20 + + + -1 + -1 + 70 + + + + + Seth + He runs a fish exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 255 + 14508096 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Banker + He can look after my money + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Helemos + A retired hero + + 45 + 50 + 42 + 48 + false + false + 30 + + 6 + 33 + 41 + 102 + 52 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Chaos Druid + A crazy evil druid + + 18 + 22 + 20 + 18 + true + true + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 16777215 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 464 + 1 + 13 + + + 566 + 1 + 6 + + + 220 + 1 + 66 + + + 188 + 1 + 6 + + + 28 + 1 + 6 + + + 40 + 1 + 33 + + + 42 + 1 + 33 + + + 41 + 1 + 33 + + + 46 + 1 + 33 + + + 38 + 1 + 33 + + + 619 + 1 + 33 + + + 438 + 1 + 66 + + + 437 + 1 + 73 + + + 436 + 1 + 80 + + + 435 + 1 + 86 + + + 165 + 1 + 93 + + + 439 + 1 + 40 + + + 440 + 1 + 40 + + + 441 + 1 + 28 + + + 442 + 1 + 23 + + + 443 + 1 + 18 + + + 465 + 1 + 20 + + + 464 + 1 + 20 + + + -1 + -1 + 109 + + + + + Poison Scorpion + It has a very vicious looking tail + + 26 + 29 + 23 + 27 + true + true + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 362 + 208 + 7 + 7 + 45 + + + + Velrak the explorer + he looks cold and hungry + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8952166 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sir Lancelot + A knight of the round table + + 55 + 60 + 52 + 58 + false + false + 30 + + 3 + 34 + 43 + 101 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sir Gawain + A knight of the round table + + 55 + 60 + 52 + 58 + false + false + 30 + + 5 + 34 + 43 + 100 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + King Arthur + A wise old king + + 55 + 60 + 52 + 58 + false + false + 30 + + 0 + 34 + 43 + -1 + 49 + 150 + -1 + -1 + -1 + -1 + -1 + 68 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sir Mordred + An evil knight + + 57 + 62 + 54 + 60 + true + false + 30 + + 18 + 32 + 42 + 103 + 53 + -1 + -1 + -1 + -1 + -1 + -1 + 64 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Renegade knight + He isn't very friendly + + 50 + 55 + 48 + 53 + true + true + 30 + + 18 + 32 + 42 + -1 + 53 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 619 + 3 + 30 + + + 10 + 68 + 300 + + + 171 + 1 + 40 + + + 6 + 1 + 60 + + + 189 + 1 + 150 + + + 42 + 3 + 30 + + + 526 + 1 + 2 + + + 527 + 1 + 2 + + + 158 + 1 + 30 + + + 157 + 1 + 20 + + + 1 + 1 + 80 + + + 160 + 1 + 60 + + + -1 + -1 + 199 + + + + + Davon + An amulet trader + + 35 + 25 + 20 + 30 + false + false + 30 + + 6 + 1 + 2 + -1 + 48 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 1 + 15658615 + 10289152 + 11312784 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bartender + I could get some grog off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + 163 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Arhein + A merchant + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 13381836 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Morgan le faye + An evil sorceress + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + 122 + -1 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15527632 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Candlemaker + He makes and sells candles + + 15 + 22 + 22 + 6 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + lady + She has a hint of magic about her + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + lady + She has a hint of magic about her + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + lady + She has a hint of magic about her + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Beggar + A scruffy looking chap + + 9 + 8 + 5 + 7 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16768256 + 2 + 3 + 15523536 + 135 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Merlin + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thrantax + A freshly summoned demon + + 90 + 90 + 90 + 90 + false + false + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + + + Hickton + The owner of the archery store + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 8409136 + 14483456 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Black Demon + A big scary jet black demon + + 155 + 157 + 157 + 140 + true + true + 30 + + 164 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + 404 + 1 + 3 + + + 75 + 1 + 5 + + + 542 + 1 + 9 + + + 527 + 1 + 18 + + + 10 + 3000 + 27 + + + 10 + 2000 + 65 + + + 10 + 1000 + 93 + + + 619 + 7 + 20 + + + 482 + 1 + 20 + + + 408 + 1 + 8 + + + 38 + 45 + 9 + + + 396 + 1 + 20 + + + 443 + 1 + 30 + + + 442 + 1 + 40 + + + 518 + 4 + 20 + + + 1092 + 1 + 9 + + + 130 + 1 + 50 + + + 438 + 1 + 40 + + + 428 + 1 + 20 + + + 174 + 1 + 60 + + + 373 + 2 + 10 + + + 400 + 1 + 9 + + + -1 + -1 + 409 + + + + + Black Dragon + A fierce dragon with black scales! + + 210 + 190 + 190 + 170 + true + true + 60 + + 165 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 542 + 391 + 10 + 7 + 84 + + + 814 + 1 + 0 + + + 93 + 1 + 80 + + + 75 + 1 + 130 + + + 403 + 1 + 80 + + + 404 + 1 + 80 + + + 402 + 1 + 80 + + + 400 + 1 + 80 + + + 123 + 1 + 800 + + + 120 + 1 + 1200 + + + 640 + 200 + 1000 + + + 646 + 100 + 1000 + + + 33 + 200 + 1100 + + + 619 + 40 + 400 + + + 38 + 60 + 600 + + + 31 + 200 + 1100 + + + 40 + 60 + 618 + + + 42 + 80 + 712 + + + 523 + 1 + 415 + + + 795 + 1 + 5 + + + 593 + 1 + 12 + + + 594 + 1 + 8 + + + + + Poison Spider + I think this spider has been genetically modified + + 60 + 62 + 64 + 68 + true + true + 30 + + 166 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 180 + 156 + 6 + 6 + 5 + + + + Monk of Zamorak + An evil cleric + + 48 + 52 + 40 + 48 + true + false + 30 + + 7 + 1 + 2 + -1 + 122 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 95 + 1 + 100 + + + + + Hellhound + Hello nice doggy + + 115 + 112 + 116 + 114 + true + true + 30 + + 167 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 312 + 237 + 6 + 10 + 36 + + + 20 + 1 + 0 + + + + + Animated axe + a magic axe with a mind of it's own + + 48 + 45 + 44 + 48 + true + true + 20 + + -1 + -1 + -1 + -1 + 109 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15645552 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 89 + 1 + 0 + + + + + Black Unicorn + It's a sort of unicorn + + 31 + 33 + 29 + 33 + true + false + 30 + + 168 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 230 + 6 + 6 + 7 + + + 20 + 1 + 0 + + + 466 + 1 + 0 + + + + + Frincos + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Otherworldly being + Is he invisible or just a set of floating clothes? + + 66 + 66 + 66 + 66 + true + true + 30 + + 78 + 82 + 88 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16711680 + 16711680 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 642 + 15 + 5 + + + 10 + 120 + 200 + + + 643 + 5 + 5 + + + 526 + 1 + 1 + + + 527 + 1 + 1 + + + 96 + 1 + 5 + + + 204 + 1 + 1 + + + 286 + 1 + 5 + + + 38 + 4 + 10 + + + 40 + 4 + 10 + + + 41 + 4 + 10 + + + 619 + 2 + 10 + + + + 626 + 1 + 4 + + + + Owen + He runs a fish exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 16772761 + 255 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thormac the sorceror + A powerful sorcerrer + + 27 + 24 + 24 + 27 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 10056486 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Seer + An old wizard + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 76 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kharid Scorpion + a smaller less dangerous scorpion + + 21 + 24 + 17 + 22 + false + false + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 121 + 69 + 7 + 7 + 45 + + + + Kharid Scorpion + a smaller less dangerous scorpion + + 21 + 24 + 17 + 22 + false + false + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 121 + 69 + 7 + 7 + 45 + + + + Kharid Scorpion + a smaller less dangerous scorpion + + 21 + 24 + 17 + 22 + false + false + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 121 + 69 + 7 + 7 + 45 + + + + Barbarian guard + Not very civilised + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 28 + -1 + -1 + -1 + -1 + -1 + + 15645552 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bartender + I could get a beer off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + man + A well dressed nobleman + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 79 + 66 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + gem trader + He sells gems + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 3211212 + 3211212 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dimintheis + A well dressed nobleman + + 11 + 8 + 7 + 11 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 79 + 62 + + 1 + 7811157 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + chef + A busy looking chef + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 14540032 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hobgoblin + An ugly green creature + + 49 + 47 + 49 + 48 + true + true + 30 + + 142 + 140 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 314 + 295 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + 10 + 100 + 500 + + + 220 + 1 + 600 + + + 42 + 2 + 100 + + + 46 + 2 + 100 + + + 40 + 2 + 100 + + + 32 + 3 + 100 + + + 34 + 3 + 100 + + + 443 + 1 + 25 + + + 442 + 1 + 30 + + + 441 + 1 + 35 + + + 440 + 1 + 40 + + + 439 + 1 + 45 + + + 438 + 1 + 50 + + + 437 + 1 + 55 + + + 436 + 1 + 60 + + + 435 + 1 + 65 + + + 165 + 1 + 70 + + + 469 + 1 + 100 + + + 526 + 1 + 1 + + + 527 + 1 + 1 + + + + + Ogre + A large dim looking humanoid + + 72 + 33 + 60 + 70 + true + true + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 10 + 310 + 100 + + + 12 + 1 + 25 + + + 83 + 1 + 25 + + + 77 + 1 + 25 + + + 158 + 1 + 7 + + + 157 + 1 + 5 + + + 42 + 3 + 17 + + + 46 + 4 + 14 + + + 38 + 4 + 8 + + + 40 + 4 + 9 + + + + + Boot the Dwarf + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 20 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 10502176 + 8409120 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wizard + A young wizard + + 18 + 15 + 14 + 18 + false + false + 30 + + 3 + 1 + 2 + -1 + 122 + -1 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 100 + + + 185 + 1 + 10 + + + 184 + 1 + 10 + + + 100 + 1 + 10 + + + 31 + 6 + 100 + + + 32 + 6 + 100 + + + 33 + 6 + 100 + + + 34 + 6 + 100 + + + 35 + 6 + 100 + + + 36 + 6 + 100 + + + 38 + 2 + 25 + + + 40 + 2 + 25 + + + 41 + 2 + 25 + + + 42 + 2 + 25 + + + 46 + 2 + 25 + + + 268 + 2 + 150 + + + + + Chronozon + Chronozon the blood demon + + 183 + 60 + 60 + 182 + true + true + 30 + + 169 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + + + Captain Barnaby + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Customs Official + She's here to stop smugglers + + 23 + 12 + 15 + 14 + false + false + 30 + + 0 + 4 + 38 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Man + One of Runescape's citizens + pickpocket + 11 + 8 + 7 + 11 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 20 + 500 + + + 34 + 3 + 100 + + + 35 + 3 + 100 + + + 31 + 3 + 100 + + + 150 + 1 + 50 + + + 11 + 10 + 100 + + + 380 + 10 + 100 + + + 41 + 1 + 50 + + + 443 + 1 + 20 + + + 442 + 1 + 22 + + + 441 + 1 + 24 + + + 440 + 1 + 26 + + + 439 + 1 + 28 + + + 438 + 1 + 30 + + + 437 + 1 + 32 + + + 436 + 1 + 34 + + + 435 + 1 + 36 + + + 165 + 1 + 60 + + + + + farmer + An humble peasant + pickpocket + 15 + 16 + 12 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Warrior + A skilled fighter + pickpocket + 35 + 25 + 20 + 30 + true + false + 30 + + 3 + 56 + 38 + -1 + 109 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Guard + He tries to keep the law and order around here + pickpocket + 31 + 30 + 22 + 31 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Knight + A knight of Ardougne + pickpocket + 55 + 60 + 52 + 58 + true + false + 30 + + 19 + 34 + 43 + -1 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + 64 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 0 + 1 + 10 + + + 1 + 1 + 10 + + + 6 + 1 + 10 + + + 10 + 100 + 50 + + + 171 + 1 + 5 + + + 104 + 1 + 10 + + + 202 + 1 + 10 + + + 136 + 1 + 7 + + + 31 + 20 + 5 + + + 32 + 20 + 5 + + + 33 + 20 + 5 + + + 34 + 20 + 5 + + + 35 + 20 + 5 + + + + + Paladin + A paladin of Ardougne + pickpocket + 85 + 55 + 57 + 88 + true + false + 30 + + 6 + 34 + 43 + 101 + 119 + -1 + -1 + -1 + -1 + -1 + -1 + 66 + + 16760880 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 300 + 50 + + + 97 + 1 + 1 + + + 527 + 1 + 1 + + + 470 + 1 + 6 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 154 + 1 + 2 + + + 72 + 1 + 7 + + + 158 + 1 + 3 + + + + + Hero + A Hero of Ardougne + pickpocket + 85 + 80 + 82 + 88 + true + false + 30 + + 0 + 33 + 41 + 102 + 52 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Baker + He sells hot baked bread + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 8912896 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + silk merchant + He buys silk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16724172 + 16724172 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fur trader + A buyer and seller of animal furs + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 67 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + silver merchant + He deals in silver + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 66 + + 3158064 + 16764108 + 16764108 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + spice merchant + He sells exotic spices + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 1 + 16777215 + 8912896 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + gem merchant + He sells gems + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 3211212 + 3211212 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Zenesha + A shopkeeper of some sort + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + 56 + 93 + -1 + -1 + -1 + -1 + + 16753488 + 14518442 + 3 + 15523536 + 145 + 235 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kangai Mau + A tribesman + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 9461792 + 16724016 + 9461792 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wizard Cromperty + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + 122 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + RPDT employee + A delivery man + + 12 + 12 + 13 + 12 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 3158064 + 170 + 170 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Horacio + An old gardener + + 10 + 8 + 7 + 8 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8947848 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Aemad + He helps run the adventurers store + + 15 + 22 + 22 + 6 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kortan + He helps run the adventurers store + + 15 + 22 + 22 + 6 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 15523536 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + zoo keeper + He looks after Ardougne city zoo + + 20 + 20 + 20 + 20 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16752704 + 187 + 187 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Make over mage + He can change how I look + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 84 + -1 + -1 + -1 + -1 + 68 + + 3158064 + 16763952 + 15609986 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bartender + I could get a beer off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + chuck + A wood merchant + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 16732192 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rogue + He needs a shave + pickpocket + 24 + 22 + 17 + 23 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shadow spider + Is it a spider or is it a shadow + + 54 + 51 + 55 + 52 + true + true + 30 + + 170 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 132 + 114 + 6 + 6 + 5 + + + + Fire Giant + A big guy with red glowing skin + + 110 + 112 + 111 + 105 + true + true + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 12255232 + 16742195 + 16742195 + 16724787 + 261 + 396 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 10 + 3000 + 50 + + + 10 + 2000 + 100 + + + 10 + 1000 + 300 + + + 615 + 1 + 40 + + + 126 + 1 + 50 + + + 398 + 1 + 3 + + + 403 + 1 + 3 + + + 404 + 1 + 2 + + + 402 + 1 + 2 + + + 31 + 100 + 110 + + + 41 + 4 + 80 + + + 40 + 3 + 70 + + + 38 + 3 + 50 + + + 42 + 3 + 50 + + + 619 + 2 + 30 + + + 640 + 40 + 50 + + + 646 + 5 + 10 + + + 520 + 3 + 50 + + + 542 + 1 + 5 + + + 527 + 1 + 20 + + + 408 + 1 + 20 + + + + + + Grandpa Jack + A wistful old man + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 12277060 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sinister stranger + not your average fisherman + + 40 + 65 + 35 + 35 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 16576224 + 140 + 240 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bonzo + He runs a bone exchange stall + + 30 + 30 + 30 + 30 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Forester + He looks after McGrubor's wood + + 24 + 22 + 17 + 23 + false + false + 30 + + 6 + 1 + 2 + -1 + 107 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 1 + 56576 + 43520 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Morris + Fishing competition organiser + + 30 + 30 + 30 + 30 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 3 + 15523536 + 150 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Brother Omad + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Thief + A dastardly blanket thief + + 24 + 22 + 17 + 23 + true + false + 30 + + 0 + 1 + 2 + -1 + 48 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Head Thief + A dastardly blanket thief + + 34 + 32 + 37 + 33 + true + false + 30 + + 6 + 1 + 2 + -1 + 50 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 150 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Big Dave + A well built fisherman + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 165 + 242 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Joshua + A grumpy fisherman + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mountain Dwarf + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 1 + 7360544 + 7360544 + 15523536 + 130 + 180 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mountain Dwarf + A short angry guy + + 30 + 27 + 26 + 30 + true + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 1 + 7360544 + 7360544 + 15523536 + 130 + 180 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Brother Cedric + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Necromancer + A crazy evil necromancer + + 28 + 42 + 40 + 28 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 16777215 + 65535 + 255 + 16768722 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + zombie + The living dead + + 23 + 28 + 24 + 23 + true + true + 30 + + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 2 + + + 165 + 1 + 2 + + + 436 + 1 + 2 + + + 437 + 1 + 2 + + + 438 + 1 + 2 + + + 439 + 1 + 2 + + + 440 + 1 + 2 + + + 441 + 1 + 2 + + + 10 + 23 + 10 + + + 31 + 5 + 2 + + + 32 + 5 + 2 + + + 33 + 5 + 2 + + + 34 + 5 + 2 + + + 35 + 5 + 2 + + + 160 + 1 + 1 + + + 11 + 7 + 5 + + + + + Lucien + He walks with a slight limp + + 24 + 22 + 17 + 23 + false + false + 30 + + 18 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + 46 + 11 + -1 + -1 + + 1 + 2 + 3 + 4 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + The Fire warrior of lesarkus + A strange red humanoid + + 72 + 50 + 59 + 72 + true + false + 30 + + 7 + 1 + 36 + 97 + 108 + -1 + 20 + -1 + -1 + -1 + -1 + -1 + + 16750950 + 15634560 + 15634560 + 16752469 + 150 + 250 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + guardian of Armadyl + A worshipper of Armadyl + + 58 + 52 + 50 + 58 + false + false + 30 + + 6 + 1 + 41 + -1 + -1 + -1 + 85 + -1 + -1 + -1 + -1 + -1 + + 16772778 + 65535 + 255 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + guardian of Armadyl + A worshipper of Armadyl + + 58 + 52 + 50 + 58 + false + false + 30 + + 3 + 4 + 41 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16772778 + 16777215 + 255 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Lucien + He walks with a limp + + 24 + 22 + 17 + 23 + true + false + 30 + + 18 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + 46 + 11 + -1 + -1 + + 1 + 2 + 3 + 4 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + winelda + A witch + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 16711680 + 3 + 15531984 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Brother Kojo + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dungeon Rat + Overgrown vermin + + 20 + 10 + 12 + 22 + true + true + 30 + + 172 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 346 + 136 + 7 + 7 + 45 + + + 20 + 1 + 0 + + + 503 + 1 + 100 + + + + + Master fisher + The man in charge of the fishing guild + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Orven + He runs a fish exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 16772761 + 16711680 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Padik + He runs a fish exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16772761 + 16711680 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shopkeeper + He smells of fish + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Lady servil + She look's wealthy + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guard + It's one of General Khazard's guard's + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Guard + It's one of General Khazard's guard's + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 173 + 174 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Guard + It's one of General Khazard's guard's + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 173 + 174 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guard + It's one of General Khazard's guard's + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + 117 + 173 + 174 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Jeremy Servil + A young squire + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 14535800 + 2 + 3 + 15523536 + 120 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Justin Servil + Jeremy servil's father + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 12307576 + 2 + 3 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + fightslave joe + He look's mistreated and weak + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + fightslave kelvin + He look's mistreated and weak + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + local + A scruffy looking chap + + 9 + 8 + 5 + 7 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16768256 + 2 + 3 + 15523536 + 135 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Khazard Bartender + A tough looking barman + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + General Khazard + He look's real nasty + + 75 + 80 + 170 + 78 + true + false + 30 + + 18 + 32 + 42 + 103 + 53 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Khazard Ogre + Khazard's strongest ogre warrior + + 72 + 33 + 60 + 70 + true + true + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Guard + It's one of General Khazard's guard's + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + 117 + 173 + 174 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Khazard Scorpion + A large angry scorpion + + 50 + 48 + 40 + 49 + true + true + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 543 + 312 + 7 + 7 + 45 + + + + hengrad + He look's mistreated and weak + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bouncer + Hello nice doggy + + 130 + 112 + 116 + 130 + true + false + 30 + + 167 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 312 + 237 + 6 + 10 + 36 + + + 20 + 1 + 0 + + + + + Stankers + A cheerful looking fellow + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8453920 + 8409120 + 14467993 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Docky + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shopkeeper + Maybe he'd like to buy some of my junk + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fairy queen + A very little queen + + 2 + 2 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 150 + -1 + 86 + -1 + -1 + -1 + 66 + + 16765040 + 16777215 + 16777215 + 9461792 + 94 + 143 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Merlin + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Crone + A strange old lady + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + 122 + -1 + 82 + 88 + -1 + -1 + -1 + 63 + + 5255248 + 2 + 3 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + High priest of entrana + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + 79 + -1 + + 3158064 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + elkoy + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 14535850 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + remsai + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 14535850 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + bolkoy + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8965256 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + local gnome + It's a young tree gnome + + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8973960 + 36864 + 90 + 110 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + bolren + It's a gnome he look's important + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 150 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 16776960 + 2280584 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Black Knight titan + He is blocking the way + + 145 + 150 + 142 + 148 + true + false + 30 + + 18 + 32 + 42 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 209 + 314 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kalron + he look's lost + + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8973824 + 36864 + 90 + 110 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + brother Galahad + A Peaceful monk + + 12 + 13 + 15 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + 62 + + 16761440 + 65535 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + tracker 1 + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8965256 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + tracker 2 + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8965256 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + tracker 3 + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 8965256 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Khazard troop + It's one of General Khazard's warrior's + + 31 + 30 + 22 + 31 + true + false + 30 + + 0 + 1 + 2 + 98 + 117 + 173 + 174 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + -1 + -1 + 1000 + + + + + commander montai + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + 108 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 255 + 8965256 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + gnome troop + It's a tree gnome trooper + + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + 107 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 4508808 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + -1 + -1 + 1000 + + + + + khazard warlord + He look's real nasty + + 75 + 80 + 170 + 78 + true + false + 30 + + 0 + 32 + 42 + 103 + 53 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Sir Percival + He's covered in pieces of straw + + 55 + 60 + 52 + 58 + false + false + 30 + + 19 + 34 + 43 + 101 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fisher king + an old king + + 15 + 60 + 30 + 15 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + 154 + -1 + -1 + -1 + -1 + 80 + 62 + + 15658734 + 16711680 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + maiden + She has a far away look in her eyes + + 2 + 4 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 86 + -1 + -1 + -1 + -1 + + 15645552 + 16777215 + 16777215 + 15523536 + 125 + 225 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fisherman + an old fisherman + + 15 + 60 + 30 + 15 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 15636787 + 11184810 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + King Percival + The new fisher king + + 55 + 60 + 52 + 58 + false + false + 30 + + 0 + 34 + 43 + 101 + 49 + 154 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + unhappy peasant + He looks tired and hungry + + 25 + 26 + 22 + 28 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + happy peasant + He looks well fed and full of energy + + 25 + 26 + 22 + 28 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + ceril + It's Sir ceril carnillean a local noblemen + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + butler + It's the carnillean family butler + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + carnillean guard + It's a carnillean family guard + + 31 + 30 + 22 + 31 + true + false + 10 + + 0 + 1 + 2 + -1 + 117 + 70 + 21 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Tribesman + A primative warrior + + 38 + 39 + 39 + 40 + true + true + 30 + + 5 + 1 + 2 + 97 + 48 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 1 + 9461792 + 9461792 + 7360528 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + henryeta + It's a wealthy looking woman + + 2 + 4 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 86 + -1 + -1 + -1 + -1 + + 15645552 + 16777215 + 16777215 + 15523536 + 125 + 225 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + philipe + It's a young well dressed boy + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + -1 + -1 + + 14535800 + 2 + 3 + 15523536 + 120 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + clivet + A strange looking man in black + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + cult member + An suspicous looking man in black + + 20 + 20 + 20 + 20 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Lord hazeel + He could do with some sun + + 75 + 80 + 170 + 78 + true + false + 30 + + 18 + 32 + 42 + 103 + 53 + -1 + -1 + -1 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + alomone + A musculer looking man in black + + 48 + 46 + 20 + 56 + false + false + 30 + + 5 + 1 + 2 + -1 + 110 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3 + 2 + 3 + 13415270 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Khazard commander + It's one of General Khazard's commander's + + 50 + 50 + 22 + 45 + true + false + 30 + + 6 + 1 + 2 + 98 + 110 + 173 + 174 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + claus + the carnillean family cook + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + 1st plague sheep + The sheep has the plague + + 0 + 0 + 3 + 0 + false + false + 30 + + 129 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 170 + 124 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + 2nd plague sheep + The sheep has the plague + + 0 + 0 + 3 + 0 + false + false + 30 + + 129 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 170 + 124 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + 3rd plague sheep + The sheep has the plague + + 0 + 0 + 3 + 0 + false + false + 30 + + 129 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 170 + 124 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + 4th plague sheep + The sheep has the plague + + 0 + 0 + 3 + 0 + false + false + 30 + + 129 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 170 + 124 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Farmer brumty + He looks after livestock in this area + + 15 + 16 + 12 + 18 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Doctor orbon + A local doctor + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Councillor Halgrive + A town counceller + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Edmond + A local civilian + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 12255487 + 16777215 + 9461792 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Citizen + He look's tired + + 12 + 11 + 13 + 10 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Citizen + He look's frightened + + 10 + 10 + 13 + 8 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Citizen + She look's frustrated + + 11 + 10 + 13 + 14 + true + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Citizen + He look's angry + + 20 + 20 + 23 + 18 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16728064 + 12603424 + 5263392 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Citizen + He look's disillusioned + + 18 + 12 + 10 + 20 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 6307872 + 10506320 + 3174432 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jethick + A cynical old man + + 18 + 12 + 10 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 5263488 + 3158048 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 2 + 2 + 3 + 2 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 2 + 2 + 3 + 2 + false + false + 30 + + 3 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ted Rehnison + The head of the Rehnison family + + 11 + 8 + 7 + 11 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 8409120 + 8409136 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Martha Rehnison + A fairly poor looking woman + + 11 + 10 + 13 + 14 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Billy Rehnison + The Rehnisons eldest son + + 20 + 60 + 60 + 40 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16761440 + 8388688 + 8409120 + 15523536 + 125 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Milli Rehnison + She doesn't seem very happy + + 42 + 43 + 37 + 36 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 87 + -1 + -1 + -1 + -1 + + 16752704 + 8060928 + 3 + 15523536 + 112 + 198 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Alrena + She look's concerned + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 2 + 2 + 3 + 2 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Clerk + A bueracratic administrator + + 2 + 4 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16759632 + 16021427 + 12303291 + 14470816 + 138 + 205 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Carla + She look's upset + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bravek + The city warder of West Ardougne + + 15 + 60 + 30 + 15 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 79 + 64 + + 1 + 16711680 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Caroline + A well dressed middle aged lady + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Holgart + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Holgart + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Holgart + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kent + caroline's husband + + 20 + 60 + 60 + 40 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16761440 + 8388688 + 8409120 + 15523536 + 125 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + bailey + the fishing platform cook + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kennith + A young scared looking boy + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 14535800 + 11193464 + 3 + 15523536 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Platform Fisherman + an emotionless fisherman + + 15 + 60 + 30 + 15 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 16763904 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Platform Fisherman + an emotionless fisherman + + 15 + 60 + 30 + 15 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 12255453 + 14531532 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Platform Fisherman + an emotionless fisherman + + 15 + 60 + 30 + 15 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 13426124 + 15641275 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Elena + She doesn't look too happy + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 86 + -1 + -1 + -1 + -1 + + 13542224 + 13408767 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + jinno + He doesn't seem to mind his lack of legs + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 255 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Watto + He doesn't seem to mind his lack of legs + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16772761 + 255 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Recruiter + A member of the Ardougne royal army + + 40 + 70 + 65 + 30 + false + false + 30 + + 0 + 28 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15643488 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Head mourner + In charge of people with silly outfits + + 2 + 2 + 3 + 2 + false + false + 30 + + 3 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + 63 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Almera + A woman of the wilderness + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + hudon + A young boisterous looking lad + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 14535800 + 11193464 + 3 + 15523536 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + hadley + A happy looking fellow + + 15 + 60 + 30 + 15 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 13426124 + 15641275 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rat + Overgrown vermin + + 15 + 2 + 3 + 8 + true + false + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 346 + 136 + 7 + 7 + 45 + + + 20 + 1 + 0 + + + 503 + 1 + 100 + + + + + Combat instructor + He will tell me how to fight + + 40 + 70 + 65 + 30 + false + false + 30 + + 0 + 28 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 64 + + 11167296 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + golrie + It's a tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 13417420 + 14535850 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guide + She gives hints to new adventurers + + 0 + 0 + 7 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + 122 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 32768 + 8388863 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + King Black Dragon + The biggest meanest dragon around + + 250 + 240 + 240 + 180 + true + true + 120 + + 165 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 542 + 391 + 10 + 7 + 84 + + + 814 + 1 + 0 + + + 638 + 590 + 9 + + + 174 + 1 + 39 + + + 93 + 1 + 19 + + + 402 + 1 + 19 + + + 403 + 1 + 19 + + + 520 + 15 + 19 + + + 10 + 410 + 346 + + + 546 + 3 + 29 + + + 619 + 5 + 19 + + + 38 + 7 + 19 + + + 31 + 80 + 69 + + + 91 + 1 + 79 + + + 120 + 1 + 59 + + + -1 + -1 + 237 + + + 795 + 1 + 5 + + + + + cooking instructor + Talk to him to learn about runescape food + + 20 + 20 + 3 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + fishing instructor + He smells of fish + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + financial advisor + He knows about money + + 0 + 0 + 3 + 0 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 7368816 + 7368816 + 15523536 + 130 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + gerald + An old fisherman + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + mining instructor + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 69 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 8409120 + 8409120 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Elena + She looks concerned + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 86 + -1 + -1 + -1 + -1 + + 13542224 + 13408767 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Omart + A nervous looking fellow + + 15 + 60 + 30 + 15 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15658734 + 13426124 + 15641275 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bank assistant + She can look after my stuff + + 11 + 8 + 7 + 11 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15921906 + 7368816 + 7368816 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jerico + He looks friendly enough + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kilron + He looks shifty + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guidor's wife + She looks rather concerned + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Quest advisor + I wonder what advise he has to impart + + 40 + 70 + 65 + 30 + false + false + 30 + + 0 + 28 + 37 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + chemist + human + + 3 + 3 + 7 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16777215 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 2 + 2 + 3 + 2 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 2 + 2 + 3 + 2 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wilderness guide + He's ready for a fight + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 64 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Magic Instructor + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 20 + 20 + 19 + 30 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Community instructor + This is the last advisor - honest + + 2 + 4 + 3 + 2 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 86 + -1 + -1 + -1 + -1 + + 16746544 + 16021427 + 12303291 + 14470816 + 138 + 205 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + boatman + An old sailor + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + 45 + -1 + + 6710886 + 255 + 3 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + skeleton mage + It rattles as it walks + + 24 + 20 + 17 + 23 + true + true + 30 + + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 216 + 234 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 2 + + + 165 + 1 + 2 + + + 436 + 1 + 2 + + + 437 + 1 + 2 + + + 438 + 1 + 2 + + + 439 + 1 + 2 + + + 440 + 1 + 2 + + + 441 + 1 + 2 + + + 10 + 23 + 10 + + + 31 + 5 + 2 + + + 32 + 5 + 2 + + + 33 + 5 + 2 + + + 34 + 5 + 2 + + + 35 + 5 + 2 + + + 160 + 1 + 1 + + + 11 + 7 + 5 + + + + + controls guide + He's ready for a fight + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + nurse sarah + She's quite a looker + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 86 + -1 + -1 + -1 + -1 + + 15643488 + 16777215 + 16777215 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Tailor + He's ready for a party + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mourner + A mourner or plague healer + + 30 + 20 + 25 + 25 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 177 + 83 + 176 + 46 + 11 + 45 + -1 + + 3158064 + 16711680 + 16711680 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guard + He tries to keep order around here + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Chemist + He looks clever enough + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Chancy + He's ready for a bet + + 32 + 33 + 27 + 26 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hops + He's drunk + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + DeVinci + He has a colourful personality + + 32 + 33 + 27 + 26 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 11189213 + 11189213 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guidor + He's not that ill + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + 62 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Chancy + He's ready for a bet + + 32 + 33 + 27 + 26 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hops + He's drunk + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + DeVinci + He has a colourful personality + + 32 + 33 + 27 + 26 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 11189213 + 11189213 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + king Lathas + King Lanthas of east ardounge + + 15 + 60 + 30 + 15 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 80 + 62 + + 1 + 16711680 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Head wizard + He runs the wizards guild + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Magic store owner + An old wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wizard Frumscone + A confused looking wizard + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + target practice zombie + The living dead + + 23 + 28 + 24 + 23 + true + false + 30 + + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + + + Trufitus + A wise old witch doctor + + 10 + 5 + 7 + 5 + false + false + 30 + + 6 + 1 + 2 + 122 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + -1 + + 12632256 + 7296823 + 7296823 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Colonel Radick + A soldier of the town of Yanille + + 40 + 70 + 65 + 30 + true + false + 30 + + 6 + 28 + 37 + -1 + 109 + -1 + -1 + -1 + -1 + -1 + -1 + 62 + + 11167296 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Soldier + A soldier of the town of Yanille + + 31 + 30 + 22 + 31 + true + false + 30 + + 0 + 1 + 2 + -1 + 48 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Bartender + I could get a beer off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jungle Spider + A venomous deadly spider + + 45 + 46 + 50 + 47 + true + true + 30 + + 179 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 120 + 104 + 6 + 6 + 5 + + + + Jiminua + She looks very interested in selling some of her wares. + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + 10 + + 10 + 8409136 + 7296823 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jogre + An aggressive humanoid + + 72 + 33 + 60 + 70 + true + true + 30 + + 7 + 1 + 2 + -1 + 180 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3852326 + 3329330 + 37633 + 3978097 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Guard + He tries to keep order around here + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Ogre + Useful for ranged training + + 72 + 33 + 60 + 70 + true + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 10 + 310 + 100 + + + 12 + 1 + 25 + + + 83 + 1 + 25 + + + 77 + 1 + 25 + + + 158 + 1 + 7 + + + 157 + 1 + 5 + + + 42 + 3 + 17 + + + 46 + 4 + 14 + + + 38 + 4 + 8 + + + 40 + 4 + 9 + + + + + Guard + He tries to keep order around here + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Guard + He tries to keep order around here + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 69 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + shop keeper + he sells weapons + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bartender + I could get a beer off him + + 0 + 0 + 3 + 0 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Frenita + runs a cookery shop + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16752704 + 8409120 + 8409120 + 15523536 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ogre chieftan + A slightly bigger uglier ogre + + 92 + 53 + 80 + 90 + true + true + 30 + + 7 + 1 + 2 + -1 + 119 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + rometti + It's a well dressed tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 192 + 197 + 187 + -1 + 204 + -1 + -1 + + 1 + 16711680 + 14535850 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rashiliyia + A willowy ethereal being who floats above the ground + + 80 + 80 + 80 + 80 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + 201 + 202 + -1 + -1 + -1 + 65 + + 1 + 2 + 3 + 3978097 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Blurberry + It's a red faced tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 11184895 + 14535850 + 36864 + 110 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Heckel funch + It's another jolly tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + 195 + -1 + -1 + -1 + -1 + 10 + -1 + + 1 + 16711680 + 14535850 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Aluft Gianne + It's a tree gnome chef + + 3 + 3 + 3 + 3 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 13434879 + 14535901 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hudo glenfad + It's another jolly tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + 195 + -1 + -1 + -1 + -1 + 10 + -1 + + 1 + 16711680 + 14535850 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Irena + human + + 0 + 0 + 0 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + -1 + -1 + -1 + -1 + + 1 + 12285781 + 3 + 13415270 + 140 + 215 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mosol + A jungle warrior + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + 180 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 9461792 + 9461792 + 9461792 + 160 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome banker + It's tree gnome banker + + 3 + 3 + 3 + 3 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 1052688 + 1052688 + 36864 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + King Narnode Shareen + It's a gnome he look's important + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 150 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 16776960 + 16711424 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + UndeadOne + One of Rashaliyas Minions + + 80 + 59 + 59 + 50 + true + true + 30 + + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + + + Drucas + engraver + + 20 + 20 + 20 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + tourist + human + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + King Narnode Shareen + It's a gnome he look's important + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 150 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 16776960 + 16711424 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hazelmere + An ancient looking gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 192 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16776960 + 2280584 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Glough + An rough looking gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + 116 + 69 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 3158064 + 3158064 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shar + Concerned about the economy + b38c40 + 0 + 0 + 3 + 0 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 16761440 + 2 + 8409120 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shantay + human + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 1 + 8409120 + 8409120 + 11766848 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + charlie + Poor guy? + + 0 + 0 + 3 + 0 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 11766848 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome guard + A tree gnome guard + + 31 + 31 + 31 + 31 + true + false + 30 + + 6 + 1 + 2 + 98 + 180 + 175 + 22 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome pilot + He can fly the glider + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mehman + local + 805030 + 32 + 33 + 27 + 26 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ana + This lady doesn't look as if she belongs here. + + 17 + 15 + 16 + 18 + false + false + 30 + + 3 + 1 + 2 + -1 + -1 + -1 + 213 + 214 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 10056486 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Chaos Druid warrior + A crazy evil druid + + 48 + 42 + 40 + 48 + true + true + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 84 + 42 + -1 + -1 + -1 + -1 + + 1 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 464 + 1 + 20 + + + 566 + 1 + 10 + + + 220 + 1 + 100 + + + 188 + 1 + 10 + + + 28 + 1 + 10 + + + 40 + 1 + 50 + + + 42 + 1 + 50 + + + 41 + 1 + 50 + + + 46 + 1 + 50 + + + 38 + 1 + 50 + + + 619 + 1 + 50 + + + 443 + 1 + 50 + + + 442 + 1 + 60 + + + 441 + 1 + 70 + + + 440 + 1 + 80 + + + 439 + 1 + 90 + + + 438 + 1 + 100 + + + 437 + 1 + 110 + + + 436 + 1 + 120 + + + 435 + 1 + 130 + + + 165 + 1 + 140 + + + + + Gnome pilot + He can fly the glider + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shipyard worker + He look's busy + + 48 + 42 + 40 + 48 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 3158064 + 8409120 + 8409120 + 11766848 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shipyard worker + He look's busy + + 48 + 42 + 40 + 48 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 3158064 + 8409120 + 8409120 + 11766848 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shipyard worker + He look's busy + + 48 + 42 + 40 + 48 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 10 + -1 + + 3158064 + 8409120 + 8409120 + 7360528 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shipyard foreman + He look's busy + + 60 + 60 + 59 + 69 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 22 + -1 + 46 + -1 + -1 + -1 + + 3158064 + 8409120 + 8409120 + 7360528 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shipyard foreman + He look's busy + + 60 + 60 + 59 + 69 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 22 + -1 + 46 + -1 + -1 + -1 + + 3158064 + 8409120 + 8409120 + 7360528 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome guard + A tree gnome guard + + 23 + 23 + 23 + 23 + true + false + 30 + + 6 + 1 + 2 + 98 + 180 + 175 + 22 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Femi + It's a little tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Femi + It's a little tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Anita + It's a little tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 193 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Glough + An rough looking gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + 116 + 69 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 3158064 + 3158064 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Salarin the twisted + A crazy evil druid + + 68 + 72 + 70 + 68 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 14483456 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Black Demon + A big scary jet black demon + + 195 + 168 + 160 + 150 + true + true + 30 + + 164 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 398 + 401 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + 404 + 1 + 4 + + + 400 + 1 + 4 + + + 93 + 1 + 4 + + + 646 + 42 + 6 + + + 403 + 1 + 6 + + + 75 + 1 + 6 + + + 542 + 1 + 3 + + + 527 + 1 + 20 + + + 408 + 1 + 30 + + + 130 + 1 + 40 + + + 174 + 1 + 70 + + + 154 + 1 + 80 + + + 518 + 30 + 3 + + + 520 + 30 + 3 + + + 10 + 3000 + 30 + + + 10 + 2000 + 70 + + + 10 + 1000 + 100 + + + 619 + 7 + 30 + + + 42 + 30 + 40 + + + 40 + 60 + 50 + + + 38 + 45 + 60 + + + 640 + 150 + 70 + + + 41 + 20 + 70 + + + + + Gnome pilot + He can fly the glider + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome pilot + He can fly the glider + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome pilot + He can fly the glider + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome pilot + He can fly the glider + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sigbert the Adventurer + A Warrior + + 55 + 60 + 52 + 58 + false + false + 30 + + 5 + 28 + 37 + -1 + 110 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Yanille Watchman + He watches out for invading ogres + pickpocket + 41 + 30 + 22 + 41 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Tower guard + He stops people going up the tower + + 41 + 30 + 22 + 41 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Trainer + He can advise on training + + 11 + 11 + 11 + 11 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Trainer + He can advise on training + + 11 + 11 + 11 + 11 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Trainer + He can advise on training + + 11 + 11 + 11 + 11 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Trainer + He can advise on training + pickpocket + 11 + 11 + 11 + 11 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Blurberry barman + He serves cocktails + pickpocket + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16776960 + 16711424 + 36864 + 90 + 120 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome waiter + He can serve you gnome food + pickpocket + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16777164 + 3158064 + 36864 + 90 + 120 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome guard + A tree gnome guard + pickpocket + 31 + 31 + 31 + 17 + true + false + 30 + + 6 + 1 + 2 + 98 + 106 + 175 + 22 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome child + that's a little gnome + pickpocket + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 192 + 198 + 189 + -1 + 204 + -1 + -1 + + 1 + 16776960 + 16711680 + 36864 + 80 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Earth warrior + A strange inhuman warrior + + 52 + 51 + 54 + 54 + true + false + 30 + + 7 + 1 + 2 + 97 + 47 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 6724027 + 7356448 + 7356448 + 9461792 + 150 + 250 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome child + He's a little fellow + pickpocket + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 191 + 200 + 186 + -1 + 207 + -1 + -1 + + 1 + 16711935 + 65280 + 36864 + 80 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome child + hello little gnome + pickpocket + 3 + 3 + 3 + 3 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 193 + 196 + 188 + -1 + 203 + -1 + -1 + + 1 + 16711884 + 255 + 36864 + 80 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gulluck + He sells weapons + + 10 + 11 + 11 + 11 + false + false + 30 + + 6 + 1 + 2 + 116 + 116 + 69 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 3158064 + 3158064 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gunnjorn + Not civilised looking + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Zadimus + Ghostly Visage of the dead Zadimus + + 0 + 0 + 0 + 0 + false + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + + Brimstail + An ancient looking gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 192 + -1 + -1 + -1 + -1 + -1 + 62 + + 1 + 16776960 + 2280584 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome child + He's a little fellow + pickpocket + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 195 + 198 + 190 + -1 + 205 + -1 + -1 + + 1 + 16711884 + 255 + 36864 + 80 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome local + A tree gnome villager + pickpocket + 9 + 9 + 9 + 9 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome local + A tree gnome villager + pickpocket + 3 + 3 + 3 + 3 + true + false + 30 + + 3 + 4 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 8409120 + 8409120 + 36864 + 90 + 120 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Moss Giant + his beard seems to have a life of its own + + 62 + 61 + 60 + 65 + true + true + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7838054 + 8409120 + 8409120 + 14483408 + 261 + 396 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + 10 + 200 + 50 + + + 430 + 1 + 5 + + + 432 + 1 + 5 + + + 88 + 1 + 20 + + + 248 + 1 + 5 + + + 38 + 2 + 8 + + + 40 + 2 + 8 + + + 41 + 2 + 8 + + + 42 + 2 + 8 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 7798801 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Goalie + A gnome ball goal catcher + + 70 + 70 + 70 + 70 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 191 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16728064 + 16728064 + 36864 + 100 + 120 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 10027110 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 191 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 10027110 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 192 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 10027110 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 193 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 10027025 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Referee + He controls the game + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + 116 + 69 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 3158064 + 3158064 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 10027025 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16752704 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16752704 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16760880 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16760880 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16760880 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + A tree gnome ball player + tackle + 70 + 70 + 70 + 70 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16760880 + 8409120 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + He's on your team + pass to + 70 + 70 + 70 + 70 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16728064 + 16728064 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gnome Baller + He's on your team + pass to + 70 + 70 + 70 + 70 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16728064 + 16728064 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Cheerleader + It's a little tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16728064 + 16728064 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Cheerleader + It's a little tree gnome + + 3 + 3 + 3 + 3 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 175 + -1 + -1 + 46 + -1 + -1 + -1 + + 1 + 16728064 + 16728064 + 36864 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Nazastarool Zombie + One of Rashaliyas Minions + + 95 + 70 + 80 + 90 + true + false + 30 + + 135 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 261 + 388 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + + + Nazastarool Skeleton + One of Rashaliyas Minions + + 95 + 70 + 80 + 90 + true + false + 30 + + 134 + 133 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 259 + 281 + 11 + 11 + 12 + + + 20 + 1 + 0 + + + + + Nazastarool Ghost + One of Rashaliyas Minions + + 95 + 70 + 80 + 90 + true + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 302 + 365 + 9 + 9 + 5 + + + + Fernahei + An enthusiastic fishing shop owner + + 10 + 5 + 7 + 5 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + 10 + -1 + + 12632256 + 7296823 + 7296823 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jungle Banker + He can look after my money + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 201 + -1 + -1 + -1 + 10 + -1 + + 12632256 + 7296823 + 7296823 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Cart Driver + He drives the cart + + 15 + 16 + 12 + 18 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Cart Driver + He drives the cart + + 15 + 16 + 12 + 18 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 3158064 + 16777215 + 16777215 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Obli + An intelligent looking shop owner + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + 87 + -1 + -1 + -1 + 10 + + 10 + 3158064 + 7296823 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kaleb + This is Kaleb Paramaya - a warm and friendly inn owner + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + 10 + + 10 + 16752704 + 16777215 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Yohnus + This is Yohnus - he runs the local blacksmiths + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + 10 + + 10 + 16752704 + 16777215 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Serevel + This is Serevel - he sells tickets for the 'Lady of the Waves' + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 10 + 16752704 + 16777215 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Yanni + He sells fishing equipment. + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 83 + -1 + -1 + -1 + -1 + 10 + + 10 + 16777215 + 16711680 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Official + He helps the referee + + 3 + 3 + 3 + 3 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 10 + 1 + 0 + 0 + 100 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Koftik + The kings top tracker + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Koftik + The kings top tracker + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Koftik + The kings top tracker + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Koftik + The kings top tracker + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Blessed Vermen + A undead servent of iban + + 15 + 7 + 30 + 7 + true + false + 30 + + 123 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 115 + 45 + 7 + 7 + 10 + + + 20 + 1 + 0 + + + + + Blessed Spider + One of iban's eight legged friends + + 45 + 31 + 32 + 34 + true + true + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 180 + 156 + 6 + 6 + 5 + + + + Paladin + A paladin of Ardougne + + 85 + 55 + 57 + 88 + true + false + 30 + + 6 + 34 + 43 + 101 + 119 + -1 + -1 + -1 + -1 + -1 + -1 + 66 + + 16760880 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 300 + 50 + + + 97 + 1 + 1 + + + 527 + 1 + 1 + + + 470 + 1 + 6 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 154 + 1 + 2 + + + 72 + 1 + 7 + + + 158 + 1 + 3 + + + + + Paladin + A paladin of Ardougne + + 85 + 55 + 57 + 88 + true + false + 30 + + 5 + 34 + 43 + 101 + 119 + -1 + -1 + -1 + -1 + -1 + -1 + 66 + + 16760880 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 300 + 50 + + + 97 + 1 + 1 + + + 527 + 1 + 1 + + + 470 + 1 + 6 + + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 154 + 1 + 2 + + + 72 + 1 + 7 + + + 158 + 1 + 3 + + + + + slave + He seems possessed + + 17 + 15 + 16 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + slave + He seems possessed + + 17 + 15 + 16 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + slave + He seems to have been here a while + + 17 + 15 + 16 + 18 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + slave + He seems possessed + + 17 + 15 + 16 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + slave + He seems to have been here a while + + 17 + 15 + 16 + 18 + true + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16752704 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + slave + He seems possessed + + 17 + 15 + 16 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + slave + He seems to have been here a while + + 17 + 15 + 16 + 18 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777130 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kalrag + I think this is one of Ibans pets + + 88 + 69 + 78 + 78 + true + false + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 420 + 404 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Niloof + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 8409120 + 8409120 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kardia the Witch + She's got warts + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 78 + -1 + 88 + -1 + -1 + -1 + 63 + + 1 + 2 + 3 + 15523536 + 155 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Souless + He seems an empty shell + + 17 + 15 + 16 + 18 + true + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 8409120 + 8409120 + 16777215 + 100 + 200 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Othainian + big red and incredibly evil + + 78 + 78 + 78 + 78 + true + false + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 20 + 1 + 0 + + + + + Doomion + A big scary jet black demon + + 98 + 98 + 98 + 98 + true + false + 30 + + 164 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + + + Holthion + big red and incredibly evil + + 78 + 78 + 78 + 78 + true + false + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 20 + 1 + 0 + + + + + Klank + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 8409120 + 8409120 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Iban + You feel terror just looking at him + + 24 + 22 + 17 + 23 + false + false + 30 + + 18 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + 46 + 11 + -1 + -1 + + 1 + 2 + 3 + 4 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Koftik + The kings top tracker + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Goblin guard + An imposing green creature + + 48 + 51 + 43 + 51 + true + false + 30 + + 142 + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 285 + 268 + 9 + 8 + 7 + + + 20 + 1 + 0 + + + + + Observatory Professor + He works in the observatory + + 3 + 3 + 7 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + 9 + -1 + + 16777215 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ugthanki + A dangerous type of spitting camel that can temporarily blind an opponent. + + 45 + 45 + 45 + 45 + true + false + 30 + + 127 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 208 + 208 + 6 + 6 + 25 + + + 20 + 1 + 0 + + + + + Observatory assistant + The Professor's assistant + + 3 + 3 + 7 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16777215 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Souless + A servent to zamorak + + 23 + 28 + 24 + 23 + true + false + 30 + + 210 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 174 + 259 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + + + Dungeon spider + A nasty poisonous arachnid + + 25 + 20 + 35 + 10 + true + true + 30 + + 166 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 90 + 78 + 6 + 6 + 5 + + + + Kamen + A short angry guy + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 8409120 + 8409120 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Iban disciple + An evil follower of Iban + + 18 + 22 + 20 + 18 + true + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 84 + 90 + -1 + -1 + -1 + -1 + + 16761440 + 65535 + 255 + 15392466 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Koftik + The kings top tracker + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + 46 + -1 + -1 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Goblin + These goblins have grown strong + + 24 + 20 + 16 + 18 + true + false + 30 + + 142 + 139 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 219 + 206 + 9 + 8 + 5 + + + 20 + 1 + 0 + + + 10 + 10 + 30 + + + 192 + 1 + 1 + + + 827 + 1 + 3 + + + 124 + 1 + 4 + + + 273 + 1 + 10 + + + + + Chadwell + A sturdy looking gent + + 18 + 15 + 14 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + 46 + -1 + 10 + -1 + + 16768384 + 8409120 + 8409120 + 15523536 + 160 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Professor + The owner of the observatory + + 3 + 3 + 7 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + 9 + -1 + + 16777215 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + San Tojalon + The animated spirit of San Tojalon + + 120 + 120 + 120 + 120 + true + false + 30 + + -1 + -1 + -1 + 99 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 10056486 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ghost + A doomed victim of zamorak + + 33 + 33 + 20 + 30 + true + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + + + + Spirit of Scorpius + The undead spirit of the follower of Zamorak + + 100 + 100 + 100 + 100 + false + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + 20 + 1 + 0 + + + + + Scorpion + There are nasty scorpions around this grave + + 21 + 24 + 17 + 22 + false + false + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 121 + 69 + 7 + 7 + 45 + + + + Dark Mage + He works in the ways of dark magic + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + -1 + 84 + -1 + -1 + -1 + -1 + 68 + + 3158064 + 16763952 + 15609986 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mercenary + He seems to be guarding an area + + 48 + 60 + 60 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mercenary Captain + He's in control of the local guards. + watch + 48 + 80 + 80 + 48 + true + false + 30 + + 6 + 1 + 2 + -1 + 51 + 71 + 22 + -1 + -1 + -1 + -1 + 62 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mercenary + He seems to be guarding an area + + 48 + 30 + 48 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mining Slave + A chained slave forced to mine rocks. + + 17 + 15 + 16 + 18 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 213 + 214 + -1 + -1 + -1 + -1 + + 16777130 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Watchtower wizard + A learned man + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 77 + 76 + 81 + -1 + -1 + -1 + -1 + + 16777215 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ogre Shaman + An intelligent form of ogre + + 100 + 100 + 100 + 100 + false + false + 30 + + 7 + 1 + 2 + -1 + 122 + 75 + 21 + -1 + -1 + 11 + 79 + 83 + + 3381504 + 10027263 + 26367 + 26367 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10079385 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ogre guard + These ogres protect the city + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 114 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Ogre guard + These ogres protect the city + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 114 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Ogre guard + These ogres protect the city + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 119 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10066329 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10066329 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Og + The chieftan of this ogre tribe + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 119 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Grew + The chieftan of this ogre tribe + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 119 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Toban + The chieftan of this ogre tribe + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 119 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Gorad + A high ranking ogre official + + 92 + 53 + 80 + 90 + true + false + 30 + + 7 + 1 + 2 + -1 + 119 + 70 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Ogre guard + this creature looks very tough + + 98 + 99 + 99 + 90 + true + false + 30 + + 7 + 1 + 2 + -1 + 114 + -1 + 24 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 233 + 320 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Yanille Watchman + A captured guard of Yanille + + 41 + 30 + 22 + 41 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ogre merchant + He sells ogre-inspired items + + 72 + 33 + 60 + 70 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Ogre trader + He trades in metals + + 72 + 33 + 60 + 70 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Ogre trader + He trades in food + + 72 + 33 + 60 + 70 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Ogre trader + He trades in food + + 72 + 33 + 60 + 70 + false + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Mercenary + He seems to be guarding an area + + 48 + 30 + 48 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + City Guard + high ranking ogre guards + + 92 + 53 + 80 + 90 + false + false + 30 + + 7 + 1 + 2 + -1 + 119 + 70 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Mercenary + He seems to be guarding this area + + 48 + 30 + 48 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Lawgof + He guards the mines + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + 63 + + 7360576 + 3158064 + 3158064 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dwarf + A short angry guy + + 20 + 17 + 16 + 20 + true + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 3158064 + 3158064 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 106 + + + 31 + 5 + 21 + + + 32 + 5 + 21 + + + 33 + 5 + 21 + + + 34 + 5 + 21 + + + 35 + 5 + 21 + + + 160 + 1 + 10 + + + 11 + 7 + 53 + + + 173 + 1 + 31 + + + 171 + 1 + 63 + + + 170 + 1 + 85 + + + 169 + 1 + 159 + + + 168 + 1 + 63 + + + 156 + 1 + 106 + + + 269 + 1 + 212 + + + + + lollk + He looks scared + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 3158064 + 3158064 + 15523536 + 90 + 130 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10066329 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ogre guard + These ogres protect the city + + 92 + 53 + 80 + 90 + true + false + 30 + + 7 + 1 + 2 + -1 + 119 + -1 + 22 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 222 + 294 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Nulodion + He's the head of black guard weapon development + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + 63 + + 7360576 + 3158064 + 3158064 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dwarf + A short angry guy + + 20 + 17 + 16 + 20 + true + false + 30 + + 6 + 1 + 2 + -1 + 109 + 70 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 3158064 + 3158064 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 10 + 23 + 106 + + + 31 + 5 + 21 + + + 32 + 5 + 21 + + + 33 + 5 + 21 + + + 34 + 5 + 21 + + + 35 + 5 + 21 + + + 160 + 1 + 10 + + + 11 + 7 + 53 + + + 173 + 1 + 31 + + + 171 + 1 + 63 + + + 170 + 1 + 85 + + + 169 + 1 + 159 + + + 168 + 1 + 63 + + + 156 + 1 + 106 + + + 269 + 1 + 212 + + + + + Al Shabim + The leader of a nomadic Bedabin desert people - sometimes referred to as the 'Tenti's' + + 0 + 0 + 3 + 0 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + 154 + 85 + 86 + 155 + 211 + 80 + 215 + + 1 + 2105376 + 3 + 6307872 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bedabin Nomad + A Bedabin nomad - they live in the harshest extremes in the desert + + 0 + 0 + 3 + 0 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 1 + 2105376 + 3 + 6307872 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Captain Siad + He's in control of the whole mining camp. + + 48 + 48 + 48 + 48 + true + false + 30 + + 6 + 1 + 2 + -1 + 51 + 150 + 22 + -1 + -1 + -1 + -1 + 68 + + 1 + 16777215 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bedabin Nomad Guard + A Bedabin nomad guard - he's protecting something important + + 70 + 70 + 70 + 70 + true + false + 30 + + 5 + 1 + 2 + -1 + 48 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 1 + 2105376 + 3 + 6307872 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ogre citizen + A denizen of Gu'Tanoth + + 72 + 33 + 60 + 70 + true + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + + + Rock of ages + A huge boulder + + 150 + 150 + 150 + 150 + true + false + 30 + + 124 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 74 + 70 + 11 + 11 + 5 + + + 20 + 1 + 0 + + + + + Ogre + A large dim looking humanoid + + 72 + 33 + 60 + 70 + true + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 413 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10066329 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10066329 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Skavid + Servant race to the ogres + + 3 + 3 + 3 + 3 + false + false + 30 + + 7 + 1 + 2 + -1 + 117 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 629145 + 10066329 + 10066329 + 10066329 + 96 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Draft Mercenary Guard + He's quickly drafted in to deal with trouble makers + + 48 + 60 + 60 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mining Cart Driver + He drives the mining cart + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 16760880 + 16777215 + 16777215 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kolodion + He runs the mage arena + + 20 + 15 + 3 + 10 + false + false + 30 + + 6 + 1 + 2 + -1 + 122 + 70 + 76 + 81 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kolodion + He runs the mage arena + + 20 + 15 + 3 + 10 + true + false + 30 + + 6 + 1 + 2 + -1 + 122 + 70 + 76 + 81 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gertrude + A busy housewife + + 20 + 20 + 20 + 20 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 89 + -1 + -1 + -1 + -1 + + 16763992 + 15618286 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shilop + A young boisterous looking lad + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 14535800 + 11193464 + 3 + 15523536 + 100 + 140 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rowdy Guard + He looks as if he's spoiling for trouble + + 48 + 60 + 60 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + 70 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 14858776 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shantay Pass Guard + He seems to be guarding the Shantay Pass + + 32 + 32 + 32 + 32 + true + false + 30 + + 5 + 1 + 2 + -1 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 8421376 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rowdy Slave + A slave who's looking for trouble. + + 17 + 15 + 16 + 18 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 213 + 214 + -1 + -1 + -1 + -1 + + 16777130 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Shantay Pass Guard + He seems to be guarding the Shantay Pass + + 32 + 32 + 32 + 32 + false + false + 30 + + 5 + 1 + 2 + -1 + 49 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 11379585 + 8421376 + 11766848 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Assistant + He is an assistant to Shantay and helps him to run the pass. + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Desert Wolf + A vicious Desert wolf + + 30 + 32 + 34 + 31 + true + true + 30 + + 216 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 260 + 198 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Workman + This person is working on the site + pickpocket + 11 + 8 + 7 + 11 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + 11 + 10 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Examiner + As you examine the examiner you examine that she is indeed an examiner!! + + 1 + 1 + 5 + 1 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 15643488 + 255 + 3 + 15523536 + 140 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Student + A student busily digging! + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + 46 + 11 + -1 + -1 + + 1 + 16036851 + 3 + 15523536 + 130 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Student + A student busily digging! + + 20 + 20 + 20 + 20 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + 11 + -1 + -1 + + 1 + 52224 + 15658576 + 13415270 + 140 + 215 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guide + This person specialises in panning for gold + + 20 + 15 + 3 + 10 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + 11 + -1 + -1 + + 1 + 10053120 + 6697728 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Student + A student busily digging! + + 20 + 17 + 19 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + 11 + -1 + -1 + + 1 + 16737792 + 3 + 10053171 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Archaeological expert + An expert on archaeology! + + 20 + 20 + 3 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16777215 + 16711680 + 6697728 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + civillian + He looks aggitated! + + 20 + 17 + 19 + 18 + true + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + 11 + -1 + -1 + + 1 + 16737792 + 3 + 10053171 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + civillian + She looks aggitated! + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 88 + 46 + 11 + -1 + -1 + + 1 + 16036851 + 3 + 15523536 + 130 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + civillian + She looks aggitated! + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 16777215 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + civillian + He looks aggitated! + pickpocket + 15 + 16 + 12 + 18 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Murphy + The man in charge of the fishing trawler + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Murphy + The man in charge of the fishing trawler + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sir Radimus Erkle + A huge muscular man in charge of the Legends Guild + + 10 + 20 + 8 + 5 + false + false + 30 + + 6 + 1 + 41 + -1 + 52 + 74 + 25 + -1 + -1 + -1 + 80 + 68 + + 16777215 + 13415270 + 13415270 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Legends Guild Guard + This guard is protecting the entrance to the Legends Guild. + + 50 + 50 + 50 + 50 + false + false + 30 + + 5 + 1 + 2 + -1 + 180 + 72 + 23 + 94 + -1 + -1 + -1 + 215 + + 6307872 + 13415270 + 13415270 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Escaping Mining Slave + An emancipated slave with cool Desert Clothes. + + 17 + 15 + 16 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + 85 + 86 + -1 + 211 + -1 + -1 + + 16777130 + 8409120 + 8409120 + 15523536 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Workman + This person is working in the mine + pickpocket + 11 + 8 + 7 + 11 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + 11 + 10 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Murphy + The man in charge of the fishing trawler + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Echned Zekin + An evil spirit of the underworld. + + 50 + 50 + 50 + 50 + false + false + 30 + + 137 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 201 + 243 + 9 + 9 + 5 + + + 20 + 1 + 0 + + + + + Donovan the Handyman + It's the family odd jobs man + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Pierre the Dog Handler + It's the guy who looks after the family guard dog + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Hobbes the Butler + It's the family butler + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Louisa The Cook + It's the family cook + + 0 + 0 + 3 + 0 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + 8 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Mary The Maid + The family maid + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + 9 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Stanford The Gardener + It's the family Gardener + + 10 + 8 + 7 + 8 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Guard + He looks like he's in over his head here + + 31 + 30 + 22 + 31 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 71 + 22 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + 435 + 1 + 5 + + + 165 + 1 + 5 + + + 436 + 1 + 5 + + + 437 + 1 + 5 + + + 438 + 1 + 5 + + + 439 + 1 + 5 + + + 440 + 1 + 5 + + + 441 + 1 + 5 + + + 10 + 50 + 10 + + + 40 + 1 + 1 + + + 34 + 3 + 3 + + + 36 + 3 + 3 + + + 619 + 1 + 1 + + + 11 + 10 + 2 + + + 104 + 1 + 1 + + + 16 + 1 + 1 + + + + + Guard Dog + He doesn't seem pleased to see me + + 45 + 47 + 49 + 46 + false + false + 30 + + 159 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 247 + 188 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Guard + ***EMPTY PLEASE USE OR REPLACE*** + + 10 + 8 + 7 + 8 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 155 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Man + A thirsty looking man + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Anna Sinclair + The first child of the late Lord Sinclair + + 11 + 8 + 7 + 11 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 65280 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Bob Sinclair + The second child of the late Lord Sinclair + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Carol Sinclair + The third child of the late Lord Sinclair + + 11 + 8 + 7 + 11 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 255 + 16711680 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + David Sinclair + The fourth child of the late Lord Sinclair + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 65280 + 65280 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Elizabeth Sinclair + The fifth child of the late Lord Sinclair + + 11 + 8 + 7 + 11 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 65280 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Frank Sinclair + The sixth child of the late Lord Sinclair + + 11 + 8 + 7 + 11 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kolodion + He's a shape shifter + + 72 + 55 + 65 + 70 + true + false + 30 + + 7 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + 11 + -1 + -1 + + 11550752 + 6299664 + 6299664 + 10056486 + 212 + 280 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kolodion + He's a shape shifter + + 47 + 69 + 78 + 78 + true + false + 30 + + 125 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 420 + 404 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + kolodion + He's a shape shifter + + 58 + 28 + 78 + 23 + true + false + 30 + + 210 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 270 + 390 + 12 + 12 + 5 + + + 20 + 1 + 0 + + + + + kolodion + He's a shape shifter + + 105 + 85 + 107 + 98 + true + false + 30 + + 164 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 20 + 1 + 0 + + + + + Irvig Senay + The animated spirit of Irvig Senay + + 125 + 125 + 125 + 125 + true + false + 30 + + -1 + -1 + -1 + 100 + 50 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 10056486 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ranalph Devere + The animated spirit of Ranalph Devere + + 130 + 130 + 130 + 130 + true + false + 30 + + -1 + -1 + -1 + 102 + 52 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 10056486 + 120 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Poison Salesman + Peter Potter - Poison Purveyor + + 9 + 8 + 5 + 7 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16711680 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gujuo + A tall charismatic looking jungle native + + 60 + 60 + 60 + 60 + false + false + 30 + + 7 + 1 + 2 + 97 + 219 + -1 + 221 + 220 + -1 + -1 + -1 + -1 + + 0 + 9461792 + 9461792 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Jungle Forester + A woodsman who specialises in large and exotic timber + + 15 + 16 + 12 + 18 + false + false + 30 + + 5 + 1 + 2 + -1 + 108 + -1 + -1 + -1 + 46 + -1 + -1 + 65 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ungadulu + An ancient looking Shaman + + 75 + 75 + 75 + 75 + true + false + 30 + + 6 + 1 + 2 + 122 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 12632256 + 7296823 + 7296823 + 7296823 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Ungadulu + An ancient looking Shaman - he looks very strange with glowing red eyes... + + 75 + 75 + 75 + 75 + true + false + 30 + + 6 + 1 + 2 + 180 + -1 + -1 + 85 + 86 + -1 + -1 + -1 + -1 + + 16728064 + 7296823 + 7296823 + 7296823 + 148 + 224 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Death Wing + A supernatural creature of the underworld + + 80 + 80 + 80 + 80 + true + false + 30 + + 138 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 225 + 195 + 5 + 3 + 5 + + + 20 + 1 + 0 + + + + + Nezikchened + An ancient powerful Demon of the Underworld... + + 175 + 177 + 160 + 178 + true + false + 30 + + 164 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 358 + 341 + 11 + 11 + 30 + + + 181 + 1 + 0 + + + + + Dwarf Cannon engineer + He's the head of black guard weapon development + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + 63 + + 7360576 + 3158064 + 3158064 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Dwarf commander + He guards the mines + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + 63 + + 7360576 + 3158064 + 3158064 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Viyeldi + The spirit of a dead sorcerer + + 80 + 80 + 80 + 80 + true + false + 30 + + -1 + 1 + 2 + 122 + -1 + 77 + 76 + 81 + 155 + -1 + -1 + 64 + + 1 + 255 + 255 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Nurmof + He sells pickaxes + + 20 + 17 + 16 + 20 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 7360576 + 9465888 + 13393952 + 15523536 + 121 + 176 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Fatigue expert + He looks wide awake + + 10 + 10 + 13 + 8 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16760880 + 8409120 + 8409120 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Karamja Wolf + A hungry wolf + + 61 + 61 + 61 + 61 + true + true + 30 + + 222 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 260 + 198 + 6 + 10 + 30 + + + 20 + 1 + 0 + + + + + Jungle Savage + A savage and fearless Jungle warrior + + 100 + 60 + 90 + 100 + true + false + 30 + + 5 + 1 + 2 + -1 + 180 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 1 + 9461792 + 9461792 + 7360528 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Oomlie Bird + A variety of flightless jungle fowl - it has a sharp beak and a bad temper. + + 50 + 20 + 40 + 20 + true + false + 30 + + 223 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 70 + 62 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sidney Smith + Sidney Smith - Certification clerk + + 30 + 30 + 30 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 16711935 + 16744703 + 8404992 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Siegfried Erkle + An eccentric shop keeper - related to the Grand Vizier of the Legends Guild + + 35 + 25 + 10 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16753488 + 14518442 + 3 + 13415270 + 145 + 235 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Tea seller + He has delicious tea to buy + + 11 + 8 + 7 + 11 + false + false + 30 + + 5 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + 11 + -1 + -1 + + 1 + 2 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Wilough + A young son of gertrudes + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 14535800 + 11193464 + 3 + 15523536 + 100 + 120 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Philop + Gertrudes youngest + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 14535800 + 11193464 + 3 + 15523536 + 80 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Kanel + Gertrudes youngest's twin brother + + 0 + 0 + 3 + 0 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 14535800 + 11193464 + 3 + 15523536 + 80 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + chamber guardian + He hasn't seen much sun latley + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Sir Radimus Erkle + A huge muscular man in charge of the Legends Guild + + 10 + 20 + 8 + 5 + false + false + 30 + + 6 + 1 + 41 + -1 + 52 + 74 + 25 + -1 + -1 + -1 + 80 + 68 + + 16777215 + 13415270 + 13415270 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Pit Scorpion + Very vicious little scorpions + + 33 + 30 + 32 + 48 + true + true + 30 + + 143 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 121 + 69 + 7 + 7 + 45 + + + + Shadow Warrior + A sinsistar shadowy figure + + 61 + 68 + 67 + 61 + true + true + 30 + + 3 + 1 + 2 + 53 + -1 + -1 + 227 + -1 + -1 + 226 + -1 + -1 + + 1 + 2 + 3 + 4 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 1091 + 1 + 20 + + + 425 + 1 + 20 + + + 565 + 1 + 20 + + + 423 + 1 + 20 + + + 1092 + 1 + 20 + + + 216 + 1 + 20 + + + 33 + 45 + 20 + + + 46 + 3 + 10 + + + 38 + 2 + 20 + + + 619 + 2 + 10 + + + 173 + 1 + 20 + + + 157 + 1 + 10 + + + 158 + 1 + 10 + + + 159 + 1 + 10 + + + 160 + 1 + 10 + + + 526 + 1 + 5 + + + 527 + 1 + 5 + + + 10 + 7 + 55 + + + + + Fionella + She runs the legend's general store + + 35 + 25 + 10 + 30 + false + false + 30 + + 3 + 4 + 2 + -1 + -1 + -1 + -1 + 186 + -1 + 207 + -1 + -1 + + 16752704 + 3211263 + 3 + 13415270 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + 1091 + 1 + 10 + + + 10 + 32 + 400 + + + 425 + 1 + 40 + + + 565 + 1 + 30 + + + 1092 + 1 + 10 + + + 33 + 45 + 20 + + + 46 + 3 + 10 + + + 38 + 2 + 10 + + + 619 + 4 + 10 + + + 165 + 1 + 30 + + + 435 + 1 + 30 + + + 436 + 1 + 30 + + + 437 + 1 + 30 + + + 438 + 1 + 20 + + + 439 + 1 + 20 + + + 440 + 1 + 20 + + + 441 + 1 + 10 + + + 442 + 1 + 10 + + + 443 + 1 + 10 + + + 572 + 1 + 10 + + + 173 + 1 + 20 + + + 159 + 1 + 20 + + + 160 + 1 + 20 + + + 158 + 1 + 10 + + + 157 + 1 + 10 + + + -1 + -1 + 160 + + + + + Battle mage + He kills in the name of guthix + + 0 + 90 + 120 + 0 + true + false + 30 + + 6 + 1 + 2 + -1 + 122 + 192 + -1 + -1 + -1 + -1 + -1 + 65 + + 1 + 8413216 + 8409120 + 36864 + 100 + 150 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Battle mage + He kills in the name of zamarok + + 0 + 90 + 120 + 0 + true + false + 30 + + 6 + 1 + 2 + -1 + 209 + -1 + 82 + 88 + -1 + -1 + -1 + 62 + + 1 + 2 + 3 + 16776944 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Battle mage + He kills in the name of Saradomin + + 0 + 90 + 120 + 0 + true + false + 30 + + 6 + 1 + 2 + -1 + 218 + -1 + 85 + 86 + -1 + -1 + -1 + 64 + + 3158064 + 16763952 + 15609986 + 9461792 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Gundai + He must get lonely out here + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Lundail + He sells rune stones + + 15 + 16 + 12 + 18 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + 46 + -1 + -1 + -1 + + 11167296 + 8409120 + 3 + 13415270 + 145 + 230 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Rick + He runs a flax exchange store + + 30 + 30 + 30 + 30 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + -1 + 45 + -1 + -1 + -1 + -1 + -1 + + 16772761 + 16711680 + 14508096 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Edde + He trades in herblaw supplies + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Grim Reaper + Boo + + 32 + 33 + 27 + 26 + false + false + 30 + + 3 + 1 + 2 + -1 + 228 + 185 + 82 + 88 + 171 + 11 + 46 + -1 + + 16746544 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + + Baby Red Dragon + Young but still dangerous + + 60 + 60 + 60 + 60 + true + true + 30 + + 230 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + -1 + + 0 + 0 + 0 + 0 + 226 + 163 + 10 + 7 + 30 + + + 413 + 1 + 0 + + + -1 + -1 + 1000 + + + + + Santa + Wow it's Santa! + + 32 + 33 + 27 + 26 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + 239 + 208 + 238 + -1 + -1 + -1 + -1 + + 16777215 + 0 + 0 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + + Farrel + It's Santa's only good Elf! + + 3 + 3 + 3 + 3 + false + false + 30 + + 0 + 1 + 2 + -1 + -1 + 194 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16777164 + 3158064 + 36864 + 90 + 120 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + + Elf + It's one of Santa's evil elves! + + 5 + 5 + 60 + 40 + true + false + 10 + + 0 + 1 + 2 + -1 + -1 + 175 + -1 + -1 + -1 + -1 + -1 + -1 + + 1 + 16711680 + 14535850 + 36864 + 75 + 100 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + + Evil Dark Knight Wizard + He looks very unhappy + + 15 + 15 + 12 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + + Event Master + He has boxes! + + 15 + 15 + 12 + 12 + false + false + 30 + + 6 + 1 + 2 + -1 + -1 + -1 + 82 + 88 + -1 + -1 + -1 + -1 + + 1 + 2 + 3 + 15523536 + 145 + 220 + 6 + 6 + 5 + + + 20 + 1 + 0 + + + + diff --git a/GameServer/conf/server/defs/NPCDef.xml.gz b/GameServer/conf/server/defs/NPCDef.xml.gz new file mode 100644 index 0000000..47d6f1c Binary files /dev/null and b/GameServer/conf/server/defs/NPCDef.xml.gz differ diff --git a/GameServer/conf/server/defs/PrayerDef.xml.gz b/GameServer/conf/server/defs/PrayerDef.xml.gz new file mode 100644 index 0000000..07f1c16 Binary files /dev/null and b/GameServer/conf/server/defs/PrayerDef.xml.gz differ diff --git a/GameServer/conf/server/defs/SpellDef.xml.gz b/GameServer/conf/server/defs/SpellDef.xml.gz new file mode 100644 index 0000000..284a927 Binary files /dev/null and b/GameServer/conf/server/defs/SpellDef.xml.gz differ diff --git a/GameServer/conf/server/defs/TileDef.xml.gz b/GameServer/conf/server/defs/TileDef.xml.gz new file mode 100644 index 0000000..81f9962 Binary files /dev/null and b/GameServer/conf/server/defs/TileDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/AgilityCourseDef.xml b/GameServer/conf/server/defs/extras/AgilityCourseDef.xml new file mode 100644 index 0000000..4d61c33 --- /dev/null +++ b/GameServer/conf/server/defs/extras/AgilityCourseDef.xml @@ -0,0 +1,14 @@ + + + 655 + + 692 + 495 + 654 + 683 + 497 + 45 + Gnome Stronghold + + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/extras/AgilityCourseDef.xml.gz b/GameServer/conf/server/defs/extras/AgilityCourseDef.xml.gz new file mode 100644 index 0000000..6b5f8b7 Binary files /dev/null and b/GameServer/conf/server/defs/extras/AgilityCourseDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/AgilityDef.xml b/GameServer/conf/server/defs/extras/AgilityDef.xml new file mode 100644 index 0000000..4a19ff2 --- /dev/null +++ b/GameServer/conf/server/defs/extras/AgilityDef.xml @@ -0,0 +1,2 @@ + + diff --git a/GameServer/conf/server/defs/extras/AgilityDef.xml.bak b/GameServer/conf/server/defs/extras/AgilityDef.xml.bak new file mode 100644 index 0000000..e5833bf --- /dev/null +++ b/GameServer/conf/server/defs/extras/AgilityDef.xml.bak @@ -0,0 +1,72 @@ + + + 655 + + 692 + 495 + 692 + 499 + false + 1 + 8 + 1 + You climb onto the logs... + + + + 653 + + 685 + 502 + 685 + 501 + false + 1 + 8 + 2 + You climb onto the net... + + + + 653 + + 683 + 502 + 683 + 501 + false + 1 + 8 + 2 + You climb onto the net... + + + + 653 + + 681 + 502 + 681 + 501 + false + 1 + 8 + 2 + You climb onto the net... + + + + 654 + + 683 + 497 + 683 + 494 + false + 1 + 8 + 3 + You climb into the pipe... + + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/extras/AgilityDef.xml.gz b/GameServer/conf/server/defs/extras/AgilityDef.xml.gz new file mode 100644 index 0000000..a369ae7 Binary files /dev/null and b/GameServer/conf/server/defs/extras/AgilityDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/FiremakingDef.xml.gz b/GameServer/conf/server/defs/extras/FiremakingDef.xml.gz new file mode 100644 index 0000000..21508b7 Binary files /dev/null and b/GameServer/conf/server/defs/extras/FiremakingDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemAffectedTypes.xml.gz b/GameServer/conf/server/defs/extras/ItemAffectedTypes.xml.gz new file mode 100644 index 0000000..3dccef0 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemAffectedTypes.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemArrowHeadDef.xml.gz b/GameServer/conf/server/defs/extras/ItemArrowHeadDef.xml.gz new file mode 100644 index 0000000..3697b26 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemArrowHeadDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemBowStringDef.xml.gz b/GameServer/conf/server/defs/extras/ItemBowStringDef.xml.gz new file mode 100644 index 0000000..6b0bc3c Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemBowStringDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemCookingDef.xml.gz b/GameServer/conf/server/defs/extras/ItemCookingDef.xml.gz new file mode 100644 index 0000000..1c3caf6 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemCookingDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemCraftingDef.xml.gz b/GameServer/conf/server/defs/extras/ItemCraftingDef.xml.gz new file mode 100644 index 0000000..9f504ac Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemCraftingDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemDartTipDef.xml.gz b/GameServer/conf/server/defs/extras/ItemDartTipDef.xml.gz new file mode 100644 index 0000000..1efdb46 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemDartTipDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemEdibleHeals.xml.gz b/GameServer/conf/server/defs/extras/ItemEdibleHeals.xml.gz new file mode 100644 index 0000000..2bc8947 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemEdibleHeals.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemGemDef.xml.gz b/GameServer/conf/server/defs/extras/ItemGemDef.xml.gz new file mode 100644 index 0000000..1fc0792 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemGemDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemHerbDef.xml.gz b/GameServer/conf/server/defs/extras/ItemHerbDef.xml.gz new file mode 100644 index 0000000..0006f06 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemHerbDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemHerbSecond.xml.gz b/GameServer/conf/server/defs/extras/ItemHerbSecond.xml.gz new file mode 100644 index 0000000..21900c1 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemHerbSecond.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemLogCutDef.xml.gz b/GameServer/conf/server/defs/extras/ItemLogCutDef.xml.gz new file mode 100644 index 0000000..45616a6 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemLogCutDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemSmeltingDef.xml.gz b/GameServer/conf/server/defs/extras/ItemSmeltingDef.xml.gz new file mode 100644 index 0000000..0d88489 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemSmeltingDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemSmithingDef.xml.gz b/GameServer/conf/server/defs/extras/ItemSmithingDef.xml.gz new file mode 100644 index 0000000..ec7816d Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemSmithingDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemUnIdentHerbDef.xml.gz b/GameServer/conf/server/defs/extras/ItemUnIdentHerbDef.xml.gz new file mode 100644 index 0000000..88ed458 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemUnIdentHerbDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemWieldableDef.xml.gz b/GameServer/conf/server/defs/extras/ItemWieldableDef.xml.gz new file mode 100644 index 0000000..4573665 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemWieldableDef.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ItemWieldableDef_old.xml.gz b/GameServer/conf/server/defs/extras/ItemWieldableDef_old.xml.gz new file mode 100644 index 0000000..5549f55 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ItemWieldableDef_old.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/KeyChestLoot.xml b/GameServer/conf/server/defs/extras/KeyChestLoot.xml new file mode 100644 index 0000000..01fc8b6 --- /dev/null +++ b/GameServer/conf/server/defs/extras/KeyChestLoot.xml @@ -0,0 +1,94 @@ + + + + 408 + 3 + + + + + 369 + 5 + + + + + 518 + 20 + + + + + 517 + 30 + + + + + 526 + 1 + + + + + 527 + 1 + + + + + 10 + 750 + + + 527 + 1 + + + + + 10 + 2000 + + + + + 179 + 1 + + + + + 160 + 1 + + + 164 + 1 + + + 159 + 1 + + + 163 + 1 + + + 158 + 1 + + + 162 + 1 + + + 157 + 1 + + + 161 + 1 + + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/extras/KeyChestLoot.xml.gz b/GameServer/conf/server/defs/extras/KeyChestLoot.xml.gz new file mode 100644 index 0000000..7cc3a1e Binary files /dev/null and b/GameServer/conf/server/defs/extras/KeyChestLoot.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/NpcCerters.xml.gz b/GameServer/conf/server/defs/extras/NpcCerters.xml.gz new file mode 100644 index 0000000..2f21c2c Binary files /dev/null and b/GameServer/conf/server/defs/extras/NpcCerters.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ObjectFishing.xml b/GameServer/conf/server/defs/extras/ObjectFishing.xml new file mode 100644 index 0000000..c74d1d8 --- /dev/null +++ b/GameServer/conf/server/defs/extras/ObjectFishing.xml @@ -0,0 +1,173 @@ + + + 192 + + + + + 358 + 20 + 50 + + + 356 + 30 + 70 + + + 378 + 381 + + + + + 354 + 5 + 20 + + + 361 + 10 + 30 + + + 377 + 380 + + + + + 193 + + + + + 349 + 1 + 10 + + + 351 + 15 + 40 + + + 376 + -1 + + + + + 354 + 5 + 20 + + + 361 + 10 + 30 + + + 377 + 380 + + + + + 194 + + + + + 369 + 50 + 100 + + + 366 + 35 + 80 + + + 379 + -1 + + + + + 372 + 40 + 90 + + + 375 + -1 + + + + + + 376 + + + + + 372 + 40 + 90 + + + 375 + -1 + + + + + 369 + 50 + 100 + + + 366 + 35 + 80 + + + 379 + -1 + + + + + 557 + + + + + 369 + 50 + 100 + + + 366 + 35 + 80 + + + 379 + -1 + + + + + 372 + 40 + 90 + + + 375 + -1 + + + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/extras/ObjectFishing.xml.gz b/GameServer/conf/server/defs/extras/ObjectFishing.xml.gz new file mode 100644 index 0000000..9970eef Binary files /dev/null and b/GameServer/conf/server/defs/extras/ObjectFishing.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ObjectMining.xml b/GameServer/conf/server/defs/extras/ObjectMining.xml new file mode 100644 index 0000000..aaf9264 --- /dev/null +++ b/GameServer/conf/server/defs/extras/ObjectMining.xml @@ -0,0 +1,191 @@ + + + 176 + + 1 + 266 + 5 + 15 + + + + 100 + + 1 + 150 + 18 + 3 + + + + 101 + + 1 + 150 + 18 + 3 + + + + 102 + + 15 + 151 + 35 + 5 + + + + 103 + + 15 + 151 + 35 + 5 + + + + 104 + + 1 + 202 + 18 + 3 + + + + 105 + + 1 + 202 + 18 + 3 + + + + 106 + + 55 + 153 + 80 + 60 + + + + 107 + + 55 + 153 + 80 + 60 + + + + 108 + + 70 + 154 + 95 + 120 + + + + 109 + + 70 + 154 + 95 + 120 + + + + 110 + + 30 + 155 + 50 + 30 + + + + 111 + + 30 + 155 + 50 + 30 + + + + 112 + + 40 + 152 + 65 + 30 + + + + 113 + + 40 + 152 + 65 + 30 + + + + 114 + + 1 + 149 + 5 + 2 + + + + 115 + + 1 + 149 + 5 + 2 + + + + 195 + + 20 + 383 + 40 + 30 + + + + 196 + + 20 + 383 + 40 + 30 + + + + 210 + + 85 + 409 + 125 + 600 + + + + 211 + + 85 + 409 + 125 + 600 + + + diff --git a/GameServer/conf/server/defs/extras/ObjectMining.xml.gz b/GameServer/conf/server/defs/extras/ObjectMining.xml.gz new file mode 100644 index 0000000..54819d9 Binary files /dev/null and b/GameServer/conf/server/defs/extras/ObjectMining.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/ObjectWoodcutting.xml b/GameServer/conf/server/defs/extras/ObjectWoodcutting.xml new file mode 100644 index 0000000..7211f94 --- /dev/null +++ b/GameServer/conf/server/defs/extras/ObjectWoodcutting.xml @@ -0,0 +1,33 @@ + + + 0 + + 1 + 14 + 25 + 100 + 30 + + + + 1 + + 1 + 14 + 25 + 100 + 30 + + + + 70 + + 1 + 14 + 25 + 100 + 30 + + + + \ No newline at end of file diff --git a/GameServer/conf/server/defs/extras/ObjectWoodcutting.xml.gz b/GameServer/conf/server/defs/extras/ObjectWoodcutting.xml.gz new file mode 100644 index 0000000..1678b0c Binary files /dev/null and b/GameServer/conf/server/defs/extras/ObjectWoodcutting.xml.gz differ diff --git a/GameServer/conf/server/defs/extras/SpellAggressiveLvl.xml.gz b/GameServer/conf/server/defs/extras/SpellAggressiveLvl.xml.gz new file mode 100644 index 0000000..1099a0b Binary files /dev/null and b/GameServer/conf/server/defs/extras/SpellAggressiveLvl.xml.gz differ diff --git a/GameServer/conf/server/fonts.tar.gz b/GameServer/conf/server/fonts.tar.gz new file mode 100644 index 0000000..3e8472f Binary files /dev/null and b/GameServer/conf/server/fonts.tar.gz differ diff --git a/GameServer/conf/server/fonts/Hotmb___.ttf b/GameServer/conf/server/fonts/Hotmb___.ttf new file mode 100644 index 0000000..27e7f72 Binary files /dev/null and b/GameServer/conf/server/fonts/Hotmb___.ttf differ diff --git a/GameServer/conf/server/fonts/comic.ttf b/GameServer/conf/server/fonts/comic.ttf new file mode 100644 index 0000000..8237d1f Binary files /dev/null and b/GameServer/conf/server/fonts/comic.ttf differ diff --git a/GameServer/conf/server/fonts/impact.ttf b/GameServer/conf/server/fonts/impact.ttf new file mode 100644 index 0000000..87f8005 Binary files /dev/null and b/GameServer/conf/server/fonts/impact.ttf differ diff --git a/GameServer/conf/server/fonts_old/ARIALN.TTF b/GameServer/conf/server/fonts_old/ARIALN.TTF new file mode 100644 index 0000000..49bb696 Binary files /dev/null and b/GameServer/conf/server/fonts_old/ARIALN.TTF differ diff --git a/GameServer/conf/server/fonts_old/ARIALNB.TTF b/GameServer/conf/server/fonts_old/ARIALNB.TTF new file mode 100644 index 0000000..631931e Binary files /dev/null and b/GameServer/conf/server/fonts_old/ARIALNB.TTF differ diff --git a/GameServer/conf/server/fonts_old/ARIALNBI.TTF b/GameServer/conf/server/fonts_old/ARIALNBI.TTF new file mode 100644 index 0000000..4704de2 Binary files /dev/null and b/GameServer/conf/server/fonts_old/ARIALNBI.TTF differ diff --git a/GameServer/conf/server/fonts_old/ARIALNI.TTF b/GameServer/conf/server/fonts_old/ARIALNI.TTF new file mode 100644 index 0000000..1c42b10 Binary files /dev/null and b/GameServer/conf/server/fonts_old/ARIALNI.TTF differ diff --git a/GameServer/conf/server/fonts_old/arial.ttf b/GameServer/conf/server/fonts_old/arial.ttf new file mode 100644 index 0000000..ff0815c Binary files /dev/null and b/GameServer/conf/server/fonts_old/arial.ttf differ diff --git a/GameServer/conf/server/fonts_old/arialbd.ttf b/GameServer/conf/server/fonts_old/arialbd.ttf new file mode 100644 index 0000000..d0d857e Binary files /dev/null and b/GameServer/conf/server/fonts_old/arialbd.ttf differ diff --git a/GameServer/conf/server/fonts_old/arialbi.ttf b/GameServer/conf/server/fonts_old/arialbi.ttf new file mode 100644 index 0000000..00968d2 Binary files /dev/null and b/GameServer/conf/server/fonts_old/arialbi.ttf differ diff --git a/GameServer/conf/server/fonts_old/ariali.ttf b/GameServer/conf/server/fonts_old/ariali.ttf new file mode 100644 index 0000000..5b05d35 Binary files /dev/null and b/GameServer/conf/server/fonts_old/ariali.ttf differ diff --git a/GameServer/conf/server/fonts_old/ariblk.ttf b/GameServer/conf/server/fonts_old/ariblk.ttf new file mode 100644 index 0000000..951407a Binary files /dev/null and b/GameServer/conf/server/fonts_old/ariblk.ttf differ diff --git a/GameServer/conf/server/fonts_old/tahoma.ttf b/GameServer/conf/server/fonts_old/tahoma.ttf new file mode 100644 index 0000000..59b14a2 Binary files /dev/null and b/GameServer/conf/server/fonts_old/tahoma.ttf differ diff --git a/GameServer/conf/server/fonts_old/tahomabd.ttf b/GameServer/conf/server/fonts_old/tahomabd.ttf new file mode 100644 index 0000000..4dc2bcd Binary files /dev/null and b/GameServer/conf/server/fonts_old/tahomabd.ttf differ diff --git a/GameServer/conf/server/fonts_old/timesbi.ttf b/GameServer/conf/server/fonts_old/timesbi.ttf new file mode 100644 index 0000000..7444f84 Binary files /dev/null and b/GameServer/conf/server/fonts_old/timesbi.ttf differ diff --git a/GameServer/conf/server/fonts_old/timesi.ttf b/GameServer/conf/server/fonts_old/timesi.ttf new file mode 100644 index 0000000..28798d3 Binary files /dev/null and b/GameServer/conf/server/fonts_old/timesi.ttf differ diff --git a/GameServer/conf/server/fonts_old/verdana.ttf b/GameServer/conf/server/fonts_old/verdana.ttf new file mode 100644 index 0000000..8f25a64 Binary files /dev/null and b/GameServer/conf/server/fonts_old/verdana.ttf differ diff --git a/GameServer/conf/server/fonts_old/verdanab.ttf b/GameServer/conf/server/fonts_old/verdanab.ttf new file mode 100644 index 0000000..e4391be Binary files /dev/null and b/GameServer/conf/server/fonts_old/verdanab.ttf differ diff --git a/GameServer/conf/server/fonts_old/verdanai.ttf b/GameServer/conf/server/fonts_old/verdanai.ttf new file mode 100644 index 0000000..8542da3 Binary files /dev/null and b/GameServer/conf/server/fonts_old/verdanai.ttf differ diff --git a/GameServer/conf/server/fonts_old/verdanaz.ttf b/GameServer/conf/server/fonts_old/verdanaz.ttf new file mode 100644 index 0000000..476256a Binary files /dev/null and b/GameServer/conf/server/fonts_old/verdanaz.ttf differ diff --git a/GameServer/conf/server/locs/GameObjectLoc.xml b/GameServer/conf/server/locs/GameObjectLoc.xml new file mode 100644 index 0000000..bd6c4d2 --- /dev/null +++ b/GameServer/conf/server/locs/GameObjectLoc.xml @@ -0,0 +1,178126 @@ + + + 19 + 265 + 345 + 2 + 0 + + + 6 + 627 + 1705 + 0 + 0 + + + 391 + 125 + 648 + 0 + 0 + + + 376 + 368 + 682 + 0 + 0 + + + 359 + 150 + 1503 + 8 + 0 + + + 331 + 150 + 558 + 8 + 0 + + + + 26 + 132 + 506 + 1 + 0 + + + 1189 + 286 + 457 + 1 + 0 + + + 70 + 107 + 329 + 0 + 0 + + + 205 + 110 + 320 + 0 + 0 + + + 38 + 315 + 447 + 4 + 0 + + + 192 + 738 + 477 + 0 + 0 + + + 1 + 110 + 640 + 0 + 0 + + + 0 + 635 + 662 + 0 + 0 + + + 284 + 635 + 711 + 0 + 0 + + + 72 + 174 + 604 + 3 + 0 + + + 20 + 454 + 463 + 0 + 0 + + + 4 + 199 + 177 + 0 + 0 + + + 34 + 682 + 561 + 1 + 0 + + + 70 + 103 + 342 + 0 + 0 + + + 0 + 169 + 622 + 0 + 0 + + + 1079 + 512 + 550 + 2 + 0 + + + 306 + 757 + 465 + 0 + 0 + + + 284 + 661 + 683 + 2 + 0 + + + 1 + 326 + 540 + 3 + 1 + + + 21 + 598 + 471 + 0 + 0 + + + 70 + 243 + 145 + 0 + 0 + + + 284 + 663 + 681 + 2 + 0 + + + 3 + 319 + 659 + 0 + 0 + + + 205 + 131 + 269 + 0 + 0 + + + 7 + 323 + 545 + 2 + 0 + + + 1 + 523 + 598 + 0 + 0 + + + 306 + 495 + 569 + 0 + 0 + + + 525 + 693 + 508 + 6 + 0 + + + 0 + 762 + 462 + 0 + 0 + + + 20 + 267 + 132 + 6 + 0 + + + 70 + 125 + 282 + 0 + 0 + + + 113 + 618 + 842 + 3 + 0 + + + 1 + 577 + 542 + 2 + 0 + + + 313 + 749 + 470 + 3 + 0 + + + 284 + 665 + 679 + 2 + 0 + + + 4 + 229 + 154 + 0 + 0 + + + 70 + 154 + 229 + 0 + 0 + + + 1 + 593 + 709 + 0 + 1 + + + 34 + 452 + 692 + 6 + 0 + + + 22 + 652 + 540 + 2 + 0 + + + 96 + 139 + 507 + 6 + 0 + + + 309 + 548 + 447 + 0 + 0 + + + 309 + 545 + 445 + 0 + 0 + + + 309 + 544 + 450 + 0 + 0 + + + 76 + 80 + 441 + 2 + 0 + + + 15 + 252 + 140 + 0 + 0 + + + 72 + 175 + 601 + 3 + 0 + + + 597 + 724 + 432 + 4 + 0 + + + 34 + 679 + 665 + 0 + 0 + + + 597 + 719 + 435 + 6 + 0 + + + 938 + 661 + 741 + 2 + 0 + + + 284 + 628 + 719 + 0 + 0 + + + 110 + 282 + 373 + 0 + 0 + + + 70 + 213 + 331 + 0 + 0 + + + 284 + 669 + 675 + 2 + 0 + + + 38 + 97 + 364 + 0 + 0 + + + 597 + 746 + 472 + 2 + 0 + + + 205 + 307 + 115 + 0 + 0 + + + 20 + 151 + 467 + 0 + 0 + + + 145 + 283 + 2971 + 0 + 0 + + + 597 + 746 + 513 + 2 + 0 + + + 284 + 667 + 677 + 2 + 0 + + + 70 + 164 + 430 + 0 + 0 + + + 70 + 326 + 322 + 0 + 0 + + + 4 + 179 + 196 + 0 + 0 + + + 20 + 61 + 575 + 0 + 0 + + + 34 + 707 + 541 + 7 + 0 + + + 3 + 79 + 444 + 2 + 0 + + + 960 + 626 + 721 + 0 + 0 + + + 20 + 177 + 593 + 0 + 0 + + + 1180 + 541 + 707 + 4 + 0 + + + 205 + 316 + 111 + 0 + 0 + + + 309 + 550 + 445 + 0 + 0 + + + 21 + 271 + 649 + 2 + 0 + + + 597 + 672 + 524 + 6 + 0 + + + 283 + 607 + 857 + 7 + 0 + + + 70 + 234 + 150 + 0 + 0 + + + 25 + 455 + 687 + 0 + 0 + + + 284 + 633 + 713 + 0 + 0 + + + 12 + 688 + 656 + 1 + 0 + + + 217 + 133 + 264 + 0 + 0 + + + 70 + 114 + 308 + 0 + 0 + + + 0 + 668 + 468 + 0 + 0 + + + 16 + 321 + 548 + 2 + 0 + + + 36 + 722 + 433 + 2 + 0 + + + 72 + 175 + 600 + 3 + 0 + + + 446 + 623 + 614 + 4 + 0 + + + 13 + 105 + 672 + 0 + 0 + + + 1 + 112 + 630 + 0 + 0 + + + 36 + 337 + 522 + 0 + 0 + + + 70 + 173 + 408 + 0 + 0 + + + 34 + 690 + 710 + 2 + 0 + + + 284 + 657 + 687 + 2 + 0 + + + 204 + 677 + 565 + 0 + 0 + + + 4 + 182 + 193 + 0 + 0 + + + 7 + 618 + 619 + 5 + 0 + + + 70 + 233 + 303 + 0 + 0 + + + 1 + 159 + 444 + 0 + 0 + + + 34 + 646 + 484 + 0 + 0 + + + 3 + 131 + 1606 + 0 + 0 + + + 1 + 110 + 642 + 0 + 0 + + + 70 + 230 + 307 + 0 + 0 + + + 205 + 94 + 374 + 0 + 0 + + + 192 + 661 + 473 + 0 + 0 + + + 46 + 476 + 442 + 2 + 0 + + + 70 + 327 + 216 + 0 + 0 + + + 88 + 190 + 553 + 0 + 0 + + + 164 + 740 + 476 + 7 + 0 + + + 34 + 65 + 541 + 7 + 0 + + + 70 + 191 + 550 + 6 + 0 + + + 1164 + 606 + 516 + 6 + 0 + + + 20 + 150 + 471 + 0 + 0 + + + 70 + 296 + 355 + 0 + 0 + + + 111 + 614 + 459 + 0 + 0 + + + 72 + 176 + 597 + 3 + 0 + + + 70 + 247 + 286 + 0 + 0 + + + 284 + 624 + 674 + 0 + 0 + + + 70 + 90 + 391 + 0 + 0 + + + 110 + 278 + 379 + 4 + 0 + + + 4 + 257 + 273 + 0 + 0 + + + 100 + 619 + 841 + 2 + 0 + + + 24 + 279 + 630 + 0 + 0 + + + 25 + 613 + 1548 + 2 + 0 + + + 597 + 721 + 531 + 4 + 0 + + + 597 + 687 + 512 + 0 + 0 + + + 70 + 87 + 402 + 0 + 0 + + + 4 + 174 + 201 + 0 + 0 + + + 309 + 515 + 476 + 0 + 0 + + + 41 + 78 + 448 + 0 + 0 + + + 1102 + 540 + 709 + 6 + 0 + + + 72 + 175 + 602 + 3 + 0 + + + 0 + 628 + 829 + 1 + 0 + + + 34 + 81 + 432 + 4 + 0 + + + 34 + 630 + 496 + 2 + 0 + + + 7 + 79 + 443 + 4 + 0 + + + 37 + 150 + 468 + 2 + 0 + + + 597 + 672 + 465 + 6 + 0 + + + 15 + 465 + 672 + 4 + 0 + + + 70 + 200 + 351 + 0 + 0 + + + 72 + 559 + 559 + 3 + 0 + + + 0 + 713 + 537 + 1 + 0 + + + 394 + 570 + 738 + 0 + 0 + + + 965 + 622 + 787 + 6 + 0 + + + 284 + 632 + 714 + 2 + 0 + + + 729 + 722 + 625 + 0 + 0 + + + 70 + 193 + 546 + 0 + 0 + + + 70 + 159 + 220 + 0 + 0 + + + 205 + 119 + 294 + 0 + 0 + + + 16 + 590 + 713 + 0 + 0 + + + 705 + 294 + 119 + 4 + 0 + + + 72 + 176 + 599 + 3 + 0 + + + 284 + 626 + 672 + 0 + 0 + + + 402 + 609 + 741 + 1 + 0 + + + 307 + 736 + 478 + 0 + 0 + + + 238 + 266 + 661 + 0 + 0 + + + 110 + 276 + 382 + 4 + 0 + + + 34 + 755 + 466 + 3 + 0 + + + 1 + 658 + 744 + 7 + 0 + + + 524 + 693 + 451 + 0 + 0 + + + 70 + 224 + 630 + 2 + 0 + + + 1 + 155 + 453 + 2 + 0 + + + 34 + 415 + 506 + 1 + 0 + + + 1 + 276 + 637 + 0 + 1 + + + 3 + 322 + 546 + 2 + 0 + + + 285 + 472 + 445 + 6 + 0 + + + 284 + 655 + 689 + 2 + 0 + + + 34 + 163 + 647 + 0 + 0 + + + 145 + 308 + 571 + 0 + 0 + + + 70 + 267 + 395 + 0 + 0 + + + 70 + 197 + 178 + 0 + 0 + + + 33 + 451 + 693 + 2 + 0 + + + 4 + 65 + 539 + 7 + 0 + + + 12 + 105 + 669 + 0 + 0 + + + 205 + 171 + 205 + 0 + 0 + + + 1 + 254 + 138 + 0 + 1 + + + 0 + 610 + 512 + 0 + 0 + + + 402 + 65 + 536 + 0 + 0 + + + 70 + 260 + 134 + 0 + 0 + + + 45 + 107 + 657 + 4 + 0 + + + 70 + 174 + 404 + 0 + 0 + + + 70 + 303 + 232 + 0 + 0 + + + 1 + 261 + 541 + 1 + 1 + + + 38 + 184 + 382 + 0 + 0 + + + 0 + 608 + 856 + 7 + 0 + + + 54 + 608 + 692 + 1 + 0 + + + 70 + 147 + 237 + 0 + 0 + + + 34 + 749 + 511 + 3 + 0 + + + 36 + 351 + 698 + 0 + 0 + + + 597 + 723 + 432 + 4 + 0 + + + 0 + 106 + 663 + 0 + 0 + + + 70 + 125 + 279 + 0 + 0 + + + 23 + 596 + 706 + 6 + 0 + + + 34 + 719 + 681 + 1 + 0 + + + 70 + 298 + 236 + 0 + 0 + + + 98 + 666 + 469 + 2 + 0 + + + 191 + 570 + 548 + 2 + 0 + + + 0 + 621 + 503 + 0 + 0 + + + 70 + 185 + 569 + 6 + 0 + + + 428 + 682 + 458 + 4 + 0 + + + 0 + 307 + 460 + 0 + 0 + + + 0 + 520 + 404 + 0 + 0 + + + 285 + 525 + 595 + 0 + 0 + + + 1 + 213 + 663 + 0 + 0 + + + 5 + 136 + 517 + 1 + 0 + + + 34 + 686 + 513 + 2 + 0 + + + 297 + 427 + 492 + 6 + 0 + + + 70 + 252 + 279 + 0 + 0 + + + 34 + 585 + 837 + 7 + 0 + + + 72 + 176 + 598 + 3 + 0 + + + 1 + 718 + 682 + 1 + 0 + + + 29 + 278 + 632 + 6 + 0 + + + 1 + 156 + 451 + 0 + 0 + + + 1 + 250 + 565 + 0 + 0 + + + 1 + 164 + 642 + 0 + 0 + + + 1 + 161 + 654 + 0 + 0 + + + 0 + 524 + 401 + 0 + 0 + + + 38 + 87 + 401 + 0 + 0 + + + 70 + 109 + 320 + 0 + 0 + + + 1 + 717 + 683 + 0 + 0 + + + 0 + 171 + 616 + 0 + 0 + + + 1 + 113 + 623 + 0 + 0 + + + 284 + 466 + 451 + 2 + 0 + + + 597 + 697 + 505 + 2 + 0 + + + 34 + 125 + 563 + 7 + 0 + + + 220 + 276 + 255 + 2 + 0 + + + 395 + 660 + 742 + 0 + 0 + + + 63 + 467 + 450 + 6 + 0 + + + 59 + 177 + 595 + 2 + 0 + + + 284 + 482 + 436 + 2 + 0 + + + 283 + 458 + 684 + 4 + 0 + + + 34 + 590 + 831 + 2 + 0 + + + 300 + 414 + 509 + 0 + 0 + + + 283 + 607 + 743 + 4 + 0 + + + 4 + 289 + 242 + 0 + 0 + + + 34 + 676 + 520 + 2 + 0 + + + 72 + 174 + 601 + 3 + 0 + + + 34 + 732 + 522 + 3 + 0 + + + 1 + 112 + 624 + 4 + 0 + + + 70 + 144 + 248 + 0 + 0 + + + 34 + 678 + 462 + 3 + 0 + + + 1 + 53 + 674 + 1 + 1 + + + 63 + 81 + 441 + 2 + 0 + + + 3 + 322 + 545 + 2 + 0 + + + 1 + 136 + 514 + 2 + 1 + + + 0 + 158 + 662 + 0 + 0 + + + 70 + 107 + 334 + 0 + 0 + + + 70 + 308 + 227 + 0 + 0 + + + 70 + 207 + 173 + 0 + 0 + + + 284 + 624 + 673 + 2 + 0 + + + 0 + 719 + 682 + 1 + 0 + + + 284 + 638 + 707 + 2 + 0 + + + 1 + 573 + 667 + 0 + 0 + + + 205 + 599 + 753 + 0 + 0 + + + 34 + 699 + 503 + 2 + 0 + + + 0 + 618 + 507 + 0 + 0 + + + 1 + 213 + 659 + 0 + 0 + + + 0 + 684 + 514 + 1 + 0 + + + 8 + 280 + 627 + 0 + 0 + + + 70 + 299 + 234 + 0 + 0 + + + 72 + 175 + 598 + 3 + 0 + + + 3 + 79 + 453 + 0 + 0 + + + 70 + 84 + 426 + 0 + 0 + + + 38 + 168 + 213 + 0 + 0 + + + 26 + 147 + 476 + 0 + 0 + + + 70 + 182 + 575 + 6 + 0 + + + 0 + 514 + 549 + 2 + 0 + + + 36 + 337 + 521 + 0 + 0 + + + 34 + 469 + 668 + 0 + 0 + + + 0 + 680 + 517 + 1 + 0 + + + 72 + 173 + 605 + 3 + 0 + + + 70 + 179 + 200 + 0 + 0 + + + 37 + 248 + 566 + 0 + 0 + + + 284 + 665 + 678 + 2 + 0 + + + 219 + 278 + 252 + 0 + 0 + + + 72 + 173 + 604 + 3 + 0 + + + 34 + 647 + 484 + 0 + 0 + + + 1 + 617 + 844 + 7 + 0 + + + 4 + 93 + 383 + 0 + 0 + + + 215 + 134 + 266 + 3 + 0 + + + 0 + 330 + 639 + 0 + 0 + + + 192 + 662 + 473 + 0 + 0 + + + 216 + 133 + 268 + 2 + 0 + + + 1 + 78 + 457 + 0 + 0 + + + 36 + 736 + 519 + 1 + 0 + + + 20 + 270 + 132 + 0 + 0 + + + 70 + 216 + 165 + 0 + 0 + + + 38 + 99 + 360 + 0 + 0 + + + 70 + 213 + 329 + 0 + 0 + + + 70 + 180 + 198 + 0 + 0 + + + 70 + 162 + 220 + 0 + 0 + + + 0 + 601 + 521 + 0 + 0 + + + 20 + 151 + 464 + 0 + 0 + + + 70 + 157 + 227 + 0 + 0 + + + 284 + 625 + 672 + 0 + 0 + + + 1177 + 517 + 546 + 2 + 0 + + + 4 + 286 + 245 + 0 + 0 + + + 16 + 320 + 548 + 2 + 0 + + + 284 + 663 + 680 + 0 + 0 + + + 68 + 588 + 834 + 2 + 0 + + + 36 + 598 + 472 + 0 + 0 + + + 284 + 594 + 759 + 0 + 0 + + + 4 + 718 + 683 + 1 + 0 + + + 70 + 235 + 298 + 0 + 0 + + + 70 + 279 + 251 + 1 + 0 + + + 306 + 718 + 532 + 2 + 0 + + + 0 + 286 + 491 + 4 + 0 + + + 597 + 746 + 512 + 2 + 0 + + + 1 + 614 + 684 + 0 + 1 + + + 72 + 175 + 597 + 3 + 0 + + + 205 + 633 + 836 + 1 + 0 + + + 12 + 105 + 667 + 0 + 0 + + + 0 + 620 + 505 + 0 + 0 + + + 7 + 344 + 713 + 6 + 0 + + + 34 + 416 + 507 + 1 + 0 + + + 38 + 166 + 215 + 0 + 0 + + + 597 + 725 + 432 + 4 + 0 + + + 37 + 715 + 686 + 4 + 0 + + + 183 + 351 + 699 + 0 + 0 + + + 70 + 246 + 425 + 0 + 0 + + + 0 + 665 + 471 + 0 + 0 + + + 284 + 636 + 709 + 0 + 0 + + + 13 + 105 + 668 + 0 + 0 + + + 22 + 675 + 566 + 2 + 0 + + + 37 + 716 + 685 + 4 + 0 + + + 283 + 620 + 840 + 6 + 0 + + + 284 + 671 + 672 + 0 + 0 + + + 70 + 175 + 204 + 0 + 0 + + + 220 + 275 + 255 + 4 + 0 + + + 70 + 238 + 150 + 0 + 0 + + + 965 + 624 + 786 + 6 + 0 + + + 38 + 241 + 291 + 0 + 0 + + + 70 + 169 + 211 + 0 + 0 + + + 4 + 197 + 181 + 0 + 0 + + + 70 + 195 + 536 + 0 + 0 + + + 284 + 669 + 674 + 0 + 0 + + + 193 + 599 + 471 + 3 + 1 + + + 406 + 346 + 507 + 3 + 0 + + + 45 + 107 + 655 + 0 + 0 + + + 284 + 667 + 676 + 2 + 0 + + + 36 + 342 + 513 + 0 + 0 + + + 597 + 672 + 466 + 6 + 0 + + + 70 + 188 + 556 + 6 + 0 + + + 205 + 123 + 290 + 0 + 0 + + + 11 + 275 + 638 + 0 + 0 + + + 183 + 348 + 705 + 0 + 0 + + + 209 + 82 + 433 + 3 + 0 + + + 70 + 208 + 335 + 0 + 0 + + + 34 + 451 + 694 + 6 + 0 + + + 70 + 281 + 248 + 0 + 0 + + + 70 + 315 + 333 + 0 + 0 + + + 526 + 691 + 453 + 0 + 0 + + + 597 + 697 + 504 + 2 + 0 + + + 1 + 470 + 666 + 0 + 0 + + + 306 + 714 + 492 + 1 + 0 + + + 34 + 694 + 551 + 1 + 0 + + + 1 + 65 + 546 + 0 + 0 + + + 38 + 327 + 213 + 0 + 0 + + + 70 + 146 + 243 + 0 + 0 + + + 147 + 316 + 666 + 0 + 0 + + + 70 + 335 + 313 + 0 + 0 + + + 191 + 568 + 551 + 2 + 0 + + + 58 + 659 + 533 + 0 + 0 + + + 597 + 686 + 512 + 0 + 0 + + + 0 + 426 + 494 + 6 + 0 + + + 284 + 657 + 686 + 2 + 0 + + + 70 + 223 + 159 + 0 + 0 + + + 45 + 106 + 657 + 4 + 0 + + + 70 + 286 + 124 + 0 + 0 + + + 70 + 271 + 257 + 0 + 0 + + + 36 + 169 + 621 + 0 + 0 + + + 77 + 463 + 676 + 0 + 1 + + + 1 + 72 + 494 + 1 + 0 + + + 7 + 591 + 711 + 5 + 0 + + + 37 + 150 + 465 + 2 + 0 + + + 4 + 238 + 293 + 0 + 0 + + + 0 + 283 + 497 + 4 + 0 + + + 284 + 661 + 682 + 0 + 0 + + + 20 + 81 + 439 + 0 + 0 + + + 37 + 644 + 700 + 0 + 0 + + + 1 + 628 + 609 + 0 + 1 + + + 284 + 627 + 719 + 0 + 0 + + + 1 + 583 + 537 + 2 + 0 + + + 284 + 659 + 684 + 0 + 0 + + + 111 + 614 + 460 + 0 + 0 + + + 1 + 161 + 433 + 0 + 0 + + + 72 + 174 + 603 + 3 + 0 + + + 70 + 280 + 249 + 0 + 0 + + + 310 + 727 + 526 + 0 + 0 + + + 283 + 472 + 446 + 6 + 0 + + + 284 + 634 + 711 + 0 + 0 + + + 35 + 96 + 726 + 7 + 0 + + + 286 + 520 + 602 + 0 + 0 + + + 445 + 624 + 563 + 6 + 0 + + + 70 + 85 + 418 + 0 + 0 + + + 88 + 187 + 561 + 0 + 0 + + + 38 + 141 + 252 + 0 + 0 + + + 70 + 188 + 189 + 0 + 0 + + + 192 + 744 + 514 + 0 + 0 + + + 0 + 648 + 436 + 5 + 0 + + + 1 + 111 + 629 + 0 + 0 + + + 70 + 194 + 540 + 0 + 0 + + + 88 + 689 + 654 + 0 + 0 + + + 34 + 587 + 835 + 1 + 0 + + + 1 + 159 + 439 + 0 + 0 + + + 284 + 632 + 713 + 0 + 0 + + + 70 + 135 + 262 + 0 + 0 + + + 0 + 690 + 554 + 1 + 0 + + + 27 + 278 + 630 + 0 + 0 + + + 70 + 277 + 252 + 1 + 0 + + + 72 + 174 + 602 + 3 + 0 + + + 2 + 277 + 632 + 1 + 1 + + + 209 + 673 + 568 + 4 + 0 + + + 20 + 343 + 614 + 0 + 0 + + + 38 + 170 + 208 + 0 + 0 + + + 70 + 160 + 221 + 0 + 0 + + + 0 + 520 + 405 + 0 + 0 + + + 70 + 286 + 244 + 0 + 0 + + + 1 + 122 + 572 + 0 + 0 + + + 218 + 278 + 251 + 6 + 0 + + + 0 + 640 + 549 + 0 + 0 + + + 307 + 542 + 453 + 0 + 0 + + + 1 + 428 + 492 + 0 + 1 + + + 597 + 746 + 471 + 2 + 0 + + + 70 + 101 + 350 + 0 + 0 + + + 445 + 623 + 564 + 0 + 0 + + + 7 + 78 + 453 + 6 + 0 + + + 70 + 117 + 302 + 0 + 0 + + + 4 + 138 + 256 + 0 + 0 + + + 72 + 175 + 599 + 3 + 0 + + + 597 + 672 + 523 + 6 + 0 + + + 16 + 344 + 714 + 2 + 0 + + + 45 + 613 + 1547 + 2 + 0 + + + 26 + 461 + 457 + 2 + 0 + + + 274 + 607 + 579 + 4 + 0 + + + 205 + 139 + 255 + 0 + 0 + + + 70 + 176 + 397 + 0 + 0 + + + 34 + 708 + 540 + 4 + 0 + + + 597 + 720 + 531 + 4 + 0 + + + 70 + 86 + 412 + 0 + 0 + + + 283 + 464 + 454 + 0 + 0 + + + 70 + 284 + 246 + 0 + 0 + + + 4 + 328 + 213 + 0 + 0 + + + 278 + 449 + 697 + 0 + 0 + + + 70 + 108 + 328 + 0 + 0 + + + 70 + 152 + 233 + 0 + 0 + + + 45 + 543 + 704 + 4 + 0 + + + 0 + 308 + 457 + 0 + 0 + + + 34 + 110 + 635 + 4 + 0 + + + 1 + 596 + 525 + 0 + 0 + + + 4 + 199 + 178 + 0 + 0 + + + 5 + 501 + 564 + 0 + 0 + + + 70 + 111 + 319 + 0 + 0 + + + 5 + 743 + 473 + 0 + 0 + + + 70 + 211 + 331 + 0 + 0 + + + 20 + 222 + 472 + 0 + 0 + + + 7 + 322 + 544 + 4 + 0 + + + 70 + 177 + 200 + 0 + 0 + + + 284 + 511 + 553 + 0 + 0 + + + 284 + 466 + 452 + 2 + 0 + + + 284 + 482 + 437 + 2 + 0 + + + 1 + 133 + 525 + 1 + 1 + + + 0 + 710 + 495 + 0 + 0 + + + 284 + 655 + 688 + 2 + 0 + + + 0 + 306 + 457 + 0 + 0 + + + 70 + 100 + 363 + 0 + 0 + + + 34 + 153 + 694 + 4 + 0 + + + 7 + 110 + 650 + 0 + 0 + + + 70 + 250 + 286 + 0 + 0 + + + 35 + 52 + 698 + 0 + 0 + + + 34 + 699 + 546 + 1 + 0 + + + 1 + 155 + 685 + 6 + 0 + + + 70 + 295 + 360 + 0 + 0 + + + 273 + 435 + 481 + 2 + 0 + + + 72 + 177 + 600 + 3 + 0 + + + 70 + 134 + 271 + 0 + 0 + + + 70 + 178 + 204 + 3 + 0 + + + 0 + 669 + 466 + 0 + 0 + + + 46 + 465 + 450 + 2 + 0 + + + 38 + 734 + 520 + 2 + 0 + + + 70 + 211 + 339 + 0 + 0 + + + 1 + 248 + 564 + 0 + 0 + + + 70 + 285 + 251 + 0 + 0 + + + 183 + 348 + 701 + 0 + 0 + + + 70 + 318 + 334 + 0 + 0 + + + 1 + 515 + 545 + 1 + 1 + + + 34 + 54 + 673 + 2 + 0 + + + 306 + 503 + 558 + 0 + 0 + + + 70 + 319 + 333 + 0 + 0 + + + 1 + 587 + 531 + 2 + 0 + + + 399 + 484 + 644 + 1 + 0 + + + 70 + 167 + 217 + 0 + 0 + + + 1 + 157 + 455 + 0 + 0 + + + 70 + 141 + 257 + 0 + 0 + + + 5 + 731 + 522 + 4 + 0 + + + 192 + 659 + 473 + 0 + 0 + + + 110 + 610 + 460 + 2 + 0 + + + 20 + 144 + 496 + 0 + 0 + + + 45 + 542 + 704 + 4 + 0 + + + 220 + 278 + 257 + 2 + 0 + + + 4 + 212 + 337 + 0 + 0 + + + 13 + 106 + 674 + 0 + 0 + + + 284 + 640 + 707 + 0 + 0 + + + 72 + 176 + 603 + 3 + 0 + + + 283 + 482 + 434 + 2 + 0 + + + 1 + 65 + 558 + 0 + 0 + + + 70 + 176 + 206 + 3 + 0 + + + 13 + 693 + 653 + 1 + 0 + + + 191 + 572 + 545 + 2 + 0 + + + 1 + 547 + 513 + 0 + 0 + + + 70 + 131 + 277 + 0 + 0 + + + 13 + 107 + 668 + 0 + 0 + + + 284 + 632 + 716 + 2 + 0 + + + 206 + 666 + 633 + 6 + 0 + + + 0 + 636 + 490 + 6 + 0 + + + 313 + 752 + 467 + 3 + 0 + + + 37 + 581 + 845 + 6 + 0 + + + 70 + 199 + 533 + 0 + 0 + + + 219 + 304 + 119 + 4 + 0 + + + 70 + 301 + 238 + 0 + 0 + + + 284 + 631 + 717 + 0 + 0 + + + 70 + 218 + 166 + 0 + 0 + + + 0 + 627 + 497 + 2 + 0 + + + 597 + 616 + 797 + 2 + 0 + + + 36 + 341 + 513 + 0 + 0 + + + 1 + 115 + 623 + 0 + 0 + + + 34 + 685 + 455 + 3 + 0 + + + 70 + 208 + 174 + 0 + 0 + + + 0 + 517 + 405 + 0 + 0 + + + 0 + 685 + 557 + 1 + 0 + + + 398 + 668 + 735 + 3 + 0 + + + 36 + 152 + 698 + 4 + 0 + + + 0 + 439 + 477 + 0 + 0 + + + 310 + 678 + 518 + 0 + 0 + + + 70 + 182 + 199 + 0 + 0 + + + 0 + 766 + 498 + 3 + 0 + + + 38 + 141 + 256 + 0 + 0 + + + 3 + 517 + 543 + 0 + 0 + + + 70 + 269 + 394 + 0 + 0 + + + 1 + 106 + 675 + 1 + 1 + + + 38 + 267 + 397 + 0 + 0 + + + 34 + 590 + 832 + 3 + 0 + + + 1 + 78 + 463 + 0 + 0 + + + 32 + 447 + 697 + 4 + 0 + + + 55 + 610 + 691 + 0 + 0 + + + 3 + 592 + 712 + 1 + 0 + + + 4 + 223 + 321 + 0 + 0 + + + 26 + 461 + 454 + 2 + 0 + + + 884 + 728 + 579 + 0 + 0 + + + 284 + 454 + 461 + 6 + 0 + + + 34 + 718 + 489 + 2 + 0 + + + 34 + 171 + 620 + 0 + 0 + + + 1 + 611 + 510 + 0 + 0 + + + 72 + 177 + 599 + 3 + 0 + + + 13 + 660 + 578 + 6 + 0 + + + 55 + 117 + 612 + 0 + 0 + + + 70 + 251 + 144 + 0 + 0 + + + 4 + 179 + 400 + 0 + 0 + + + 3 + 110 + 651 + 0 + 0 + + + 205 + 154 + 465 + 0 + 0 + + + 1 + 158 + 451 + 0 + 0 + + + 597 + 672 + 522 + 6 + 0 + + + 12 + 107 + 666 + 0 + 0 + + + 283 + 608 + 858 + 7 + 0 + + + 34 + 67 + 538 + 7 + 0 + + + 205 + 183 + 197 + 0 + 0 + + + 70 + 135 + 267 + 0 + 0 + + + 46 + 476 + 439 + 2 + 0 + + + 1 + 112 + 636 + 0 + 0 + + + 0 + 638 + 661 + 0 + 0 + + + 1 + 303 + 577 + 0 + 1 + + + 70 + 227 + 159 + 0 + 0 + + + 36 + 153 + 696 + 4 + 0 + + + 70 + 151 + 239 + 0 + 0 + + + 1 + 242 + 440 + 0 + 0 + + + 70 + 176 + 405 + 0 + 0 + + + 666 + 499 + 563 + 0 + 0 + + + 20 + 75 + 481 + 0 + 0 + + + 0 + 631 + 556 + 0 + 0 + + + 313 + 716 + 490 + 3 + 0 + + + 9 + 613 + 688 + 0 + 0 + + + 206 + 676 + 565 + 5 + 0 + + + 284 + 638 + 709 + 0 + 0 + + + 193 + 418 + 500 + 0 + 0 + + + 70 + 184 + 196 + 0 + 0 + + + 12 + 515 + 474 + 5 + 0 + + + 709 + 305 + 118 + 4 + 0 + + + 597 + 685 + 512 + 0 + 0 + + + 524 + 703 + 443 + 2 + 0 + + + 1 + 608 + 628 + 0 + 0 + + + 284 + 667 + 678 + 2 + 0 + + + 70 + 298 + 357 + 0 + 0 + + + 34 + 251 + 558 + 0 + 0 + + + 70 + 201 + 179 + 0 + 0 + + + 37 + 714 + 687 + 4 + 0 + + + 72 + 177 + 601 + 3 + 0 + + + 284 + 629 + 719 + 0 + 0 + + + 1 + 257 + 140 + 1 + 1 + + + 284 + 669 + 676 + 2 + 0 + + + 446 + 623 + 563 + 2 + 0 + + + 70 + 262 + 406 + 0 + 0 + + + 70 + 165 + 218 + 0 + 0 + + + 1 + 214 + 1639 + 0 + 1 + + + 220 + 278 + 256 + 2 + 0 + + + 15 + 293 + 713 + 2 + 0 + + + 1 + 163 + 437 + 0 + 0 + + + 70 + 290 + 367 + 0 + 0 + + + 20 + 311 + 562 + 0 + 0 + + + 34 + 65 + 554 + 7 + 0 + + + 284 + 671 + 674 + 2 + 0 + + + 597 + 721 + 432 + 4 + 0 + + + 4 + 276 + 258 + 0 + 0 + + + 70 + 160 + 225 + 0 + 0 + + + 1 + 646 + 543 + 0 + 0 + + + 110 + 280 + 380 + 0 + 0 + + + 1 + 250 + 561 + 0 + 0 + + + 284 + 624 + 676 + 2 + 0 + + + 23 + 697 + 704 + 2 + 0 + + + 34 + 620 + 566 + 6 + 0 + + + 284 + 663 + 682 + 2 + 0 + + + 72 + 559 + 557 + 3 + 0 + + + 72 + 557 + 559 + 3 + 0 + + + 70 + 177 + 203 + 3 + 0 + + + 192 + 737 + 518 + 0 + 0 + + + 4 + 242 + 295 + 0 + 0 + + + 419 + 695 + 448 + 2 + 0 + + + 1101 + 540 + 707 + 6 + 0 + + + 72 + 176 + 604 + 3 + 0 + + + 70 + 210 + 171 + 0 + 0 + + + 285 + 472 + 443 + 6 + 0 + + + 4 + 313 + 228 + 0 + 0 + + + 3 + 590 + 715 + 0 + 0 + + + 63 + 313 + 558 + 2 + 0 + + + 12 + 107 + 667 + 0 + 0 + + + 51 + 426 + 3375 + 0 + 0 + + + 48 + 432 + 484 + 0 + 0 + + + 565 + 707 + 540 + 2 + 0 + + + 0 + 759 + 503 + 3 + 0 + + + 38 + 281 + 254 + 0 + 0 + + + 0 + 78 + 461 + 0 + 0 + + + 284 + 636 + 711 + 0 + 0 + + + 33 + 450 + 692 + 0 + 0 + + + 38 + 214 + 168 + 0 + 0 + + + 284 + 665 + 680 + 2 + 0 + + + 597 + 719 + 531 + 4 + 0 + + + 70 + 311 + 342 + 0 + 0 + + + 407 + 752 + 561 + 5 + 0 + + + 29 + 136 + 525 + 2 + 0 + + + 100 + 618 + 844 + 7 + 0 + + + 1 + 140 + 510 + 0 + 1 + + + 20 + 150 + 476 + 0 + 0 + + + 70 + 170 + 420 + 0 + 0 + + + 205 + 526 + 464 + 0 + 0 + + + 209 + 83 + 433 + 6 + 0 + + + 70 + 108 + 332 + 0 + 0 + + + 205 + 322 + 330 + 0 + 0 + + + 36 + 692 + 709 + 0 + 0 + + + 70 + 158 + 227 + 0 + 0 + + + 70 + 315 + 445 + 4 + 0 + + + 70 + 183 + 196 + 0 + 0 + + + 1 + 591 + 765 + 0 + 1 + + + 34 + 589 + 833 + 6 + 0 + + + 3 + 606 + 579 + 0 + 0 + + + 445 + 678 + 563 + 6 + 0 + + + 0 + 424 + 493 + 6 + 0 + + + 284 + 661 + 684 + 0 + 0 + + + 37 + 63 + 569 + 7 + 0 + + + 290 + 603 + 466 + 5 + 0 + + + 70 + 253 + 282 + 0 + 0 + + + 34 + 313 + 668 + 0 + 0 + + + 0 + 112 + 637 + 0 + 0 + + + 21 + 500 + 562 + 6 + 0 + + + 597 + 719 + 433 + 6 + 0 + + + 70 + 326 + 326 + 0 + 0 + + + 1 + 605 + 631 + 0 + 0 + + + 5 + 457 + 3352 + 2 + 0 + + + 7 + 614 + 687 + 4 + 0 + + + 33 + 60 + 598 + 0 + 0 + + + 4 + 195 + 184 + 0 + 0 + + + 0 + 638 + 488 + 6 + 0 + + + 283 + 705 + 697 + 0 + 0 + + + 309 + 519 + 471 + 2 + 0 + + + 19 + 304 + 690 + 2 + 0 + + + 965 + 622 + 790 + 6 + 0 + + + 597 + 615 + 799 + 4 + 0 + + + 72 + 175 + 604 + 3 + 0 + + + 1 + 616 + 507 + 0 + 0 + + + 1 + 119 + 1467 + 1 + 1 + + + 205 + 113 + 326 + 0 + 0 + + + 284 + 659 + 686 + 0 + 0 + + + 214 + 686 + 659 + 0 + 0 + + + 34 + 664 + 740 + 0 + 0 + + + 306 + 502 + 487 + 0 + 0 + + + 33 + 63 + 585 + 0 + 0 + + + 1 + 171 + 618 + 0 + 0 + + + 70 + 224 + 622 + 0 + 0 + + + 72 + 177 + 597 + 3 + 0 + + + 1 + 654 + 536 + 1 + 1 + + + 70 + 297 + 239 + 0 + 0 + + + 1 + 140 + 507 + 0 + 1 + + + 0 + 503 + 417 + 0 + 0 + + + 284 + 634 + 713 + 0 + 0 + + + 88 + 713 + 634 + 0 + 0 + + + 4 + 271 + 262 + 0 + 0 + + + 70 + 99 + 372 + 0 + 0 + + + 29 + 302 + 578 + 2 + 0 + + + 402 + 579 + 727 + 0 + 0 + + + 283 + 454 + 462 + 6 + 0 + + + 34 + 78 + 472 + 1 + 0 + + + 55 + 116 + 612 + 3 + 0 + + + 1 + 154 + 461 + 0 + 0 + + + 283 + 466 + 450 + 2 + 0 + + + 45 + 108 + 657 + 4 + 0 + + + 70 + 299 + 123 + 0 + 0 + + + 283 + 710 + 692 + 0 + 0 + + + 1 + 71 + 518 + 1 + 0 + + + 5 + 643 + 703 + 2 + 0 + + + 70 + 142 + 259 + 0 + 0 + + + 34 + 152 + 695 + 4 + 0 + + + 34 + 698 + 546 + 1 + 0 + + + 284 + 657 + 688 + 0 + 0 + + + 4 + 116 + 317 + 0 + 0 + + + 239 + 264 + 661 + 0 + 0 + + + 205 + 162 + 227 + 0 + 0 + + + 20 + 150 + 473 + 0 + 0 + + + 20 + 151 + 470 + 0 + 0 + + + 56 + 610 + 690 + 2 + 0 + + + 217 + 632 + 603 + 5 + 0 + + + 0 + 632 + 494 + 6 + 0 + + + 0 + 674 + 520 + 1 + 0 + + + 34 + 707 + 539 + 5 + 0 + + + 283 + 663 + 741 + 2 + 0 + + + 72 + 176 + 600 + 3 + 0 + + + 218 + 277 + 256 + 4 + 0 + + + 284 + 482 + 435 + 2 + 0 + + + 283 + 621 + 854 + 7 + 0 + + + 70 + 328 + 322 + 0 + 0 + + + 70 + 333 + 213 + 0 + 0 + + + 0 + 124 + 572 + 0 + 0 + + + 70 + 257 + 276 + 0 + 0 + + + 4 + 223 + 319 + 0 + 0 + + + 70 + 306 + 345 + 0 + 0 + + + 284 + 655 + 690 + 2 + 0 + + + 38 + 228 + 312 + 0 + 0 + + + 70 + 193 + 547 + 0 + 0 + + + 190 + 276 + 632 + 4 + 0 + + + 0 + 111 + 641 + 0 + 0 + + + 33 + 473 + 660 + 0 + 0 + + + 192 + 660 + 473 + 0 + 0 + + + 70 + 180 + 204 + 3 + 0 + + + 34 + 213 + 655 + 0 + 0 + + + 290 + 605 + 465 + 0 + 0 + + + 1 + 119 + 1466 + 0 + 1 + + + 34 + 583 + 843 + 6 + 0 + + + 33 + 53 + 692 + 0 + 0 + + + 306 + 764 + 459 + 0 + 0 + + + 1 + 612 + 573 + 0 + 1 + + + 884 + 726 + 580 + 0 + 0 + + + 38 + 319 + 115 + 0 + 0 + + + 1 + 125 + 569 + 0 + 0 + + + 110 + 280 + 377 + 4 + 0 + + + 34 + 590 + 833 + 1 + 0 + + + 4 + 290 + 364 + 0 + 0 + + + 70 + 100 + 367 + 0 + 0 + + + 22 + 265 + 658 + 6 + 0 + + + 47 + 518 + 543 + 4 + 0 + + + 377 + 665 + 739 + 6 + 0 + + + 994 + 601 + 468 + 0 + 0 + + + 70 + 198 + 359 + 0 + 0 + + + 7 + 82 + 447 + 6 + 0 + + + 960 + 625 + 723 + 0 + 0 + + + 1 + 226 + 617 + 0 + 0 + + + 284 + 632 + 715 + 2 + 0 + + + 25 + 305 + 688 + 6 + 0 + + + 70 + 95 + 386 + 0 + 0 + + + 33 + 451 + 692 + 4 + 0 + + + 70 + 256 + 412 + 0 + 0 + + + 25 + 613 + 1549 + 2 + 0 + + + 597 + 746 + 470 + 2 + 0 + + + 37 + 70 + 523 + 1 + 0 + + + 70 + 176 + 208 + 3 + 0 + + + 70 + 293 + 360 + 0 + 0 + + + 70 + 110 + 333 + 0 + 0 + + + 70 + 304 + 347 + 0 + 0 + + + 34 + 152 + 694 + 4 + 0 + + + 597 + 697 + 503 + 2 + 0 + + + 205 + 85 + 431 + 0 + 0 + + + 201 + 614 + 800 + 1 + 1 + + + 884 + 725 + 581 + 4 + 0 + + + 70 + 251 + 282 + 0 + 0 + + + 34 + 718 + 684 + 1 + 0 + + + 21 + 541 + 705 + 6 + 0 + + + 35 + 58 + 631 + 0 + 0 + + + 0 + 650 + 433 + 5 + 0 + + + 205 + 135 + 271 + 0 + 0 + + + 597 + 719 + 434 + 6 + 0 + + + 1 + 214 + 1637 + 1 + 1 + + + 7 + 82 + 446 + 6 + 0 + + + 72 + 176 + 602 + 3 + 0 + + + 66 + 132 + 536 + 0 + 0 + + + 70 + 176 + 402 + 0 + 0 + + + 205 + 115 + 318 + 0 + 0 + + + 36 + 152 + 697 + 4 + 0 + + + 70 + 219 + 167 + 0 + 0 + + + 22 + 675 + 565 + 2 + 0 + + + 45 + 108 + 655 + 0 + 0 + + + 192 + 739 + 474 + 0 + 0 + + + 70 + 334 + 418 + 0 + 0 + + + 33 + 504 + 695 + 0 + 0 + + + 1 + 719 + 683 + 1 + 0 + + + 0 + 613 + 509 + 0 + 0 + + + 38 + 301 + 235 + 0 + 0 + + + 70 + 93 + 393 + 0 + 0 + + + 193 + 597 + 471 + 0 + 1 + + + 38 + 254 + 417 + 0 + 0 + + + 1 + 608 + 743 + 3 + 0 + + + 70 + 179 + 395 + 0 + 0 + + + 34 + 709 + 494 + 2 + 0 + + + 1 + 573 + 735 + 0 + 0 + + + 33 + 398 + 707 + 0 + 0 + + + 183 + 348 + 703 + 0 + 0 + + + 70 + 287 + 369 + 0 + 0 + + + 284 + 639 + 707 + 0 + 0 + + + 1 + 653 + 752 + 7 + 0 + + + 46 + 536 + 525 + 0 + 0 + + + 21 + 271 + 643 + 0 + 0 + + + 597 + 684 + 512 + 0 + 0 + + + 34 + 153 + 692 + 4 + 0 + + + 70 + 169 + 216 + 0 + 0 + + + 7 + 613 + 687 + 4 + 0 + + + 34 + 66 + 553 + 7 + 0 + + + 283 + 77 + 474 + 7 + 0 + + + 38 + 283 + 129 + 0 + 0 + + + 377 + 658 + 640 + 3 + 0 + + + 70 + 292 + 242 + 0 + 0 + + + 12 + 105 + 673 + 0 + 0 + + + 4 + 302 + 234 + 0 + 0 + + + 220 + 276 + 256 + 0 + 0 + + + 1 + 214 + 652 + 0 + 0 + + + 34 + 215 + 649 + 0 + 0 + + + 70 + 192 + 190 + 0 + 0 + + + 0 + 709 + 440 + 3 + 0 + + + 1 + 51 + 715 + 0 + 1 + + + 25 + 614 + 621 + 0 + 0 + + + 284 + 627 + 672 + 0 + 0 + + + 1 + 112 + 633 + 0 + 0 + + + 72 + 177 + 598 + 3 + 0 + + + 70 + 187 + 566 + 6 + 0 + + + 34 + 583 + 535 + 6 + 0 + + + 597 + 722 + 432 + 4 + 0 + + + 70 + 179 + 396 + 0 + 0 + + + 70 + 287 + 127 + 0 + 0 + + + 284 + 630 + 717 + 0 + 0 + + + 70 + 294 + 124 + 0 + 0 + + + 51 + 284 + 2960 + 6 + 0 + + + 72 + 558 + 559 + 3 + 0 + + + 938 + 696 + 649 + 0 + 0 + + + 597 + 718 + 531 + 4 + 0 + + + 0 + 697 + 547 + 1 + 0 + + + 205 + 599 + 754 + 4 + 0 + + + 0 + 621 + 791 + 0 + 0 + + + 1 + 662 + 742 + 7 + 0 + + + 70 + 137 + 266 + 0 + 0 + + + 0 + 220 + 481 + 0 + 0 + + + 70 + 274 + 133 + 0 + 0 + + + 34 + 411 + 510 + 1 + 0 + + + 70 + 288 + 246 + 0 + 0 + + + 34 + 343 + 713 + 0 + 0 + + + 70 + 304 + 348 + 0 + 0 + + + 70 + 184 + 575 + 6 + 0 + + + 1 + 623 + 838 + 0 + 0 + + + 70 + 237 + 299 + 0 + 0 + + + 20 + 611 + 624 + 2 + 0 + + + 4 + 331 + 214 + 0 + 0 + + + 34 + 683 + 513 + 0 + 0 + + + 72 + 176 + 601 + 3 + 0 + + + 306 + 722 + 528 + 4 + 0 + + + 283 + 716 + 686 + 0 + 0 + + + 70 + 246 + 148 + 0 + 0 + + + 34 + 111 + 638 + 0 + 0 + + + 284 + 637 + 709 + 0 + 0 + + + 191 + 566 + 551 + 2 + 0 + + + 730 + 454 + 3373 + 3 + 0 + + + 34 + 706 + 540 + 6 + 0 + + + 285 + 472 + 444 + 6 + 0 + + + 3 + 626 + 609 + 0 + 0 + + + 70 + 312 + 227 + 0 + 0 + + + 70 + 145 + 251 + 0 + 0 + + + 32 + 450 + 693 + 6 + 0 + + + 284 + 625 + 674 + 0 + 0 + + + 284 + 671 + 673 + 2 + 0 + + + 37 + 490 + 499 + 0 + 0 + + + 597 + 672 + 464 + 6 + 0 + + + 37 + 584 + 841 + 6 + 0 + + + 283 + 717 + 685 + 0 + 0 + + + 36 + 341 + 717 + 0 + 0 + + + 3 + 590 + 714 + 0 + 0 + + + 34 + 401 + 702 + 0 + 0 + + + 4 + 98 + 371 + 0 + 0 + + + 597 + 746 + 511 + 2 + 0 + + + 283 + 595 + 759 + 0 + 0 + + + 37 + 71 + 512 + 1 + 0 + + + 4 + 166 + 219 + 0 + 0 + + + 0 + 166 + 637 + 0 + 0 + + + 70 + 202 + 180 + 0 + 0 + + + 70 + 180 + 202 + 3 + 0 + + + 23 + 109 + 666 + 4 + 0 + + + 1016 + 236 + 140 + 6 + 0 + + + 34 + 62 + 533 + 0 + 0 + + + 1 + 111 + 654 + 0 + 1 + + + 36 + 689 + 708 + 0 + 0 + + + 70 + 121 + 273 + 0 + 0 + + + 419 + 687 + 458 + 0 + 0 + + + 25 + 214 + 1636 + 0 + 0 + + + 284 + 659 + 688 + 0 + 0 + + + 70 + 192 + 378 + 0 + 0 + + + 597 + 672 + 521 + 6 + 0 + + + 70 + 213 + 341 + 0 + 0 + + + 70 + 199 + 365 + 0 + 0 + + + 34 + 734 + 477 + 7 + 0 + + + 377 + 659 + 635 + 4 + 0 + + + 70 + 245 + 135 + 0 + 0 + + + 1 + 75 + 441 + 0 + 0 + + + 0 + 635 + 659 + 0 + 0 + + + 1 + 156 + 660 + 0 + 0 + + + 70 + 286 + 360 + 0 + 0 + + + 708 + 298 + 111 + 0 + 0 + + + 0 + 632 + 554 + 0 + 0 + + + 70 + 266 + 273 + 0 + 0 + + + 290 + 599 + 467 + 0 + 0 + + + 1 + 522 + 465 + 1 + 1 + + + 72 + 171 + 602 + 3 + 0 + + + 33 + 447 + 704 + 4 + 0 + + + 164 + 753 + 465 + 0 + 0 + + + 70 + 327 + 315 + 0 + 0 + + + 30 + 226 + 633 + 4 + 0 + + + 21 + 496 + 564 + 2 + 0 + + + 70 + 328 + 314 + 0 + 0 + + + 70 + 243 + 299 + 0 + 0 + + + 284 + 661 + 686 + 0 + 0 + + + 37 + 251 + 570 + 0 + 0 + + + 3 + 559 + 688 + 0 + 0 + + + 70 + 134 + 247 + 0 + 0 + + + 284 + 636 + 713 + 0 + 0 + + + 34 + 340 + 714 + 0 + 0 + + + 70 + 324 + 318 + 0 + 0 + + + 1011 + 235 + 141 + 6 + 0 + + + 34 + 693 + 555 + 1 + 0 + + + 1 + 73 + 454 + 0 + 0 + + + 45 + 212 + 675 + 2 + 0 + + + 72 + 172 + 599 + 3 + 0 + + + 88 + 183 + 563 + 0 + 0 + + + 70 + 126 + 263 + 0 + 0 + + + 70 + 132 + 251 + 0 + 0 + + + 407 + 603 + 464 + 2 + 0 + + + 12 + 108 + 673 + 0 + 0 + + + 46 + 536 + 522 + 0 + 0 + + + 20 + 346 + 614 + 6 + 0 + + + 284 + 663 + 684 + 0 + 0 + + + 284 + 469 + 453 + 2 + 0 + + + 20 + 147 + 493 + 0 + 0 + + + 13 + 108 + 671 + 0 + 0 + + + 4 + 114 + 291 + 0 + 0 + + + 299 + 522 + 603 + 0 + 0 + + + 70 + 225 + 635 + 0 + 0 + + + 100 + 626 + 848 + 6 + 0 + + + 70 + 252 + 409 + 0 + 0 + + + 420 + 743 + 471 + 6 + 0 + + + 70 + 94 + 353 + 0 + 0 + + + 0 + 70 + 474 + 0 + 0 + + + 0 + 627 + 502 + 2 + 0 + + + 70 + 129 + 257 + 0 + 0 + + + 0 + 630 + 664 + 0 + 0 + + + 70 + 322 + 320 + 0 + 0 + + + 708 + 296 + 112 + 4 + 0 + + + 284 + 665 + 682 + 2 + 0 + + + 70 + 206 + 161 + 0 + 0 + + + 70 + 161 + 206 + 0 + 0 + + + 205 + 100 + 332 + 0 + 0 + + + 278 + 451 + 698 + 0 + 0 + + + 524 + 698 + 451 + 0 + 0 + + + 0 + 312 + 458 + 0 + 0 + + + 45 + 212 + 674 + 2 + 0 + + + 391 + 160 + 453 + 0 + 0 + + + 529 + 299 + 111 + 0 + 0 + + + 45 + 613 + 1545 + 2 + 0 + + + 284 + 667 + 680 + 2 + 0 + + + 37 + 711 + 686 + 4 + 0 + + + 36 + 348 + 698 + 0 + 0 + + + 36 + 347 + 700 + 0 + 0 + + + 72 + 130 + 558 + 3 + 0 + + + 68 + 631 + 773 + 3 + 0 + + + 70 + 226 + 147 + 0 + 0 + + + 652 + 294 + 113 + 0 + 0 + + + 284 + 669 + 678 + 2 + 0 + + + 146 + 599 + 757 + 1 + 1 + + + 45 + 313 + 556 + 2 + 0 + + + 0 + 76 + 437 + 4 + 0 + + + 70 + 173 + 192 + 0 + 0 + + + 1 + 153 + 474 + 0 + 0 + + + 70 + 280 + 259 + 0 + 0 + + + 284 + 671 + 676 + 2 + 0 + + + 70 + 149 + 223 + 0 + 0 + + + 72 + 171 + 603 + 3 + 0 + + + 708 + 297 + 112 + 4 + 0 + + + 960 + 630 + 720 + 0 + 0 + + + 0 + 631 + 828 + 1 + 0 + + + 205 + 84 + 396 + 0 + 0 + + + 4 + 189 + 176 + 0 + 0 + + + 965 + 619 + 788 + 6 + 0 + + + 1149 + 515 + 543 + 6 + 0 + + + 1 + 487 + 436 + 0 + 0 + + + 192 + 737 + 475 + 0 + 0 + + + 284 + 638 + 711 + 2 + 0 + + + 205 + 175 + 190 + 0 + 0 + + + 58 + 272 + 2972 + 4 + 0 + + + 1 + 73 + 449 + 0 + 0 + + + 55 + 319 + 449 + 4 + 0 + + + 284 + 632 + 717 + 0 + 0 + + + 0 + 765 + 503 + 3 + 0 + + + 313 + 678 + 516 + 0 + 0 + + + 0 + 614 + 512 + 0 + 0 + + + 0 + 717 + 680 + 0 + 0 + + + 0 + 630 + 499 + 2 + 0 + + + 209 + 636 + 605 + 2 + 0 + + + 4 + 83 + 395 + 0 + 0 + + + 665 + 298 + 110 + 4 + 0 + + + 34 + 586 + 832 + 2 + 0 + + + 38 + 597 + 759 + 4 + 0 + + + 70 + 121 + 271 + 0 + 0 + + + 1013 + 236 + 139 + 6 + 0 + + + 34 + 710 + 542 + 1 + 0 + + + 34 + 59 + 556 + 7 + 0 + + + 597 + 746 + 469 + 2 + 0 + + + 1 + 158 + 458 + 0 + 0 + + + 306 + 759 + 507 + 3 + 0 + + + 208 + 77 + 426 + 0 + 0 + + + 0 + 71 + 462 + 0 + 0 + + + 1 + 607 + 518 + 0 + 0 + + + 47 + 716 + 681 + 4 + 0 + + + 70 + 160 + 205 + 0 + 0 + + + 21 + 211 + 679 + 4 + 0 + + + 72 + 172 + 600 + 3 + 0 + + + 38 + 81 + 405 + 0 + 0 + + + 1 + 154 + 470 + 0 + 0 + + + 23 + 109 + 664 + 4 + 0 + + + 192 + 740 + 520 + 0 + 0 + + + 164 + 754 + 464 + 3 + 0 + + + 205 + 157 + 461 + 0 + 0 + + + 51 + 601 + 754 + 0 + 0 + + + 1 + 60 + 547 + 0 + 0 + + + 70 + 92 + 357 + 0 + 0 + + + 25 + 589 + 711 + 4 + 0 + + + 70 + 123 + 267 + 0 + 0 + + + 0 + 520 + 408 + 0 + 0 + + + 4 + 189 + 383 + 0 + 0 + + + 209 + 76 + 432 + 0 + 0 + + + 38 + 199 + 165 + 0 + 0 + + + 45 + 212 + 676 + 2 + 0 + + + 34 + 713 + 441 + 3 + 0 + + + 1 + 607 + 634 + 0 + 0 + + + 1012 + 233 + 141 + 4 + 0 + + + 204 + 634 + 607 + 1 + 0 + + + 1 + 74 + 444 + 0 + 0 + + + 708 + 296 + 111 + 0 + 0 + + + 70 + 271 + 381 + 0 + 0 + + + 597 + 697 + 502 + 2 + 0 + + + 284 + 641 + 707 + 0 + 0 + + + 1016 + 238 + 138 + 6 + 0 + + + 1 + 75 + 438 + 0 + 0 + + + 0 + 615 + 681 + 0 + 0 + + + 70 + 198 + 166 + 0 + 0 + + + 7 + 277 + 627 + 0 + 0 + + + 4 + 208 + 158 + 0 + 0 + + + 70 + 204 + 355 + 0 + 0 + + + 38 + 659 + 740 + 2 + 0 + + + 962 + 626 + 779 + 6 + 0 + + + 4 + 330 + 313 + 0 + 0 + + + 0 + 648 + 540 + 0 + 0 + + + 37 + 323 + 657 + 0 + 0 + + + 38 + 87 + 378 + 0 + 0 + + + 72 + 173 + 597 + 3 + 0 + + + 70 + 472 + 515 + 2 + 0 + + + 13 + 515 + 472 + 4 + 0 + + + 46 + 533 + 525 + 0 + 0 + + + 306 + 729 + 528 + 4 + 0 + + + 1013 + 235 + 140 + 6 + 0 + + + 299 + 519 + 606 + 2 + 0 + + + 150 + 615 + 455 + 4 + 0 + + + 0 + 76 + 433 + 4 + 0 + + + 70 + 159 + 207 + 0 + 0 + + + 36 + 723 + 435 + 2 + 0 + + + 34 + 438 + 484 + 2 + 0 + + + 1 + 163 + 443 + 0 + 0 + + + 70 + 151 + 218 + 0 + 0 + + + 12 + 692 + 655 + 1 + 0 + + + 3 + 274 + 634 + 0 + 0 + + + 45 + 313 + 555 + 2 + 0 + + + 666 + 497 + 563 + 0 + 0 + + + 70 + 93 + 354 + 0 + 0 + + + 22 + 264 + 658 + 6 + 0 + + + 1 + 59 + 558 + 0 + 0 + + + 51 + 272 + 2971 + 6 + 0 + + + 597 + 683 + 512 + 0 + 0 + + + 597 + 728 + 432 + 4 + 0 + + + 1 + 168 + 615 + 0 + 0 + + + 284 + 469 + 452 + 2 + 0 + + + 34 + 629 + 500 + 2 + 0 + + + 597 + 672 + 468 + 6 + 0 + + + 307 + 340 + 511 + 0 + 0 + + + 1 + 342 + 508 + 0 + 0 + + + 284 + 634 + 715 + 0 + 0 + + + 34 + 473 + 665 + 0 + 0 + + + 70 + 142 + 232 + 0 + 0 + + + 1 + 455 + 466 + 0 + 0 + + + 1011 + 237 + 139 + 6 + 0 + + + 597 + 746 + 516 + 2 + 0 + + + 4 + 261 + 396 + 0 + 0 + + + 283 + 620 + 843 + 6 + 0 + + + 205 + 107 + 308 + 0 + 0 + + + 284 + 657 + 690 + 0 + 0 + + + 708 + 297 + 111 + 0 + 0 + + + 13 + 690 + 657 + 1 + 0 + + + 70 + 106 + 311 + 0 + 0 + + + 70 + 190 + 544 + 0 + 0 + + + 1 + 320 + 543 + 0 + 1 + + + 70 + 87 + 379 + 0 + 0 + + + 597 + 725 + 531 + 4 + 0 + + + 72 + 172 + 601 + 3 + 0 + + + 445 + 627 + 614 + 2 + 0 + + + 20 + 246 + 582 + 0 + 0 + + + 164 + 749 + 467 + 0 + 0 + + + 1 + 114 + 634 + 0 + 0 + + + 34 + 627 + 723 + 0 + 0 + + + 4 + 278 + 260 + 0 + 0 + + + 21 + 498 + 562 + 0 + 0 + + + 20 + 458 + 463 + 0 + 0 + + + 283 + 464 + 457 + 0 + 0 + + + 70 + 288 + 251 + 0 + 0 + + + 22 + 602 + 465 + 5 + 0 + + + 1010 + 234 + 141 + 0 + 0 + + + 0 + 713 + 540 + 1 + 0 + + + 0 + 690 + 558 + 1 + 0 + + + 8 + 619 + 622 + 5 + 0 + + + 665 + 300 + 110 + 4 + 0 + + + 37 + 617 + 624 + 6 + 0 + + + 20 + 150 + 482 + 0 + 0 + + + 306 + 711 + 492 + 0 + 0 + + + 419 + 715 + 440 + 6 + 0 + + + 1 + 259 + 553 + 1 + 1 + + + 1 + 718 + 679 + 1 + 0 + + + 280 + 523 + 465 + 0 + 0 + + + 0 + 310 + 462 + 0 + 0 + + + 284 + 482 + 440 + 2 + 0 + + + 526 + 696 + 452 + 2 + 0 + + + 51 + 452 + 696 + 0 + 0 + + + 37 + 608 + 575 + 0 + 0 + + + 1 + 74 + 454 + 0 + 0 + + + 191 + 572 + 551 + 2 + 0 + + + 597 + 672 + 469 + 6 + 0 + + + 265 + 469 + 672 + 2 + 0 + + + 164 + 736 + 475 + 7 + 0 + + + 70 + 87 + 386 + 0 + 0 + + + 284 + 671 + 675 + 2 + 0 + + + 284 + 669 + 677 + 2 + 0 + + + 72 + 171 + 599 + 3 + 0 + + + 9 + 134 + 538 + 0 + 1 + + + 284 + 665 + 681 + 2 + 0 + + + 34 + 133 + 542 + 0 + 0 + + + 938 + 659 + 741 + 2 + 0 + + + 36 + 166 + 617 + 0 + 0 + + + 284 + 667 + 679 + 2 + 0 + + + 36 + 637 + 834 + 1 + 0 + + + 3 + 715 + 683 + 0 + 0 + + + 273 + 651 + 537 + 2 + 0 + + + 993 + 629 + 720 + 0 + 0 + + + 70 + 82 + 409 + 0 + 0 + + + 183 + 344 + 707 + 0 + 0 + + + 217 + 128 + 262 + 1 + 0 + + + 0 + 328 + 649 + 0 + 0 + + + 377 + 609 + 802 + 6 + 0 + + + 110 + 608 + 461 + 2 + 0 + + + 70 + 220 + 153 + 0 + 0 + + + 284 + 630 + 719 + 0 + 0 + + + 37 + 608 + 745 + 5 + 0 + + + 25 + 214 + 1634 + 0 + 0 + + + 70 + 186 + 388 + 0 + 0 + + + 281 + 440 + 484 + 4 + 0 + + + 283 + 466 + 457 + 2 + 0 + + + 38 + 686 + 712 + 2 + 0 + + + 284 + 638 + 710 + 2 + 0 + + + 23 + 109 + 662 + 4 + 0 + + + 34 + 156 + 657 + 0 + 0 + + + 51 + 449 + 702 + 2 + 0 + + + 34 + 706 + 544 + 1 + 0 + + + 0 + 605 + 521 + 0 + 0 + + + 45 + 313 + 554 + 2 + 0 + + + 0 + 733 + 477 + 1 + 0 + + + 70 + 235 + 307 + 0 + 0 + + + 70 + 82 + 410 + 0 + 0 + + + 111 + 274 + 374 + 0 + 0 + + + 51 + 426 + 3384 + 4 + 0 + + + 1 + 505 + 555 + 0 + 0 + + + 283 + 469 + 454 + 2 + 0 + + + 4 + 83 + 405 + 0 + 0 + + + 3 + 133 + 1601 + 0 + 0 + + + 70 + 192 + 175 + 0 + 0 + + + 70 + 175 + 192 + 0 + 0 + + + 377 + 598 + 699 + 5 + 0 + + + 34 + 685 + 713 + 2 + 0 + + + 36 + 723 + 436 + 2 + 0 + + + 1 + 165 + 621 + 0 + 0 + + + 529 + 300 + 112 + 4 + 0 + + + 164 + 742 + 471 + 0 + 0 + + + 36 + 166 + 618 + 0 + 0 + + + 58 + 274 + 2952 + 0 + 0 + + + 20 + 173 + 593 + 0 + 0 + + + 34 + 718 + 680 + 1 + 0 + + + 70 + 234 + 144 + 0 + 0 + + + 4 + 162 + 208 + 0 + 0 + + + 70 + 281 + 365 + 0 + 0 + + + 209 + 78 + 432 + 2 + 0 + + + 205 + 159 + 212 + 0 + 0 + + + 284 + 639 + 709 + 0 + 0 + + + 1 + 319 + 667 + 1 + 1 + + + 38 + 305 + 236 + 0 + 0 + + + 0 + 676 + 517 + 1 + 0 + + + 20 + 468 + 520 + 2 + 0 + + + 111 + 272 + 377 + 0 + 0 + + + 1 + 135 + 533 + 3 + 1 + + + 100 + 621 + 842 + 1 + 0 + + + 1 + 248 + 574 + 0 + 0 + + + 70 + 280 + 257 + 0 + 0 + + + 34 + 159 + 645 + 0 + 0 + + + 34 + 719 + 679 + 1 + 0 + + + 597 + 672 + 520 + 6 + 0 + + + 70 + 299 + 343 + 0 + 0 + + + 70 + 288 + 356 + 0 + 0 + + + 1 + 76 + 443 + 0 + 0 + + + 0 + 126 + 571 + 0 + 0 + + + 665 + 298 + 113 + 0 + 0 + + + 34 + 158 + 649 + 0 + 0 + + + 70 + 122 + 276 + 0 + 0 + + + 37 + 323 + 659 + 0 + 0 + + + 21 + 545 + 705 + 6 + 0 + + + 4 + 82 + 412 + 0 + 0 + + + 38 + 245 + 419 + 0 + 0 + + + 34 + 340 + 716 + 0 + 0 + + + 37 + 60 + 563 + 7 + 0 + + + 597 + 730 + 432 + 4 + 0 + + + 0 + 609 + 744 + 3 + 0 + + + 70 + 188 + 546 + 0 + 0 + + + 0 + 116 + 621 + 0 + 0 + + + 5 + 138 + 522 + 0 + 0 + + + 4 + 181 + 398 + 0 + 0 + + + 205 + 102 + 331 + 0 + 0 + + + 75 + 463 + 681 + 0 + 1 + + + 70 + 175 + 193 + 0 + 0 + + + 0 + 449 + 474 + 0 + 0 + + + 70 + 286 + 118 + 0 + 0 + + + 110 + 609 + 460 + 2 + 0 + + + 104 + 556 + 691 + 0 + 0 + + + 597 + 746 + 515 + 2 + 0 + + + 0 + 77 + 438 + 4 + 0 + + + 4 + 191 + 377 + 0 + 0 + + + 0 + 647 + 433 + 5 + 0 + + + 1 + 160 + 450 + 0 + 0 + + + 70 + 300 + 240 + 0 + 0 + + + 285 + 229 + 448 + 2 + 0 + + + 70 + 180 + 570 + 6 + 0 + + + 70 + 285 + 360 + 0 + 0 + + + 1 + 320 + 445 + 0 + 1 + + + 72 + 171 + 600 + 3 + 0 + + + 51 + 272 + 2974 + 6 + 0 + + + 4 + 264 + 389 + 0 + 0 + + + 401 + 63 + 529 + 0 + 0 + + + 20 + 150 + 479 + 0 + 0 + + + 45 + 313 + 553 + 2 + 0 + + + 100 + 648 + 486 + 6 + 0 + + + 597 + 729 + 432 + 4 + 0 + + + 4 + 85 + 392 + 0 + 0 + + + 597 + 719 + 438 + 6 + 0 + + + 0 + 713 + 490 + 0 + 0 + + + 4 + 332 + 430 + 0 + 0 + + + 0 + 611 + 629 + 0 + 0 + + + 15 + 629 + 611 + 0 + 0 + + + 34 + 665 + 734 + 0 + 0 + + + 730 + 469 + 3385 + 2 + 0 + + + 34 + 681 + 513 + 2 + 0 + + + 284 + 656 + 690 + 0 + 0 + + + 0 + 670 + 470 + 0 + 0 + + + 70 + 313 + 328 + 0 + 0 + + + 22 + 263 + 658 + 6 + 0 + + + 205 + 252 + 285 + 0 + 0 + + + 70 + 269 + 267 + 0 + 0 + + + 70 + 212 + 157 + 0 + 0 + + + 1 + 65 + 512 + 1 + 0 + + + 72 + 172 + 597 + 3 + 0 + + + 0 + 525 + 405 + 0 + 0 + + + 38 + 199 + 361 + 0 + 0 + + + 529 + 300 + 111 + 0 + 0 + + + 23 + 601 + 696 + 4 + 0 + + + 47 + 368 + 578 + 6 + 0 + + + 70 + 202 + 356 + 0 + 0 + + + 708 + 298 + 112 + 4 + 0 + + + 1 + 591 + 533 + 2 + 0 + + + 38 + 168 + 428 + 0 + 0 + + + 34 + 112 + 642 + 0 + 0 + + + 1 + 114 + 631 + 0 + 0 + + + 70 + 263 + 127 + 0 + 0 + + + 21 + 271 + 639 + 2 + 0 + + + 13 + 108 + 666 + 0 + 0 + + + 70 + 243 + 296 + 0 + 0 + + + 70 + 118 + 283 + 0 + 0 + + + 239 + 262 + 661 + 0 + 0 + + + 72 + 171 + 601 + 3 + 0 + + + 38 + 602 + 752 + 2 + 0 + + + 284 + 658 + 688 + 0 + 0 + + + 5 + 277 + 625 + 0 + 0 + + + 55 + 318 + 449 + 4 + 0 + + + 70 + 135 + 247 + 0 + 0 + + + 0 + 520 + 409 + 0 + 0 + + + 70 + 291 + 353 + 0 + 0 + + + 70 + 230 + 145 + 0 + 0 + + + 1 + 491 + 496 + 0 + 0 + + + 51 + 284 + 2971 + 4 + 0 + + + 107 + 557 + 690 + 0 + 0 + + + 730 + 468 + 3392 + 6 + 0 + + + 284 + 661 + 685 + 2 + 0 + + + 111 + 272 + 378 + 0 + 0 + + + 70 + 216 + 332 + 0 + 0 + + + 0 + 76 + 440 + 4 + 0 + + + 34 + 708 + 543 + 1 + 0 + + + 0 + 628 + 721 + 0 + 0 + + + 61 + 109 + 658 + 0 + 0 + + + 70 + 220 + 326 + 0 + 0 + + + 665 + 296 + 113 + 0 + 0 + + + 15 + 226 + 455 + 2 + 0 + + + 70 + 182 + 565 + 6 + 0 + + + 20 + 177 + 581 + 0 + 0 + + + 70 + 316 + 227 + 0 + 0 + + + 38 + 68 + 492 + 1 + 0 + + + 278 + 452 + 697 + 0 + 0 + + + 4 + 259 + 277 + 0 + 0 + + + 402 + 522 + 669 + 2 + 0 + + + 70 + 211 + 340 + 0 + 0 + + + 0 + 310 + 460 + 0 + 0 + + + 313 + 743 + 470 + 3 + 0 + + + 205 + 243 + 423 + 0 + 0 + + + 284 + 660 + 686 + 0 + 0 + + + 70 + 206 + 348 + 0 + 0 + + + 1 + 60 + 557 + 0 + 0 + + + 0 + 729 + 479 + 1 + 0 + + + 290 + 599 + 468 + 0 + 0 + + + 8 + 618 + 622 + 3 + 0 + + + 284 + 465 + 457 + 0 + 0 + + + 34 + 609 + 859 + 6 + 0 + + + 597 + 697 + 501 + 2 + 0 + + + 70 + 298 + 345 + 0 + 0 + + + 597 + 682 + 512 + 0 + 0 + + + 37 + 616 + 624 + 2 + 0 + + + 1 + 605 + 691 + 0 + 1 + + + 1 + 114 + 629 + 0 + 0 + + + 965 + 620 + 787 + 6 + 0 + + + 45 + 546 + 704 + 4 + 0 + + + 20 + 73 + 459 + 0 + 0 + + + 4 + 118 + 284 + 0 + 0 + + + 0 + 766 + 456 + 0 + 0 + + + 70 + 173 + 415 + 0 + 0 + + + 284 + 636 + 712 + 2 + 0 + + + 0 + 75 + 447 + 0 + 0 + + + 1 + 161 + 446 + 0 + 0 + + + 0 + 634 + 497 + 6 + 0 + + + 70 + 287 + 250 + 0 + 0 + + + 71 + 606 + 690 + 2 + 0 + + + 70 + 93 + 360 + 0 + 0 + + + 70 + 184 + 559 + 6 + 0 + + + 72 + 172 + 598 + 3 + 0 + + + 111 + 270 + 381 + 0 + 0 + + + 70 + 161 + 208 + 0 + 0 + + + 529 + 299 + 112 + 4 + 0 + + + 70 + 299 + 240 + 0 + 0 + + + 70 + 195 + 368 + 0 + 0 + + + 70 + 184 + 390 + 0 + 0 + + + 4 + 61 + 549 + 7 + 0 + + + 1 + 165 + 435 + 0 + 0 + + + 37 + 249 + 573 + 0 + 0 + + + 0 + 77 + 435 + 4 + 0 + + + 0 + 599 + 526 + 0 + 0 + + + 1 + 272 + 637 + 0 + 0 + + + 284 + 662 + 684 + 0 + 0 + + + 36 + 167 + 616 + 0 + 0 + + + 283 + 482 + 441 + 4 + 0 + + + 597 + 724 + 531 + 4 + 0 + + + 597 + 746 + 468 + 2 + 0 + + + 0 + 79 + 432 + 4 + 0 + + + 70 + 93 + 367 + 0 + 0 + + + 1 + 306 + 565 + 2 + 1 + + + 284 + 641 + 709 + 0 + 0 + + + 3 + 121 + 609 + 0 + 0 + + + 1 + 435 + 486 + 0 + 1 + + + 193 + 254 + 290 + 4 + 0 + + + 1 + 74 + 461 + 0 + 0 + + + 4 + 83 + 411 + 0 + 0 + + + 424 + 653 + 696 + 2 + 0 + + + 217 + 696 + 653 + 1 + 0 + + + 1 + 75 + 455 + 0 + 0 + + + 111 + 273 + 381 + 0 + 0 + + + 1 + 719 + 680 + 1 + 0 + + + 38 + 146 + 234 + 0 + 0 + + + 72 + 174 + 598 + 3 + 0 + + + 1 + 462 + 679 + 1 + 1 + + + 72 + 172 + 605 + 3 + 0 + + + 110 + 282 + 369 + 4 + 0 + + + 21 + 496 + 562 + 0 + 0 + + + 205 + 547 + 442 + 0 + 0 + + + 20 + 602 + 755 + 2 + 0 + + + 34 + 526 + 530 + 0 + 0 + + + 70 + 176 + 194 + 0 + 0 + + + 23 + 111 + 664 + 0 + 0 + + + 419 + 691 + 454 + 2 + 0 + + + 70 + 311 + 237 + 0 + 0 + + + 4 + 306 + 340 + 0 + 0 + + + 0 + 718 + 681 + 1 + 0 + + + 0 + 696 + 551 + 1 + 0 + + + 306 + 640 + 490 + 2 + 0 + + + 284 + 632 + 719 + 0 + 0 + + + 288 + 448 + 700 + 4 + 0 + + + 72 + 131 + 562 + 3 + 0 + + + 70 + 247 + 298 + 0 + 0 + + + 647 + 694 + 503 + 0 + 0 + + + 677 + 495 + 563 + 2 + 0 + + + 205 + 674 + 569 + 2 + 0 + + + 4 + 225 + 462 + 0 + 0 + + + 32 + 50 + 682 + 2 + 0 + + + 0 + 708 + 443 + 3 + 0 + + + 395 + 484 + 648 + 0 + 0 + + + 0 + 644 + 487 + 6 + 0 + + + 88 + 680 + 564 + 5 + 0 + + + 0 + 609 + 515 + 0 + 0 + + + 597 + 726 + 432 + 4 + 0 + + + 1 + 655 + 533 + 0 + 1 + + + 70 + 211 + 349 + 0 + 0 + + + 34 + 392 + 711 + 0 + 0 + + + 4 + 85 + 401 + 0 + 0 + + + 34 + 63 + 541 + 7 + 0 + + + 273 + 450 + 697 + 0 + 0 + + + 70 + 263 + 280 + 0 + 0 + + + 72 + 173 + 601 + 3 + 0 + + + 70 + 328 + 317 + 0 + 0 + + + 284 + 643 + 707 + 0 + 0 + + + 37 + 608 + 574 + 0 + 0 + + + 45 + 545 + 704 + 4 + 0 + + + 112 + 424 + 3524 + 0 + 0 + + + 72 + 173 + 602 + 3 + 0 + + + 100 + 631 + 843 + 6 + 0 + + + 306 + 679 + 514 + 4 + 0 + + + 70 + 333 + 221 + 0 + 0 + + + 4 + 196 + 175 + 0 + 0 + + + 70 + 98 + 350 + 0 + 0 + + + 597 + 672 + 467 + 6 + 0 + + + 64 + 467 + 518 + 0 + 0 + + + 20 + 270 + 127 + 2 + 0 + + + 70 + 283 + 260 + 0 + 0 + + + 1 + 449 + 699 + 1 + 1 + + + 205 + 179 + 411 + 0 + 0 + + + 30 + 226 + 628 + 0 + 0 + + + 100 + 621 + 843 + 6 + 0 + + + 4 + 112 + 306 + 0 + 0 + + + 34 + 51 + 672 + 2 + 0 + + + 70 + 200 + 171 + 0 + 0 + + + 70 + 82 + 417 + 0 + 0 + + + 284 + 624 + 672 + 0 + 0 + + + 59 + 352 + 600 + 2 + 0 + + + 70 + 181 + 406 + 0 + 0 + + + 23 + 111 + 662 + 4 + 0 + + + 55 + 679 + 565 + 3 + 0 + + + 407 + 737 + 569 + 5 + 0 + + + 70 + 220 + 334 + 0 + 0 + + + 19 + 110 + 668 + 0 + 0 + + + 110 + 279 + 373 + 4 + 0 + + + 15 + 158 + 465 + 4 + 0 + + + 34 + 586 + 834 + 2 + 0 + + + 70 + 81 + 422 + 0 + 0 + + + 72 + 129 + 570 + 3 + 0 + + + 205 + 73 + 469 + 0 + 0 + + + 216 + 694 + 655 + 0 + 0 + + + 36 + 345 + 701 + 0 + 0 + + + 55 + 321 + 442 + 4 + 0 + + + 205 + 519 + 466 + 0 + 0 + + + 309 + 541 + 447 + 0 + 0 + + + 70 + 182 + 572 + 6 + 0 + + + 34 + 56 + 611 + 0 + 0 + + + 0 + 286 + 496 + 4 + 0 + + + 1 + 118 + 623 + 0 + 0 + + + 183 + 344 + 703 + 0 + 0 + + + 284 + 634 + 717 + 0 + 0 + + + 397 + 565 + 743 + 0 + 0 + + + 32 + 502 + 695 + 0 + 0 + + + 34 + 78 + 434 + 4 + 0 + + + 3 + 274 + 630 + 0 + 0 + + + 70 + 322 + 228 + 0 + 0 + + + 0 + 510 + 414 + 0 + 0 + + + 33 + 53 + 639 + 0 + 0 + + + 3 + 223 + 638 + 2 + 0 + + + 284 + 666 + 682 + 0 + 0 + + + 0 + 637 + 659 + 0 + 0 + + + 36 + 736 + 474 + 1 + 0 + + + 1 + 70 + 484 + 1 + 0 + + + 70 + 273 + 269 + 0 + 0 + + + 495 + 645 + 486 + 1 + 0 + + + 0 + 74 + 458 + 0 + 0 + + + 88 + 712 + 638 + 0 + 0 + + + 70 + 306 + 240 + 0 + 0 + + + 1 + 160 + 459 + 0 + 0 + + + 70 + 226 + 325 + 0 + 0 + + + 205 + 150 + 226 + 0 + 0 + + + 1 + 75 + 452 + 0 + 0 + + + 665 + 300 + 113 + 0 + 0 + + + 4 + 63 + 538 + 7 + 0 + + + 191 + 572 + 548 + 2 + 0 + + + 284 + 671 + 677 + 2 + 0 + + + 284 + 668 + 680 + 0 + 0 + + + 164 + 733 + 476 + 0 + 0 + + + 524 + 695 + 451 + 0 + 0 + + + 20 + 267 + 127 + 4 + 0 + + + 284 + 669 + 679 + 2 + 0 + + + 1 + 163 + 450 + 0 + 0 + + + 0 + 285 + 499 + 4 + 0 + + + 70 + 191 + 384 + 0 + 0 + + + 70 + 226 + 461 + 6 + 0 + + + 730 + 470 + 3381 + 6 + 0 + + + 1 + 169 + 434 + 0 + 0 + + + 205 + 100 + 338 + 0 + 0 + + + 0 + 61 + 554 + 7 + 0 + + + 37 + 615 + 624 + 4 + 0 + + + 36 + 738 + 520 + 1 + 0 + + + 70 + 245 + 138 + 0 + 0 + + + 192 + 208 + 501 + 4 + 0 + + + 284 + 466 + 453 + 2 + 0 + + + 4 + 214 + 158 + 0 + 0 + + + 0 + 699 + 549 + 1 + 0 + + + 110 + 609 + 458 + 2 + 0 + + + 383 + 613 + 455 + 0 + 0 + + + 70 + 95 + 356 + 0 + 0 + + + 972 + 628 + 778 + 7 + 0 + + + 33 + 447 + 701 + 4 + 0 + + + 72 + 174 + 599 + 3 + 0 + + + 284 + 665 + 683 + 2 + 0 + + + 284 + 482 + 438 + 2 + 0 + + + 70 + 205 + 358 + 0 + 0 + + + 20 + 468 + 517 + 0 + 0 + + + 377 + 607 + 805 + 4 + 0 + + + 284 + 465 + 454 + 0 + 0 + + + 34 + 766 + 548 + 3 + 0 + + + 37 + 694 + 553 + 6 + 0 + + + 284 + 637 + 713 + 0 + 0 + + + 70 + 80 + 423 + 0 + 0 + + + 23 + 621 + 618 + 6 + 0 + + + 34 + 765 + 456 + 3 + 0 + + + 284 + 664 + 684 + 0 + 0 + + + 1 + 262 + 543 + 0 + 1 + + + 20 + 177 + 589 + 0 + 0 + + + 7 + 620 + 619 + 3 + 0 + + + 110 + 278 + 375 + 4 + 0 + + + 70 + 277 + 265 + 0 + 0 + + + 420 + 731 + 525 + 2 + 0 + + + 274 + 618 + 621 + 0 + 0 + + + 38 + 200 + 367 + 0 + 0 + + + 70 + 217 + 156 + 0 + 0 + + + 419 + 650 + 699 + 2 + 0 + + + 402 + 64 + 531 + 0 + 0 + + + 0 + 78 + 436 + 4 + 0 + + + 59 + 172 + 607 + 6 + 0 + + + 4 + 265 + 394 + 0 + 0 + + + 70 + 181 + 405 + 0 + 0 + + + 20 + 154 + 476 + 0 + 0 + + + 524 + 703 + 446 + 2 + 0 + + + 0 + 711 + 540 + 1 + 0 + + + 144 + 699 + 650 + 0 + 0 + + + 5 + 436 + 484 + 2 + 0 + + + 72 + 174 + 600 + 3 + 0 + + + 1 + 225 + 464 + 0 + 0 + + + 38 + 170 + 200 + 0 + 0 + + + 70 + 235 + 312 + 0 + 0 + + + 192 + 663 + 473 + 0 + 0 + + + 283 + 469 + 450 + 2 + 0 + + + 70 + 105 + 324 + 0 + 0 + + + 157 + 265 + 652 + 2 + 0 + + + 4 + 146 + 233 + 0 + 0 + + + 1 + 676 + 568 + 0 + 1 + + + 1 + 259 + 549 + 1 + 1 + + + 597 + 672 + 519 + 6 + 0 + + + 47 + 610 + 688 + 0 + 0 + + + 215 + 127 + 268 + 2 + 0 + + + 110 + 277 + 377 + 4 + 0 + + + 205 + 101 + 337 + 0 + 0 + + + 37 + 625 + 727 + 0 + 0 + + + 4 + 221 + 154 + 0 + 0 + + + 70 + 182 + 187 + 0 + 0 + + + 4 + 154 + 221 + 0 + 0 + + + 38 + 259 + 131 + 0 + 0 + + + 34 + 427 + 494 + 6 + 0 + + + 597 + 719 + 436 + 6 + 0 + + + 4 + 130 + 261 + 0 + 0 + + + 110 + 276 + 378 + 4 + 0 + + + 34 + 763 + 457 + 3 + 0 + + + 34 + 585 + 835 + 2 + 0 + + + 12 + 515 + 470 + 4 + 0 + + + 1 + 78 + 435 + 4 + 0 + + + 34 + 62 + 547 + 7 + 0 + + + 34 + 64 + 530 + 0 + 0 + + + 214 + 128 + 265 + 4 + 0 + + + 72 + 173 + 603 + 3 + 0 + + + 70 + 320 + 326 + 0 + 0 + + + 1012 + 444 + 3366 + 4 + 0 + + + 100 + 649 + 483 + 6 + 0 + + + 597 + 681 + 512 + 0 + 0 + + + 1 + 275 + 628 + 0 + 1 + + + 1 + 111 + 660 + 0 + 1 + + + 205 + 283 + 120 + 0 + 0 + + + 205 + 597 + 761 + 6 + 0 + + + 205 + 307 + 340 + 0 + 0 + + + 70 + 207 + 354 + 0 + 0 + + + 1181 + 543 + 707 + 4 + 0 + + + 72 + 129 + 568 + 3 + 0 + + + 25 + 618 + 679 + 4 + 0 + + + 283 + 619 + 846 + 7 + 0 + + + 377 + 661 + 739 + 3 + 0 + + + 597 + 723 + 531 + 4 + 0 + + + 1 + 76 + 447 + 0 + 0 + + + 0 + 633 + 662 + 0 + 0 + + + 98 + 556 + 689 + 0 + 0 + + + 1 + 166 + 441 + 0 + 0 + + + 70 + 240 + 305 + 0 + 0 + + + 6 + 147 + 498 + 6 + 0 + + + 46 + 471 + 450 + 2 + 0 + + + 597 + 719 + 437 + 6 + 0 + + + 70 + 120 + 289 + 0 + 0 + + + 88 + 190 + 545 + 0 + 0 + + + 72 + 172 + 602 + 3 + 0 + + + 20 + 177 + 585 + 0 + 0 + + + 70 + 82 + 423 + 0 + 0 + + + 72 + 130 + 563 + 3 + 0 + + + 37 + 689 + 556 + 6 + 0 + + + 34 + 65 + 533 + 0 + 0 + + + 0 + 522 + 406 + 0 + 0 + + + 1 + 80 + 433 + 4 + 0 + + + 1 + 77 + 450 + 0 + 0 + + + 1 + 663 + 632 + 0 + 1 + + + 1 + 521 + 536 + 3 + 0 + + + 70 + 308 + 336 + 0 + 0 + + + 32 + 51 + 679 + 2 + 0 + + + 4 + 64 + 541 + 7 + 0 + + + 70 + 191 + 383 + 0 + 0 + + + 1 + 225 + 460 + 0 + 0 + + + 111 + 276 + 375 + 0 + 0 + + + 1 + 74 + 468 + 1 + 0 + + + 7 + 78 + 444 + 6 + 0 + + + 70 + 314 + 233 + 0 + 0 + + + 70 + 233 + 314 + 0 + 0 + + + 20 + 158 + 463 + 6 + 0 + + + 3 + 112 + 653 + 0 + 0 + + + 98 + 667 + 471 + 2 + 0 + + + 192 + 738 + 519 + 0 + 0 + + + 70 + 631 + 607 + 6 + 0 + + + 34 + 436 + 486 + 2 + 0 + + + 23 + 596 + 703 + 6 + 0 + + + 34 + 754 + 508 + 3 + 0 + + + 72 + 173 + 598 + 3 + 0 + + + 70 + 225 + 325 + 0 + 0 + + + 205 + 187 + 185 + 0 + 0 + + + 1 + 474 + 447 + 0 + 1 + + + 877 + 724 + 627 + 0 + 0 + + + 70 + 237 + 146 + 0 + 0 + + + 70 + 260 + 133 + 0 + 0 + + + 284 + 642 + 707 + 0 + 0 + + + 4 + 263 + 278 + 0 + 0 + + + 307 + 740 + 471 + 7 + 0 + + + 45 + 544 + 704 + 4 + 0 + + + 70 + 120 + 288 + 0 + 0 + + + 70 + 192 + 180 + 0 + 0 + + + 4 + 180 + 192 + 0 + 0 + + + 215 + 129 + 268 + 2 + 0 + + + 70 + 134 + 258 + 0 + 0 + + + 1 + 320 + 662 + 1 + 1 + + + 70 + 232 + 315 + 0 + 0 + + + 110 + 275 + 377 + 0 + 0 + + + 70 + 169 + 206 + 0 + 0 + + + 1 + 589 + 771 + 3 + 0 + + + 377 + 649 + 537 + 2 + 0 + + + 15 + 298 + 579 + 0 + 0 + + + 419 + 697 + 451 + 0 + 0 + + + 41 + 316 + 546 + 0 + 0 + + + 34 + 114 + 641 + 1 + 0 + + + 5 + 611 + 1551 + 4 + 0 + + + 6 + 611 + 2495 + 4 + 0 + + + 36 + 726 + 433 + 0 + 0 + + + 284 + 662 + 686 + 0 + 0 + + + 5 + 299 + 577 + 4 + 0 + + + 152 + 608 + 573 + 1 + 1 + + + 4 + 156 + 223 + 0 + 0 + + + 46 + 476 + 445 + 2 + 0 + + + 70 + 142 + 245 + 0 + 0 + + + 70 + 216 + 161 + 0 + 0 + + + 1 + 72 + 483 + 1 + 0 + + + 192 + 696 + 703 + 4 + 0 + + + 70 + 185 + 188 + 0 + 0 + + + 45 + 613 + 1546 + 2 + 0 + + + 4 + 95 + 366 + 0 + 0 + + + 38 + 190 + 183 + 0 + 0 + + + 0 + 645 + 704 + 0 + 0 + + + 284 + 660 + 688 + 0 + 0 + + + 1 + 688 + 660 + 0 + 0 + + + 597 + 697 + 500 + 2 + 0 + + + 38 + 110 + 316 + 0 + 0 + + + 72 + 173 + 599 + 3 + 0 + + + 70 + 158 + 220 + 0 + 0 + + + 20 + 284 + 2966 + 0 + 0 + + + 70 + 192 + 181 + 0 + 0 + + + 70 + 261 + 397 + 0 + 0 + + + 1 + 115 + 635 + 0 + 0 + + + 70 + 183 + 399 + 0 + 0 + + + 445 + 624 + 614 + 2 + 0 + + + 1 + 248 + 570 + 0 + 0 + + + 37 + 614 + 624 + 7 + 0 + + + 70 + 234 + 312 + 0 + 0 + + + 12 + 108 + 676 + 0 + 0 + + + 407 + 689 + 659 + 2 + 0 + + + 306 + 734 + 522 + 0 + 0 + + + 3 + 317 + 544 + 0 + 0 + + + 205 + 603 + 753 + 5 + 0 + + + 37 + 80 + 434 + 4 + 0 + + + 70 + 124 + 280 + 0 + 0 + + + 34 + 56 + 620 + 0 + 0 + + + 32 + 338 + 717 + 0 + 0 + + + 70 + 242 + 428 + 0 + 0 + + + 70 + 213 + 163 + 0 + 0 + + + 284 + 635 + 715 + 0 + 0 + + + 143 + 466 + 520 + 6 + 0 + + + 206 + 626 + 612 + 0 + 0 + + + 4 + 257 + 403 + 0 + 0 + + + 34 + 588 + 832 + 2 + 0 + + + 70 + 134 + 259 + 0 + 0 + + + 284 + 658 + 690 + 0 + 0 + + + 0 + 628 + 723 + 0 + 0 + + + 1 + 114 + 640 + 0 + 0 + + + 214 + 128 + 271 + 4 + 0 + + + 70 + 177 + 196 + 0 + 0 + + + 70 + 307 + 113 + 0 + 0 + + + 12 + 664 + 577 + 6 + 0 + + + 70 + 206 + 167 + 0 + 0 + + + 7 + 317 + 543 + 4 + 0 + + + 37 + 633 + 496 + 2 + 0 + + + 70 + 173 + 199 + 0 + 0 + + + 70 + 104 + 331 + 0 + 0 + + + 36 + 346 + 701 + 0 + 0 + + + 4 + 193 + 378 + 0 + 0 + + + 72 + 173 + 600 + 3 + 0 + + + 5 + 525 + 462 + 0 + 0 + + + 597 + 746 + 467 + 2 + 0 + + + 13 + 108 + 675 + 0 + 0 + + + 20 + 150 + 486 + 0 + 0 + + + 1 + 511 + 547 + 2 + 0 + + + 38 + 219 + 157 + 0 + 0 + + + 70 + 174 + 419 + 0 + 0 + + + 183 + 344 + 705 + 0 + 0 + + + 0 + 644 + 434 + 5 + 0 + + + 70 + 95 + 362 + 0 + 0 + + + 283 + 590 + 769 + 0 + 0 + + + 36 + 725 + 433 + 2 + 0 + + + 4 + 117 + 294 + 0 + 0 + + + 20 + 149 + 489 + 4 + 0 + + + 70 + 176 + 414 + 0 + 0 + + + 72 + 172 + 603 + 3 + 0 + + + 407 + 746 + 562 + 5 + 0 + + + 284 + 631 + 719 + 0 + 0 + + + 37 + 712 + 687 + 4 + 0 + + + 70 + 106 + 324 + 0 + 0 + + + 290 + 601 + 465 + 0 + 0 + + + 2 + 713 + 686 + 4 + 0 + + + 377 + 652 + 643 + 3 + 0 + + + 278 + 451 + 696 + 0 + 0 + + + 4 + 142 + 242 + 0 + 0 + + + 70 + 247 + 420 + 0 + 0 + + + 1 + 250 + 567 + 0 + 0 + + + 42 + 268 + 128 + 4 + 0 + + + 0 + 551 + 440 + 0 + 0 + + + 6 + 338 + 626 + 0 + 0 + + + 0 + 509 + 549 + 2 + 0 + + + 70 + 114 + 301 + 0 + 0 + + + 20 + 499 + 560 + 0 + 0 + + + 205 + 157 + 464 + 0 + 0 + + + 37 + 714 + 685 + 4 + 0 + + + 34 + 66 + 520 + 1 + 0 + + + 0 + 595 + 822 + 0 + 0 + + + 284 + 482 + 439 + 2 + 0 + + + 34 + 414 + 511 + 1 + 0 + + + 283 + 466 + 454 + 2 + 0 + + + 70 + 280 + 260 + 0 + 0 + + + 205 + 200 + 364 + 0 + 0 + + + 34 + 61 + 566 + 7 + 0 + + + 38 + 89 + 388 + 0 + 0 + + + 37 + 323 + 655 + 0 + 0 + + + 278 + 523 + 464 + 0 + 0 + + + 46 + 520 + 604 + 2 + 0 + + + 1 + 550 + 508 + 0 + 0 + + + 284 + 633 + 717 + 0 + 0 + + + 36 + 338 + 718 + 0 + 0 + + + 34 + 585 + 836 + 0 + 0 + + + 7 + 715 + 684 + 0 + 0 + + + 597 + 746 + 514 + 2 + 0 + + + 284 + 469 + 451 + 2 + 0 + + + 70 + 81 + 426 + 0 + 0 + + + 597 + 727 + 432 + 4 + 0 + + + 0 + 626 + 725 + 0 + 0 + + + 72 + 174 + 597 + 3 + 0 + + + 4 + 322 + 226 + 0 + 0 + + + 191 + 570 + 551 + 2 + 0 + + + 70 + 176 + 196 + 0 + 0 + + + 1 + 117 + 622 + 0 + 0 + + + 1 + 167 + 622 + 0 + 0 + + + 70 + 93 + 371 + 0 + 0 + + + 47 + 716 + 683 + 4 + 0 + + + 0 + 717 + 438 + 3 + 0 + + + 70 + 333 + 312 + 0 + 0 + + + 156 + 265 + 650 + 2 + 0 + + + 153 + 614 + 455 + 0 + 0 + + + 70 + 708 + 641 + 0 + 0 + + + 72 + 172 + 604 + 3 + 0 + + + 445 + 681 + 563 + 6 + 0 + + + 20 + 220 + 472 + 0 + 0 + + + 37 + 63 + 547 + 7 + 0 + + + 205 + 334 + 424 + 0 + 0 + + + 4 + 214 + 340 + 0 + 0 + + + 290 + 602 + 464 + 0 + 0 + + + 143 + 463 + 524 + 4 + 0 + + + 70 + 109 + 316 + 0 + 0 + + + 70 + 101 + 341 + 0 + 0 + + + 70 + 205 + 168 + 0 + 0 + + + 4 + 168 + 205 + 0 + 0 + + + 597 + 722 + 531 + 4 + 0 + + + 938 + 659 + 742 + 2 + 0 + + + 70 + 292 + 249 + 0 + 0 + + + 597 + 680 + 512 + 0 + 0 + + + 34 + 587 + 833 + 2 + 0 + + + 214 + 131 + 263 + 3 + 0 + + + 70 + 209 + 348 + 0 + 0 + + + 0 + 114 + 638 + 0 + 0 + + + 4 + 198 + 174 + 0 + 0 + + + 70 + 174 + 198 + 0 + 0 + + + 284 + 640 + 709 + 0 + 0 + + + 70 + 202 + 360 + 0 + 0 + + + 0 + 79 + 436 + 4 + 0 + + + 402 + 65 + 530 + 0 + 0 + + + 394 + 522 + 667 + 1 + 0 + + + 205 + 272 + 243 + 4 + 0 + + + 0 + 610 + 519 + 0 + 0 + + + 20 + 83 + 471 + 0 + 0 + + + 407 + 692 + 658 + 2 + 0 + + + 445 + 623 + 608 + 0 + 0 + + + 0 + 631 + 551 + 0 + 0 + + + 70 + 92 + 425 + 0 + 0 + + + 20 + 533 + 594 + 0 + 0 + + + 1 + 89 + 439 + 4 + 0 + + + 70 + 173 + 382 + 0 + 0 + + + 70 + 222 + 176 + 0 + 0 + + + 111 + 273 + 371 + 0 + 0 + + + 1 + 500 + 572 + 0 + 0 + + + 960 + 628 + 725 + 0 + 0 + + + 37 + 680 + 557 + 6 + 0 + + + 70 + 141 + 277 + 0 + 0 + + + 70 + 166 + 398 + 0 + 0 + + + 4 + 291 + 348 + 0 + 0 + + + 38 + 279 + 140 + 0 + 0 + + + 70 + 217 + 180 + 0 + 0 + + + 284 + 632 + 672 + 0 + 0 + + + 284 + 644 + 707 + 0 + 0 + + + 4 + 158 + 641 + 0 + 0 + + + 45 + 538 + 704 + 4 + 0 + + + 70 + 102 + 383 + 0 + 0 + + + 143 + 332 + 199 + 6 + 0 + + + 0 + 415 + 496 + 6 + 0 + + + 70 + 244 + 160 + 0 + 0 + + + 205 + 160 + 244 + 0 + 0 + + + 139 + 327 + 550 + 4 + 0 + + + 285 + 525 + 603 + 0 + 0 + + + 1 + 568 + 667 + 0 + 0 + + + 34 + 699 + 542 + 1 + 0 + + + 0 + 522 + 548 + 0 + 0 + + + 1 + 629 + 724 + 6 + 0 + + + 7 + 127 + 521 + 4 + 0 + + + 284 + 660 + 690 + 0 + 0 + + + 1 + 218 + 465 + 0 + 1 + + + 34 + 155 + 654 + 0 + 0 + + + 38 + 246 + 269 + 0 + 0 + + + 70 + 95 + 412 + 0 + 0 + + + 70 + 266 + 381 + 0 + 0 + + + 34 + 593 + 534 + 6 + 0 + + + 70 + 225 + 294 + 0 + 0 + + + 7 + 715 + 679 + 4 + 0 + + + 1 + 571 + 744 + 0 + 0 + + + 951 + 637 + 811 + 0 + 0 + + + 51 + 604 + 754 + 0 + 0 + + + 597 + 733 + 432 + 4 + 0 + + + 306 + 723 + 481 + 1 + 0 + + + 70 + 161 + 243 + 0 + 0 + + + 0 + 537 + 449 + 0 + 0 + + + 20 + 620 + 611 + 2 + 0 + + + 0 + 634 + 670 + 0 + 0 + + + 113 + 337 + 611 + 0 + 0 + + + 37 + 618 + 613 + 7 + 0 + + + 20 + 617 + 614 + 2 + 0 + + + 218 + 151 + 259 + 2 + 0 + + + 7 + 612 + 619 + 6 + 0 + + + 6 + 613 + 618 + 0 + 0 + + + 1 + 145 + 456 + 2 + 0 + + + 0 + 301 + 684 + 4 + 0 + + + 22 + 341 + 707 + 4 + 0 + + + 0 + 580 + 837 + 7 + 0 + + + 1 + 90 + 433 + 4 + 0 + + + 70 + 179 + 370 + 0 + 0 + + + 218 + 151 + 258 + 2 + 0 + + + 32 + 337 + 715 + 0 + 0 + + + 306 + 691 + 548 + 2 + 0 + + + 143 + 466 + 517 + 6 + 0 + + + 70 + 308 + 215 + 0 + 0 + + + 4 + 178 + 372 + 0 + 0 + + + 70 + 205 + 323 + 0 + 0 + + + 1 + 681 + 713 + 0 + 0 + + + 278 + 713 + 681 + 0 + 0 + + + 575 + 691 + 458 + 0 + 0 + + + 1 + 79 + 493 + 1 + 0 + + + 70 + 289 + 350 + 0 + 0 + + + 36 + 601 + 476 + 4 + 0 + + + 37 + 608 + 572 + 0 + 0 + + + 0 + 206 + 491 + 0 + 0 + + + 284 + 642 + 709 + 0 + 0 + + + 55 + 168 + 602 + 0 + 0 + + + 313 + 674 + 516 + 3 + 0 + + + 597 + 697 + 499 + 2 + 0 + + + 144 + 334 + 435 + 2 + 0 + + + 55 + 668 + 636 + 4 + 0 + + + 4 + 317 + 319 + 0 + 0 + + + 164 + 740 + 470 + 0 + 0 + + + 218 + 149 + 262 + 0 + 0 + + + 1 + 711 + 683 + 1 + 1 + + + 597 + 672 + 471 + 6 + 0 + + + 34 + 223 + 652 + 0 + 0 + + + 48 + 605 + 575 + 2 + 0 + + + 3 + 127 + 522 + 0 + 0 + + + 20 + 603 + 755 + 4 + 0 + + + 143 + 665 + 639 + 0 + 0 + + + 70 + 626 + 605 + 6 + 0 + + + 4 + 253 + 262 + 0 + 0 + + + 36 + 731 + 433 + 7 + 0 + + + 284 + 635 + 717 + 0 + 0 + + + 218 + 153 + 255 + 0 + 0 + + + 284 + 624 + 681 + 2 + 0 + + + 38 + 235 + 166 + 0 + 0 + + + 70 + 94 + 415 + 0 + 0 + + + 145 + 283 + 2958 + 2 + 0 + + + 34 + 700 + 541 + 1 + 0 + + + 1 + 76 + 513 + 1 + 0 + + + 285 + 464 + 444 + 6 + 0 + + + 951 + 636 + 812 + 4 + 0 + + + 205 + 213 + 311 + 0 + 0 + + + 5 + 516 + 467 + 0 + 0 + + + 70 + 174 + 224 + 0 + 0 + + + 284 + 639 + 713 + 0 + 0 + + + 45 + 522 + 607 + 6 + 0 + + + 34 + 103 + 644 + 4 + 0 + + + 0 + 88 + 447 + 4 + 0 + + + 114 + 339 + 608 + 4 + 0 + + + 284 + 671 + 679 + 2 + 0 + + + 284 + 454 + 454 + 2 + 0 + + + 70 + 129 + 305 + 0 + 0 + + + 70 + 212 + 313 + 0 + 0 + + + 284 + 669 + 681 + 2 + 0 + + + 194 + 409 + 504 + 4 + 0 + + + 14 + 129 + 1598 + 0 + 0 + + + 1 + 133 + 499 + 0 + 0 + + + 34 + 73 + 539 + 7 + 0 + + + 4 + 274 + 242 + 0 + 0 + + + 205 + 605 + 753 + 5 + 0 + + + 218 + 150 + 262 + 0 + 0 + + + 34 + 108 + 614 + 4 + 0 + + + 395 + 619 + 834 + 7 + 0 + + + 1 + 275 + 655 + 0 + 1 + + + 70 + 126 + 312 + 0 + 0 + + + 70 + 175 + 379 + 0 + 0 + + + 70 + 189 + 208 + 0 + 0 + + + 34 + 72 + 546 + 7 + 0 + + + 16 + 450 + 704 + 2 + 0 + + + 306 + 512 + 558 + 0 + 0 + + + 0 + 313 + 463 + 0 + 0 + + + 284 + 667 + 683 + 2 + 0 + + + 279 + 634 + 766 + 0 + 0 + + + 395 + 521 + 668 + 1 + 0 + + + 70 + 200 + 197 + 0 + 0 + + + 7 + 127 + 523 + 0 + 0 + + + 597 + 713 + 531 + 4 + 0 + + + 1 + 152 + 437 + 0 + 0 + + + 100 + 621 + 845 + 6 + 0 + + + 70 + 228 + 636 + 0 + 0 + + + 220 + 151 + 261 + 6 + 0 + + + 34 + 591 + 771 + 0 + 0 + + + 284 + 628 + 676 + 0 + 0 + + + 34 + 630 + 833 + 1 + 0 + + + 38 + 272 + 244 + 0 + 0 + + + 4 + 310 + 326 + 0 + 0 + + + 21 + 537 + 705 + 6 + 0 + + + 70 + 160 + 246 + 0 + 0 + + + 205 + 155 + 254 + 0 + 0 + + + 32 + 495 + 703 + 6 + 0 + + + 70 + 92 + 428 + 0 + 0 + + + 0 + 728 + 520 + 0 + 0 + + + 34 + 706 + 536 + 4 + 0 + + + 405 + 666 + 775 + 3 + 0 + + + 113 + 337 + 612 + 0 + 0 + + + 70 + 132 + 297 + 0 + 0 + + + 0 + 163 + 619 + 0 + 0 + + + 34 + 766 + 494 + 3 + 0 + + + 192 + 739 + 471 + 0 + 0 + + + 284 + 630 + 674 + 0 + 0 + + + 4 + 195 + 341 + 0 + 0 + + + 915 + 699 + 695 + 2 + 0 + + + 647 + 692 + 503 + 0 + 0 + + + 70 + 129 + 304 + 0 + 0 + + + 1 + 579 + 547 + 2 + 0 + + + 284 + 662 + 688 + 0 + 0 + + + 4 + 240 + 277 + 0 + 0 + + + 284 + 637 + 715 + 0 + 0 + + + 70 + 207 + 321 + 0 + 0 + + + 205 + 196 + 339 + 0 + 0 + + + 70 + 470 + 512 + 2 + 0 + + + 0 + 304 + 592 + 2 + 0 + + + 1 + 118 + 563 + 7 + 0 + + + 70 + 144 + 272 + 0 + 0 + + + 37 + 72 + 544 + 7 + 0 + + + 70 + 209 + 318 + 0 + 0 + + + 0 + 503 + 410 + 0 + 0 + + + 70 + 311 + 126 + 0 + 0 + + + 37 + 693 + 546 + 3 + 0 + + + 46 + 520 + 609 + 2 + 0 + + + 70 + 149 + 263 + 0 + 0 + + + 20 + 148 + 449 + 2 + 0 + + + 36 + 728 + 435 + 2 + 0 + + + 70 + 253 + 263 + 0 + 0 + + + 70 + 173 + 227 + 0 + 0 + + + 4 + 187 + 210 + 0 + 0 + + + 218 + 154 + 255 + 0 + 0 + + + 70 + 96 + 409 + 0 + 0 + + + 70 + 265 + 381 + 0 + 0 + + + 20 + 220 + 459 + 6 + 0 + + + 192 + 736 + 473 + 0 + 0 + + + 30 + 230 + 631 + 6 + 0 + + + 70 + 145 + 271 + 0 + 0 + + + 1 + 81 + 485 + 1 + 0 + + + 34 + 697 + 543 + 1 + 0 + + + 70 + 180 + 561 + 0 + 0 + + + 1 + 127 + 524 + 1 + 1 + + + 70 + 211 + 186 + 0 + 0 + + + 51 + 283 + 2957 + 6 + 0 + + + 70 + 127 + 309 + 0 + 0 + + + 284 + 664 + 686 + 0 + 0 + + + 97 + 661 + 735 + 7 + 0 + + + 0 + 517 + 399 + 0 + 0 + + + 218 + 151 + 260 + 2 + 0 + + + 597 + 672 + 518 + 6 + 0 + + + 203 + 219 + 461 + 0 + 0 + + + 38 + 251 + 265 + 0 + 0 + + + 284 + 482 + 428 + 6 + 0 + + + 5 + 317 + 568 + 0 + 0 + + + 38 + 253 + 399 + 0 + 0 + + + 29 + 428 + 482 + 4 + 0 + + + 1 + 621 + 559 + 6 + 0 + + + 4 + 298 + 220 + 0 + 0 + + + 70 + 237 + 167 + 0 + 0 + + + 70 + 311 + 324 + 0 + 0 + + + 205 + 192 + 206 + 0 + 0 + + + 15 + 655 + 530 + 4 + 0 + + + 0 + 689 + 549 + 1 + 0 + + + 205 + 262 + 151 + 0 + 0 + + + 219 + 151 + 262 + 0 + 0 + + + 284 + 663 + 686 + 0 + 0 + + + 46 + 525 + 604 + 2 + 0 + + + 962 + 662 + 781 + 7 + 0 + + + 70 + 138 + 287 + 0 + 0 + + + 36 + 349 + 514 + 0 + 0 + + + 1 + 88 + 450 + 4 + 0 + + + 70 + 132 + 300 + 0 + 0 + + + 34 + 227 + 444 + 4 + 0 + + + 597 + 734 + 432 + 4 + 0 + + + 37 + 608 + 571 + 0 + 0 + + + 70 + 321 + 314 + 0 + 0 + + + 0 + 89 + 445 + 4 + 0 + + + 1 + 318 + 649 + 2 + 0 + + + 115 + 340 + 607 + 0 + 0 + + + 70 + 244 + 413 + 0 + 0 + + + 419 + 647 + 703 + 0 + 0 + + + 38 + 634 + 828 + 1 + 0 + + + 1 + 508 + 564 + 0 + 0 + + + 143 + 461 + 524 + 4 + 0 + + + 273 + 453 + 700 + 6 + 0 + + + 395 + 519 + 669 + 1 + 0 + + + 1 + 317 + 566 + 0 + 1 + + + 1 + 337 + 717 + 0 + 0 + + + 960 + 630 + 722 + 0 + 0 + + + 284 + 665 + 684 + 2 + 0 + + + 63 + 467 + 442 + 6 + 0 + + + 205 + 106 + 374 + 0 + 0 + + + 194 + 736 + 514 + 0 + 0 + + + 70 + 224 + 450 + 6 + 0 + + + 1 + 582 + 729 + 1 + 0 + + + 1 + 614 + 691 + 0 + 1 + + + 70 + 320 + 205 + 0 + 0 + + + 4 + 100 + 656 + 0 + 0 + + + 70 + 240 + 420 + 0 + 0 + + + 285 + 582 + 835 + 6 + 0 + + + 306 + 683 + 666 + 0 + 0 + + + 0 + 347 + 517 + 0 + 0 + + + 884 + 729 + 582 + 2 + 0 + + + 34 + 207 + 487 + 0 + 0 + + + 377 + 609 + 798 + 6 + 0 + + + 284 + 638 + 713 + 0 + 0 + + + 34 + 205 + 492 + 0 + 0 + + + 445 + 672 + 563 + 6 + 0 + + + 218 + 152 + 261 + 0 + 0 + + + 34 + 72 + 551 + 7 + 0 + + + 1 + 583 + 544 + 6 + 0 + + + 114 + 339 + 609 + 4 + 0 + + + 70 + 325 + 122 + 0 + 0 + + + 58 + 131 + 501 + 6 + 0 + + + 70 + 103 + 385 + 0 + 0 + + + 284 + 667 + 682 + 2 + 0 + + + 70 + 335 + 301 + 0 + 0 + + + 0 + 728 + 477 + 1 + 0 + + + 34 + 674 + 561 + 1 + 0 + + + 70 + 276 + 238 + 0 + 0 + + + 285 + 464 + 445 + 6 + 0 + + + 143 + 273 + 2954 + 6 + 0 + + + 29 + 277 + 647 + 4 + 0 + + + 284 + 624 + 680 + 2 + 0 + + + 4 + 173 + 228 + 0 + 0 + + + 1 + 85 + 464 + 0 + 0 + + + 4 + 113 + 349 + 0 + 0 + + + 0 + 310 + 467 + 0 + 0 + + + 4 + 248 + 159 + 0 + 0 + + + 6 + 215 + 468 + 0 + 0 + + + 4 + 248 + 265 + 0 + 0 + + + 1 + 462 + 447 + 0 + 1 + + + 38 + 168 + 235 + 0 + 0 + + + 1 + 86 + 459 + 0 + 0 + + + 34 + 103 + 638 + 4 + 0 + + + 70 + 177 + 223 + 0 + 0 + + + 34 + 765 + 454 + 3 + 0 + + + 284 + 659 + 690 + 0 + 0 + + + 70 + 218 + 181 + 0 + 0 + + + 4 + 219 + 300 + 0 + 0 + + + 37 + 634 + 500 + 2 + 0 + + + 3 + 129 + 1601 + 0 + 0 + + + 1 + 643 + 756 + 0 + 1 + + + 284 + 636 + 715 + 0 + 0 + + + 1 + 153 + 658 + 0 + 0 + + + 1 + 306 + 586 + 2 + 0 + + + 284 + 626 + 678 + 2 + 0 + + + 884 + 728 + 583 + 6 + 0 + + + 34 + 163 + 618 + 0 + 0 + + + 71 + 278 + 645 + 6 + 0 + + + 284 + 454 + 455 + 6 + 0 + + + 7 + 616 + 689 + 0 + 0 + + + 37 + 647 + 490 + 0 + 0 + + + 25 + 617 + 613 + 0 + 0 + + + 70 + 106 + 373 + 0 + 0 + + + 37 + 618 + 612 + 6 + 0 + + + 1 + 614 + 616 + 3 + 1 + + + 6 + 299 + 1521 + 4 + 0 + + + 101 + 72 + 549 + 0 + 0 + + + 20 + 177 + 569 + 0 + 0 + + + 597 + 746 + 507 + 2 + 0 + + + 34 + 632 + 818 + 0 + 0 + + + 34 + 89 + 444 + 4 + 0 + + + 205 + 304 + 130 + 0 + 0 + + + 284 + 661 + 688 + 0 + 0 + + + 1 + 252 + 573 + 0 + 0 + + + 1 + 590 + 824 + 0 + 0 + + + 302 + 638 + 762 + 4 + 0 + + + 70 + 329 + 121 + 0 + 0 + + + 70 + 335 + 431 + 0 + 0 + + + 36 + 212 + 474 + 0 + 0 + + + 69 + 756 + 500 + 3 + 0 + + + 70 + 110 + 362 + 0 + 0 + + + 205 + 235 + 280 + 0 + 0 + + + 565 + 700 + 540 + 2 + 0 + + + 47 + 716 + 679 + 4 + 0 + + + 0 + 84 + 474 + 0 + 0 + + + 960 + 632 + 720 + 0 + 0 + + + 37 + 71 + 561 + 7 + 0 + + + 284 + 629 + 674 + 0 + 0 + + + 194 + 736 + 472 + 0 + 0 + + + 34 + 584 + 726 + 0 + 0 + + + 38 + 288 + 349 + 0 + 0 + + + 70 + 290 + 227 + 0 + 0 + + + 3 + 715 + 680 + 0 + 0 + + + 70 + 326 + 443 + 4 + 0 + + + 25 + 475 + 435 + 2 + 0 + + + 0 + 209 + 481 + 0 + 0 + + + 285 + 486 + 653 + 1 + 0 + + + 1 + 519 + 465 + 1 + 1 + + + 1 + 282 + 637 + 0 + 0 + + + 70 + 284 + 354 + 0 + 0 + + + 1 + 118 + 558 + 7 + 0 + + + 70 + 97 + 411 + 0 + 0 + + + 36 + 632 + 831 + 1 + 0 + + + 597 + 672 + 517 + 6 + 0 + + + 284 + 633 + 719 + 0 + 0 + + + 111 + 266 + 378 + 0 + 0 + + + 597 + 712 + 531 + 4 + 0 + + + 38 + 254 + 157 + 0 + 0 + + + 597 + 680 + 511 + 2 + 0 + + + 34 + 112 + 588 + 1 + 0 + + + 58 + 604 + 474 + 6 + 0 + + + 1 + 321 + 450 + 3 + 1 + + + 34 + 59 + 676 + 2 + 0 + + + 34 + 762 + 456 + 3 + 0 + + + 63 + 628 + 602 + 6 + 0 + + + 34 + 72 + 554 + 7 + 0 + + + 45 + 537 + 704 + 4 + 0 + + + 41 + 602 + 756 + 4 + 0 + + + 70 + 181 + 364 + 0 + 0 + + + 283 + 522 + 608 + 1 + 0 + + + 70 + 235 + 428 + 0 + 0 + + + 285 + 224 + 449 + 2 + 0 + + + 70 + 249 + 404 + 0 + 0 + + + 143 + 668 + 566 + 0 + 0 + + + 284 + 631 + 672 + 0 + 0 + + + 70 + 184 + 217 + 0 + 0 + + + 101 + 73 + 547 + 0 + 0 + + + 218 + 153 + 261 + 0 + 0 + + + 38 + 134 + 298 + 0 + 0 + + + 70 + 164 + 402 + 0 + 0 + + + 164 + 741 + 469 + 7 + 0 + + + 70 + 189 + 210 + 0 + 0 + + + 70 + 162 + 245 + 0 + 0 + + + 284 + 671 + 678 + 2 + 0 + + + 1 + 683 + 712 + 0 + 0 + + + 3 + 333 + 434 + 0 + 0 + + + 285 + 224 + 448 + 2 + 0 + + + 29 + 428 + 483 + 4 + 0 + + + 284 + 669 + 680 + 2 + 0 + + + 597 + 672 + 472 + 6 + 0 + + + 205 + 239 + 420 + 0 + 0 + + + 70 + 283 + 233 + 0 + 0 + + + 118 + 343 + 601 + 6 + 0 + + + 0 + 207 + 485 + 0 + 0 + + + 0 + 497 + 416 + 0 + 0 + + + 25 + 711 + 684 + 0 + 0 + + + 205 + 605 + 752 + 3 + 0 + + + 4 + 235 + 169 + 0 + 0 + + + 70 + 301 + 132 + 0 + 0 + + + 1 + 133 + 496 + 0 + 0 + + + 54 + 709 + 533 + 1 + 0 + + + 960 + 631 + 721 + 0 + 0 + + + 284 + 482 + 429 + 6 + 0 + + + 36 + 663 + 432 + 2 + 0 + + + 38 + 206 + 193 + 0 + 0 + + + 70 + 106 + 375 + 0 + 0 + + + 0 + 92 + 432 + 4 + 0 + + + 70 + 97 + 410 + 0 + 0 + + + 70 + 161 + 410 + 0 + 0 + + + 34 + 659 + 738 + 0 + 0 + + + 192 + 754 + 461 + 0 + 0 + + + 0 + 311 + 465 + 0 + 0 + + + 0 + 90 + 442 + 4 + 0 + + + 273 + 651 + 534 + 2 + 0 + + + 47 + 631 + 599 + 4 + 0 + + + 597 + 746 + 466 + 2 + 0 + + + 55 + 668 + 635 + 6 + 0 + + + 70 + 116 + 343 + 0 + 0 + + + 70 + 230 + 173 + 0 + 0 + + + 1 + 58 + 686 + 1 + 1 + + + 34 + 103 + 641 + 4 + 0 + + + 15 + 468 + 678 + 4 + 0 + + + 703 + 297 + 134 + 6 + 0 + + + 36 + 744 + 508 + 1 + 0 + + + 70 + 321 + 313 + 0 + 0 + + + 1 + 669 + 727 + 7 + 0 + + + 38 + 105 + 379 + 0 + 0 + + + 205 + 178 + 371 + 0 + 0 + + + 0 + 651 + 440 + 5 + 0 + + + 1 + 148 + 454 + 2 + 0 + + + 1 + 151 + 445 + 0 + 0 + + + 97 + 661 + 736 + 7 + 0 + + + 0 + 162 + 632 + 0 + 0 + + + 1 + 59 + 681 + 1 + 1 + + + 307 + 494 + 577 + 0 + 0 + + + 597 + 719 + 439 + 6 + 0 + + + 1 + 280 + 639 + 0 + 1 + + + 285 + 228 + 449 + 2 + 0 + + + 70 + 230 + 627 + 0 + 0 + + + 960 + 633 + 721 + 0 + 0 + + + 284 + 641 + 712 + 2 + 0 + + + 110 + 69 + 582 + 0 + 0 + + + 71 + 618 + 689 + 4 + 0 + + + 70 + 326 + 206 + 0 + 0 + + + 36 + 600 + 475 + 3 + 0 + + + 36 + 694 + 701 + 0 + 0 + + + 306 + 699 + 496 + 2 + 0 + + + 36 + 346 + 517 + 0 + 0 + + + 0 + 526 + 600 + 0 + 0 + + + 1 + 635 + 546 + 0 + 0 + + + 0 + 733 + 473 + 1 + 0 + + + 1 + 145 + 463 + 2 + 0 + + + 3 + 593 + 718 + 0 + 0 + + + 34 + 137 + 490 + 1 + 0 + + + 192 + 736 + 471 + 0 + 0 + + + 308 + 523 + 459 + 0 + 0 + + + 192 + 689 + 706 + 0 + 0 + + + 35 + 62 + 647 + 0 + 0 + + + 284 + 482 + 425 + 6 + 0 + + + 70 + 701 + 651 + 1 + 0 + + + 4 + 102 + 658 + 0 + 0 + + + 284 + 628 + 678 + 2 + 0 + + + 377 + 598 + 712 + 7 + 0 + + + 70 + 249 + 161 + 0 + 0 + + + 70 + 275 + 244 + 0 + 0 + + + 70 + 161 + 249 + 0 + 0 + + + 3 + 279 + 641 + 0 + 0 + + + 70 + 310 + 330 + 0 + 0 + + + 1 + 83 + 483 + 1 + 0 + + + 1 + 299 + 685 + 4 + 0 + + + 397 + 573 + 743 + 0 + 0 + + + 70 + 293 + 229 + 0 + 0 + + + 193 + 602 + 473 + 0 + 1 + + + 34 + 60 + 668 + 0 + 0 + + + 284 + 640 + 713 + 0 + 0 + + + 419 + 695 + 454 + 2 + 0 + + + 101 + 73 + 549 + 0 + 0 + + + 38 + 128 + 313 + 0 + 0 + + + 145 + 473 + 433 + 4 + 0 + + + 394 + 605 + 804 + 1 + 0 + + + 1 + 219 + 467 + 1 + 1 + + + 220 + 276 + 243 + 4 + 0 + + + 38 + 660 + 737 + 2 + 0 + + + 1 + 339 + 708 + 0 + 1 + + + 102 + 68 + 589 + 0 + 0 + + + 0 + 673 + 678 + 0 + 0 + + + 72 + 171 + 598 + 3 + 0 + + + 0 + 234 + 437 + 4 + 0 + + + 37 + 136 + 495 + 0 + 0 + + + 34 + 110 + 612 + 4 + 0 + + + 284 + 632 + 674 + 0 + 0 + + + 1 + 338 + 710 + 0 + 0 + + + 0 + 760 + 497 + 3 + 0 + + + 261 + 406 + 505 + 0 + 0 + + + 0 + 505 + 406 + 0 + 0 + + + 565 + 706 + 535 + 2 + 0 + + + 34 + 682 + 669 + 0 + 0 + + + 284 + 669 + 682 + 2 + 0 + + + 3 + 126 + 534 + 0 + 0 + + + 1 + 295 + 606 + 2 + 0 + + + 0 + 494 + 415 + 0 + 0 + + + 0 + 763 + 495 + 3 + 0 + + + 70 + 202 + 333 + 0 + 0 + + + 1 + 137 + 491 + 1 + 0 + + + 205 + 320 + 125 + 0 + 0 + + + 38 + 598 + 763 + 7 + 0 + + + 284 + 671 + 680 + 2 + 0 + + + 38 + 117 + 342 + 0 + 0 + + + 218 + 278 + 242 + 2 + 0 + + + 0 + 674 + 468 + 3 + 0 + + + 284 + 667 + 684 + 2 + 0 + + + 10 + 468 + 438 + 2 + 0 + + + 106 + 68 + 588 + 0 + 0 + + + 34 + 676 + 513 + 2 + 0 + + + 164 + 741 + 468 + 0 + 0 + + + 36 + 749 + 463 + 1 + 0 + + + 951 + 638 + 811 + 0 + 0 + + + 3 + 594 + 717 + 0 + 0 + + + 205 + 99 + 404 + 0 + 0 + + + 70 + 198 + 202 + 0 + 0 + + + 97 + 662 + 735 + 7 + 0 + + + 70 + 205 + 195 + 0 + 0 + + + 1 + 119 + 565 + 7 + 0 + + + 597 + 680 + 510 + 2 + 0 + + + 0 + 437 + 469 + 0 + 0 + + + 411 + 615 + 614 + 2 + 0 + + + 4 + 245 + 417 + 0 + 0 + + + 10 + 469 + 437 + 4 + 0 + + + 34 + 223 + 647 + 0 + 0 + + + 70 + 106 + 377 + 0 + 0 + + + 597 + 672 + 516 + 6 + 0 + + + 70 + 97 + 412 + 0 + 0 + + + 34 + 72 + 555 + 7 + 0 + + + 1 + 105 + 640 + 0 + 0 + + + 1 + 259 + 557 + 1 + 1 + + + 15 + 226 + 452 + 2 + 0 + + + 70 + 193 + 207 + 0 + 0 + + + 284 + 630 + 676 + 0 + 0 + + + 1 + 82 + 493 + 1 + 0 + + + 5 + 468 + 675 + 0 + 0 + + + 115 + 338 + 607 + 0 + 0 + + + 0 + 154 + 438 + 0 + 0 + + + 70 + 120 + 337 + 0 + 0 + + + 20 + 608 + 621 + 4 + 0 + + + 284 + 624 + 682 + 2 + 0 + + + 20 + 177 + 577 + 0 + 0 + + + 428 + 743 + 467 + 6 + 0 + + + 1 + 309 + 664 + 0 + 0 + + + 395 + 649 + 750 + 2 + 0 + + + 43 + 643 + 757 + 0 + 0 + + + 72 + 171 + 597 + 3 + 0 + + + 525 + 683 + 508 + 2 + 0 + + + 1 + 92 + 439 + 4 + 0 + + + 1 + 321 + 639 + 2 + 0 + + + 4 + 102 + 396 + 0 + 0 + + + 143 + 273 + 2950 + 6 + 0 + + + 1 + 144 + 468 + 2 + 0 + + + 164 + 732 + 474 + 0 + 0 + + + 379 + 565 + 504 + 0 + 0 + + + 45 + 212 + 679 + 2 + 0 + + + 70 + 166 + 406 + 0 + 0 + + + 597 + 672 + 470 + 6 + 0 + + + 37 + 629 + 726 + 0 + 0 + + + 70 + 254 + 402 + 0 + 0 + + + 70 + 214 + 315 + 0 + 0 + + + 597 + 711 + 531 + 4 + 0 + + + 205 + 274 + 246 + 4 + 0 + + + 205 + 156 + 259 + 0 + 0 + + + 70 + 238 + 429 + 0 + 0 + + + 1088 + 80 + 505 + 0 + 0 + + + 38 + 186 + 217 + 0 + 0 + + + 205 + 115 + 351 + 0 + 0 + + + 283 + 464 + 442 + 6 + 0 + + + 7 + 279 + 642 + 0 + 0 + + + 4 + 236 + 171 + 0 + 0 + + + 70 + 171 + 236 + 0 + 0 + + + 1 + 350 + 586 + 0 + 0 + + + 70 + 261 + 391 + 0 + 0 + + + 1106 + 537 + 703 + 0 + 0 + + + 6 + 303 + 1507 + 0 + 0 + + + 0 + 443 + 463 + 0 + 0 + + + 283 + 621 + 833 + 0 + 0 + + + 153 + 550 + 436 + 0 + 0 + + + 70 + 180 + 567 + 6 + 0 + + + 70 + 259 + 260 + 0 + 0 + + + 104 + 74 + 545 + 4 + 0 + + + 597 + 731 + 432 + 4 + 0 + + + 70 + 201 + 335 + 0 + 0 + + + 70 + 128 + 315 + 0 + 0 + + + 145 + 465 + 441 + 0 + 0 + + + 284 + 644 + 709 + 0 + 0 + + + 70 + 186 + 362 + 0 + 0 + + + 1 + 78 + 517 + 1 + 0 + + + 0 + 636 + 669 + 0 + 0 + + + 597 + 746 + 506 + 2 + 0 + + + 1 + 273 + 656 + 1 + 1 + + + 951 + 637 + 812 + 4 + 0 + + + 218 + 276 + 244 + 6 + 0 + + + 597 + 746 + 465 + 5 + 0 + + + 386 + 540 + 699 + 4 + 0 + + + 34 + 477 + 662 + 0 + 0 + + + 219 + 278 + 243 + 0 + 0 + + + 32 + 472 + 669 + 0 + 0 + + + 284 + 635 + 719 + 0 + 0 + + + 36 + 753 + 461 + 1 + 0 + + + 36 + 658 + 433 + 2 + 0 + + + 0 + 425 + 483 + 6 + 0 + + + 196 + 341 + 602 + 0 + 0 + + + 34 + 699 + 540 + 1 + 0 + + + 0 + 645 + 660 + 4 + 0 + + + 597 + 697 + 498 + 2 + 0 + + + 0 + 628 + 727 + 0 + 0 + + + 1 + 106 + 637 + 0 + 0 + + + 284 + 626 + 680 + 2 + 0 + + + 70 + 220 + 183 + 0 + 0 + + + 70 + 122 + 330 + 0 + 0 + + + 98 + 651 + 485 + 6 + 0 + + + 395 + 488 + 647 + 0 + 0 + + + 37 + 647 + 488 + 0 + 0 + + + 283 + 588 + 828 + 0 + 0 + + + 34 + 56 + 719 + 2 + 0 + + + 36 + 601 + 474 + 4 + 0 + + + 205 + 252 + 268 + 0 + 0 + + + 34 + 93 + 433 + 4 + 0 + + + 0 + 730 + 517 + 1 + 0 + + + 1 + 87 + 463 + 0 + 0 + + + 70 + 159 + 253 + 0 + 0 + + + 647 + 690 + 503 + 0 + 0 + + + 938 + 657 + 741 + 2 + 0 + + + 0 + 108 + 625 + 0 + 0 + + + 37 + 90 + 447 + 4 + 0 + + + 1 + 118 + 572 + 0 + 0 + + + 4 + 263 + 153 + 0 + 0 + + + 70 + 157 + 430 + 0 + 0 + + + 3 + 611 + 568 + 0 + 0 + + + 1 + 467 + 676 + 0 + 1 + + + 4 + 269 + 379 + 0 + 0 + + + 210 + 258 + 156 + 2 + 0 + + + 70 + 174 + 388 + 0 + 0 + + + 425 + 711 + 444 + 0 + 0 + + + 205 + 319 + 126 + 0 + 0 + + + 0 + 639 + 494 + 6 + 0 + + + 0 + 449 + 457 + 0 + 0 + + + 1 + 718 + 678 + 1 + 0 + + + 70 + 150 + 268 + 0 + 0 + + + 4 + 120 + 335 + 0 + 0 + + + 111 + 271 + 376 + 0 + 0 + + + 70 + 188 + 542 + 0 + 0 + + + 284 + 454 + 452 + 2 + 0 + + + 1 + 217 + 2582 + 0 + 1 + + + 45 + 536 + 704 + 4 + 0 + + + 284 + 642 + 711 + 0 + 0 + + + 70 + 262 + 389 + 0 + 0 + + + 5 + 360 + 570 + 0 + 0 + + + 34 + 138 + 489 + 1 + 0 + + + 70 + 221 + 182 + 0 + 0 + + + 192 + 737 + 512 + 0 + 0 + + + 284 + 631 + 674 + 0 + 0 + + + 102 + 68 + 598 + 0 + 0 + + + 284 + 643 + 709 + 0 + 0 + + + 1 + 92 + 442 + 4 + 0 + + + 0 + 626 + 553 + 0 + 0 + + + 100 + 70 + 581 + 0 + 0 + + + 110 + 276 + 369 + 4 + 0 + + + 70 + 154 + 264 + 0 + 0 + + + 5 + 318 + 561 + 0 + 0 + + + 37 + 136 + 490 + 0 + 0 + + + 4 + 103 + 647 + 0 + 0 + + + 0 + 615 + 514 + 0 + 0 + + + 0 + 616 + 562 + 6 + 0 + + + 938 + 659 + 739 + 2 + 0 + + + 3 + 594 + 716 + 0 + 0 + + + 4 + 127 + 320 + 0 + 0 + + + 262 + 420 + 489 + 6 + 0 + + + 313 + 489 + 492 + 0 + 0 + + + 34 + 700 + 539 + 4 + 0 + + + 70 + 126 + 323 + 0 + 0 + + + 306 + 708 + 489 + 1 + 0 + + + 34 + 105 + 635 + 4 + 0 + + + 73 + 127 + 525 + 0 + 0 + + + 4 + 319 + 209 + 0 + 0 + + + 70 + 191 + 213 + 0 + 0 + + + 1 + 91 + 447 + 4 + 0 + + + 218 + 271 + 246 + 1 + 0 + + + 32 + 61 + 667 + 0 + 0 + + + 1 + 90 + 452 + 4 + 0 + + + 100 + 649 + 440 + 0 + 0 + + + 397 + 605 + 805 + 2 + 0 + + + 33 + 337 + 714 + 0 + 0 + + + 34 + 766 + 452 + 3 + 0 + + + 46 + 139 + 479 + 4 + 0 + + + 407 + 746 + 570 + 5 + 0 + + + 111 + 270 + 377 + 0 + 0 + + + 70 + 145 + 280 + 0 + 0 + + + 938 + 658 + 740 + 2 + 0 + + + 1 + 151 + 441 + 0 + 0 + + + 51 + 282 + 2966 + 2 + 0 + + + 597 + 680 + 509 + 2 + 0 + + + 3 + 603 + 574 + 2 + 0 + + + 283 + 482 + 426 + 6 + 0 + + + 4 + 157 + 424 + 0 + 0 + + + 34 + 75 + 541 + 7 + 0 + + + 63 + 298 + 689 + 4 + 0 + + + 37 + 645 + 490 + 6 + 0 + + + 951 + 638 + 812 + 4 + 0 + + + 100 + 616 + 841 + 1 + 0 + + + 32 + 476 + 664 + 0 + 0 + + + 285 + 487 + 649 + 1 + 0 + + + 34 + 202 + 504 + 0 + 0 + + + 306 + 592 + 770 + 6 + 0 + + + 284 + 634 + 719 + 0 + 0 + + + 101 + 74 + 549 + 0 + 0 + + + 0 + 579 + 841 + 5 + 0 + + + 70 + 282 + 361 + 0 + 0 + + + 34 + 165 + 617 + 0 + 0 + + + 1 + 359 + 572 + 3 + 1 + + + 1 + 72 + 563 + 0 + 0 + + + 284 + 641 + 711 + 2 + 0 + + + 1 + 603 + 524 + 0 + 0 + + + 29 + 664 + 568 + 0 + 0 + + + 1 + 225 + 452 + 0 + 1 + + + 70 + 187 + 357 + 0 + 0 + + + 306 + 681 + 464 + 2 + 0 + + + 718 + 748 + 463 + 2 + 0 + + + 36 + 740 + 468 + 1 + 0 + + + 205 + 277 + 241 + 4 + 0 + + + 34 + 684 + 462 + 3 + 0 + + + 70 + 185 + 550 + 0 + 0 + + + 70 + 323 + 315 + 0 + 0 + + + 38 + 254 + 263 + 0 + 0 + + + 877 + 731 + 582 + 7 + 0 + + + 285 + 464 + 443 + 6 + 0 + + + 70 + 252 + 161 + 0 + 0 + + + 283 + 458 + 690 + 4 + 0 + + + 5 + 724 + 521 + 4 + 0 + + + 70 + 124 + 327 + 0 + 0 + + + 205 + 314 + 324 + 0 + 0 + + + 17 + 299 + 1524 + 4 + 0 + + + 36 + 756 + 458 + 1 + 0 + + + 143 + 327 + 204 + 2 + 0 + + + 3 + 341 + 705 + 4 + 0 + + + 306 + 677 + 557 + 1 + 0 + + + 101 + 540 + 445 + 1 + 1 + + + 0 + 617 + 512 + 0 + 0 + + + 218 + 270 + 247 + 1 + 0 + + + 38 + 97 + 417 + 0 + 0 + + + 210 + 256 + 158 + 2 + 0 + + + 38 + 158 + 256 + 2 + 0 + + + 4 + 308 + 330 + 0 + 0 + + + 20 + 116 + 575 + 0 + 0 + + + 284 + 633 + 672 + 0 + 0 + + + 26 + 327 + 545 + 4 + 0 + + + 4 + 157 + 425 + 0 + 0 + + + 1 + 89 + 455 + 0 + 0 + + + 0 + 152 + 439 + 0 + 0 + + + 34 + 222 + 458 + 0 + 0 + + + 48 + 466 + 678 + 4 + 0 + + + 34 + 701 + 538 + 4 + 0 + + + 143 + 113 + 362 + 2 + 0 + + + 34 + 678 + 511 + 2 + 0 + + + 55 + 169 + 601 + 0 + 0 + + + 284 + 663 + 688 + 0 + 0 + + + 512 + 703 + 450 + 4 + 0 + + + 113 + 615 + 842 + 6 + 0 + + + 309 + 545 + 441 + 0 + 0 + + + 97 + 662 + 736 + 7 + 0 + + + 597 + 719 + 440 + 6 + 0 + + + 402 + 654 + 745 + 7 + 0 + + + 284 + 454 + 453 + 2 + 0 + + + 284 + 665 + 686 + 0 + 0 + + + 20 + 610 + 568 + 0 + 0 + + + 34 + 136 + 492 + 1 + 0 + + + 0 + 91 + 450 + 4 + 0 + + + 37 + 647 + 489 + 6 + 0 + + + 284 + 638 + 715 + 0 + 0 + + + 0 + 307 + 670 + 0 + 0 + + + 144 + 333 + 201 + 2 + 0 + + + 101 + 75 + 546 + 0 + 0 + + + 284 + 661 + 690 + 0 + 0 + + + 407 + 620 + 460 + 5 + 0 + + + 209 + 641 + 663 + 4 + 0 + + + 205 + 613 + 516 + 0 + 0 + + + 219 + 275 + 243 + 6 + 0 + + + 7 + 279 + 640 + 4 + 0 + + + 23 + 610 + 618 + 2 + 0 + + + 63 + 647 + 753 + 0 + 0 + + + 70 + 303 + 335 + 0 + 0 + + + 205 + 335 + 303 + 0 + 0 + + + 192 + 694 + 702 + 0 + 0 + + + 70 + 97 + 421 + 0 + 0 + + + 5 + 129 + 518 + 0 + 0 + + + 34 + 109 + 613 + 4 + 0 + + + 89 + 130 + 514 + 0 + 0 + + + 70 + 706 + 646 + 0 + 0 + + + 34 + 74 + 552 + 7 + 0 + + + 407 + 664 + 640 + 2 + 0 + + + 283 + 590 + 773 + 0 + 0 + + + 51 + 615 + 691 + 0 + 0 + + + 1 + 154 + 434 + 0 + 0 + + + 70 + 184 + 222 + 0 + 0 + + + 34 + 706 + 534 + 4 + 0 + + + 978 + 606 + 804 + 0 + 0 + + + 0 + 643 + 661 + 0 + 0 + + + 597 + 710 + 531 + 4 + 0 + + + 45 + 522 + 606 + 6 + 0 + + + 377 + 662 + 642 + 4 + 0 + + + 205 + 122 + 335 + 0 + 0 + + + 34 + 57 + 717 + 2 + 0 + + + 278 + 450 + 703 + 0 + 0 + + + 70 + 278 + 147 + 0 + 0 + + + 70 + 98 + 417 + 0 + 0 + + + 730 + 452 + 3378 + 7 + 0 + + + 20 + 614 + 614 + 4 + 0 + + + 597 + 697 + 497 + 2 + 0 + + + 205 + 280 + 146 + 0 + 0 + + + 192 + 739 + 469 + 0 + 0 + + + 181 + 603 + 473 + 3 + 1 + + + 70 + 182 + 224 + 0 + 0 + + + 34 + 689 + 459 + 3 + 0 + + + 32 + 493 + 703 + 6 + 0 + + + 34 + 91 + 448 + 4 + 0 + + + 34 + 222 + 457 + 0 + 0 + + + 445 + 623 + 605 + 0 + 0 + + + 284 + 645 + 707 + 0 + 0 + + + 284 + 636 + 717 + 0 + 0 + + + 70 + 242 + 277 + 0 + 0 + + + 597 + 732 + 432 + 4 + 0 + + + 0 + 525 + 392 + 0 + 0 + + + 4 + 120 + 340 + 0 + 0 + + + 4 + 253 + 265 + 0 + 0 + + + 143 + 666 + 566 + 0 + 0 + + + 4 + 203 + 201 + 0 + 0 + + + 70 + 201 + 203 + 0 + 0 + + + 284 + 629 + 676 + 0 + 0 + + + 153 + 551 + 436 + 0 + 0 + + + 306 + 718 + 525 + 1 + 0 + + + 104 + 70 + 583 + 0 + 0 + + + 0 + 521 + 395 + 0 + 0 + + + 70 + 179 + 228 + 0 + 0 + + + 34 + 136 + 493 + 1 + 0 + + + 192 + 747 + 464 + 0 + 0 + + + 70 + 130 + 314 + 0 + 0 + + + 284 + 482 + 427 + 6 + 0 + + + 37 + 607 + 571 + 0 + 0 + + + 4 + 103 + 650 + 0 + 0 + + + 34 + 250 + 574 + 0 + 0 + + + 37 + 94 + 433 + 4 + 0 + + + 1 + 130 + 515 + 1 + 1 + + + 70 + 116 + 351 + 0 + 0 + + + 1 + 163 + 622 + 0 + 0 + + + 34 + 204 + 497 + 0 + 0 + + + 394 + 500 + 693 + 7 + 0 + + + 70 + 262 + 387 + 0 + 0 + + + 203 + 219 + 463 + 0 + 0 + + + 55 + 169 + 600 + 0 + 0 + + + 0 + 200 + 507 + 0 + 0 + + + 34 + 707 + 533 + 4 + 0 + + + 38 + 253 + 161 + 0 + 0 + + + 34 + 677 + 467 + 3 + 0 + + + 11 + 467 + 677 + 2 + 0 + + + 4 + 241 + 169 + 0 + 0 + + + 102 + 75 + 543 + 4 + 0 + + + 70 + 208 + 322 + 0 + 0 + + + 192 + 739 + 510 + 0 + 0 + + + 164 + 725 + 478 + 4 + 0 + + + 70 + 141 + 289 + 0 + 0 + + + 70 + 167 + 244 + 0 + 0 + + + 0 + 312 + 460 + 0 + 0 + + + 36 + 653 + 437 + 2 + 0 + + + 0 + 105 + 638 + 0 + 0 + + + 20 + 177 + 573 + 0 + 0 + + + 1 + 620 + 510 + 0 + 0 + + + 313 + 717 + 441 + 3 + 0 + + + 38 + 165 + 247 + 0 + 0 + + + 70 + 248 + 409 + 0 + 0 + + + 4 + 187 + 218 + 0 + 0 + + + 1 + 89 + 458 + 0 + 0 + + + 313 + 678 + 510 + 3 + 0 + + + 70 + 161 + 424 + 0 + 0 + + + 0 + 187 + 530 + 4 + 0 + + + 37 + 686 + 555 + 4 + 0 + + + 4 + 147 + 251 + 0 + 0 + + + 34 + 152 + 652 + 0 + 0 + + + 4 + 246 + 150 + 0 + 0 + + + 70 + 100 + 369 + 0 + 0 + + + 283 + 78 + 473 + 6 + 0 + + + 597 + 717 + 531 + 4 + 0 + + + 0 + 674 + 513 + 1 + 0 + + + 4 + 102 + 362 + 0 + 0 + + + 34 + 412 + 505 + 1 + 0 + + + 1 + 67 + 551 + 0 + 0 + + + 202 + 214 + 463 + 4 + 0 + + + 205 + 125 + 295 + 0 + 0 + + + 1 + 363 + 573 + 2 + 1 + + + 1 + 216 + 2581 + 1 + 1 + + + 0 + 710 + 644 + 0 + 0 + + + 70 + 179 + 206 + 3 + 0 + + + 7 + 593 + 713 + 1 + 0 + + + 20 + 84 + 439 + 0 + 0 + + + 88 + 697 + 656 + 0 + 0 + + + 70 + 322 + 646 + 1 + 0 + + + 718 + 750 + 461 + 2 + 0 + + + 218 + 274 + 249 + 0 + 0 + + + 70 + 195 + 350 + 0 + 0 + + + 20 + 130 + 525 + 0 + 0 + + + 4 + 157 + 235 + 0 + 0 + + + 32 + 139 + 491 + 1 + 0 + + + 5 + 54 + 683 + 2 + 0 + + + 7 + 614 + 620 + 2 + 0 + + + 20 + 620 + 614 + 2 + 0 + + + 1 + 578 + 551 + 0 + 0 + + + 34 + 52 + 711 + 2 + 0 + + + 34 + 78 + 474 + 2 + 0 + + + 20 + 112 + 610 + 0 + 0 + + + 36 + 211 + 470 + 0 + 0 + + + 93 + 538 + 592 + 0 + 1 + + + 34 + 618 + 839 + 7 + 0 + + + 0 + 537 + 445 + 0 + 0 + + + 70 + 201 + 184 + 0 + 0 + + + 0 + 495 + 574 + 0 + 0 + + + 209 + 634 + 667 + 5 + 0 + + + 938 + 657 + 736 + 2 + 0 + + + 284 + 645 + 709 + 0 + 0 + + + 20 + 216 + 459 + 0 + 0 + + + 4 + 246 + 403 + 0 + 0 + + + 1 + 643 + 752 + 0 + 1 + + + 34 + 682 + 709 + 0 + 0 + + + 0 + 577 + 838 + 6 + 0 + + + 597 + 672 + 474 + 6 + 0 + + + 153 + 548 + 436 + 0 + 0 + + + 70 + 95 + 389 + 0 + 0 + + + 419 + 711 + 448 + 2 + 0 + + + 1 + 307 + 579 + 1 + 1 + + + 284 + 636 + 719 + 0 + 0 + + + 70 + 230 + 297 + 0 + 0 + + + 70 + 277 + 246 + 0 + 0 + + + 398 + 664 + 781 + 6 + 0 + + + 284 + 629 + 672 + 0 + 0 + + + 0 + 626 + 509 + 2 + 0 + + + 70 + 147 + 252 + 0 + 0 + + + 4 + 130 + 285 + 0 + 0 + + + 575 + 716 + 445 + 4 + 0 + + + 70 + 307 + 222 + 0 + 0 + + + 34 + 108 + 631 + 4 + 0 + + + 51 + 601 + 761 + 4 + 0 + + + 278 + 631 + 766 + 0 + 0 + + + 36 + 599 + 474 + 2 + 0 + + + 70 + 158 + 431 + 0 + 0 + + + 4 + 311 + 219 + 0 + 0 + + + 5 + 226 + 439 + 0 + 0 + + + 0 + 448 + 464 + 0 + 0 + + + 394 + 498 + 694 + 7 + 0 + + + 219 + 278 + 245 + 2 + 0 + + + 4 + 266 + 373 + 0 + 0 + + + 70 + 285 + 239 + 0 + 0 + + + 283 + 524 + 608 + 1 + 0 + + + 3 + 83 + 446 + 2 + 0 + + + 205 + 673 + 566 + 2 + 0 + + + 34 + 153 + 649 + 0 + 0 + + + 0 + 631 + 670 + 0 + 0 + + + 23 + 734 + 471 + 6 + 0 + + + 0 + 670 + 516 + 6 + 0 + + + 70 + 58 + 112 + 0 + 0 + + + 51 + 454 + 702 + 6 + 0 + + + 4 + 122 + 304 + 0 + 0 + + + 597 + 697 + 496 + 2 + 0 + + + 3 + 83 + 447 + 2 + 0 + + + 70 + 162 + 421 + 0 + 0 + + + 928 + 712 + 679 + 4 + 0 + + + 1 + 619 + 683 + 1 + 1 + + + 70 + 244 + 407 + 0 + 0 + + + 284 + 663 + 690 + 0 + 0 + + + 407 + 603 + 471 + 6 + 0 + + + 63 + 642 + 753 + 4 + 0 + + + 215 + 133 + 279 + 1 + 0 + + + 284 + 638 + 717 + 0 + 0 + + + 34 + 708 + 538 + 4 + 0 + + + 597 + 736 + 433 + 2 + 0 + + + 70 + 89 + 417 + 0 + 0 + + + 70 + 109 + 340 + 0 + 0 + + + 70 + 284 + 240 + 0 + 0 + + + 38 + 282 + 352 + 0 + 0 + + + 284 + 647 + 707 + 0 + 0 + + + 0 + 67 + 553 + 7 + 0 + + + 0 + 314 + 469 + 0 + 0 + + + 0 + 312 + 472 + 0 + 0 + + + 4 + 164 + 226 + 0 + 0 + + + 34 + 138 + 494 + 1 + 0 + + + 16 + 82 + 452 + 2 + 0 + + + 97 + 609 + 1548 + 0 + 1 + + + 284 + 454 + 458 + 6 + 0 + + + 285 + 488 + 653 + 1 + 0 + + + 0 + 614 + 519 + 0 + 0 + + + 283 + 581 + 832 + 2 + 0 + + + 286 + 491 + 649 + 1 + 0 + + + 118 + 146 + 254 + 0 + 0 + + + 70 + 191 + 357 + 0 + 0 + + + 63 + 649 + 491 + 4 + 0 + + + 34 + 201 + 494 + 0 + 0 + + + 70 + 90 + 412 + 0 + 0 + + + 308 + 513 + 466 + 0 + 0 + + + 45 + 541 + 704 + 4 + 0 + + + 37 + 149 + 460 + 2 + 0 + + + 23 + 596 + 709 + 6 + 0 + + + 70 + 169 + 220 + 0 + 0 + + + 32 + 55 + 676 + 2 + 0 + + + 299 + 526 + 606 + 2 + 0 + + + 0 + 613 + 520 + 0 + 0 + + + 597 + 746 + 510 + 2 + 0 + + + 27 + 212 + 694 + 0 + 0 + + + 1 + 154 + 445 + 0 + 0 + + + 3 + 54 + 688 + 0 + 0 + + + 284 + 665 + 688 + 0 + 0 + + + 597 + 749 + 462 + 5 + 0 + + + 100 + 651 + 436 + 0 + 0 + + + 70 + 183 + 203 + 0 + 0 + + + 283 + 410 + 508 + 1 + 0 + + + 308 + 631 + 725 + 0 + 0 + + + 3 + 165 + 599 + 0 + 0 + + + 45 + 216 + 681 + 2 + 0 + + + 70 + 136 + 273 + 0 + 0 + + + 34 + 121 + 566 + 7 + 0 + + + 8 + 52 + 714 + 0 + 0 + + + 278 + 634 + 763 + 0 + 0 + + + 1 + 598 + 533 + 6 + 0 + + + 7 + 84 + 442 + 4 + 0 + + + 3 + 278 + 640 + 0 + 0 + + + 70 + 271 + 137 + 0 + 0 + + + 704 + 297 + 125 + 2 + 0 + + + 214 + 138 + 269 + 3 + 0 + + + 1 + 107 + 640 + 0 + 0 + + + 209 + 86 + 433 + 7 + 0 + + + 1 + 166 + 596 + 0 + 0 + + + 205 + 425 + 3381 + 4 + 0 + + + 34 + 721 + 480 + 3 + 0 + + + 597 + 672 + 515 + 6 + 0 + + + 70 + 214 + 174 + 0 + 0 + + + 29 + 427 + 488 + 0 + 0 + + + 22 + 604 + 470 + 0 + 0 + + + 34 + 106 + 647 + 4 + 0 + + + 1 + 252 + 584 + 0 + 0 + + + 70 + 132 + 282 + 0 + 0 + + + 70 + 188 + 198 + 0 + 0 + + + 70 + 282 + 132 + 0 + 0 + + + 284 + 669 + 684 + 2 + 0 + + + 71 + 652 + 489 + 6 + 0 + + + 3 + 276 + 645 + 4 + 0 + + + 597 + 723 + 441 + 0 + 0 + + + 3 + 84 + 443 + 2 + 0 + + + 402 + 652 + 742 + 7 + 0 + + + 36 + 741 + 467 + 1 + 0 + + + 205 + 281 + 244 + 4 + 0 + + + 34 + 79 + 471 + 4 + 0 + + + 205 + 122 + 305 + 0 + 0 + + + 70 + 322 + 457 + 4 + 0 + + + 0 + 517 + 403 + 0 + 0 + + + 377 + 660 + 733 + 1 + 0 + + + 209 + 230 + 430 + 1 + 0 + + + 284 + 627 + 674 + 0 + 0 + + + 284 + 667 + 686 + 0 + 0 + + + 4 + 155 + 638 + 0 + 0 + + + 205 + 166 + 413 + 0 + 0 + + + 70 + 246 + 402 + 0 + 0 + + + 50 + 293 + 711 + 0 + 0 + + + 24 + 339 + 704 + 0 + 0 + + + 951 + 639 + 811 + 0 + 0 + + + 24 + 518 + 548 + 6 + 0 + + + 70 + 111 + 335 + 0 + 0 + + + 1 + 67 + 555 + 0 + 0 + + + 70 + 112 + 332 + 0 + 0 + + + 0 + 506 + 561 + 0 + 0 + + + 0 + 539 + 443 + 0 + 0 + + + 20 + 150 + 456 + 2 + 0 + + + 0 + 509 + 409 + 0 + 0 + + + 11 + 314 + 663 + 0 + 0 + + + 16 + 590 + 716 + 0 + 0 + + + 1 + 253 + 581 + 0 + 0 + + + 70 + 233 + 160 + 0 + 0 + + + 938 + 703 + 651 + 1 + 0 + + + 284 + 624 + 677 + 2 + 0 + + + 70 + 103 + 362 + 0 + 0 + + + 34 + 79 + 472 + 1 + 0 + + + 0 + 682 + 558 + 1 + 0 + + + 0 + 441 + 472 + 0 + 0 + + + 36 + 733 + 435 + 2 + 0 + + + 38 + 318 + 215 + 0 + 0 + + + 284 + 640 + 715 + 0 + 0 + + + 70 + 123 + 303 + 0 + 0 + + + 70 + 303 + 123 + 0 + 0 + + + 283 + 617 + 840 + 3 + 0 + + + 205 + 519 + 460 + 0 + 0 + + + 70 + 192 + 194 + 0 + 0 + + + 34 + 603 + 802 + 0 + 0 + + + 4 + 139 + 268 + 0 + 0 + + + 34 + 685 + 706 + 0 + 0 + + + 0 + 108 + 633 + 0 + 0 + + + 70 + 180 + 207 + 0 + 0 + + + 284 + 671 + 682 + 2 + 0 + + + 70 + 159 + 235 + 0 + 0 + + + 445 + 623 + 611 + 0 + 0 + + + 45 + 610 + 1546 + 6 + 0 + + + 34 + 732 + 520 + 3 + 0 + + + 1 + 203 + 488 + 0 + 0 + + + 220 + 275 + 249 + 0 + 0 + + + 283 + 79 + 473 + 2 + 0 + + + 7 + 615 + 687 + 4 + 0 + + + 0 + 215 + 684 + 0 + 0 + + + 1 + 138 + 496 + 1 + 0 + + + 145 + 312 + 571 + 0 + 0 + + + 37 + 647 + 493 + 2 + 0 + + + 0 + 518 + 402 + 0 + 0 + + + 70 + 314 + 218 + 0 + 0 + + + 70 + 247 + 401 + 0 + 0 + + + 205 + 97 + 385 + 0 + 0 + + + 70 + 210 + 326 + 0 + 0 + + + 284 + 482 + 432 + 2 + 0 + + + 20 + 315 + 661 + 0 + 0 + + + 36 + 736 + 470 + 1 + 0 + + + 16 + 453 + 704 + 2 + 0 + + + 38 + 607 + 754 + 1 + 0 + + + 70 + 247 + 277 + 0 + 0 + + + 3 + 518 + 461 + 0 + 0 + + + 36 + 688 + 703 + 0 + 0 + + + 4 + 106 + 352 + 0 + 0 + + + 8 + 161 + 615 + 0 + 0 + + + 34 + 67 + 557 + 7 + 0 + + + 1 + 292 + 713 + 1 + 1 + + + 70 + 143 + 261 + 0 + 0 + + + 284 + 637 + 717 + 0 + 0 + + + 153 + 549 + 436 + 0 + 0 + + + 7 + 84 + 445 + 4 + 0 + + + 1 + 105 + 645 + 0 + 0 + + + 4 + 89 + 420 + 0 + 0 + + + 284 + 646 + 707 + 0 + 0 + + + 43 + 474 + 673 + 4 + 0 + + + 192 + 744 + 511 + 0 + 0 + + + 70 + 256 + 385 + 0 + 0 + + + 71 + 612 + 690 + 2 + 0 + + + 407 + 608 + 468 + 0 + 0 + + + 45 + 540 + 704 + 4 + 0 + + + 7 + 129 + 525 + 4 + 0 + + + 5 + 665 + 635 + 0 + 0 + + + 214 + 135 + 277 + 2 + 0 + + + 25 + 490 + 651 + 1 + 0 + + + 24 + 651 + 490 + 0 + 0 + + + 70 + 236 + 287 + 0 + 0 + + + 143 + 332 + 204 + 6 + 0 + + + 0 + 304 + 686 + 4 + 0 + + + 3 + 343 + 608 + 0 + 0 + + + 70 + 313 + 315 + 0 + 0 + + + 306 + 727 + 523 + 0 + 0 + + + 70 + 167 + 224 + 0 + 0 + + + 1 + 329 + 206 + 0 + 1 + + + 33 + 463 + 689 + 4 + 0 + + + 34 + 708 + 537 + 4 + 0 + + + 597 + 716 + 531 + 4 + 0 + + + 4 + 242 + 280 + 0 + 0 + + + 20 + 112 + 605 + 0 + 0 + + + 70 + 231 + 427 + 0 + 0 + + + 283 + 79 + 474 + 5 + 0 + + + 377 + 662 + 638 + 4 + 0 + + + 530 + 692 + 499 + 0 + 0 + + + 1 + 502 + 567 + 0 + 0 + + + 7 + 613 + 689 + 0 + 0 + + + 1 + 324 + 547 + 1 + 1 + + + 0 + 750 + 507 + 3 + 0 + + + 284 + 662 + 690 + 0 + 0 + + + 70 + 127 + 295 + 0 + 0 + + + 70 + 253 + 268 + 0 + 0 + + + 3 + 84 + 446 + 2 + 0 + + + 20 + 150 + 452 + 0 + 0 + + + 20 + 209 + 472 + 0 + 0 + + + 70 + 279 + 243 + 0 + 0 + + + 34 + 402 + 708 + 0 + 0 + + + 4 + 311 + 218 + 0 + 0 + + + 5 + 165 + 598 + 0 + 0 + + + 68 + 347 + 601 + 0 + 1 + + + 70 + 245 + 153 + 0 + 0 + + + 35 + 51 + 735 + 0 + 0 + + + 34 + 137 + 495 + 1 + 0 + + + 1 + 305 + 684 + 2 + 0 + + + 202 + 214 + 461 + 4 + 0 + + + 70 + 109 + 344 + 0 + 0 + + + 0 + 699 + 544 + 1 + 0 + + + 283 + 472 + 442 + 6 + 0 + + + 284 + 454 + 459 + 6 + 0 + + + 70 + 257 + 263 + 0 + 0 + + + 34 + 421 + 495 + 0 + 0 + + + 29 + 83 + 452 + 0 + 0 + + + 70 + 284 + 238 + 0 + 0 + + + 111 + 617 + 461 + 0 + 0 + + + 36 + 210 + 470 + 0 + 0 + + + 23 + 302 + 690 + 6 + 0 + + + 284 + 664 + 688 + 0 + 0 + + + 51 + 452 + 706 + 4 + 0 + + + 283 + 499 + 570 + 0 + 0 + + + 206 + 146 + 257 + 4 + 0 + + + 32 + 422 + 674 + 0 + 0 + + + 0 + 299 + 593 + 2 + 0 + + + 0 + 521 + 400 + 0 + 0 + + + 34 + 404 + 704 + 0 + 0 + + + 4 + 625 + 731 + 6 + 0 + + + 100 + 69 + 544 + 4 + 0 + + + 70 + 97 + 387 + 0 + 0 + + + 284 + 639 + 715 + 0 + 0 + + + 70 + 96 + 391 + 0 + 0 + + + 0 + 525 + 397 + 0 + 0 + + + 112 + 340 + 613 + 4 + 0 + + + 55 + 164 + 602 + 0 + 0 + + + 3 + 84 + 447 + 2 + 0 + + + 55 + 611 + 691 + 0 + 0 + + + 219 + 276 + 245 + 6 + 0 + + + 205 + 149 + 252 + 0 + 0 + + + 34 + 107 + 632 + 0 + 0 + + + 70 + 214 + 316 + 0 + 0 + + + 70 + 158 + 428 + 0 + 0 + + + 15 + 519 + 665 + 2 + 0 + + + 34 + 605 + 858 + 6 + 0 + + + 193 + 601 + 473 + 0 + 1 + + + 70 + 89 + 422 + 0 + 0 + + + 37 + 689 + 552 + 1 + 0 + + + 70 + 321 + 117 + 0 + 0 + + + 4 + 293 + 337 + 0 + 0 + + + 205 + 58 + 120 + 0 + 0 + + + 70 + 234 + 422 + 0 + 0 + + + 0 + 715 + 532 + 1 + 0 + + + 143 + 330 + 205 + 4 + 0 + + + 1 + 151 + 448 + 0 + 0 + + + 70 + 51 + 137 + 0 + 0 + + + 34 + 612 + 564 + 6 + 0 + + + 597 + 752 + 459 + 2 + 0 + + + 70 + 144 + 261 + 0 + 0 + + + 4 + 187 + 201 + 0 + 0 + + + 4 + 219 + 309 + 0 + 0 + + + 29 + 219 + 451 + 2 + 0 + + + 284 + 667 + 685 + 2 + 0 + + + 3 + 344 + 606 + 0 + 0 + + + 1 + 483 + 496 + 0 + 0 + + + 25 + 303 + 688 + 6 + 0 + + + 306 + 508 + 560 + 4 + 0 + + + 283 + 80 + 470 + 3 + 0 + + + 4 + 235 + 160 + 0 + 0 + + + 2 + 222 + 445 + 0 + 0 + + + 425 + 650 + 703 + 4 + 0 + + + 284 + 671 + 681 + 2 + 0 + + + 938 + 703 + 650 + 3 + 0 + + + 284 + 669 + 683 + 2 + 0 + + + 70 + 185 + 366 + 0 + 0 + + + 205 + 608 + 525 + 0 + 0 + + + 597 + 672 + 475 + 6 + 0 + + + 0 + 632 + 723 + 0 + 0 + + + 4 + 312 + 217 + 0 + 0 + + + 1 + 156 + 434 + 0 + 0 + + + 182 + 337 + 711 + 0 + 0 + + + 36 + 736 + 469 + 1 + 0 + + + 70 + 273 + 248 + 1 + 0 + + + 70 + 325 + 451 + 4 + 0 + + + 419 + 719 + 444 + 0 + 0 + + + 313 + 488 + 490 + 0 + 0 + + + 70 + 191 + 356 + 0 + 0 + + + 284 + 628 + 672 + 0 + 0 + + + 218 + 150 + 251 + 2 + 0 + + + 419 + 691 + 462 + 2 + 0 + + + 0 + 582 + 832 + 3 + 0 + + + 20 + 130 + 523 + 0 + 0 + + + 219 + 273 + 249 + 4 + 0 + + + 286 + 709 + 683 + 0 + 0 + + + 1 + 563 + 505 + 1 + 1 + + + 0 + 82 + 459 + 0 + 0 + + + 8 + 292 + 715 + 0 + 0 + + + 402 + 500 + 691 + 3 + 0 + + + 205 + 196 + 192 + 0 + 0 + + + 7 + 84 + 448 + 0 + 0 + + + 395 + 665 + 780 + 0 + 0 + + + 164 + 732 + 472 + 3 + 0 + + + 70 + 274 + 359 + 0 + 0 + + + 20 + 533 + 599 + 0 + 0 + + + 70 + 57 + 120 + 0 + 0 + + + 71 + 83 + 454 + 2 + 0 + + + 1 + 156 + 436 + 0 + 0 + + + 38 + 157 + 240 + 0 + 0 + + + 70 + 314 + 120 + 0 + 0 + + + 70 + 227 + 166 + 0 + 0 + + + 34 + 80 + 471 + 3 + 0 + + + 70 + 182 + 207 + 3 + 0 + + + 597 + 724 + 441 + 0 + 0 + + + 34 + 87 + 433 + 4 + 0 + + + 70 + 234 + 161 + 0 + 0 + + + 70 + 272 + 250 + 1 + 0 + + + 45 + 610 + 1545 + 6 + 0 + + + 284 + 641 + 713 + 0 + 0 + + + 34 + 227 + 646 + 0 + 0 + + + 938 + 658 + 736 + 2 + 0 + + + 1 + 106 + 642 + 0 + 0 + + + 36 + 729 + 438 + 2 + 0 + + + 283 + 592 + 772 + 0 + 0 + + + 524 + 708 + 451 + 0 + 0 + + + 37 + 138 + 493 + 0 + 0 + + + 284 + 454 + 460 + 6 + 0 + + + 219 + 149 + 253 + 4 + 0 + + + 295 + 280 + 634 + 0 + 0 + + + 6 + 412 + 507 + 1 + 0 + + + 34 + 137 + 497 + 1 + 0 + + + 70 + 266 + 370 + 0 + 0 + + + 420 + 714 + 484 + 2 + 0 + + + 4 + 244 + 279 + 0 + 0 + + + 0 + 754 + 504 + 3 + 0 + + + 960 + 627 + 729 + 0 + 0 + + + 34 + 696 + 546 + 1 + 0 + + + 445 + 675 + 563 + 6 + 0 + + + 8 + 160 + 615 + 2 + 0 + + + 396 + 517 + 668 + 2 + 0 + + + 4 + 117 + 323 + 0 + 0 + + + 70 + 141 + 268 + 0 + 0 + + + 20 + 608 + 568 + 6 + 0 + + + 218 + 277 + 245 + 4 + 0 + + + 36 + 759 + 455 + 3 + 0 + + + 1 + 80 + 472 + 7 + 0 + + + 3 + 613 + 620 + 0 + 0 + + + 70 + 101 + 374 + 0 + 0 + + + 70 + 287 + 343 + 0 + 0 + + + 70 + 133 + 284 + 0 + 0 + + + 70 + 264 + 257 + 0 + 0 + + + 25 + 612 + 621 + 0 + 0 + + + 3 + 129 + 526 + 0 + 0 + + + 285 + 634 + 721 + 2 + 0 + + + 1 + 617 + 616 + 2 + 1 + + + 34 + 295 + 602 + 2 + 0 + + + 192 + 738 + 468 + 0 + 0 + + + 70 + 186 + 365 + 0 + 0 + + + 70 + 159 + 427 + 0 + 0 + + + 938 + 656 + 738 + 2 + 0 + + + 284 + 626 + 674 + 0 + 0 + + + 36 + 210 + 469 + 0 + 0 + + + 34 + 138 + 492 + 1 + 0 + + + 43 + 615 + 618 + 0 + 0 + + + 38 + 163 + 232 + 0 + 0 + + + 7 + 614 + 619 + 2 + 0 + + + 1 + 189 + 521 + 0 + 0 + + + 164 + 609 + 795 + 3 + 0 + + + 70 + 175 + 216 + 0 + 0 + + + 70 + 168 + 225 + 0 + 0 + + + 218 + 150 + 252 + 2 + 0 + + + 1 + 82 + 461 + 0 + 0 + + + 4 + 119 + 318 + 0 + 0 + + + 34 + 80 + 473 + 0 + 0 + + + 597 + 736 + 434 + 2 + 0 + + + 597 + 672 + 514 + 6 + 0 + + + 70 + 114 + 332 + 0 + 0 + + + 218 + 149 + 254 + 2 + 0 + + + 205 + 275 + 247 + 4 + 0 + + + 284 + 643 + 711 + 0 + 0 + + + 70 + 192 + 197 + 0 + 0 + + + 729 + 468 + 3383 + 7 + 0 + + + 70 + 181 + 209 + 0 + 0 + + + 951 + 639 + 812 + 4 + 0 + + + 1 + 296 + 600 + 2 + 0 + + + 0 + 681 + 711 + 0 + 0 + + + 11 + 711 + 681 + 0 + 0 + + + 4 + 104 + 653 + 0 + 0 + + + 284 + 482 + 433 + 2 + 0 + + + 70 + 270 + 365 + 0 + 0 + + + 70 + 144 + 263 + 0 + 0 + + + 100 + 649 + 438 + 4 + 0 + + + 70 + 289 + 341 + 0 + 0 + + + 70 + 107 + 354 + 0 + 0 + + + 34 + 687 + 465 + 3 + 0 + + + 273 + 434 + 481 + 2 + 0 + + + 597 + 680 + 508 + 2 + 0 + + + 7 + 278 + 639 + 4 + 0 + + + 960 + 635 + 720 + 0 + 0 + + + 36 + 339 + 524 + 0 + 0 + + + 36 + 655 + 434 + 2 + 0 + + + 718 + 751 + 460 + 2 + 0 + + + 34 + 656 + 487 + 5 + 0 + + + 36 + 211 + 467 + 0 + 0 + + + 70 + 201 + 345 + 0 + 0 + + + 1 + 467 + 680 + 1 + 1 + + + 36 + 730 + 435 + 5 + 0 + + + 45 + 524 + 606 + 2 + 0 + + + 1 + 427 + 485 + 1 + 1 + + + 205 + 239 + 159 + 0 + 0 + + + 219 + 149 + 255 + 6 + 0 + + + 34 + 76 + 500 + 1 + 0 + + + 100 + 70 + 543 + 4 + 0 + + + 25 + 301 + 688 + 6 + 0 + + + 20 + 169 + 593 + 0 + 0 + + + 54 + 116 + 598 + 0 + 0 + + + 394 + 662 + 732 + 1 + 0 + + + 306 + 761 + 499 + 3 + 0 + + + 59 + 114 + 608 + 4 + 0 + + + 1 + 315 + 561 + 3 + 1 + + + 12 + 103 + 673 + 0 + 0 + + + 443 + 588 + 540 + 4 + 0 + + + 597 + 735 + 432 + 4 + 0 + + + 113 + 617 + 842 + 5 + 0 + + + 34 + 619 + 557 + 6 + 0 + + + 0 + 109 + 636 + 0 + 0 + + + 597 + 720 + 441 + 0 + 0 + + + 205 + 292 + 130 + 0 + 0 + + + 0 + 682 + 672 + 0 + 0 + + + 7 + 592 + 716 + 0 + 0 + + + 938 + 704 + 651 + 3 + 0 + + + 1 + 681 + 673 + 0 + 0 + + + 284 + 641 + 715 + 0 + 0 + + + 70 + 273 + 367 + 0 + 0 + + + 29 + 451 + 704 + 0 + 0 + + + 597 + 746 + 509 + 2 + 0 + + + 284 + 671 + 683 + 2 + 0 + + + 205 + 134 + 283 + 0 + 0 + + + 990 + 633 + 724 + 0 + 0 + + + 205 + 607 + 755 + 5 + 0 + + + 597 + 680 + 507 + 2 + 0 + + + 1 + 520 + 663 + 0 + 1 + + + 70 + 310 + 323 + 0 + 0 + + + 394 + 510 + 676 + 0 + 0 + + + 394 + 507 + 680 + 0 + 0 + + + 38 + 205 + 338 + 0 + 0 + + + 192 + 743 + 464 + 0 + 0 + + + 37 + 150 + 462 + 2 + 0 + + + 216 + 135 + 281 + 1 + 0 + + + 209 + 636 + 597 + 2 + 0 + + + 284 + 627 + 676 + 0 + 0 + + + 597 + 672 + 513 + 6 + 0 + + + 21 + 271 + 652 + 0 + 0 + + + 219 + 150 + 253 + 0 + 0 + + + 283 + 454 + 456 + 6 + 0 + + + 0 + 515 + 402 + 0 + 0 + + + 4 + 672 + 565 + 2 + 0 + + + 70 + 199 + 348 + 0 + 0 + + + 192 + 761 + 453 + 0 + 0 + + + 6 + 523 + 607 + 4 + 0 + + + 38 + 243 + 285 + 0 + 0 + + + 597 + 715 + 531 + 4 + 0 + + + 16 + 525 + 453 + 4 + 0 + + + 70 + 184 + 206 + 0 + 0 + + + 70 + 156 + 243 + 0 + 0 + + + 70 + 333 + 208 + 0 + 0 + + + 70 + 223 + 170 + 0 + 0 + + + 23 + 300 + 690 + 6 + 0 + + + 0 + 529 + 535 + 6 + 0 + + + 7 + 85 + 446 + 2 + 0 + + + 209 + 637 + 596 + 2 + 0 + + + 45 + 610 + 1547 + 6 + 0 + + + 4 + 89 + 426 + 0 + 0 + + + 284 + 668 + 686 + 0 + 0 + + + 100 + 615 + 845 + 1 + 0 + + + 283 + 464 + 446 + 6 + 0 + + + 284 + 626 + 677 + 2 + 0 + + + 205 + 662 + 785 + 2 + 0 + + + 1 + 670 + 567 + 1 + 1 + + + 70 + 230 + 301 + 0 + 0 + + + 1 + 108 + 641 + 0 + 0 + + + 1 + 55 + 693 + 0 + 1 + + + 36 + 213 + 471 + 0 + 0 + + + 153 + 546 + 436 + 0 + 0 + + + 286 + 488 + 651 + 1 + 0 + + + 408 + 328 + 446 + 0 + 0 + + + 730 + 444 + 3375 + 6 + 0 + + + 5 + 425 + 487 + 0 + 0 + + + 59 + 647 + 491 + 0 + 0 + + + 960 + 635 + 722 + 0 + 0 + + + 4 + 246 + 155 + 0 + 0 + + + 14 + 129 + 1604 + 0 + 0 + + + 284 + 643 + 713 + 2 + 0 + + + 20 + 161 + 623 + 0 + 0 + + + 70 + 295 + 340 + 0 + 0 + + + 100 + 70 + 544 + 4 + 0 + + + 70 + 188 + 368 + 0 + 0 + + + 34 + 697 + 545 + 1 + 0 + + + 1 + 314 + 659 + 0 + 1 + + + 215 + 137 + 278 + 1 + 0 + + + 112 + 425 + 3526 + 0 + 0 + + + 205 + 72 + 104 + 0 + 0 + + + 34 + 628 + 730 + 0 + 0 + + + 0 + 87 + 438 + 4 + 0 + + + 205 + 103 + 370 + 0 + 0 + + + 45 + 456 + 522 + 4 + 0 + + + 34 + 718 + 480 + 2 + 0 + + + 22 + 602 + 470 + 5 + 0 + + + 70 + 200 + 346 + 0 + 0 + + + 0 + 696 + 696 + 0 + 0 + + + 309 + 541 + 440 + 0 + 0 + + + 1 + 159 + 435 + 0 + 0 + + + 34 + 694 + 698 + 2 + 0 + + + 1 + 166 + 604 + 0 + 1 + + + 283 + 463 + 686 + 4 + 0 + + + 0 + 686 + 463 + 3 + 0 + + + 70 + 247 + 280 + 0 + 0 + + + 20 + 151 + 458 + 0 + 0 + + + 205 + 274 + 366 + 0 + 0 + + + 215 + 141 + 270 + 2 + 0 + + + 34 + 607 + 856 + 6 + 0 + + + 36 + 344 + 514 + 0 + 0 + + + 92 + 132 + 524 + 4 + 0 + + + 38 + 122 + 312 + 0 + 0 + + + 45 + 216 + 677 + 0 + 0 + + + 34 + 81 + 470 + 1 + 0 + + + 655 + 692 + 498 + 0 + 0 + + + 70 + 124 + 307 + 0 + 0 + + + 4 + 98 + 388 + 0 + 0 + + + 70 + 194 + 196 + 0 + 0 + + + 51 + 271 + 2963 + 6 + 0 + + + 36 + 338 + 523 + 0 + 0 + + + 70 + 259 + 387 + 0 + 0 + + + 70 + 99 + 384 + 0 + 0 + + + 0 + 641 + 661 + 0 + 0 + + + 34 + 68 + 559 + 7 + 0 + + + 284 + 624 + 679 + 2 + 0 + + + 0 + 88 + 432 + 4 + 0 + + + 37 + 634 + 723 + 2 + 0 + + + 100 + 600 + 633 + 0 + 0 + + + 91 + 134 + 516 + 4 + 0 + + + 283 + 620 + 838 + 0 + 0 + + + 205 + 258 + 268 + 0 + 0 + + + 938 + 659 + 735 + 2 + 0 + + + 205 + 61 + 122 + 0 + 0 + + + 36 + 339 + 702 + 0 + 0 + + + 34 + 149 + 464 + 2 + 0 + + + 0 + 640 + 662 + 0 + 0 + + + 0 + 313 + 467 + 0 + 0 + + + 1 + 327 + 447 + 1 + 1 + + + 284 + 645 + 711 + 0 + 0 + + + 205 + 246 + 283 + 0 + 0 + + + 278 + 454 + 700 + 3 + 0 + + + 70 + 302 + 331 + 0 + 0 + + + 70 + 211 + 330 + 0 + 0 + + + 0 + 110 + 633 + 0 + 0 + + + 70 + 200 + 348 + 0 + 0 + + + 20 + 151 + 461 + 0 + 0 + + + 218 + 150 + 255 + 0 + 0 + + + 34 + 149 + 467 + 2 + 0 + + + 307 + 345 + 513 + 0 + 0 + + + 16 + 590 + 718 + 0 + 0 + + + 104 + 70 + 546 + 4 + 0 + + + 313 + 486 + 489 + 0 + 0 + + + 313 + 489 + 486 + 0 + 0 + + + 34 + 634 + 819 + 0 + 0 + + + 283 + 81 + 472 + 2 + 0 + + + 192 + 742 + 465 + 0 + 0 + + + 45 + 539 + 704 + 4 + 0 + + + 44 + 611 + 1545 + 4 + 0 + + + 34 + 69 + 554 + 7 + 0 + + + 313 + 484 + 491 + 0 + 0 + + + 70 + 58 + 127 + 0 + 0 + + + 1 + 82 + 466 + 0 + 0 + + + 34 + 224 + 446 + 4 + 0 + + + 70 + 113 + 338 + 0 + 0 + + + 377 + 500 + 690 + 7 + 0 + + + 71 + 622 + 681 + 4 + 0 + + + 29 + 138 + 504 + 0 + 0 + + + 1 + 225 + 444 + 0 + 1 + + + 0 + 199 + 502 + 0 + 0 + + + 217 + 135 + 283 + 0 + 0 + + + 153 + 545 + 436 + 0 + 0 + + + 0 + 109 + 638 + 0 + 0 + + + 597 + 697 + 495 + 2 + 0 + + + 278 + 452 + 703 + 0 + 0 + + + 7 + 612 + 620 + 6 + 0 + + + 3 + 613 + 619 + 0 + 0 + + + 70 + 222 + 172 + 0 + 0 + + + 37 + 636 + 721 + 2 + 0 + + + 284 + 482 + 430 + 6 + 0 + + + 0 + 157 + 443 + 0 + 0 + + + 205 + 441 + 470 + 0 + 0 + + + 1 + 134 + 519 + 1 + 0 + + + 70 + 201 + 190 + 0 + 0 + + + 284 + 655 + 700 + 2 + 0 + + + 283 + 716 + 677 + 4 + 0 + + + 205 + 265 + 144 + 0 + 0 + + + 70 + 225 + 309 + 0 + 0 + + + 40 + 103 + 675 + 0 + 0 + + + 4 + 188 + 203 + 0 + 0 + + + 70 + 220 + 316 + 0 + 0 + + + 1 + 158 + 440 + 0 + 0 + + + 205 + 60 + 122 + 0 + 0 + + + 26 + 147 + 473 + 0 + 0 + + + 1 + 470 + 676 + 1 + 1 + + + 38 + 638 + 498 + 2 + 0 + + + 70 + 240 + 416 + 0 + 0 + + + 1 + 312 + 567 + 0 + 1 + + + 283 + 81 + 471 + 3 + 0 + + + 51 + 613 + 691 + 0 + 0 + + + 70 + 317 + 315 + 0 + 0 + + + 205 + 602 + 762 + 5 + 0 + + + 193 + 745 + 463 + 0 + 0 + + + 34 + 219 + 457 + 0 + 0 + + + 38 + 307 + 326 + 0 + 0 + + + 284 + 638 + 719 + 0 + 0 + + + 284 + 647 + 709 + 0 + 0 + + + 1 + 594 + 713 + 3 + 1 + + + 38 + 660 + 787 + 2 + 0 + + + 47 + 606 + 757 + 4 + 0 + + + 21 + 216 + 676 + 4 + 0 + + + 960 + 631 + 727 + 0 + 0 + + + 98 + 650 + 435 + 0 + 0 + + + 5 + 304 + 1509 + 0 + 0 + + + 20 + 218 + 459 + 6 + 0 + + + 205 + 269 + 372 + 0 + 0 + + + 70 + 203 + 189 + 0 + 0 + + + 0 + 577 + 840 + 6 + 0 + + + 329 + 559 + 617 + 0 + 0 + + + 205 + 140 + 274 + 0 + 0 + + + 0 + 68 + 564 + 7 + 0 + + + 3 + 211 + 692 + 0 + 0 + + + 37 + 632 + 503 + 2 + 0 + + + 4 + 115 + 604 + 0 + 0 + + + 45 + 333 + 714 + 4 + 0 + + + 45 + 215 + 679 + 4 + 0 + + + 36 + 737 + 468 + 1 + 0 + + + 390 + 660 + 695 + 5 + 0 + + + 1 + 155 + 448 + 0 + 0 + + + 70 + 215 + 323 + 0 + 0 + + + 395 + 489 + 650 + 6 + 0 + + + 597 + 672 + 473 + 6 + 0 + + + 0 + 637 + 499 + 2 + 0 + + + 45 + 106 + 655 + 0 + 0 + + + 34 + 723 + 477 + 7 + 0 + + + 70 + 241 + 415 + 0 + 0 + + + 37 + 720 + 479 + 7 + 0 + + + 205 + 639 + 594 + 2 + 0 + + + 43 + 474 + 437 + 4 + 0 + + + 205 + 157 + 244 + 0 + 0 + + + 143 + 667 + 569 + 2 + 0 + + + 1 + 364 + 569 + 3 + 1 + + + 70 + 232 + 431 + 0 + 0 + + + 70 + 61 + 118 + 0 + 0 + + + 38 + 185 + 207 + 0 + 0 + + + 1 + 69 + 555 + 0 + 0 + + + 70 + 257 + 149 + 0 + 0 + + + 192 + 740 + 466 + 0 + 0 + + + 38 + 145 + 264 + 0 + 0 + + + 20 + 161 + 621 + 2 + 0 + + + 205 + 177 + 392 + 0 + 0 + + + 34 + 654 + 486 + 0 + 0 + + + 1 + 298 + 695 + 2 + 0 + + + 960 + 637 + 720 + 0 + 0 + + + 12 + 103 + 668 + 0 + 0 + + + 328 + 558 + 617 + 0 + 0 + + + 143 + 670 + 566 + 2 + 0 + + + 70 + 161 + 239 + 0 + 0 + + + 74 + 165 + 604 + 6 + 0 + + + 284 + 630 + 672 + 0 + 0 + + + 205 + 600 + 763 + 5 + 0 + + + 1 + 111 + 620 + 4 + 0 + + + 70 + 60 + 136 + 0 + 0 + + + 34 + 223 + 447 + 4 + 0 + + + 15 + 603 + 571 + 4 + 0 + + + 34 + 54 + 713 + 2 + 0 + + + 45 + 524 + 607 + 2 + 0 + + + 41 + 315 + 659 + 6 + 0 + + + 34 + 721 + 526 + 3 + 0 + + + 220 + 151 + 255 + 4 + 0 + + + 4 + 262 + 147 + 0 + 0 + + + 399 + 665 + 782 + 2 + 0 + + + 34 + 701 + 541 + 3 + 0 + + + 219 + 147 + 262 + 4 + 0 + + + 70 + 90 + 428 + 0 + 0 + + + 36 + 693 + 700 + 0 + 0 + + + 997 + 604 + 803 + 2 + 0 + + + 3 + 634 + 765 + 0 + 0 + + + 70 + 198 + 194 + 0 + 0 + + + 20 + 211 + 472 + 0 + 0 + + + 20 + 114 + 603 + 6 + 0 + + + 4 + 177 + 217 + 0 + 0 + + + 33 + 476 + 668 + 0 + 0 + + + 70 + 55 + 147 + 0 + 0 + + + 0 + 200 + 498 + 0 + 0 + + + 16 + 85 + 452 + 2 + 0 + + + 597 + 721 + 441 + 0 + 0 + + + 0 + 120 + 573 + 0 + 0 + + + 597 + 714 + 531 + 4 + 0 + + + 205 + 122 + 315 + 0 + 0 + + + 70 + 90 + 427 + 0 + 0 + + + 205 + 68 + 119 + 0 + 0 + + + 1 + 615 + 517 + 0 + 0 + + + 70 + 75 + 108 + 0 + 0 + + + 45 + 105 + 655 + 0 + 0 + + + 34 + 679 + 507 + 0 + 0 + + + 70 + 289 + 238 + 0 + 0 + + + 70 + 303 + 227 + 0 + 0 + + + 179 + 343 + 605 + 6 + 0 + + + 70 + 211 + 326 + 0 + 0 + + + 34 + 109 + 631 + 6 + 0 + + + 377 + 659 + 736 + 2 + 0 + + + 38 + 216 + 178 + 0 + 0 + + + 36 + 484 + 657 + 0 + 0 + + + 36 + 636 + 830 + 1 + 0 + + + 1 + 274 + 643 + 0 + 0 + + + 46 + 476 + 436 + 2 + 0 + + + 112 + 338 + 614 + 4 + 0 + + + 45 + 523 + 608 + 0 + 0 + + + 0 + 608 + 523 + 0 + 0 + + + 70 + 335 + 205 + 0 + 0 + + + 34 + 524 + 541 + 0 + 0 + + + 283 + 82 + 471 + 0 + 0 + + + 45 + 457 + 522 + 4 + 0 + + + 38 + 141 + 274 + 0 + 0 + + + 51 + 271 + 2965 + 6 + 0 + + + 205 + 243 + 159 + 0 + 0 + + + 5 + 460 + 451 + 0 + 0 + + + 420 + 724 + 524 + 2 + 0 + + + 3 + 592 + 715 + 0 + 0 + + + 7 + 323 + 546 + 2 + 0 + + + 38 + 174 + 222 + 0 + 0 + + + 1 + 74 + 522 + 1 + 0 + + + 38 + 686 + 553 + 6 + 0 + + + 70 + 51 + 158 + 0 + 0 + + + 208 + 626 + 606 + 4 + 0 + + + 205 + 65 + 124 + 0 + 0 + + + 284 + 628 + 674 + 0 + 0 + + + 70 + 58 + 139 + 0 + 0 + + + 0 + 205 + 487 + 0 + 0 + + + 1 + 607 + 625 + 0 + 0 + + + 4 + 240 + 161 + 0 + 0 + + + 38 + 92 + 420 + 0 + 0 + + + 58 + 567 + 607 + 2 + 0 + + + 38 + 113 + 342 + 0 + 0 + + + 37 + 500 + 567 + 0 + 0 + + + 284 + 454 + 457 + 6 + 0 + + + 70 + 53 + 150 + 0 + 0 + + + 34 + 89 + 433 + 4 + 0 + + + 22 + 603 + 470 + 5 + 0 + + + 597 + 680 + 506 + 2 + 0 + + + 284 + 644 + 711 + 0 + 0 + + + 11 + 432 + 480 + 0 + 0 + + + 7 + 616 + 687 + 4 + 0 + + + 34 + 76 + 507 + 1 + 0 + + + 70 + 224 + 172 + 0 + 0 + + + 23 + 735 + 516 + 6 + 0 + + + 279 + 633 + 766 + 0 + 0 + + + 284 + 626 + 676 + 0 + 0 + + + 4 + 274 + 364 + 0 + 0 + + + 193 + 600 + 472 + 3 + 1 + + + 597 + 672 + 512 + 6 + 0 + + + 37 + 310 + 669 + 0 + 0 + + + 70 + 78 + 102 + 0 + 0 + + + 503 + 608 + 696 + 0 + 0 + + + 153 + 547 + 436 + 0 + 0 + + + 38 + 228 + 301 + 0 + 0 + + + 1 + 87 + 443 + 4 + 0 + + + 70 + 146 + 264 + 0 + 0 + + + 98 + 653 + 434 + 0 + 0 + + + 21 + 456 + 523 + 0 + 0 + + + 34 + 175 + 570 + 6 + 0 + + + 70 + 95 + 406 + 0 + 0 + + + 70 + 55 + 145 + 0 + 0 + + + 306 + 726 + 474 + 2 + 0 + + + 4 + 48 + 166 + 0 + 0 + + + 1 + 305 + 680 + 2 + 0 + + + 37 + 644 + 494 + 0 + 0 + + + 70 + 259 + 149 + 0 + 0 + + + 3 + 519 + 663 + 2 + 0 + + + 1 + 155 + 443 + 0 + 0 + + + 36 + 740 + 465 + 1 + 0 + + + 1 + 207 + 482 + 0 + 0 + + + 283 + 682 + 711 + 0 + 0 + + + 209 + 232 + 430 + 0 + 0 + + + 34 + 650 + 746 + 0 + 0 + + + 70 + 223 + 173 + 0 + 0 + + + 0 + 196 + 509 + 0 + 0 + + + 205 + 66 + 121 + 0 + 0 + + + 34 + 707 + 536 + 4 + 0 + + + 205 + 144 + 269 + 0 + 0 + + + 377 + 663 + 732 + 0 + 0 + + + 407 + 741 + 571 + 5 + 0 + + + 5 + 328 + 538 + 7 + 0 + + + 0 + 489 + 425 + 0 + 0 + + + 70 + 228 + 303 + 0 + 0 + + + 193 + 414 + 502 + 0 + 0 + + + 194 + 605 + 468 + 1 + 1 + + + 16 + 322 + 548 + 2 + 0 + + + 111 + 612 + 463 + 0 + 0 + + + 597 + 746 + 508 + 2 + 0 + + + 0 + 88 + 440 + 4 + 0 + + + 394 + 515 + 669 + 1 + 0 + + + 70 + 289 + 239 + 0 + 0 + + + 112 + 339 + 613 + 4 + 0 + + + 306 + 711 + 533 + 2 + 0 + + + 306 + 733 + 517 + 4 + 0 + + + 205 + 181 + 214 + 0 + 0 + + + 7 + 518 + 547 + 2 + 0 + + + 0 + 445 + 467 + 0 + 0 + + + 425 + 695 + 458 + 4 + 0 + + + 70 + 235 + 165 + 0 + 0 + + + 218 + 148 + 262 + 0 + 0 + + + 1 + 74 + 524 + 1 + 0 + + + 4 + 138 + 281 + 0 + 0 + + + 3 + 343 + 606 + 0 + 0 + + + 12 + 103 + 671 + 0 + 0 + + + 1 + 594 + 638 + 4 + 0 + + + 38 + 318 + 458 + 4 + 0 + + + 70 + 52 + 152 + 0 + 0 + + + 0 + 611 + 521 + 0 + 0 + + + 70 + 272 + 254 + 0 + 0 + + + 70 + 282 + 245 + 0 + 0 + + + 274 + 76 + 104 + 4 + 0 + + + 1 + 85 + 456 + 0 + 0 + + + 38 + 204 + 190 + 0 + 0 + + + 218 + 152 + 255 + 0 + 0 + + + 53 + 166 + 599 + 1 + 0 + + + 12 + 103 + 670 + 0 + 0 + + + 4 + 304 + 227 + 0 + 0 + + + 70 + 122 + 317 + 0 + 0 + + + 7 + 614 + 689 + 0 + 0 + + + 45 + 215 + 677 + 0 + 0 + + + 81 + 472 + 674 + 1 + 1 + + + 70 + 203 + 340 + 0 + 0 + + + 284 + 637 + 719 + 0 + 0 + + + 218 + 151 + 256 + 2 + 0 + + + 59 + 112 + 616 + 4 + 0 + + + 34 + 150 + 460 + 2 + 0 + + + 70 + 187 + 369 + 0 + 0 + + + 284 + 482 + 431 + 6 + 0 + + + 284 + 646 + 709 + 0 + 0 + + + 284 + 624 + 678 + 2 + 0 + + + 34 + 82 + 472 + 5 + 0 + + + 0 + 642 + 659 + 0 + 0 + + + 36 + 211 + 471 + 0 + 0 + + + 1 + 631 + 837 + 1 + 0 + + + 70 + 275 + 251 + 1 + 0 + + + 34 + 634 + 502 + 2 + 0 + + + 70 + 184 + 540 + 0 + 0 + + + 4 + 172 + 225 + 0 + 0 + + + 70 + 291 + 133 + 0 + 0 + + + 278 + 454 + 701 + 2 + 0 + + + 597 + 722 + 441 + 0 + 0 + + + 205 + 221 + 312 + 0 + 0 + + + 70 + 197 + 350 + 0 + 0 + + + 395 + 620 + 739 + 0 + 0 + + + 70 + 169 + 230 + 0 + 0 + + + 145 + 471 + 441 + 0 + 0 + + + 70 + 76 + 102 + 0 + 0 + + + 20 + 283 + 2962 + 0 + 0 + + + 299 + 522 + 610 + 0 + 0 + + + 38 + 175 + 222 + 0 + 0 + + + 70 + 207 + 333 + 0 + 0 + + + 45 + 105 + 657 + 4 + 0 + + + 21 + 214 + 680 + 0 + 0 + + + 597 + 752 + 458 + 2 + 0 + + + 164 + 602 + 806 + 5 + 0 + + + 70 + 176 + 221 + 0 + 0 + + + 284 + 666 + 688 + 0 + 0 + + + 0 + 688 + 666 + 0 + 0 + + + 0 + 592 + 774 + 3 + 0 + + + 70 + 277 + 249 + 0 + 0 + + + 16 + 590 + 717 + 0 + 0 + + + 70 + 216 + 180 + 0 + 0 + + + 70 + 237 + 291 + 0 + 0 + + + 70 + 54 + 144 + 0 + 0 + + + 70 + 72 + 108 + 0 + 0 + + + 1 + 127 + 543 + 0 + 0 + + + 37 + 752 + 504 + 3 + 0 + + + 597 + 697 + 494 + 2 + 0 + + + 47 + 602 + 761 + 2 + 0 + + + 218 + 151 + 257 + 2 + 0 + + + 70 + 280 + 246 + 0 + 0 + + + 284 + 648 + 707 + 0 + 0 + + + 1 + 707 + 648 + 0 + 0 + + + 0 + 728 + 473 + 1 + 0 + + + 0 + 633 + 544 + 0 + 0 + + + 203 + 214 + 465 + 4 + 0 + + + 70 + 179 + 217 + 0 + 0 + + + 38 + 216 + 319 + 0 + 0 + + + 0 + 108 + 638 + 0 + 0 + + + 13 + 103 + 669 + 0 + 0 + + + 70 + 161 + 428 + 0 + 0 + + + 0 + 107 + 644 + 0 + 0 + + + 284 + 664 + 690 + 0 + 0 + + + 34 + 683 + 555 + 1 + 0 + + + 284 + 639 + 717 + 0 + 0 + + + 0 + 628 + 507 + 2 + 0 + + + 396 + 521 + 661 + 1 + 0 + + + 51 + 622 + 712 + 6 + 0 + + + 70 + 88 + 100 + 0 + 0 + + + 34 + 406 + 499 + 6 + 0 + + + 278 + 614 + 586 + 0 + 0 + + + 70 + 250 + 176 + 0 + 0 + + + 70 + 74 + 119 + 0 + 0 + + + 34 + 468 + 687 + 4 + 0 + + + 70 + 201 + 389 + 0 + 0 + + + 34 + 715 + 546 + 1 + 0 + + + 21 + 272 + 486 + 0 + 0 + + + 70 + 232 + 337 + 0 + 0 + + + 205 + 314 + 421 + 0 + 0 + + + 407 + 614 + 473 + 0 + 0 + + + 1 + 517 + 459 + 0 + 1 + + + 16 + 525 + 452 + 4 + 0 + + + 0 + 748 + 481 + 3 + 0 + + + 284 + 659 + 672 + 0 + 0 + + + 0 + 609 + 641 + 3 + 0 + + + 70 + 91 + 97 + 0 + 0 + + + 38 + 750 + 549 + 3 + 0 + + + 0 + 294 + 689 + 4 + 0 + + + 36 + 164 + 688 + 4 + 0 + + + 597 + 729 + 441 + 0 + 0 + + + 445 + 639 + 563 + 6 + 0 + + + 15 + 337 + 704 + 4 + 0 + + + 4 + 317 + 417 + 0 + 0 + + + 191 + 185 + 610 + 0 + 0 + + + 70 + 166 + 265 + 0 + 0 + + + 4 + 81 + 543 + 7 + 0 + + + 284 + 657 + 674 + 0 + 0 + + + 0 + 654 + 444 + 5 + 0 + + + 404 + 665 + 771 + 0 + 0 + + + 283 + 680 + 709 + 0 + 0 + + + 70 + 209 + 540 + 0 + 0 + + + 70 + 105 + 419 + 0 + 0 + + + 34 + 665 + 725 + 0 + 0 + + + 4 + 127 + 346 + 0 + 0 + + + 20 + 630 + 571 + 0 + 0 + + + 70 + 301 + 146 + 0 + 0 + + + 4 + 55 + 159 + 0 + 0 + + + 70 + 53 + 165 + 0 + 0 + + + 278 + 631 + 764 + 0 + 0 + + + 70 + 149 + 295 + 0 + 0 + + + 34 + 434 + 669 + 0 + 0 + + + 16 + 617 + 583 + 4 + 0 + + + 4 + 116 + 379 + 0 + 0 + + + 70 + 263 + 429 + 0 + 0 + + + 205 + 73 + 120 + 0 + 0 + + + 88 + 210 + 537 + 0 + 0 + + + 70 + 466 + 509 + 2 + 0 + + + 4 + 325 + 347 + 0 + 0 + + + 1 + 98 + 448 + 0 + 0 + + + 70 + 327 + 404 + 0 + 0 + + + 0 + 752 + 519 + 3 + 0 + + + 283 + 525 + 553 + 0 + 0 + + + 284 + 655 + 676 + 0 + 0 + + + 153 + 544 + 436 + 0 + 0 + + + 34 + 219 + 515 + 1 + 0 + + + 4 + 80 + 549 + 0 + 0 + + + 597 + 672 + 432 + 6 + 0 + + + 407 + 619 + 469 + 0 + 0 + + + 70 + 152 + 289 + 0 + 0 + + + 306 + 609 + 727 + 2 + 0 + + + 205 + 159 + 276 + 0 + 0 + + + 34 + 719 + 447 + 3 + 0 + + + 38 + 701 + 688 + 2 + 0 + + + 284 + 628 + 705 + 2 + 0 + + + 205 + 72 + 124 + 0 + 0 + + + 34 + 707 + 552 + 1 + 0 + + + 284 + 653 + 678 + 0 + 0 + + + 70 + 52 + 172 + 0 + 0 + + + 70 + 233 + 568 + 6 + 0 + + + 45 + 457 + 519 + 0 + 0 + + + 70 + 195 + 578 + 6 + 0 + + + 34 + 79 + 555 + 7 + 0 + + + 0 + 263 + 503 + 0 + 0 + + + 20 + 155 + 505 + 4 + 0 + + + 306 + 724 + 539 + 0 + 0 + + + 3 + 117 + 669 + 0 + 0 + + + 34 + 209 + 633 + 0 + 0 + + + 34 + 80 + 548 + 7 + 0 + + + 1 + 174 + 450 + 0 + 0 + + + 0 + 355 + 571 + 0 + 0 + + + 70 + 51 + 175 + 0 + 0 + + + 0 + 168 + 671 + 0 + 0 + + + 1 + 169 + 667 + 0 + 0 + + + 1 + 573 + 681 + 1 + 1 + + + 285 + 581 + 830 + 6 + 0 + + + 284 + 651 + 680 + 0 + 0 + + + 51 + 596 + 691 + 0 + 0 + + + 70 + 197 + 572 + 0 + 0 + + + 419 + 714 + 504 + 6 + 0 + + + 45 + 125 + 626 + 4 + 0 + + + 70 + 115 + 381 + 0 + 0 + + + 1 + 198 + 668 + 0 + 0 + + + 37 + 120 + 652 + 0 + 0 + + + 0 + 517 + 392 + 0 + 0 + + + 0 + 545 + 533 + 6 + 0 + + + 4 + 217 + 202 + 0 + 0 + + + 1 + 511 + 464 + 0 + 0 + + + 5 + 636 + 696 + 0 + 0 + + + 70 + 182 + 430 + 0 + 0 + + + 70 + 164 + 267 + 0 + 0 + + + 34 + 688 + 523 + 2 + 0 + + + 445 + 693 + 563 + 6 + 0 + + + 38 + 724 + 497 + 2 + 0 + + + 0 + 696 + 517 + 1 + 0 + + + 21 + 552 + 746 + 4 + 0 + + + 6 + 285 + 711 + 0 + 0 + + + 218 + 171 + 256 + 2 + 0 + + + 0 + 433 + 468 + 0 + 0 + + + 143 + 120 + 365 + 6 + 0 + + + 102 + 75 + 584 + 0 + 0 + + + 1 + 175 + 447 + 0 + 0 + + + 70 + 237 + 558 + 6 + 0 + + + 70 + 232 + 571 + 6 + 0 + + + 70 + 277 + 158 + 0 + 0 + + + 70 + 259 + 169 + 0 + 0 + + + 416 + 622 + 578 + 4 + 0 + + + 1 + 79 + 554 + 7 + 0 + + + 283 + 582 + 828 + 6 + 0 + + + 0 + 292 + 693 + 2 + 0 + + + 1 + 117 + 666 + 3 + 1 + + + 0 + 206 + 643 + 0 + 0 + + + 4 + 60 + 151 + 0 + 0 + + + 0 + 285 + 710 + 0 + 0 + + + 284 + 649 + 682 + 2 + 0 + + + 208 + 167 + 262 + 0 + 0 + + + 1 + 302 + 670 + 0 + 0 + + + 3 + 598 + 689 + 4 + 0 + + + 51 + 558 + 700 + 4 + 0 + + + 206 + 656 + 628 + 6 + 0 + + + 0 + 628 + 656 + 0 + 0 + + + 70 + 111 + 394 + 0 + 0 + + + 38 + 76 + 119 + 0 + 0 + + + 309 + 509 + 571 + 0 + 0 + + + 21 + 625 + 465 + 0 + 0 + + + 70 + 154 + 284 + 0 + 0 + + + 0 + 694 + 518 + 1 + 0 + + + 597 + 672 + 478 + 6 + 0 + + + 597 + 677 + 531 + 4 + 0 + + + 38 + 180 + 243 + 0 + 0 + + + 395 + 661 + 729 + 0 + 0 + + + 12 + 670 + 583 + 6 + 0 + + + 63 + 522 + 455 + 6 + 0 + + + 143 + 463 + 513 + 0 + 0 + + + 562 + 667 + 539 + 0 + 0 + + + 34 + 174 + 650 + 1 + 0 + + + 34 + 737 + 530 + 3 + 0 + + + 1 + 621 + 629 + 0 + 0 + + + 284 + 626 + 707 + 2 + 0 + + + 45 + 206 + 549 + 4 + 0 + + + 313 + 686 + 524 + 0 + 0 + + + 51 + 554 + 705 + 4 + 0 + + + 0 + 634 + 698 + 0 + 0 + + + 0 + 200 + 662 + 3 + 0 + + + 1 + 165 + 472 + 0 + 0 + + + 70 + 186 + 235 + 0 + 0 + + + 21 + 550 + 749 + 0 + 0 + + + 70 + 167 + 677 + 0 + 0 + + + 286 + 524 + 613 + 0 + 0 + + + 284 + 647 + 684 + 0 + 0 + + + 38 + 130 + 336 + 0 + 0 + + + 4 + 252 + 309 + 0 + 0 + + + 118 + 306 + 546 + 2 + 0 + + + 34 + 716 + 502 + 2 + 0 + + + 4 + 279 + 279 + 0 + 0 + + + 45 + 587 + 495 + 0 + 0 + + + 1 + 175 + 646 + 0 + 0 + + + 70 + 62 + 145 + 0 + 0 + + + 70 + 310 + 427 + 0 + 0 + + + 34 + 634 + 809 + 0 + 0 + + + 217 + 685 + 646 + 3 + 0 + + + 29 + 266 + 628 + 0 + 0 + + + 55 + 261 + 640 + 2 + 0 + + + 0 + 291 + 695 + 2 + 0 + + + 4 + 184 + 423 + 0 + 0 + + + 1 + 99 + 441 + 0 + 0 + + + 7 + 604 + 682 + 4 + 0 + + + 70 + 149 + 293 + 0 + 0 + + + 205 + 78 + 115 + 0 + 0 + + + 395 + 491 + 654 + 6 + 0 + + + 70 + 273 + 286 + 0 + 0 + + + 70 + 303 + 373 + 0 + 0 + + + 70 + 215 + 203 + 0 + 0 + + + 283 + 454 + 446 + 2 + 0 + + + 1 + 286 + 708 + 0 + 0 + + + 284 + 645 + 686 + 0 + 0 + + + 938 + 686 + 645 + 0 + 0 + + + 34 + 652 + 446 + 0 + 0 + + + 445 + 636 + 614 + 2 + 0 + + + 34 + 284 + 713 + 0 + 0 + + + 407 + 699 + 633 + 0 + 0 + + + 34 + 204 + 650 + 1 + 0 + + + 278 + 515 + 461 + 0 + 0 + + + 25 + 82 + 532 + 6 + 0 + + + 43 + 461 + 515 + 4 + 0 + + + 34 + 217 + 611 + 0 + 0 + + + 70 + 74 + 124 + 0 + 0 + + + 205 + 309 + 429 + 0 + 0 + + + 23 + 457 + 443 + 2 + 0 + + + 285 + 580 + 831 + 6 + 0 + + + 70 + 299 + 261 + 0 + 0 + + + 37 + 263 + 635 + 0 + 0 + + + 218 + 171 + 255 + 2 + 0 + + + 104 + 687 + 644 + 7 + 0 + + + 5 + 654 + 491 + 0 + 0 + + + 1 + 599 + 688 + 0 + 1 + + + 283 + 482 + 420 + 6 + 0 + + + 70 + 201 + 562 + 0 + 0 + + + 562 + 661 + 544 + 0 + 0 + + + 1 + 611 + 639 + 3 + 0 + + + 70 + 154 + 283 + 0 + 0 + + + 1 + 77 + 566 + 0 + 0 + + + 0 + 199 + 666 + 0 + 0 + + + 70 + 208 + 375 + 0 + 0 + + + 45 + 125 + 624 + 0 + 0 + + + 284 + 632 + 700 + 2 + 0 + + + 51 + 570 + 685 + 0 + 0 + + + 70 + 106 + 411 + 0 + 0 + + + 0 + 506 + 400 + 0 + 0 + + + 5 + 118 + 661 + 0 + 0 + + + 1 + 632 + 569 + 0 + 1 + + + 284 + 624 + 709 + 2 + 0 + + + 1 + 167 + 467 + 0 + 0 + + + 20 + 119 + 366 + 0 + 0 + + + 70 + 183 + 238 + 0 + 0 + + + 0 + 519 + 390 + 0 + 0 + + + 205 + 86 + 106 + 0 + 0 + + + 0 + 631 + 653 + 0 + 0 + + + 70 + 191 + 228 + 0 + 0 + + + 70 + 317 + 246 + 0 + 0 + + + 16 + 630 + 765 + 0 + 0 + + + 204 + 691 + 565 + 2 + 0 + + + 1 + 295 + 686 + 4 + 0 + + + 1 + 553 + 706 + 0 + 1 + + + 597 + 746 + 482 + 2 + 0 + + + 25 + 461 + 439 + 2 + 0 + + + 4 + 94 + 463 + 0 + 0 + + + 70 + 196 + 576 + 6 + 0 + + + 34 + 413 + 490 + 6 + 0 + + + 597 + 728 + 441 + 0 + 0 + + + 0 + 176 + 644 + 3 + 0 + + + 70 + 70 + 118 + 0 + 0 + + + 153 + 543 + 436 + 0 + 0 + + + 0 + 207 + 641 + 0 + 0 + + + 4 + 194 + 224 + 0 + 0 + + + 34 + 762 + 541 + 3 + 0 + + + 38 + 263 + 431 + 0 + 0 + + + 70 + 161 + 270 + 0 + 0 + + + 36 + 165 + 687 + 4 + 0 + + + 70 + 280 + 281 + 0 + 0 + + + 1 + 349 + 579 + 0 + 0 + + + 0 + 756 + 517 + 3 + 0 + + + 973 + 650 + 788 + 0 + 0 + + + 70 + 313 + 424 + 0 + 0 + + + 307 + 685 + 526 + 4 + 0 + + + 16 + 525 + 451 + 4 + 0 + + + 1 + 607 + 644 + 3 + 0 + + + 70 + 288 + 151 + 0 + 0 + + + 575 + 723 + 444 + 0 + 0 + + + 70 + 507 + 467 + 0 + 0 + + + 20 + 289 + 581 + 0 + 0 + + + 205 + 67 + 124 + 0 + 0 + + + 284 + 652 + 680 + 0 + 0 + + + 70 + 230 + 493 + 6 + 0 + + + 205 + 313 + 139 + 0 + 0 + + + 70 + 139 + 313 + 0 + 0 + + + 55 + 60 + 725 + 5 + 0 + + + 284 + 628 + 706 + 2 + 0 + + + 407 + 722 + 571 + 6 + 0 + + + 4 + 51 + 163 + 0 + 0 + + + 110 + 225 + 504 + 4 + 0 + + + 34 + 703 + 685 + 2 + 0 + + + 70 + 203 + 558 + 6 + 0 + + + 70 + 199 + 395 + 0 + 0 + + + 70 + 155 + 280 + 0 + 0 + + + 1 + 120 + 655 + 1 + 1 + + + 205 + 117 + 371 + 0 + 0 + + + 284 + 649 + 683 + 2 + 0 + + + 3 + 272 + 289 + 0 + 0 + + + 0 + 98 + 443 + 0 + 0 + + + 0 + 604 + 647 + 3 + 0 + + + 597 + 736 + 436 + 2 + 0 + + + 38 + 260 + 167 + 0 + 0 + + + 45 + 206 + 550 + 6 + 0 + + + 1 + 181 + 626 + 0 + 0 + + + 1 + 179 + 633 + 0 + 0 + + + 1 + 595 + 745 + 0 + 0 + + + 278 + 79 + 104 + 4 + 0 + + + 8 + 228 + 497 + 0 + 0 + + + 4 + 93 + 467 + 0 + 0 + + + 51 + 424 + 3375 + 0 + 0 + + + 38 + 687 + 701 + 2 + 0 + + + 110 + 112 + 702 + 0 + 0 + + + 1 + 173 + 655 + 0 + 0 + + + 45 + 126 + 624 + 0 + 0 + + + 192 + 125 + 629 + 0 + 0 + + + 394 + 493 + 651 + 1 + 0 + + + 71 + 646 + 605 + 2 + 0 + + + 3 + 632 + 570 + 0 + 0 + + + 219 + 171 + 254 + 2 + 0 + + + 70 + 203 + 214 + 0 + 0 + + + 1 + 77 + 107 + 0 + 1 + + + 205 + 80 + 103 + 0 + 0 + + + 284 + 453 + 446 + 4 + 0 + + + 0 + 616 + 521 + 0 + 0 + + + 143 + 120 + 362 + 6 + 0 + + + 36 + 521 + 616 + 6 + 0 + + + 0 + 201 + 660 + 2 + 0 + + + 447 + 620 + 581 + 4 + 0 + + + 36 + 487 + 659 + 0 + 0 + + + 1 + 174 + 452 + 0 + 0 + + + 285 + 454 + 445 + 6 + 0 + + + 70 + 209 + 377 + 0 + 0 + + + 36 + 734 + 491 + 6 + 0 + + + 205 + 73 + 115 + 0 + 0 + + + 70 + 199 + 569 + 0 + 0 + + + 70 + 135 + 321 + 0 + 0 + + + 191 + 185 + 612 + 0 + 0 + + + 284 + 626 + 708 + 2 + 0 + + + 70 + 291 + 149 + 0 + 0 + + + 25 + 610 + 676 + 4 + 0 + + + 0 + 713 + 548 + 1 + 0 + + + 1 + 579 + 832 + 0 + 0 + + + 284 + 670 + 719 + 0 + 0 + + + 208 + 172 + 252 + 2 + 0 + + + 145 + 467 + 433 + 4 + 0 + + + 1 + 284 + 712 + 0 + 0 + + + 102 + 74 + 586 + 0 + 0 + + + 7 + 585 + 668 + 0 + 0 + + + 1 + 309 + 543 + 0 + 1 + + + 281 + 614 + 587 + 0 + 0 + + + 37 + 750 + 521 + 3 + 0 + + + 70 + 218 + 199 + 0 + 0 + + + 938 + 684 + 648 + 0 + 0 + + + 34 + 79 + 549 + 7 + 0 + + + 45 + 456 + 519 + 0 + 0 + + + 286 + 519 + 456 + 0 + 0 + + + 0 + 717 + 545 + 1 + 0 + + + 55 + 262 + 640 + 4 + 0 + + + 1 + 319 + 1510 + 0 + 1 + + + 37 + 475 + 498 + 0 + 0 + + + 104 + 686 + 646 + 4 + 0 + + + 3 + 652 + 492 + 6 + 0 + + + 284 + 646 + 686 + 0 + 0 + + + 1 + 160 + 492 + 4 + 0 + + + 4 + 308 + 431 + 0 + 0 + + + 0 + 525 + 385 + 0 + 0 + + + 597 + 746 + 483 + 2 + 0 + + + 34 + 77 + 562 + 7 + 0 + + + 273 + 617 + 584 + 6 + 0 + + + 36 + 337 + 702 + 0 + 0 + + + 70 + 82 + 102 + 0 + 0 + + + 70 + 288 + 393 + 0 + 0 + + + 70 + 216 + 524 + 0 + 0 + + + 34 + 251 + 529 + 0 + 0 + + + 37 + 469 + 684 + 4 + 0 + + + 1 + 172 + 458 + 0 + 0 + + + 51 + 630 + 572 + 4 + 0 + + + 70 + 217 + 363 + 0 + 0 + + + 20 + 119 + 364 + 0 + 0 + + + 70 + 67 + 125 + 0 + 0 + + + 70 + 303 + 375 + 0 + 0 + + + 70 + 199 + 571 + 0 + 0 + + + 110 + 225 + 505 + 4 + 0 + + + 70 + 247 + 175 + 0 + 0 + + + 70 + 284 + 400 + 0 + 0 + + + 72 + 139 + 564 + 7 + 0 + + + 191 + 160 + 490 + 0 + 0 + + + 70 + 232 + 573 + 6 + 0 + + + 4 + 300 + 144 + 0 + 0 + + + 205 + 65 + 131 + 0 + 0 + + + 1 + 177 + 443 + 0 + 0 + + + 597 + 678 + 531 + 4 + 0 + + + 37 + 633 + 700 + 0 + 0 + + + 70 + 259 + 167 + 0 + 0 + + + 70 + 178 + 243 + 0 + 0 + + + 45 + 332 + 714 + 4 + 0 + + + 70 + 212 + 204 + 0 + 0 + + + 1 + 571 + 685 + 0 + 1 + + + 319 + 243 + 178 + 2 + 0 + + + 0 + 607 + 478 + 0 + 0 + + + 34 + 710 + 678 + 7 + 0 + + + 70 + 218 + 610 + 0 + 0 + + + 1 + 172 + 456 + 0 + 0 + + + 1 + 597 + 691 + 0 + 1 + + + 36 + 729 + 440 + 2 + 0 + + + 70 + 155 + 279 + 0 + 0 + + + 283 + 580 + 830 + 6 + 0 + + + 3 + 604 + 683 + 4 + 0 + + + 261 + 585 + 496 + 4 + 0 + + + 377 + 601 + 801 + 2 + 0 + + + 407 + 626 + 575 + 0 + 0 + + + 38 + 203 + 386 + 0 + 0 + + + 36 + 111 + 706 + 0 + 0 + + + 37 + 120 + 653 + 0 + 0 + + + 526 + 711 + 451 + 6 + 0 + + + 205 + 128 + 337 + 0 + 0 + + + 0 + 643 + 689 + 0 + 0 + + + 8 + 228 + 498 + 7 + 0 + + + 1 + 215 + 618 + 0 + 1 + + + 34 + 206 + 645 + 1 + 0 + + + 284 + 632 + 701 + 2 + 0 + + + 45 + 586 + 495 + 0 + 0 + + + 191 + 185 + 614 + 0 + 0 + + + 70 + 151 + 286 + 0 + 0 + + + 306 + 731 + 535 + 0 + 0 + + + 4 + 184 + 426 + 0 + 0 + + + 284 + 624 + 710 + 2 + 0 + + + 3 + 630 + 764 + 0 + 0 + + + 70 + 282 + 278 + 0 + 0 + + + 70 + 239 + 328 + 0 + 0 + + + 0 + 639 + 454 + 5 + 0 + + + 0 + 613 + 638 + 0 + 0 + + + 0 + 520 + 388 + 0 + 0 + + + 70 + 257 + 168 + 0 + 0 + + + 20 + 603 + 597 + 0 + 0 + + + 218 + 170 + 254 + 0 + 0 + + + 70 + 217 + 199 + 0 + 0 + + + 46 + 460 + 439 + 2 + 0 + + + 3 + 81 + 532 + 4 + 0 + + + 4 + 221 + 195 + 0 + 0 + + + 70 + 195 + 221 + 0 + 0 + + + 205 + 71 + 122 + 0 + 0 + + + 70 + 133 + 324 + 0 + 0 + + + 70 + 189 + 228 + 0 + 0 + + + 307 + 497 + 584 + 0 + 0 + + + 70 + 210 + 374 + 0 + 0 + + + 1 + 170 + 462 + 0 + 0 + + + 20 + 119 + 362 + 0 + 0 + + + 597 + 727 + 441 + 0 + 0 + + + 34 + 89 + 484 + 1 + 0 + + + 994 + 271 + 491 + 7 + 0 + + + 55 + 59 + 730 + 5 + 0 + + + 0 + 737 + 435 + 7 + 0 + + + 1 + 344 + 587 + 0 + 0 + + + 70 + 195 + 403 + 0 + 0 + + + 105 + 79 + 546 + 0 + 0 + + + 0 + 705 + 683 + 0 + 0 + + + 70 + 53 + 164 + 0 + 0 + + + 4 + 330 + 344 + 0 + 0 + + + 54 + 709 + 508 + 2 + 0 + + + 45 + 206 + 551 + 6 + 0 + + + 70 + 317 + 136 + 0 + 0 + + + 284 + 482 + 419 + 6 + 0 + + + 309 + 554 + 524 + 4 + 0 + + + 0 + 537 + 441 + 0 + 0 + + + 284 + 630 + 703 + 2 + 0 + + + 1 + 204 + 652 + 0 + 0 + + + 1 + 167 + 470 + 0 + 0 + + + 55 + 662 + 669 + 5 + 0 + + + 205 + 85 + 101 + 0 + 0 + + + 193 + 625 + 464 + 1 + 1 + + + 962 + 634 + 808 + 1 + 0 + + + 70 + 187 + 230 + 0 + 0 + + + 0 + 728 + 537 + 3 + 0 + + + 38 + 135 + 319 + 0 + 0 + + + 70 + 111 + 388 + 0 + 0 + + + 100 + 74 + 582 + 0 + 0 + + + 38 + 631 + 508 + 2 + 0 + + + 597 + 672 + 477 + 6 + 0 + + + 193 + 608 + 477 + 3 + 1 + + + 34 + 742 + 432 + 7 + 0 + + + 70 + 184 + 234 + 0 + 0 + + + 205 + 88 + 98 + 0 + 0 + + + 38 + 123 + 350 + 0 + 0 + + + 70 + 105 + 410 + 0 + 0 + + + 5 + 82 + 525 + 0 + 0 + + + 395 + 648 + 743 + 4 + 0 + + + 70 + 188 + 229 + 0 + 0 + + + 4 + 94 + 458 + 0 + 0 + + + 34 + 707 + 681 + 2 + 0 + + + 4 + 326 + 348 + 0 + 0 + + + 1 + 174 + 652 + 0 + 0 + + + 0 + 522 + 556 + 0 + 0 + + + 524 + 703 + 456 + 2 + 0 + + + 27 + 516 + 459 + 0 + 0 + + + 70 + 306 + 372 + 0 + 0 + + + 70 + 228 + 575 + 6 + 0 + + + 70 + 329 + 346 + 0 + 0 + + + 7 + 593 + 696 + 4 + 0 + + + 284 + 626 + 709 + 2 + 0 + + + 70 + 154 + 292 + 0 + 0 + + + 38 + 713 + 546 + 6 + 0 + + + 377 + 635 + 809 + 4 + 0 + + + 70 + 80 + 122 + 0 + 0 + + + 34 + 716 + 501 + 0 + 0 + + + 70 + 198 + 575 + 0 + 0 + + + 71 + 599 + 689 + 4 + 0 + + + 21 + 456 + 518 + 2 + 0 + + + 34 + 98 + 459 + 0 + 0 + + + 281 + 634 + 762 + 0 + 0 + + + 206 + 689 + 565 + 7 + 0 + + + 179 + 609 + 589 + 0 + 0 + + + 24 + 208 + 547 + 2 + 1 + + + 100 + 656 + 441 + 2 + 0 + + + 306 + 695 + 461 + 7 + 0 + + + 70 + 239 + 188 + 0 + 0 + + + 70 + 188 + 239 + 0 + 0 + + + 70 + 70 + 139 + 0 + 0 + + + 70 + 108 + 416 + 0 + 0 + + + 284 + 482 + 418 + 6 + 0 + + + 1 + 270 + 293 + 0 + 1 + + + 70 + 252 + 314 + 0 + 0 + + + 0 + 613 + 635 + 0 + 0 + + + 4 + 292 + 271 + 0 + 0 + + + 1 + 127 + 623 + 0 + 0 + + + 24 + 84 + 535 + 4 + 0 + + + 0 + 177 + 643 + 3 + 0 + + + 313 + 489 + 483 + 0 + 0 + + + 4 + 58 + 168 + 0 + 0 + + + 20 + 89 + 506 + 0 + 0 + + + 4 + 66 + 149 + 0 + 0 + + + 306 + 698 + 514 + 0 + 0 + + + 70 + 307 + 371 + 0 + 0 + + + 45 + 594 + 604 + 4 + 0 + + + 70 + 63 + 156 + 0 + 0 + + + 205 + 84 + 117 + 0 + 0 + + + 0 + 759 + 513 + 3 + 0 + + + 70 + 265 + 170 + 0 + 0 + + + 284 + 452 + 446 + 4 + 0 + + + 70 + 120 + 375 + 0 + 0 + + + 1 + 199 + 659 + 0 + 0 + + + 237 + 172 + 662 + 0 + 0 + + + 402 + 599 + 741 + 1 + 0 + + + 37 + 756 + 515 + 3 + 0 + + + 70 + 71 + 138 + 0 + 0 + + + 34 + 616 + 834 + 7 + 0 + + + 70 + 302 + 149 + 0 + 0 + + + 22 + 230 + 495 + 6 + 0 + + + 25 + 650 + 493 + 0 + 0 + + + 70 + 312 + 365 + 0 + 0 + + + 36 + 166 + 686 + 4 + 0 + + + 70 + 90 + 109 + 0 + 0 + + + 38 + 242 + 186 + 0 + 0 + + + 70 + 65 + 151 + 0 + 0 + + + 0 + 580 + 833 + 1 + 0 + + + 283 + 584 + 760 + 0 + 0 + + + 34 + 112 + 707 + 0 + 0 + + + 284 + 647 + 686 + 0 + 0 + + + 4 + 311 + 422 + 0 + 0 + + + 38 + 662 + 730 + 2 + 0 + + + 22 + 656 + 547 + 2 + 0 + + + 70 + 236 + 190 + 0 + 0 + + + 70 + 190 + 236 + 0 + 0 + + + 51 + 552 + 705 + 4 + 0 + + + 1 + 313 + 531 + 1 + 1 + + + 45 + 206 + 552 + 6 + 0 + + + 597 + 746 + 481 + 2 + 0 + + + 284 + 624 + 711 + 2 + 0 + + + 284 + 632 + 702 + 2 + 0 + + + 98 + 628 + 510 + 2 + 0 + + + 37 + 726 + 536 + 3 + 0 + + + 34 + 97 + 462 + 0 + 0 + + + 70 + 281 + 282 + 0 + 0 + + + 562 + 662 + 542 + 0 + 0 + + + 209 + 713 + 579 + 4 + 0 + + + 45 + 127 + 624 + 0 + 0 + + + 0 + 714 + 545 + 1 + 0 + + + 37 + 647 + 495 + 6 + 0 + + + 70 + 195 + 583 + 6 + 0 + + + 0 + 532 + 544 + 6 + 0 + + + 1 + 206 + 637 + 0 + 0 + + + 34 + 765 + 469 + 3 + 0 + + + 34 + 656 + 783 + 2 + 0 + + + 70 + 76 + 131 + 0 + 0 + + + 70 + 325 + 404 + 0 + 0 + + + 70 + 326 + 349 + 0 + 0 + + + 70 + 59 + 169 + 0 + 0 + + + 1 + 261 + 304 + 1 + 1 + + + 4 + 194 + 409 + 0 + 0 + + + 34 + 410 + 492 + 6 + 0 + + + 306 + 759 + 544 + 3 + 0 + + + 1 + 675 + 716 + 0 + 0 + + + 38 + 67 + 149 + 0 + 0 + + + 994 + 269 + 488 + 7 + 0 + + + 70 + 227 + 501 + 6 + 0 + + + 51 + 618 + 718 + 4 + 0 + + + 0 + 198 + 663 + 0 + 0 + + + 70 + 162 + 277 + 0 + 0 + + + 25 + 589 + 701 + 4 + 0 + + + 1 + 175 + 650 + 0 + 0 + + + 0 + 622 + 515 + 0 + 0 + + + 419 + 715 + 448 + 2 + 0 + + + 445 + 623 + 576 + 0 + 0 + + + 1 + 120 + 661 + 1 + 1 + + + 1 + 86 + 522 + 1 + 1 + + + 70 + 51 + 197 + 0 + 0 + + + 597 + 726 + 441 + 0 + 0 + + + 205 + 83 + 121 + 0 + 0 + + + 34 + 708 + 682 + 2 + 0 + + + 70 + 142 + 315 + 0 + 0 + + + 1 + 646 + 603 + 1 + 1 + + + 597 + 736 + 435 + 2 + 0 + + + 3 + 273 + 289 + 0 + 0 + + + 21 + 585 + 495 + 6 + 0 + + + 205 + 215 + 208 + 0 + 0 + + + 286 + 501 + 578 + 0 + 0 + + + 97 + 668 + 664 + 6 + 0 + + + 313 + 688 + 521 + 0 + 0 + + + 191 + 161 + 490 + 0 + 0 + + + 37 + 121 + 652 + 0 + 0 + + + 70 + 283 + 158 + 0 + 0 + + + 45 + 126 + 626 + 4 + 0 + + + 25 + 608 + 1548 + 2 + 0 + + + 37 + 692 + 518 + 0 + 0 + + + 397 + 568 + 727 + 0 + 0 + + + 70 + 291 + 392 + 0 + 0 + + + 192 + 125 + 631 + 0 + 0 + + + 407 + 727 + 568 + 2 + 0 + + + 205 + 325 + 351 + 0 + 0 + + + 4 + 581 + 551 + 0 + 0 + + + 284 + 630 + 704 + 2 + 0 + + + 51 + 275 + 2974 + 4 + 0 + + + 284 + 660 + 672 + 0 + 0 + + + 70 + 318 + 248 + 0 + 0 + + + 70 + 234 + 337 + 0 + 0 + + + 55 + 663 + 669 + 2 + 0 + + + 4 + 54 + 185 + 0 + 0 + + + 36 + 112 + 704 + 0 + 0 + + + 0 + 128 + 616 + 0 + 0 + + + 70 + 330 + 398 + 0 + 0 + + + 597 + 675 + 531 + 4 + 0 + + + 313 + 714 + 502 + 0 + 0 + + + 70 + 237 + 189 + 0 + 0 + + + 70 + 189 + 237 + 0 + 0 + + + 5 + 642 + 691 + 2 + 0 + + + 70 + 268 + 426 + 0 + 0 + + + 0 + 511 + 394 + 0 + 0 + + + 70 + 215 + 531 + 0 + 0 + + + 36 + 112 + 705 + 0 + 0 + + + 1 + 168 + 470 + 0 + 0 + + + 70 + 177 + 253 + 0 + 0 + + + 20 + 540 + 438 + 0 + 0 + + + 1 + 283 + 587 + 0 + 0 + + + 133 + 78 + 574 + 0 + 0 + + + 112 + 75 + 597 + 0 + 0 + + + 51 + 630 + 569 + 0 + 0 + + + 193 + 608 + 476 + 1 + 1 + + + 38 + 202 + 565 + 6 + 0 + + + 132 + 156 + 506 + 2 + 0 + + + 283 + 579 + 834 + 7 + 0 + + + 34 + 707 + 683 + 2 + 0 + + + 37 + 262 + 634 + 0 + 0 + + + 70 + 275 + 415 + 0 + 0 + + + 524 + 710 + 451 + 0 + 0 + + + 45 + 206 + 554 + 0 + 0 + + + 4 + 285 + 157 + 0 + 0 + + + 143 + 461 + 513 + 0 + 0 + + + 0 + 585 + 706 + 0 + 0 + + + 70 + 234 + 562 + 6 + 0 + + + 35 + 109 + 725 + 0 + 0 + + + 70 + 606 + 797 + 1 + 0 + + + 1 + 571 + 682 + 0 + 1 + + + 307 + 688 + 702 + 0 + 0 + + + 34 + 411 + 490 + 6 + 0 + + + 562 + 664 + 540 + 0 + 0 + + + 34 + 746 + 522 + 3 + 0 + + + 45 + 331 + 714 + 4 + 0 + + + 70 + 193 + 231 + 0 + 0 + + + 284 + 629 + 705 + 0 + 0 + + + 20 + 628 + 571 + 0 + 0 + + + 205 + 117 + 381 + 0 + 0 + + + 4 + 284 + 157 + 0 + 0 + + + 0 + 683 + 525 + 1 + 0 + + + 20 + 166 + 476 + 0 + 0 + + + 191 + 185 + 616 + 0 + 0 + + + 41 + 621 + 714 + 0 + 0 + + + 153 + 542 + 436 + 0 + 0 + + + 205 + 209 + 378 + 0 + 0 + + + 100 + 622 + 626 + 6 + 0 + + + 35 + 72 + 619 + 0 + 0 + + + 70 + 135 + 330 + 0 + 0 + + + 4 + 150 + 297 + 0 + 0 + + + 70 + 165 + 270 + 0 + 0 + + + 0 + 638 + 695 + 0 + 0 + + + 70 + 301 + 148 + 0 + 0 + + + 34 + 710 + 505 + 2 + 0 + + + 45 + 206 + 553 + 6 + 0 + + + 0 + 523 + 385 + 0 + 0 + + + 70 + 174 + 256 + 0 + 0 + + + 284 + 654 + 678 + 0 + 0 + + + 0 + 619 + 517 + 0 + 0 + + + 34 + 208 + 632 + 0 + 0 + + + 145 + 465 + 433 + 4 + 0 + + + 281 + 615 + 583 + 0 + 0 + + + 153 + 703 + 455 + 0 + 1 + + + 284 + 658 + 674 + 0 + 0 + + + 97 + 636 + 808 + 0 + 0 + + + 962 + 629 + 817 + 0 + 0 + + + 145 + 286 + 2968 + 2 + 0 + + + 25 + 461 + 437 + 2 + 0 + + + 1 + 101 + 442 + 0 + 0 + + + 70 + 123 + 363 + 0 + 0 + + + 70 + 244 + 183 + 0 + 0 + + + 3 + 216 + 609 + 4 + 0 + + + 1 + 134 + 590 + 0 + 0 + + + 284 + 656 + 676 + 0 + 0 + + + 70 + 50 + 204 + 0 + 0 + + + 4 + 129 + 346 + 0 + 0 + + + 34 + 693 + 697 + 2 + 0 + + + 219 + 173 + 258 + 5 + 0 + + + 70 + 65 + 157 + 0 + 0 + + + 0 + 697 + 693 + 0 + 0 + + + 4 + 278 + 597 + 0 + 0 + + + 284 + 657 + 675 + 2 + 0 + + + 25 + 84 + 531 + 4 + 0 + + + 20 + 155 + 510 + 4 + 0 + + + 70 + 201 + 222 + 0 + 0 + + + 1 + 170 + 465 + 0 + 0 + + + 34 + 174 + 657 + 1 + 0 + + + 38 + 209 + 381 + 0 + 0 + + + 70 + 219 + 522 + 0 + 0 + + + 38 + 177 + 251 + 0 + 0 + + + 205 + 75 + 123 + 0 + 0 + + + 70 + 322 + 355 + 0 + 0 + + + 34 + 685 + 467 + 3 + 0 + + + 16 + 630 + 766 + 0 + 0 + + + 1 + 614 + 585 + 1 + 1 + + + 4 + 266 + 167 + 0 + 0 + + + 191 + 185 + 618 + 0 + 0 + + + 284 + 632 + 703 + 2 + 0 + + + 597 + 672 + 476 + 6 + 0 + + + 205 + 322 + 138 + 0 + 0 + + + 23 + 733 + 490 + 6 + 0 + + + 1 + 205 + 642 + 0 + 0 + + + 1 + 168 + 474 + 0 + 0 + + + 164 + 607 + 795 + 2 + 0 + + + 284 + 624 + 712 + 2 + 0 + + + 261 + 398 + 505 + 4 + 0 + + + 345 + 613 + 586 + 4 + 0 + + + 313 + 480 + 491 + 0 + 0 + + + 70 + 203 + 219 + 0 + 0 + + + 51 + 628 + 572 + 4 + 0 + + + 313 + 717 + 501 + 3 + 0 + + + 33 + 465 + 688 + 4 + 0 + + + 284 + 482 + 417 + 6 + 0 + + + 1 + 177 + 646 + 0 + 0 + + + 1 + 131 + 608 + 0 + 0 + + + 0 + 206 + 639 + 0 + 0 + + + 313 + 483 + 488 + 0 + 0 + + + 0 + 614 + 673 + 0 + 0 + + + 70 + 112 + 397 + 0 + 0 + + + 51 + 598 + 691 + 0 + 0 + + + 145 + 83 + 534 + 1 + 1 + + + 313 + 485 + 486 + 0 + 0 + + + 306 + 675 + 474 + 2 + 0 + + + 38 + 57 + 163 + 0 + 0 + + + 0 + 201 + 655 + 0 + 0 + + + 70 + 166 + 268 + 0 + 0 + + + 70 + 266 + 430 + 0 + 0 + + + 5 + 319 + 1513 + 0 + 0 + + + 70 + 118 + 377 + 0 + 0 + + + 37 + 162 + 492 + 0 + 0 + + + 34 + 652 + 443 + 0 + 0 + + + 1 + 198 + 665 + 0 + 0 + + + 70 + 207 + 215 + 0 + 0 + + + 34 + 598 + 535 + 6 + 0 + + + 70 + 187 + 238 + 0 + 0 + + + 0 + 639 + 452 + 5 + 0 + + + 70 + 75 + 124 + 0 + 0 + + + 70 + 74 + 126 + 0 + 0 + + + 313 + 739 + 433 + 3 + 0 + + + 70 + 159 + 280 + 0 + 0 + + + 306 + 744 + 524 + 3 + 0 + + + 70 + 262 + 170 + 0 + 0 + + + 0 + 645 + 557 + 0 + 0 + + + 34 + 479 + 668 + 0 + 0 + + + 34 + 82 + 543 + 7 + 0 + + + 70 + 176 + 253 + 0 + 0 + + + 1 + 173 + 660 + 0 + 0 + + + 70 + 113 + 392 + 0 + 0 + + + 0 + 515 + 561 + 0 + 0 + + + 70 + 138 + 321 + 0 + 0 + + + 306 + 512 + 460 + 0 + 0 + + + 419 + 709 + 451 + 4 + 0 + + + 38 + 276 + 289 + 0 + 0 + + + 284 + 659 + 674 + 0 + 0 + + + 70 + 210 + 211 + 0 + 0 + + + 3 + 593 + 697 + 4 + 0 + + + 70 + 91 + 103 + 0 + 0 + + + 70 + 127 + 349 + 0 + 0 + + + 37 + 454 + 443 + 6 + 0 + + + 70 + 59 + 159 + 0 + 0 + + + 1 + 172 + 664 + 0 + 0 + + + 394 + 489 + 654 + 0 + 0 + + + 20 + 135 + 591 + 0 + 0 + + + 47 + 607 + 681 + 4 + 0 + + + 37 + 452 + 445 + 6 + 0 + + + 70 + 58 + 162 + 0 + 0 + + + 284 + 661 + 672 + 0 + 0 + + + 283 + 451 + 446 + 2 + 0 + + + 70 + 181 + 245 + 0 + 0 + + + 98 + 637 + 502 + 2 + 0 + + + 7 + 120 + 665 + 5 + 0 + + + 7 + 216 + 610 + 0 + 0 + + + 45 + 595 + 604 + 4 + 0 + + + 70 + 272 + 420 + 0 + 0 + + + 70 + 204 + 560 + 6 + 0 + + + 37 + 99 + 448 + 0 + 0 + + + 70 + 48 + 196 + 0 + 0 + + + 1 + 130 + 614 + 0 + 0 + + + 70 + 82 + 115 + 0 + 0 + + + 70 + 278 + 411 + 0 + 0 + + + 205 + 290 + 394 + 0 + 0 + + + 1 + 179 + 446 + 0 + 0 + + + 4 + 276 + 414 + 0 + 0 + + + 70 + 223 + 199 + 0 + 0 + + + 0 + 526 + 608 + 0 + 0 + + + 1 + 215 + 613 + 0 + 1 + + + 143 + 407 + 3513 + 6 + 0 + + + 37 + 263 + 634 + 0 + 0 + + + 34 + 682 + 527 + 2 + 0 + + + 71 + 594 + 696 + 4 + 0 + + + 45 + 330 + 714 + 4 + 0 + + + 70 + 69 + 137 + 0 + 0 + + + 70 + 330 + 242 + 0 + 0 + + + 15 + 249 + 459 + 6 + 0 + + + 0 + 182 + 628 + 0 + 0 + + + 1 + 134 + 596 + 0 + 0 + + + 3 + 83 + 535 + 6 + 0 + + + 193 + 608 + 475 + 1 + 1 + + + 37 + 647 + 494 + 0 + 0 + + + 21 + 552 + 749 + 0 + 0 + + + 70 + 107 + 413 + 0 + 0 + + + 1 + 180 + 441 + 0 + 0 + + + 70 + 242 + 328 + 0 + 0 + + + 70 + 203 + 391 + 0 + 0 + + + 1 + 79 + 559 + 7 + 0 + + + 195 + 75 + 589 + 0 + 0 + + + 1 + 469 + 503 + 1 + 1 + + + 34 + 651 + 444 + 0 + 0 + + + 1 + 171 + 670 + 0 + 0 + + + 70 + 64 + 148 + 0 + 0 + + + 70 + 142 + 311 + 0 + 0 + + + 225 + 259 + 643 + 4 + 0 + + + 0 + 128 + 620 + 0 + 0 + + + 38 + 165 + 268 + 0 + 0 + + + 0 + 628 + 509 + 2 + 0 + + + 25 + 208 + 551 + 4 + 0 + + + 34 + 654 + 442 + 0 + 0 + + + 284 + 655 + 678 + 2 + 0 + + + 0 + 209 + 631 + 0 + 0 + + + 70 + 105 + 421 + 0 + 0 + + + 597 + 676 + 531 + 4 + 0 + + + 70 + 200 + 573 + 0 + 0 + + + 34 + 99 + 447 + 0 + 0 + + + 70 + 118 + 375 + 0 + 0 + + + 34 + 606 + 796 + 0 + 0 + + + 70 + 291 + 273 + 0 + 0 + + + 11 + 273 + 291 + 4 + 0 + + + 4 + 112 + 395 + 0 + 0 + + + 1 + 178 + 644 + 0 + 0 + + + 70 + 322 + 356 + 0 + 0 + + + 193 + 624 + 463 + 3 + 1 + + + 1 + 648 + 554 + 0 + 0 + + + 110 + 113 + 703 + 0 + 0 + + + 510 + 648 + 602 + 6 + 0 + + + 38 + 114 + 388 + 0 + 0 + + + 51 + 622 + 714 + 6 + 0 + + + 70 + 90 + 106 + 0 + 0 + + + 25 + 608 + 1549 + 2 + 0 + + + 3 + 85 + 521 + 0 + 0 + + + 34 + 82 + 540 + 7 + 0 + + + 103 + 629 + 855 + 6 + 0 + + + 597 + 725 + 441 + 0 + 0 + + + 46 + 525 + 609 + 2 + 0 + + + 1 + 302 + 665 + 0 + 0 + + + 284 + 657 + 676 + 0 + 0 + + + 407 + 667 + 620 + 0 + 0 + + + 70 + 157 + 282 + 0 + 0 + + + 284 + 630 + 705 + 2 + 0 + + + 1 + 102 + 434 + 0 + 0 + + + 1 + 248 + 532 + 0 + 0 + + + 70 + 57 + 168 + 0 + 0 + + + 38 + 58 + 165 + 0 + 0 + + + 4 + 96 + 461 + 0 + 0 + + + 32 + 429 + 674 + 0 + 0 + + + 395 + 572 + 723 + 0 + 0 + + + 45 + 127 + 626 + 4 + 0 + + + 37 + 766 + 509 + 3 + 0 + + + 284 + 649 + 684 + 2 + 0 + + + 34 + 204 + 647 + 0 + 0 + + + 1 + 654 + 549 + 0 + 0 + + + 1 + 602 + 687 + 1 + 1 + + + 38 + 60 + 160 + 0 + 0 + + + 284 + 671 + 719 + 0 + 0 + + + 4 + 582 + 549 + 0 + 0 + + + 205 + 218 + 202 + 0 + 0 + + + 70 + 207 + 384 + 0 + 0 + + + 0 + 128 + 621 + 0 + 0 + + + 70 + 189 + 233 + 0 + 0 + + + 1 + 249 + 530 + 0 + 0 + + + 4 + 95 + 464 + 0 + 0 + + + 51 + 286 + 2966 + 6 + 0 + + + 70 + 214 + 206 + 0 + 0 + + + 35 + 71 + 621 + 0 + 0 + + + 278 + 634 + 761 + 0 + 0 + + + 70 + 151 + 292 + 0 + 0 + + + 70 + 292 + 392 + 0 + 0 + + + 4 + 310 + 426 + 0 + 0 + + + 0 + 201 + 657 + 3 + 0 + + + 70 + 137 + 322 + 0 + 0 + + + 97 + 267 + 298 + 6 + 0 + + + 306 + 766 + 540 + 3 + 0 + + + 70 + 196 + 406 + 0 + 0 + + + 70 + 125 + 353 + 0 + 0 + + + 219 + 171 + 258 + 3 + 0 + + + 1 + 86 + 513 + 1 + 1 + + + 286 + 523 + 611 + 0 + 0 + + + 1 + 611 + 523 + 0 + 0 + + + 6 + 245 + 180 + 2 + 0 + + + 7 + 611 + 677 + 4 + 0 + + + 0 + 740 + 527 + 3 + 0 + + + 1 + 306 + 544 + 1 + 1 + + + 284 + 628 + 707 + 2 + 0 + + + 70 + 248 + 178 + 0 + 0 + + + 4 + 290 + 395 + 0 + 0 + + + 1 + 183 + 435 + 0 + 0 + + + 4 + 123 + 359 + 0 + 0 + + + 1 + 83 + 532 + 0 + 1 + + + 34 + 222 + 516 + 1 + 0 + + + 1 + 477 + 670 + 0 + 0 + + + 1 + 81 + 545 + 7 + 0 + + + 284 + 652 + 681 + 2 + 0 + + + 283 + 585 + 759 + 0 + 0 + + + 70 + 319 + 414 + 0 + 0 + + + 205 + 278 + 412 + 0 + 0 + + + 153 + 541 + 436 + 0 + 0 + + + 51 + 230 + 498 + 2 + 0 + + + 0 + 624 + 625 + 6 + 0 + + + 0 + 625 + 624 + 6 + 0 + + + 70 + 198 + 402 + 0 + 0 + + + 70 + 268 + 297 + 0 + 0 + + + 5 + 680 + 470 + 0 + 0 + + + 143 + 458 + 515 + 2 + 0 + + + 1 + 283 + 710 + 0 + 0 + + + 70 + 84 + 131 + 0 + 0 + + + 38 + 314 + 428 + 0 + 0 + + + 4 + 285 + 282 + 0 + 0 + + + 59 + 274 + 603 + 0 + 0 + + + 1 + 94 + 445 + 4 + 0 + + + 51 + 276 + 2960 + 2 + 0 + + + 284 + 657 + 677 + 2 + 0 + + + 0 + 723 + 495 + 1 + 0 + + + 70 + 319 + 347 + 0 + 0 + + + 306 + 696 + 690 + 0 + 0 + + + 34 + 686 + 700 + 0 + 0 + + + 597 + 730 + 443 + 4 + 0 + + + 6 + 113 + 1462 + 0 + 0 + + + 204 + 700 + 686 + 4 + 0 + + + 284 + 655 + 679 + 2 + 0 + + + 37 + 254 + 529 + 0 + 0 + + + 283 + 454 + 451 + 6 + 0 + + + 1 + 631 + 761 + 0 + 1 + + + 70 + 268 + 156 + 0 + 0 + + + 407 + 619 + 466 + 3 + 0 + + + 34 + 700 + 462 + 3 + 0 + + + 97 + 266 + 302 + 6 + 0 + + + 0 + 608 + 674 + 0 + 0 + + + 1 + 253 + 531 + 0 + 0 + + + 70 + 220 + 190 + 0 + 0 + + + 0 + 620 + 661 + 3 + 0 + + + 50 + 558 + 703 + 0 + 0 + + + 306 + 720 + 497 + 1 + 0 + + + 0 + 175 + 459 + 0 + 0 + + + 186 + 624 + 462 + 1 + 1 + + + 34 + 766 + 535 + 3 + 0 + + + 37 + 473 + 497 + 0 + 0 + + + 70 + 108 + 387 + 0 + 0 + + + 70 + 320 + 251 + 0 + 0 + + + 70 + 208 + 532 + 0 + 0 + + + 70 + 124 + 337 + 0 + 0 + + + 0 + 702 + 684 + 2 + 0 + + + 70 + 127 + 329 + 0 + 0 + + + 37 + 75 + 557 + 7 + 0 + + + 1 + 202 + 665 + 0 + 0 + + + 206 + 693 + 566 + 0 + 0 + + + 283 + 685 + 701 + 0 + 0 + + + 205 + 119 + 351 + 0 + 0 + + + 70 + 197 + 212 + 0 + 0 + + + 37 + 246 + 546 + 0 + 0 + + + 306 + 766 + 512 + 3 + 0 + + + 19 + 588 + 667 + 4 + 0 + + + 70 + 50 + 218 + 0 + 0 + + + 46 + 460 + 445 + 2 + 0 + + + 38 + 325 + 247 + 0 + 0 + + + 70 + 247 + 325 + 0 + 0 + + + 283 + 704 + 682 + 0 + 0 + + + 1 + 178 + 451 + 0 + 0 + + + 38 + 127 + 632 + 0 + 0 + + + 398 + 542 + 756 + 1 + 0 + + + 1 + 176 + 456 + 0 + 0 + + + 20 + 114 + 366 + 6 + 0 + + + 34 + 61 + 688 + 0 + 0 + + + 70 + 302 + 367 + 0 + 0 + + + 205 + 236 + 340 + 0 + 0 + + + 283 + 705 + 681 + 0 + 0 + + + 38 + 226 + 355 + 0 + 0 + + + 205 + 276 + 152 + 0 + 0 + + + 284 + 624 + 713 + 2 + 0 + + + 1 + 76 + 552 + 7 + 0 + + + 70 + 111 + 378 + 0 + 0 + + + 70 + 311 + 258 + 0 + 0 + + + 70 + 206 + 538 + 0 + 0 + + + 286 + 494 + 655 + 1 + 0 + + + 21 + 329 + 715 + 0 + 0 + + + 0 + 535 + 539 + 6 + 0 + + + 0 + 696 + 514 + 1 + 0 + + + 70 + 69 + 157 + 0 + 0 + + + 306 + 486 + 484 + 0 + 0 + + + 313 + 484 + 486 + 0 + 0 + + + 222 + 233 + 180 + 0 + 0 + + + 284 + 662 + 672 + 0 + 0 + + + 272 + 616 + 637 + 0 + 0 + + + 34 + 733 + 488 + 3 + 0 + + + 38 + 196 + 214 + 0 + 0 + + + 1 + 171 + 648 + 5 + 0 + + + 97 + 271 + 296 + 6 + 0 + + + 547 + 617 + 636 + 3 + 0 + + + 313 + 481 + 489 + 0 + 0 + + + 0 + 737 + 439 + 7 + 0 + + + 0 + 766 + 467 + 0 + 0 + + + 37 + 473 + 684 + 4 + 0 + + + 37 + 94 + 446 + 4 + 0 + + + 4 + 317 + 253 + 0 + 0 + + + 41 + 632 + 566 + 2 + 0 + + + 70 + 174 + 241 + 0 + 0 + + + 70 + 74 + 146 + 0 + 0 + + + 70 + 107 + 101 + 0 + 0 + + + 191 + 181 + 612 + 0 + 0 + + + 108 + 72 + 582 + 0 + 0 + + + 1 + 97 + 432 + 0 + 0 + + + 70 + 190 + 422 + 0 + 0 + + + 284 + 660 + 674 + 0 + 0 + + + 70 + 167 + 251 + 0 + 0 + + + 4 + 290 + 382 + 0 + 0 + + + 34 + 63 + 665 + 0 + 0 + + + 283 + 707 + 679 + 0 + 0 + + + 0 + 641 + 694 + 0 + 0 + + + 1 + 210 + 639 + 0 + 0 + + + 70 + 187 + 224 + 0 + 0 + + + 34 + 716 + 548 + 1 + 0 + + + 272 + 615 + 638 + 0 + 0 + + + 55 + 214 + 627 + 0 + 0 + + + 1 + 131 + 612 + 0 + 0 + + + 1 + 248 + 541 + 0 + 0 + + + 38 + 705 + 581 + 2 + 0 + + + 1 + 245 + 452 + 0 + 0 + + + 0 + 74 + 566 + 0 + 0 + + + 307 + 497 + 580 + 0 + 0 + + + 70 + 55 + 196 + 0 + 0 + + + 1 + 208 + 645 + 0 + 0 + + + 1 + 183 + 438 + 0 + 0 + + + 55 + 201 + 551 + 0 + 0 + + + 70 + 161 + 260 + 0 + 0 + + + 70 + 328 + 409 + 0 + 0 + + + 445 + 639 + 614 + 2 + 0 + + + 70 + 84 + 128 + 0 + 0 + + + 38 + 252 + 318 + 0 + 0 + + + 10 + 467 + 438 + 2 + 0 + + + 4 + 106 + 395 + 0 + 0 + + + 1 + 678 + 708 + 0 + 0 + + + 110 + 114 + 703 + 0 + 0 + + + 100 + 76 + 547 + 4 + 0 + + + 1 + 593 + 545 + 1 + 1 + + + 70 + 99 + 420 + 0 + 0 + + + 70 + 105 + 396 + 0 + 0 + + + 1 + 560 + 701 + 0 + 1 + + + 208 + 686 + 648 + 4 + 0 + + + 23 + 646 + 447 + 1 + 0 + + + 284 + 648 + 686 + 0 + 0 + + + 70 + 194 + 572 + 0 + 0 + + + 34 + 204 + 660 + 1 + 0 + + + 70 + 76 + 148 + 0 + 0 + + + 70 + 209 + 199 + 0 + 0 + + + 0 + 636 + 454 + 5 + 0 + + + 1 + 360 + 568 + 2 + 1 + + + 45 + 594 + 602 + 0 + 0 + + + 205 + 277 + 150 + 0 + 0 + + + 4 + 50 + 224 + 0 + 0 + + + 34 + 286 + 715 + 0 + 0 + + + 70 + 236 + 176 + 0 + 0 + + + 0 + 88 + 472 + 0 + 0 + + + 10 + 469 + 436 + 4 + 0 + + + 306 + 689 + 519 + 4 + 0 + + + 205 + 183 + 227 + 0 + 0 + + + 37 + 685 + 522 + 5 + 0 + + + 45 + 592 + 604 + 4 + 0 + + + 70 + 214 + 629 + 2 + 0 + + + 938 + 687 + 647 + 0 + 0 + + + 1 + 596 + 688 + 0 + 1 + + + 70 + 276 + 290 + 0 + 0 + + + 37 + 163 + 491 + 0 + 0 + + + 0 + 628 + 625 + 6 + 0 + + + 1 + 265 + 302 + 1 + 1 + + + 278 + 629 + 763 + 0 + 0 + + + 70 + 76 + 147 + 0 + 0 + + + 1 + 307 + 666 + 0 + 0 + + + 34 + 208 + 647 + 0 + 0 + + + 597 + 736 + 439 + 2 + 0 + + + 314 + 688 + 646 + 0 + 0 + + + 1 + 581 + 826 + 0 + 0 + + + 70 + 71 + 157 + 0 + 0 + + + 70 + 701 + 634 + 0 + 0 + + + 45 + 251 + 536 + 0 + 0 + + + 70 + 288 + 144 + 0 + 0 + + + 34 + 113 + 708 + 0 + 0 + + + 20 + 114 + 364 + 6 + 0 + + + 4 + 166 + 250 + 0 + 0 + + + 98 + 631 + 512 + 2 + 0 + + + 145 + 276 + 2959 + 6 + 0 + + + 70 + 193 + 215 + 0 + 0 + + + 23 + 658 + 491 + 6 + 0 + + + 22 + 595 + 543 + 0 + 0 + + + 70 + 66 + 169 + 0 + 0 + + + 34 + 652 + 736 + 0 + 0 + + + 70 + 150 + 278 + 0 + 0 + + + 70 + 208 + 534 + 0 + 0 + + + 284 + 652 + 682 + 2 + 0 + + + 70 + 236 + 570 + 6 + 0 + + + 377 + 639 + 806 + 6 + 0 + + + 0 + 230 + 483 + 0 + 0 + + + 1 + 617 + 524 + 0 + 0 + + + 70 + 262 + 424 + 0 + 0 + + + 88 + 695 + 565 + 5 + 0 + + + 1 + 418 + 489 + 0 + 1 + + + 70 + 113 + 98 + 0 + 0 + + + 284 + 628 + 708 + 2 + 0 + + + 20 + 123 + 650 + 0 + 0 + + + 1 + 262 + 630 + 1 + 1 + + + 962 + 668 + 771 + 7 + 0 + + + 70 + 199 + 558 + 6 + 0 + + + 1 + 683 + 651 + 0 + 0 + + + 4 + 77 + 144 + 0 + 0 + + + 70 + 304 + 263 + 0 + 0 + + + 70 + 105 + 397 + 0 + 0 + + + 70 + 287 + 387 + 0 + 0 + + + 58 + 241 + 173 + 2 + 0 + + + 284 + 482 + 424 + 6 + 0 + + + 16 + 628 + 764 + 2 + 0 + + + 63 + 116 + 359 + 2 + 0 + + + 15 + 120 + 666 + 0 + 0 + + + 306 + 738 + 532 + 0 + 0 + + + 34 + 287 + 712 + 0 + 0 + + + 70 + 231 + 346 + 0 + 0 + + + 15 + 164 + 254 + 4 + 0 + + + 70 + 206 + 388 + 0 + 0 + + + 597 + 672 + 481 + 6 + 0 + + + 37 + 694 + 515 + 1 + 0 + + + 0 + 516 + 396 + 0 + 0 + + + 951 + 635 + 811 + 0 + 0 + + + 153 + 540 + 436 + 0 + 0 + + + 1 + 212 + 634 + 0 + 0 + + + 284 + 454 + 450 + 2 + 0 + + + 284 + 671 + 715 + 0 + 0 + + + 420 + 636 + 699 + 2 + 0 + + + 284 + 649 + 685 + 2 + 0 + + + 70 + 145 + 287 + 0 + 0 + + + 0 + 127 + 629 + 0 + 0 + + + 34 + 722 + 495 + 3 + 0 + + + 5 + 601 + 682 + 0 + 0 + + + 4 + 101 + 412 + 0 + 0 + + + 70 + 206 + 202 + 0 + 0 + + + 70 + 81 + 136 + 0 + 0 + + + 34 + 754 + 474 + 3 + 0 + + + 21 + 257 + 642 + 4 + 0 + + + 70 + 219 + 190 + 0 + 0 + + + 38 + 107 + 389 + 0 + 0 + + + 23 + 743 + 481 + 2 + 0 + + + 3 + 627 + 570 + 0 + 0 + + + 70 + 144 + 289 + 0 + 0 + + + 70 + 297 + 269 + 0 + 0 + + + 70 + 102 + 408 + 0 + 0 + + + 70 + 296 + 375 + 0 + 0 + + + 70 + 207 + 386 + 0 + 0 + + + 278 + 273 + 494 + 2 + 0 + + + 0 + 130 + 622 + 0 + 0 + + + 70 + 326 + 248 + 0 + 0 + + + 26 + 124 + 652 + 0 + 0 + + + 938 + 685 + 650 + 0 + 0 + + + 0 + 751 + 523 + 3 + 0 + + + 34 + 470 + 687 + 4 + 0 + + + 21 + 550 + 746 + 4 + 0 + + + 0 + 445 + 459 + 0 + 0 + + + 284 + 628 + 709 + 2 + 0 + + + 1 + 74 + 558 + 0 + 0 + + + 70 + 59 + 177 + 0 + 0 + + + 95 + 121 + 668 + 4 + 0 + + + 153 + 538 + 436 + 0 + 0 + + + 34 + 653 + 441 + 0 + 0 + + + 0 + 177 + 457 + 0 + 0 + + + 70 + 159 + 260 + 0 + 0 + + + 989 + 666 + 772 + 0 + 0 + + + 70 + 76 + 138 + 0 + 0 + + + 0 + 605 + 476 + 0 + 0 + + + 1 + 219 + 616 + 3 + 1 + + + 525 + 716 + 451 + 6 + 0 + + + 205 + 334 + 333 + 0 + 0 + + + 70 + 287 + 144 + 0 + 0 + + + 205 + 187 + 221 + 0 + 0 + + + 4 + 293 + 276 + 0 + 0 + + + 35 + 59 + 699 + 0 + 0 + + + 191 + 181 + 614 + 0 + 0 + + + 143 + 113 + 365 + 2 + 0 + + + 205 + 88 + 118 + 0 + 0 + + + 153 + 533 + 440 + 0 + 0 + + + 313 + 693 + 517 + 0 + 0 + + + 58 + 155 + 266 + 6 + 0 + + + 70 + 169 + 244 + 0 + 0 + + + 306 + 718 + 499 + 1 + 0 + + + 32 + 537 + 764 + 0 + 0 + + + 284 + 649 + 686 + 0 + 0 + + + 938 + 686 + 649 + 0 + 0 + + + 205 + 310 + 133 + 0 + 0 + + + 97 + 689 + 570 + 5 + 0 + + + 70 + 232 + 581 + 6 + 0 + + + 1 + 127 + 636 + 0 + 0 + + + 44 + 251 + 537 + 6 + 0 + + + 0 + 513 + 398 + 0 + 0 + + + 20 + 114 + 362 + 6 + 0 + + + 205 + 308 + 134 + 0 + 0 + + + 102 + 76 + 543 + 4 + 0 + + + 34 + 674 + 479 + 3 + 0 + + + 35 + 63 + 655 + 0 + 0 + + + 193 + 607 + 474 + 3 + 1 + + + 284 + 669 + 717 + 0 + 0 + + + 38 + 264 + 421 + 0 + 0 + + + 20 + 318 + 521 + 0 + 0 + + + 70 + 50 + 208 + 0 + 0 + + + 70 + 101 + 103 + 0 + 0 + + + 59 + 184 + 604 + 6 + 0 + + + 70 + 223 + 185 + 0 + 0 + + + 4 + 202 + 400 + 0 + 0 + + + 1 + 171 + 651 + 0 + 0 + + + 110 + 115 + 702 + 0 + 0 + + + 4 + 241 + 335 + 0 + 0 + + + 284 + 667 + 719 + 0 + 0 + + + 285 + 582 + 824 + 6 + 0 + + + 205 + 321 + 129 + 0 + 0 + + + 4 + 300 + 371 + 0 + 0 + + + 70 + 228 + 354 + 0 + 0 + + + 284 + 655 + 680 + 2 + 0 + + + 70 + 320 + 421 + 0 + 0 + + + 70 + 54 + 191 + 0 + 0 + + + 284 + 630 + 707 + 0 + 0 + + + 70 + 313 + 258 + 0 + 0 + + + 131 + 125 + 646 + 3 + 0 + + + 102 + 318 + 642 + 0 + 0 + + + 50 + 583 + 764 + 1 + 0 + + + 377 + 601 + 798 + 1 + 0 + + + 205 + 507 + 463 + 0 + 0 + + + 70 + 135 + 307 + 0 + 0 + + + 313 + 487 + 482 + 0 + 0 + + + 1 + 177 + 629 + 0 + 0 + + + 205 + 76 + 136 + 0 + 0 + + + 70 + 220 + 367 + 0 + 0 + + + 70 + 90 + 115 + 0 + 0 + + + 45 + 250 + 539 + 6 + 0 + + + 94 + 539 + 599 + 0 + 1 + + + 284 + 652 + 683 + 2 + 0 + + + 1 + 94 + 440 + 4 + 0 + + + 55 + 652 + 629 + 4 + 0 + + + 3 + 562 + 699 + 0 + 0 + + + 306 + 754 + 521 + 3 + 0 + + + 0 + 725 + 494 + 1 + 0 + + + 70 + 125 + 331 + 0 + 0 + + + 22 + 651 + 630 + 4 + 0 + + + 103 + 76 + 544 + 0 + 0 + + + 1 + 297 + 687 + 4 + 0 + + + 0 + 128 + 630 + 0 + 0 + + + 4 + 50 + 205 + 0 + 0 + + + 38 + 67 + 153 + 0 + 0 + + + 45 + 595 + 602 + 0 + 0 + + + 1 + 611 + 643 + 3 + 0 + + + 34 + 648 + 740 + 0 + 0 + + + 285 + 477 + 492 + 0 + 0 + + + 205 + 127 + 326 + 0 + 0 + + + 51 + 622 + 716 + 6 + 0 + + + 38 + 201 + 206 + 0 + 0 + + + 70 + 206 + 201 + 0 + 0 + + + 34 + 75 + 552 + 7 + 0 + + + 1 + 172 + 647 + 5 + 0 + + + 407 + 611 + 471 + 0 + 0 + + + 45 + 593 + 604 + 4 + 0 + + + 1 + 92 + 450 + 4 + 0 + + + 205 + 310 + 359 + 0 + 0 + + + 34 + 697 + 688 + 2 + 0 + + + 1 + 649 + 632 + 0 + 1 + + + 29 + 264 + 628 + 0 + 0 + + + 1 + 92 + 446 + 4 + 0 + + + 70 + 226 + 493 + 6 + 0 + + + 70 + 255 + 316 + 0 + 0 + + + 70 + 57 + 188 + 0 + 0 + + + 597 + 746 + 480 + 2 + 0 + + + 70 + 200 + 403 + 0 + 0 + + + 45 + 203 + 549 + 4 + 0 + + + 70 + 132 + 311 + 0 + 0 + + + 70 + 277 + 291 + 0 + 0 + + + 34 + 62 + 662 + 0 + 0 + + + 70 + 135 + 304 + 0 + 0 + + + 205 + 240 + 171 + 0 + 0 + + + 377 + 625 + 573 + 4 + 0 + + + 524 + 703 + 459 + 2 + 0 + + + 938 + 690 + 645 + 0 + 0 + + + 34 + 206 + 656 + 0 + 0 + + + 4 + 177 + 232 + 0 + 0 + + + 502 + 635 + 564 + 0 + 0 + + + 70 + 99 + 415 + 0 + 0 + + + 151 + 535 + 439 + 6 + 0 + + + 1 + 692 + 568 + 0 + 1 + + + 1 + 84 + 489 + 1 + 0 + + + 70 + 325 + 343 + 0 + 0 + + + 70 + 198 + 563 + 0 + 0 + + + 0 + 76 + 539 + 7 + 0 + + + 36 + 667 + 432 + 2 + 0 + + + 274 + 524 + 448 + 4 + 0 + + + 70 + 299 + 137 + 0 + 0 + + + 70 + 193 + 577 + 6 + 0 + + + 272 + 615 + 639 + 0 + 0 + + + 1 + 286 + 713 + 0 + 0 + + + 70 + 209 + 196 + 0 + 0 + + + 70 + 162 + 253 + 0 + 0 + + + 38 + 239 + 337 + 0 + 0 + + + 70 + 99 + 414 + 0 + 0 + + + 0 + 749 + 478 + 0 + 0 + + + 153 + 536 + 438 + 2 + 0 + + + 597 + 672 + 480 + 6 + 0 + + + 284 + 632 + 704 + 2 + 0 + + + 0 + 763 + 538 + 3 + 0 + + + 4 + 164 + 250 + 0 + 0 + + + 51 + 276 + 2957 + 2 + 0 + + + 70 + 306 + 134 + 0 + 0 + + + 70 + 153 + 268 + 0 + 0 + + + 70 + 55 + 194 + 0 + 0 + + + 1 + 657 + 545 + 0 + 0 + + + 272 + 616 + 638 + 0 + 0 + + + 45 + 252 + 536 + 0 + 0 + + + 145 + 471 + 433 + 4 + 0 + + + 34 + 652 + 442 + 0 + 0 + + + 1 + 74 + 554 + 0 + 0 + + + 445 + 636 + 563 + 6 + 0 + + + 55 + 220 + 614 + 0 + 0 + + + 70 + 206 + 391 + 0 + 0 + + + 34 + 93 + 441 + 4 + 0 + + + 1 + 680 + 705 + 2 + 0 + + + 0 + 757 + 473 + 0 + 0 + + + 1 + 88 + 466 + 0 + 0 + + + 205 + 176 + 233 + 0 + 0 + + + 34 + 522 + 618 + 6 + 0 + + + 1 + 168 + 664 + 0 + 0 + + + 938 + 688 + 647 + 0 + 0 + + + 55 + 201 + 555 + 0 + 0 + + + 283 + 708 + 677 + 0 + 0 + + + 4 + 55 + 192 + 0 + 0 + + + 21 + 548 + 749 + 0 + 0 + + + 0 + 307 + 664 + 0 + 0 + + + 284 + 454 + 449 + 2 + 0 + + + 70 + 192 + 581 + 6 + 0 + + + 70 + 140 + 294 + 0 + 0 + + + 278 + 614 + 583 + 0 + 0 + + + 70 + 161 + 693 + 0 + 0 + + + 306 + 752 + 476 + 0 + 0 + + + 153 + 534 + 440 + 0 + 0 + + + 34 + 203 + 665 + 1 + 0 + + + 285 + 634 + 756 + 0 + 0 + + + 286 + 492 + 656 + 1 + 0 + + + 6 + 317 + 1512 + 0 + 0 + + + 70 + 236 + 341 + 0 + 0 + + + 606 + 732 + 441 + 0 + 0 + + + 22 + 601 + 683 + 4 + 0 + + + 1 + 160 + 503 + 4 + 0 + + + 70 + 314 + 430 + 0 + 0 + + + 70 + 107 + 99 + 0 + 0 + + + 217 + 687 + 648 + 1 + 0 + + + 142 + 474 + 681 + 6 + 0 + + + 70 + 106 + 100 + 0 + 0 + + + 419 + 711 + 454 + 2 + 0 + + + 153 + 539 + 436 + 0 + 0 + + + 4 + 103 + 400 + 0 + 0 + + + 1 + 80 + 515 + 1 + 0 + + + 70 + 103 + 103 + 0 + 0 + + + 0 + 581 + 825 + 6 + 0 + + + 34 + 93 + 443 + 4 + 0 + + + 284 + 482 + 423 + 6 + 0 + + + 36 + 524 + 616 + 6 + 0 + + + 51 + 620 + 718 + 4 + 0 + + + 0 + 623 + 518 + 0 + 0 + + + 1187 + 446 + 3367 + 4 + 0 + + + 38 + 128 + 628 + 0 + 0 + + + 284 + 626 + 711 + 0 + 0 + + + 0 + 410 + 497 + 6 + 0 + + + 0 + 648 + 498 + 6 + 0 + + + 191 + 181 + 616 + 0 + 0 + + + 306 + 747 + 432 + 7 + 0 + + + 1 + 629 + 569 + 0 + 1 + + + 34 + 62 + 663 + 0 + 0 + + + 306 + 518 + 556 + 0 + 0 + + + 428 + 691 + 467 + 6 + 0 + + + 597 + 674 + 531 + 4 + 0 + + + 59 + 184 + 606 + 2 + 0 + + + 45 + 329 + 714 + 4 + 0 + + + 407 + 609 + 473 + 1 + 0 + + + 195 + 338 + 603 + 4 + 0 + + + 70 + 196 + 569 + 0 + 0 + + + 0 + 722 + 447 + 7 + 0 + + + 261 + 402 + 507 + 0 + 0 + + + 37 + 724 + 543 + 3 + 0 + + + 37 + 687 + 521 + 6 + 0 + + + 938 + 689 + 646 + 0 + 0 + + + 70 + 331 + 243 + 0 + 0 + + + 1 + 619 + 663 + 3 + 0 + + + 278 + 615 + 582 + 0 + 0 + + + 70 + 296 + 139 + 0 + 0 + + + 70 + 162 + 254 + 0 + 0 + + + 34 + 81 + 508 + 1 + 0 + + + 3 + 215 + 620 + 4 + 0 + + + 70 + 164 + 261 + 0 + 0 + + + 70 + 86 + 139 + 0 + 0 + + + 1 + 600 + 652 + 2 + 0 + + + 951 + 635 + 812 + 4 + 0 + + + 70 + 245 + 332 + 0 + 0 + + + 88 + 690 + 646 + 7 + 0 + + + 45 + 203 + 550 + 2 + 0 + + + 70 + 231 + 577 + 6 + 0 + + + 70 + 199 + 215 + 0 + 0 + + + 205 + 51 + 234 + 0 + 0 + + + 70 + 155 + 276 + 0 + 0 + + + 70 + 256 + 167 + 0 + 0 + + + 0 + 201 + 663 + 0 + 0 + + + 1 + 172 + 649 + 0 + 0 + + + 205 + 228 + 357 + 0 + 0 + + + 284 + 627 + 711 + 0 + 0 + + + 309 + 507 + 567 + 0 + 0 + + + 597 + 672 + 531 + 6 + 0 + + + 1 + 135 + 603 + 0 + 0 + + + 1152 + 465 + 3398 + 6 + 0 + + + 45 + 259 + 634 + 2 + 0 + + + 377 + 645 + 637 + 3 + 0 + + + 1 + 81 + 529 + 0 + 1 + + + 70 + 212 + 527 + 0 + 0 + + + 153 + 532 + 440 + 0 + 0 + + + 118 + 130 + 626 + 6 + 0 + + + 97 + 274 + 297 + 6 + 0 + + + 70 + 236 + 565 + 6 + 0 + + + 274 + 497 + 471 + 0 + 0 + + + 70 + 191 + 426 + 0 + 0 + + + 196 + 339 + 601 + 0 + 0 + + + 70 + 108 + 111 + 0 + 0 + + + 193 + 606 + 474 + 0 + 1 + + + 70 + 326 + 409 + 0 + 0 + + + 285 + 577 + 834 + 6 + 0 + + + 597 + 736 + 438 + 2 + 0 + + + 1 + 202 + 553 + 1 + 1 + + + 0 + 158 + 515 + 5 + 0 + + + 597 + 731 + 441 + 0 + 0 + + + 938 + 689 + 647 + 0 + 0 + + + 34 + 406 + 708 + 0 + 0 + + + 377 + 648 + 634 + 3 + 0 + + + 70 + 106 + 404 + 0 + 0 + + + 34 + 609 + 732 + 0 + 0 + + + 1 + 79 + 542 + 7 + 0 + + + 70 + 298 + 273 + 0 + 0 + + + 34 + 605 + 533 + 6 + 0 + + + 283 + 533 + 605 + 2 + 0 + + + 70 + 257 + 316 + 0 + 0 + + + 0 + 626 + 656 + 0 + 0 + + + 70 + 230 + 579 + 6 + 0 + + + 284 + 628 + 710 + 2 + 0 + + + 70 + 147 + 292 + 0 + 0 + + + 195 + 337 + 604 + 4 + 0 + + + 70 + 228 + 584 + 6 + 0 + + + 4 + 53 + 223 + 0 + 0 + + + 4 + 138 + 311 + 0 + 0 + + + 283 + 614 + 840 + 6 + 0 + + + 70 + 270 + 414 + 0 + 0 + + + 70 + 230 + 486 + 0 + 0 + + + 4 + 248 + 173 + 0 + 0 + + + 306 + 509 + 460 + 0 + 0 + + + 70 + 223 + 364 + 0 + 0 + + + 205 + 88 + 134 + 0 + 0 + + + 103 + 318 + 640 + 0 + 0 + + + 72 + 617 + 578 + 4 + 0 + + + 0 + 128 + 634 + 0 + 0 + + + 0 + 199 + 669 + 0 + 0 + + + 1 + 603 + 681 + 1 + 1 + + + 3 + 648 + 604 + 6 + 0 + + + 1 + 170 + 658 + 0 + 0 + + + 407 + 676 + 579 + 0 + 0 + + + 1 + 166 + 259 + 0 + 1 + + + 10 + 466 + 437 + 0 + 0 + + + 70 + 58 + 205 + 0 + 0 + + + 405 + 544 + 755 + 0 + 0 + + + 22 + 594 + 543 + 0 + 0 + + + 191 + 181 + 618 + 0 + 0 + + + 280 + 467 + 436 + 6 + 0 + + + 45 + 203 + 551 + 2 + 0 + + + 7 + 601 + 742 + 4 + 0 + + + 34 + 87 + 494 + 1 + 0 + + + 70 + 272 + 158 + 0 + 0 + + + 205 + 95 + 125 + 0 + 0 + + + 70 + 250 + 325 + 0 + 0 + + + 284 + 650 + 686 + 0 + 0 + + + 70 + 292 + 383 + 0 + 0 + + + 45 + 328 + 714 + 4 + 0 + + + 34 + 521 + 619 + 6 + 0 + + + 70 + 121 + 98 + 0 + 0 + + + 38 + 279 + 154 + 0 + 0 + + + 70 + 198 + 217 + 0 + 0 + + + 32 + 539 + 762 + 0 + 0 + + + 38 + 104 + 413 + 0 + 0 + + + 34 + 163 + 686 + 4 + 0 + + + 10 + 468 + 435 + 6 + 0 + + + 377 + 663 + 538 + 0 + 0 + + + 0 + 131 + 620 + 0 + 0 + + + 284 + 671 + 717 + 2 + 0 + + + 395 + 669 + 771 + 0 + 0 + + + 951 + 636 + 811 + 0 + 0 + + + 70 + 115 + 103 + 0 + 0 + + + 286 + 158 + 513 + 3 + 0 + + + 70 + 298 + 272 + 0 + 0 + + + 205 + 139 + 306 + 0 + 0 + + + 1 + 606 + 646 + 4 + 0 + + + 63 + 287 + 571 + 0 + 0 + + + 70 + 122 + 100 + 0 + 0 + + + 34 + 210 + 636 + 0 + 0 + + + 3 + 652 + 494 + 6 + 0 + + + 0 + 519 + 392 + 0 + 0 + + + 306 + 746 + 551 + 0 + 0 + + + 284 + 659 + 676 + 0 + 0 + + + 4 + 82 + 149 + 0 + 0 + + + 1 + 174 + 466 + 0 + 0 + + + 70 + 158 + 269 + 0 + 0 + + + 38 + 254 + 319 + 0 + 0 + + + 70 + 125 + 340 + 0 + 0 + + + 7 + 215 + 621 + 0 + 0 + + + 0 + 737 + 437 + 7 + 0 + + + 1 + 169 + 662 + 0 + 0 + + + 105 + 78 + 545 + 0 + 0 + + + 284 + 454 + 448 + 2 + 0 + + + 70 + 308 + 138 + 0 + 0 + + + 4 + 333 + 336 + 0 + 0 + + + 284 + 657 + 678 + 0 + 0 + + + 34 + 251 + 532 + 0 + 0 + + + 0 + 516 + 454 + 0 + 0 + + + 15 + 112 + 1463 + 2 + 0 + + + 70 + 317 + 353 + 0 + 0 + + + 284 + 482 + 422 + 6 + 0 + + + 37 + 471 + 684 + 4 + 0 + + + 45 + 259 + 633 + 2 + 0 + + + 70 + 119 + 103 + 0 + 0 + + + 284 + 669 + 719 + 0 + 0 + + + 3 + 693 + 565 + 2 + 0 + + + 4 + 92 + 463 + 0 + 0 + + + 34 + 651 + 442 + 0 + 0 + + + 70 + 240 + 338 + 0 + 0 + + + 4 + 263 + 162 + 0 + 0 + + + 284 + 632 + 705 + 2 + 0 + + + 37 + 628 + 513 + 2 + 0 + + + 51 + 587 + 667 + 4 + 0 + + + 597 + 746 + 478 + 2 + 0 + + + 284 + 663 + 672 + 0 + 0 + + + 1 + 176 + 461 + 0 + 0 + + + 284 + 624 + 714 + 2 + 0 + + + 70 + 91 + 135 + 0 + 0 + + + 70 + 133 + 320 + 0 + 0 + + + 70 + 112 + 380 + 0 + 0 + + + 273 + 536 + 601 + 0 + 0 + + + 70 + 264 + 424 + 0 + 0 + + + 70 + 215 + 198 + 0 + 0 + + + 70 + 325 + 411 + 0 + 0 + + + 35 + 68 + 626 + 0 + 0 + + + 0 + 721 + 543 + 3 + 0 + + + 313 + 687 + 519 + 0 + 0 + + + 70 + 255 + 167 + 0 + 0 + + + 43 + 643 + 748 + 4 + 0 + + + 284 + 661 + 674 + 0 + 0 + + + 100 + 612 + 843 + 1 + 0 + + + 72 + 619 + 576 + 0 + 0 + + + 0 + 79 + 539 + 7 + 0 + + + 105 + 78 + 546 + 0 + 0 + + + 284 + 625 + 713 + 0 + 0 + + + 286 + 600 + 594 + 4 + 0 + + + 70 + 71 + 170 + 0 + 0 + + + 38 + 248 + 172 + 0 + 0 + + + 70 + 282 + 287 + 0 + 0 + + + 34 + 95 + 449 + 4 + 0 + + + 45 + 592 + 602 + 0 + 0 + + + 45 + 203 + 552 + 2 + 0 + + + 445 + 633 + 563 + 6 + 0 + + + 0 + 174 + 644 + 3 + 0 + + + 38 + 153 + 279 + 0 + 0 + + + 0 + 524 + 388 + 0 + 0 + + + 70 + 168 + 254 + 0 + 0 + + + 46 + 460 + 442 + 2 + 0 + + + 50 + 584 + 763 + 1 + 0 + + + 70 + 194 + 417 + 0 + 0 + + + 0 + 687 + 469 + 3 + 0 + + + 45 + 204 + 549 + 4 + 0 + + + 1 + 127 + 637 + 0 + 0 + + + 526 + 716 + 450 + 4 + 0 + + + 34 + 681 + 706 + 2 + 0 + + + 70 + 64 + 188 + 0 + 0 + + + 1 + 171 + 655 + 0 + 0 + + + 205 + 275 + 155 + 0 + 0 + + + 70 + 296 + 144 + 0 + 0 + + + 70 + 128 + 333 + 0 + 0 + + + 597 + 696 + 512 + 0 + 0 + + + 313 + 717 + 497 + 3 + 0 + + + 70 + 74 + 163 + 0 + 0 + + + 20 + 170 + 476 + 0 + 0 + + + 178 + 604 + 590 + 0 + 0 + + + 4 + 205 + 208 + 0 + 0 + + + 38 + 164 + 260 + 0 + 0 + + + 407 + 641 + 641 + 6 + 0 + + + 0 + 150 + 540 + 4 + 0 + + + 70 + 119 + 102 + 0 + 0 + + + 38 + 196 + 218 + 0 + 0 + + + 4 + 324 + 250 + 0 + 0 + + + 70 + 300 + 270 + 0 + 0 + + + 0 + 180 + 450 + 0 + 0 + + + 306 + 679 + 525 + 2 + 0 + + + 0 + 735 + 485 + 1 + 0 + + + 34 + 670 + 481 + 5 + 0 + + + 70 + 98 + 124 + 0 + 0 + + + 29 + 309 + 531 + 2 + 0 + + + 70 + 217 + 197 + 0 + 0 + + + 105 + 574 + 716 + 0 + 0 + + + 205 + 171 + 250 + 0 + 0 + + + 70 + 69 + 176 + 0 + 0 + + + 70 + 233 + 481 + 0 + 0 + + + 34 + 611 + 787 + 5 + 0 + + + 1 + 187 + 433 + 0 + 0 + + + 205 + 84 + 144 + 0 + 0 + + + 70 + 56 + 216 + 0 + 0 + + + 70 + 111 + 109 + 0 + 0 + + + 34 + 684 + 703 + 2 + 0 + + + 205 + 220 + 368 + 0 + 0 + + + 70 + 189 + 226 + 0 + 0 + + + 192 + 741 + 481 + 0 + 0 + + + 70 + 317 + 421 + 0 + 0 + + + 70 + 97 + 125 + 0 + 0 + + + 70 + 212 + 382 + 0 + 0 + + + 70 + 278 + 152 + 0 + 0 + + + 407 + 714 + 576 + 5 + 0 + + + 284 + 664 + 672 + 0 + 0 + + + 272 + 500 + 467 + 2 + 0 + + + 4 + 270 + 303 + 0 + 0 + + + 205 + 326 + 344 + 0 + 0 + + + 45 + 327 + 714 + 4 + 0 + + + 205 + 263 + 311 + 0 + 0 + + + 70 + 118 + 358 + 0 + 0 + + + 280 + 520 + 449 + 6 + 0 + + + 4 + 292 + 384 + 0 + 0 + + + 10 + 467 + 435 + 6 + 0 + + + 70 + 315 + 356 + 0 + 0 + + + 196 + 338 + 601 + 0 + 0 + + + 70 + 61 + 187 + 0 + 0 + + + 1 + 279 + 590 + 0 + 0 + + + 70 + 111 + 381 + 0 + 0 + + + 70 + 110 + 104 + 0 + 0 + + + 70 + 266 + 159 + 0 + 0 + + + 205 + 240 + 341 + 0 + 0 + + + 70 + 218 + 194 + 0 + 0 + + + 38 + 54 + 212 + 0 + 0 + + + 1 + 599 + 745 + 0 + 0 + + + 0 + 613 + 525 + 0 + 0 + + + 15 + 616 + 580 + 0 + 0 + + + 10 + 466 + 436 + 0 + 0 + + + 70 + 151 + 280 + 0 + 0 + + + 217 + 596 + 540 + 1 + 0 + + + 283 + 709 + 678 + 0 + 0 + + + 112 + 315 + 645 + 0 + 0 + + + 70 + 331 + 339 + 0 + 0 + + + 0 + 735 + 533 + 3 + 0 + + + 16 + 633 + 705 + 0 + 1 + + + 278 + 519 + 450 + 6 + 0 + + + 191 + 181 + 620 + 0 + 0 + + + 597 + 746 + 479 + 2 + 0 + + + 0 + 619 + 520 + 0 + 0 + + + 0 + 614 + 839 + 7 + 0 + + + 283 + 708 + 679 + 0 + 0 + + + 204 + 164 + 258 + 5 + 0 + + + 70 + 300 + 374 + 0 + 0 + + + 0 + 204 + 656 + 0 + 0 + + + 51 + 628 + 569 + 0 + 0 + + + 0 + 413 + 492 + 6 + 0 + + + 0 + 629 + 654 + 0 + 0 + + + 597 + 672 + 479 + 6 + 0 + + + 70 + 229 + 185 + 0 + 0 + + + 285 + 470 + 497 + 0 + 0 + + + 313 + 709 + 454 + 3 + 0 + + + 1 + 361 + 563 + 0 + 0 + + + 34 + 84 + 504 + 1 + 0 + + + 1 + 298 + 682 + 2 + 0 + + + 217 + 161 + 263 + 5 + 0 + + + 597 + 673 + 531 + 4 + 0 + + + 420 + 740 + 435 + 6 + 0 + + + 150 + 666 + 536 + 0 + 1 + + + 70 + 313 + 427 + 0 + 0 + + + 72 + 620 + 576 + 1 + 0 + + + 1 + 94 + 451 + 4 + 0 + + + 51 + 572 + 685 + 0 + 0 + + + 285 + 493 + 653 + 1 + 0 + + + 597 + 730 + 441 + 0 + 0 + + + 284 + 626 + 713 + 0 + 0 + + + 20 + 533 + 604 + 2 + 0 + + + 70 + 328 + 249 + 0 + 0 + + + 34 + 218 + 613 + 0 + 0 + + + 34 + 653 + 789 + 2 + 0 + + + 45 + 203 + 553 + 2 + 0 + + + 36 + 116 + 704 + 0 + 0 + + + 1 + 77 + 551 + 0 + 0 + + + 16 + 629 + 764 + 2 + 0 + + + 0 + 286 + 710 + 0 + 0 + + + 70 + 56 + 202 + 0 + 0 + + + 22 + 602 + 683 + 4 + 0 + + + 205 + 303 + 140 + 0 + 0 + + + 205 + 279 + 152 + 0 + 0 + + + 4 + 248 + 171 + 0 + 0 + + + 70 + 171 + 248 + 0 + 0 + + + 419 + 646 + 691 + 4 + 0 + + + 70 + 268 + 419 + 0 + 0 + + + 1 + 63 + 673 + 1 + 1 + + + 70 + 265 + 160 + 0 + 0 + + + 38 + 241 + 339 + 0 + 0 + + + 70 + 232 + 484 + 0 + 0 + + + 34 + 164 + 685 + 4 + 0 + + + 21 + 274 + 488 + 0 + 0 + + + 296 + 116 + 366 + 0 + 0 + + + 0 + 624 + 628 + 6 + 0 + + + 0 + 626 + 626 + 6 + 0 + + + 70 + 50 + 227 + 0 + 0 + + + 34 + 726 + 492 + 3 + 0 + + + 37 + 635 + 703 + 0 + 0 + + + 70 + 214 + 382 + 0 + 0 + + + 70 + 250 + 327 + 0 + 0 + + + 70 + 162 + 262 + 0 + 0 + + + 360 + 578 + 678 + 4 + 0 + + + 70 + 90 + 126 + 0 + 0 + + + 70 + 335 + 244 + 0 + 0 + + + 34 + 304 + 668 + 0 + 0 + + + 72 + 618 + 578 + 0 + 0 + + + 313 + 683 + 523 + 0 + 0 + + + 145 + 469 + 433 + 4 + 0 + + + 1 + 278 + 593 + 0 + 0 + + + 1 + 214 + 625 + 1 + 1 + + + 1 + 76 + 559 + 0 + 0 + + + 1 + 170 + 661 + 0 + 0 + + + 23 + 80 + 531 + 0 + 0 + + + 36 + 118 + 693 + 6 + 0 + + + 70 + 107 + 397 + 0 + 0 + + + 285 + 475 + 492 + 0 + 0 + + + 1 + 492 + 475 + 0 + 0 + + + 151 + 536 + 436 + 2 + 0 + + + 283 + 160 + 511 + 3 + 0 + + + 0 + 625 + 658 + 0 + 0 + + + 0 + 636 + 451 + 5 + 0 + + + 524 + 713 + 451 + 0 + 0 + + + 70 + 219 + 612 + 0 + 0 + + + 1 + 164 + 256 + 1 + 1 + + + 70 + 91 + 128 + 0 + 0 + + + 70 + 104 + 112 + 0 + 0 + + + 0 + 617 + 667 + 3 + 0 + + + 70 + 247 + 170 + 0 + 0 + + + 1 + 85 + 494 + 1 + 0 + + + 283 + 478 + 489 + 0 + 0 + + + 1 + 563 + 510 + 3 + 1 + + + 284 + 652 + 684 + 0 + 0 + + + 1 + 182 + 448 + 0 + 0 + + + 1 + 128 + 637 + 0 + 0 + + + 70 + 262 + 429 + 0 + 0 + + + 37 + 477 + 490 + 0 + 0 + + + 110 + 116 + 703 + 0 + 0 + + + 33 + 426 + 674 + 0 + 0 + + + 0 + 748 + 524 + 3 + 0 + + + 70 + 319 + 636 + 1 + 0 + + + 1 + 348 + 583 + 0 + 0 + + + 42 + 204 + 551 + 0 + 0 + + + 5 + 714 + 500 + 0 + 0 + + + 38 + 314 + 358 + 0 + 0 + + + 284 + 629 + 709 + 0 + 0 + + + 7 + 649 + 604 + 2 + 0 + + + 34 + 696 + 513 + 0 + 0 + + + 284 + 671 + 716 + 2 + 0 + + + 4 + 331 + 405 + 0 + 0 + + + 313 + 480 + 487 + 0 + 0 + + + 70 + 133 + 316 + 0 + 0 + + + 1 + 281 + 585 + 0 + 0 + + + 14 + 79 + 532 + 4 + 0 + + + 284 + 454 + 447 + 2 + 0 + + + 284 + 482 + 421 + 6 + 0 + + + 23 + 632 + 565 + 0 + 0 + + + 1 + 136 + 600 + 0 + 0 + + + 205 + 292 + 144 + 0 + 0 + + + 4 + 315 + 357 + 0 + 0 + + + 70 + 202 + 404 + 0 + 0 + + + 45 + 203 + 554 + 0 + 0 + + + 70 + 198 + 568 + 0 + 0 + + + 1 + 122 + 669 + 1 + 1 + + + 70 + 179 + 235 + 0 + 0 + + + 38 + 326 + 345 + 0 + 0 + + + 70 + 230 + 489 + 0 + 0 + + + 70 + 230 + 583 + 6 + 0 + + + 1 + 295 + 688 + 4 + 0 + + + 1 + 179 + 456 + 0 + 0 + + + 70 + 187 + 225 + 0 + 0 + + + 70 + 91 + 129 + 0 + 0 + + + 191 + 185 + 608 + 0 + 0 + + + 34 + 221 + 509 + 1 + 0 + + + 151 + 529 + 442 + 6 + 0 + + + 70 + 111 + 106 + 0 + 0 + + + 308 + 503 + 571 + 0 + 0 + + + 1127 + 500 + 406 + 6 + 0 + + + 36 + 731 + 440 + 0 + 0 + + + 420 + 680 + 473 + 2 + 0 + + + 1 + 173 + 472 + 0 + 0 + + + 4 + 75 + 157 + 0 + 0 + + + 70 + 121 + 348 + 0 + 0 + + + 0 + 129 + 633 + 0 + 0 + + + 194 + 453 + 710 + 2 + 0 + + + 70 + 107 + 110 + 0 + 0 + + + 597 + 736 + 437 + 2 + 0 + + + 205 + 63 + 183 + 0 + 0 + + + 21 + 257 + 640 + 6 + 0 + + + 283 + 159 + 512 + 3 + 0 + + + 884 + 723 + 617 + 5 + 0 + + + 4 + 318 + 256 + 0 + 0 + + + 1 + 514 + 455 + 0 + 1 + + + 0 + 94 + 448 + 4 + 0 + + + 70 + 74 + 156 + 0 + 0 + + + 5 + 553 + 709 + 0 + 0 + + + 70 + 310 + 363 + 0 + 0 + + + 50 + 565 + 508 + 7 + 0 + + + 55 + 278 + 293 + 0 + 0 + + + 1 + 677 + 659 + 0 + 0 + + + 69 + 641 + 696 + 0 + 0 + + + 5 + 216 + 620 + 0 + 0 + + + 1 + 132 + 617 + 0 + 0 + + + 34 + 638 + 808 + 0 + 0 + + + 45 + 205 + 549 + 4 + 0 + + + 0 + 438 + 463 + 0 + 0 + + + 4 + 160 + 509 + 0 + 0 + + + 97 + 267 + 305 + 6 + 0 + + + 4 + 54 + 214 + 0 + 0 + + + 284 + 658 + 678 + 0 + 0 + + + 0 + 683 + 471 + 3 + 0 + + + 153 + 528 + 443 + 0 + 0 + + + 34 + 721 + 495 + 3 + 0 + + + 284 + 631 + 707 + 0 + 0 + + + 306 + 761 + 469 + 0 + 0 + + + 284 + 668 + 719 + 0 + 0 + + + 36 + 742 + 481 + 3 + 0 + + + 1 + 157 + 519 + 0 + 0 + + + 70 + 158 + 267 + 0 + 0 + + + 284 + 624 + 715 + 2 + 0 + + + 284 + 660 + 676 + 0 + 0 + + + 34 + 755 + 545 + 3 + 0 + + + 1 + 305 + 665 + 0 + 0 + + + 34 + 209 + 641 + 0 + 0 + + + 4 + 250 + 326 + 0 + 0 + + + 566 + 632 + 760 + 2 + 0 + + + 70 + 233 + 575 + 6 + 0 + + + 70 + 330 + 406 + 0 + 0 + + + 562 + 661 + 540 + 0 + 0 + + + 205 + 620 + 519 + 0 + 0 + + + 445 + 623 + 573 + 0 + 0 + + + 4 + 76 + 153 + 0 + 0 + + + 70 + 291 + 387 + 0 + 0 + + + 70 + 244 + 173 + 0 + 0 + + + 284 + 632 + 706 + 2 + 0 + + + 45 + 593 + 602 + 0 + 0 + + + 205 + 263 + 310 + 0 + 0 + + + 284 + 662 + 674 + 0 + 0 + + + 45 + 250 + 536 + 6 + 0 + + + 284 + 661 + 675 + 2 + 0 + + + 70 + 283 + 169 + 0 + 0 + + + 70 + 305 + 242 + 0 + 0 + + + 70 + 177 + 417 + 0 + 0 + + + 0 + 554 + 532 + 6 + 0 + + + 284 + 630 + 709 + 0 + 0 + + + 70 + 106 + 124 + 0 + 0 + + + 70 + 316 + 345 + 0 + 0 + + + 7 + 603 + 690 + 2 + 0 + + + 35 + 67 + 714 + 0 + 0 + + + 193 + 628 + 469 + 1 + 1 + + + 3 + 655 + 450 + 0 + 0 + + + 34 + 718 + 495 + 2 + 0 + + + 70 + 65 + 202 + 0 + 0 + + + 0 + 676 + 436 + 3 + 0 + + + 285 + 487 + 407 + 6 + 0 + + + 34 + 86 + 556 + 7 + 0 + + + 70 + 328 + 225 + 0 + 0 + + + 285 + 632 + 756 + 0 + 0 + + + 306 + 723 + 450 + 4 + 0 + + + 45 + 586 + 503 + 2 + 0 + + + 1 + 616 + 577 + 0 + 1 + + + 0 + 511 + 388 + 0 + 0 + + + 153 + 527 + 443 + 0 + 0 + + + 34 + 677 + 525 + 2 + 0 + + + 70 + 208 + 230 + 0 + 0 + + + 55 + 597 + 545 + 6 + 0 + + + 278 + 92 + 520 + 2 + 0 + + + 0 + 721 + 493 + 1 + 0 + + + 284 + 655 + 682 + 0 + 0 + + + 4 + 259 + 421 + 0 + 0 + + + 191 + 177 + 616 + 0 + 0 + + + 70 + 86 + 152 + 0 + 0 + + + 597 + 672 + 484 + 6 + 0 + + + 597 + 726 + 448 + 6 + 0 + + + 398 + 658 + 726 + 1 + 0 + + + 597 + 694 + 512 + 0 + 0 + + + 4 + 170 + 281 + 0 + 0 + + + 38 + 619 + 822 + 3 + 0 + + + 0 + 642 + 459 + 2 + 0 + + + 205 + 133 + 359 + 0 + 0 + + + 0 + 584 + 818 + 0 + 0 + + + 0 + 208 + 656 + 0 + 0 + + + 70 + 112 + 117 + 0 + 0 + + + 70 + 184 + 401 + 0 + 0 + + + 143 + 158 + 467 + 2 + 0 + + + 34 + 250 + 546 + 0 + 0 + + + 281 + 629 + 565 + 0 + 0 + + + 7 + 135 + 1468 + 0 + 0 + + + 70 + 257 + 424 + 0 + 0 + + + 70 + 181 + 264 + 0 + 0 + + + 284 + 653 + 684 + 0 + 0 + + + 284 + 671 + 712 + 2 + 0 + + + 70 + 227 + 325 + 0 + 0 + + + 3 + 601 + 743 + 0 + 0 + + + 1 + 636 + 559 + 0 + 0 + + + 4 + 71 + 187 + 0 + 0 + + + 1 + 301 + 659 + 0 + 0 + + + 1 + 157 + 471 + 0 + 0 + + + 37 + 637 + 701 + 0 + 0 + + + 0 + 708 + 675 + 1 + 0 + + + 34 + 106 + 450 + 0 + 0 + + + 285 + 633 + 755 + 0 + 0 + + + 34 + 103 + 463 + 0 + 0 + + + 23 + 111 + 666 + 4 + 0 + + + 70 + 130 + 102 + 0 + 0 + + + 313 + 485 + 481 + 0 + 0 + + + 313 + 483 + 483 + 0 + 0 + + + 21 + 260 + 658 + 6 + 0 + + + 70 + 160 + 298 + 0 + 0 + + + 113 + 495 + 657 + 0 + 0 + + + 13 + 110 + 672 + 0 + 0 + + + 70 + 176 + 420 + 0 + 0 + + + 37 + 690 + 560 + 4 + 0 + + + 4 + 146 + 327 + 0 + 0 + + + 70 + 152 + 314 + 0 + 0 + + + 72 + 130 + 569 + 3 + 0 + + + 70 + 53 + 251 + 0 + 0 + + + 70 + 265 + 411 + 0 + 0 + + + 70 + 323 + 229 + 0 + 0 + + + 21 + 275 + 497 + 2 + 0 + + + 4 + 695 + 556 + 1 + 0 + + + 205 + 172 + 430 + 0 + 0 + + + 284 + 651 + 686 + 0 + 0 + + + 70 + 63 + 211 + 0 + 0 + + + 938 + 689 + 648 + 0 + 0 + + + 4 + 166 + 287 + 0 + 0 + + + 1 + 658 + 448 + 1 + 1 + + + 1 + 162 + 456 + 0 + 0 + + + 111 + 519 + 568 + 0 + 0 + + + 70 + 147 + 324 + 0 + 0 + + + 597 + 697 + 510 + 2 + 0 + + + 34 + 669 + 486 + 5 + 0 + + + 38 + 84 + 157 + 0 + 0 + + + 284 + 492 + 403 + 6 + 0 + + + 4 + 291 + 254 + 0 + 0 + + + 34 + 736 + 483 + 3 + 0 + + + 0 + 506 + 461 + 0 + 0 + + + 284 + 628 + 711 + 0 + 0 + + + 1 + 296 + 670 + 0 + 0 + + + 597 + 672 + 529 + 6 + 0 + + + 306 + 686 + 474 + 0 + 0 + + + 45 + 213 + 511 + 0 + 0 + + + 70 + 126 + 105 + 0 + 0 + + + 452 + 614 + 579 + 0 + 0 + + + 34 + 693 + 513 + 0 + 0 + + + 70 + 114 + 116 + 0 + 0 + + + 938 + 688 + 649 + 0 + 0 + + + 718 + 743 + 520 + 2 + 0 + + + 22 + 276 + 495 + 2 + 0 + + + 37 + 685 + 519 + 4 + 0 + + + 70 + 230 + 209 + 0 + 0 + + + 1 + 703 + 680 + 0 + 0 + + + 1 + 117 + 633 + 0 + 1 + + + 23 + 101 + 476 + 0 + 0 + + + 306 + 644 + 694 + 0 + 0 + + + 3 + 197 + 552 + 0 + 0 + + + 38 + 57 + 226 + 0 + 0 + + + 205 + 56 + 230 + 0 + 0 + + + 0 + 679 + 704 + 2 + 0 + + + 306 + 750 + 515 + 3 + 0 + + + 70 + 229 + 210 + 0 + 0 + + + 45 + 212 + 513 + 4 + 0 + + + 70 + 288 + 167 + 0 + 0 + + + 393 + 658 + 632 + 0 + 0 + + + 70 + 50 + 258 + 0 + 0 + + + 143 + 407 + 3507 + 6 + 0 + + + 70 + 203 + 365 + 0 + 0 + + + 15 + 245 + 444 + 0 + 0 + + + 597 + 752 + 433 + 2 + 0 + + + 284 + 634 + 705 + 0 + 0 + + + 191 + 495 + 401 + 6 + 0 + + + 70 + 319 + 341 + 0 + 0 + + + 0 + 212 + 643 + 0 + 0 + + + 4 + 243 + 198 + 0 + 0 + + + 72 + 130 + 570 + 3 + 0 + + + 70 + 300 + 247 + 0 + 0 + + + 951 + 639 + 796 + 0 + 0 + + + 45 + 99 + 486 + 2 + 0 + + + 70 + 68 + 190 + 0 + 0 + + + 151 + 530 + 440 + 2 + 0 + + + 283 + 583 + 820 + 2 + 0 + + + 5 + 684 + 520 + 2 + 0 + + + 70 + 283 + 384 + 0 + 0 + + + 70 + 192 + 566 + 0 + 0 + + + 191 + 177 + 614 + 0 + 0 + + + 207 + 80 + 160 + 0 + 0 + + + 285 + 454 + 437 + 6 + 0 + + + 70 + 227 + 326 + 0 + 0 + + + 45 + 99 + 485 + 2 + 0 + + + 1 + 87 + 552 + 7 + 0 + + + 21 + 531 + 613 + 2 + 0 + + + 284 + 663 + 674 + 0 + 0 + + + 34 + 680 + 523 + 2 + 0 + + + 72 + 131 + 565 + 3 + 0 + + + 4 + 146 + 329 + 0 + 0 + + + 284 + 451 + 440 + 2 + 0 + + + 70 + 69 + 186 + 0 + 0 + + + 402 + 621 + 819 + 7 + 0 + + + 285 + 452 + 439 + 6 + 0 + + + 100 + 312 + 636 + 0 + 0 + + + 1 + 162 + 457 + 0 + 0 + + + 0 + 705 + 678 + 0 + 0 + + + 284 + 665 + 672 + 0 + 0 + + + 4 + 104 + 462 + 0 + 0 + + + 70 + 180 + 267 + 0 + 0 + + + 70 + 65 + 200 + 0 + 0 + + + 34 + 699 + 509 + 2 + 0 + + + 72 + 132 + 562 + 3 + 0 + + + 0 + 107 + 448 + 0 + 0 + + + 72 + 499 + 398 + 0 + 0 + + + 70 + 244 + 304 + 0 + 0 + + + 718 + 744 + 519 + 2 + 0 + + + 70 + 170 + 282 + 0 + 0 + + + 284 + 659 + 678 + 0 + 0 + + + 4 + 291 + 255 + 0 + 0 + + + 951 + 638 + 797 + 4 + 0 + + + 55 + 634 + 609 + 7 + 0 + + + 1 + 220 + 620 + 0 + 1 + + + 70 + 217 + 221 + 0 + 0 + + + 718 + 733 + 444 + 0 + 0 + + + 284 + 624 + 716 + 2 + 0 + + + 37 + 488 + 407 + 6 + 0 + + + 70 + 318 + 429 + 0 + 0 + + + 4 + 55 + 237 + 0 + 0 + + + 4 + 307 + 647 + 2 + 0 + + + 306 + 706 + 504 + 0 + 0 + + + 284 + 661 + 676 + 2 + 0 + + + 4 + 234 + 205 + 0 + 0 + + + 0 + 224 + 485 + 0 + 0 + + + 1 + 297 + 577 + 0 + 1 + + + 4 + 50 + 261 + 0 + 0 + + + 123 + 637 + 606 + 0 + 1 + + + 34 + 323 + 615 + 2 + 0 + + + 34 + 103 + 466 + 0 + 0 + + + 100 + 554 + 697 + 6 + 0 + + + 284 + 632 + 707 + 0 + 0 + + + 38 + 61 + 214 + 0 + 0 + + + 70 + 301 + 361 + 0 + 0 + + + 70 + 279 + 172 + 0 + 0 + + + 1 + 86 + 558 + 0 + 0 + + + 1 + 170 + 436 + 0 + 0 + + + 278 + 520 + 448 + 6 + 0 + + + 394 + 559 + 744 + 0 + 0 + + + 3 + 197 + 551 + 0 + 0 + + + 284 + 489 + 406 + 6 + 0 + + + 70 + 65 + 199 + 0 + 0 + + + 70 + 158 + 687 + 0 + 0 + + + 1 + 271 + 632 + 1 + 1 + + + 34 + 422 + 698 + 0 + 0 + + + 306 + 711 + 543 + 5 + 0 + + + 15 + 465 + 501 + 4 + 0 + + + 1 + 252 + 541 + 0 + 1 + + + 4 + 166 + 654 + 7 + 0 + + + 70 + 227 + 211 + 0 + 0 + + + 13 + 110 + 674 + 0 + 0 + + + 205 + 70 + 185 + 0 + 0 + + + 70 + 155 + 309 + 0 + 0 + + + 45 + 99 + 484 + 2 + 0 + + + 284 + 665 + 719 + 0 + 0 + + + 37 + 702 + 550 + 4 + 0 + + + 1 + 698 + 685 + 1 + 1 + + + 29 + 148 + 501 + 2 + 0 + + + 70 + 135 + 96 + 0 + 0 + + + 4 + 286 + 599 + 0 + 0 + + + 45 + 253 + 539 + 4 + 0 + + + 284 + 657 + 680 + 0 + 0 + + + 20 + 129 + 575 + 0 + 0 + + + 34 + 524 + 621 + 6 + 0 + + + 45 + 530 + 614 + 0 + 0 + + + 27 + 97 + 494 + 2 + 0 + + + 153 + 526 + 443 + 0 + 0 + + + 0 + 511 + 387 + 0 + 0 + + + 38 + 60 + 211 + 0 + 0 + + + 70 + 328 + 334 + 0 + 0 + + + 29 + 149 + 499 + 4 + 0 + + + 34 + 116 + 641 + 0 + 0 + + + 1 + 244 + 449 + 0 + 0 + + + 12 + 110 + 676 + 0 + 0 + + + 377 + 653 + 638 + 3 + 0 + + + 38 + 166 + 660 + 0 + 0 + + + 284 + 629 + 711 + 0 + 0 + + + 4 + 87 + 544 + 7 + 0 + + + 38 + 122 + 388 + 0 + 0 + + + 37 + 487 + 406 + 6 + 0 + + + 21 + 585 + 503 + 4 + 0 + + + 38 + 306 + 358 + 0 + 0 + + + 39 + 97 + 488 + 2 + 0 + + + 32 + 424 + 694 + 0 + 0 + + + 5 + 321 + 535 + 4 + 0 + + + 20 + 529 + 614 + 6 + 0 + + + 0 + 611 + 832 + 0 + 0 + + + 205 + 125 + 101 + 0 + 0 + + + 718 + 740 + 523 + 2 + 0 + + + 70 + 81 + 156 + 0 + 0 + + + 22 + 91 + 520 + 6 + 0 + + + 37 + 251 + 546 + 0 + 0 + + + 1 + 565 + 685 + 0 + 1 + + + 70 + 305 + 359 + 0 + 0 + + + 0 + 481 + 411 + 0 + 0 + + + 7 + 590 + 706 + 4 + 0 + + + 283 + 675 + 707 + 0 + 0 + + + 70 + 50 + 252 + 0 + 0 + + + 70 + 126 + 100 + 0 + 0 + + + 7 + 601 + 744 + 0 + 0 + + + 36 + 161 + 680 + 6 + 0 + + + 70 + 58 + 217 + 0 + 0 + + + 34 + 648 + 454 + 0 + 0 + + + 21 + 267 + 643 + 6 + 0 + + + 0 + 649 + 689 + 0 + 0 + + + 1 + 573 + 727 + 0 + 0 + + + 8 + 103 + 459 + 2 + 0 + + + 525 + 703 + 462 + 4 + 0 + + + 70 + 80 + 157 + 0 + 0 + + + 70 + 235 + 316 + 0 + 0 + + + 0 + 87 + 543 + 7 + 0 + + + 70 + 204 + 364 + 0 + 0 + + + 597 + 746 + 477 + 2 + 0 + + + 597 + 695 + 512 + 0 + 0 + + + 70 + 246 + 192 + 0 + 0 + + + 34 + 687 + 518 + 2 + 0 + + + 4 + 317 + 149 + 0 + 0 + + + 70 + 51 + 246 + 0 + 0 + + + 34 + 116 + 640 + 4 + 0 + + + 37 + 488 + 405 + 0 + 0 + + + 5 + 691 + 515 + 2 + 0 + + + 45 + 586 + 502 + 2 + 0 + + + 70 + 256 + 290 + 0 + 0 + + + 50 + 145 + 512 + 0 + 0 + + + 164 + 750 + 433 + 4 + 0 + + + 1 + 560 + 691 + 0 + 1 + + + 38 + 275 + 270 + 0 + 0 + + + 12 + 110 + 675 + 0 + 0 + + + 20 + 130 + 573 + 0 + 0 + + + 284 + 664 + 719 + 0 + 0 + + + 100 + 628 + 848 + 6 + 0 + + + 4 + 680 + 569 + 2 + 0 + + + 70 + 280 + 266 + 0 + 0 + + + 70 + 92 + 139 + 0 + 0 + + + 38 + 223 + 334 + 0 + 0 + + + 938 + 691 + 647 + 0 + 0 + + + 281 + 628 + 567 + 0 + 0 + + + 219 + 116 + 407 + 0 + 0 + + + 313 + 482 + 483 + 0 + 0 + + + 70 + 71 + 180 + 0 + 0 + + + 4 + 258 + 183 + 0 + 0 + + + 1 + 684 + 698 + 0 + 0 + + + 1 + 578 + 826 + 1 + 0 + + + 70 + 277 + 395 + 0 + 0 + + + 54 + 222 + 618 + 0 + 0 + + + 284 + 627 + 713 + 0 + 0 + + + 88 + 200 + 547 + 0 + 0 + + + 70 + 138 + 342 + 0 + 0 + + + 597 + 672 + 438 + 6 + 0 + + + 0 + 712 + 456 + 3 + 0 + + + 20 + 620 + 624 + 4 + 0 + + + 21 + 260 + 660 + 4 + 0 + + + 1 + 146 + 510 + 0 + 1 + + + 70 + 159 + 688 + 0 + 0 + + + 205 + 195 + 242 + 0 + 0 + + + 4 + 264 + 282 + 0 + 0 + + + 191 + 177 + 618 + 0 + 0 + + + 45 + 326 + 714 + 4 + 0 + + + 34 + 682 + 700 + 0 + 0 + + + 70 + 70 + 182 + 0 + 0 + + + 8 + 103 + 458 + 1 + 0 + + + 20 + 88 + 536 + 0 + 0 + + + 37 + 486 + 407 + 6 + 0 + + + 70 + 237 + 199 + 0 + 0 + + + 565 + 463 + 3399 + 4 + 0 + + + 34 + 668 + 486 + 5 + 0 + + + 32 + 73 + 646 + 0 + 0 + + + 1 + 611 + 682 + 0 + 1 + + + 1183 + 91 + 518 + 6 + 0 + + + 1 + 618 + 626 + 0 + 0 + + + 5 + 542 + 599 + 0 + 0 + + + 72 + 131 + 568 + 7 + 0 + + + 205 + 284 + 262 + 0 + 0 + + + 100 + 311 + 636 + 0 + 0 + + + 1 + 142 + 524 + 0 + 1 + + + 45 + 214 + 511 + 0 + 0 + + + 34 + 83 + 568 + 7 + 0 + + + 205 + 178 + 418 + 0 + 0 + + + 1 + 599 + 542 + 6 + 0 + + + 70 + 204 + 536 + 0 + 0 + + + 46 + 97 + 486 + 0 + 0 + + + 445 + 630 + 614 + 2 + 0 + + + 70 + 328 + 418 + 0 + 0 + + + 21 + 277 + 495 + 2 + 0 + + + 377 + 658 + 541 + 2 + 0 + + + 3 + 197 + 555 + 0 + 0 + + + 34 + 636 + 799 + 0 + 0 + + + 70 + 76 + 167 + 0 + 0 + + + 284 + 492 + 402 + 6 + 0 + + + 306 + 737 + 483 + 6 + 0 + + + 205 + 231 + 322 + 0 + 0 + + + 36 + 161 + 679 + 6 + 0 + + + 308 + 570 + 731 + 0 + 0 + + + 1 + 580 + 823 + 0 + 0 + + + 283 + 507 + 459 + 0 + 0 + + + 70 + 175 + 425 + 0 + 0 + + + 37 + 654 + 450 + 2 + 0 + + + 29 + 148 + 504 + 2 + 0 + + + 37 + 689 + 517 + 4 + 0 + + + 283 + 451 + 439 + 4 + 0 + + + 70 + 155 + 307 + 0 + 0 + + + 306 + 711 + 501 + 0 + 0 + + + 97 + 654 + 777 + 0 + 0 + + + 376 + 588 + 500 + 0 + 0 + + + 718 + 741 + 522 + 2 + 0 + + + 70 + 325 + 421 + 0 + 0 + + + 70 + 297 + 368 + 0 + 0 + + + 36 + 739 + 482 + 4 + 0 + + + 70 + 106 + 117 + 0 + 0 + + + 70 + 238 + 200 + 0 + 0 + + + 4 + 112 + 425 + 0 + 0 + + + 1 + 107 + 445 + 0 + 0 + + + 191 + 495 + 400 + 6 + 0 + + + 445 + 687 + 563 + 6 + 0 + + + 70 + 260 + 287 + 0 + 0 + + + 284 + 658 + 680 + 0 + 0 + + + 4 + 680 + 658 + 0 + 0 + + + 12 + 668 + 579 + 6 + 0 + + + 284 + 666 + 717 + 0 + 0 + + + 4 + 312 + 239 + 0 + 0 + + + 205 + 201 + 371 + 0 + 0 + + + 208 + 116 + 410 + 2 + 0 + + + 597 + 697 + 511 + 2 + 0 + + + 70 + 260 + 183 + 0 + 0 + + + 45 + 213 + 513 + 4 + 0 + + + 0 + 627 + 664 + 0 + 0 + + + 32 + 71 + 670 + 6 + 0 + + + 70 + 68 + 182 + 0 + 0 + + + 597 + 672 + 530 + 6 + 0 + + + 284 + 624 + 717 + 2 + 0 + + + 50 + 145 + 514 + 0 + 0 + + + 1 + 88 + 540 + 7 + 0 + + + 70 + 274 + 272 + 0 + 0 + + + 20 + 161 + 463 + 0 + 0 + + + 70 + 92 + 134 + 0 + 0 + + + 38 + 104 + 457 + 0 + 0 + + + 1 + 89 + 534 + 1 + 1 + + + 284 + 657 + 681 + 2 + 0 + + + 0 + 164 + 666 + 0 + 0 + + + 43 + 97 + 490 + 4 + 0 + + + 34 + 414 + 710 + 0 + 0 + + + 283 + 454 + 436 + 6 + 0 + + + 7 + 593 + 702 + 2 + 0 + + + 284 + 656 + 682 + 0 + 0 + + + 0 + 707 + 547 + 1 + 0 + + + 8 + 627 + 568 + 0 + 0 + + + 70 + 283 + 168 + 0 + 0 + + + 70 + 185 + 403 + 0 + 0 + + + 38 + 69 + 179 + 0 + 0 + + + 70 + 306 + 357 + 0 + 0 + + + 36 + 606 + 485 + 4 + 0 + + + 36 + 659 + 446 + 0 + 0 + + + 284 + 631 + 709 + 0 + 0 + + + 70 + 82 + 150 + 0 + 0 + + + 34 + 650 + 500 + 0 + 0 + + + 206 + 682 + 567 + 6 + 0 + + + 284 + 655 + 683 + 2 + 0 + + + 70 + 115 + 107 + 0 + 0 + + + 139 + 216 + 633 + 2 + 0 + + + 1 + 87 + 546 + 7 + 0 + + + 377 + 653 + 778 + 3 + 0 + + + 3 + 558 + 693 + 0 + 0 + + + 26 + 456 + 434 + 2 + 0 + + + 205 + 207 + 360 + 0 + 0 + + + 0 + 120 + 621 + 0 + 0 + + + 70 + 335 + 326 + 0 + 0 + + + 36 + 525 + 619 + 6 + 0 + + + 70 + 140 + 339 + 0 + 0 + + + 285 + 488 + 406 + 6 + 0 + + + 283 + 579 + 825 + 2 + 0 + + + 51 + 562 + 688 + 2 + 0 + + + 284 + 654 + 684 + 0 + 0 + + + 72 + 133 + 562 + 3 + 0 + + + 0 + 708 + 459 + 3 + 0 + + + 565 + 727 + 447 + 4 + 0 + + + 34 + 760 + 548 + 3 + 0 + + + 153 + 525 + 443 + 0 + 0 + + + 402 + 618 + 822 + 4 + 0 + + + 70 + 48 + 261 + 0 + 0 + + + 22 + 276 + 496 + 2 + 0 + + + 1 + 169 + 442 + 0 + 0 + + + 1 + 248 + 552 + 0 + 0 + + + 306 + 716 + 540 + 1 + 0 + + + 36 + 160 + 682 + 3 + 0 + + + 70 + 170 + 279 + 0 + 0 + + + 4 + 102 + 465 + 0 + 0 + + + 20 + 248 + 440 + 6 + 0 + + + 70 + 120 + 104 + 0 + 0 + + + 407 + 727 + 657 + 6 + 0 + + + 72 + 132 + 566 + 3 + 0 + + + 72 + 499 + 397 + 0 + 0 + + + 278 + 608 + 586 + 4 + 0 + + + 425 + 711 + 457 + 2 + 0 + + + 70 + 322 + 232 + 0 + 0 + + + 70 + 326 + 420 + 0 + 0 + + + 284 + 489 + 405 + 6 + 0 + + + 193 + 620 + 474 + 3 + 1 + + + 38 + 183 + 259 + 0 + 0 + + + 7 + 589 + 707 + 6 + 0 + + + 0 + 630 + 661 + 0 + 0 + + + 1 + 87 + 545 + 7 + 0 + + + 34 + 652 + 451 + 0 + 0 + + + 272 + 500 + 465 + 2 + 0 + + + 284 + 652 + 686 + 0 + 0 + + + 70 + 219 + 341 + 0 + 0 + + + 72 + 131 + 570 + 7 + 0 + + + 37 + 475 + 684 + 4 + 0 + + + 0 + 620 + 524 + 0 + 0 + + + 0 + 513 + 386 + 0 + 0 + + + 3 + 566 + 683 + 0 + 0 + + + 34 + 733 + 486 + 3 + 0 + + + 70 + 190 + 574 + 6 + 0 + + + 70 + 125 + 379 + 0 + 0 + + + 38 + 165 + 661 + 0 + 0 + + + 1 + 610 + 584 + 1 + 1 + + + 113 + 493 + 659 + 0 + 0 + + + 4 + 166 + 657 + 2 + 0 + + + 0 + 676 + 527 + 1 + 0 + + + 70 + 128 + 370 + 0 + 0 + + + 30 + 71 + 667 + 6 + 0 + + + 70 + 199 + 238 + 0 + 0 + + + 0 + 764 + 506 + 3 + 0 + + + 718 + 742 + 521 + 2 + 0 + + + 597 + 752 + 432 + 2 + 0 + + + 70 + 248 + 301 + 0 + 0 + + + 70 + 122 + 102 + 0 + 0 + + + 938 + 687 + 651 + 0 + 0 + + + 70 + 282 + 168 + 0 + 0 + + + 1 + 143 + 522 + 0 + 1 + + + 597 + 728 + 531 + 4 + 0 + + + 284 + 667 + 716 + 2 + 0 + + + 597 + 692 + 512 + 0 + 0 + + + 70 + 260 + 423 + 0 + 0 + + + 193 + 627 + 468 + 3 + 1 + + + 38 + 75 + 188 + 0 + 0 + + + 70 + 316 + 348 + 0 + 0 + + + 37 + 654 + 449 + 0 + 0 + + + 0 + 117 + 639 + 0 + 0 + + + 70 + 161 + 303 + 0 + 0 + + + 420 + 688 + 515 + 0 + 0 + + + 1 + 120 + 623 + 0 + 0 + + + 718 + 727 + 446 + 2 + 0 + + + 313 + 480 + 484 + 0 + 0 + + + 4 + 229 + 213 + 0 + 0 + + + 26 + 71 + 687 + 0 + 0 + + + 38 + 178 + 274 + 0 + 0 + + + 70 + 323 + 151 + 0 + 0 + + + 21 + 325 + 715 + 0 + 0 + + + 70 + 285 + 386 + 0 + 0 + + + 597 + 672 + 437 + 6 + 0 + + + 4 + 105 + 465 + 0 + 0 + + + 1 + 103 + 474 + 1 + 1 + + + 556 + 93 + 525 + 2 + 0 + + + 22 + 681 + 566 + 2 + 0 + + + 21 + 585 + 502 + 6 + 0 + + + 70 + 144 + 339 + 0 + 0 + + + 70 + 267 + 412 + 0 + 0 + + + 38 + 737 + 523 + 2 + 0 + + + 597 + 746 + 475 + 2 + 0 + + + 284 + 635 + 705 + 0 + 0 + + + 1 + 249 + 544 + 0 + 0 + + + 70 + 317 + 347 + 0 + 0 + + + 285 + 488 + 404 + 0 + 0 + + + 55 + 657 + 447 + 2 + 0 + + + 283 + 521 + 446 + 0 + 0 + + + 597 + 732 + 443 + 4 + 0 + + + 1 + 213 + 636 + 0 + 0 + + + 205 + 243 + 308 + 0 + 0 + + + 55 + 634 + 608 + 1 + 0 + + + 36 + 660 + 445 + 0 + 0 + + + 34 + 683 + 701 + 2 + 0 + + + 306 + 754 + 470 + 0 + 0 + + + 36 + 663 + 443 + 0 + 0 + + + 4 + 299 + 368 + 0 + 0 + + + 70 + 95 + 149 + 0 + 0 + + + 70 + 69 + 205 + 0 + 0 + + + 70 + 209 + 358 + 0 + 0 + + + 70 + 218 + 224 + 0 + 0 + + + 70 + 224 + 334 + 0 + 0 + + + 597 + 726 + 531 + 4 + 0 + + + 3 + 590 + 707 + 4 + 0 + + + 45 + 101 + 484 + 6 + 0 + + + 285 + 487 + 405 + 0 + 0 + + + 70 + 94 + 151 + 0 + 0 + + + 0 + 206 + 658 + 0 + 0 + + + 20 + 293 + 581 + 0 + 0 + + + 70 + 121 + 404 + 0 + 0 + + + 70 + 91 + 156 + 0 + 0 + + + 1 + 621 + 721 + 1 + 0 + + + 20 + 85 + 575 + 0 + 0 + + + 0 + 547 + 537 + 6 + 0 + + + 0 + 764 + 546 + 3 + 0 + + + 207 + 86 + 165 + 0 + 0 + + + 1 + 346 + 570 + 0 + 0 + + + 1 + 89 + 549 + 7 + 0 + + + 0 + 579 + 827 + 4 + 0 + + + 419 + 716 + 453 + 2 + 0 + + + 284 + 666 + 719 + 0 + 0 + + + 4 + 93 + 153 + 0 + 0 + + + 283 + 695 + 689 + 0 + 0 + + + 70 + 133 + 107 + 0 + 0 + + + 313 + 679 + 522 + 3 + 0 + + + 0 + 543 + 541 + 6 + 0 + + + 4 + 696 + 688 + 0 + 0 + + + 284 + 661 + 677 + 2 + 0 + + + 34 + 88 + 553 + 7 + 0 + + + 70 + 227 + 330 + 0 + 0 + + + 70 + 319 + 425 + 0 + 0 + + + 34 + 680 + 432 + 3 + 0 + + + 70 + 138 + 103 + 0 + 0 + + + 5 + 740 + 438 + 4 + 0 + + + 70 + 74 + 192 + 0 + 0 + + + 70 + 134 + 363 + 0 + 0 + + + 286 + 516 + 450 + 0 + 0 + + + 34 + 87 + 559 + 7 + 0 + + + 70 + 90 + 158 + 0 + 0 + + + 306 + 698 + 552 + 1 + 0 + + + 1 + 243 + 452 + 0 + 0 + + + 37 + 707 + 545 + 6 + 0 + + + 120 + 642 + 600 + 0 + 1 + + + 70 + 295 + 254 + 0 + 0 + + + 1 + 118 + 635 + 0 + 0 + + + 45 + 253 + 536 + 0 + 0 + + + 0 + 650 + 452 + 5 + 0 + + + 70 + 602 + 693 + 4 + 0 + + + 70 + 207 + 362 + 0 + 0 + + + 1 + 247 + 549 + 0 + 0 + + + 284 + 633 + 707 + 0 + 0 + + + 597 + 735 + 441 + 0 + 0 + + + 284 + 492 + 401 + 6 + 0 + + + 284 + 664 + 674 + 0 + 0 + + + 70 + 208 + 234 + 0 + 0 + + + 205 + 89 + 160 + 0 + 0 + + + 70 + 57 + 250 + 0 + 0 + + + 4 + 333 + 225 + 0 + 0 + + + 3 + 682 + 565 + 2 + 0 + + + 0 + 227 + 484 + 0 + 0 + + + 36 + 522 + 621 + 6 + 0 + + + 0 + 604 + 638 + 3 + 0 + + + 284 + 666 + 672 + 0 + 0 + + + 109 + 161 + 465 + 0 + 1 + + + 278 + 274 + 495 + 2 + 0 + + + 285 + 486 + 406 + 6 + 0 + + + 3 + 198 + 555 + 0 + 0 + + + 25 + 428 + 461 + 4 + 0 + + + 4 + 239 + 204 + 0 + 0 + + + 306 + 731 + 485 + 1 + 0 + + + 34 + 88 + 554 + 7 + 0 + + + 70 + 230 + 212 + 0 + 0 + + + 70 + 265 + 184 + 0 + 0 + + + 284 + 668 + 717 + 0 + 0 + + + 284 + 626 + 715 + 2 + 0 + + + 70 + 706 + 634 + 0 + 0 + + + 1 + 163 + 460 + 0 + 0 + + + 34 + 160 + 687 + 6 + 0 + + + 70 + 279 + 394 + 0 + 0 + + + 70 + 149 + 96 + 0 + 0 + + + 0 + 229 + 480 + 0 + 0 + + + 72 + 132 + 568 + 3 + 0 + + + 1 + 168 + 653 + 6 + 0 + + + 21 + 619 + 474 + 0 + 0 + + + 34 + 322 + 613 + 2 + 0 + + + 1 + 505 + 581 + 0 + 0 + + + 70 + 228 + 329 + 0 + 0 + + + 34 + 652 + 450 + 0 + 0 + + + 205 + 85 + 163 + 0 + 0 + + + 70 + 327 + 150 + 0 + 0 + + + 0 + 89 + 551 + 7 + 0 + + + 285 + 485 + 407 + 6 + 0 + + + 284 + 630 + 711 + 0 + 0 + + + 34 + 720 + 535 + 0 + 0 + + + 191 + 177 + 620 + 0 + 0 + + + 597 + 726 + 447 + 6 + 0 + + + 213 + 663 + 581 + 6 + 0 + + + 32 + 74 + 663 + 0 + 0 + + + 70 + 221 + 222 + 0 + 0 + + + 146 + 160 + 469 + 2 + 0 + + + 139 + 148 + 507 + 6 + 0 + + + 70 + 268 + 280 + 0 + 0 + + + 70 + 280 + 268 + 0 + 0 + + + 70 + 303 + 162 + 0 + 0 + + + 21 + 588 + 499 + 0 + 0 + + + 104 + 308 + 641 + 0 + 0 + + + 34 + 712 + 541 + 1 + 0 + + + 70 + 133 + 369 + 0 + 0 + + + 1 + 296 + 667 + 0 + 0 + + + 70 + 243 + 309 + 0 + 0 + + + 34 + 679 + 478 + 3 + 0 + + + 153 + 524 + 443 + 0 + 0 + + + 70 + 100 + 139 + 0 + 0 + + + 70 + 139 + 100 + 0 + 0 + + + 286 + 517 + 449 + 0 + 0 + + + 205 + 274 + 274 + 0 + 0 + + + 284 + 653 + 686 + 0 + 0 + + + 0 + 347 + 669 + 0 + 0 + + + 34 + 160 + 686 + 0 + 0 + + + 1 + 605 + 689 + 1 + 1 + + + 0 + 301 + 656 + 0 + 0 + + + 8 + 107 + 459 + 0 + 0 + + + 215 + 122 + 114 + 7 + 0 + + + 1 + 655 + 448 + 1 + 1 + + + 284 + 670 + 715 + 0 + 0 + + + 45 + 214 + 513 + 4 + 0 + + + 1 + 212 + 638 + 0 + 0 + + + 284 + 671 + 714 + 2 + 0 + + + 70 + 229 + 328 + 0 + 0 + + + 72 + 132 + 569 + 3 + 0 + + + 70 + 203 + 370 + 0 + 0 + + + 1 + 90 + 546 + 7 + 0 + + + 597 + 672 + 483 + 6 + 0 + + + 45 + 251 + 539 + 4 + 0 + + + 70 + 156 + 315 + 0 + 0 + + + 284 + 628 + 713 + 2 + 0 + + + 70 + 128 + 109 + 0 + 0 + + + 0 + 626 + 666 + 0 + 0 + + + 284 + 453 + 436 + 0 + 0 + + + 444 + 593 + 547 + 2 + 0 + + + 29 + 320 + 532 + 4 + 0 + + + 35 + 78 + 627 + 0 + 0 + + + 34 + 708 + 501 + 2 + 0 + + + 445 + 630 + 563 + 6 + 0 + + + 70 + 89 + 157 + 0 + 0 + + + 37 + 452 + 437 + 6 + 0 + + + 38 + 307 + 357 + 0 + 0 + + + 1 + 118 + 637 + 0 + 0 + + + 70 + 52 + 269 + 0 + 0 + + + 205 + 162 + 464 + 0 + 0 + + + 284 + 451 + 438 + 6 + 0 + + + 34 + 160 + 685 + 6 + 0 + + + 70 + 208 + 527 + 0 + 0 + + + 1 + 248 + 442 + 0 + 0 + + + 110 + 515 + 570 + 0 + 0 + + + 70 + 290 + 378 + 0 + 0 + + + 113 + 493 + 658 + 0 + 0 + + + 284 + 489 + 404 + 6 + 0 + + + 3 + 274 + 494 + 2 + 0 + + + 284 + 450 + 439 + 4 + 0 + + + 70 + 144 + 340 + 0 + 0 + + + 216 + 124 + 113 + 7 + 0 + + + 146 + 160 + 470 + 6 + 0 + + + 70 + 235 + 576 + 6 + 0 + + + 34 + 161 + 681 + 4 + 0 + + + 597 + 697 + 509 + 2 + 0 + + + 38 + 733 + 484 + 2 + 0 + + + 70 + 61 + 230 + 0 + 0 + + + 20 + 158 + 476 + 0 + 0 + + + 45 + 586 + 501 + 2 + 0 + + + 445 + 684 + 563 + 6 + 0 + + + 45 + 547 + 704 + 4 + 0 + + + 34 + 603 + 538 + 6 + 0 + + + 100 + 625 + 855 + 6 + 0 + + + 20 + 115 + 426 + 0 + 0 + + + 45 + 101 + 485 + 6 + 0 + + + 973 + 645 + 790 + 2 + 0 + + + 7 + 559 + 689 + 0 + 0 + + + 70 + 250 + 196 + 0 + 0 + + + 70 + 76 + 185 + 0 + 0 + + + 70 + 198 + 380 + 0 + 0 + + + 4 + 48 + 293 + 0 + 0 + + + 1 + 169 + 649 + 5 + 0 + + + 37 + 199 + 551 + 0 + 1 + + + 205 + 175 + 430 + 0 + 0 + + + 0 + 763 + 465 + 0 + 0 + + + 70 + 323 + 233 + 0 + 0 + + + 70 + 127 + 386 + 0 + 0 + + + 13 + 689 + 650 + 0 + 0 + + + 55 + 217 + 624 + 0 + 0 + + + 205 + 215 + 228 + 0 + 0 + + + 45 + 325 + 714 + 4 + 0 + + + 51 + 580 + 664 + 2 + 0 + + + 1 + 169 + 654 + 0 + 0 + + + 3 + 615 + 577 + 0 + 0 + + + 45 + 99 + 488 + 2 + 0 + + + 4 + 280 + 269 + 0 + 0 + + + 285 + 488 + 403 + 0 + 0 + + + 205 + 92 + 148 + 0 + 0 + + + 284 + 661 + 678 + 2 + 0 + + + 284 + 663 + 676 + 0 + 0 + + + 72 + 134 + 562 + 3 + 0 + + + 283 + 451 + 436 + 6 + 0 + + + 420 + 714 + 497 + 6 + 0 + + + 4 + 688 + 561 + 2 + 0 + + + 70 + 50 + 272 + 0 + 0 + + + 176 + 66 + 729 + 1 + 1 + + + 1 + 594 + 703 + 1 + 1 + + + 4 + 282 + 267 + 0 + 0 + + + 38 + 267 + 282 + 0 + 0 + + + 597 + 672 + 528 + 6 + 0 + + + 34 + 257 + 529 + 0 + 0 + + + 313 + 673 + 481 + 3 + 0 + + + 597 + 693 + 512 + 0 + 0 + + + 72 + 133 + 566 + 7 + 0 + + + 23 + 101 + 478 + 0 + 0 + + + 884 + 724 + 619 + 3 + 0 + + + 70 + 279 + 173 + 0 + 0 + + + 48 + 273 + 625 + 6 + 0 + + + 70 + 306 + 246 + 0 + 0 + + + 284 + 667 + 717 + 0 + 0 + + + 50 + 514 + 451 + 0 + 0 + + + 205 + 127 + 380 + 0 + 0 + + + 397 + 569 + 734 + 0 + 0 + + + 284 + 634 + 707 + 0 + 0 + + + 38 + 118 + 116 + 0 + 0 + + + 284 + 667 + 672 + 0 + 0 + + + 70 + 174 + 278 + 0 + 0 + + + 34 + 760 + 467 + 3 + 0 + + + 72 + 132 + 571 + 7 + 0 + + + 283 + 577 + 829 + 2 + 0 + + + 284 + 669 + 715 + 0 + 0 + + + 597 + 731 + 443 + 4 + 0 + + + 1 + 251 + 542 + 0 + 0 + + + 597 + 727 + 531 + 4 + 0 + + + 192 + 741 + 479 + 0 + 0 + + + 286 + 524 + 618 + 0 + 0 + + + 70 + 237 + 574 + 6 + 0 + + + 4 + 227 + 213 + 0 + 0 + + + 1 + 168 + 658 + 0 + 0 + + + 100 + 553 + 698 + 0 + 0 + + + 36 + 636 + 461 + 2 + 0 + + + 70 + 131 + 369 + 0 + 0 + + + 70 + 335 + 330 + 0 + 0 + + + 0 + 89 + 543 + 7 + 0 + + + 284 + 626 + 716 + 2 + 0 + + + 284 + 448 + 439 + 4 + 0 + + + 21 + 277 + 491 + 0 + 0 + + + 1 + 650 + 546 + 0 + 0 + + + 34 + 614 + 730 + 0 + 0 + + + 284 + 665 + 674 + 0 + 0 + + + 4 + 310 + 243 + 0 + 0 + + + 4 + 186 + 405 + 0 + 0 + + + 394 + 632 + 806 + 0 + 0 + + + 34 + 503 + 461 + 0 + 0 + + + 3 + 349 + 664 + 2 + 0 + + + 70 + 230 + 328 + 0 + 0 + + + 6 + 422 + 695 + 2 + 0 + + + 284 + 624 + 718 + 2 + 0 + + + 313 + 744 + 435 + 3 + 0 + + + 313 + 710 + 500 + 3 + 0 + + + 0 + 601 + 642 + 3 + 0 + + + 1 + 168 + 449 + 0 + 0 + + + 0 + 639 + 459 + 2 + 0 + + + 306 + 723 + 491 + 1 + 0 + + + 34 + 211 + 645 + 0 + 0 + + + 70 + 214 + 225 + 0 + 0 + + + 45 + 548 + 704 + 4 + 0 + + + 36 + 632 + 464 + 2 + 0 + + + 70 + 121 + 398 + 0 + 0 + + + 7 + 295 + 578 + 4 + 0 + + + 284 + 655 + 684 + 0 + 0 + + + 938 + 684 + 655 + 1 + 0 + + + 207 + 83 + 165 + 5 + 0 + + + 70 + 248 + 304 + 0 + 0 + + + 37 + 487 + 404 + 0 + 0 + + + 70 + 126 + 382 + 0 + 0 + + + 0 + 755 + 511 + 3 + 0 + + + 4 + 145 + 332 + 0 + 0 + + + 951 + 639 + 797 + 4 + 0 + + + 21 + 267 + 639 + 4 + 0 + + + 25 + 102 + 473 + 0 + 0 + + + 597 + 734 + 441 + 0 + 0 + + + 294 + 475 + 488 + 0 + 0 + + + 143 + 161 + 469 + 4 + 0 + + + 70 + 98 + 141 + 0 + 0 + + + 100 + 310 + 635 + 0 + 0 + + + 718 + 745 + 518 + 2 + 0 + + + 45 + 427 + 461 + 0 + 0 + + + 4 + 176 + 274 + 0 + 0 + + + 0 + 633 + 660 + 0 + 0 + + + 284 + 659 + 680 + 0 + 0 + + + 3 + 91 + 530 + 6 + 0 + + + 0 + 206 + 661 + 0 + 0 + + + 34 + 161 + 686 + 1 + 0 + + + 70 + 268 + 412 + 0 + 0 + + + 45 + 99 + 487 + 2 + 0 + + + 37 + 486 + 405 + 0 + 0 + + + 100 + 71 + 679 + 2 + 0 + + + 5 + 303 + 563 + 0 + 0 + + + 4 + 171 + 282 + 0 + 0 + + + 1 + 682 + 657 + 0 + 0 + + + 1 + 111 + 680 + 0 + 0 + + + 283 + 582 + 822 + 6 + 0 + + + 70 + 164 + 294 + 0 + 0 + + + 70 + 270 + 409 + 0 + 0 + + + 70 + 123 + 392 + 0 + 0 + + + 284 + 657 + 682 + 2 + 0 + + + 718 + 729 + 444 + 2 + 0 + + + 4 + 105 + 459 + 0 + 0 + + + 205 + 139 + 99 + 0 + 0 + + + 284 + 492 + 400 + 6 + 0 + + + 284 + 632 + 709 + 0 + 0 + + + 191 + 181 + 610 + 0 + 0 + + + 38 + 313 + 154 + 0 + 0 + + + 284 + 671 + 713 + 2 + 0 + + + 164 + 749 + 474 + 3 + 0 + + + 70 + 204 + 238 + 0 + 0 + + + 101 + 555 + 695 + 0 + 0 + + + 155 + 265 + 645 + 2 + 0 + + + 70 + 234 + 580 + 6 + 0 + + + 70 + 207 + 365 + 0 + 0 + + + 70 + 221 + 342 + 0 + 0 + + + 445 + 623 + 570 + 0 + 0 + + + 34 + 648 + 452 + 0 + 0 + + + 4 + 70 + 191 + 0 + 0 + + + 0 + 709 + 544 + 1 + 0 + + + 37 + 485 + 406 + 6 + 0 + + + 205 + 228 + 213 + 0 + 0 + + + 597 + 746 + 517 + 2 + 0 + + + 70 + 314 + 351 + 0 + 0 + + + 70 + 254 + 191 + 0 + 0 + + + 597 + 746 + 476 + 2 + 0 + + + 45 + 428 + 460 + 2 + 0 + + + 284 + 628 + 714 + 2 + 0 + + + 72 + 133 + 568 + 3 + 0 + + + 4 + 214 + 353 + 0 + 0 + + + 4 + 230 + 211 + 0 + 0 + + + 33 + 485 + 668 + 1 + 0 + + + 6 + 318 + 1505 + 0 + 0 + + + 103 + 626 + 853 + 2 + 0 + + + 97 + 731 + 571 + 0 + 0 + + + 0 + 752 + 513 + 3 + 0 + + + 205 + 170 + 286 + 0 + 0 + + + 117 + 219 + 620 + 0 + 0 + + + 420 + 745 + 435 + 6 + 0 + + + 313 + 719 + 494 + 3 + 0 + + + 70 + 223 + 218 + 0 + 0 + + + 70 + 218 + 223 + 0 + 0 + + + 394 + 657 + 775 + 0 + 0 + + + 24 + 98 + 496 + 4 + 0 + + + 4 + 281 + 173 + 0 + 0 + + + 51 + 612 + 682 + 0 + 0 + + + 4 + 92 + 146 + 0 + 0 + + + 70 + 326 + 232 + 0 + 0 + + + 0 + 227 + 486 + 0 + 0 + + + 70 + 75 + 179 + 0 + 0 + + + 0 + 687 + 517 + 1 + 0 + + + 33 + 471 + 688 + 4 + 0 + + + 37 + 633 + 756 + 0 + 0 + + + 0 + 651 + 450 + 5 + 0 + + + 70 + 49 + 273 + 0 + 0 + + + 0 + 111 + 681 + 0 + 0 + + + 34 + 90 + 540 + 7 + 0 + + + 1 + 637 + 704 + 0 + 0 + + + 70 + 189 + 400 + 0 + 0 + + + 70 + 216 + 350 + 0 + 0 + + + 70 + 210 + 360 + 0 + 0 + + + 1 + 86 + 565 + 7 + 0 + + + 70 + 285 + 387 + 0 + 0 + + + 205 + 164 + 461 + 0 + 0 + + + 205 + 48 + 279 + 0 + 0 + + + 70 + 273 + 404 + 0 + 0 + + + 278 + 275 + 494 + 2 + 0 + + + 1 + 614 + 628 + 0 + 0 + + + 4 + 89 + 544 + 7 + 0 + + + 70 + 180 + 269 + 0 + 0 + + + 70 + 276 + 399 + 0 + 0 + + + 37 + 696 + 554 + 6 + 0 + + + 161 + 326 + 710 + 0 + 0 + + + 70 + 186 + 407 + 0 + 0 + + + 70 + 48 + 281 + 0 + 0 + + + 70 + 71 + 190 + 0 + 0 + + + 70 + 234 + 207 + 0 + 0 + + + 1 + 166 + 456 + 0 + 0 + + + 34 + 698 + 464 + 3 + 0 + + + 70 + 56 + 241 + 0 + 0 + + + 205 + 226 + 335 + 0 + 0 + + + 394 + 662 + 723 + 7 + 0 + + + 121 + 295 + 579 + 0 + 0 + + + 1 + 519 + 446 + 0 + 1 + + + 205 + 100 + 135 + 0 + 0 + + + 207 + 84 + 160 + 3 + 0 + + + 38 + 105 + 128 + 0 + 0 + + + 1 + 170 + 445 + 0 + 0 + + + 70 + 320 + 344 + 0 + 0 + + + 1 + 167 + 453 + 0 + 0 + + + 70 + 171 + 283 + 0 + 0 + + + 37 + 484 + 407 + 6 + 0 + + + 0 + 751 + 473 + 0 + 0 + + + 70 + 219 + 221 + 0 + 0 + + + 70 + 118 + 114 + 0 + 0 + + + 38 + 121 + 400 + 0 + 0 + + + 45 + 586 + 500 + 2 + 0 + + + 191 + 495 + 398 + 6 + 0 + + + 70 + 116 + 116 + 0 + 0 + + + 45 + 252 + 539 + 4 + 0 + + + 597 + 736 + 440 + 2 + 0 + + + 730 + 446 + 3373 + 2 + 0 + + + 597 + 672 + 436 + 6 + 0 + + + 45 + 99 + 489 + 2 + 0 + + + 4 + 242 + 313 + 0 + 0 + + + 55 + 221 + 615 + 0 + 0 + + + 718 + 728 + 445 + 2 + 0 + + + 23 + 101 + 480 + 0 + 0 + + + 284 + 451 + 437 + 6 + 0 + + + 16 + 92 + 527 + 6 + 0 + + + 284 + 636 + 705 + 0 + 0 + + + 70 + 116 + 418 + 0 + 0 + + + 283 + 679 + 705 + 0 + 0 + + + 0 + 122 + 621 + 0 + 0 + + + 70 + 125 + 388 + 0 + 0 + + + 284 + 449 + 439 + 4 + 0 + + + 70 + 263 + 419 + 0 + 0 + + + 70 + 134 + 362 + 0 + 0 + + + 214 + 120 + 113 + 7 + 0 + + + 4 + 71 + 191 + 0 + 0 + + + 70 + 282 + 172 + 0 + 0 + + + 513 + 93 + 521 + 4 + 0 + + + 70 + 329 + 413 + 0 + 0 + + + 32 + 72 + 673 + 2 + 0 + + + 88 + 204 + 540 + 0 + 0 + + + 1 + 706 + 678 + 0 + 0 + + + 37 + 634 + 755 + 0 + 0 + + + 597 + 672 + 482 + 6 + 0 + + + 284 + 489 + 403 + 6 + 0 + + + 25 + 620 + 1562 + 4 + 0 + + + 205 + 66 + 205 + 0 + 0 + + + 284 + 452 + 436 + 0 + 0 + + + 313 + 723 + 448 + 3 + 0 + + + 34 + 212 + 641 + 0 + 0 + + + 70 + 201 + 378 + 0 + 0 + + + 285 + 470 + 492 + 0 + 0 + + + 36 + 605 + 484 + 4 + 0 + + + 205 + 287 + 159 + 0 + 0 + + + 45 + 533 + 614 + 0 + 0 + + + 261 + 588 + 498 + 4 + 0 + + + 0 + 620 + 668 + 3 + 0 + + + 70 + 329 + 231 + 0 + 0 + + + 597 + 672 + 526 + 6 + 0 + + + 34 + 300 + 668 + 0 + 0 + + + 407 + 733 + 565 + 7 + 0 + + + 34 + 753 + 550 + 3 + 0 + + + 38 + 132 + 116 + 0 + 0 + + + 22 + 86 + 531 + 6 + 0 + + + 38 + 225 + 203 + 0 + 0 + + + 445 + 690 + 563 + 6 + 0 + + + 38 + 252 + 424 + 0 + 0 + + + 37 + 472 + 490 + 0 + 0 + + + 70 + 185 + 247 + 0 + 0 + + + 597 + 672 + 487 + 6 + 0 + + + 34 + 713 + 459 + 3 + 0 + + + 34 + 522 + 561 + 0 + 0 + + + 70 + 155 + 99 + 0 + 0 + + + 22 + 667 + 530 + 2 + 0 + + + 4 + 157 + 291 + 0 + 0 + + + 1 + 317 + 533 + 1 + 1 + + + 70 + 314 + 340 + 0 + 0 + + + 0 + 763 + 509 + 3 + 0 + + + 205 + 689 + 651 + 4 + 0 + + + 55 + 264 + 640 + 6 + 0 + + + 63 + 219 + 633 + 2 + 0 + + + 208 + 643 + 604 + 2 + 0 + + + 283 + 610 + 780 + 0 + 0 + + + 0 + 642 + 456 + 2 + 0 + + + 1 + 248 + 559 + 0 + 0 + + + 4 + 165 + 647 + 0 + 0 + + + 70 + 147 + 310 + 0 + 0 + + + 34 + 764 + 542 + 3 + 0 + + + 283 + 88 + 518 + 0 + 0 + + + 0 + 111 + 684 + 0 + 0 + + + 50 + 148 + 513 + 0 + 0 + + + 70 + 191 + 559 + 6 + 0 + + + 70 + 265 + 403 + 0 + 0 + + + 283 + 591 + 759 + 0 + 0 + + + 45 + 209 + 511 + 0 + 0 + + + 100 + 628 + 852 + 6 + 0 + + + 34 + 742 + 441 + 7 + 0 + + + 284 + 630 + 712 + 2 + 0 + + + 1 + 285 + 593 + 0 + 0 + + + 0 + 605 + 642 + 3 + 0 + + + 1 + 120 + 633 + 0 + 0 + + + 4 + 117 + 390 + 0 + 0 + + + 70 + 110 + 139 + 0 + 0 + + + 70 + 125 + 365 + 0 + 0 + + + 34 + 172 + 621 + 0 + 0 + + + 0 + 673 + 707 + 2 + 0 + + + 0 + 84 + 543 + 7 + 0 + + + 34 + 658 + 723 + 0 + 0 + + + 205 + 293 + 365 + 0 + 0 + + + 36 + 606 + 483 + 4 + 0 + + + 4 + 54 + 281 + 0 + 0 + + + 1 + 160 + 474 + 0 + 0 + + + 718 + 739 + 443 + 2 + 0 + + + 284 + 657 + 683 + 2 + 0 + + + 72 + 134 + 566 + 7 + 0 + + + 284 + 671 + 709 + 2 + 0 + + + 102 + 311 + 644 + 0 + 0 + + + 209 + 555 + 746 + 1 + 0 + + + 37 + 744 + 440 + 7 + 0 + + + 306 + 642 + 699 + 0 + 0 + + + 72 + 178 + 601 + 3 + 0 + + + 70 + 107 + 428 + 0 + 0 + + + 70 + 190 + 563 + 6 + 0 + + + 37 + 252 + 550 + 0 + 0 + + + 205 + 53 + 287 + 0 + 0 + + + 0 + 122 + 622 + 0 + 0 + + + 24 + 236 + 194 + 1 + 1 + + + 145 + 286 + 2964 + 2 + 0 + + + 34 + 423 + 692 + 0 + 0 + + + 1 + 165 + 460 + 0 + 0 + + + 597 + 697 + 507 + 2 + 0 + + + 70 + 141 + 108 + 0 + 0 + + + 284 + 624 + 719 + 0 + 0 + + + 4 + 136 + 336 + 0 + 0 + + + 205 + 192 + 238 + 0 + 0 + + + 1 + 350 + 572 + 0 + 0 + + + 0 + 617 + 828 + 0 + 0 + + + 205 + 286 + 265 + 0 + 0 + + + 143 + 163 + 465 + 0 + 0 + + + 285 + 454 + 441 + 6 + 0 + + + 71 + 588 + 704 + 2 + 0 + + + 38 + 80 + 189 + 0 + 0 + + + 718 + 733 + 530 + 2 + 0 + + + 37 + 630 + 755 + 0 + 0 + + + 284 + 654 + 686 + 0 + 0 + + + 70 + 322 + 332 + 0 + 0 + + + 70 + 161 + 284 + 0 + 0 + + + 597 + 690 + 512 + 0 + 0 + + + 284 + 669 + 711 + 0 + 0 + + + 45 + 324 + 714 + 4 + 0 + + + 70 + 323 + 331 + 0 + 0 + + + 3 + 222 + 624 + 0 + 0 + + + 70 + 153 + 99 + 0 + 0 + + + 21 + 534 + 613 + 2 + 0 + + + 70 + 65 + 233 + 0 + 0 + + + 29 + 454 + 3375 + 0 + 0 + + + 70 + 247 + 307 + 0 + 0 + + + 283 + 492 + 407 + 6 + 0 + + + 55 + 568 + 684 + 0 + 0 + + + 204 + 684 + 568 + 0 + 0 + + + 284 + 451 + 444 + 2 + 0 + + + 38 + 151 + 303 + 0 + 0 + + + 37 + 101 + 453 + 0 + 0 + + + 285 + 452 + 443 + 6 + 0 + + + 597 + 731 + 531 + 4 + 0 + + + 395 + 635 + 804 + 2 + 0 + + + 70 + 216 + 353 + 0 + 0 + + + 284 + 626 + 717 + 0 + 0 + + + 4 + 151 + 304 + 0 + 0 + + + 110 + 279 + 382 + 4 + 0 + + + 36 + 671 + 436 + 2 + 0 + + + 70 + 262 + 291 + 0 + 0 + + + 217 + 132 + 114 + 6 + 0 + + + 34 + 102 + 450 + 0 + 0 + + + 284 + 663 + 677 + 2 + 0 + + + 70 + 330 + 231 + 0 + 0 + + + 1 + 121 + 630 + 0 + 0 + + + 70 + 308 + 149 + 0 + 0 + + + 4 + 154 + 298 + 0 + 0 + + + 70 + 50 + 302 + 0 + 0 + + + 597 + 741 + 442 + 4 + 0 + + + 32 + 438 + 668 + 0 + 0 + + + 261 + 399 + 503 + 0 + 0 + + + 284 + 451 + 445 + 2 + 0 + + + 7 + 145 + 526 + 6 + 0 + + + 284 + 664 + 676 + 0 + 0 + + + 1 + 561 + 692 + 1 + 1 + + + 0 + 748 + 519 + 3 + 0 + + + 4 + 328 + 325 + 0 + 0 + + + 407 + 724 + 620 + 7 + 0 + + + 38 + 252 + 423 + 0 + 0 + + + 284 + 666 + 674 + 0 + 0 + + + 208 + 178 + 258 + 0 + 0 + + + 29 + 89 + 516 + 0 + 0 + + + 36 + 662 + 442 + 2 + 0 + + + 37 + 614 + 576 + 0 + 0 + + + 1 + 81 + 566 + 0 + 0 + + + 0 + 292 + 687 + 2 + 0 + + + 313 + 685 + 478 + 3 + 0 + + + 597 + 726 + 451 + 6 + 0 + + + 216 + 135 + 111 + 7 + 0 + + + 70 + 194 + 549 + 0 + 0 + + + 0 + 513 + 391 + 0 + 0 + + + 70 + 59 + 254 + 0 + 0 + + + 284 + 633 + 709 + 0 + 0 + + + 278 + 89 + 515 + 0 + 0 + + + 0 + 628 + 659 + 0 + 0 + + + 0 + 119 + 640 + 0 + 0 + + + 70 + 140 + 107 + 0 + 0 + + + 70 + 71 + 211 + 0 + 0 + + + 72 + 136 + 560 + 3 + 0 + + + 70 + 235 + 195 + 0 + 0 + + + 0 + 299 + 671 + 0 + 0 + + + 70 + 133 + 345 + 0 + 0 + + + 23 + 651 + 503 + 6 + 0 + + + 1 + 717 + 712 + 0 + 0 + + + 34 + 685 + 695 + 0 + 0 + + + 72 + 177 + 602 + 3 + 0 + + + 284 + 660 + 680 + 0 + 0 + + + 0 + 629 + 658 + 0 + 0 + + + 4 + 181 + 421 + 0 + 0 + + + 284 + 664 + 717 + 0 + 0 + + + 70 + 312 + 147 + 0 + 0 + + + 70 + 54 + 278 + 0 + 0 + + + 34 + 686 + 694 + 0 + 0 + + + 118 + 310 + 546 + 2 + 0 + + + 284 + 661 + 679 + 2 + 0 + + + 55 + 687 + 565 + 4 + 0 + + + 193 + 626 + 467 + 3 + 1 + + + 25 + 461 + 435 + 2 + 0 + + + 70 + 284 + 268 + 0 + 0 + + + 155 + 531 + 617 + 4 + 0 + + + 72 + 134 + 568 + 3 + 0 + + + 284 + 662 + 719 + 0 + 0 + + + 597 + 746 + 474 + 2 + 0 + + + 34 + 167 + 639 + 1 + 0 + + + 718 + 734 + 529 + 2 + 0 + + + 70 + 95 + 157 + 0 + 0 + + + 70 + 236 + 195 + 0 + 0 + + + 70 + 328 + 232 + 0 + 0 + + + 4 + 295 + 258 + 0 + 0 + + + 70 + 191 + 241 + 0 + 0 + + + 284 + 482 + 416 + 6 + 0 + + + 193 + 259 + 294 + 4 + 0 + + + 70 + 299 + 357 + 0 + 0 + + + 285 + 467 + 495 + 0 + 0 + + + 97 + 700 + 680 + 4 + 0 + + + 46 + 460 + 436 + 2 + 0 + + + 70 + 76 + 197 + 0 + 0 + + + 35 + 71 + 649 + 0 + 0 + + + 718 + 738 + 444 + 2 + 0 + + + 70 + 74 + 202 + 0 + 0 + + + 70 + 230 + 331 + 0 + 0 + + + 38 + 699 + 681 + 2 + 0 + + + 58 + 617 + 474 + 6 + 0 + + + 284 + 628 + 715 + 2 + 0 + + + 72 + 177 + 603 + 3 + 0 + + + 1 + 508 + 455 + 0 + 0 + + + 284 + 668 + 672 + 0 + 0 + + + 5 + 257 + 538 + 0 + 0 + + + 2 + 117 + 650 + 0 + 0 + + + 34 + 617 + 573 + 6 + 0 + + + 0 + 676 + 523 + 1 + 0 + + + 313 + 709 + 462 + 3 + 0 + + + 36 + 153 + 697 + 4 + 0 + + + 63 + 150 + 507 + 6 + 0 + + + 0 + 735 + 481 + 1 + 0 + + + 34 + 307 + 653 + 0 + 0 + + + 6 + 136 + 1474 + 0 + 0 + + + 3 + 619 + 1565 + 4 + 0 + + + 5 + 605 + 742 + 4 + 0 + + + 70 + 64 + 232 + 0 + 0 + + + 70 + 317 + 240 + 0 + 0 + + + 70 + 240 + 317 + 0 + 0 + + + 0 + 579 + 822 + 0 + 0 + + + 1 + 505 + 579 + 0 + 0 + + + 70 + 115 + 400 + 0 + 0 + + + 4 + 184 + 250 + 0 + 0 + + + 70 + 54 + 276 + 0 + 0 + + + 4 + 147 + 313 + 0 + 0 + + + 4 + 215 + 214 + 0 + 0 + + + 0 + 755 + 548 + 3 + 0 + + + 70 + 65 + 229 + 0 + 0 + + + 1 + 566 + 731 + 0 + 0 + + + 284 + 635 + 707 + 0 + 0 + + + 8 + 583 + 666 + 0 + 1 + + + 4 + 53 + 281 + 0 + 0 + + + 38 + 186 + 409 + 0 + 0 + + + 145 + 463 + 433 + 4 + 0 + + + 70 + 334 + 414 + 0 + 0 + + + 7 + 348 + 664 + 2 + 0 + + + 1 + 347 + 665 + 1 + 1 + + + 34 + 355 + 650 + 4 + 0 + + + 34 + 654 + 447 + 0 + 0 + + + 70 + 68 + 218 + 0 + 0 + + + 0 + 684 + 695 + 0 + 0 + + + 33 + 71 + 636 + 0 + 0 + + + 70 + 95 + 156 + 0 + 0 + + + 22 + 668 + 530 + 2 + 0 + + + 70 + 173 + 261 + 0 + 0 + + + 4 + 272 + 166 + 0 + 0 + + + 70 + 136 + 332 + 0 + 0 + + + 1 + 86 + 525 + 1 + 1 + + + 38 + 234 + 327 + 0 + 0 + + + 88 + 197 + 545 + 0 + 0 + + + 70 + 101 + 147 + 0 + 0 + + + 597 + 672 + 435 + 6 + 0 + + + 58 + 490 + 408 + 6 + 0 + + + 725 + 715 + 580 + 2 + 0 + + + 284 + 663 + 717 + 0 + 0 + + + 1 + 686 + 567 + 1 + 1 + + + 70 + 53 + 280 + 0 + 0 + + + 70 + 129 + 115 + 0 + 0 + + + 283 + 611 + 778 + 0 + 0 + + + 70 + 223 + 343 + 0 + 0 + + + 34 + 81 + 557 + 7 + 0 + + + 193 + 615 + 475 + 0 + 1 + + + 205 + 267 + 169 + 0 + 0 + + + 377 + 652 + 636 + 4 + 0 + + + 152 + 522 + 442 + 4 + 0 + + + 110 + 284 + 378 + 0 + 0 + + + 0 + 403 + 496 + 6 + 0 + + + 59 + 496 + 403 + 6 + 0 + + + 38 + 292 + 262 + 0 + 0 + + + 70 + 190 + 565 + 6 + 0 + + + 70 + 108 + 418 + 0 + 0 + + + 285 + 469 + 492 + 0 + 0 + + + 22 + 85 + 531 + 6 + 0 + + + 70 + 80 + 185 + 0 + 0 + + + 34 + 711 + 547 + 1 + 0 + + + 284 + 637 + 705 + 0 + 0 + + + 45 + 210 + 511 + 0 + 0 + + + 597 + 726 + 450 + 6 + 0 + + + 310 + 718 + 493 + 0 + 0 + + + 70 + 138 + 107 + 0 + 0 + + + 4 + 283 + 599 + 0 + 0 + + + 70 + 254 + 301 + 0 + 0 + + + 36 + 739 + 479 + 1 + 0 + + + 313 + 686 + 516 + 3 + 0 + + + 402 + 620 + 823 + 1 + 0 + + + 70 + 309 + 146 + 0 + 0 + + + 38 + 271 + 396 + 0 + 0 + + + 70 + 71 + 208 + 0 + 0 + + + 113 + 495 + 660 + 0 + 0 + + + 38 + 259 + 174 + 0 + 0 + + + 511 + 86 + 524 + 0 + 0 + + + 215 + 127 + 116 + 0 + 0 + + + 0 + 519 + 385 + 0 + 0 + + + 70 + 152 + 97 + 0 + 0 + + + 143 + 407 + 3510 + 6 + 0 + + + 38 + 273 + 393 + 0 + 0 + + + 3 + 223 + 624 + 0 + 0 + + + 283 + 581 + 818 + 6 + 0 + + + 70 + 281 + 272 + 0 + 0 + + + 70 + 81 + 182 + 0 + 0 + + + 0 + 653 + 688 + 0 + 0 + + + 1 + 112 + 682 + 0 + 0 + + + 70 + 217 + 352 + 0 + 0 + + + 1 + 176 + 434 + 0 + 0 + + + 192 + 212 + 507 + 4 + 0 + + + 4 + 72 + 204 + 0 + 0 + + + 382 + 607 + 683 + 4 + 0 + + + 7 + 67 + 676 + 3 + 0 + + + 1 + 252 + 552 + 0 + 0 + + + 70 + 239 + 582 + 6 + 0 + + + 1 + 702 + 677 + 2 + 0 + + + 70 + 153 + 296 + 0 + 0 + + + 70 + 204 + 222 + 0 + 0 + + + 0 + 102 + 444 + 0 + 0 + + + 214 + 130 + 113 + 7 + 0 + + + 313 + 480 + 481 + 0 + 0 + + + 284 + 661 + 719 + 0 + 0 + + + 4 + 321 + 238 + 0 + 0 + + + 70 + 135 + 109 + 0 + 0 + + + 284 + 451 + 443 + 2 + 0 + + + 284 + 492 + 406 + 6 + 0 + + + 0 + 694 + 471 + 3 + 0 + + + 4 + 108 + 419 + 0 + 0 + + + 103 + 624 + 857 + 6 + 0 + + + 278 + 607 + 583 + 4 + 0 + + + 4 + 317 + 339 + 0 + 0 + + + 1 + 115 + 664 + 1 + 1 + + + 113 + 496 + 659 + 0 + 0 + + + 70 + 82 + 179 + 0 + 0 + + + 70 + 237 + 191 + 0 + 0 + + + 183 + 616 + 474 + 2 + 1 + + + 70 + 67 + 219 + 0 + 0 + + + 306 + 704 + 675 + 0 + 0 + + + 34 + 612 + 834 + 7 + 0 + + + 5 + 608 + 582 + 0 + 0 + + + 70 + 194 + 554 + 6 + 0 + + + 394 + 564 + 735 + 0 + 0 + + + 70 + 110 + 133 + 0 + 0 + + + 70 + 288 + 373 + 0 + 0 + + + 0 + 691 + 473 + 3 + 0 + + + 47 + 85 + 532 + 6 + 0 + + + 205 + 203 + 376 + 0 + 0 + + + 0 + 356 + 561 + 0 + 0 + + + 284 + 630 + 713 + 0 + 0 + + + 70 + 49 + 299 + 0 + 0 + + + 1 + 292 + 684 + 2 + 0 + + + 4 + 99 + 457 + 0 + 0 + + + 55 + 655 + 446 + 2 + 0 + + + 1 + 149 + 512 + 1 + 1 + + + 34 + 82 + 551 + 7 + 0 + + + 0 + 516 + 387 + 0 + 0 + + + 34 + 84 + 538 + 7 + 0 + + + 70 + 264 + 289 + 0 + 0 + + + 425 + 650 + 691 + 6 + 0 + + + 1 + 610 + 580 + 1 + 1 + + + 36 + 606 + 482 + 4 + 0 + + + 153 + 521 + 443 + 0 + 0 + + + 36 + 635 + 460 + 2 + 0 + + + 597 + 691 + 512 + 0 + 0 + + + 0 + 666 + 491 + 6 + 0 + + + 284 + 657 + 684 + 2 + 0 + + + 34 + 353 + 653 + 4 + 0 + + + 0 + 627 + 661 + 0 + 0 + + + 1 + 250 + 556 + 0 + 0 + + + 70 + 201 + 226 + 0 + 0 + + + 20 + 79 + 575 + 0 + 0 + + + 37 + 757 + 432 + 7 + 0 + + + 106 + 110 + 698 + 0 + 0 + + + 4 + 174 + 261 + 0 + 0 + + + 23 + 457 + 438 + 2 + 0 + + + 1 + 609 + 781 + 3 + 0 + + + 283 + 88 + 516 + 0 + 0 + + + 1 + 83 + 547 + 7 + 0 + + + 37 + 615 + 576 + 0 + 0 + + + 284 + 632 + 711 + 0 + 0 + + + 0 + 353 + 567 + 0 + 0 + + + 0 + 344 + 670 + 0 + 0 + + + 397 + 632 + 807 + 0 + 0 + + + 70 + 68 + 214 + 0 + 0 + + + 0 + 279 + 498 + 4 + 0 + + + 33 + 483 + 677 + 6 + 0 + + + 38 + 313 + 145 + 0 + 0 + + + 284 + 625 + 719 + 0 + 0 + + + 214 + 685 + 656 + 0 + 0 + + + 0 + 732 + 531 + 4 + 0 + + + 70 + 203 + 378 + 0 + 0 + + + 70 + 132 + 110 + 0 + 0 + + + 4 + 289 + 157 + 0 + 0 + + + 205 + 54 + 269 + 0 + 0 + + + 70 + 330 + 421 + 0 + 0 + + + 70 + 168 + 270 + 0 + 0 + + + 205 + 165 + 465 + 0 + 0 + + + 0 + 625 + 663 + 0 + 0 + + + 50 + 511 + 451 + 0 + 0 + + + 205 + 280 + 274 + 0 + 0 + + + 70 + 235 + 193 + 0 + 0 + + + 72 + 499 + 401 + 0 + 0 + + + 4 + 217 + 209 + 0 + 0 + + + 5 + 613 + 676 + 0 + 0 + + + 284 + 655 + 686 + 0 + 0 + + + 445 + 633 + 614 + 2 + 0 + + + 284 + 592 + 759 + 0 + 0 + + + 284 + 667 + 713 + 2 + 0 + + + 70 + 272 + 282 + 0 + 0 + + + 32 + 430 + 679 + 0 + 0 + + + 286 + 502 + 459 + 0 + 0 + + + 15 + 295 + 1523 + 4 + 0 + + + 35 + 73 + 621 + 0 + 0 + + + 34 + 765 + 463 + 3 + 0 + + + 34 + 752 + 471 + 3 + 0 + + + 1 + 312 + 544 + 1 + 1 + + + 215 + 128 + 113 + 0 + 0 + + + 0 + 644 + 550 + 0 + 0 + + + 205 + 261 + 410 + 0 + 0 + + + 70 + 304 + 352 + 0 + 0 + + + 284 + 634 + 709 + 0 + 0 + + + 70 + 149 + 97 + 0 + 0 + + + 70 + 146 + 99 + 0 + 0 + + + 70 + 329 + 233 + 0 + 0 + + + 70 + 275 + 390 + 0 + 0 + + + 106 + 110 + 697 + 0 + 0 + + + 597 + 672 + 527 + 6 + 0 + + + 284 + 663 + 678 + 2 + 0 + + + 70 + 132 + 345 + 0 + 0 + + + 0 + 175 + 438 + 0 + 0 + + + 70 + 236 + 193 + 0 + 0 + + + 284 + 482 + 415 + 6 + 0 + + + 45 + 323 + 714 + 4 + 0 + + + 21 + 585 + 499 + 4 + 0 + + + 420 + 681 + 520 + 0 + 0 + + + 45 + 209 + 513 + 4 + 0 + + + 284 + 661 + 680 + 0 + 0 + + + 1 + 680 + 661 + 0 + 0 + + + 4 + 309 + 248 + 0 + 0 + + + 70 + 206 + 372 + 0 + 0 + + + 4 + 648 + 600 + 4 + 0 + + + 70 + 252 + 304 + 0 + 0 + + + 7 + 591 + 701 + 4 + 0 + + + 284 + 665 + 715 + 0 + 0 + + + 1 + 242 + 443 + 1 + 1 + + + 21 + 612 + 477 + 0 + 0 + + + 29 + 320 + 531 + 4 + 0 + + + 1 + 122 + 628 + 4 + 0 + + + 55 + 656 + 445 + 3 + 0 + + + 597 + 752 + 435 + 2 + 0 + + + 143 + 164 + 467 + 6 + 0 + + + 1 + 68 + 669 + 1 + 1 + + + 597 + 740 + 442 + 4 + 0 + + + 962 + 654 + 780 + 1 + 0 + + + 279 + 88 + 517 + 2 + 0 + + + 1 + 67 + 679 + 2 + 1 + + + 34 + 251 + 553 + 0 + 0 + + + 3 + 611 + 678 + 2 + 0 + + + 70 + 116 + 392 + 0 + 0 + + + 4 + 98 + 464 + 0 + 0 + + + 71 + 85 + 535 + 2 + 0 + + + 20 + 89 + 511 + 0 + 0 + + + 72 + 137 + 559 + 3 + 0 + + + 72 + 178 + 602 + 3 + 0 + + + 70 + 322 + 431 + 0 + 0 + + + 1 + 174 + 440 + 0 + 0 + + + 240 + 257 + 661 + 0 + 0 + + + 123 + 635 + 612 + 0 + 1 + + + 70 + 188 + 570 + 6 + 0 + + + 72 + 136 + 563 + 7 + 0 + + + 1 + 619 + 628 + 6 + 0 + + + 70 + 114 + 126 + 0 + 0 + + + 597 + 697 + 508 + 2 + 0 + + + 0 + 514 + 389 + 0 + 0 + + + 0 + 623 + 624 + 6 + 0 + + + 284 + 659 + 682 + 0 + 0 + + + 70 + 50 + 287 + 0 + 0 + + + 6 + 621 + 626 + 6 + 0 + + + 1 + 222 + 625 + 1 + 1 + + + 284 + 667 + 674 + 0 + 0 + + + 284 + 627 + 717 + 0 + 0 + + + 11 + 115 + 669 + 0 + 0 + + + 34 + 667 + 489 + 5 + 0 + + + 21 + 64 + 728 + 0 + 0 + + + 34 + 104 + 448 + 0 + 0 + + + 4 + 244 + 191 + 0 + 0 + + + 0 + 177 + 609 + 0 + 0 + + + 284 + 665 + 717 + 0 + 0 + + + 34 + 593 + 550 + 6 + 0 + + + 70 + 155 + 105 + 0 + 0 + + + 1 + 606 + 685 + 0 + 1 + + + 284 + 665 + 676 + 0 + 0 + + + 70 + 140 + 333 + 0 + 0 + + + 70 + 210 + 222 + 0 + 0 + + + 70 + 163 + 286 + 0 + 0 + + + 205 + 88 + 185 + 0 + 0 + + + 37 + 454 + 439 + 6 + 0 + + + 34 + 248 + 555 + 0 + 0 + + + 193 + 610 + 478 + 0 + 1 + + + 313 + 712 + 495 + 3 + 0 + + + 70 + 125 + 373 + 0 + 0 + + + 283 + 485 + 411 + 1 + 0 + + + 398 + 669 + 765 + 7 + 0 + + + 37 + 452 + 441 + 6 + 0 + + + 38 + 57 + 286 + 0 + 0 + + + 307 + 683 + 516 + 4 + 0 + + + 70 + 163 + 100 + 0 + 0 + + + 306 + 697 + 468 + 2 + 0 + + + 70 + 319 + 338 + 0 + 0 + + + 45 + 211 + 511 + 0 + 0 + + + 284 + 669 + 672 + 0 + 0 + + + 34 + 106 + 440 + 0 + 0 + + + 70 + 182 + 423 + 0 + 0 + + + 4 + 136 + 343 + 0 + 0 + + + 23 + 98 + 476 + 0 + 0 + + + 284 + 451 + 442 + 2 + 0 + + + 35 + 77 + 606 + 0 + 0 + + + 1 + 616 + 674 + 1 + 1 + + + 7 + 244 + 442 + 4 + 0 + + + 38 + 183 + 255 + 0 + 0 + + + 70 + 239 + 576 + 6 + 0 + + + 0 + 124 + 621 + 0 + 0 + + + 38 + 280 + 275 + 0 + 0 + + + 70 + 55 + 297 + 0 + 0 + + + 70 + 327 + 421 + 0 + 0 + + + 34 + 527 + 619 + 6 + 0 + + + 395 + 484 + 674 + 1 + 0 + + + 38 + 198 + 389 + 0 + 0 + + + 70 + 194 + 556 + 6 + 0 + + + 973 + 652 + 785 + 2 + 0 + + + 285 + 467 + 493 + 0 + 0 + + + 284 + 636 + 707 + 0 + 0 + + + 718 + 738 + 525 + 2 + 0 + + + 70 + 237 + 325 + 0 + 0 + + + 284 + 628 + 716 + 2 + 0 + + + 70 + 197 + 391 + 0 + 0 + + + 420 + 750 + 435 + 6 + 0 + + + 38 + 324 + 425 + 0 + 0 + + + 1 + 315 + 633 + 2 + 0 + + + 38 + 100 + 467 + 0 + 0 + + + 34 + 208 + 662 + 0 + 0 + + + 0 + 584 + 711 + 0 + 0 + + + 0 + 632 + 657 + 0 + 0 + + + 284 + 484 + 412 + 1 + 0 + + + 284 + 667 + 715 + 2 + 0 + + + 46 + 68 + 687 + 0 + 0 + + + 4 + 230 + 335 + 0 + 0 + + + 38 + 99 + 163 + 0 + 0 + + + 70 + 311 + 347 + 0 + 0 + + + 70 + 188 + 574 + 6 + 0 + + + 284 + 663 + 719 + 0 + 0 + + + 306 + 675 + 432 + 3 + 0 + + + 1 + 280 + 491 + 0 + 1 + + + 70 + 122 + 383 + 0 + 0 + + + 70 + 74 + 218 + 0 + 0 + + + 3 + 146 + 526 + 4 + 0 + + + 4 + 48 + 336 + 0 + 0 + + + 1 + 344 + 579 + 0 + 0 + + + 70 + 214 + 359 + 0 + 0 + + + 0 + 326 + 611 + 2 + 0 + + + 308 + 544 + 536 + 6 + 0 + + + 597 + 688 + 512 + 0 + 0 + + + 1 + 637 + 553 + 0 + 0 + + + 36 + 158 + 683 + 6 + 0 + + + 1 + 611 + 534 + 6 + 0 + + + 0 + 83 + 563 + 7 + 0 + + + 70 + 184 + 254 + 0 + 0 + + + 0 + 113 + 680 + 0 + 0 + + + 294 + 471 + 489 + 0 + 0 + + + 193 + 611 + 477 + 2 + 1 + + + 205 + 648 + 790 + 2 + 0 + + + 70 + 183 + 420 + 0 + 0 + + + 313 + 677 + 482 + 3 + 0 + + + 34 + 711 + 545 + 1 + 0 + + + 5 + 745 + 438 + 4 + 0 + + + 1 + 219 + 628 + 0 + 1 + + + 34 + 84 + 557 + 7 + 0 + + + 42 + 591 + 761 + 6 + 0 + + + 4 + 73 + 222 + 0 + 0 + + + 70 + 172 + 272 + 0 + 0 + + + 70 + 295 + 366 + 0 + 0 + + + 70 + 178 + 263 + 0 + 0 + + + 261 + 588 + 496 + 4 + 0 + + + 283 + 612 + 779 + 0 + 0 + + + 597 + 672 + 434 + 6 + 0 + + + 284 + 629 + 715 + 0 + 0 + + + 12 + 667 + 581 + 6 + 0 + + + 70 + 260 + 180 + 0 + 0 + + + 34 + 723 + 536 + 0 + 0 + + + 22 + 90 + 520 + 6 + 0 + + + 383 + 520 + 443 + 4 + 0 + + + 20 + 124 + 620 + 0 + 0 + + + 0 + 715 + 542 + 1 + 0 + + + 306 + 709 + 497 + 1 + 0 + + + 284 + 492 + 405 + 6 + 0 + + + 70 + 61 + 266 + 0 + 0 + + + 70 + 162 + 289 + 0 + 0 + + + 1 + 240 + 450 + 0 + 0 + + + 70 + 200 + 540 + 0 + 0 + + + 70 + 288 + 375 + 0 + 0 + + + 33 + 438 + 666 + 0 + 0 + + + 113 + 496 + 658 + 0 + 0 + + + 70 + 181 + 425 + 0 + 0 + + + 597 + 752 + 434 + 2 + 0 + + + 0 + 694 + 687 + 0 + 0 + + + 70 + 484 + 476 + 0 + 0 + + + 38 + 63 + 258 + 0 + 0 + + + 285 + 477 + 483 + 0 + 0 + + + 23 + 98 + 478 + 0 + 0 + + + 70 + 118 + 397 + 0 + 0 + + + 33 + 436 + 669 + 0 + 0 + + + 138 + 343 + 581 + 6 + 0 + + + 70 + 149 + 109 + 0 + 0 + + + 70 + 236 + 583 + 6 + 0 + + + 38 + 314 + 344 + 0 + 0 + + + 284 + 638 + 705 + 2 + 0 + + + 70 + 214 + 219 + 0 + 0 + + + 21 + 322 + 714 + 4 + 0 + + + 420 + 680 + 480 + 6 + 0 + + + 36 + 157 + 685 + 6 + 0 + + + 38 + 106 + 442 + 0 + 0 + + + 281 + 607 + 581 + 0 + 0 + + + 285 + 475 + 484 + 0 + 0 + + + 21 + 64 + 732 + 0 + 0 + + + 70 + 192 + 244 + 0 + 0 + + + 597 + 729 + 531 + 4 + 0 + + + 284 + 671 + 711 + 2 + 0 + + + 70 + 92 + 174 + 0 + 0 + + + 283 + 482 + 414 + 6 + 0 + + + 70 + 261 + 412 + 0 + 0 + + + 70 + 310 + 347 + 0 + 0 + + + 34 + 709 + 546 + 1 + 0 + + + 70 + 81 + 579 + 0 + 0 + + + 70 + 193 + 243 + 0 + 0 + + + 3 + 591 + 702 + 4 + 0 + + + 597 + 697 + 506 + 2 + 0 + + + 1 + 603 + 746 + 0 + 1 + + + 4 + 286 + 164 + 0 + 0 + + + 36 + 606 + 481 + 4 + 0 + + + 70 + 329 + 327 + 0 + 0 + + + 72 + 499 + 400 + 0 + 0 + + + 70 + 162 + 99 + 0 + 0 + + + 70 + 319 + 147 + 0 + 0 + + + 205 + 142 + 113 + 0 + 0 + + + 153 + 519 + 443 + 4 + 0 + + + 193 + 612 + 476 + 2 + 1 + + + 206 + 684 + 566 + 7 + 0 + + + 19 + 99 + 474 + 4 + 0 + + + 1 + 176 + 439 + 0 + 0 + + + 100 + 609 + 840 + 0 + 0 + + + 1 + 265 + 635 + 0 + 0 + + + 4 + 64 + 251 + 0 + 0 + + + 1 + 294 + 679 + 2 + 0 + + + 4 + 102 + 460 + 0 + 0 + + + 5 + 627 + 761 + 0 + 0 + + + 45 + 530 + 616 + 4 + 0 + + + 70 + 296 + 261 + 0 + 0 + + + 0 + 645 + 452 + 2 + 0 + + + 205 + 281 + 167 + 0 + 0 + + + 34 + 725 + 534 + 3 + 0 + + + 34 + 721 + 537 + 0 + 0 + + + 205 + 667 + 767 + 1 + 0 + + + 284 + 631 + 713 + 0 + 0 + + + 313 + 716 + 456 + 3 + 0 + + + 37 + 632 + 755 + 0 + 0 + + + 71 + 604 + 687 + 4 + 0 + + + 70 + 116 + 139 + 0 + 0 + + + 70 + 181 + 427 + 0 + 0 + + + 4 + 229 + 205 + 0 + 0 + + + 70 + 278 + 278 + 0 + 0 + + + 36 + 738 + 478 + 1 + 0 + + + 313 + 717 + 492 + 0 + 0 + + + 34 + 298 + 670 + 0 + 0 + + + 4 + 61 + 264 + 0 + 0 + + + 1 + 171 + 452 + 0 + 0 + + + 18 + 97 + 484 + 4 + 0 + + + 5 + 118 + 655 + 0 + 0 + + + 278 + 91 + 516 + 0 + 0 + + + 308 + 499 + 461 + 0 + 0 + + + 1 + 353 + 565 + 0 + 0 + + + 261 + 585 + 498 + 4 + 0 + + + 32 + 497 + 657 + 1 + 0 + + + 420 + 640 + 703 + 0 + 0 + + + 70 + 116 + 137 + 0 + 0 + + + 162 + 324 + 710 + 0 + 0 + + + 0 + 622 + 525 + 0 + 0 + + + 1 + 304 + 656 + 0 + 0 + + + 395 + 612 + 836 + 7 + 0 + + + 220 + 116 + 405 + 2 + 0 + + + 70 + 306 + 252 + 0 + 0 + + + 70 + 189 + 408 + 0 + 0 + + + 20 + 162 + 476 + 0 + 0 + + + 206 + 639 + 606 + 1 + 0 + + + 38 + 134 + 351 + 0 + 0 + + + 718 + 739 + 524 + 2 + 0 + + + 1 + 266 + 633 + 0 + 1 + + + 0 + 122 + 632 + 0 + 0 + + + 193 + 613 + 475 + 1 + 1 + + + 284 + 483 + 413 + 1 + 0 + + + 34 + 250 + 549 + 0 + 0 + + + 0 + 678 + 520 + 1 + 0 + + + 197 + 278 + 493 + 1 + 1 + + + 7 + 602 + 689 + 4 + 0 + + + 34 + 258 + 532 + 0 + 0 + + + 37 + 347 + 663 + 0 + 0 + + + 1 + 590 + 703 + 1 + 1 + + + 1 + 610 + 578 + 0 + 0 + + + 70 + 120 + 133 + 0 + 0 + + + 4 + 101 + 466 + 0 + 0 + + + 597 + 672 + 486 + 6 + 0 + + + 45 + 210 + 513 + 4 + 0 + + + 70 + 53 + 301 + 0 + 0 + + + 284 + 669 + 713 + 0 + 0 + + + 70 + 130 + 362 + 0 + 0 + + + 284 + 655 + 687 + 2 + 0 + + + 55 + 596 + 548 + 0 + 0 + + + 70 + 134 + 119 + 0 + 0 + + + 1 + 649 + 735 + 7 + 0 + + + 70 + 320 + 147 + 0 + 0 + + + 38 + 147 + 320 + 0 + 0 + + + 23 + 98 + 480 + 0 + 0 + + + 22 + 610 + 680 + 4 + 0 + + + 70 + 149 + 107 + 0 + 0 + + + 960 + 625 + 720 + 0 + 0 + + + 46 + 97 + 485 + 0 + 0 + + + 0 + 721 + 453 + 7 + 0 + + + 42 + 637 + 608 + 4 + 0 + + + 218 + 116 + 406 + 2 + 0 + + + 718 + 734 + 445 + 0 + 0 + + + 37 + 631 + 756 + 0 + 0 + + + 70 + 157 + 300 + 0 + 0 + + + 70 + 54 + 296 + 0 + 0 + + + 70 + 315 + 245 + 0 + 0 + + + 70 + 170 + 277 + 0 + 0 + + + 22 + 653 + 540 + 2 + 0 + + + 38 + 218 + 354 + 0 + 0 + + + 5 + 218 + 630 + 2 + 0 + + + 58 + 406 + 3518 + 0 + 1 + + + 4 + 244 + 193 + 0 + 0 + + + 284 + 657 + 685 + 2 + 0 + + + 1 + 89 + 529 + 1 + 1 + + + 70 + 214 + 220 + 0 + 0 + + + 34 + 652 + 447 + 0 + 0 + + + 193 + 625 + 466 + 3 + 1 + + + 70 + 131 + 122 + 0 + 0 + + + 45 + 532 + 614 + 0 + 0 + + + 205 + 49 + 322 + 0 + 0 + + + 191 + 177 + 612 + 0 + 0 + + + 4 + 183 + 252 + 0 + 0 + + + 70 + 60 + 263 + 0 + 0 + + + 45 + 212 + 511 + 0 + 0 + + + 313 + 688 + 513 + 0 + 0 + + + 70 + 239 + 193 + 0 + 0 + + + 205 + 65 + 243 + 0 + 0 + + + 284 + 593 + 759 + 0 + 0 + + + 70 + 233 + 198 + 0 + 0 + + + 306 + 712 + 669 + 0 + 0 + + + 284 + 626 + 719 + 0 + 0 + + + 718 + 736 + 527 + 2 + 0 + + + 4 + 237 + 327 + 0 + 0 + + + 70 + 123 + 128 + 0 + 0 + + + 4 + 320 + 144 + 0 + 0 + + + 4 + 320 + 242 + 0 + 0 + + + 106 + 110 + 704 + 0 + 0 + + + 34 + 82 + 562 + 7 + 0 + + + 284 + 658 + 684 + 0 + 0 + + + 70 + 197 + 234 + 0 + 0 + + + 33 + 474 + 687 + 4 + 0 + + + 34 + 609 + 739 + 0 + 0 + + + 71 + 613 + 678 + 4 + 0 + + + 4 + 100 + 461 + 0 + 0 + + + 284 + 633 + 711 + 0 + 0 + + + 70 + 109 + 423 + 0 + 0 + + + 1 + 102 + 452 + 0 + 0 + + + 34 + 640 + 455 + 2 + 0 + + + 0 + 606 + 640 + 3 + 0 + + + 285 + 631 + 755 + 0 + 0 + + + 284 + 662 + 680 + 0 + 0 + + + 70 + 57 + 278 + 0 + 0 + + + 34 + 104 + 444 + 0 + 0 + + + 70 + 72 + 220 + 0 + 0 + + + 284 + 671 + 710 + 2 + 0 + + + 110 + 286 + 379 + 4 + 0 + + + 106 + 110 + 705 + 0 + 0 + + + 205 + 514 + 447 + 0 + 0 + + + 445 + 627 + 563 + 6 + 0 + + + 70 + 138 + 115 + 0 + 0 + + + 0 + 609 + 637 + 4 + 0 + + + 70 + 278 + 279 + 0 + 0 + + + 70 + 150 + 308 + 0 + 0 + + + 283 + 451 + 441 + 6 + 0 + + + 284 + 670 + 711 + 0 + 0 + + + 182 + 609 + 478 + 0 + 1 + + + 284 + 634 + 710 + 2 + 0 + + + 70 + 181 + 255 + 0 + 0 + + + 205 + 597 + 754 + 2 + 0 + + + 209 + 713 + 583 + 4 + 0 + + + 70 + 289 + 375 + 0 + 0 + + + 37 + 249 + 555 + 0 + 0 + + + 284 + 660 + 682 + 0 + 0 + + + 37 + 347 + 662 + 0 + 0 + + + 70 + 185 + 250 + 0 + 0 + + + 284 + 668 + 674 + 0 + 0 + + + 70 + 191 + 405 + 0 + 0 + + + 0 + 683 + 477 + 3 + 0 + + + 597 + 672 + 525 + 6 + 0 + + + 70 + 202 + 229 + 0 + 0 + + + 284 + 665 + 677 + 2 + 0 + + + 70 + 191 + 242 + 0 + 0 + + + 306 + 708 + 548 + 1 + 0 + + + 0 + 516 + 385 + 0 + 0 + + + 70 + 329 + 235 + 0 + 0 + + + 1 + 242 + 448 + 0 + 0 + + + 205 + 55 + 284 + 0 + 0 + + + 70 + 99 + 158 + 0 + 0 + + + 215 + 136 + 115 + 7 + 0 + + + 597 + 689 + 512 + 0 + 0 + + + 4 + 215 + 215 + 0 + 0 + + + 284 + 668 + 713 + 0 + 0 + + + 34 + 720 + 539 + 3 + 0 + + + 718 + 735 + 528 + 2 + 0 + + + 285 + 630 + 756 + 0 + 0 + + + 70 + 60 + 262 + 0 + 0 + + + 285 + 578 + 824 + 6 + 0 + + + 284 + 636 + 708 + 2 + 0 + + + 0 + 298 + 667 + 0 + 0 + + + 4 + 81 + 194 + 0 + 0 + + + 215 + 139 + 113 + 7 + 0 + + + 1 + 267 + 290 + 1 + 1 + + + 1 + 252 + 548 + 0 + 0 + + + 284 + 492 + 404 + 6 + 0 + + + 38 + 99 + 159 + 0 + 0 + + + 322 + 544 + 599 + 0 + 0 + + + 1 + 107 + 433 + 0 + 0 + + + 20 + 529 + 616 + 4 + 0 + + + 313 + 676 + 522 + 3 + 0 + + + 284 + 628 + 717 + 0 + 0 + + + 38 + 65 + 242 + 0 + 0 + + + 3 + 592 + 702 + 4 + 0 + + + 1 + 215 + 3525 + 0 + 1 + + + 22 + 89 + 520 + 6 + 0 + + + 38 + 111 + 417 + 0 + 0 + + + 110 + 284 + 382 + 4 + 0 + + + 70 + 71 + 221 + 0 + 0 + + + 45 + 124 + 624 + 0 + 0 + + + 284 + 667 + 714 + 2 + 0 + + + 597 + 746 + 473 + 2 + 0 + + + 4 + 225 + 344 + 0 + 0 + + + 4 + 180 + 430 + 0 + 0 + + + 4 + 100 + 463 + 0 + 0 + + + 55 + 688 + 564 + 6 + 0 + + + 284 + 670 + 672 + 0 + 0 + + + 34 + 169 + 642 + 1 + 0 + + + 1 + 84 + 551 + 7 + 0 + + + 0 + 507 + 392 + 0 + 0 + + + 4 + 176 + 263 + 0 + 0 + + + 37 + 104 + 446 + 0 + 0 + + + 70 + 209 + 372 + 0 + 0 + + + 4 + 74 + 210 + 0 + 0 + + + 70 + 226 + 344 + 0 + 0 + + + 597 + 672 + 485 + 6 + 0 + + + 597 + 672 + 433 + 6 + 0 + + + 100 + 89 + 521 + 0 + 0 + + + 34 + 648 + 503 + 0 + 0 + + + 89 + 316 + 534 + 4 + 0 + + + 70 + 207 + 224 + 0 + 0 + + + 34 + 715 + 494 + 2 + 0 + + + 1 + 87 + 533 + 1 + 1 + + + 0 + 126 + 617 + 0 + 0 + + + 70 + 299 + 260 + 0 + 0 + + + 4 + 187 + 248 + 0 + 0 + + + 597 + 730 + 531 + 4 + 0 + + + 36 + 158 + 684 + 2 + 0 + + + 34 + 766 + 506 + 3 + 0 + + + 25 + 98 + 473 + 0 + 0 + + + 1 + 157 + 495 + 4 + 0 + + + 34 + 101 + 459 + 0 + 0 + + + 70 + 173 + 268 + 0 + 0 + + + 377 + 648 + 641 + 3 + 0 + + + 34 + 354 + 648 + 4 + 0 + + + 25 + 97 + 478 + 0 + 0 + + + 70 + 64 + 242 + 0 + 0 + + + 70 + 128 + 121 + 0 + 0 + + + 3 + 602 + 690 + 0 + 0 + + + 306 + 674 + 524 + 1 + 0 + + + 398 + 634 + 806 + 0 + 0 + + + 3 + 570 + 680 + 0 + 0 + + + 4 + 100 + 155 + 0 + 0 + + + 26 + 313 + 539 + 0 + 0 + + + 278 + 90 + 515 + 0 + 0 + + + 308 + 536 + 543 + 6 + 0 + + + 0 + 649 + 694 + 0 + 0 + + + 941 + 694 + 649 + 0 + 0 + + + 4 + 84 + 553 + 7 + 0 + + + 7 + 607 + 582 + 0 + 0 + + + 4 + 272 + 286 + 0 + 0 + + + 70 + 286 + 272 + 0 + 0 + + + 306 + 653 + 541 + 0 + 0 + + + 0 + 539 + 540 + 6 + 0 + + + 1 + 611 + 680 + 0 + 1 + + + 21 + 588 + 495 + 0 + 0 + + + 284 + 638 + 706 + 2 + 0 + + + 35 + 106 + 734 + 0 + 0 + + + 150 + 518 + 443 + 0 + 0 + + + 34 + 85 + 546 + 7 + 0 + + + 70 + 302 + 358 + 0 + 0 + + + 70 + 66 + 236 + 0 + 0 + + + 445 + 623 + 567 + 0 + 0 + + + 597 + 726 + 449 + 6 + 0 + + + 205 + 232 + 200 + 0 + 0 + + + 70 + 85 + 183 + 0 + 0 + + + 55 + 64 + 725 + 2 + 0 + + + 718 + 737 + 526 + 2 + 0 + + + 34 + 718 + 454 + 3 + 0 + + + 968 + 607 + 742 + 4 + 0 + + + 70 + 273 + 396 + 0 + 0 + + + 34 + 399 + 499 + 6 + 0 + + + 45 + 124 + 626 + 4 + 0 + + + 0 + 705 + 550 + 1 + 0 + + + 164 + 748 + 472 + 3 + 0 + + + 70 + 324 + 334 + 0 + 0 + + + 285 + 509 + 451 + 0 + 0 + + + 0 + 105 + 443 + 0 + 0 + + + 70 + 115 + 134 + 0 + 0 + + + 70 + 116 + 401 + 0 + 0 + + + 70 + 138 + 337 + 0 + 0 + + + 4 + 262 + 413 + 0 + 0 + + + 1 + 178 + 436 + 0 + 0 + + + 1 + 116 + 669 + 0 + 1 + + + 38 + 124 + 375 + 0 + 0 + + + 71 + 617 + 673 + 6 + 0 + + + 35 + 78 + 596 + 0 + 0 + + + 0 + 122 + 636 + 0 + 0 + + + 34 + 722 + 537 + 0 + 0 + + + 108 + 111 + 699 + 0 + 0 + + + 205 + 62 + 248 + 0 + 0 + + + 45 + 531 + 614 + 0 + 0 + + + 70 + 63 + 244 + 0 + 0 + + + 70 + 84 + 183 + 0 + 0 + + + 70 + 121 + 384 + 0 + 0 + + + 33 + 66 + 704 + 0 + 0 + + + 113 + 494 + 660 + 0 + 0 + + + 205 + 64 + 240 + 0 + 0 + + + 70 + 192 + 404 + 0 + 0 + + + 143 + 656 + 633 + 0 + 0 + + + 284 + 630 + 715 + 0 + 0 + + + 70 + 98 + 158 + 0 + 0 + + + 283 + 489 + 407 + 6 + 0 + + + 1 + 85 + 548 + 7 + 0 + + + 205 + 321 + 242 + 0 + 0 + + + 70 + 137 + 340 + 0 + 0 + + + 70 + 284 + 164 + 0 + 0 + + + 34 + 350 + 656 + 4 + 0 + + + 6 + 279 + 494 + 0 + 0 + + + 70 + 189 + 411 + 0 + 0 + + + 70 + 199 + 544 + 0 + 0 + + + 70 + 307 + 253 + 0 + 0 + + + 70 + 249 + 187 + 0 + 0 + + + 4 + 187 + 249 + 0 + 0 + + + 70 + 120 + 388 + 0 + 0 + + + 205 + 131 + 118 + 0 + 0 + + + 3 + 216 + 638 + 2 + 0 + + + 70 + 238 + 579 + 6 + 0 + + + 51 + 562 + 690 + 2 + 0 + + + 4 + 165 + 656 + 3 + 0 + + + 377 + 635 + 805 + 0 + 0 + + + 70 + 329 + 329 + 0 + 0 + + + 45 + 211 + 513 + 4 + 0 + + + 21 + 322 + 713 + 6 + 0 + + + 4 + 68 + 227 + 0 + 0 + + + 0 + 84 + 554 + 7 + 0 + + + 70 + 265 + 293 + 0 + 0 + + + 4 + 166 + 652 + 5 + 0 + + + 1 + 595 + 698 + 1 + 1 + + + 70 + 76 + 203 + 0 + 0 + + + 0 + 225 + 481 + 0 + 0 + + + 38 + 615 + 821 + 0 + 0 + + + 37 + 646 + 675 + 3 + 0 + + + 0 + 619 + 477 + 0 + 0 + + + 37 + 341 + 662 + 0 + 0 + + + 597 + 749 + 447 + 2 + 0 + + + 407 + 721 + 562 + 7 + 0 + + + 306 + 709 + 515 + 3 + 0 + + + 0 + 731 + 458 + 1 + 0 + + + 0 + 353 + 542 + 0 + 0 + + + 70 + 240 + 219 + 0 + 0 + + + 402 + 594 + 850 + 1 + 0 + + + 97 + 613 + 661 + 3 + 0 + + + 5 + 249 + 628 + 2 + 0 + + + 70 + 86 + 205 + 0 + 0 + + + 7 + 134 + 657 + 0 + 0 + + + 4 + 220 + 239 + 0 + 0 + + + 284 + 632 + 690 + 2 + 0 + + + 70 + 59 + 299 + 0 + 0 + + + 205 + 284 + 310 + 0 + 0 + + + 70 + 216 + 567 + 0 + 0 + + + 0 + 338 + 668 + 0 + 0 + + + 12 + 173 + 304 + 0 + 0 + + + 0 + 187 + 655 + 0 + 0 + + + 70 + 107 + 165 + 0 + 0 + + + 401 + 479 + 699 + 6 + 0 + + + 70 + 289 + 182 + 0 + 0 + + + 1 + 700 + 678 + 2 + 0 + + + 11 + 497 + 385 + 2 + 0 + + + 34 + 506 + 446 + 0 + 0 + + + 1 + 313 + 611 + 2 + 0 + + + 1 + 675 + 703 + 2 + 0 + + + 4 + 121 + 145 + 0 + 0 + + + 4 + 145 + 362 + 0 + 0 + + + 70 + 136 + 129 + 0 + 0 + + + 38 + 162 + 324 + 0 + 0 + + + 34 + 742 + 492 + 3 + 0 + + + 1 + 186 + 658 + 0 + 0 + + + 72 + 199 + 615 + 3 + 0 + + + 278 + 645 + 566 + 0 + 0 + + + 101 + 569 + 712 + 0 + 0 + + + 36 + 759 + 441 + 3 + 0 + + + 193 + 621 + 475 + 1 + 1 + + + 72 + 200 + 612 + 3 + 0 + + + 145 + 278 + 2962 + 0 + 0 + + + 70 + 300 + 408 + 0 + 0 + + + 0 + 204 + 600 + 0 + 0 + + + 394 + 481 + 696 + 2 + 0 + + + 284 + 645 + 676 + 0 + 0 + + + 70 + 118 + 149 + 0 + 0 + + + 63 + 261 + 469 + 6 + 0 + + + 306 + 643 + 738 + 0 + 0 + + + 284 + 660 + 719 + 0 + 0 + + + 34 + 650 + 515 + 2 + 0 + + + 70 + 83 + 212 + 0 + 0 + + + 4 + 139 + 378 + 0 + 0 + + + 5 + 656 + 450 + 0 + 0 + + + 70 + 115 + 153 + 0 + 0 + + + 70 + 199 + 264 + 0 + 0 + + + 34 + 186 + 659 + 1 + 0 + + + 70 + 139 + 379 + 0 + 0 + + + 38 + 217 + 405 + 0 + 0 + + + 38 + 760 + 533 + 3 + 0 + + + 4 + 169 + 520 + 0 + 0 + + + 72 + 198 + 619 + 3 + 0 + + + 70 + 91 + 192 + 0 + 0 + + + 284 + 624 + 699 + 2 + 0 + + + 70 + 320 + 383 + 0 + 0 + + + 597 + 672 + 498 + 6 + 0 + + + 0 + 664 + 504 + 6 + 0 + + + 21 + 248 + 630 + 4 + 0 + + + 399 + 645 + 783 + 0 + 0 + + + 0 + 481 + 398 + 6 + 0 + + + 1 + 478 + 472 + 0 + 0 + + + 70 + 140 + 125 + 0 + 0 + + + 70 + 155 + 340 + 0 + 0 + + + 72 + 199 + 616 + 3 + 0 + + + 70 + 301 + 292 + 0 + 0 + + + 313 + 679 + 435 + 3 + 0 + + + 34 + 712 + 513 + 2 + 0 + + + 205 + 126 + 139 + 0 + 0 + + + 399 + 538 + 753 + 1 + 0 + + + 72 + 200 + 613 + 3 + 0 + + + 3 + 133 + 661 + 0 + 0 + + + 0 + 594 + 682 + 4 + 0 + + + 298 + 454 + 497 + 3 + 0 + + + 70 + 211 + 581 + 6 + 0 + + + 104 + 565 + 717 + 0 + 0 + + + 45 + 605 + 721 + 6 + 0 + + + 13 + 169 + 312 + 0 + 0 + + + 37 + 726 + 461 + 7 + 0 + + + 0 + 324 + 591 + 2 + 0 + + + 402 + 597 + 846 + 0 + 0 + + + 70 + 138 + 127 + 0 + 0 + + + 508 + 285 + 185 + 0 + 0 + + + 284 + 671 + 707 + 2 + 0 + + + 377 + 664 + 550 + 4 + 0 + + + 205 + 291 + 421 + 0 + 0 + + + 79 + 111 + 474 + 0 + 0 + + + 34 + 378 + 699 + 0 + 0 + + + 962 + 632 + 799 + 7 + 0 + + + 0 + 750 + 540 + 3 + 0 + + + 718 + 737 + 454 + 0 + 0 + + + 306 + 508 + 444 + 0 + 0 + + + 111 + 519 + 569 + 0 + 0 + + + 1 + 514 + 514 + 4 + 0 + + + 394 + 640 + 789 + 3 + 0 + + + 285 + 467 + 483 + 0 + 0 + + + 1 + 104 + 506 + 0 + 1 + + + 70 + 278 + 316 + 0 + 0 + + + 214 + 61 + 286 + 6 + 0 + + + 0 + 181 + 677 + 0 + 0 + + + 597 + 752 + 445 + 2 + 0 + + + 70 + 212 + 578 + 6 + 0 + + + 45 + 586 + 504 + 2 + 0 + + + 34 + 706 + 474 + 3 + 0 + + + 70 + 150 + 351 + 0 + 0 + + + 70 + 161 + 327 + 0 + 0 + + + 70 + 267 + 329 + 0 + 0 + + + 394 + 472 + 709 + 4 + 0 + + + 193 + 628 + 470 + 1 + 1 + + + 938 + 689 + 633 + 0 + 0 + + + 70 + 266 + 198 + 0 + 0 + + + 70 + 230 + 229 + 0 + 0 + + + 4 + 303 + 290 + 0 + 0 + + + 284 + 649 + 672 + 0 + 0 + + + 70 + 272 + 323 + 0 + 0 + + + 36 + 521 + 433 + 0 + 0 + + + 70 + 165 + 317 + 0 + 0 + + + 7 + 134 + 655 + 4 + 0 + + + 34 + 675 + 437 + 3 + 0 + + + 70 + 66 + 271 + 0 + 0 + + + 70 + 259 + 202 + 0 + 0 + + + 70 + 152 + 344 + 0 + 0 + + + 284 + 669 + 709 + 2 + 0 + + + 70 + 88 + 203 + 0 + 0 + + + 34 + 117 + 447 + 0 + 0 + + + 1 + 603 + 606 + 1 + 1 + + + 70 + 143 + 366 + 0 + 0 + + + 20 + 186 + 472 + 0 + 0 + + + 70 + 145 + 361 + 0 + 0 + + + 597 + 672 + 439 + 6 + 0 + + + 38 + 150 + 349 + 0 + 0 + + + 597 + 680 + 492 + 2 + 0 + + + 283 + 465 + 485 + 0 + 0 + + + 70 + 89 + 201 + 0 + 0 + + + 25 + 132 + 665 + 0 + 0 + + + 1 + 340 + 562 + 0 + 0 + + + 110 + 514 + 574 + 0 + 0 + + + 284 + 628 + 694 + 2 + 0 + + + 23 + 98 + 534 + 0 + 0 + + + 0 + 617 + 478 + 0 + 0 + + + 70 + 130 + 137 + 0 + 0 + + + 34 + 684 + 489 + 0 + 0 + + + 7 + 280 + 438 + 4 + 0 + + + 36 + 357 + 535 + 0 + 0 + + + 205 + 151 + 118 + 0 + 0 + + + 192 + 616 + 543 + 0 + 0 + + + 37 + 340 + 663 + 0 + 0 + + + 377 + 662 + 763 + 3 + 0 + + + 285 + 497 + 673 + 1 + 0 + + + 597 + 688 + 531 + 4 + 0 + + + 70 + 309 + 397 + 0 + 0 + + + 103 + 571 + 710 + 0 + 0 + + + 25 + 99 + 528 + 0 + 0 + + + 69 + 748 + 542 + 3 + 0 + + + 70 + 113 + 158 + 0 + 0 + + + 24 + 221 + 555 + 3 + 1 + + + 284 + 638 + 683 + 2 + 0 + + + 4 + 94 + 556 + 7 + 0 + + + 34 + 694 + 482 + 4 + 0 + + + 396 + 537 + 755 + 1 + 0 + + + 0 + 171 + 513 + 4 + 0 + + + 74 + 182 + 482 + 0 + 0 + + + 7 + 250 + 626 + 2 + 0 + + + 0 + 713 + 469 + 3 + 0 + + + 4 + 293 + 179 + 0 + 0 + + + 115 + 162 + 541 + 0 + 0 + + + 4 + 95 + 552 + 7 + 0 + + + 4 + 227 + 231 + 0 + 0 + + + 15 + 254 + 345 + 4 + 0 + + + 70 + 49 + 362 + 0 + 0 + + + 38 + 73 + 243 + 0 + 0 + + + 36 + 358 + 534 + 0 + 0 + + + 63 + 107 + 490 + 0 + 0 + + + 70 + 90 + 197 + 0 + 0 + + + 70 + 126 + 416 + 0 + 0 + + + 0 + 503 + 518 + 0 + 0 + + + 23 + 263 + 467 + 0 + 0 + + + 395 + 652 + 775 + 0 + 0 + + + 398 + 539 + 752 + 1 + 0 + + + 0 + 165 + 531 + 4 + 0 + + + 70 + 171 + 104 + 0 + 0 + + + 306 + 677 + 494 + 1 + 0 + + + 1 + 515 + 506 + 4 + 0 + + + 402 + 614 + 823 + 0 + 0 + + + 597 + 746 + 490 + 2 + 0 + + + 6 + 617 + 657 + 4 + 0 + + + 100 + 692 + 630 + 7 + 0 + + + 41 + 647 + 565 + 4 + 0 + + + 284 + 667 + 711 + 2 + 0 + + + 284 + 630 + 692 + 2 + 0 + + + 192 + 737 + 496 + 0 + 0 + + + 205 + 201 + 261 + 0 + 0 + + + 70 + 79 + 225 + 0 + 0 + + + 284 + 643 + 678 + 2 + 0 + + + 70 + 55 + 323 + 0 + 0 + + + 70 + 63 + 282 + 0 + 0 + + + 70 + 141 + 372 + 0 + 0 + + + 45 + 602 + 724 + 2 + 0 + + + 4 + 58 + 305 + 0 + 0 + + + 4 + 66 + 268 + 0 + 0 + + + 70 + 203 + 258 + 0 + 0 + + + 70 + 125 + 419 + 0 + 0 + + + 34 + 730 + 458 + 7 + 0 + + + 70 + 207 + 253 + 0 + 0 + + + 33 + 373 + 709 + 0 + 0 + + + 72 + 198 + 620 + 3 + 0 + + + 306 + 345 + 653 + 0 + 0 + + + 7 + 279 + 440 + 0 + 0 + + + 4 + 293 + 419 + 0 + 0 + + + 306 + 718 + 509 + 1 + 0 + + + 209 + 206 + 425 + 7 + 0 + + + 38 + 185 + 283 + 0 + 0 + + + 284 + 641 + 680 + 2 + 0 + + + 597 + 681 + 491 + 0 + 0 + + + 34 + 477 + 701 + 2 + 0 + + + 72 + 200 + 614 + 3 + 0 + + + 284 + 665 + 713 + 2 + 0 + + + 70 + 279 + 314 + 0 + 0 + + + 45 + 617 + 1563 + 2 + 0 + + + 70 + 227 + 541 + 0 + 0 + + + 70 + 110 + 161 + 0 + 0 + + + 32 + 534 + 759 + 0 + 0 + + + 376 + 589 + 501 + 4 + 0 + + + 1 + 118 + 444 + 0 + 0 + + + 72 + 199 + 617 + 3 + 0 + + + 0 + 520 + 501 + 0 + 0 + + + 4 + 205 + 259 + 0 + 0 + + + 205 + 56 + 324 + 0 + 0 + + + 70 + 162 + 112 + 0 + 0 + + + 0 + 168 + 521 + 0 + 0 + + + 3 + 249 + 626 + 4 + 0 + + + 70 + 277 + 316 + 0 + 0 + + + 193 + 621 + 476 + 3 + 1 + + + 70 + 191 + 278 + 0 + 0 + + + 38 + 139 + 382 + 0 + 0 + + + 962 + 624 + 810 + 6 + 0 + + + 70 + 189 + 281 + 0 + 0 + + + 72 + 198 + 616 + 3 + 0 + + + 284 + 624 + 698 + 2 + 0 + + + 38 + 259 + 338 + 0 + 0 + + + 34 + 121 + 439 + 0 + 0 + + + 102 + 616 + 657 + 0 + 0 + + + 70 + 115 + 158 + 0 + 0 + + + 38 + 231 + 379 + 0 + 0 + + + 0 + 765 + 529 + 3 + 0 + + + 70 + 140 + 379 + 0 + 0 + + + 45 + 588 + 503 + 4 + 0 + + + 407 + 715 + 566 + 6 + 0 + + + 12 + 169 + 314 + 0 + 0 + + + 283 + 613 + 775 + 0 + 0 + + + 70 + 209 + 254 + 0 + 0 + + + 34 + 294 + 649 + 0 + 0 + + + 72 + 197 + 619 + 7 + 0 + + + 70 + 225 + 542 + 0 + 0 + + + 70 + 113 + 160 + 0 + 0 + + + 284 + 671 + 708 + 2 + 0 + + + 50 + 102 + 520 + 0 + 0 + + + 70 + 334 + 365 + 0 + 0 + + + 70 + 48 + 377 + 0 + 0 + + + 103 + 517 + 572 + 0 + 0 + + + 70 + 178 + 298 + 0 + 0 + + + 100 + 162 + 540 + 0 + 0 + + + 5 + 180 + 486 + 0 + 0 + + + 273 + 486 + 545 + 0 + 0 + + + 70 + 192 + 276 + 0 + 0 + + + 377 + 483 + 692 + 0 + 0 + + + 0 + 551 + 473 + 0 + 0 + + + 25 + 617 + 1562 + 4 + 0 + + + 407 + 764 + 570 + 5 + 0 + + + 70 + 261 + 335 + 0 + 0 + + + 70 + 70 + 258 + 0 + 0 + + + 49 + 106 + 500 + 7 + 0 + + + 1 + 252 + 347 + 1 + 1 + + + 1 + 183 + 666 + 0 + 0 + + + 284 + 648 + 672 + 0 + 0 + + + 47 + 220 + 554 + 4 + 0 + + + 38 + 282 + 188 + 0 + 0 + + + 70 + 265 + 330 + 0 + 0 + + + 597 + 672 + 440 + 6 + 0 + + + 7 + 277 + 440 + 0 + 0 + + + 70 + 138 + 131 + 0 + 0 + + + 34 + 443 + 668 + 0 + 0 + + + 284 + 637 + 684 + 0 + 0 + + + 216 + 63 + 286 + 7 + 0 + + + 70 + 233 + 524 + 0 + 0 + + + 284 + 626 + 696 + 0 + 0 + + + 283 + 599 + 609 + 4 + 0 + + + 43 + 179 + 488 + 0 + 1 + + + 7 + 280 + 436 + 0 + 0 + + + 285 + 481 + 397 + 0 + 0 + + + 597 + 746 + 489 + 2 + 0 + + + 49 + 106 + 502 + 6 + 0 + + + 70 + 174 + 306 + 0 + 0 + + + 1138 + 496 + 385 + 0 + 0 + + + 1 + 196 + 446 + 0 + 0 + + + 668 + 731 + 499 + 0 + 0 + + + 70 + 110 + 164 + 0 + 0 + + + 37 + 292 + 654 + 0 + 0 + + + 0 + 620 + 539 + 6 + 0 + + + 70 + 49 + 368 + 0 + 0 + + + 70 + 195 + 273 + 0 + 0 + + + 105 + 163 + 536 + 0 + 0 + + + 4 + 135 + 394 + 0 + 0 + + + 70 + 197 + 270 + 0 + 0 + + + 113 + 474 + 705 + 0 + 0 + + + 70 + 320 + 273 + 0 + 0 + + + 0 + 602 + 672 + 0 + 0 + + + 4 + 188 + 283 + 0 + 0 + + + 70 + 297 + 411 + 0 + 0 + + + 7 + 133 + 657 + 0 + 0 + + + 0 + 170 + 514 + 0 + 0 + + + 111 + 220 + 397 + 0 + 0 + + + 0 + 549 + 475 + 0 + 0 + + + 103 + 573 + 706 + 0 + 0 + + + 22 + 341 + 663 + 2 + 0 + + + 38 + 48 + 374 + 0 + 0 + + + 70 + 134 + 134 + 0 + 0 + + + 70 + 210 + 581 + 6 + 0 + + + 70 + 317 + 385 + 0 + 0 + + + 70 + 162 + 111 + 0 + 0 + + + 3 + 340 + 665 + 2 + 0 + + + 70 + 116 + 155 + 0 + 0 + + + 1 + 135 + 647 + 0 + 0 + + + 4 + 206 + 424 + 0 + 0 + + + 306 + 612 + 776 + 6 + 0 + + + 1 + 487 + 392 + 1 + 1 + + + 70 + 238 + 367 + 0 + 0 + + + 284 + 667 + 712 + 2 + 0 + + + 205 + 55 + 326 + 0 + 0 + + + 284 + 635 + 686 + 0 + 0 + + + 111 + 519 + 570 + 0 + 0 + + + 70 + 79 + 227 + 0 + 0 + + + 38 + 122 + 147 + 0 + 0 + + + 70 + 183 + 98 + 0 + 0 + + + 13 + 165 + 322 + 2 + 0 + + + 70 + 58 + 309 + 0 + 0 + + + 70 + 300 + 291 + 0 + 0 + + + 72 + 199 + 613 + 3 + 0 + + + 377 + 661 + 659 + 0 + 0 + + + 70 + 137 + 131 + 0 + 0 + + + 388 + 657 + 663 + 4 + 0 + + + 313 + 696 + 480 + 3 + 0 + + + 72 + 200 + 610 + 3 + 0 + + + 70 + 122 + 151 + 0 + 0 + + + 70 + 292 + 181 + 0 + 0 + + + 597 + 749 + 446 + 2 + 0 + + + 70 + 302 + 175 + 0 + 0 + + + 33 + 424 + 697 + 0 + 0 + + + 70 + 98 + 188 + 0 + 0 + + + 70 + 188 + 98 + 0 + 0 + + + 103 + 221 + 395 + 0 + 0 + + + 284 + 643 + 677 + 2 + 0 + + + 115 + 568 + 713 + 0 + 0 + + + 34 + 194 + 630 + 0 + 0 + + + 205 + 59 + 312 + 0 + 0 + + + 34 + 373 + 711 + 0 + 0 + + + 100 + 164 + 532 + 0 + 0 + + + 9 + 133 + 656 + 0 + 0 + + + 1 + 250 + 349 + 0 + 1 + + + 70 + 58 + 317 + 0 + 0 + + + 37 + 466 + 485 + 0 + 0 + + + 402 + 597 + 847 + 6 + 0 + + + 72 + 200 + 611 + 3 + 0 + + + 0 + 188 + 650 + 3 + 0 + + + 70 + 84 + 219 + 0 + 0 + + + 7 + 279 + 438 + 4 + 0 + + + 34 + 648 + 456 + 2 + 0 + + + 70 + 240 + 220 + 0 + 0 + + + 1 + 120 + 440 + 0 + 0 + + + 38 + 167 + 110 + 0 + 0 + + + 193 + 627 + 471 + 2 + 1 + + + 4 + 322 + 164 + 0 + 0 + + + 5 + 78 + 677 + 2 + 0 + + + 1 + 131 + 666 + 0 + 0 + + + 72 + 199 + 614 + 3 + 0 + + + 70 + 74 + 248 + 0 + 0 + + + 70 + 69 + 266 + 0 + 0 + + + 286 + 525 + 497 + 0 + 0 + + + 0 + 621 + 652 + 7 + 0 + + + 70 + 54 + 340 + 0 + 0 + + + 72 + 198 + 617 + 7 + 0 + + + 597 + 672 + 497 + 6 + 0 + + + 20 + 620 + 702 + 4 + 0 + + + 284 + 641 + 679 + 2 + 0 + + + 105 + 163 + 535 + 0 + 0 + + + 33 + 445 + 664 + 0 + 0 + + + 45 + 602 + 723 + 2 + 0 + + + 100 + 670 + 441 + 4 + 0 + + + 284 + 665 + 714 + 2 + 0 + + + 34 + 651 + 513 + 2 + 0 + + + 402 + 632 + 800 + 0 + 0 + + + 284 + 628 + 693 + 2 + 0 + + + 4 + 218 + 242 + 0 + 0 + + + 36 + 759 + 440 + 3 + 0 + + + 72 + 197 + 620 + 3 + 0 + + + 284 + 664 + 715 + 0 + 0 + + + 20 + 295 + 529 + 0 + 0 + + + 0 + 505 + 585 + 0 + 0 + + + 194 + 585 + 505 + 4 + 0 + + + 34 + 377 + 692 + 0 + 0 + + + 0 + 481 + 396 + 6 + 0 + + + 597 + 687 + 531 + 4 + 0 + + + 445 + 648 + 563 + 6 + 0 + + + 0 + 721 + 506 + 1 + 0 + + + 20 + 607 + 717 + 0 + 0 + + + 70 + 318 + 384 + 0 + 0 + + + 34 + 740 + 493 + 3 + 0 + + + 1 + 579 + 820 + 1 + 0 + + + 23 + 647 + 673 + 4 + 0 + + + 407 + 698 + 580 + 0 + 0 + + + 1 + 190 + 644 + 0 + 0 + + + 1 + 184 + 665 + 0 + 0 + + + 70 + 60 + 305 + 0 + 0 + + + 70 + 148 + 358 + 0 + 0 + + + 70 + 179 + 296 + 0 + 0 + + + 70 + 308 + 283 + 0 + 0 + + + 72 + 198 + 618 + 3 + 0 + + + 1 + 508 + 514 + 4 + 0 + + + 1 + 591 + 685 + 0 + 0 + + + 4 + 72 + 254 + 0 + 0 + + + 70 + 155 + 118 + 0 + 0 + + + 284 + 632 + 689 + 2 + 0 + + + 41 + 268 + 2960 + 4 + 0 + + + 193 + 626 + 472 + 2 + 1 + + + 70 + 49 + 373 + 0 + 0 + + + 70 + 224 + 389 + 0 + 0 + + + 1 + 187 + 466 + 0 + 0 + + + 0 + 347 + 651 + 0 + 0 + + + 46 + 564 + 592 + 0 + 0 + + + 1 + 189 + 461 + 0 + 0 + + + 597 + 752 + 444 + 2 + 0 + + + 34 + 122 + 434 + 0 + 0 + + + 7 + 278 + 440 + 0 + 0 + + + 36 + 383 + 692 + 0 + 0 + + + 38 + 691 + 687 + 2 + 0 + + + 7 + 133 + 655 + 0 + 0 + + + 13 + 173 + 306 + 0 + 0 + + + 70 + 218 + 561 + 6 + 0 + + + 145 + 279 + 2954 + 4 + 0 + + + 70 + 252 + 210 + 0 + 0 + + + 4 + 135 + 392 + 0 + 0 + + + 25 + 134 + 650 + 0 + 0 + + + 44 + 603 + 722 + 0 + 0 + + + 21 + 590 + 501 + 4 + 0 + + + 0 + 758 + 534 + 3 + 0 + + + 23 + 263 + 465 + 0 + 0 + + + 34 + 374 + 698 + 0 + 0 + + + 0 + 593 + 563 + 6 + 0 + + + 45 + 542 + 616 + 4 + 0 + + + 1 + 695 + 683 + 1 + 1 + + + 70 + 185 + 286 + 0 + 0 + + + 102 + 618 + 655 + 0 + 0 + + + 70 + 116 + 157 + 0 + 0 + + + 70 + 225 + 387 + 0 + 0 + + + 597 + 680 + 491 + 0 + 0 + + + 34 + 652 + 512 + 2 + 0 + + + 0 + 195 + 627 + 0 + 0 + + + 284 + 630 + 691 + 2 + 0 + + + 34 + 501 + 521 + 0 + 0 + + + 307 + 512 + 441 + 0 + 0 + + + 284 + 662 + 717 + 0 + 0 + + + 51 + 267 + 2971 + 2 + 0 + + + 283 + 680 + 698 + 0 + 0 + + + 70 + 297 + 178 + 0 + 0 + + + 0 + 183 + 668 + 0 + 0 + + + 284 + 644 + 676 + 0 + 0 + + + 70 + 60 + 303 + 0 + 0 + + + 105 + 163 + 534 + 0 + 0 + + + 4 + 320 + 382 + 0 + 0 + + + 878 + 724 + 654 + 6 + 0 + + + 1 + 511 + 511 + 0 + 1 + + + 72 + 197 + 616 + 7 + 0 + + + 1 + 192 + 632 + 0 + 0 + + + 70 + 86 + 192 + 0 + 0 + + + 38 + 128 + 129 + 0 + 0 + + + 0 + 621 + 477 + 0 + 0 + + + 7 + 633 + 748 + 0 + 0 + + + 284 + 665 + 712 + 2 + 0 + + + 111 + 219 + 397 + 0 + 0 + + + 70 + 111 + 149 + 0 + 0 + + + 13 + 165 + 312 + 0 + 0 + + + 0 + 294 + 654 + 0 + 0 + + + 37 + 117 + 440 + 0 + 0 + + + 102 + 616 + 656 + 0 + 0 + + + 1 + 185 + 656 + 0 + 0 + + + 36 + 378 + 702 + 0 + 0 + + + 273 + 486 + 546 + 0 + 0 + + + 394 + 595 + 731 + 0 + 0 + + + 70 + 61 + 271 + 0 + 0 + + + 7 + 628 + 583 + 4 + 0 + + + 103 + 517 + 573 + 0 + 0 + + + 32 + 496 + 677 + 6 + 0 + + + 63 + 536 + 754 + 0 + 0 + + + 72 + 198 + 613 + 3 + 0 + + + 70 + 289 + 420 + 0 + 0 + + + 38 + 324 + 159 + 0 + 0 + + + 70 + 318 + 162 + 0 + 0 + + + 70 + 283 + 429 + 0 + 0 + + + 1 + 605 + 668 + 2 + 0 + + + 1 + 269 + 585 + 0 + 0 + + + 4 + 201 + 604 + 0 + 0 + + + 0 + 758 + 483 + 3 + 0 + + + 45 + 249 + 632 + 2 + 0 + + + 70 + 322 + 377 + 0 + 0 + + + 8 + 233 + 521 + 1 + 0 + + + 72 + 199 + 610 + 3 + 0 + + + 102 + 617 + 655 + 0 + 0 + + + 70 + 90 + 184 + 0 + 0 + + + 718 + 738 + 455 + 0 + 0 + + + 23 + 260 + 467 + 0 + 0 + + + 205 + 226 + 228 + 0 + 0 + + + 1 + 132 + 659 + 0 + 1 + + + 70 + 58 + 286 + 0 + 0 + + + 0 + 166 + 524 + 0 + 0 + + + 70 + 121 + 137 + 0 + 0 + + + 1 + 115 + 448 + 0 + 0 + + + 7 + 341 + 665 + 2 + 0 + + + 1 + 160 + 103 + 0 + 1 + + + 36 + 378 + 691 + 0 + 0 + + + 284 + 636 + 684 + 0 + 0 + + + 48 + 497 + 387 + 2 + 0 + + + 401 + 597 + 844 + 6 + 0 + + + 283 + 491 + 532 + 0 + 0 + + + 45 + 589 + 503 + 4 + 0 + + + 1 + 181 + 671 + 0 + 0 + + + 4 + 110 + 151 + 0 + 0 + + + 597 + 684 + 491 + 0 + 0 + + + 193 + 626 + 473 + 1 + 1 + + + 110 + 518 + 572 + 0 + 0 + + + 205 + 294 + 296 + 0 + 0 + + + 284 + 667 + 710 + 2 + 0 + + + 205 + 477 + 475 + 0 + 0 + + + 1 + 475 + 477 + 0 + 0 + + + 107 + 569 + 710 + 0 + 0 + + + 310 + 548 + 484 + 4 + 0 + + + 464 + 660 + 449 + 0 + 0 + + + 0 + 752 + 487 + 3 + 0 + + + 667 + 731 + 501 + 0 + 0 + + + 20 + 122 + 423 + 0 + 0 + + + 1 + 76 + 679 + 0 + 1 + + + 4 + 200 + 258 + 0 + 0 + + + 114 + 565 + 715 + 0 + 0 + + + 34 + 296 + 650 + 0 + 0 + + + 285 + 481 + 400 + 0 + 0 + + + 70 + 58 + 283 + 0 + 0 + + + 286 + 511 + 580 + 0 + 0 + + + 1 + 93 + 555 + 7 + 0 + + + 70 + 72 + 228 + 0 + 0 + + + 46 + 567 + 592 + 0 + 0 + + + 34 + 196 + 443 + 0 + 0 + + + 70 + 309 + 281 + 0 + 0 + + + 38 + 75 + 219 + 0 + 0 + + + 0 + 648 + 518 + 6 + 0 + + + 4 + 331 + 156 + 0 + 0 + + + 401 + 595 + 847 + 4 + 0 + + + 70 + 228 + 533 + 0 + 0 + + + 7 + 280 + 434 + 4 + 0 + + + 70 + 52 + 316 + 0 + 0 + + + 51 + 606 + 718 + 4 + 0 + + + 1 + 167 + 520 + 0 + 0 + + + 4 + 304 + 633 + 2 + 0 + + + 597 + 672 + 441 + 6 + 0 + + + 398 + 533 + 758 + 1 + 0 + + + 284 + 638 + 682 + 2 + 0 + + + 70 + 319 + 381 + 0 + 0 + + + 20 + 184 + 472 + 0 + 0 + + + 70 + 333 + 365 + 0 + 0 + + + 597 + 746 + 491 + 2 + 0 + + + 1 + 252 + 624 + 0 + 1 + + + 29 + 105 + 492 + 0 + 0 + + + 70 + 163 + 101 + 0 + 0 + + + 4 + 170 + 511 + 0 + 0 + + + 72 + 197 + 617 + 3 + 0 + + + 38 + 317 + 163 + 0 + 0 + + + 205 + 297 + 174 + 0 + 0 + + + 205 + 103 + 160 + 0 + 0 + + + 1 + 118 + 438 + 0 + 0 + + + 70 + 219 + 236 + 0 + 0 + + + 306 + 698 + 481 + 0 + 0 + + + 72 + 198 + 614 + 7 + 0 + + + 0 + 606 + 554 + 6 + 0 + + + 24 + 221 + 550 + 2 + 1 + + + 4 + 66 + 250 + 0 + 0 + + + 1139 + 500 + 385 + 0 + 0 + + + 72 + 199 + 611 + 7 + 0 + + + 286 + 514 + 441 + 0 + 0 + + + 371 + 621 + 700 + 0 + 0 + + + 284 + 630 + 690 + 2 + 0 + + + 0 + 753 + 537 + 3 + 0 + + + 284 + 660 + 717 + 0 + 0 + + + 283 + 716 + 704 + 0 + 0 + + + 306 + 724 + 506 + 5 + 0 + + + 37 + 644 + 675 + 4 + 0 + + + 9 + 277 + 439 + 0 + 0 + + + 405 + 537 + 753 + 7 + 0 + + + 1 + 562 + 597 + 0 + 0 + + + 70 + 320 + 380 + 0 + 0 + + + 283 + 714 + 706 + 0 + 0 + + + 70 + 303 + 286 + 0 + 0 + + + 70 + 320 + 160 + 0 + 0 + + + 21 + 249 + 633 + 0 + 0 + + + 20 + 279 + 2956 + 0 + 0 + + + 7 + 98 + 523 + 4 + 0 + + + 163 + 319 + 710 + 0 + 0 + + + 70 + 57 + 295 + 0 + 0 + + + 7 + 279 + 436 + 0 + 0 + + + 395 + 598 + 727 + 2 + 0 + + + 36 + 370 + 718 + 0 + 0 + + + 4 + 301 + 638 + 2 + 0 + + + 402 + 598 + 843 + 4 + 0 + + + 283 + 466 + 486 + 0 + 0 + + + 597 + 690 + 531 + 4 + 0 + + + 407 + 707 + 572 + 2 + 0 + + + 254 + 434 + 682 + 4 + 0 + + + 1 + 189 + 459 + 0 + 0 + + + 208 + 689 + 631 + 3 + 0 + + + 38 + 249 + 206 + 0 + 0 + + + 597 + 749 + 448 + 2 + 0 + + + 51 + 278 + 2967 + 0 + 0 + + + 668 + 727 + 504 + 0 + 0 + + + 34 + 706 + 519 + 2 + 0 + + + 23 + 96 + 534 + 0 + 0 + + + 70 + 206 + 421 + 0 + 0 + + + 100 + 160 + 542 + 0 + 0 + + + 20 + 298 + 529 + 0 + 0 + + + 38 + 167 + 307 + 0 + 0 + + + 306 + 522 + 509 + 3 + 0 + + + 37 + 471 + 481 + 0 + 0 + + + 139 + 499 + 454 + 6 + 0 + + + 4 + 63 + 268 + 0 + 0 + + + 284 + 647 + 672 + 0 + 0 + + + 70 + 259 + 335 + 0 + 0 + + + 284 + 662 + 715 + 0 + 0 + + + 38 + 684 + 692 + 2 + 0 + + + 1 + 112 + 458 + 0 + 0 + + + 284 + 632 + 688 + 2 + 0 + + + 72 + 197 + 618 + 3 + 0 + + + 1 + 297 + 647 + 0 + 0 + + + 284 + 658 + 719 + 0 + 0 + + + 1 + 182 + 669 + 0 + 0 + + + 3 + 98 + 524 + 0 + 0 + + + 1 + 235 + 518 + 2 + 1 + + + 29 + 135 + 641 + 0 + 0 + + + 1 + 118 + 435 + 0 + 0 + + + 70 + 231 + 527 + 0 + 0 + + + 4 + 317 + 273 + 0 + 0 + + + 20 + 146 + 593 + 0 + 0 + + + 1 + 250 + 630 + 0 + 1 + + + 70 + 247 + 208 + 0 + 0 + + + 13 + 169 + 304 + 0 + 0 + + + 1 + 187 + 463 + 0 + 0 + + + 1 + 185 + 468 + 0 + 0 + + + 597 + 752 + 446 + 2 + 0 + + + 1 + 116 + 443 + 0 + 0 + + + 105 + 571 + 708 + 0 + 0 + + + 668 + 733 + 500 + 0 + 0 + + + 70 + 138 + 121 + 0 + 0 + + + 72 + 199 + 612 + 3 + 0 + + + 70 + 229 + 378 + 0 + 0 + + + 306 + 748 + 490 + 3 + 0 + + + 1 + 489 + 543 + 1 + 1 + + + 37 + 633 + 687 + 0 + 0 + + + 34 + 762 + 481 + 3 + 0 + + + 4 + 122 + 421 + 0 + 0 + + + 70 + 292 + 417 + 0 + 0 + + + 70 + 323 + 268 + 0 + 0 + + + 63 + 107 + 480 + 0 + 0 + + + 23 + 263 + 463 + 0 + 0 + + + 7 + 278 + 438 + 4 + 0 + + + 70 + 323 + 377 + 0 + 0 + + + 72 + 198 + 615 + 3 + 0 + + + 0 + 290 + 543 + 6 + 0 + + + 445 + 651 + 563 + 6 + 0 + + + 70 + 126 + 408 + 0 + 0 + + + 70 + 252 + 204 + 0 + 0 + + + 144 + 97 + 530 + 0 + 0 + + + 70 + 76 + 220 + 0 + 0 + + + 103 + 161 + 538 + 0 + 0 + + + 4 + 116 + 144 + 0 + 0 + + + 70 + 328 + 264 + 0 + 0 + + + 10 + 132 + 656 + 0 + 0 + + + 0 + 311 + 618 + 2 + 0 + + + 37 + 343 + 660 + 2 + 0 + + + 70 + 210 + 580 + 6 + 0 + + + 34 + 381 + 697 + 0 + 0 + + + 70 + 327 + 265 + 0 + 0 + + + 283 + 445 + 432 + 4 + 0 + + + 284 + 634 + 686 + 0 + 0 + + + 38 + 723 + 507 + 2 + 0 + + + 284 + 624 + 697 + 2 + 0 + + + 402 + 594 + 849 + 3 + 0 + + + 1 + 188 + 648 + 0 + 0 + + + 1 + 165 + 525 + 0 + 0 + + + 4 + 92 + 559 + 7 + 0 + + + 286 + 497 + 675 + 1 + 0 + + + 47 + 342 + 662 + 0 + 0 + + + 950 + 625 + 807 + 2 + 0 + + + 284 + 663 + 715 + 0 + 0 + + + 32 + 367 + 713 + 0 + 0 + + + 102 + 517 + 574 + 0 + 0 + + + 70 + 306 + 395 + 0 + 0 + + + 49 + 104 + 500 + 0 + 0 + + + 70 + 208 + 250 + 0 + 0 + + + 284 + 638 + 681 + 2 + 0 + + + 70 + 296 + 292 + 0 + 0 + + + 70 + 220 + 393 + 0 + 0 + + + 119 + 131 + 660 + 0 + 0 + + + 23 + 291 + 539 + 6 + 0 + + + 70 + 215 + 242 + 0 + 0 + + + 25 + 130 + 665 + 0 + 0 + + + 1 + 112 + 464 + 1 + 1 + + + 70 + 128 + 406 + 0 + 0 + + + 4 + 66 + 258 + 0 + 0 + + + 284 + 626 + 694 + 0 + 0 + + + 419 + 714 + 512 + 6 + 0 + + + 70 + 84 + 203 + 0 + 0 + + + 306 + 695 + 526 + 1 + 0 + + + 205 + 142 + 120 + 0 + 0 + + + 1 + 302 + 635 + 1 + 0 + + + 0 + 182 + 664 + 0 + 0 + + + 597 + 680 + 493 + 2 + 0 + + + 34 + 291 + 659 + 0 + 0 + + + 1 + 99 + 526 + 1 + 1 + + + 1 + 167 + 518 + 0 + 0 + + + 70 + 173 + 301 + 0 + 0 + + + 51 + 534 + 756 + 4 + 0 + + + 597 + 683 + 491 + 0 + 0 + + + 34 + 372 + 715 + 0 + 0 + + + 34 + 117 + 445 + 0 + 0 + + + 66 + 126 + 686 + 1 + 1 + + + 34 + 424 + 700 + 0 + 0 + + + 4 + 307 + 394 + 0 + 0 + + + 597 + 672 + 499 + 6 + 0 + + + 401 + 477 + 703 + 6 + 0 + + + 100 + 670 + 443 + 4 + 0 + + + 32 + 447 + 664 + 0 + 0 + + + 0 + 622 + 649 + 7 + 0 + + + 0 + 668 + 502 + 6 + 0 + + + 70 + 171 + 100 + 0 + 0 + + + 20 + 444 + 432 + 6 + 0 + + + 70 + 249 + 209 + 0 + 0 + + + 70 + 103 + 166 + 0 + 0 + + + 1 + 118 + 441 + 0 + 0 + + + 45 + 249 + 630 + 2 + 0 + + + 23 + 260 + 465 + 0 + 0 + + + 34 + 186 + 650 + 0 + 0 + + + 45 + 590 + 503 + 4 + 0 + + + 38 + 190 + 274 + 0 + 0 + + + 0 + 742 + 544 + 3 + 0 + + + 4 + 308 + 169 + 0 + 0 + + + 13 + 169 + 308 + 0 + 0 + + + 0 + 166 + 521 + 0 + 0 + + + 47 + 174 + 496 + 4 + 0 + + + 34 + 629 + 472 + 0 + 0 + + + 205 + 144 + 362 + 0 + 0 + + + 37 + 548 + 485 + 4 + 0 + + + 394 + 504 + 665 + 1 + 0 + + + 38 + 166 + 102 + 0 + 0 + + + 0 + 322 + 596 + 2 + 0 + + + 962 + 637 + 792 + 2 + 0 + + + 23 + 98 + 532 + 0 + 0 + + + 402 + 616 + 819 + 0 + 0 + + + 47 + 220 + 550 + 4 + 0 + + + 38 + 132 + 395 + 0 + 0 + + + 14 + 173 + 499 + 0 + 0 + + + 284 + 641 + 678 + 0 + 0 + + + 450 + 622 + 588 + 4 + 0 + + + 313 + 694 + 527 + 0 + 0 + + + 184 + 622 + 477 + 0 + 1 + + + 205 + 318 + 164 + 0 + 0 + + + 0 + 481 + 399 + 6 + 0 + + + 205 + 241 + 358 + 0 + 0 + + + 402 + 597 + 845 + 0 + 0 + + + 70 + 71 + 238 + 0 + 0 + + + 70 + 210 + 576 + 6 + 0 + + + 284 + 628 + 692 + 2 + 0 + + + 72 + 197 + 614 + 3 + 0 + + + 34 + 312 + 615 + 2 + 0 + + + 209 + 203 + 425 + 0 + 0 + + + 98 + 652 + 514 + 2 + 0 + + + 1 + 631 + 751 + 0 + 1 + + + 334 + 158 + 107 + 0 + 0 + + + 398 + 474 + 707 + 6 + 0 + + + 70 + 142 + 367 + 0 + 0 + + + 72 + 198 + 611 + 3 + 0 + + + 70 + 204 + 423 + 0 + 0 + + + 70 + 286 + 423 + 0 + 0 + + + 278 + 449 + 3371 + 0 + 0 + + + 38 + 60 + 282 + 0 + 0 + + + 34 + 610 + 777 + 3 + 0 + + + 70 + 208 + 582 + 6 + 0 + + + 402 + 595 + 848 + 0 + 0 + + + 47 + 491 + 391 + 2 + 0 + + + 34 + 724 + 463 + 7 + 0 + + + 194 + 588 + 505 + 4 + 0 + + + 46 + 76 + 687 + 0 + 0 + + + 70 + 94 + 181 + 0 + 0 + + + 286 + 663 + 761 + 6 + 0 + + + 334 + 159 + 107 + 0 + 0 + + + 70 + 295 + 177 + 0 + 0 + + + 70 + 73 + 233 + 0 + 0 + + + 308 + 506 + 449 + 0 + 0 + + + 59 + 535 + 555 + 4 + 0 + + + 36 + 736 + 497 + 7 + 0 + + + 284 + 643 + 676 + 0 + 0 + + + 70 + 276 + 189 + 0 + 0 + + + 70 + 138 + 378 + 0 + 0 + + + 45 + 602 + 722 + 2 + 0 + + + 284 + 661 + 717 + 0 + 0 + + + 193 + 626 + 474 + 1 + 1 + + + 21 + 248 + 632 + 4 + 0 + + + 6 + 282 + 185 + 0 + 0 + + + 38 + 699 + 678 + 2 + 0 + + + 1 + 321 + 598 + 2 + 0 + + + 281 + 554 + 605 + 6 + 0 + + + 3 + 168 + 514 + 0 + 0 + + + 1 + 496 + 387 + 1 + 1 + + + 70 + 88 + 197 + 0 + 0 + + + 597 + 689 + 531 + 4 + 0 + + + 70 + 102 + 170 + 0 + 0 + + + 70 + 60 + 289 + 0 + 0 + + + 1 + 180 + 673 + 0 + 0 + + + 29 + 105 + 493 + 2 + 0 + + + 63 + 500 + 454 + 6 + 0 + + + 334 + 162 + 107 + 0 + 0 + + + 284 + 633 + 686 + 0 + 0 + + + 313 + 716 + 511 + 3 + 0 + + + 7 + 168 + 513 + 3 + 0 + + + 70 + 308 + 168 + 0 + 0 + + + 70 + 132 + 392 + 0 + 0 + + + 0 + 358 + 535 + 0 + 0 + + + 4 + 318 + 271 + 0 + 0 + + + 205 + 258 + 334 + 0 + 0 + + + 0 + 129 + 668 + 0 + 0 + + + 15 + 167 + 516 + 0 + 0 + + + 284 + 632 + 687 + 2 + 0 + + + 284 + 671 + 706 + 2 + 0 + + + 0 + 631 + 640 + 6 + 0 + + + 205 + 244 + 212 + 0 + 0 + + + 38 + 268 + 193 + 0 + 0 + + + 285 + 482 + 695 + 2 + 0 + + + 1131 + 486 + 394 + 4 + 0 + + + 4 + 217 + 397 + 0 + 0 + + + 70 + 128 + 404 + 0 + 0 + + + 38 + 234 + 221 + 0 + 0 + + + 12 + 169 + 306 + 0 + 0 + + + 0 + 670 + 500 + 6 + 0 + + + 7 + 279 + 434 + 4 + 0 + + + 113 + 621 + 699 + 0 + 1 + + + 70 + 129 + 134 + 0 + 0 + + + 70 + 116 + 149 + 0 + 0 + + + 70 + 149 + 116 + 0 + 0 + + + 7 + 278 + 436 + 0 + 0 + + + 70 + 150 + 116 + 0 + 0 + + + 34 + 524 + 500 + 0 + 0 + + + 20 + 182 + 474 + 0 + 0 + + + 0 + 697 + 525 + 1 + 0 + + + 4 + 142 + 365 + 0 + 0 + + + 33 + 377 + 695 + 0 + 0 + + + 70 + 84 + 207 + 0 + 0 + + + 306 + 674 + 440 + 0 + 0 + + + 205 + 110 + 158 + 0 + 0 + + + 1 + 160 + 108 + 0 + 1 + + + 205 + 303 + 171 + 0 + 0 + + + 12 + 165 + 314 + 0 + 0 + + + 22 + 653 + 665 + 4 + 0 + + + 34 + 187 + 648 + 0 + 0 + + + 72 + 198 + 612 + 7 + 0 + + + 377 + 652 + 774 + 1 + 0 + + + 285 + 472 + 481 + 0 + 0 + + + 209 + 201 + 429 + 0 + 0 + + + 284 + 659 + 719 + 0 + 0 + + + 70 + 183 + 283 + 0 + 0 + + + 34 + 755 + 535 + 3 + 0 + + + 45 + 249 + 631 + 2 + 0 + + + 70 + 254 + 477 + 6 + 0 + + + 360 + 664 + 654 + 0 + 0 + + + 396 + 540 + 748 + 1 + 0 + + + 0 + 185 + 466 + 0 + 0 + + + 72 + 197 + 615 + 3 + 0 + + + 55 + 654 + 664 + 6 + 0 + + + 34 + 376 + 697 + 0 + 0 + + + 284 + 635 + 684 + 0 + 0 + + + 70 + 94 + 183 + 0 + 0 + + + 70 + 93 + 185 + 0 + 0 + + + 214 + 473 + 708 + 2 + 0 + + + 400 + 471 + 711 + 4 + 0 + + + 33 + 366 + 716 + 0 + 0 + + + 209 + 202 + 426 + 1 + 0 + + + 284 + 669 + 708 + 2 + 0 + + + 34 + 750 + 488 + 3 + 0 + + + 597 + 682 + 491 + 0 + 0 + + + 284 + 624 + 696 + 2 + 0 + + + 284 + 668 + 709 + 0 + 0 + + + 23 + 263 + 461 + 0 + 0 + + + 1 + 129 + 667 + 0 + 0 + + + 38 + 253 + 340 + 0 + 0 + + + 0 + 674 + 543 + 1 + 0 + + + 43 + 273 + 444 + 6 + 0 + + + 113 + 475 + 705 + 0 + 0 + + + 0 + 642 + 462 + 2 + 0 + + + 34 + 286 + 670 + 0 + 0 + + + 205 + 60 + 286 + 0 + 0 + + + 205 + 305 + 170 + 0 + 0 + + + 1 + 256 + 613 + 0 + 0 + + + 54 + 643 + 628 + 4 + 0 + + + 83 + 221 + 549 + 0 + 0 + + + 7 + 277 + 438 + 4 + 0 + + + 105 + 161 + 535 + 0 + 0 + + + 4 + 53 + 326 + 0 + 0 + + + 0 + 638 + 465 + 5 + 0 + + + 402 + 596 + 847 + 4 + 0 + + + 20 + 272 + 446 + 6 + 0 + + + 283 + 577 + 821 + 6 + 0 + + + 395 + 489 + 685 + 1 + 0 + + + 306 + 685 + 489 + 0 + 0 + + + 34 + 419 + 708 + 0 + 0 + + + 63 + 607 + 603 + 4 + 0 + + + 407 + 701 + 576 + 0 + 0 + + + 53 + 179 + 481 + 0 + 0 + + + 63 + 102 + 509 + 2 + 0 + + + 404 + 532 + 759 + 3 + 0 + + + 100 + 160 + 538 + 0 + 0 + + + 70 + 121 + 429 + 0 + 0 + + + 1 + 489 + 392 + 0 + 1 + + + 70 + 179 + 290 + 0 + 0 + + + 70 + 67 + 257 + 0 + 0 + + + 70 + 311 + 390 + 0 + 0 + + + 70 + 73 + 236 + 0 + 0 + + + 1 + 346 + 554 + 0 + 0 + + + 29 + 101 + 514 + 0 + 0 + + + 45 + 104 + 487 + 6 + 0 + + + 70 + 133 + 147 + 0 + 0 + + + 284 + 671 + 704 + 2 + 0 + + + 38 + 132 + 148 + 0 + 0 + + + 70 + 148 + 132 + 0 + 0 + + + 306 + 716 + 513 + 0 + 0 + + + 1 + 325 + 487 + 0 + 1 + + + 70 + 122 + 160 + 0 + 0 + + + 6 + 118 + 1605 + 0 + 0 + + + 45 + 540 + 616 + 4 + 0 + + + 597 + 672 + 495 + 6 + 0 + + + 70 + 327 + 155 + 0 + 0 + + + 37 + 345 + 660 + 0 + 0 + + + 34 + 693 + 480 + 2 + 0 + + + 72 + 197 + 612 + 3 + 0 + + + 4 + 306 + 394 + 0 + 0 + + + 205 + 295 + 305 + 0 + 0 + + + 70 + 206 + 246 + 0 + 0 + + + 34 + 428 + 695 + 0 + 0 + + + 4 + 134 + 146 + 0 + 0 + + + 30 + 442 + 673 + 0 + 0 + + + 1 + 181 + 666 + 0 + 0 + + + 34 + 664 + 501 + 0 + 0 + + + 70 + 123 + 159 + 0 + 0 + + + 51 + 533 + 756 + 4 + 0 + + + 21 + 626 + 475 + 0 + 0 + + + 34 + 645 + 461 + 2 + 0 + + + 209 + 211 + 426 + 0 + 0 + + + 70 + 51 + 382 + 0 + 0 + + + 70 + 281 + 180 + 0 + 0 + + + 284 + 652 + 672 + 0 + 0 + + + 70 + 209 + 242 + 0 + 0 + + + 34 + 738 + 546 + 3 + 0 + + + 34 + 734 + 549 + 3 + 0 + + + 193 + 623 + 477 + 0 + 1 + + + 21 + 590 + 504 + 0 + 0 + + + 70 + 70 + 278 + 0 + 0 + + + 32 + 374 + 701 + 0 + 0 + + + 34 + 749 + 538 + 3 + 0 + + + 36 + 522 + 436 + 0 + 0 + + + 32 + 79 + 640 + 0 + 0 + + + 1 + 178 + 677 + 0 + 0 + + + 34 + 114 + 444 + 0 + 0 + + + 70 + 206 + 585 + 0 + 0 + + + 34 + 290 + 653 + 0 + 0 + + + 70 + 299 + 403 + 0 + 0 + + + 70 + 210 + 241 + 0 + 0 + + + 3 + 105 + 482 + 0 + 0 + + + 20 + 272 + 443 + 4 + 0 + + + 1 + 314 + 603 + 2 + 0 + + + 284 + 657 + 719 + 0 + 0 + + + 284 + 626 + 700 + 2 + 0 + + + 70 + 150 + 130 + 0 + 0 + + + 9 + 277 + 435 + 0 + 0 + + + 4 + 310 + 290 + 0 + 0 + + + 20 + 88 + 575 + 0 + 0 + + + 38 + 115 + 440 + 0 + 0 + + + 214 + 689 + 636 + 3 + 0 + + + 0 + 679 + 438 + 3 + 0 + + + 407 + 712 + 566 + 4 + 0 + + + 20 + 611 + 717 + 0 + 0 + + + 38 + 154 + 328 + 0 + 0 + + + 215 + 69 + 285 + 7 + 0 + + + 80 + 162 + 556 + 4 + 0 + + + 4 + 183 + 658 + 0 + 0 + + + 205 + 329 + 366 + 0 + 0 + + + 5 + 139 + 648 + 0 + 0 + + + 37 + 463 + 492 + 0 + 0 + + + 306 + 708 + 470 + 7 + 0 + + + 71 + 96 + 526 + 0 + 0 + + + 70 + 209 + 576 + 6 + 0 + + + 70 + 104 + 189 + 0 + 0 + + + 70 + 108 + 182 + 0 + 0 + + + 205 + 168 + 117 + 0 + 0 + + + 0 + 202 + 596 + 0 + 0 + + + 1 + 609 + 662 + 3 + 0 + + + 97 + 616 + 823 + 6 + 0 + + + 32 + 369 + 711 + 0 + 0 + + + 342 + 611 + 601 + 4 + 0 + + + 70 + 208 + 579 + 6 + 0 + + + 70 + 127 + 398 + 0 + 0 + + + 45 + 104 + 486 + 6 + 0 + + + 407 + 727 + 650 + 6 + 0 + + + 1 + 289 + 655 + 0 + 0 + + + 70 + 82 + 240 + 0 + 0 + + + 24 + 273 + 185 + 3 + 1 + + + 45 + 542 + 614 + 0 + 0 + + + 70 + 195 + 101 + 0 + 0 + + + 103 + 165 + 546 + 0 + 0 + + + 399 + 536 + 752 + 1 + 0 + + + 4 + 617 + 595 + 0 + 0 + + + 70 + 100 + 196 + 0 + 0 + + + 1 + 220 + 547 + 1 + 1 + + + 45 + 605 + 724 + 6 + 0 + + + 38 + 307 + 392 + 0 + 0 + + + 70 + 106 + 185 + 0 + 0 + + + 1 + 344 + 662 + 0 + 1 + + + 0 + 728 + 457 + 1 + 0 + + + 70 + 151 + 334 + 0 + 0 + + + 70 + 96 + 204 + 0 + 0 + + + 938 + 692 + 633 + 0 + 0 + + + 45 + 104 + 485 + 4 + 0 + + + 4 + 177 + 285 + 0 + 0 + + + 70 + 299 + 301 + 0 + 0 + + + 122 + 645 + 569 + 0 + 1 + + + 70 + 194 + 260 + 0 + 0 + + + 284 + 648 + 676 + 0 + 0 + + + 20 + 115 + 439 + 0 + 0 + + + 72 + 197 + 611 + 3 + 0 + + + 284 + 624 + 702 + 2 + 0 + + + 0 + 509 + 584 + 0 + 0 + + + 4 + 77 + 255 + 0 + 0 + + + 394 + 485 + 686 + 6 + 0 + + + 36 + 665 + 447 + 2 + 0 + + + 70 + 59 + 333 + 0 + 0 + + + 46 + 562 + 592 + 0 + 0 + + + 12 + 165 + 306 + 0 + 0 + + + 23 + 260 + 463 + 0 + 0 + + + 1 + 709 + 715 + 0 + 0 + + + 45 + 591 + 503 + 4 + 0 + + + 284 + 659 + 717 + 0 + 0 + + + 7 + 253 + 626 + 4 + 0 + + + 306 + 714 + 710 + 0 + 0 + + + 100 + 668 + 445 + 4 + 0 + + + 188 + 289 + 548 + 0 + 0 + + + 72 + 198 + 610 + 3 + 0 + + + 284 + 665 + 710 + 2 + 0 + + + 100 + 183 + 660 + 0 + 0 + + + 83 + 220 + 549 + 0 + 0 + + + 445 + 623 + 590 + 0 + 0 + + + 284 + 632 + 693 + 2 + 0 + + + 1 + 320 + 591 + 2 + 0 + + + 38 + 211 + 425 + 0 + 0 + + + 7 + 277 + 436 + 0 + 0 + + + 70 + 257 + 196 + 0 + 0 + + + 38 + 283 + 178 + 0 + 0 + + + 38 + 222 + 404 + 0 + 0 + + + 284 + 645 + 679 + 2 + 0 + + + 20 + 94 + 536 + 0 + 0 + + + 70 + 263 + 341 + 0 + 0 + + + 70 + 196 + 101 + 0 + 0 + + + 3 + 439 + 677 + 0 + 0 + + + 281 + 554 + 600 + 6 + 0 + + + 196 + 164 + 547 + 0 + 0 + + + 0 + 677 + 543 + 1 + 0 + + + 32 + 79 + 638 + 0 + 0 + + + 0 + 195 + 460 + 0 + 0 + + + 70 + 140 + 360 + 0 + 0 + + + 1 + 112 + 450 + 0 + 0 + + + 36 + 659 + 451 + 0 + 0 + + + 377 + 635 + 799 + 4 + 0 + + + 70 + 191 + 264 + 0 + 0 + + + 407 + 659 + 612 + 3 + 0 + + + 597 + 752 + 442 + 2 + 0 + + + 70 + 76 + 261 + 0 + 0 + + + 4 + 137 + 368 + 0 + 0 + + + 284 + 646 + 678 + 0 + 0 + + + 1 + 486 + 468 + 0 + 0 + + + 70 + 79 + 251 + 0 + 0 + + + 70 + 313 + 386 + 0 + 0 + + + 51 + 610 + 718 + 4 + 0 + + + 1 + 256 + 619 + 0 + 0 + + + 4 + 181 + 278 + 0 + 0 + + + 1 + 90 + 559 + 0 + 0 + + + 19 + 638 + 576 + 0 + 0 + + + 4 + 94 + 210 + 0 + 0 + + + 0 + 194 + 462 + 0 + 0 + + + 4 + 92 + 547 + 7 + 0 + + + 70 + 275 + 183 + 0 + 0 + + + 205 + 78 + 253 + 0 + 0 + + + 261 + 593 + 501 + 4 + 0 + + + 51 + 622 + 704 + 6 + 0 + + + 205 + 111 + 178 + 0 + 0 + + + 70 + 223 + 402 + 0 + 0 + + + 0 + 611 + 660 + 3 + 0 + + + 0 + 166 + 540 + 4 + 0 + + + 70 + 216 + 559 + 6 + 0 + + + 405 + 542 + 744 + 0 + 0 + + + 72 + 197 + 613 + 3 + 0 + + + 2 + 275 + 439 + 1 + 1 + + + 70 + 130 + 152 + 0 + 0 + + + 88 + 223 + 541 + 0 + 0 + + + 8 + 232 + 520 + 1 + 0 + + + 284 + 630 + 695 + 2 + 0 + + + 205 + 615 + 483 + 0 + 0 + + + 100 + 695 + 630 + 0 + 0 + + + 70 + 52 + 383 + 0 + 0 + + + 7 + 278 + 434 + 4 + 0 + + + 395 + 503 + 661 + 1 + 0 + + + 0 + 614 + 657 + 3 + 0 + + + 70 + 132 + 151 + 0 + 0 + + + 597 + 672 + 442 + 6 + 0 + + + 205 + 147 + 342 + 0 + 0 + + + 34 + 114 + 441 + 0 + 0 + + + 407 + 656 + 615 + 0 + 0 + + + 27 + 491 + 385 + 0 + 0 + + + 70 + 49 + 407 + 0 + 0 + + + 284 + 643 + 681 + 0 + 0 + + + 284 + 669 + 706 + 2 + 0 + + + 70 + 133 + 150 + 0 + 0 + + + 70 + 95 + 210 + 0 + 0 + + + 394 + 471 + 706 + 3 + 0 + + + 70 + 214 + 235 + 0 + 0 + + + 37 + 295 + 538 + 4 + 0 + + + 405 + 489 + 680 + 1 + 0 + + + 32 + 473 + 703 + 2 + 0 + + + 4 + 249 + 202 + 0 + 0 + + + 597 + 692 + 531 + 4 + 0 + + + 395 + 558 + 723 + 0 + 0 + + + 70 + 135 + 147 + 0 + 0 + + + 4 + 291 + 545 + 6 + 0 + + + 1 + 192 + 628 + 0 + 0 + + + 192 + 759 + 438 + 0 + 0 + + + 70 + 95 + 209 + 0 + 0 + + + 7 + 633 + 746 + 4 + 0 + + + 308 + 538 + 488 + 4 + 0 + + + 70 + 123 + 408 + 0 + 0 + + + 1 + 140 + 641 + 0 + 0 + + + 1 + 613 + 658 + 3 + 0 + + + 284 + 640 + 684 + 0 + 0 + + + 34 + 647 + 459 + 2 + 0 + + + 1 + 236 + 511 + 0 + 1 + + + 38 + 66 + 301 + 0 + 0 + + + 281 + 94 + 534 + 6 + 0 + + + 3 + 253 + 627 + 4 + 0 + + + 306 + 756 + 486 + 3 + 0 + + + 6 + 136 + 660 + 0 + 0 + + + 45 + 251 + 632 + 4 + 0 + + + 5 + 96 + 523 + 0 + 0 + + + 20 + 191 + 470 + 0 + 0 + + + 20 + 108 + 465 + 0 + 0 + + + 70 + 61 + 326 + 0 + 0 + + + 0 + 171 + 525 + 0 + 0 + + + 38 + 130 + 153 + 0 + 0 + + + 1 + 618 + 1564 + 1 + 1 + + + 70 + 67 + 297 + 0 + 0 + + + 70 + 201 + 99 + 0 + 0 + + + 70 + 102 + 197 + 0 + 0 + + + 404 + 536 + 751 + 7 + 0 + + + 70 + 290 + 414 + 0 + 0 + + + 38 + 81 + 248 + 0 + 0 + + + 34 + 114 + 449 + 0 + 0 + + + 32 + 374 + 692 + 0 + 0 + + + 1 + 267 + 591 + 0 + 0 + + + 36 + 160 + 559 + 0 + 0 + + + 70 + 173 + 116 + 0 + 0 + + + 70 + 96 + 209 + 0 + 0 + + + 0 + 526 + 492 + 0 + 0 + + + 70 + 227 + 394 + 0 + 0 + + + 1 + 560 + 532 + 0 + 1 + + + 284 + 667 + 709 + 0 + 0 + + + 0 + 758 + 531 + 3 + 0 + + + 0 + 741 + 495 + 1 + 0 + + + 402 + 619 + 820 + 6 + 0 + + + 70 + 283 + 316 + 0 + 0 + + + 0 + 622 + 479 + 0 + 0 + + + 308 + 611 + 774 + 6 + 0 + + + 34 + 646 + 732 + 0 + 0 + + + 24 + 607 + 721 + 1 + 1 + + + 0 + 591 + 681 + 4 + 0 + + + 205 + 300 + 298 + 0 + 0 + + + 70 + 120 + 426 + 0 + 0 + + + 284 + 638 + 686 + 0 + 0 + + + 70 + 125 + 409 + 0 + 0 + + + 4 + 317 + 282 + 0 + 0 + + + 0 + 593 + 560 + 6 + 0 + + + 70 + 122 + 419 + 0 + 0 + + + 70 + 325 + 275 + 0 + 0 + + + 205 + 275 + 325 + 0 + 0 + + + 70 + 168 + 119 + 0 + 0 + + + 70 + 196 + 102 + 0 + 0 + + + 70 + 175 + 292 + 0 + 0 + + + 111 + 198 + 101 + 0 + 0 + + + 0 + 118 + 433 + 0 + 0 + + + 306 + 607 + 779 + 6 + 0 + + + 15 + 259 + 345 + 4 + 0 + + + 1 + 308 + 613 + 2 + 0 + + + 146 + 602 + 727 + 6 + 0 + + + 70 + 108 + 185 + 0 + 0 + + + 7 + 136 + 657 + 0 + 0 + + + 3 + 633 + 747 + 0 + 0 + + + 205 + 52 + 384 + 0 + 0 + + + 70 + 304 + 168 + 0 + 0 + + + 23 + 96 + 532 + 0 + 0 + + + 1 + 112 + 456 + 0 + 0 + + + 1 + 440 + 677 + 0 + 1 + + + 70 + 230 + 222 + 0 + 0 + + + 284 + 671 + 705 + 2 + 0 + + + 285 + 466 + 490 + 0 + 0 + + + 41 + 490 + 466 + 0 + 0 + + + 34 + 181 + 495 + 0 + 0 + + + 37 + 627 + 475 + 2 + 0 + + + 70 + 205 + 249 + 0 + 0 + + + 395 + 493 + 674 + 1 + 0 + + + 34 + 116 + 440 + 0 + 0 + + + 205 + 121 + 167 + 0 + 0 + + + 0 + 656 + 559 + 0 + 0 + + + 193 + 624 + 477 + 0 + 1 + + + 70 + 273 + 187 + 0 + 0 + + + 1 + 190 + 631 + 0 + 0 + + + 284 + 626 + 699 + 2 + 0 + + + 70 + 206 + 582 + 6 + 0 + + + 34 + 423 + 704 + 0 + 0 + + + 34 + 117 + 436 + 0 + 0 + + + 394 + 476 + 698 + 1 + 0 + + + 430 + 644 + 788 + 1 + 0 + + + 205 + 126 + 160 + 0 + 0 + + + 71 + 216 + 555 + 2 + 0 + + + 21 + 585 + 509 + 4 + 0 + + + 4 + 51 + 395 + 0 + 0 + + + 23 + 260 + 461 + 0 + 0 + + + 80 + 161 + 556 + 4 + 0 + + + 4 + 250 + 204 + 0 + 0 + + + 49 + 102 + 500 + 0 + 0 + + + 37 + 183 + 655 + 0 + 0 + + + 4 + 55 + 366 + 0 + 0 + + + 38 + 183 + 110 + 0 + 0 + + + 24 + 606 + 722 + 2 + 1 + + + 35 + 84 + 607 + 0 + 0 + + + 34 + 349 + 654 + 4 + 0 + + + 45 + 541 + 614 + 0 + 0 + + + 0 + 667 + 498 + 6 + 0 + + + 70 + 274 + 186 + 0 + 0 + + + 1 + 189 + 634 + 0 + 0 + + + 34 + 761 + 529 + 3 + 0 + + + 1 + 322 + 586 + 2 + 0 + + + 5 + 510 + 507 + 6 + 0 + + + 1 + 92 + 554 + 7 + 0 + + + 70 + 172 + 117 + 0 + 0 + + + 70 + 154 + 331 + 0 + 0 + + + 29 + 438 + 3375 + 0 + 0 + + + 70 + 87 + 231 + 0 + 0 + + + 1 + 315 + 599 + 2 + 0 + + + 6 + 118 + 1599 + 0 + 0 + + + 0 + 94 + 542 + 7 + 0 + + + 0 + 295 + 535 + 6 + 0 + + + 284 + 669 + 707 + 2 + 0 + + + 70 + 203 + 251 + 0 + 0 + + + 0 + 719 + 462 + 3 + 0 + + + 70 + 171 + 298 + 0 + 0 + + + 70 + 91 + 221 + 0 + 0 + + + 0 + 348 + 655 + 0 + 0 + + + 34 + 594 + 618 + 2 + 0 + + + 285 + 470 + 485 + 0 + 0 + + + 70 + 224 + 537 + 0 + 0 + + + 34 + 371 + 709 + 0 + 0 + + + 70 + 127 + 160 + 0 + 0 + + + 597 + 672 + 443 + 6 + 0 + + + 20 + 189 + 472 + 0 + 0 + + + 38 + 65 + 313 + 0 + 0 + + + 306 + 504 + 514 + 0 + 0 + + + 70 + 133 + 383 + 0 + 0 + + + 283 + 594 + 855 + 7 + 0 + + + 0 + 760 + 483 + 3 + 0 + + + 284 + 651 + 672 + 0 + 0 + + + 70 + 223 + 400 + 0 + 0 + + + 1 + 484 + 471 + 0 + 0 + + + 70 + 58 + 350 + 0 + 0 + + + 107 + 201 + 101 + 0 + 0 + + + 185 + 625 + 476 + 2 + 1 + + + 36 + 663 + 449 + 0 + 0 + + + 38 + 199 + 102 + 0 + 0 + + + 38 + 689 + 686 + 2 + 0 + + + 4 + 92 + 553 + 7 + 0 + + + 63 + 103 + 494 + 0 + 0 + + + 34 + 592 + 620 + 2 + 0 + + + 377 + 617 + 709 + 0 + 0 + + + 70 + 126 + 404 + 0 + 0 + + + 150 + 518 + 440 + 0 + 0 + + + 34 + 743 + 494 + 3 + 0 + + + 951 + 638 + 796 + 0 + 0 + + + 139 + 100 + 509 + 2 + 0 + + + 37 + 628 + 474 + 2 + 0 + + + 3 + 219 + 549 + 6 + 0 + + + 45 + 104 + 489 + 6 + 0 + + + 192 + 661 + 502 + 4 + 0 + + + 70 + 48 + 422 + 0 + 0 + + + 1 + 682 + 693 + 0 + 0 + + + 11 + 221 + 544 + 4 + 0 + + + 394 + 499 + 665 + 1 + 0 + + + 284 + 624 + 701 + 2 + 0 + + + 70 + 201 + 253 + 0 + 0 + + + 597 + 746 + 492 + 2 + 0 + + + 6 + 129 + 1462 + 0 + 0 + + + 103 + 195 + 104 + 0 + 0 + + + 45 + 605 + 723 + 6 + 0 + + + 1 + 185 + 650 + 0 + 0 + + + 0 + 686 + 535 + 1 + 0 + + + 70 + 136 + 374 + 0 + 0 + + + 284 + 661 + 715 + 0 + 0 + + + 278 + 439 + 678 + 4 + 0 + + + 143 + 264 + 2950 + 2 + 0 + + + 70 + 301 + 296 + 0 + 0 + + + 306 + 721 + 509 + 5 + 0 + + + 38 + 230 + 221 + 0 + 0 + + + 70 + 130 + 391 + 0 + 0 + + + 285 + 465 + 490 + 0 + 0 + + + 4 + 242 + 210 + 0 + 0 + + + 13 + 165 + 308 + 0 + 0 + + + 97 + 617 + 823 + 6 + 0 + + + 183 + 474 + 700 + 2 + 0 + + + 0 + 171 + 521 + 0 + 0 + + + 0 + 679 + 696 + 0 + 0 + + + 70 + 77 + 263 + 0 + 0 + + + 205 + 124 + 410 + 0 + 0 + + + 7 + 277 + 434 + 4 + 0 + + + 55 + 696 + 679 + 1 + 0 + + + 70 + 125 + 162 + 0 + 0 + + + 1 + 609 + 776 + 3 + 0 + + + 47 + 486 + 388 + 4 + 0 + + + 115 + 615 + 711 + 2 + 1 + + + 25 + 134 + 665 + 0 + 0 + + + 70 + 179 + 284 + 0 + 0 + + + 273 + 486 + 541 + 0 + 0 + + + 1 + 621 + 761 + 0 + 0 + + + 21 + 594 + 501 + 4 + 0 + + + 70 + 142 + 144 + 0 + 0 + + + 284 + 665 + 711 + 2 + 0 + + + 70 + 132 + 155 + 0 + 0 + + + 34 + 179 + 499 + 0 + 0 + + + 72 + 197 + 610 + 3 + 0 + + + 284 + 647 + 676 + 0 + 0 + + + 4 + 326 + 274 + 0 + 0 + + + 38 + 53 + 386 + 0 + 0 + + + 27 + 137 + 652 + 0 + 0 + + + 284 + 632 + 692 + 2 + 0 + + + 0 + 521 + 497 + 0 + 0 + + + 0 + 766 + 526 + 3 + 0 + + + 4 + 65 + 315 + 0 + 0 + + + 45 + 104 + 488 + 6 + 0 + + + 70 + 123 + 166 + 0 + 0 + + + 206 + 64 + 319 + 0 + 0 + + + 0 + 611 + 487 + 0 + 0 + + + 1 + 310 + 608 + 2 + 0 + + + 205 + 484 + 389 + 1 + 1 + + + 284 + 645 + 678 + 2 + 0 + + + 4 + 52 + 393 + 0 + 0 + + + 70 + 61 + 335 + 0 + 0 + + + 0 + 178 + 675 + 0 + 0 + + + 597 + 691 + 531 + 4 + 0 + + + 306 + 684 + 435 + 0 + 0 + + + 450 + 624 + 588 + 0 + 0 + + + 1 + 306 + 616 + 2 + 0 + + + 70 + 273 + 186 + 0 + 0 + + + 1 + 186 + 646 + 0 + 0 + + + 1 + 91 + 558 + 0 + 0 + + + 597 + 672 + 494 + 6 + 0 + + + 70 + 52 + 392 + 0 + 0 + + + 1 + 107 + 474 + 1 + 1 + + + 70 + 319 + 159 + 0 + 0 + + + 659 + 638 + 741 + 0 + 0 + + + 1 + 250 + 357 + 0 + 1 + + + 106 + 198 + 103 + 0 + 0 + + + 103 + 569 + 708 + 0 + 0 + + + 1 + 172 + 519 + 0 + 0 + + + 7 + 251 + 630 + 6 + 0 + + + 938 + 693 + 631 + 0 + 0 + + + 70 + 53 + 385 + 0 + 0 + + + 5 + 273 + 440 + 0 + 0 + + + 4 + 264 + 192 + 0 + 0 + + + 25 + 96 + 528 + 0 + 0 + + + 284 + 663 + 713 + 2 + 0 + + + 105 + 164 + 544 + 0 + 0 + + + 70 + 129 + 393 + 0 + 0 + + + 23 + 289 + 547 + 0 + 0 + + + 70 + 130 + 390 + 0 + 0 + + + 70 + 93 + 219 + 0 + 0 + + + 70 + 321 + 278 + 0 + 0 + + + 313 + 676 + 491 + 3 + 0 + + + 70 + 312 + 286 + 0 + 0 + + + 70 + 245 + 207 + 0 + 0 + + + 4 + 71 + 287 + 0 + 0 + + + 4 + 237 + 214 + 0 + 0 + + + 3 + 254 + 627 + 4 + 0 + + + 177 + 327 + 487 + 0 + 0 + + + 597 + 672 + 444 + 6 + 0 + + + 217 + 65 + 284 + 2 + 0 + + + 37 + 296 + 538 + 4 + 0 + + + 4 + 314 + 283 + 0 + 0 + + + 70 + 237 + 504 + 6 + 0 + + + 37 + 107 + 463 + 0 + 0 + + + 70 + 283 + 422 + 0 + 0 + + + 70 + 266 + 334 + 0 + 0 + + + 16 + 94 + 527 + 6 + 0 + + + 70 + 161 + 308 + 0 + 0 + + + 565 + 748 + 446 + 0 + 0 + + + 179 + 228 + 524 + 6 + 0 + + + 70 + 60 + 308 + 0 + 0 + + + 70 + 88 + 210 + 0 + 0 + + + 0 + 609 + 490 + 0 + 0 + + + 27 + 556 + 600 + 0 + 0 + + + 70 + 206 + 580 + 6 + 0 + + + 32 + 531 + 757 + 0 + 0 + + + 205 + 181 + 274 + 0 + 0 + + + 70 + 322 + 371 + 0 + 0 + + + 70 + 268 + 185 + 0 + 0 + + + 205 + 185 + 268 + 0 + 0 + + + 70 + 124 + 149 + 0 + 0 + + + 0 + 691 + 533 + 1 + 0 + + + 313 + 719 + 464 + 3 + 0 + + + 58 + 405 + 3518 + 0 + 1 + + + 45 + 252 + 632 + 4 + 0 + + + 205 + 161 + 115 + 0 + 0 + + + 70 + 149 + 333 + 0 + 0 + + + 70 + 189 + 98 + 0 + 0 + + + 428 + 716 + 466 + 6 + 0 + + + 70 + 160 + 310 + 0 + 0 + + + 284 + 642 + 681 + 0 + 0 + + + 70 + 148 + 125 + 0 + 0 + + + 26 + 72 + 689 + 0 + 0 + + + 70 + 93 + 199 + 0 + 0 + + + 70 + 83 + 223 + 0 + 0 + + + 143 + 264 + 2953 + 2 + 0 + + + 284 + 663 + 711 + 0 + 0 + + + 284 + 630 + 694 + 2 + 0 + + + 70 + 173 + 287 + 0 + 0 + + + 20 + 150 + 593 + 0 + 0 + + + 70 + 106 + 175 + 0 + 0 + + + 70 + 70 + 265 + 0 + 0 + + + 38 + 271 + 441 + 1 + 1 + + + 68 + 631 + 473 + 2 + 0 + + + 313 + 699 + 527 + 3 + 0 + + + 34 + 681 + 490 + 0 + 0 + + + 1 + 190 + 628 + 0 + 0 + + + 0 + 593 + 678 + 4 + 0 + + + 113 + 474 + 704 + 0 + 0 + + + 4 + 107 + 462 + 0 + 0 + + + 70 + 57 + 326 + 0 + 0 + + + 70 + 163 + 114 + 0 + 0 + + + 283 + 505 + 453 + 0 + 0 + + + 668 + 729 + 505 + 0 + 0 + + + 1 + 187 + 638 + 0 + 0 + + + 313 + 755 + 442 + 3 + 0 + + + 70 + 49 + 379 + 0 + 0 + + + 70 + 174 + 284 + 0 + 0 + + + 4 + 98 + 190 + 0 + 0 + + + 4 + 207 + 430 + 0 + 0 + + + 313 + 681 + 438 + 3 + 0 + + + 7 + 534 + 753 + 2 + 0 + + + 284 + 665 + 709 + 2 + 0 + + + 70 + 315 + 157 + 0 + 0 + + + 7 + 253 + 630 + 2 + 0 + + + 0 + 636 + 469 + 5 + 0 + + + 20 + 115 + 430 + 0 + 0 + + + 146 + 602 + 726 + 2 + 0 + + + 23 + 637 + 578 + 0 + 0 + + + 217 + 65 + 286 + 6 + 0 + + + 196 + 163 + 546 + 0 + 0 + + + 4 + 74 + 252 + 0 + 0 + + + 4 + 63 + 296 + 0 + 0 + + + 377 + 613 + 713 + 2 + 0 + + + 0 + 92 + 538 + 7 + 0 + + + 70 + 300 + 165 + 0 + 0 + + + 70 + 132 + 375 + 0 + 0 + + + 70 + 91 + 205 + 0 + 0 + + + 38 + 291 + 306 + 0 + 0 + + + 47 + 493 + 386 + 4 + 0 + + + 70 + 280 + 318 + 0 + 0 + + + 70 + 136 + 137 + 0 + 0 + + + 3 + 306 + 521 + 4 + 0 + + + 153 + 520 + 440 + 0 + 0 + + + 445 + 654 + 563 + 6 + 0 + + + 4 + 213 + 418 + 0 + 0 + + + 4 + 125 + 149 + 0 + 0 + + + 45 + 102 + 485 + 4 + 0 + + + 962 + 634 + 798 + 4 + 0 + + + 284 + 639 + 684 + 0 + 0 + + + 1 + 284 + 670 + 0 + 0 + + + 7 + 136 + 655 + 4 + 0 + + + 70 + 244 + 203 + 0 + 0 + + + 597 + 732 + 456 + 0 + 0 + + + 4 + 75 + 249 + 0 + 0 + + + 284 + 628 + 696 + 2 + 0 + + + 38 + 183 + 102 + 0 + 0 + + + 273 + 486 + 542 + 0 + 0 + + + 313 + 673 + 496 + 3 + 0 + + + 71 + 104 + 476 + 2 + 0 + + + 20 + 620 + 705 + 4 + 0 + + + 70 + 242 + 368 + 0 + 0 + + + 383 + 519 + 440 + 4 + 0 + + + 597 + 731 + 456 + 0 + 0 + + + 70 + 128 + 146 + 0 + 0 + + + 37 + 346 + 660 + 2 + 0 + + + 283 + 503 + 454 + 0 + 0 + + + 284 + 657 + 717 + 0 + 0 + + + 0 + 288 + 660 + 0 + 0 + + + 3 + 218 + 549 + 6 + 0 + + + 394 + 499 + 668 + 1 + 0 + + + 284 + 671 + 702 + 2 + 0 + + + 4 + 237 + 208 + 0 + 0 + + + 70 + 156 + 316 + 0 + 0 + + + 3 + 93 + 530 + 6 + 0 + + + 597 + 746 + 494 + 2 + 0 + + + 70 + 300 + 399 + 0 + 0 + + + 3 + 254 + 628 + 4 + 0 + + + 597 + 694 + 531 + 4 + 0 + + + 597 + 672 + 496 + 6 + 0 + + + 97 + 654 + 668 + 6 + 0 + + + 70 + 175 + 107 + 0 + 0 + + + 70 + 60 + 312 + 0 + 0 + + + 389 + 658 + 664 + 4 + 0 + + + 0 + 730 + 551 + 3 + 0 + + + 21 + 252 + 633 + 6 + 0 + + + 306 + 680 + 542 + 5 + 0 + + + 1 + 648 + 727 + 1 + 0 + + + 0 + 670 + 445 + 5 + 0 + + + 70 + 261 + 189 + 0 + 0 + + + 4 + 285 + 311 + 0 + 0 + + + 70 + 86 + 218 + 0 + 0 + + + 37 + 469 + 487 + 0 + 0 + + + 215 + 66 + 284 + 2 + 0 + + + 11 + 629 + 749 + 0 + 0 + + + 70 + 192 + 257 + 0 + 0 + + + 284 + 626 + 698 + 2 + 0 + + + 34 + 760 + 485 + 3 + 0 + + + 70 + 210 + 235 + 0 + 0 + + + 306 + 511 + 447 + 0 + 0 + + + 1 + 508 + 587 + 0 + 0 + + + 97 + 179 + 669 + 2 + 0 + + + 597 + 679 + 491 + 6 + 0 + + + 70 + 220 + 403 + 0 + 0 + + + 33 + 479 + 696 + 2 + 0 + + + 34 + 368 + 716 + 0 + 0 + + + 178 + 229 + 523 + 2 + 0 + + + 284 + 637 + 686 + 0 + 0 + + + 5 + 494 + 385 + 0 + 0 + + + 37 + 295 + 541 + 4 + 0 + + + 1 + 136 + 652 + 0 + 1 + + + 70 + 116 + 162 + 0 + 0 + + + 294 + 472 + 484 + 0 + 0 + + + 4 + 74 + 254 + 0 + 0 + + + 1 + 186 + 644 + 0 + 0 + + + 1 + 184 + 651 + 0 + 0 + + + 32 + 477 + 699 + 2 + 0 + + + 7 + 135 + 657 + 0 + 0 + + + 285 + 475 + 481 + 0 + 0 + + + 70 + 100 + 188 + 0 + 0 + + + 1 + 349 + 545 + 0 + 0 + + + 0 + 89 + 555 + 7 + 0 + + + 70 + 200 + 247 + 0 + 0 + + + 718 + 736 + 453 + 0 + 0 + + + 19 + 261 + 459 + 4 + 0 + + + 402 + 618 + 819 + 0 + 0 + + + 4 + 305 + 392 + 0 + 0 + + + 70 + 203 + 589 + 0 + 0 + + + 405 + 469 + 711 + 7 + 0 + + + 70 + 192 + 256 + 0 + 0 + + + 284 + 659 + 715 + 0 + 0 + + + 398 + 473 + 705 + 6 + 0 + + + 306 + 512 + 582 + 0 + 0 + + + 313 + 751 + 444 + 3 + 0 + + + 395 + 475 + 702 + 1 + 0 + + + 70 + 69 + 273 + 0 + 0 + + + 34 + 351 + 651 + 4 + 0 + + + 97 + 179 + 668 + 0 + 0 + + + 70 + 196 + 251 + 0 + 0 + + + 58 + 204 + 435 + 4 + 0 + + + 24 + 176 + 107 + 0 + 1 + + + 34 + 517 + 442 + 0 + 0 + + + 5 + 104 + 473 + 0 + 0 + + + 1 + 173 + 513 + 0 + 0 + + + 4 + 199 + 601 + 0 + 0 + + + 377 + 666 + 760 + 6 + 0 + + + 70 + 76 + 248 + 0 + 0 + + + 4 + 52 + 363 + 0 + 0 + + + 286 + 524 + 495 + 0 + 0 + + + 0 + 481 + 395 + 6 + 0 + + + 37 + 299 + 534 + 4 + 0 + + + 70 + 89 + 212 + 0 + 0 + + + 34 + 621 + 537 + 6 + 0 + + + 5 + 714 + 516 + 0 + 0 + + + 395 + 484 + 689 + 6 + 0 + + + 51 + 278 + 2974 + 4 + 0 + + + 220 + 120 + 410 + 0 + 0 + + + 0 + 89 + 553 + 7 + 0 + + + 668 + 734 + 502 + 0 + 0 + + + 100 + 562 + 716 + 0 + 0 + + + 119 + 691 + 682 + 0 + 0 + + + 36 + 127 + 699 + 6 + 0 + + + 70 + 265 + 335 + 0 + 0 + + + 1 + 606 + 664 + 2 + 0 + + + 70 + 230 + 214 + 0 + 0 + + + 45 + 605 + 722 + 6 + 0 + + + 8 + 107 + 460 + 3 + 0 + + + 70 + 137 + 138 + 0 + 0 + + + 1 + 554 + 602 + 1 + 1 + + + 70 + 62 + 305 + 0 + 0 + + + 88 + 644 + 786 + 7 + 0 + + + 718 + 733 + 455 + 2 + 0 + + + 36 + 375 + 703 + 0 + 0 + + + 284 + 650 + 672 + 0 + 0 + + + 306 + 600 + 728 + 2 + 0 + + + 284 + 624 + 700 + 2 + 0 + + + 1 + 191 + 465 + 0 + 0 + + + 70 + 159 + 119 + 0 + 0 + + + 284 + 661 + 713 + 2 + 0 + + + 0 + 688 + 685 + 2 + 0 + + + 4 + 250 + 197 + 0 + 0 + + + 38 + 125 + 394 + 0 + 0 + + + 1 + 543 + 549 + 0 + 0 + + + 103 + 523 + 570 + 0 + 0 + + + 37 + 264 + 605 + 2 + 0 + + + 4 + 72 + 263 + 0 + 0 + + + 70 + 142 + 347 + 0 + 0 + + + 307 + 654 + 510 + 2 + 0 + + + 1 + 540 + 552 + 0 + 0 + + + 70 + 177 + 107 + 0 + 0 + + + 205 + 649 + 780 + 0 + 0 + + + 36 + 381 + 692 + 0 + 0 + + + 63 + 71 + 694 + 2 + 0 + + + 34 + 710 + 519 + 2 + 0 + + + 3 + 306 + 522 + 4 + 0 + + + 38 + 244 + 364 + 0 + 0 + + + 27 + 101 + 496 + 4 + 0 + + + 205 + 59 + 322 + 0 + 0 + + + 597 + 746 + 493 + 2 + 0 + + + 4 + 83 + 229 + 0 + 0 + + + 70 + 181 + 105 + 0 + 0 + + + 306 + 515 + 445 + 0 + 0 + + + 51 + 622 + 702 + 6 + 0 + + + 70 + 157 + 319 + 0 + 0 + + + 37 + 294 + 540 + 4 + 0 + + + 3 + 252 + 630 + 2 + 0 + + + 4 + 189 + 265 + 0 + 0 + + + 70 + 226 + 391 + 0 + 0 + + + 1 + 188 + 470 + 0 + 0 + + + 179 + 227 + 524 + 6 + 0 + + + 396 + 536 + 749 + 1 + 0 + + + 70 + 101 + 188 + 0 + 0 + + + 38 + 188 + 101 + 0 + 0 + + + 36 + 522 + 439 + 0 + 0 + + + 402 + 617 + 821 + 0 + 0 + + + 70 + 242 + 207 + 0 + 0 + + + 38 + 120 + 158 + 0 + 0 + + + 70 + 149 + 336 + 0 + 0 + + + 70 + 147 + 129 + 0 + 0 + + + 1 + 586 + 685 + 0 + 0 + + + 70 + 326 + 271 + 0 + 0 + + + 70 + 321 + 156 + 0 + 0 + + + 34 + 699 + 675 + 2 + 0 + + + 70 + 272 + 184 + 0 + 0 + + + 306 + 763 + 482 + 3 + 0 + + + 205 + 335 + 355 + 0 + 0 + + + 0 + 648 + 514 + 6 + 0 + + + 205 + 514 + 446 + 0 + 0 + + + 70 + 207 + 575 + 0 + 0 + + + 70 + 220 + 228 + 0 + 0 + + + 151 + 521 + 440 + 0 + 0 + + + 55 + 695 + 679 + 2 + 0 + + + 70 + 48 + 397 + 0 + 0 + + + 938 + 691 + 632 + 0 + 0 + + + 1 + 179 + 665 + 0 + 0 + + + 4 + 131 + 383 + 0 + 0 + + + 3 + 134 + 660 + 0 + 0 + + + 284 + 632 + 691 + 2 + 0 + + + 70 + 223 + 225 + 0 + 0 + + + 0 + 613 + 655 + 3 + 0 + + + 1 + 619 + 483 + 0 + 0 + + + 37 + 298 + 533 + 4 + 0 + + + 14 + 618 + 1561 + 4 + 0 + + + 70 + 252 + 199 + 0 + 0 + + + 70 + 126 + 398 + 0 + 0 + + + 4 + 92 + 207 + 0 + 0 + + + 4 + 680 + 694 + 0 + 0 + + + 7 + 135 + 655 + 0 + 0 + + + 38 + 185 + 103 + 0 + 0 + + + 1 + 294 + 646 + 0 + 0 + + + 97 + 612 + 656 + 3 + 0 + + + 3 + 104 + 482 + 0 + 0 + + + 283 + 493 + 535 + 0 + 0 + + + 20 + 115 + 436 + 0 + 0 + + + 3 + 106 + 473 + 2 + 0 + + + 394 + 638 + 794 + 4 + 0 + + + 286 + 169 + 523 + 3 + 0 + + + 192 + 661 + 504 + 4 + 0 + + + 597 + 752 + 443 + 2 + 0 + + + 284 + 646 + 676 + 0 + 0 + + + 286 + 495 + 673 + 1 + 0 + + + 36 + 127 + 696 + 6 + 0 + + + 63 + 495 + 463 + 2 + 0 + + + 20 + 603 + 610 + 0 + 0 + + + 70 + 74 + 257 + 0 + 0 + + + 0 + 182 + 653 + 0 + 0 + + + 196 + 163 + 543 + 0 + 0 + + + 938 + 694 + 629 + 0 + 0 + + + 70 + 285 + 417 + 0 + 0 + + + 284 + 641 + 681 + 2 + 0 + + + 4 + 53 + 361 + 0 + 0 + + + 70 + 134 + 373 + 0 + 0 + + + 26 + 255 + 466 + 6 + 0 + + + 283 + 609 + 775 + 0 + 0 + + + 70 + 153 + 125 + 0 + 0 + + + 718 + 734 + 454 + 2 + 0 + + + 1 + 307 + 618 + 2 + 0 + + + 15 + 484 + 392 + 0 + 0 + + + 45 + 103 + 485 + 4 + 0 + + + 3 + 253 + 628 + 4 + 0 + + + 34 + 373 + 696 + 0 + 0 + + + 205 + 72 + 265 + 0 + 0 + + + 70 + 267 + 187 + 0 + 0 + + + 396 + 539 + 745 + 1 + 0 + + + 1 + 228 + 521 + 0 + 1 + + + 70 + 240 + 208 + 0 + 0 + + + 70 + 260 + 192 + 0 + 0 + + + 34 + 422 + 708 + 0 + 0 + + + 70 + 318 + 157 + 0 + 0 + + + 284 + 661 + 714 + 2 + 0 + + + 97 + 178 + 668 + 1 + 0 + + + 100 + 693 + 630 + 0 + 0 + + + 70 + 221 + 538 + 0 + 0 + + + 3 + 215 + 553 + 2 + 0 + + + 70 + 106 + 181 + 0 + 0 + + + 20 + 118 + 424 + 0 + 0 + + + 0 + 199 + 445 + 0 + 0 + + + 51 + 532 + 755 + 2 + 0 + + + 284 + 663 + 712 + 2 + 0 + + + 1 + 75 + 667 + 0 + 1 + + + 70 + 151 + 127 + 0 + 0 + + + 284 + 630 + 693 + 2 + 0 + + + 284 + 643 + 679 + 2 + 0 + + + 214 + 67 + 286 + 7 + 0 + + + 205 + 295 + 403 + 0 + 0 + + + 281 + 94 + 532 + 6 + 0 + + + 1 + 603 + 666 + 2 + 0 + + + 70 + 223 + 397 + 0 + 0 + + + 70 + 72 + 266 + 0 + 0 + + + 34 + 616 + 541 + 6 + 0 + + + 51 + 608 + 718 + 4 + 0 + + + 45 + 541 + 616 + 4 + 0 + + + 70 + 165 + 303 + 0 + 0 + + + 5 + 690 + 483 + 4 + 0 + + + 188 + 290 + 548 + 0 + 0 + + + 88 + 213 + 558 + 0 + 0 + + + 70 + 288 + 173 + 0 + 0 + + + 70 + 173 + 288 + 0 + 0 + + + 718 + 748 + 445 + 0 + 0 + + + 103 + 569 + 706 + 0 + 0 + + + 70 + 53 + 363 + 0 + 0 + + + 70 + 252 + 473 + 6 + 0 + + + 4 + 65 + 296 + 0 + 0 + + + 70 + 267 + 330 + 0 + 0 + + + 34 + 295 + 539 + 4 + 0 + + + 1 + 182 + 655 + 0 + 0 + + + 4 + 178 + 280 + 0 + 0 + + + 4 + 131 + 147 + 0 + 0 + + + 70 + 248 + 201 + 0 + 0 + + + 4 + 60 + 321 + 0 + 0 + + + 70 + 107 + 180 + 0 + 0 + + + 284 + 627 + 696 + 0 + 0 + + + 284 + 638 + 684 + 0 + 0 + + + 284 + 667 + 707 + 0 + 0 + + + 20 + 115 + 433 + 0 + 0 + + + 70 + 193 + 258 + 0 + 0 + + + 36 + 376 + 702 + 0 + 0 + + + 23 + 300 + 530 + 4 + 0 + + + 38 + 129 + 149 + 0 + 0 + + + 7 + 628 + 586 + 0 + 0 + + + 0 + 674 + 546 + 1 + 0 + + + 407 + 618 + 820 + 0 + 0 + + + 1 + 617 + 651 + 7 + 0 + + + 1 + 137 + 643 + 0 + 0 + + + 284 + 656 + 719 + 0 + 0 + + + 32 + 535 + 751 + 0 + 0 + + + 34 + 299 + 532 + 4 + 0 + + + 0 + 526 + 502 + 0 + 0 + + + 70 + 157 + 123 + 0 + 0 + + + 34 + 751 + 535 + 3 + 0 + + + 4 + 308 + 162 + 0 + 0 + + + 962 + 654 + 775 + 3 + 0 + + + 4 + 221 + 399 + 0 + 0 + + + 32 + 374 + 706 + 0 + 0 + + + 45 + 602 + 725 + 0 + 0 + + + 313 + 712 + 517 + 3 + 0 + + + 1 + 138 + 639 + 0 + 0 + + + 214 + 68 + 284 + 2 + 0 + + + 110 + 525 + 569 + 0 + 0 + + + 284 + 628 + 695 + 2 + 0 + + + 32 + 381 + 693 + 0 + 0 + + + 38 + 119 + 419 + 0 + 0 + + + 283 + 607 + 777 + 0 + 0 + + + 1 + 184 + 648 + 0 + 0 + + + 34 + 654 + 509 + 6 + 0 + + + 70 + 112 + 172 + 0 + 0 + + + 70 + 172 + 112 + 0 + 0 + + + 284 + 669 + 705 + 0 + 0 + + + 70 + 81 + 238 + 0 + 0 + + + 597 + 730 + 456 + 0 + 0 + + + 38 + 61 + 316 + 0 + 0 + + + 0 + 92 + 542 + 7 + 0 + + + 1 + 607 + 835 + 0 + 0 + + + 48 + 220 + 542 + 6 + 0 + + + 1 + 485 + 391 + 0 + 1 + + + 283 + 501 + 457 + 0 + 0 + + + 25 + 213 + 3519 + 0 + 0 + + + 417 + 619 + 649 + 7 + 0 + + + 70 + 145 + 344 + 0 + 0 + + + 5 + 333 + 569 + 0 + 0 + + + 1 + 171 + 516 + 0 + 0 + + + 7 + 253 + 629 + 0 + 0 + + + 34 + 298 + 534 + 4 + 0 + + + 97 + 178 + 669 + 0 + 0 + + + 1 + 181 + 658 + 0 + 0 + + + 284 + 671 + 703 + 2 + 0 + + + 38 + 239 + 208 + 0 + 0 + + + 63 + 104 + 478 + 0 + 0 + + + 207 + 60 + 323 + 0 + 0 + + + 7 + 346 + 662 + 2 + 0 + + + 406 + 291 + 651 + 4 + 0 + + + 71 + 487 + 389 + 0 + 0 + + + 938 + 687 + 635 + 0 + 0 + + + 205 + 231 + 215 + 0 + 0 + + + 718 + 735 + 453 + 2 + 0 + + + 38 + 151 + 128 + 0 + 0 + + + 1 + 186 + 640 + 0 + 0 + + + 3 + 559 + 534 + 0 + 0 + + + 37 + 347 + 660 + 1 + 0 + + + 59 + 148 + 596 + 2 + 0 + + + 38 + 675 + 545 + 6 + 0 + + + 68 + 685 + 637 + 0 + 0 + + + 597 + 693 + 531 + 4 + 0 + + + 70 + 123 + 158 + 0 + 0 + + + 37 + 630 + 474 + 3 + 0 + + + 38 + 313 + 159 + 0 + 0 + + + 70 + 185 + 105 + 0 + 0 + + + 69 + 652 + 458 + 2 + 0 + + + 70 + 283 + 421 + 0 + 0 + + + 377 + 665 + 762 + 5 + 0 + + + 284 + 658 + 717 + 0 + 0 + + + 205 + 127 + 392 + 0 + 0 + + + 284 + 626 + 697 + 2 + 0 + + + 194 + 596 + 501 + 4 + 0 + + + 4 + 62 + 313 + 0 + 0 + + + 70 + 281 + 177 + 0 + 0 + + + 0 + 638 + 468 + 5 + 0 + + + 4 + 61 + 318 + 0 + 0 + + + 70 + 52 + 373 + 0 + 0 + + + 284 + 636 + 686 + 0 + 0 + + + 15 + 441 + 677 + 4 + 0 + + + 70 + 316 + 377 + 0 + 0 + + + 3 + 234 + 507 + 2 + 0 + + + 70 + 59 + 373 + 0 + 0 + + + 70 + 213 + 265 + 0 + 0 + + + 34 + 86 + 656 + 0 + 0 + + + 284 + 624 + 705 + 2 + 0 + + + 106 + 223 + 253 + 4 + 0 + + + 70 + 313 + 379 + 0 + 0 + + + 1 + 124 + 455 + 0 + 1 + + + 104 + 229 + 518 + 4 + 0 + + + 1 + 633 + 695 + 0 + 0 + + + 70 + 156 + 141 + 0 + 0 + + + 70 + 190 + 297 + 0 + 0 + + + 597 + 746 + 443 + 4 + 0 + + + 34 + 301 + 534 + 4 + 0 + + + 70 + 169 + 130 + 0 + 0 + + + 25 + 450 + 492 + 3 + 0 + + + 7 + 120 + 470 + 4 + 0 + + + 143 + 648 + 632 + 0 + 0 + + + 284 + 632 + 696 + 2 + 0 + + + 0 + 180 + 659 + 0 + 0 + + + 7 + 119 + 474 + 4 + 0 + + + 37 + 627 + 477 + 0 + 0 + + + 395 + 624 + 803 + 0 + 0 + + + 70 + 112 + 196 + 0 + 0 + + + 284 + 654 + 719 + 0 + 0 + + + 70 + 195 + 429 + 0 + 0 + + + 107 + 222 + 254 + 0 + 0 + + + 310 + 521 + 492 + 0 + 0 + + + 284 + 667 + 705 + 0 + 0 + + + 29 + 359 + 714 + 0 + 0 + + + 70 + 205 + 275 + 0 + 0 + + + 97 + 276 + 303 + 6 + 0 + + + 70 + 308 + 385 + 0 + 0 + + + 1 + 48 + 457 + 1 + 0 + + + 37 + 483 + 404 + 0 + 0 + + + 205 + 324 + 366 + 0 + 0 + + + 70 + 59 + 372 + 0 + 0 + + + 70 + 62 + 354 + 0 + 0 + + + 1 + 185 + 641 + 0 + 0 + + + 597 + 672 + 445 + 6 + 0 + + + 33 + 379 + 709 + 0 + 0 + + + 34 + 120 + 697 + 6 + 0 + + + 4 + 63 + 348 + 0 + 0 + + + 34 + 297 + 541 + 4 + 0 + + + 38 + 706 + 666 + 0 + 0 + + + 359 + 426 + 458 + 4 + 0 + + + 70 + 195 + 289 + 0 + 0 + + + 1 + 163 + 513 + 1 + 1 + + + 1 + 185 + 452 + 0 + 0 + + + 205 + 113 + 194 + 0 + 0 + + + 284 + 489 + 399 + 6 + 0 + + + 70 + 241 + 347 + 0 + 0 + + + 4 + 244 + 231 + 0 + 0 + + + 0 + 358 + 545 + 0 + 0 + + + 70 + 286 + 197 + 0 + 0 + + + 306 + 696 + 519 + 1 + 0 + + + 284 + 643 + 684 + 0 + 0 + + + 106 + 229 + 246 + 4 + 0 + + + 15 + 561 + 533 + 0 + 0 + + + 22 + 651 + 629 + 4 + 0 + + + 217 + 78 + 281 + 0 + 0 + + + 562 + 664 + 544 + 0 + 0 + + + 70 + 317 + 374 + 0 + 0 + + + 284 + 665 + 707 + 0 + 0 + + + 1 + 277 + 580 + 0 + 0 + + + 45 + 425 + 459 + 6 + 0 + + + 70 + 176 + 320 + 0 + 0 + + + 0 + 750 + 546 + 3 + 0 + + + 70 + 92 + 238 + 0 + 0 + + + 114 + 615 + 715 + 0 + 1 + + + 25 + 448 + 494 + 3 + 0 + + + 70 + 251 + 333 + 0 + 0 + + + 22 + 273 + 435 + 0 + 1 + + + 51 + 266 + 2965 + 2 + 0 + + + 445 + 642 + 563 + 6 + 0 + + + 38 + 708 + 664 + 0 + 0 + + + 0 + 617 + 485 + 0 + 0 + + + 34 + 703 + 713 + 2 + 0 + + + 46 + 450 + 434 + 2 + 0 + + + 1 + 177 + 671 + 0 + 0 + + + 34 + 505 + 532 + 0 + 0 + + + 12 + 174 + 325 + 0 + 0 + + + 70 + 195 + 290 + 0 + 0 + + + 0 + 130 + 435 + 0 + 0 + + + 1 + 190 + 625 + 0 + 0 + + + 205 + 548 + 468 + 0 + 0 + + + 70 + 245 + 341 + 0 + 0 + + + 34 + 749 + 441 + 7 + 0 + + + 70 + 306 + 273 + 0 + 0 + + + 70 + 221 + 378 + 0 + 0 + + + 34 + 181 + 656 + 1 + 0 + + + 70 + 328 + 362 + 0 + 0 + + + 284 + 452 + 432 + 4 + 0 + + + 9 + 119 + 475 + 0 + 0 + + + 45 + 538 + 614 + 0 + 0 + + + 0 + 627 + 653 + 0 + 0 + + + 36 + 504 + 439 + 0 + 0 + + + 284 + 649 + 678 + 0 + 0 + + + 70 + 88 + 248 + 0 + 0 + + + 70 + 74 + 295 + 0 + 0 + + + 37 + 754 + 543 + 3 + 0 + + + 70 + 68 + 321 + 0 + 0 + + + 34 + 428 + 699 + 0 + 0 + + + 4 + 277 + 204 + 0 + 0 + + + 70 + 139 + 157 + 0 + 0 + + + 0 + 299 + 537 + 6 + 0 + + + 0 + 129 + 438 + 0 + 0 + + + 45 + 166 + 503 + 6 + 0 + + + 34 + 291 + 671 + 0 + 0 + + + 284 + 482 + 459 + 2 + 0 + + + 98 + 649 + 461 + 2 + 0 + + + 377 + 668 + 541 + 6 + 0 + + + 32 + 381 + 705 + 0 + 0 + + + 284 + 663 + 709 + 0 + 0 + + + 205 + 77 + 283 + 0 + 0 + + + 3 + 215 + 552 + 2 + 0 + + + 37 + 184 + 645 + 0 + 0 + + + 4 + 156 + 362 + 0 + 0 + + + 45 + 254 + 632 + 4 + 0 + + + 12 + 177 + 319 + 6 + 0 + + + 7 + 109 + 518 + 6 + 0 + + + 70 + 180 + 121 + 0 + 0 + + + 70 + 173 + 686 + 0 + 0 + + + 1 + 555 + 539 + 0 + 0 + + + 1 + 179 + 663 + 0 + 0 + + + 37 + 488 + 400 + 0 + 0 + + + 117 + 606 + 726 + 4 + 0 + + + 284 + 647 + 680 + 2 + 0 + + + 1 + 614 + 1564 + 1 + 1 + + + 70 + 319 + 177 + 0 + 0 + + + 310 + 519 + 494 + 0 + 0 + + + 0 + 625 + 655 + 0 + 0 + + + 4 + 70 + 311 + 0 + 0 + + + 3 + 123 + 459 + 0 + 0 + + + 16 + 256 + 627 + 4 + 0 + + + 70 + 194 + 291 + 0 + 0 + + + 37 + 482 + 405 + 0 + 0 + + + 70 + 170 + 128 + 0 + 0 + + + 70 + 184 + 308 + 0 + 0 + + + 205 + 161 + 352 + 0 + 0 + + + 70 + 112 + 194 + 0 + 0 + + + 597 + 680 + 531 + 4 + 0 + + + 34 + 86 + 659 + 0 + 0 + + + 1 + 695 + 677 + 2 + 1 + + + 2 + 349 + 635 + 1 + 1 + + + 21 + 594 + 504 + 0 + 0 + + + 70 + 52 + 418 + 0 + 0 + + + 1 + 109 + 520 + 1 + 1 + + + 284 + 655 + 672 + 0 + 0 + + + 597 + 746 + 484 + 2 + 0 + + + 70 + 91 + 239 + 0 + 0 + + + 36 + 505 + 439 + 0 + 0 + + + 37 + 300 + 535 + 4 + 0 + + + 70 + 152 + 373 + 0 + 0 + + + 70 + 146 + 149 + 0 + 0 + + + 104 + 229 + 517 + 4 + 0 + + + 70 + 252 + 225 + 0 + 0 + + + 29 + 84 + 675 + 0 + 0 + + + 70 + 64 + 339 + 0 + 0 + + + 0 + 693 + 521 + 1 + 0 + + + 157 + 536 + 617 + 4 + 0 + + + 70 + 236 + 240 + 0 + 0 + + + 7 + 120 + 472 + 0 + 0 + + + 37 + 654 + 673 + 5 + 0 + + + 7 + 119 + 476 + 0 + 0 + + + 70 + 206 + 275 + 0 + 0 + + + 70 + 194 + 292 + 0 + 0 + + + 192 + 762 + 434 + 0 + 0 + + + 33 + 375 + 716 + 0 + 0 + + + 70 + 184 + 118 + 0 + 0 + + + 4 + 225 + 373 + 0 + 0 + + + 284 + 658 + 715 + 0 + 0 + + + 278 + 614 + 588 + 0 + 0 + + + 1 + 323 + 605 + 2 + 0 + + + 1 + 113 + 501 + 1 + 1 + + + 34 + 427 + 701 + 0 + 0 + + + 0 + 296 + 660 + 0 + 0 + + + 4 + 313 + 268 + 0 + 0 + + + 70 + 56 + 387 + 0 + 0 + + + 20 + 444 + 440 + 6 + 0 + + + 0 + 664 + 498 + 6 + 0 + + + 70 + 242 + 234 + 0 + 0 + + + 38 + 156 + 363 + 0 + 0 + + + 34 + 179 + 661 + 2 + 0 + + + 8 + 232 + 510 + 1 + 0 + + + 34 + 129 + 439 + 0 + 0 + + + 0 + 760 + 475 + 0 + 0 + + + 70 + 235 + 357 + 0 + 0 + + + 70 + 219 + 99 + 0 + 0 + + + 70 + 80 + 271 + 0 + 0 + + + 1 + 117 + 484 + 6 + 0 + + + 70 + 206 + 407 + 0 + 0 + + + 284 + 626 + 703 + 2 + 0 + + + 21 + 588 + 509 + 0 + 0 + + + 70 + 128 + 169 + 0 + 0 + + + 205 + 208 + 104 + 0 + 0 + + + 46 + 447 + 437 + 2 + 0 + + + 1 + 128 + 442 + 0 + 0 + + + 37 + 297 + 540 + 4 + 0 + + + 70 + 249 + 475 + 6 + 0 + + + 284 + 492 + 397 + 6 + 0 + + + 4 + 79 + 274 + 0 + 0 + + + 1 + 188 + 446 + 0 + 0 + + + 1 + 191 + 439 + 0 + 0 + + + 110 + 230 + 246 + 4 + 0 + + + 70 + 245 + 231 + 0 + 0 + + + 283 + 445 + 439 + 4 + 0 + + + 562 + 666 + 542 + 0 + 0 + + + 284 + 657 + 716 + 2 + 0 + + + 205 + 318 + 372 + 0 + 0 + + + 1 + 612 + 489 + 0 + 0 + + + 597 + 672 + 492 + 6 + 0 + + + 284 + 651 + 676 + 0 + 0 + + + 183 + 473 + 699 + 2 + 0 + + + 4 + 241 + 348 + 0 + 0 + + + 1 + 301 + 649 + 0 + 0 + + + 70 + 119 + 182 + 0 + 0 + + + 34 + 389 + 690 + 0 + 0 + + + 1 + 302 + 531 + 4 + 0 + + + 70 + 316 + 375 + 0 + 0 + + + 70 + 90 + 240 + 0 + 0 + + + 70 + 291 + 288 + 0 + 0 + + + 55 + 563 + 532 + 0 + 0 + + + 310 + 524 + 489 + 0 + 0 + + + 5 + 350 + 633 + 0 + 0 + + + 285 + 488 + 454 + 0 + 0 + + + 1 + 497 + 540 + 6 + 0 + + + 313 + 711 + 508 + 3 + 0 + + + 70 + 212 + 102 + 0 + 0 + + + 111 + 231 + 246 + 0 + 0 + + + 1 + 168 + 499 + 0 + 1 + + + 284 + 671 + 701 + 2 + 0 + + + 192 + 760 + 435 + 0 + 0 + + + 205 + 92 + 235 + 0 + 0 + + + 70 + 58 + 372 + 0 + 0 + + + 34 + 754 + 479 + 3 + 0 + + + 114 + 306 + 639 + 0 + 0 + + + 286 + 596 + 606 + 4 + 0 + + + 407 + 637 + 567 + 0 + 0 + + + 0 + 714 + 463 + 3 + 0 + + + 15 + 109 + 521 + 4 + 0 + + + 306 + 702 + 670 + 4 + 0 + + + 1 + 164 + 511 + 0 + 1 + + + 12 + 185 + 307 + 2 + 0 + + + 23 + 484 + 404 + 0 + 0 + + + 21 + 465 + 644 + 6 + 0 + + + 70 + 205 + 277 + 0 + 0 + + + 0 + 319 + 613 + 2 + 0 + + + 70 + 208 + 273 + 0 + 0 + + + 70 + 85 + 254 + 0 + 0 + + + 1 + 121 + 469 + 0 + 1 + + + 12 + 173 + 328 + 0 + 0 + + + 45 + 425 + 460 + 6 + 0 + + + 1 + 179 + 468 + 0 + 0 + + + 114 + 619 + 711 + 1 + 1 + + + 0 + 599 + 683 + 4 + 0 + + + 70 + 217 + 386 + 0 + 0 + + + 284 + 628 + 701 + 2 + 0 + + + 274 + 618 + 761 + 2 + 0 + + + 33 + 479 + 690 + 2 + 0 + + + 718 + 728 + 454 + 0 + 0 + + + 0 + 182 + 460 + 0 + 0 + + + 16 + 256 + 626 + 4 + 0 + + + 38 + 690 + 638 + 0 + 0 + + + 284 + 655 + 718 + 2 + 0 + + + 70 + 207 + 572 + 0 + 0 + + + 3 + 281 + 298 + 0 + 0 + + + 38 + 61 + 353 + 0 + 0 + + + 0 + 757 + 477 + 0 + 0 + + + 13 + 183 + 310 + 3 + 0 + + + 205 + 73 + 295 + 0 + 0 + + + 1 + 542 + 495 + 0 + 0 + + + 37 + 629 + 476 + 2 + 0 + + + 34 + 682 + 439 + 3 + 0 + + + 938 + 693 + 634 + 0 + 0 + + + 34 + 699 + 472 + 3 + 0 + + + 70 + 207 + 275 + 0 + 0 + + + 20 + 99 + 575 + 0 + 0 + + + 286 + 159 + 523 + 3 + 0 + + + 70 + 144 + 156 + 0 + 0 + + + 70 + 192 + 117 + 0 + 0 + + + 55 + 150 + 554 + 0 + 1 + + + 20 + 543 + 473 + 0 + 0 + + + 0 + 766 + 471 + 0 + 0 + + + 70 + 59 + 381 + 0 + 0 + + + 4 + 271 + 210 + 0 + 0 + + + 8 + 232 + 509 + 0 + 0 + + + 284 + 489 + 398 + 6 + 0 + + + 37 + 264 + 607 + 2 + 0 + + + 5 + 123 + 463 + 0 + 0 + + + 7 + 214 + 552 + 6 + 0 + + + 0 + 501 + 443 + 0 + 0 + + + 7 + 117 + 711 + 6 + 0 + + + 284 + 650 + 676 + 0 + 0 + + + 597 + 672 + 491 + 6 + 0 + + + 377 + 656 + 550 + 4 + 0 + + + 205 + 150 + 150 + 0 + 0 + + + 292 + 436 + 509 + 6 + 0 + + + 45 + 425 + 458 + 6 + 0 + + + 70 + 193 + 431 + 0 + 0 + + + 51 + 612 + 718 + 4 + 0 + + + 938 + 692 + 635 + 0 + 0 + + + 164 + 86 + 662 + 5 + 0 + + + 70 + 121 + 186 + 0 + 0 + + + 284 + 664 + 709 + 0 + 0 + + + 70 + 272 + 209 + 0 + 0 + + + 4 + 304 + 187 + 0 + 0 + + + 394 + 476 + 693 + 1 + 0 + + + 445 + 623 + 579 + 0 + 0 + + + 313 + 693 + 476 + 3 + 0 + + + 70 + 101 + 222 + 0 + 0 + + + 37 + 131 + 434 + 0 + 0 + + + 284 + 624 + 704 + 2 + 0 + + + 70 + 115 + 195 + 0 + 0 + + + 37 + 763 + 536 + 3 + 0 + + + 70 + 224 + 100 + 0 + 0 + + + 4 + 54 + 415 + 0 + 0 + + + 70 + 196 + 290 + 0 + 0 + + + 398 + 643 + 732 + 7 + 0 + + + 284 + 662 + 711 + 0 + 0 + + + 37 + 161 + 516 + 4 + 0 + + + 34 + 720 + 501 + 3 + 0 + + + 0 + 612 + 539 + 6 + 0 + + + 70 + 143 + 157 + 0 + 0 + + + 50 + 114 + 499 + 0 + 0 + + + 0 + 188 + 628 + 0 + 0 + + + 7 + 120 + 474 + 4 + 0 + + + 20 + 634 + 569 + 0 + 0 + + + 205 + 206 + 109 + 0 + 0 + + + 20 + 585 + 751 + 2 + 0 + + + 70 + 224 + 527 + 0 + 0 + + + 284 + 648 + 678 + 0 + 0 + + + 70 + 165 + 136 + 0 + 0 + + + 70 + 136 + 165 + 0 + 0 + + + 205 + 170 + 132 + 0 + 0 + + + 7 + 121 + 470 + 4 + 0 + + + 0 + 669 + 448 + 5 + 0 + + + 0 + 763 + 473 + 0 + 0 + + + 597 + 672 + 446 + 6 + 0 + + + 111 + 222 + 257 + 0 + 0 + + + 20 + 479 + 463 + 6 + 0 + + + 37 + 297 + 539 + 4 + 0 + + + 284 + 654 + 672 + 0 + 0 + + + 88 + 103 + 217 + 2 + 0 + + + 25 + 213 + 555 + 4 + 0 + + + 20 + 140 + 593 + 0 + 0 + + + 110 + 524 + 572 + 0 + 0 + + + 3 + 107 + 533 + 0 + 0 + + + 88 + 102 + 219 + 2 + 0 + + + 70 + 264 + 216 + 0 + 0 + + + 70 + 153 + 146 + 0 + 0 + + + 70 + 146 + 153 + 0 + 0 + + + 70 + 333 + 355 + 0 + 0 + + + 108 + 229 + 249 + 4 + 0 + + + 70 + 146 + 391 + 0 + 0 + + + 70 + 284 + 201 + 0 + 0 + + + 0 + 481 + 405 + 6 + 0 + + + 22 + 441 + 503 + 0 + 0 + + + 34 + 547 + 548 + 0 + 0 + + + 0 + 466 + 476 + 0 + 0 + + + 205 + 232 + 246 + 0 + 0 + + + 21 + 546 + 749 + 0 + 0 + + + 1 + 215 + 550 + 0 + 1 + + + 21 + 373 + 689 + 2 + 0 + + + 4 + 99 + 226 + 0 + 0 + + + 70 + 198 + 113 + 0 + 0 + + + 4 + 292 + 548 + 6 + 0 + + + 164 + 758 + 435 + 5 + 0 + + + 205 + 205 + 278 + 0 + 0 + + + 284 + 659 + 714 + 2 + 0 + + + 0 + 649 + 556 + 0 + 0 + + + 284 + 482 + 460 + 2 + 0 + + + 1133 + 498 + 391 + 0 + 0 + + + 4 + 244 + 340 + 0 + 0 + + + 4 + 272 + 305 + 0 + 0 + + + 38 + 308 + 185 + 0 + 0 + + + 285 + 488 + 399 + 0 + 0 + + + 3 + 110 + 518 + 2 + 0 + + + 284 + 626 + 702 + 2 + 0 + + + 377 + 635 + 790 + 0 + 0 + + + 1 + 178 + 466 + 0 + 0 + + + 70 + 284 + 416 + 0 + 0 + + + 70 + 258 + 221 + 0 + 0 + + + 306 + 716 + 504 + 0 + 0 + + + 70 + 300 + 394 + 0 + 0 + + + 70 + 155 + 144 + 0 + 0 + + + 1 + 109 + 523 + 1 + 1 + + + 70 + 307 + 385 + 0 + 0 + + + 97 + 692 + 680 + 4 + 0 + + + 313 + 694 + 520 + 0 + 0 + + + 209 + 691 + 636 + 4 + 0 + + + 12 + 177 + 322 + 1 + 0 + + + 396 + 538 + 760 + 1 + 0 + + + 116 + 607 + 724 + 6 + 0 + + + 1 + 690 + 682 + 0 + 0 + + + 285 + 482 + 404 + 0 + 0 + + + 8 + 161 + 518 + 0 + 0 + + + 1 + 217 + 543 + 1 + 1 + + + 36 + 120 + 695 + 6 + 0 + + + 102 + 226 + 253 + 4 + 0 + + + 1 + 279 + 299 + 0 + 1 + + + 38 + 98 + 227 + 0 + 0 + + + 34 + 299 + 535 + 4 + 0 + + + 192 + 524 + 424 + 0 + 0 + + + 32 + 386 + 697 + 0 + 0 + + + 284 + 482 + 461 + 2 + 0 + + + 37 + 630 + 476 + 4 + 0 + + + 597 + 679 + 531 + 4 + 0 + + + 88 + 104 + 214 + 2 + 0 + + + 37 + 264 + 606 + 2 + 0 + + + 38 + 228 + 366 + 0 + 0 + + + 21 + 548 + 746 + 4 + 0 + + + 70 + 303 + 643 + 1 + 0 + + + 70 + 332 + 251 + 0 + 0 + + + 15 + 497 + 392 + 2 + 0 + + + 377 + 664 + 662 + 0 + 0 + + + 3 + 639 + 737 + 0 + 0 + + + 45 + 166 + 502 + 6 + 0 + + + 597 + 752 + 439 + 2 + 0 + + + 284 + 668 + 705 + 0 + 0 + + + 45 + 253 + 632 + 4 + 0 + + + 70 + 172 + 332 + 0 + 0 + + + 283 + 711 + 705 + 0 + 0 + + + 313 + 506 + 507 + 0 + 0 + + + 283 + 492 + 396 + 6 + 0 + + + 7 + 121 + 472 + 0 + 0 + + + 284 + 451 + 432 + 4 + 0 + + + 70 + 199 + 287 + 0 + 0 + + + 1 + 297 + 656 + 0 + 0 + + + 7 + 120 + 476 + 0 + 0 + + + 0 + 707 + 467 + 3 + 0 + + + 70 + 169 + 338 + 0 + 0 + + + 284 + 628 + 700 + 2 + 0 + + + 25 + 213 + 553 + 4 + 0 + + + 1 + 119 + 480 + 6 + 0 + + + 71 + 602 + 679 + 4 + 0 + + + 37 + 300 + 533 + 4 + 0 + + + 284 + 655 + 719 + 0 + 0 + + + 4 + 321 + 178 + 0 + 0 + + + 0 + 710 + 465 + 3 + 0 + + + 26 + 255 + 462 + 6 + 0 + + + 0 + 588 + 695 + 4 + 0 + + + 98 + 641 + 468 + 2 + 0 + + + 111 + 231 + 248 + 0 + 0 + + + 37 + 551 + 488 + 4 + 0 + + + 32 + 537 + 761 + 0 + 0 + + + 38 + 160 + 138 + 0 + 0 + + + 12 + 183 + 313 + 2 + 0 + + + 284 + 666 + 707 + 0 + 0 + + + 38 + 707 + 666 + 0 + 0 + + + 327 + 551 + 599 + 0 + 0 + + + 36 + 736 + 490 + 3 + 0 + + + 24 + 181 + 122 + 0 + 1 + + + 68 + 104 + 551 + 0 + 0 + + + 5 + 566 + 530 + 0 + 0 + + + 205 + 191 + 300 + 0 + 0 + + + 32 + 431 + 696 + 0 + 0 + + + 70 + 312 + 267 + 0 + 0 + + + 3 + 117 + 712 + 0 + 0 + + + 4 + 234 + 356 + 0 + 0 + + + 70 + 267 + 312 + 0 + 0 + + + 34 + 296 + 540 + 4 + 0 + + + 0 + 691 + 522 + 1 + 0 + + + 419 + 716 + 461 + 6 + 0 + + + 306 + 338 + 657 + 0 + 0 + + + 70 + 141 + 157 + 0 + 0 + + + 205 + 254 + 328 + 0 + 0 + + + 37 + 164 + 508 + 4 + 0 + + + 33 + 484 + 682 + 6 + 0 + + + 47 + 126 + 455 + 0 + 0 + + + 70 + 334 + 353 + 0 + 0 + + + 58 + 598 + 603 + 4 + 0 + + + 671 + 487 + 552 + 0 + 0 + + + 4 + 192 + 298 + 0 + 0 + + + 4 + 323 + 365 + 0 + 0 + + + 97 + 271 + 307 + 6 + 0 + + + 70 + 182 + 121 + 0 + 0 + + + 70 + 93 + 237 + 0 + 0 + + + 70 + 292 + 285 + 0 + 0 + + + 286 + 596 + 605 + 4 + 0 + + + 36 + 494 + 668 + 0 + 0 + + + 284 + 630 + 698 + 2 + 0 + + + 89 + 361 + 711 + 2 + 0 + + + 597 + 745 + 443 + 4 + 0 + + + 284 + 641 + 686 + 0 + 0 + + + 34 + 101 + 567 + 7 + 0 + + + 662 + 665 + 754 + 0 + 0 + + + 70 + 197 + 112 + 0 + 0 + + + 38 + 708 + 665 + 0 + 0 + + + 284 + 665 + 708 + 2 + 0 + + + 38 + 138 + 415 + 0 + 0 + + + 1 + 184 + 449 + 0 + 0 + + + 284 + 626 + 701 + 2 + 0 + + + 55 + 563 + 533 + 0 + 0 + + + 284 + 653 + 672 + 0 + 0 + + + 428 + 636 + 690 + 2 + 0 + + + 70 + 236 + 350 + 0 + 0 + + + 1 + 175 + 472 + 0 + 0 + + + 283 + 454 + 432 + 0 + 0 + + + 1 + 275 + 588 + 0 + 0 + + + 3 + 106 + 522 + 4 + 0 + + + 36 + 119 + 694 + 6 + 0 + + + 4 + 318 + 174 + 0 + 0 + + + 70 + 86 + 243 + 0 + 0 + + + 405 + 541 + 755 + 3 + 0 + + + 34 + 755 + 541 + 3 + 0 + + + 1 + 230 + 511 + 0 + 1 + + + 1 + 148 + 558 + 1 + 1 + + + 377 + 657 + 761 + 3 + 0 + + + 313 + 685 + 438 + 3 + 0 + + + 70 + 211 + 99 + 0 + 0 + + + 938 + 691 + 635 + 0 + 0 + + + 205 + 92 + 227 + 0 + 0 + + + 13 + 179 + 309 + 2 + 0 + + + 0 + 577 + 520 + 0 + 0 + + + 70 + 133 + 157 + 0 + 0 + + + 313 + 690 + 525 + 3 + 0 + + + 306 + 750 + 483 + 3 + 0 + + + 70 + 87 + 240 + 0 + 0 + + + 1 + 157 + 526 + 0 + 0 + + + 285 + 493 + 451 + 0 + 0 + + + 37 + 483 + 406 + 0 + 0 + + + 70 + 248 + 223 + 0 + 0 + + + 70 + 192 + 430 + 0 + 0 + + + 51 + 235 + 500 + 6 + 0 + + + 205 + 111 + 188 + 0 + 0 + + + 33 + 399 + 676 + 0 + 0 + + + 70 + 204 + 576 + 6 + 0 + + + 55 + 278 + 297 + 0 + 0 + + + 70 + 122 + 172 + 0 + 0 + + + 100 + 309 + 635 + 0 + 0 + + + 46 + 449 + 437 + 2 + 0 + + + 70 + 151 + 367 + 0 + 0 + + + 36 + 664 + 452 + 0 + 0 + + + 70 + 132 + 159 + 0 + 0 + + + 4 + 53 + 396 + 0 + 0 + + + 1 + 130 + 636 + 0 + 0 + + + 0 + 741 + 489 + 1 + 0 + + + 70 + 78 + 269 + 0 + 0 + + + 1 + 562 + 727 + 0 + 0 + + + 34 + 450 + 667 + 0 + 0 + + + 70 + 98 + 214 + 0 + 0 + + + 205 + 243 + 228 + 0 + 0 + + + 205 + 665 + 752 + 0 + 0 + + + 1 + 131 + 631 + 0 + 1 + + + 48 + 629 + 746 + 0 + 0 + + + 306 + 695 + 477 + 2 + 0 + + + 3 + 332 + 670 + 0 + 0 + + + 46 + 450 + 436 + 2 + 0 + + + 70 + 224 + 369 + 0 + 0 + + + 70 + 629 + 576 + 6 + 0 + + + 4 + 181 + 306 + 0 + 0 + + + 70 + 54 + 388 + 0 + 0 + + + 1 + 187 + 442 + 0 + 0 + + + 70 + 108 + 194 + 0 + 0 + + + 37 + 488 + 402 + 0 + 0 + + + 205 + 62 + 338 + 0 + 0 + + + 45 + 466 + 644 + 2 + 0 + + + 4 + 136 + 154 + 0 + 0 + + + 70 + 77 + 272 + 0 + 0 + + + 34 + 651 + 461 + 0 + 0 + + + 0 + 689 + 681 + 0 + 0 + + + 284 + 659 + 712 + 2 + 0 + + + 216 + 74 + 283 + 0 + 0 + + + 38 + 127 + 436 + 0 + 0 + + + 1 + 182 + 454 + 0 + 0 + + + 70 + 96 + 218 + 0 + 0 + + + 284 + 671 + 699 + 2 + 0 + + + 107 + 198 + 105 + 0 + 0 + + + 284 + 639 + 734 + 2 + 0 + + + 70 + 207 + 268 + 0 + 0 + + + 70 + 627 + 578 + 6 + 0 + + + 110 + 523 + 574 + 0 + 0 + + + 70 + 235 + 351 + 0 + 0 + + + 70 + 195 + 423 + 0 + 0 + + + 34 + 117 + 705 + 0 + 0 + + + 205 + 476 + 696 + 2 + 0 + + + 70 + 184 + 113 + 0 + 0 + + + 1 + 603 + 601 + 1 + 1 + + + 597 + 672 + 493 + 6 + 0 + + + 34 + 539 + 557 + 0 + 0 + + + 70 + 295 + 188 + 0 + 0 + + + 4 + 129 + 161 + 0 + 0 + + + 35 + 78 + 711 + 0 + 0 + + + 38 + 62 + 335 + 0 + 0 + + + 428 + 725 + 457 + 0 + 0 + + + 284 + 633 + 741 + 0 + 0 + + + 284 + 628 + 699 + 2 + 0 + + + 70 + 53 + 392 + 0 + 0 + + + 110 + 196 + 106 + 0 + 0 + + + 37 + 487 + 403 + 0 + 0 + + + 70 + 332 + 167 + 0 + 0 + + + 0 + 181 + 650 + 0 + 0 + + + 110 + 220 + 252 + 4 + 0 + + + 1 + 301 + 652 + 0 + 0 + + + 1 + 126 + 440 + 0 + 0 + + + 104 + 228 + 516 + 4 + 0 + + + 0 + 752 + 543 + 3 + 0 + + + 284 + 447 + 439 + 4 + 0 + + + 36 + 376 + 717 + 0 + 0 + + + 1 + 267 + 605 + 0 + 1 + + + 145 + 148 + 557 + 6 + 0 + + + 3 + 256 + 631 + 0 + 0 + + + 20 + 295 + 548 + 0 + 0 + + + 1 + 130 + 635 + 0 + 0 + + + 205 + 156 + 356 + 0 + 0 + + + 4 + 63 + 331 + 0 + 0 + + + 285 + 486 + 404 + 0 + 0 + + + 23 + 651 + 509 + 6 + 0 + + + 205 + 202 + 275 + 0 + 0 + + + 1 + 182 + 647 + 0 + 0 + + + 4 + 142 + 391 + 0 + 0 + + + 1 + 696 + 674 + 0 + 0 + + + 1 + 186 + 633 + 0 + 0 + + + 1 + 450 + 494 + 2 + 1 + + + 284 + 492 + 399 + 6 + 0 + + + 70 + 276 + 299 + 0 + 0 + + + 70 + 119 + 175 + 0 + 0 + + + 1 + 293 + 670 + 0 + 0 + + + 38 + 49 + 425 + 0 + 0 + + + 1 + 476 + 467 + 0 + 0 + + + 70 + 218 + 540 + 0 + 0 + + + 4 + 53 + 393 + 0 + 0 + + + 37 + 302 + 650 + 0 + 0 + + + 111 + 200 + 104 + 0 + 0 + + + 183 + 470 + 705 + 2 + 0 + + + 38 + 263 + 211 + 0 + 0 + + + 598 + 485 + 556 + 0 + 0 + + + 407 + 725 + 647 + 6 + 0 + + + 34 + 177 + 665 + 1 + 0 + + + 107 + 222 + 250 + 0 + 0 + + + 25 + 213 + 3524 + 0 + 0 + + + 45 + 426 + 461 + 0 + 0 + + + 70 + 118 + 175 + 0 + 0 + + + 46 + 716 + 698 + 0 + 0 + + + 70 + 58 + 356 + 0 + 0 + + + 395 + 609 + 721 + 2 + 0 + + + 272 + 490 + 550 + 0 + 0 + + + 70 + 160 + 129 + 0 + 0 + + + 206 + 65 + 318 + 0 + 0 + + + 27 + 717 + 697 + 6 + 0 + + + 70 + 134 + 415 + 0 + 0 + + + 205 + 333 + 167 + 0 + 0 + + + 0 + 178 + 659 + 0 + 0 + + + 718 + 729 + 455 + 0 + 0 + + + 70 + 181 + 307 + 0 + 0 + + + 70 + 162 + 343 + 0 + 0 + + + 143 + 268 + 2947 + 0 + 0 + + + 20 + 174 + 476 + 0 + 0 + + + 377 + 663 + 546 + 4 + 0 + + + 306 + 721 + 460 + 4 + 0 + + + 70 + 251 + 330 + 0 + 0 + + + 3 + 120 + 463 + 0 + 0 + + + 718 + 747 + 444 + 0 + 0 + + + 415 + 622 + 582 + 4 + 0 + + + 1 + 361 + 712 + 0 + 1 + + + 70 + 282 + 197 + 0 + 0 + + + 20 + 634 + 571 + 0 + 0 + + + 970 + 649 + 770 + 1 + 0 + + + 45 + 597 + 503 + 4 + 0 + + + 0 + 187 + 443 + 0 + 0 + + + 0 + 612 + 667 + 3 + 0 + + + 111 + 359 + 547 + 0 + 0 + + + 55 + 278 + 298 + 0 + 0 + + + 284 + 629 + 698 + 0 + 0 + + + 12 + 171 + 325 + 0 + 0 + + + 70 + 69 + 299 + 0 + 0 + + + 284 + 640 + 686 + 0 + 0 + + + 110 + 525 + 572 + 0 + 0 + + + 371 + 621 + 707 + 0 + 0 + + + 1 + 298 + 659 + 0 + 0 + + + 70 + 55 + 375 + 0 + 0 + + + 1 + 159 + 521 + 0 + 0 + + + 70 + 194 + 427 + 0 + 0 + + + 1 + 177 + 468 + 0 + 0 + + + 283 + 482 + 462 + 4 + 0 + + + 45 + 428 + 459 + 2 + 0 + + + 38 + 230 + 242 + 0 + 0 + + + 3 + 231 + 508 + 4 + 0 + + + 1 + 131 + 633 + 0 + 0 + + + 192 + 524 + 425 + 0 + 0 + + + 0 + 101 + 551 + 4 + 0 + + + 70 + 313 + 375 + 0 + 0 + + + 4 + 260 + 319 + 0 + 0 + + + 1 + 605 + 776 + 3 + 0 + + + 70 + 226 + 367 + 0 + 0 + + + 597 + 672 + 447 + 6 + 0 + + + 70 + 53 + 391 + 0 + 0 + + + 377 + 662 + 755 + 0 + 0 + + + 25 + 213 + 551 + 4 + 0 + + + 0 + 646 + 465 + 2 + 0 + + + 1 + 115 + 484 + 6 + 0 + + + 70 + 56 + 370 + 0 + 0 + + + 70 + 112 + 185 + 0 + 0 + + + 1 + 701 + 713 + 2 + 0 + + + 34 + 180 + 652 + 2 + 0 + + + 0 + 509 + 386 + 0 + 0 + + + 51 + 622 + 706 + 6 + 0 + + + 70 + 241 + 231 + 0 + 0 + + + 46 + 714 + 700 + 0 + 0 + + + 32 + 478 + 694 + 2 + 0 + + + 4 + 305 + 644 + 2 + 0 + + + 0 + 127 + 438 + 0 + 0 + + + 284 + 642 + 684 + 0 + 0 + + + 70 + 137 + 151 + 0 + 0 + + + 285 + 485 + 405 + 0 + 0 + + + 34 + 653 + 460 + 0 + 0 + + + 33 + 490 + 677 + 6 + 0 + + + 284 + 664 + 707 + 0 + 0 + + + 5 + 271 + 433 + 0 + 0 + + + 104 + 571 + 715 + 0 + 0 + + + 37 + 635 + 473 + 2 + 0 + + + 313 + 678 + 443 + 3 + 0 + + + 284 + 630 + 697 + 2 + 0 + + + 34 + 653 + 508 + 0 + 0 + + + 479 + 631 + 476 + 4 + 0 + + + 15 + 122 + 456 + 4 + 0 + + + 191 + 495 + 397 + 6 + 0 + + + 38 + 111 + 185 + 0 + 0 + + + 70 + 261 + 317 + 0 + 0 + + + 45 + 540 + 614 + 0 + 0 + + + 70 + 87 + 236 + 0 + 0 + + + 1 + 179 + 656 + 0 + 0 + + + 70 + 324 + 172 + 0 + 0 + + + 0 + 516 + 522 + 0 + 0 + + + 597 + 682 + 531 + 4 + 0 + + + 70 + 151 + 136 + 0 + 0 + + + 306 + 523 + 515 + 0 + 0 + + + 38 + 85 + 241 + 0 + 0 + + + 395 + 484 + 685 + 6 + 0 + + + 1 + 136 + 608 + 0 + 0 + + + 3 + 120 + 464 + 0 + 0 + + + 0 + 179 + 462 + 0 + 0 + + + 70 + 234 + 238 + 0 + 0 + + + 111 + 197 + 104 + 0 + 0 + + + 70 + 164 + 125 + 0 + 0 + + + 309 + 513 + 525 + 0 + 0 + + + 106 + 201 + 102 + 0 + 0 + + + 38 + 153 + 134 + 0 + 0 + + + 1 + 253 + 464 + 1 + 1 + + + 285 + 484 + 406 + 6 + 0 + + + 284 + 660 + 711 + 0 + 0 + + + 13 + 173 + 322 + 0 + 0 + + + 36 + 736 + 492 + 5 + 0 + + + 0 + 708 + 706 + 2 + 0 + + + 672 + 487 + 553 + 4 + 0 + + + 1 + 707 + 707 + 2 + 0 + + + 284 + 489 + 402 + 6 + 0 + + + 36 + 507 + 439 + 0 + 0 + + + 283 + 606 + 825 + 6 + 0 + + + 407 + 725 + 563 + 2 + 0 + + + 285 + 483 + 407 + 6 + 0 + + + 70 + 62 + 332 + 0 + 0 + + + 597 + 752 + 441 + 2 + 0 + + + 306 + 486 + 458 + 0 + 0 + + + 70 + 148 + 377 + 0 + 0 + + + 3 + 120 + 465 + 0 + 0 + + + 70 + 310 + 180 + 0 + 0 + + + 70 + 189 + 109 + 0 + 0 + + + 1 + 188 + 625 + 0 + 0 + + + 284 + 662 + 709 + 0 + 0 + + + 4 + 142 + 393 + 0 + 0 + + + 20 + 114 + 489 + 0 + 0 + + + 70 + 268 + 208 + 0 + 0 + + + 45 + 600 + 449 + 2 + 0 + + + 441 + 614 + 1562 + 4 + 0 + + + 3 + 106 + 526 + 0 + 0 + + + 286 + 519 + 579 + 0 + 0 + + + 0 + 579 + 519 + 0 + 0 + + + 198 + 251 + 468 + 0 + 0 + + + 70 + 330 + 169 + 0 + 0 + + + 284 + 645 + 681 + 0 + 0 + + + 284 + 632 + 695 + 2 + 0 + + + 70 + 139 + 148 + 0 + 0 + + + 1 + 603 + 830 + 0 + 0 + + + 70 + 174 + 123 + 0 + 0 + + + 284 + 489 + 400 + 6 + 0 + + + 24 + 607 + 722 + 3 + 1 + + + 45 + 428 + 457 + 4 + 0 + + + 597 + 752 + 440 + 2 + 0 + + + 45 + 587 + 512 + 6 + 0 + + + 205 + 275 + 203 + 0 + 0 + + + 70 + 206 + 271 + 0 + 0 + + + 675 + 486 + 556 + 0 + 0 + + + 285 + 483 + 405 + 0 + 0 + + + 284 + 655 + 717 + 2 + 0 + + + 284 + 669 + 702 + 0 + 0 + + + 70 + 206 + 568 + 0 + 0 + + + 70 + 310 + 631 + 1 + 0 + + + 34 + 379 + 713 + 0 + 0 + + + 3 + 234 + 500 + 6 + 0 + + + 70 + 72 + 297 + 0 + 0 + + + 70 + 81 + 264 + 0 + 0 + + + 22 + 442 + 680 + 4 + 0 + + + 70 + 115 + 186 + 0 + 0 + + + 70 + 274 + 427 + 0 + 0 + + + 45 + 255 + 632 + 4 + 0 + + + 0 + 606 + 775 + 3 + 0 + + + 45 + 466 + 645 + 2 + 0 + + + 1 + 186 + 629 + 0 + 0 + + + 70 + 183 + 305 + 0 + 0 + + + 4 + 57 + 376 + 0 + 0 + + + 53 + 565 + 532 + 0 + 0 + + + 70 + 259 + 317 + 0 + 0 + + + 284 + 639 + 735 + 2 + 0 + + + 70 + 289 + 405 + 0 + 0 + + + 38 + 210 + 266 + 0 + 0 + + + 20 + 133 + 420 + 0 + 0 + + + 51 + 714 + 701 + 4 + 0 + + + 51 + 235 + 498 + 6 + 0 + + + 306 + 725 + 499 + 6 + 0 + + + 0 + 703 + 712 + 2 + 0 + + + 1 + 187 + 439 + 0 + 0 + + + 1 + 276 + 584 + 0 + 0 + + + 46 + 559 + 592 + 0 + 0 + + + 70 + 287 + 286 + 0 + 0 + + + 70 + 318 + 368 + 0 + 0 + + + 1 + 184 + 636 + 0 + 0 + + + 70 + 133 + 161 + 0 + 0 + + + 111 + 219 + 255 + 0 + 0 + + + 1 + 182 + 643 + 0 + 0 + + + 284 + 628 + 698 + 0 + 0 + + + 205 + 611 + 492 + 0 + 0 + + + 70 + 154 + 363 + 0 + 0 + + + 45 + 539 + 614 + 0 + 0 + + + 306 + 700 + 671 + 4 + 0 + + + 70 + 223 + 525 + 0 + 0 + + + 4 + 73 + 294 + 0 + 0 + + + 284 + 671 + 700 + 2 + 0 + + + 0 + 675 + 536 + 1 + 0 + + + 70 + 191 + 430 + 0 + 0 + + + 70 + 55 + 390 + 0 + 0 + + + 597 + 746 + 485 + 2 + 0 + + + 111 + 229 + 244 + 0 + 0 + + + 284 + 639 + 686 + 0 + 0 + + + 286 + 522 + 494 + 0 + 0 + + + 7 + 119 + 470 + 4 + 0 + + + 29 + 123 + 668 + 6 + 0 + + + 13 + 181 + 309 + 2 + 0 + + + 4 + 273 + 429 + 0 + 0 + + + 70 + 301 + 273 + 0 + 0 + + + 1 + 166 + 495 + 2 + 1 + + + 284 + 453 + 432 + 4 + 0 + + + 1 + 185 + 633 + 0 + 0 + + + 8 + 167 + 492 + 0 + 0 + + + 70 + 204 + 574 + 0 + 0 + + + 70 + 252 + 326 + 0 + 0 + + + 284 + 657 + 715 + 0 + 0 + + + 4 + 211 + 265 + 0 + 0 + + + 4 + 187 + 299 + 0 + 0 + + + 4 + 93 + 231 + 0 + 0 + + + 395 + 500 + 662 + 1 + 0 + + + 285 + 488 + 401 + 0 + 0 + + + 70 + 122 + 176 + 0 + 0 + + + 285 + 482 + 406 + 0 + 0 + + + 284 + 653 + 719 + 0 + 0 + + + 36 + 737 + 491 + 1 + 0 + + + 938 + 685 + 640 + 0 + 0 + + + 0 + 478 + 466 + 0 + 0 + + + 0 + 101 + 554 + 4 + 0 + + + 938 + 697 + 629 + 0 + 0 + + + 286 + 519 + 497 + 0 + 0 + + + 37 + 633 + 475 + 2 + 0 + + + 70 + 304 + 184 + 0 + 0 + + + 38 + 329 + 356 + 0 + 0 + + + 1 + 261 + 617 + 0 + 0 + + + 38 + 128 + 166 + 0 + 0 + + + 70 + 249 + 329 + 0 + 0 + + + 283 + 160 + 512 + 3 + 0 + + + 1 + 492 + 549 + 0 + 1 + + + 1 + 83 + 674 + 1 + 1 + + + 105 + 572 + 713 + 0 + 0 + + + 284 + 666 + 705 + 0 + 0 + + + 0 + 352 + 556 + 0 + 0 + + + 106 + 222 + 252 + 4 + 0 + + + 1 + 133 + 616 + 0 + 0 + + + 407 + 713 + 572 + 4 + 0 + + + 191 + 189 + 620 + 0 + 0 + + + 284 + 641 + 684 + 0 + 0 + + + 938 + 684 + 641 + 0 + 0 + + + 205 + 159 + 352 + 0 + 0 + + + 164 + 757 + 437 + 4 + 0 + + + 4 + 314 + 261 + 0 + 0 + + + 4 + 157 + 522 + 0 + 0 + + + 70 + 202 + 580 + 6 + 0 + + + 45 + 467 + 644 + 0 + 0 + + + 1 + 356 + 550 + 0 + 0 + + + 3 + 121 + 463 + 0 + 0 + + + 205 + 313 + 262 + 0 + 0 + + + 38 + 77 + 277 + 0 + 0 + + + 102 + 225 + 249 + 4 + 0 + + + 205 + 174 + 322 + 0 + 0 + + + 1 + 278 + 295 + 1 + 1 + + + 70 + 127 + 168 + 0 + 0 + + + 70 + 179 + 313 + 0 + 0 + + + 395 + 476 + 695 + 2 + 0 + + + 284 + 446 + 439 + 4 + 0 + + + 104 + 696 + 630 + 0 + 0 + + + 70 + 114 + 187 + 0 + 0 + + + 0 + 183 + 448 + 0 + 0 + + + 284 + 630 + 696 + 2 + 0 + + + 3 + 635 + 570 + 0 + 0 + + + 7 + 122 + 459 + 5 + 0 + + + 37 + 642 + 683 + 5 + 0 + + + 50 + 205 + 104 + 0 + 0 + + + 5 + 685 + 483 + 4 + 0 + + + 34 + 633 + 791 + 2 + 0 + + + 9 + 119 + 471 + 0 + 0 + + + 396 + 541 + 754 + 1 + 0 + + + 1 + 280 + 293 + 0 + 1 + + + 1 + 179 + 655 + 0 + 0 + + + 33 + 474 + 698 + 3 + 0 + + + 283 + 159 + 516 + 3 + 0 + + + 1 + 129 + 636 + 0 + 0 + + + 308 + 703 + 668 + 4 + 0 + + + 45 + 598 + 503 + 4 + 0 + + + 34 + 118 + 695 + 6 + 0 + + + 284 + 492 + 398 + 6 + 0 + + + 38 + 92 + 232 + 0 + 0 + + + 3 + 615 + 1559 + 4 + 0 + + + 36 + 664 + 453 + 0 + 0 + + + 34 + 321 + 610 + 2 + 0 + + + 70 + 96 + 220 + 0 + 0 + + + 70 + 88 + 240 + 0 + 0 + + + 4 + 110 + 192 + 0 + 0 + + + 7 + 255 + 631 + 6 + 0 + + + 0 + 669 + 495 + 6 + 0 + + + 70 + 262 + 214 + 0 + 0 + + + 12 + 171 + 328 + 2 + 0 + + + 14 + 165 + 499 + 0 + 0 + + + 70 + 293 + 281 + 0 + 0 + + + 3 + 281 + 293 + 0 + 0 + + + 63 + 210 + 556 + 6 + 0 + + + 313 + 506 + 509 + 0 + 0 + + + 1 + 505 + 510 + 4 + 0 + + + 70 + 109 + 194 + 0 + 0 + + + 11 + 510 + 505 + 6 + 0 + + + 285 + 486 + 403 + 0 + 0 + + + 205 + 141 + 150 + 0 + 0 + + + 70 + 50 + 423 + 0 + 0 + + + 395 + 482 + 687 + 3 + 0 + + + 313 + 687 + 482 + 3 + 0 + + + 3 + 509 + 506 + 6 + 0 + + + 1 + 185 + 445 + 0 + 0 + + + 38 + 70 + 302 + 0 + 0 + + + 70 + 319 + 366 + 0 + 0 + + + 70 + 191 + 431 + 0 + 0 + + + 153 + 600 + 450 + 0 + 0 + + + 4 + 85 + 249 + 0 + 0 + + + 32 + 637 + 850 + 6 + 0 + + + 290 + 441 + 506 + 0 + 0 + + + 70 + 71 + 298 + 0 + 0 + + + 1 + 124 + 664 + 0 + 1 + + + 70 + 123 + 172 + 0 + 0 + + + 38 + 244 + 230 + 0 + 0 + + + 26 + 255 + 458 + 6 + 0 + + + 51 + 632 + 572 + 4 + 0 + + + 272 + 490 + 551 + 0 + 0 + + + 214 + 74 + 286 + 7 + 0 + + + 4 + 168 + 334 + 0 + 0 + + + 284 + 644 + 681 + 0 + 0 + + + 70 + 145 + 146 + 0 + 0 + + + 428 + 690 + 436 + 2 + 0 + + + 284 + 632 + 694 + 2 + 0 + + + 667 + 694 + 632 + 2 + 0 + + + 70 + 231 + 243 + 0 + 0 + + + 70 + 288 + 286 + 0 + 0 + + + 191 + 189 + 618 + 0 + 0 + + + 284 + 661 + 711 + 0 + 0 + + + 16 + 617 + 586 + 4 + 0 + + + 284 + 645 + 680 + 2 + 0 + + + 420 + 690 + 480 + 6 + 0 + + + 1 + 620 + 758 + 0 + 0 + + + 3 + 121 + 464 + 6 + 0 + + + 378 + 616 + 712 + 1 + 0 + + + 25 + 425 + 461 + 4 + 0 + + + 38 + 55 + 386 + 0 + 0 + + + 70 + 174 + 122 + 0 + 0 + + + 70 + 193 + 427 + 0 + 0 + + + 0 + 758 + 538 + 3 + 0 + + + 7 + 119 + 472 + 0 + 0 + + + 396 + 538 + 758 + 1 + 0 + + + 107 + 222 + 253 + 0 + 0 + + + 1 + 117 + 480 + 6 + 0 + + + 395 + 485 + 683 + 3 + 0 + + + 1 + 189 + 436 + 0 + 0 + + + 70 + 288 + 195 + 0 + 0 + + + 70 + 96 + 221 + 0 + 0 + + + 70 + 208 + 102 + 0 + 0 + + + 34 + 396 + 682 + 0 + 0 + + + 1 + 510 + 590 + 0 + 0 + + + 70 + 188 + 113 + 0 + 0 + + + 34 + 388 + 696 + 0 + 0 + + + 45 + 605 + 725 + 0 + 0 + + + 192 + 524 + 426 + 0 + 0 + + + 5 + 308 + 522 + 4 + 0 + + + 284 + 624 + 703 + 2 + 0 + + + 402 + 592 + 741 + 1 + 0 + + + 1 + 126 + 446 + 0 + 0 + + + 16 + 256 + 628 + 4 + 0 + + + 38 + 50 + 420 + 0 + 0 + + + 205 + 210 + 100 + 0 + 0 + + + 0 + 650 + 463 + 0 + 0 + + + 205 + 202 + 104 + 0 + 0 + + + 70 + 154 + 365 + 0 + 0 + + + 21 + 540 + 613 + 2 + 0 + + + 70 + 110 + 191 + 0 + 0 + + + 597 + 681 + 531 + 4 + 0 + + + 70 + 103 + 204 + 0 + 0 + + + 1 + 596 + 736 + 1 + 0 + + + 70 + 205 + 401 + 0 + 0 + + + 284 + 647 + 678 + 0 + 0 + + + 306 + 678 + 647 + 0 + 0 + + + 70 + 300 + 274 + 0 + 0 + + + 45 + 439 + 508 + 4 + 0 + + + 34 + 719 + 503 + 2 + 0 + + + 1126 + 500 + 392 + 6 + 0 + + + 1 + 350 + 560 + 0 + 0 + + + 8 + 695 + 676 + 2 + 0 + + + 70 + 185 + 304 + 0 + 0 + + + 70 + 152 + 370 + 0 + 0 + + + 1 + 122 + 461 + 0 + 1 + + + 107 + 218 + 258 + 0 + 0 + + + 45 + 428 + 458 + 2 + 0 + + + 37 + 484 + 405 + 0 + 0 + + + 70 + 237 + 347 + 0 + 0 + + + 70 + 97 + 217 + 0 + 0 + + + 204 + 66 + 319 + 0 + 0 + + + 392 + 648 + 629 + 2 + 0 + + + 286 + 160 + 514 + 3 + 0 + + + 143 + 266 + 2956 + 4 + 0 + + + 4 + 51 + 413 + 0 + 0 + + + 1 + 116 + 709 + 0 + 1 + + + 110 + 117 + 703 + 0 + 0 + + + 70 + 55 + 383 + 0 + 0 + + + 3 + 121 + 465 + 0 + 0 + + + 36 + 663 + 454 + 2 + 0 + + + 1 + 620 + 534 + 6 + 0 + + + 284 + 649 + 676 + 0 + 0 + + + 32 + 638 + 849 + 5 + 0 + + + 29 + 361 + 714 + 0 + 0 + + + 1 + 182 + 452 + 0 + 0 + + + 70 + 71 + 297 + 0 + 0 + + + 70 + 99 + 213 + 0 + 0 + + + 0 + 697 + 475 + 3 + 0 + + + 215 + 75 + 281 + 7 + 0 + + + 34 + 653 + 507 + 6 + 0 + + + 108 + 199 + 106 + 0 + 0 + + + 12 + 181 + 311 + 3 + 0 + + + 164 + 756 + 438 + 3 + 0 + + + 70 + 95 + 222 + 0 + 0 + + + 34 + 130 + 433 + 0 + 0 + + + 420 + 689 + 525 + 0 + 0 + + + 34 + 752 + 481 + 3 + 0 + + + 51 + 717 + 698 + 6 + 0 + + + 45 + 466 + 646 + 2 + 0 + + + 70 + 306 + 184 + 0 + 0 + + + 284 + 489 + 401 + 6 + 0 + + + 284 + 659 + 713 + 2 + 0 + + + 70 + 228 + 247 + 0 + 0 + + + 70 + 54 + 391 + 0 + 0 + + + 37 + 162 + 508 + 4 + 0 + + + 205 + 182 + 116 + 0 + 0 + + + 48 + 311 + 523 + 4 + 0 + + + 37 + 488 + 396 + 0 + 0 + + + 45 + 599 + 503 + 4 + 0 + + + 284 + 654 + 676 + 0 + 0 + + + 0 + 164 + 522 + 0 + 0 + + + 286 + 503 + 444 + 0 + 0 + + + 37 + 268 + 607 + 2 + 0 + + + 402 + 597 + 843 + 5 + 0 + + + 38 + 706 + 663 + 0 + 0 + + + 4 + 317 + 172 + 0 + 0 + + + 668 + 727 + 500 + 0 + 0 + + + 4 + 165 + 145 + 0 + 0 + + + 284 + 651 + 719 + 0 + 0 + + + 183 + 363 + 701 + 0 + 0 + + + 34 + 762 + 477 + 3 + 0 + + + 5 + 350 + 638 + 0 + 0 + + + 34 + 677 + 445 + 3 + 0 + + + 0 + 515 + 494 + 0 + 0 + + + 0 + 641 + 470 + 5 + 0 + + + 15 + 102 + 534 + 0 + 0 + + + 4 + 153 + 356 + 0 + 0 + + + 3 + 436 + 691 + 0 + 0 + + + 64 + 232 + 503 + 6 + 0 + + + 284 + 652 + 678 + 0 + 0 + + + 70 + 74 + 323 + 0 + 0 + + + 982 + 576 + 523 + 5 + 0 + + + 718 + 736 + 446 + 2 + 0 + + + 70 + 181 + 301 + 0 + 0 + + + 284 + 662 + 707 + 0 + 0 + + + 1 + 132 + 648 + 0 + 0 + + + 4 + 324 + 168 + 0 + 0 + + + 70 + 108 + 221 + 0 + 0 + + + 205 + 62 + 385 + 0 + 0 + + + 34 + 645 + 467 + 2 + 0 + + + 70 + 71 + 336 + 0 + 0 + + + 284 + 42 + 568 + 2 + 0 + + + 32 + 377 + 707 + 0 + 0 + + + 4 + 244 + 223 + 0 + 0 + + + 45 + 170 + 503 + 2 + 0 + + + 21 + 546 + 746 + 4 + 0 + + + 284 + 42 + 567 + 2 + 0 + + + 284 + 650 + 680 + 0 + 0 + + + 205 + 476 + 469 + 0 + 0 + + + 22 + 467 + 645 + 0 + 0 + + + 0 + 621 + 485 + 0 + 0 + + + 70 + 72 + 331 + 0 + 0 + + + 214 + 86 + 277 + 7 + 0 + + + 70 + 298 + 287 + 0 + 0 + + + 105 + 574 + 710 + 0 + 0 + + + 5 + 680 + 483 + 4 + 0 + + + 4 + 55 + 437 + 2 + 0 + + + 13 + 171 + 318 + 0 + 0 + + + 1130 + 484 + 399 + 6 + 0 + + + 402 + 599 + 840 + 7 + 0 + + + 37 + 755 + 435 + 7 + 0 + + + 658 + 637 + 735 + 0 + 0 + + + 284 + 626 + 706 + 2 + 0 + + + 70 + 245 + 350 + 0 + 0 + + + 143 + 103 + 528 + 0 + 0 + + + 38 + 65 + 370 + 0 + 0 + + + 50 + 105 + 518 + 0 + 0 + + + 4 + 57 + 422 + 0 + 0 + + + 26 + 653 + 717 + 0 + 0 + + + 48 + 118 + 461 + 0 + 0 + + + 1 + 227 + 106 + 0 + 1 + + + 1 + 175 + 666 + 0 + 0 + + + 107 + 220 + 247 + 0 + 0 + + + 1 + 138 + 621 + 0 + 0 + + + 0 + 745 + 547 + 3 + 0 + + + 45 + 587 + 513 + 6 + 0 + + + 70 + 174 + 138 + 0 + 0 + + + 37 + 630 + 478 + 2 + 0 + + + 0 + 337 + 663 + 0 + 0 + + + 70 + 158 + 344 + 0 + 0 + + + 38 + 740 + 491 + 2 + 0 + + + 0 + 513 + 587 + 0 + 0 + + + 21 + 439 + 509 + 0 + 0 + + + 307 + 509 + 439 + 0 + 0 + + + 121 + 229 + 509 + 2 + 0 + + + 1 + 51 + 471 + 1 + 0 + + + 32 + 381 + 700 + 0 + 0 + + + 284 + 447 + 432 + 4 + 0 + + + 575 + 717 + 458 + 4 + 0 + + + 0 + 298 + 648 + 0 + 0 + + + 70 + 90 + 267 + 0 + 0 + + + 70 + 211 + 406 + 0 + 0 + + + 0 + 624 + 653 + 0 + 0 + + + 406 + 491 + 455 + 2 + 0 + + + 7 + 171 + 501 + 0 + 0 + + + 88 + 107 + 224 + 2 + 0 + + + 4 + 110 + 218 + 0 + 0 + + + 407 + 218 + 110 + 0 + 0 + + + 597 + 746 + 487 + 2 + 0 + + + 217 + 636 + 791 + 3 + 0 + + + 70 + 252 + 340 + 0 + 0 + + + 20 + 180 + 476 + 0 + 0 + + + 12 + 173 + 314 + 0 + 0 + + + 314 + 697 + 634 + 0 + 0 + + + 284 + 647 + 683 + 2 + 0 + + + 5 + 692 + 525 + 2 + 0 + + + 38 + 163 + 333 + 0 + 0 + + + 1 + 182 + 640 + 0 + 0 + + + 278 + 643 + 565 + 0 + 0 + + + 213 + 167 + 325 + 0 + 0 + + + 70 + 330 + 353 + 0 + 0 + + + 284 + 664 + 705 + 0 + 0 + + + 38 + 705 + 664 + 0 + 0 + + + 70 + 295 + 184 + 0 + 0 + + + 3 + 118 + 460 + 0 + 0 + + + 1 + 115 + 472 + 0 + 0 + + + 23 + 636 + 736 + 4 + 0 + + + 0 + 156 + 549 + 4 + 0 + + + 970 + 640 + 786 + 5 + 0 + + + 38 + 212 + 113 + 0 + 0 + + + 4 + 232 + 234 + 0 + 0 + + + 3 + 233 + 500 + 0 + 0 + + + 284 + 646 + 684 + 0 + 0 + + + 70 + 332 + 258 + 0 + 0 + + + 597 + 672 + 448 + 6 + 0 + + + 313 + 760 + 432 + 3 + 0 + + + 13 + 167 + 328 + 1 + 0 + + + 20 + 581 + 519 + 0 + 0 + + + 4 + 147 + 161 + 0 + 0 + + + 45 + 257 + 632 + 4 + 0 + + + 34 + 761 + 535 + 3 + 0 + + + 284 + 655 + 715 + 2 + 0 + + + 938 + 689 + 642 + 0 + 0 + + + 70 + 175 + 313 + 0 + 0 + + + 205 + 179 + 306 + 0 + 0 + + + 291 + 441 + 507 + 0 + 0 + + + 34 + 507 + 441 + 0 + 0 + + + 70 + 140 + 169 + 0 + 0 + + + 70 + 91 + 260 + 0 + 0 + + + 20 + 298 + 545 + 0 + 0 + + + 45 + 466 + 647 + 2 + 0 + + + 284 + 669 + 700 + 2 + 0 + + + 41 + 448 + 673 + 4 + 0 + + + 597 + 684 + 531 + 4 + 0 + + + 34 + 85 + 644 + 0 + 0 + + + 7 + 167 + 514 + 0 + 0 + + + 285 + 632 + 741 + 0 + 0 + + + 29 + 499 + 448 + 0 + 0 + + + 191 + 189 + 616 + 0 + 0 + + + 283 + 623 + 710 + 0 + 0 + + + 306 + 700 + 669 + 4 + 0 + + + 51 + 635 + 572 + 4 + 0 + + + 70 + 93 + 254 + 0 + 0 + + + 32 + 491 + 669 + 1 + 0 + + + 0 + 582 + 518 + 2 + 0 + + + 34 + 178 + 654 + 0 + 0 + + + 216 + 84 + 281 + 0 + 0 + + + 45 + 535 + 614 + 0 + 0 + + + 1 + 174 + 669 + 0 + 0 + + + 70 + 223 + 522 + 0 + 0 + + + 25 + 132 + 650 + 0 + 0 + + + 45 + 440 + 508 + 4 + 0 + + + 1 + 496 + 390 + 1 + 1 + + + 4 + 129 + 424 + 0 + 0 + + + 1 + 189 + 454 + 0 + 0 + + + 1 + 121 + 452 + 0 + 0 + + + 5 + 750 + 438 + 4 + 0 + + + 938 + 690 + 641 + 0 + 0 + + + 0 + 98 + 558 + 4 + 0 + + + 0 + 294 + 658 + 0 + 0 + + + 117 + 212 + 549 + 2 + 0 + + + 51 + 616 + 718 + 4 + 0 + + + 397 + 563 + 723 + 0 + 0 + + + 97 + 635 + 792 + 0 + 0 + + + 284 + 667 + 702 + 0 + 0 + + + 445 + 645 + 563 + 6 + 0 + + + 1 + 622 + 711 + 0 + 1 + + + 402 + 598 + 841 + 0 + 0 + + + 0 + 619 + 487 + 0 + 0 + + + 70 + 272 + 201 + 0 + 0 + + + 70 + 243 + 97 + 0 + 0 + + + 4 + 142 + 604 + 0 + 0 + + + 70 + 95 + 248 + 0 + 0 + + + 38 + 181 + 302 + 0 + 0 + + + 205 + 288 + 404 + 0 + 0 + + + 70 + 313 + 274 + 0 + 0 + + + 284 + 630 + 702 + 2 + 0 + + + 0 + 722 + 503 + 1 + 0 + + + 1 + 167 + 515 + 1 + 1 + + + 36 + 661 + 456 + 2 + 0 + + + 8 + 694 + 675 + 2 + 0 + + + 36 + 495 + 664 + 0 + 0 + + + 7 + 229 + 508 + 4 + 0 + + + 307 + 660 + 498 + 2 + 0 + + + 70 + 175 + 136 + 0 + 0 + + + 313 + 693 + 524 + 3 + 0 + + + 1 + 471 + 475 + 0 + 0 + + + 1 + 475 + 471 + 0 + 0 + + + 70 + 205 + 116 + 0 + 0 + + + 360 + 663 + 667 + 6 + 0 + + + 22 + 501 + 386 + 0 + 0 + + + 2 + 581 + 761 + 2 + 1 + + + 205 + 281 + 414 + 0 + 0 + + + 11 + 118 + 463 + 0 + 0 + + + 34 + 325 + 595 + 2 + 0 + + + 306 + 680 + 534 + 2 + 0 + + + 34 + 195 + 441 + 0 + 0 + + + 70 + 144 + 165 + 0 + 0 + + + 70 + 72 + 330 + 0 + 0 + + + 115 + 161 + 534 + 0 + 0 + + + 70 + 327 + 167 + 0 + 0 + + + 4 + 299 + 389 + 0 + 0 + + + 51 + 220 + 108 + 2 + 0 + + + 3 + 234 + 497 + 6 + 0 + + + 0 + 481 + 402 + 6 + 0 + + + 284 + 658 + 672 + 0 + 0 + + + 70 + 57 + 417 + 0 + 0 + + + 7 + 173 + 497 + 0 + 0 + + + 37 + 629 + 703 + 1 + 0 + + + 0 + 695 + 674 + 0 + 0 + + + 0 + 603 + 545 + 6 + 0 + + + 283 + 42 + 566 + 2 + 0 + + + 38 + 56 + 424 + 0 + 0 + + + 402 + 593 + 848 + 3 + 0 + + + 15 + 249 + 467 + 6 + 0 + + + 0 + 738 + 492 + 1 + 0 + + + 1 + 104 + 525 + 1 + 1 + + + 284 + 657 + 713 + 0 + 0 + + + 21 + 468 + 644 + 0 + 0 + + + 70 + 260 + 210 + 0 + 0 + + + 70 + 140 + 390 + 0 + 0 + + + 20 + 130 + 420 + 0 + 0 + + + 20 + 114 + 479 + 0 + 0 + + + 34 + 600 + 737 + 0 + 0 + + + 4 + 335 + 163 + 0 + 0 + + + 70 + 163 + 335 + 0 + 0 + + + 47 + 174 + 494 + 4 + 0 + + + 0 + 100 + 546 + 4 + 0 + + + 1 + 182 + 639 + 0 + 0 + + + 70 + 235 + 101 + 0 + 0 + + + 284 + 639 + 733 + 2 + 0 + + + 34 + 674 + 656 + 0 + 0 + + + 70 + 262 + 328 + 0 + 0 + + + 21 + 373 + 681 + 2 + 0 + + + 0 + 289 + 669 + 0 + 0 + + + 565 + 727 + 452 + 4 + 0 + + + 1 + 103 + 530 + 0 + 1 + + + 597 + 672 + 489 + 6 + 0 + + + 213 + 176 + 310 + 0 + 0 + + + 0 + 653 + 556 + 0 + 0 + + + 38 + 76 + 312 + 0 + 0 + + + 4 + 185 + 295 + 0 + 0 + + + 597 + 752 + 437 + 2 + 0 + + + 214 + 85 + 279 + 7 + 0 + + + 33 + 76 + 718 + 0 + 0 + + + 70 + 255 + 337 + 0 + 0 + + + 70 + 317 + 271 + 0 + 0 + + + 38 + 150 + 158 + 0 + 0 + + + 0 + 709 + 512 + 0 + 0 + + + 284 + 671 + 698 + 2 + 0 + + + 1 + 122 + 447 + 0 + 0 + + + 139 + 287 + 566 + 0 + 0 + + + 0 + 610 + 494 + 0 + 0 + + + 20 + 483 + 463 + 0 + 0 + + + 107 + 219 + 249 + 0 + 0 + + + 38 + 205 + 419 + 0 + 0 + + + 70 + 199 + 119 + 0 + 0 + + + 45 + 197 + 436 + 4 + 0 + + + 70 + 159 + 343 + 0 + 0 + + + 45 + 196 + 434 + 0 + 0 + + + 1 + 179 + 649 + 0 + 0 + + + 70 + 331 + 257 + 0 + 0 + + + 70 + 174 + 316 + 0 + 0 + + + 70 + 182 + 134 + 0 + 0 + + + 36 + 210 + 553 + 0 + 1 + + + 70 + 231 + 238 + 0 + 0 + + + 284 + 629 + 702 + 0 + 0 + + + 1009 + 226 + 108 + 2 + 0 + + + 420 + 639 + 691 + 0 + 0 + + + 394 + 475 + 690 + 1 + 0 + + + 4 + 649 + 505 + 6 + 0 + + + 284 + 659 + 711 + 2 + 0 + + + 436 + 617 + 1559 + 4 + 0 + + + 37 + 268 + 605 + 2 + 0 + + + 4 + 140 + 393 + 0 + 0 + + + 1 + 181 + 642 + 0 + 0 + + + 1 + 105 + 524 + 0 + 1 + + + 70 + 86 + 284 + 0 + 0 + + + 1 + 185 + 460 + 0 + 0 + + + 5 + 106 + 519 + 0 + 0 + + + 70 + 335 + 254 + 0 + 0 + + + 205 + 74 + 330 + 0 + 0 + + + 208 + 109 + 224 + 4 + 0 + + + 51 + 220 + 111 + 0 + 0 + + + 34 + 527 + 622 + 6 + 0 + + + 0 + 596 + 550 + 6 + 0 + + + 401 + 592 + 851 + 3 + 0 + + + 4 + 58 + 421 + 0 + 0 + + + 306 + 711 + 461 + 7 + 0 + + + 7 + 257 + 631 + 2 + 0 + + + 0 + 316 + 610 + 2 + 0 + + + 1 + 615 + 718 + 1 + 1 + + + 70 + 152 + 362 + 0 + 0 + + + 21 + 256 + 633 + 6 + 0 + + + 34 + 477 + 687 + 4 + 0 + + + 192 + 524 + 427 + 0 + 0 + + + 1 + 291 + 662 + 0 + 0 + + + 1 + 623 + 752 + 0 + 0 + + + 70 + 256 + 332 + 0 + 0 + + + 45 + 587 + 514 + 6 + 0 + + + 70 + 226 + 243 + 0 + 0 + + + 70 + 327 + 260 + 0 + 0 + + + 0 + 593 + 686 + 0 + 0 + + + 0 + 126 + 436 + 0 + 0 + + + 1 + 494 + 390 + 1 + 1 + + + 34 + 720 + 504 + 3 + 0 + + + 1 + 622 + 654 + 3 + 0 + + + 205 + 234 + 104 + 0 + 0 + + + 284 + 655 + 674 + 2 + 0 + + + 48 + 176 + 483 + 0 + 0 + + + 45 + 169 + 503 + 4 + 0 + + + 70 + 84 + 290 + 0 + 0 + + + 284 + 446 + 432 + 4 + 0 + + + 283 + 502 + 532 + 0 + 0 + + + 1 + 609 + 725 + 1 + 0 + + + 1 + 634 + 739 + 1 + 1 + + + 102 + 569 + 715 + 0 + 0 + + + 45 + 195 + 436 + 4 + 0 + + + 59 + 135 + 630 + 4 + 0 + + + 55 + 532 + 616 + 4 + 0 + + + 398 + 536 + 759 + 1 + 0 + + + 597 + 672 + 449 + 6 + 0 + + + 4 + 146 + 167 + 0 + 0 + + + 70 + 202 + 575 + 0 + 0 + + + 284 + 657 + 672 + 0 + 0 + + + 4 + 121 + 704 + 0 + 0 + + + 34 + 224 + 518 + 1 + 0 + + + 284 + 653 + 676 + 0 + 0 + + + 138 + 633 + 573 + 0 + 1 + + + 1 + 119 + 461 + 0 + 1 + + + 191 + 189 + 614 + 0 + 0 + + + 217 + 87 + 282 + 0 + 0 + + + 209 + 200 + 426 + 0 + 0 + + + 1 + 300 + 642 + 1 + 0 + + + 402 + 596 + 845 + 1 + 0 + + + 11 + 118 + 465 + 0 + 0 + + + 1 + 489 + 458 + 0 + 0 + + + 597 + 752 + 436 + 2 + 0 + + + 45 + 534 + 614 + 0 + 0 + + + 70 + 324 + 263 + 0 + 0 + + + 1188 + 223 + 110 + 6 + 0 + + + 34 + 653 + 462 + 2 + 0 + + + 20 + 175 + 487 + 2 + 0 + + + 1 + 613 + 664 + 3 + 0 + + + 38 + 283 + 194 + 0 + 0 + + + 0 + 607 + 497 + 0 + 0 + + + 38 + 150 + 366 + 0 + 0 + + + 0 + 173 + 671 + 0 + 0 + + + 38 + 327 + 355 + 0 + 0 + + + 1 + 213 + 545 + 0 + 1 + + + 562 + 667 + 544 + 0 + 0 + + + 3 + 106 + 518 + 0 + 0 + + + 33 + 455 + 663 + 0 + 0 + + + 7 + 615 + 762 + 0 + 0 + + + 4 + 261 + 210 + 0 + 0 + + + 205 + 210 + 261 + 0 + 0 + + + 70 + 92 + 266 + 0 + 0 + + + 1 + 179 + 648 + 0 + 0 + + + 718 + 735 + 446 + 0 + 0 + + + 38 + 72 + 340 + 0 + 0 + + + 70 + 191 + 287 + 0 + 0 + + + 20 + 103 + 532 + 0 + 1 + + + 34 + 635 + 475 + 0 + 0 + + + 3 + 232 + 500 + 0 + 0 + + + 4 + 106 + 231 + 0 + 0 + + + 68 + 631 + 478 + 2 + 0 + + + 3 + 170 + 501 + 2 + 0 + + + 284 + 651 + 678 + 0 + 0 + + + 284 + 661 + 709 + 0 + 0 + + + 1 + 709 + 661 + 0 + 0 + + + 0 + 175 + 663 + 0 + 0 + + + 1 + 309 + 525 + 0 + 1 + + + 404 + 535 + 760 + 1 + 0 + + + 70 + 327 + 169 + 0 + 0 + + + 33 + 500 + 656 + 1 + 0 + + + 45 + 170 + 502 + 2 + 0 + + + 1 + 177 + 655 + 0 + 0 + + + 54 + 572 + 528 + 0 + 0 + + + 284 + 624 + 708 + 2 + 0 + + + 1 + 125 + 442 + 0 + 0 + + + 70 + 203 + 571 + 0 + 0 + + + 284 + 665 + 705 + 0 + 0 + + + 38 + 705 + 665 + 0 + 0 + + + 32 + 497 + 660 + 1 + 0 + + + 575 + 714 + 508 + 0 + 0 + + + 33 + 393 + 679 + 0 + 0 + + + 70 + 82 + 295 + 0 + 0 + + + 215 + 87 + 278 + 0 + 0 + + + 0 + 186 + 459 + 0 + 0 + + + 20 + 114 + 485 + 0 + 0 + + + 402 + 598 + 842 + 6 + 0 + + + 313 + 682 + 481 + 3 + 0 + + + 160 + 257 + 630 + 6 + 0 + + + 1 + 296 + 652 + 0 + 0 + + + 107 + 222 + 249 + 0 + 0 + + + 34 + 707 + 464 + 3 + 0 + + + 70 + 196 + 282 + 0 + 0 + + + 642 + 729 + 450 + 6 + 0 + + + 283 + 591 + 852 + 7 + 0 + + + 102 + 618 + 658 + 0 + 0 + + + 70 + 133 + 415 + 0 + 0 + + + 597 + 672 + 488 + 6 + 0 + + + 70 + 317 + 269 + 0 + 0 + + + 4 + 319 + 173 + 0 + 0 + + + 13 + 173 + 319 + 0 + 0 + + + 38 + 56 + 430 + 0 + 0 + + + 38 + 112 + 215 + 0 + 0 + + + 4 + 283 + 195 + 0 + 0 + + + 284 + 663 + 707 + 0 + 0 + + + 38 + 707 + 663 + 0 + 0 + + + 108 + 108 + 223 + 2 + 0 + + + 70 + 181 + 133 + 0 + 0 + + + 205 + 291 + 293 + 0 + 0 + + + 45 + 256 + 632 + 4 + 0 + + + 70 + 59 + 408 + 0 + 0 + + + 45 + 466 + 648 + 2 + 0 + + + 70 + 253 + 337 + 0 + 0 + + + 38 + 132 + 418 + 0 + 0 + + + 1012 + 225 + 107 + 0 + 0 + + + 38 + 294 + 290 + 0 + 0 + + + 0 + 342 + 655 + 0 + 0 + + + 718 + 737 + 445 + 2 + 0 + + + 70 + 63 + 382 + 0 + 0 + + + 1 + 181 + 471 + 0 + 0 + + + 88 + 113 + 213 + 2 + 0 + + + 70 + 166 + 145 + 0 + 0 + + + 38 + 145 + 166 + 0 + 0 + + + 1 + 128 + 666 + 0 + 0 + + + 38 + 235 + 235 + 0 + 0 + + + 284 + 632 + 699 + 2 + 0 + + + 1 + 272 + 595 + 0 + 0 + + + 70 + 137 + 176 + 0 + 0 + + + 0 + 616 + 660 + 3 + 0 + + + 0 + 340 + 659 + 0 + 0 + + + 0 + 583 + 518 + 4 + 0 + + + 45 + 441 + 508 + 4 + 0 + + + 597 + 683 + 531 + 4 + 0 + + + 70 + 215 + 539 + 0 + 0 + + + 284 + 644 + 686 + 0 + 0 + + + 20 + 96 + 575 + 0 + 0 + + + 4 + 276 + 309 + 0 + 0 + + + 284 + 652 + 719 + 0 + 0 + + + 1 + 115 + 480 + 6 + 0 + + + 34 + 86 + 641 + 0 + 0 + + + 215 + 87 + 279 + 5 + 0 + + + 70 + 199 + 122 + 0 + 0 + + + 938 + 715 + 704 + 0 + 0 + + + 1 + 183 + 467 + 0 + 0 + + + 45 + 196 + 436 + 4 + 0 + + + 3 + 233 + 497 + 0 + 0 + + + 70 + 221 + 524 + 0 + 0 + + + 284 + 668 + 702 + 0 + 0 + + + 70 + 238 + 359 + 0 + 0 + + + 70 + 216 + 536 + 0 + 0 + + + 34 + 356 + 715 + 0 + 0 + + + 445 + 623 + 582 + 0 + 0 + + + 70 + 320 + 267 + 0 + 0 + + + 1 + 118 + 467 + 1 + 1 + + + 34 + 743 + 488 + 3 + 0 + + + 1 + 474 + 473 + 0 + 0 + + + 283 + 604 + 442 + 0 + 0 + + + 597 + 726 + 452 + 6 + 0 + + + 938 + 713 + 706 + 0 + 0 + + + 1 + 127 + 434 + 0 + 0 + + + 36 + 355 + 717 + 0 + 0 + + + 15 + 497 + 388 + 2 + 0 + + + 938 + 688 + 642 + 0 + 0 + + + 4 + 56 + 434 + 4 + 0 + + + 97 + 234 + 495 + 0 + 0 + + + 284 + 631 + 700 + 0 + 0 + + + 1 + 166 + 515 + 0 + 1 + + + 51 + 225 + 108 + 6 + 0 + + + 24 + 227 + 107 + 0 + 1 + + + 70 + 98 + 248 + 0 + 0 + + + 11 + 311 + 521 + 4 + 0 + + + 45 + 197 + 434 + 0 + 0 + + + 1139 + 501 + 385 + 0 + 0 + + + 284 + 669 + 701 + 2 + 0 + + + 0 + 481 + 401 + 6 + 0 + + + 34 + 548 + 551 + 0 + 0 + + + 284 + 655 + 716 + 2 + 0 + + + 70 + 88 + 276 + 0 + 0 + + + 306 + 711 + 510 + 0 + 0 + + + 70 + 209 + 409 + 0 + 0 + + + 38 + 90 + 270 + 0 + 0 + + + 3 + 172 + 497 + 0 + 0 + + + 1 + 553 + 546 + 0 + 0 + + + 4 + 303 + 182 + 0 + 0 + + + 70 + 148 + 372 + 0 + 0 + + + 1 + 293 + 658 + 0 + 0 + + + 4 + 207 + 266 + 0 + 0 + + + 70 + 133 + 414 + 0 + 0 + + + 13 + 171 + 322 + 2 + 0 + + + 0 + 511 + 498 + 4 + 0 + + + 70 + 305 + 280 + 0 + 0 + + + 70 + 189 + 128 + 0 + 0 + + + 1 + 359 + 537 + 0 + 0 + + + 108 + 109 + 222 + 2 + 0 + + + 8 + 55 + 440 + 0 + 0 + + + 938 + 718 + 701 + 4 + 0 + + + 102 + 619 + 657 + 0 + 0 + + + 1 + 189 + 452 + 0 + 0 + + + 183 + 360 + 707 + 0 + 0 + + + 1 + 116 + 475 + 0 + 0 + + + 0 + 671 + 489 + 6 + 0 + + + 597 + 746 + 486 + 2 + 0 + + + 4 + 95 + 255 + 0 + 0 + + + 70 + 306 + 180 + 0 + 0 + + + 70 + 180 + 306 + 0 + 0 + + + 70 + 153 + 360 + 0 + 0 + + + 4 + 162 + 340 + 0 + 0 + + + 36 + 662 + 456 + 2 + 0 + + + 108 + 223 + 247 + 4 + 0 + + + 70 + 293 + 188 + 0 + 0 + + + 205 + 166 + 146 + 0 + 0 + + + 1 + 185 + 625 + 0 + 0 + + + 70 + 55 + 415 + 0 + 0 + + + 70 + 310 + 373 + 0 + 0 + + + 21 + 465 + 650 + 6 + 0 + + + 49 + 106 + 504 + 6 + 0 + + + 1 + 179 + 646 + 0 + 0 + + + 0 + 158 + 535 + 4 + 0 + + + 38 + 297 + 654 + 0 + 0 + + + 70 + 126 + 424 + 0 + 0 + + + 70 + 295 + 392 + 0 + 0 + + + 1132 + 498 + 390 + 6 + 0 + + + 284 + 630 + 700 + 0 + 0 + + + 37 + 488 + 398 + 0 + 0 + + + 45 + 425 + 457 + 4 + 0 + + + 445 + 623 + 585 + 0 + 0 + + + 284 + 669 + 698 + 2 + 0 + + + 70 + 264 + 320 + 0 + 0 + + + 3 + 176 + 480 + 0 + 0 + + + 70 + 217 + 246 + 0 + 0 + + + 88 + 105 + 217 + 2 + 0 + + + 377 + 659 + 762 + 3 + 0 + + + 729 + 471 + 3398 + 7 + 0 + + + 377 + 636 + 573 + 4 + 0 + + + 88 + 106 + 215 + 2 + 0 + + + 70 + 153 + 349 + 0 + 0 + + + 25 + 130 + 650 + 0 + 0 + + + 70 + 200 + 578 + 6 + 0 + + + 0 + 601 + 676 + 0 + 0 + + + 4 + 207 + 258 + 0 + 0 + + + 45 + 168 + 503 + 4 + 0 + + + 4 + 300 + 178 + 0 + 0 + + + 70 + 150 + 356 + 0 + 0 + + + 1 + 120 + 445 + 0 + 0 + + + 38 + 87 + 263 + 0 + 0 + + + 66 + 93 + 575 + 0 + 0 + + + 20 + 127 + 666 + 0 + 0 + + + 20 + 278 + 2959 + 0 + 0 + + + 208 + 104 + 220 + 2 + 0 + + + 1 + 694 + 673 + 0 + 0 + + + 321 + 468 + 646 + 6 + 0 + + + 45 + 194 + 436 + 4 + 0 + + + 70 + 118 + 194 + 0 + 0 + + + 718 + 727 + 453 + 0 + 0 + + + 0 + 163 + 519 + 0 + 0 + + + 34 + 427 + 708 + 0 + 0 + + + 1 + 174 + 665 + 0 + 0 + + + 34 + 619 + 532 + 6 + 0 + + + 34 + 605 + 729 + 0 + 0 + + + 70 + 224 + 102 + 0 + 0 + + + 1128 + 493 + 394 + 6 + 0 + + + 29 + 102 + 524 + 0 + 0 + + + 4 + 57 + 401 + 0 + 0 + + + 70 + 312 + 271 + 0 + 0 + + + 1 + 180 + 127 + 0 + 1 + + + 38 + 302 + 177 + 0 + 0 + + + 38 + 177 + 302 + 0 + 0 + + + 1 + 183 + 632 + 0 + 0 + + + 70 + 243 + 348 + 0 + 0 + + + 29 + 104 + 514 + 0 + 0 + + + 191 + 189 + 612 + 0 + 0 + + + 0 + 687 + 440 + 3 + 0 + + + 284 + 655 + 713 + 0 + 0 + + + 70 + 213 + 251 + 0 + 0 + + + 284 + 671 + 696 + 2 + 0 + + + 597 + 672 + 490 + 6 + 0 + + + 38 + 161 + 331 + 0 + 0 + + + 3 + 231 + 500 + 0 + 0 + + + 284 + 657 + 711 + 0 + 0 + + + 4 + 90 + 255 + 0 + 0 + + + 395 + 488 + 675 + 1 + 0 + + + 12 + 173 + 308 + 0 + 0 + + + 1 + 50 + 459 + 1 + 0 + + + 38 + 691 + 676 + 2 + 0 + + + 597 + 752 + 438 + 2 + 0 + + + 36 + 736 + 495 + 7 + 0 + + + 284 + 639 + 731 + 2 + 0 + + + 1 + 170 + 498 + 1 + 1 + + + 70 + 239 + 223 + 0 + 0 + + + 70 + 86 + 267 + 0 + 0 + + + 284 + 628 + 702 + 0 + 0 + + + 4 + 692 + 675 + 0 + 0 + + + 1 + 97 + 549 + 4 + 0 + + + 284 + 40 + 573 + 0 + 0 + + + 1 + 132 + 641 + 2 + 1 + + + 0 + 640 + 472 + 5 + 0 + + + 70 + 148 + 155 + 0 + 0 + + + 12 + 167 + 319 + 0 + 0 + + + 37 + 340 + 660 + 0 + 0 + + + 284 + 656 + 672 + 0 + 0 + + + 0 + 52 + 441 + 0 + 0 + + + 1 + 131 + 646 + 0 + 0 + + + 308 + 489 + 522 + 3 + 0 + + + 45 + 195 + 434 + 0 + 0 + + + 70 + 273 + 310 + 0 + 0 + + + 70 + 270 + 428 + 0 + 0 + + + 70 + 233 + 229 + 0 + 0 + + + 430 + 634 + 792 + 0 + 0 + + + 34 + 177 + 653 + 1 + 0 + + + 45 + 258 + 635 + 0 + 0 + + + 35 + 212 + 545 + 1 + 1 + + + 32 + 369 + 692 + 0 + 0 + + + 32 + 375 + 714 + 0 + 0 + + + 1 + 685 + 682 + 0 + 0 + + + 4 + 147 + 363 + 0 + 0 + + + 1 + 182 + 635 + 0 + 0 + + + 597 + 742 + 444 + 0 + 0 + + + 139 + 584 + 755 + 4 + 0 + + + 70 + 215 + 248 + 0 + 0 + + + 70 + 136 + 169 + 0 + 0 + + + 1 + 122 + 437 + 0 + 0 + + + 34 + 392 + 683 + 0 + 0 + + + 70 + 242 + 350 + 0 + 0 + + + 4 + 264 + 202 + 0 + 0 + + + 143 + 101 + 528 + 0 + 0 + + + 21 + 441 + 509 + 6 + 0 + + + 284 + 489 + 397 + 6 + 0 + + + 88 + 106 + 213 + 2 + 0 + + + 284 + 659 + 709 + 2 + 0 + + + 70 + 220 + 244 + 0 + 0 + + + 36 + 761 + 433 + 3 + 0 + + + 1 + 180 + 641 + 0 + 0 + + + 205 + 211 + 107 + 0 + 0 + + + 284 + 647 + 682 + 2 + 0 + + + 0 + 697 + 434 + 3 + 0 + + + 1 + 124 + 433 + 0 + 0 + + + 20 + 143 + 593 + 0 + 0 + + + 70 + 287 + 187 + 0 + 0 + + + 273 + 614 + 761 + 0 + 0 + + + 38 + 206 + 560 + 6 + 0 + + + 70 + 231 + 367 + 0 + 0 + + + 205 + 54 + 418 + 0 + 0 + + + 193 + 373 + 684 + 0 + 0 + + + 46 + 446 + 436 + 2 + 0 + + + 4 + 275 + 594 + 0 + 0 + + + 36 + 494 + 667 + 0 + 0 + + + 0 + 754 + 483 + 3 + 0 + + + 70 + 86 + 262 + 0 + 0 + + + 143 + 101 + 531 + 6 + 0 + + + 32 + 85 + 631 + 0 + 0 + + + 97 + 233 + 495 + 0 + 0 + + + 1 + 496 + 392 + 1 + 1 + + + 38 + 709 + 659 + 0 + 0 + + + 70 + 115 + 196 + 0 + 0 + + + 0 + 695 + 524 + 1 + 0 + + + 199 + 51 + 438 + 1 + 1 + + + 597 + 686 + 531 + 4 + 0 + + + 25 + 208 + 555 + 4 + 0 + + + 88 + 102 + 222 + 2 + 0 + + + 70 + 148 + 153 + 0 + 0 + + + 70 + 296 + 390 + 0 + 0 + + + 1 + 610 + 496 + 0 + 0 + + + 0 + 189 + 449 + 0 + 0 + + + 284 + 649 + 680 + 0 + 0 + + + 285 + 549 + 487 + 4 + 0 + + + 597 + 744 + 443 + 4 + 0 + + + 284 + 626 + 705 + 2 + 0 + + + 0 + 127 + 668 + 0 + 0 + + + 27 + 436 + 694 + 2 + 0 + + + 205 + 73 + 310 + 0 + 0 + + + 70 + 277 + 194 + 0 + 0 + + + 284 + 661 + 707 + 0 + 0 + + + 1 + 707 + 661 + 0 + 0 + + + 70 + 157 + 144 + 0 + 0 + + + 38 + 133 + 170 + 0 + 0 + + + 70 + 70 + 323 + 0 + 0 + + + 88 + 205 + 563 + 0 + 0 + + + 283 + 712 + 705 + 0 + 0 + + + 70 + 141 + 381 + 0 + 0 + + + 20 + 127 + 423 + 0 + 0 + + + 70 + 316 + 170 + 0 + 0 + + + 183 + 363 + 703 + 0 + 0 + + + 70 + 222 + 242 + 0 + 0 + + + 70 + 218 + 389 + 0 + 0 + + + 70 + 274 + 196 + 0 + 0 + + + 70 + 196 + 274 + 0 + 0 + + + 70 + 165 + 137 + 0 + 0 + + + 307 + 513 + 438 + 0 + 0 + + + 70 + 260 + 206 + 0 + 0 + + + 70 + 82 + 277 + 0 + 0 + + + 70 + 204 + 565 + 0 + 0 + + + 286 + 516 + 586 + 0 + 0 + + + 70 + 315 + 170 + 0 + 0 + + + 70 + 197 + 431 + 0 + 0 + + + 6 + 119 + 450 + 0 + 0 + + + 4 + 194 + 276 + 0 + 0 + + + 217 + 698 + 632 + 1 + 0 + + + 284 + 632 + 698 + 2 + 0 + + + 4 + 308 + 631 + 2 + 0 + + + 284 + 643 + 686 + 0 + 0 + + + 938 + 686 + 643 + 0 + 0 + + + 37 + 177 + 651 + 0 + 0 + + + 70 + 57 + 398 + 0 + 0 + + + 88 + 107 + 212 + 2 + 0 + + + 4 + 162 + 524 + 0 + 0 + + + 1 + 101 + 530 + 0 + 1 + + + 0 + 607 + 543 + 6 + 0 + + + 980 + 617 + 490 + 6 + 0 + + + 34 + 691 + 477 + 3 + 0 + + + 0 + 481 + 404 + 6 + 0 + + + 20 + 585 + 754 + 0 + 0 + + + 70 + 301 + 282 + 0 + 0 + + + 0 + 683 + 533 + 1 + 0 + + + 0 + 52 + 436 + 0 + 0 + + + 205 + 208 + 109 + 0 + 0 + + + 597 + 746 + 488 + 2 + 0 + + + 4 + 616 + 591 + 0 + 0 + + + 284 + 650 + 719 + 0 + 0 + + + 70 + 145 + 369 + 0 + 0 + + + 395 + 487 + 677 + 1 + 0 + + + 12 + 165 + 325 + 0 + 0 + + + 45 + 466 + 649 + 2 + 0 + + + 59 + 558 + 542 + 0 + 0 + + + 7 + 171 + 497 + 0 + 0 + + + 70 + 303 + 177 + 0 + 0 + + + 46 + 449 + 433 + 2 + 0 + + + 1 + 165 + 515 + 1 + 1 + + + 1012 + 448 + 3366 + 4 + 0 + + + 283 + 450 + 432 + 4 + 0 + + + 45 + 537 + 614 + 0 + 0 + + + 4 + 333 + 161 + 0 + 0 + + + 24 + 172 + 494 + 0 + 0 + + + 1 + 593 + 556 + 6 + 0 + + + 3 + 232 + 497 + 0 + 0 + + + 70 + 144 + 158 + 0 + 0 + + + 1 + 121 + 443 + 0 + 0 + + + 1 + 180 + 472 + 0 + 0 + + + 34 + 426 + 710 + 0 + 0 + + + 36 + 495 + 666 + 0 + 0 + + + 15 + 249 + 463 + 6 + 0 + + + 9 + 77 + 696 + 0 + 0 + + + 597 + 672 + 450 + 6 + 0 + + + 7 + 615 + 760 + 4 + 0 + + + 191 + 189 + 610 + 0 + 0 + + + 34 + 721 + 505 + 3 + 0 + + + 0 + 666 + 495 + 6 + 0 + + + 70 + 119 + 191 + 0 + 0 + + + 284 + 645 + 684 + 0 + 0 + + + 37 + 634 + 477 + 2 + 0 + + + 1 + 314 + 619 + 2 + 0 + + + 37 + 723 + 456 + 7 + 0 + + + 284 + 624 + 707 + 2 + 0 + + + 284 + 663 + 705 + 0 + 0 + + + 70 + 92 + 247 + 0 + 0 + + + 394 + 482 + 684 + 3 + 0 + + + 0 + 757 + 481 + 3 + 0 + + + 70 + 101 + 225 + 0 + 0 + + + 70 + 208 + 112 + 0 + 0 + + + 70 + 122 + 191 + 0 + 0 + + + 283 + 711 + 707 + 0 + 0 + + + 34 + 611 + 538 + 6 + 0 + + + 34 + 708 + 710 + 2 + 0 + + + 20 + 313 + 521 + 0 + 0 + + + 23 + 664 + 704 + 0 + 0 + + + 110 + 227 + 507 + 4 + 0 + + + 104 + 685 + 643 + 0 + 0 + + + 283 + 601 + 446 + 0 + 0 + + + 70 + 184 + 293 + 0 + 0 + + + 597 + 742 + 443 + 2 + 0 + + + 4 + 88 + 265 + 0 + 0 + + + 70 + 203 + 567 + 0 + 0 + + + 70 + 81 + 288 + 0 + 0 + + + 45 + 167 + 503 + 4 + 0 + + + 183 + 363 + 705 + 0 + 0 + + + 34 + 396 + 677 + 0 + 0 + + + 0 + 674 + 540 + 1 + 0 + + + 70 + 65 + 359 + 0 + 0 + + + 284 + 644 + 684 + 0 + 0 + + + 20 + 175 + 480 + 0 + 0 + + + 70 + 321 + 168 + 0 + 0 + + + 284 + 632 + 697 + 2 + 0 + + + 70 + 299 + 385 + 0 + 0 + + + 1 + 97 + 556 + 4 + 0 + + + 77 + 117 + 461 + 4 + 0 + + + 103 + 637 + 853 + 6 + 0 + + + 4 + 222 + 243 + 0 + 0 + + + 70 + 325 + 166 + 0 + 0 + + + 34 + 83 + 650 + 0 + 0 + + + 205 + 102 + 229 + 0 + 0 + + + 285 + 488 + 397 + 0 + 0 + + + 1 + 271 + 602 + 1 + 1 + + + 70 + 132 + 177 + 0 + 0 + + + 938 + 683 + 645 + 0 + 0 + + + 70 + 80 + 292 + 0 + 0 + + + 70 + 58 + 403 + 0 + 0 + + + 70 + 62 + 377 + 0 + 0 + + + 110 + 228 + 505 + 4 + 0 + + + 37 + 645 + 683 + 3 + 0 + + + 70 + 261 + 322 + 0 + 0 + + + 1 + 616 + 759 + 0 + 1 + + + 51 + 617 + 714 + 4 + 0 + + + 70 + 283 + 297 + 0 + 0 + + + 70 + 297 + 283 + 0 + 0 + + + 284 + 666 + 702 + 0 + 0 + + + 286 + 515 + 497 + 0 + 0 + + + 0 + 608 + 498 + 0 + 0 + + + 13 + 173 + 312 + 0 + 0 + + + 38 + 330 + 349 + 0 + 0 + + + 283 + 701 + 667 + 4 + 0 + + + 70 + 271 + 425 + 0 + 0 + + + 51 + 266 + 2963 + 2 + 0 + + + 70 + 195 + 120 + 0 + 0 + + + 284 + 624 + 706 + 2 + 0 + + + 313 + 696 + 523 + 3 + 0 + + + 70 + 112 + 209 + 0 + 0 + + + 4 + 294 + 286 + 0 + 0 + + + 38 + 300 + 180 + 0 + 0 + + + 32 + 539 + 753 + 0 + 0 + + + 70 + 219 + 526 + 0 + 0 + + + 420 + 685 + 480 + 6 + 0 + + + 34 + 513 + 499 + 0 + 0 + + + 70 + 157 + 344 + 0 + 0 + + + 306 + 763 + 532 + 3 + 0 + + + 15 + 163 + 516 + 0 + 0 + + + 29 + 502 + 448 + 0 + 0 + + + 4 + 143 + 376 + 0 + 0 + + + 88 + 107 + 219 + 2 + 0 + + + 284 + 448 + 432 + 4 + 0 + + + 284 + 654 + 715 + 0 + 0 + + + 205 + 190 + 283 + 0 + 0 + + + 89 + 131 + 642 + 4 + 0 + + + 38 + 214 + 393 + 0 + 0 + + + 4 + 96 + 244 + 0 + 0 + + + 70 + 289 + 291 + 0 + 0 + + + 63 + 490 + 395 + 6 + 0 + + + 278 + 645 + 564 + 0 + 0 + + + 106 + 216 + 249 + 4 + 0 + + + 46 + 447 + 433 + 2 + 0 + + + 13 + 167 + 322 + 2 + 0 + + + 205 + 197 + 119 + 0 + 0 + + + 192 + 659 + 499 + 4 + 0 + + + 46 + 446 + 434 + 2 + 0 + + + 51 + 622 + 708 + 6 + 0 + + + 70 + 305 + 377 + 0 + 0 + + + 34 + 697 + 522 + 2 + 0 + + + 284 + 669 + 699 + 2 + 0 + + + 70 + 237 + 227 + 0 + 0 + + + 38 + 170 + 138 + 0 + 0 + + + 70 + 68 + 345 + 0 + 0 + + + 1 + 134 + 628 + 1 + 1 + + + 51 + 230 + 500 + 2 + 0 + + + 1 + 150 + 561 + 0 + 1 + + + 70 + 198 + 425 + 0 + 0 + + + 70 + 275 + 306 + 0 + 0 + + + 70 + 121 + 194 + 0 + 0 + + + 15 + 118 + 456 + 6 + 0 + + + 306 + 674 + 488 + 1 + 0 + + + 143 + 101 + 533 + 6 + 0 + + + 284 + 642 + 686 + 0 + 0 + + + 284 + 655 + 714 + 2 + 0 + + + 311 + 494 + 543 + 0 + 0 + + + 273 + 644 + 565 + 0 + 0 + + + 70 + 325 + 259 + 0 + 0 + + + 38 + 58 + 405 + 0 + 0 + + + 102 + 567 + 716 + 0 + 0 + + + 960 + 638 + 733 + 0 + 0 + + + 4 + 276 + 305 + 0 + 0 + + + 34 + 637 + 789 + 0 + 0 + + + 25 + 208 + 553 + 4 + 0 + + + 70 + 111 + 212 + 0 + 0 + + + 1 + 161 + 523 + 0 + 0 + + + 55 + 569 + 532 + 0 + 0 + + + 664 + 664 + 757 + 7 + 0 + + + 4 + 268 + 201 + 0 + 0 + + + 70 + 315 + 171 + 0 + 0 + + + 55 + 534 + 616 + 4 + 0 + + + 70 + 191 + 282 + 0 + 0 + + + 45 + 194 + 434 + 0 + 0 + + + 70 + 217 + 388 + 0 + 0 + + + 88 + 105 + 224 + 2 + 0 + + + 4 + 269 + 313 + 0 + 0 + + + 283 + 489 + 396 + 6 + 0 + + + 494 + 622 + 585 + 4 + 0 + + + 284 + 671 + 697 + 2 + 0 + + + 1012 + 220 + 107 + 0 + 0 + + + 0 + 614 + 493 + 0 + 0 + + + 102 + 617 + 658 + 0 + 0 + + + 70 + 125 + 431 + 0 + 0 + + + 4 + 259 + 208 + 0 + 0 + + + 70 + 208 + 259 + 0 + 0 + + + 1 + 104 + 518 + 0 + 1 + + + 224 + 254 + 643 + 4 + 0 + + + 407 + 638 + 570 + 0 + 0 + + + 313 + 698 + 521 + 3 + 0 + + + 38 + 61 + 378 + 0 + 0 + + + 70 + 183 + 126 + 0 + 0 + + + 70 + 189 + 122 + 0 + 0 + + + 563 + 660 + 551 + 2 + 0 + + + 284 + 626 + 704 + 2 + 0 + + + 7 + 118 + 459 + 4 + 0 + + + 0 + 120 + 702 + 0 + 0 + + + 192 + 654 + 503 + 4 + 0 + + + 20 + 177 + 476 + 0 + 0 + + + 38 + 244 + 222 + 0 + 0 + + + 70 + 198 + 580 + 6 + 0 + + + 284 + 656 + 713 + 0 + 0 + + + 63 + 128 + 658 + 4 + 0 + + + 70 + 312 + 368 + 0 + 0 + + + 116 + 208 + 552 + 2 + 0 + + + 306 + 732 + 554 + 0 + 0 + + + 306 + 764 + 476 + 0 + 0 + + + 396 + 535 + 758 + 1 + 0 + + + 284 + 639 + 732 + 2 + 0 + + + 0 + 695 + 436 + 3 + 0 + + + 284 + 449 + 432 + 4 + 0 + + + 306 + 746 + 441 + 7 + 0 + + + 43 + 210 + 547 + 4 + 0 + + + 284 + 652 + 676 + 0 + 0 + + + 70 + 269 + 427 + 0 + 0 + + + 37 + 341 + 660 + 0 + 0 + + + 1 + 182 + 463 + 0 + 0 + + + 70 + 334 + 344 + 0 + 0 + + + 309 + 647 + 723 + 0 + 0 + + + 44 + 615 + 1562 + 0 + 0 + + + 70 + 257 + 211 + 0 + 0 + + + 70 + 225 + 241 + 0 + 0 + + + 428 + 681 + 445 + 4 + 0 + + + 1 + 500 + 388 + 0 + 1 + + + 205 + 299 + 282 + 0 + 0 + + + 205 + 56 + 413 + 0 + 0 + + + 205 + 131 + 414 + 0 + 0 + + + 38 + 712 + 657 + 0 + 0 + + + 70 + 320 + 359 + 0 + 0 + + + 407 + 218 + 106 + 0 + 0 + + + 70 + 121 + 191 + 0 + 0 + + + 597 + 685 + 531 + 4 + 0 + + + 34 + 649 + 507 + 0 + 0 + + + 419 + 720 + 457 + 0 + 0 + + + 3 + 164 + 514 + 0 + 0 + + + 70 + 323 + 261 + 0 + 0 + + + 70 + 54 + 428 + 0 + 0 + + + 38 + 115 + 201 + 0 + 0 + + + 1 + 168 + 502 + 0 + 1 + + + 1 + 176 + 653 + 0 + 0 + + + 70 + 66 + 351 + 0 + 0 + + + 70 + 99 + 234 + 0 + 0 + + + 274 + 451 + 672 + 4 + 0 + + + 597 + 672 + 451 + 6 + 0 + + + 11 + 447 + 678 + 6 + 0 + + + 70 + 136 + 399 + 0 + 0 + + + 70 + 204 + 266 + 0 + 0 + + + 5 + 102 + 532 + 0 + 0 + + + 5 + 308 + 529 + 0 + 0 + + + 284 + 655 + 673 + 2 + 0 + + + 668 + 729 + 499 + 0 + 0 + + + 191 + 189 + 608 + 0 + 0 + + + 1 + 170 + 496 + 1 + 1 + + + 38 + 160 + 339 + 0 + 0 + + + 284 + 658 + 711 + 0 + 0 + + + 38 + 711 + 658 + 0 + 0 + + + 70 + 221 + 520 + 0 + 0 + + + 407 + 649 + 625 + 0 + 0 + + + 37 + 166 + 508 + 4 + 0 + + + 143 + 101 + 535 + 6 + 0 + + + 21 + 373 + 685 + 2 + 0 + + + 70 + 56 + 414 + 0 + 0 + + + 70 + 176 + 307 + 0 + 0 + + + 70 + 261 + 207 + 0 + 0 + + + 164 + 730 + 498 + 0 + 0 + + + 191 + 185 + 620 + 0 + 0 + + + 38 + 697 + 582 + 2 + 0 + + + 1 + 185 + 456 + 0 + 0 + + + 7 + 614 + 762 + 0 + 0 + + + 45 + 536 + 614 + 0 + 0 + + + 33 + 390 + 687 + 0 + 0 + + + 325 + 555 + 593 + 0 + 0 + + + 70 + 270 + 425 + 0 + 0 + + + 285 + 481 + 403 + 0 + 0 + + + 88 + 109 + 213 + 2 + 0 + + + 284 + 647 + 681 + 2 + 0 + + + 20 + 610 + 596 + 2 + 0 + + + 349 + 180 + 129 + 0 + 0 + + + 1 + 162 + 521 + 0 + 0 + + + 70 + 298 + 385 + 0 + 0 + + + 45 + 466 + 650 + 2 + 0 + + + 4 + 139 + 167 + 0 + 0 + + + 313 + 506 + 505 + 0 + 0 + + + 105 + 573 + 708 + 0 + 0 + + + 284 + 659 + 710 + 2 + 0 + + + 401 + 598 + 840 + 5 + 0 + + + 70 + 182 + 297 + 0 + 0 + + + 0 + 669 + 492 + 6 + 0 + + + 70 + 327 + 351 + 0 + 0 + + + 597 + 743 + 443 + 4 + 0 + + + 70 + 102 + 228 + 0 + 0 + + + 70 + 69 + 337 + 0 + 0 + + + 51 + 618 + 713 + 6 + 0 + + + 284 + 648 + 680 + 0 + 0 + + + 22 + 501 + 387 + 0 + 0 + + + 70 + 184 + 294 + 0 + 0 + + + 205 + 196 + 276 + 0 + 0 + + + 38 + 123 + 189 + 0 + 0 + + + 306 + 739 + 549 + 3 + 0 + + + 205 + 66 + 352 + 0 + 0 + + + 21 + 537 + 613 + 2 + 0 + + + 4 + 292 + 393 + 0 + 0 + + + 164 + 755 + 436 + 4 + 0 + + + 307 + 545 + 469 + 0 + 0 + + + 45 + 258 + 632 + 4 + 0 + + + 7 + 171 + 494 + 4 + 0 + + + 70 + 280 + 410 + 0 + 0 + + + 70 + 272 + 199 + 0 + 0 + + + 3 + 231 + 497 + 0 + 0 + + + 1 + 289 + 671 + 0 + 0 + + + 70 + 206 + 113 + 0 + 0 + + + 32 + 536 + 757 + 0 + 0 + + + 284 + 650 + 678 + 0 + 0 + + + 38 + 206 + 410 + 0 + 0 + + + 70 + 175 + 133 + 0 + 0 + + + 13 + 165 + 328 + 2 + 0 + + + 205 + 235 + 99 + 0 + 0 + + + 284 + 634 + 674 + 2 + 0 + + + 205 + 619 + 491 + 0 + 0 + + + 34 + 58 + 453 + 0 + 0 + + + 34 + 214 + 447 + 4 + 0 + + + 193 + 224 + 659 + 4 + 0 + + + 407 + 759 + 563 + 5 + 0 + + + 285 + 516 + 589 + 0 + 0 + + + 1 + 555 + 617 + 0 + 1 + + + 209 + 223 + 429 + 7 + 0 + + + 70 + 256 + 239 + 0 + 0 + + + 565 + 702 + 531 + 2 + 0 + + + 70 + 306 + 425 + 0 + 0 + + + 306 + 721 + 517 + 6 + 0 + + + 34 + 727 + 471 + 7 + 0 + + + 0 + 256 + 508 + 0 + 0 + + + 70 + 217 + 282 + 0 + 0 + + + 1039 + 59 + 445 + 0 + 0 + + + 0 + 750 + 497 + 3 + 0 + + + 47 + 436 + 697 + 2 + 0 + + + 29 + 213 + 449 + 2 + 0 + + + 1 + 608 + 652 + 3 + 0 + + + 34 + 195 + 667 + 1 + 0 + + + 70 + 101 + 260 + 0 + 0 + + + 23 + 630 + 741 + 0 + 0 + + + 284 + 665 + 702 + 0 + 0 + + + 5 + 60 + 439 + 0 + 0 + + + 5 + 743 + 461 + 0 + 0 + + + 1 + 269 + 549 + 1 + 1 + + + 313 + 735 + 466 + 3 + 0 + + + 38 + 105 + 251 + 0 + 0 + + + 20 + 107 + 573 + 0 + 0 + + + 204 + 329 + 291 + 0 + 0 + + + 70 + 156 + 393 + 0 + 0 + + + 284 + 667 + 700 + 0 + 0 + + + 307 + 543 + 465 + 0 + 0 + + + 29 + 332 + 550 + 2 + 0 + + + 205 + 281 + 218 + 0 + 0 + + + 100 + 503 + 502 + 4 + 0 + + + 20 + 471 + 463 + 6 + 0 + + + 206 + 319 + 300 + 0 + 0 + + + 205 + 463 + 471 + 0 + 0 + + + 70 + 70 + 376 + 0 + 0 + + + 70 + 235 + 112 + 0 + 0 + + + 407 + 755 + 566 + 5 + 0 + + + 284 + 653 + 715 + 0 + 0 + + + 1 + 566 + 537 + 0 + 1 + + + 4 + 276 + 222 + 0 + 0 + + + 68 + 110 + 557 + 2 + 0 + + + 25 + 129 + 475 + 0 + 0 + + + 1 + 544 + 502 + 0 + 0 + + + 34 + 193 + 495 + 0 + 0 + + + 1 + 197 + 661 + 0 + 0 + + + 70 + 284 + 216 + 0 + 0 + + + 284 + 624 + 685 + 2 + 0 + + + 0 + 160 + 597 + 0 + 0 + + + 0 + 737 + 506 + 0 + 0 + + + 70 + 196 + 313 + 0 + 0 + + + 306 + 713 + 523 + 1 + 0 + + + 1 + 197 + 485 + 0 + 0 + + + 1041 + 60 + 436 + 0 + 0 + + + 6 + 118 + 520 + 0 + 0 + + + 70 + 191 + 137 + 0 + 0 + + + 70 + 98 + 267 + 0 + 0 + + + 79 + 632 + 590 + 0 + 0 + + + 38 + 256 + 102 + 0 + 0 + + + 284 + 482 + 452 + 2 + 0 + + + 0 + 578 + 526 + 0 + 0 + + + 284 + 662 + 705 + 0 + 0 + + + 34 + 169 + 565 + 6 + 0 + + + 1039 + 59 + 443 + 0 + 0 + + + 70 + 161 + 381 + 0 + 0 + + + 70 + 210 + 620 + 0 + 0 + + + 37 + 636 + 478 + 0 + 0 + + + 4 + 237 + 403 + 0 + 0 + + + 70 + 235 + 554 + 6 + 0 + + + 70 + 228 + 269 + 0 + 0 + + + 284 + 636 + 672 + 0 + 0 + + + 70 + 179 + 146 + 0 + 0 + + + 70 + 73 + 358 + 0 + 0 + + + 70 + 254 + 376 + 0 + 0 + + + 1041 + 60 + 437 + 0 + 0 + + + 1 + 198 + 658 + 0 + 0 + + + 4 + 167 + 157 + 0 + 0 + + + 38 + 687 + 577 + 2 + 0 + + + 407 + 234 + 112 + 5 + 0 + + + 70 + 102 + 257 + 0 + 0 + + + 0 + 177 + 540 + 4 + 0 + + + 34 + 206 + 464 + 0 + 0 + + + 70 + 91 + 288 + 0 + 0 + + + 70 + 117 + 224 + 0 + 0 + + + 407 + 224 + 117 + 0 + 0 + + + 0 + 139 + 442 + 0 + 0 + + + 1 + 703 + 664 + 0 + 0 + + + 36 + 740 + 504 + 7 + 0 + + + 0 + 654 + 465 + 0 + 0 + + + 205 + 227 + 421 + 0 + 0 + + + 45 + 216 + 683 + 2 + 0 + + + 70 + 70 + 374 + 0 + 0 + + + 4 + 320 + 407 + 0 + 0 + + + 34 + 125 + 491 + 1 + 0 + + + 4 + 123 + 213 + 0 + 0 + + + 3 + 279 + 655 + 0 + 0 + + + 0 + 638 + 670 + 0 + 0 + + + 205 + 237 + 112 + 0 + 0 + + + 1 + 56 + 474 + 1 + 0 + + + 284 + 628 + 680 + 0 + 0 + + + 273 + 628 + 594 + 0 + 0 + + + 377 + 658 + 756 + 1 + 0 + + + 36 + 344 + 530 + 0 + 0 + + + 7 + 114 + 535 + 0 + 0 + + + 0 + 196 + 665 + 0 + 0 + + + 0 + 725 + 472 + 7 + 0 + + + 0 + 61 + 435 + 0 + 0 + + + 47 + 277 + 658 + 1 + 1 + + + 1010 + 223 + 119 + 0 + 0 + + + 205 + 124 + 214 + 0 + 0 + + + 1 + 130 + 469 + 0 + 1 + + + 284 + 660 + 707 + 0 + 0 + + + 4 + 253 + 241 + 0 + 0 + + + 0 + 642 + 473 + 5 + 0 + + + 1 + 642 + 581 + 1 + 1 + + + 7 + 629 + 593 + 4 + 0 + + + 70 + 230 + 265 + 0 + 0 + + + 597 + 746 + 500 + 2 + 0 + + + 20 + 488 + 560 + 0 + 0 + + + 1016 + 221 + 120 + 2 + 0 + + + 0 + 626 + 485 + 6 + 0 + + + 145 + 128 + 476 + 2 + 0 + + + 205 + 239 + 399 + 0 + 0 + + + 597 + 752 + 455 + 2 + 0 + + + 70 + 220 + 277 + 0 + 0 + + + 20 + 161 + 593 + 0 + 0 + + + 70 + 307 + 311 + 0 + 0 + + + 0 + 140 + 436 + 0 + 0 + + + 70 + 228 + 572 + 6 + 0 + + + 394 + 517 + 662 + 1 + 0 + + + 1011 + 220 + 121 + 2 + 0 + + + 38 + 275 + 222 + 0 + 0 + + + 32 + 496 + 690 + 6 + 0 + + + 1 + 609 + 562 + 6 + 0 + + + 70 + 62 + 429 + 0 + 0 + + + 0 + 200 + 652 + 0 + 0 + + + 1039 + 61 + 436 + 0 + 0 + + + 38 + 258 + 370 + 0 + 0 + + + 1 + 207 + 630 + 0 + 0 + + + 0 + 662 + 517 + 6 + 0 + + + 70 + 94 + 283 + 0 + 0 + + + 70 + 195 + 313 + 0 + 0 + + + 284 + 649 + 719 + 0 + 0 + + + 313 + 679 + 504 + 3 + 0 + + + 1 + 297 + 614 + 2 + 0 + + + 25 + 129 + 473 + 0 + 0 + + + 401 + 510 + 671 + 2 + 0 + + + 34 + 207 + 461 + 0 + 0 + + + 1 + 58 + 458 + 1 + 0 + + + 36 + 353 + 716 + 0 + 0 + + + 7 + 614 + 760 + 4 + 0 + + + 36 + 350 + 521 + 0 + 0 + + + 70 + 212 + 615 + 0 + 0 + + + 70 + 244 + 250 + 0 + 0 + + + 284 + 639 + 730 + 2 + 0 + + + 1 + 202 + 646 + 0 + 0 + + + 597 + 672 + 509 + 6 + 0 + + + 205 + 72 + 367 + 0 + 0 + + + 193 + 85 + 719 + 0 + 0 + + + 70 + 323 + 295 + 0 + 0 + + + 70 + 315 + 194 + 0 + 0 + + + 4 + 210 + 291 + 0 + 0 + + + 1011 + 222 + 119 + 2 + 0 + + + 70 + 93 + 284 + 0 + 0 + + + 4 + 203 + 301 + 0 + 0 + + + 70 + 160 + 165 + 0 + 0 + + + 445 + 623 + 599 + 0 + 0 + + + 193 + 368 + 687 + 0 + 0 + + + 395 + 659 + 755 + 1 + 0 + + + 597 + 672 + 452 + 6 + 0 + + + 36 + 755 + 453 + 1 + 0 + + + 34 + 147 + 648 + 0 + 0 + + + 0 + 465 + 468 + 0 + 0 + + + 284 + 630 + 678 + 2 + 0 + + + 4 + 68 + 388 + 0 + 0 + + + 70 + 109 + 242 + 0 + 0 + + + 36 + 599 + 571 + 6 + 0 + + + 4 + 155 + 394 + 0 + 0 + + + 1 + 51 + 517 + 1 + 0 + + + 597 + 680 + 503 + 2 + 0 + + + 70 + 232 + 411 + 0 + 0 + + + 6 + 412 + 443 + 2 + 0 + + + 70 + 88 + 301 + 0 + 0 + + + 70 + 164 + 373 + 0 + 0 + + + 284 + 632 + 676 + 0 + 0 + + + 0 + 614 + 646 + 3 + 0 + + + 45 + 218 + 678 + 6 + 0 + + + 38 + 312 + 196 + 0 + 0 + + + 20 + 581 + 523 + 2 + 0 + + + 205 + 63 + 420 + 0 + 0 + + + 32 + 387 + 706 + 0 + 0 + + + 1 + 57 + 464 + 1 + 0 + + + 70 + 282 + 338 + 0 + 0 + + + 34 + 108 + 566 + 7 + 0 + + + 34 + 227 + 651 + 0 + 0 + + + 34 + 125 + 489 + 1 + 0 + + + 45 + 466 + 652 + 2 + 0 + + + 38 + 167 + 366 + 0 + 0 + + + 283 + 696 + 670 + 4 + 0 + + + 445 + 663 + 563 + 6 + 0 + + + 36 + 350 + 523 + 0 + 0 + + + 0 + 222 + 433 + 4 + 0 + + + 70 + 83 + 310 + 0 + 0 + + + 145 + 128 + 474 + 2 + 0 + + + 1 + 197 + 488 + 0 + 0 + + + 70 + 211 + 122 + 0 + 0 + + + 38 + 130 + 198 + 0 + 0 + + + 384 + 534 + 699 + 4 + 0 + + + 205 + 230 + 418 + 0 + 0 + + + 82 + 448 + 677 + 1 + 1 + + + 45 + 466 + 651 + 2 + 0 + + + 4 + 150 + 641 + 0 + 0 + + + 283 + 713 + 654 + 4 + 0 + + + 607 + 697 + 492 + 2 + 0 + + + 205 + 289 + 210 + 0 + 0 + + + 143 + 271 + 2956 + 4 + 0 + + + 70 + 159 + 162 + 0 + 0 + + + 70 + 188 + 137 + 0 + 0 + + + 597 + 752 + 456 + 2 + 0 + + + 88 + 116 + 222 + 2 + 0 + + + 0 + 748 + 499 + 3 + 0 + + + 38 + 232 + 111 + 0 + 0 + + + 70 + 63 + 409 + 0 + 0 + + + 407 + 230 + 112 + 0 + 0 + + + 1 + 206 + 634 + 0 + 0 + + + 74 + 565 + 537 + 6 + 0 + + + 34 + 137 + 702 + 0 + 0 + + + 70 + 211 + 619 + 0 + 0 + + + 70 + 323 + 188 + 0 + 0 + + + 1041 + 59 + 437 + 0 + 0 + + + 626 + 703 + 531 + 2 + 0 + + + 284 + 631 + 678 + 0 + 0 + + + 9 + 215 + 689 + 0 + 1 + + + 284 + 671 + 695 + 2 + 0 + + + 70 + 251 + 242 + 0 + 0 + + + 208 + 636 + 587 + 2 + 0 + + + 1 + 502 + 543 + 6 + 0 + + + 4 + 58 + 445 + 0 + 0 + + + 407 + 764 + 560 + 5 + 0 + + + 70 + 145 + 419 + 0 + 0 + + + 34 + 124 + 490 + 1 + 0 + + + 46 + 614 + 608 + 2 + 0 + + + 284 + 656 + 711 + 0 + 0 + + + 37 + 247 + 529 + 0 + 0 + + + 5 + 347 + 627 + 0 + 0 + + + 34 + 196 + 491 + 0 + 0 + + + 310 + 718 + 520 + 0 + 0 + + + 1 + 116 + 524 + 1 + 1 + + + 1039 + 59 + 438 + 0 + 0 + + + 205 + 232 + 262 + 0 + 0 + + + 88 + 699 + 568 + 5 + 0 + + + 70 + 94 + 275 + 0 + 0 + + + 70 + 204 + 298 + 0 + 0 + + + 205 + 92 + 281 + 0 + 0 + + + 0 + 314 + 472 + 0 + 0 + + + 50 + 568 + 699 + 2 + 0 + + + 1 + 612 + 1562 + 0 + 1 + + + 205 + 109 + 235 + 0 + 0 + + + 284 + 666 + 700 + 0 + 0 + + + 34 + 600 + 777 + 3 + 0 + + + 34 + 400 + 681 + 0 + 0 + + + 70 + 190 + 320 + 0 + 0 + + + 205 + 200 + 128 + 0 + 0 + + + 0 + 670 + 453 + 5 + 0 + + + 70 + 71 + 361 + 0 + 0 + + + 205 + 222 + 274 + 0 + 0 + + + 38 + 86 + 298 + 0 + 0 + + + 34 + 735 + 508 + 3 + 0 + + + 88 + 117 + 219 + 2 + 0 + + + 284 + 652 + 715 + 0 + 0 + + + 36 + 345 + 531 + 0 + 0 + + + 38 + 187 + 137 + 0 + 0 + + + 284 + 633 + 676 + 0 + 0 + + + 55 + 278 + 659 + 0 + 0 + + + 284 + 667 + 699 + 2 + 0 + + + 1 + 203 + 644 + 0 + 0 + + + 51 + 430 + 3380 + 6 + 0 + + + 0 + 58 + 442 + 0 + 0 + + + 46 + 127 + 479 + 4 + 0 + + + 70 + 144 + 178 + 0 + 0 + + + 1 + 151 + 636 + 0 + 0 + + + 284 + 482 + 451 + 2 + 0 + + + 0 + 310 + 591 + 2 + 0 + + + 21 + 368 + 685 + 4 + 0 + + + 70 + 236 + 407 + 0 + 0 + + + 70 + 66 + 389 + 0 + 0 + + + 653 + 683 + 502 + 4 + 0 + + + 3 + 213 + 695 + 0 + 0 + + + 1 + 644 + 724 + 1 + 0 + + + 70 + 82 + 313 + 0 + 0 + + + 70 + 292 + 329 + 0 + 0 + + + 70 + 227 + 576 + 6 + 0 + + + 0 + 625 + 635 + 6 + 0 + + + 70 + 186 + 138 + 0 + 0 + + + 205 + 236 + 258 + 0 + 0 + + + 3 + 452 + 3370 + 0 + 0 + + + 1039 + 58 + 443 + 0 + 0 + + + 668 + 704 + 487 + 1 + 0 + + + 33 + 124 + 491 + 1 + 0 + + + 193 + 224 + 661 + 4 + 0 + + + 70 + 252 + 102 + 0 + 0 + + + 0 + 582 + 682 + 0 + 0 + + + 309 + 697 + 669 + 4 + 0 + + + 407 + 705 + 563 + 6 + 0 + + + 284 + 654 + 713 + 0 + 0 + + + 70 + 310 + 310 + 0 + 0 + + + 284 + 669 + 697 + 2 + 0 + + + 3 + 585 + 519 + 0 + 0 + + + 11 + 116 + 525 + 0 + 0 + + + 34 + 131 + 465 + 7 + 0 + + + 34 + 618 + 804 + 6 + 0 + + + 205 + 270 + 356 + 0 + 0 + + + 47 + 133 + 458 + 0 + 0 + + + 0 + 258 + 507 + 0 + 0 + + + 1 + 492 + 442 + 0 + 0 + + + 1 + 329 + 661 + 1 + 1 + + + 1 + 251 + 590 + 0 + 0 + + + 0 + 640 + 668 + 0 + 0 + + + 70 + 130 + 200 + 0 + 0 + + + 1 + 134 + 451 + 0 + 0 + + + 1 + 559 + 613 + 0 + 1 + + + 278 + 452 + 3371 + 0 + 0 + + + 0 + 138 + 438 + 0 + 0 + + + 145 + 128 + 472 + 2 + 0 + + + 0 + 174 + 551 + 4 + 0 + + + 70 + 147 + 411 + 0 + 0 + + + 0 + 137 + 441 + 0 + 0 + + + 1 + 188 + 510 + 0 + 0 + + + 307 + 547 + 461 + 0 + 0 + + + 0 + 170 + 564 + 6 + 0 + + + 37 + 586 + 848 + 6 + 0 + + + 21 + 372 + 678 + 4 + 0 + + + 284 + 629 + 741 + 0 + 0 + + + 70 + 334 + 181 + 0 + 0 + + + 10 + 127 + 476 + 2 + 0 + + + 21 + 59 + 441 + 0 + 0 + + + 399 + 612 + 812 + 2 + 0 + + + 308 + 485 + 520 + 3 + 0 + + + 11 + 583 + 520 + 0 + 0 + + + 37 + 130 + 465 + 0 + 0 + + + 47 + 132 + 458 + 4 + 0 + + + 307 + 737 + 465 + 0 + 0 + + + 4 + 72 + 362 + 0 + 0 + + + 1 + 149 + 644 + 0 + 0 + + + 205 + 199 + 304 + 0 + 0 + + + 1 + 620 + 489 + 0 + 0 + + + 0 + 652 + 465 + 0 + 0 + + + 597 + 672 + 510 + 6 + 0 + + + 395 + 504 + 680 + 4 + 0 + + + 70 + 246 + 106 + 0 + 0 + + + 330 + 560 + 612 + 2 + 0 + + + 597 + 680 + 504 + 2 + 0 + + + 1039 + 59 + 442 + 0 + 0 + + + 284 + 664 + 702 + 0 + 0 + + + 1 + 135 + 448 + 0 + 0 + + + 308 + 497 + 549 + 6 + 0 + + + 70 + 320 + 409 + 0 + 0 + + + 205 + 229 + 419 + 0 + 0 + + + 36 + 353 + 518 + 0 + 0 + + + 4 + 284 + 213 + 0 + 0 + + + 1 + 115 + 526 + 1 + 1 + + + 37 + 688 + 543 + 2 + 0 + + + 183 + 363 + 695 + 0 + 0 + + + 0 + 196 + 668 + 0 + 0 + + + 971 + 638 + 779 + 0 + 0 + + + 51 + 570 + 697 + 4 + 0 + + + 70 + 70 + 373 + 0 + 0 + + + 45 + 218 + 681 + 6 + 0 + + + 38 + 248 + 244 + 0 + 0 + + + 70 + 327 + 454 + 4 + 0 + + + 283 + 616 + 443 + 0 + 0 + + + 47 + 133 + 455 + 0 + 0 + + + 70 + 164 + 369 + 0 + 0 + + + 38 + 306 + 428 + 0 + 0 + + + 3 + 213 + 696 + 0 + 0 + + + 4 + 176 + 147 + 0 + 0 + + + 38 + 154 + 168 + 0 + 0 + + + 34 + 48 + 539 + 0 + 0 + + + 655 + 692 + 495 + 0 + 0 + + + 38 + 115 + 225 + 0 + 0 + + + 70 + 65 + 398 + 0 + 0 + + + 283 + 602 + 774 + 0 + 0 + + + 70 + 61 + 424 + 0 + 0 + + + 50 + 659 + 567 + 0 + 0 + + + 3 + 116 + 522 + 0 + 0 + + + 214 + 93 + 278 + 6 + 0 + + + 70 + 151 + 401 + 0 + 0 + + + 290 + 557 + 615 + 0 + 0 + + + 70 + 256 + 101 + 0 + 0 + + + 286 + 509 + 673 + 1 + 0 + + + 29 + 330 + 658 + 0 + 0 + + + 7 + 628 + 595 + 4 + 0 + + + 286 + 515 + 490 + 0 + 0 + + + 55 + 569 + 533 + 0 + 0 + + + 70 + 227 + 422 + 0 + 0 + + + 962 + 634 + 784 + 2 + 0 + + + 34 + 401 + 680 + 0 + 0 + + + 4 + 312 + 307 + 0 + 0 + + + 307 + 732 + 468 + 0 + 0 + + + 21 + 59 + 439 + 0 + 0 + + + 307 + 545 + 463 + 0 + 0 + + + 70 + 260 + 233 + 0 + 0 + + + 38 + 138 + 439 + 0 + 0 + + + 33 + 404 + 675 + 0 + 0 + + + 70 + 93 + 279 + 0 + 0 + + + 284 + 629 + 680 + 0 + 0 + + + 70 + 226 + 424 + 0 + 0 + + + 20 + 262 + 99 + 4 + 0 + + + 70 + 180 + 144 + 0 + 0 + + + 70 + 80 + 324 + 0 + 0 + + + 183 + 360 + 701 + 0 + 0 + + + 284 + 661 + 705 + 0 + 0 + + + 1 + 569 + 698 + 0 + 1 + + + 70 + 68 + 382 + 0 + 0 + + + 0 + 628 + 483 + 6 + 0 + + + 3 + 279 + 656 + 0 + 0 + + + 3 + 116 + 523 + 0 + 0 + + + 70 + 189 + 321 + 0 + 0 + + + 70 + 237 + 553 + 6 + 0 + + + 34 + 355 + 711 + 0 + 0 + + + 34 + 230 + 645 + 0 + 0 + + + 0 + 311 + 477 + 0 + 0 + + + 0 + 580 + 523 + 0 + 0 + + + 70 + 172 + 151 + 0 + 0 + + + 70 + 287 + 334 + 0 + 0 + + + 284 + 630 + 679 + 2 + 0 + + + 38 + 168 + 361 + 0 + 0 + + + 597 + 746 + 501 + 2 + 0 + + + 205 + 326 + 402 + 0 + 0 + + + 36 + 352 + 717 + 0 + 0 + + + 27 + 439 + 691 + 0 + 0 + + + 70 + 225 + 426 + 0 + 0 + + + 1 + 123 + 493 + 1 + 0 + + + 183 + 357 + 707 + 0 + 0 + + + 38 + 281 + 337 + 0 + 0 + + + 284 + 627 + 680 + 0 + 0 + + + 34 + 204 + 633 + 0 + 0 + + + 1166 + 471 + 3383 + 7 + 0 + + + 217 + 660 + 646 + 6 + 0 + + + 284 + 648 + 719 + 0 + 0 + + + 70 + 324 + 186 + 0 + 0 + + + 70 + 186 + 324 + 0 + 0 + + + 284 + 659 + 707 + 0 + 0 + + + 407 + 224 + 113 + 5 + 0 + + + 107 + 561 + 705 + 0 + 0 + + + 36 + 742 + 463 + 1 + 0 + + + 4 + 83 + 305 + 0 + 0 + + + 70 + 269 + 224 + 0 + 0 + + + 21 + 368 + 689 + 4 + 0 + + + 29 + 331 + 662 + 2 + 0 + + + 191 + 102 + 591 + 0 + 0 + + + 0 + 625 + 488 + 6 + 0 + + + 3 + 214 + 695 + 0 + 0 + + + 36 + 755 + 455 + 3 + 0 + + + 70 + 207 + 291 + 0 + 0 + + + 0 + 198 + 652 + 3 + 0 + + + 407 + 232 + 109 + 6 + 0 + + + 34 + 137 + 691 + 0 + 0 + + + 0 + 196 + 483 + 0 + 0 + + + 70 + 190 + 317 + 0 + 0 + + + 407 + 230 + 110 + 7 + 0 + + + 34 + 129 + 467 + 7 + 0 + + + 34 + 194 + 488 + 0 + 0 + + + 1 + 55 + 460 + 0 + 0 + + + 284 + 626 + 681 + 2 + 0 + + + 70 + 91 + 278 + 0 + 0 + + + 70 + 93 + 272 + 0 + 0 + + + 62 + 212 + 609 + 0 + 0 + + + 0 + 766 + 488 + 3 + 0 + + + 70 + 107 + 236 + 0 + 0 + + + 38 + 108 + 234 + 0 + 0 + + + 38 + 234 + 108 + 0 + 0 + + + 284 + 639 + 729 + 2 + 0 + + + 1 + 286 + 642 + 0 + 0 + + + 36 + 135 + 701 + 6 + 0 + + + 37 + 138 + 436 + 0 + 0 + + + 70 + 174 + 145 + 0 + 0 + + + 8 + 58 + 435 + 0 + 0 + + + 307 + 745 + 461 + 7 + 0 + + + 0 + 616 + 495 + 0 + 0 + + + 0 + 203 + 466 + 0 + 0 + + + 36 + 353 + 520 + 0 + 0 + + + 284 + 657 + 709 + 2 + 0 + + + 284 + 625 + 682 + 0 + 0 + + + 1 + 130 + 463 + 0 + 1 + + + 185 + 279 + 658 + 0 + 0 + + + 1 + 149 + 635 + 0 + 0 + + + 36 + 354 + 716 + 0 + 0 + + + 5 + 714 + 481 + 0 + 0 + + + 38 + 81 + 311 + 0 + 0 + + + 70 + 302 + 428 + 0 + 0 + + + 38 + 334 + 387 + 0 + 0 + + + 7 + 594 + 718 + 0 + 0 + + + 1179 + 529 + 707 + 4 + 0 + + + 597 + 680 + 505 + 2 + 0 + + + 70 + 257 + 368 + 0 + 0 + + + 407 + 225 + 112 + 1 + 0 + + + 38 + 56 + 450 + 0 + 0 + + + 70 + 93 + 271 + 0 + 0 + + + 93 + 140 + 180 + 2 + 0 + + + 0 + 739 + 535 + 3 + 0 + + + 597 + 672 + 511 + 6 + 0 + + + 1 + 603 + 506 + 3 + 1 + + + 6 + 412 + 446 + 2 + 0 + + + 70 + 117 + 215 + 0 + 0 + + + 70 + 129 + 195 + 0 + 0 + + + 193 + 373 + 680 + 0 + 0 + + + 4 + 312 + 303 + 0 + 0 + + + 0 + 609 + 501 + 0 + 0 + + + 34 + 699 + 535 + 4 + 0 + + + 70 + 85 + 296 + 0 + 0 + + + 3 + 450 + 678 + 6 + 0 + + + 0 + 350 + 525 + 0 + 0 + + + 597 + 672 + 454 + 6 + 0 + + + 70 + 157 + 160 + 0 + 0 + + + 1 + 139 + 434 + 0 + 0 + + + 38 + 701 + 708 + 2 + 0 + + + 1 + 205 + 461 + 0 + 0 + + + 395 + 521 + 659 + 1 + 0 + + + 34 + 577 + 739 + 0 + 0 + + + 70 + 304 + 425 + 0 + 0 + + + 38 + 314 + 301 + 0 + 0 + + + 307 + 524 + 484 + 0 + 0 + + + 284 + 628 + 679 + 2 + 0 + + + 284 + 655 + 711 + 0 + 0 + + + 34 + 170 + 556 + 4 + 0 + + + 34 + 147 + 643 + 1 + 0 + + + 58 + 615 + 608 + 2 + 0 + + + 70 + 319 + 189 + 0 + 0 + + + 70 + 203 + 297 + 0 + 0 + + + 1009 + 226 + 111 + 2 + 0 + + + 70 + 327 + 395 + 0 + 0 + + + 32 + 499 + 688 + 6 + 0 + + + 4 + 300 + 201 + 0 + 0 + + + 1 + 287 + 640 + 0 + 0 + + + 70 + 268 + 225 + 0 + 0 + + + 70 + 229 + 564 + 6 + 0 + + + 1 + 158 + 598 + 0 + 0 + + + 215 + 90 + 279 + 5 + 0 + + + 1 + 581 + 525 + 0 + 0 + + + 34 + 694 + 671 + 0 + 0 + + + 284 + 671 + 694 + 2 + 0 + + + 420 + 726 + 515 + 0 + 0 + + + 960 + 637 + 731 + 0 + 0 + + + 76 + 439 + 694 + 0 + 1 + + + 13 + 183 + 328 + 6 + 0 + + + 70 + 164 + 366 + 0 + 0 + + + 34 + 392 + 700 + 0 + 0 + + + 36 + 502 + 436 + 0 + 0 + + + 38 + 176 + 341 + 0 + 0 + + + 0 + 313 + 476 + 0 + 0 + + + 4 + 249 + 241 + 0 + 0 + + + 38 + 174 + 147 + 0 + 0 + + + 402 + 517 + 664 + 2 + 0 + + + 45 + 466 + 654 + 2 + 0 + + + 183 + 360 + 705 + 0 + 0 + + + 3 + 214 + 696 + 0 + 0 + + + 655 + 692 + 496 + 0 + 0 + + + 284 + 634 + 672 + 0 + 0 + + + 0 + 283 + 648 + 0 + 0 + + + 283 + 696 + 669 + 4 + 0 + + + 284 + 669 + 696 + 2 + 0 + + + 10 + 126 + 476 + 2 + 0 + + + 191 + 102 + 588 + 0 + 0 + + + 55 + 119 + 504 + 0 + 0 + + + 284 + 482 + 454 + 2 + 0 + + + 205 + 295 + 320 + 0 + 0 + + + 59 + 105 + 571 + 6 + 0 + + + 320 + 468 + 651 + 6 + 0 + + + 29 + 451 + 3375 + 0 + 0 + + + 284 + 667 + 698 + 2 + 0 + + + 68 + 110 + 545 + 2 + 0 + + + 70 + 176 + 145 + 0 + 0 + + + 34 + 491 + 699 + 6 + 0 + + + 70 + 309 + 194 + 0 + 0 + + + 70 + 194 + 309 + 0 + 0 + + + 45 + 218 + 683 + 6 + 0 + + + 949 + 630 + 788 + 5 + 0 + + + 183 + 363 + 699 + 0 + 0 + + + 192 + 756 + 454 + 0 + 0 + + + 284 + 653 + 713 + 0 + 0 + + + 4 + 71 + 359 + 0 + 0 + + + 1 + 646 + 579 + 1 + 1 + + + 640 + 712 + 482 + 2 + 0 + + + 960 + 636 + 732 + 0 + 0 + + + 398 + 669 + 742 + 7 + 0 + + + 0 + 702 + 434 + 3 + 0 + + + 70 + 331 + 181 + 0 + 0 + + + 0 + 651 + 468 + 0 + 0 + + + 38 + 58 + 439 + 0 + 0 + + + 2 + 617 + 556 + 0 + 1 + + + 0 + 257 + 504 + 0 + 0 + + + 34 + 212 + 611 + 0 + 0 + + + 70 + 226 + 573 + 6 + 0 + + + 13 + 185 + 325 + 6 + 0 + + + 70 + 212 + 120 + 0 + 0 + + + 37 + 507 + 541 + 5 + 0 + + + 285 + 592 + 515 + 7 + 0 + + + 4 + 257 + 367 + 0 + 0 + + + 0 + 258 + 502 + 0 + 0 + + + 1 + 113 + 532 + 0 + 1 + + + 34 + 693 + 540 + 1 + 0 + + + 0 + 337 + 649 + 0 + 0 + + + 0 + 638 + 668 + 0 + 0 + + + 284 + 624 + 683 + 2 + 0 + + + 70 + 159 + 378 + 0 + 0 + + + 4 + 97 + 262 + 0 + 0 + + + 25 + 447 + 682 + 2 + 0 + + + 70 + 192 + 313 + 0 + 0 + + + 70 + 164 + 155 + 0 + 0 + + + 284 + 665 + 700 + 0 + 0 + + + 34 + 455 + 670 + 0 + 0 + + + 34 + 48 + 529 + 0 + 0 + + + 70 + 102 + 249 + 0 + 0 + + + 70 + 203 + 296 + 0 + 0 + + + 0 + 642 + 725 + 1 + 0 + + + 70 + 181 + 332 + 0 + 0 + + + 0 + 639 + 477 + 2 + 0 + + + 1039 + 58 + 438 + 0 + 0 + + + 70 + 116 + 219 + 0 + 0 + + + 70 + 205 + 293 + 0 + 0 + + + 0 + 667 + 457 + 5 + 0 + + + 1 + 215 + 692 + 2 + 1 + + + 67 + 132 + 455 + 4 + 0 + + + 192 + 741 + 505 + 0 + 0 + + + 70 + 74 + 343 + 0 + 0 + + + 70 + 90 + 282 + 0 + 0 + + + 80 + 208 + 122 + 4 + 0 + + + 284 + 651 + 715 + 0 + 0 + + + 1 + 457 + 667 + 1 + 1 + + + 205 + 278 + 216 + 0 + 0 + + + 58 + 614 + 694 + 0 + 0 + + + 4 + 318 + 407 + 0 + 0 + + + 0 + 622 + 490 + 0 + 0 + + + 1 + 269 + 553 + 1 + 1 + + + 70 + 330 + 182 + 0 + 0 + + + 70 + 143 + 420 + 0 + 0 + + + 70 + 125 + 203 + 0 + 0 + + + 284 + 663 + 702 + 0 + 0 + + + 1041 + 58 + 437 + 0 + 0 + + + 36 + 134 + 703 + 6 + 0 + + + 34 + 702 + 533 + 4 + 0 + + + 306 + 488 + 448 + 0 + 0 + + + 0 + 165 + 571 + 6 + 0 + + + 395 + 519 + 661 + 1 + 0 + + + 1 + 256 + 581 + 0 + 0 + + + 565 + 705 + 531 + 2 + 0 + + + 70 + 316 + 189 + 0 + 0 + + + 70 + 189 + 316 + 0 + 0 + + + 70 + 311 + 192 + 0 + 0 + + + 1 + 200 + 648 + 6 + 0 + + + 0 + 310 + 594 + 2 + 0 + + + 38 + 64 + 387 + 0 + 0 + + + 306 + 764 + 490 + 3 + 0 + + + 183 + 363 + 697 + 0 + 0 + + + 34 + 701 + 534 + 4 + 0 + + + 0 + 282 + 653 + 0 + 0 + + + 23 + 661 + 704 + 0 + 0 + + + 70 + 330 + 181 + 0 + 0 + + + 285 + 628 + 741 + 0 + 0 + + + 284 + 624 + 684 + 2 + 0 + + + 306 + 724 + 547 + 0 + 0 + + + 286 + 525 + 580 + 0 + 0 + + + 34 + 743 + 533 + 3 + 0 + + + 38 + 159 + 156 + 0 + 0 + + + 70 + 224 + 425 + 0 + 0 + + + 36 + 138 + 690 + 0 + 0 + + + 0 + 201 + 645 + 3 + 0 + + + 70 + 223 + 268 + 0 + 0 + + + 1 + 134 + 446 + 0 + 0 + + + 36 + 381 + 718 + 0 + 0 + + + 307 + 500 + 437 + 0 + 0 + + + 273 + 628 + 596 + 0 + 0 + + + 54 + 158 + 602 + 0 + 0 + + + 70 + 249 + 382 + 0 + 0 + + + 284 + 660 + 705 + 0 + 0 + + + 205 + 58 + 426 + 0 + 0 + + + 37 + 128 + 466 + 0 + 0 + + + 1 + 204 + 635 + 0 + 0 + + + 0 + 656 + 464 + 0 + 0 + + + 3 + 126 + 1461 + 0 + 0 + + + 1164 + 610 + 499 + 6 + 0 + + + 205 + 250 + 99 + 0 + 0 + + + 208 + 114 + 217 + 2 + 0 + + + 47 + 214 + 697 + 4 + 0 + + + 1 + 516 + 590 + 0 + 0 + + + 4 + 151 + 164 + 0 + 0 + + + 597 + 672 + 453 + 6 + 0 + + + 180 + 92 + 649 + 0 + 0 + + + 24 + 227 + 109 + 0 + 1 + + + 1164 + 615 + 495 + 6 + 0 + + + 206 + 327 + 291 + 0 + 0 + + + 597 + 746 + 502 + 2 + 0 + + + 70 + 160 + 154 + 0 + 0 + + + 70 + 88 + 280 + 0 + 0 + + + 1 + 657 + 570 + 0 + 1 + + + 70 + 145 + 170 + 0 + 0 + + + 70 + 175 + 342 + 0 + 0 + + + 29 + 332 + 555 + 2 + 0 + + + 38 + 260 + 499 + 0 + 0 + + + 0 + 334 + 654 + 0 + 0 + + + 306 + 729 + 543 + 0 + 0 + + + 15 + 611 + 1563 + 6 + 0 + + + 70 + 326 + 398 + 0 + 0 + + + 46 + 530 + 516 + 0 + 0 + + + 70 + 209 + 118 + 0 + 0 + + + 1 + 328 + 666 + 2 + 1 + + + 21 + 465 + 655 + 6 + 0 + + + 34 + 204 + 466 + 0 + 0 + + + 653 + 685 + 502 + 4 + 0 + + + 70 + 96 + 257 + 0 + 0 + + + 34 + 137 + 694 + 0 + 0 + + + 34 + 48 + 514 + 3 + 0 + + + 377 + 662 + 645 + 4 + 0 + + + 0 + 54 + 457 + 0 + 0 + + + 21 + 267 + 486 + 0 + 0 + + + 51 + 568 + 697 + 4 + 0 + + + 655 + 692 + 497 + 0 + 0 + + + 32 + 382 + 716 + 0 + 0 + + + 395 + 508 + 677 + 2 + 0 + + + 70 + 152 + 394 + 0 + 0 + + + 4 + 283 + 336 + 0 + 0 + + + 8 + 56 + 441 + 1 + 0 + + + 145 + 513 + 533 + 4 + 0 + + + 46 + 533 + 513 + 0 + 0 + + + 306 + 687 + 545 + 1 + 0 + + + 70 + 179 + 334 + 0 + 0 + + + 34 + 55 + 447 + 0 + 0 + + + 284 + 657 + 708 + 2 + 0 + + + 0 + 761 + 492 + 3 + 0 + + + 70 + 331 + 287 + 0 + 0 + + + 205 + 321 + 404 + 0 + 0 + + + 183 + 360 + 703 + 0 + 0 + + + 70 + 116 + 212 + 0 + 0 + + + 283 + 708 + 657 + 4 + 0 + + + 38 + 139 + 177 + 0 + 0 + + + 38 + 273 + 348 + 0 + 0 + + + 34 + 203 + 468 + 0 + 0 + + + 88 + 115 + 214 + 2 + 0 + + + 36 + 353 + 717 + 0 + 0 + + + 284 + 658 + 707 + 0 + 0 + + + 0 + 283 + 651 + 0 + 0 + + + 284 + 626 + 682 + 2 + 0 + + + 70 + 214 + 115 + 0 + 0 + + + 70 + 178 + 336 + 0 + 0 + + + 15 + 213 + 609 + 4 + 0 + + + 284 + 639 + 728 + 2 + 0 + + + 284 + 647 + 719 + 0 + 0 + + + 12 + 183 + 325 + 6 + 0 + + + 36 + 137 + 693 + 0 + 0 + + + 395 + 510 + 674 + 6 + 0 + + + 1 + 126 + 472 + 0 + 1 + + + 70 + 252 + 236 + 0 + 0 + + + 34 + 749 + 529 + 3 + 0 + + + 70 + 138 + 431 + 0 + 0 + + + 70 + 272 + 349 + 0 + 0 + + + 205 + 69 + 363 + 0 + 0 + + + 0 + 627 + 632 + 6 + 0 + + + 1 + 351 + 524 + 0 + 0 + + + 70 + 88 + 285 + 0 + 0 + + + 1 + 55 + 456 + 0 + 0 + + + 407 + 220 + 114 + 6 + 0 + + + 284 + 632 + 675 + 2 + 0 + + + 70 + 145 + 173 + 0 + 0 + + + 70 + 211 + 282 + 0 + 0 + + + 1 + 197 + 482 + 0 + 0 + + + 70 + 225 + 422 + 0 + 0 + + + 153 + 606 + 452 + 6 + 0 + + + 192 + 764 + 450 + 0 + 0 + + + 283 + 353 + 521 + 0 + 0 + + + 284 + 482 + 453 + 2 + 0 + + + 38 + 253 + 375 + 0 + 0 + + + 1 + 586 + 519 + 0 + 1 + + + 0 + 735 + 539 + 3 + 0 + + + 20 + 608 + 616 + 4 + 0 + + + 51 + 225 + 111 + 6 + 0 + + + 208 + 112 + 223 + 0 + 0 + + + 80 + 203 + 123 + 4 + 0 + + + 20 + 610 + 614 + 4 + 0 + + + 38 + 710 + 655 + 0 + 0 + + + 4 + 297 + 200 + 0 + 0 + + + 46 + 124 + 479 + 4 + 0 + + + 7 + 648 + 578 + 6 + 0 + + + 70 + 279 + 340 + 0 + 0 + + + 70 + 496 + 440 + 0 + 0 + + + 70 + 223 + 582 + 6 + 0 + + + 405 + 491 + 700 + 6 + 0 + + + 34 + 128 + 464 + 7 + 0 + + + 284 + 630 + 677 + 2 + 0 + + + 38 + 681 + 550 + 6 + 0 + + + 402 + 513 + 670 + 2 + 0 + + + 70 + 180 + 139 + 0 + 0 + + + 70 + 229 + 567 + 6 + 0 + + + 55 + 279 + 659 + 0 + 0 + + + 0 + 690 + 674 + 0 + 0 + + + 70 + 148 + 169 + 0 + 0 + + + 309 + 661 + 520 + 2 + 0 + + + 0 + 201 + 646 + 0 + 0 + + + 34 + 127 + 468 + 7 + 0 + + + 308 + 520 + 487 + 0 + 0 + + + 1164 + 617 + 493 + 6 + 0 + + + 4 + 675 + 689 + 0 + 0 + + + 34 + 209 + 454 + 0 + 0 + + + 139 + 86 + 693 + 4 + 0 + + + 70 + 274 + 346 + 0 + 0 + + + 377 + 498 + 690 + 7 + 0 + + + 0 + 200 + 650 + 3 + 0 + + + 1 + 591 + 722 + 1 + 0 + + + 209 + 221 + 429 + 6 + 0 + + + 70 + 315 + 301 + 0 + 0 + + + 597 + 697 + 493 + 2 + 0 + + + 112 + 421 + 3523 + 0 + 0 + + + 70 + 242 + 103 + 0 + 0 + + + 0 + 668 + 561 + 0 + 0 + + + 164 + 90 + 662 + 5 + 0 + + + 70 + 100 + 249 + 0 + 0 + + + 63 + 439 + 497 + 6 + 0 + + + 0 + 754 + 497 + 3 + 0 + + + 1 + 53 + 470 + 1 + 0 + + + 284 + 654 + 711 + 0 + 0 + + + 34 + 217 + 437 + 4 + 0 + + + 284 + 635 + 672 + 0 + 0 + + + 396 + 516 + 666 + 2 + 0 + + + 284 + 671 + 693 + 2 + 0 + + + 70 + 159 + 375 + 0 + 0 + + + 0 + 151 + 628 + 0 + 0 + + + 205 + 265 + 225 + 0 + 0 + + + 1 + 114 + 523 + 1 + 1 + + + 34 + 390 + 702 + 0 + 0 + + + 597 + 752 + 457 + 2 + 0 + + + 8 + 57 + 436 + 0 + 0 + + + 4 + 260 + 229 + 0 + 0 + + + 47 + 130 + 458 + 0 + 0 + + + 284 + 667 + 697 + 2 + 0 + + + 4 + 267 + 223 + 0 + 0 + + + 70 + 223 + 267 + 0 + 0 + + + 1 + 226 + 110 + 1 + 1 + + + 4 + 181 + 329 + 0 + 0 + + + 20 + 349 + 625 + 6 + 0 + + + 306 + 675 + 509 + 1 + 0 + + + 70 + 192 + 310 + 0 + 0 + + + 45 + 466 + 653 + 2 + 0 + + + 0 + 315 + 474 + 0 + 0 + + + 419 + 690 + 441 + 6 + 0 + + + 12 + 185 + 322 + 0 + 0 + + + 4 + 161 + 370 + 0 + 0 + + + 285 + 599 + 508 + 7 + 0 + + + 70 + 180 + 331 + 0 + 0 + + + 70 + 68 + 366 + 0 + 0 + + + 70 + 252 + 376 + 0 + 0 + + + 4 + 96 + 259 + 0 + 0 + + + 284 + 669 + 695 + 2 + 0 + + + 284 + 634 + 673 + 2 + 0 + + + 1 + 159 + 596 + 0 + 0 + + + 597 + 693 + 491 + 0 + 0 + + + 0 + 137 + 433 + 0 + 0 + + + 4 + 167 + 169 + 0 + 0 + + + 106 + 229 + 259 + 4 + 0 + + + 36 + 598 + 569 + 6 + 0 + + + 1012 + 217 + 130 + 2 + 0 + + + 33 + 127 + 467 + 7 + 0 + + + 445 + 666 + 563 + 6 + 0 + + + 1013 + 235 + 120 + 0 + 0 + + + 0 + 642 + 669 + 0 + 0 + + + 34 + 173 + 564 + 6 + 0 + + + 153 + 602 + 450 + 0 + 0 + + + 38 + 627 + 685 + 1 + 0 + + + 4 + 127 + 222 + 0 + 0 + + + 283 + 53 + 532 + 0 + 0 + + + 0 + 199 + 644 + 0 + 0 + + + 1 + 613 + 758 + 0 + 0 + + + 25 + 447 + 492 + 2 + 0 + + + 70 + 101 + 279 + 0 + 0 + + + 20 + 475 + 463 + 6 + 0 + + + 1 + 61 + 462 + 0 + 0 + + + 1 + 270 + 104 + 1 + 1 + + + 36 + 348 + 519 + 0 + 0 + + + 0 + 727 + 468 + 7 + 0 + + + 72 + 207 + 619 + 3 + 0 + + + 360 + 617 + 639 + 0 + 0 + + + 0 + 97 + 611 + 0 + 0 + + + 70 + 308 + 416 + 0 + 0 + + + 284 + 650 + 715 + 0 + 0 + + + 21 + 368 + 681 + 4 + 0 + + + 70 + 331 + 452 + 4 + 0 + + + 4 + 303 + 196 + 0 + 0 + + + 70 + 196 + 303 + 0 + 0 + + + 70 + 147 + 404 + 0 + 0 + + + 205 + 202 + 140 + 0 + 0 + + + 286 + 658 + 759 + 6 + 0 + + + 0 + 317 + 472 + 0 + 0 + + + 38 + 310 + 315 + 0 + 0 + + + 13 + 181 + 328 + 6 + 0 + + + 284 + 628 + 684 + 2 + 0 + + + 70 + 291 + 204 + 0 + 0 + + + 34 + 733 + 538 + 3 + 0 + + + 565 + 701 + 535 + 2 + 0 + + + 1020 + 219 + 129 + 4 + 0 + + + 608 + 706 + 482 + 0 + 0 + + + 1 + 53 + 533 + 0 + 0 + + + 209 + 227 + 430 + 7 + 0 + + + 70 + 271 + 219 + 0 + 0 + + + 420 + 743 + 458 + 6 + 0 + + + 37 + 697 + 538 + 4 + 0 + + + 70 + 249 + 392 + 0 + 0 + + + 29 + 275 + 657 + 0 + 0 + + + 24 + 172 + 164 + 2 + 1 + + + 25 + 448 + 491 + 0 + 0 + + + 29 + 87 + 682 + 2 + 0 + + + 306 + 744 + 530 + 3 + 0 + + + 284 + 662 + 702 + 0 + 0 + + + 622 + 56 + 504 + 4 + 0 + + + 70 + 288 + 206 + 0 + 0 + + + 1041 + 64 + 441 + 0 + 0 + + + 960 + 634 + 733 + 0 + 0 + + + 70 + 88 + 322 + 0 + 0 + + + 70 + 477 + 525 + 2 + 0 + + + 284 + 664 + 700 + 0 + 0 + + + 70 + 157 + 377 + 0 + 0 + + + 70 + 194 + 305 + 0 + 0 + + + 1016 + 236 + 120 + 0 + 0 + + + 35 + 83 + 713 + 0 + 0 + + + 0 + 658 + 465 + 0 + 0 + + + 34 + 199 + 491 + 0 + 0 + + + 0 + 194 + 660 + 0 + 0 + + + 70 + 236 + 414 + 0 + 0 + + + 98 + 651 + 470 + 2 + 0 + + + 63 + 327 + 552 + 4 + 0 + + + 0 + 718 + 522 + 0 + 0 + + + 284 + 624 + 688 + 2 + 0 + + + 159 + 276 + 654 + 2 + 0 + + + 70 + 78 + 363 + 0 + 0 + + + 0 + 625 + 631 + 6 + 0 + + + 90 + 116 + 510 + 2 + 0 + + + 34 + 195 + 501 + 0 + 0 + + + 109 + 231 + 256 + 0 + 0 + + + 34 + 721 + 547 + 3 + 0 + + + 70 + 297 + 431 + 0 + 0 + + + 1039 + 64 + 442 + 0 + 0 + + + 0 + 630 + 626 + 6 + 0 + + + 70 + 186 + 318 + 0 + 0 + + + 4 + 159 + 372 + 0 + 0 + + + 3 + 282 + 640 + 0 + 0 + + + 47 + 130 + 455 + 0 + 0 + + + 284 + 639 + 672 + 0 + 0 + + + 597 + 706 + 531 + 4 + 0 + + + 4 + 71 + 400 + 0 + 0 + + + 70 + 326 + 393 + 0 + 0 + + + 284 + 652 + 713 + 0 + 0 + + + 306 + 763 + 517 + 3 + 0 + + + 1 + 302 + 598 + 2 + 0 + + + 33 + 394 + 688 + 0 + 0 + + + 36 + 208 + 470 + 0 + 0 + + + 273 + 492 + 551 + 0 + 0 + + + 37 + 52 + 546 + 7 + 0 + + + 70 + 289 + 205 + 0 + 0 + + + 284 + 626 + 686 + 2 + 0 + + + 0 + 766 + 515 + 3 + 0 + + + 668 + 702 + 485 + 1 + 0 + + + 1 + 149 + 656 + 0 + 0 + + + 1 + 454 + 674 + 1 + 1 + + + 0 + 760 + 519 + 3 + 0 + + + 204 + 692 + 570 + 2 + 0 + + + 58 + 281 + 2969 + 4 + 0 + + + 4 + 129 + 220 + 0 + 0 + + + 4 + 245 + 399 + 0 + 0 + + + 55 + 439 + 697 + 2 + 0 + + + 21 + 534 + 702 + 6 + 0 + + + 70 + 185 + 320 + 0 + 0 + + + 273 + 265 + 107 + 0 + 0 + + + 306 + 677 + 452 + 4 + 0 + + + 1 + 117 + 506 + 0 + 1 + + + 0 + 680 + 450 + 3 + 0 + + + 306 + 730 + 514 + 0 + 0 + + + 1 + 111 + 532 + 0 + 1 + + + 37 + 127 + 465 + 0 + 0 + + + 1016 + 224 + 127 + 2 + 0 + + + 38 + 87 + 327 + 0 + 0 + + + 4 + 137 + 431 + 0 + 0 + + + 286 + 660 + 757 + 6 + 0 + + + 0 + 608 + 503 + 0 + 0 + + + 1 + 58 + 491 + 1 + 0 + + + 597 + 680 + 500 + 2 + 0 + + + 38 + 113 + 252 + 0 + 0 + + + 0 + 691 + 543 + 1 + 0 + + + 1041 + 65 + 438 + 0 + 0 + + + 1009 + 217 + 131 + 2 + 0 + + + 12 + 185 + 319 + 6 + 0 + + + 70 + 260 + 227 + 0 + 0 + + + 36 + 740 + 507 + 7 + 0 + + + 70 + 148 + 192 + 0 + 0 + + + 988 + 630 + 793 + 2 + 0 + + + 1 + 606 + 651 + 3 + 0 + + + 70 + 314 + 188 + 0 + 0 + + + 1 + 52 + 547 + 0 + 0 + + + 70 + 305 + 421 + 0 + 0 + + + 0 + 537 + 467 + 0 + 0 + + + 145 + 124 + 476 + 6 + 0 + + + 34 + 59 + 482 + 1 + 0 + + + 34 + 736 + 536 + 3 + 0 + + + 293 + 436 + 504 + 6 + 0 + + + 50 + 118 + 501 + 0 + 0 + + + 34 + 53 + 538 + 7 + 0 + + + 29 + 115 + 514 + 0 + 0 + + + 284 + 657 + 707 + 0 + 0 + + + 284 + 636 + 675 + 2 + 0 + + + 38 + 213 + 134 + 0 + 0 + + + 1 + 195 + 659 + 0 + 0 + + + 194 + 370 + 678 + 4 + 0 + + + 70 + 123 + 232 + 0 + 0 + + + 36 + 495 + 687 + 6 + 0 + + + 1041 + 65 + 439 + 0 + 0 + + + 29 + 329 + 668 + 0 + 0 + + + 0 + 665 + 460 + 0 + 0 + + + 306 + 707 + 481 + 7 + 0 + + + 38 + 678 + 582 + 2 + 0 + + + 71 + 612 + 1565 + 2 + 0 + + + 47 + 129 + 458 + 4 + 0 + + + 284 + 646 + 719 + 0 + 0 + + + 70 + 185 + 154 + 0 + 0 + + + 37 + 749 + 454 + 7 + 0 + + + 205 + 613 + 499 + 0 + 0 + + + 1 + 269 + 557 + 1 + 1 + + + 1040 + 64 + 445 + 0 + 0 + + + 70 + 94 + 303 + 0 + 0 + + + 70 + 282 + 101 + 0 + 0 + + + 991 + 638 + 728 + 0 + 0 + + + 70 + 223 + 576 + 6 + 0 + + + 38 + 229 + 561 + 6 + 0 + + + 597 + 672 + 506 + 6 + 0 + + + 284 + 635 + 676 + 0 + 0 + + + 70 + 294 + 201 + 0 + 0 + + + 205 + 190 + 150 + 0 + 0 + + + 597 + 746 + 503 + 2 + 0 + + + 70 + 158 + 374 + 0 + 0 + + + 34 + 686 + 547 + 1 + 0 + + + 4 + 161 + 177 + 0 + 0 + + + 47 + 215 + 697 + 0 + 0 + + + 38 + 143 + 412 + 0 + 0 + + + 70 + 322 + 183 + 0 + 0 + + + 4 + 113 + 253 + 0 + 0 + + + 70 + 232 + 254 + 0 + 0 + + + 33 + 381 + 712 + 0 + 0 + + + 4 + 158 + 373 + 0 + 0 + + + 407 + 706 + 559 + 2 + 0 + + + 284 + 639 + 727 + 2 + 0 + + + 45 + 466 + 656 + 2 + 0 + + + 70 + 235 + 546 + 6 + 0 + + + 33 + 392 + 692 + 0 + 0 + + + 413 + 622 + 603 + 4 + 0 + + + 1 + 128 + 460 + 0 + 1 + + + 33 + 396 + 685 + 0 + 0 + + + 4 + 171 + 167 + 0 + 0 + + + 1013 + 236 + 121 + 0 + 0 + + + 34 + 677 + 554 + 1 + 0 + + + 70 + 68 + 420 + 0 + 0 + + + 70 + 207 + 138 + 0 + 0 + + + 284 + 482 + 456 + 2 + 0 + + + 273 + 267 + 107 + 0 + 0 + + + 445 + 623 + 602 + 0 + 0 + + + 70 + 153 + 385 + 0 + 0 + + + 1 + 632 + 735 + 6 + 0 + + + 70 + 274 + 215 + 0 + 0 + + + 4 + 696 + 567 + 2 + 0 + + + 1 + 277 + 651 + 0 + 1 + + + 33 + 386 + 703 + 0 + 0 + + + 37 + 613 + 612 + 6 + 0 + + + 1018 + 217 + 132 + 2 + 0 + + + 70 + 281 + 347 + 0 + 0 + + + 0 + 738 + 461 + 1 + 0 + + + 1 + 612 + 645 + 3 + 0 + + + 3 + 451 + 678 + 6 + 0 + + + 0 + 731 + 540 + 3 + 0 + + + 284 + 633 + 678 + 0 + 0 + + + 153 + 603 + 450 + 0 + 0 + + + 64 + 615 + 610 + 2 + 0 + + + 396 + 504 + 675 + 1 + 0 + + + 395 + 486 + 700 + 1 + 0 + + + 313 + 675 + 504 + 3 + 0 + + + 55 + 324 + 301 + 0 + 0 + + + 46 + 617 + 608 + 2 + 0 + + + 70 + 292 + 334 + 0 + 0 + + + 0 + 172 + 567 + 6 + 0 + + + 597 + 672 + 455 + 6 + 0 + + + 20 + 488 + 556 + 0 + 0 + + + 4 + 556 + 488 + 0 + 0 + + + 34 + 658 + 517 + 0 + 0 + + + 164 + 730 + 466 + 4 + 0 + + + 70 + 233 + 253 + 0 + 0 + + + 284 + 659 + 705 + 0 + 0 + + + 70 + 307 + 192 + 0 + 0 + + + 284 + 627 + 741 + 0 + 0 + + + 70 + 135 + 212 + 0 + 0 + + + 25 + 447 + 684 + 2 + 0 + + + 34 + 679 + 501 + 0 + 0 + + + 3 + 649 + 578 + 0 + 0 + + + 377 + 493 + 690 + 7 + 0 + + + 72 + 207 + 620 + 3 + 0 + + + 145 + 509 + 533 + 4 + 0 + + + 37 + 735 + 537 + 3 + 0 + + + 38 + 273 + 216 + 0 + 0 + + + 145 + 124 + 474 + 6 + 0 + + + 70 + 101 + 274 + 0 + 0 + + + 3 + 450 + 679 + 6 + 0 + + + 70 + 332 + 177 + 0 + 0 + + + 597 + 694 + 491 + 0 + 0 + + + 1 + 115 + 511 + 0 + 1 + + + 5 + 729 + 515 + 6 + 0 + + + 33 + 389 + 695 + 0 + 0 + + + 3 + 113 + 520 + 0 + 0 + + + 285 + 591 + 517 + 7 + 0 + + + 0 + 349 + 519 + 0 + 0 + + + 34 + 602 + 771 + 3 + 0 + + + 4 + 175 + 158 + 0 + 0 + + + 70 + 153 + 384 + 0 + 0 + + + 70 + 128 + 216 + 0 + 0 + + + 38 + 249 + 394 + 0 + 0 + + + 1 + 159 + 617 + 0 + 1 + + + 0 + 312 + 481 + 0 + 0 + + + 70 + 241 + 244 + 0 + 0 + + + 284 + 651 + 713 + 0 + 0 + + + 70 + 300 + 196 + 0 + 0 + + + 34 + 150 + 654 + 0 + 0 + + + 205 + 161 + 172 + 0 + 0 + + + 70 + 141 + 417 + 0 + 0 + + + 285 + 598 + 511 + 7 + 0 + + + 283 + 609 + 444 + 0 + 0 + + + 70 + 109 + 254 + 0 + 0 + + + 20 + 173 + 160 + 0 + 0 + + + 0 + 634 + 482 + 6 + 0 + + + 201 + 344 + 638 + 0 + 0 + + + 0 + 193 + 667 + 0 + 0 + + + 306 + 491 + 447 + 2 + 0 + + + 0 + 679 + 553 + 1 + 0 + + + 313 + 710 + 480 + 3 + 0 + + + 205 + 94 + 295 + 0 + 0 + + + 0 + 204 + 631 + 0 + 0 + + + 78 + 448 + 682 + 0 + 1 + + + 1 + 471 + 466 + 0 + 0 + + + 4 + 325 + 181 + 0 + 0 + + + 21 + 63 + 440 + 0 + 0 + + + 70 + 88 + 315 + 0 + 0 + + + 70 + 84 + 330 + 0 + 0 + + + 70 + 105 + 264 + 0 + 0 + + + 0 + 134 + 439 + 0 + 0 + + + 29 + 223 + 440 + 0 + 0 + + + 1018 + 233 + 119 + 0 + 0 + + + 68 + 106 + 555 + 1 + 0 + + + 1 + 463 + 474 + 0 + 0 + + + 0 + 314 + 478 + 0 + 0 + + + 204 + 170 + 163 + 2 + 0 + + + 70 + 292 + 336 + 0 + 0 + + + 70 + 170 + 346 + 0 + 0 + + + 1 + 615 + 642 + 3 + 0 + + + 70 + 82 + 338 + 0 + 0 + + + 284 + 667 + 696 + 2 + 0 + + + 70 + 238 + 541 + 6 + 0 + + + 38 + 52 + 534 + 0 + 0 + + + 0 + 696 + 667 + 0 + 0 + + + 11 + 113 + 521 + 0 + 0 + + + 70 + 101 + 275 + 0 + 0 + + + 72 + 208 + 619 + 3 + 0 + + + 37 + 673 + 558 + 6 + 0 + + + 153 + 601 + 450 + 0 + 0 + + + 38 + 246 + 399 + 0 + 0 + + + 1 + 619 + 750 + 1 + 1 + + + 34 + 382 + 708 + 0 + 0 + + + 284 + 626 + 687 + 2 + 0 + + + 407 + 640 + 617 + 1 + 0 + + + 70 + 133 + 209 + 0 + 0 + + + 70 + 169 + 347 + 0 + 0 + + + 70 + 171 + 343 + 0 + 0 + + + 0 + 50 + 556 + 7 + 0 + + + 70 + 172 + 341 + 0 + 0 + + + 7 + 113 + 519 + 4 + 0 + + + 402 + 508 + 671 + 2 + 0 + + + 20 + 102 + 575 + 0 + 0 + + + 1041 + 63 + 441 + 0 + 0 + + + 5 + 584 + 523 + 4 + 0 + + + 4 + 256 + 229 + 0 + 0 + + + 1018 + 217 + 128 + 2 + 0 + + + 70 + 177 + 157 + 0 + 0 + + + 285 + 552 + 490 + 4 + 0 + + + 284 + 634 + 678 + 0 + 0 + + + 38 + 254 + 506 + 0 + 0 + + + 284 + 653 + 711 + 0 + 0 + + + 20 + 214 + 459 + 0 + 0 + + + 70 + 235 + 418 + 0 + 0 + + + 273 + 265 + 105 + 0 + 0 + + + 70 + 254 + 231 + 0 + 0 + + + 284 + 669 + 694 + 2 + 0 + + + 4 + 62 + 449 + 0 + 0 + + + 15 + 124 + 1460 + 0 + 0 + + + 2 + 349 + 629 + 1 + 1 + + + 5 + 282 + 642 + 0 + 0 + + + 70 + 222 + 579 + 6 + 0 + + + 72 + 208 + 618 + 3 + 0 + + + 306 + 699 + 437 + 3 + 0 + + + 70 + 158 + 176 + 0 + 0 + + + 1 + 61 + 456 + 0 + 0 + + + 36 + 595 + 573 + 6 + 0 + + + 4 + 219 + 686 + 5 + 0 + + + 205 + 70 + 398 + 0 + 0 + + + 70 + 86 + 324 + 0 + 0 + + + 70 + 162 + 172 + 0 + 0 + + + 15 + 111 + 529 + 0 + 0 + + + 284 + 671 + 692 + 2 + 0 + + + 12 + 179 + 328 + 6 + 0 + + + 283 + 692 + 671 + 4 + 0 + + + 395 + 492 + 693 + 3 + 0 + + + 1010 + 234 + 119 + 0 + 0 + + + 1041 + 63 + 442 + 0 + 0 + + + 47 + 129 + 455 + 4 + 0 + + + 70 + 227 + 433 + 4 + 0 + + + 70 + 220 + 267 + 0 + 0 + + + 70 + 180 + 155 + 0 + 0 + + + 412 + 623 + 634 + 4 + 0 + + + 597 + 707 + 531 + 4 + 0 + + + 0 + 633 + 624 + 6 + 0 + + + 398 + 629 + 793 + 5 + 0 + + + 70 + 77 + 362 + 0 + 0 + + + 284 + 624 + 689 + 2 + 0 + + + 960 + 637 + 729 + 0 + 0 + + + 284 + 636 + 676 + 0 + 0 + + + 334 + 263 + 106 + 0 + 0 + + + 0 + 135 + 435 + 0 + 0 + + + 4 + 145 + 405 + 0 + 0 + + + 70 + 261 + 225 + 0 + 0 + + + 0 + 621 + 492 + 0 + 0 + + + 19 + 524 + 477 + 4 + 0 + + + 70 + 82 + 340 + 0 + 0 + + + 193 + 368 + 680 + 0 + 0 + + + 12 + 180 + 325 + 6 + 0 + + + 70 + 103 + 271 + 0 + 0 + + + 7 + 650 + 578 + 2 + 0 + + + 38 + 699 + 714 + 2 + 0 + + + 0 + 751 + 526 + 3 + 0 + + + 34 + 51 + 547 + 7 + 0 + + + 284 + 658 + 705 + 0 + 0 + + + 3 + 111 + 527 + 0 + 0 + + + 1 + 604 + 654 + 2 + 0 + + + 194 + 760 + 448 + 0 + 0 + + + 183 + 357 + 701 + 0 + 0 + + + 70 + 105 + 266 + 0 + 0 + + + 391 + 628 + 629 + 0 + 0 + + + 70 + 80 + 349 + 0 + 0 + + + 45 + 600 + 451 + 2 + 0 + + + 70 + 247 + 396 + 0 + 0 + + + 938 + 710 + 703 + 4 + 0 + + + 183 + 354 + 707 + 0 + 0 + + + 209 + 653 + 605 + 5 + 0 + + + 285 + 503 + 677 + 1 + 0 + + + 5 + 113 + 518 + 2 + 0 + + + 34 + 352 + 711 + 0 + 0 + + + 110 + 226 + 259 + 4 + 0 + + + 313 + 723 + 471 + 3 + 0 + + + 396 + 506 + 673 + 1 + 0 + + + 145 + 124 + 472 + 6 + 0 + + + 139 + 441 + 497 + 6 + 0 + + + 284 + 639 + 726 + 2 + 0 + + + 70 + 118 + 237 + 0 + 0 + + + 1011 + 235 + 119 + 0 + 0 + + + 51 + 712 + 701 + 4 + 0 + + + 6 + 203 + 482 + 4 + 0 + + + 33 + 464 + 658 + 0 + 0 + + + 6 + 618 + 551 + 6 + 0 + + + 20 + 165 + 593 + 0 + 0 + + + 285 + 594 + 514 + 7 + 0 + + + 1 + 121 + 484 + 6 + 0 + + + 206 + 323 + 303 + 0 + 0 + + + 70 + 334 + 293 + 0 + 0 + + + 21 + 64 + 437 + 0 + 0 + + + 286 + 522 + 585 + 0 + 0 + + + 37 + 613 + 613 + 4 + 0 + + + 70 + 126 + 222 + 0 + 0 + + + 38 + 258 + 227 + 0 + 0 + + + 72 + 208 + 620 + 3 + 0 + + + 205 + 71 + 394 + 0 + 0 + + + 34 + 695 + 490 + 0 + 0 + + + 1009 + 217 + 129 + 2 + 0 + + + 307 + 543 + 461 + 0 + 0 + + + 205 + 485 + 452 + 0 + 0 + + + 70 + 106 + 264 + 0 + 0 + + + 284 + 632 + 680 + 2 + 0 + + + 4 + 90 + 311 + 0 + 0 + + + 205 + 69 + 406 + 0 + 0 + + + 0 + 258 + 500 + 0 + 0 + + + 0 + 215 + 600 + 0 + 0 + + + 34 + 725 + 545 + 3 + 0 + + + 0 + 611 + 817 + 0 + 0 + + + 70 + 100 + 280 + 0 + 0 + + + 139 + 219 + 447 + 2 + 0 + + + 34 + 51 + 549 + 7 + 0 + + + 70 + 166 + 353 + 0 + 0 + + + 0 + 62 + 452 + 0 + 0 + + + 489 + 661 + 462 + 1 + 0 + + + 283 + 52 + 539 + 0 + 0 + + + 38 + 143 + 196 + 0 + 0 + + + 70 + 77 + 364 + 0 + 0 + + + 12 + 182 + 322 + 6 + 0 + + + 189 + 278 + 651 + 6 + 0 + + + 665 + 486 + 557 + 0 + 0 + + + 70 + 232 + 422 + 0 + 0 + + + 0 + 60 + 467 + 0 + 0 + + + 284 + 661 + 702 + 0 + 0 + + + 38 + 282 + 207 + 0 + 0 + + + 70 + 240 + 408 + 0 + 0 + + + 0 + 196 + 657 + 0 + 0 + + + 70 + 73 + 384 + 0 + 0 + + + 273 + 267 + 105 + 0 + 0 + + + 1041 + 63 + 445 + 0 + 0 + + + 70 + 304 + 192 + 0 + 0 + + + 286 + 603 + 449 + 0 + 0 + + + 205 + 246 + 114 + 0 + 0 + + + 13 + 183 + 319 + 6 + 0 + + + 395 + 488 + 698 + 1 + 0 + + + 3 + 588 + 519 + 0 + 0 + + + 45 + 535 + 702 + 2 + 0 + + + 206 + 172 + 163 + 6 + 0 + + + 7 + 111 + 526 + 4 + 0 + + + 0 + 316 + 476 + 0 + 0 + + + 4 + 92 + 305 + 0 + 0 + + + 0 + 614 + 497 + 0 + 0 + + + 285 + 596 + 512 + 7 + 0 + + + 0 + 598 + 776 + 3 + 0 + + + 98 + 648 + 471 + 2 + 0 + + + 100 + 560 + 545 + 4 + 0 + + + 55 + 163 + 601 + 0 + 0 + + + 598 + 487 + 556 + 0 + 0 + + + 597 + 752 + 453 + 2 + 0 + + + 20 + 174 + 563 + 4 + 0 + + + 70 + 88 + 319 + 0 + 0 + + + 0 + 194 + 664 + 3 + 0 + + + 284 + 649 + 715 + 0 + 0 + + + 205 + 208 + 135 + 0 + 0 + + + 70 + 331 + 296 + 0 + 0 + + + 283 + 482 + 455 + 4 + 0 + + + 38 + 262 + 223 + 0 + 0 + + + 21 + 369 + 678 + 2 + 0 + + + 1 + 294 + 615 + 2 + 0 + + + 285 + 510 + 531 + 0 + 0 + + + 1041 + 63 + 446 + 0 + 0 + + + 1 + 51 + 551 + 0 + 0 + + + 1 + 563 + 702 + 1 + 1 + + + 284 + 630 + 682 + 2 + 0 + + + 4 + 253 + 231 + 0 + 0 + + + 45 + 466 + 655 + 2 + 0 + + + 23 + 202 + 485 + 0 + 1 + + + 51 + 717 + 696 + 6 + 0 + + + 695 + 510 + 668 + 2 + 0 + + + 597 + 680 + 501 + 2 + 0 + + + 38 + 98 + 287 + 0 + 0 + + + 37 + 126 + 464 + 0 + 0 + + + 419 + 686 + 445 + 0 + 0 + + + 38 + 272 + 215 + 0 + 0 + + + 284 + 663 + 700 + 0 + 0 + + + 597 + 672 + 507 + 6 + 0 + + + 70 + 114 + 247 + 0 + 0 + + + 37 + 51 + 552 + 7 + 0 + + + 217 + 102 + 276 + 5 + 0 + + + 1 + 52 + 524 + 1 + 0 + + + 183 + 360 + 699 + 0 + 0 + + + 46 + 712 + 700 + 0 + 0 + + + 4 + 104 + 262 + 0 + 0 + + + 112 + 586 + 524 + 0 + 1 + + + 1 + 58 + 470 + 1 + 0 + + + 70 + 184 + 148 + 0 + 0 + + + 34 + 194 + 498 + 0 + 0 + + + 273 + 267 + 102 + 0 + 0 + + + 37 + 191 + 666 + 0 + 0 + + + 205 + 547 + 460 + 0 + 0 + + + 597 + 680 + 502 + 2 + 0 + + + 618 + 88 + 663 + 5 + 0 + + + 402 + 518 + 659 + 2 + 0 + + + 313 + 742 + 460 + 3 + 0 + + + 70 + 270 + 216 + 0 + 0 + + + 206 + 168 + 162 + 3 + 0 + + + 70 + 108 + 252 + 0 + 0 + + + 70 + 87 + 313 + 0 + 0 + + + 215 + 99 + 275 + 6 + 0 + + + 38 + 230 + 420 + 0 + 0 + + + 306 + 749 + 502 + 3 + 0 + + + 34 + 139 + 695 + 0 + 0 + + + 70 + 621 + 690 + 4 + 0 + + + 284 + 632 + 678 + 0 + 0 + + + 925 + 713 + 699 + 0 + 0 + + + 70 + 68 + 400 + 0 + 0 + + + 1 + 615 + 754 + 0 + 1 + + + 70 + 148 + 394 + 0 + 0 + + + 70 + 174 + 335 + 0 + 0 + + + 46 + 716 + 696 + 0 + 0 + + + 0 + 684 + 449 + 3 + 0 + + + 70 + 153 + 381 + 0 + 0 + + + 100 + 53 + 513 + 1 + 0 + + + 0 + 720 + 474 + 7 + 0 + + + 70 + 147 + 185 + 0 + 0 + + + 284 + 671 + 691 + 2 + 0 + + + 70 + 261 + 370 + 0 + 0 + + + 597 + 672 + 457 + 6 + 0 + + + 70 + 220 + 265 + 0 + 0 + + + 33 + 389 + 699 + 0 + 0 + + + 1 + 195 + 652 + 0 + 0 + + + 5 + 289 + 521 + 4 + 0 + + + 48 + 451 + 681 + 2 + 0 + + + 70 + 167 + 349 + 0 + 0 + + + 1 + 124 + 470 + 1 + 1 + + + 70 + 77 + 353 + 0 + 0 + + + 597 + 746 + 504 + 2 + 0 + + + 283 + 51 + 533 + 0 + 0 + + + 1 + 565 + 604 + 0 + 1 + + + 284 + 669 + 693 + 2 + 0 + + + 34 + 186 + 519 + 0 + 0 + + + 306 + 693 + 669 + 4 + 0 + + + 1039 + 62 + 438 + 0 + 0 + + + 313 + 750 + 455 + 3 + 0 + + + 283 + 599 + 774 + 0 + 0 + + + 21 + 534 + 704 + 4 + 0 + + + 72 + 206 + 617 + 7 + 0 + + + 72 + 207 + 614 + 7 + 0 + + + 70 + 83 + 327 + 0 + 0 + + + 205 + 277 + 98 + 0 + 0 + + + 70 + 225 + 429 + 0 + 0 + + + 46 + 530 + 513 + 0 + 0 + + + 205 + 334 + 289 + 0 + 0 + + + 34 + 636 + 729 + 0 + 0 + + + 597 + 708 + 531 + 4 + 0 + + + 106 + 233 + 250 + 4 + 0 + + + 70 + 166 + 165 + 0 + 0 + + + 205 + 83 + 330 + 0 + 0 + + + 72 + 205 + 620 + 3 + 0 + + + 4 + 141 + 413 + 0 + 0 + + + 3 + 616 + 753 + 0 + 0 + + + 4 + 681 + 552 + 1 + 0 + + + 575 + 690 + 445 + 0 + 0 + + + 285 + 626 + 741 + 0 + 0 + + + 1012 + 230 + 119 + 0 + 0 + + + 284 + 630 + 680 + 2 + 0 + + + 70 + 297 + 196 + 0 + 0 + + + 668 + 704 + 485 + 1 + 0 + + + 0 + 197 + 645 + 0 + 0 + + + 0 + 656 + 468 + 0 + 0 + + + 1 + 613 + 557 + 6 + 0 + + + 394 + 515 + 663 + 1 + 0 + + + 70 + 86 + 318 + 0 + 0 + + + 273 + 492 + 553 + 0 + 0 + + + 70 + 121 + 226 + 0 + 0 + + + 1012 + 217 + 126 + 2 + 0 + + + 70 + 68 + 402 + 0 + 0 + + + 11 + 438 + 701 + 0 + 0 + + + 34 + 700 + 537 + 2 + 0 + + + 1041 + 61 + 448 + 0 + 0 + + + 70 + 244 + 112 + 0 + 0 + + + 59 + 158 + 612 + 6 + 0 + + + 70 + 89 + 307 + 0 + 0 + + + 70 + 198 + 138 + 0 + 0 + + + 597 + 752 + 454 + 2 + 0 + + + 55 + 332 + 666 + 0 + 0 + + + 70 + 293 + 330 + 0 + 0 + + + 37 + 739 + 462 + 1 + 0 + + + 0 + 758 + 519 + 3 + 0 + + + 70 + 301 + 422 + 0 + 0 + + + 284 + 656 + 707 + 0 + 0 + + + 34 + 196 + 648 + 6 + 0 + + + 0 + 60 + 455 + 0 + 0 + + + 3 + 330 + 670 + 0 + 0 + + + 284 + 645 + 719 + 0 + 0 + + + 597 + 672 + 508 + 6 + 0 + + + 284 + 628 + 682 + 2 + 0 + + + 26 + 219 + 688 + 0 + 0 + + + 4 + 124 + 220 + 0 + 0 + + + 306 + 747 + 457 + 7 + 0 + + + 37 + 554 + 491 + 4 + 0 + + + 205 + 267 + 362 + 0 + 0 + + + 143 + 664 + 566 + 0 + 0 + + + 21 + 61 + 447 + 0 + 0 + + + 205 + 205 + 133 + 0 + 0 + + + 214 + 97 + 281 + 7 + 0 + + + 0 + 182 + 531 + 4 + 0 + + + 70 + 228 + 559 + 6 + 0 + + + 4 + 87 + 316 + 0 + 0 + + + 1 + 121 + 480 + 6 + 0 + + + 54 + 218 + 442 + 0 + 0 + + + 34 + 132 + 440 + 0 + 0 + + + 151 + 605 + 450 + 0 + 0 + + + 38 + 77 + 357 + 0 + 0 + + + 1 + 51 + 539 + 0 + 0 + + + 1009 + 231 + 119 + 0 + 0 + + + 0 + 696 + 441 + 3 + 0 + + + 0 + 257 + 496 + 0 + 0 + + + 70 + 138 + 421 + 0 + 0 + + + 0 + 614 + 641 + 3 + 0 + + + 72 + 553 + 555 + 3 + 0 + + + 3 + 452 + 679 + 6 + 0 + + + 5 + 218 + 692 + 0 + 0 + + + 286 + 609 + 447 + 0 + 0 + + + 3 + 450 + 682 + 6 + 0 + + + 70 + 64 + 429 + 0 + 0 + + + 214 + 97 + 283 + 6 + 0 + + + 1106 + 536 + 702 + 0 + 0 + + + 70 + 134 + 205 + 0 + 0 + + + 284 + 650 + 713 + 0 + 0 + + + 38 + 725 + 519 + 2 + 0 + + + 70 + 328 + 177 + 0 + 0 + + + 35 + 82 + 708 + 0 + 0 + + + 70 + 121 + 227 + 0 + 0 + + + 34 + 661 + 516 + 0 + 0 + + + 36 + 351 + 517 + 0 + 0 + + + 1039 + 63 + 436 + 4 + 0 + + + 70 + 175 + 157 + 0 + 0 + + + 284 + 482 + 458 + 2 + 0 + + + 34 + 205 + 470 + 0 + 0 + + + 7 + 122 + 476 + 0 + 0 + + + 45 + 199 + 640 + 1 + 1 + + + 0 + 735 + 464 + 1 + 0 + + + 70 + 76 + 361 + 0 + 0 + + + 4 + 248 + 234 + 0 + 0 + + + 70 + 156 + 372 + 0 + 0 + + + 70 + 80 + 343 + 0 + 0 + + + 5 + 277 + 655 + 0 + 0 + + + 284 + 662 + 700 + 0 + 0 + + + 70 + 183 + 150 + 0 + 0 + + + 70 + 242 + 398 + 0 + 0 + + + 694 + 509 + 670 + 1 + 0 + + + 4 + 74 + 371 + 0 + 0 + + + 1 + 263 + 104 + 1 + 1 + + + 70 + 153 + 379 + 0 + 0 + + + 0 + 726 + 542 + 3 + 0 + + + 307 + 545 + 462 + 0 + 0 + + + 284 + 626 + 684 + 2 + 0 + + + 213 + 179 + 324 + 0 + 0 + + + 306 + 684 + 550 + 1 + 0 + + + 394 + 500 + 682 + 3 + 0 + + + 306 + 339 + 651 + 0 + 0 + + + 70 + 313 + 407 + 0 + 0 + + + 70 + 172 + 337 + 0 + 0 + + + 0 + 470 + 470 + 0 + 0 + + + 597 + 695 + 491 + 0 + 0 + + + 145 + 511 + 533 + 4 + 0 + + + 70 + 141 + 196 + 0 + 0 + + + 70 + 283 + 341 + 0 + 0 + + + 3 + 275 + 549 + 2 + 0 + + + 194 + 368 + 684 + 4 + 0 + + + 72 + 207 + 615 + 3 + 0 + + + 306 + 694 + 542 + 1 + 0 + + + 72 + 206 + 618 + 3 + 0 + + + 50 + 560 + 703 + 0 + 0 + + + 70 + 114 + 242 + 0 + 0 + + + 284 + 652 + 711 + 0 + 0 + + + 70 + 331 + 175 + 0 + 0 + + + 21 + 62 + 445 + 0 + 0 + + + 1 + 286 + 634 + 0 + 0 + + + 284 + 667 + 695 + 2 + 0 + + + 70 + 141 + 411 + 0 + 0 + + + 1 + 564 + 698 + 0 + 1 + + + 4 + 136 + 203 + 0 + 0 + + + 1012 + 232 + 119 + 0 + 0 + + + 205 + 333 + 174 + 0 + 0 + + + 70 + 107 + 258 + 0 + 0 + + + 70 + 200 + 138 + 0 + 0 + + + 205 + 92 + 300 + 0 + 0 + + + 205 + 74 + 373 + 0 + 0 + + + 38 + 136 + 426 + 0 + 0 + + + 33 + 486 + 702 + 0 + 0 + + + 0 + 729 + 468 + 1 + 0 + + + 1010 + 217 + 127 + 2 + 0 + + + 0 + 635 + 730 + 0 + 0 + + + 1 + 131 + 442 + 0 + 0 + + + 183 + 357 + 705 + 0 + 0 + + + 4 + 96 + 287 + 0 + 0 + + + 1 + 584 + 733 + 1 + 0 + + + 145 + 508 + 536 + 6 + 0 + + + 0 + 654 + 469 + 0 + 0 + + + 13 + 185 + 313 + 2 + 0 + + + 284 + 637 + 672 + 0 + 0 + + + 45 + 535 + 703 + 2 + 0 + + + 284 + 624 + 686 + 2 + 0 + + + 205 + 93 + 296 + 0 + 0 + + + 54 + 314 + 307 + 0 + 0 + + + 21 + 63 + 437 + 0 + 0 + + + 32 + 464 + 661 + 0 + 0 + + + 272 + 616 + 639 + 0 + 0 + + + 70 + 64 + 430 + 0 + 0 + + + 70 + 224 + 568 + 6 + 0 + + + 70 + 75 + 367 + 0 + 0 + + + 70 + 267 + 361 + 0 + 0 + + + 1 + 201 + 633 + 0 + 0 + + + 110 + 226 + 256 + 4 + 0 + + + 385 + 538 + 699 + 4 + 0 + + + 1 + 206 + 468 + 0 + 0 + + + 50 + 116 + 499 + 0 + 0 + + + 4 + 334 + 381 + 0 + 0 + + + 283 + 51 + 540 + 0 + 0 + + + 4 + 182 + 318 + 0 + 0 + + + 70 + 297 + 430 + 0 + 0 + + + 70 + 295 + 196 + 0 + 0 + + + 70 + 196 + 295 + 0 + 0 + + + 1041 + 61 + 438 + 0 + 0 + + + 284 + 657 + 705 + 0 + 0 + + + 0 + 617 + 497 + 0 + 0 + + + 70 + 64 + 417 + 0 + 0 + + + 38 + 139 + 192 + 0 + 0 + + + 1 + 257 + 588 + 0 + 0 + + + 0 + 192 + 665 + 2 + 0 + + + 108 + 224 + 258 + 4 + 0 + + + 1 + 266 + 100 + 0 + 1 + + + 25 + 447 + 686 + 2 + 0 + + + 205 + 129 + 207 + 0 + 0 + + + 86 + 226 + 565 + 0 + 0 + + + 4 + 150 + 178 + 0 + 0 + + + 1039 + 60 + 445 + 0 + 0 + + + 653 + 681 + 502 + 4 + 0 + + + 1013 + 221 + 121 + 2 + 0 + + + 205 + 325 + 178 + 0 + 0 + + + 70 + 86 + 311 + 0 + 0 + + + 34 + 149 + 652 + 0 + 0 + + + 1 + 163 + 596 + 0 + 0 + + + 0 + 518 + 592 + 0 + 0 + + + 192 + 758 + 451 + 0 + 0 + + + 284 + 630 + 681 + 2 + 0 + + + 1011 + 219 + 122 + 2 + 0 + + + 70 + 257 + 225 + 0 + 0 + + + 1 + 283 + 644 + 0 + 0 + + + 1 + 185 + 525 + 0 + 0 + + + 0 + 195 + 655 + 0 + 0 + + + 34 + 663 + 751 + 0 + 0 + + + 7 + 122 + 474 + 4 + 0 + + + 668 + 702 + 487 + 1 + 0 + + + 313 + 705 + 435 + 3 + 0 + + + 20 + 270 + 99 + 2 + 0 + + + 72 + 206 + 620 + 3 + 0 + + + 72 + 207 + 617 + 3 + 0 + + + 1 + 201 + 635 + 0 + 0 + + + 13 + 181 + 319 + 6 + 0 + + + 1013 + 222 + 120 + 2 + 0 + + + 15 + 461 + 665 + 2 + 0 + + + 70 + 130 + 205 + 0 + 0 + + + 284 + 625 + 741 + 0 + 0 + + + 285 + 593 + 517 + 7 + 0 + + + 205 + 328 + 176 + 0 + 0 + + + 407 + 664 + 646 + 6 + 0 + + + 70 + 310 + 313 + 0 + 0 + + + 70 + 71 + 375 + 0 + 0 + + + 1 + 108 + 535 + 1 + 1 + + + 38 + 167 + 346 + 0 + 0 + + + 70 + 259 + 103 + 0 + 0 + + + 286 + 567 + 664 + 0 + 0 + + + 597 + 709 + 531 + 4 + 0 + + + 1 + 124 + 466 + 1 + 1 + + + 215 + 97 + 275 + 5 + 0 + + + 205 + 116 + 230 + 0 + 0 + + + 205 + 248 + 233 + 0 + 0 + + + 12 + 187 + 309 + 2 + 0 + + + 38 + 119 + 224 + 0 + 0 + + + 70 + 136 + 196 + 0 + 0 + + + 1012 + 224 + 119 + 0 + 0 + + + 25 + 449 + 491 + 0 + 0 + + + 164 + 87 + 664 + 5 + 0 + + + 0 + 612 + 501 + 0 + 0 + + + 111 + 232 + 249 + 0 + 0 + + + 1013 + 220 + 122 + 2 + 0 + + + 102 + 228 + 253 + 4 + 0 + + + 1 + 300 + 607 + 2 + 0 + + + 25 + 217 + 697 + 4 + 0 + + + 70 + 227 + 562 + 6 + 0 + + + 34 + 704 + 707 + 2 + 0 + + + 283 + 706 + 705 + 0 + 0 + + + 183 + 357 + 703 + 0 + 0 + + + 98 + 648 + 473 + 2 + 0 + + + 462 + 662 + 463 + 0 + 0 + + + 4 + 63 + 426 + 0 + 0 + + + 70 + 223 + 436 + 4 + 0 + + + 284 + 648 + 715 + 0 + 0 + + + 284 + 660 + 702 + 0 + 0 + + + 1 + 305 + 597 + 2 + 0 + + + 1 + 607 + 649 + 3 + 0 + + + 70 + 223 + 572 + 6 + 0 + + + 2 + 349 + 632 + 1 + 1 + + + 1016 + 218 + 123 + 2 + 0 + + + 22 + 278 + 655 + 0 + 0 + + + 0 + 133 + 434 + 0 + 0 + + + 216 + 97 + 277 + 5 + 0 + + + 37 + 499 + 503 + 0 + 0 + + + 0 + 607 + 505 + 0 + 0 + + + 0 + 503 + 499 + 4 + 0 + + + 290 + 557 + 614 + 0 + 0 + + + 4 + 169 + 159 + 0 + 0 + + + 70 + 245 + 397 + 0 + 0 + + + 284 + 628 + 683 + 2 + 0 + + + 26 + 627 + 739 + 0 + 0 + + + 1 + 285 + 639 + 0 + 0 + + + 47 + 126 + 458 + 0 + 0 + + + 34 + 191 + 668 + 1 + 0 + + + 72 + 207 + 616 + 3 + 0 + + + 597 + 672 + 456 + 6 + 0 + + + 70 + 308 + 414 + 0 + 0 + + + 70 + 170 + 339 + 0 + 0 + + + 284 + 626 + 685 + 2 + 0 + + + 23 + 735 + 512 + 6 + 0 + + + 8 + 61 + 439 + 0 + 0 + + + 15 + 157 + 619 + 0 + 0 + + + 4 + 75 + 357 + 0 + 0 + + + 1009 + 225 + 119 + 0 + 0 + + + 70 + 69 + 388 + 0 + 0 + + + 209 + 651 + 605 + 6 + 0 + + + 70 + 194 + 297 + 0 + 0 + + + 70 + 198 + 291 + 0 + 0 + + + 70 + 299 + 325 + 0 + 0 + + + 38 + 254 + 502 + 0 + 0 + + + 37 + 729 + 469 + 1 + 0 + + + 70 + 233 + 417 + 0 + 0 + + + 34 + 675 + 454 + 3 + 0 + + + 70 + 173 + 333 + 0 + 0 + + + 1039 + 60 + 446 + 0 + 0 + + + 3 + 452 + 678 + 6 + 0 + + + 70 + 180 + 320 + 0 + 0 + + + 70 + 166 + 347 + 0 + 0 + + + 1 + 119 + 484 + 6 + 0 + + + 70 + 88 + 304 + 0 + 0 + + + 70 + 152 + 176 + 0 + 0 + + + 284 + 639 + 725 + 2 + 0 + + + 55 + 324 + 300 + 0 + 0 + + + 0 + 721 + 522 + 0 + 0 + + + 70 + 284 + 203 + 0 + 0 + + + 404 + 634 + 785 + 6 + 0 + + + 34 + 50 + 536 + 0 + 0 + + + 70 + 116 + 231 + 0 + 0 + + + 13 + 179 + 322 + 6 + 0 + + + 15 + 288 + 525 + 4 + 0 + + + 205 + 488 + 452 + 0 + 0 + + + 72 + 206 + 619 + 7 + 0 + + + 396 + 492 + 695 + 5 + 0 + + + 183 + 360 + 697 + 0 + 0 + + + 25 + 614 + 613 + 0 + 0 + + + 70 + 267 + 364 + 0 + 0 + + + 20 + 137 + 420 + 0 + 0 + + + 70 + 207 + 278 + 0 + 0 + + + 70 + 138 + 417 + 0 + 0 + + + 34 + 352 + 714 + 0 + 0 + + + 34 + 380 + 715 + 0 + 0 + + + 70 + 80 + 337 + 0 + 0 + + + 21 + 61 + 442 + 0 + 0 + + + 38 + 318 + 181 + 0 + 0 + + + 36 + 344 + 529 + 0 + 0 + + + 284 + 638 + 672 + 0 + 0 + + + 205 + 194 + 139 + 0 + 0 + + + 1009 + 221 + 122 + 4 + 0 + + + 37 + 674 + 559 + 6 + 0 + + + 103 + 234 + 246 + 0 + 0 + + + 205 + 82 + 329 + 0 + 0 + + + 285 + 602 + 509 + 7 + 0 + + + 70 + 202 + 285 + 0 + 0 + + + 3 + 157 + 617 + 2 + 0 + + + 38 + 191 + 670 + 0 + 0 + + + 0 + 162 + 598 + 0 + 0 + + + 34 + 138 + 702 + 0 + 0 + + + 34 + 691 + 670 + 0 + 0 + + + 960 + 629 + 736 + 0 + 0 + + + 7 + 122 + 472 + 0 + 0 + + + 34 + 212 + 457 + 0 + 0 + + + 38 + 56 + 482 + 1 + 0 + + + 0 + 639 + 671 + 0 + 0 + + + 70 + 203 + 133 + 0 + 0 + + + 284 + 669 + 692 + 2 + 0 + + + 1106 + 536 + 703 + 0 + 0 + + + 100 + 559 + 705 + 0 + 0 + + + 70 + 174 + 331 + 0 + 0 + + + 7 + 121 + 476 + 0 + 0 + + + 0 + 619 + 495 + 0 + 0 + + + 284 + 482 + 457 + 2 + 0 + + + 284 + 624 + 687 + 2 + 0 + + + 70 + 120 + 224 + 0 + 0 + + + 70 + 112 + 240 + 0 + 0 + + + 597 + 746 + 505 + 2 + 0 + + + 0 + 629 + 487 + 6 + 0 + + + 70 + 166 + 162 + 0 + 0 + + + 34 + 680 + 554 + 1 + 0 + + + 70 + 119 + 226 + 0 + 0 + + + 1012 + 226 + 119 + 0 + 0 + + + 70 + 100 + 269 + 0 + 0 + + + 0 + 312 + 485 + 0 + 0 + + + 34 + 722 + 473 + 7 + 0 + + + 284 + 651 + 711 + 0 + 0 + + + 70 + 296 + 327 + 0 + 0 + + + 1011 + 217 + 124 + 2 + 0 + + + 0 + 667 + 512 + 6 + 0 + + + 1 + 59 + 456 + 0 + 0 + + + 36 + 743 + 507 + 7 + 0 + + + 47 + 631 + 597 + 4 + 0 + + + 24 + 168 + 160 + 2 + 1 + + + 284 + 667 + 694 + 2 + 0 + + + 306 + 694 + 667 + 4 + 0 + + + 268 + 444 + 690 + 0 + 0 + + + 70 + 116 + 232 + 0 + 0 + + + 72 + 552 + 555 + 3 + 0 + + + 313 + 675 + 506 + 3 + 0 + + + 1 + 350 + 718 + 0 + 0 + + + 70 + 319 + 401 + 0 + 0 + + + 15 + 557 + 550 + 4 + 0 + + + 215 + 99 + 272 + 6 + 0 + + + 12 + 177 + 325 + 0 + 0 + + + 0 + 671 + 509 + 6 + 0 + + + 286 + 506 + 675 + 1 + 0 + + + 0 + 609 + 647 + 3 + 0 + + + 72 + 207 + 618 + 3 + 0 + + + 34 + 60 + 449 + 0 + 0 + + + 1013 + 219 + 123 + 2 + 0 + + + 0 + 314 + 482 + 0 + 0 + + + 0 + 59 + 459 + 0 + 0 + + + 377 + 657 + 758 + 2 + 0 + + + 51 + 215 + 2582 + 0 + 0 + + + 51 + 591 + 667 + 4 + 0 + + + 70 + 183 + 148 + 0 + 0 + + + 55 + 694 + 568 + 5 + 0 + + + 0 + 303 + 500 + 0 + 0 + + + 70 + 282 + 96 + 0 + 0 + + + 70 + 299 + 192 + 0 + 0 + + + 45 + 535 + 704 + 4 + 0 + + + 1 + 50 + 542 + 0 + 0 + + + 1 + 462 + 477 + 0 + 0 + + + 25 + 447 + 493 + 2 + 0 + + + 445 + 669 + 563 + 6 + 0 + + + 334 + 263 + 103 + 0 + 0 + + + 280 + 277 + 547 + 0 + 0 + + + 1039 + 62 + 437 + 0 + 0 + + + 37 + 275 + 551 + 2 + 0 + + + 0 + 317 + 478 + 0 + 0 + + + 63 + 217 + 447 + 2 + 0 + + + 100 + 637 + 727 + 2 + 0 + + + 70 + 149 + 182 + 0 + 0 + + + 284 + 636 + 674 + 2 + 0 + + + 205 + 88 + 308 + 0 + 0 + + + 0 + 337 + 654 + 0 + 0 + + + 1010 + 217 + 125 + 6 + 0 + + + 1 + 346 + 637 + 0 + 1 + + + 284 + 655 + 707 + 0 + 0 + + + 1027 + 228 + 119 + 0 + 0 + + + 70 + 168 + 342 + 0 + 0 + + + 5 + 276 + 659 + 0 + 0 + + + 59 + 158 + 614 + 2 + 0 + + + 34 + 197 + 649 + 6 + 0 + + + 0 + 517 + 486 + 0 + 0 + + + 205 + 125 + 217 + 0 + 0 + + + 7 + 121 + 474 + 4 + 0 + + + 1 + 284 + 640 + 0 + 0 + + + 407 + 229 + 118 + 0 + 0 + + + 0 + 214 + 597 + 0 + 0 + + + 661 + 703 + 486 + 0 + 0 + + + 0 + 256 + 499 + 0 + 0 + + + 394 + 513 + 666 + 1 + 0 + + + 0 + 646 + 474 + 2 + 0 + + + 284 + 671 + 690 + 2 + 0 + + + 7 + 122 + 470 + 4 + 0 + + + 34 + 150 + 646 + 0 + 0 + + + 1 + 103 + 557 + 4 + 0 + + + 0 + 193 + 662 + 2 + 0 + + + 7 + 289 + 524 + 6 + 0 + + + 1039 + 62 + 436 + 0 + 0 + + + 1013 + 218 + 124 + 2 + 0 + + + 273 + 265 + 102 + 0 + 0 + + + 0 + 199 + 487 + 0 + 0 + + + 32 + 86 + 667 + 0 + 0 + + + 0 + 252 + 507 + 0 + 0 + + + 4 + 91 + 297 + 0 + 0 + + + 284 + 644 + 719 + 0 + 0 + + + 306 + 599 + 773 + 6 + 0 + + + 204 + 321 + 302 + 0 + 0 + + + 1 + 151 + 642 + 0 + 0 + + + 15 + 169 + 160 + 4 + 0 + + + 0 + 306 + 495 + 0 + 0 + + + 3 + 451 + 679 + 6 + 0 + + + 1 + 302 + 602 + 2 + 0 + + + 1 + 131 + 438 + 0 + 0 + + + 153 + 604 + 450 + 0 + 0 + + + 284 + 634 + 676 + 0 + 0 + + + 36 + 737 + 511 + 7 + 0 + + + 38 + 68 + 398 + 0 + 0 + + + 1029 + 624 + 742 + 4 + 0 + + + 398 + 614 + 811 + 2 + 0 + + + 4 + 164 + 165 + 0 + 0 + + + 1 + 351 + 518 + 0 + 0 + + + 4 + 83 + 326 + 0 + 0 + + + 38 + 89 + 304 + 0 + 0 + + + 41 + 508 + 535 + 4 + 0 + + + 70 + 297 + 219 + 0 + 0 + + + 3 + 290 + 524 + 4 + 0 + + + 37 + 637 + 726 + 2 + 0 + + + 284 + 645 + 717 + 0 + 0 + + + 70 + 222 + 293 + 0 + 0 + + + 34 + 163 + 560 + 0 + 0 + + + 0 + 170 + 537 + 4 + 0 + + + 4 + 172 + 178 + 0 + 0 + + + 70 + 113 + 271 + 0 + 0 + + + 1 + 619 + 596 + 1 + 1 + + + 1018 + 239 + 128 + 2 + 0 + + + 284 + 634 + 680 + 2 + 0 + + + 70 + 136 + 225 + 0 + 0 + + + 1 + 133 + 489 + 0 + 0 + + + 143 + 327 + 199 + 2 + 0 + + + 70 + 187 + 348 + 0 + 0 + + + 102 + 559 + 717 + 0 + 0 + + + 283 + 715 + 690 + 0 + 0 + + + 70 + 199 + 154 + 0 + 0 + + + 652 + 683 + 495 + 0 + 0 + + + 70 + 194 + 158 + 0 + 0 + + + 4 + 96 + 319 + 0 + 0 + + + 60 + 338 + 632 + 1 + 1 + + + 70 + 289 + 106 + 1 + 0 + + + 0 + 251 + 503 + 0 + 0 + + + 0 + 618 + 498 + 0 + 0 + + + 209 + 71 + 432 + 6 + 0 + + + 284 + 657 + 704 + 2 + 0 + + + 34 + 593 + 832 + 0 + 0 + + + 0 + 194 + 651 + 0 + 0 + + + 1 + 61 + 503 + 1 + 0 + + + 597 + 672 + 458 + 6 + 0 + + + 70 + 217 + 582 + 6 + 0 + + + 707 + 295 + 104 + 0 + 0 + + + 284 + 624 + 691 + 2 + 0 + + + 960 + 638 + 725 + 0 + 0 + + + 7 + 450 + 684 + 4 + 0 + + + 59 + 154 + 593 + 6 + 0 + + + 1 + 263 + 578 + 0 + 0 + + + 72 + 204 + 619 + 3 + 0 + + + 70 + 226 + 288 + 0 + 0 + + + 34 + 209 + 437 + 0 + 0 + + + 72 + 206 + 613 + 3 + 0 + + + 70 + 220 + 574 + 0 + 0 + + + 72 + 205 + 616 + 3 + 0 + + + 3 + 124 + 525 + 0 + 0 + + + 1 + 606 + 558 + 6 + 0 + + + 1 + 329 + 198 + 0 + 1 + + + 209 + 215 + 425 + 3 + 0 + + + 70 + 267 + 244 + 0 + 0 + + + 46 + 136 + 479 + 4 + 0 + + + 965 + 623 + 792 + 6 + 0 + + + 284 + 636 + 678 + 2 + 0 + + + 597 + 616 + 801 + 2 + 0 + + + 306 + 721 + 469 + 0 + 0 + + + 51 + 712 + 693 + 0 + 0 + + + 205 + 206 + 149 + 0 + 0 + + + 3 + 125 + 521 + 0 + 0 + + + 0 + 612 + 503 + 0 + 0 + + + 217 + 112 + 274 + 5 + 0 + + + 4 + 160 + 407 + 0 + 0 + + + 163 + 497 + 558 + 1 + 1 + + + 70 + 306 + 213 + 0 + 0 + + + 0 + 142 + 642 + 0 + 0 + + + 37 + 326 + 655 + 0 + 0 + + + 284 + 482 + 443 + 2 + 0 + + + 3 + 614 + 753 + 0 + 0 + + + 70 + 309 + 295 + 0 + 0 + + + 70 + 321 + 203 + 0 + 0 + + + 1 + 190 + 665 + 0 + 0 + + + 51 + 709 + 696 + 2 + 0 + + + 70 + 229 + 398 + 0 + 0 + + + 1 + 127 + 513 + 0 + 1 + + + 597 + 695 + 531 + 4 + 0 + + + 405 + 530 + 756 + 7 + 0 + + + 70 + 131 + 233 + 0 + 0 + + + 284 + 654 + 707 + 0 + 0 + + + 0 + 287 + 650 + 0 + 0 + + + 0 + 356 + 524 + 0 + 0 + + + 205 + 606 + 763 + 4 + 0 + + + 70 + 165 + 185 + 0 + 0 + + + 70 + 200 + 326 + 0 + 0 + + + 70 + 163 + 400 + 0 + 0 + + + 36 + 354 + 527 + 0 + 0 + + + 1 + 548 + 506 + 0 + 0 + + + 307 + 697 + 708 + 0 + 0 + + + 597 + 680 + 497 + 2 + 0 + + + 525 + 710 + 476 + 2 + 0 + + + 0 + 308 + 493 + 0 + 0 + + + 34 + 182 + 501 + 0 + 0 + + + 4 + 306 + 413 + 0 + 0 + + + 164 + 402 + 464 + 0 + 0 + + + 284 + 638 + 676 + 0 + 0 + + + 215 + 116 + 263 + 2 + 0 + + + 0 + 665 + 463 + 0 + 0 + + + 285 + 624 + 741 + 0 + 0 + + + 377 + 617 + 699 + 3 + 0 + + + 1009 + 221 + 138 + 4 + 0 + + + 70 + 122 + 250 + 0 + 0 + + + 209 + 214 + 426 + 6 + 0 + + + 24 + 304 + 300 + 2 + 1 + + + 5 + 349 + 612 + 0 + 0 + + + 70 + 235 + 538 + 0 + 0 + + + 164 + 728 + 507 + 0 + 0 + + + 306 + 701 + 704 + 0 + 0 + + + 1 + 350 + 434 + 0 + 0 + + + 269 + 426 + 438 + 2 + 0 + + + 70 + 302 + 216 + 0 + 0 + + + 217 + 117 + 261 + 0 + 0 + + + 36 + 492 + 687 + 6 + 0 + + + 70 + 303 + 301 + 0 + 0 + + + 1 + 609 + 658 + 3 + 0 + + + 70 + 72 + 424 + 0 + 0 + + + 284 + 626 + 689 + 2 + 0 + + + 205 + 133 + 230 + 0 + 0 + + + 1011 + 220 + 139 + 4 + 0 + + + 597 + 672 + 503 + 6 + 0 + + + 15 + 461 + 668 + 2 + 0 + + + 183 + 357 + 697 + 0 + 0 + + + 1 + 148 + 441 + 2 + 0 + + + 284 + 655 + 706 + 2 + 0 + + + 707 + 294 + 104 + 0 + 0 + + + 0 + 343 + 544 + 0 + 0 + + + 1019 + 237 + 129 + 0 + 0 + + + 1 + 146 + 447 + 0 + 0 + + + 395 + 652 + 757 + 0 + 0 + + + 1 + 145 + 450 + 2 + 0 + + + 1 + 69 + 443 + 0 + 0 + + + 70 + 250 + 261 + 0 + 0 + + + 7 + 125 + 522 + 0 + 0 + + + 284 + 649 + 713 + 0 + 0 + + + 284 + 466 + 459 + 2 + 0 + + + 3 + 561 + 549 + 4 + 0 + + + 4 + 96 + 316 + 0 + 0 + + + 70 + 220 + 416 + 0 + 0 + + + 33 + 499 + 678 + 6 + 0 + + + 34 + 678 + 499 + 0 + 0 + + + 1010 + 239 + 127 + 2 + 0 + + + 309 + 633 + 731 + 0 + 0 + + + 37 + 190 + 663 + 0 + 0 + + + 164 + 404 + 462 + 0 + 0 + + + 306 + 708 + 435 + 3 + 0 + + + 0 + 523 + 409 + 0 + 0 + + + 20 + 462 + 463 + 0 + 0 + + + 1013 + 220 + 138 + 4 + 0 + + + 34 + 661 + 746 + 0 + 0 + + + 72 + 553 + 557 + 3 + 0 + + + 5 + 442 + 484 + 4 + 0 + + + 72 + 555 + 555 + 3 + 0 + + + 0 + 70 + 434 + 0 + 0 + + + 70 + 124 + 245 + 0 + 0 + + + 70 + 178 + 367 + 0 + 0 + + + 597 + 742 + 456 + 2 + 0 + + + 396 + 502 + 674 + 1 + 0 + + + 70 + 223 + 565 + 6 + 0 + + + 0 + 684 + 539 + 1 + 0 + + + 1 + 285 + 655 + 0 + 1 + + + 4 + 182 + 167 + 0 + 0 + + + 143 + 330 + 198 + 0 + 0 + + + 70 + 180 + 363 + 0 + 0 + + + 70 + 218 + 578 + 6 + 0 + + + 1 + 144 + 636 + 0 + 0 + + + 1 + 142 + 645 + 0 + 0 + + + 396 + 537 + 746 + 1 + 0 + + + 0 + 201 + 627 + 0 + 0 + + + 394 + 489 + 692 + 3 + 0 + + + 23 + 600 + 462 + 0 + 0 + + + 284 + 642 + 672 + 0 + 0 + + + 70 + 195 + 156 + 0 + 0 + + + 205 + 304 + 215 + 0 + 0 + + + 394 + 482 + 702 + 5 + 0 + + + 962 + 625 + 789 + 6 + 0 + + + 0 + 754 + 489 + 3 + 0 + + + 36 + 357 + 523 + 0 + 0 + + + 36 + 346 + 718 + 0 + 0 + + + 70 + 233 + 541 + 0 + 0 + + + 37 + 275 + 552 + 2 + 0 + + + 284 + 482 + 444 + 2 + 0 + + + 70 + 268 + 244 + 0 + 0 + + + 597 + 752 + 450 + 2 + 0 + + + 164 + 736 + 501 + 0 + 0 + + + 37 + 54 + 564 + 7 + 0 + + + 4 + 103 + 635 + 0 + 0 + + + 72 + 204 + 618 + 3 + 0 + + + 36 + 600 + 564 + 6 + 0 + + + 70 + 108 + 282 + 0 + 0 + + + 72 + 205 + 615 + 3 + 0 + + + 5 + 422 + 3527 + 2 + 0 + + + 284 + 659 + 702 + 0 + 0 + + + 32 + 411 + 674 + 0 + 0 + + + 70 + 272 + 336 + 0 + 0 + + + 105 + 168 + 544 + 0 + 0 + + + 3 + 572 + 700 + 0 + 0 + + + 597 + 740 + 457 + 0 + 0 + + + 163 + 497 + 557 + 1 + 1 + + + 284 + 647 + 715 + 0 + 0 + + + 70 + 246 + 266 + 0 + 0 + + + 1 + 133 + 492 + 0 + 0 + + + 530 + 492 + 563 + 2 + 0 + + + 1011 + 219 + 138 + 4 + 0 + + + 283 + 643 + 767 + 6 + 0 + + + 1 + 260 + 583 + 0 + 0 + + + 37 + 500 + 554 + 0 + 0 + + + 70 + 296 + 426 + 0 + 0 + + + 145 + 514 + 539 + 0 + 0 + + + 70 + 126 + 240 + 0 + 0 + + + 70 + 280 + 108 + 0 + 0 + + + 7 + 349 + 712 + 4 + 0 + + + 209 + 70 + 432 + 4 + 0 + + + 284 + 639 + 724 + 2 + 0 + + + 34 + 615 + 802 + 0 + 0 + + + 285 + 603 + 511 + 7 + 0 + + + 414 + 622 + 593 + 4 + 0 + + + 38 + 296 + 309 + 0 + 0 + + + 42 + 515 + 538 + 6 + 0 + + + 34 + 719 + 513 + 2 + 0 + + + 2 + 323 + 662 + 4 + 0 + + + 1 + 58 + 522 + 1 + 0 + + + 407 + 648 + 618 + 6 + 0 + + + 97 + 648 + 666 + 6 + 0 + + + 283 + 471 + 454 + 0 + 0 + + + 34 + 678 + 544 + 1 + 0 + + + 1164 + 609 + 506 + 6 + 0 + + + 37 + 755 + 448 + 7 + 0 + + + 34 + 634 + 778 + 3 + 0 + + + 70 + 297 + 308 + 0 + 0 + + + 34 + 195 + 647 + 2 + 0 + + + 399 + 529 + 757 + 1 + 0 + + + 0 + 662 + 511 + 6 + 0 + + + 597 + 689 + 491 + 0 + 0 + + + 70 + 212 + 309 + 0 + 0 + + + 1 + 55 + 551 + 0 + 0 + + + 34 + 313 + 597 + 2 + 0 + + + 70 + 184 + 356 + 0 + 0 + + + 145 + 517 + 536 + 2 + 0 + + + 284 + 631 + 684 + 0 + 0 + + + 15 + 370 + 578 + 4 + 0 + + + 70 + 246 + 372 + 0 + 0 + + + 153 + 609 + 455 + 0 + 0 + + + 284 + 661 + 700 + 0 + 0 + + + 1 + 326 + 201 + 1 + 1 + + + 70 + 181 + 362 + 0 + 0 + + + 0 + 737 + 459 + 1 + 0 + + + 70 + 245 + 123 + 0 + 0 + + + 38 + 81 + 372 + 0 + 0 + + + 377 + 656 + 658 + 4 + 0 + + + 4 + 68 + 443 + 6 + 0 + + + 33 + 390 + 710 + 0 + 0 + + + 284 + 639 + 723 + 2 + 0 + + + 284 + 632 + 683 + 2 + 0 + + + 26 + 509 + 544 + 2 + 0 + + + 284 + 660 + 700 + 0 + 0 + + + 306 + 688 + 537 + 2 + 0 + + + 730 + 442 + 3367 + 5 + 0 + + + 193 + 313 + 681 + 0 + 0 + + + 23 + 637 + 580 + 0 + 0 + + + 1012 + 239 + 126 + 6 + 0 + + + 4 + 318 + 203 + 0 + 0 + + + 70 + 86 + 350 + 0 + 0 + + + 38 + 221 + 292 + 0 + 0 + + + 4 + 198 + 152 + 0 + 0 + + + 4 + 218 + 296 + 0 + 0 + + + 70 + 101 + 298 + 0 + 0 + + + 38 + 78 + 386 + 0 + 0 + + + 164 + 495 + 559 + 1 + 1 + + + 36 + 595 + 569 + 6 + 0 + + + 117 + 306 + 300 + 0 + 0 + + + 70 + 233 + 277 + 0 + 0 + + + 668 + 733 + 504 + 0 + 0 + + + 36 + 495 + 684 + 6 + 0 + + + 70 + 80 + 376 + 0 + 0 + + + 30 + 281 + 665 + 0 + 1 + + + 0 + 64 + 470 + 0 + 0 + + + 445 + 623 + 593 + 0 + 0 + + + 0 + 54 + 559 + 7 + 0 + + + 285 + 584 + 844 + 6 + 0 + + + 164 + 403 + 464 + 0 + 0 + + + 36 + 739 + 500 + 7 + 0 + + + 205 + 189 + 342 + 0 + 0 + + + 401 + 479 + 707 + 6 + 0 + + + 70 + 82 + 368 + 0 + 0 + + + 30 + 285 + 656 + 1 + 1 + + + 217 + 113 + 267 + 6 + 0 + + + 34 + 201 + 631 + 0 + 0 + + + 398 + 477 + 710 + 6 + 0 + + + 1 + 289 + 647 + 0 + 0 + + + 70 + 180 + 359 + 0 + 0 + + + 405 + 538 + 746 + 0 + 0 + + + 3 + 533 + 753 + 0 + 0 + + + 205 + 208 + 145 + 0 + 0 + + + 183 + 354 + 701 + 0 + 0 + + + 597 + 741 + 457 + 0 + 0 + + + 1 + 193 + 657 + 0 + 0 + + + 183 + 351 + 707 + 0 + 0 + + + 34 + 196 + 647 + 1 + 0 + + + 284 + 648 + 713 + 0 + 0 + + + 4 + 94 + 321 + 0 + 0 + + + 4 + 282 + 229 + 0 + 0 + + + 34 + 55 + 548 + 7 + 0 + + + 70 + 309 + 209 + 0 + 0 + + + 34 + 303 + 617 + 2 + 0 + + + 205 + 224 + 410 + 0 + 0 + + + 205 + 134 + 225 + 0 + 0 + + + 8 + 69 + 437 + 0 + 0 + + + 284 + 633 + 682 + 0 + 0 + + + 597 + 680 + 498 + 2 + 0 + + + 70 + 273 + 237 + 0 + 0 + + + 0 + 639 + 481 + 6 + 0 + + + 284 + 482 + 442 + 2 + 0 + + + 1013 + 219 + 137 + 4 + 0 + + + 72 + 205 + 619 + 3 + 0 + + + 70 + 308 + 412 + 0 + 0 + + + 72 + 206 + 616 + 7 + 0 + + + 597 + 696 + 531 + 4 + 0 + + + 70 + 283 + 324 + 0 + 0 + + + 377 + 628 + 785 + 3 + 0 + + + 307 + 542 + 458 + 0 + 0 + + + 284 + 657 + 703 + 2 + 0 + + + 34 + 55 + 545 + 7 + 0 + + + 70 + 327 + 388 + 0 + 0 + + + 1 + 194 + 654 + 0 + 0 + + + 1 + 137 + 472 + 0 + 1 + + + 38 + 291 + 103 + 0 + 0 + + + 20 + 270 + 111 + 0 + 0 + + + 38 + 193 + 335 + 0 + 0 + + + 33 + 392 + 706 + 0 + 0 + + + 29 + 441 + 3375 + 0 + 0 + + + 38 + 84 + 358 + 0 + 0 + + + 284 + 636 + 679 + 2 + 0 + + + 70 + 219 + 419 + 0 + 0 + + + 134 + 230 + 552 + 0 + 0 + + + 24 + 486 + 385 + 0 + 0 + + + 597 + 749 + 452 + 2 + 0 + + + 283 + 604 + 612 + 4 + 0 + + + 104 + 562 + 714 + 0 + 0 + + + 1 + 292 + 522 + 1 + 1 + + + 205 + 315 + 403 + 0 + 0 + + + 1 + 59 + 509 + 1 + 0 + + + 1 + 580 + 530 + 2 + 0 + + + 284 + 646 + 715 + 0 + 0 + + + 284 + 624 + 692 + 2 + 0 + + + 278 + 451 + 3369 + 0 + 0 + + + 70 + 215 + 301 + 0 + 0 + + + 1 + 316 + 592 + 2 + 0 + + + 284 + 658 + 702 + 0 + 0 + + + 34 + 54 + 556 + 7 + 0 + + + 205 + 78 + 385 + 0 + 0 + + + 214 + 112 + 268 + 3 + 0 + + + 4 + 190 + 158 + 0 + 0 + + + 30 + 281 + 666 + 1 + 1 + + + 0 + 63 + 474 + 0 + 0 + + + 34 + 766 + 482 + 3 + 0 + + + 70 + 200 + 324 + 0 + 0 + + + 38 + 162 + 400 + 0 + 0 + + + 6 + 652 + 709 + 2 + 0 + + + 1 + 221 + 3514 + 1 + 1 + + + 0 + 54 + 553 + 7 + 0 + + + 46 + 530 + 522 + 0 + 0 + + + 1016 + 218 + 137 + 4 + 0 + + + 70 + 137 + 218 + 0 + 0 + + + 1010 + 239 + 125 + 2 + 0 + + + 0 + 687 + 717 + 0 + 0 + + + 284 + 466 + 458 + 2 + 0 + + + 23 + 524 + 473 + 4 + 0 + + + 153 + 608 + 455 + 0 + 0 + + + 70 + 296 + 219 + 0 + 0 + + + 4 + 322 + 286 + 0 + 0 + + + 70 + 308 + 299 + 0 + 0 + + + 4 + 183 + 163 + 0 + 0 + + + 0 + 667 + 508 + 6 + 0 + + + 565 + 748 + 453 + 0 + 0 + + + 20 + 133 + 487 + 0 + 0 + + + 70 + 170 + 381 + 0 + 0 + + + 284 + 470 + 454 + 0 + 0 + + + 284 + 667 + 693 + 2 + 0 + + + 4 + 135 + 221 + 0 + 0 + + + 72 + 554 + 555 + 3 + 0 + + + 72 + 204 + 620 + 3 + 0 + + + 72 + 206 + 614 + 3 + 0 + + + 34 + 592 + 832 + 1 + 0 + + + 70 + 323 + 285 + 0 + 0 + + + 72 + 552 + 557 + 3 + 0 + + + 1 + 590 + 732 + 1 + 0 + + + 668 + 731 + 505 + 0 + 0 + + + 25 + 219 + 695 + 4 + 0 + + + 1039 + 68 + 439 + 0 + 0 + + + 34 + 718 + 686 + 7 + 0 + + + 72 + 205 + 617 + 7 + 0 + + + 284 + 637 + 678 + 0 + 0 + + + 70 + 82 + 364 + 0 + 0 + + + 1039 + 68 + 440 + 0 + 0 + + + 284 + 671 + 689 + 2 + 0 + + + 214 + 110 + 272 + 4 + 0 + + + 34 + 195 + 649 + 6 + 0 + + + 597 + 746 + 495 + 2 + 0 + + + 1 + 620 + 647 + 7 + 0 + + + 0 + 332 + 643 + 0 + 0 + + + 1 + 583 + 845 + 6 + 0 + + + 313 + 699 + 440 + 3 + 0 + + + 120 + 631 + 585 + 1 + 1 + + + 70 + 311 + 407 + 0 + 0 + + + 36 + 356 + 526 + 0 + 0 + + + 70 + 309 + 210 + 0 + 0 + + + 51 + 532 + 754 + 2 + 0 + + + 284 + 643 + 719 + 0 + 0 + + + 205 + 98 + 305 + 0 + 0 + + + 8 + 67 + 446 + 6 + 0 + + + 88 + 700 + 573 + 5 + 0 + + + 4 + 141 + 212 + 0 + 0 + + + 284 + 639 + 676 + 0 + 0 + + + 3 + 368 + 580 + 4 + 0 + + + 284 + 626 + 690 + 2 + 0 + + + 283 + 663 + 743 + 5 + 0 + + + 117 + 304 + 303 + 2 + 0 + + + 0 + 635 + 728 + 0 + 0 + + + 284 + 669 + 691 + 2 + 0 + + + 70 + 321 + 287 + 0 + 0 + + + 4 + 280 + 329 + 0 + 0 + + + 70 + 237 + 274 + 0 + 0 + + + 70 + 137 + 217 + 0 + 0 + + + 23 + 639 + 578 + 0 + 0 + + + 34 + 208 + 442 + 4 + 0 + + + 0 + 730 + 464 + 1 + 0 + + + 34 + 659 + 514 + 0 + 0 + + + 59 + 108 + 601 + 0 + 0 + + + 1 + 553 + 500 + 0 + 0 + + + 4 + 54 + 550 + 7 + 0 + + + 163 + 497 + 556 + 1 + 1 + + + 1 + 55 + 540 + 0 + 0 + + + 70 + 312 + 208 + 0 + 0 + + + 0 + 664 + 742 + 2 + 0 + + + 37 + 275 + 553 + 2 + 0 + + + 63 + 512 + 540 + 6 + 0 + + + 25 + 522 + 475 + 6 + 0 + + + 7 + 451 + 682 + 2 + 0 + + + 34 + 682 + 451 + 3 + 0 + + + 597 + 672 + 504 + 6 + 0 + + + 38 + 608 + 760 + 7 + 0 + + + 21 + 68 + 437 + 0 + 0 + + + 730 + 450 + 3376 + 0 + 0 + + + 193 + 311 + 686 + 0 + 0 + + + 395 + 484 + 700 + 5 + 0 + + + 1 + 588 + 682 + 0 + 0 + + + 72 + 205 + 618 + 7 + 0 + + + 0 + 319 + 477 + 0 + 0 + + + 72 + 206 + 615 + 3 + 0 + + + 59 + 105 + 619 + 0 + 0 + + + 1016 + 224 + 133 + 4 + 0 + + + 70 + 156 + 191 + 0 + 0 + + + 597 + 743 + 456 + 0 + 0 + + + 597 + 690 + 491 + 0 + 0 + + + 1 + 453 + 471 + 0 + 0 + + + 46 + 536 + 516 + 0 + 0 + + + 1 + 188 + 674 + 0 + 0 + + + 205 + 225 + 409 + 0 + 0 + + + 36 + 696 + 708 + 0 + 0 + + + 70 + 110 + 271 + 0 + 0 + + + 1 + 444 + 693 + 1 + 1 + + + 284 + 643 + 672 + 0 + 0 + + + 38 + 216 + 426 + 0 + 0 + + + 0 + 65 + 458 + 0 + 0 + + + 33 + 496 + 683 + 6 + 0 + + + 1 + 61 + 488 + 1 + 0 + + + 283 + 665 + 741 + 2 + 0 + + + 20 + 146 + 445 + 2 + 0 + + + 38 + 273 + 238 + 0 + 0 + + + 38 + 203 + 320 + 0 + 0 + + + 70 + 232 + 280 + 0 + 0 + + + 70 + 120 + 248 + 0 + 0 + + + 70 + 218 + 298 + 0 + 0 + + + 70 + 289 + 103 + 0 + 0 + + + 0 + 637 + 483 + 6 + 0 + + + 192 + 654 + 518 + 4 + 0 + + + 4 + 146 + 204 + 0 + 0 + + + 205 + 115 + 259 + 0 + 0 + + + 0 + 197 + 467 + 0 + 0 + + + 70 + 211 + 308 + 0 + 0 + + + 66 + 208 + 609 + 6 + 0 + + + 23 + 642 + 673 + 4 + 0 + + + 7 + 124 + 524 + 4 + 0 + + + 284 + 650 + 711 + 0 + 0 + + + 70 + 327 + 196 + 0 + 0 + + + 1013 + 218 + 136 + 4 + 0 + + + 1 + 572 + 752 + 0 + 0 + + + 26 + 473 + 454 + 2 + 0 + + + 597 + 752 + 451 + 2 + 0 + + + 38 + 183 + 162 + 0 + 0 + + + 27 + 440 + 488 + 4 + 0 + + + 72 + 204 + 614 + 7 + 0 + + + 38 + 189 + 339 + 0 + 0 + + + 1010 + 239 + 124 + 2 + 0 + + + 0 + 250 + 501 + 0 + 0 + + + 396 + 488 + 695 + 5 + 0 + + + 205 + 308 + 208 + 0 + 0 + + + 72 + 203 + 617 + 3 + 0 + + + 1 + 604 + 662 + 2 + 0 + + + 1140 + 482 + 389 + 6 + 0 + + + 70 + 98 + 303 + 0 + 0 + + + 597 + 746 + 496 + 2 + 0 + + + 273 + 441 + 487 + 4 + 0 + + + 102 + 560 + 714 + 0 + 0 + + + 34 + 191 + 656 + 1 + 0 + + + 70 + 222 + 407 + 0 + 0 + + + 284 + 628 + 685 + 2 + 0 + + + 58 + 600 + 717 + 0 + 0 + + + 70 + 142 + 209 + 0 + 0 + + + 284 + 667 + 692 + 2 + 0 + + + 0 + 167 + 541 + 4 + 0 + + + 36 + 495 + 685 + 3 + 0 + + + 290 + 600 + 464 + 0 + 0 + + + 4 + 317 + 395 + 0 + 0 + + + 5 + 476 + 451 + 0 + 0 + + + 406 + 490 + 692 + 6 + 0 + + + 32 + 533 + 750 + 0 + 0 + + + 70 + 127 + 233 + 0 + 0 + + + 284 + 640 + 672 + 0 + 0 + + + 70 + 627 + 590 + 6 + 0 + + + 70 + 116 + 255 + 0 + 0 + + + 70 + 282 + 227 + 0 + 0 + + + 4 + 68 + 435 + 3 + 0 + + + 34 + 591 + 833 + 1 + 0 + + + 37 + 633 + 729 + 2 + 0 + + + 205 + 88 + 336 + 0 + 0 + + + 70 + 154 + 192 + 0 + 0 + + + 0 + 66 + 448 + 0 + 0 + + + 0 + 643 + 433 + 5 + 0 + + + 205 + 293 + 308 + 0 + 0 + + + 70 + 204 + 314 + 0 + 0 + + + 117 + 302 + 299 + 2 + 0 + + + 284 + 627 + 686 + 0 + 0 + + + 50 + 303 + 298 + 0 + 0 + + + 36 + 357 + 525 + 0 + 0 + + + 284 + 650 + 710 + 2 + 0 + + + 4 + 217 + 416 + 0 + 0 + + + 70 + 191 + 155 + 0 + 0 + + + 36 + 351 + 534 + 0 + 0 + + + 383 + 612 + 455 + 0 + 0 + + + 1 + 61 + 484 + 1 + 0 + + + 1 + 188 + 667 + 0 + 0 + + + 70 + 238 + 379 + 0 + 0 + + + 348 + 621 + 596 + 2 + 0 + + + 3 + 616 + 749 + 0 + 0 + + + 70 + 185 + 347 + 0 + 0 + + + 1 + 64 + 461 + 0 + 0 + + + 20 + 276 + 554 + 6 + 0 + + + 3 + 123 + 522 + 0 + 0 + + + 0 + 637 + 485 + 6 + 0 + + + 1011 + 217 + 136 + 4 + 0 + + + 34 + 195 + 643 + 1 + 0 + + + 377 + 650 + 662 + 0 + 0 + + + 307 + 549 + 455 + 0 + 0 + + + 70 + 177 + 167 + 0 + 0 + + + 70 + 312 + 402 + 0 + 0 + + + 70 + 283 + 227 + 0 + 0 + + + 0 + 318 + 481 + 0 + 0 + + + 34 + 206 + 438 + 0 + 0 + + + 1 + 147 + 437 + 2 + 0 + + + 36 + 599 + 566 + 6 + 0 + + + 285 + 593 + 521 + 7 + 0 + + + 0 + 155 + 582 + 0 + 0 + + + 377 + 653 + 659 + 0 + 0 + + + 70 + 271 + 237 + 0 + 0 + + + 34 + 711 + 649 + 0 + 0 + + + 1 + 252 + 358 + 1 + 1 + + + 37 + 743 + 538 + 3 + 0 + + + 70 + 259 + 248 + 0 + 0 + + + 0 + 174 + 518 + 0 + 0 + + + 0 + 662 + 559 + 0 + 0 + + + 1016 + 232 + 127 + 0 + 0 + + + 0 + 608 + 508 + 0 + 0 + + + 70 + 106 + 278 + 0 + 0 + + + 70 + 172 + 373 + 0 + 0 + + + 5 + 121 + 530 + 0 + 0 + + + 70 + 167 + 384 + 0 + 0 + + + 38 + 72 + 409 + 0 + 0 + + + 284 + 629 + 684 + 0 + 0 + + + 70 + 148 + 199 + 0 + 0 + + + 194 + 760 + 446 + 0 + 0 + + + 1 + 332 + 565 + 0 + 1 + + + 34 + 306 + 613 + 2 + 0 + + + 34 + 161 + 560 + 0 + 0 + + + 0 + 204 + 442 + 0 + 0 + + + 8 + 66 + 447 + 0 + 0 + + + 1 + 136 + 663 + 0 + 1 + + + 284 + 639 + 722 + 2 + 0 + + + 597 + 697 + 531 + 4 + 0 + + + 1039 + 67 + 440 + 0 + 0 + + + 3 + 122 + 526 + 0 + 0 + + + 34 + 729 + 465 + 7 + 0 + + + 34 + 728 + 549 + 3 + 0 + + + 1 + 261 + 347 + 1 + 1 + + + 0 + 669 + 462 + 0 + 0 + + + 960 + 630 + 733 + 0 + 0 + + + 0 + 725 + 510 + 0 + 0 + + + 0 + 248 + 504 + 0 + 0 + + + 284 + 655 + 705 + 2 + 0 + + + 70 + 240 + 268 + 0 + 0 + + + 38 + 251 + 498 + 0 + 0 + + + 70 + 224 + 558 + 6 + 0 + + + 70 + 102 + 288 + 0 + 0 + + + 70 + 229 + 281 + 0 + 0 + + + 4 + 78 + 377 + 0 + 0 + + + 70 + 81 + 363 + 0 + 0 + + + 70 + 297 + 99 + 0 + 0 + + + 34 + 190 + 658 + 0 + 0 + + + 38 + 245 + 120 + 0 + 0 + + + 1011 + 239 + 123 + 0 + 0 + + + 306 + 695 + 532 + 2 + 0 + + + 34 + 315 + 596 + 2 + 0 + + + 34 + 53 + 555 + 7 + 0 + + + 0 + 305 + 501 + 0 + 0 + + + 283 + 496 + 561 + 0 + 0 + + + 654 + 683 + 497 + 4 + 0 + + + 1 + 604 + 562 + 6 + 0 + + + 37 + 524 + 531 + 0 + 0 + + + 402 + 577 + 746 + 0 + 0 + + + 8 + 66 + 446 + 0 + 0 + + + 70 + 222 + 290 + 0 + 0 + + + 34 + 707 + 523 + 2 + 0 + + + 72 + 203 + 616 + 3 + 0 + + + 0 + 611 + 654 + 3 + 0 + + + 1 + 489 + 569 + 0 + 0 + + + 1 + 129 + 499 + 0 + 0 + + + 46 + 530 + 525 + 0 + 0 + + + 283 + 595 + 776 + 0 + 0 + + + 877 + 742 + 580 + 7 + 0 + + + 401 + 508 + 668 + 2 + 0 + + + 215 + 109 + 269 + 4 + 0 + + + 70 + 322 + 388 + 0 + 0 + + + 30 + 128 + 502 + 0 + 0 + + + 1 + 64 + 458 + 0 + 0 + + + 4 + 90 + 326 + 0 + 0 + + + 394 + 630 + 781 + 3 + 0 + + + 70 + 139 + 211 + 0 + 0 + + + 36 + 693 + 710 + 2 + 0 + + + 38 + 304 + 411 + 0 + 0 + + + 284 + 632 + 681 + 2 + 0 + + + 205 + 657 + 749 + 0 + 0 + + + 70 + 126 + 233 + 0 + 0 + + + 70 + 239 + 269 + 0 + 0 + + + 36 + 697 + 706 + 0 + 0 + + + 70 + 73 + 402 + 0 + 0 + + + 70 + 146 + 201 + 0 + 0 + + + 0 + 313 + 488 + 0 + 0 + + + 404 + 532 + 751 + 7 + 0 + + + 284 + 644 + 717 + 0 + 0 + + + 597 + 672 + 505 + 6 + 0 + + + 1 + 522 + 592 + 0 + 0 + + + 70 + 110 + 267 + 0 + 0 + + + 6 + 231 + 392 + 4 + 0 + + + 336 + 267 + 110 + 0 + 0 + + + 46 + 536 + 519 + 0 + 0 + + + 34 + 590 + 834 + 4 + 0 + + + 284 + 482 + 446 + 2 + 0 + + + 306 + 688 + 671 + 4 + 0 + + + 34 + 350 + 713 + 0 + 0 + + + 70 + 217 + 297 + 0 + 0 + + + 284 + 671 + 688 + 2 + 0 + + + 1 + 194 + 645 + 0 + 0 + + + 597 + 691 + 491 + 0 + 0 + + + 205 + 238 + 380 + 0 + 0 + + + 183 + 357 + 699 + 0 + 0 + + + 33 + 412 + 675 + 0 + 0 + + + 70 + 227 + 284 + 0 + 0 + + + 5 + 142 + 454 + 0 + 0 + + + 205 + 225 + 402 + 0 + 0 + + + 283 + 689 + 670 + 4 + 0 + + + 597 + 744 + 456 + 0 + 0 + + + 70 + 82 + 357 + 0 + 0 + + + 1013 + 238 + 123 + 0 + 0 + + + 597 + 680 + 499 + 2 + 0 + + + 38 + 196 + 329 + 0 + 0 + + + 4 + 218 + 415 + 0 + 0 + + + 38 + 80 + 366 + 0 + 0 + + + 205 + 160 + 403 + 0 + 0 + + + 183 + 354 + 705 + 0 + 0 + + + 0 + 710 + 521 + 0 + 0 + + + 284 + 653 + 707 + 0 + 0 + + + 284 + 624 + 690 + 2 + 0 + + + 445 + 657 + 563 + 6 + 0 + + + 1010 + 217 + 135 + 6 + 0 + + + 407 + 602 + 462 + 0 + 0 + + + 38 + 91 + 322 + 0 + 0 + + + 597 + 749 + 453 + 2 + 0 + + + 33 + 486 + 698 + 0 + 0 + + + 72 + 204 + 613 + 7 + 0 + + + 6 + 289 + 101 + 0 + 0 + + + 597 + 616 + 799 + 2 + 0 + + + 51 + 558 + 554 + 4 + 0 + + + 72 + 557 + 555 + 3 + 0 + + + 72 + 555 + 557 + 3 + 0 + + + 0 + 307 + 497 + 0 + 0 + + + 284 + 634 + 679 + 2 + 0 + + + 284 + 642 + 719 + 0 + 0 + + + 1 + 193 + 648 + 0 + 0 + + + 284 + 470 + 457 + 0 + 0 + + + 70 + 236 + 383 + 0 + 0 + + + 0 + 314 + 486 + 0 + 0 + + + 72 + 553 + 559 + 3 + 0 + + + 14 + 140 + 460 + 4 + 0 + + + 70 + 99 + 295 + 0 + 0 + + + 70 + 324 + 279 + 0 + 0 + + + 284 + 469 + 458 + 2 + 0 + + + 1 + 497 + 502 + 0 + 0 + + + 281 + 484 + 388 + 0 + 0 + + + 1041 + 67 + 436 + 0 + 0 + + + 597 + 672 + 460 + 6 + 0 + + + 402 + 593 + 726 + 0 + 0 + + + 11 + 454 + 681 + 2 + 0 + + + 283 + 466 + 461 + 2 + 0 + + + 70 + 175 + 167 + 0 + 0 + + + 0 + 611 + 506 + 0 + 0 + + + 70 + 319 + 202 + 0 + 0 + + + 34 + 187 + 669 + 1 + 0 + + + 395 + 627 + 785 + 3 + 0 + + + 7 + 349 + 715 + 0 + 0 + + + 0 + 627 + 637 + 6 + 0 + + + 37 + 326 + 659 + 0 + 0 + + + 463 + 662 + 467 + 1 + 0 + + + 307 + 546 + 457 + 0 + 0 + + + 284 + 669 + 690 + 2 + 0 + + + 407 + 750 + 574 + 5 + 0 + + + 0 + 682 + 676 + 0 + 0 + + + 163 + 497 + 559 + 1 + 1 + + + 402 + 507 + 670 + 2 + 0 + + + 70 + 300 + 212 + 0 + 0 + + + 205 + 318 + 200 + 0 + 0 + + + 38 + 240 + 265 + 0 + 0 + + + 191 + 106 + 600 + 0 + 0 + + + 283 + 662 + 743 + 7 + 0 + + + 70 + 154 + 413 + 0 + 0 + + + 33 + 396 + 702 + 0 + 0 + + + 1 + 292 + 526 + 1 + 1 + + + 284 + 643 + 717 + 0 + 0 + + + 284 + 626 + 688 + 2 + 0 + + + 70 + 108 + 270 + 0 + 0 + + + 70 + 81 + 360 + 0 + 0 + + + 0 + 767 + 522 + 3 + 0 + + + 306 + 754 + 531 + 3 + 0 + + + 153 + 611 + 455 + 0 + 0 + + + 3 + 349 + 714 + 2 + 0 + + + 397 + 531 + 754 + 1 + 0 + + + 34 + 716 + 687 + 2 + 0 + + + 105 + 167 + 544 + 0 + 0 + + + 2 + 340 + 630 + 1 + 1 + + + 0 + 614 + 652 + 3 + 0 + + + 335 + 265 + 110 + 0 + 0 + + + 0 + 712 + 433 + 3 + 0 + + + 4 + 239 + 266 + 0 + 0 + + + 38 + 325 + 387 + 0 + 0 + + + 34 + 174 + 522 + 0 + 0 + + + 1 + 199 + 632 + 0 + 0 + + + 1 + 64 + 455 + 0 + 0 + + + 0 + 192 + 655 + 2 + 0 + + + 70 + 73 + 399 + 0 + 0 + + + 70 + 207 + 307 + 0 + 0 + + + 70 + 155 + 410 + 0 + 0 + + + 7 + 129 + 1457 + 4 + 0 + + + 34 + 589 + 835 + 2 + 0 + + + 284 + 652 + 707 + 0 + 0 + + + 1 + 200 + 454 + 0 + 0 + + + 306 + 761 + 526 + 3 + 0 + + + 34 + 753 + 492 + 3 + 0 + + + 70 + 209 + 304 + 0 + 0 + + + 0 + 143 + 635 + 0 + 0 + + + 34 + 347 + 718 + 0 + 0 + + + 70 + 276 + 329 + 0 + 0 + + + 306 + 738 + 502 + 6 + 0 + + + 0 + 633 + 487 + 6 + 0 + + + 37 + 326 + 657 + 0 + 0 + + + 70 + 291 + 100 + 0 + 0 + + + 0 + 329 + 651 + 0 + 0 + + + 205 + 275 + 231 + 0 + 0 + + + 34 + 718 + 516 + 2 + 0 + + + 284 + 671 + 687 + 2 + 0 + + + 20 + 262 + 111 + 6 + 0 + + + 1 + 350 + 537 + 0 + 0 + + + 284 + 669 + 689 + 2 + 0 + + + 1 + 661 + 744 + 7 + 0 + + + 1012 + 217 + 134 + 2 + 0 + + + 718 + 748 + 454 + 2 + 0 + + + 34 + 52 + 559 + 7 + 0 + + + 1 + 628 + 734 + 6 + 0 + + + 70 + 84 + 346 + 0 + 0 + + + 397 + 533 + 751 + 1 + 0 + + + 37 + 509 + 546 + 3 + 0 + + + 29 + 332 + 566 + 0 + 0 + + + 3 + 450 + 685 + 0 + 0 + + + 0 + 64 + 454 + 0 + 0 + + + 284 + 637 + 676 + 0 + 0 + + + 284 + 667 + 691 + 2 + 0 + + + 693 + 339 + 555 + 6 + 0 + + + 0 + 648 + 476 + 2 + 0 + + + 0 + 594 + 624 + 0 + 0 + + + 597 + 672 + 459 + 6 + 0 + + + 191 + 566 + 545 + 2 + 0 + + + 37 + 634 + 727 + 0 + 0 + + + 306 + 735 + 462 + 2 + 0 + + + 283 + 690 + 668 + 4 + 0 + + + 34 + 693 + 490 + 0 + 0 + + + 30 + 285 + 660 + 1 + 1 + + + 1016 + 238 + 122 + 0 + 0 + + + 0 + 317 + 484 + 0 + 0 + + + 0 + 593 + 625 + 4 + 0 + + + 407 + 667 + 600 + 6 + 0 + + + 284 + 641 + 719 + 0 + 0 + + + 46 + 133 + 479 + 4 + 0 + + + 283 + 692 + 666 + 4 + 0 + + + 70 + 107 + 271 + 0 + 0 + + + 70 + 183 + 348 + 0 + 0 + + + 34 + 733 + 546 + 3 + 0 + + + 4 + 145 + 200 + 0 + 0 + + + 4 + 97 + 299 + 0 + 0 + + + 284 + 628 + 686 + 2 + 0 + + + 70 + 99 + 293 + 0 + 0 + + + 597 + 698 + 531 + 4 + 0 + + + 284 + 641 + 672 + 0 + 0 + + + 72 + 204 + 617 + 7 + 0 + + + 70 + 491 + 436 + 0 + 0 + + + 72 + 205 + 614 + 3 + 0 + + + 38 + 276 + 105 + 0 + 0 + + + 1041 + 65 + 446 + 0 + 0 + + + 283 + 714 + 689 + 0 + 0 + + + 1 + 306 + 1506 + 3 + 1 + + + 0 + 308 + 498 + 0 + 0 + + + 70 + 228 + 552 + 6 + 0 + + + 72 + 203 + 620 + 3 + 0 + + + 284 + 650 + 709 + 0 + 0 + + + 286 + 616 + 451 + 0 + 0 + + + 23 + 639 + 580 + 0 + 0 + + + 1041 + 66 + 439 + 0 + 0 + + + 25 + 134 + 475 + 6 + 0 + + + 730 + 468 + 3398 + 0 + 0 + + + 70 + 68 + 426 + 0 + 0 + + + 420 + 714 + 519 + 2 + 0 + + + 34 + 54 + 536 + 0 + 0 + + + 0 + 201 + 451 + 0 + 0 + + + 4 + 242 + 263 + 0 + 0 + + + 1 + 292 + 644 + 0 + 0 + + + 0 + 628 + 491 + 6 + 0 + + + 1 + 56 + 517 + 1 + 0 + + + 306 + 741 + 540 + 3 + 0 + + + 70 + 148 + 430 + 0 + 0 + + + 114 + 562 + 712 + 0 + 0 + + + 70 + 149 + 427 + 0 + 0 + + + 404 + 530 + 755 + 1 + 0 + + + 34 + 715 + 688 + 2 + 0 + + + 4 + 233 + 389 + 0 + 0 + + + 70 + 123 + 235 + 0 + 0 + + + 4 + 137 + 211 + 0 + 0 + + + 284 + 647 + 713 + 0 + 0 + + + 308 + 596 + 774 + 6 + 0 + + + 70 + 168 + 380 + 0 + 0 + + + 284 + 659 + 700 + 0 + 0 + + + 0 + 700 + 659 + 0 + 0 + + + 1039 + 65 + 445 + 0 + 0 + + + 72 + 556 + 555 + 3 + 0 + + + 72 + 554 + 557 + 3 + 0 + + + 70 + 307 + 208 + 0 + 0 + + + 1013 + 237 + 122 + 0 + 0 + + + 164 + 739 + 460 + 7 + 0 + + + 70 + 220 + 414 + 0 + 0 + + + 30 + 283 + 665 + 0 + 1 + + + 1010 + 217 + 133 + 6 + 0 + + + 1 + 631 + 731 + 6 + 0 + + + 286 + 523 + 590 + 0 + 0 + + + 23 + 524 + 475 + 4 + 0 + + + 72 + 552 + 559 + 3 + 0 + + + 1 + 598 + 516 + 2 + 1 + + + 70 + 212 + 592 + 0 + 0 + + + 34 + 751 + 493 + 3 + 0 + + + 284 + 630 + 684 + 0 + 0 + + + 597 + 752 + 452 + 2 + 0 + + + 164 + 731 + 465 + 2 + 0 + + + 0 + 490 + 508 + 0 + 0 + + + 284 + 482 + 445 + 2 + 0 + + + 20 + 111 + 575 + 6 + 0 + + + 283 + 54 + 534 + 0 + 0 + + + 34 + 588 + 836 + 5 + 0 + + + 597 + 616 + 798 + 2 + 0 + + + 0 + 290 + 649 + 0 + 0 + + + 405 + 494 + 688 + 3 + 0 + + + 70 + 195 + 148 + 0 + 0 + + + 21 + 65 + 444 + 0 + 0 + + + 70 + 232 + 275 + 0 + 0 + + + 70 + 216 + 581 + 6 + 0 + + + 0 + 622 + 496 + 0 + 0 + + + 20 + 144 + 443 + 2 + 0 + + + 718 + 747 + 455 + 2 + 0 + + + 284 + 657 + 702 + 2 + 0 + + + 3 + 349 + 713 + 2 + 0 + + + 34 + 52 + 554 + 7 + 0 + + + 303 + 231 + 394 + 4 + 0 + + + 27 + 138 + 462 + 2 + 0 + + + 399 + 489 + 695 + 5 + 0 + + + 70 + 309 + 406 + 0 + 0 + + + 575 + 714 + 476 + 0 + 0 + + + 0 + 655 + 471 + 0 + 0 + + + 70 + 90 + 320 + 0 + 0 + + + 38 + 75 + 384 + 0 + 0 + + + 105 + 167 + 545 + 0 + 0 + + + 72 + 204 + 615 + 7 + 0 + + + 729 + 724 + 637 + 0 + 0 + + + 183 + 354 + 703 + 0 + 0 + + + 70 + 327 + 195 + 0 + 0 + + + 72 + 203 + 618 + 3 + 0 + + + 70 + 213 + 589 + 0 + 0 + + + 72 + 205 + 612 + 3 + 0 + + + 205 + 606 + 761 + 4 + 0 + + + 70 + 124 + 232 + 0 + 0 + + + 284 + 645 + 715 + 0 + 0 + + + 0 + 312 + 491 + 0 + 0 + + + 72 + 204 + 616 + 3 + 0 + + + 70 + 247 + 259 + 0 + 0 + + + 70 + 88 + 327 + 0 + 0 + + + 1041 + 66 + 436 + 3 + 0 + + + 72 + 205 + 613 + 7 + 0 + + + 104 + 561 + 713 + 0 + 0 + + + 0 + 53 + 543 + 7 + 0 + + + 70 + 319 + 394 + 0 + 0 + + + 1 + 129 + 496 + 0 + 0 + + + 306 + 502 + 553 + 4 + 0 + + + 70 + 237 + 270 + 0 + 0 + + + 70 + 162 + 395 + 0 + 0 + + + 1 + 434 + 494 + 0 + 1 + + + 1 + 61 + 472 + 1 + 0 + + + 1009 + 236 + 122 + 4 + 0 + + + 209 + 212 + 429 + 1 + 0 + + + 87 + 208 + 604 + 4 + 0 + + + 7 + 450 + 686 + 0 + 0 + + + 404 + 534 + 749 + 1 + 0 + + + 205 + 315 + 203 + 0 + 0 + + + 1 + 145 + 441 + 2 + 0 + + + 306 + 722 + 513 + 2 + 0 + + + 284 + 466 + 460 + 2 + 0 + + + 284 + 655 + 704 + 2 + 0 + + + 4 + 323 + 198 + 0 + 0 + + + 70 + 187 + 342 + 0 + 0 + + + 3 + 686 + 583 + 0 + 0 + + + 1 + 278 + 551 + 0 + 1 + + + 70 + 91 + 316 + 0 + 0 + + + 70 + 158 + 182 + 0 + 0 + + + 1 + 289 + 530 + 4 + 0 + + + 72 + 203 + 619 + 3 + 0 + + + 9 + 488 + 386 + 0 + 0 + + + 70 + 319 + 285 + 0 + 0 + + + 34 + 209 + 435 + 0 + 0 + + + 284 + 632 + 682 + 2 + 0 + + + 70 + 110 + 261 + 0 + 0 + + + 70 + 99 + 290 + 0 + 0 + + + 8 + 66 + 435 + 0 + 0 + + + 25 + 522 + 477 + 6 + 0 + + + 70 + 184 + 156 + 0 + 0 + + + 597 + 692 + 491 + 0 + 0 + + + 395 + 484 + 702 + 5 + 0 + + + 191 + 106 + 603 + 0 + 0 + + + 68 + 116 + 551 + 0 + 0 + + + 283 + 469 + 457 + 2 + 0 + + + 25 + 134 + 477 + 6 + 0 + + + 153 + 610 + 455 + 0 + 0 + + + 4 + 77 + 373 + 0 + 0 + + + 70 + 170 + 376 + 0 + 0 + + + 70 + 108 + 266 + 0 + 0 + + + 37 + 56 + 513 + 1 + 0 + + + 0 + 621 + 497 + 0 + 0 + + + 1011 + 237 + 121 + 0 + 0 + + + 0 + 762 + 486 + 3 + 0 + + + 285 + 487 + 440 + 0 + 0 + + + 38 + 120 + 239 + 0 + 0 + + + 4 + 299 + 304 + 0 + 0 + + + 0 + 616 + 501 + 0 + 0 + + + 117 + 304 + 299 + 6 + 0 + + + 702 + 745 + 456 + 6 + 0 + + + 283 + 620 + 793 + 0 + 0 + + + 70 + 100 + 287 + 0 + 0 + + + 0 + 598 + 771 + 6 + 0 + + + 205 + 326 + 196 + 0 + 0 + + + 284 + 642 + 717 + 0 + 0 + + + 23 + 735 + 457 + 0 + 0 + + + 46 + 714 + 694 + 0 + 0 + + + 1 + 264 + 353 + 1 + 1 + + + 4 + 128 + 254 + 0 + 0 + + + 286 + 484 + 694 + 2 + 0 + + + 284 + 671 + 686 + 2 + 0 + + + 34 + 466 + 665 + 0 + 0 + + + 306 + 727 + 462 + 2 + 0 + + + 1 + 298 + 619 + 2 + 0 + + + 38 + 159 + 397 + 0 + 0 + + + 399 + 632 + 784 + 3 + 0 + + + 1 + 197 + 631 + 0 + 0 + + + 1 + 200 + 466 + 0 + 0 + + + 597 + 680 + 494 + 2 + 0 + + + 205 + 226 + 144 + 0 + 0 + + + 205 + 155 + 210 + 0 + 0 + + + 12 + 526 + 469 + 6 + 0 + + + 0 + 619 + 644 + 3 + 0 + + + 1010 + 231 + 141 + 0 + 0 + + + 70 + 261 + 242 + 0 + 0 + + + 70 + 122 + 267 + 0 + 0 + + + 70 + 252 + 370 + 0 + 0 + + + 933 + 713 + 695 + 0 + 0 + + + 1009 + 236 + 138 + 4 + 0 + + + 284 + 641 + 676 + 0 + 0 + + + 70 + 217 + 573 + 0 + 0 + + + 665 + 296 + 110 + 4 + 0 + + + 70 + 167 + 195 + 0 + 0 + + + 46 + 710 + 698 + 0 + 0 + + + 402 + 533 + 748 + 1 + 0 + + + 37 + 635 + 725 + 2 + 0 + + + 38 + 187 + 665 + 0 + 0 + + + 70 + 282 + 224 + 0 + 0 + + + 20 + 345 + 625 + 0 + 0 + + + 1 + 141 + 448 + 0 + 0 + + + 98 + 660 + 509 + 2 + 0 + + + 0 + 668 + 464 + 0 + 0 + + + 24 + 601 + 721 + 1 + 1 + + + 0 + 311 + 495 + 0 + 0 + + + 34 + 134 + 696 + 0 + 0 + + + 70 + 153 + 413 + 0 + 0 + + + 70 + 84 + 388 + 0 + 0 + + + 70 + 299 + 312 + 0 + 0 + + + 37 + 721 + 466 + 1 + 0 + + + 4 + 169 + 193 + 0 + 0 + + + 183 + 351 + 703 + 0 + 0 + + + 205 + 187 + 338 + 0 + 0 + + + 1013 + 238 + 137 + 6 + 0 + + + 32 + 469 + 661 + 0 + 0 + + + 36 + 135 + 691 + 0 + 0 + + + 34 + 214 + 436 + 4 + 0 + + + 4 + 59 + 553 + 7 + 0 + + + 402 + 61 + 535 + 0 + 0 + + + 597 + 699 + 531 + 4 + 0 + + + 0 + 664 + 559 + 0 + 0 + + + 676 + 489 + 563 + 2 + 0 + + + 0 + 75 + 435 + 4 + 0 + + + 307 + 540 + 457 + 0 + 0 + + + 284 + 629 + 689 + 0 + 0 + + + 0 + 670 + 554 + 0 + 0 + + + 70 + 128 + 255 + 0 + 0 + + + 0 + 313 + 492 + 0 + 0 + + + 70 + 164 + 384 + 0 + 0 + + + 70 + 279 + 117 + 0 + 0 + + + 70 + 293 + 215 + 0 + 0 + + + 88 + 704 + 654 + 0 + 0 + + + 407 + 712 + 560 + 0 + 0 + + + 597 + 672 + 500 + 6 + 0 + + + 205 + 250 + 252 + 0 + 0 + + + 7 + 442 + 488 + 0 + 0 + + + 70 + 213 + 583 + 6 + 0 + + + 4 + 703 + 655 + 0 + 0 + + + 960 + 636 + 724 + 0 + 0 + + + 284 + 655 + 703 + 2 + 0 + + + 164 + 495 + 556 + 1 + 1 + + + 113 + 476 + 706 + 0 + 0 + + + 70 + 178 + 354 + 0 + 0 + + + 13 + 518 + 476 + 6 + 0 + + + 400 + 531 + 751 + 1 + 0 + + + 139 + 550 + 611 + 4 + 0 + + + 306 + 677 + 548 + 1 + 0 + + + 419 + 690 + 449 + 2 + 0 + + + 1 + 70 + 467 + 1 + 0 + + + 284 + 469 + 460 + 2 + 0 + + + 70 + 251 + 372 + 0 + 0 + + + 36 + 133 + 702 + 6 + 0 + + + 4 + 189 + 173 + 0 + 0 + + + 284 + 644 + 715 + 0 + 0 + + + 402 + 487 + 690 + 3 + 0 + + + 1 + 195 + 637 + 0 + 1 + + + 284 + 626 + 692 + 2 + 0 + + + 4 + 218 + 150 + 0 + 0 + + + 597 + 672 + 461 + 6 + 0 + + + 3 + 453 + 684 + 0 + 0 + + + 70 + 112 + 292 + 0 + 0 + + + 29 + 121 + 521 + 2 + 0 + + + 1 + 462 + 467 + 0 + 0 + + + 0 + 317 + 486 + 0 + 0 + + + 1 + 145 + 644 + 0 + 0 + + + 70 + 303 + 410 + 0 + 0 + + + 98 + 659 + 510 + 2 + 0 + + + 284 + 639 + 678 + 0 + 0 + + + 0 + 764 + 522 + 3 + 0 + + + 1010 + 232 + 141 + 0 + 0 + + + 1013 + 237 + 138 + 6 + 0 + + + 70 + 174 + 188 + 0 + 0 + + + 70 + 325 + 194 + 0 + 0 + + + 72 + 203 + 612 + 3 + 0 + + + 0 + 628 + 635 + 6 + 0 + + + 38 + 170 + 371 + 0 + 0 + + + 205 + 238 + 265 + 0 + 0 + + + 24 + 600 + 722 + 2 + 1 + + + 1 + 459 + 675 + 1 + 1 + + + 1 + 372 + 580 + 1 + 1 + + + 70 + 214 + 153 + 0 + 0 + + + 1 + 491 + 561 + 0 + 0 + + + 1 + 444 + 486 + 1 + 1 + + + 1011 + 239 + 137 + 6 + 0 + + + 36 + 346 + 533 + 0 + 0 + + + 1 + 129 + 489 + 0 + 0 + + + 192 + 619 + 543 + 0 + 0 + + + 38 + 67 + 489 + 1 + 0 + + + 145 + 511 + 539 + 0 + 0 + + + 20 + 580 + 747 + 0 + 0 + + + 70 + 182 + 180 + 0 + 0 + + + 70 + 215 + 577 + 6 + 0 + + + 1 + 637 + 723 + 6 + 0 + + + 25 + 134 + 473 + 6 + 0 + + + 1 + 139 + 456 + 3 + 1 + + + 34 + 390 + 705 + 0 + 0 + + + 70 + 272 + 233 + 0 + 0 + + + 70 + 221 + 146 + 0 + 0 + + + 36 + 596 + 564 + 6 + 0 + + + 70 + 109 + 296 + 0 + 0 + + + 1012 + 239 + 135 + 6 + 0 + + + 597 + 752 + 447 + 2 + 0 + + + 306 + 566 + 548 + 0 + 0 + + + 72 + 203 + 611 + 3 + 0 + + + 46 + 536 + 513 + 0 + 0 + + + 38 + 96 + 336 + 0 + 0 + + + 1 + 261 + 358 + 1 + 1 + + + 70 + 304 + 408 + 0 + 0 + + + 284 + 632 + 686 + 2 + 0 + + + 205 + 250 + 374 + 0 + 0 + + + 1 + 286 + 646 + 0 + 0 + + + 70 + 302 + 210 + 0 + 0 + + + 70 + 299 + 415 + 0 + 0 + + + 55 + 651 + 666 + 4 + 0 + + + 284 + 658 + 700 + 0 + 0 + + + 55 + 653 + 664 + 4 + 0 + + + 59 + 152 + 615 + 2 + 0 + + + 284 + 646 + 713 + 0 + 0 + + + 1009 + 229 + 141 + 4 + 0 + + + 70 + 92 + 351 + 0 + 0 + + + 22 + 652 + 665 + 4 + 0 + + + 12 + 520 + 474 + 6 + 0 + + + 38 + 290 + 428 + 0 + 0 + + + 0 + 216 + 433 + 4 + 0 + + + 1 + 262 + 357 + 0 + 1 + + + 70 + 165 + 196 + 0 + 0 + + + 33 + 447 + 694 + 4 + 0 + + + 323 + 566 + 594 + 0 + 0 + + + 24 + 122 + 520 + 0 + 0 + + + 51 + 281 + 2954 + 0 + 0 + + + 961 + 638 + 722 + 0 + 0 + + + 70 + 118 + 274 + 0 + 0 + + + 205 + 315 + 394 + 0 + 0 + + + 3 + 615 + 749 + 0 + 0 + + + 6 + 533 + 516 + 4 + 0 + + + 70 + 236 + 269 + 0 + 0 + + + 1 + 307 + 602 + 2 + 0 + + + 4 + 114 + 284 + 0 + 0 + + + 29 + 438 + 493 + 0 + 0 + + + 72 + 557 + 557 + 3 + 0 + + + 70 + 297 + 418 + 0 + 0 + + + 4 + 175 + 185 + 0 + 0 + + + 38 + 119 + 272 + 0 + 0 + + + 72 + 559 + 555 + 3 + 0 + + + 72 + 555 + 559 + 3 + 0 + + + 1 + 129 + 492 + 0 + 0 + + + 284 + 634 + 684 + 0 + 0 + + + 306 + 673 + 461 + 4 + 0 + + + 46 + 530 + 519 + 0 + 0 + + + 70 + 268 + 236 + 0 + 0 + + + 397 + 532 + 749 + 1 + 0 + + + 70 + 251 + 252 + 0 + 0 + + + 30 + 126 + 502 + 0 + 0 + + + 1 + 315 + 586 + 2 + 0 + + + 4 + 256 + 247 + 0 + 0 + + + 404 + 477 + 705 + 2 + 0 + + + 70 + 85 + 381 + 0 + 0 + + + 34 + 596 + 622 + 2 + 0 + + + 284 + 482 + 448 + 2 + 0 + + + 1 + 614 + 649 + 3 + 0 + + + 16 + 121 + 523 + 0 + 0 + + + 597 + 749 + 449 + 2 + 0 + + + 29 + 345 + 714 + 0 + 0 + + + 23 + 637 + 582 + 0 + 0 + + + 1018 + 230 + 141 + 4 + 0 + + + 37 + 191 + 649 + 0 + 0 + + + 284 + 630 + 688 + 2 + 0 + + + 70 + 102 + 318 + 0 + 0 + + + 284 + 645 + 672 + 0 + 0 + + + 63 + 523 + 471 + 2 + 0 + + + 205 + 303 + 309 + 0 + 0 + + + 151 + 606 + 454 + 4 + 0 + + + 284 + 639 + 721 + 2 + 0 + + + 70 + 107 + 303 + 0 + 0 + + + 70 + 190 + 333 + 0 + 0 + + + 70 + 222 + 285 + 0 + 0 + + + 4 + 151 + 419 + 0 + 0 + + + 32 + 56 + 579 + 0 + 0 + + + 33 + 593 + 835 + 6 + 0 + + + 284 + 648 + 711 + 2 + 0 + + + 68 + 114 + 555 + 3 + 0 + + + 0 + 189 + 656 + 0 + 0 + + + 597 + 685 + 491 + 0 + 0 + + + 597 + 746 + 497 + 2 + 0 + + + 34 + 683 + 454 + 3 + 0 + + + 3 + 454 + 683 + 0 + 0 + + + 207 + 308 + 304 + 0 + 0 + + + 70 + 300 + 211 + 0 + 0 + + + 70 + 122 + 266 + 0 + 0 + + + 70 + 275 + 118 + 0 + 0 + + + 70 + 104 + 312 + 0 + 0 + + + 70 + 196 + 323 + 0 + 0 + + + 20 + 130 + 487 + 0 + 0 + + + 0 + 700 + 443 + 3 + 0 + + + 399 + 530 + 752 + 1 + 0 + + + 15 + 214 + 2583 + 6 + 0 + + + 205 + 619 + 501 + 0 + 0 + + + 70 + 129 + 252 + 0 + 0 + + + 205 + 258 + 126 + 0 + 0 + + + 36 + 354 + 696 + 0 + 0 + + + 1018 + 239 + 136 + 2 + 0 + + + 1 + 73 + 445 + 0 + 0 + + + 72 + 200 + 620 + 3 + 0 + + + 1 + 285 + 648 + 0 + 0 + + + 70 + 203 + 160 + 0 + 0 + + + 34 + 145 + 646 + 1 + 0 + + + 0 + 720 + 515 + 1 + 0 + + + 70 + 171 + 190 + 0 + 0 + + + 1 + 73 + 439 + 0 + 0 + + + 3 + 450 + 3372 + 0 + 0 + + + 1 + 59 + 543 + 0 + 0 + + + 284 + 638 + 680 + 2 + 0 + + + 63 + 131 + 478 + 6 + 0 + + + 676 + 488 + 563 + 2 + 0 + + + 70 + 104 + 308 + 0 + 0 + + + 72 + 204 + 612 + 3 + 0 + + + 284 + 655 + 702 + 2 + 0 + + + 72 + 203 + 615 + 3 + 0 + + + 0 + 144 + 435 + 0 + 0 + + + 3 + 453 + 683 + 0 + 0 + + + 1009 + 227 + 141 + 4 + 0 + + + 70 + 200 + 313 + 0 + 0 + + + 598 + 291 + 110 + 0 + 0 + + + 5 + 119 + 526 + 0 + 0 + + + 70 + 321 + 195 + 0 + 0 + + + 4 + 291 + 322 + 0 + 0 + + + 117 + 600 + 723 + 2 + 0 + + + 1010 + 239 + 134 + 2 + 0 + + + 30 + 124 + 505 + 2 + 0 + + + 0 + 142 + 441 + 0 + 0 + + + 445 + 660 + 563 + 6 + 0 + + + 70 + 330 + 284 + 0 + 0 + + + 0 + 149 + 629 + 0 + 0 + + + 1 + 61 + 525 + 1 + 0 + + + 306 + 735 + 543 + 0 + 0 + + + 70 + 316 + 395 + 0 + 0 + + + 306 + 746 + 535 + 0 + 0 + + + 284 + 657 + 700 + 0 + 0 + + + 1 + 252 + 613 + 0 + 0 + + + 597 + 700 + 531 + 4 + 0 + + + 32 + 444 + 697 + 4 + 0 + + + 191 + 104 + 603 + 0 + 0 + + + 34 + 615 + 805 + 5 + 0 + + + 706 + 292 + 110 + 0 + 0 + + + 284 + 645 + 713 + 0 + 0 + + + 3 + 614 + 749 + 0 + 0 + + + 1 + 265 + 583 + 0 + 0 + + + 20 + 226 + 3517 + 0 + 0 + + + 70 + 328 + 286 + 0 + 0 + + + 70 + 257 + 244 + 0 + 0 + + + 205 + 327 + 382 + 0 + 0 + + + 34 + 387 + 710 + 0 + 0 + + + 284 + 627 + 692 + 0 + 0 + + + 70 + 321 + 389 + 0 + 0 + + + 205 + 84 + 382 + 0 + 0 + + + 214 + 122 + 263 + 4 + 0 + + + 80 + 459 + 674 + 0 + 1 + + + 38 + 294 + 319 + 0 + 0 + + + 70 + 233 + 536 + 0 + 0 + + + 70 + 80 + 401 + 0 + 0 + + + 13 + 525 + 469 + 7 + 0 + + + 34 + 700 + 707 + 2 + 0 + + + 34 + 111 + 563 + 7 + 0 + + + 70 + 187 + 172 + 0 + 0 + + + 215 + 120 + 268 + 2 + 0 + + + 37 + 126 + 496 + 0 + 0 + + + 205 + 96 + 335 + 0 + 0 + + + 1 + 701 + 706 + 2 + 0 + + + 183 + 351 + 701 + 0 + 0 + + + 597 + 746 + 498 + 2 + 0 + + + 70 + 234 + 533 + 0 + 0 + + + 51 + 709 + 698 + 2 + 0 + + + 3 + 281 + 550 + 2 + 0 + + + 0 + 588 + 526 + 0 + 0 + + + 425 + 695 + 445 + 6 + 0 + + + 1 + 72 + 447 + 0 + 0 + + + 284 + 624 + 695 + 2 + 0 + + + 70 + 322 + 194 + 0 + 0 + + + 34 + 135 + 695 + 0 + 0 + + + 0 + 588 + 679 + 0 + 0 + + + 36 + 740 + 502 + 7 + 0 + + + 1 + 453 + 475 + 0 + 0 + + + 1 + 119 + 525 + 0 + 1 + + + 70 + 104 + 309 + 0 + 0 + + + 37 + 58 + 554 + 7 + 0 + + + 36 + 353 + 697 + 0 + 0 + + + 404 + 478 + 704 + 2 + 0 + + + 183 + 348 + 707 + 0 + 0 + + + 1012 + 228 + 141 + 4 + 0 + + + 70 + 209 + 299 + 0 + 0 + + + 398 + 632 + 783 + 3 + 0 + + + 70 + 262 + 123 + 0 + 0 + + + 4 + 160 + 391 + 0 + 0 + + + 284 + 469 + 459 + 2 + 0 + + + 598 + 293 + 110 + 0 + 0 + + + 0 + 697 + 660 + 0 + 0 + + + 38 + 193 + 167 + 0 + 0 + + + 205 + 167 + 193 + 0 + 0 + + + 70 + 287 + 218 + 0 + 0 + + + 0 + 71 + 454 + 0 + 0 + + + 394 + 490 + 687 + 1 + 0 + + + 285 + 631 + 729 + 2 + 0 + + + 70 + 305 + 308 + 0 + 0 + + + 36 + 134 + 701 + 6 + 0 + + + 70 + 331 + 377 + 0 + 0 + + + 70 + 183 + 342 + 0 + 0 + + + 34 + 683 + 544 + 1 + 0 + + + 284 + 625 + 694 + 0 + 0 + + + 4 + 185 + 338 + 0 + 0 + + + 0 + 189 + 660 + 0 + 0 + + + 205 + 147 + 219 + 0 + 0 + + + 1 + 73 + 441 + 0 + 0 + + + 112 + 423 + 3523 + 0 + 0 + + + 63 + 550 + 612 + 4 + 0 + + + 283 + 471 + 457 + 0 + 0 + + + 597 + 680 + 495 + 2 + 0 + + + 70 + 115 + 280 + 0 + 0 + + + 4 + 313 + 300 + 0 + 0 + + + 284 + 636 + 682 + 2 + 0 + + + 960 + 638 + 721 + 0 + 0 + + + 20 + 583 + 744 + 0 + 0 + + + 525 + 703 + 440 + 0 + 0 + + + 70 + 89 + 362 + 0 + 0 + + + 70 + 186 + 171 + 0 + 0 + + + 0 + 665 + 744 + 7 + 0 + + + 205 + 212 + 150 + 0 + 0 + + + 70 + 100 + 318 + 0 + 0 + + + 70 + 265 + 120 + 0 + 0 + + + 597 + 672 + 501 + 6 + 0 + + + 1 + 562 + 551 + 1 + 1 + + + 0 + 761 + 488 + 3 + 0 + + + 70 + 284 + 331 + 0 + 0 + + + 1010 + 239 + 133 + 2 + 0 + + + 0 + 591 + 524 + 0 + 0 + + + 50 + 655 + 567 + 0 + 0 + + + 70 + 223 + 282 + 0 + 0 + + + 70 + 229 + 544 + 0 + 0 + + + 72 + 556 + 557 + 3 + 0 + + + 72 + 558 + 555 + 3 + 0 + + + 284 + 639 + 720 + 2 + 0 + + + 284 + 648 + 710 + 2 + 0 + + + 72 + 554 + 559 + 3 + 0 + + + 34 + 343 + 717 + 0 + 0 + + + 36 + 136 + 691 + 0 + 0 + + + 1 + 249 + 619 + 0 + 0 + + + 38 + 89 + 357 + 0 + 0 + + + 7 + 454 + 682 + 4 + 0 + + + 34 + 185 + 508 + 0 + 0 + + + 1170 + 512 + 536 + 2 + 0 + + + 1 + 608 + 656 + 3 + 0 + + + 1 + 486 + 506 + 0 + 0 + + + 70 + 472 + 521 + 2 + 0 + + + 284 + 630 + 689 + 2 + 0 + + + 34 + 135 + 696 + 0 + 0 + + + 0 + 584 + 683 + 4 + 0 + + + 306 + 731 + 508 + 1 + 0 + + + 1 + 72 + 441 + 0 + 0 + + + 405 + 529 + 754 + 1 + 0 + + + 70 + 219 + 287 + 0 + 0 + + + 209 + 219 + 429 + 3 + 0 + + + 284 + 649 + 709 + 0 + 0 + + + 205 + 636 + 584 + 2 + 0 + + + 1018 + 226 + 141 + 4 + 0 + + + 70 + 108 + 295 + 0 + 0 + + + 70 + 151 + 417 + 0 + 0 + + + 1 + 291 + 530 + 4 + 0 + + + 70 + 245 + 130 + 0 + 0 + + + 37 + 587 + 843 + 6 + 0 + + + 72 + 203 + 614 + 3 + 0 + + + 1 + 353 + 525 + 0 + 0 + + + 72 + 204 + 611 + 3 + 0 + + + 113 + 477 + 706 + 0 + 0 + + + 0 + 150 + 627 + 0 + 0 + + + 0 + 335 + 643 + 0 + 0 + + + 34 + 737 + 504 + 3 + 0 + + + 34 + 617 + 802 + 4 + 0 + + + 145 + 515 + 533 + 4 + 0 + + + 45 + 533 + 515 + 4 + 0 + + + 79 + 456 + 679 + 1 + 1 + + + 0 + 717 + 518 + 0 + 0 + + + 310 + 734 + 506 + 0 + 0 + + + 38 + 155 + 406 + 0 + 0 + + + 284 + 646 + 672 + 0 + 0 + + + 665 + 292 + 109 + 2 + 0 + + + 1 + 145 + 434 + 2 + 0 + + + 16 + 121 + 520 + 0 + 0 + + + 1 + 186 + 670 + 0 + 0 + + + 45 + 532 + 516 + 6 + 0 + + + 377 + 488 + 690 + 1 + 0 + + + 1 + 146 + 644 + 0 + 0 + + + 306 + 694 + 663 + 4 + 0 + + + 51 + 714 + 693 + 0 + 0 + + + 383 + 606 + 453 + 2 + 0 + + + 34 + 596 + 772 + 3 + 0 + + + 70 + 105 + 303 + 0 + 0 + + + 34 + 59 + 541 + 7 + 0 + + + 0 + 331 + 651 + 0 + 0 + + + 70 + 215 + 292 + 0 + 0 + + + 1 + 305 + 607 + 2 + 0 + + + 1 + 62 + 515 + 1 + 0 + + + 597 + 686 + 491 + 0 + 0 + + + 36 + 136 + 692 + 0 + 0 + + + 34 + 190 + 655 + 1 + 0 + + + 191 + 568 + 545 + 2 + 0 + + + 34 + 173 + 544 + 4 + 0 + + + 34 + 394 + 697 + 0 + 0 + + + 37 + 584 + 847 + 6 + 0 + + + 34 + 616 + 803 + 1 + 0 + + + 284 + 482 + 447 + 2 + 0 + + + 284 + 640 + 678 + 0 + 0 + + + 34 + 525 + 523 + 0 + 0 + + + 1 + 287 + 645 + 0 + 0 + + + 284 + 640 + 719 + 0 + 0 + + + 0 + 301 + 615 + 2 + 0 + + + 72 + 203 + 613 + 3 + 0 + + + 1 + 274 + 563 + 0 + 1 + + + 24 + 601 + 722 + 3 + 1 + + + 38 + 221 + 563 + 6 + 0 + + + 34 + 205 + 459 + 0 + 0 + + + 205 + 608 + 757 + 3 + 0 + + + 445 + 623 + 596 + 0 + 0 + + + 306 + 689 + 668 + 4 + 0 + + + 70 + 154 + 408 + 0 + 0 + + + 284 + 651 + 707 + 0 + 0 + + + 0 + 70 + 457 + 0 + 0 + + + 37 + 643 + 675 + 5 + 0 + + + 70 + 124 + 258 + 0 + 0 + + + 4 + 197 + 319 + 0 + 0 + + + 192 + 757 + 445 + 0 + 0 + + + 1 + 72 + 444 + 0 + 0 + + + 1 + 582 + 532 + 2 + 0 + + + 209 + 74 + 432 + 1 + 0 + + + 284 + 669 + 688 + 0 + 0 + + + 400 + 530 + 753 + 1 + 0 + + + 45 + 602 + 721 + 2 + 0 + + + 205 + 246 + 130 + 0 + 0 + + + 0 + 685 + 452 + 3 + 0 + + + 70 + 157 + 400 + 0 + 0 + + + 284 + 667 + 690 + 0 + 0 + + + 70 + 188 + 170 + 0 + 0 + + + 70 + 164 + 383 + 0 + 0 + + + 284 + 642 + 676 + 0 + 0 + + + 71 + 441 + 702 + 2 + 0 + + + 1 + 69 + 463 + 0 + 0 + + + 205 + 604 + 762 + 5 + 0 + + + 1 + 71 + 450 + 0 + 0 + + + 34 + 596 + 830 + 7 + 0 + + + 1 + 352 + 526 + 0 + 0 + + + 938 + 690 + 629 + 0 + 0 + + + 283 + 664 + 745 + 5 + 0 + + + 70 + 312 + 399 + 0 + 0 + + + 0 + 252 + 494 + 0 + 0 + + + 34 + 193 + 639 + 1 + 0 + + + 718 + 739 + 456 + 0 + 0 + + + 97 + 630 + 785 + 0 + 0 + + + 12 + 526 + 471 + 6 + 0 + + + 278 + 557 + 605 + 6 + 0 + + + 0 + 622 + 500 + 0 + 0 + + + 0 + 756 + 526 + 3 + 0 + + + 7 + 454 + 685 + 0 + 0 + + + 1 + 461 + 470 + 0 + 0 + + + 5 + 443 + 702 + 0 + 0 + + + 4 + 662 + 509 + 6 + 0 + + + 1012 + 224 + 141 + 4 + 0 + + + 395 + 476 + 708 + 1 + 0 + + + 313 + 714 + 472 + 3 + 0 + + + 428 + 715 + 435 + 2 + 0 + + + 285 + 500 + 674 + 1 + 0 + + + 0 + 142 + 438 + 0 + 0 + + + 1 + 598 + 723 + 1 + 0 + + + 70 + 236 + 391 + 0 + 0 + + + 308 + 638 + 720 + 0 + 0 + + + 72 + 199 + 620 + 7 + 0 + + + 164 + 731 + 461 + 2 + 0 + + + 306 + 717 + 470 + 2 + 0 + + + 960 + 625 + 735 + 0 + 0 + + + 4 + 320 + 194 + 0 + 0 + + + 0 + 723 + 466 + 7 + 0 + + + 394 + 482 + 699 + 2 + 0 + + + 38 + 100 + 315 + 0 + 0 + + + 70 + 177 + 178 + 0 + 0 + + + 34 + 505 + 547 + 0 + 0 + + + 70 + 207 + 300 + 0 + 0 + + + 20 + 610 + 610 + 0 + 0 + + + 70 + 104 + 303 + 0 + 0 + + + 597 + 752 + 448 + 2 + 0 + + + 3 + 138 + 668 + 0 + 0 + + + 0 + 617 + 504 + 0 + 0 + + + 70 + 300 + 411 + 0 + 0 + + + 1 + 457 + 474 + 0 + 0 + + + 3 + 119 + 522 + 0 + 0 + + + 36 + 352 + 527 + 0 + 0 + + + 70 + 177 + 351 + 0 + 0 + + + 6 + 223 + 553 + 0 + 0 + + + 34 + 346 + 716 + 0 + 0 + + + 34 + 450 + 691 + 6 + 0 + + + 209 + 73 + 432 + 6 + 0 + + + 284 + 632 + 684 + 2 + 0 + + + 8 + 443 + 489 + 0 + 0 + + + 1018 + 239 + 132 + 2 + 0 + + + 34 + 738 + 539 + 3 + 0 + + + 0 + 674 + 552 + 1 + 0 + + + 530 + 491 + 563 + 2 + 0 + + + 0 + 67 + 473 + 0 + 0 + + + 70 + 89 + 356 + 0 + 0 + + + 7 + 280 + 440 + 0 + 0 + + + 72 + 200 + 616 + 3 + 0 + + + 70 + 296 + 312 + 0 + 0 + + + 70 + 229 + 538 + 0 + 0 + + + 20 + 281 + 2959 + 0 + 0 + + + 0 + 510 + 542 + 2 + 0 + + + 223 + 274 + 566 + 6 + 0 + + + 34 + 632 + 727 + 0 + 0 + + + 1 + 141 + 440 + 0 + 0 + + + 101 + 565 + 704 + 0 + 0 + + + 1 + 611 + 651 + 3 + 0 + + + 283 + 600 + 824 + 0 + 0 + + + 0 + 57 + 556 + 7 + 0 + + + 394 + 483 + 698 + 2 + 0 + + + 1010 + 225 + 141 + 0 + 0 + + + 215 + 122 + 260 + 3 + 0 + + + 37 + 281 + 552 + 2 + 0 + + + 70 + 277 + 224 + 0 + 0 + + + 8 + 600 + 663 + 2 + 0 + + + 1 + 560 + 602 + 0 + 0 + + + 20 + 280 + 554 + 0 + 0 + + + 3 + 599 + 519 + 7 + 0 + + + 1 + 444 + 700 + 1 + 1 + + + 0 + 317 + 489 + 0 + 0 + + + 72 + 556 + 559 + 3 + 0 + + + 70 + 243 + 255 + 0 + 0 + + + 38 + 153 + 405 + 0 + 0 + + + 164 + 495 + 558 + 1 + 1 + + + 0 + 645 + 670 + 0 + 0 + + + 0 + 767 + 485 + 3 + 0 + + + 72 + 558 + 557 + 3 + 0 + + + 597 + 749 + 450 + 2 + 0 + + + 70 + 204 + 155 + 0 + 0 + + + 0 + 206 + 448 + 0 + 0 + + + 0 + 157 + 588 + 0 + 0 + + + 0 + 319 + 486 + 0 + 0 + + + 1 + 310 + 598 + 2 + 0 + + + 284 + 639 + 719 + 0 + 0 + + + 284 + 630 + 686 + 2 + 0 + + + 38 + 332 + 371 + 0 + 0 + + + 284 + 648 + 709 + 0 + 0 + + + 1 + 543 + 509 + 0 + 0 + + + 2 + 278 + 443 + 0 + 1 + + + 70 + 232 + 531 + 0 + 0 + + + 23 + 292 + 531 + 4 + 0 + + + 1 + 69 + 459 + 0 + 0 + + + 72 + 199 + 619 + 3 + 0 + + + 1 + 309 + 600 + 2 + 0 + + + 192 + 651 + 518 + 6 + 0 + + + 284 + 668 + 688 + 0 + 0 + + + 0 + 323 + 479 + 0 + 0 + + + 284 + 641 + 717 + 0 + 0 + + + 0 + 69 + 454 + 0 + 0 + + + 34 + 58 + 540 + 7 + 0 + + + 1 + 72 + 435 + 0 + 0 + + + 192 + 658 + 473 + 0 + 0 + + + 70 + 258 + 477 + 6 + 0 + + + 283 + 687 + 669 + 4 + 0 + + + 22 + 120 + 520 + 0 + 0 + + + 191 + 104 + 600 + 0 + 0 + + + 1009 + 239 + 131 + 2 + 0 + + + 284 + 482 + 450 + 2 + 0 + + + 70 + 293 + 213 + 0 + 0 + + + 1011 + 222 + 141 + 4 + 0 + + + 0 + 68 + 461 + 0 + 0 + + + 307 + 354 + 525 + 0 + 0 + + + 70 + 275 + 114 + 0 + 0 + + + 284 + 670 + 686 + 0 + 0 + + + 191 + 568 + 548 + 2 + 0 + + + 38 + 186 + 662 + 0 + 0 + + + 70 + 211 + 296 + 0 + 0 + + + 70 + 84 + 373 + 0 + 0 + + + 36 + 356 + 522 + 0 + 0 + + + 36 + 348 + 534 + 0 + 0 + + + 284 + 671 + 685 + 2 + 0 + + + 38 + 229 + 404 + 0 + 0 + + + 37 + 730 + 462 + 7 + 0 + + + 1 + 604 + 658 + 2 + 0 + + + 306 + 756 + 492 + 3 + 0 + + + 70 + 233 + 268 + 0 + 0 + + + 20 + 493 + 560 + 0 + 0 + + + 34 + 585 + 845 + 6 + 0 + + + 10 + 517 + 534 + 5 + 0 + + + 264 + 461 + 675 + 2 + 0 + + + 183 + 351 + 705 + 0 + 0 + + + 68 + 114 + 547 + 1 + 0 + + + 183 + 354 + 699 + 0 + 0 + + + 37 + 489 + 506 + 0 + 0 + + + 525 + 690 + 451 + 2 + 0 + + + 399 + 481 + 701 + 2 + 0 + + + 284 + 666 + 690 + 0 + 0 + + + 1 + 657 + 566 + 0 + 1 + + + 284 + 650 + 707 + 0 + 0 + + + 205 + 73 + 428 + 0 + 0 + + + 25 + 453 + 687 + 0 + 0 + + + 1 + 617 + 644 + 3 + 0 + + + 15 + 459 + 678 + 6 + 0 + + + 0 + 633 + 726 + 0 + 0 + + + 164 + 403 + 461 + 0 + 0 + + + 4 + 83 + 377 + 0 + 0 + + + 70 + 475 + 521 + 2 + 0 + + + 1 + 57 + 549 + 0 + 0 + + + 1 + 500 + 552 + 6 + 0 + + + 34 + 126 + 495 + 1 + 0 + + + 284 + 638 + 678 + 0 + 0 + + + 23 + 639 + 582 + 0 + 0 + + + 1 + 144 + 642 + 0 + 0 + + + 70 + 184 + 339 + 0 + 0 + + + 70 + 281 + 222 + 0 + 0 + + + 284 + 626 + 691 + 2 + 0 + + + 70 + 78 + 401 + 0 + 0 + + + 37 + 281 + 551 + 2 + 0 + + + 597 + 672 + 502 + 6 + 0 + + + 1010 + 223 + 141 + 0 + 0 + + + 38 + 295 + 314 + 0 + 0 + + + 4 + 131 + 240 + 0 + 0 + + + 1 + 355 + 523 + 0 + 0 + + + 34 + 169 + 548 + 4 + 0 + + + 27 + 709 + 697 + 2 + 0 + + + 0 + 633 + 628 + 6 + 0 + + + 38 + 313 + 199 + 0 + 0 + + + 113 + 603 + 717 + 1 + 1 + + + 313 + 735 + 459 + 3 + 0 + + + 371 + 604 + 716 + 2 + 0 + + + 205 + 270 + 343 + 0 + 0 + + + 46 + 710 + 696 + 0 + 0 + + + 46 + 130 + 479 + 4 + 0 + + + 209 + 216 + 429 + 2 + 0 + + + 1 + 68 + 463 + 0 + 0 + + + 597 + 672 + 463 + 6 + 0 + + + 70 + 324 + 286 + 0 + 0 + + + 72 + 200 + 615 + 3 + 0 + + + 3 + 237 + 519 + 1 + 0 + + + 0 + 686 + 542 + 1 + 0 + + + 34 + 61 + 516 + 1 + 0 + + + 284 + 636 + 680 + 2 + 0 + + + 407 + 715 + 556 + 0 + 0 + + + 1 + 201 + 461 + 0 + 0 + + + 284 + 643 + 715 + 0 + 0 + + + 0 + 609 + 554 + 6 + 0 + + + 72 + 199 + 618 + 7 + 0 + + + 70 + 276 + 114 + 0 + 0 + + + 205 + 203 + 155 + 0 + 0 + + + 70 + 260 + 121 + 0 + 0 + + + 70 + 286 + 110 + 0 + 0 + + + 34 + 449 + 693 + 6 + 0 + + + 70 + 176 + 354 + 0 + 0 + + + 5 + 139 + 666 + 0 + 0 + + + 70 + 222 + 417 + 0 + 0 + + + 34 + 726 + 512 + 3 + 0 + + + 597 + 720 + 432 + 4 + 0 + + + 3 + 119 + 523 + 0 + 0 + + + 597 + 680 + 496 + 2 + 0 + + + 51 + 604 + 761 + 4 + 0 + + + 284 + 634 + 682 + 0 + 0 + + + 461 + 659 + 472 + 4 + 0 + + + 38 + 202 + 308 + 0 + 0 + + + 70 + 299 + 411 + 0 + 0 + + + 70 + 192 + 324 + 0 + 0 + + + 70 + 162 + 384 + 0 + 0 + + + 70 + 196 + 160 + 0 + 0 + + + 283 + 665 + 743 + 5 + 0 + + + 70 + 123 + 255 + 0 + 0 + + + 0 + 345 + 538 + 0 + 0 + + + 0 + 68 + 462 + 0 + 0 + + + 597 + 687 + 491 + 0 + 0 + + + 70 + 187 + 333 + 0 + 0 + + + 216 + 119 + 264 + 7 + 0 + + + 0 + 510 + 485 + 0 + 0 + + + 34 + 664 + 508 + 0 + 0 + + + 34 + 760 + 523 + 3 + 0 + + + 4 + 104 + 302 + 0 + 0 + + + 164 + 401 + 463 + 0 + 0 + + + 36 + 491 + 687 + 6 + 0 + + + 32 + 465 + 669 + 0 + 0 + + + 46 + 712 + 694 + 0 + 0 + + + 70 + 299 + 105 + 0 + 0 + + + 284 + 624 + 693 + 2 + 0 + + + 4 + 193 + 161 + 0 + 0 + + + 37 + 57 + 545 + 7 + 0 + + + 0 + 678 + 458 + 3 + 0 + + + 1012 + 239 + 130 + 6 + 0 + + + 962 + 631 + 783 + 2 + 0 + + + 26 + 473 + 457 + 2 + 0 + + + 70 + 210 + 148 + 0 + 0 + + + 0 + 521 + 596 + 0 + 0 + + + 1013 + 222 + 140 + 4 + 0 + + + 70 + 282 + 329 + 0 + 0 + + + 673 + 296 + 105 + 4 + 0 + + + 284 + 665 + 690 + 0 + 0 + + + 20 + 610 + 611 + 4 + 0 + + + 1 + 183 + 677 + 0 + 0 + + + 205 + 146 + 213 + 0 + 0 + + + 70 + 236 + 525 + 0 + 0 + + + 60 + 105 + 587 + 0 + 0 + + + 70 + 235 + 527 + 0 + 0 + + + 0 + 630 + 632 + 6 + 0 + + + 4 + 192 + 321 + 0 + 0 + + + 597 + 616 + 802 + 2 + 0 + + + 286 + 500 + 675 + 1 + 0 + + + 306 + 675 + 500 + 1 + 0 + + + 307 + 547 + 452 + 0 + 0 + + + 396 + 487 + 693 + 5 + 0 + + + 0 + 629 + 633 + 6 + 0 + + + 70 + 322 + 288 + 0 + 0 + + + 8 + 442 + 489 + 2 + 0 + + + 284 + 649 + 707 + 0 + 0 + + + 1 + 252 + 617 + 0 + 0 + + + 89 + 328 + 659 + 4 + 0 + + + 70 + 167 + 186 + 0 + 0 + + + 597 + 672 + 462 + 6 + 0 + + + 679 + 496 + 556 + 4 + 0 + + + 0 + 747 + 533 + 3 + 0 + + + 1 + 324 + 667 + 0 + 1 + + + 214 + 114 + 272 + 4 + 0 + + + 4 + 275 + 224 + 0 + 0 + + + 4 + 200 + 308 + 0 + 0 + + + 207 + 308 + 301 + 0 + 0 + + + 70 + 136 + 228 + 0 + 0 + + + 1 + 68 + 456 + 0 + 0 + + + 1 + 146 + 635 + 0 + 0 + + + 205 + 211 + 292 + 0 + 0 + + + 1 + 717 + 689 + 0 + 0 + + + 70 + 110 + 282 + 0 + 0 + + + 70 + 260 + 237 + 0 + 0 + + + 207 + 305 + 304 + 3 + 0 + + + 70 + 305 + 406 + 0 + 0 + + + 70 + 290 + 427 + 0 + 0 + + + 34 + 124 + 497 + 1 + 0 + + + 284 + 630 + 687 + 2 + 0 + + + 37 + 125 + 493 + 0 + 0 + + + 70 + 290 + 107 + 2 + 0 + + + 70 + 332 + 373 + 0 + 0 + + + 43 + 131 + 470 + 4 + 0 + + + 51 + 280 + 2967 + 0 + 0 + + + 37 + 281 + 553 + 2 + 0 + + + 70 + 331 + 280 + 0 + 0 + + + 205 + 139 + 223 + 0 + 0 + + + 284 + 644 + 672 + 0 + 0 + + + 34 + 644 + 482 + 2 + 0 + + + 283 + 644 + 767 + 6 + 0 + + + 72 + 200 + 619 + 7 + 0 + + + 216 + 116 + 269 + 6 + 0 + + + 1 + 612 + 750 + 1 + 1 + + + 1 + 138 + 446 + 0 + 0 + + + 482 + 659 + 471 + 0 + 0 + + + 597 + 752 + 449 + 2 + 0 + + + 7 + 249 + 625 + 4 + 0 + + + 402 + 584 + 741 + 0 + 0 + + + 70 + 319 + 193 + 0 + 0 + + + 1 + 67 + 466 + 0 + 0 + + + 34 + 711 + 524 + 2 + 0 + + + 70 + 247 + 376 + 0 + 0 + + + 0 + 666 + 466 + 0 + 0 + + + 0 + 197 + 628 + 0 + 0 + + + 33 + 124 + 496 + 1 + 0 + + + 284 + 671 + 684 + 2 + 0 + + + 960 + 627 + 732 + 0 + 0 + + + 308 + 685 + 670 + 4 + 0 + + + 1 + 649 + 761 + 7 + 0 + + + 70 + 219 + 565 + 6 + 0 + + + 25 + 129 + 477 + 0 + 0 + + + 597 + 742 + 455 + 4 + 0 + + + 1 + 579 + 536 + 2 + 0 + + + 34 + 765 + 487 + 3 + 0 + + + 12 + 517 + 478 + 6 + 0 + + + 70 + 270 + 344 + 0 + 0 + + + 70 + 175 + 178 + 0 + 0 + + + 6 + 414 + 449 + 2 + 0 + + + 0 + 142 + 433 + 0 + 0 + + + 0 + 726 + 465 + 1 + 0 + + + 58 + 467 + 463 + 6 + 0 + + + 284 + 669 + 686 + 0 + 0 + + + 284 + 628 + 689 + 0 + 0 + + + 405 + 531 + 750 + 0 + 0 + + + 70 + 150 + 410 + 0 + 0 + + + 38 + 164 + 375 + 0 + 0 + + + 0 + 743 + 536 + 3 + 0 + + + 0 + 188 + 658 + 0 + 0 + + + 70 + 147 + 212 + 0 + 0 + + + 676 + 490 + 563 + 2 + 0 + + + 1 + 596 + 770 + 3 + 0 + + + 0 + 750 + 531 + 3 + 0 + + + 164 + 495 + 557 + 1 + 1 + + + 6 + 346 + 625 + 0 + 0 + + + 267 + 451 + 688 + 6 + 0 + + + 70 + 328 + 377 + 0 + 0 + + + 309 + 519 + 476 + 3 + 0 + + + 0 + 69 + 451 + 0 + 0 + + + 0 + 751 + 496 + 3 + 0 + + + 205 + 147 + 418 + 0 + 0 + + + 70 + 266 + 231 + 0 + 0 + + + 205 + 102 + 305 + 0 + 0 + + + 0 + 681 + 547 + 1 + 0 + + + 38 + 151 + 206 + 0 + 0 + + + 284 + 667 + 688 + 0 + 0 + + + 4 + 240 + 256 + 0 + 0 + + + 142 + 276 + 448 + 6 + 0 + + + 143 + 270 + 2947 + 0 + 0 + + + 33 + 90 + 683 + 0 + 0 + + + 4 + 172 + 181 + 0 + 0 + + + 283 + 469 + 461 + 2 + 0 + + + 205 + 463 + 467 + 0 + 0 + + + 36 + 742 + 502 + 7 + 0 + + + 284 + 640 + 676 + 0 + 0 + + + 1 + 508 + 543 + 4 + 0 + + + 1 + 347 + 712 + 0 + 1 + + + 284 + 640 + 717 + 0 + 0 + + + 70 + 117 + 266 + 0 + 0 + + + 34 + 204 + 455 + 0 + 0 + + + 1009 + 239 + 129 + 2 + 0 + + + 284 + 643 + 714 + 2 + 0 + + + 192 + 657 + 473 + 0 + 0 + + + 7 + 455 + 683 + 2 + 0 + + + 0 + 654 + 702 + 0 + 0 + + + 407 + 661 + 602 + 0 + 0 + + + 70 + 178 + 348 + 0 + 0 + + + 15 + 116 + 534 + 0 + 0 + + + 306 + 616 + 646 + 4 + 0 + + + 3 + 450 + 3369 + 0 + 0 + + + 70 + 119 + 259 + 0 + 0 + + + 274 + 484 + 385 + 6 + 0 + + + 1 + 67 + 460 + 0 + 0 + + + 284 + 482 + 449 + 2 + 0 + + + 38 + 187 + 661 + 0 + 0 + + + 1 + 189 + 654 + 0 + 0 + + + 37 + 494 + 500 + 0 + 0 + + + 72 + 200 + 618 + 3 + 0 + + + 37 + 55 + 560 + 7 + 0 + + + 70 + 301 + 309 + 0 + 0 + + + 70 + 204 + 151 + 0 + 0 + + + 0 + 68 + 453 + 0 + 0 + + + 4 + 205 + 302 + 0 + 0 + + + 70 + 145 + 427 + 0 + 0 + + + 143 + 403 + 3505 + 2 + 0 + + + 36 + 344 + 718 + 0 + 0 + + + 280 + 515 + 535 + 2 + 0 + + + 3 + 601 + 517 + 7 + 0 + + + 45 + 534 + 516 + 2 + 0 + + + 284 + 636 + 681 + 2 + 0 + + + 0 + 100 + 619 + 0 + 0 + + + 284 + 624 + 694 + 2 + 0 + + + 1 + 289 + 537 + 4 + 0 + + + 1 + 191 + 647 + 0 + 0 + + + 70 + 135 + 228 + 0 + 0 + + + 70 + 236 + 394 + 0 + 0 + + + 284 + 635 + 682 + 0 + 0 + + + 215 + 703 + 653 + 3 + 0 + + + 70 + 157 + 394 + 0 + 0 + + + 707 + 293 + 105 + 0 + 0 + + + 1 + 203 + 458 + 0 + 0 + + + 217 + 704 + 652 + 4 + 0 + + + 214 + 116 + 265 + 3 + 0 + + + 0 + 652 + 704 + 0 + 0 + + + 70 + 122 + 252 + 0 + 0 + + + 0 + 290 + 535 + 6 + 0 + + + 0 + 316 + 491 + 0 + 0 + + + 284 + 642 + 715 + 0 + 0 + + + 1013 + 221 + 139 + 4 + 0 + + + 70 + 209 + 147 + 0 + 0 + + + 0 + 183 + 675 + 0 + 0 + + + 4 + 80 + 384 + 0 + 0 + + + 70 + 78 + 394 + 0 + 0 + + + 25 + 522 + 473 + 6 + 0 + + + 395 + 586 + 739 + 0 + 0 + + + 284 + 645 + 712 + 2 + 0 + + + 4 + 196 + 158 + 0 + 0 + + + 70 + 281 + 220 + 0 + 0 + + + 29 + 553 + 611 + 6 + 0 + + + 306 + 691 + 489 + 0 + 0 + + + 0 + 101 + 612 + 0 + 0 + + + 36 + 494 + 684 + 1 + 0 + + + 205 + 134 + 231 + 0 + 0 + + + 34 + 190 + 650 + 2 + 0 + + + 283 + 621 + 795 + 0 + 0 + + + 1016 + 221 + 140 + 4 + 0 + + + 191 + 570 + 545 + 2 + 0 + + + 1 + 57 + 543 + 0 + 0 + + + 70 + 270 + 345 + 0 + 0 + + + 70 + 230 + 405 + 0 + 0 + + + 70 + 97 + 319 + 0 + 0 + + + 284 + 656 + 700 + 0 + 0 + + + 0 + 565 + 598 + 0 + 0 + + + 70 + 94 + 329 + 0 + 0 + + + 70 + 175 + 353 + 0 + 0 + + + 608 + 701 + 482 + 0 + 0 + + + 88 + 697 + 571 + 5 + 0 + + + 597 + 746 + 499 + 2 + 0 + + + 70 + 329 + 283 + 0 + 0 + + + 70 + 247 + 250 + 0 + 0 + + + 34 + 125 + 494 + 1 + 0 + + + 34 + 643 + 483 + 5 + 0 + + + 992 + 629 + 730 + 0 + 0 + + + 70 + 324 + 381 + 0 + 0 + + + 6 + 605 + 759 + 2 + 0 + + + 34 + 126 + 490 + 1 + 0 + + + 0 + 669 + 505 + 6 + 0 + + + 59 + 203 + 608 + 2 + 0 + + + 0 + 709 + 525 + 0 + 0 + + + 34 + 519 + 531 + 0 + 0 + + + 281 + 563 + 600 + 0 + 0 + + + 597 + 701 + 531 + 4 + 0 + + + 597 + 749 + 451 + 2 + 0 + + + 70 + 266 + 232 + 0 + 0 + + + 3 + 454 + 684 + 0 + 0 + + + 1016 + 232 + 133 + 6 + 0 + + + 72 + 200 + 617 + 3 + 0 + + + 597 + 688 + 491 + 0 + 0 + + + 284 + 632 + 685 + 2 + 0 + + + 34 + 165 + 564 + 6 + 0 + + + 38 + 215 + 287 + 0 + 0 + + + 283 + 594 + 773 + 0 + 0 + + + 284 + 655 + 701 + 2 + 0 + + + 0 + 185 + 667 + 0 + 0 + + + 618 + 402 + 463 + 0 + 0 + + + 875 + 416 + 165 + 2 + 0 + + + 14 + 223 + 3516 + 0 + 0 + + + 20 + 223 + 3514 + 0 + 0 + + + 20 + 221 + 3517 + 0 + 0 + + + 51 + 220 + 3519 + 6 + 0 + + + 25 + 218 + 3519 + 0 + 0 + + + 25 + 216 + 3519 + 0 + 0 + + + 20 + 223 + 3520 + 0 + 0 + + + 20 + 221 + 3520 + 0 + 0 + + + 51 + 220 + 3521 + 6 + 0 + + + 5 + 218 + 3526 + 0 + 0 + + + 25 + 218 + 3524 + 0 + 0 + + + 25 + 218 + 3522 + 0 + 0 + + + 3 + 218 + 3520 + 0 + 0 + + + 27 + 217 + 3525 + 0 + 0 + + + 23 + 216 + 3522 + 0 + 0 + + + 20 + 226 + 3514 + 0 + 0 + + + 20 + 226 + 3520 + 0 + 0 + + + 21 + 215 + 675 + 0 + 0 + + + 45 + 214 + 679 + 4 + 0 + + + 45 + 214 + 676 + 6 + 0 + + + 45 + 214 + 675 + 6 + 0 + + + 45 + 214 + 674 + 6 + 0 + + + 45 + 214 + 673 + 6 + 0 + + + 45 + 214 + 672 + 6 + 0 + + + 45 + 213 + 679 + 4 + 0 + + + 45 + 212 + 678 + 2 + 0 + + + 45 + 212 + 677 + 2 + 0 + + + 45 + 212 + 673 + 2 + 0 + + + 45 + 212 + 672 + 2 + 0 + + + 21 + 211 + 674 + 4 + 0 + + + 0 + 215 + 686 + 0 + 0 + + + 7 + 211 + 693 + 0 + 0 + + + 47 + 210 + 694 + 0 + 0 + + + 21 + 219 + 677 + 0 + 0 + + + 45 + 218 + 679 + 6 + 0 + + + 45 + 218 + 677 + 6 + 0 + + + 45 + 217 + 677 + 0 + 0 + + + 4 + 219 + 685 + 0 + 0 + + + 21 + 219 + 681 + 0 + 0 + + + 45 + 218 + 682 + 6 + 0 + + + 45 + 218 + 680 + 6 + 0 + + + 45 + 216 + 682 + 2 + 0 + + + 45 + 216 + 680 + 2 + 0 + + + 0 + 221 + 690 + 6 + 0 + + + 6 + 218 + 694 + 4 + 0 + + + 3 + 217 + 695 + 0 + 0 + + + 47 + 216 + 694 + 4 + 0 + + + 3 + 213 + 1635 + 0 + 0 + + + 3 + 213 + 1634 + 0 + 0 + + + 3 + 213 + 1633 + 0 + 0 + + + 7 + 212 + 1634 + 2 + 0 + + + 3 + 210 + 1639 + 0 + 0 + + + 14 + 210 + 1636 + 0 + 0 + + + 20 + 215 + 1642 + 0 + 0 + + + 20 + 215 + 1640 + 0 + 0 + + + 20 + 213 + 1642 + 0 + 0 + + + 20 + 213 + 1640 + 0 + 0 + + + 15 + 218 + 1638 + 0 + 0 + + + 6 + 218 + 1636 + 0 + 0 + + + 25 + 216 + 1639 + 0 + 0 + + + 5 + 216 + 1636 + 0 + 0 + + + 17 + 218 + 1640 + 0 + 0 + + + 25 + 216 + 1642 + 0 + 0 + + + 25 + 213 + 2583 + 0 + 0 + + + 25 + 211 + 2583 + 0 + 0 + + + 51 + 215 + 2585 + 4 + 0 + + + 47 + 218 + 2582 + 4 + 0 + + + 6 + 216 + 2580 + 0 + 0 + + + 21 + 215 + 671 + 0 + 0 + + + 45 + 214 + 671 + 6 + 0 + + + 45 + 214 + 670 + 6 + 0 + + + 45 + 214 + 669 + 6 + 0 + + + 45 + 214 + 668 + 6 + 0 + + + 45 + 214 + 667 + 6 + 0 + + + 45 + 212 + 671 + 2 + 0 + + + 45 + 212 + 670 + 2 + 0 + + + 45 + 212 + 669 + 2 + 0 + + + 45 + 212 + 668 + 2 + 0 + + + 45 + 212 + 667 + 2 + 0 + + + 21 + 211 + 670 + 4 + 0 + + + 193 + 221 + 664 + 4 + 0 + + + 191 + 566 + 554 + 2 + 0 + + + 59 + 564 + 552 + 4 + 0 + + + 72 + 560 + 559 + 3 + 0 + + + 72 + 560 + 557 + 3 + 0 + + + 72 + 560 + 555 + 3 + 0 + + + 51 + 560 + 554 + 4 + 0 + + + 72 + 560 + 567 + 3 + 0 + + + 72 + 560 + 565 + 3 + 0 + + + 72 + 560 + 563 + 3 + 0 + + + 72 + 560 + 561 + 3 + 0 + + + 20 + 566 + 568 + 0 + 0 + + + 20 + 562 + 568 + 0 + 0 + + + 46 + 567 + 581 + 0 + 0 + + + 285 + 567 + 580 + 0 + 0 + + + 37 + 566 + 581 + 0 + 0 + + + 46 + 564 + 581 + 0 + 0 + + + 308 + 563 + 578 + 0 + 0 + + + 46 + 562 + 581 + 0 + 0 + + + 283 + 561 + 581 + 6 + 0 + + + 284 + 561 + 580 + 6 + 0 + + + 284 + 561 + 579 + 6 + 0 + + + 284 + 561 + 578 + 6 + 0 + + + 284 + 561 + 577 + 6 + 0 + + + 285 + 560 + 581 + 6 + 0 + + + 285 + 560 + 578 + 6 + 0 + + + 37 + 560 + 577 + 0 + 0 + + + 331 + 563 + 587 + 0 + 0 + + + 25 + 562 + 591 + 0 + 0 + + + 25 + 562 + 586 + 0 + 0 + + + 6 + 560 + 591 + 0 + 0 + + + 328 + 560 + 588 + 0 + 0 + + + 191 + 572 + 554 + 2 + 0 + + + 191 + 570 + 554 + 2 + 0 + + + 191 + 568 + 554 + 2 + 0 + + + 286 + 569 + 582 + 0 + 0 + + + 306 + 569 + 578 + 0 + 0 + + + 37 + 568 + 582 + 0 + 0 + + + 26 + 571 + 589 + 6 + 0 + + + 37 + 571 + 588 + 0 + 0 + + + 286 + 571 + 587 + 0 + 0 + + + 285 + 571 + 586 + 0 + 0 + + + 23 + 570 + 591 + 0 + 0 + + + 285 + 569 + 588 + 0 + 0 + + + 26 + 568 + 589 + 6 + 0 + + + 37 + 568 + 587 + 0 + 0 + + + 286 + 568 + 586 + 0 + 0 + + + 285 + 568 + 584 + 0 + 0 + + + 4 + 583 + 559 + 6 + 0 + + + 4 + 583 + 556 + 0 + 0 + + + 4 + 582 + 558 + 6 + 0 + + + 4 + 581 + 559 + 6 + 0 + + + 4 + 580 + 554 + 0 + 0 + + + 1 + 580 + 552 + 0 + 0 + + + 4 + 579 + 556 + 0 + 0 + + + 4 + 578 + 557 + 0 + 0 + + + 1 + 577 + 554 + 0 + 0 + + + 8 + 583 + 566 + 0 + 0 + + + 8 + 582 + 566 + 7 + 0 + + + 7 + 582 + 564 + 0 + 0 + + + 3 + 582 + 563 + 4 + 0 + + + 7 + 582 + 562 + 4 + 0 + + + 34 + 581 + 561 + 6 + 0 + + + 4 + 580 + 566 + 6 + 0 + + + 4 + 580 + 563 + 6 + 0 + + + 4 + 579 + 561 + 6 + 0 + + + 4 + 577 + 560 + 0 + 0 + + + 139 + 583 + 571 + 2 + 0 + + + 20 + 582 + 572 + 0 + 0 + + + 20 + 579 + 572 + 6 + 0 + + + 48 + 581 + 581 + 0 + 0 + + + 11 + 581 + 578 + 0 + 0 + + + 23 + 583 + 589 + 2 + 0 + + + 3 + 583 + 587 + 2 + 0 + + + 3 + 583 + 584 + 2 + 0 + + + 23 + 581 + 589 + 2 + 0 + + + 500 + 581 + 587 + 2 + 0 + + + 47 + 581 + 584 + 6 + 0 + + + 7 + 579 + 587 + 2 + 0 + + + 48 + 579 + 584 + 6 + 0 + + + 3 + 578 + 587 + 6 + 0 + + + 19 + 577 + 591 + 2 + 0 + + + 281 + 576 + 586 + 2 + 0 + + + 281 + 576 + 584 + 2 + 0 + + + 4 + 589 + 553 + 0 + 0 + + + 1 + 587 + 554 + 0 + 0 + + + 4 + 585 + 559 + 6 + 0 + + + 406 + 585 + 556 + 1 + 0 + + + 34 + 584 + 557 + 6 + 0 + + + 34 + 590 + 561 + 6 + 0 + + + 4 + 584 + 567 + 6 + 0 + + + 15 + 584 + 561 + 4 + 0 + + + 34 + 590 + 572 + 6 + 0 + + + 20 + 589 + 568 + 0 + 0 + + + 20 + 586 + 568 + 6 + 0 + + + 5 + 585 + 578 + 0 + 0 + + + 118 + 591 + 590 + 4 + 0 + + + 23 + 585 + 589 + 2 + 0 + + + 71 + 584 + 587 + 2 + 0 + + + 7 + 584 + 584 + 2 + 0 + + + 1 + 563 + 582 + 0 + 1 + + + 2 + 565 + 586 + 0 + 1 + + + 2 + 561 + 586 + 0 + 1 + + + 94 + 581 + 580 + 1 + 1 + + + 1 + 581 + 586 + 1 + 1 + + + 1 + 578 + 585 + 1 + 1 + + + 1 + 586 + 563 + 1 + 1 + + + 94 + 586 + 581 + 1 + 1 + + + 1 + 589 + 591 + 1 + 1 + + + 1 + 586 + 586 + 1 + 1 + + + 1 + 573 + 599 + 0 + 0 + + + 1 + 572 + 595 + 0 + 0 + + + 23 + 583 + 594 + 2 + 0 + + + 23 + 581 + 594 + 2 + 0 + + + 63 + 587 + 592 + 0 + 0 + + + 23 + 585 + 594 + 2 + 0 + + + 1 + 590 + 595 + 0 + 1 + + + 344 + 569 + 607 + 0 + 0 + + + 79 + 569 + 605 + 0 + 0 + + + 1 + 582 + 603 + 0 + 1 + + + 70 + 571 + 615 + 2 + 0 + + + 20 + 589 + 611 + 2 + 0 + + + 20 + 587 + 612 + 0 + 0 + + + 70 + 571 + 618 + 2 + 0 + + + 35 + 580 + 623 + 2 + 0 + + + 35 + 577 + 619 + 2 + 0 + + + 34 + 591 + 617 + 2 + 0 + + + 25 + 559 + 591 + 0 + 0 + + + 25 + 559 + 586 + 0 + 0 + + + 285 + 558 + 591 + 4 + 0 + + + 64 + 558 + 587 + 4 + 0 + + + 285 + 557 + 591 + 4 + 0 + + + 285 + 556 + 591 + 4 + 0 + + + 58 + 556 + 586 + 2 + 0 + + + 285 + 555 + 591 + 4 + 0 + + + 1 + 571 + 630 + 0 + 0 + + + 0 + 571 + 625 + 0 + 0 + + + 286 + 568 + 630 + 0 + 0 + + + 6 + 583 + 629 + 0 + 0 + + + 283 + 582 + 630 + 0 + 0 + + + 284 + 582 + 629 + 2 + 0 + + + 283 + 582 + 628 + 2 + 0 + + + 283 + 582 + 625 + 4 + 0 + + + 284 + 582 + 624 + 2 + 0 + + + 20 + 581 + 631 + 4 + 0 + + + 284 + 581 + 630 + 0 + 0 + + + 6 + 581 + 629 + 0 + 0 + + + 6 + 581 + 624 + 0 + 0 + + + 23 + 580 + 631 + 6 + 0 + + + 283 + 580 + 630 + 0 + 0 + + + 284 + 580 + 629 + 2 + 0 + + + 283 + 580 + 628 + 2 + 0 + + + 283 + 580 + 625 + 2 + 0 + + + 284 + 580 + 624 + 2 + 0 + + + 284 + 579 + 630 + 0 + 0 + + + 6 + 579 + 629 + 0 + 0 + + + 284 + 579 + 625 + 4 + 0 + + + 6 + 579 + 624 + 0 + 0 + + + 283 + 578 + 630 + 0 + 0 + + + 6 + 578 + 626 + 0 + 0 + + + 284 + 578 + 625 + 4 + 0 + + + 283 + 577 + 627 + 4 + 0 + + + 284 + 577 + 626 + 2 + 0 + + + 283 + 577 + 625 + 2 + 0 + + + 0 + 591 + 628 + 4 + 0 + + + 0 + 591 + 626 + 0 + 0 + + + 0 + 590 + 624 + 0 + 0 + + + 0 + 589 + 626 + 0 + 0 + + + 0 + 589 + 625 + 0 + 0 + + + 1 + 588 + 629 + 4 + 0 + + + 1 + 586 + 626 + 0 + 0 + + + 0 + 585 + 628 + 0 + 0 + + + 284 + 584 + 629 + 2 + 0 + + + 283 + 584 + 628 + 2 + 0 + + + 0 + 584 + 625 + 0 + 0 + + + 1 + 584 + 624 + 0 + 0 + + + 286 + 571 + 637 + 0 + 0 + + + 22 + 583 + 639 + 0 + 0 + + + 366 + 583 + 637 + 6 + 0 + + + 7 + 583 + 634 + 6 + 0 + + + 363 + 582 + 638 + 4 + 0 + + + 365 + 581 + 639 + 2 + 0 + + + 364 + 581 + 637 + 6 + 0 + + + 362 + 580 + 638 + 0 + 0 + + + 71 + 580 + 633 + 0 + 0 + + + 51 + 579 + 636 + 0 + 0 + + + 6 + 578 + 637 + 2 + 0 + + + 5 + 578 + 636 + 2 + 0 + + + 0 + 577 + 633 + 0 + 0 + + + 0 + 590 + 636 + 4 + 0 + + + 0 + 590 + 633 + 4 + 0 + + + 3 + 584 + 634 + 4 + 0 + + + 7 + 584 + 633 + 4 + 0 + + + 1 + 581 + 636 + 0 + 1 + + + 1 + 581 + 635 + 0 + 1 + + + 1 + 585 + 632 + 1 + 1 + + + 7 + 153 + 503 + 2 + 0 + + + 7 + 153 + 502 + 2 + 0 + + + 7 + 153 + 501 + 2 + 0 + + + 7 + 153 + 504 + 2 + 0 + + + 15 + 249 + 1406 + 6 + 0 + + + 15 + 249 + 1402 + 6 + 0 + + + 6 + 251 + 1412 + 0 + 0 + + + 45 + 250 + 1412 + 6 + 0 + + + 45 + 250 + 1411 + 6 + 0 + + + 25 + 262 + 1406 + 6 + 0 + + + 25 + 262 + 1412 + 6 + 0 + + + 25 + 265 + 1406 + 6 + 0 + + + 25 + 265 + 1412 + 6 + 0 + + + 200 + 264 + 1409 + 6 + 0 + + + 1 + 253 + 1403 + 1 + 1 + + + 1 + 251 + 1405 + 0 + 1 + + + 1 + 251 + 1408 + 0 + 1 + + + 1 + 260 + 1406 + 0 + 1 + + + 1 + 259 + 1403 + 1 + 1 + + + 45 + 277 + 1390 + 2 + 0 + + + 45 + 277 + 1389 + 2 + 0 + + + 45 + 277 + 1388 + 2 + 0 + + + 45 + 277 + 1387 + 2 + 0 + + + 45 + 276 + 1390 + 4 + 0 + + + 45 + 276 + 1387 + 0 + 0 + + + 45 + 275 + 1390 + 4 + 0 + + + 45 + 275 + 1387 + 0 + 0 + + + 45 + 274 + 1390 + 4 + 0 + + + 45 + 274 + 1387 + 0 + 0 + + + 45 + 273 + 1390 + 4 + 0 + + + 44 + 273 + 1388 + 6 + 0 + + + 45 + 273 + 1387 + 0 + 0 + + + 6 + 273 + 1384 + 2 + 0 + + + 45 + 272 + 1390 + 6 + 0 + + + 45 + 272 + 1387 + 6 + 0 + + + 30 + 279 + 1386 + 0 + 1 + + + 5 + 281 + 1388 + 0 + 0 + + + 11 + 110 + 534 + 0 + 0 + + + 6 + 106 + 534 + 0 + 0 + + + 3 + 115 + 530 + 0 + 0 + + + 7 + 115 + 529 + 4 + 0 + + + 3 + 114 + 534 + 0 + 0 + + + 5 + 113 + 533 + 0 + 0 + + + 15 + 112 + 534 + 0 + 0 + + + 7 + 124 + 534 + 0 + 0 + + + 11 + 121 + 533 + 0 + 0 + + + 1 + 110 + 533 + 1 + 1 + + + 1 + 108 + 530 + 0 + 1 + + + 1 + 106 + 532 + 0 + 1 + + + 1 + 115 + 532 + 0 + 1 + + + 1 + 113 + 531 + 0 + 1 + + + 1 + 127 + 532 + 1 + 1 + + + 1 + 124 + 532 + 1 + 1 + + + 1 + 121 + 532 + 1 + 1 + + + 15 + 63 + 685 + 6 + 0 + + + 35 + 59 + 687 + 0 + 0 + + + 89 + 59 + 682 + 0 + 0 + + + 55 + 56 + 685 + 0 + 0 + + + 29 + 56 + 682 + 2 + 0 + + + 29 + 56 + 680 + 2 + 0 + + + 15 + 63 + 691 + 6 + 0 + + + 15 + 63 + 688 + 6 + 0 + + + 35 + 58 + 688 + 0 + 0 + + + 55 + 57 + 688 + 0 + 0 + + + 34 + 57 + 696 + 0 + 0 + + + 34 + 56 + 716 + 2 + 0 + + + 34 + 56 + 714 + 2 + 0 + + + 46 + 68 + 685 + 0 + 0 + + + 35 + 64 + 683 + 0 + 0 + + + 46 + 70 + 693 + 4 + 0 + + + 46 + 68 + 693 + 4 + 0 + + + 46 + 68 + 691 + 0 + 0 + + + 46 + 68 + 689 + 2 + 0 + + + 63 + 67 + 688 + 0 + 0 + + + 32 + 77 + 681 + 2 + 0 + + + 46 + 76 + 685 + 0 + 0 + + + 32 + 75 + 681 + 2 + 0 + + + 3 + 79 + 693 + 0 + 0 + + + 3 + 78 + 693 + 0 + 0 + + + 63 + 77 + 688 + 4 + 0 + + + 46 + 76 + 693 + 4 + 0 + + + 46 + 76 + 691 + 0 + 0 + + + 46 + 76 + 689 + 2 + 0 + + + 46 + 74 + 693 + 4 + 0 + + + 46 + 72 + 693 + 2 + 0 + + + 9 + 77 + 698 + 0 + 0 + + + 33 + 75 + 708 + 0 + 0 + + + 11 + 87 + 685 + 2 + 0 + + + 34 + 84 + 684 + 0 + 0 + + + 15 + 80 + 685 + 2 + 0 + + + 63 + 86 + 695 + 4 + 0 + + + 15 + 80 + 691 + 2 + 0 + + + 15 + 80 + 688 + 2 + 0 + + + 35 + 86 + 709 + 0 + 0 + + + 33 + 82 + 706 + 0 + 0 + + + 35 + 80 + 717 + 0 + 0 + + + 33 + 90 + 709 + 0 + 0 + + + 193 + 89 + 718 + 0 + 0 + + + 1 + 85 + 683 + 1 + 1 + + + 48 + 60 + 673 + 0 + 0 + + + 3 + 66 + 677 + 3 + 0 + + + 33 + 65 + 673 + 2 + 0 + + + 29 + 76 + 676 + 2 + 0 + + + 29 + 76 + 674 + 2 + 0 + + + 118 + 85 + 679 + 4 + 0 + + + 1 + 74 + 676 + 1 + 1 + + + 32 + 57 + 668 + 0 + 0 + + + 33 + 57 + 664 + 0 + 0 + + + 34 + 56 + 666 + 0 + 0 + + + 22 + 67 + 666 + 4 + 0 + + + 33 + 67 + 664 + 4 + 0 + + + 22 + 66 + 666 + 4 + 0 + + + 3 + 64 + 667 + 4 + 0 + + + 33 + 75 + 665 + 4 + 0 + + + 34 + 74 + 664 + 0 + 0 + + + 11 + 73 + 669 + 0 + 0 + + + 30 + 81 + 664 + 4 + 0 + + + 34 + 60 + 661 + 0 + 0 + + + 34 + 69 + 663 + 0 + 0 + + + 35 + 68 + 656 + 0 + 0 + + + 164 + 89 + 662 + 5 + 0 + + + 33 + 78 + 654 + 0 + 0 + + + 34 + 87 + 649 + 0 + 0 + + + 55 + 52 + 677 + 2 + 0 + + + 55 + 51 + 677 + 2 + 0 + + + 29 + 50 + 674 + 2 + 0 + + + 0 + 128 + 531 + 0 + 0 + + + 3 + 138 + 532 + 1 + 0 + + + 5 + 136 + 530 + 0 + 0 + + + 1 + 141 + 533 + 1 + 1 + + + 51 + 90 + 3292 + 4 + 0 + + + 51 + 88 + 3288 + 2 + 0 + + + 51 + 93 + 3300 + 0 + 0 + + + 51 + 103 + 3288 + 0 + 0 + + + 51 + 100 + 3288 + 0 + 0 + + + 51 + 109 + 3291 + 6 + 0 + + + 51 + 107 + 3288 + 0 + 0 + + + 51 + 105 + 3291 + 2 + 0 + + + 51 + 110 + 3299 + 0 + 0 + + + 58 + 107 + 3297 + 6 + 0 + + + 5 + 111 + 3306 + 0 + 0 + + + 80 + 116 + 3295 + 6 + 0 + + + 51 + 116 + 3293 + 2 + 0 + + + 51 + 117 + 3298 + 4 + 0 + + + 80 + 116 + 3303 + 4 + 0 + + + 80 + 114 + 3303 + 4 + 0 + + + 51 + 116 + 3308 + 4 + 0 + + + 51 + 113 + 3308 + 4 + 0 + + + 51 + 127 + 3292 + 4 + 0 + + + 51 + 127 + 3290 + 0 + 0 + + + 51 + 122 + 3294 + 6 + 0 + + + 20 + 121 + 3288 + 0 + 0 + + + 80 + 122 + 3298 + 2 + 0 + + + 117 + 134 + 3293 + 2 + 0 + + + 51 + 106 + 3285 + 6 + 0 + + + 51 + 106 + 3282 + 6 + 0 + + + 5 + 119 + 3282 + 0 + 0 + + + 51 + 117 + 3285 + 2 + 0 + + + 20 + 124 + 3286 + 4 + 0 + + + 51 + 123 + 3284 + 0 + 0 + + + 20 + 122 + 3286 + 0 + 0 + + + 20 + 120 + 3286 + 0 + 0 + + + 51 + 132 + 3285 + 0 + 0 + + + 58 + 128 + 3285 + 4 + 0 + + + 51 + 141 + 3286 + 6 + 0 + + + 51 + 138 + 3283 + 0 + 0 + + + 57 + 138 + 3294 + 4 + 0 + + + 51 + 138 + 3288 + 4 + 0 + + + 116 + 137 + 3290 + 2 + 0 + + + 51 + 101 + 3284 + 4 + 0 + + + 51 + 90 + 3283 + 2 + 0 + + + 51 + 94 + 3278 + 4 + 0 + + + 51 + 90 + 3279 + 2 + 0 + + + 51 + 103 + 3274 + 0 + 0 + + + 51 + 98 + 3275 + 0 + 0 + + + 58 + 108 + 3275 + 4 + 0 + + + 51 + 115 + 3272 + 0 + 0 + + + 51 + 112 + 3279 + 4 + 0 + + + 51 + 112 + 3272 + 0 + 0 + + + 51 + 147 + 3292 + 0 + 0 + + + 51 + 155 + 3291 + 0 + 0 + + + 51 + 153 + 3301 + 4 + 0 + + + 1 + 264 + 539 + 0 + 1 + + + 43 + 251 + 3369 + 6 + 0 + + + 104 + 263 + 3367 + 0 + 0 + + + 104 + 263 + 3366 + 0 + 0 + + + 111 + 265 + 3357 + 0 + 0 + + + 110 + 264 + 3358 + 2 + 0 + + + 101 + 270 + 3366 + 0 + 0 + + + 101 + 269 + 3366 + 0 + 0 + + + 100 + 269 + 3364 + 0 + 0 + + + 104 + 264 + 3366 + 0 + 0 + + + 107 + 271 + 3371 + 0 + 0 + + + 102 + 271 + 3368 + 0 + 0 + + + 103 + 270 + 3375 + 0 + 0 + + + 111 + 270 + 3380 + 0 + 0 + + + 51 + 267 + 3383 + 2 + 0 + + + 51 + 266 + 3380 + 4 + 0 + + + 110 + 266 + 3376 + 0 + 0 + + + 110 + 265 + 3376 + 0 + 0 + + + 113 + 264 + 3380 + 0 + 0 + + + 51 + 271 + 3387 + 6 + 0 + + + 111 + 270 + 3390 + 0 + 0 + + + 110 + 269 + 3391 + 0 + 0 + + + 110 + 269 + 3390 + 0 + 0 + + + 110 + 267 + 3389 + 0 + 0 + + + 111 + 266 + 3387 + 0 + 0 + + + 110 + 265 + 3391 + 0 + 0 + + + 110 + 265 + 3387 + 0 + 0 + + + 55 + 268 + 3381 + 0 + 1 + + + 6 + 257 + 1481 + 0 + 0 + + + 51 + 263 + 3395 + 2 + 0 + + + 51 + 263 + 3392 + 2 + 0 + + + 110 + 271 + 3397 + 0 + 0 + + + 107 + 268 + 3399 + 0 + 0 + + + 110 + 268 + 3396 + 0 + 0 + + + 107 + 267 + 3399 + 0 + 0 + + + 110 + 267 + 3396 + 0 + 0 + + + 110 + 266 + 3394 + 0 + 0 + + + 107 + 265 + 3397 + 0 + 0 + + + 110 + 265 + 3394 + 0 + 0 + + + 51 + 270 + 3400 + 4 + 0 + + + 110 + 274 + 3377 + 0 + 0 + + + 111 + 272 + 3380 + 0 + 0 + + + 111 + 272 + 3379 + 0 + 0 + + + 111 + 272 + 3391 + 0 + 0 + + + 51 + 277 + 3398 + 6 + 0 + + + 51 + 277 + 3394 + 6 + 0 + + + 111 + 275 + 3396 + 0 + 0 + + + 110 + 275 + 3395 + 0 + 0 + + + 5 + 274 + 3398 + 6 + 0 + + + 111 + 273 + 3396 + 0 + 0 + + + 110 + 273 + 3394 + 0 + 0 + + + 111 + 272 + 3397 + 0 + 0 + + + 111 + 272 + 3394 + 0 + 0 + + + 111 + 272 + 3392 + 0 + 0 + + + 51 + 273 + 3400 + 4 + 0 + + + 15 + 290 + 1467 + 0 + 0 + + + 6 + 289 + 1465 + 2 + 0 + + + 15 + 310 + 1467 + 0 + 0 + + + 6 + 308 + 1466 + 4 + 0 + + + 47 + 306 + 1466 + 0 + 0 + + + 27 + 311 + 1473 + 0 + 0 + + + 6 + 308 + 1473 + 0 + 0 + + + 15 + 307 + 1478 + 0 + 0 + + + 15 + 317 + 1479 + 0 + 0 + + + 15 + 317 + 1474 + 4 + 0 + + + 3 + 312 + 1479 + 4 + 0 + + + 47 + 312 + 1475 + 4 + 0 + + + 45 + 319 + 1492 + 2 + 0 + + + 45 + 319 + 1491 + 2 + 0 + + + 45 + 319 + 1490 + 2 + 0 + + + 45 + 319 + 1489 + 2 + 0 + + + 45 + 318 + 1492 + 4 + 0 + + + 45 + 318 + 1489 + 0 + 0 + + + 45 + 317 + 1489 + 0 + 0 + + + 42 + 316 + 1490 + 0 + 0 + + + 45 + 316 + 1489 + 0 + 0 + + + 48 + 322 + 1475 + 4 + 0 + + + 25 + 322 + 1474 + 4 + 0 + + + 6 + 321 + 1479 + 0 + 0 + + + 3 + 327 + 1484 + 7 + 0 + + + 3 + 326 + 1483 + 7 + 0 + + + 7 + 323 + 1493 + 0 + 0 + + + 3 + 323 + 1492 + 4 + 0 + + + 7 + 323 + 1491 + 4 + 0 + + + 3 + 322 + 1489 + 4 + 0 + + + 7 + 322 + 1488 + 4 + 0 + + + 1 + 321 + 1477 + 0 + 1 + + + 1 + 320 + 1478 + 1 + 1 + + + 6 + 328 + 1482 + 7 + 0 + + + 1 + 315 + 1503 + 1 + 1 + + + 15 + 331 + 1509 + 6 + 0 + + + 1 + 342 + 502 + 0 + 0 + + + 177 + 327 + 490 + 0 + 0 + + + 34 + 341 + 494 + 4 + 0 + + + 34 + 340 + 493 + 4 + 0 + + + 1 + 325 + 493 + 0 + 1 + + + 15 + 323 + 487 + 4 + 0 + + + 0 + 321 + 484 + 0 + 0 + + + 0 + 321 + 481 + 0 + 0 + + + 137 + 341 + 487 + 4 + 0 + + + 1 + 348 + 483 + 4 + 0 + + + 37 + 347 + 486 + 4 + 0 + + + 0 + 344 + 485 + 4 + 0 + + + 1 + 351 + 489 + 4 + 0 + + + 1 + 349 + 488 + 4 + 0 + + + 34 + 347 + 495 + 4 + 0 + + + 37 + 344 + 489 + 4 + 0 + + + 34 + 347 + 496 + 4 + 0 + + + 73 + 351 + 492 + 0 + 1 + + + 1 + 352 + 472 + 0 + 0 + + + 1 + 357 + 484 + 4 + 0 + + + 0 + 354 + 481 + 4 + 0 + + + 1 + 352 + 483 + 4 + 0 + + + 41 + 358 + 492 + 0 + 0 + + + 20 + 357 + 494 + 4 + 0 + + + 34 + 355 + 491 + 4 + 0 + + + 34 + 355 + 488 + 4 + 0 + + + 1 + 355 + 502 + 0 + 0 + + + 1 + 358 + 505 + 0 + 0 + + + 70 + 358 + 495 + 1 + 1 + + + 71 + 356 + 495 + 1 + 1 + + + 72 + 356 + 492 + 1 + 1 + + + 68 + 362 + 467 + 4 + 0 + + + 1 + 367 + 482 + 4 + 0 + + + 1 + 365 + 485 + 4 + 0 + + + 0 + 360 + 486 + 4 + 0 + + + 1 + 360 + 482 + 4 + 0 + + + 5 + 367 + 494 + 0 + 0 + + + 255 + 363 + 494 + 2 + 0 + + + 48 + 362 + 495 + 4 + 0 + + + 6 + 362 + 491 + 4 + 0 + + + 1 + 361 + 489 + 4 + 0 + + + 20 + 360 + 495 + 0 + 0 + + + 7 + 360 + 494 + 0 + 0 + + + 3 + 360 + 493 + 0 + 0 + + + 0 + 360 + 489 + 4 + 0 + + + 248 + 367 + 497 + 0 + 0 + + + 34 + 364 + 502 + 4 + 0 + + + 37 + 362 + 498 + 4 + 0 + + + 3 + 360 + 502 + 3 + 0 + + + 1 + 361 + 499 + 3 + 1 + + + 34 + 341 + 457 + 0 + 0 + + + 1 + 351 + 457 + 0 + 0 + + + 37 + 346 + 459 + 0 + 0 + + + 34 + 358 + 460 + 0 + 0 + + + 68 + 357 + 462 + 0 + 0 + + + 0 + 357 + 459 + 0 + 0 + + + 1 + 357 + 457 + 0 + 0 + + + 1 + 356 + 456 + 0 + 0 + + + 1 + 354 + 459 + 0 + 0 + + + 34 + 353 + 463 + 0 + 0 + + + 68 + 367 + 462 + 0 + 0 + + + 235 + 362 + 462 + 0 + 0 + + + 68 + 362 + 457 + 4 + 0 + + + 34 + 375 + 460 + 0 + 0 + + + 37 + 369 + 458 + 0 + 0 + + + 34 + 373 + 464 + 0 + 0 + + + 1 + 368 + 489 + 4 + 0 + + + 37 + 368 + 488 + 4 + 0 + + + 1 + 371 + 495 + 1 + 1 + + + 34 + 351 + 453 + 0 + 0 + + + 1 + 350 + 455 + 0 + 0 + + + 1 + 348 + 450 + 0 + 0 + + + 34 + 348 + 449 + 0 + 0 + + + 34 + 359 + 453 + 0 + 0 + + + 1 + 359 + 449 + 0 + 0 + + + 1 + 358 + 453 + 0 + 0 + + + 37 + 358 + 448 + 0 + 0 + + + 34 + 356 + 454 + 0 + 0 + + + 34 + 355 + 454 + 0 + 0 + + + 1 + 355 + 451 + 0 + 0 + + + 0 + 353 + 449 + 0 + 0 + + + 0 + 352 + 449 + 0 + 0 + + + 1 + 363 + 454 + 0 + 0 + + + 0 + 362 + 455 + 0 + 0 + + + 0 + 362 + 454 + 0 + 0 + + + 1 + 360 + 452 + 0 + 0 + + + 37 + 360 + 448 + 0 + 0 + + + 37 + 373 + 451 + 0 + 0 + + + 286 + 382 + 455 + 0 + 0 + + + 286 + 381 + 450 + 0 + 0 + + + 286 + 379 + 449 + 0 + 0 + + + 1 + 381 + 483 + 4 + 0 + + + 37 + 380 + 483 + 4 + 0 + + + 1 + 380 + 482 + 4 + 0 + + + 1 + 378 + 484 + 4 + 0 + + + 1 + 378 + 482 + 4 + 0 + + + 0 + 376 + 482 + 4 + 0 + + + 1 + 351 + 444 + 0 + 0 + + + 1 + 351 + 440 + 0 + 0 + + + 1 + 347 + 445 + 0 + 0 + + + 1 + 346 + 441 + 0 + 0 + + + 1 + 345 + 447 + 0 + 0 + + + 34 + 359 + 444 + 0 + 0 + + + 0 + 358 + 440 + 0 + 0 + + + 0 + 356 + 446 + 0 + 0 + + + 1 + 353 + 445 + 0 + 0 + + + 0 + 363 + 446 + 0 + 0 + + + 0 + 363 + 444 + 0 + 0 + + + 0 + 362 + 442 + 0 + 0 + + + 45 + 370 + 440 + 2 + 0 + + + 1 + 368 + 442 + 0 + 0 + + + 286 + 380 + 446 + 0 + 0 + + + 55 + 372 + 441 + 0 + 1 + + + 1 + 344 + 437 + 0 + 0 + + + 1 + 355 + 439 + 0 + 0 + + + 5 + 375 + 438 + 0 + 0 + + + 278 + 374 + 436 + 0 + 0 + + + 278 + 373 + 438 + 0 + 0 + + + 280 + 372 + 436 + 0 + 0 + + + 278 + 372 + 435 + 0 + 0 + + + 278 + 371 + 436 + 2 + 0 + + + 45 + 370 + 439 + 2 + 0 + + + 45 + 370 + 438 + 2 + 0 + + + 274 + 369 + 434 + 4 + 0 + + + 42 + 368 + 438 + 4 + 0 + + + 37 + 382 + 438 + 0 + 0 + + + 37 + 382 + 436 + 0 + 0 + + + 282 + 381 + 439 + 0 + 0 + + + 0 + 381 + 435 + 0 + 0 + + + 0 + 380 + 439 + 0 + 0 + + + 37 + 379 + 439 + 0 + 0 + + + 0 + 379 + 435 + 0 + 0 + + + 1 + 378 + 437 + 1 + 1 + + + 45 + 387 + 468 + 2 + 0 + + + 45 + 387 + 467 + 2 + 0 + + + 45 + 387 + 466 + 2 + 0 + + + 45 + 386 + 469 + 0 + 0 + + + 45 + 385 + 469 + 0 + 0 + + + 359 + 385 + 466 + 4 + 0 + + + 63 + 385 + 465 + 2 + 0 + + + 45 + 384 + 468 + 6 + 0 + + + 45 + 384 + 467 + 6 + 0 + + + 45 + 384 + 466 + 6 + 0 + + + 6 + 399 + 433 + 0 + 0 + + + 6 + 375 + 1382 + 0 + 0 + + + 19 + 369 + 1381 + 2 + 0 + + + 110 + 356 + 3276 + 0 + 0 + + + 210 + 353 + 3277 + 0 + 0 + + + 110 + 354 + 3281 + 0 + 0 + + + 110 + 360 + 3278 + 0 + 0 + + + 110 + 362 + 3283 + 0 + 0 + + + 41 + 368 + 3270 + 4 + 0 + + + 58 + 374 + 3276 + 6 + 0 + + + 110 + 375 + 3280 + 0 + 0 + + + 108 + 373 + 3281 + 4 + 0 + + + 110 + 372 + 3281 + 4 + 0 + + + 106 + 371 + 3281 + 4 + 0 + + + 51 + 117 + 3534 + 2 + 0 + + + 145 + 127 + 3511 + 2 + 0 + + + 3 + 126 + 3511 + 6 + 0 + + + 145 + 125 + 3511 + 6 + 0 + + + 51 + 127 + 3513 + 6 + 0 + + + 51 + 125 + 3513 + 2 + 0 + + + 51 + 122 + 3518 + 2 + 0 + + + 145 + 122 + 3516 + 6 + 0 + + + 145 + 127 + 3525 + 2 + 0 + + + 51 + 127 + 3523 + 6 + 0 + + + 145 + 125 + 3525 + 6 + 0 + + + 51 + 125 + 3523 + 2 + 0 + + + 145 + 122 + 3520 + 6 + 0 + + + 25 + 126 + 3533 + 0 + 0 + + + 51 + 123 + 3528 + 2 + 0 + + + 51 + 120 + 3531 + 2 + 0 + + + 51 + 130 + 3518 + 6 + 0 + + + 145 + 130 + 3516 + 2 + 0 + + + 5 + 128 + 3518 + 0 + 0 + + + 0 + 135 + 3524 + 7 + 0 + + + 145 + 130 + 3520 + 2 + 0 + + + 1 + 135 + 3534 + 7 + 0 + + + 25 + 128 + 3535 + 0 + 0 + + + 72 + 143 + 3527 + 7 + 0 + + + 72 + 143 + 3526 + 7 + 0 + + + 72 + 142 + 3527 + 7 + 0 + + + 72 + 142 + 3526 + 7 + 0 + + + 0 + 142 + 3521 + 7 + 0 + + + 72 + 141 + 3527 + 7 + 0 + + + 72 + 141 + 3526 + 7 + 0 + + + 72 + 140 + 3527 + 7 + 0 + + + 72 + 140 + 3526 + 7 + 0 + + + 72 + 139 + 3527 + 7 + 0 + + + 72 + 139 + 3526 + 7 + 0 + + + 0 + 138 + 3523 + 7 + 0 + + + 72 + 143 + 3530 + 7 + 0 + + + 72 + 143 + 3529 + 7 + 0 + + + 72 + 143 + 3528 + 7 + 0 + + + 72 + 142 + 3530 + 7 + 0 + + + 72 + 142 + 3529 + 7 + 0 + + + 72 + 142 + 3528 + 7 + 0 + + + 72 + 141 + 3530 + 7 + 0 + + + 72 + 141 + 3529 + 7 + 0 + + + 72 + 141 + 3528 + 7 + 0 + + + 72 + 140 + 3530 + 7 + 0 + + + 72 + 140 + 3529 + 7 + 0 + + + 72 + 140 + 3528 + 7 + 0 + + + 72 + 139 + 3530 + 7 + 0 + + + 72 + 139 + 3529 + 7 + 0 + + + 72 + 139 + 3528 + 7 + 0 + + + 1 + 137 + 3535 + 7 + 0 + + + 302 + 136 + 3533 + 4 + 0 + + + 51 + 118 + 3541 + 6 + 0 + + + 51 + 118 + 3539 + 6 + 0 + + + 51 + 115 + 3536 + 0 + 0 + + + 51 + 113 + 3536 + 0 + 0 + + + 25 + 127 + 3541 + 0 + 0 + + + 25 + 127 + 3538 + 0 + 0 + + + 51 + 120 + 3537 + 4 + 0 + + + 25 + 134 + 3541 + 0 + 0 + + + 25 + 129 + 3538 + 0 + 0 + + + 1 + 142 + 3537 + 7 + 0 + + + 67 + 117 + 3539 + 0 + 1 + + + 67 + 116 + 3537 + 1 + 1 + + + 30 + 104 + 3547 + 3 + 0 + + + 30 + 117 + 3544 + 5 + 0 + + + 30 + 115 + 3548 + 5 + 0 + + + 25 + 127 + 3547 + 0 + 0 + + + 25 + 127 + 3544 + 0 + 0 + + + 25 + 134 + 3547 + 0 + 0 + + + 25 + 134 + 3544 + 0 + 0 + + + 10 + 130 + 3547 + 2 + 0 + + + 30 + 103 + 3537 + 1 + 0 + + + 249 + 98 + 3537 + 0 + 0 + + + 51 + 150 + 3517 + 0 + 0 + + + 51 + 145 + 3519 + 0 + 0 + + + 72 + 148 + 3527 + 7 + 0 + + + 72 + 148 + 3526 + 7 + 0 + + + 72 + 147 + 3527 + 7 + 0 + + + 72 + 147 + 3526 + 7 + 0 + + + 72 + 146 + 3527 + 7 + 0 + + + 72 + 146 + 3526 + 7 + 0 + + + 72 + 145 + 3527 + 7 + 0 + + + 72 + 145 + 3526 + 7 + 0 + + + 72 + 144 + 3527 + 7 + 0 + + + 72 + 144 + 3526 + 7 + 0 + + + 72 + 148 + 3530 + 7 + 0 + + + 72 + 148 + 3529 + 7 + 0 + + + 72 + 148 + 3528 + 7 + 0 + + + 72 + 147 + 3530 + 7 + 0 + + + 72 + 147 + 3529 + 7 + 0 + + + 72 + 147 + 3528 + 7 + 0 + + + 72 + 146 + 3530 + 7 + 0 + + + 72 + 146 + 3529 + 7 + 0 + + + 72 + 146 + 3528 + 7 + 0 + + + 72 + 145 + 3530 + 7 + 0 + + + 72 + 145 + 3529 + 7 + 0 + + + 72 + 145 + 3528 + 7 + 0 + + + 72 + 144 + 3530 + 7 + 0 + + + 72 + 144 + 3529 + 7 + 0 + + + 72 + 144 + 3528 + 7 + 0 + + + 51 + 151 + 3541 + 4 + 0 + + + 1 + 150 + 3538 + 0 + 0 + + + 51 + 148 + 3541 + 4 + 0 + + + 1 + 147 + 3537 + 0 + 0 + + + 51 + 145 + 3539 + 4 + 0 + + + 51 + 156 + 3514 + 0 + 0 + + + 3 + 159 + 3523 + 0 + 0 + + + 3 + 158 + 3523 + 0 + 0 + + + 26 + 153 + 3524 + 4 + 0 + + + 246 + 159 + 3533 + 0 + 0 + + + 26 + 153 + 3531 + 4 + 0 + + + 1 + 153 + 3536 + 0 + 0 + + + 118 + 161 + 3516 + 4 + 0 + + + 51 + 160 + 3519 + 4 + 0 + + + 51 + 160 + 3514 + 0 + 0 + + + 51 + 167 + 3526 + 0 + 0 + + + 51 + 166 + 3521 + 0 + 0 + + + 51 + 164 + 3525 + 4 + 0 + + + 51 + 163 + 3526 + 0 + 0 + + + 51 + 162 + 3524 + 6 + 0 + + + 51 + 164 + 3533 + 6 + 0 + + + 53 + 162 + 3533 + 0 + 0 + + + 51 + 160 + 3535 + 4 + 0 + + + 51 + 165 + 3538 + 2 + 0 + + + 1 + 166 + 3526 + 0 + 1 + + + 1 + 160 + 3526 + 0 + 1 + + + 1 + 161 + 3531 + 0 + 1 + + + 51 + 174 + 3521 + 0 + 0 + + + 58 + 171 + 3527 + 4 + 0 + + + 51 + 171 + 3521 + 0 + 0 + + + 51 + 170 + 3525 + 4 + 0 + + + 51 + 169 + 3523 + 6 + 0 + + + 51 + 174 + 3535 + 4 + 0 + + + 11 + 172 + 3534 + 0 + 0 + + + 3 + 172 + 3532 + 0 + 0 + + + 3 + 172 + 3531 + 0 + 0 + + + 3 + 171 + 3532 + 0 + 0 + + + 3 + 171 + 3531 + 0 + 0 + + + 3 + 170 + 3532 + 0 + 0 + + + 3 + 170 + 3531 + 0 + 0 + + + 51 + 174 + 3541 + 0 + 0 + + + 11 + 172 + 3536 + 0 + 0 + + + 51 + 169 + 3543 + 4 + 0 + + + 51 + 169 + 3538 + 0 + 0 + + + 51 + 175 + 3550 + 4 + 0 + + + 51 + 172 + 3548 + 2 + 0 + + + 51 + 172 + 3545 + 2 + 0 + + + 1 + 169 + 3533 + 1 + 1 + + + 51 + 176 + 3527 + 6 + 0 + + + 51 + 176 + 3523 + 6 + 0 + + + 51 + 178 + 3534 + 6 + 0 + + + 51 + 178 + 3531 + 6 + 0 + + + 51 + 176 + 3535 + 4 + 0 + + + 51 + 176 + 3541 + 0 + 0 + + + 51 + 180 + 3545 + 6 + 0 + + + 51 + 179 + 3548 + 6 + 0 + + + 51 + 177 + 3550 + 4 + 0 + + + 326 + 544 + 590 + 0 + 0 + + + 334 + 540 + 591 + 0 + 0 + + + 51 + 558 + 3421 + 0 + 0 + + + 51 + 557 + 3424 + 2 + 0 + + + 51 + 554 + 3426 + 4 + 0 + + + 51 + 552 + 3426 + 4 + 0 + + + 51 + 559 + 3437 + 4 + 0 + + + 51 + 565 + 3420 + 6 + 0 + + + 51 + 562 + 3418 + 0 + 0 + + + 51 + 563 + 3424 + 6 + 0 + + + 80 + 561 + 3430 + 2 + 0 + + + 80 + 567 + 3434 + 4 + 0 + + + 80 + 564 + 3434 + 4 + 0 + + + 51 + 561 + 3437 + 4 + 0 + + + 5 + 569 + 3437 + 6 + 0 + + + 278 + 582 + 3418 + 5 + 0 + + + 278 + 581 + 3416 + 5 + 0 + + + 434 + 580 + 3421 + 0 + 0 + + + 97 + 580 + 3418 + 0 + 0 + + + 278 + 579 + 3416 + 5 + 0 + + + 278 + 578 + 3418 + 5 + 0 + + + 95 + 557 + 3425 + 1 + 1 + + + 51 + 423 + 3381 + 2 + 0 + + + 205 + 423 + 3378 + 4 + 0 + + + 51 + 420 + 3379 + 4 + 0 + + + 730 + 474 + 3383 + 0 + 0 + + + 729 + 474 + 3385 + 7 + 0 + + + 730 + 473 + 3388 + 4 + 0 + + + 565 + 475 + 3399 + 0 + 0 + + + 1154 + 473 + 3398 + 2 + 0 + + + 33 + 410 + 712 + 0 + 0 + + + 113 + 487 + 707 + 0 + 0 + + + 32 + 487 + 704 + 0 + 0 + + + 113 + 486 + 706 + 0 + 0 + + + 394 + 485 + 709 + 1 + 0 + + + 395 + 485 + 706 + 5 + 0 + + + 394 + 484 + 710 + 1 + 0 + + + 394 + 484 + 709 + 0 + 0 + + + 399 + 484 + 704 + 2 + 0 + + + 394 + 483 + 708 + 2 + 0 + + + 394 + 482 + 706 + 4 + 0 + + + 404 + 481 + 710 + 2 + 0 + + + 399 + 481 + 704 + 2 + 0 + + + 394 + 495 + 711 + 3 + 0 + + + 395 + 495 + 708 + 0 + 0 + + + 32 + 495 + 705 + 6 + 0 + + + 34 + 495 + 704 + 6 + 0 + + + 32 + 494 + 704 + 6 + 0 + + + 394 + 493 + 709 + 0 + 0 + + + 32 + 490 + 709 + 0 + 0 + + + 394 + 490 + 704 + 0 + 0 + + + 113 + 489 + 706 + 0 + 0 + + + 404 + 488 + 709 + 2 + 0 + + + 402 + 488 + 706 + 0 + 0 + + + 34 + 502 + 702 + 6 + 0 + + + 394 + 501 + 702 + 6 + 0 + + + 394 + 501 + 701 + 3 + 0 + + + 394 + 500 + 703 + 3 + 0 + + + 394 + 499 + 702 + 6 + 0 + + + 394 + 498 + 701 + 6 + 0 + + + 34 + 498 + 700 + 6 + 0 + + + 404 + 497 + 699 + 0 + 0 + + + 394 + 502 + 708 + 0 + 0 + + + 394 + 502 + 704 + 5 + 0 + + + 403 + 501 + 710 + 1 + 0 + + + 97 + 501 + 705 + 0 + 0 + + + 97 + 500 + 706 + 0 + 0 + + + 429 + 500 + 705 + 0 + 0 + + + 97 + 500 + 704 + 0 + 0 + + + 402 + 499 + 707 + 0 + 0 + + + 97 + 499 + 705 + 0 + 0 + + + 34 + 496 + 708 + 6 + 0 + + + 32 + 508 + 701 + 0 + 0 + + + 32 + 506 + 698 + 0 + 0 + + + 402 + 505 + 702 + 0 + 0 + + + 395 + 504 + 698 + 0 + 0 + + + 33 + 510 + 704 + 0 + 0 + + + 32 + 508 + 705 + 0 + 0 + + + 33 + 507 + 710 + 0 + 0 + + + 403 + 507 + 707 + 3 + 0 + + + 394 + 507 + 704 + 0 + 0 + + + 402 + 505 + 706 + 0 + 0 + + + 32 + 504 + 710 + 0 + 0 + + + 395 + 504 + 705 + 0 + 0 + + + 394 + 486 + 712 + 5 + 0 + + + 394 + 483 + 713 + 5 + 0 + + + 33 + 495 + 715 + 0 + 0 + + + 397 + 494 + 716 + 0 + 0 + + + 32 + 493 + 713 + 0 + 0 + + + 33 + 490 + 713 + 0 + 0 + + + 397 + 502 + 716 + 0 + 0 + + + 395 + 500 + 712 + 0 + 0 + + + 33 + 499 + 716 + 0 + 0 + + + 32 + 499 + 714 + 0 + 0 + + + 402 + 498 + 712 + 0 + 0 + + + 33 + 504 + 714 + 0 + 0 + + + 33 + 472 + 725 + 6 + 0 + + + 400 + 470 + 713 + 6 + 0 + + + 400 + 468 + 714 + 5 + 0 + + + 400 + 468 + 712 + 4 + 0 + + + 34 + 467 + 718 + 0 + 0 + + + 400 + 467 + 716 + 6 + 0 + + + 430 + 466 + 719 + 0 + 0 + + + 34 + 465 + 719 + 0 + 0 + + + 34 + 465 + 714 + 0 + 0 + + + 396 + 470 + 727 + 4 + 0 + + + 32 + 470 + 723 + 6 + 0 + + + 401 + 469 + 725 + 7 + 0 + + + 32 + 468 + 723 + 6 + 0 + + + 32 + 467 + 727 + 6 + 0 + + + 33 + 467 + 724 + 0 + 0 + + + 403 + 466 + 725 + 4 + 0 + + + 33 + 466 + 721 + 3 + 0 + + + 404 + 466 + 720 + 4 + 0 + + + 394 + 465 + 723 + 5 + 0 + + + 34 + 465 + 721 + 1 + 0 + + + 403 + 465 + 720 + 4 + 0 + + + 396 + 464 + 725 + 2 + 0 + + + 395 + 464 + 722 + 0 + 0 + + + 430 + 463 + 717 + 0 + 0 + + + 430 + 463 + 714 + 0 + 0 + + + 430 + 462 + 719 + 0 + 0 + + + 430 + 460 + 717 + 0 + 0 + + + 430 + 460 + 715 + 0 + 0 + + + 34 + 459 + 717 + 0 + 0 + + + 396 + 463 + 727 + 4 + 0 + + + 403 + 463 + 724 + 2 + 0 + + + 33 + 463 + 722 + 1 + 0 + + + 404 + 463 + 721 + 4 + 0 + + + 400 + 462 + 722 + 1 + 0 + + + 397 + 461 + 727 + 1 + 0 + + + 405 + 461 + 723 + 7 + 0 + + + 401 + 461 + 721 + 0 + 0 + + + 404 + 460 + 725 + 4 + 0 + + + 32 + 460 + 721 + 1 + 0 + + + 395 + 459 + 722 + 0 + 0 + + + 405 + 458 + 727 + 4 + 0 + + + 33 + 457 + 722 + 4 + 0 + + + 33 + 456 + 725 + 1 + 0 + + + 33 + 455 + 723 + 4 + 0 + + + 32 + 452 + 725 + 4 + 0 + + + 396 + 449 + 727 + 1 + 0 + + + 397 + 455 + 734 + 6 + 0 + + + 33 + 455 + 733 + 6 + 0 + + + 398 + 454 + 732 + 6 + 0 + + + 399 + 453 + 735 + 1 + 0 + + + 396 + 453 + 728 + 1 + 0 + + + 397 + 452 + 730 + 1 + 0 + + + 404 + 452 + 729 + 6 + 0 + + + 33 + 451 + 732 + 1 + 0 + + + 405 + 451 + 729 + 2 + 0 + + + 399 + 449 + 733 + 1 + 0 + + + 395 + 448 + 731 + 1 + 0 + + + 32 + 463 + 731 + 1 + 0 + + + 398 + 463 + 729 + 7 + 0 + + + 404 + 462 + 733 + 7 + 0 + + + 398 + 461 + 731 + 3 + 0 + + + 405 + 460 + 735 + 4 + 0 + + + 404 + 459 + 729 + 2 + 0 + + + 399 + 458 + 735 + 2 + 0 + + + 396 + 458 + 732 + 0 + 0 + + + 32 + 456 + 730 + 1 + 0 + + + 32 + 471 + 733 + 6 + 0 + + + 404 + 470 + 729 + 7 + 0 + + + 398 + 469 + 733 + 1 + 0 + + + 397 + 468 + 735 + 1 + 0 + + + 403 + 468 + 730 + 2 + 0 + + + 396 + 467 + 732 + 1 + 0 + + + 405 + 465 + 731 + 7 + 0 + + + 399 + 465 + 729 + 6 + 0 + + + 399 + 464 + 735 + 1 + 0 + + + 33 + 477 + 733 + 0 + 0 + + + 394 + 475 + 734 + 0 + 0 + + + 32 + 475 + 731 + 0 + 0 + + + 33 + 474 + 733 + 1 + 0 + + + 405 + 473 + 728 + 1 + 0 + + + 32 + 472 + 730 + 6 + 0 + + + 395 + 445 + 726 + 0 + 0 + + + 32 + 447 + 735 + 1 + 0 + + + 404 + 446 + 734 + 1 + 0 + + + 397 + 446 + 732 + 2 + 0 + + + 397 + 446 + 730 + 0 + 0 + + + 33 + 446 + 728 + 4 + 0 + + + 398 + 444 + 734 + 1 + 0 + + + 394 + 444 + 731 + 0 + 0 + + + 33 + 441 + 733 + 1 + 0 + + + 405 + 446 + 739 + 3 + 0 + + + 396 + 444 + 743 + 2 + 0 + + + 401 + 444 + 738 + 2 + 0 + + + 397 + 442 + 741 + 2 + 0 + + + 401 + 441 + 737 + 2 + 0 + + + 405 + 455 + 742 + 0 + 0 + + + 397 + 455 + 737 + 4 + 0 + + + 21 + 454 + 743 + 0 + 0 + + + 32 + 454 + 740 + 4 + 0 + + + 396 + 452 + 738 + 4 + 0 + + + 21 + 451 + 743 + 7 + 0 + + + 404 + 451 + 741 + 4 + 0 + + + 399 + 450 + 739 + 3 + 0 + + + 398 + 450 + 736 + 3 + 0 + + + 399 + 448 + 742 + 2 + 0 + + + 396 + 463 + 741 + 4 + 0 + + + 403 + 463 + 737 + 4 + 0 + + + 398 + 462 + 739 + 4 + 0 + + + 397 + 461 + 737 + 4 + 0 + + + 32 + 460 + 742 + 6 + 0 + + + 33 + 460 + 740 + 4 + 0 + + + 398 + 458 + 742 + 1 + 0 + + + 396 + 458 + 739 + 4 + 0 + + + 397 + 456 + 740 + 3 + 0 + + + 33 + 471 + 742 + 6 + 0 + + + 394 + 471 + 737 + 6 + 0 + + + 395 + 470 + 740 + 0 + 0 + + + 395 + 468 + 741 + 1 + 0 + + + 396 + 468 + 739 + 6 + 0 + + + 405 + 468 + 737 + 6 + 0 + + + 32 + 467 + 742 + 4 + 0 + + + 397 + 467 + 740 + 6 + 0 + + + 397 + 465 + 742 + 4 + 0 + + + 399 + 465 + 740 + 4 + 0 + + + 396 + 465 + 738 + 4 + 0 + + + 33 + 475 + 743 + 6 + 0 + + + 395 + 474 + 736 + 1 + 0 + + + 404 + 473 + 743 + 6 + 0 + + + 32 + 473 + 739 + 6 + 0 + + + 700 + 447 + 751 + 6 + 0 + + + 401 + 447 + 745 + 7 + 0 + + + 398 + 446 + 747 + 2 + 0 + + + 33 + 445 + 751 + 0 + 0 + + + 405 + 445 + 750 + 1 + 0 + + + 395 + 445 + 747 + 2 + 0 + + + 32 + 445 + 745 + 2 + 0 + + + 402 + 444 + 747 + 7 + 0 + + + 401 + 442 + 745 + 2 + 0 + + + 395 + 441 + 751 + 2 + 0 + + + 32 + 441 + 750 + 2 + 0 + + + 21 + 440 + 750 + 2 + 0 + + + 21 + 440 + 749 + 0 + 0 + + + 407 + 454 + 750 + 2 + 0 + + + 21 + 454 + 747 + 7 + 0 + + + 21 + 454 + 745 + 7 + 0 + + + 50 + 453 + 744 + 0 + 0 + + + 21 + 451 + 747 + 7 + 0 + + + 21 + 451 + 745 + 7 + 0 + + + 395 + 449 + 751 + 2 + 0 + + + 394 + 449 + 750 + 2 + 0 + + + 399 + 449 + 748 + 3 + 0 + + + 394 + 448 + 746 + 2 + 0 + + + 405 + 463 + 747 + 1 + 0 + + + 398 + 461 + 744 + 4 + 0 + + + 402 + 460 + 747 + 2 + 0 + + + 21 + 459 + 751 + 0 + 0 + + + 21 + 458 + 751 + 0 + 0 + + + 404 + 458 + 747 + 2 + 0 + + + 401 + 458 + 744 + 2 + 0 + + + 399 + 456 + 744 + 1 + 0 + + + 398 + 471 + 750 + 5 + 0 + + + 399 + 471 + 745 + 6 + 0 + + + 395 + 470 + 749 + 6 + 0 + + + 396 + 469 + 744 + 6 + 0 + + + 400 + 468 + 748 + 5 + 0 + + + 396 + 467 + 750 + 5 + 0 + + + 397 + 467 + 746 + 6 + 0 + + + 402 + 466 + 751 + 0 + 0 + + + 398 + 466 + 744 + 6 + 0 + + + 401 + 465 + 750 + 0 + 0 + + + 395 + 465 + 748 + 1 + 0 + + + 402 + 464 + 749 + 0 + 0 + + + 399 + 464 + 745 + 4 + 0 + + + 405 + 476 + 745 + 1 + 0 + + + 32 + 475 + 748 + 2 + 0 + + + 32 + 474 + 750 + 3 + 0 + + + 399 + 473 + 749 + 5 + 0 + + + 32 + 473 + 746 + 6 + 0 + + + 32 + 447 + 753 + 0 + 0 + + + 394 + 446 + 753 + 2 + 0 + + + 398 + 445 + 757 + 2 + 0 + + + 395 + 445 + 752 + 2 + 0 + + + 32 + 443 + 758 + 7 + 0 + + + 399 + 442 + 756 + 2 + 0 + + + 430 + 441 + 759 + 7 + 0 + + + 33 + 441 + 752 + 2 + 0 + + + 21 + 440 + 753 + 0 + 0 + + + 21 + 440 + 752 + 2 + 0 + + + 21 + 454 + 756 + 0 + 0 + + + 21 + 454 + 755 + 0 + 0 + + + 399 + 452 + 758 + 0 + 0 + + + 403 + 452 + 752 + 2 + 0 + + + 32 + 451 + 756 + 2 + 0 + + + 397 + 450 + 759 + 2 + 0 + + + 32 + 450 + 756 + 2 + 0 + + + 404 + 450 + 755 + 2 + 0 + + + 33 + 449 + 759 + 2 + 0 + + + 33 + 449 + 752 + 0 + 0 + + + 396 + 448 + 757 + 2 + 0 + + + 395 + 448 + 753 + 2 + 0 + + + 399 + 463 + 759 + 4 + 0 + + + 21 + 462 + 755 + 0 + 0 + + + 21 + 462 + 754 + 0 + 0 + + + 21 + 460 + 757 + 5 + 0 + + + 21 + 458 + 759 + 0 + 0 + + + 5 + 458 + 755 + 0 + 0 + + + 21 + 457 + 759 + 0 + 0 + + + 21 + 456 + 753 + 5 + 0 + + + 394 + 470 + 758 + 7 + 0 + + + 397 + 470 + 756 + 4 + 0 + + + 32 + 470 + 752 + 7 + 0 + + + 397 + 469 + 754 + 5 + 0 + + + 397 + 469 + 752 + 5 + 0 + + + 397 + 468 + 759 + 4 + 0 + + + 396 + 468 + 756 + 4 + 0 + + + 401 + 468 + 753 + 5 + 0 + + + 402 + 467 + 754 + 5 + 0 + + + 398 + 467 + 753 + 5 + 0 + + + 399 + 466 + 755 + 5 + 0 + + + 403 + 466 + 754 + 1 + 0 + + + 401 + 466 + 752 + 0 + 0 + + + 394 + 465 + 758 + 4 + 0 + + + 403 + 465 + 753 + 7 + 0 + + + 33 + 476 + 757 + 4 + 0 + + + 32 + 475 + 759 + 5 + 0 + + + 32 + 475 + 755 + 6 + 0 + + + 33 + 474 + 753 + 0 + 0 + + + 399 + 473 + 759 + 4 + 0 + + + 405 + 473 + 755 + 7 + 0 + + + 398 + 472 + 757 + 4 + 0 + + + 396 + 472 + 753 + 5 + 0 + + + 33 + 439 + 730 + 2 + 0 + + + 403 + 437 + 735 + 1 + 0 + + + 32 + 437 + 733 + 2 + 0 + + + 394 + 436 + 731 + 1 + 0 + + + 395 + 434 + 734 + 7 + 0 + + + 397 + 434 + 732 + 1 + 0 + + + 398 + 439 + 742 + 2 + 0 + + + 32 + 438 + 741 + 0 + 0 + + + 401 + 438 + 738 + 1 + 0 + + + 394 + 436 + 741 + 0 + 0 + + + 396 + 435 + 743 + 1 + 0 + + + 32 + 435 + 739 + 0 + 0 + + + 402 + 435 + 736 + 7 + 0 + + + 397 + 433 + 741 + 1 + 0 + + + 398 + 432 + 737 + 1 + 0 + + + 21 + 439 + 748 + 5 + 0 + + + 21 + 438 + 747 + 0 + 0 + + + 403 + 438 + 744 + 0 + 0 + + + 21 + 437 + 747 + 0 + 0 + + + 21 + 436 + 747 + 0 + 0 + + + 21 + 435 + 747 + 5 + 0 + + + 401 + 435 + 745 + 0 + 0 + + + 21 + 434 + 748 + 5 + 0 + + + 21 + 433 + 751 + 0 + 0 + + + 21 + 433 + 750 + 0 + 0 + + + 21 + 433 + 749 + 5 + 0 + + + 32 + 432 + 749 + 7 + 0 + + + 402 + 432 + 744 + 0 + 0 + + + 394 + 439 + 758 + 6 + 0 + + + 21 + 439 + 754 + 5 + 0 + + + 403 + 438 + 759 + 3 + 0 + + + 404 + 438 + 756 + 5 + 0 + + + 21 + 438 + 755 + 2 + 0 + + + 21 + 437 + 755 + 2 + 0 + + + 21 + 436 + 755 + 2 + 0 + + + 403 + 435 + 757 + 7 + 0 + + + 21 + 435 + 755 + 5 + 0 + + + 404 + 434 + 759 + 3 + 0 + + + 21 + 434 + 754 + 5 + 0 + + + 401 + 433 + 756 + 1 + 0 + + + 21 + 433 + 753 + 5 + 0 + + + 21 + 433 + 752 + 0 + 0 + + + 394 + 432 + 758 + 3 + 0 + + + 401 + 431 + 742 + 1 + 0 + + + 402 + 430 + 743 + 1 + 0 + + + 6 + 426 + 740 + 4 + 0 + + + 397 + 430 + 749 + 0 + 0 + + + 403 + 430 + 747 + 0 + 0 + + + 394 + 429 + 751 + 4 + 0 + + + 396 + 429 + 748 + 3 + 0 + + + 404 + 429 + 744 + 1 + 0 + + + 398 + 427 + 748 + 4 + 0 + + + 32 + 427 + 745 + 1 + 0 + + + 402 + 426 + 750 + 4 + 0 + + + 397 + 425 + 747 + 4 + 0 + + + 403 + 424 + 749 + 4 + 0 + + + 33 + 424 + 744 + 1 + 0 + + + 404 + 431 + 757 + 0 + 0 + + + 396 + 431 + 752 + 0 + 0 + + + 399 + 430 + 755 + 0 + 0 + + + 32 + 429 + 758 + 1 + 0 + + + 398 + 429 + 753 + 0 + 0 + + + 395 + 428 + 754 + 1 + 0 + + + 399 + 427 + 757 + 0 + 0 + + + 395 + 426 + 753 + 4 + 0 + + + 404 + 424 + 757 + 3 + 0 + + + 401 + 422 + 751 + 4 + 0 + + + 396 + 422 + 747 + 4 + 0 + + + 404 + 421 + 749 + 4 + 0 + + + 32 + 421 + 745 + 4 + 0 + + + 33 + 419 + 747 + 4 + 0 + + + 403 + 418 + 751 + 1 + 0 + + + 394 + 418 + 749 + 4 + 0 + + + 405 + 423 + 752 + 4 + 0 + + + 398 + 422 + 754 + 1 + 0 + + + 396 + 421 + 758 + 1 + 0 + + + 397 + 421 + 756 + 1 + 0 + + + 33 + 419 + 756 + 1 + 0 + + + 399 + 419 + 753 + 1 + 0 + + + 399 + 418 + 759 + 1 + 0 + + + 401 + 417 + 757 + 1 + 0 + + + 404 + 417 + 753 + 1 + 0 + + + 33 + 423 + 766 + 2 + 0 + + + 395 + 422 + 762 + 1 + 0 + + + 402 + 421 + 765 + 1 + 0 + + + 404 + 420 + 760 + 1 + 0 + + + 32 + 419 + 766 + 0 + 0 + + + 401 + 419 + 763 + 1 + 0 + + + 397 + 417 + 764 + 1 + 0 + + + 398 + 417 + 762 + 1 + 0 + + + 403 + 416 + 766 + 1 + 0 + + + 32 + 429 + 765 + 1 + 0 + + + 394 + 429 + 761 + 1 + 0 + + + 397 + 428 + 763 + 1 + 0 + + + 32 + 427 + 767 + 0 + 0 + + + 398 + 427 + 760 + 1 + 0 + + + 405 + 426 + 765 + 1 + 0 + + + 396 + 426 + 762 + 1 + 0 + + + 33 + 424 + 764 + 1 + 0 + + + 622 + 424 + 762 + 0 + 0 + + + 399 + 424 + 760 + 1 + 0 + + + 33 + 437 + 764 + 2 + 0 + + + 395 + 436 + 760 + 3 + 0 + + + 405 + 434 + 767 + 2 + 0 + + + 398 + 434 + 764 + 7 + 0 + + + 404 + 433 + 765 + 2 + 0 + + + 396 + 433 + 762 + 7 + 0 + + + 397 + 433 + 760 + 7 + 0 + + + 399 + 432 + 766 + 7 + 0 + + + 403 + 432 + 763 + 2 + 0 + + + 32 + 444 + 767 + 2 + 0 + + + 5 + 444 + 763 + 4 + 0 + + + 32 + 443 + 760 + 2 + 0 + + + 397 + 455 + 760 + 5 + 0 + + + 5 + 454 + 764 + 4 + 0 + + + 398 + 453 + 760 + 7 + 0 + + + 33 + 452 + 767 + 2 + 0 + + + 32 + 451 + 761 + 2 + 0 + + + 33 + 450 + 762 + 2 + 0 + + + 5 + 449 + 762 + 4 + 0 + + + 1 + 447 + 760 + 0 + 1 + + + 2 + 441 + 761 + 2 + 1 + + + 1 + 454 + 762 + 3 + 1 + + + 21 + 410 + 742 + 0 + 0 + + + 21 + 409 + 738 + 4 + 0 + + + 395 + 415 + 750 + 4 + 0 + + + 402 + 411 + 747 + 0 + 0 + + + 21 + 410 + 745 + 0 + 0 + + + 22 + 408 + 744 + 5 + 0 + + + 402 + 415 + 756 + 1 + 0 + + + 396 + 415 + 754 + 1 + 0 + + + 55 + 415 + 752 + 7 + 0 + + + 404 + 414 + 759 + 1 + 0 + + + 155 + 412 + 753 + 2 + 0 + + + 8 + 410 + 758 + 2 + 0 + + + 8 + 410 + 756 + 7 + 0 + + + 56 + 410 + 753 + 4 + 0 + + + 8 + 409 + 757 + 5 + 0 + + + 3 + 409 + 755 + 0 + 0 + + + 3 + 408 + 752 + 0 + 0 + + + 395 + 414 + 765 + 1 + 0 + + + 32 + 412 + 767 + 0 + 0 + + + 405 + 411 + 763 + 1 + 0 + + + 396 + 410 + 765 + 0 + 0 + + + 394 + 408 + 765 + 0 + 0 + + + 396 + 408 + 762 + 0 + 0 + + + 394 + 408 + 760 + 1 + 0 + + + 396 + 415 + 774 + 7 + 0 + + + 396 + 415 + 769 + 7 + 0 + + + 394 + 414 + 771 + 7 + 0 + + + 395 + 413 + 773 + 7 + 0 + + + 397 + 413 + 769 + 7 + 0 + + + 404 + 413 + 768 + 7 + 0 + + + 401 + 412 + 770 + 7 + 0 + + + 396 + 411 + 774 + 4 + 0 + + + 398 + 411 + 768 + 7 + 0 + + + 33 + 410 + 772 + 7 + 0 + + + 396 + 410 + 770 + 7 + 0 + + + 402 + 410 + 769 + 7 + 0 + + + 397 + 408 + 775 + 4 + 0 + + + 397 + 408 + 769 + 7 + 0 + + + 397 + 423 + 775 + 1 + 0 + + + 396 + 422 + 773 + 3 + 0 + + + 398 + 422 + 771 + 3 + 0 + + + 404 + 422 + 768 + 3 + 0 + + + 399 + 421 + 775 + 1 + 0 + + + 399 + 420 + 770 + 3 + 0 + + + 396 + 419 + 775 + 1 + 0 + + + 32 + 419 + 773 + 3 + 0 + + + 394 + 419 + 768 + 3 + 0 + + + 33 + 418 + 771 + 6 + 0 + + + 405 + 417 + 774 + 3 + 0 + + + 395 + 417 + 769 + 3 + 0 + + + 32 + 416 + 772 + 4 + 0 + + + 33 + 430 + 772 + 2 + 0 + + + 32 + 430 + 770 + 2 + 0 + + + 405 + 429 + 775 + 3 + 0 + + + 5 + 429 + 771 + 0 + 0 + + + 33 + 425 + 774 + 3 + 0 + + + 397 + 424 + 770 + 3 + 0 + + + 403 + 424 + 768 + 3 + 0 + + + 403 + 439 + 774 + 3 + 0 + + + 404 + 437 + 774 + 3 + 0 + + + 32 + 435 + 772 + 3 + 0 + + + 396 + 434 + 774 + 3 + 0 + + + 398 + 433 + 772 + 3 + 0 + + + 399 + 433 + 769 + 3 + 0 + + + 401 + 432 + 774 + 3 + 0 + + + 396 + 432 + 771 + 3 + 0 + + + 8 + 447 + 775 + 2 + 0 + + + 5 + 446 + 769 + 0 + 0 + + + 401 + 445 + 775 + 2 + 0 + + + 401 + 442 + 774 + 3 + 0 + + + 5 + 441 + 770 + 0 + 0 + + + 33 + 440 + 775 + 3 + 0 + + + 2 + 425 + 771 + 1 + 1 + + + 2 + 442 + 773 + 0 + 1 + + + 2 + 442 + 769 + 0 + 1 + + + 21 + 407 + 741 + 5 + 0 + + + 8 + 406 + 740 + 2 + 0 + + + 21 + 405 + 738 + 4 + 0 + + + 21 + 404 + 741 + 0 + 0 + + + 8 + 404 + 740 + 2 + 0 + + + 8 + 403 + 740 + 2 + 0 + + + 22 + 401 + 741 + 5 + 0 + + + 22 + 401 + 740 + 5 + 0 + + + 21 + 401 + 738 + 4 + 0 + + + 21 + 400 + 741 + 4 + 0 + + + 8 + 407 + 747 + 7 + 0 + + + 21 + 407 + 744 + 4 + 0 + + + 55 + 406 + 750 + 5 + 0 + + + 8 + 406 + 747 + 5 + 0 + + + 21 + 403 + 749 + 0 + 0 + + + 21 + 403 + 745 + 0 + 0 + + + 8 + 401 + 744 + 7 + 0 + + + 21 + 400 + 750 + 4 + 0 + + + 21 + 400 + 746 + 4 + 0 + + + 21 + 400 + 744 + 6 + 0 + + + 55 + 407 + 758 + 7 + 0 + + + 22 + 407 + 756 + 5 + 0 + + + 22 + 407 + 754 + 5 + 0 + + + 55 + 406 + 759 + 2 + 0 + + + 395 + 404 + 759 + 4 + 0 + + + 33 + 403 + 757 + 5 + 0 + + + 22 + 403 + 752 + 5 + 0 + + + 33 + 402 + 759 + 1 + 0 + + + 33 + 402 + 757 + 0 + 0 + + + 33 + 402 + 753 + 0 + 0 + + + 32 + 400 + 758 + 1 + 0 + + + 32 + 400 + 755 + 0 + 0 + + + 22 + 400 + 754 + 5 + 0 + + + 22 + 400 + 753 + 5 + 0 + + + 33 + 407 + 767 + 6 + 0 + + + 32 + 406 + 761 + 0 + 0 + + + 395 + 405 + 764 + 0 + 0 + + + 394 + 404 + 762 + 4 + 0 + + + 32 + 404 + 760 + 5 + 0 + + + 32 + 403 + 767 + 7 + 0 + + + 394 + 403 + 765 + 6 + 0 + + + 33 + 403 + 763 + 5 + 0 + + + 32 + 401 + 765 + 5 + 0 + + + 624 + 401 + 762 + 6 + 0 + + + 33 + 401 + 761 + 1 + 0 + + + 395 + 400 + 765 + 4 + 0 + + + 553 + 400 + 762 + 0 + 0 + + + 394 + 400 + 760 + 7 + 0 + + + 32 + 407 + 773 + 7 + 0 + + + 401 + 406 + 774 + 7 + 0 + + + 398 + 406 + 770 + 7 + 0 + + + 395 + 405 + 772 + 0 + 0 + + + 405 + 404 + 774 + 0 + 0 + + + 399 + 404 + 771 + 7 + 0 + + + 398 + 404 + 768 + 0 + 0 + + + 396 + 403 + 769 + 0 + 0 + + + 33 + 402 + 771 + 0 + 0 + + + 396 + 401 + 774 + 0 + 0 + + + 397 + 401 + 768 + 0 + 0 + + + 399 + 400 + 771 + 0 + 0 + + + 161 + 407 + 753 + 1 + 1 + + + 394 + 406 + 781 + 7 + 0 + + + 396 + 406 + 779 + 7 + 0 + + + 402 + 405 + 776 + 7 + 0 + + + 395 + 404 + 782 + 7 + 0 + + + 398 + 404 + 779 + 7 + 0 + + + 404 + 403 + 777 + 7 + 0 + + + 394 + 402 + 783 + 7 + 0 + + + 32 + 402 + 781 + 7 + 0 + + + 397 + 402 + 779 + 7 + 0 + + + 33 + 400 + 782 + 7 + 0 + + + 396 + 400 + 780 + 7 + 0 + + + 396 + 400 + 776 + 7 + 0 + + + 403 + 415 + 778 + 7 + 0 + + + 33 + 414 + 783 + 7 + 0 + + + 398 + 414 + 776 + 1 + 0 + + + 404 + 413 + 783 + 1 + 0 + + + 395 + 413 + 781 + 7 + 0 + + + 397 + 413 + 778 + 0 + 0 + + + 404 + 412 + 782 + 1 + 0 + + + 403 + 412 + 780 + 7 + 0 + + + 399 + 412 + 776 + 4 + 0 + + + 32 + 411 + 783 + 7 + 0 + + + 396 + 411 + 778 + 7 + 0 + + + 394 + 410 + 781 + 7 + 0 + + + 398 + 410 + 776 + 4 + 0 + + + 405 + 408 + 783 + 7 + 0 + + + 395 + 408 + 782 + 7 + 0 + + + 404 + 408 + 777 + 7 + 0 + + + 395 + 423 + 778 + 1 + 0 + + + 32 + 422 + 780 + 4 + 0 + + + 33 + 421 + 783 + 5 + 0 + + + 396 + 419 + 780 + 0 + 0 + + + 33 + 419 + 777 + 1 + 0 + + + 404 + 417 + 783 + 0 + 0 + + + 398 + 417 + 779 + 0 + 0 + + + 399 + 417 + 776 + 1 + 0 + + + 399 + 416 + 781 + 0 + 0 + + + 395 + 431 + 783 + 2 + 0 + + + 395 + 431 + 776 + 2 + 0 + + + 394 + 430 + 780 + 2 + 0 + + + 398 + 429 + 782 + 0 + 0 + + + 396 + 429 + 778 + 0 + 0 + + + 397 + 428 + 780 + 0 + 0 + + + 33 + 427 + 783 + 7 + 0 + + + 394 + 426 + 777 + 1 + 0 + + + 399 + 425 + 781 + 0 + 0 + + + 404 + 424 + 777 + 1 + 0 + + + 398 + 439 + 780 + 3 + 0 + + + 399 + 438 + 782 + 3 + 0 + + + 33 + 438 + 778 + 3 + 0 + + + 403 + 438 + 776 + 3 + 0 + + + 32 + 436 + 781 + 3 + 0 + + + 32 + 436 + 776 + 3 + 0 + + + 398 + 435 + 778 + 3 + 0 + + + 395 + 433 + 783 + 7 + 0 + + + 399 + 433 + 780 + 3 + 0 + + + 397 + 433 + 776 + 3 + 0 + + + 33 + 432 + 781 + 5 + 0 + + + 402 + 432 + 778 + 3 + 0 + + + 157 + 397 + 745 + 2 + 0 + + + 21 + 396 + 744 + 6 + 0 + + + 33 + 399 + 759 + 1 + 0 + + + 553 + 397 + 759 + 0 + 0 + + + 32 + 397 + 758 + 2 + 0 + + + 32 + 397 + 757 + 7 + 0 + + + 553 + 397 + 756 + 0 + 0 + + + 32 + 396 + 755 + 0 + 0 + + + 33 + 395 + 759 + 1 + 0 + + + 33 + 395 + 758 + 1 + 0 + + + 193 + 395 + 754 + 0 + 0 + + + 32 + 394 + 757 + 2 + 0 + + + 405 + 394 + 756 + 5 + 0 + + + 32 + 394 + 755 + 4 + 0 + + + 33 + 399 + 767 + 5 + 0 + + + 33 + 398 + 765 + 7 + 0 + + + 553 + 398 + 762 + 0 + 0 + + + 32 + 398 + 760 + 1 + 0 + + + 33 + 397 + 763 + 1 + 0 + + + 394 + 396 + 767 + 4 + 0 + + + 32 + 395 + 766 + 5 + 0 + + + 553 + 395 + 763 + 0 + 0 + + + 33 + 394 + 764 + 7 + 0 + + + 553 + 394 + 760 + 0 + 0 + + + 33 + 393 + 767 + 5 + 0 + + + 394 + 393 + 761 + 5 + 0 + + + 32 + 392 + 762 + 1 + 0 + + + 397 + 399 + 774 + 0 + 0 + + + 404 + 399 + 769 + 0 + 0 + + + 398 + 397 + 774 + 0 + 0 + + + 32 + 397 + 772 + 0 + 0 + + + 395 + 396 + 770 + 0 + 0 + + + 394 + 395 + 772 + 0 + 0 + + + 405 + 394 + 774 + 0 + 0 + + + 404 + 394 + 770 + 7 + 0 + + + 397 + 393 + 775 + 5 + 0 + + + 399 + 392 + 773 + 0 + 0 + + + 396 + 392 + 770 + 0 + 0 + + + 401 + 392 + 768 + 0 + 0 + + + 402 + 399 + 779 + 7 + 0 + + + 397 + 399 + 777 + 7 + 0 + + + 405 + 398 + 783 + 7 + 0 + + + 401 + 397 + 781 + 7 + 0 + + + 401 + 397 + 778 + 7 + 0 + + + 404 + 397 + 776 + 7 + 0 + + + 394 + 396 + 783 + 5 + 0 + + + 396 + 395 + 778 + 5 + 0 + + + 398 + 395 + 776 + 5 + 0 + + + 32 + 394 + 783 + 5 + 0 + + + 32 + 394 + 780 + 5 + 0 + + + 395 + 393 + 777 + 5 + 0 + + + 395 + 392 + 782 + 5 + 0 + + + 396 + 392 + 779 + 5 + 0 + + + 397 + 399 + 790 + 3 + 0 + + + 396 + 399 + 786 + 4 + 0 + + + 396 + 398 + 788 + 4 + 0 + + + 395 + 397 + 790 + 4 + 0 + + + 32 + 397 + 787 + 4 + 0 + + + 33 + 396 + 785 + 4 + 0 + + + 394 + 395 + 791 + 4 + 0 + + + 33 + 395 + 788 + 4 + 0 + + + 396 + 393 + 791 + 4 + 0 + + + 397 + 393 + 789 + 4 + 0 + + + 394 + 393 + 787 + 4 + 0 + + + 403 + 393 + 785 + 4 + 0 + + + 401 + 407 + 789 + 1 + 0 + + + 395 + 406 + 784 + 7 + 0 + + + 397 + 405 + 791 + 3 + 0 + + + 404 + 405 + 787 + 4 + 0 + + + 395 + 404 + 789 + 4 + 0 + + + 404 + 403 + 791 + 3 + 0 + + + 395 + 403 + 785 + 4 + 0 + + + 394 + 402 + 787 + 4 + 0 + + + 394 + 401 + 790 + 4 + 0 + + + 404 + 401 + 786 + 3 + 0 + + + 395 + 400 + 788 + 4 + 0 + + + 395 + 400 + 784 + 7 + 0 + + + 399 + 415 + 789 + 4 + 0 + + + 396 + 415 + 786 + 4 + 0 + + + 404 + 414 + 791 + 4 + 0 + + + 399 + 413 + 785 + 4 + 0 + + + 398 + 412 + 791 + 2 + 0 + + + 32 + 412 + 789 + 1 + 0 + + + 403 + 412 + 787 + 2 + 0 + + + 398 + 411 + 786 + 4 + 0 + + + 32 + 410 + 791 + 4 + 0 + + + 403 + 410 + 788 + 4 + 0 + + + 402 + 409 + 789 + 1 + 0 + + + 397 + 409 + 785 + 4 + 0 + + + 395 + 408 + 790 + 4 + 0 + + + 396 + 408 + 787 + 4 + 0 + + + 33 + 423 + 791 + 3 + 0 + + + 396 + 423 + 789 + 1 + 0 + + + 32 + 422 + 785 + 0 + 0 + + + 394 + 421 + 788 + 3 + 0 + + + 397 + 420 + 790 + 7 + 0 + + + 395 + 419 + 788 + 1 + 0 + + + 405 + 419 + 785 + 1 + 0 + + + 398 + 418 + 791 + 7 + 0 + + + 394 + 417 + 789 + 4 + 0 + + + 398 + 417 + 787 + 4 + 0 + + + 397 + 417 + 785 + 4 + 0 + + + 404 + 431 + 790 + 2 + 0 + + + 396 + 431 + 786 + 2 + 0 + + + 32 + 429 + 791 + 3 + 0 + + + 398 + 429 + 789 + 7 + 0 + + + 405 + 429 + 785 + 4 + 0 + + + 394 + 428 + 787 + 1 + 0 + + + 397 + 427 + 790 + 1 + 0 + + + 395 + 426 + 788 + 3 + 0 + + + 404 + 425 + 791 + 3 + 0 + + + 33 + 425 + 784 + 0 + 0 + + + 32 + 424 + 787 + 1 + 0 + + + 618 + 389 + 752 + 4 + 0 + + + 395 + 391 + 766 + 4 + 0 + + + 32 + 390 + 765 + 5 + 0 + + + 32 + 390 + 761 + 7 + 0 + + + 33 + 389 + 763 + 7 + 0 + + + 398 + 388 + 764 + 0 + 0 + + + 33 + 387 + 765 + 5 + 0 + + + 398 + 387 + 763 + 0 + 0 + + + 660 + 387 + 760 + 2 + 0 + + + 397 + 386 + 766 + 0 + 0 + + + 32 + 386 + 762 + 5 + 0 + + + 396 + 385 + 764 + 0 + 0 + + + 397 + 384 + 765 + 0 + 0 + + + 404 + 391 + 775 + 5 + 0 + + + 395 + 391 + 771 + 0 + 0 + + + 399 + 390 + 770 + 0 + 0 + + + 394 + 389 + 773 + 0 + 0 + + + 402 + 389 + 768 + 0 + 0 + + + 399 + 388 + 770 + 7 + 0 + + + 398 + 387 + 771 + 1 + 0 + + + 33 + 386 + 773 + 0 + 0 + + + 404 + 386 + 768 + 0 + 0 + + + 397 + 385 + 772 + 3 + 0 + + + 32 + 385 + 770 + 5 + 0 + + + 405 + 384 + 774 + 0 + 0 + + + 33 + 384 + 768 + 0 + 0 + + + 32 + 390 + 782 + 5 + 0 + + + 398 + 390 + 780 + 4 + 0 + + + 33 + 390 + 778 + 5 + 0 + + + 394 + 388 + 783 + 5 + 0 + + + 404 + 388 + 781 + 4 + 0 + + + 396 + 388 + 779 + 5 + 0 + + + 394 + 388 + 776 + 5 + 0 + + + 395 + 386 + 782 + 5 + 0 + + + 32 + 386 + 777 + 5 + 0 + + + 33 + 385 + 779 + 5 + 0 + + + 405 + 384 + 783 + 4 + 0 + + + 395 + 384 + 781 + 5 + 0 + + + 32 + 384 + 776 + 7 + 0 + + + 398 + 391 + 789 + 4 + 0 + + + 404 + 391 + 785 + 4 + 0 + + + 399 + 390 + 791 + 1 + 0 + + + 33 + 390 + 787 + 4 + 0 + + + 395 + 389 + 789 + 4 + 0 + + + 399 + 389 + 784 + 4 + 0 + + + 398 + 388 + 791 + 3 + 0 + + + 32 + 388 + 786 + 4 + 0 + + + 399 + 387 + 788 + 4 + 0 + + + 397 + 386 + 790 + 5 + 0 + + + 404 + 386 + 786 + 2 + 0 + + + 397 + 386 + 784 + 2 + 0 + + + 396 + 385 + 788 + 2 + 0 + + + 33 + 384 + 790 + 4 + 0 + + + 32 + 384 + 786 + 6 + 0 + + + 396 + 383 + 769 + 0 + 0 + + + 404 + 382 + 772 + 0 + 0 + + + 405 + 381 + 769 + 4 + 0 + + + 399 + 380 + 773 + 7 + 0 + + + 399 + 380 + 771 + 5 + 0 + + + 33 + 379 + 775 + 7 + 0 + + + 404 + 378 + 772 + 7 + 0 + + + 398 + 378 + 769 + 7 + 0 + + + 32 + 376 + 775 + 7 + 0 + + + 394 + 376 + 771 + 5 + 0 + + + 398 + 376 + 769 + 5 + 0 + + + 402 + 383 + 783 + 0 + 0 + + + 403 + 383 + 777 + 0 + 0 + + + 405 + 381 + 781 + 7 + 0 + + + 404 + 379 + 782 + 4 + 0 + + + 395 + 379 + 778 + 7 + 0 + + + 396 + 378 + 780 + 5 + 0 + + + 394 + 376 + 783 + 4 + 0 + + + 397 + 376 + 779 + 5 + 0 + + + 404 + 383 + 787 + 0 + 0 + + + 395 + 381 + 790 + 4 + 0 + + + 403 + 381 + 784 + 4 + 0 + + + 33 + 380 + 788 + 4 + 0 + + + 403 + 379 + 791 + 4 + 0 + + + 396 + 378 + 785 + 4 + 0 + + + 394 + 377 + 789 + 4 + 0 + + + 397 + 376 + 786 + 4 + 0 + + + 396 + 383 + 793 + 0 + 0 + + + 401 + 381 + 798 + 7 + 0 + + + 405 + 381 + 794 + 0 + 0 + + + 404 + 379 + 797 + 0 + 0 + + + 33 + 378 + 793 + 4 + 0 + + + 395 + 377 + 798 + 7 + 0 + + + 397 + 376 + 796 + 7 + 0 + + + 395 + 391 + 797 + 4 + 0 + + + 394 + 390 + 794 + 6 + 0 + + + 33 + 389 + 799 + 4 + 0 + + + 396 + 389 + 796 + 4 + 0 + + + 32 + 388 + 793 + 6 + 0 + + + 394 + 387 + 797 + 4 + 0 + + + 404 + 386 + 799 + 4 + 0 + + + 395 + 386 + 794 + 6 + 0 + + + 396 + 386 + 792 + 4 + 0 + + + 33 + 384 + 797 + 4 + 0 + + + 32 + 384 + 793 + 4 + 0 + + + 399 + 399 + 797 + 1 + 0 + + + 33 + 398 + 793 + 3 + 0 + + + 404 + 397 + 799 + 1 + 0 + + + 32 + 397 + 795 + 3 + 0 + + + 398 + 397 + 792 + 3 + 0 + + + 394 + 396 + 797 + 3 + 0 + + + 395 + 395 + 799 + 3 + 0 + + + 405 + 395 + 793 + 4 + 0 + + + 395 + 394 + 796 + 3 + 0 + + + 395 + 394 + 794 + 6 + 0 + + + 32 + 393 + 798 + 3 + 0 + + + 33 + 392 + 793 + 6 + 0 + + + 32 + 407 + 795 + 0 + 0 + + + 399 + 406 + 798 + 3 + 0 + + + 395 + 406 + 794 + 3 + 0 + + + 404 + 404 + 797 + 1 + 0 + + + 394 + 404 + 793 + 3 + 0 + + + 399 + 402 + 798 + 1 + 0 + + + 399 + 402 + 796 + 1 + 0 + + + 32 + 402 + 794 + 3 + 0 + + + 396 + 400 + 795 + 3 + 0 + + + 399 + 400 + 792 + 3 + 0 + + + 401 + 415 + 799 + 0 + 0 + + + 399 + 414 + 797 + 1 + 0 + + + 401 + 414 + 795 + 1 + 0 + + + 395 + 414 + 793 + 1 + 0 + + + 395 + 413 + 799 + 0 + 0 + + + 404 + 412 + 799 + 1 + 0 + + + 106 + 412 + 796 + 1 + 0 + + + 195 + 412 + 795 + 2 + 0 + + + 555 + 412 + 794 + 0 + 0 + + + 111 + 411 + 794 + 4 + 0 + + + 398 + 410 + 799 + 2 + 0 + + + 107 + 410 + 797 + 2 + 0 + + + 110 + 410 + 796 + 7 + 0 + + + 108 + 410 + 795 + 6 + 0 + + + 109 + 410 + 794 + 5 + 0 + + + 394 + 408 + 797 + 0 + 0 + + + 32 + 408 + 793 + 4 + 0 + + + 405 + 408 + 792 + 4 + 0 + + + 164 + 373 + 764 + 7 + 0 + + + 164 + 372 + 763 + 6 + 0 + + + 396 + 374 + 770 + 7 + 0 + + + 397 + 373 + 773 + 7 + 0 + + + 405 + 371 + 768 + 7 + 0 + + + 398 + 370 + 772 + 1 + 0 + + + 399 + 369 + 775 + 1 + 0 + + + 32 + 368 + 771 + 0 + 0 + + + 402 + 374 + 782 + 4 + 0 + + + 398 + 374 + 780 + 5 + 0 + + + 394 + 374 + 777 + 7 + 0 + + + 404 + 372 + 776 + 6 + 0 + + + 405 + 371 + 781 + 3 + 0 + + + 399 + 371 + 778 + 5 + 0 + + + 395 + 369 + 783 + 1 + 0 + + + 692 + 369 + 781 + 6 + 0 + + + 403 + 369 + 778 + 1 + 0 + + + 692 + 368 + 781 + 6 + 0 + + + 399 + 375 + 788 + 4 + 0 + + + 32 + 374 + 791 + 4 + 0 + + + 404 + 373 + 789 + 4 + 0 + + + 32 + 373 + 784 + 4 + 0 + + + 398 + 372 + 786 + 4 + 0 + + + 32 + 369 + 789 + 1 + 0 + + + 396 + 369 + 786 + 1 + 0 + + + 395 + 375 + 793 + 0 + 0 + + + 394 + 374 + 799 + 7 + 0 + + + 396 + 373 + 797 + 7 + 0 + + + 405 + 371 + 794 + 4 + 0 + + + 402 + 369 + 798 + 4 + 0 + + + 394 + 369 + 795 + 1 + 0 + + + 396 + 368 + 792 + 1 + 0 + + + 404 + 367 + 774 + 0 + 0 + + + 401 + 367 + 769 + 0 + 0 + + + 218 + 366 + 770 + 1 + 0 + + + 396 + 365 + 771 + 1 + 0 + + + 33 + 364 + 773 + 0 + 0 + + + 403 + 363 + 769 + 1 + 0 + + + 399 + 362 + 771 + 1 + 0 + + + 401 + 361 + 773 + 0 + 0 + + + 32 + 361 + 768 + 0 + 0 + + + 32 + 360 + 775 + 0 + 0 + + + 395 + 360 + 771 + 0 + 0 + + + 692 + 367 + 781 + 6 + 0 + + + 395 + 367 + 776 + 1 + 0 + + + 396 + 366 + 783 + 1 + 0 + + + 401 + 365 + 778 + 1 + 0 + + + 398 + 364 + 781 + 1 + 0 + + + 397 + 364 + 776 + 1 + 0 + + + 399 + 362 + 779 + 1 + 0 + + + 394 + 361 + 779 + 2 + 0 + + + 397 + 367 + 787 + 1 + 0 + + + 398 + 366 + 789 + 1 + 0 + + + 394 + 366 + 785 + 1 + 0 + + + 399 + 364 + 790 + 1 + 0 + + + 394 + 363 + 788 + 1 + 0 + + + 405 + 363 + 785 + 1 + 0 + + + 396 + 362 + 791 + 1 + 0 + + + 404 + 361 + 786 + 0 + 0 + + + 395 + 360 + 789 + 0 + 0 + + + 33 + 360 + 784 + 4 + 0 + + + 398 + 367 + 795 + 1 + 0 + + + 32 + 366 + 799 + 4 + 0 + + + 399 + 366 + 797 + 1 + 0 + + + 33 + 365 + 792 + 1 + 0 + + + 397 + 364 + 794 + 1 + 0 + + + 405 + 363 + 797 + 1 + 0 + + + 403 + 362 + 793 + 6 + 0 + + + 98 + 361 + 798 + 4 + 0 + + + 98 + 361 + 796 + 4 + 0 + + + 395 + 361 + 794 + 6 + 0 + + + 98 + 360 + 797 + 3 + 0 + + + 403 + 359 + 773 + 0 + 0 + + + 396 + 358 + 769 + 0 + 0 + + + 405 + 357 + 774 + 0 + 0 + + + 401 + 357 + 771 + 0 + 0 + + + 397 + 356 + 768 + 0 + 0 + + + 403 + 355 + 774 + 0 + 0 + + + 33 + 355 + 772 + 0 + 0 + + + 398 + 355 + 770 + 0 + 0 + + + 394 + 353 + 775 + 0 + 0 + + + 399 + 353 + 771 + 0 + 0 + + + 397 + 352 + 773 + 6 + 0 + + + 404 + 352 + 768 + 0 + 0 + + + 395 + 359 + 781 + 4 + 0 + + + 399 + 359 + 779 + 0 + 0 + + + 397 + 359 + 777 + 0 + 0 + + + 396 + 358 + 778 + 0 + 0 + + + 397 + 358 + 776 + 0 + 0 + + + 396 + 357 + 783 + 4 + 0 + + + 397 + 357 + 780 + 4 + 0 + + + 394 + 357 + 778 + 0 + 0 + + + 218 + 356 + 780 + 4 + 0 + + + 404 + 356 + 777 + 4 + 0 + + + 32 + 355 + 781 + 4 + 0 + + + 403 + 355 + 776 + 0 + 0 + + + 396 + 354 + 778 + 0 + 0 + + + 397 + 353 + 781 + 4 + 0 + + + 399 + 359 + 791 + 6 + 0 + + + 397 + 359 + 787 + 0 + 0 + + + 403 + 358 + 789 + 6 + 0 + + + 397 + 358 + 785 + 0 + 0 + + + 399 + 357 + 787 + 6 + 0 + + + 404 + 356 + 790 + 7 + 0 + + + 394 + 356 + 784 + 4 + 0 + + + 398 + 355 + 788 + 6 + 0 + + + 32 + 355 + 786 + 0 + 0 + + + 403 + 353 + 788 + 6 + 0 + + + 405 + 353 + 785 + 4 + 0 + + + 405 + 352 + 790 + 4 + 0 + + + 99 + 359 + 799 + 3 + 0 + + + 33 + 359 + 793 + 0 + 0 + + + 404 + 358 + 795 + 6 + 0 + + + 398 + 357 + 797 + 6 + 0 + + + 398 + 357 + 792 + 6 + 0 + + + 397 + 355 + 798 + 6 + 0 + + + 396 + 355 + 795 + 6 + 0 + + + 394 + 354 + 792 + 0 + 0 + + + 405 + 353 + 797 + 0 + 0 + + + 398 + 353 + 794 + 6 + 0 + + + 399 + 351 + 770 + 7 + 0 + + + 395 + 350 + 775 + 7 + 0 + + + 398 + 349 + 773 + 6 + 0 + + + 404 + 349 + 771 + 6 + 0 + + + 397 + 349 + 769 + 6 + 0 + + + 396 + 348 + 775 + 6 + 0 + + + 397 + 347 + 771 + 5 + 0 + + + 98 + 347 + 768 + 1 + 0 + + + 32 + 346 + 773 + 4 + 0 + + + 98 + 346 + 769 + 1 + 0 + + + 98 + 346 + 768 + 7 + 0 + + + 98 + 345 + 770 + 2 + 0 + + + 98 + 345 + 769 + 1 + 0 + + + 397 + 344 + 773 + 4 + 0 + + + 98 + 344 + 770 + 3 + 0 + + + 98 + 344 + 769 + 6 + 0 + + + 398 + 350 + 782 + 2 + 0 + + + 400 + 351 + 783 + 2 + 0 + + + 573 + 351 + 781 + 4 + 0 + + + 395 + 351 + 777 + 6 + 0 + + + 399 + 350 + 783 + 2 + 0 + + + 573 + 350 + 781 + 0 + 0 + + + 394 + 349 + 779 + 6 + 0 + + + 32 + 349 + 777 + 6 + 0 + + + 396 + 347 + 781 + 4 + 0 + + + 394 + 347 + 778 + 4 + 0 + + + 397 + 346 + 779 + 4 + 0 + + + 397 + 345 + 783 + 4 + 0 + + + 396 + 345 + 776 + 4 + 0 + + + 405 + 344 + 781 + 0 + 0 + + + 33 + 344 + 778 + 4 + 0 + + + 399 + 351 + 787 + 4 + 0 + + + 399 + 350 + 791 + 4 + 0 + + + 396 + 350 + 789 + 4 + 0 + + + 394 + 350 + 784 + 0 + 0 + + + 403 + 349 + 787 + 4 + 0 + + + 399 + 349 + 785 + 4 + 0 + + + 404 + 348 + 790 + 4 + 0 + + + 398 + 347 + 787 + 4 + 0 + + + 398 + 347 + 784 + 4 + 0 + + + 397 + 346 + 791 + 4 + 0 + + + 401 + 346 + 789 + 4 + 0 + + + 403 + 345 + 787 + 4 + 0 + + + 395 + 345 + 785 + 4 + 0 + + + 399 + 344 + 789 + 2 + 0 + + + 395 + 351 + 798 + 4 + 0 + + + 394 + 351 + 793 + 4 + 0 + + + 32 + 350 + 795 + 4 + 0 + + + 396 + 349 + 799 + 4 + 0 + + + 33 + 348 + 796 + 4 + 0 + + + 398 + 348 + 792 + 4 + 0 + + + 396 + 347 + 794 + 4 + 0 + + + 405 + 345 + 798 + 4 + 0 + + + 401 + 345 + 795 + 2 + 0 + + + 399 + 344 + 792 + 2 + 0 + + + 395 + 343 + 775 + 4 + 0 + + + 98 + 343 + 770 + 1 + 0 + + + 399 + 342 + 772 + 4 + 0 + + + 396 + 339 + 774 + 4 + 0 + + + 32 + 338 + 772 + 5 + 0 + + + 33 + 336 + 774 + 5 + 0 + + + 32 + 342 + 782 + 4 + 0 + + + 397 + 342 + 779 + 4 + 0 + + + 397 + 341 + 776 + 4 + 0 + + + 395 + 340 + 783 + 4 + 0 + + + 398 + 340 + 780 + 4 + 0 + + + 396 + 340 + 778 + 4 + 0 + + + 394 + 338 + 782 + 4 + 0 + + + 404 + 338 + 778 + 4 + 0 + + + 396 + 337 + 780 + 4 + 0 + + + 403 + 337 + 776 + 4 + 0 + + + 397 + 336 + 778 + 4 + 0 + + + 401 + 343 + 786 + 4 + 0 + + + 395 + 342 + 790 + 4 + 0 + + + 396 + 342 + 788 + 2 + 0 + + + 396 + 342 + 784 + 4 + 0 + + + 397 + 341 + 786 + 4 + 0 + + + 404 + 339 + 790 + 4 + 0 + + + 398 + 339 + 785 + 4 + 0 + + + 32 + 338 + 788 + 4 + 0 + + + 403 + 337 + 790 + 2 + 0 + + + 399 + 337 + 784 + 4 + 0 + + + 405 + 336 + 786 + 4 + 0 + + + 396 + 343 + 799 + 0 + 0 + + + 399 + 343 + 796 + 2 + 0 + + + 33 + 342 + 794 + 4 + 0 + + + 399 + 342 + 792 + 2 + 0 + + + 394 + 341 + 797 + 2 + 0 + + + 396 + 340 + 799 + 0 + 0 + + + 404 + 340 + 792 + 2 + 0 + + + 397 + 339 + 797 + 0 + 0 + + + 405 + 339 + 795 + 2 + 0 + + + 33 + 337 + 799 + 0 + 0 + + + 395 + 337 + 796 + 2 + 0 + + + 394 + 337 + 793 + 4 + 0 + + + 402 + 343 + 803 + 0 + 0 + + + 32 + 341 + 801 + 0 + 0 + + + 399 + 340 + 803 + 0 + 0 + + + 404 + 339 + 801 + 0 + 0 + + + 396 + 338 + 805 + 0 + 0 + + + 395 + 337 + 803 + 0 + 0 + + + 403 + 351 + 804 + 4 + 0 + + + 33 + 350 + 802 + 6 + 0 + + + 98 + 349 + 807 + 1 + 0 + + + 405 + 349 + 805 + 4 + 0 + + + 399 + 348 + 804 + 4 + 0 + + + 397 + 348 + 802 + 4 + 0 + + + 701 + 347 + 806 + 0 + 0 + + + 397 + 347 + 800 + 4 + 0 + + + 701 + 346 + 807 + 0 + 0 + + + 404 + 346 + 803 + 4 + 0 + + + 98 + 344 + 806 + 0 + 0 + + + 403 + 344 + 801 + 0 + 0 + + + 32 + 356 + 800 + 6 + 0 + + + 33 + 354 + 801 + 6 + 0 + + + 32 + 352 + 800 + 6 + 0 + + + 398 + 366 + 806 + 4 + 0 + + + 399 + 366 + 802 + 4 + 0 + + + 396 + 365 + 804 + 4 + 0 + + + 403 + 364 + 800 + 4 + 0 + + + 397 + 363 + 803 + 4 + 0 + + + 404 + 362 + 806 + 4 + 0 + + + 398 + 361 + 800 + 4 + 0 + + + 33 + 360 + 807 + 4 + 0 + + + 396 + 360 + 803 + 4 + 0 + + + 396 + 343 + 809 + 4 + 0 + + + 405 + 342 + 813 + 4 + 0 + + + 397 + 341 + 811 + 4 + 0 + + + 398 + 339 + 810 + 4 + 0 + + + 396 + 338 + 812 + 4 + 0 + + + 404 + 337 + 814 + 4 + 0 + + + 33 + 336 + 811 + 4 + 0 + + + 32 + 336 + 809 + 4 + 0 + + + 394 + 351 + 812 + 2 + 0 + + + 32 + 351 + 808 + 4 + 0 + + + 33 + 349 + 808 + 4 + 0 + + + 398 + 348 + 814 + 4 + 0 + + + 399 + 348 + 810 + 4 + 0 + + + 403 + 347 + 812 + 4 + 0 + + + 404 + 345 + 811 + 4 + 0 + + + 98 + 359 + 809 + 1 + 0 + + + 32 + 358 + 813 + 2 + 0 + + + 33 + 355 + 812 + 2 + 0 + + + 395 + 353 + 814 + 2 + 0 + + + 32 + 366 + 812 + 4 + 0 + + + 394 + 364 + 809 + 4 + 0 + + + 405 + 362 + 814 + 0 + 0 + + + 33 + 361 + 811 + 4 + 0 + + + 394 + 373 + 805 + 7 + 0 + + + 399 + 373 + 802 + 7 + 0 + + + 33 + 372 + 800 + 7 + 0 + + + 32 + 371 + 806 + 4 + 0 + + + 396 + 371 + 803 + 4 + 0 + + + 33 + 370 + 800 + 4 + 0 + + + 395 + 369 + 807 + 4 + 0 + + + 397 + 368 + 804 + 4 + 0 + + + 404 + 368 + 801 + 4 + 0 + + + 405 + 375 + 813 + 0 + 0 + + + 397 + 375 + 809 + 0 + 0 + + + 394 + 374 + 811 + 0 + 0 + + + 397 + 373 + 814 + 0 + 0 + + + 404 + 373 + 808 + 0 + 0 + + + 401 + 372 + 811 + 4 + 0 + + + 396 + 370 + 813 + 0 + 0 + + + 403 + 370 + 809 + 0 + 0 + + + 404 + 369 + 811 + 0 + 0 + + + 396 + 383 + 800 + 0 + 0 + + + 395 + 381 + 806 + 0 + 0 + + + 32 + 381 + 802 + 7 + 0 + + + 394 + 380 + 804 + 7 + 0 + + + 398 + 379 + 801 + 7 + 0 + + + 397 + 377 + 803 + 7 + 0 + + + 32 + 376 + 806 + 4 + 0 + + + 405 + 376 + 800 + 0 + 0 + + + 32 + 391 + 801 + 4 + 0 + + + 32 + 390 + 807 + 2 + 0 + + + 397 + 390 + 805 + 2 + 0 + + + 394 + 390 + 803 + 4 + 0 + + + 396 + 388 + 804 + 2 + 0 + + + 404 + 388 + 802 + 2 + 0 + + + 396 + 387 + 806 + 4 + 0 + + + 33 + 386 + 803 + 2 + 0 + + + 397 + 385 + 807 + 3 + 0 + + + 401 + 385 + 805 + 2 + 0 + + + 405 + 384 + 804 + 4 + 0 + + + 32 + 384 + 801 + 4 + 0 + + + 397 + 382 + 814 + 0 + 0 + + + 396 + 382 + 809 + 0 + 0 + + + 396 + 381 + 812 + 0 + 0 + + + 394 + 380 + 813 + 0 + 0 + + + 399 + 379 + 809 + 0 + 0 + + + 395 + 378 + 811 + 0 + 0 + + + 398 + 377 + 808 + 0 + 0 + + + 398 + 391 + 808 + 2 + 0 + + + 395 + 390 + 812 + 4 + 0 + + + 396 + 390 + 810 + 2 + 0 + + + 399 + 389 + 808 + 2 + 0 + + + 32 + 388 + 813 + 4 + 0 + + + 404 + 388 + 810 + 2 + 0 + + + 398 + 387 + 808 + 4 + 0 + + + 394 + 386 + 812 + 4 + 0 + + + 33 + 386 + 809 + 2 + 0 + + + 403 + 385 + 810 + 2 + 0 + + + 405 + 384 + 813 + 4 + 0 + + + 395 + 359 + 817 + 4 + 0 + + + 394 + 357 + 817 + 4 + 0 + + + 396 + 355 + 818 + 4 + 0 + + + 397 + 354 + 820 + 4 + 0 + + + 651 + 353 + 816 + 0 + 0 + + + 403 + 352 + 822 + 4 + 0 + + + 399 + 352 + 817 + 0 + 0 + + + 401 + 352 + 816 + 0 + 0 + + + 395 + 366 + 823 + 1 + 0 + + + 395 + 366 + 821 + 1 + 0 + + + 404 + 366 + 819 + 1 + 0 + + + 32 + 365 + 817 + 1 + 0 + + + 405 + 364 + 822 + 4 + 0 + + + 32 + 363 + 820 + 4 + 0 + + + 395 + 362 + 817 + 4 + 0 + + + 401 + 375 + 819 + 0 + 0 + + + 398 + 374 + 821 + 0 + 0 + + + 394 + 373 + 819 + 0 + 0 + + + 399 + 371 + 821 + 0 + 0 + + + 404 + 371 + 816 + 1 + 0 + + + 404 + 369 + 822 + 1 + 0 + + + 33 + 368 + 819 + 1 + 0 + + + 395 + 368 + 816 + 1 + 0 + + + 403 + 381 + 820 + 0 + 0 + + + 394 + 381 + 816 + 0 + 0 + + + 32 + 379 + 818 + 0 + 0 + + + 397 + 378 + 820 + 0 + 0 + + + 398 + 376 + 821 + 0 + 0 + + + 396 + 376 + 817 + 0 + 0 + + + 34 + 391 + 817 + 3 + 0 + + + 395 + 391 + 816 + 3 + 0 + + + 401 + 390 + 821 + 2 + 0 + + + 99 + 390 + 818 + 5 + 0 + + + 32 + 390 + 817 + 3 + 0 + + + 98 + 389 + 818 + 3 + 0 + + + 403 + 389 + 817 + 5 + 0 + + + 395 + 388 + 822 + 0 + 0 + + + 98 + 388 + 818 + 2 + 0 + + + 403 + 388 + 816 + 3 + 0 + + + 32 + 387 + 820 + 1 + 0 + + + 405 + 387 + 818 + 5 + 0 + + + 33 + 386 + 822 + 7 + 0 + + + 32 + 386 + 817 + 0 + 0 + + + 33 + 385 + 820 + 0 + 0 + + + 404 + 385 + 818 + 0 + 0 + + + 395 + 384 + 818 + 0 + 0 + + + 32 + 384 + 816 + 0 + 0 + + + 396 + 399 + 806 + 3 + 0 + + + 33 + 399 + 802 + 3 + 0 + + + 403 + 399 + 800 + 1 + 0 + + + 32 + 397 + 806 + 3 + 0 + + + 33 + 397 + 804 + 3 + 0 + + + 394 + 397 + 802 + 3 + 0 + + + 394 + 395 + 805 + 3 + 0 + + + 405 + 395 + 803 + 3 + 0 + + + 32 + 394 + 807 + 4 + 0 + + + 394 + 394 + 801 + 3 + 0 + + + 404 + 392 + 806 + 4 + 0 + + + 403 + 392 + 803 + 2 + 0 + + + 398 + 399 + 811 + 0 + 0 + + + 33 + 398 + 813 + 3 + 0 + + + 398 + 398 + 808 + 3 + 0 + + + 394 + 397 + 811 + 7 + 0 + + + 394 + 395 + 813 + 3 + 0 + + + 395 + 395 + 809 + 3 + 0 + + + 33 + 394 + 811 + 4 + 0 + + + 33 + 392 + 813 + 4 + 0 + + + 399 + 392 + 810 + 2 + 0 + + + 395 + 399 + 817 + 3 + 0 + + + 395 + 398 + 822 + 2 + 0 + + + 33 + 398 + 819 + 3 + 0 + + + 32 + 398 + 817 + 3 + 0 + + + 21 + 397 + 823 + 0 + 0 + + + 401 + 397 + 817 + 3 + 0 + + + 394 + 397 + 816 + 3 + 0 + + + 21 + 396 + 822 + 0 + 0 + + + 33 + 396 + 816 + 3 + 0 + + + 32 + 395 + 820 + 4 + 0 + + + 399 + 395 + 817 + 3 + 0 + + + 395 + 395 + 816 + 2 + 0 + + + 21 + 394 + 822 + 0 + 0 + + + 396 + 394 + 816 + 3 + 0 + + + 21 + 393 + 823 + 0 + 0 + + + 32 + 393 + 818 + 6 + 0 + + + 401 + 393 + 816 + 3 + 0 + + + 395 + 392 + 819 + 5 + 0 + + + 33 + 392 + 816 + 3 + 0 + + + 394 + 407 + 807 + 2 + 0 + + + 404 + 407 + 805 + 1 + 0 + + + 395 + 407 + 803 + 2 + 0 + + + 399 + 406 + 800 + 1 + 0 + + + 398 + 405 + 807 + 1 + 0 + + + 404 + 405 + 805 + 3 + 0 + + + 33 + 405 + 803 + 3 + 0 + + + 398 + 404 + 800 + 1 + 0 + + + 396 + 403 + 807 + 1 + 0 + + + 33 + 403 + 804 + 3 + 0 + + + 397 + 402 + 801 + 1 + 0 + + + 404 + 401 + 807 + 3 + 0 + + + 395 + 401 + 803 + 3 + 0 + + + 396 + 401 + 800 + 1 + 0 + + + 32 + 400 + 805 + 3 + 0 + + + 396 + 407 + 809 + 1 + 0 + + + 405 + 406 + 813 + 3 + 0 + + + 395 + 405 + 811 + 7 + 0 + + + 397 + 405 + 809 + 1 + 0 + + + 394 + 404 + 813 + 3 + 0 + + + 398 + 403 + 812 + 6 + 0 + + + 404 + 403 + 810 + 1 + 0 + + + 32 + 402 + 813 + 7 + 0 + + + 398 + 401 + 811 + 6 + 0 + + + 395 + 400 + 813 + 3 + 0 + + + 399 + 400 + 809 + 3 + 0 + + + 99 + 407 + 817 + 4 + 0 + + + 32 + 407 + 816 + 4 + 0 + + + 402 + 406 + 817 + 4 + 0 + + + 99 + 406 + 816 + 4 + 0 + + + 33 + 405 + 823 + 3 + 0 + + + 33 + 405 + 816 + 4 + 0 + + + 395 + 404 + 822 + 4 + 0 + + + 395 + 404 + 816 + 4 + 0 + + + 32 + 403 + 820 + 5 + 0 + + + 99 + 403 + 816 + 4 + 0 + + + 98 + 402 + 817 + 4 + 0 + + + 98 + 402 + 816 + 3 + 0 + + + 396 + 401 + 821 + 6 + 0 + + + 99 + 401 + 817 + 5 + 0 + + + 403 + 400 + 817 + 3 + 0 + + + 397 + 375 + 829 + 0 + 0 + + + 404 + 374 + 826 + 4 + 0 + + + 403 + 373 + 828 + 4 + 0 + + + 396 + 373 + 824 + 0 + 0 + + + 394 + 372 + 830 + 0 + 0 + + + 33 + 371 + 827 + 0 + 0 + + + 402 + 370 + 826 + 4 + 0 + + + 398 + 370 + 824 + 0 + 0 + + + 402 + 368 + 826 + 4 + 0 + + + 403 + 382 + 824 + 4 + 0 + + + 399 + 381 + 830 + 0 + 0 + + + 32 + 381 + 827 + 0 + 0 + + + 401 + 379 + 831 + 0 + 0 + + + 399 + 379 + 829 + 0 + 0 + + + 395 + 379 + 824 + 0 + 0 + + + 403 + 378 + 826 + 4 + 0 + + + 396 + 377 + 830 + 0 + 0 + + + 405 + 376 + 827 + 0 + 0 + + + 403 + 376 + 824 + 4 + 0 + + + 21 + 391 + 827 + 0 + 0 + + + 21 + 391 + 825 + 0 + 0 + + + 396 + 390 + 831 + 7 + 0 + + + 395 + 389 + 826 + 0 + 0 + + + 32 + 389 + 824 + 0 + 0 + + + 395 + 388 + 830 + 0 + 0 + + + 32 + 387 + 828 + 2 + 0 + + + 396 + 387 + 824 + 3 + 0 + + + 395 + 385 + 829 + 3 + 0 + + + 397 + 385 + 828 + 4 + 0 + + + 396 + 385 + 825 + 5 + 0 + + + 32 + 385 + 824 + 6 + 0 + + + 397 + 384 + 829 + 3 + 0 + + + 397 + 384 + 828 + 3 + 0 + + + 395 + 384 + 827 + 3 + 0 + + + 394 + 384 + 825 + 3 + 0 + + + 21 + 399 + 827 + 0 + 0 + + + 21 + 399 + 825 + 0 + 0 + + + 21 + 398 + 828 + 0 + 0 + + + 21 + 398 + 824 + 0 + 0 + + + 33 + 397 + 831 + 1 + 0 + + + 21 + 397 + 829 + 0 + 0 + + + 21 + 396 + 830 + 0 + 0 + + + 5 + 396 + 826 + 0 + 0 + + + 21 + 394 + 830 + 0 + 0 + + + 21 + 393 + 829 + 0 + 0 + + + 21 + 392 + 828 + 0 + 0 + + + 21 + 392 + 824 + 0 + 0 + + + 21 + 407 + 826 + 0 + 0 + + + 33 + 406 + 830 + 6 + 0 + + + 395 + 403 + 826 + 2 + 0 + + + 401 + 402 + 829 + 0 + 0 + + + 33 + 401 + 824 + 7 + 0 + + + 403 + 400 + 829 + 0 + 0 + + + 775 + 400 + 826 + 0 + 0 + + + 394 + 415 + 807 + 2 + 0 + + + 394 + 415 + 804 + 2 + 0 + + + 397 + 415 + 802 + 2 + 0 + + + 33 + 414 + 801 + 0 + 0 + + + 395 + 413 + 806 + 2 + 0 + + + 395 + 413 + 803 + 2 + 0 + + + 396 + 412 + 801 + 2 + 0 + + + 394 + 411 + 807 + 2 + 0 + + + 404 + 411 + 805 + 7 + 0 + + + 32 + 411 + 801 + 2 + 0 + + + 394 + 410 + 803 + 2 + 0 + + + 395 + 409 + 806 + 2 + 0 + + + 397 + 409 + 801 + 2 + 0 + + + 405 + 408 + 801 + 1 + 0 + + + 394 + 415 + 810 + 3 + 0 + + + 405 + 414 + 813 + 0 + 0 + + + 395 + 413 + 809 + 3 + 0 + + + 394 + 412 + 812 + 3 + 0 + + + 404 + 411 + 809 + 1 + 0 + + + 395 + 410 + 813 + 3 + 0 + + + 32 + 410 + 811 + 3 + 0 + + + 32 + 408 + 812 + 3 + 0 + + + 395 + 408 + 810 + 3 + 0 + + + 395 + 415 + 819 + 6 + 0 + + + 33 + 415 + 816 + 6 + 0 + + + 396 + 414 + 821 + 7 + 0 + + + 394 + 414 + 816 + 6 + 0 + + + 405 + 413 + 816 + 4 + 0 + + + 97 + 412 + 822 + 0 + 0 + + + 33 + 412 + 819 + 1 + 0 + + + 401 + 412 + 817 + 4 + 0 + + + 403 + 412 + 816 + 4 + 0 + + + 402 + 411 + 817 + 4 + 0 + + + 395 + 410 + 821 + 0 + 0 + + + 404 + 410 + 817 + 4 + 0 + + + 32 + 410 + 816 + 4 + 0 + + + 401 + 409 + 823 + 0 + 0 + + + 395 + 409 + 816 + 4 + 0 + + + 32 + 408 + 821 + 0 + 0 + + + 33 + 408 + 819 + 0 + 0 + + + 401 + 408 + 817 + 4 + 0 + + + 99 + 408 + 816 + 2 + 0 + + + 395 + 413 + 824 + 2 + 0 + + + 21 + 411 + 830 + 5 + 0 + + + 32 + 411 + 826 + 4 + 0 + + + 394 + 411 + 824 + 3 + 0 + + + 394 + 423 + 799 + 0 + 0 + + + 394 + 422 + 794 + 3 + 0 + + + 33 + 421 + 796 + 3 + 0 + + + 397 + 420 + 799 + 6 + 0 + + + 399 + 420 + 792 + 7 + 0 + + + 396 + 419 + 797 + 6 + 0 + + + 405 + 419 + 795 + 6 + 0 + + + 396 + 418 + 793 + 7 + 0 + + + 401 + 417 + 799 + 1 + 0 + + + 402 + 417 + 795 + 1 + 0 + + + 403 + 416 + 797 + 1 + 0 + + + 403 + 416 + 794 + 0 + 0 + + + 33 + 416 + 792 + 4 + 0 + + + 403 + 422 + 804 + 5 + 0 + + + 33 + 422 + 801 + 0 + 0 + + + 404 + 421 + 806 + 0 + 0 + + + 398 + 420 + 803 + 6 + 0 + + + 396 + 420 + 801 + 6 + 0 + + + 405 + 419 + 805 + 3 + 0 + + + 403 + 418 + 802 + 1 + 0 + + + 403 + 417 + 804 + 1 + 0 + + + 402 + 416 + 801 + 1 + 0 + + + 395 + 423 + 812 + 0 + 0 + + + 399 + 423 + 809 + 7 + 0 + + + 394 + 421 + 813 + 0 + 0 + + + 398 + 421 + 811 + 7 + 0 + + + 395 + 420 + 808 + 0 + 0 + + + 395 + 419 + 812 + 0 + 0 + + + 398 + 418 + 810 + 7 + 0 + + + 401 + 418 + 808 + 7 + 0 + + + 394 + 417 + 812 + 0 + 0 + + + 33 + 416 + 813 + 0 + 0 + + + 396 + 416 + 809 + 1 + 0 + + + 396 + 423 + 817 + 6 + 0 + + + 32 + 423 + 816 + 6 + 0 + + + 396 + 422 + 821 + 3 + 0 + + + 394 + 422 + 817 + 2 + 0 + + + 32 + 421 + 817 + 6 + 0 + + + 32 + 420 + 823 + 2 + 0 + + + 395 + 420 + 817 + 6 + 0 + + + 395 + 419 + 820 + 4 + 0 + + + 33 + 419 + 817 + 6 + 0 + + + 394 + 418 + 817 + 6 + 0 + + + 32 + 417 + 817 + 6 + 0 + + + 32 + 416 + 820 + 5 + 0 + + + 396 + 416 + 817 + 6 + 0 + + + 395 + 416 + 816 + 6 + 0 + + + 395 + 422 + 830 + 0 + 0 + + + 401 + 422 + 828 + 3 + 0 + + + 32 + 420 + 831 + 5 + 0 + + + 395 + 419 + 826 + 1 + 0 + + + 33 + 416 + 824 + 0 + 0 + + + 1 + 417 + 827 + 3 + 1 + + + 394 + 431 + 796 + 2 + 0 + + + 396 + 431 + 794 + 2 + 0 + + + 395 + 431 + 792 + 2 + 0 + + + 394 + 430 + 799 + 2 + 0 + + + 396 + 429 + 798 + 6 + 0 + + + 405 + 429 + 795 + 0 + 0 + + + 399 + 429 + 793 + 7 + 0 + + + 395 + 427 + 799 + 2 + 0 + + + 32 + 427 + 796 + 3 + 0 + + + 403 + 427 + 792 + 1 + 0 + + + 395 + 426 + 794 + 3 + 0 + + + 32 + 425 + 797 + 7 + 0 + + + 404 + 424 + 796 + 7 + 0 + + + 400 + 424 + 794 + 7 + 0 + + + 396 + 431 + 807 + 2 + 0 + + + 403 + 431 + 804 + 2 + 0 + + + 404 + 431 + 801 + 2 + 0 + + + 397 + 429 + 807 + 7 + 0 + + + 405 + 429 + 805 + 1 + 0 + + + 398 + 429 + 803 + 7 + 0 + + + 397 + 429 + 800 + 6 + 0 + + + 32 + 428 + 801 + 7 + 0 + + + 404 + 427 + 804 + 5 + 0 + + + 396 + 426 + 806 + 0 + 0 + + + 395 + 425 + 802 + 7 + 0 + + + 404 + 425 + 800 + 6 + 0 + + + 404 + 424 + 807 + 7 + 0 + + + 396 + 424 + 804 + 6 + 0 + + + 394 + 431 + 812 + 2 + 0 + + + 399 + 430 + 810 + 2 + 0 + + + 405 + 429 + 813 + 0 + 0 + + + 398 + 429 + 809 + 0 + 0 + + + 403 + 428 + 811 + 7 + 0 + + + 394 + 427 + 808 + 0 + 0 + + + 32 + 426 + 813 + 0 + 0 + + + 399 + 426 + 811 + 7 + 0 + + + 398 + 425 + 809 + 7 + 0 + + + 33 + 431 + 819 + 2 + 0 + + + 395 + 431 + 816 + 2 + 0 + + + 98 + 430 + 822 + 1 + 0 + + + 32 + 430 + 817 + 2 + 0 + + + 395 + 429 + 816 + 2 + 0 + + + 196 + 428 + 821 + 6 + 0 + + + 195 + 428 + 820 + 6 + 0 + + + 210 + 428 + 819 + 6 + 0 + + + 195 + 427 + 819 + 6 + 0 + + + 394 + 427 + 816 + 2 + 0 + + + 196 + 426 + 819 + 6 + 0 + + + 32 + 426 + 817 + 6 + 0 + + + 396 + 425 + 817 + 6 + 0 + + + 32 + 425 + 816 + 6 + 0 + + + 395 + 424 + 816 + 6 + 0 + + + 404 + 438 + 790 + 3 + 0 + + + 401 + 438 + 787 + 0 + 0 + + + 394 + 437 + 784 + 7 + 0 + + + 399 + 436 + 790 + 0 + 0 + + + 398 + 436 + 787 + 0 + 0 + + + 405 + 435 + 785 + 0 + 0 + + + 397 + 434 + 790 + 0 + 0 + + + 397 + 433 + 788 + 0 + 0 + + + 402 + 439 + 798 + 6 + 0 + + + 405 + 439 + 796 + 3 + 0 + + + 399 + 439 + 793 + 0 + 0 + + + 396 + 437 + 798 + 6 + 0 + + + 398 + 437 + 794 + 0 + 0 + + + 32 + 437 + 792 + 0 + 0 + + + 403 + 436 + 796 + 0 + 0 + + + 397 + 435 + 798 + 6 + 0 + + + 397 + 435 + 793 + 0 + 0 + + + 394 + 434 + 799 + 0 + 0 + + + 404 + 433 + 796 + 0 + 0 + + + 33 + 433 + 794 + 0 + 0 + + + 396 + 433 + 792 + 0 + 0 + + + 394 + 439 + 804 + 0 + 0 + + + 33 + 437 + 801 + 0 + 0 + + + 397 + 436 + 805 + 3 + 0 + + + 396 + 436 + 803 + 6 + 0 + + + 401 + 435 + 806 + 1 + 0 + + + 397 + 434 + 801 + 6 + 0 + + + 399 + 433 + 805 + 6 + 0 + + + 398 + 433 + 803 + 6 + 0 + + + 402 + 432 + 807 + 1 + 0 + + + 33 + 439 + 812 + 3 + 0 + + + 395 + 438 + 810 + 3 + 0 + + + 401 + 438 + 809 + 1 + 0 + + + 33 + 437 + 812 + 1 + 0 + + + 32 + 437 + 808 + 3 + 0 + + + 394 + 436 + 814 + 1 + 0 + + + 398 + 436 + 810 + 1 + 0 + + + 32 + 434 + 812 + 1 + 0 + + + 396 + 434 + 810 + 1 + 0 + + + 33 + 434 + 808 + 1 + 0 + + + 395 + 433 + 814 + 1 + 0 + + + 404 + 432 + 813 + 1 + 0 + + + 397 + 432 + 810 + 1 + 0 + + + 397 + 439 + 821 + 0 + 0 + + + 403 + 439 + 819 + 0 + 0 + + + 32 + 439 + 817 + 0 + 0 + + + 395 + 437 + 820 + 0 + 0 + + + 397 + 437 + 816 + 1 + 0 + + + 396 + 436 + 818 + 1 + 0 + + + 398 + 435 + 822 + 0 + 0 + + + 404 + 435 + 820 + 0 + 0 + + + 33 + 435 + 819 + 1 + 0 + + + 400 + 435 + 816 + 1 + 0 + + + 33 + 434 + 818 + 0 + 0 + + + 399 + 433 + 821 + 0 + 0 + + + 396 + 433 + 816 + 7 + 0 + + + 401 + 432 + 823 + 0 + 0 + + + 32 + 432 + 820 + 6 + 0 + + + 33 + 432 + 817 + 6 + 0 + + + 33 + 447 + 787 + 5 + 0 + + + 404 + 447 + 785 + 0 + 0 + + + 396 + 446 + 791 + 2 + 0 + + + 405 + 445 + 786 + 0 + 0 + + + 395 + 444 + 789 + 2 + 0 + + + 397 + 444 + 787 + 0 + 0 + + + 32 + 443 + 785 + 7 + 0 + + + 401 + 442 + 791 + 0 + 0 + + + 399 + 442 + 789 + 0 + 0 + + + 396 + 442 + 787 + 0 + 0 + + + 402 + 440 + 790 + 0 + 0 + + + 403 + 440 + 788 + 0 + 0 + + + 402 + 440 + 785 + 0 + 0 + + + 396 + 447 + 796 + 0 + 0 + + + 398 + 446 + 794 + 2 + 0 + + + 403 + 444 + 798 + 0 + 0 + + + 397 + 444 + 796 + 6 + 0 + + + 397 + 444 + 793 + 2 + 0 + + + 404 + 442 + 798 + 6 + 0 + + + 33 + 442 + 794 + 0 + 0 + + + 34 + 441 + 796 + 0 + 0 + + + 395 + 440 + 799 + 0 + 0 + + + 399 + 447 + 807 + 3 + 0 + + + 397 + 446 + 803 + 0 + 0 + + + 404 + 446 + 800 + 0 + 0 + + + 399 + 445 + 805 + 0 + 0 + + + 398 + 444 + 803 + 0 + 0 + + + 396 + 444 + 801 + 6 + 0 + + + 394 + 442 + 805 + 6 + 0 + + + 396 + 442 + 801 + 6 + 0 + + + 34 + 441 + 802 + 0 + 0 + + + 33 + 440 + 802 + 0 + 0 + + + 395 + 446 + 812 + 3 + 0 + + + 32 + 446 + 808 + 3 + 0 + + + 394 + 445 + 810 + 3 + 0 + + + 401 + 445 + 808 + 3 + 0 + + + 395 + 443 + 814 + 2 + 0 + + + 192 + 443 + 810 + 0 + 0 + + + 394 + 441 + 812 + 3 + 0 + + + 394 + 440 + 814 + 1 + 0 + + + 396 + 440 + 811 + 1 + 0 + + + 395 + 447 + 821 + 1 + 0 + + + 32 + 447 + 819 + 1 + 0 + + + 404 + 445 + 821 + 1 + 0 + + + 396 + 445 + 817 + 1 + 0 + + + 398 + 444 + 819 + 1 + 0 + + + 32 + 443 + 823 + 1 + 0 + + + 397 + 443 + 817 + 1 + 0 + + + 395 + 442 + 819 + 0 + 0 + + + 33 + 441 + 822 + 0 + 0 + + + 394 + 441 + 817 + 0 + 0 + + + 32 + 431 + 831 + 6 + 0 + + + 399 + 431 + 826 + 6 + 0 + + + 398 + 430 + 828 + 6 + 0 + + + 399 + 430 + 824 + 6 + 0 + + + 395 + 429 + 831 + 1 + 0 + + + 32 + 429 + 826 + 6 + 0 + + + 403 + 426 + 830 + 0 + 0 + + + 394 + 426 + 828 + 1 + 0 + + + 396 + 424 + 831 + 7 + 0 + + + 33 + 424 + 828 + 2 + 0 + + + 394 + 439 + 829 + 1 + 0 + + + 33 + 438 + 827 + 0 + 0 + + + 32 + 438 + 824 + 0 + 0 + + + 32 + 437 + 830 + 1 + 0 + + + 394 + 436 + 827 + 0 + 0 + + + 394 + 436 + 825 + 0 + 0 + + + 395 + 435 + 829 + 1 + 0 + + + 401 + 434 + 830 + 1 + 0 + + + 32 + 434 + 826 + 0 + 0 + + + 33 + 434 + 824 + 0 + 0 + + + 32 + 433 + 829 + 5 + 0 + + + 404 + 432 + 827 + 1 + 0 + + + 33 + 432 + 825 + 6 + 0 + + + 394 + 447 + 828 + 1 + 0 + + + 33 + 447 + 824 + 1 + 0 + + + 33 + 446 + 830 + 1 + 0 + + + 396 + 446 + 826 + 1 + 0 + + + 398 + 444 + 831 + 1 + 0 + + + 402 + 444 + 829 + 1 + 0 + + + 397 + 444 + 827 + 1 + 0 + + + 394 + 444 + 825 + 1 + 0 + + + 32 + 442 + 830 + 1 + 0 + + + 395 + 441 + 828 + 1 + 0 + + + 405 + 441 + 826 + 0 + 0 + + + 402 + 440 + 831 + 1 + 0 + + + 32 + 440 + 824 + 0 + 0 + + + 397 + 455 + 799 + 6 + 0 + + + 403 + 455 + 794 + 0 + 0 + + + 396 + 454 + 799 + 0 + 0 + + + 397 + 454 + 798 + 6 + 0 + + + 32 + 453 + 798 + 6 + 0 + + + 32 + 452 + 798 + 6 + 0 + + + 401 + 452 + 795 + 0 + 0 + + + 404 + 452 + 792 + 0 + 0 + + + 405 + 451 + 798 + 3 + 0 + + + 405 + 450 + 799 + 0 + 0 + + + 402 + 450 + 796 + 0 + 0 + + + 399 + 450 + 793 + 2 + 0 + + + 397 + 449 + 795 + 0 + 0 + + + 404 + 448 + 798 + 0 + 0 + + + 394 + 448 + 792 + 4 + 0 + + + 394 + 455 + 804 + 3 + 0 + + + 397 + 455 + 800 + 6 + 0 + + + 404 + 454 + 807 + 3 + 0 + + + 401 + 454 + 803 + 3 + 0 + + + 396 + 454 + 800 + 6 + 0 + + + 394 + 453 + 804 + 3 + 0 + + + 404 + 453 + 802 + 3 + 0 + + + 194 + 453 + 800 + 0 + 0 + + + 396 + 452 + 806 + 3 + 0 + + + 405 + 452 + 802 + 3 + 0 + + + 32 + 451 + 804 + 3 + 0 + + + 405 + 451 + 800 + 5 + 0 + + + 397 + 450 + 807 + 3 + 0 + + + 398 + 449 + 806 + 3 + 0 + + + 396 + 448 + 801 + 0 + 0 + + + 396 + 455 + 813 + 1 + 0 + + + 396 + 454 + 810 + 3 + 0 + + + 405 + 453 + 813 + 3 + 0 + + + 397 + 452 + 811 + 3 + 0 + + + 32 + 451 + 809 + 3 + 0 + + + 399 + 450 + 812 + 3 + 0 + + + 398 + 449 + 810 + 3 + 0 + + + 394 + 448 + 813 + 3 + 0 + + + 394 + 455 + 818 + 1 + 0 + + + 33 + 455 + 816 + 1 + 0 + + + 395 + 454 + 817 + 1 + 0 + + + 395 + 453 + 818 + 1 + 0 + + + 401 + 452 + 823 + 1 + 0 + + + 398 + 452 + 820 + 1 + 0 + + + 32 + 452 + 816 + 1 + 0 + + + 33 + 451 + 818 + 1 + 0 + + + 396 + 450 + 822 + 1 + 0 + + + 403 + 450 + 816 + 1 + 0 + + + 394 + 449 + 819 + 1 + 0 + + + 33 + 449 + 818 + 1 + 0 + + + 395 + 448 + 819 + 1 + 0 + + + 405 + 448 + 818 + 1 + 0 + + + 399 + 448 + 816 + 1 + 0 + + + 403 + 452 + 828 + 2 + 0 + + + 396 + 452 + 827 + 6 + 0 + + + 710 + 451 + 829 + 1 + 0 + + + 710 + 451 + 828 + 0 + 0 + + + 710 + 451 + 827 + 5 + 0 + + + 710 + 450 + 829 + 2 + 0 + + + 710 + 450 + 828 + 7 + 0 + + + 710 + 450 + 827 + 6 + 0 + + + 404 + 449 + 829 + 6 + 0 + + + 32 + 449 + 827 + 6 + 0 + + + 405 + 449 + 826 + 1 + 0 + + + 401 + 448 + 830 + 1 + 0 + + + 405 + 463 + 797 + 2 + 0 + + + 398 + 463 + 793 + 2 + 0 + + + 403 + 462 + 798 + 0 + 0 + + + 396 + 461 + 799 + 0 + 0 + + + 405 + 461 + 796 + 0 + 0 + + + 32 + 461 + 794 + 6 + 0 + + + 33 + 460 + 792 + 6 + 0 + + + 399 + 459 + 799 + 0 + 0 + + + 394 + 459 + 797 + 5 + 0 + + + 403 + 459 + 795 + 0 + 0 + + + 402 + 459 + 793 + 2 + 0 + + + 403 + 458 + 797 + 0 + 0 + + + 396 + 457 + 799 + 0 + 0 + + + 398 + 457 + 798 + 0 + 0 + + + 404 + 457 + 795 + 2 + 0 + + + 395 + 456 + 797 + 2 + 0 + + + 402 + 456 + 792 + 0 + 0 + + + 397 + 463 + 801 + 0 + 0 + + + 32 + 462 + 805 + 0 + 0 + + + 396 + 461 + 807 + 0 + 0 + + + 395 + 461 + 802 + 0 + 0 + + + 399 + 460 + 805 + 0 + 0 + + + 404 + 460 + 801 + 0 + 0 + + + 405 + 459 + 807 + 0 + 0 + + + 398 + 459 + 803 + 0 + 0 + + + 394 + 458 + 801 + 0 + 0 + + + 397 + 458 + 800 + 0 + 0 + + + 33 + 457 + 804 + 0 + 0 + + + 32 + 456 + 802 + 3 + 0 + + + 399 + 463 + 810 + 7 + 0 + + + 396 + 462 + 813 + 3 + 0 + + + 399 + 461 + 815 + 3 + 0 + + + 404 + 461 + 809 + 3 + 0 + + + 32 + 460 + 813 + 3 + 0 + + + 401 + 460 + 811 + 3 + 0 + + + 399 + 459 + 814 + 3 + 0 + + + 396 + 459 + 809 + 3 + 0 + + + 402 + 458 + 812 + 3 + 0 + + + 33 + 456 + 811 + 3 + 0 + + + 33 + 463 + 819 + 1 + 0 + + + 397 + 462 + 817 + 1 + 0 + + + 394 + 461 + 818 + 1 + 0 + + + 33 + 461 + 816 + 1 + 0 + + + 32 + 460 + 819 + 1 + 0 + + + 397 + 459 + 818 + 1 + 0 + + + 396 + 459 + 816 + 1 + 0 + + + 32 + 457 + 819 + 1 + 0 + + + 397 + 457 + 817 + 1 + 0 + + + 691 + 459 + 828 + 2 + 0 + + + 397 + 431 + 835 + 6 + 0 + + + 396 + 430 + 837 + 6 + 0 + + + 396 + 429 + 834 + 6 + 0 + + + 396 + 429 + 832 + 1 + 0 + + + 98 + 428 + 838 + 6 + 0 + + + 405 + 428 + 837 + 6 + 0 + + + 396 + 428 + 836 + 1 + 0 + + + 32 + 428 + 833 + 1 + 0 + + + 403 + 427 + 836 + 1 + 0 + + + 33 + 427 + 835 + 1 + 0 + + + 395 + 427 + 834 + 1 + 0 + + + 395 + 426 + 833 + 5 + 0 + + + 32 + 424 + 834 + 4 + 0 + + + 405 + 439 + 838 + 1 + 0 + + + 395 + 439 + 836 + 1 + 0 + + + 32 + 438 + 835 + 1 + 0 + + + 397 + 438 + 833 + 1 + 0 + + + 404 + 436 + 837 + 1 + 0 + + + 398 + 436 + 835 + 1 + 0 + + + 396 + 436 + 832 + 1 + 0 + + + 33 + 434 + 838 + 1 + 0 + + + 33 + 434 + 836 + 1 + 0 + + + 394 + 433 + 834 + 1 + 0 + + + 399 + 433 + 832 + 1 + 0 + + + 32 + 432 + 838 + 1 + 0 + + + 33 + 432 + 836 + 6 + 0 + + + 32 + 432 + 833 + 5 + 0 + + + 397 + 447 + 833 + 1 + 0 + + + 397 + 446 + 839 + 1 + 0 + + + 32 + 446 + 836 + 1 + 0 + + + 396 + 445 + 833 + 1 + 0 + + + 396 + 444 + 839 + 1 + 0 + + + 404 + 443 + 834 + 1 + 0 + + + 33 + 442 + 837 + 1 + 0 + + + 399 + 442 + 832 + 1 + 0 + + + 397 + 441 + 839 + 1 + 0 + + + 394 + 441 + 835 + 1 + 0 + + + 32 + 451 + 838 + 1 + 0 + + + 395 + 449 + 836 + 1 + 0 + + + 398 + 449 + 834 + 1 + 0 + + + 403 + 449 + 832 + 1 + 0 + + + 405 + 448 + 838 + 1 + 0 + + + 395 + 430 + 847 + 6 + 0 + + + 32 + 430 + 845 + 6 + 0 + + + 98 + 430 + 841 + 1 + 0 + + + 403 + 429 + 843 + 1 + 0 + + + 395 + 429 + 842 + 1 + 0 + + + 33 + 429 + 841 + 1 + 0 + + + 98 + 429 + 840 + 1 + 0 + + + 32 + 428 + 847 + 2 + 0 + + + 394 + 428 + 846 + 2 + 0 + + + 32 + 428 + 845 + 1 + 0 + + + 99 + 428 + 844 + 1 + 0 + + + 98 + 428 + 843 + 1 + 0 + + + 33 + 426 + 845 + 1 + 0 + + + 401 + 424 + 843 + 1 + 0 + + + 399 + 439 + 847 + 5 + 0 + + + 33 + 438 + 843 + 0 + 0 + + + 404 + 437 + 846 + 1 + 0 + + + 397 + 436 + 841 + 7 + 0 + + + 396 + 435 + 847 + 2 + 0 + + + 32 + 434 + 843 + 6 + 0 + + + 395 + 433 + 845 + 4 + 0 + + + 397 + 432 + 843 + 5 + 0 + + + 394 + 446 + 841 + 1 + 0 + + + 403 + 445 + 847 + 5 + 0 + + + 32 + 445 + 845 + 3 + 0 + + + 397 + 443 + 841 + 1 + 0 + + + 401 + 442 + 846 + 2 + 0 + + + 397 + 441 + 843 + 7 + 0 + + + 394 + 440 + 845 + 6 + 0 + + + 399 + 454 + 841 + 1 + 0 + + + 396 + 452 + 841 + 1 + 0 + + + 397 + 451 + 843 + 1 + 0 + + + 33 + 450 + 840 + 1 + 0 + + + 395 + 448 + 842 + 1 + 0 + + + 405 + 459 + 842 + 1 + 0 + + + 33 + 457 + 842 + 1 + 0 + + + 32 + 456 + 840 + 1 + 0 + + + 396 + 431 + 855 + 6 + 0 + + + 32 + 431 + 853 + 6 + 0 + + + 394 + 431 + 849 + 6 + 0 + + + 395 + 430 + 852 + 6 + 0 + + + 33 + 430 + 850 + 6 + 0 + + + 395 + 429 + 853 + 2 + 0 + + + 395 + 429 + 848 + 2 + 0 + + + 396 + 428 + 852 + 2 + 0 + + + 394 + 428 + 851 + 2 + 0 + + + 98 + 428 + 850 + 2 + 0 + + + 99 + 428 + 849 + 2 + 0 + + + 396 + 428 + 848 + 2 + 0 + + + 32 + 427 + 854 + 7 + 0 + + + 394 + 427 + 848 + 2 + 0 + + + 394 + 426 + 854 + 0 + 0 + + + 395 + 425 + 852 + 6 + 0 + + + 33 + 425 + 848 + 3 + 0 + + + 396 + 424 + 849 + 4 + 0 + + + 405 + 439 + 850 + 3 + 0 + + + 397 + 437 + 855 + 2 + 0 + + + 395 + 437 + 851 + 1 + 0 + + + 32 + 437 + 848 + 4 + 0 + + + 397 + 436 + 853 + 2 + 0 + + + 33 + 434 + 851 + 1 + 0 + + + 32 + 433 + 854 + 2 + 0 + + + 33 + 432 + 854 + 6 + 0 + + + 394 + 432 + 852 + 0 + 0 + + + 33 + 432 + 850 + 6 + 0 + + + 398 + 432 + 848 + 3 + 0 + + + 397 + 447 + 851 + 0 + 0 + + + 394 + 446 + 853 + 0 + 0 + + + 395 + 446 + 849 + 0 + 0 + + + 32 + 444 + 854 + 2 + 0 + + + 399 + 444 + 851 + 2 + 0 + + + 398 + 443 + 848 + 2 + 0 + + + 399 + 442 + 853 + 2 + 0 + + + 403 + 442 + 850 + 2 + 0 + + + 33 + 441 + 854 + 2 + 0 + + + 402 + 441 + 848 + 2 + 0 + + + 397 + 440 + 852 + 2 + 0 + + + 32 + 455 + 852 + 0 + 0 + + + 395 + 454 + 854 + 0 + 0 + + + 404 + 454 + 849 + 5 + 0 + + + 399 + 453 + 851 + 0 + 0 + + + 404 + 452 + 853 + 6 + 0 + + + 32 + 452 + 849 + 5 + 0 + + + 405 + 450 + 855 + 0 + 0 + + + 395 + 450 + 853 + 0 + 0 + + + 398 + 450 + 851 + 0 + 0 + + + 394 + 449 + 849 + 0 + 0 + + + 396 + 448 + 853 + 6 + 0 + + + 394 + 463 + 854 + 0 + 0 + + + 33 + 462 + 852 + 0 + 0 + + + 398 + 461 + 854 + 0 + 0 + + + 401 + 460 + 849 + 0 + 0 + + + 404 + 459 + 850 + 5 + 0 + + + 396 + 458 + 855 + 2 + 0 + + + 402 + 458 + 849 + 0 + 0 + + + 398 + 457 + 853 + 5 + 0 + + + 397 + 456 + 855 + 4 + 0 + + + 33 + 456 + 849 + 6 + 0 + + + 403 + 439 + 862 + 2 + 0 + + + 397 + 439 + 857 + 2 + 0 + + + 401 + 438 + 860 + 2 + 0 + + + 396 + 437 + 857 + 2 + 0 + + + 402 + 436 + 861 + 2 + 0 + + + 404 + 435 + 858 + 2 + 0 + + + 33 + 434 + 862 + 2 + 0 + + + 398 + 434 + 856 + 2 + 0 + + + 399 + 433 + 859 + 2 + 0 + + + 394 + 432 + 861 + 2 + 0 + + + 33 + 432 + 858 + 6 + 0 + + + 394 + 432 + 856 + 2 + 0 + + + 396 + 447 + 861 + 0 + 0 + + + 399 + 447 + 858 + 0 + 0 + + + 397 + 446 + 856 + 0 + 0 + + + 32 + 445 + 861 + 2 + 0 + + + 397 + 445 + 858 + 0 + 0 + + + 32 + 444 + 862 + 2 + 0 + + + 32 + 444 + 856 + 2 + 0 + + + 395 + 443 + 860 + 2 + 0 + + + 33 + 443 + 858 + 2 + 0 + + + 395 + 442 + 856 + 2 + 0 + + + 405 + 441 + 861 + 2 + 0 + + + 32 + 440 + 859 + 2 + 0 + + + 396 + 455 + 857 + 0 + 0 + + + 32 + 454 + 861 + 2 + 0 + + + 395 + 453 + 859 + 0 + 0 + + + 394 + 452 + 861 + 0 + 0 + + + 397 + 451 + 858 + 0 + 0 + + + 395 + 449 + 862 + 0 + 0 + + + 398 + 449 + 859 + 0 + 0 + + + 395 + 448 + 856 + 0 + 0 + + + 405 + 463 + 861 + 0 + 0 + + + 395 + 463 + 859 + 0 + 0 + + + 399 + 462 + 856 + 0 + 0 + + + 32 + 461 + 859 + 0 + 0 + + + 397 + 460 + 856 + 3 + 0 + + + 394 + 458 + 861 + 0 + 0 + + + 404 + 458 + 858 + 1 + 0 + + + 33 + 456 + 860 + 0 + 0 + + + 396 + 471 + 830 + 5 + 0 + + + 395 + 471 + 828 + 5 + 0 + + + 403 + 471 + 825 + 5 + 0 + + + 404 + 469 + 829 + 5 + 0 + + + 394 + 468 + 826 + 5 + 0 + + + 32 + 467 + 831 + 5 + 0 + + + 33 + 467 + 824 + 5 + 0 + + + 164 + 465 + 831 + 7 + 0 + + + 164 + 465 + 826 + 2 + 0 + + + 164 + 465 + 825 + 1 + 0 + + + 164 + 464 + 831 + 0 + 0 + + + 164 + 464 + 830 + 6 + 0 + + + 164 + 464 + 826 + 4 + 0 + + + 399 + 471 + 839 + 5 + 0 + + + 398 + 471 + 833 + 5 + 0 + + + 20 + 470 + 835 + 5 + 0 + + + 33 + 469 + 838 + 5 + 0 + + + 397 + 469 + 832 + 5 + 0 + + + 394 + 467 + 839 + 5 + 0 + + + 403 + 467 + 835 + 5 + 0 + + + 395 + 466 + 833 + 5 + 0 + + + 780 + 471 + 850 + 0 + 0 + + + 21 + 470 + 855 + 4 + 0 + + + 21 + 470 + 853 + 4 + 0 + + + 404 + 469 + 855 + 5 + 0 + + + 781 + 466 + 850 + 0 + 0 + + + 399 + 471 + 860 + 5 + 0 + + + 405 + 470 + 861 + 5 + 0 + + + 403 + 470 + 859 + 5 + 0 + + + 396 + 469 + 858 + 5 + 0 + + + 32 + 467 + 861 + 5 + 0 + + + 403 + 467 + 859 + 5 + 0 + + + 33 + 467 + 856 + 5 + 0 + + + 395 + 465 + 861 + 5 + 0 + + + 394 + 465 + 856 + 5 + 0 + + + 1100 + 439 + 868 + 5 + 0 + + + 1099 + 438 + 870 + 4 + 0 + + + 1099 + 438 + 868 + 6 + 0 + + + 1091 + 438 + 866 + 7 + 0 + + + 1086 + 437 + 866 + 0 + 0 + + + 1092 + 436 + 870 + 4 + 0 + + + 1086 + 436 + 868 + 7 + 0 + + + 1091 + 435 + 868 + 0 + 0 + + + 1099 + 435 + 866 + 1 + 0 + + + 1091 + 434 + 870 + 4 + 0 + + + 1100 + 434 + 866 + 2 + 0 + + + 399 + 434 + 864 + 1 + 0 + + + 1092 + 433 + 868 + 1 + 0 + + + 1086 + 432 + 870 + 4 + 0 + + + 1092 + 432 + 866 + 3 + 0 + + + 32 + 446 + 870 + 1 + 0 + + + 164 + 443 + 870 + 2 + 0 + + + 164 + 443 + 869 + 3 + 0 + + + 164 + 442 + 870 + 4 + 0 + + + 1092 + 441 + 868 + 4 + 0 + + + 1099 + 441 + 866 + 5 + 0 + + + 1100 + 440 + 870 + 4 + 0 + + + 1092 + 440 + 866 + 6 + 0 + + + 398 + 440 + 864 + 1 + 0 + + + 397 + 455 + 864 + 1 + 0 + + + 1176 + 452 + 870 + 0 + 0 + + + 1099 + 463 + 870 + 3 + 0 + + + 400 + 463 + 869 + 1 + 0 + + + 1099 + 463 + 866 + 0 + 0 + + + 397 + 463 + 864 + 1 + 0 + + + 1086 + 462 + 868 + 6 + 0 + + + 1100 + 461 + 870 + 4 + 0 + + + 1100 + 461 + 866 + 7 + 0 + + + 164 + 460 + 868 + 7 + 0 + + + 164 + 459 + 869 + 0 + 0 + + + 395 + 457 + 871 + 0 + 0 + + + 396 + 471 + 864 + 1 + 0 + + + 398 + 468 + 871 + 2 + 0 + + + 1086 + 465 + 870 + 2 + 0 + + + 1092 + 465 + 866 + 1 + 0 + + + 1099 + 464 + 868 + 5 + 0 + + + 204 + 439 + 870 + 2 + 1 + + + 204 + 439 + 866 + 2 + 1 + + + 204 + 437 + 871 + 0 + 1 + + + 204 + 437 + 868 + 0 + 1 + + + 204 + 436 + 866 + 3 + 1 + + + 204 + 435 + 870 + 2 + 1 + + + 204 + 434 + 868 + 0 + 1 + + + 204 + 433 + 870 + 3 + 1 + + + 204 + 433 + 866 + 3 + 1 + + + 204 + 432 + 868 + 3 + 1 + + + 204 + 442 + 868 + 2 + 1 + + + 204 + 442 + 866 + 2 + 1 + + + 204 + 441 + 870 + 3 + 1 + + + 204 + 440 + 868 + 0 + 1 + + + 204 + 463 + 868 + 3 + 1 + + + 204 + 462 + 870 + 3 + 1 + + + 204 + 462 + 867 + 0 + 1 + + + 204 + 461 + 868 + 3 + 1 + + + 204 + 460 + 870 + 3 + 1 + + + 204 + 467 + 869 + 2 + 1 + + + 204 + 466 + 870 + 2 + 1 + + + 204 + 465 + 868 + 2 + 1 + + + 204 + 464 + 870 + 2 + 1 + + + 204 + 464 + 867 + 0 + 1 + + + 403 + 474 + 836 + 5 + 0 + + + 33 + 474 + 832 + 5 + 0 + + + 394 + 473 + 834 + 5 + 0 + + + 32 + 473 + 840 + 5 + 0 + + + 21 + 472 + 855 + 0 + 0 + + + 21 + 472 + 853 + 0 + 0 + + + 32 + 476 + 858 + 5 + 0 + + + 33 + 475 + 861 + 5 + 0 + + + 399 + 474 + 859 + 5 + 0 + + + 394 + 473 + 861 + 5 + 0 + + + 398 + 473 + 858 + 5 + 0 + + + 1100 + 477 + 868 + 1 + 0 + + + 400 + 477 + 867 + 1 + 0 + + + 1092 + 477 + 866 + 1 + 0 + + + 1099 + 476 + 868 + 1 + 0 + + + 1086 + 476 + 867 + 1 + 0 + + + 1099 + 476 + 866 + 1 + 0 + + + 204 + 476 + 870 + 0 + 1 + + + 204 + 475 + 869 + 3 + 1 + + + 403 + 445 + 879 + 6 + 0 + + + 395 + 445 + 875 + 0 + 0 + + + 405 + 442 + 873 + 3 + 0 + + + 399 + 441 + 878 + 0 + 0 + + + 33 + 440 + 875 + 7 + 0 + + + 32 + 454 + 873 + 5 + 0 + + + 396 + 453 + 876 + 2 + 0 + + + 1151 + 453 + 873 + 0 + 0 + + + 1151 + 452 + 872 + 1 + 0 + + + 398 + 451 + 878 + 1 + 0 + + + 1151 + 451 + 873 + 7 + 0 + + + 32 + 450 + 873 + 6 + 0 + + + 404 + 448 + 877 + 7 + 0 + + + 397 + 448 + 872 + 1 + 0 + + + 396 + 463 + 877 + 7 + 0 + + + 404 + 463 + 873 + 7 + 0 + + + 394 + 461 + 875 + 7 + 0 + + + 404 + 460 + 879 + 7 + 0 + + + 400 + 459 + 872 + 7 + 0 + + + 403 + 457 + 876 + 7 + 0 + + + 395 + 471 + 874 + 7 + 0 + + + 404 + 471 + 872 + 0 + 0 + + + 1113 + 468 + 878 + 2 + 0 + + + 32 + 467 + 873 + 3 + 0 + + + 394 + 465 + 874 + 2 + 0 + + + 394 + 465 + 872 + 1 + 0 + + + 401 + 475 + 879 + 1 + 0 + + + 33 + 475 + 874 + 3 + 0 + + + 405 + 474 + 872 + 1 + 0 + + + 32 + 472 + 878 + 2 + 0 + + + 399 + 439 + 878 + 1 + 0 + + + 394 + 439 + 872 + 2 + 0 + + + 396 + 438 + 875 + 6 + 0 + + + 404 + 437 + 877 + 2 + 0 + + + 430 + 436 + 875 + 0 + 0 + + + 32 + 436 + 873 + 0 + 0 + + + 397 + 434 + 878 + 5 + 0 + + + 403 + 434 + 875 + 3 + 0 + + + 395 + 433 + 872 + 1 + 0 + + + 398 + 432 + 876 + 4 + 0 + + + 397 + 431 + 860 + 6 + 0 + + + 395 + 431 + 858 + 6 + 0 + + + 32 + 430 + 861 + 2 + 0 + + + 395 + 429 + 860 + 6 + 0 + + + 99 + 429 + 858 + 2 + 0 + + + 99 + 429 + 857 + 2 + 0 + + + 33 + 428 + 859 + 2 + 0 + + + 394 + 428 + 858 + 0 + 0 + + + 395 + 427 + 859 + 2 + 0 + + + 396 + 426 + 860 + 0 + 0 + + + 99 + 426 + 859 + 2 + 0 + + + 98 + 425 + 860 + 2 + 0 + + + 32 + 425 + 859 + 2 + 0 + + + 403 + 425 + 856 + 1 + 0 + + + 32 + 424 + 860 + 1 + 0 + + + 1099 + 431 + 868 + 0 + 0 + + + 1092 + 431 + 866 + 0 + 0 + + + 1086 + 431 + 865 + 4 + 0 + + + 1100 + 430 + 870 + 6 + 0 + + + 1092 + 430 + 867 + 0 + 0 + + + 1091 + 430 + 865 + 0 + 0 + + + 1100 + 429 + 868 + 0 + 0 + + + 1099 + 429 + 866 + 0 + 0 + + + 1099 + 428 + 870 + 5 + 0 + + + 1092 + 428 + 867 + 0 + 0 + + + 1099 + 428 + 865 + 0 + 0 + + + 164 + 427 + 869 + 3 + 0 + + + 164 + 427 + 868 + 1 + 0 + + + 164 + 427 + 867 + 2 + 0 + + + 1176 + 425 + 870 + 0 + 0 + + + 32 + 431 + 879 + 6 + 0 + + + 394 + 430 + 876 + 4 + 0 + + + 404 + 430 + 872 + 5 + 0 + + + 398 + 428 + 878 + 2 + 0 + + + 399 + 427 + 875 + 1 + 0 + + + 403 + 427 + 872 + 0 + 0 + + + 395 + 425 + 874 + 0 + 0 + + + 1113 + 424 + 878 + 0 + 0 + + + 204 + 431 + 867 + 2 + 1 + + + 204 + 430 + 868 + 2 + 1 + + + 204 + 430 + 866 + 2 + 1 + + + 204 + 429 + 867 + 3 + 1 + + + 204 + 429 + 865 + 3 + 1 + + + 204 + 428 + 868 + 3 + 1 + + + 204 + 428 + 866 + 3 + 1 + + + 395 + 422 + 844 + 2 + 0 + + + 32 + 421 + 842 + 6 + 0 + + + 33 + 418 + 841 + 7 + 0 + + + 33 + 423 + 854 + 2 + 0 + + + 32 + 423 + 851 + 5 + 0 + + + 394 + 422 + 855 + 3 + 0 + + + 768 + 419 + 853 + 2 + 0 + + + 33 + 417 + 852 + 6 + 0 + + + 396 + 416 + 855 + 7 + 0 + + + 395 + 423 + 860 + 2 + 0 + + + 33 + 423 + 858 + 0 + 0 + + + 32 + 422 + 861 + 4 + 0 + + + 401 + 422 + 860 + 3 + 0 + + + 395 + 422 + 858 + 0 + 0 + + + 394 + 421 + 861 + 5 + 0 + + + 397 + 420 + 861 + 6 + 0 + + + 32 + 420 + 860 + 7 + 0 + + + 32 + 420 + 856 + 0 + 0 + + + 396 + 419 + 861 + 1 + 0 + + + 33 + 419 + 860 + 7 + 0 + + + 395 + 418 + 861 + 0 + 0 + + + 33 + 418 + 858 + 3 + 0 + + + 403 + 417 + 861 + 1 + 0 + + + 32 + 417 + 860 + 2 + 0 + + + 394 + 416 + 861 + 0 + 0 + + + 395 + 419 + 864 + 0 + 0 + + + 1176 + 417 + 870 + 0 + 0 + + + 397 + 423 + 875 + 7 + 0 + + + 32 + 423 + 872 + 1 + 0 + + + 394 + 420 + 878 + 5 + 0 + + + 33 + 420 + 875 + 6 + 0 + + + 395 + 419 + 873 + 3 + 0 + + + 32 + 417 + 879 + 2 + 0 + + + 397 + 417 + 876 + 2 + 0 + + + 32 + 416 + 873 + 2 + 0 + + + 1 + 422 + 847 + 1 + 1 + + + 2 + 418 + 844 + 0 + 1 + + + 1 + 418 + 851 + 0 + 1 + + + 33 + 415 + 841 + 0 + 0 + + + 396 + 414 + 844 + 1 + 0 + + + 394 + 413 + 847 + 1 + 0 + + + 396 + 412 + 845 + 0 + 0 + + + 404 + 411 + 841 + 3 + 0 + + + 394 + 414 + 854 + 7 + 0 + + + 396 + 414 + 851 + 5 + 0 + + + 396 + 412 + 854 + 6 + 0 + + + 403 + 409 + 855 + 4 + 0 + + + 32 + 415 + 862 + 0 + 0 + + + 32 + 415 + 861 + 0 + 0 + + + 395 + 414 + 861 + 0 + 0 + + + 33 + 414 + 858 + 2 + 0 + + + 401 + 413 + 861 + 3 + 0 + + + 98 + 413 + 860 + 5 + 0 + + + 32 + 413 + 859 + 1 + 0 + + + 403 + 412 + 862 + 4 + 0 + + + 98 + 412 + 861 + 5 + 0 + + + 33 + 412 + 860 + 3 + 0 + + + 98 + 411 + 861 + 5 + 0 + + + 396 + 411 + 858 + 2 + 0 + + + 99 + 410 + 861 + 5 + 0 + + + 33 + 409 + 861 + 5 + 0 + + + 394 + 409 + 860 + 5 + 0 + + + 396 + 408 + 860 + 5 + 0 + + + 33 + 408 + 858 + 3 + 0 + + + 394 + 408 + 864 + 0 + 0 + + + 33 + 415 + 876 + 2 + 0 + + + 398 + 413 + 874 + 2 + 0 + + + 1113 + 411 + 878 + 2 + 0 + + + 395 + 410 + 875 + 2 + 0 + + + 394 + 408 + 877 + 2 + 0 + + + 1 + 415 + 847 + 1 + 1 + + + 2 + 412 + 850 + 2 + 1 + + + 404 + 407 + 843 + 3 + 0 + + + 779 + 404 + 846 + 5 + 0 + + + 290 + 402 + 842 + 6 + 0 + + + 32 + 407 + 853 + 1 + 0 + + + 395 + 405 + 849 + 7 + 0 + + + 29 + 403 + 850 + 4 + 0 + + + 33 + 407 + 860 + 5 + 0 + + + 32 + 406 + 861 + 5 + 0 + + + 395 + 406 + 860 + 5 + 0 + + + 394 + 406 + 856 + 2 + 0 + + + 404 + 405 + 861 + 5 + 0 + + + 33 + 405 + 857 + 3 + 0 + + + 394 + 404 + 861 + 5 + 0 + + + 33 + 403 + 861 + 5 + 0 + + + 395 + 402 + 861 + 5 + 0 + + + 403 + 402 + 856 + 5 + 0 + + + 396 + 401 + 861 + 5 + 0 + + + 401 + 401 + 860 + 5 + 0 + + + 32 + 400 + 861 + 5 + 0 + + + 1100 + 401 + 870 + 0 + 0 + + + 395 + 401 + 864 + 0 + 0 + + + 1086 + 400 + 870 + 7 + 0 + + + 1099 + 400 + 869 + 2 + 0 + + + 1086 + 400 + 867 + 5 + 0 + + + 404 + 407 + 874 + 2 + 0 + + + 33 + 405 + 876 + 1 + 0 + + + 396 + 405 + 873 + 2 + 0 + + + 32 + 403 + 879 + 2 + 0 + + + 395 + 402 + 873 + 0 + 0 + + + 398 + 401 + 876 + 2 + 0 + + + 1099 + 401 + 872 + 7 + 0 + + + 1086 + 400 + 872 + 6 + 0 + + + 2 + 407 + 847 + 2 + 1 + + + 2 + 400 + 845 + 0 + 1 + + + 1 + 405 + 851 + 1 + 1 + + + 1 + 402 + 855 + 0 + 1 + + + 1 + 401 + 848 + 0 + 1 + + + 204 + 402 + 871 + 2 + 1 + + + 204 + 401 + 869 + 2 + 1 + + + 204 + 401 + 867 + 2 + 1 + + + 395 + 399 + 847 + 0 + 0 + + + 3 + 399 + 843 + 4 + 0 + + + 3 + 399 + 842 + 4 + 0 + + + 118 + 399 + 840 + 0 + 0 + + + 23 + 398 + 842 + 6 + 0 + + + 32 + 395 + 844 + 6 + 0 + + + 396 + 394 + 846 + 5 + 0 + + + 395 + 393 + 843 + 5 + 0 + + + 394 + 393 + 841 + 4 + 0 + + + 164 + 392 + 846 + 0 + 0 + + + 33 + 392 + 844 + 6 + 0 + + + 29 + 399 + 852 + 4 + 0 + + + 401 + 394 + 854 + 0 + 0 + + + 712 + 394 + 851 + 0 + 0 + + + 164 + 393 + 855 + 0 + 0 + + + 403 + 393 + 853 + 0 + 0 + + + 404 + 393 + 850 + 0 + 0 + + + 405 + 393 + 848 + 2 + 0 + + + 98 + 399 + 861 + 7 + 0 + + + 99 + 398 + 861 + 6 + 0 + + + 98 + 397 + 861 + 5 + 0 + + + 395 + 397 + 860 + 5 + 0 + + + 32 + 396 + 860 + 5 + 0 + + + 395 + 395 + 860 + 5 + 0 + + + 401 + 394 + 861 + 5 + 0 + + + 396 + 394 + 860 + 5 + 0 + + + 405 + 393 + 861 + 0 + 0 + + + 402 + 393 + 860 + 0 + 0 + + + 402 + 392 + 861 + 2 + 0 + + + 401 + 392 + 860 + 0 + 0 + + + 164 + 392 + 857 + 5 + 0 + + + 164 + 392 + 856 + 0 + 0 + + + 1091 + 399 + 870 + 0 + 0 + + + 397 + 399 + 865 + 0 + 0 + + + 1086 + 398 + 870 + 1 + 0 + + + 1100 + 398 + 869 + 2 + 0 + + + 1092 + 398 + 867 + 1 + 0 + + + 1092 + 397 + 870 + 2 + 0 + + + 1100 + 397 + 867 + 0 + 0 + + + 396 + 397 + 864 + 0 + 0 + + + 1099 + 396 + 870 + 0 + 0 + + + 1091 + 396 + 869 + 2 + 0 + + + 1091 + 395 + 870 + 4 + 0 + + + 1086 + 395 + 867 + 1 + 0 + + + 394 + 395 + 865 + 0 + 0 + + + 1092 + 394 + 870 + 5 + 0 + + + 1099 + 394 + 869 + 2 + 0 + + + 398 + 393 + 865 + 0 + 0 + + + 403 + 399 + 879 + 0 + 0 + + + 399 + 399 + 874 + 2 + 0 + + + 1091 + 398 + 872 + 5 + 0 + + + 404 + 397 + 877 + 0 + 0 + + + 397 + 396 + 875 + 1 + 0 + + + 1092 + 396 + 872 + 4 + 0 + + + 1176 + 394 + 874 + 0 + 0 + + + 1099 + 394 + 872 + 3 + 0 + + + 403 + 393 + 877 + 5 + 0 + + + 1 + 395 + 840 + 0 + 1 + + + 1 + 399 + 851 + 1 + 1 + + + 204 + 399 + 869 + 3 + 1 + + + 204 + 399 + 867 + 3 + 1 + + + 204 + 397 + 869 + 2 + 1 + + + 204 + 396 + 867 + 2 + 1 + + + 204 + 395 + 869 + 3 + 1 + + + 204 + 394 + 867 + 3 + 1 + + + 204 + 393 + 871 + 3 + 1 + + + 204 + 399 + 873 + 0 + 1 + + + 204 + 397 + 873 + 0 + 1 + + + 204 + 395 + 873 + 0 + 1 + + + 33 + 391 + 845 + 0 + 0 + + + 404 + 390 + 844 + 7 + 0 + + + 396 + 390 + 841 + 0 + 0 + + + 32 + 389 + 844 + 0 + 0 + + + 164 + 388 + 843 + 2 + 0 + + + 394 + 387 + 841 + 0 + 0 + + + 164 + 386 + 847 + 7 + 0 + + + 404 + 386 + 846 + 0 + 0 + + + 99 + 385 + 845 + 6 + 0 + + + 403 + 385 + 844 + 6 + 0 + + + 402 + 385 + 843 + 6 + 0 + + + 401 + 385 + 842 + 6 + 0 + + + 405 + 385 + 841 + 6 + 0 + + + 397 + 385 + 840 + 2 + 0 + + + 99 + 384 + 847 + 3 + 0 + + + 100 + 384 + 846 + 4 + 0 + + + 98 + 384 + 845 + 5 + 0 + + + 611 + 388 + 851 + 0 + 0 + + + 402 + 386 + 848 + 0 + 0 + + + 613 + 384 + 851 + 0 + 0 + + + 32 + 384 + 848 + 3 + 0 + + + 400 + 391 + 861 + 2 + 0 + + + 164 + 391 + 858 + 6 + 0 + + + 32 + 391 + 857 + 4 + 0 + + + 33 + 390 + 861 + 2 + 0 + + + 396 + 390 + 860 + 2 + 0 + + + 164 + 390 + 857 + 3 + 0 + + + 394 + 389 + 860 + 2 + 0 + + + 32 + 388 + 860 + 2 + 0 + + + 395 + 388 + 859 + 2 + 0 + + + 98 + 387 + 859 + 2 + 0 + + + 98 + 386 + 858 + 2 + 0 + + + 98 + 386 + 857 + 1 + 0 + + + 403 + 385 + 860 + 2 + 0 + + + 402 + 385 + 858 + 2 + 0 + + + 98 + 385 + 857 + 2 + 0 + + + 394 + 387 + 866 + 0 + 0 + + + 395 + 384 + 865 + 0 + 0 + + + 395 + 391 + 873 + 1 + 0 + + + 404 + 389 + 878 + 5 + 0 + + + 32 + 389 + 875 + 5 + 0 + + + 405 + 387 + 874 + 0 + 0 + + + 396 + 385 + 877 + 6 + 0 + + + 399 + 385 + 873 + 7 + 0 + + + 33 + 381 + 845 + 0 + 0 + + + 32 + 381 + 843 + 4 + 0 + + + 32 + 379 + 847 + 0 + 0 + + + 403 + 378 + 845 + 0 + 0 + + + 399 + 376 + 841 + 4 + 0 + + + 398 + 379 + 854 + 0 + 0 + + + 396 + 378 + 850 + 0 + 0 + + + 399 + 376 + 852 + 0 + 0 + + + 33 + 382 + 856 + 0 + 0 + + + 401 + 381 + 862 + 4 + 0 + + + 32 + 381 + 859 + 0 + 0 + + + 397 + 379 + 861 + 4 + 0 + + + 396 + 379 + 857 + 0 + 0 + + + 33 + 378 + 858 + 0 + 0 + + + 402 + 377 + 862 + 4 + 0 + + + 403 + 376 + 856 + 0 + 0 + + + 403 + 383 + 876 + 5 + 0 + + + 395 + 380 + 878 + 5 + 0 + + + 394 + 379 + 874 + 5 + 0 + + + 398 + 377 + 877 + 4 + 0 + + + 401 + 375 + 847 + 0 + 0 + + + 405 + 375 + 844 + 4 + 0 + + + 32 + 373 + 842 + 0 + 0 + + + 33 + 372 + 847 + 0 + 0 + + + 33 + 371 + 841 + 0 + 0 + + + 33 + 369 + 843 + 4 + 0 + + + 402 + 368 + 847 + 0 + 0 + + + 399 + 373 + 855 + 0 + 0 + + + 404 + 373 + 850 + 0 + 0 + + + 401 + 372 + 853 + 0 + 0 + + + 395 + 369 + 852 + 0 + 0 + + + 398 + 368 + 854 + 0 + 0 + + + 405 + 375 + 861 + 4 + 0 + + + 397 + 375 + 858 + 0 + 0 + + + 33 + 374 + 857 + 0 + 0 + + + 403 + 372 + 862 + 4 + 0 + + + 396 + 372 + 858 + 0 + 0 + + + 33 + 370 + 861 + 0 + 0 + + + 397 + 370 + 857 + 0 + 0 + + + 32 + 369 + 859 + 0 + 0 + + + 33 + 368 + 862 + 0 + 0 + + + 403 + 375 + 872 + 5 + 0 + + + 404 + 373 + 878 + 4 + 0 + + + 397 + 372 + 875 + 4 + 0 + + + 396 + 370 + 878 + 4 + 0 + + + 430 + 369 + 876 + 0 + 0 + + + 1176 + 369 + 872 + 0 + 0 + + + 397 + 365 + 847 + 0 + 0 + + + 404 + 365 + 843 + 0 + 0 + + + 403 + 363 + 847 + 0 + 0 + + + 394 + 363 + 841 + 0 + 0 + + + 395 + 361 + 844 + 0 + 0 + + + 397 + 360 + 847 + 0 + 0 + + + 397 + 360 + 841 + 0 + 0 + + + 396 + 367 + 850 + 0 + 0 + + + 397 + 366 + 852 + 0 + 0 + + + 396 + 365 + 855 + 0 + 0 + + + 403 + 365 + 849 + 0 + 0 + + + 404 + 363 + 853 + 0 + 0 + + + 405 + 363 + 850 + 0 + 0 + + + 399 + 362 + 855 + 0 + 0 + + + 397 + 360 + 852 + 0 + 0 + + + 395 + 366 + 859 + 0 + 0 + + + 397 + 364 + 857 + 0 + 0 + + + 32 + 363 + 861 + 0 + 0 + + + 398 + 363 + 859 + 0 + 0 + + + 33 + 361 + 857 + 0 + 0 + + + 395 + 360 + 862 + 0 + 0 + + + 403 + 361 + 871 + 5 + 0 + + + 1091 + 360 + 871 + 4 + 0 + + + 1092 + 360 + 869 + 7 + 0 + + + 1091 + 360 + 867 + 1 + 0 + + + 398 + 360 + 864 + 4 + 0 + + + 34 + 367 + 875 + 7 + 0 + + + 1176 + 363 + 877 + 0 + 0 + + + 395 + 363 + 873 + 7 + 0 + + + 397 + 361 + 875 + 7 + 0 + + + 204 + 360 + 868 + 3 + 1 + + + 204 + 360 + 872 + 2 + 1 + + + 403 + 358 + 845 + 0 + 0 + + + 396 + 357 + 843 + 0 + 0 + + + 401 + 356 + 840 + 0 + 0 + + + 401 + 355 + 845 + 4 + 0 + + + 404 + 354 + 847 + 4 + 0 + + + 399 + 354 + 843 + 4 + 0 + + + 403 + 353 + 841 + 4 + 0 + + + 398 + 358 + 854 + 0 + 0 + + + 396 + 358 + 851 + 0 + 0 + + + 395 + 354 + 854 + 4 + 0 + + + 32 + 354 + 850 + 4 + 0 + + + 401 + 359 + 856 + 0 + 0 + + + 32 + 358 + 862 + 0 + 0 + + + 394 + 358 + 859 + 0 + 0 + + + 402 + 357 + 857 + 0 + 0 + + + 399 + 355 + 856 + 4 + 0 + + + 33 + 354 + 862 + 4 + 0 + + + 396 + 354 + 858 + 4 + 0 + + + 401 + 352 + 856 + 4 + 0 + + + 1091 + 359 + 869 + 0 + 0 + + + 1086 + 358 + 871 + 4 + 0 + + + 1086 + 358 + 869 + 1 + 0 + + + 1092 + 358 + 867 + 2 + 0 + + + 1092 + 357 + 869 + 2 + 0 + + + 397 + 357 + 865 + 5 + 0 + + + 1092 + 356 + 871 + 4 + 0 + + + 1091 + 356 + 869 + 3 + 0 + + + 1091 + 356 + 867 + 3 + 0 + + + 1086 + 355 + 869 + 3 + 0 + + + 1091 + 354 + 871 + 4 + 0 + + + 395 + 359 + 875 + 7 + 0 + + + 394 + 357 + 876 + 7 + 0 + + + 396 + 355 + 878 + 5 + 0 + + + 395 + 355 + 874 + 5 + 0 + + + 34 + 353 + 875 + 5 + 0 + + + 394 + 352 + 879 + 7 + 0 + + + 204 + 359 + 871 + 0 + 1 + + + 204 + 359 + 867 + 0 + 1 + + + 204 + 358 + 868 + 2 + 1 + + + 204 + 357 + 871 + 0 + 1 + + + 204 + 357 + 867 + 0 + 1 + + + 204 + 356 + 868 + 3 + 1 + + + 204 + 355 + 871 + 0 + 1 + + + 204 + 358 + 872 + 3 + 1 + + + 204 + 356 + 872 + 2 + 1 + + + 204 + 354 + 872 + 3 + 1 + + + 396 + 351 + 844 + 4 + 0 + + + 394 + 351 + 840 + 0 + 0 + + + 403 + 349 + 847 + 4 + 0 + + + 398 + 349 + 843 + 4 + 0 + + + 398 + 348 + 841 + 4 + 0 + + + 404 + 347 + 846 + 4 + 0 + + + 405 + 346 + 843 + 0 + 0 + + + 33 + 345 + 840 + 0 + 0 + + + 401 + 351 + 854 + 4 + 0 + + + 401 + 350 + 852 + 4 + 0 + + + 405 + 350 + 849 + 4 + 0 + + + 404 + 349 + 855 + 4 + 0 + + + 402 + 348 + 850 + 4 + 0 + + + 403 + 346 + 853 + 4 + 0 + + + 32 + 346 + 851 + 4 + 0 + + + 397 + 345 + 848 + 4 + 0 + + + 401 + 344 + 852 + 4 + 0 + + + 398 + 351 + 858 + 4 + 0 + + + 405 + 350 + 861 + 0 + 0 + + + 397 + 349 + 859 + 4 + 0 + + + 394 + 347 + 856 + 4 + 0 + + + 398 + 346 + 858 + 4 + 0 + + + 33 + 345 + 861 + 4 + 0 + + + 399 + 345 + 856 + 4 + 0 + + + 396 + 351 + 865 + 5 + 0 + + + 403 + 349 + 872 + 5 + 0 + + + 395 + 348 + 877 + 5 + 0 + + + 32 + 345 + 873 + 5 + 0 + + + 397 + 344 + 876 + 5 + 0 + + + 396 + 342 + 845 + 4 + 0 + + + 395 + 342 + 842 + 4 + 0 + + + 397 + 341 + 847 + 4 + 0 + + + 404 + 339 + 846 + 4 + 0 + + + 405 + 339 + 843 + 4 + 0 + + + 32 + 337 + 841 + 4 + 0 + + + 395 + 343 + 855 + 4 + 0 + + + 402 + 342 + 849 + 4 + 0 + + + 403 + 341 + 854 + 4 + 0 + + + 397 + 341 + 852 + 4 + 0 + + + 401 + 340 + 850 + 4 + 0 + + + 396 + 338 + 853 + 4 + 0 + + + 405 + 338 + 850 + 4 + 0 + + + 397 + 337 + 848 + 4 + 0 + + + 32 + 336 + 855 + 4 + 0 + + + 403 + 342 + 860 + 4 + 0 + + + 394 + 342 + 857 + 4 + 0 + + + 404 + 340 + 856 + 4 + 0 + + + 399 + 339 + 859 + 4 + 0 + + + 405 + 337 + 861 + 4 + 0 + + + 397 + 337 + 857 + 4 + 0 + + + 33 + 336 + 859 + 4 + 0 + + + 399 + 340 + 877 + 5 + 0 + + + 395 + 342 + 832 + 0 + 0 + + + 33 + 341 + 839 + 0 + 0 + + + 404 + 340 + 834 + 4 + 0 + + + 403 + 338 + 836 + 4 + 0 + + + 32 + 336 + 837 + 4 + 0 + + + 403 + 349 + 837 + 4 + 0 + + + 401 + 349 + 832 + 4 + 0 + + + 32 + 347 + 835 + 0 + 0 + + + 401 + 344 + 835 + 4 + 0 + + + 401 + 359 + 839 + 0 + 0 + + + 403 + 358 + 836 + 0 + 0 + + + 32 + 357 + 838 + 0 + 0 + + + 396 + 356 + 834 + 0 + 0 + + + 401 + 354 + 838 + 4 + 0 + + + 404 + 352 + 836 + 4 + 0 + + + 32 + 352 + 833 + 0 + 0 + + + 397 + 343 + 826 + 7 + 0 + + + 32 + 341 + 828 + 1 + 0 + + + 394 + 339 + 825 + 1 + 0 + + + 32 + 337 + 828 + 4 + 0 + + + 33 + 336 + 831 + 4 + 0 + + + 394 + 351 + 830 + 0 + 0 + + + 396 + 351 + 825 + 1 + 0 + + + 33 + 350 + 827 + 1 + 0 + + + 402 + 348 + 825 + 7 + 0 + + + 405 + 346 + 830 + 0 + 0 + + + 404 + 346 + 827 + 1 + 0 + + + 394 + 358 + 830 + 0 + 0 + + + 32 + 357 + 828 + 4 + 0 + + + 395 + 355 + 831 + 0 + 0 + + + 405 + 355 + 827 + 1 + 0 + + + 404 + 354 + 825 + 4 + 0 + + + 33 + 353 + 829 + 0 + 0 + + + 396 + 343 + 823 + 1 + 0 + + + 401 + 342 + 821 + 7 + 0 + + + 32 + 340 + 820 + 1 + 0 + + + 403 + 340 + 817 + 7 + 0 + + + 403 + 336 + 822 + 4 + 0 + + + 32 + 336 + 818 + 4 + 0 + + + 401 + 350 + 823 + 7 + 0 + + + 398 + 350 + 819 + 7 + 0 + + + 403 + 349 + 817 + 7 + 0 + + + 33 + 348 + 820 + 1 + 0 + + + 395 + 347 + 823 + 1 + 0 + + + 405 + 346 + 817 + 1 + 0 + + + 403 + 345 + 821 + 7 + 0 + + + 397 + 344 + 819 + 6 + 0 + + + 395 + 344 + 817 + 4 + 0 + + + 394 + 367 + 828 + 1 + 0 + + + 32 + 366 + 825 + 1 + 0 + + + 99 + 365 + 827 + 2 + 0 + + + 98 + 364 + 827 + 4 + 0 + + + 98 + 364 + 825 + 1 + 0 + + + 395 + 363 + 831 + 0 + 0 + + + 100 + 363 + 828 + 2 + 0 + + + 405 + 362 + 828 + 1 + 0 + + + 98 + 361 + 828 + 1 + 0 + + + 401 + 367 + 832 + 4 + 0 + + + 398 + 366 + 839 + 0 + 0 + + + 403 + 366 + 835 + 0 + 0 + + + 396 + 365 + 832 + 0 + 0 + + + 405 + 363 + 838 + 0 + 0 + + + 399 + 362 + 835 + 0 + 0 + + + 397 + 360 + 837 + 0 + 0 + + + 404 + 360 + 832 + 0 + 0 + + + 396 + 373 + 838 + 3 + 0 + + + 402 + 373 + 835 + 4 + 0 + + + 401 + 371 + 835 + 4 + 0 + + + 32 + 370 + 839 + 0 + 0 + + + 403 + 370 + 837 + 4 + 0 + + + 394 + 370 + 833 + 4 + 0 + + + 402 + 368 + 834 + 4 + 0 + + + 395 + 381 + 837 + 4 + 0 + + + 401 + 381 + 833 + 0 + 0 + + + 397 + 379 + 839 + 4 + 0 + + + 404 + 377 + 835 + 4 + 0 + + + 401 + 376 + 838 + 4 + 0 + + + 395 + 376 + 832 + 0 + 0 + + + 192 + 391 + 836 + 0 + 0 + + + 403 + 390 + 838 + 2 + 0 + + + 192 + 389 + 834 + 0 + 0 + + + 32 + 388 + 839 + 1 + 0 + + + 33 + 387 + 832 + 1 + 0 + + + 99 + 386 + 837 + 6 + 0 + + + 395 + 385 + 839 + 2 + 0 + + + 400 + 385 + 838 + 2 + 0 + + + 98 + 385 + 837 + 6 + 0 + + + 32 + 385 + 836 + 0 + 0 + + + 98 + 384 + 836 + 2 + 0 + + + 98 + 384 + 835 + 0 + 0 + + + 98 + 384 + 833 + 3 + 0 + + + 98 + 384 + 832 + 2 + 0 + + + 192 + 399 + 836 + 0 + 0 + + + 21 + 396 + 836 + 4 + 0 + + + 21 + 396 + 835 + 6 + 0 + + + 192 + 396 + 833 + 0 + 0 + + + 5 + 395 + 838 + 0 + 0 + + + 21 + 394 + 836 + 4 + 0 + + + 21 + 394 + 835 + 6 + 0 + + + 33 + 393 + 832 + 0 + 0 + + + 33 + 392 + 838 + 3 + 0 + + + 33 + 422 + 833 + 6 + 0 + + + 396 + 421 + 835 + 3 + 0 + + + 394 + 419 + 833 + 6 + 0 + + + 32 + 418 + 836 + 7 + 0 + + + 33 + 471 + 817 + 1 + 0 + + + 399 + 470 + 818 + 1 + 0 + + + 32 + 469 + 816 + 1 + 0 + + + 396 + 468 + 818 + 1 + 0 + + + 394 + 467 + 818 + 1 + 0 + + + 397 + 467 + 816 + 1 + 0 + + + 33 + 466 + 819 + 1 + 0 + + + 398 + 465 + 818 + 1 + 0 + + + 395 + 465 + 817 + 1 + 0 + + + 32 + 464 + 816 + 1 + 0 + + + 398 + 471 + 814 + 0 + 0 + + + 32 + 471 + 813 + 0 + 0 + + + 401 + 471 + 808 + 0 + 0 + + + 404 + 470 + 810 + 4 + 0 + + + 405 + 469 + 813 + 0 + 0 + + + 404 + 468 + 815 + 0 + 0 + + + 399 + 468 + 811 + 0 + 0 + + + 404 + 468 + 809 + 0 + 0 + + + 32 + 466 + 814 + 0 + 0 + + + 32 + 466 + 812 + 0 + 0 + + + 403 + 466 + 810 + 0 + 0 + + + 397 + 464 + 814 + 3 + 0 + + + 395 + 464 + 808 + 0 + 0 + + + 398 + 471 + 806 + 0 + 0 + + + 405 + 471 + 804 + 0 + 0 + + + 33 + 471 + 800 + 0 + 0 + + + 397 + 470 + 802 + 0 + 0 + + + 33 + 469 + 807 + 3 + 0 + + + 396 + 468 + 804 + 0 + 0 + + + 32 + 468 + 800 + 0 + 0 + + + 402 + 467 + 807 + 0 + 0 + + + 398 + 467 + 802 + 0 + 0 + + + 397 + 466 + 806 + 0 + 0 + + + 32 + 466 + 803 + 5 + 0 + + + 33 + 464 + 805 + 0 + 0 + + + 399 + 464 + 802 + 0 + 0 + + + 401 + 471 + 796 + 6 + 0 + + + 564 + 471 + 795 + 1 + 0 + + + 564 + 471 + 794 + 0 + 0 + + + 397 + 470 + 799 + 0 + 0 + + + 402 + 470 + 796 + 0 + 0 + + + 401 + 470 + 795 + 1 + 0 + + + 564 + 470 + 794 + 7 + 0 + + + 430 + 470 + 793 + 1 + 0 + + + 396 + 469 + 795 + 6 + 0 + + + 404 + 468 + 797 + 0 + 0 + + + 402 + 468 + 794 + 6 + 0 + + + 401 + 467 + 796 + 0 + 0 + + + 396 + 466 + 799 + 0 + 0 + + + 401 + 466 + 797 + 6 + 0 + + + 396 + 466 + 792 + 2 + 0 + + + 402 + 465 + 797 + 6 + 0 + + + 403 + 464 + 799 + 0 + 0 + + + 402 + 464 + 797 + 6 + 0 + + + 396 + 476 + 795 + 7 + 0 + + + 401 + 476 + 794 + 6 + 0 + + + 218 + 476 + 793 + 6 + 0 + + + 32 + 476 + 792 + 0 + 0 + + + 402 + 475 + 799 + 2 + 0 + + + 396 + 475 + 797 + 6 + 0 + + + 401 + 475 + 793 + 5 + 0 + + + 402 + 474 + 799 + 2 + 0 + + + 397 + 474 + 795 + 5 + 0 + + + 397 + 474 + 793 + 5 + 0 + + + 36 + 473 + 797 + 1 + 0 + + + 32 + 473 + 796 + 2 + 0 + + + 401 + 473 + 793 + 0 + 0 + + + 396 + 472 + 799 + 4 + 0 + + + 402 + 472 + 797 + 6 + 0 + + + 36 + 472 + 796 + 1 + 0 + + + 36 + 472 + 795 + 1 + 0 + + + 401 + 472 + 794 + 5 + 0 + + + 396 + 472 + 793 + 1 + 0 + + + 401 + 477 + 807 + 0 + 0 + + + 402 + 477 + 806 + 2 + 0 + + + 402 + 477 + 805 + 2 + 0 + + + 401 + 477 + 804 + 2 + 0 + + + 402 + 476 + 803 + 2 + 0 + + + 401 + 476 + 801 + 7 + 0 + + + 401 + 476 + 800 + 7 + 0 + + + 398 + 475 + 807 + 0 + 0 + + + 394 + 475 + 805 + 0 + 0 + + + 402 + 475 + 802 + 5 + 0 + + + 404 + 475 + 800 + 2 + 0 + + + 399 + 473 + 806 + 0 + 0 + + + 32 + 473 + 804 + 0 + 0 + + + 396 + 473 + 801 + 5 + 0 + + + 401 + 477 + 808 + 0 + 0 + + + 399 + 476 + 813 + 0 + 0 + + + 33 + 476 + 811 + 3 + 0 + + + 401 + 476 + 809 + 0 + 0 + + + 401 + 476 + 808 + 0 + 0 + + + 396 + 475 + 814 + 0 + 0 + + + 32 + 475 + 812 + 0 + 0 + + + 398 + 474 + 811 + 0 + 0 + + + 397 + 474 + 809 + 0 + 0 + + + 397 + 473 + 813 + 0 + 0 + + + 403 + 472 + 811 + 6 + 0 + + + 396 + 472 + 808 + 0 + 0 + + + 397 + 474 + 819 + 1 + 0 + + + 395 + 474 + 817 + 1 + 0 + + + 397 + 473 + 817 + 1 + 0 + + + 32 + 472 + 820 + 1 + 0 + + + 398 + 472 + 818 + 1 + 0 + + + 405 + 474 + 825 + 4 + 0 + + + 396 + 473 + 827 + 5 + 0 + + + 688 + 473 + 825 + 4 + 0 + + + 405 + 472 + 824 + 0 + 0 + + + 405 + 455 + 789 + 3 + 0 + + + 404 + 455 + 785 + 0 + 0 + + + 394 + 454 + 791 + 5 + 0 + + + 397 + 454 + 787 + 7 + 0 + + + 403 + 453 + 784 + 7 + 0 + + + 32 + 452 + 789 + 6 + 0 + + + 396 + 452 + 787 + 7 + 0 + + + 397 + 452 + 785 + 7 + 0 + + + 397 + 451 + 784 + 7 + 0 + + + 396 + 450 + 791 + 1 + 0 + + + 404 + 450 + 789 + 4 + 0 + + + 396 + 449 + 787 + 4 + 0 + + + 394 + 448 + 789 + 2 + 0 + + + 402 + 448 + 784 + 2 + 0 + + + 396 + 463 + 790 + 2 + 0 + + + 403 + 463 + 788 + 0 + 0 + + + 396 + 463 + 784 + 0 + 0 + + + 397 + 462 + 786 + 2 + 0 + + + 401 + 461 + 791 + 2 + 0 + + + 402 + 461 + 788 + 2 + 0 + + + 398 + 460 + 789 + 2 + 0 + + + 394 + 460 + 785 + 3 + 0 + + + 399 + 459 + 787 + 2 + 0 + + + 401 + 458 + 791 + 0 + 0 + + + 396 + 458 + 789 + 0 + 0 + + + 399 + 458 + 784 + 7 + 0 + + + 398 + 457 + 786 + 7 + 0 + + + 404 + 456 + 790 + 2 + 0 + + + 401 + 471 + 789 + 2 + 0 + + + 404 + 471 + 784 + 0 + 0 + + + 394 + 470 + 790 + 6 + 0 + + + 401 + 470 + 788 + 3 + 0 + + + 404 + 470 + 786 + 0 + 0 + + + 401 + 469 + 791 + 7 + 0 + + + 397 + 468 + 789 + 2 + 0 + + + 403 + 468 + 787 + 2 + 0 + + + 33 + 467 + 785 + 4 + 0 + + + 404 + 466 + 789 + 3 + 0 + + + 394 + 465 + 791 + 2 + 0 + + + 405 + 465 + 785 + 4 + 0 + + + 404 + 464 + 786 + 0 + 0 + + + 403 + 476 + 787 + 1 + 0 + + + 401 + 475 + 786 + 7 + 0 + + + 32 + 475 + 784 + 5 + 0 + + + 405 + 474 + 790 + 0 + 0 + + + 397 + 474 + 789 + 5 + 0 + + + 396 + 474 + 787 + 0 + 0 + + + 401 + 474 + 785 + 7 + 0 + + + 404 + 473 + 791 + 4 + 0 + + + 36 + 473 + 788 + 1 + 0 + + + 401 + 472 + 791 + 5 + 0 + + + 36 + 472 + 789 + 1 + 0 + + + 36 + 472 + 788 + 1 + 0 + + + 396 + 472 + 786 + 0 + 0 + + + 554 + 447 + 778 + 7 + 0 + + + 8 + 447 + 776 + 2 + 0 + + + 399 + 446 + 782 + 2 + 0 + + + 554 + 446 + 780 + 5 + 0 + + + 97 + 446 + 779 + 4 + 0 + + + 97 + 446 + 778 + 4 + 0 + + + 8 + 446 + 776 + 3 + 0 + + + 401 + 445 + 782 + 0 + 0 + + + 97 + 445 + 779 + 4 + 0 + + + 97 + 445 + 778 + 4 + 0 + + + 399 + 444 + 782 + 0 + 0 + + + 554 + 444 + 779 + 3 + 0 + + + 402 + 444 + 777 + 2 + 0 + + + 401 + 443 + 783 + 2 + 0 + + + 404 + 443 + 780 + 2 + 0 + + + 403 + 443 + 777 + 2 + 0 + + + 401 + 442 + 776 + 2 + 0 + + + 397 + 441 + 781 + 3 + 0 + + + 402 + 441 + 779 + 2 + 0 + + + 396 + 440 + 783 + 3 + 0 + + + 402 + 440 + 777 + 3 + 0 + + + 398 + 455 + 779 + 4 + 0 + + + 395 + 454 + 782 + 7 + 0 + + + 403 + 453 + 780 + 4 + 0 + + + 397 + 453 + 777 + 4 + 0 + + + 401 + 452 + 782 + 7 + 0 + + + 403 + 451 + 776 + 3 + 0 + + + 396 + 450 + 783 + 7 + 0 + + + 401 + 450 + 781 + 2 + 0 + + + 402 + 450 + 778 + 2 + 0 + + + 403 + 448 + 781 + 2 + 0 + + + 397 + 463 + 782 + 0 + 0 + + + 32 + 463 + 778 + 0 + 0 + + + 401 + 461 + 783 + 3 + 0 + + + 395 + 461 + 781 + 5 + 0 + + + 33 + 461 + 777 + 2 + 0 + + + 396 + 459 + 779 + 4 + 0 + + + 404 + 458 + 781 + 4 + 0 + + + 399 + 457 + 778 + 4 + 0 + + + 402 + 456 + 783 + 7 + 0 + + + 403 + 471 + 780 + 2 + 0 + + + 399 + 471 + 778 + 0 + 0 + + + 399 + 471 + 776 + 0 + 0 + + + 399 + 469 + 783 + 0 + 0 + + + 396 + 469 + 779 + 0 + 0 + + + 404 + 468 + 781 + 0 + 0 + + + 396 + 468 + 777 + 0 + 0 + + + 403 + 466 + 780 + 4 + 0 + + + 397 + 466 + 778 + 0 + 0 + + + 396 + 466 + 776 + 1 + 0 + + + 398 + 465 + 783 + 0 + 0 + + + 398 + 464 + 780 + 0 + 0 + + + 396 + 476 + 782 + 1 + 0 + + + 402 + 476 + 780 + 5 + 0 + + + 401 + 476 + 779 + 0 + 0 + + + 401 + 476 + 778 + 0 + 0 + + + 401 + 475 + 781 + 0 + 0 + + + 401 + 475 + 780 + 0 + 0 + + + 33 + 475 + 777 + 4 + 0 + + + 401 + 474 + 782 + 3 + 0 + + + 401 + 474 + 781 + 0 + 0 + + + 405 + 473 + 778 + 0 + 0 + + + 403 + 472 + 782 + 0 + 0 + + + 404 + 453 + 774 + 3 + 0 + + + 5 + 451 + 770 + 0 + 0 + + + 399 + 463 + 768 + 4 + 0 + + + 395 + 462 + 772 + 1 + 0 + + + 32 + 461 + 774 + 6 + 0 + + + 399 + 460 + 772 + 0 + 0 + + + 398 + 460 + 770 + 0 + 0 + + + 401 + 460 + 768 + 4 + 0 + + + 33 + 459 + 775 + 4 + 0 + + + 396 + 458 + 772 + 0 + 0 + + + 397 + 458 + 769 + 0 + 0 + + + 402 + 457 + 768 + 4 + 0 + + + 405 + 456 + 775 + 0 + 0 + + + 394 + 456 + 770 + 7 + 0 + + + 396 + 471 + 771 + 4 + 0 + + + 402 + 471 + 769 + 3 + 0 + + + 394 + 470 + 774 + 1 + 0 + + + 403 + 469 + 768 + 2 + 0 + + + 399 + 468 + 775 + 0 + 0 + + + 395 + 468 + 770 + 5 + 0 + + + 397 + 467 + 772 + 4 + 0 + + + 402 + 467 + 769 + 7 + 0 + + + 394 + 466 + 774 + 4 + 0 + + + 401 + 466 + 771 + 7 + 0 + + + 396 + 464 + 775 + 2 + 0 + + + 404 + 464 + 773 + 7 + 0 + + + 398 + 464 + 770 + 4 + 0 + + + 32 + 477 + 768 + 4 + 0 + + + 32 + 476 + 774 + 4 + 0 + + + 33 + 476 + 771 + 4 + 0 + + + 402 + 475 + 775 + 0 + 0 + + + 403 + 474 + 773 + 3 + 0 + + + 401 + 474 + 769 + 3 + 0 + + + 401 + 473 + 775 + 0 + 0 + + + 404 + 472 + 773 + 0 + 0 + + + 2 + 450 + 772 + 3 + 1 + + + 2 + 448 + 771 + 2 + 1 + + + 394 + 462 + 766 + 4 + 0 + + + 397 + 462 + 761 + 5 + 0 + + + 398 + 461 + 764 + 5 + 0 + + + 399 + 460 + 762 + 5 + 0 + + + 396 + 456 + 762 + 3 + 0 + + + 396 + 471 + 760 + 4 + 0 + + + 404 + 470 + 766 + 5 + 0 + + + 395 + 470 + 763 + 4 + 0 + + + 403 + 469 + 761 + 6 + 0 + + + 32 + 468 + 766 + 2 + 0 + + + 403 + 468 + 764 + 5 + 0 + + + 394 + 467 + 762 + 6 + 0 + + + 33 + 466 + 764 + 6 + 0 + + + 398 + 466 + 760 + 4 + 0 + + + 403 + 465 + 766 + 5 + 0 + + + 396 + 465 + 761 + 5 + 0 + + + 404 + 464 + 763 + 5 + 0 + + + 32 + 476 + 765 + 5 + 0 + + + 33 + 475 + 766 + 5 + 0 + + + 394 + 475 + 764 + 5 + 0 + + + 32 + 475 + 763 + 7 + 0 + + + 33 + 474 + 761 + 6 + 0 + + + 394 + 472 + 765 + 4 + 0 + + + 404 + 472 + 763 + 5 + 0 + + + 6 + 516 + 1411 + 0 + 0 + + + 15 + 516 + 1408 + 4 + 0 + + + 6 + 525 + 1406 + 0 + 0 + + + 55 + 522 + 1407 + 4 + 0 + + + 55 + 522 + 1406 + 4 + 0 + + + 15 + 524 + 1410 + 0 + 0 + + + 121 + 522 + 1411 + 4 + 0 + + + 47 + 522 + 1408 + 0 + 0 + + + 5 + 477 + 1393 + 0 + 0 + + + 6 + 476 + 1395 + 0 + 0 + + + 42 + 490 + 1410 + 0 + 0 + + + 1 + 473 + 1392 + 1 + 1 + + + 45 + 404 + 557 + 6 + 0 + + + 45 + 404 + 556 + 6 + 0 + + + 45 + 404 + 555 + 6 + 0 + + + 45 + 404 + 554 + 6 + 0 + + + 45 + 404 + 553 + 6 + 0 + + + 45 + 404 + 552 + 6 + 0 + + + 45 + 402 + 557 + 2 + 0 + + + 45 + 402 + 556 + 2 + 0 + + + 45 + 402 + 555 + 2 + 0 + + + 45 + 402 + 554 + 2 + 0 + + + 45 + 402 + 553 + 2 + 0 + + + 45 + 402 + 552 + 2 + 0 + + + 37 + 401 + 559 + 0 + 0 + + + 36 + 400 + 557 + 0 + 0 + + + 23 + 407 + 563 + 6 + 0 + + + 23 + 407 + 560 + 6 + 0 + + + 3 + 403 + 567 + 0 + 0 + + + 1 + 400 + 564 + 6 + 0 + + + 1 + 400 + 560 + 6 + 0 + + + 0 + 406 + 569 + 6 + 0 + + + 1 + 404 + 570 + 6 + 0 + + + 19 + 412 + 562 + 6 + 0 + + + 37 + 411 + 567 + 0 + 0 + + + 23 + 409 + 563 + 6 + 0 + + + 23 + 409 + 560 + 6 + 0 + + + 45 + 415 + 569 + 0 + 0 + + + 243 + 414 + 571 + 0 + 0 + + + 45 + 414 + 569 + 0 + 0 + + + 45 + 413 + 569 + 0 + 0 + + + 37 + 413 + 568 + 0 + 0 + + + 34 + 409 + 570 + 6 + 0 + + + 118 + 419 + 559 + 6 + 0 + + + 34 + 418 + 558 + 6 + 0 + + + 45 + 422 + 567 + 2 + 0 + + + 34 + 417 + 564 + 6 + 0 + + + 0 + 416 + 562 + 2 + 0 + + + 241 + 423 + 571 + 0 + 0 + + + 45 + 422 + 568 + 2 + 0 + + + 242 + 421 + 571 + 0 + 0 + + + 45 + 421 + 569 + 0 + 0 + + + 45 + 420 + 569 + 0 + 0 + + + 242 + 419 + 571 + 0 + 0 + + + 45 + 419 + 569 + 0 + 0 + + + 45 + 418 + 569 + 0 + 0 + + + 45 + 417 + 569 + 0 + 0 + + + 45 + 416 + 569 + 0 + 0 + + + 3 + 430 + 559 + 0 + 0 + + + 7 + 430 + 558 + 4 + 0 + + + 191 + 430 + 556 + 0 + 0 + + + 191 + 430 + 554 + 0 + 0 + + + 191 + 428 + 557 + 0 + 0 + + + 191 + 428 + 555 + 0 + 0 + + + 191 + 426 + 556 + 0 + 0 + + + 191 + 426 + 554 + 0 + 0 + + + 302 + 429 + 566 + 0 + 0 + + + 5 + 429 + 561 + 4 + 0 + + + 26 + 428 + 563 + 4 + 0 + + + 11 + 426 + 560 + 0 + 0 + + + 0 + 429 + 568 + 2 + 0 + + + 21 + 424 + 570 + 2 + 0 + + + 21 + 424 + 569 + 0 + 0 + + + 1 + 436 + 554 + 0 + 0 + + + 0 + 435 + 556 + 0 + 0 + + + 285 + 433 + 558 + 0 + 0 + + + 285 + 433 + 556 + 0 + 0 + + + 285 + 433 + 554 + 0 + 0 + + + 15 + 436 + 561 + 4 + 0 + + + 251 + 433 + 565 + 4 + 0 + + + 285 + 433 + 560 + 0 + 0 + + + 0 + 438 + 569 + 0 + 0 + + + 0 + 434 + 570 + 0 + 0 + + + 1 + 406 + 562 + 1 + 1 + + + 1 + 402 + 567 + 0 + 1 + + + 1 + 414 + 560 + 1 + 1 + + + 1 + 410 + 566 + 0 + 1 + + + 1 + 426 + 559 + 1 + 1 + + + 1 + 434 + 563 + 1 + 1 + + + 0 + 400 + 546 + 0 + 0 + + + 37 + 414 + 547 + 0 + 0 + + + 7 + 412 + 549 + 2 + 0 + + + 7 + 411 + 550 + 0 + 0 + + + 3 + 411 + 549 + 0 + 0 + + + 3 + 408 + 547 + 4 + 0 + + + 192 + 422 + 551 + 0 + 0 + + + 1 + 421 + 545 + 2 + 0 + + + 192 + 420 + 551 + 0 + 0 + + + 1 + 417 + 544 + 0 + 0 + + + 244 + 426 + 548 + 0 + 0 + + + 206 + 425 + 547 + 0 + 0 + + + 36 + 424 + 551 + 0 + 0 + + + 1 + 434 + 544 + 0 + 0 + + + 1 + 408 + 549 + 1 + 1 + + + 1 + 414 + 538 + 0 + 0 + + + 1 + 412 + 543 + 0 + 0 + + + 37 + 412 + 541 + 0 + 0 + + + 34 + 411 + 537 + 0 + 0 + + + 1 + 410 + 541 + 0 + 0 + + + 34 + 423 + 538 + 0 + 0 + + + 34 + 422 + 543 + 2 + 0 + + + 34 + 422 + 536 + 2 + 0 + + + 1 + 420 + 539 + 0 + 0 + + + 0 + 417 + 538 + 2 + 0 + + + 1 + 430 + 543 + 2 + 0 + + + 111 + 429 + 536 + 2 + 0 + + + 111 + 428 + 536 + 2 + 0 + + + 103 + 426 + 536 + 3 + 0 + + + 1 + 436 + 541 + 0 + 0 + + + 1 + 435 + 538 + 0 + 0 + + + 3 + 430 + 1502 + 4 + 0 + + + 15 + 426 + 1502 + 4 + 0 + + + 6 + 429 + 1505 + 4 + 0 + + + 0 + 397 + 547 + 2 + 0 + + + 36 + 399 + 554 + 0 + 0 + + + 36 + 398 + 553 + 0 + 0 + + + 0 + 398 + 560 + 6 + 0 + + + 1 + 407 + 538 + 0 + 0 + + + 1 + 404 + 542 + 0 + 0 + + + 1 + 402 + 539 + 0 + 0 + + + 1 + 400 + 542 + 2 + 0 + + + 1 + 400 + 538 + 2 + 0 + + + 1 + 406 + 535 + 0 + 0 + + + 1 + 404 + 535 + 0 + 0 + + + 0 + 413 + 534 + 0 + 0 + + + 0 + 410 + 530 + 0 + 0 + + + 37 + 409 + 533 + 0 + 0 + + + 36 + 423 + 531 + 2 + 0 + + + 36 + 421 + 532 + 2 + 0 + + + 34 + 419 + 535 + 0 + 0 + + + 34 + 416 + 531 + 0 + 0 + + + 36 + 416 + 528 + 2 + 0 + + + 111 + 430 + 534 + 2 + 0 + + + 113 + 430 + 533 + 3 + 0 + + + 103 + 428 + 533 + 0 + 0 + + + 103 + 428 + 532 + 0 + 0 + + + 1 + 427 + 534 + 2 + 0 + + + 1 + 434 + 533 + 0 + 0 + + + 37 + 381 + 492 + 4 + 0 + + + 3 + 381 + 500 + 0 + 0 + + + 5 + 380 + 503 + 0 + 0 + + + 250 + 376 + 502 + 4 + 0 + + + 1 + 378 + 493 + 2 + 1 + + + 1 + 377 + 488 + 1 + 1 + + + 1 + 377 + 501 + 1 + 1 + + + 29 + 366 + 507 + 2 + 0 + + + 29 + 366 + 504 + 2 + 0 + + + 251 + 371 + 505 + 0 + 0 + + + 1 + 371 + 506 + 1 + 1 + + + 1 + 367 + 516 + 0 + 0 + + + 1 + 367 + 513 + 0 + 0 + + + 1 + 364 + 516 + 0 + 0 + + + 70 + 375 + 518 + 4 + 0 + + + 34 + 372 + 516 + 4 + 0 + + + 34 + 382 + 514 + 4 + 0 + + + 34 + 380 + 513 + 4 + 0 + + + 70 + 376 + 519 + 4 + 0 + + + 34 + 376 + 512 + 4 + 0 + + + 70 + 375 + 520 + 4 + 0 + + + 34 + 374 + 527 + 4 + 0 + + + 70 + 374 + 523 + 4 + 0 + + + 34 + 370 + 525 + 4 + 0 + + + 70 + 379 + 521 + 4 + 0 + + + 70 + 378 + 522 + 4 + 0 + + + 70 + 376 + 522 + 4 + 0 + + + 6 + 376 + 520 + 6 + 0 + + + 36 + 364 + 531 + 0 + 0 + + + 36 + 363 + 532 + 0 + 0 + + + 36 + 361 + 534 + 0 + 0 + + + 36 + 360 + 535 + 0 + 0 + + + 70 + 375 + 529 + 0 + 0 + + + 70 + 374 + 533 + 0 + 0 + + + 34 + 372 + 530 + 0 + 0 + + + 70 + 368 + 529 + 0 + 0 + + + 34 + 383 + 529 + 0 + 0 + + + 34 + 380 + 529 + 0 + 0 + + + 70 + 378 + 534 + 0 + 0 + + + 70 + 376 + 534 + 0 + 0 + + + 1 + 365 + 543 + 0 + 0 + + + 1 + 363 + 539 + 0 + 0 + + + 1 + 369 + 539 + 0 + 0 + + + 70 + 381 + 536 + 0 + 0 + + + 1 + 367 + 547 + 0 + 0 + + + 0 + 365 + 544 + 0 + 0 + + + 105 + 363 + 551 + 0 + 0 + + + 105 + 362 + 551 + 0 + 0 + + + 105 + 362 + 550 + 0 + 0 + + + 105 + 362 + 549 + 0 + 0 + + + 101 + 361 + 549 + 0 + 0 + + + 101 + 361 + 544 + 0 + 0 + + + 111 + 360 + 545 + 0 + 0 + + + 1 + 371 + 546 + 0 + 0 + + + 103 + 367 + 554 + 0 + 0 + + + 103 + 366 + 553 + 0 + 0 + + + 103 + 365 + 556 + 0 + 0 + + + 1 + 365 + 552 + 0 + 0 + + + 1 + 370 + 555 + 0 + 0 + + + 5 + 363 + 1514 + 0 + 0 + + + 6 + 360 + 1514 + 0 + 0 + + + 47 + 359 + 2458 + 0 + 0 + + + 6 + 363 + 2458 + 0 + 0 + + + 47 + 361 + 2461 + 2 + 0 + + + 47 + 361 + 2456 + 6 + 0 + + + 7 + 124 + 1457 + 3 + 0 + + + 187 + 126 + 1467 + 4 + 0 + + + 15 + 125 + 1469 + 0 + 0 + + + 15 + 125 + 1464 + 4 + 0 + + + 7 + 124 + 1470 + 0 + 0 + + + 7 + 123 + 1470 + 0 + 0 + + + 15 + 121 + 1469 + 0 + 0 + + + 3 + 120 + 1464 + 0 + 0 + + + 15 + 125 + 1477 + 0 + 0 + + + 15 + 125 + 1474 + 0 + 0 + + + 15 + 121 + 1477 + 0 + 0 + + + 6 + 121 + 1474 + 0 + 0 + + + 7 + 129 + 1459 + 0 + 0 + + + 3 + 129 + 1458 + 0 + 0 + + + 3 + 135 + 1467 + 0 + 0 + + + 15 + 133 + 1470 + 0 + 0 + + + 11 + 133 + 1467 + 0 + 0 + + + 6 + 141 + 1456 + 0 + 0 + + + 15 + 138 + 1459 + 1 + 0 + + + 6 + 136 + 1461 + 1 + 0 + + + 6 + 138 + 1466 + 0 + 0 + + + 15 + 137 + 1470 + 0 + 0 + + + 85 + 145 + 1477 + 0 + 0 + + + 42 + 145 + 1473 + 4 + 0 + + + 1 + 124 + 1467 + 1 + 1 + + + 2 + 123 + 1466 + 0 + 1 + + + 2 + 122 + 1468 + 0 + 1 + + + 2 + 121 + 1466 + 0 + 1 + + + 2 + 124 + 1475 + 1 + 1 + + + 1 + 122 + 1476 + 0 + 1 + + + 1 + 128 + 1461 + 0 + 1 + + + 1 + 148 + 1477 + 1 + 1 + + + 260 + 149 + 3332 + 2 + 0 + + + 5 + 147 + 3330 + 6 + 0 + + + 7 + 463 + 1381 + 2 + 0 + + + 47 + 463 + 1377 + 6 + 0 + + + 273 + 462 + 1380 + 6 + 0 + + + 47 + 460 + 1382 + 0 + 0 + + + 47 + 460 + 1380 + 0 + 0 + + + 25 + 463 + 1390 + 0 + 0 + + + 55 + 463 + 1386 + 0 + 0 + + + 278 + 461 + 1388 + 0 + 0 + + + 24 + 461 + 1384 + 0 + 0 + + + 257 + 460 + 1390 + 0 + 0 + + + 3 + 460 + 1388 + 0 + 0 + + + 3 + 460 + 1387 + 0 + 0 + + + 3 + 460 + 1385 + 0 + 0 + + + 6 + 460 + 1395 + 0 + 0 + + + 5 + 459 + 1393 + 0 + 0 + + + 47 + 468 + 1382 + 4 + 0 + + + 47 + 468 + 1380 + 4 + 0 + + + 47 + 467 + 1377 + 6 + 0 + + + 273 + 466 + 1380 + 6 + 0 + + + 7 + 465 + 1380 + 6 + 0 + + + 47 + 465 + 1377 + 6 + 0 + + + 63 + 464 + 1384 + 6 + 0 + + + 45 + 476 + 1381 + 0 + 0 + + + 44 + 474 + 1381 + 4 + 0 + + + 45 + 473 + 1381 + 0 + 0 + + + 45 + 472 + 1383 + 6 + 0 + + + 45 + 472 + 1382 + 6 + 0 + + + 45 + 472 + 1381 + 6 + 0 + + + 25 + 476 + 1388 + 4 + 0 + + + 25 + 476 + 1386 + 4 + 0 + + + 45 + 476 + 1384 + 4 + 0 + + + 45 + 475 + 1384 + 4 + 0 + + + 19 + 474 + 1390 + 4 + 0 + + + 45 + 474 + 1384 + 4 + 0 + + + 25 + 473 + 1388 + 4 + 0 + + + 25 + 473 + 1386 + 4 + 0 + + + 45 + 473 + 1384 + 4 + 0 + + + 45 + 472 + 1384 + 6 + 0 + + + 117 + 463 + 1384 + 1 + 1 + + + 1 + 464 + 1392 + 1 + 1 + + + 287 + 461 + 2335 + 0 + 0 + + + 6 + 459 + 2337 + 0 + 0 + + + 6 + 477 + 2337 + 0 + 0 + + + 153 + 559 + 436 + 0 + 0 + + + 0 + 558 + 438 + 0 + 0 + + + 153 + 558 + 436 + 0 + 0 + + + 153 + 557 + 436 + 0 + 0 + + + 153 + 556 + 436 + 0 + 0 + + + 0 + 555 + 437 + 0 + 0 + + + 153 + 555 + 436 + 0 + 0 + + + 153 + 554 + 436 + 0 + 0 + + + 153 + 553 + 436 + 0 + 0 + + + 153 + 552 + 436 + 0 + 0 + + + 1 + 558 + 442 + 0 + 0 + + + 0 + 556 + 445 + 0 + 0 + + + 0 + 556 + 444 + 0 + 0 + + + 205 + 556 + 442 + 0 + 0 + + + 1 + 555 + 446 + 0 + 0 + + + 205 + 555 + 442 + 0 + 0 + + + 1 + 559 + 450 + 0 + 0 + + + 22 + 557 + 453 + 0 + 0 + + + 6 + 554 + 451 + 0 + 0 + + + 0 + 553 + 454 + 0 + 0 + + + 1 + 559 + 461 + 0 + 0 + + + 205 + 557 + 456 + 0 + 0 + + + 0 + 556 + 463 + 0 + 0 + + + 205 + 556 + 460 + 0 + 0 + + + 0 + 555 + 457 + 0 + 0 + + + 1 + 554 + 456 + 0 + 0 + + + 1 + 553 + 462 + 0 + 0 + + + 0 + 552 + 462 + 0 + 0 + + + 2 + 554 + 449 + 0 + 1 + + + 310 + 567 + 438 + 0 + 0 + + + 153 + 567 + 436 + 0 + 0 + + + 153 + 566 + 436 + 0 + 0 + + + 153 + 565 + 436 + 0 + 0 + + + 153 + 564 + 436 + 0 + 0 + + + 153 + 563 + 436 + 0 + 0 + + + 153 + 562 + 436 + 0 + 0 + + + 153 + 561 + 436 + 0 + 0 + + + 153 + 560 + 436 + 0 + 0 + + + 310 + 567 + 440 + 0 + 0 + + + 1 + 565 + 447 + 0 + 0 + + + 1 + 565 + 443 + 0 + 0 + + + 310 + 565 + 441 + 0 + 0 + + + 0 + 564 + 447 + 0 + 0 + + + 310 + 564 + 441 + 0 + 0 + + + 1 + 562 + 447 + 0 + 0 + + + 1 + 562 + 444 + 0 + 0 + + + 0 + 560 + 445 + 0 + 0 + + + 219 + 567 + 452 + 6 + 0 + + + 355 + 567 + 451 + 6 + 0 + + + 355 + 567 + 450 + 6 + 0 + + + 355 + 567 + 449 + 6 + 0 + + + 1 + 566 + 455 + 0 + 0 + + + 1 + 566 + 451 + 0 + 0 + + + 0 + 564 + 455 + 0 + 0 + + + 0 + 563 + 449 + 0 + 0 + + + 1 + 561 + 452 + 0 + 0 + + + 153 + 575 + 436 + 0 + 0 + + + 153 + 574 + 436 + 0 + 0 + + + 0 + 573 + 437 + 0 + 0 + + + 153 + 573 + 436 + 0 + 0 + + + 153 + 572 + 436 + 0 + 0 + + + 153 + 571 + 436 + 0 + 0 + + + 0 + 570 + 438 + 0 + 0 + + + 153 + 570 + 436 + 0 + 0 + + + 153 + 569 + 436 + 0 + 0 + + + 153 + 568 + 436 + 0 + 0 + + + 205 + 568 + 435 + 0 + 0 + + + 310 + 573 + 445 + 0 + 0 + + + 1 + 573 + 440 + 0 + 0 + + + 1 + 569 + 443 + 0 + 0 + + + 205 + 568 + 446 + 0 + 0 + + + 1 + 571 + 453 + 0 + 0 + + + 0 + 571 + 452 + 0 + 0 + + + 1 + 570 + 448 + 0 + 0 + + + 355 + 569 + 452 + 4 + 0 + + + 0 + 569 + 450 + 0 + 0 + + + 355 + 568 + 454 + 2 + 0 + + + 355 + 568 + 453 + 2 + 0 + + + 220 + 568 + 452 + 4 + 0 + + + 151 + 583 + 439 + 0 + 0 + + + 153 + 582 + 439 + 0 + 0 + + + 0 + 582 + 437 + 0 + 0 + + + 153 + 581 + 439 + 0 + 0 + + + 1 + 580 + 435 + 0 + 0 + + + 151 + 579 + 438 + 4 + 0 + + + 283 + 578 + 438 + 0 + 0 + + + 151 + 578 + 436 + 0 + 0 + + + 153 + 577 + 436 + 4 + 0 + + + 153 + 576 + 436 + 4 + 0 + + + 0 + 583 + 447 + 0 + 0 + + + 1 + 582 + 446 + 0 + 0 + + + 1 + 578 + 445 + 0 + 0 + + + 1 + 578 + 444 + 0 + 0 + + + 283 + 576 + 443 + 0 + 0 + + + 283 + 578 + 452 + 0 + 0 + + + 1 + 578 + 448 + 0 + 0 + + + 283 + 577 + 455 + 0 + 0 + + + 0 + 577 + 451 + 0 + 0 + + + 283 + 588 + 444 + 0 + 0 + + + 153 + 584 + 447 + 2 + 0 + + + 153 + 584 + 446 + 2 + 0 + + + 153 + 584 + 445 + 2 + 0 + + + 153 + 584 + 444 + 2 + 0 + + + 153 + 584 + 443 + 2 + 0 + + + 153 + 584 + 442 + 2 + 0 + + + 153 + 584 + 441 + 2 + 0 + + + 153 + 591 + 450 + 0 + 0 + + + 153 + 590 + 450 + 0 + 0 + + + 153 + 589 + 450 + 0 + 0 + + + 149 + 588 + 450 + 0 + 0 + + + 149 + 587 + 450 + 0 + 0 + + + 149 + 586 + 450 + 0 + 0 + + + 151 + 584 + 449 + 4 + 0 + + + 153 + 584 + 448 + 2 + 0 + + + 45 + 599 + 451 + 4 + 0 + + + 383 + 599 + 450 + 0 + 0 + + + 45 + 599 + 449 + 0 + 0 + + + 45 + 598 + 451 + 4 + 0 + + + 153 + 598 + 450 + 0 + 0 + + + 45 + 598 + 449 + 0 + 0 + + + 45 + 597 + 451 + 4 + 0 + + + 153 + 597 + 450 + 0 + 0 + + + 45 + 597 + 449 + 0 + 0 + + + 45 + 596 + 451 + 4 + 0 + + + 153 + 596 + 450 + 0 + 0 + + + 45 + 596 + 449 + 0 + 0 + + + 45 + 595 + 451 + 4 + 0 + + + 153 + 595 + 450 + 0 + 0 + + + 45 + 595 + 449 + 0 + 0 + + + 45 + 594 + 451 + 4 + 0 + + + 153 + 594 + 450 + 0 + 0 + + + 45 + 594 + 449 + 0 + 0 + + + 45 + 593 + 451 + 4 + 0 + + + 149 + 593 + 450 + 0 + 0 + + + 45 + 593 + 449 + 0 + 0 + + + 45 + 592 + 451 + 6 + 0 + + + 153 + 592 + 450 + 0 + 0 + + + 45 + 592 + 449 + 6 + 0 + + + 0 + 567 + 463 + 0 + 0 + + + 205 + 567 + 457 + 0 + 0 + + + 1 + 566 + 462 + 0 + 0 + + + 205 + 565 + 461 + 0 + 0 + + + 0 + 562 + 461 + 0 + 0 + + + 1 + 561 + 462 + 0 + 0 + + + 0 + 561 + 458 + 0 + 0 + + + 0 + 570 + 463 + 0 + 0 + + + 0 + 569 + 461 + 0 + 0 + + + 1 + 569 + 457 + 0 + 0 + + + 1 + 568 + 461 + 0 + 0 + + + 7 + 583 + 463 + 6 + 0 + + + 5 + 583 + 459 + 2 + 0 + + + 283 + 583 + 457 + 0 + 0 + + + 308 + 578 + 460 + 0 + 0 + + + 308 + 577 + 462 + 0 + 0 + + + 55 + 587 + 460 + 2 + 0 + + + 55 + 587 + 459 + 2 + 0 + + + 7 + 585 + 463 + 2 + 0 + + + 3 + 584 + 463 + 2 + 0 + + + 286 + 599 + 457 + 0 + 0 + + + 407 + 598 + 461 + 4 + 0 + + + 681 + 597 + 458 + 2 + 0 + + + 681 + 596 + 458 + 2 + 0 + + + 530 + 595 + 458 + 2 + 0 + + + 680 + 594 + 458 + 2 + 0 + + + 680 + 593 + 458 + 2 + 0 + + + 1 + 588 + 462 + 1 + 1 + + + 1 + 585 + 459 + 0 + 1 + + + 308 + 574 + 469 + 0 + 0 + + + 205 + 572 + 466 + 0 + 0 + + + 308 + 571 + 468 + 0 + 0 + + + 205 + 571 + 465 + 0 + 0 + + + 1 + 569 + 464 + 0 + 0 + + + 0 + 568 + 471 + 0 + 0 + + + 308 + 579 + 468 + 0 + 0 + + + 283 + 578 + 466 + 0 + 0 + + + 308 + 577 + 468 + 0 + 0 + + + 308 + 577 + 464 + 0 + 0 + + + 283 + 590 + 470 + 0 + 0 + + + 1 + 589 + 471 + 0 + 0 + + + 0 + 589 + 470 + 0 + 0 + + + 1 + 588 + 471 + 0 + 0 + + + 283 + 588 + 470 + 0 + 0 + + + 0 + 572 + 475 + 0 + 0 + + + 283 + 587 + 472 + 0 + 0 + + + 283 + 586 + 473 + 0 + 0 + + + 0 + 585 + 474 + 0 + 0 + + + 6 + 583 + 1403 + 0 + 0 + + + 0 + 566 + 474 + 0 + 0 + + + 356 + 560 + 472 + 2 + 0 + + + 15 + 560 + 483 + 4 + 0 + + + 82 + 567 + 484 + 1 + 1 + + + 1 + 560 + 487 + 0 + 1 + + + 358 + 564 + 492 + 4 + 0 + + + 4 + 562 + 490 + 0 + 0 + + + 4 + 561 + 489 + 0 + 0 + + + 351 + 571 + 495 + 4 + 0 + + + 350 + 571 + 488 + 4 + 0 + + + 352 + 570 + 489 + 4 + 0 + + + 350 + 570 + 488 + 4 + 0 + + + 350 + 569 + 488 + 4 + 0 + + + 306 + 568 + 495 + 4 + 0 + + + 205 + 559 + 468 + 0 + 0 + + + 0 + 558 + 468 + 0 + 0 + + + 0 + 558 + 465 + 0 + 0 + + + 0 + 557 + 465 + 0 + 0 + + + 0 + 556 + 470 + 0 + 0 + + + 0 + 553 + 466 + 0 + 0 + + + 1 + 552 + 468 + 0 + 0 + + + 0 + 553 + 475 + 0 + 0 + + + 3 + 558 + 483 + 0 + 0 + + + 4 + 555 + 485 + 0 + 0 + + + 51 + 270 + 3327 + 0 + 0 + + + 51 + 270 + 3332 + 4 + 0 + + + 29 + 269 + 3328 + 2 + 0 + + + 51 + 267 + 3328 + 2 + 0 + + + 153 + 271 + 3337 + 0 + 0 + + + 153 + 270 + 3337 + 0 + 0 + + + 153 + 269 + 3337 + 0 + 0 + + + 153 + 268 + 3337 + 0 + 0 + + + 51 + 268 + 3336 + 0 + 0 + + + 153 + 266 + 3343 + 2 + 0 + + + 153 + 266 + 3342 + 2 + 0 + + + 153 + 266 + 3341 + 2 + 0 + + + 153 + 266 + 3340 + 2 + 0 + + + 153 + 266 + 3339 + 2 + 0 + + + 151 + 266 + 3337 + 2 + 0 + + + 5 + 279 + 3326 + 0 + 0 + + + 153 + 278 + 3335 + 2 + 0 + + + 151 + 278 + 3333 + 2 + 0 + + + 51 + 276 + 3331 + 2 + 0 + + + 101 + 277 + 3343 + 0 + 0 + + + 151 + 277 + 3336 + 6 + 0 + + + 100 + 276 + 3341 + 2 + 0 + + + 153 + 276 + 3337 + 0 + 0 + + + 153 + 275 + 3337 + 0 + 0 + + + 104 + 274 + 3342 + 2 + 0 + + + 103 + 274 + 3340 + 0 + 0 + + + 153 + 274 + 3337 + 0 + 0 + + + 153 + 273 + 3337 + 0 + 0 + + + 153 + 272 + 3337 + 0 + 0 + + + 51 + 272 + 3336 + 0 + 0 + + + 153 + 281 + 3327 + 6 + 0 + + + 150 + 281 + 3326 + 6 + 0 + + + 51 + 280 + 3325 + 0 + 0 + + + 51 + 283 + 3335 + 6 + 0 + + + 51 + 283 + 3330 + 6 + 0 + + + 153 + 281 + 3335 + 2 + 0 + + + 153 + 281 + 3334 + 2 + 0 + + + 153 + 281 + 3331 + 6 + 0 + + + 149 + 281 + 3330 + 6 + 0 + + + 149 + 281 + 3329 + 6 + 0 + + + 153 + 281 + 3328 + 6 + 0 + + + 152 + 280 + 3332 + 6 + 0 + + + 153 + 281 + 3343 + 2 + 0 + + + 153 + 281 + 3342 + 2 + 0 + + + 153 + 281 + 3341 + 2 + 0 + + + 153 + 281 + 3340 + 2 + 0 + + + 153 + 281 + 3339 + 2 + 0 + + + 153 + 281 + 3338 + 2 + 0 + + + 153 + 281 + 3337 + 2 + 0 + + + 153 + 281 + 3336 + 2 + 0 + + + 51 + 293 + 3327 + 0 + 0 + + + 51 + 290 + 3327 + 0 + 0 + + + 3 + 294 + 3328 + 6 + 0 + + + 29 + 291 + 3329 + 0 + 0 + + + 51 + 289 + 3330 + 2 + 0 + + + 29 + 293 + 3339 + 6 + 0 + + + 51 + 293 + 3337 + 0 + 0 + + + 51 + 290 + 3337 + 0 + 0 + + + 11 + 222 + 1385 + 0 + 0 + + + 6 + 226 + 1383 + 0 + 0 + + + 15 + 226 + 1386 + 2 + 0 + + + 51 + 207 + 3282 + 0 + 0 + + + 51 + 204 + 3285 + 2 + 0 + + + 51 + 206 + 3294 + 6 + 0 + + + 51 + 204 + 3293 + 0 + 0 + + + 51 + 204 + 3291 + 2 + 0 + + + 51 + 206 + 3296 + 6 + 0 + + + 51 + 202 + 3300 + 4 + 0 + + + 51 + 200 + 3303 + 0 + 0 + + + 51 + 200 + 3308 + 4 + 0 + + + 51 + 204 + 3316 + 4 + 0 + + + 51 + 204 + 3313 + 0 + 0 + + + 5 + 203 + 3314 + 4 + 0 + + + 55 + 211 + 3286 + 6 + 0 + + + 51 + 211 + 3285 + 6 + 0 + + + 51 + 215 + 3289 + 0 + 0 + + + 51 + 208 + 3292 + 4 + 0 + + + 5 + 215 + 3300 + 0 + 0 + + + 51 + 214 + 3298 + 2 + 0 + + + 51 + 214 + 3296 + 2 + 0 + + + 51 + 210 + 3301 + 6 + 0 + + + 51 + 208 + 3298 + 0 + 0 + + + 51 + 210 + 3307 + 6 + 0 + + + 51 + 210 + 3304 + 6 + 0 + + + 51 + 210 + 3315 + 6 + 0 + + + 51 + 210 + 3312 + 6 + 0 + + + 58 + 208 + 3317 + 2 + 0 + + + 51 + 221 + 3283 + 4 + 0 + + + 51 + 218 + 3286 + 6 + 0 + + + 51 + 216 + 3286 + 2 + 0 + + + 51 + 216 + 3280 + 2 + 0 + + + 51 + 219 + 3291 + 6 + 0 + + + 51 + 216 + 3298 + 6 + 0 + + + 51 + 216 + 3296 + 6 + 0 + + + 22 + 219 + 3282 + 1 + 1 + + + 51 + 207 + 3274 + 4 + 0 + + + 51 + 207 + 3272 + 0 + 0 + + + 51 + 204 + 3274 + 4 + 0 + + + 51 + 204 + 3272 + 0 + 0 + + + 51 + 214 + 3276 + 4 + 0 + + + 58 + 211 + 3272 + 0 + 0 + + + 51 + 221 + 3279 + 0 + 0 + + + 20 + 219 + 3276 + 0 + 0 + + + 20 + 219 + 3273 + 0 + 0 + + + 51 + 218 + 3274 + 6 + 0 + + + 20 + 213 + 3270 + 0 + 0 + + + 51 + 218 + 3271 + 6 + 0 + + + 20 + 216 + 3270 + 0 + 0 + + + 51 + 201 + 3256 + 6 + 0 + + + 209 + 200 + 3258 + 5 + 0 + + + 143 + 212 + 3257 + 4 + 0 + + + 143 + 209 + 3257 + 4 + 0 + + + 209 + 198 + 3258 + 6 + 0 + + + 51 + 196 + 3262 + 2 + 0 + + + 209 + 196 + 3256 + 1 + 0 + + + 305 + 196 + 3266 + 6 + 0 + + + 51 + 198 + 3277 + 4 + 0 + + + 51 + 195 + 3277 + 4 + 0 + + + 51 + 194 + 3272 + 2 + 0 + + + 110 + 194 + 3295 + 4 + 0 + + + 104 + 194 + 3294 + 4 + 0 + + + 195 + 192 + 3294 + 4 + 0 + + + 51 + 190 + 3274 + 0 + 0 + + + 51 + 189 + 3277 + 6 + 0 + + + 51 + 186 + 3274 + 0 + 0 + + + 51 + 184 + 3282 + 4 + 0 + + + 106 + 191 + 3294 + 4 + 0 + + + 51 + 189 + 3291 + 6 + 0 + + + 51 + 189 + 3288 + 6 + 0 + + + 51 + 187 + 3294 + 0 + 0 + + + 51 + 187 + 3288 + 2 + 0 + + + 51 + 186 + 3291 + 0 + 0 + + + 51 + 185 + 3293 + 4 + 0 + + + 51 + 182 + 3274 + 0 + 0 + + + 51 + 181 + 3280 + 0 + 0 + + + 51 + 178 + 3287 + 2 + 0 + + + 51 + 178 + 3281 + 2 + 0 + + + 51 + 181 + 3293 + 4 + 0 + + + 51 + 178 + 3290 + 2 + 0 + + + 51 + 195 + 3254 + 2 + 0 + + + 55 + 195 + 3252 + 6 + 0 + + + 51 + 195 + 3251 + 2 + 0 + + + 80 + 206 + 3248 + 4 + 0 + + + 80 + 203 + 3248 + 4 + 0 + + + 209 + 202 + 3253 + 4 + 0 + + + 209 + 201 + 3255 + 4 + 0 + + + 55 + 200 + 3250 + 7 + 0 + + + 143 + 210 + 3250 + 0 + 0 + + + 51 + 198 + 3247 + 6 + 0 + + + 51 + 198 + 3244 + 6 + 0 + + + 684 + 207 + 3224 + 0 + 0 + + + 51 + 206 + 3227 + 2 + 0 + + + 209 + 206 + 3226 + 6 + 0 + + + 598 + 206 + 3224 + 0 + 0 + + + 598 + 205 + 3224 + 0 + 0 + + + 51 + 215 + 3230 + 0 + 0 + + + 57 + 210 + 3231 + 4 + 0 + + + 51 + 208 + 3227 + 6 + 0 + + + 209 + 208 + 3226 + 6 + 0 + + + 598 + 208 + 3224 + 0 + 0 + + + 51 + 222 + 3232 + 0 + 0 + + + 143 + 219 + 3246 + 6 + 0 + + + 57 + 217 + 3241 + 6 + 0 + + + 143 + 219 + 3249 + 6 + 0 + + + 143 + 216 + 3254 + 6 + 0 + + + 598 + 207 + 3222 + 0 + 0 + + + 685 + 206 + 3222 + 0 + 0 + + + 598 + 205 + 3222 + 0 + 0 + + + 55 + 205 + 3220 + 0 + 0 + + + 51 + 204 + 3218 + 2 + 0 + + + 51 + 210 + 3218 + 6 + 0 + + + 55 + 209 + 3217 + 0 + 0 + + + 598 + 208 + 3222 + 0 + 0 + + + 51 + 203 + 3211 + 2 + 0 + + + 51 + 203 + 3208 + 2 + 0 + + + 51 + 210 + 3211 + 6 + 0 + + + 5 + 231 + 3224 + 4 + 0 + + + 51 + 229 + 3229 + 0 + 0 + + + 51 + 229 + 3236 + 4 + 0 + + + 51 + 227 + 3247 + 2 + 0 + + + 51 + 227 + 3244 + 2 + 0 + + + 51 + 234 + 3233 + 6 + 0 + + + 51 + 232 + 3236 + 4 + 0 + + + 51 + 233 + 3247 + 6 + 0 + + + 51 + 233 + 3242 + 6 + 0 + + + 304 + 230 + 3248 + 6 + 0 + + + 51 + 182 + 3302 + 4 + 0 + + + 51 + 182 + 3300 + 0 + 0 + + + 51 + 180 + 3302 + 4 + 0 + + + 51 + 180 + 3300 + 0 + 0 + + + 98 + 191 + 3302 + 0 + 0 + + + 108 + 190 + 3298 + 4 + 0 + + + 51 + 189 + 3302 + 4 + 0 + + + 102 + 189 + 3297 + 4 + 0 + + + 104 + 187 + 3302 + 4 + 0 + + + 58 + 186 + 3300 + 0 + 0 + + + 102 + 186 + 3297 + 4 + 0 + + + 100 + 186 + 3296 + 4 + 0 + + + 51 + 198 + 3299 + 4 + 0 + + + 51 + 198 + 3297 + 0 + 0 + + + 110 + 194 + 3301 + 0 + 0 + + + 51 + 194 + 3300 + 6 + 0 + + + 51 + 194 + 3296 + 6 + 0 + + + 110 + 193 + 3302 + 4 + 0 + + + 110 + 192 + 3302 + 4 + 0 + + + 195 + 192 + 3298 + 0 + 0 + + + 51 + 196 + 3305 + 2 + 0 + + + 51 + 164 + 3287 + 0 + 0 + + + 51 + 166 + 3290 + 6 + 0 + + + 51 + 161 + 3290 + 2 + 0 + + + 51 + 164 + 3303 + 6 + 0 + + + 51 + 161 + 3296 + 6 + 0 + + + 51 + 160 + 3303 + 2 + 0 + + + 51 + 161 + 3306 + 4 + 0 + + + 51 + 205 + 3325 + 2 + 0 + + + 51 + 205 + 3322 + 2 + 0 + + + 51 + 202 + 3327 + 0 + 0 + + + 51 + 212 + 3322 + 6 + 0 + + + 51 + 211 + 3326 + 6 + 0 + + + 51 + 199 + 3332 + 2 + 0 + + + 51 + 199 + 3329 + 2 + 0 + + + 51 + 203 + 3335 + 4 + 0 + + + 51 + 212 + 3329 + 6 + 0 + + + 51 + 208 + 3333 + 4 + 0 + + + 3 + 257 + 1571 + 2 + 0 + + + 3 + 257 + 1568 + 2 + 0 + + + 15 + 256 + 1572 + 2 + 0 + + + 6 + 277 + 1569 + 0 + 0 + + + 47 + 279 + 1586 + 2 + 0 + + + 47 + 280 + 1575 + 4 + 0 + + + 6 + 280 + 1578 + 0 + 0 + + + 6 + 282 + 1586 + 0 + 0 + + + 51 + 598 + 3462 + 4 + 0 + + + 51 + 598 + 3459 + 0 + 0 + + + 51 + 598 + 3456 + 0 + 0 + + + 51 + 596 + 3461 + 2 + 0 + + + 51 + 596 + 3460 + 2 + 0 + + + 51 + 593 + 3462 + 4 + 0 + + + 51 + 593 + 3461 + 6 + 0 + + + 51 + 593 + 3460 + 6 + 0 + + + 51 + 593 + 3456 + 0 + 0 + + + 51 + 593 + 3470 + 4 + 0 + + + 51 + 592 + 3465 + 6 + 0 + + + 20 + 607 + 3458 + 0 + 0 + + + 17 + 607 + 3457 + 4 + 0 + + + 20 + 606 + 3463 + 0 + 0 + + + 51 + 606 + 3462 + 0 + 0 + + + 51 + 606 + 3457 + 0 + 0 + + + 51 + 603 + 3456 + 0 + 0 + + + 51 + 606 + 3467 + 4 + 0 + + + 20 + 606 + 3466 + 0 + 0 + + + 51 + 603 + 3467 + 4 + 0 + + + 17 + 603 + 3466 + 2 + 0 + + + 51 + 603 + 3464 + 0 + 0 + + + 51 + 601 + 3467 + 4 + 0 + + + 51 + 615 + 3454 + 4 + 0 + + + 7 + 614 + 3452 + 3 + 0 + + + 3 + 613 + 3452 + 4 + 0 + + + 3 + 613 + 3451 + 4 + 0 + + + 5 + 613 + 3450 + 0 + 0 + + + 7 + 612 + 3452 + 6 + 0 + + + 439 + 611 + 3451 + 0 + 0 + + + 51 + 615 + 3456 + 0 + 0 + + + 51 + 612 + 3456 + 0 + 0 + + + 97 + 609 + 3463 + 4 + 0 + + + 51 + 608 + 3462 + 0 + 0 + + + 51 + 608 + 3460 + 4 + 0 + + + 51 + 608 + 3457 + 0 + 0 + + + 51 + 608 + 3456 + 0 + 0 + + + 97 + 609 + 3467 + 4 + 0 + + + 51 + 608 + 3467 + 4 + 0 + + + 97 + 608 + 3466 + 4 + 0 + + + 97 + 608 + 3465 + 4 + 0 + + + 97 + 608 + 3464 + 4 + 0 + + + 433 + 622 + 3436 + 0 + 0 + + + 435 + 618 + 3453 + 0 + 0 + + + 146 + 618 + 3451 + 4 + 0 + + + 51 + 618 + 3450 + 6 + 0 + + + 51 + 617 + 3454 + 4 + 0 + + + 20 + 616 + 3451 + 0 + 0 + + + 48 + 616 + 3448 + 6 + 0 + + + 5 + 621 + 3458 + 0 + 0 + + + 51 + 621 + 3456 + 0 + 0 + + + 51 + 617 + 3456 + 0 + 0 + + + 433 + 622 + 3464 + 0 + 0 + + + 80 + 621 + 3466 + 0 + 0 + + + 1 + 597 + 3463 + 0 + 1 + + + 1 + 607 + 3462 + 0 + 1 + + + 1 + 601 + 3460 + 1 + 1 + + + 1 + 607 + 3468 + 0 + 1 + + + 1 + 602 + 3468 + 0 + 1 + + + 5 + 583 + 3462 + 0 + 0 + + + 5 + 583 + 3461 + 0 + 0 + + + 51 + 582 + 3462 + 6 + 0 + + + 5 + 582 + 3456 + 0 + 0 + + + 5 + 581 + 3461 + 0 + 0 + + + 5 + 581 + 3456 + 0 + 0 + + + 279 + 580 + 3456 + 4 + 0 + + + 5 + 579 + 3461 + 0 + 0 + + + 5 + 579 + 3456 + 0 + 0 + + + 5 + 578 + 3458 + 0 + 0 + + + 5 + 577 + 3457 + 0 + 0 + + + 363 + 582 + 3470 + 4 + 0 + + + 51 + 582 + 3465 + 6 + 0 + + + 365 + 581 + 3471 + 2 + 0 + + + 364 + 581 + 3469 + 6 + 0 + + + 51 + 581 + 3468 + 0 + 0 + + + 362 + 580 + 3470 + 0 + 0 + + + 51 + 580 + 3464 + 0 + 0 + + + 51 + 579 + 3468 + 0 + 0 + + + 5 + 578 + 3469 + 2 + 0 + + + 7 + 578 + 3468 + 6 + 0 + + + 51 + 578 + 3464 + 0 + 0 + + + 51 + 577 + 3471 + 6 + 0 + + + 51 + 577 + 3467 + 6 + 0 + + + 51 + 576 + 3469 + 2 + 0 + + + 51 + 576 + 3465 + 2 + 0 + + + 51 + 581 + 3479 + 4 + 0 + + + 5 + 580 + 3473 + 4 + 0 + + + 51 + 579 + 3476 + 2 + 0 + + + 51 + 579 + 3473 + 2 + 0 + + + 51 + 578 + 3479 + 4 + 0 + + + 51 + 577 + 3475 + 6 + 0 + + + 51 + 576 + 3477 + 2 + 0 + + + 51 + 576 + 3473 + 2 + 0 + + + 51 + 591 + 3459 + 0 + 0 + + + 51 + 589 + 3462 + 2 + 0 + + + 51 + 588 + 3457 + 0 + 0 + + + 51 + 587 + 3462 + 0 + 0 + + + 23 + 585 + 3462 + 4 + 0 + + + 51 + 585 + 3457 + 0 + 0 + + + 51 + 584 + 3462 + 0 + 0 + + + 20 + 591 + 3468 + 2 + 0 + + + 51 + 589 + 3465 + 2 + 0 + + + 51 + 587 + 3465 + 4 + 0 + + + 80 + 586 + 3471 + 4 + 0 + + + 51 + 584 + 3465 + 4 + 0 + + + 375 + 591 + 3474 + 0 + 0 + + + 51 + 590 + 3479 + 4 + 0 + + + 374 + 590 + 3478 + 4 + 0 + + + 372 + 590 + 3475 + 0 + 0 + + + 51 + 587 + 3479 + 4 + 0 + + + 51 + 584 + 3479 + 4 + 0 + + + 20 + 584 + 3477 + 4 + 0 + + + 51 + 597 + 3477 + 6 + 0 + + + 51 + 597 + 3475 + 6 + 0 + + + 51 + 596 + 3479 + 4 + 0 + + + 373 + 594 + 3478 + 4 + 0 + + + 372 + 594 + 3475 + 0 + 0 + + + 51 + 593 + 3479 + 4 + 0 + + + 1 + 579 + 3462 + 1 + 1 + + + 1 + 578 + 3459 + 1 + 1 + + + 1 + 583 + 3468 + 1 + 1 + + + 111 + 583 + 3476 + 1 + 1 + + + 1 + 591 + 3462 + 1 + 1 + + + 1 + 588 + 3463 + 1 + 1 + + + 1 + 584 + 3463 + 1 + 1 + + + 22 + 584 + 3457 + 1 + 1 + + + 1 + 588 + 3464 + 1 + 1 + + + 1 + 584 + 3464 + 1 + 1 + + + 45 + 560 + 1591 + 2 + 0 + + + 45 + 560 + 1590 + 2 + 0 + + + 51 + 561 + 1593 + 6 + 0 + + + 363 + 582 + 1582 + 4 + 0 + + + 51 + 582 + 1580 + 6 + 0 + + + 365 + 581 + 1583 + 2 + 0 + + + 364 + 581 + 1581 + 6 + 0 + + + 362 + 580 + 1582 + 0 + 0 + + + 5 + 578 + 1581 + 2 + 0 + + + 6 + 578 + 1580 + 2 + 0 + + + 51 + 582 + 2527 + 6 + 0 + + + 363 + 582 + 2526 + 4 + 0 + + + 51 + 582 + 2524 + 6 + 0 + + + 365 + 581 + 2527 + 2 + 0 + + + 364 + 581 + 2525 + 6 + 0 + + + 362 + 580 + 2526 + 0 + 0 + + + 6 + 578 + 2525 + 2 + 0 + + + 278 + 578 + 2524 + 4 + 0 + + + 0 + 567 + 646 + 0 + 0 + + + 307 + 563 + 646 + 0 + 0 + + + 306 + 567 + 652 + 0 + 0 + + + 0 + 564 + 654 + 0 + 0 + + + 0 + 564 + 650 + 0 + 0 + + + 1 + 572 + 641 + 0 + 0 + + + 0 + 571 + 647 + 0 + 0 + + + 1 + 571 + 654 + 0 + 0 + + + 406 + 571 + 651 + 0 + 0 + + + 9 + 562 + 649 + 1 + 1 + + + 51 + 582 + 3482 + 2 + 0 + + + 51 + 581 + 3484 + 4 + 0 + + + 51 + 578 + 3484 + 4 + 0 + + + 20 + 576 + 3484 + 4 + 0 + + + 51 + 590 + 3484 + 4 + 0 + + + 80 + 590 + 3481 + 4 + 0 + + + 51 + 588 + 3483 + 2 + 0 + + + 51 + 592 + 3482 + 6 + 0 + + + 1 + 577 + 3483 + 0 + 1 + + + 1 + 588 + 3482 + 1 + 1 + + + 1 + 585 + 3482 + 1 + 1 + + + 20 + 605 + 3477 + 2 + 0 + + + 51 + 603 + 3474 + 0 + 0 + + + 51 + 602 + 3474 + 0 + 0 + + + 51 + 601 + 3476 + 4 + 0 + + + 51 + 607 + 3485 + 4 + 0 + + + 51 + 607 + 3480 + 0 + 0 + + + 80 + 606 + 3480 + 4 + 0 + + + 51 + 604 + 3480 + 0 + 0 + + + 20 + 603 + 3481 + 2 + 0 + + + 1 + 603 + 3480 + 0 + 1 + + + 17 + 615 + 3482 + 4 + 0 + + + 51 + 614 + 3485 + 4 + 0 + + + 80 + 614 + 3482 + 4 + 0 + + + 51 + 613 + 3482 + 0 + 0 + + + 51 + 610 + 3485 + 4 + 0 + + + 51 + 610 + 3482 + 0 + 0 + + + 55 + 608 + 3485 + 3 + 0 + + + 51 + 614 + 3494 + 0 + 0 + + + 80 + 613 + 3494 + 4 + 0 + + + 432 + 621 + 3477 + 0 + 0 + + + 80 + 620 + 3473 + 4 + 0 + + + 80 + 619 + 3473 + 4 + 0 + + + 5 + 616 + 3479 + 7 + 0 + + + 80 + 622 + 3480 + 0 + 0 + + + 80 + 617 + 3482 + 4 + 0 + + + 51 + 616 + 3485 + 4 + 0 + + + 17 + 616 + 3482 + 4 + 0 + + + 20 + 621 + 3495 + 4 + 0 + + + 51 + 620 + 3494 + 0 + 0 + + + 51 + 618 + 3490 + 4 + 0 + + + 51 + 618 + 3488 + 0 + 0 + + + 5 + 617 + 3489 + 4 + 0 + + + 51 + 616 + 3490 + 4 + 0 + + + 51 + 616 + 3488 + 0 + 0 + + + 1 + 617 + 3494 + 0 + 1 + + + 1 + 617 + 3491 + 0 + 1 + + + 1 + 617 + 3488 + 0 + 1 + + + 51 + 614 + 3498 + 4 + 0 + + + 20 + 613 + 3497 + 4 + 0 + + + 51 + 621 + 3500 + 4 + 0 + + + 20 + 621 + 3499 + 4 + 0 + + + 97 + 620 + 3497 + 4 + 0 + + + 51 + 618 + 3500 + 4 + 0 + + + 20 + 618 + 3497 + 4 + 0 + + + 22 + 617 + 3500 + 4 + 0 + + + 22 + 617 + 3499 + 4 + 0 + + + 51 + 616 + 3498 + 4 + 0 + + + 23 + 583 + 1606 + 4 + 0 + + + 25 + 582 + 1607 + 0 + 0 + + + 7 + 583 + 1611 + 6 + 0 + + + 5 + 583 + 1608 + 0 + 0 + + + 51 + 581 + 1609 + 2 + 0 + + + 51 + 581 + 1608 + 2 + 0 + + + 51 + 591 + 1608 + 0 + 0 + + + 51 + 587 + 1608 + 0 + 0 + + + 51 + 586 + 1608 + 6 + 0 + + + 3 + 584 + 1610 + 0 + 0 + + + 25 + 596 + 1607 + 0 + 0 + + + 51 + 597 + 1609 + 6 + 0 + + + 51 + 597 + 1608 + 6 + 0 + + + 17 + 595 + 1611 + 0 + 0 + + + 5 + 595 + 1608 + 0 + 0 + + + 17 + 594 + 1611 + 0 + 0 + + + 6 + 593 + 1608 + 0 + 0 + + + 51 + 592 + 1608 + 2 + 0 + + + 382 + 600 + 1623 + 0 + 0 + + + 17 + 602 + 1625 + 2 + 0 + + + 6 + 601 + 1626 + 0 + 0 + + + 17 + 613 + 1623 + 0 + 0 + + + 6 + 613 + 1620 + 0 + 0 + + + 71 + 610 + 1621 + 0 + 0 + + + 1 + 587 + 1609 + 1 + 1 + + + 1 + 592 + 1609 + 1 + 1 + + + 6 + 583 + 2552 + 0 + 0 + + + 51 + 582 + 2553 + 2 + 0 + + + 51 + 585 + 2553 + 6 + 0 + + + 51 + 596 + 2553 + 6 + 0 + + + 6 + 595 + 2552 + 0 + 0 + + + 51 + 593 + 2553 + 2 + 0 + + + 1 + 582 + 655 + 2 + 0 + + + 1 + 582 + 651 + 2 + 0 + + + 1 + 582 + 648 + 2 + 0 + + + 1 + 580 + 653 + 2 + 0 + + + 1 + 580 + 649 + 2 + 0 + + + 1 + 578 + 655 + 2 + 0 + + + 23 + 583 + 661 + 4 + 0 + + + 21 + 582 + 663 + 4 + 0 + + + 25 + 582 + 661 + 4 + 0 + + + 1 + 576 + 657 + 2 + 0 + + + 98 + 590 + 655 + 4 + 0 + + + 98 + 590 + 654 + 4 + 0 + + + 98 + 590 + 651 + 3 + 0 + + + 98 + 588 + 655 + 5 + 0 + + + 98 + 588 + 654 + 4 + 0 + + + 98 + 588 + 652 + 3 + 0 + + + 1 + 586 + 648 + 2 + 0 + + + 1 + 585 + 651 + 2 + 0 + + + 98 + 591 + 658 + 5 + 0 + + + 51 + 590 + 659 + 6 + 0 + + + 98 + 590 + 657 + 6 + 0 + + + 98 + 590 + 656 + 3 + 0 + + + 51 + 588 + 659 + 2 + 0 + + + 98 + 588 + 657 + 5 + 0 + + + 98 + 588 + 656 + 4 + 0 + + + 98 + 587 + 658 + 3 + 0 + + + 25 + 585 + 661 + 4 + 0 + + + 9 + 589 + 663 + 0 + 1 + + + 9 + 589 + 658 + 0 + 1 + + + 51 + 584 + 3558 + 6 + 0 + + + 213 + 584 + 3553 + 4 + 0 + + + 51 + 584 + 3564 + 6 + 0 + + + 51 + 584 + 3561 + 6 + 0 + + + 51 + 585 + 3573 + 6 + 0 + + + 51 + 585 + 3570 + 6 + 0 + + + 51 + 599 + 3537 + 4 + 0 + + + 205 + 598 + 3536 + 2 + 0 + + + 143 + 599 + 3567 + 2 + 0 + + + 51 + 599 + 3565 + 2 + 0 + + + 143 + 593 + 3574 + 2 + 0 + + + 34 + 602 + 3536 + 2 + 0 + + + 55 + 606 + 3555 + 0 + 0 + + + 55 + 606 + 3554 + 0 + 0 + + + 51 + 605 + 3552 + 0 + 0 + + + 43 + 603 + 3554 + 0 + 0 + + + 51 + 602 + 3552 + 0 + 0 + + + 614 + 601 + 3559 + 2 + 0 + + + 614 + 601 + 3558 + 2 + 0 + + + 55 + 601 + 3554 + 0 + 0 + + + 51 + 602 + 3565 + 6 + 0 + + + 615 + 601 + 3562 + 2 + 0 + + + 615 + 601 + 3561 + 2 + 0 + + + 614 + 601 + 3560 + 2 + 0 + + + 657 + 607 + 3568 + 6 + 0 + + + 656 + 606 + 3568 + 2 + 0 + + + 143 + 604 + 3575 + 4 + 0 + + + 143 + 604 + 3572 + 0 + 0 + + + 143 + 615 + 3564 + 0 + 0 + + + 3 + 614 + 3564 + 2 + 0 + + + 143 + 610 + 3565 + 0 + 0 + + + 143 + 610 + 3570 + 4 + 0 + + + 625 + 609 + 3573 + 2 + 0 + + + 645 + 617 + 3567 + 2 + 0 + + + 143 + 617 + 3568 + 7 + 0 + + + 143 + 616 + 3570 + 4 + 0 + + + 25 + 584 + 3582 + 0 + 0 + + + 598 + 599 + 3582 + 4 + 0 + + + 627 + 598 + 3582 + 4 + 0 + + + 598 + 597 + 3582 + 4 + 0 + + + 598 + 596 + 3582 + 4 + 0 + + + 598 + 595 + 3582 + 4 + 0 + + + 143 + 593 + 3576 + 2 + 0 + + + 51 + 606 + 3583 + 0 + 0 + + + 51 + 609 + 3583 + 0 + 0 + + + 51 + 591 + 3591 + 2 + 0 + + + 51 + 591 + 3587 + 4 + 0 + + + 51 + 591 + 3585 + 0 + 0 + + + 25 + 584 + 3589 + 0 + 0 + + + 598 + 599 + 3584 + 4 + 0 + + + 598 + 598 + 3584 + 4 + 0 + + + 598 + 597 + 3584 + 4 + 0 + + + 51 + 596 + 3591 + 6 + 0 + + + 628 + 596 + 3584 + 4 + 0 + + + 55 + 595 + 3590 + 6 + 0 + + + 51 + 595 + 3587 + 4 + 0 + + + 598 + 595 + 3584 + 4 + 0 + + + 55 + 594 + 3590 + 6 + 0 + + + 51 + 594 + 3585 + 0 + 0 + + + 51 + 606 + 3589 + 4 + 0 + + + 5 + 605 + 3591 + 2 + 0 + + + 51 + 603 + 3591 + 2 + 0 + + + 51 + 603 + 3588 + 2 + 0 + + + 51 + 603 + 3584 + 2 + 0 + + + 5 + 610 + 3588 + 2 + 0 + + + 51 + 609 + 3589 + 4 + 0 + + + 2 + 593 + 3590 + 0 + 1 + + + 150 + 604 + 3587 + 0 + 1 + + + 51 + 591 + 3596 + 2 + 0 + + + 43 + 591 + 3593 + 6 + 0 + + + 51 + 596 + 3596 + 6 + 0 + + + 22 + 596 + 3593 + 6 + 0 + + + 22 + 595 + 3597 + 6 + 0 + + + 51 + 582 + 3564 + 2 + 0 + + + 51 + 582 + 3561 + 2 + 0 + + + 103 + 581 + 3575 + 2 + 0 + + + 636 + 581 + 3573 + 2 + 0 + + + 103 + 581 + 3572 + 2 + 0 + + + 51 + 581 + 3570 + 2 + 0 + + + 25 + 581 + 3582 + 0 + 0 + + + 143 + 576 + 3583 + 2 + 0 + + + 143 + 576 + 3581 + 2 + 0 + + + 630 + 576 + 3577 + 0 + 0 + + + 213 + 582 + 3585 + 0 + 0 + + + 25 + 581 + 3589 + 0 + 0 + + + 51 + 582 + 3558 + 2 + 0 + + + 213 + 581 + 3553 + 4 + 0 + + + 205 + 599 + 3534 + 2 + 0 + + + 51 + 597 + 3532 + 0 + 0 + + + 51 + 595 + 3534 + 2 + 0 + + + 621 + 605 + 3509 + 4 + 0 + + + 51 + 602 + 3509 + 0 + 0 + + + 34 + 607 + 3518 + 4 + 0 + + + 51 + 607 + 3516 + 6 + 0 + + + 51 + 607 + 3512 + 6 + 0 + + + 286 + 606 + 3513 + 4 + 0 + + + 51 + 605 + 3519 + 4 + 0 + + + 34 + 604 + 3512 + 4 + 0 + + + 286 + 603 + 3512 + 4 + 0 + + + 286 + 601 + 3514 + 4 + 0 + + + 51 + 600 + 3516 + 2 + 0 + + + 51 + 600 + 3512 + 2 + 0 + + + 277 + 607 + 3527 + 2 + 0 + + + 402 + 607 + 3525 + 4 + 0 + + + 277 + 604 + 3524 + 4 + 0 + + + 277 + 604 + 3520 + 4 + 0 + + + 51 + 602 + 3523 + 2 + 0 + + + 51 + 602 + 3521 + 2 + 0 + + + 277 + 607 + 3533 + 2 + 0 + + + 51 + 607 + 3529 + 2 + 0 + + + 277 + 605 + 3535 + 2 + 0 + + + 51 + 611 + 3525 + 6 + 0 + + + 277 + 610 + 3526 + 4 + 0 + + + 402 + 610 + 3524 + 4 + 0 + + + 277 + 610 + 3523 + 4 + 0 + + + 51 + 608 + 3522 + 0 + 0 + + + 51 + 609 + 3530 + 6 + 0 + + + 580 + 683 + 1452 + 2 + 0 + + + 121 + 686 + 1464 + 0 + 0 + + + 6 + 684 + 1464 + 2 + 0 + + + 421 + 681 + 1464 + 0 + 0 + + + 648 + 693 + 1452 + 6 + 0 + + + 121 + 693 + 1459 + 0 + 0 + + + 6 + 691 + 1459 + 2 + 0 + + + 421 + 688 + 1459 + 0 + 0 + + + 121 + 694 + 1469 + 0 + 0 + + + 6 + 692 + 1469 + 2 + 0 + + + 421 + 689 + 1469 + 0 + 0 + + + 6 + 714 + 1444 + 0 + 0 + + + 421 + 714 + 1441 + 6 + 0 + + + 576 + 714 + 1452 + 0 + 0 + + + 418 + 714 + 1448 + 6 + 0 + + + 421 + 714 + 1463 + 2 + 0 + + + 6 + 714 + 1460 + 0 + 0 + + + 418 + 714 + 1456 + 6 + 0 + + + 421 + 726 + 1459 + 0 + 0 + + + 421 + 724 + 1468 + 2 + 0 + + + 6 + 724 + 1465 + 0 + 0 + + + 6 + 729 + 1459 + 2 + 0 + + + 421 + 731 + 1469 + 2 + 0 + + + 6 + 731 + 1466 + 0 + 0 + + + 421 + 714 + 1428 + 2 + 0 + + + 6 + 714 + 1425 + 0 + 0 + + + 22 + 727 + 3334 + 2 + 0 + + + 668 + 735 + 3335 + 2 + 0 + + + 668 + 735 + 3333 + 2 + 0 + + + 55 + 735 + 3332 + 2 + 0 + + + 5 + 729 + 3334 + 2 + 0 + + + 668 + 739 + 3335 + 2 + 0 + + + 668 + 739 + 3333 + 2 + 0 + + + 97 + 737 + 3334 + 2 + 0 + + + 668 + 737 + 3332 + 2 + 0 + + + 668 + 737 + 3336 + 2 + 0 + + + 281 + 724 + 1388 + 0 + 0 + + + 281 + 723 + 1389 + 0 + 0 + + + 576 + 723 + 1388 + 0 + 0 + + + 281 + 723 + 1387 + 0 + 0 + + + 281 + 722 + 1388 + 0 + 0 + + + 427 + 725 + 1401 + 0 + 0 + + + 418 + 720 + 1401 + 0 + 0 + + + 3 + 740 + 1384 + 4 + 0 + + + 6 + 743 + 1405 + 0 + 0 + + + 421 + 743 + 1402 + 6 + 0 + + + 421 + 743 + 1415 + 6 + 0 + + + 427 + 743 + 1411 + 6 + 0 + + + 597 + 743 + 1409 + 0 + 0 + + + 597 + 743 + 1408 + 0 + 0 + + + 641 + 743 + 1419 + 0 + 0 + + + 6 + 743 + 1418 + 0 + 0 + + + 3 + 750 + 1384 + 6 + 0 + + + 3 + 745 + 1384 + 6 + 0 + + + 51 + 415 + 161 + 0 + 0 + + + 51 + 414 + 164 + 2 + 0 + + + 51 + 414 + 162 + 2 + 0 + + + 419 + 410 + 163 + 4 + 0 + + + 526 + 409 + 164 + 2 + 0 + + + 419 + 408 + 166 + 6 + 0 + + + 419 + 408 + 160 + 6 + 0 + + + 419 + 422 + 163 + 4 + 0 + + + 51 + 418 + 164 + 6 + 0 + + + 51 + 418 + 162 + 6 + 0 + + + 51 + 417 + 161 + 0 + 0 + + + 5 + 416 + 163 + 0 + 0 + + + 567 + 416 + 162 + 4 + 0 + + + 643 + 416 + 161 + 0 + 0 + + + 419 + 424 + 166 + 6 + 0 + + + 526 + 424 + 163 + 6 + 0 + + + 419 + 424 + 160 + 6 + 0 + + + 154 + 416 + 166 + 0 + 1 + + + 51 + 415 + 1108 + 4 + 0 + + + 51 + 415 + 1106 + 0 + 0 + + + 51 + 417 + 1108 + 4 + 0 + + + 51 + 417 + 1106 + 0 + 0 + + + 6 + 416 + 1107 + 4 + 0 + + + 568 + 416 + 1106 + 4 + 0 + + + 156 + 414 + 1107 + 1 + 1 + + + 155 + 419 + 1107 + 1 + 1 + + + 418 + 687 + 1389 + 0 + 0 + + + 427 + 682 + 1389 + 4 + 0 + + + 427 + 683 + 1402 + 4 + 0 + + + 22 + 682 + 1401 + 0 + 0 + + + 22 + 681 + 1402 + 0 + 0 + + + 6 + 680 + 1414 + 0 + 0 + + + 427 + 691 + 1380 + 2 + 0 + + + 22 + 691 + 1378 + 0 + 0 + + + 22 + 690 + 1379 + 0 + 0 + + + 576 + 691 + 1389 + 0 + 0 + + + 418 + 691 + 1385 + 2 + 0 + + + 578 + 694 + 1395 + 0 + 0 + + + 418 + 692 + 1398 + 2 + 0 + + + 574 + 692 + 1397 + 0 + 0 + + + 580 + 691 + 1395 + 2 + 0 + + + 5 + 691 + 1394 + 0 + 0 + + + 418 + 691 + 1393 + 2 + 0 + + + 5 + 690 + 1394 + 0 + 0 + + + 587 + 693 + 1402 + 0 + 0 + + + 418 + 692 + 1406 + 2 + 0 + + + 576 + 692 + 1402 + 0 + 0 + + + 602 + 690 + 1401 + 2 + 0 + + + 418 + 688 + 1402 + 0 + 0 + + + 119 + 692 + 1412 + 0 + 0 + + + 427 + 692 + 1411 + 6 + 0 + + + 426 + 696 + 1389 + 6 + 0 + + + 570 + 703 + 1394 + 4 + 0 + + + 578 + 699 + 1395 + 0 + 0 + + + 418 + 698 + 1395 + 4 + 0 + + + 600 + 697 + 1398 + 0 + 0 + + + 574 + 697 + 1396 + 2 + 0 + + + 418 + 696 + 1398 + 2 + 0 + + + 578 + 696 + 1395 + 0 + 0 + + + 418 + 696 + 1392 + 2 + 0 + + + 426 + 696 + 1402 + 4 + 0 + + + 426 + 711 + 1388 + 0 + 0 + + + 578 + 704 + 1390 + 2 + 0 + + + 578 + 704 + 1387 + 2 + 0 + + + 580 + 704 + 1384 + 0 + 0 + + + 418 + 711 + 1398 + 2 + 0 + + + 574 + 711 + 1395 + 6 + 0 + + + 418 + 711 + 1392 + 2 + 0 + + + 578 + 710 + 1395 + 0 + 0 + + + 418 + 709 + 1395 + 0 + 0 + + + 578 + 708 + 1395 + 4 + 0 + + + 426 + 711 + 1401 + 2 + 0 + + + 580 + 704 + 1406 + 4 + 0 + + + 578 + 704 + 1403 + 2 + 0 + + + 578 + 704 + 1400 + 2 + 0 + + + 427 + 715 + 1379 + 2 + 0 + + + 119 + 715 + 1377 + 4 + 0 + + + 418 + 719 + 1388 + 0 + 0 + + + 603 + 716 + 1386 + 0 + 0 + + + 576 + 715 + 1388 + 0 + 0 + + + 418 + 715 + 1384 + 2 + 0 + + + 589 + 714 + 1388 + 4 + 0 + + + 418 + 716 + 1397 + 2 + 0 + + + 580 + 716 + 1395 + 6 + 0 + + + 574 + 716 + 1394 + 4 + 0 + + + 5 + 716 + 1393 + 0 + 0 + + + 5 + 715 + 1394 + 4 + 0 + + + 418 + 715 + 1392 + 2 + 0 + + + 578 + 713 + 1395 + 0 + 0 + + + 605 + 712 + 1398 + 0 + 0 + + + 601 + 712 + 1393 + 0 + 0 + + + 604 + 717 + 1404 + 0 + 0 + + + 418 + 716 + 1405 + 2 + 0 + + + 576 + 716 + 1401 + 0 + 0 + + + 182 + 716 + 1412 + 0 + 0 + + + 427 + 716 + 1410 + 6 + 0 + + + 156 + 701 + 1395 + 1 + 1 + + + 155 + 707 + 1395 + 1 + 1 + + + 598 + 687 + 2398 + 6 + 0 + + + 598 + 687 + 2397 + 6 + 0 + + + 590 + 687 + 2396 + 6 + 0 + + + 598 + 687 + 2395 + 6 + 0 + + + 598 + 687 + 2394 + 6 + 0 + + + 649 + 683 + 2396 + 2 + 0 + + + 581 + 693 + 2396 + 6 + 0 + + + 598 + 689 + 2397 + 6 + 0 + + + 598 + 689 + 2396 + 6 + 0 + + + 650 + 689 + 2395 + 6 + 0 + + + 598 + 689 + 2394 + 6 + 0 + + + 598 + 689 + 2393 + 6 + 0 + + + 421 + 680 + 1417 + 2 + 0 + + + 6 + 685 + 1427 + 4 + 0 + + + 641 + 685 + 1425 + 0 + 0 + + + 421 + 685 + 1424 + 6 + 0 + + + 6 + 680 + 1427 + 4 + 0 + + + 641 + 680 + 1425 + 0 + 0 + + + 421 + 680 + 1424 + 6 + 0 + + + 6 + 690 + 1427 + 4 + 0 + + + 641 + 690 + 1425 + 0 + 0 + + + 421 + 690 + 1424 + 6 + 0 + + + 635 + 710 + 1420 + 2 + 0 + + + 178 + 345 + 601 + 6 + 0 + + + 48 + 343 + 1547 + 0 + 0 + + + 158 + 343 + 1557 + 2 + 0 + + + 3 + 343 + 1556 + 0 + 0 + + + 7 + 343 + 1555 + 6 + 0 + + + 5 + 341 + 1572 + 0 + 0 + + + 5 + 340 + 1575 + 6 + 0 + + + 5 + 338 + 1570 + 0 + 0 + + + 3 + 346 + 1551 + 0 + 0 + + + 3 + 346 + 1550 + 6 + 0 + + + 3 + 346 + 1545 + 6 + 0 + + + 3 + 345 + 1551 + 0 + 0 + + + 3 + 345 + 1550 + 6 + 0 + + + 3 + 345 + 1545 + 6 + 0 + + + 3 + 344 + 1550 + 6 + 0 + + + 3 + 344 + 1545 + 6 + 0 + + + 6 + 349 + 1556 + 0 + 0 + + + 121 + 346 + 1555 + 0 + 0 + + + 3 + 344 + 1556 + 0 + 0 + + + 6 + 349 + 1569 + 6 + 0 + + + 45 + 348 + 1572 + 0 + 0 + + + 45 + 347 + 1572 + 0 + 0 + + + 6 + 347 + 1571 + 0 + 0 + + + 45 + 346 + 1572 + 0 + 0 + + + 1 + 346 + 1570 + 0 + 1 + + + 2 + 345 + 1575 + 1 + 1 + + + 2 + 345 + 1573 + 1 + 1 + + + 2 + 345 + 1571 + 1 + 1 + + + 5 + 338 + 3458 + 6 + 0 + + + 5 + 346 + 3457 + 6 + 0 + + + 228 + 344 + 3458 + 0 + 0 + + + 52 + 342 + 3460 + 0 + 1 + + + 54 + 349 + 3460 + 1 + 1 + + + 1 + 349 + 3458 + 0 + 1 + + + 54 + 348 + 3463 + 1 + 1 + + + 53 + 346 + 3462 + 0 + 1 + + + 54 + 346 + 3469 + 1 + 1 + + + 51 + 346 + 3467 + 1 + 1 + + + 51 + 275 + 3525 + 2 + 0 + + + 51 + 275 + 3521 + 2 + 0 + + + 51 + 278 + 3532 + 2 + 0 + + + 51 + 279 + 3541 + 2 + 0 + + + 51 + 283 + 3524 + 6 + 0 + + + 51 + 282 + 3528 + 6 + 0 + + + 51 + 280 + 3534 + 6 + 0 + + + 51 + 286 + 3542 + 6 + 0 + + + 5 + 285 + 3543 + 0 + 0 + + + 51 + 282 + 3539 + 0 + 0 + + + 51 + 286 + 3544 + 6 + 0 + + + 51 + 295 + 3523 + 6 + 0 + + + 51 + 292 + 3524 + 4 + 0 + + + 98 + 302 + 3522 + 2 + 0 + + + 51 + 284 + 3513 + 0 + 0 + + + 51 + 280 + 3519 + 0 + 0 + + + 51 + 294 + 3515 + 6 + 0 + + + 51 + 291 + 3513 + 0 + 0 + + + 51 + 303 + 3513 + 0 + 0 + + + 98 + 301 + 3514 + 2 + 0 + + + 98 + 310 + 3517 + 6 + 0 + + + 98 + 308 + 3517 + 2 + 0 + + + 51 + 308 + 3515 + 6 + 0 + + + 98 + 307 + 3514 + 2 + 0 + + + 98 + 306 + 3526 + 6 + 0 + + + 51 + 309 + 3528 + 4 + 0 + + + 51 + 315 + 3519 + 6 + 0 + + + 98 + 313 + 3517 + 6 + 0 + + + 176 + 312 + 3517 + 6 + 0 + + + 51 + 316 + 3523 + 6 + 0 + + + 98 + 316 + 3522 + 6 + 0 + + + 51 + 315 + 3526 + 6 + 0 + + + 176 + 314 + 3527 + 6 + 0 + + + 99 + 312 + 3528 + 6 + 0 + + + 24 + 98 + 1468 + 6 + 0 + + + 15 + 96 + 1470 + 6 + 0 + + + 6 + 96 + 1467 + 4 + 0 + + + 3 + 102 + 1479 + 0 + 0 + + + 6 + 102 + 1476 + 0 + 0 + + + 6 + 106 + 1463 + 0 + 0 + + + 3 + 104 + 1463 + 0 + 0 + + + 17 + 106 + 1467 + 0 + 0 + + + 15 + 104 + 1466 + 6 + 0 + + + 18 + 111 + 1476 + 0 + 0 + + + 3 + 110 + 1476 + 0 + 0 + + + 6 + 107 + 1479 + 0 + 0 + + + 6 + 119 + 1470 + 0 + 0 + + + 3 + 118 + 1470 + 0 + 0 + + + 15 + 116 + 1469 + 0 + 0 + + + 15 + 116 + 1464 + 4 + 0 + + + 6 + 113 + 1477 + 0 + 0 + + + 15 + 112 + 1478 + 0 + 0 + + + 6 + 94 + 1473 + 0 + 0 + + + 51 + 111 + 3366 + 6 + 0 + + + 51 + 108 + 3366 + 0 + 0 + + + 5 + 106 + 3366 + 0 + 0 + + + 3 + 111 + 3375 + 0 + 0 + + + 51 + 111 + 3368 + 6 + 0 + + + 51 + 108 + 3375 + 0 + 0 + + + 51 + 106 + 3375 + 0 + 0 + + + 5 + 118 + 3352 + 0 + 0 + + + 51 + 113 + 3374 + 6 + 0 + + + 51 + 113 + 3371 + 6 + 0 + + + 3 + 112 + 3375 + 0 + 0 + + + 22 + 122 + 3355 + 0 + 0 + + + 22 + 121 + 3355 + 0 + 0 + + + 51 + 121 + 3352 + 0 + 0 + + + 19 + 110 + 3370 + 0 + 1 + + + 15 + 118 + 1405 + 4 + 0 + + + 15 + 118 + 1400 + 4 + 0 + + + 6 + 123 + 1407 + 0 + 0 + + + 15 + 122 + 1400 + 4 + 0 + + + 23 + 135 + 1399 + 6 + 0 + + + 23 + 133 + 1399 + 6 + 0 + + + 23 + 130 + 1399 + 6 + 0 + + + 23 + 135 + 1402 + 6 + 0 + + + 23 + 133 + 1402 + 6 + 0 + + + 63 + 131 + 1404 + 6 + 0 + + + 23 + 130 + 1402 + 6 + 0 + + + 45 + 134 + 1415 + 2 + 0 + + + 45 + 134 + 1414 + 2 + 0 + + + 45 + 133 + 1414 + 0 + 0 + + + 44 + 131 + 1414 + 4 + 0 + + + 45 + 130 + 1414 + 0 + 0 + + + 45 + 129 + 1415 + 6 + 0 + + + 45 + 129 + 1414 + 6 + 0 + + + 45 + 134 + 1417 + 2 + 0 + + + 45 + 134 + 1416 + 2 + 0 + + + 45 + 133 + 1417 + 4 + 0 + + + 45 + 132 + 1417 + 4 + 0 + + + 45 + 131 + 1417 + 4 + 0 + + + 45 + 130 + 1417 + 4 + 0 + + + 45 + 129 + 1417 + 6 + 0 + + + 45 + 129 + 1416 + 6 + 0 + + + 6 + 142 + 1398 + 0 + 0 + + + 25 + 137 + 1399 + 6 + 0 + + + 3 + 141 + 1406 + 2 + 0 + + + 3 + 141 + 1403 + 2 + 0 + + + 15 + 141 + 1401 + 2 + 0 + + + 15 + 140 + 1407 + 0 + 0 + + + 15 + 140 + 1404 + 2 + 0 + + + 15 + 138 + 1407 + 0 + 0 + + + 25 + 137 + 1403 + 6 + 0 + + + 19 + 137 + 1401 + 6 + 0 + + + 47 + 141 + 1412 + 4 + 0 + + + 14 + 139 + 1409 + 2 + 0 + + + 25 + 140 + 1423 + 4 + 0 + + + 71 + 140 + 1420 + 4 + 0 + + + 25 + 140 + 1419 + 4 + 0 + + + 27 + 137 + 1418 + 0 + 0 + + + 14 + 136 + 1421 + 0 + 0 + + + 2 + 122 + 1404 + 0 + 1 + + + 2 + 121 + 1404 + 1 + 1 + + + 1 + 124 + 1409 + 1 + 1 + + + 1 + 121 + 1408 + 1 + 1 + + + 1 + 128 + 1414 + 1 + 1 + + + 1 + 138 + 1413 + 1 + 1 + + + 1 + 136 + 1414 + 1 + 1 + + + 1 + 138 + 1418 + 0 + 1 + + + 51 + 414 + 3276 + 2 + 0 + + + 51 + 411 + 3273 + 4 + 0 + + + 51 + 408 + 3277 + 0 + 0 + + + 51 + 408 + 3273 + 4 + 0 + + + 51 + 412 + 3280 + 0 + 0 + + + 51 + 409 + 3285 + 4 + 0 + + + 51 + 413 + 3295 + 0 + 0 + + + 51 + 413 + 3298 + 4 + 0 + + + 51 + 418 + 3278 + 2 + 0 + + + 5 + 423 + 3285 + 0 + 0 + + + 270 + 419 + 3286 + 0 + 0 + + + 51 + 418 + 3283 + 2 + 0 + + + 51 + 416 + 3282 + 2 + 0 + + + 51 + 419 + 3295 + 0 + 0 + + + 51 + 416 + 3295 + 0 + 0 + + + 51 + 423 + 3298 + 4 + 0 + + + 51 + 419 + 3298 + 4 + 0 + + + 51 + 426 + 3273 + 6 + 0 + + + 51 + 424 + 3278 + 6 + 0 + + + 51 + 425 + 3283 + 6 + 0 + + + 51 + 429 + 3292 + 6 + 0 + + + 51 + 428 + 3290 + 0 + 0 + + + 43 + 426 + 3290 + 4 + 0 + + + 270 + 424 + 3289 + 0 + 0 + + + 51 + 405 + 3274 + 0 + 0 + + + 51 + 402 + 3278 + 0 + 0 + + + 51 + 401 + 3274 + 0 + 0 + + + 51 + 407 + 3282 + 0 + 0 + + + 51 + 404 + 3282 + 4 + 0 + + + 51 + 403 + 3285 + 4 + 0 + + + 51 + 407 + 3292 + 0 + 0 + + + 51 + 404 + 3292 + 0 + 0 + + + 51 + 403 + 3294 + 4 + 0 + + + 51 + 401 + 3292 + 0 + 0 + + + 51 + 400 + 3295 + 0 + 0 + + + 51 + 402 + 3300 + 6 + 0 + + + 51 + 400 + 3302 + 4 + 0 + + + 273 + 400 + 3301 + 4 + 0 + + + 273 + 400 + 3298 + 4 + 0 + + + 5 + 399 + 3276 + 0 + 0 + + + 27 + 399 + 3272 + 6 + 0 + + + 25 + 396 + 3275 + 0 + 0 + + + 10 + 395 + 3274 + 2 + 0 + + + 51 + 399 + 3282 + 0 + 0 + + + 270 + 398 + 3280 + 0 + 0 + + + 51 + 397 + 3286 + 4 + 0 + + + 270 + 394 + 3282 + 0 + 0 + + + 51 + 398 + 3292 + 0 + 0 + + + 64 + 397 + 3294 + 2 + 0 + + + 51 + 396 + 3295 + 0 + 0 + + + 51 + 395 + 3294 + 4 + 0 + + + 51 + 395 + 3292 + 0 + 0 + + + 51 + 393 + 3295 + 0 + 0 + + + 51 + 392 + 3292 + 0 + 0 + + + 273 + 398 + 3301 + 4 + 0 + + + 273 + 398 + 3298 + 4 + 0 + + + 97 + 396 + 3301 + 4 + 0 + + + 97 + 396 + 3300 + 4 + 0 + + + 273 + 394 + 3298 + 4 + 0 + + + 51 + 393 + 3302 + 4 + 0 + + + 273 + 393 + 3301 + 4 + 0 + + + 273 + 392 + 3298 + 4 + 0 + + + 273 + 391 + 3301 + 4 + 0 + + + 51 + 390 + 3300 + 2 + 0 + + + 51 + 389 + 3299 + 6 + 0 + + + 51 + 385 + 3302 + 2 + 0 + + + 43 + 385 + 3298 + 4 + 0 + + + 51 + 385 + 3296 + 2 + 0 + + + 51 + 387 + 3304 + 4 + 0 + + + 51 + 371 + 3319 + 0 + 0 + + + 277 + 390 + 3314 + 6 + 0 + + + 51 + 389 + 3312 + 0 + 0 + + + 277 + 388 + 3316 + 6 + 0 + + + 51 + 387 + 3319 + 2 + 0 + + + 51 + 386 + 3315 + 2 + 0 + + + 51 + 396 + 3314 + 6 + 0 + + + 277 + 394 + 3316 + 6 + 0 + + + 51 + 392 + 3312 + 0 + 0 + + + 51 + 371 + 3323 + 2 + 0 + + + 145 + 368 + 3321 + 0 + 0 + + + 277 + 389 + 3325 + 0 + 0 + + + 51 + 387 + 3327 + 2 + 0 + + + 51 + 387 + 3323 + 2 + 0 + + + 51 + 396 + 3325 + 6 + 0 + + + 277 + 395 + 3326 + 0 + 0 + + + 51 + 395 + 3323 + 6 + 0 + + + 51 + 395 + 3320 + 6 + 0 + + + 277 + 393 + 3321 + 0 + 0 + + + 42 + 358 + 1436 + 0 + 0 + + + 6 + 367 + 1438 + 0 + 0 + + + 3 + 362 + 1437 + 2 + 0 + + + 45 + 360 + 1439 + 0 + 0 + + + 45 + 360 + 1438 + 6 + 0 + + + 45 + 360 + 1437 + 6 + 0 + + + 45 + 360 + 1436 + 6 + 0 + + + 45 + 360 + 1435 + 6 + 0 + + + 257 + 362 + 1440 + 0 + 0 + + + 22 + 381 + 1444 + 4 + 0 + + + 6 + 380 + 1447 + 0 + 0 + + + 3 + 377 + 1446 + 4 + 0 + + + 51 + 279 + 3354 + 4 + 0 + + + 100 + 278 + 3353 + 2 + 0 + + + 51 + 272 + 3355 + 6 + 0 + + + 109 + 276 + 3373 + 0 + 0 + + + 103 + 272 + 3370 + 0 + 0 + + + 102 + 272 + 3369 + 0 + 0 + + + 51 + 261 + 3350 + 4 + 0 + + + 114 + 261 + 3346 + 2 + 0 + + + 104 + 260 + 3349 + 2 + 0 + + + 51 + 259 + 3344 + 2 + 0 + + + 51 + 271 + 3350 + 6 + 0 + + + 150 + 266 + 3346 + 2 + 0 + + + 149 + 266 + 3345 + 2 + 0 + + + 153 + 266 + 3344 + 2 + 0 + + + 101 + 277 + 3351 + 0 + 0 + + + 114 + 277 + 3349 + 2 + 0 + + + 115 + 277 + 3348 + 0 + 0 + + + 51 + 276 + 3346 + 2 + 0 + + + 50 + 286 + 3349 + 0 + 0 + + + 50 + 286 + 3346 + 0 + 0 + + + 50 + 283 + 3349 + 0 + 0 + + + 50 + 283 + 3346 + 0 + 0 + + + 150 + 281 + 3348 + 2 + 0 + + + 153 + 281 + 3347 + 2 + 0 + + + 149 + 281 + 3346 + 2 + 0 + + + 153 + 281 + 3345 + 2 + 0 + + + 153 + 281 + 3344 + 2 + 0 + + + 102 + 261 + 3342 + 2 + 0 + + + 51 + 261 + 3340 + 0 + 0 + + + 105 + 260 + 3341 + 0 + 0 + + + 51 + 256 + 3336 + 4 + 0 + + + 230 + 255 + 3331 + 6 + 0 + + + 51 + 254 + 3335 + 2 + 0 + + + 51 + 254 + 3332 + 2 + 0 + + + 51 + 262 + 3333 + 0 + 0 + + + 51 + 260 + 3333 + 0 + 0 + + + 57 + 259 + 3334 + 1 + 1 + + + 51 + 294 + 3350 + 6 + 0 + + + 3 + 293 + 3351 + 6 + 0 + + + 51 + 292 + 3344 + 0 + 0 + + + 97 + 291 + 3348 + 6 + 0 + + + 97 + 291 + 3347 + 6 + 0 + + + 97 + 290 + 3348 + 6 + 0 + + + 97 + 290 + 3347 + 6 + 0 + + + 51 + 294 + 3356 + 6 + 0 + + + 280 + 291 + 3356 + 0 + 0 + + + 51 + 290 + 3358 + 4 + 0 + + + 3 + 301 + 3350 + 6 + 0 + + + 51 + 301 + 3346 + 6 + 0 + + + 51 + 299 + 3351 + 4 + 0 + + + 51 + 299 + 3344 + 0 + 0 + + + 51 + 311 + 3343 + 0 + 0 + + + 51 + 311 + 3351 + 4 + 0 + + + 51 + 305 + 3349 + 4 + 0 + + + 51 + 305 + 3347 + 0 + 0 + + + 281 + 305 + 3358 + 6 + 0 + + + 51 + 314 + 3349 + 6 + 0 + + + 51 + 313 + 3345 + 6 + 0 + + + 17 + 141 + 3493 + 0 + 0 + + + 17 + 141 + 3492 + 0 + 0 + + + 51 + 139 + 3493 + 4 + 0 + + + 51 + 139 + 3488 + 0 + 0 + + + 5 + 136 + 3492 + 0 + 0 + + + 6 + 139 + 1592 + 0 + 0 + + + 5 + 138 + 1593 + 0 + 0 + + + 6 + 139 + 1610 + 0 + 0 + + + 5 + 138 + 1612 + 0 + 0 + + + 6 + 138 + 2537 + 0 + 0 + + + 121 + 139 + 2554 + 2 + 0 + + + 7 + 139 + 2553 + 4 + 0 + + + 6 + 138 + 2556 + 0 + 0 + + + 27 + 56 + 1623 + 0 + 0 + + + 15 + 57 + 1627 + 0 + 0 + + + 6 + 78 + 1621 + 0 + 0 + + + 7 + 75 + 1618 + 2 + 0 + + + 3 + 74 + 1618 + 0 + 0 + + + 6 + 54 + 1627 + 2 + 0 + + + 6 + 542 + 1543 + 0 + 0 + + + 336 + 542 + 1546 + 0 + 0 + + + 339 + 539 + 1547 + 0 + 0 + + + 145 + 559 + 1535 + 6 + 0 + + + 49 + 559 + 1534 + 6 + 0 + + + 290 + 559 + 1533 + 0 + 0 + + + 145 + 559 + 1532 + 6 + 0 + + + 290 + 559 + 1530 + 0 + 0 + + + 44 + 558 + 1589 + 4 + 0 + + + 45 + 557 + 1591 + 6 + 0 + + + 45 + 557 + 1590 + 6 + 0 + + + 45 + 559 + 1592 + 0 + 0 + + + 45 + 558 + 1592 + 0 + 0 + + + 14 + 557 + 1594 + 6 + 0 + + + 51 + 556 + 1593 + 2 + 0 + + + 145 + 639 + 1685 + 2 + 0 + + + 145 + 639 + 1683 + 2 + 0 + + + 145 + 639 + 1681 + 2 + 0 + + + 25 + 639 + 1680 + 4 + 0 + + + 6 + 638 + 1685 + 0 + 0 + + + 145 + 638 + 1680 + 4 + 0 + + + 145 + 637 + 1685 + 0 + 0 + + + 1021 + 636 + 1685 + 0 + 0 + + + 145 + 636 + 1680 + 4 + 0 + + + 145 + 635 + 1685 + 0 + 0 + + + 23 + 635 + 1680 + 4 + 0 + + + 145 + 634 + 1685 + 6 + 0 + + + 145 + 634 + 1683 + 6 + 0 + + + 145 + 634 + 1681 + 6 + 0 + + + 145 + 634 + 1680 + 4 + 0 + + + 44 + 643 + 1692 + 4 + 0 + + + 44 + 643 + 1701 + 0 + 0 + + + 959 + 639 + 2629 + 6 + 0 + + + 959 + 639 + 2624 + 4 + 0 + + + 1017 + 636 + 2629 + 0 + 0 + + + 1014 + 492 + 3520 + 4 + 0 + + + 959 + 634 + 2629 + 0 + 0 + + + 959 + 634 + 2624 + 2 + 0 + + + 179 + 494 + 3523 + 1 + 1 + + + 179 + 494 + 3522 + 1 + 1 + + + 179 + 493 + 3524 + 0 + 1 + + + 179 + 493 + 3522 + 0 + 1 + + + 179 + 492 + 3524 + 0 + 1 + + + 179 + 492 + 3523 + 1 + 1 + + + 179 + 492 + 3522 + 1 + 1 + + + 51 + 599 + 1703 + 2 + 0 + + + 51 + 599 + 1700 + 2 + 0 + + + 6 + 605 + 1686 + 4 + 0 + + + 22 + 602 + 1686 + 0 + 0 + + + 22 + 601 + 1686 + 0 + 0 + + + 15 + 605 + 1688 + 0 + 0 + + + 15 + 601 + 1688 + 0 + 0 + + + 5 + 606 + 1703 + 6 + 0 + + + 51 + 606 + 1700 + 6 + 0 + + + 45 + 604 + 1702 + 2 + 0 + + + 45 + 604 + 1701 + 2 + 0 + + + 45 + 604 + 1700 + 2 + 0 + + + 51 + 604 + 1698 + 0 + 0 + + + 45 + 603 + 1703 + 0 + 0 + + + 45 + 602 + 1703 + 0 + 0 + + + 42 + 602 + 1700 + 4 + 0 + + + 45 + 601 + 1702 + 6 + 0 + + + 45 + 601 + 1701 + 6 + 0 + + + 45 + 601 + 1700 + 6 + 0 + + + 51 + 601 + 1698 + 0 + 0 + + + 22 + 605 + 1704 + 5 + 0 + + + 51 + 604 + 1705 + 4 + 0 + + + 51 + 601 + 1705 + 4 + 0 + + + 3 + 600 + 1704 + 6 + 0 + + + 1 + 600 + 1703 + 0 + 1 + + + 1 + 602 + 1704 + 1 + 1 + + + 20 + 599 + 2647 + 0 + 0 + + + 63 + 599 + 2645 + 0 + 0 + + + 20 + 599 + 2644 + 2 + 0 + + + 6 + 606 + 2647 + 0 + 0 + + + 25 + 605 + 2643 + 7 + 0 + + + 20 + 604 + 2642 + 0 + 0 + + + 63 + 602 + 2642 + 6 + 0 + + + 20 + 601 + 2642 + 6 + 0 + + + 25 + 600 + 2643 + 5 + 0 + + + 25 + 605 + 2648 + 5 + 0 + + + 20 + 604 + 2649 + 2 + 0 + + + 63 + 602 + 2649 + 2 + 0 + + + 20 + 601 + 2649 + 4 + 0 + + + 25 + 600 + 2648 + 7 + 0 + + + 148 + 599 + 2646 + 1 + 1 + + + 147 + 603 + 2642 + 0 + 1 + + + 149 + 603 + 2650 + 0 + 1 + + + 149 + 602 + 2650 + 0 + 1 + + + 15 + 446 + 1705 + 4 + 0 + + + 6 + 444 + 1707 + 2 + 0 + + + 15 + 441 + 1706 + 4 + 0 + + + 15 + 447 + 1713 + 0 + 0 + + + 6 + 446 + 1713 + 0 + 0 + + + 15 + 442 + 1714 + 0 + 0 + + + 6 + 441 + 1714 + 0 + 0 + + + 21 + 454 + 1700 + 0 + 0 + + + 21 + 454 + 1699 + 0 + 0 + + + 6 + 454 + 1708 + 2 + 0 + + + 15 + 451 + 1707 + 4 + 0 + + + 6 + 449 + 1706 + 2 + 0 + + + 15 + 452 + 1714 + 0 + 0 + + + 6 + 451 + 1714 + 0 + 0 + + + 21 + 459 + 1695 + 0 + 0 + + + 21 + 458 + 1695 + 0 + 0 + + + 21 + 462 + 1699 + 0 + 0 + + + 21 + 462 + 1698 + 0 + 0 + + + 21 + 460 + 1701 + 0 + 0 + + + 21 + 458 + 1703 + 0 + 0 + + + 6 + 458 + 1699 + 5 + 0 + + + 21 + 457 + 1703 + 0 + 0 + + + 21 + 456 + 1697 + 0 + 0 + + + 340 + 582 + 1527 + 0 + 0 + + + 15 + 581 + 1522 + 4 + 0 + + + 6 + 585 + 1522 + 0 + 0 + + + 334 + 584 + 1527 + 0 + 0 + + + 15 + 606 + 1525 + 6 + 0 + + + 730 + 582 + 3337 + 6 + 0 + + + 940 + 581 + 3342 + 0 + 0 + + + 22 + 580 + 3343 + 0 + 0 + + + 730 + 580 + 3339 + 0 + 0 + + + 730 + 581 + 3351 + 5 + 0 + + + 730 + 580 + 3348 + 0 + 0 + + + 729 + 580 + 3344 + 5 + 0 + + + 730 + 578 + 3349 + 0 + 0 + + + 729 + 581 + 3356 + 5 + 0 + + + 729 + 579 + 3355 + 6 + 0 + + + 730 + 578 + 3352 + 5 + 0 + + + 983 + 577 + 3355 + 6 + 0 + + + 730 + 590 + 3342 + 0 + 0 + + + 730 + 590 + 3336 + 0 + 0 + + + 729 + 589 + 3348 + 6 + 0 + + + 730 + 589 + 3344 + 0 + 0 + + + 730 + 587 + 3347 + 0 + 0 + + + 730 + 586 + 3349 + 0 + 0 + + + 730 + 586 + 3345 + 0 + 0 + + + 729 + 590 + 3353 + 6 + 0 + + + 730 + 587 + 3356 + 0 + 0 + + + 940 + 586 + 3353 + 0 + 0 + + + 730 + 597 + 3337 + 0 + 0 + + + 730 + 595 + 3338 + 0 + 0 + + + 730 + 593 + 3342 + 6 + 0 + + + 729 + 592 + 3336 + 6 + 0 + + + 730 + 599 + 3347 + 0 + 0 + + + 940 + 599 + 3352 + 0 + 0 + + + 730 + 598 + 3355 + 0 + 0 + + + 22 + 607 + 3342 + 0 + 0 + + + 22 + 607 + 3341 + 0 + 0 + + + 730 + 607 + 3337 + 0 + 0 + + + 730 + 600 + 3336 + 0 + 0 + + + 730 + 607 + 3345 + 0 + 0 + + + 22 + 604 + 3345 + 0 + 0 + + + 730 + 603 + 3345 + 6 + 0 + + + 730 + 601 + 3349 + 0 + 0 + + + 730 + 601 + 3347 + 0 + 0 + + + 730 + 600 + 3355 + 0 + 0 + + + 51 + 568 + 3331 + 4 + 0 + + + 730 + 581 + 3335 + 0 + 0 + + + 730 + 581 + 3332 + 0 + 0 + + + 730 + 581 + 3329 + 0 + 0 + + + 730 + 590 + 3332 + 0 + 0 + + + 730 + 590 + 3329 + 0 + 0 + + + 730 + 587 + 3331 + 0 + 0 + + + 730 + 584 + 3329 + 6 + 0 + + + 940 + 599 + 3333 + 0 + 0 + + + 940 + 594 + 3332 + 0 + 0 + + + 986 + 593 + 3334 + 0 + 0 + + + 986 + 593 + 3333 + 0 + 0 + + + 986 + 593 + 3332 + 0 + 0 + + + 730 + 607 + 3333 + 0 + 0 + + + 730 + 603 + 3332 + 0 + 0 + + + 730 + 603 + 3329 + 0 + 0 + + + 730 + 601 + 3331 + 0 + 0 + + + 986 + 600 + 3333 + 0 + 0 + + + 986 + 600 + 3332 + 0 + 0 + + + 986 + 609 + 3328 + 0 + 0 + + + 730 + 615 + 3342 + 6 + 0 + + + 940 + 615 + 3338 + 0 + 0 + + + 986 + 614 + 3337 + 0 + 0 + + + 986 + 613 + 3341 + 0 + 0 + + + 730 + 609 + 3342 + 0 + 0 + + + 730 + 583 + 3327 + 0 + 0 + + + 730 + 591 + 3321 + 0 + 0 + + + 730 + 588 + 3325 + 0 + 0 + + + 730 + 586 + 3325 + 0 + 0 + + + 986 + 599 + 3323 + 0 + 0 + + + 730 + 599 + 3320 + 0 + 0 + + + 730 + 596 + 3320 + 0 + 0 + + + 730 + 595 + 3322 + 6 + 0 + + + 986 + 594 + 3321 + 0 + 0 + + + 940 + 593 + 3324 + 0 + 0 + + + 730 + 606 + 3327 + 6 + 0 + + + 729 + 606 + 3321 + 6 + 0 + + + 730 + 605 + 3326 + 0 + 0 + + + 730 + 602 + 3321 + 0 + 0 + + + 730 + 601 + 3326 + 0 + 0 + + + 730 + 610 + 3320 + 0 + 0 + + + 986 + 609 + 3327 + 0 + 0 + + + 986 + 608 + 3321 + 0 + 0 + + + 986 + 620 + 3320 + 0 + 0 + + + 986 + 619 + 3321 + 0 + 0 + + + 22 + 616 + 3332 + 0 + 0 + + + 22 + 616 + 3331 + 0 + 0 + + + 986 + 617 + 3339 + 0 + 0 + + + 730 + 594 + 3318 + 0 + 0 + + + 729 + 615 + 3318 + 0 + 0 + + + 729 + 615 + 3314 + 6 + 0 + + + 986 + 615 + 3313 + 0 + 0 + + + 986 + 614 + 3316 + 0 + 0 + + + 22 + 614 + 3314 + 0 + 0 + + + 986 + 614 + 3313 + 0 + 0 + + + 986 + 613 + 3315 + 0 + 0 + + + 22 + 613 + 3314 + 0 + 0 + + + 730 + 612 + 3318 + 0 + 0 + + + 730 + 610 + 3317 + 0 + 0 + + + 22 + 622 + 3315 + 0 + 0 + + + 22 + 622 + 3314 + 0 + 0 + + + 986 + 621 + 3316 + 0 + 0 + + + 729 + 621 + 3315 + 0 + 0 + + + 986 + 621 + 3313 + 0 + 0 + + + 986 + 620 + 3319 + 0 + 0 + + + 986 + 620 + 3317 + 0 + 0 + + + 987 + 620 + 3313 + 0 + 0 + + + 986 + 619 + 3313 + 0 + 0 + + + 940 + 618 + 3314 + 0 + 0 + + + 986 + 617 + 3313 + 0 + 0 + + + 986 + 616 + 3313 + 0 + 0 + + + 5 + 631 + 3306 + 4 + 0 + + + 51 + 630 + 3305 + 0 + 0 + + + 6 + 333 + 1513 + 0 + 0 + + + 6 + 425 + 1431 + 0 + 0 + + + 17 + 429 + 1435 + 0 + 0 + + + 24 + 425 + 1434 + 2 + 0 + + + 6 + 436 + 1428 + 6 + 0 + + + 23 + 433 + 1424 + 4 + 0 + + + 3 + 432 + 1424 + 4 + 0 + + + 6 + 442 + 1428 + 0 + 0 + + + 15 + 440 + 1431 + 6 + 0 + + + 47 + 440 + 1428 + 0 + 0 + + + 28 + 165 + 1543 + 0 + 0 + + + 6 + 165 + 1542 + 0 + 0 + + + 5 + 166 + 1546 + 0 + 0 + + + 52 + 166 + 2487 + 0 + 0 + + + 6 + 166 + 2490 + 0 + 0 + + + 55 + 166 + 2489 + 0 + 0 + + + 15 + 214 + 1564 + 0 + 0 + + + 6 + 216 + 1564 + 0 + 0 + + + 141 + 216 + 1562 + 6 + 0 + + + 15 + 221 + 1574 + 2 + 0 + + + 6 + 218 + 1574 + 2 + 0 + + + 158 + 175 + 1431 + 0 + 0 + + + 11 + 175 + 1427 + 2 + 0 + + + 11 + 175 + 1426 + 2 + 0 + + + 3 + 181 + 1424 + 0 + 0 + + + 6 + 180 + 1430 + 0 + 0 + + + 3 + 180 + 1424 + 0 + 0 + + + 5 + 178 + 1430 + 0 + 0 + + + 28 + 178 + 1426 + 0 + 0 + + + 3 + 178 + 1424 + 0 + 0 + + + 3 + 177 + 1424 + 0 + 0 + + + 45 + 176 + 1431 + 2 + 0 + + + 45 + 176 + 1430 + 2 + 0 + + + 3 + 176 + 1424 + 0 + 0 + + + 3 + 175 + 2370 + 0 + 0 + + + 3 + 181 + 2374 + 0 + 0 + + + 173 + 179 + 2371 + 0 + 0 + + + 6 + 177 + 2374 + 0 + 0 + + + 3 + 177 + 2370 + 0 + 0 + + + 3 + 176 + 2370 + 0 + 0 + + + 51 + 365 + 3341 + 4 + 0 + + + 145 + 364 + 3339 + 4 + 0 + + + 51 + 361 + 3341 + 4 + 0 + + + 145 + 360 + 3339 + 4 + 0 + + + 145 + 367 + 3347 + 4 + 0 + + + 145 + 364 + 3347 + 4 + 0 + + + 215 + 362 + 3351 + 3 + 0 + + + 276 + 367 + 3353 + 3 + 0 + + + 51 + 365 + 3358 + 4 + 0 + + + 214 + 363 + 3355 + 3 + 0 + + + 117 + 374 + 3341 + 2 + 0 + + + 51 + 374 + 3340 + 2 + 0 + + + 51 + 374 + 3337 + 2 + 0 + + + 51 + 374 + 3344 + 2 + 0 + + + 51 + 373 + 3351 + 6 + 0 + + + 51 + 374 + 3352 + 2 + 0 + + + 51 + 373 + 3353 + 6 + 0 + + + 275 + 371 + 3354 + 6 + 0 + + + 276 + 369 + 3355 + 2 + 0 + + + 276 + 369 + 3352 + 0 + 0 + + + 51 + 368 + 3358 + 4 + 0 + + + 51 + 372 + 3362 + 2 + 0 + + + 271 + 373 + 3374 + 0 + 0 + + + 51 + 373 + 3371 + 0 + 0 + + + 51 + 370 + 3371 + 0 + 0 + + + 51 + 378 + 3340 + 6 + 0 + + + 51 + 378 + 3337 + 6 + 0 + + + 51 + 382 + 3344 + 0 + 0 + + + 51 + 379 + 3351 + 0 + 0 + + + 202 + 379 + 3349 + 4 + 0 + + + 202 + 379 + 3346 + 4 + 0 + + + 51 + 378 + 3348 + 2 + 0 + + + 51 + 378 + 3344 + 6 + 0 + + + 51 + 383 + 3354 + 6 + 0 + + + 51 + 382 + 3352 + 4 + 0 + + + 51 + 380 + 3356 + 4 + 0 + + + 51 + 378 + 3355 + 2 + 0 + + + 51 + 378 + 3352 + 6 + 0 + + + 51 + 376 + 3354 + 4 + 0 + + + 5 + 376 + 3352 + 6 + 0 + + + 51 + 377 + 3368 + 6 + 0 + + + 20 + 390 + 3340 + 4 + 0 + + + 51 + 386 + 3342 + 2 + 0 + + + 51 + 391 + 3356 + 6 + 0 + + + 51 + 385 + 3356 + 2 + 0 + + + 51 + 384 + 3353 + 2 + 0 + + + 51 + 391 + 3366 + 6 + 0 + + + 51 + 385 + 3367 + 2 + 0 + + + 51 + 385 + 3365 + 2 + 0 + + + 51 + 391 + 3369 + 6 + 0 + + + 20 + 393 + 3341 + 0 + 0 + + + 51 + 396 + 3347 + 2 + 0 + + + 51 + 396 + 3345 + 2 + 0 + + + 51 + 392 + 3350 + 6 + 0 + + + 51 + 392 + 3347 + 6 + 0 + + + 51 + 392 + 3354 + 6 + 0 + + + 2 + 369 + 3336 + 0 + 1 + + + 87 + 383 + 3353 + 0 + 1 + + + 51 + 357 + 3341 + 4 + 0 + + + 51 + 354 + 3354 + 4 + 0 + + + 145 + 353 + 3352 + 4 + 0 + + + 51 + 352 + 3354 + 4 + 0 + + + 51 + 352 + 3366 + 0 + 0 + + + 277 + 357 + 3374 + 0 + 0 + + + 51 + 356 + 3368 + 0 + 0 + + + 277 + 354 + 3371 + 0 + 0 + + + 2 + 355 + 3353 + 1 + 1 + + + 51 + 353 + 3331 + 2 + 0 + + + 51 + 353 + 3328 + 2 + 0 + + + 259 + 362 + 3328 + 2 + 0 + + + 51 + 371 + 3335 + 4 + 0 + + + 51 + 371 + 3329 + 0 + 0 + + + 236 + 369 + 3332 + 0 + 0 + + + 51 + 369 + 3329 + 0 + 0 + + + 51 + 378 + 3332 + 6 + 0 + + + 277 + 390 + 3331 + 0 + 0 + + + 51 + 387 + 3331 + 2 + 0 + + + 2 + 367 + 3332 + 1 + 1 + + + 2 + 374 + 3332 + 1 + 1 + + + 145 + 356 + 3321 + 0 + 0 + + + 145 + 364 + 3321 + 0 + 0 + + + 256 + 363 + 3325 + 2 + 0 + + + 5 + 362 + 3323 + 0 + 0 + + + 51 + 355 + 3318 + 0 + 0 + + + 51 + 365 + 3319 + 0 + 0 + + + 51 + 360 + 3318 + 0 + 0 + + + 143 + 347 + 3317 + 6 + 0 + + + 217 + 344 + 3317 + 5 + 0 + + + 143 + 344 + 3314 + 0 + 0 + + + 145 + 350 + 3326 + 2 + 0 + + + 51 + 346 + 3325 + 2 + 0 + + + 143 + 344 + 3320 + 4 + 0 + + + 145 + 350 + 3332 + 2 + 0 + + + 51 + 346 + 3330 + 2 + 0 + + + 145 + 346 + 3343 + 2 + 0 + + + 51 + 344 + 3342 + 2 + 0 + + + 143 + 341 + 3317 + 2 + 0 + + + 145 + 346 + 3346 + 2 + 0 + + + 51 + 344 + 3347 + 2 + 0 + + + 51 + 342 + 3355 + 6 + 0 + + + 51 + 340 + 3352 + 2 + 0 + + + 51 + 338 + 3358 + 2 + 0 + + + 51 + 351 + 3356 + 6 + 0 + + + 215 + 350 + 3353 + 6 + 0 + + + 51 + 345 + 3357 + 2 + 0 + + + 299 + 332 + 3367 + 6 + 0 + + + 46 + 332 + 3366 + 6 + 0 + + + 51 + 330 + 3361 + 0 + 0 + + + 51 + 340 + 3365 + 4 + 0 + + + 51 + 340 + 3363 + 0 + 0 + + + 51 + 337 + 3366 + 2 + 0 + + + 45 + 349 + 3367 + 6 + 0 + + + 45 + 349 + 3366 + 6 + 0 + + + 45 + 349 + 3365 + 6 + 0 + + + 45 + 349 + 3364 + 6 + 0 + + + 51 + 327 + 3361 + 0 + 0 + + + 299 + 325 + 3367 + 6 + 0 + + + 46 + 325 + 3366 + 4 + 0 + + + 51 + 325 + 3364 + 2 + 0 + + + 51 + 327 + 3374 + 4 + 0 + + + 51 + 325 + 3371 + 2 + 0 + + + 46 + 325 + 3369 + 6 + 0 + + + 46 + 332 + 3369 + 6 + 0 + + + 51 + 330 + 3374 + 4 + 0 + + + 277 + 341 + 3372 + 0 + 0 + + + 51 + 341 + 3371 + 2 + 0 + + + 51 + 337 + 3369 + 2 + 0 + + + 45 + 349 + 3368 + 6 + 0 + + + 51 + 342 + 3381 + 2 + 0 + + + 51 + 342 + 3377 + 2 + 0 + + + 51 + 351 + 3379 + 4 + 0 + + + 277 + 349 + 3376 + 0 + 0 + + + 51 + 346 + 3379 + 4 + 0 + + + 51 + 357 + 3378 + 4 + 0 + + + 277 + 353 + 3377 + 0 + 0 + + + 51 + 342 + 3385 + 6 + 0 + + + 22 + 340 + 3391 + 0 + 0 + + + 51 + 340 + 3389 + 2 + 0 + + + 51 + 340 + 3386 + 2 + 0 + + + 55 + 351 + 3391 + 2 + 0 + + + 272 + 350 + 3390 + 0 + 0 + + + 55 + 349 + 3389 + 1 + 0 + + + 55 + 347 + 3389 + 6 + 0 + + + 272 + 345 + 3389 + 0 + 0 + + + 272 + 344 + 3389 + 0 + 0 + + + 55 + 342 + 3395 + 3 + 0 + + + 22 + 340 + 3392 + 0 + 0 + + + 51 + 353 + 3399 + 6 + 0 + + + 51 + 353 + 3394 + 6 + 0 + + + 51 + 350 + 3405 + 6 + 0 + + + 51 + 348 + 3405 + 2 + 0 + + + 51 + 344 + 3400 + 2 + 0 + + + 15 + 341 + 3414 + 6 + 0 + + + 51 + 341 + 3412 + 2 + 0 + + + 51 + 355 + 3412 + 6 + 0 + + + 15 + 354 + 3414 + 2 + 0 + + + 1 + 345 + 3414 + 1 + 1 + + + 1 + 352 + 3414 + 1 + 1 + + + 281 + 341 + 3421 + 0 + 0 + + + 15 + 341 + 3419 + 6 + 0 + + + 51 + 341 + 3417 + 2 + 0 + + + 273 + 350 + 3416 + 6 + 0 + + + 63 + 348 + 3421 + 2 + 0 + + + 273 + 346 + 3416 + 6 + 0 + + + 281 + 355 + 3421 + 0 + 0 + + + 51 + 355 + 3417 + 6 + 0 + + + 15 + 354 + 3419 + 2 + 0 + + + 279 + 361 + 3422 + 4 + 0 + + + 1 + 345 + 3420 + 1 + 1 + + + 1 + 352 + 3420 + 1 + 1 + + + 25 + 342 + 3431 + 0 + 0 + + + 25 + 342 + 3428 + 0 + 0 + + + 9 + 342 + 3424 + 0 + 0 + + + 9 + 351 + 3424 + 0 + 0 + + + 25 + 354 + 3431 + 0 + 0 + + + 25 + 354 + 3428 + 0 + 0 + + + 279 + 361 + 3430 + 0 + 0 + + + 83 + 360 + 3428 + 0 + 1 + + + 83 + 360 + 3425 + 0 + 1 + + + 143 + 343 + 3436 + 4 + 0 + + + 25 + 342 + 3434 + 0 + 0 + + + 143 + 351 + 3436 + 4 + 0 + + + 10 + 349 + 3435 + 2 + 0 + + + 10 + 348 + 3435 + 2 + 0 + + + 10 + 347 + 3435 + 2 + 0 + + + 143 + 345 + 3436 + 4 + 0 + + + 25 + 354 + 3434 + 0 + 0 + + + 143 + 353 + 3436 + 4 + 0 + + + 143 + 407 + 3344 + 0 + 0 + + + 51 + 407 + 3340 + 4 + 0 + + + 205 + 406 + 3338 + 4 + 0 + + + 205 + 404 + 3338 + 4 + 0 + + + 51 + 412 + 3340 + 4 + 0 + + + 5 + 412 + 3339 + 0 + 0 + + + 277 + 410 + 3339 + 4 + 0 + + + 143 + 413 + 3349 + 6 + 0 + + + 143 + 413 + 3347 + 6 + 0 + + + 143 + 411 + 3351 + 4 + 0 + + + 143 + 410 + 3344 + 0 + 0 + + + 143 + 408 + 3351 + 4 + 0 + + + 51 + 413 + 3373 + 0 + 0 + + + 277 + 399 + 3331 + 0 + 0 + + + 277 + 396 + 3331 + 0 + 0 + + + 277 + 393 + 3331 + 0 + 0 + + + 51 + 407 + 3333 + 0 + 0 + + + 277 + 401 + 3334 + 0 + 0 + + + 51 + 412 + 3333 + 0 + 0 + + + 205 + 410 + 3335 + 4 + 0 + + + 51 + 409 + 3333 + 0 + 0 + + + 301 + 421 + 3336 + 0 + 0 + + + 45 + 100 + 1431 + 2 + 0 + + + 45 + 100 + 1430 + 2 + 0 + + + 45 + 100 + 1429 + 2 + 0 + + + 45 + 100 + 1428 + 2 + 0 + + + 45 + 99 + 1431 + 4 + 0 + + + 45 + 98 + 1431 + 4 + 0 + + + 45 + 97 + 1431 + 4 + 0 + + + 45 + 100 + 1437 + 2 + 0 + + + 45 + 100 + 1436 + 2 + 0 + + + 45 + 100 + 1435 + 2 + 0 + + + 45 + 100 + 1434 + 2 + 0 + + + 45 + 99 + 1437 + 4 + 0 + + + 45 + 99 + 1434 + 0 + 0 + + + 45 + 98 + 1437 + 4 + 0 + + + 45 + 97 + 1437 + 4 + 0 + + + 44 + 97 + 1434 + 4 + 0 + + + 15 + 104 + 1419 + 2 + 0 + + + 6 + 104 + 1417 + 0 + 0 + + + 6 + 581 + 1465 + 6 + 0 + + + 6 + 584 + 1467 + 4 + 0 + + + 340 + 614 + 3399 + 0 + 0 + + + 51 + 610 + 3399 + 2 + 0 + + + 51 + 610 + 3396 + 2 + 0 + + + 340 + 614 + 3401 + 0 + 0 + + + 5 + 618 + 3383 + 4 + 0 + + + 51 + 619 + 3389 + 6 + 0 + + + 51 + 619 + 3385 + 6 + 0 + + + 51 + 617 + 3385 + 2 + 0 + + + 51 + 619 + 3392 + 6 + 0 + + + 51 + 618 + 3399 + 6 + 0 + + + 51 + 618 + 3396 + 6 + 0 + + + 3 + 279 + 1599 + 6 + 0 + + + 3 + 278 + 1599 + 6 + 0 + + + 45 + 277 + 1603 + 2 + 0 + + + 45 + 277 + 1602 + 2 + 0 + + + 6 + 276 + 1603 + 2 + 0 + + + 15 + 273 + 1602 + 0 + 0 + + + 34 + 40 + 559 + 6 + 0 + + + 283 + 40 + 555 + 0 + 0 + + + 1064 + 42 + 565 + 6 + 0 + + + 283 + 42 + 562 + 2 + 0 + + + 284 + 41 + 562 + 0 + 0 + + + 34 + 41 + 561 + 0 + 0 + + + 284 + 40 + 562 + 0 + 0 + + + 34 + 40 + 561 + 2 + 0 + + + 283 + 42 + 573 + 2 + 0 + + + 284 + 42 + 572 + 2 + 0 + + + 284 + 42 + 571 + 2 + 0 + + + 284 + 42 + 570 + 2 + 0 + + + 284 + 42 + 569 + 2 + 0 + + + 284 + 41 + 573 + 0 + 0 + + + 283 + 40 + 569 + 3 + 0 + + + 34 + 54 + 562 + 7 + 0 + + + 0 + 53 + 561 + 7 + 0 + + + 0 + 51 + 567 + 7 + 0 + + + 1 + 51 + 565 + 0 + 0 + + + 37 + 50 + 563 + 7 + 0 + + + 20 + 55 + 575 + 0 + 0 + + + 34 + 55 + 568 + 7 + 0 + + + 20 + 52 + 575 + 0 + 0 + + + 1 + 51 + 569 + 0 + 0 + + + 20 + 49 + 575 + 0 + 0 + + + 32 + 55 + 585 + 0 + 0 + + + 34 + 50 + 589 + 0 + 0 + + + 34 + 60 + 561 + 7 + 0 + + + 34 + 58 + 561 + 7 + 0 + + + 0 + 57 + 564 + 7 + 0 + + + 1089 + 59 + 573 + 0 + 0 + + + 1 + 59 + 569 + 0 + 0 + + + 20 + 58 + 575 + 0 + 0 + + + 37 + 68 + 563 + 7 + 0 + + + 1 + 68 + 560 + 0 + 0 + + + 34 + 67 + 567 + 7 + 0 + + + 34 + 66 + 565 + 7 + 0 + + + 0 + 64 + 563 + 0 + 0 + + + 20 + 70 + 575 + 0 + 0 + + + 20 + 67 + 575 + 0 + 0 + + + 34 + 67 + 574 + 4 + 0 + + + 20 + 64 + 575 + 0 + 0 + + + 34 + 64 + 574 + 4 + 0 + + + 102 + 68 + 586 + 0 + 0 + + + 195 + 68 + 585 + 0 + 0 + + + 34 + 79 + 560 + 7 + 0 + + + 1 + 78 + 564 + 7 + 0 + + + 1 + 75 + 562 + 7 + 0 + + + 20 + 73 + 575 + 0 + 0 + + + 98 + 72 + 581 + 0 + 0 + + + 98 + 74 + 587 + 0 + 0 + + + 283 + 38 + 555 + 0 + 0 + + + 37 + 38 + 553 + 0 + 0 + + + 283 + 37 + 558 + 2 + 0 + + + 309 + 37 + 553 + 0 + 0 + + + 37 + 36 + 554 + 0 + 0 + + + 283 + 35 + 559 + 2 + 0 + + + 283 + 35 + 554 + 0 + 0 + + + 283 + 35 + 552 + 0 + 0 + + + 283 + 32 + 553 + 0 + 0 + + + 283 + 39 + 566 + 5 + 0 + + + 284 + 39 + 562 + 0 + 0 + + + 283 + 39 + 560 + 2 + 0 + + + 284 + 38 + 562 + 0 + 0 + + + 34 + 38 + 561 + 1 + 0 + + + 284 + 37 + 562 + 0 + 0 + + + 283 + 37 + 561 + 2 + 0 + + + 34 + 37 + 560 + 2 + 0 + + + 284 + 36 + 562 + 0 + 0 + + + 284 + 35 + 562 + 0 + 0 + + + 34 + 35 + 561 + 6 + 0 + + + 284 + 34 + 562 + 0 + 0 + + + 284 + 33 + 562 + 0 + 0 + + + 284 + 32 + 562 + 0 + 0 + + + 283 + 32 + 561 + 2 + 0 + + + 284 + 39 + 573 + 0 + 0 + + + 284 + 38 + 573 + 0 + 0 + + + 34 + 38 + 571 + 5 + 0 + + + 0 + 38 + 568 + 7 + 0 + + + 284 + 37 + 573 + 0 + 0 + + + 284 + 36 + 573 + 0 + 0 + + + 34 + 36 + 569 + 3 + 0 + + + 284 + 35 + 573 + 0 + 0 + + + 284 + 34 + 573 + 0 + 0 + + + 283 + 34 + 571 + 7 + 0 + + + 283 + 34 + 568 + 0 + 0 + + + 284 + 33 + 573 + 0 + 0 + + + 284 + 32 + 573 + 0 + 0 + + + 34 + 32 + 570 + 7 + 0 + + + 1 + 36 + 551 + 0 + 0 + + + 34 + 32 + 544 + 0 + 0 + + + 1056 + 31 + 543 + 5 + 0 + + + 1072 + 31 + 542 + 0 + 0 + + + 1044 + 31 + 538 + 2 + 0 + + + 1044 + 30 + 540 + 2 + 0 + + + 404 + 28 + 541 + 4 + 0 + + + 1044 + 27 + 542 + 0 + 0 + + + 404 + 27 + 541 + 6 + 0 + + + 1044 + 26 + 542 + 2 + 0 + + + 402 + 25 + 543 + 6 + 0 + + + 401 + 24 + 542 + 6 + 0 + + + 34 + 24 + 537 + 0 + 0 + + + 1050 + 24 + 536 + 6 + 0 + + + 34 + 30 + 545 + 0 + 0 + + + 1072 + 30 + 544 + 0 + 0 + + + 34 + 29 + 550 + 6 + 0 + + + 34 + 29 + 544 + 0 + 0 + + + 34 + 28 + 550 + 7 + 0 + + + 34 + 26 + 544 + 0 + 0 + + + 34 + 25 + 550 + 0 + 0 + + + 34 + 25 + 547 + 0 + 0 + + + 37 + 24 + 547 + 0 + 0 + + + 1044 + 24 + 545 + 0 + 0 + + + 34 + 29 + 553 + 5 + 0 + + + 34 + 27 + 554 + 2 + 0 + + + 33 + 27 + 553 + 5 + 0 + + + 284 + 31 + 562 + 0 + 0 + + + 284 + 30 + 562 + 0 + 0 + + + 285 + 29 + 566 + 2 + 0 + + + 284 + 29 + 562 + 0 + 0 + + + 285 + 28 + 567 + 2 + 0 + + + 285 + 28 + 565 + 2 + 0 + + + 284 + 28 + 562 + 0 + 0 + + + 285 + 27 + 566 + 2 + 0 + + + 284 + 27 + 562 + 0 + 0 + + + 284 + 26 + 562 + 0 + 0 + + + 284 + 25 + 562 + 0 + 0 + + + 283 + 24 + 563 + 0 + 0 + + + 284 + 24 + 562 + 0 + 0 + + + 284 + 31 + 573 + 0 + 0 + + + 283 + 31 + 570 + 2 + 0 + + + 145 + 30 + 573 + 2 + 0 + + + 145 + 30 + 572 + 2 + 0 + + + 145 + 30 + 571 + 2 + 0 + + + 145 + 30 + 570 + 2 + 0 + + + 283 + 30 + 569 + 2 + 0 + + + 17 + 29 + 573 + 0 + 0 + + + 71 + 29 + 570 + 6 + 0 + + + 283 + 28 + 574 + 0 + 0 + + + 17 + 28 + 573 + 0 + 0 + + + 182 + 28 + 571 + 6 + 0 + + + 17 + 27 + 573 + 0 + 0 + + + 182 + 27 + 571 + 6 + 0 + + + 283 + 26 + 574 + 0 + 0 + + + 17 + 26 + 573 + 0 + 0 + + + 283 + 25 + 574 + 0 + 0 + + + 17 + 25 + 573 + 0 + 0 + + + 283 + 24 + 574 + 0 + 0 + + + 25 + 24 + 573 + 6 + 0 + + + 283 + 24 + 569 + 0 + 0 + + + 34 + 34 + 540 + 0 + 0 + + + 1072 + 34 + 538 + 0 + 0 + + + 1042 + 34 + 536 + 0 + 0 + + + 1056 + 33 + 540 + 5 + 0 + + + 34 + 32 + 543 + 0 + 0 + + + 1073 + 32 + 541 + 0 + 0 + + + 1044 + 32 + 537 + 0 + 0 + + + 1 + 24 + 566 + 1 + 1 + + + 1 + 27 + 570 + 0 + 1 + + + 402 + 23 + 543 + 6 + 0 + + + 1042 + 23 + 537 + 0 + 0 + + + 1042 + 22 + 538 + 0 + 0 + + + 1042 + 21 + 538 + 0 + 0 + + + 1075 + 20 + 538 + 0 + 0 + + + 1042 + 20 + 537 + 0 + 0 + + + 1082 + 19 + 540 + 0 + 0 + + + 1082 + 19 + 539 + 0 + 0 + + + 1075 + 19 + 538 + 0 + 0 + + + 1075 + 19 + 537 + 0 + 0 + + + 1050 + 19 + 536 + 6 + 0 + + + 1082 + 18 + 540 + 0 + 0 + + + 1075 + 18 + 538 + 1 + 0 + + + 34 + 17 + 542 + 0 + 0 + + + 21 + 16 + 542 + 4 + 0 + + + 21 + 16 + 540 + 4 + 0 + + + 21 + 16 + 538 + 4 + 0 + + + 37 + 23 + 548 + 0 + 0 + + + 402 + 23 + 544 + 6 + 0 + + + 34 + 22 + 550 + 0 + 0 + + + 34 + 22 + 548 + 0 + 0 + + + 1044 + 22 + 546 + 0 + 0 + + + 37 + 21 + 549 + 0 + 0 + + + 402 + 21 + 545 + 6 + 0 + + + 402 + 20 + 550 + 6 + 0 + + + 37 + 20 + 549 + 0 + 0 + + + 402 + 20 + 548 + 6 + 0 + + + 1044 + 20 + 547 + 0 + 0 + + + 1 + 20 + 546 + 1 + 0 + + + 1072 + 19 + 551 + 7 + 0 + + + 37 + 19 + 550 + 0 + 0 + + + 1 + 19 + 549 + 1 + 0 + + + 402 + 19 + 548 + 6 + 0 + + + 1044 + 19 + 547 + 2 + 0 + + + 34 + 18 + 551 + 0 + 0 + + + 402 + 18 + 550 + 6 + 0 + + + 1044 + 18 + 549 + 2 + 0 + + + 402 + 17 + 551 + 6 + 0 + + + 402 + 17 + 550 + 6 + 0 + + + 402 + 17 + 547 + 6 + 0 + + + 1044 + 16 + 551 + 0 + 0 + + + 1072 + 16 + 549 + 5 + 0 + + + 34 + 21 + 559 + 0 + 0 + + + 402 + 19 + 552 + 6 + 0 + + + 0 + 18 + 559 + 0 + 0 + + + 402 + 18 + 553 + 6 + 0 + + + 37 + 17 + 553 + 0 + 0 + + + 1072 + 17 + 552 + 1 + 0 + + + 37 + 16 + 554 + 0 + 0 + + + 1072 + 16 + 553 + 2 + 0 + + + 71 + 23 + 567 + 4 + 0 + + + 7 + 23 + 565 + 2 + 0 + + + 7 + 23 + 564 + 2 + 0 + + + 284 + 23 + 562 + 0 + 0 + + + 3 + 22 + 564 + 2 + 0 + + + 7 + 22 + 563 + 4 + 0 + + + 284 + 22 + 562 + 0 + 0 + + + 278 + 21 + 566 + 6 + 0 + + + 3 + 21 + 564 + 2 + 0 + + + 7 + 21 + 563 + 4 + 0 + + + 284 + 21 + 562 + 0 + 0 + + + 34 + 21 + 560 + 0 + 0 + + + 27 + 20 + 563 + 0 + 0 + + + 284 + 20 + 562 + 0 + 0 + + + 29 + 19 + 565 + 2 + 0 + + + 29 + 19 + 563 + 2 + 0 + + + 284 + 19 + 562 + 0 + 0 + + + 34 + 19 + 561 + 0 + 0 + + + 1 + 19 + 560 + 0 + 0 + + + 284 + 18 + 562 + 0 + 0 + + + 71 + 17 + 563 + 6 + 0 + + + 284 + 17 + 562 + 0 + 0 + + + 1 + 17 + 560 + 0 + 0 + + + 284 + 16 + 562 + 0 + 0 + + + 1078 + 23 + 569 + 4 + 0 + + + 283 + 22 + 574 + 0 + 0 + + + 179 + 22 + 573 + 0 + 0 + + + 278 + 21 + 569 + 6 + 0 + + + 47 + 19 + 573 + 2 + 0 + + + 47 + 19 + 571 + 2 + 0 + + + 278 + 19 + 568 + 6 + 0 + + + 283 + 18 + 574 + 0 + 0 + + + 1090 + 17 + 573 + 2 + 0 + + + 47 + 17 + 571 + 2 + 0 + + + 1104 + 17 + 570 + 6 + 0 + + + 1104 + 17 + 569 + 6 + 0 + + + 24 + 17 + 568 + 2 + 0 + + + 3 + 15 + 541 + 0 + 0 + + + 21 + 14 + 538 + 4 + 0 + + + 3 + 13 + 541 + 0 + 0 + + + 21 + 12 + 538 + 7 + 0 + + + 97 + 11 + 536 + 3 + 0 + + + 21 + 10 + 542 + 2 + 0 + + + 1085 + 10 + 541 + 6 + 0 + + + 21 + 10 + 540 + 0 + 0 + + + 97 + 10 + 536 + 4 + 0 + + + 8 + 8 + 540 + 6 + 0 + + + 8 + 8 + 539 + 4 + 0 + + + 1042 + 14 + 551 + 0 + 0 + + + 283 + 12 + 546 + 1 + 0 + + + 0 + 11 + 547 + 7 + 0 + + + 1058 + 9 + 550 + 2 + 0 + + + 1058 + 9 + 546 + 7 + 0 + + + 1058 + 9 + 545 + 0 + 0 + + + 98 + 8 + 551 + 5 + 0 + + + 98 + 8 + 549 + 0 + 0 + + + 1058 + 8 + 544 + 0 + 0 + + + 34 + 15 + 555 + 0 + 0 + + + 1042 + 15 + 553 + 0 + 0 + + + 1042 + 15 + 552 + 0 + 0 + + + 1042 + 14 + 554 + 0 + 0 + + + 1072 + 14 + 552 + 4 + 0 + + + 1042 + 13 + 555 + 0 + 0 + + + 1042 + 13 + 553 + 0 + 0 + + + 0 + 12 + 556 + 1 + 0 + + + 1042 + 12 + 554 + 0 + 0 + + + 34 + 11 + 559 + 7 + 0 + + + 309 + 10 + 556 + 2 + 0 + + + 34 + 9 + 558 + 0 + 0 + + + 34 + 9 + 555 + 7 + 0 + + + 284 + 15 + 567 + 2 + 0 + + + 284 + 15 + 566 + 2 + 0 + + + 284 + 15 + 565 + 2 + 0 + + + 284 + 15 + 564 + 2 + 0 + + + 284 + 15 + 563 + 2 + 0 + + + 284 + 15 + 562 + 0 + 0 + + + 0 + 15 + 561 + 0 + 0 + + + 0 + 14 + 566 + 0 + 0 + + + 283 + 13 + 566 + 4 + 0 + + + 284 + 15 + 574 + 2 + 0 + + + 284 + 15 + 573 + 2 + 0 + + + 284 + 15 + 572 + 2 + 0 + + + 284 + 15 + 571 + 2 + 0 + + + 284 + 15 + 570 + 2 + 0 + + + 284 + 15 + 569 + 2 + 0 + + + 284 + 15 + 568 + 2 + 0 + + + 0 + 14 + 574 + 0 + 0 + + + 0 + 14 + 572 + 6 + 0 + + + 0 + 14 + 571 + 0 + 0 + + + 0 + 14 + 569 + 0 + 0 + + + 0 + 13 + 573 + 5 + 0 + + + 1072 + 13 + 572 + 5 + 0 + + + 283 + 13 + 571 + 4 + 0 + + + 1072 + 13 + 570 + 3 + 0 + + + 1072 + 13 + 569 + 3 + 0 + + + 0 + 12 + 574 + 0 + 0 + + + 0 + 12 + 573 + 4 + 0 + + + 0 + 12 + 570 + 2 + 0 + + + 283 + 12 + 568 + 4 + 0 + + + 0 + 11 + 572 + 0 + 0 + + + 1072 + 10 + 574 + 2 + 0 + + + 1072 + 10 + 573 + 2 + 0 + + + 0 + 10 + 571 + 0 + 0 + + + 1072 + 9 + 572 + 7 + 0 + + + 196 + 9 + 537 + 1 + 1 + + + 1058 + 7 + 551 + 0 + 0 + + + 1058 + 7 + 550 + 6 + 0 + + + 1058 + 7 + 544 + 0 + 0 + + + 1058 + 6 + 544 + 0 + 0 + + + 34 + 4 + 548 + 3 + 0 + + + 34 + 3 + 547 + 5 + 0 + + + 1 + 2 + 549 + 2 + 0 + + + 1 + 1 + 551 + 2 + 0 + + + 283 + 1 + 549 + 2 + 0 + + + 34 + 1 + 547 + 7 + 0 + + + 34 + 0 + 546 + 4 + 0 + + + 1058 + 7 + 553 + 7 + 0 + + + 1058 + 6 + 554 + 0 + 0 + + + 98 + 6 + 553 + 4 + 0 + + + 1058 + 6 + 552 + 4 + 0 + + + 34 + 3 + 556 + 3 + 0 + + + 286 + 2 + 553 + 2 + 0 + + + 283 + 1 + 557 + 2 + 0 + + + 34 + 6 + 566 + 5 + 0 + + + 1072 + 6 + 565 + 7 + 0 + + + 34 + 5 + 565 + 3 + 0 + + + 34 + 5 + 561 + 7 + 0 + + + 1 + 4 + 566 + 2 + 0 + + + 0 + 3 + 563 + 1 + 0 + + + 1 + 2 + 564 + 2 + 0 + + + 0 + 2 + 560 + 0 + 0 + + + 34 + 1 + 567 + 7 + 0 + + + 0 + 7 + 574 + 0 + 0 + + + 1182 + 7 + 537 + 5 + 0 + + + 1058 + 5 + 543 + 0 + 0 + + + 34 + 5 + 537 + 1 + 0 + + + 34 + 5 + 536 + 0 + 0 + + + 1058 + 4 + 542 + 5 + 0 + + + 34 + 4 + 538 + 6 + 0 + + + 283 + 4 + 536 + 1 + 0 + + + 34 + 3 + 540 + 2 + 0 + + + 283 + 3 + 539 + 1 + 0 + + + 34 + 3 + 538 + 6 + 0 + + + 98 + 3 + 537 + 6 + 0 + + + 34 + 3 + 536 + 4 + 0 + + + 98 + 2 + 540 + 4 + 0 + + + 34 + 2 + 539 + 0 + 0 + + + 98 + 2 + 538 + 7 + 0 + + + 34 + 2 + 537 + 6 + 0 + + + 98 + 1 + 539 + 7 + 0 + + + 98 + 1 + 538 + 3 + 0 + + + 1058 + 0 + 540 + 6 + 0 + + + 98 + 0 + 539 + 7 + 0 + + + 283 + 0 + 536 + 1 + 0 + + + 1067 + 15 + 528 + 4 + 0 + + + 1052 + 14 + 534 + 0 + 0 + + + 34 + 13 + 534 + 0 + 0 + + + 1044 + 13 + 533 + 0 + 0 + + + 1060 + 13 + 528 + 4 + 0 + + + 1044 + 10 + 531 + 2 + 0 + + + 1044 + 10 + 528 + 2 + 0 + + + 34 + 8 + 533 + 0 + 0 + + + 1046 + 8 + 532 + 0 + 0 + + + 1046 + 8 + 530 + 0 + 0 + + + 1046 + 8 + 528 + 0 + 0 + + + 34 + 23 + 532 + 5 + 0 + + + 34 + 22 + 531 + 4 + 0 + + + 1 + 19 + 534 + 7 + 0 + + + 1042 + 18 + 535 + 0 + 0 + + + 1042 + 18 + 534 + 0 + 0 + + + 1066 + 17 + 528 + 6 + 0 + + + 1052 + 16 + 534 + 0 + 0 + + + 1044 + 16 + 533 + 0 + 0 + + + 1065 + 16 + 528 + 5 + 0 + + + 1044 + 31 + 531 + 2 + 0 + + + 1044 + 31 + 528 + 2 + 0 + + + 1056 + 29 + 531 + 5 + 0 + + + 34 + 29 + 530 + 0 + 0 + + + 1044 + 28 + 533 + 0 + 0 + + + 34 + 28 + 531 + 0 + 0 + + + 34 + 28 + 530 + 0 + 0 + + + 1066 + 27 + 528 + 5 + 0 + + + 1075 + 26 + 534 + 2 + 0 + + + 1042 + 25 + 535 + 0 + 0 + + + 1042 + 25 + 534 + 0 + 0 + + + 1050 + 25 + 533 + 6 + 0 + + + 1067 + 25 + 528 + 3 + 0 + + + 1060 + 24 + 528 + 4 + 0 + + + 1044 + 38 + 534 + 0 + 0 + + + 34 + 37 + 530 + 0 + 0 + + + 34 + 36 + 531 + 0 + 0 + + + 34 + 36 + 530 + 0 + 0 + + + 1044 + 35 + 535 + 0 + 0 + + + 34 + 34 + 531 + 0 + 0 + + + 1042 + 43 + 531 + 0 + 0 + + + 1042 + 42 + 532 + 0 + 0 + + + 1042 + 42 + 531 + 0 + 0 + + + 1042 + 42 + 530 + 0 + 0 + + + 1042 + 41 + 533 + 0 + 0 + + + 1042 + 41 + 531 + 0 + 0 + + + 1042 + 41 + 530 + 0 + 0 + + + 1042 + 41 + 529 + 0 + 0 + + + 1042 + 41 + 528 + 0 + 0 + + + 34 + 7 + 533 + 0 + 0 + + + 34 + 6 + 535 + 7 + 0 + + + 0 + 6 + 534 + 7 + 0 + + + 1046 + 6 + 532 + 0 + 0 + + + 1046 + 6 + 530 + 0 + 0 + + + 1046 + 6 + 528 + 0 + 0 + + + 34 + 4 + 534 + 6 + 0 + + + 283 + 4 + 531 + 1 + 0 + + + 402 + 4 + 530 + 5 + 0 + + + 0 + 3 + 532 + 2 + 0 + + + 34 + 3 + 529 + 6 + 0 + + + 402 + 3 + 528 + 7 + 0 + + + 34 + 2 + 532 + 0 + 0 + + + 402 + 2 + 530 + 2 + 0 + + + 402 + 2 + 529 + 4 + 0 + + + 283 + 1 + 534 + 1 + 0 + + + 402 + 1 + 531 + 7 + 0 + + + 283 + 1 + 530 + 5 + 0 + + + 283 + 0 + 534 + 1 + 0 + + + 402 + 0 + 533 + 5 + 0 + + + 283 + 0 + 529 + 1 + 0 + + + 1048 + 23 + 525 + 0 + 0 + + + 1048 + 23 + 524 + 2 + 0 + + + 1048 + 23 + 523 + 2 + 0 + + + 1048 + 23 + 522 + 2 + 0 + + + 1063 + 23 + 521 + 2 + 0 + + + 1061 + 21 + 525 + 4 + 0 + + + 1065 + 21 + 524 + 0 + 0 + + + 1067 + 21 + 523 + 2 + 0 + + + 1066 + 21 + 522 + 2 + 0 + + + 1066 + 21 + 521 + 2 + 0 + + + 1067 + 21 + 520 + 2 + 0 + + + 1067 + 20 + 525 + 0 + 0 + + + 1065 + 20 + 524 + 0 + 0 + + + 1067 + 20 + 522 + 2 + 0 + + + 1065 + 20 + 521 + 0 + 0 + + + 1066 + 20 + 520 + 2 + 0 + + + 1066 + 19 + 525 + 0 + 0 + + + 1067 + 19 + 524 + 2 + 0 + + + 1065 + 19 + 523 + 0 + 0 + + + 1065 + 19 + 522 + 0 + 0 + + + 1065 + 19 + 521 + 2 + 0 + + + 1067 + 17 + 527 + 4 + 0 + + + 1067 + 17 + 526 + 0 + 0 + + + 1048 + 17 + 525 + 0 + 0 + + + 1048 + 17 + 524 + 6 + 0 + + + 1048 + 17 + 523 + 6 + 0 + + + 1048 + 17 + 522 + 6 + 0 + + + 1061 + 17 + 521 + 6 + 0 + + + 1067 + 16 + 526 + 0 + 0 + + + 1048 + 16 + 525 + 0 + 0 + + + 1067 + 16 + 523 + 0 + 0 + + + 1066 + 16 + 521 + 0 + 0 + + + 1065 + 16 + 520 + 0 + 0 + + + 1044 + 31 + 525 + 2 + 0 + + + 1044 + 31 + 522 + 2 + 0 + + + 1048 + 28 + 525 + 0 + 0 + + + 1048 + 28 + 524 + 6 + 0 + + + 1048 + 28 + 523 + 6 + 0 + + + 1063 + 28 + 522 + 6 + 0 + + + 1048 + 28 + 520 + 6 + 0 + + + 1067 + 27 + 527 + 2 + 0 + + + 1048 + 27 + 525 + 0 + 0 + + + 1066 + 27 + 524 + 0 + 0 + + + 1065 + 27 + 523 + 0 + 0 + + + 1066 + 27 + 522 + 2 + 0 + + + 1067 + 27 + 521 + 2 + 0 + + + 1067 + 27 + 520 + 2 + 0 + + + 1067 + 26 + 527 + 2 + 0 + + + 1066 + 26 + 526 + 2 + 0 + + + 1048 + 26 + 525 + 0 + 0 + + + 214 + 26 + 523 + 1 + 0 + + + 1067 + 26 + 522 + 0 + 0 + + + 1067 + 25 + 526 + 0 + 0 + + + 1048 + 25 + 525 + 0 + 0 + + + 1067 + 25 + 524 + 4 + 0 + + + 1065 + 25 + 523 + 4 + 0 + + + 1049 + 25 + 521 + 2 + 0 + + + 1065 + 24 + 527 + 4 + 0 + + + 1067 + 24 + 526 + 5 + 0 + + + 1048 + 24 + 525 + 0 + 0 + + + 1065 + 24 + 524 + 4 + 0 + + + 1065 + 24 + 523 + 4 + 0 + + + 1066 + 24 + 522 + 2 + 0 + + + 1067 + 24 + 521 + 2 + 0 + + + 1067 + 24 + 520 + 4 + 0 + + + 1048 + 38 + 527 + 2 + 0 + + + 1048 + 38 + 526 + 2 + 0 + + + 1048 + 38 + 525 + 2 + 0 + + + 1048 + 38 + 524 + 2 + 0 + + + 1048 + 38 + 523 + 2 + 0 + + + 1048 + 38 + 522 + 2 + 0 + + + 1048 + 38 + 521 + 2 + 0 + + + 1048 + 38 + 520 + 2 + 0 + + + 1 + 36 + 527 + 7 + 0 + + + 1046 + 35 + 525 + 0 + 0 + + + 1046 + 33 + 525 + 0 + 0 + + + 1046 + 33 + 523 + 0 + 0 + + + 1046 + 33 + 521 + 0 + 0 + + + 1048 + 43 + 525 + 2 + 0 + + + 1048 + 43 + 524 + 2 + 0 + + + 1048 + 43 + 523 + 2 + 0 + + + 1048 + 43 + 522 + 2 + 0 + + + 1048 + 43 + 521 + 2 + 0 + + + 1048 + 43 + 520 + 2 + 0 + + + 1048 + 41 + 527 + 2 + 0 + + + 1048 + 41 + 526 + 2 + 0 + + + 1048 + 41 + 525 + 2 + 0 + + + 1048 + 41 + 524 + 2 + 0 + + + 1048 + 41 + 523 + 2 + 0 + + + 1048 + 41 + 522 + 2 + 0 + + + 1048 + 41 + 521 + 2 + 0 + + + 1048 + 41 + 520 + 2 + 0 + + + 1044 + 31 + 519 + 2 + 0 + + + 1044 + 31 + 516 + 2 + 0 + + + 1044 + 31 + 513 + 2 + 0 + + + 1048 + 28 + 519 + 6 + 0 + + + 1048 + 28 + 518 + 6 + 0 + + + 1048 + 28 + 517 + 4 + 0 + + + 1048 + 28 + 515 + 6 + 0 + + + 1048 + 28 + 514 + 6 + 0 + + + 1065 + 27 + 519 + 0 + 0 + + + 1048 + 27 + 517 + 4 + 0 + + + 1059 + 27 + 515 + 4 + 0 + + + 1 + 27 + 514 + 7 + 0 + + + 1067 + 26 + 519 + 0 + 0 + + + 1048 + 26 + 517 + 4 + 0 + + + 1059 + 26 + 516 + 6 + 0 + + + 1053 + 26 + 515 + 2 + 0 + + + 1066 + 26 + 514 + 0 + 0 + + + 1044 + 26 + 513 + 0 + 0 + + + 1067 + 25 + 519 + 0 + 0 + + + 1048 + 25 + 517 + 4 + 0 + + + 1065 + 25 + 516 + 6 + 0 + + + 1067 + 25 + 515 + 0 + 0 + + + 1067 + 25 + 514 + 6 + 0 + + + 1066 + 24 + 519 + 0 + 0 + + + 1048 + 24 + 517 + 4 + 0 + + + 1062 + 24 + 515 + 2 + 0 + + + 1048 + 38 + 519 + 2 + 0 + + + 1048 + 38 + 518 + 2 + 0 + + + 1048 + 38 + 517 + 2 + 0 + + + 1048 + 38 + 516 + 2 + 0 + + + 1048 + 38 + 515 + 2 + 0 + + + 1048 + 38 + 514 + 2 + 0 + + + 1048 + 38 + 513 + 2 + 0 + + + 1048 + 38 + 512 + 2 + 0 + + + 1046 + 33 + 519 + 0 + 0 + + + 1046 + 33 + 517 + 0 + 0 + + + 1046 + 33 + 513 + 0 + 0 + + + 34 + 47 + 512 + 2 + 0 + + + 34 + 46 + 513 + 3 + 0 + + + 1048 + 43 + 519 + 2 + 0 + + + 1048 + 43 + 518 + 2 + 0 + + + 1048 + 43 + 517 + 2 + 0 + + + 1048 + 43 + 516 + 2 + 0 + + + 1048 + 43 + 515 + 2 + 0 + + + 1048 + 43 + 514 + 2 + 0 + + + 1048 + 43 + 513 + 2 + 0 + + + 1048 + 43 + 512 + 2 + 0 + + + 1048 + 41 + 519 + 2 + 0 + + + 1048 + 41 + 518 + 2 + 0 + + + 1048 + 41 + 517 + 2 + 0 + + + 1048 + 41 + 516 + 2 + 0 + + + 1048 + 41 + 515 + 2 + 0 + + + 1048 + 41 + 514 + 2 + 0 + + + 1048 + 41 + 513 + 2 + 0 + + + 1048 + 41 + 512 + 2 + 0 + + + 1048 + 38 + 511 + 2 + 0 + + + 1048 + 38 + 510 + 2 + 0 + + + 1048 + 38 + 509 + 2 + 0 + + + 1048 + 38 + 508 + 2 + 0 + + + 1048 + 38 + 507 + 2 + 0 + + + 1048 + 38 + 506 + 2 + 0 + + + 1048 + 38 + 505 + 2 + 0 + + + 1048 + 38 + 504 + 2 + 0 + + + 1046 + 33 + 511 + 0 + 0 + + + 1046 + 33 + 509 + 0 + 0 + + + 1046 + 33 + 507 + 0 + 0 + + + 1046 + 33 + 505 + 0 + 0 + + + 1048 + 32 + 504 + 4 + 0 + + + 1072 + 47 + 511 + 0 + 0 + + + 1 + 47 + 508 + 3 + 0 + + + 34 + 47 + 506 + 3 + 0 + + + 34 + 47 + 505 + 6 + 0 + + + 1072 + 46 + 507 + 0 + 0 + + + 1072 + 45 + 510 + 0 + 0 + + + 34 + 45 + 504 + 7 + 0 + + + 1048 + 43 + 511 + 2 + 0 + + + 1048 + 43 + 510 + 2 + 0 + + + 1048 + 43 + 509 + 2 + 0 + + + 1048 + 43 + 508 + 2 + 0 + + + 1048 + 43 + 507 + 2 + 0 + + + 1048 + 43 + 506 + 2 + 0 + + + 1048 + 43 + 505 + 2 + 0 + + + 1048 + 43 + 504 + 2 + 0 + + + 1048 + 41 + 511 + 2 + 0 + + + 1048 + 41 + 510 + 2 + 0 + + + 1048 + 41 + 509 + 2 + 0 + + + 1048 + 41 + 508 + 2 + 0 + + + 1048 + 41 + 507 + 2 + 0 + + + 1048 + 41 + 506 + 2 + 0 + + + 1048 + 41 + 505 + 2 + 0 + + + 1048 + 41 + 504 + 2 + 0 + + + 1 + 55 + 509 + 1 + 0 + + + 283 + 51 + 507 + 5 + 0 + + + 283 + 51 + 505 + 5 + 0 + + + 1 + 50 + 511 + 1 + 0 + + + 34 + 49 + 510 + 6 + 0 + + + 34 + 49 + 507 + 1 + 0 + + + 283 + 49 + 505 + 3 + 0 + + + 34 + 48 + 511 + 7 + 0 + + + 283 + 48 + 509 + 5 + 0 + + + 34 + 48 + 506 + 2 + 0 + + + 1048 + 39 + 499 + 4 + 0 + + + 1048 + 39 + 496 + 0 + 0 + + + 1048 + 38 + 503 + 2 + 0 + + + 1048 + 38 + 499 + 4 + 0 + + + 1048 + 38 + 496 + 0 + 0 + + + 1048 + 37 + 502 + 4 + 0 + + + 1048 + 37 + 499 + 4 + 0 + + + 1048 + 37 + 496 + 0 + 0 + + + 1048 + 36 + 502 + 4 + 0 + + + 1048 + 36 + 499 + 4 + 0 + + + 1048 + 36 + 496 + 0 + 0 + + + 1048 + 35 + 502 + 4 + 0 + + + 1048 + 35 + 499 + 4 + 0 + + + 1048 + 35 + 496 + 0 + 0 + + + 1048 + 34 + 502 + 4 + 0 + + + 1048 + 34 + 499 + 4 + 0 + + + 1048 + 34 + 496 + 0 + 0 + + + 1048 + 33 + 502 + 4 + 0 + + + 1048 + 33 + 499 + 4 + 0 + + + 1048 + 33 + 496 + 0 + 0 + + + 1048 + 32 + 502 + 4 + 0 + + + 1048 + 32 + 499 + 4 + 0 + + + 1048 + 32 + 496 + 0 + 0 + + + 34 + 47 + 502 + 0 + 0 + + + 1048 + 43 + 503 + 2 + 0 + + + 1048 + 43 + 502 + 2 + 0 + + + 1048 + 43 + 501 + 2 + 0 + + + 1048 + 43 + 500 + 2 + 0 + + + 1048 + 43 + 499 + 2 + 0 + + + 1048 + 43 + 498 + 2 + 0 + + + 1048 + 43 + 497 + 2 + 0 + + + 1048 + 43 + 496 + 2 + 0 + + + 1048 + 42 + 496 + 0 + 0 + + + 1048 + 41 + 503 + 2 + 0 + + + 1048 + 41 + 502 + 2 + 0 + + + 1048 + 41 + 501 + 2 + 0 + + + 1048 + 41 + 500 + 2 + 0 + + + 1048 + 41 + 496 + 0 + 0 + + + 34 + 40 + 500 + 3 + 0 + + + 1048 + 40 + 499 + 4 + 0 + + + 1048 + 40 + 496 + 0 + 0 + + + 34 + 53 + 497 + 1 + 0 + + + 34 + 50 + 503 + 5 + 0 + + + 1042 + 38 + 493 + 2 + 0 + + + 1042 + 35 + 492 + 3 + 0 + + + 38 + 55 + 492 + 1 + 0 + + + 1 + 53 + 495 + 1 + 0 + + + 1 + 53 + 494 + 1 + 0 + + + 1 + 51 + 491 + 1 + 0 + + + 34 + 39 + 487 + 2 + 0 + + + 1 + 39 + 485 + 7 + 0 + + + 34 + 39 + 483 + 1 + 0 + + + 0 + 38 + 486 + 1 + 0 + + + 34 + 37 + 486 + 1 + 0 + + + 0 + 37 + 485 + 1 + 0 + + + 34 + 37 + 483 + 0 + 0 + + + 34 + 36 + 484 + 0 + 0 + + + 1056 + 35 + 486 + 5 + 0 + + + 1072 + 35 + 483 + 0 + 0 + + + 34 + 34 + 485 + 4 + 0 + + + 1072 + 42 + 487 + 0 + 0 + + + 34 + 41 + 485 + 4 + 0 + + + 34 + 40 + 486 + 6 + 0 + + + 306 + 40 + 485 + 2 + 0 + + + 1 + 54 + 486 + 1 + 0 + + + 1 + 51 + 474 + 1 + 0 + + + 34 + 31 + 485 + 7 + 0 + + + 1042 + 28 + 484 + 2 + 0 + + + 1042 + 25 + 486 + 2 + 0 + + + 0 + 24 + 487 + 1 + 0 + + + 1042 + 24 + 485 + 2 + 0 + + + 1048 + 31 + 502 + 4 + 0 + + + 1048 + 31 + 499 + 4 + 0 + + + 1048 + 31 + 496 + 0 + 0 + + + 1048 + 30 + 502 + 4 + 0 + + + 1048 + 30 + 499 + 4 + 0 + + + 1048 + 30 + 496 + 0 + 0 + + + 1048 + 29 + 502 + 4 + 0 + + + 1048 + 29 + 499 + 4 + 0 + + + 1048 + 29 + 496 + 0 + 0 + + + 1048 + 28 + 502 + 4 + 0 + + + 1048 + 28 + 499 + 4 + 0 + + + 1048 + 28 + 496 + 0 + 0 + + + 1048 + 27 + 502 + 4 + 0 + + + 1048 + 27 + 499 + 4 + 0 + + + 1048 + 27 + 496 + 0 + 0 + + + 1048 + 26 + 502 + 4 + 0 + + + 1048 + 26 + 499 + 4 + 0 + + + 1048 + 26 + 496 + 0 + 0 + + + 1048 + 25 + 502 + 4 + 0 + + + 1048 + 25 + 499 + 4 + 0 + + + 1048 + 25 + 496 + 0 + 0 + + + 1048 + 24 + 502 + 4 + 0 + + + 1048 + 24 + 499 + 4 + 0 + + + 1048 + 24 + 496 + 0 + 0 + + + 1044 + 31 + 510 + 2 + 0 + + + 1044 + 31 + 507 + 2 + 0 + + + 1048 + 31 + 504 + 4 + 0 + + + 1048 + 30 + 504 + 4 + 0 + + + 34 + 29 + 505 + 2 + 0 + + + 1048 + 29 + 504 + 4 + 0 + + + 1048 + 28 + 510 + 0 + 0 + + + 1048 + 28 + 509 + 6 + 0 + + + 1048 + 28 + 508 + 6 + 0 + + + 1048 + 28 + 507 + 6 + 0 + + + 1048 + 28 + 506 + 6 + 0 + + + 1048 + 28 + 505 + 6 + 0 + + + 1048 + 28 + 504 + 4 + 0 + + + 1048 + 27 + 510 + 0 + 0 + + + 1065 + 27 + 508 + 2 + 0 + + + 1066 + 27 + 506 + 2 + 0 + + + 1065 + 27 + 505 + 0 + 0 + + + 1048 + 27 + 504 + 4 + 0 + + + 1048 + 26 + 510 + 0 + 0 + + + 1065 + 26 + 508 + 4 + 0 + + + 1065 + 26 + 507 + 4 + 0 + + + 1066 + 26 + 506 + 4 + 0 + + + 1065 + 26 + 505 + 0 + 0 + + + 1048 + 26 + 504 + 4 + 0 + + + 1048 + 25 + 510 + 0 + 0 + + + 1059 + 25 + 508 + 2 + 0 + + + 1065 + 25 + 507 + 4 + 0 + + + 1048 + 25 + 504 + 4 + 0 + + + 1065 + 24 + 508 + 4 + 0 + + + 1065 + 24 + 507 + 2 + 0 + + + 1067 + 24 + 506 + 4 + 0 + + + 1059 + 24 + 505 + 0 + 0 + + + 1048 + 24 + 504 + 4 + 0 + + + 1042 + 22 + 483 + 2 + 0 + + + 1042 + 21 + 486 + 2 + 0 + + + 1042 + 21 + 484 + 2 + 0 + + + 1072 + 19 + 485 + 0 + 0 + + + 37 + 18 + 483 + 1 + 0 + + + 1 + 17 + 486 + 1 + 0 + + + 1072 + 16 + 486 + 7 + 0 + + + 0 + 18 + 495 + 7 + 0 + + + 1048 + 17 + 495 + 6 + 0 + + + 1048 + 17 + 494 + 6 + 0 + + + 1048 + 17 + 493 + 6 + 0 + + + 1048 + 17 + 492 + 4 + 0 + + + 1048 + 16 + 492 + 4 + 0 + + + 1048 + 23 + 502 + 4 + 0 + + + 1048 + 23 + 499 + 4 + 0 + + + 1048 + 23 + 496 + 0 + 0 + + + 1048 + 22 + 502 + 4 + 0 + + + 1048 + 22 + 499 + 4 + 0 + + + 1048 + 22 + 496 + 0 + 0 + + + 1048 + 21 + 502 + 4 + 0 + + + 1048 + 21 + 496 + 0 + 0 + + + 1048 + 20 + 502 + 4 + 0 + + + 1048 + 20 + 496 + 0 + 0 + + + 1048 + 19 + 502 + 6 + 0 + + + 1048 + 19 + 501 + 6 + 0 + + + 1048 + 19 + 500 + 6 + 0 + + + 1048 + 19 + 499 + 6 + 0 + + + 1048 + 19 + 498 + 6 + 0 + + + 1048 + 19 + 497 + 6 + 0 + + + 1048 + 19 + 496 + 6 + 0 + + + 1048 + 17 + 503 + 6 + 0 + + + 1048 + 17 + 502 + 6 + 0 + + + 1048 + 17 + 501 + 6 + 0 + + + 1048 + 17 + 500 + 6 + 0 + + + 1048 + 17 + 499 + 6 + 0 + + + 1048 + 17 + 498 + 6 + 0 + + + 1048 + 17 + 497 + 6 + 0 + + + 1048 + 17 + 496 + 6 + 0 + + + 1048 + 16 + 503 + 4 + 0 + + + 1075 + 16 + 502 + 2 + 0 + + + 1075 + 16 + 501 + 6 + 0 + + + 1062 + 23 + 509 + 4 + 0 + + + 1066 + 23 + 508 + 4 + 0 + + + 1065 + 23 + 506 + 4 + 0 + + + 1066 + 23 + 505 + 2 + 0 + + + 1048 + 23 + 504 + 4 + 0 + + + 1048 + 22 + 510 + 0 + 0 + + + 1067 + 22 + 507 + 0 + 0 + + + 1067 + 22 + 506 + 4 + 0 + + + 1048 + 22 + 504 + 4 + 0 + + + 0 + 21 + 511 + 7 + 0 + + + 1048 + 21 + 510 + 0 + 0 + + + 1067 + 21 + 508 + 4 + 0 + + + 1065 + 21 + 507 + 0 + 0 + + + 1067 + 21 + 505 + 2 + 0 + + + 1048 + 21 + 504 + 4 + 0 + + + 1048 + 20 + 510 + 0 + 0 + + + 1059 + 20 + 508 + 3 + 0 + + + 1066 + 20 + 507 + 0 + 0 + + + 1067 + 20 + 506 + 0 + 0 + + + 1067 + 20 + 505 + 0 + 0 + + + 1048 + 20 + 504 + 4 + 0 + + + 1044 + 19 + 511 + 2 + 0 + + + 1048 + 19 + 510 + 0 + 0 + + + 1048 + 19 + 509 + 2 + 0 + + + 1048 + 19 + 508 + 2 + 0 + + + 1048 + 19 + 507 + 2 + 0 + + + 1048 + 19 + 506 + 2 + 0 + + + 1048 + 19 + 505 + 2 + 0 + + + 1048 + 19 + 504 + 4 + 0 + + + 0 + 18 + 505 + 3 + 0 + + + 1048 + 18 + 504 + 4 + 0 + + + 1048 + 17 + 504 + 6 + 0 + + + 1044 + 16 + 511 + 0 + 0 + + + 1048 + 16 + 508 + 6 + 0 + + + 1048 + 16 + 507 + 6 + 0 + + + 1048 + 16 + 506 + 6 + 0 + + + 1048 + 16 + 505 + 6 + 0 + + + 1048 + 16 + 504 + 6 + 0 + + + 1 + 15 + 481 + 1 + 0 + + + 0 + 14 + 487 + 1 + 0 + + + 38 + 14 + 485 + 1 + 0 + + + 37 + 13 + 485 + 1 + 0 + + + 1072 + 13 + 484 + 7 + 0 + + + 34 + 12 + 486 + 1 + 0 + + + 0 + 12 + 484 + 1 + 0 + + + 37 + 12 + 482 + 1 + 0 + + + 1 + 10 + 485 + 1 + 0 + + + 0 + 9 + 486 + 1 + 0 + + + 34 + 9 + 484 + 1 + 0 + + + 1042 + 15 + 495 + 6 + 0 + + + 1048 + 15 + 492 + 4 + 0 + + + 217 + 14 + 495 + 1 + 0 + + + 1050 + 14 + 494 + 6 + 0 + + + 1048 + 14 + 492 + 4 + 0 + + + 1065 + 13 + 495 + 2 + 0 + + + 1042 + 13 + 494 + 6 + 0 + + + 1048 + 13 + 492 + 4 + 0 + + + 1065 + 12 + 495 + 2 + 0 + + + 1042 + 12 + 494 + 6 + 0 + + + 1048 + 12 + 492 + 4 + 0 + + + 1042 + 11 + 495 + 6 + 0 + + + 1042 + 11 + 494 + 6 + 0 + + + 1048 + 11 + 492 + 4 + 0 + + + 34 + 10 + 495 + 3 + 0 + + + 1048 + 10 + 492 + 4 + 0 + + + 34 + 9 + 493 + 5 + 0 + + + 1048 + 9 + 492 + 4 + 0 + + + 34 + 8 + 493 + 5 + 0 + + + 1048 + 8 + 492 + 4 + 0 + + + 1048 + 15 + 503 + 4 + 0 + + + 1076 + 15 + 502 + 0 + 0 + + + 1042 + 15 + 499 + 6 + 0 + + + 1042 + 15 + 498 + 6 + 0 + + + 1042 + 15 + 497 + 6 + 0 + + + 1042 + 15 + 496 + 6 + 0 + + + 1048 + 14 + 503 + 4 + 0 + + + 1075 + 14 + 502 + 3 + 0 + + + 1048 + 14 + 500 + 0 + 0 + + + 1051 + 14 + 498 + 2 + 0 + + + 1067 + 14 + 497 + 0 + 0 + + + 1065 + 14 + 496 + 0 + 0 + + + 1048 + 13 + 503 + 4 + 0 + + + 1048 + 13 + 500 + 0 + 0 + + + 1067 + 13 + 498 + 0 + 0 + + + 1066 + 13 + 497 + 4 + 0 + + + 1066 + 13 + 496 + 2 + 0 + + + 1057 + 12 + 497 + 4 + 0 + + + 1063 + 11 + 499 + 4 + 0 + + + 1066 + 11 + 497 + 2 + 0 + + + 1066 + 11 + 496 + 2 + 0 + + + 1048 + 10 + 500 + 0 + 0 + + + 1067 + 10 + 498 + 0 + 0 + + + 1067 + 10 + 497 + 0 + 0 + + + 1050 + 10 + 496 + 6 + 0 + + + 34 + 9 + 503 + 7 + 0 + + + 1051 + 9 + 500 + 0 + 0 + + + 1042 + 9 + 499 + 6 + 0 + + + 1042 + 9 + 498 + 6 + 0 + + + 1042 + 9 + 497 + 6 + 0 + + + 1042 + 9 + 496 + 6 + 0 + + + 286 + 8 + 502 + 4 + 0 + + + 1066 + 15 + 508 + 0 + 0 + + + 1065 + 15 + 507 + 0 + 0 + + + 1067 + 15 + 506 + 0 + 0 + + + 1059 + 15 + 505 + 6 + 0 + + + 1065 + 15 + 504 + 0 + 0 + + + 1062 + 14 + 508 + 4 + 0 + + + 1059 + 14 + 507 + 1 + 0 + + + 1066 + 14 + 506 + 0 + 0 + + + 1095 + 14 + 504 + 4 + 0 + + + 1044 + 13 + 511 + 0 + 0 + + + 1048 + 13 + 508 + 2 + 0 + + + 1048 + 13 + 507 + 2 + 0 + + + 1048 + 13 + 506 + 2 + 0 + + + 1048 + 13 + 505 + 2 + 0 + + + 1048 + 13 + 504 + 2 + 0 + + + 402 + 12 + 504 + 3 + 0 + + + 1042 + 11 + 511 + 0 + 0 + + + 34 + 11 + 510 + 0 + 0 + + + 34 + 11 + 509 + 4 + 0 + + + 1 + 11 + 508 + 2 + 0 + + + 1044 + 10 + 510 + 2 + 0 + + + 34 + 10 + 508 + 2 + 0 + + + 1044 + 10 + 507 + 2 + 0 + + + 1 + 9 + 504 + 3 + 0 + + + 0 + 6 + 483 + 1 + 0 + + + 34 + 4 + 487 + 1 + 0 + + + 34 + 3 + 486 + 1 + 0 + + + 37 + 3 + 484 + 1 + 0 + + + 1072 + 3 + 480 + 5 + 0 + + + 1072 + 2 + 481 + 7 + 0 + + + 1048 + 7 + 495 + 2 + 0 + + + 1048 + 7 + 494 + 2 + 0 + + + 1048 + 7 + 493 + 2 + 0 + + + 1048 + 7 + 492 + 4 + 0 + + + 34 + 0 + 492 + 1 + 0 + + + 1048 + 7 + 503 + 2 + 0 + + + 1048 + 7 + 502 + 2 + 0 + + + 1048 + 7 + 501 + 2 + 0 + + + 1048 + 7 + 500 + 2 + 0 + + + 1048 + 7 + 499 + 2 + 0 + + + 1048 + 7 + 498 + 2 + 0 + + + 1048 + 7 + 497 + 2 + 0 + + + 1048 + 7 + 496 + 2 + 0 + + + 285 + 2 + 501 + 2 + 0 + + + 34 + 1 + 496 + 1 + 0 + + + 34 + 0 + 503 + 2 + 0 + + + 1044 + 7 + 510 + 2 + 0 + + + 1044 + 7 + 507 + 2 + 0 + + + 1044 + 7 + 504 + 2 + 0 + + + 34 + 4 + 507 + 2 + 0 + + + 285 + 4 + 506 + 2 + 0 + + + 285 + 3 + 510 + 2 + 0 + + + 34 + 3 + 504 + 2 + 0 + + + 1072 + 2 + 510 + 5 + 0 + + + 34 + 2 + 507 + 4 + 0 + + + 34 + 2 + 506 + 2 + 0 + + + 308 + 1 + 508 + 2 + 0 + + + 34 + 1 + 506 + 0 + 0 + + + 34 + 1 + 505 + 7 + 0 + + + 34 + 0 + 510 + 2 + 0 + + + 1044 + 7 + 519 + 2 + 0 + + + 1044 + 7 + 516 + 2 + 0 + + + 1044 + 7 + 513 + 2 + 0 + + + 1072 + 2 + 514 + 3 + 0 + + + 285 + 2 + 512 + 2 + 0 + + + 1072 + 1 + 517 + 1 + 0 + + + 285 + 1 + 514 + 2 + 0 + + + 285 + 0 + 512 + 2 + 0 + + + 1066 + 15 + 519 + 4 + 0 + + + 214 + 15 + 518 + 5 + 0 + + + 1066 + 15 + 517 + 4 + 0 + + + 1048 + 15 + 515 + 4 + 0 + + + 1065 + 14 + 518 + 4 + 0 + + + 1048 + 14 + 515 + 4 + 0 + + + 1061 + 13 + 519 + 2 + 0 + + + 1048 + 13 + 518 + 2 + 0 + + + 1048 + 13 + 517 + 2 + 0 + + + 1048 + 13 + 516 + 2 + 0 + + + 1048 + 13 + 515 + 4 + 0 + + + 402 + 11 + 517 + 0 + 0 + + + 1044 + 10 + 519 + 2 + 0 + + + 1044 + 10 + 516 + 2 + 0 + + + 1044 + 10 + 513 + 2 + 0 + + + 1048 + 23 + 519 + 2 + 0 + + + 1048 + 23 + 518 + 2 + 0 + + + 1048 + 23 + 517 + 4 + 0 + + + 1059 + 23 + 515 + 1 + 0 + + + 1044 + 23 + 513 + 0 + 0 + + + 1067 + 21 + 519 + 0 + 0 + + + 1066 + 21 + 517 + 2 + 0 + + + 1065 + 20 + 519 + 0 + 0 + + + 1059 + 20 + 518 + 4 + 0 + + + 1065 + 20 + 517 + 2 + 0 + + + 1044 + 20 + 513 + 0 + 0 + + + 1065 + 19 + 519 + 4 + 0 + + + 1066 + 19 + 518 + 2 + 0 + + + 1061 + 19 + 517 + 0 + 0 + + + 34 + 18 + 512 + 0 + 0 + + + 1048 + 17 + 519 + 6 + 0 + + + 1048 + 17 + 518 + 6 + 0 + + + 1048 + 17 + 517 + 6 + 0 + + + 1048 + 17 + 516 + 6 + 0 + + + 1048 + 17 + 515 + 4 + 0 + + + 1067 + 16 + 519 + 4 + 0 + + + 1067 + 16 + 517 + 2 + 0 + + + 1048 + 16 + 515 + 4 + 0 + + + 1044 + 7 + 525 + 2 + 0 + + + 1044 + 7 + 522 + 2 + 0 + + + 1072 + 2 + 520 + 3 + 0 + + + 1072 + 1 + 523 + 7 + 0 + + + 1066 + 15 + 527 + 2 + 0 + + + 1066 + 15 + 526 + 2 + 0 + + + 1048 + 15 + 525 + 0 + 0 + + + 1067 + 15 + 523 + 4 + 0 + + + 1066 + 15 + 522 + 2 + 0 + + + 215 + 15 + 521 + 5 + 0 + + + 1065 + 15 + 520 + 2 + 0 + + + 1067 + 14 + 527 + 0 + 0 + + + 1048 + 14 + 525 + 0 + 0 + + + 1067 + 14 + 523 + 2 + 0 + + + 1066 + 14 + 521 + 4 + 0 + + + 1067 + 14 + 520 + 2 + 0 + + + 1065 + 13 + 527 + 0 + 0 + + + 1065 + 13 + 526 + 2 + 0 + + + 1048 + 13 + 525 + 0 + 0 + + + 1048 + 13 + 524 + 2 + 0 + + + 1048 + 13 + 523 + 2 + 0 + + + 1048 + 13 + 522 + 2 + 0 + + + 1048 + 13 + 521 + 2 + 0 + + + 1044 + 10 + 525 + 2 + 0 + + + 1044 + 10 + 522 + 2 + 0 + + + 55 + 7 + 3373 + 0 + 0 + + + 22 + 6 + 3375 + 0 + 0 + + + 55 + 6 + 3374 + 2 + 0 + + + 34 + 5 + 3375 + 3 + 0 + + + 34 + 6 + 3378 + 0 + 0 + + + 34 + 5 + 3376 + 0 + 0 + + + 34 + 7 + 3397 + 4 + 0 + + + 195 + 7 + 3396 + 1 + 0 + + + 205 + 6 + 3396 + 2 + 0 + + + 402 + 6 + 3395 + 1 + 0 + + + 402 + 5 + 3399 + 7 + 0 + + + 34 + 5 + 3396 + 2 + 0 + + + 195 + 5 + 3394 + 6 + 0 + + + 34 + 4 + 3399 + 0 + 0 + + + 402 + 4 + 3398 + 2 + 0 + + + 1007 + 1 + 3397 + 0 + 0 + + + 1043 + 7 + 3402 + 5 + 0 + + + 205 + 6 + 3401 + 4 + 0 + + + 34 + 5 + 3400 + 7 + 0 + + + 34 + 10 + 3374 + 0 + 0 + + + 22 + 9 + 3375 + 0 + 0 + + + 34 + 8 + 3373 + 4 + 0 + + + 1042 + 12 + 3382 + 1 + 0 + + + 55 + 11 + 3376 + 5 + 0 + + + 22 + 10 + 3377 + 0 + 0 + + + 22 + 10 + 3376 + 0 + 0 + + + 34 + 8 + 3380 + 5 + 0 + + + 22 + 8 + 3376 + 0 + 0 + + + 1044 + 15 + 3384 + 4 + 0 + + + 1042 + 13 + 3387 + 2 + 0 + + + 1042 + 11 + 3389 + 1 + 0 + + + 1050 + 9 + 3387 + 0 + 0 + + + 1042 + 8 + 3389 + 0 + 0 + + + 1045 + 12 + 3399 + 4 + 0 + + + 1045 + 9 + 3399 + 4 + 0 + + + 402 + 8 + 3399 + 4 + 0 + + + 402 + 8 + 3398 + 4 + 0 + + + 1056 + 14 + 3403 + 2 + 0 + + + 1045 + 12 + 3402 + 4 + 0 + + + 1045 + 12 + 3401 + 4 + 0 + + + 1045 + 12 + 3400 + 4 + 0 + + + 1056 + 9 + 3403 + 2 + 0 + + + 1045 + 9 + 3402 + 4 + 0 + + + 1045 + 9 + 3401 + 0 + 0 + + + 1045 + 9 + 3400 + 4 + 0 + + + 34 + 23 + 3380 + 6 + 0 + + + 34 + 21 + 3378 + 0 + 0 + + + 34 + 19 + 3380 + 1 + 0 + + + 34 + 23 + 3391 + 0 + 0 + + + 34 + 22 + 3384 + 7 + 0 + + + 34 + 20 + 3386 + 5 + 0 + + + 1098 + 19 + 3386 + 0 + 0 + + + 277 + 23 + 3393 + 2 + 0 + + + 34 + 22 + 3392 + 2 + 0 + + + 1007 + 19 + 3397 + 1 + 0 + + + 1007 + 18 + 3397 + 7 + 0 + + + 195 + 18 + 3396 + 7 + 0 + + + 195 + 17 + 3395 + 2 + 0 + + + 1007 + 16 + 3398 + 4 + 0 + + + 1007 + 16 + 3396 + 4 + 0 + + + 1007 + 19 + 3401 + 1 + 0 + + + 1007 + 18 + 3401 + 5 + 0 + + + 205 + 18 + 3400 + 4 + 0 + + + 1007 + 17 + 3400 + 7 + 0 + + + 1043 + 16 + 3402 + 5 + 0 + + + 1075 + 30 + 3391 + 2 + 0 + + + 34 + 30 + 3390 + 5 + 0 + + + 1075 + 29 + 3391 + 1 + 0 + + + 277 + 29 + 3390 + 2 + 0 + + + 205 + 28 + 3389 + 6 + 0 + + + 1150 + 27 + 3388 + 6 + 0 + + + 34 + 27 + 3387 + 4 + 0 + + + 277 + 25 + 3390 + 7 + 0 + + + 1075 + 30 + 3392 + 7 + 0 + + + 1075 + 28 + 3393 + 4 + 0 + + + 1097 + 26 + 3395 + 0 + 0 + + + 277 + 26 + 3393 + 0 + 0 + + + 1075 + 25 + 3394 + 6 + 0 + + + 1075 + 24 + 3394 + 0 + 0 + + + 51 + 415 + 3485 + 4 + 0 + + + 51 + 409 + 3482 + 2 + 0 + + + 214 + 422 + 3484 + 0 + 0 + + + 51 + 422 + 3482 + 6 + 0 + + + 207 + 420 + 3480 + 1 + 0 + + + 51 + 419 + 3485 + 4 + 0 + + + 207 + 418 + 3484 + 3 + 0 + + + 207 + 416 + 3484 + 6 + 0 + + + 59 + 414 + 3480 + 1 + 1 + + + 51 + 409 + 3475 + 2 + 0 + + + 215 + 422 + 3479 + 0 + 0 + + + 51 + 422 + 3477 + 6 + 0 + + + 51 + 419 + 3475 + 0 + 0 + + + 207 + 418 + 3476 + 5 + 0 + + + 51 + 417 + 3475 + 0 + 0 + + + 51 + 417 + 3472 + 4 + 0 + + + 207 + 416 + 3476 + 3 + 0 + + + 51 + 414 + 3464 + 2 + 0 + + + 51 + 413 + 3467 + 2 + 0 + + + 51 + 421 + 3467 + 6 + 0 + + + 51 + 423 + 3462 + 6 + 0 + + + 41 + 419 + 3460 + 4 + 0 + + + 33 + 405 + 613 + 0 + 0 + + + 113 + 407 + 618 + 0 + 0 + + + 33 + 407 + 639 + 0 + 0 + + + 32 + 407 + 633 + 0 + 0 + + + 32 + 405 + 635 + 0 + 0 + + + 234 + 405 + 641 + 0 + 0 + + + 164 + 404 + 640 + 0 + 0 + + + 164 + 403 + 641 + 0 + 0 + + + 111 + 415 + 612 + 0 + 0 + + + 107 + 415 + 610 + 0 + 0 + + + 33 + 411 + 608 + 0 + 0 + + + 33 + 409 + 609 + 0 + 0 + + + 33 + 409 + 608 + 0 + 0 + + + 32 + 415 + 619 + 0 + 0 + + + 113 + 408 + 617 + 0 + 0 + + + 1 + 414 + 637 + 0 + 0 + + + 34 + 412 + 639 + 0 + 0 + + + 1 + 411 + 636 + 0 + 0 + + + 164 + 415 + 641 + 0 + 0 + + + 164 + 412 + 642 + 0 + 0 + + + 164 + 411 + 643 + 0 + 0 + + + 164 + 411 + 641 + 0 + 0 + + + 233 + 410 + 641 + 0 + 0 + + + 111 + 416 + 611 + 0 + 0 + + + 1 + 422 + 616 + 0 + 0 + + + 1 + 418 + 623 + 0 + 0 + + + 1 + 416 + 617 + 0 + 0 + + + 34 + 422 + 630 + 4 + 0 + + + 33 + 422 + 629 + 4 + 0 + + + 45 + 421 + 631 + 0 + 0 + + + 45 + 421 + 630 + 6 + 0 + + + 45 + 421 + 629 + 6 + 0 + + + 45 + 421 + 628 + 6 + 0 + + + 45 + 421 + 627 + 4 + 0 + + + 45 + 420 + 631 + 0 + 0 + + + 32 + 420 + 626 + 4 + 0 + + + 45 + 419 + 631 + 0 + 0 + + + 42 + 419 + 628 + 4 + 0 + + + 45 + 418 + 631 + 0 + 0 + + + 45 + 418 + 630 + 2 + 0 + + + 45 + 418 + 629 + 2 + 0 + + + 45 + 418 + 628 + 2 + 0 + + + 45 + 418 + 627 + 4 + 0 + + + 32 + 417 + 630 + 4 + 0 + + + 32 + 417 + 629 + 4 + 0 + + + 34 + 416 + 628 + 4 + 0 + + + 32 + 416 + 626 + 4 + 0 + + + 34 + 420 + 634 + 4 + 0 + + + 33 + 420 + 632 + 4 + 0 + + + 109 + 418 + 638 + 0 + 0 + + + 109 + 418 + 637 + 0 + 0 + + + 111 + 418 + 636 + 0 + 0 + + + 32 + 418 + 632 + 4 + 0 + + + 33 + 423 + 640 + 0 + 0 + + + 34 + 422 + 644 + 0 + 0 + + + 164 + 417 + 644 + 0 + 0 + + + 1 + 424 + 613 + 0 + 0 + + + 32 + 425 + 618 + 0 + 0 + + + 107 + 430 + 635 + 0 + 0 + + + 107 + 429 + 634 + 0 + 0 + + + 107 + 428 + 634 + 0 + 0 + + + 33 + 428 + 641 + 0 + 0 + + + 34 + 427 + 644 + 0 + 0 + + + 32 + 425 + 645 + 0 + 0 + + + 32 + 414 + 607 + 0 + 0 + + + 6 + 510 + 1451 + 6 + 0 + + + 47 + 512 + 1451 + 4 + 0 + + + 15 + 587 + 1465 + 2 + 0 + + + 3 + 345 + 605 + 0 + 0 + + + 30 + 564 + 469 + 0 + 0 + + + 55 + 279 + 2324 + 0 + 0 + + + 55 + 279 + 2321 + 0 + 0 + + + 25 + 278 + 2325 + 6 + 0 + + + 154 + 278 + 2323 + 0 + 0 + + + 55 + 278 + 2322 + 0 + 0 + + + 55 + 277 + 2324 + 0 + 0 + + + 25 + 275 + 2324 + 6 + 0 + + + 14 + 274 + 2325 + 6 + 0 + + + 14 + 274 + 2321 + 2 + 0 + + + 25 + 273 + 2324 + 6 + 0 + + + 25 + 272 + 2321 + 6 + 0 + + + 143 + 276 + 2335 + 4 + 0 + + + 143 + 276 + 2331 + 0 + 0 + + + 25 + 275 + 2328 + 6 + 0 + + + 143 + 274 + 2335 + 4 + 0 + + + 143 + 274 + 2331 + 0 + 0 + + + 144 + 272 + 2332 + 6 + 0 + + + 6 + 281 + 2332 + 0 + 0 + + + 1 + 272 + 2325 + 0 + 1 + + + 1 + 279 + 2333 + 1 + 1 + + + 1 + 277 + 2329 + 0 + 1 + + + 22 + 281 + 2325 + 0 + 1 + + + 625 + 439 + 3370 + 2 + 0 + + + 5 + 77 + 1641 + 2 + 1 + + + 5 + 77 + 1642 + 1 + 1 + + + 5 + 77 + 1643 + 1 + 1 + + + 5 + 78 + 1641 + 0 + 1 + + + 5 + 79 + 1641 + 0 + 1 + + + 5 + 80 + 1641 + 0 + 1 + + + 7 + 80 + 1643 + 1 + 0 + + + 23 + 79 + 1639 + 4 + 0 + + + 23 + 77 + 1639 + 4 + 0 + + + 29 + 66 + 1642 + 2 + 0 + + + 16 + 66 + 1641 + 0 + 0 + + + 16 + 66 + 1640 + 0 + 0 + + + 1176 + 64 + 1643 + 7 + 0 + + + 274 + 64 + 1641 + 6 + 0 + + + 7 + 67 + 1642 + 2 + 0 + + + 7 + 67 + 1643 + 2 + 0 + + + 22 + 64 + 1639 + 0 + 0 + + + 51 + 532 + 3334 + 2 + 0 + + + 51 + 530 + 3331 + 4 + 0 + + + 217 + 533 + 3338 + 6 + 0 + + + 51 + 532 + 3342 + 2 + 0 + + + 143 + 530 + 3339 + 2 + 0 + + + 143 + 530 + 3337 + 2 + 0 + + + 51 + 535 + 3351 + 6 + 0 + + + 51 + 535 + 3346 + 6 + 0 + + + 5 + 533 + 3348 + 0 + 0 + + + 51 + 531 + 3351 + 2 + 0 + + + 51 + 531 + 3346 + 2 + 0 + + + 51 + 533 + 3353 + 4 + 0 + + + 20 + 541 + 3329 + 6 + 0 + + + 51 + 540 + 3331 + 4 + 0 + + + 51 + 536 + 3331 + 4 + 0 + + + 0 + 537 + 3337 + 1 + 1 + + + 0 + 537 + 3338 + 1 + 1 + + + 51 + 536 + 3339 + 6 + 0 + + + 51 + 542 + 3346 + 0 + 0 + + + 51 + 537 + 3347 + 0 + 0 + + + 51 + 540 + 3352 + 4 + 0 + + + 5 + 549 + 3339 + 0 + 0 + + + 51 + 544 + 3352 + 4 + 0 + + + 2 + 533 + 3335 + 0 + 1 + + + 2 + 533 + 3342 + 0 + 1 + + + 2 + 536 + 3349 + 1 + 1 + + + 2 + 546 + 3328 + 1 + 1 + + + 51 + 533 + 3321 + 6 + 0 + + + 51 + 531 + 3321 + 2 + 0 + + + 51 + 530 + 3324 + 0 + 0 + + + 20 + 541 + 3326 + 4 + 0 + + + 51 + 540 + 3323 + 0 + 0 + + + 51 + 536 + 3323 + 0 + 0 + + + 51 + 554 + 3357 + 4 + 0 + + + 51 + 554 + 3355 + 0 + 0 + + + 51 + 521 + 3377 + 6 + 0 + + + 369 + 534 + 3393 + 6 + 0 + + + 51 + 535 + 3315 + 4 + 0 + + + 51 + 535 + 3313 + 0 + 0 + + + 51 + 533 + 3317 + 6 + 0 + + + 51 + 531 + 3317 + 2 + 0 + + + 51 + 538 + 3315 + 4 + 0 + + + 51 + 538 + 3313 + 0 + 0 + + + 51 + 535 + 3308 + 6 + 0 + + + 277 + 534 + 3307 + 4 + 0 + + + 51 + 534 + 3305 + 0 + 0 + + + 361 + 533 + 3305 + 4 + 0 + + + 277 + 532 + 3305 + 4 + 0 + + + 51 + 531 + 3308 + 2 + 0 + + + 277 + 531 + 3306 + 4 + 0 + + + 51 + 541 + 3304 + 2 + 0 + + + 51 + 548 + 3304 + 6 + 0 + + + 2 + 545 + 3307 + 0 + 1 + + + 51 + 541 + 3300 + 2 + 0 + + + 51 + 541 + 3296 + 2 + 0 + + + 51 + 548 + 3300 + 6 + 0 + + + 51 + 548 + 3296 + 6 + 0 + + + 2 + 546 + 3302 + 0 + 1 + + + 51 + 535 + 3292 + 4 + 0 + + + 51 + 533 + 3289 + 2 + 0 + + + 51 + 539 + 3290 + 6 + 0 + + + 51 + 559 + 3292 + 6 + 0 + + + 51 + 565 + 3315 + 0 + 0 + + + 51 + 563 + 3319 + 2 + 0 + + + 51 + 563 + 3316 + 2 + 0 + + + 51 + 563 + 3325 + 2 + 0 + + + 51 + 563 + 3322 + 2 + 0 + + + 488 + 567 + 3331 + 0 + 0 + + + 51 + 566 + 3331 + 4 + 0 + + + 1155 + 446 + 3374 + 7 + 0 + + + 3 + 442 + 3372 + 0 + 0 + + + 278 + 441 + 3372 + 0 + 0 + + + 3 + 441 + 3369 + 0 + 0 + + + 3 + 440 + 3371 + 0 + 0 + + + 278 + 440 + 3369 + 0 + 0 + + + 45 + 463 + 1462 + 4 + 0 + + + 45 + 463 + 1459 + 0 + 0 + + + 45 + 462 + 1462 + 4 + 0 + + + 143 + 462 + 1457 + 0 + 0 + + + 45 + 461 + 1462 + 4 + 0 + + + 44 + 461 + 1459 + 4 + 0 + + + 45 + 460 + 1462 + 4 + 0 + + + 45 + 460 + 1459 + 0 + 0 + + + 22 + 460 + 1458 + 6 + 0 + + + 45 + 459 + 1462 + 6 + 0 + + + 45 + 459 + 1461 + 6 + 0 + + + 45 + 459 + 1460 + 6 + 0 + + + 45 + 459 + 1459 + 6 + 0 + + + 22 + 459 + 1458 + 6 + 0 + + + 143 + 458 + 1462 + 2 + 0 + + + 143 + 462 + 1468 + 4 + 0 + + + 43 + 461 + 1464 + 4 + 0 + + + 143 + 458 + 1465 + 2 + 0 + + + 143 + 467 + 1462 + 6 + 0 + + + 45 + 466 + 1463 + 6 + 0 + + + 143 + 466 + 1459 + 6 + 0 + + + 45 + 464 + 1462 + 2 + 0 + + + 45 + 464 + 1461 + 2 + 0 + + + 45 + 464 + 1460 + 2 + 0 + + + 45 + 464 + 1459 + 2 + 0 + + + 6 + 467 + 1464 + 4 + 0 + + + 143 + 466 + 1466 + 6 + 0 + + + 45 + 466 + 1464 + 6 + 0 + + + 25 + 459 + 2407 + 2 + 0 + + + 25 + 459 + 2406 + 2 + 0 + + + 45 + 463 + 2408 + 0 + 0 + + + 44 + 461 + 2408 + 4 + 0 + + + 45 + 460 + 2408 + 0 + 0 + + + 45 + 459 + 2408 + 0 + 0 + + + 25 + 464 + 2407 + 2 + 0 + + + 25 + 464 + 2406 + 2 + 0 + + + 45 + 464 + 2408 + 0 + 0 + + + 51 + 509 + 3423 + 2 + 0 + + + 51 + 509 + 3417 + 2 + 0 + + + 51 + 508 + 3429 + 2 + 0 + + + 51 + 508 + 3426 + 2 + 0 + + + 207 + 505 + 3430 + 7 + 0 + + + 207 + 505 + 3425 + 6 + 0 + + + 315 + 504 + 3424 + 0 + 0 + + + 51 + 509 + 3432 + 2 + 0 + + + 51 + 508 + 3439 + 2 + 0 + + + 51 + 510 + 3445 + 4 + 0 + + + 51 + 508 + 3444 + 2 + 0 + + + 317 + 508 + 3443 + 6 + 0 + + + 51 + 513 + 3417 + 6 + 0 + + + 51 + 512 + 3423 + 6 + 0 + + + 51 + 517 + 3429 + 4 + 0 + + + 51 + 517 + 3427 + 0 + 0 + + + 51 + 515 + 3429 + 4 + 0 + + + 51 + 515 + 3427 + 0 + 0 + + + 51 + 513 + 3439 + 6 + 0 + + + 51 + 512 + 3432 + 6 + 0 + + + 51 + 513 + 3445 + 4 + 0 + + + 46 + 524 + 3436 + 6 + 0 + + + 46 + 524 + 3432 + 6 + 0 + + + 5 + 523 + 3439 + 0 + 0 + + + 46 + 520 + 3436 + 6 + 0 + + + 46 + 520 + 3432 + 6 + 0 + + + 91 + 508 + 3427 + 1 + 1 + + + 88 + 509 + 3441 + 0 + 1 + + + 90 + 512 + 3441 + 0 + 1 + + + 316 + 511 + 3415 + 4 + 0 + + + 318 + 511 + 3410 + 4 + 0 + + + 51 + 509 + 3410 + 0 + 0 + + + 51 + 508 + 3412 + 2 + 0 + + + 51 + 513 + 3412 + 6 + 0 + + + 51 + 512 + 3410 + 0 + 0 + + + 92 + 510 + 3415 + 0 + 1 + + + 51 + 503 + 3431 + 4 + 0 + + + 207 + 503 + 3428 + 0 + 0 + + + 207 + 503 + 3427 + 1 + 0 + + + 51 + 503 + 3424 + 0 + 0 + + + 315 + 502 + 3431 + 0 + 0 + + + 51 + 501 + 3429 + 2 + 0 + + + 315 + 501 + 3427 + 6 + 0 + + + 51 + 501 + 3426 + 2 + 0 + + + 21 + 498 + 613 + 4 + 0 + + + 193 + 496 + 613 + 0 + 0 + + + 21 + 498 + 616 + 0 + 0 + + + 454 + 496 + 618 + 0 + 0 + + + 407 + 487 + 612 + 0 + 0 + + + 99 + 486 + 612 + 3 + 0 + + + 22 + 485 + 615 + 0 + 0 + + + 193 + 485 + 610 + 0 + 0 + + + 3 + 484 + 615 + 0 + 0 + + + 22 + 484 + 613 + 0 + 0 + + + 193 + 484 + 610 + 0 + 0 + + + 194 + 480 + 614 + 0 + 0 + + + 3 + 485 + 618 + 0 + 0 + + + 22 + 485 + 617 + 0 + 0 + + + 22 + 482 + 616 + 0 + 0 + + + 194 + 480 + 617 + 0 + 0 + + + 21 + 495 + 613 + 4 + 0 + + + 193 + 494 + 613 + 0 + 0 + + + 21 + 492 + 613 + 4 + 0 + + + 193 + 491 + 613 + 0 + 0 + + + 193 + 491 + 611 + 0 + 0 + + + 193 + 491 + 610 + 0 + 0 + + + 193 + 489 + 608 + 0 + 0 + + + 99 + 488 + 611 + 3 + 0 + + + 193 + 488 + 608 + 0 + 0 + + + 21 + 495 + 621 + 0 + 0 + + + 458 + 494 + 618 + 2 + 0 + + + 193 + 493 + 621 + 0 + 0 + + + 21 + 492 + 621 + 0 + 0 + + + 21 + 492 + 618 + 4 + 0 + + + 21 + 492 + 616 + 0 + 0 + + + 193 + 491 + 616 + 0 + 0 + + + 193 + 490 + 621 + 0 + 0 + + + 21 + 489 + 621 + 0 + 0 + + + 21 + 489 + 618 + 4 + 0 + + + 21 + 489 + 616 + 0 + 0 + + + 193 + 488 + 618 + 0 + 0 + + + 193 + 488 + 616 + 0 + 0 + + + 455 + 511 + 634 + 5 + 0 + + + 33 + 510 + 637 + 1 + 0 + + + 32 + 509 + 636 + 1 + 0 + + + 33 + 507 + 638 + 1 + 0 + + + 1 + 487 + 615 + 1 + 1 + + + 1 + 487 + 619 + 1 + 1 + + + 1 + 485 + 619 + 1 + 1 + + + 1 + 483 + 617 + 0 + 1 + + + 45 + 487 + 1557 + 4 + 0 + + + 7 + 486 + 1559 + 2 + 0 + + + 3 + 485 + 1559 + 0 + 0 + + + 45 + 487 + 1565 + 0 + 0 + + + 22 + 487 + 1560 + 2 + 0 + + + 45 + 495 + 1557 + 4 + 0 + + + 453 + 493 + 1558 + 4 + 0 + + + 45 + 490 + 1557 + 4 + 0 + + + 45 + 489 + 1557 + 4 + 0 + + + 45 + 488 + 1557 + 4 + 0 + + + 45 + 495 + 1565 + 0 + 0 + + + 45 + 494 + 1565 + 0 + 0 + + + 6 + 494 + 1562 + 2 + 0 + + + 45 + 493 + 1565 + 0 + 0 + + + 45 + 492 + 1565 + 0 + 0 + + + 45 + 492 + 1563 + 0 + 0 + + + 45 + 492 + 1562 + 6 + 0 + + + 45 + 492 + 1561 + 6 + 0 + + + 45 + 491 + 1565 + 0 + 0 + + + 45 + 491 + 1563 + 0 + 0 + + + 45 + 491 + 1562 + 2 + 0 + + + 45 + 491 + 1561 + 2 + 0 + + + 45 + 491 + 1560 + 2 + 0 + + + 45 + 490 + 1565 + 0 + 0 + + + 45 + 489 + 1565 + 0 + 0 + + + 45 + 488 + 1565 + 0 + 0 + + + 45 + 496 + 1559 + 2 + 0 + + + 45 + 496 + 1558 + 2 + 0 + + + 45 + 496 + 1564 + 2 + 0 + + + 45 + 496 + 1563 + 2 + 0 + + + 45 + 496 + 1562 + 2 + 0 + + + 45 + 496 + 1561 + 2 + 0 + + + 45 + 496 + 1560 + 2 + 0 + + + 124 + 487 + 1558 + 1 + 1 + + + 1 + 487 + 1563 + 1 + 1 + + + 1 + 484 + 1561 + 0 + 1 + + + 404 + 414 + 3573 + 4 + 0 + + + 403 + 413 + 3571 + 0 + 0 + + + 401 + 412 + 3575 + 0 + 0 + + + 401 + 411 + 3571 + 0 + 0 + + + 403 + 415 + 3577 + 5 + 0 + + + 404 + 414 + 3576 + 5 + 0 + + + 397 + 413 + 3582 + 0 + 0 + + + 396 + 413 + 3579 + 0 + 0 + + + 34 + 409 + 3578 + 0 + 0 + + + 396 + 413 + 3584 + 0 + 0 + + + 401 + 423 + 3574 + 7 + 0 + + + 404 + 419 + 3574 + 7 + 0 + + + 403 + 422 + 3579 + 5 + 0 + + + 398 + 418 + 3577 + 5 + 0 + + + 401 + 417 + 3577 + 5 + 0 + + + 398 + 416 + 3582 + 0 + 0 + + + 399 + 416 + 3580 + 0 + 0 + + + 399 + 423 + 3587 + 0 + 0 + + + 401 + 423 + 3585 + 0 + 0 + + + 398 + 421 + 3587 + 0 + 0 + + + 397 + 420 + 3589 + 0 + 0 + + + 396 + 419 + 3588 + 0 + 0 + + + 396 + 427 + 3573 + 0 + 0 + + + 404 + 426 + 3573 + 0 + 0 + + + 5 + 426 + 3572 + 0 + 0 + + + 403 + 425 + 3573 + 0 + 0 + + + 396 + 424 + 3571 + 7 + 0 + + + 399 + 426 + 3576 + 7 + 0 + + + 402 + 424 + 3583 + 0 + 0 + + + 404 + 424 + 3579 + 5 + 0 + + + 151 + 411 + 3575 + 2 + 1 + + + 151 + 410 + 3576 + 2 + 1 + + + 151 + 409 + 3577 + 2 + 1 + + + 29 + 394 + 1767 + 0 + 0 + + + 22 + 394 + 1766 + 6 + 0 + + + 22 + 393 + 1767 + 6 + 0 + + + 3 + 399 + 1770 + 0 + 0 + + + 23 + 398 + 1771 + 0 + 0 + + + 3 + 398 + 1770 + 0 + 0 + + + 23 + 398 + 1769 + 4 + 0 + + + 23 + 396 + 1772 + 2 + 0 + + + 6 + 396 + 1770 + 0 + 0 + + + 3 + 395 + 1773 + 0 + 0 + + + 3 + 395 + 1772 + 0 + 0 + + + 776 + 395 + 1770 + 0 + 0 + + + 23 + 394 + 1772 + 6 + 0 + + + 3 + 393 + 1770 + 0 + 0 + + + 23 + 392 + 1771 + 0 + 0 + + + 3 + 392 + 1770 + 0 + 0 + + + 23 + 392 + 1769 + 4 + 0 + + + 6 + 395 + 1782 + 0 + 0 + + + 6 + 608 + 1526 + 0 + 0 + + + 3 + 608 + 1523 + 0 + 0 + + + 45 + 631 + 1511 + 6 + 0 + + + 45 + 631 + 1510 + 6 + 0 + + + 504 + 631 + 1514 + 0 + 0 + + + 22 + 631 + 1513 + 2 + 0 + + + 290 + 629 + 1516 + 0 + 0 + + + 290 + 629 + 1513 + 0 + 0 + + + 290 + 628 + 1513 + 0 + 0 + + + 290 + 627 + 1516 + 0 + 0 + + + 290 + 627 + 1515 + 0 + 0 + + + 505 + 627 + 1514 + 0 + 0 + + + 290 + 627 + 1513 + 0 + 0 + + + 20 + 646 + 589 + 0 + 0 + + + 71 + 645 + 587 + 2 + 0 + + + 273 + 645 + 584 + 2 + 0 + + + 20 + 644 + 589 + 0 + 0 + + + 7 + 644 + 584 + 6 + 0 + + + 205 + 640 + 588 + 2 + 0 + + + 208 + 646 + 596 + 4 + 0 + + + 4 + 643 + 595 + 4 + 0 + + + 5 + 642 + 597 + 0 + 0 + + + 55 + 640 + 598 + 0 + 0 + + + 55 + 640 + 597 + 0 + 0 + + + 80 + 623 + 3410 + 2 + 0 + + + 80 + 623 + 3409 + 2 + 0 + + + 51 + 622 + 3408 + 2 + 0 + + + 433 + 621 + 3409 + 0 + 0 + + + 448 + 620 + 3414 + 6 + 0 + + + 51 + 620 + 3408 + 0 + 0 + + + 51 + 622 + 3420 + 2 + 0 + + + 433 + 621 + 3422 + 0 + 0 + + + 80 + 620 + 3422 + 6 + 0 + + + 80 + 620 + 3421 + 6 + 0 + + + 449 + 636 + 3422 + 2 + 0 + + + 20 + 652 + 589 + 6 + 0 + + + 20 + 650 + 589 + 6 + 0 + + + 366 + 648 + 589 + 4 + 0 + + + 4 + 653 + 596 + 4 + 0 + + + 4 + 652 + 599 + 4 + 0 + + + 1 + 655 + 591 + 1 + 1 + + + 1 + 648 + 588 + 0 + 1 + + + 121 + 648 + 585 + 1 + 1 + + + 13 + 663 + 584 + 6 + 0 + + + 12 + 662 + 587 + 6 + 0 + + + 13 + 661 + 590 + 6 + 0 + + + 13 + 661 + 584 + 6 + 0 + + + 11 + 658 + 591 + 0 + 0 + + + 3 + 658 + 590 + 0 + 0 + + + 42 + 632 + 1510 + 2 + 0 + + + 15 + 634 + 1515 + 2 + 0 + + + 15 + 634 + 1513 + 2 + 0 + + + 42 + 647 + 1509 + 4 + 0 + + + 45 + 646 + 1511 + 6 + 0 + + + 45 + 646 + 1510 + 6 + 0 + + + 45 + 646 + 1509 + 6 + 0 + + + 15 + 643 + 1511 + 6 + 0 + + + 281 + 643 + 1510 + 6 + 0 + + + 15 + 643 + 1508 + 6 + 0 + + + 45 + 646 + 1512 + 6 + 0 + + + 141 + 633 + 1513 + 0 + 1 + + + 209 + 663 + 599 + 6 + 0 + + + 13 + 663 + 597 + 6 + 0 + + + 12 + 663 + 594 + 6 + 0 + + + 12 + 661 + 596 + 6 + 0 + + + 12 + 661 + 592 + 6 + 0 + + + 209 + 660 + 599 + 6 + 0 + + + 13 + 660 + 594 + 6 + 0 + + + 278 + 658 + 594 + 0 + 0 + + + 278 + 657 + 594 + 0 + 0 + + + 456 + 639 + 3440 + 4 + 0 + + + 457 + 637 + 3447 + 2 + 0 + + + 41 + 637 + 3440 + 4 + 0 + + + 290 + 636 + 3440 + 4 + 0 + + + 146 + 635 + 3446 + 0 + 0 + + + 51 + 635 + 3445 + 2 + 0 + + + 55 + 635 + 3443 + 6 + 0 + + + 51 + 635 + 3442 + 2 + 0 + + + 290 + 635 + 3440 + 4 + 0 + + + 146 + 638 + 3450 + 2 + 0 + + + 51 + 640 + 3445 + 6 + 0 + + + 55 + 640 + 3443 + 4 + 0 + + + 51 + 640 + 3442 + 6 + 0 + + + 22 + 640 + 3440 + 4 + 0 + + + 13 + 670 + 586 + 6 + 0 + + + 13 + 668 + 590 + 6 + 0 + + + 12 + 667 + 588 + 6 + 0 + + + 213 + 666 + 585 + 6 + 0 + + + 213 + 664 + 591 + 6 + 0 + + + 13 + 665 + 595 + 6 + 0 + + + 8 + 679 + 586 + 3 + 0 + + + 407 + 678 + 585 + 0 + 0 + + + 407 + 673 + 585 + 0 + 0 + + + 22 + 687 + 589 + 2 + 0 + + + 22 + 687 + 588 + 2 + 0 + + + 22 + 686 + 590 + 0 + 0 + + + 24 + 686 + 587 + 6 + 0 + + + 22 + 685 + 590 + 0 + 0 + + + 29 + 685 + 588 + 0 + 0 + + + 20 + 684 + 588 + 0 + 0 + + + 3 + 683 + 590 + 0 + 0 + + + 23 + 682 + 585 + 0 + 0 + + + 22 + 681 + 587 + 0 + 0 + + + 22 + 681 + 586 + 0 + 0 + + + 3 + 681 + 584 + 0 + 0 + + + 1 + 685 + 586 + 0 + 1 + + + 8 + 688 + 585 + 0 + 0 + + + 88 + 697 + 589 + 0 + 0 + + + 407 + 706 + 585 + 0 + 0 + + + 407 + 717 + 586 + 3 + 0 + + + 407 + 710 + 595 + 2 + 0 + + + 877 + 725 + 588 + 7 + 0 + + + 730 + 723 + 591 + 5 + 0 + + + 877 + 730 + 588 + 7 + 0 + + + 740 + 678 + 3415 + 0 + 0 + + + 739 + 677 + 3414 + 0 + 0 + + + 734 + 678 + 3418 + 5 + 0 + + + 734 + 676 + 3421 + 0 + 0 + + + 832 + 675 + 3422 + 0 + 0 + + + 734 + 675 + 3417 + 6 + 0 + + + 730 + 674 + 3422 + 0 + 0 + + + 730 + 674 + 3418 + 7 + 0 + + + 738 + 674 + 3416 + 0 + 0 + + + 728 + 672 + 3420 + 6 + 0 + + + 745 + 677 + 3424 + 0 + 0 + + + 778 + 675 + 3429 + 0 + 0 + + + 799 + 679 + 3435 + 2 + 0 + + + 797 + 679 + 3434 + 2 + 0 + + + 799 + 678 + 3434 + 2 + 0 + + + 799 + 677 + 3434 + 0 + 0 + + + 741 + 685 + 3410 + 0 + 0 + + + 734 + 682 + 3415 + 0 + 0 + + + 750 + 682 + 3409 + 2 + 0 + + + 754 + 687 + 3423 + 0 + 0 + + + 729 + 686 + 3418 + 0 + 0 + + + 730 + 685 + 3416 + 0 + 0 + + + 729 + 684 + 3422 + 0 + 0 + + + 940 + 684 + 3420 + 0 + 0 + + + 734 + 684 + 3417 + 0 + 0 + + + 734 + 683 + 3422 + 2 + 0 + + + 730 + 682 + 3418 + 0 + 0 + + + 734 + 681 + 3421 + 3 + 0 + + + 730 + 681 + 3417 + 0 + 0 + + + 730 + 680 + 3420 + 4 + 0 + + + 940 + 680 + 3418 + 0 + 0 + + + 753 + 685 + 3430 + 6 + 0 + + + 753 + 684 + 3430 + 2 + 0 + + + 730 + 684 + 3425 + 0 + 0 + + + 734 + 680 + 3424 + 0 + 0 + + + 833 + 684 + 3438 + 0 + 0 + + + 798 + 682 + 3435 + 0 + 0 + + + 798 + 681 + 3435 + 5 + 0 + + + 798 + 681 + 3434 + 0 + 0 + + + 796 + 680 + 3434 + 6 + 0 + + + 743 + 692 + 3412 + 0 + 0 + + + 742 + 688 + 3410 + 0 + 0 + + + 754 + 692 + 3419 + 0 + 0 + + + 754 + 692 + 3417 + 5 + 0 + + + 754 + 691 + 3423 + 6 + 0 + + + 754 + 691 + 3421 + 4 + 0 + + + 754 + 691 + 3420 + 3 + 0 + + + 754 + 691 + 3418 + 0 + 0 + + + 754 + 691 + 3416 + 4 + 0 + + + 754 + 690 + 3422 + 5 + 0 + + + 754 + 690 + 3418 + 6 + 0 + + + 754 + 689 + 3423 + 7 + 0 + + + 754 + 689 + 3421 + 2 + 0 + + + 754 + 689 + 3419 + 0 + 0 + + + 754 + 689 + 3416 + 0 + 0 + + + 754 + 688 + 3420 + 1 + 0 + + + 754 + 688 + 3418 + 7 + 0 + + + 754 + 688 + 3416 + 2 + 0 + + + 747 + 692 + 3429 + 2 + 0 + + + 754 + 692 + 3424 + 7 + 0 + + + 754 + 690 + 3425 + 5 + 0 + + + 754 + 690 + 3424 + 1 + 0 + + + 746 + 689 + 3429 + 4 + 0 + + + 754 + 689 + 3425 + 4 + 0 + + + 754 + 688 + 3425 + 2 + 0 + + + 754 + 688 + 3424 + 1 + 0 + + + 734 + 695 + 3436 + 0 + 0 + + + 734 + 693 + 3438 + 0 + 0 + + + 734 + 693 + 3435 + 0 + 0 + + + 734 + 693 + 3434 + 0 + 0 + + + 729 + 690 + 3439 + 6 + 0 + + + 940 + 688 + 3438 + 0 + 0 + + + 729 + 688 + 3436 + 0 + 0 + + + 732 + 700 + 3415 + 2 + 0 + + + 744 + 696 + 3414 + 0 + 0 + + + 55 + 702 + 3422 + 2 + 0 + + + 97 + 701 + 3420 + 0 + 0 + + + 737 + 701 + 3416 + 0 + 0 + + + 55 + 700 + 3420 + 2 + 0 + + + 55 + 700 + 3419 + 1 + 0 + + + 749 + 699 + 3423 + 2 + 0 + + + 731 + 699 + 3417 + 0 + 0 + + + 940 + 697 + 3420 + 0 + 0 + + + 751 + 696 + 3417 + 0 + 0 + + + 730 + 703 + 3426 + 0 + 0 + + + 729 + 703 + 3425 + 0 + 0 + + + 752 + 701 + 3426 + 4 + 0 + + + 752 + 700 + 3426 + 4 + 0 + + + 748 + 697 + 3426 + 3 + 0 + + + 730 + 705 + 3414 + 0 + 0 + + + 729 + 704 + 3414 + 0 + 0 + + + 729 + 711 + 3422 + 0 + 0 + + + 733 + 711 + 3418 + 0 + 0 + + + 770 + 709 + 3422 + 3 + 0 + + + 736 + 707 + 3420 + 4 + 0 + + + 730 + 706 + 3423 + 0 + 0 + + + 729 + 705 + 3423 + 0 + 0 + + + 736 + 705 + 3420 + 0 + 0 + + + 726 + 704 + 3417 + 2 + 0 + + + 734 + 711 + 3430 + 0 + 0 + + + 729 + 709 + 3429 + 0 + 0 + + + 770 + 706 + 3429 + 0 + 0 + + + 729 + 705 + 3425 + 0 + 0 + + + 730 + 704 + 3424 + 0 + 0 + + + 770 + 718 + 3412 + 0 + 0 + + + 770 + 716 + 3410 + 2 + 0 + + + 940 + 715 + 3412 + 0 + 0 + + + 770 + 714 + 3410 + 0 + 0 + + + 770 + 712 + 3411 + 4 + 0 + + + 795 + 715 + 3418 + 0 + 0 + + + 729 + 714 + 3423 + 0 + 0 + + + 795 + 714 + 3418 + 0 + 0 + + + 734 + 713 + 3421 + 0 + 0 + + + 729 + 714 + 3430 + 0 + 0 + + + 734 + 714 + 3427 + 0 + 0 + + + 97 + 714 + 3426 + 0 + 0 + + + 734 + 712 + 3424 + 0 + 0 + + + 734 + 703 + 3432 + 3 + 0 + + + 734 + 700 + 3435 + 0 + 0 + + + 771 + 698 + 3436 + 0 + 0 + + + 754 + 697 + 3439 + 2 + 0 + + + 730 + 697 + 3438 + 1 + 0 + + + 729 + 697 + 3437 + 4 + 0 + + + 771 + 697 + 3436 + 1 + 0 + + + 771 + 697 + 3435 + 3 + 0 + + + 729 + 696 + 3438 + 0 + 0 + + + 730 + 696 + 3437 + 6 + 0 + + + 772 + 696 + 3435 + 6 + 0 + + + 770 + 711 + 3436 + 0 + 0 + + + 940 + 710 + 3434 + 0 + 0 + + + 729 + 710 + 3432 + 0 + 0 + + + 770 + 709 + 3438 + 2 + 0 + + + 770 + 708 + 3439 + 3 + 0 + + + 734 + 708 + 3432 + 4 + 0 + + + 770 + 707 + 3439 + 0 + 0 + + + 734 + 707 + 3437 + 5 + 0 + + + 729 + 707 + 3434 + 0 + 0 + + + 940 + 706 + 3433 + 0 + 0 + + + 734 + 705 + 3432 + 2 + 0 + + + 734 + 704 + 3438 + 6 + 0 + + + 770 + 714 + 3433 + 0 + 0 + + + 770 + 713 + 3435 + 0 + 0 + + + 734 + 727 + 3410 + 0 + 0 + + + 729 + 726 + 3414 + 2 + 0 + + + 729 + 726 + 3412 + 4 + 0 + + + 734 + 725 + 3412 + 1 + 0 + + + 730 + 725 + 3410 + 1 + 0 + + + 940 + 724 + 3412 + 0 + 0 + + + 97 + 723 + 3415 + 2 + 0 + + + 729 + 723 + 3411 + 3 + 0 + + + 182 + 722 + 3413 + 2 + 0 + + + 734 + 727 + 3418 + 6 + 0 + + + 940 + 727 + 3416 + 0 + 0 + + + 734 + 726 + 3422 + 4 + 0 + + + 729 + 725 + 3419 + 5 + 0 + + + 734 + 725 + 3416 + 5 + 0 + + + 22 + 723 + 3416 + 3 + 0 + + + 182 + 722 + 3417 + 3 + 0 + + + 729 + 727 + 3426 + 0 + 0 + + + 734 + 724 + 3426 + 2 + 0 + + + 734 + 734 + 3413 + 5 + 0 + + + 940 + 732 + 3415 + 0 + 0 + + + 734 + 731 + 3411 + 5 + 0 + + + 734 + 730 + 3415 + 2 + 0 + + + 734 + 728 + 3413 + 6 + 0 + + + 734 + 735 + 3417 + 5 + 0 + + + 734 + 734 + 3422 + 7 + 0 + + + 734 + 732 + 3419 + 0 + 0 + + + 729 + 731 + 3417 + 7 + 0 + + + 734 + 735 + 3430 + 2 + 0 + + + 729 + 735 + 3428 + 3 + 0 + + + 734 + 733 + 3431 + 5 + 0 + + + 729 + 733 + 3429 + 1 + 0 + + + 734 + 732 + 3426 + 2 + 0 + + + 734 + 728 + 3428 + 2 + 0 + + + 828 + 728 + 3438 + 0 + 0 + + + 829 + 728 + 3436 + 0 + 0 + + + 734 + 703 + 3446 + 0 + 0 + + + 734 + 701 + 3440 + 0 + 0 + + + 754 + 699 + 3441 + 2 + 0 + + + 754 + 698 + 3443 + 2 + 0 + + + 754 + 698 + 3442 + 2 + 0 + + + 754 + 698 + 3440 + 2 + 0 + + + 754 + 697 + 3442 + 2 + 0 + + + 754 + 697 + 3441 + 2 + 0 + + + 754 + 696 + 3443 + 2 + 0 + + + 754 + 696 + 3441 + 2 + 0 + + + 754 + 696 + 3440 + 2 + 0 + + + 809 + 711 + 3447 + 2 + 0 + + + 97 + 706 + 3447 + 0 + 0 + + + 812 + 706 + 3440 + 0 + 0 + + + 811 + 715 + 3447 + 2 + 0 + + + 810 + 713 + 3447 + 2 + 0 + + + 814 + 727 + 3447 + 0 + 0 + + + 729 + 726 + 3445 + 2 + 0 + + + 734 + 726 + 3443 + 0 + 0 + + + 730 + 724 + 3446 + 0 + 0 + + + 734 + 731 + 3446 + 0 + 0 + + + 734 + 730 + 3444 + 0 + 0 + + + 730 + 730 + 3442 + 2 + 0 + + + 940 + 729 + 3446 + 0 + 0 + + + 734 + 728 + 3443 + 0 + 0 + + + 825 + 728 + 3440 + 0 + 0 + + + 754 + 695 + 3442 + 2 + 0 + + + 734 + 692 + 3447 + 0 + 0 + + + 729 + 692 + 3440 + 1 + 0 + + + 770 + 691 + 3441 + 0 + 0 + + + 801 + 689 + 3444 + 4 + 0 + + + 782 + 688 + 3447 + 0 + 0 + + + 782 + 688 + 3445 + 0 + 0 + + + 770 + 688 + 3440 + 0 + 0 + + + 806 + 695 + 3449 + 2 + 0 + + + 806 + 695 + 3448 + 2 + 0 + + + 793 + 690 + 3452 + 0 + 0 + + + 802 + 690 + 3449 + 6 + 0 + + + 801 + 689 + 3453 + 0 + 0 + + + 791 + 688 + 3453 + 0 + 0 + + + 782 + 688 + 3451 + 0 + 0 + + + 782 + 688 + 3449 + 0 + 0 + + + 808 + 699 + 3449 + 2 + 0 + + + 808 + 699 + 3448 + 2 + 0 + + + 807 + 697 + 3449 + 2 + 0 + + + 807 + 697 + 3448 + 2 + 0 + + + 809 + 711 + 3448 + 2 + 0 + + + 734 + 707 + 3451 + 0 + 0 + + + 834 + 707 + 3450 + 1 + 0 + + + 813 + 706 + 3453 + 0 + 0 + + + 940 + 704 + 3449 + 0 + 0 + + + 811 + 715 + 3448 + 2 + 0 + + + 810 + 713 + 3448 + 2 + 0 + + + 835 + 727 + 3450 + 0 + 0 + + + 144 + 725 + 3451 + 4 + 0 + + + 729 + 725 + 3449 + 4 + 0 + + + 734 + 723 + 3448 + 0 + 0 + + + 782 + 686 + 3447 + 0 + 0 + + + 782 + 686 + 3445 + 0 + 0 + + + 782 + 684 + 3447 + 0 + 0 + + + 782 + 684 + 3445 + 0 + 0 + + + 785 + 682 + 3447 + 0 + 0 + + + 782 + 682 + 3445 + 0 + 0 + + + 777 + 680 + 3447 + 0 + 0 + + + 782 + 680 + 3445 + 0 + 0 + + + 790 + 686 + 3453 + 0 + 0 + + + 789 + 686 + 3451 + 0 + 0 + + + 788 + 686 + 3449 + 0 + 0 + + + 782 + 684 + 3453 + 0 + 0 + + + 782 + 684 + 3451 + 0 + 0 + + + 787 + 684 + 3449 + 0 + 0 + + + 782 + 682 + 3453 + 0 + 0 + + + 782 + 682 + 3451 + 0 + 0 + + + 786 + 682 + 3449 + 0 + 0 + + + 782 + 680 + 3453 + 0 + 0 + + + 782 + 680 + 3451 + 0 + 0 + + + 782 + 680 + 3449 + 0 + 0 + + + 730 + 687 + 3457 + 1 + 0 + + + 758 + 686 + 3463 + 4 + 0 + + + 729 + 686 + 3461 + 2 + 0 + + + 734 + 686 + 3458 + 7 + 0 + + + 729 + 685 + 3462 + 4 + 0 + + + 730 + 685 + 3460 + 4 + 0 + + + 730 + 684 + 3461 + 4 + 0 + + + 730 + 684 + 3459 + 7 + 0 + + + 730 + 684 + 3457 + 4 + 0 + + + 729 + 683 + 3463 + 0 + 0 + + + 730 + 683 + 3462 + 5 + 0 + + + 729 + 683 + 3458 + 4 + 0 + + + 759 + 682 + 3463 + 6 + 0 + + + 730 + 681 + 3462 + 4 + 0 + + + 940 + 681 + 3461 + 0 + 0 + + + 760 + 681 + 3460 + 0 + 0 + + + 760 + 681 + 3459 + 6 + 0 + + + 729 + 681 + 3458 + 1 + 0 + + + 762 + 680 + 3462 + 0 + 0 + + + 729 + 680 + 3457 + 4 + 0 + + + 755 + 695 + 3462 + 0 + 0 + + + 755 + 694 + 3459 + 6 + 0 + + + 755 + 693 + 3461 + 7 + 0 + + + 730 + 689 + 3463 + 4 + 0 + + + 756 + 689 + 3460 + 1 + 0 + + + 730 + 688 + 3462 + 4 + 0 + + + 757 + 688 + 3461 + 2 + 0 + + + 730 + 688 + 3459 + 4 + 0 + + + 730 + 688 + 3458 + 4 + 0 + + + 792 + 679 + 3446 + 0 + 0 + + + 729 + 679 + 3451 + 0 + 0 + + + 734 + 678 + 3448 + 0 + 0 + + + 730 + 679 + 3463 + 4 + 0 + + + 729 + 679 + 3462 + 5 + 0 + + + 730 + 679 + 3459 + 4 + 0 + + + 729 + 679 + 3458 + 4 + 0 + + + 730 + 678 + 3461 + 4 + 0 + + + 730 + 678 + 3459 + 4 + 0 + + + 729 + 678 + 3458 + 1 + 0 + + + 765 + 677 + 3463 + 2 + 0 + + + 730 + 677 + 3460 + 0 + 0 + + + 730 + 676 + 3462 + 4 + 0 + + + 940 + 676 + 3461 + 0 + 0 + + + 734 + 676 + 3458 + 1 + 0 + + + 730 + 675 + 3463 + 4 + 0 + + + 755 + 674 + 3460 + 4 + 0 + + + 755 + 673 + 3459 + 6 + 0 + + + 767 + 672 + 3462 + 6 + 0 + + + 729 + 679 + 3467 + 7 + 0 + + + 764 + 679 + 3465 + 7 + 0 + + + 763 + 679 + 3464 + 1 + 0 + + + 940 + 678 + 3468 + 0 + 0 + + + 734 + 678 + 3466 + 7 + 0 + + + 730 + 677 + 3469 + 7 + 0 + + + 729 + 677 + 3465 + 4 + 0 + + + 729 + 677 + 3464 + 0 + 0 + + + 729 + 675 + 3468 + 2 + 0 + + + 766 + 675 + 3467 + 4 + 0 + + + 940 + 675 + 3466 + 0 + 0 + + + 729 + 675 + 3465 + 0 + 0 + + + 729 + 675 + 3464 + 4 + 0 + + + 730 + 674 + 3469 + 4 + 0 + + + 755 + 673 + 3467 + 4 + 0 + + + 755 + 673 + 3466 + 4 + 0 + + + 755 + 673 + 3464 + 4 + 0 + + + 755 + 672 + 3468 + 3 + 0 + + + 755 + 672 + 3465 + 2 + 0 + + + 734 + 687 + 3468 + 7 + 0 + + + 729 + 687 + 3464 + 6 + 0 + + + 729 + 686 + 3469 + 4 + 0 + + + 730 + 686 + 3467 + 4 + 0 + + + 729 + 685 + 3466 + 4 + 0 + + + 729 + 684 + 3469 + 4 + 0 + + + 940 + 684 + 3465 + 0 + 0 + + + 734 + 683 + 3467 + 7 + 0 + + + 730 + 683 + 3466 + 4 + 0 + + + 730 + 683 + 3464 + 4 + 0 + + + 729 + 682 + 3469 + 3 + 0 + + + 729 + 681 + 3466 + 0 + 0 + + + 729 + 681 + 3465 + 4 + 0 + + + 729 + 681 + 3464 + 4 + 0 + + + 729 + 680 + 3469 + 0 + 0 + + + 729 + 680 + 3467 + 0 + 0 + + + 755 + 694 + 3465 + 6 + 0 + + + 730 + 689 + 3469 + 6 + 0 + + + 730 + 689 + 3466 + 2 + 0 + + + 730 + 689 + 3464 + 4 + 0 + + + 730 + 688 + 3469 + 4 + 0 + + + 729 + 688 + 3467 + 4 + 0 + + + 940 + 688 + 3465 + 0 + 0 + + + 800 + 710 + 3465 + 0 + 0 + + + 734 + 727 + 3460 + 2 + 0 + + + 734 + 726 + 3463 + 3 + 0 + + + 729 + 726 + 3462 + 0 + 0 + + + 730 + 726 + 3458 + 7 + 0 + + + 868 + 725 + 3463 + 0 + 0 + + + 734 + 724 + 3459 + 5 + 0 + + + 734 + 723 + 3462 + 0 + 0 + + + 841 + 722 + 3461 + 6 + 0 + + + 734 + 726 + 3467 + 2 + 0 + + + 940 + 724 + 3471 + 0 + 0 + + + 734 + 723 + 3469 + 2 + 0 + + + 729 + 721 + 3470 + 2 + 0 + + + 730 + 734 + 3454 + 0 + 0 + + + 730 + 734 + 3452 + 0 + 0 + + + 730 + 730 + 3449 + 2 + 0 + + + 734 + 728 + 3450 + 0 + 0 + + + 729 + 729 + 3462 + 3 + 0 + + + 940 + 729 + 3460 + 0 + 0 + + + 730 + 743 + 3426 + 1 + 0 + + + 730 + 742 + 3430 + 1 + 0 + + + 734 + 741 + 3431 + 4 + 0 + + + 729 + 741 + 3429 + 1 + 0 + + + 734 + 741 + 3427 + 2 + 0 + + + 730 + 741 + 3424 + 1 + 0 + + + 821 + 742 + 3446 + 2 + 0 + + + 820 + 739 + 3446 + 2 + 0 + + + 819 + 736 + 3446 + 2 + 0 + + + 815 + 740 + 3452 + 2 + 0 + + + 818 + 738 + 3452 + 0 + 0 + + + 209 + 737 + 3454 + 4 + 0 + + + 839 + 743 + 3457 + 2 + 0 + + + 734 + 741 + 3461 + 5 + 0 + + + 170 + 738 + 3430 + 1 + 1 + + + 170 + 738 + 3429 + 1 + 1 + + + 734 + 728 + 3468 + 2 + 0 + + + 204 + 743 + 3465 + 0 + 0 + + + 940 + 741 + 3464 + 0 + 0 + + + 730 + 740 + 3465 + 5 + 0 + + + 730 + 747 + 3434 + 1 + 0 + + + 734 + 744 + 3432 + 2 + 0 + + + 824 + 751 + 3446 + 2 + 0 + + + 940 + 749 + 3440 + 0 + 0 + + + 823 + 748 + 3446 + 2 + 0 + + + 822 + 745 + 3446 + 2 + 0 + + + 734 + 751 + 3460 + 3 + 0 + + + 940 + 750 + 3462 + 0 + 0 + + + 22 + 750 + 3458 + 0 + 0 + + + 204 + 748 + 3457 + 0 + 0 + + + 734 + 746 + 3459 + 0 + 0 + + + 290 + 745 + 3457 + 0 + 0 + + + 734 + 744 + 3463 + 2 + 0 + + + 730 + 751 + 3465 + 5 + 0 + + + 290 + 750 + 3467 + 0 + 0 + + + 734 + 749 + 3466 + 0 + 0 + + + 206 + 748 + 3467 + 0 + 0 + + + 840 + 746 + 3470 + 0 + 0 + + + 22 + 744 + 3467 + 0 + 0 + + + 170 + 750 + 3460 + 0 + 1 + + + 167 + 744 + 3460 + 0 + 1 + + + 170 + 750 + 3465 + 0 + 1 + + + 170 + 744 + 3465 + 0 + 1 + + + 816 + 708 + 3472 + 4 + 0 + + + 734 + 727 + 3479 + 6 + 0 + + + 734 + 727 + 3474 + 6 + 0 + + + 734 + 726 + 3478 + 6 + 0 + + + 730 + 725 + 3475 + 6 + 0 + + + 730 + 724 + 3478 + 7 + 0 + + + 729 + 723 + 3479 + 6 + 0 + + + 729 + 723 + 3476 + 6 + 0 + + + 730 + 723 + 3472 + 2 + 0 + + + 856 + 734 + 3479 + 0 + 0 + + + 857 + 734 + 3476 + 0 + 0 + + + 848 + 733 + 3473 + 4 + 0 + + + 847 + 732 + 3478 + 2 + 0 + + + 858 + 732 + 3475 + 0 + 0 + + + 848 + 731 + 3479 + 4 + 0 + + + 848 + 731 + 3477 + 4 + 0 + + + 734 + 731 + 3474 + 0 + 0 + + + 848 + 729 + 3479 + 4 + 0 + + + 848 + 729 + 3477 + 4 + 0 + + + 848 + 729 + 3473 + 4 + 0 + + + 848 + 742 + 3479 + 4 + 0 + + + 734 + 742 + 3478 + 4 + 0 + + + 848 + 742 + 3477 + 4 + 0 + + + 940 + 742 + 3475 + 0 + 0 + + + 848 + 742 + 3473 + 4 + 0 + + + 853 + 740 + 3477 + 0 + 0 + + + 855 + 738 + 3479 + 0 + 0 + + + 846 + 738 + 3476 + 2 + 0 + + + 854 + 738 + 3472 + 0 + 0 + + + 848 + 737 + 3476 + 4 + 0 + + + 848 + 736 + 3474 + 4 + 0 + + + 729 + 751 + 3428 + 1 + 0 + + + 734 + 749 + 3429 + 0 + 0 + + + 729 + 748 + 3430 + 1 + 0 + + + 730 + 748 + 3425 + 1 + 0 + + + 734 + 746 + 3431 + 0 + 0 + + + 734 + 744 + 3428 + 6 + 0 + + + 730 + 754 + 3430 + 6 + 0 + + + 729 + 758 + 3439 + 7 + 0 + + + 729 + 758 + 3436 + 5 + 0 + + + 730 + 756 + 3437 + 2 + 0 + + + 730 + 756 + 3432 + 3 + 0 + + + 940 + 755 + 3434 + 0 + 0 + + + 730 + 753 + 3433 + 5 + 0 + + + 729 + 759 + 3441 + 7 + 0 + + + 170 + 753 + 3430 + 1 + 1 + + + 844 + 751 + 3474 + 2 + 0 + + + 734 + 750 + 3477 + 4 + 0 + + + 849 + 750 + 3476 + 0 + 0 + + + 848 + 749 + 3478 + 4 + 0 + + + 734 + 744 + 3478 + 4 + 0 + + + 848 + 744 + 3476 + 4 + 0 + + + 817 + 715 + 3481 + 4 + 0 + + + 730 + 725 + 3481 + 6 + 0 + + + 734 + 724 + 3482 + 1 + 0 + + + 730 + 722 + 3481 + 5 + 0 + + + 734 + 721 + 3483 + 6 + 0 + + + 848 + 735 + 3483 + 4 + 0 + + + 848 + 733 + 3483 + 4 + 0 + + + 734 + 732 + 3483 + 4 + 0 + + + 848 + 731 + 3483 + 4 + 0 + + + 859 + 731 + 3481 + 0 + 0 + + + 851 + 743 + 3483 + 0 + 0 + + + 734 + 741 + 3484 + 4 + 0 + + + 848 + 741 + 3483 + 4 + 0 + + + 852 + 741 + 3481 + 0 + 0 + + + 845 + 740 + 3484 + 2 + 0 + + + 734 + 740 + 3482 + 4 + 0 + + + 848 + 739 + 3483 + 4 + 0 + + + 848 + 738 + 3481 + 4 + 0 + + + 848 + 737 + 3483 + 4 + 0 + + + 848 + 736 + 3481 + 4 + 0 + + + 848 + 751 + 3482 + 4 + 0 + + + 843 + 751 + 3481 + 2 + 0 + + + 848 + 751 + 3480 + 4 + 0 + + + 848 + 749 + 3484 + 4 + 0 + + + 848 + 749 + 3482 + 4 + 0 + + + 848 + 749 + 3480 + 4 + 0 + + + 848 + 747 + 3482 + 4 + 0 + + + 848 + 747 + 3480 + 4 + 0 + + + 734 + 745 + 3482 + 2 + 0 + + + 850 + 745 + 3480 + 0 + 0 + + + 860 + 744 + 3481 + 0 + 0 + + + 734 + 744 + 3480 + 4 + 0 + + + 730 + 754 + 3476 + 5 + 0 + + + 734 + 759 + 3487 + 6 + 0 + + + 940 + 758 + 3487 + 0 + 0 + + + 734 + 757 + 3486 + 4 + 0 + + + 730 + 764 + 3440 + 0 + 0 + + + 730 + 762 + 3443 + 7 + 0 + + + 729 + 761 + 3441 + 5 + 0 + + + 730 + 765 + 3460 + 5 + 0 + + + 836 + 762 + 3463 + 4 + 0 + + + 730 + 761 + 3458 + 5 + 0 + + + 837 + 764 + 3464 + 4 + 0 + + + 838 + 766 + 3472 + 0 + 0 + + + 940 + 761 + 3478 + 0 + 0 + + + 940 + 761 + 3476 + 0 + 0 + + + 730 + 761 + 3474 + 5 + 0 + + + 714 + 775 + 3443 + 2 + 0 + + + 715 + 774 + 3443 + 2 + 0 + + + 831 + 773 + 3444 + 2 + 0 + + + 713 + 770 + 3443 + 2 + 0 + + + 144 + 768 + 3442 + 2 + 0 + + + 714 + 773 + 3454 + 2 + 0 + + + 713 + 772 + 3454 + 2 + 0 + + + 716 + 771 + 3454 + 2 + 0 + + + 715 + 770 + 3454 + 2 + 0 + + + 714 + 769 + 3454 + 2 + 0 + + + 734 + 775 + 3460 + 2 + 0 + + + 734 + 771 + 3470 + 2 + 0 + + + 734 + 769 + 3470 + 2 + 0 + + + 734 + 775 + 3478 + 2 + 0 + + + 734 + 774 + 3475 + 4 + 0 + + + 831 + 783 + 3446 + 2 + 0 + + + 714 + 782 + 3443 + 0 + 0 + + + 716 + 782 + 3442 + 0 + 0 + + + 734 + 780 + 3442 + 2 + 0 + + + 895 + 777 + 3447 + 0 + 0 + + + 716 + 777 + 3446 + 0 + 0 + + + 715 + 777 + 3445 + 0 + 0 + + + 715 + 777 + 3444 + 0 + 0 + + + 713 + 777 + 3443 + 0 + 0 + + + 713 + 777 + 3442 + 0 + 0 + + + 713 + 777 + 3441 + 0 + 0 + + + 716 + 777 + 3440 + 0 + 0 + + + 713 + 776 + 3443 + 2 + 0 + + + 716 + 783 + 3454 + 2 + 0 + + + 714 + 782 + 3454 + 2 + 0 + + + 713 + 781 + 3454 + 2 + 0 + + + 717 + 777 + 3454 + 7 + 0 + + + 715 + 777 + 3450 + 0 + 0 + + + 734 + 779 + 3461 + 4 + 0 + + + 714 + 777 + 3463 + 0 + 0 + + + 899 + 777 + 3460 + 0 + 0 + + + 714 + 777 + 3459 + 0 + 0 + + + 714 + 777 + 3458 + 0 + 0 + + + 713 + 783 + 3466 + 2 + 0 + + + 713 + 782 + 3466 + 2 + 0 + + + 714 + 781 + 3466 + 2 + 0 + + + 714 + 780 + 3466 + 2 + 0 + + + 734 + 779 + 3468 + 2 + 0 + + + 715 + 779 + 3466 + 2 + 0 + + + 713 + 777 + 3464 + 0 + 0 + + + 734 + 776 + 3469 + 2 + 0 + + + 831 + 776 + 3467 + 0 + 0 + + + 713 + 783 + 3472 + 2 + 0 + + + 713 + 782 + 3472 + 2 + 0 + + + 714 + 781 + 3472 + 2 + 0 + + + 715 + 780 + 3472 + 2 + 0 + + + 734 + 779 + 3479 + 4 + 0 + + + 715 + 779 + 3472 + 2 + 0 + + + 900 + 777 + 3478 + 0 + 0 + + + 716 + 777 + 3477 + 0 + 0 + + + 713 + 777 + 3476 + 0 + 0 + + + 713 + 777 + 3475 + 0 + 0 + + + 714 + 777 + 3474 + 0 + 0 + + + 831 + 776 + 3473 + 0 + 0 + + + 734 + 765 + 3486 + 3 + 0 + + + 735 + 765 + 3482 + 3 + 0 + + + 734 + 764 + 3484 + 2 + 0 + + + 735 + 763 + 3486 + 5 + 0 + + + 734 + 762 + 3483 + 1 + 0 + + + 734 + 761 + 3485 + 0 + 0 + + + 735 + 760 + 3484 + 3 + 0 + + + 734 + 771 + 3484 + 2 + 0 + + + 717 + 777 + 3484 + 7 + 0 + + + 940 + 747 + 3495 + 0 + 0 + + + 735 + 756 + 3488 + 7 + 0 + + + 940 + 764 + 3495 + 0 + 0 + + + 735 + 763 + 3489 + 1 + 0 + + + 940 + 761 + 3489 + 0 + 0 + + + 734 + 761 + 3488 + 7 + 0 + + + 713 + 775 + 3492 + 2 + 0 + + + 713 + 774 + 3492 + 2 + 0 + + + 716 + 773 + 3492 + 2 + 0 + + + 734 + 773 + 3490 + 2 + 0 + + + 715 + 772 + 3492 + 2 + 0 + + + 714 + 771 + 3492 + 2 + 0 + + + 734 + 779 + 3495 + 2 + 0 + + + 714 + 777 + 3495 + 0 + 0 + + + 713 + 777 + 3494 + 0 + 0 + + + 713 + 777 + 3490 + 0 + 0 + + + 713 + 777 + 3489 + 0 + 0 + + + 713 + 777 + 3488 + 0 + 0 + + + 831 + 776 + 3493 + 0 + 0 + + + 169 + 755 + 3489 + 1 + 1 + + + 862 + 750 + 3496 + 6 + 0 + + + 863 + 749 + 3497 + 2 + 0 + + + 734 + 747 + 3498 + 5 + 0 + + + 865 + 756 + 3502 + 0 + 0 + + + 734 + 754 + 3498 + 5 + 0 + + + 734 + 752 + 3496 + 5 + 0 + + + 863 + 766 + 3497 + 2 + 0 + + + 734 + 763 + 3499 + 5 + 0 + + + 867 + 761 + 3500 + 0 + 0 + + + 871 + 761 + 3499 + 0 + 0 + + + 713 + 783 + 3497 + 2 + 0 + + + 714 + 782 + 3497 + 2 + 0 + + + 716 + 781 + 3497 + 2 + 0 + + + 901 + 778 + 3497 + 6 + 0 + + + 714 + 777 + 3503 + 0 + 0 + + + 715 + 777 + 3499 + 0 + 0 + + + 714 + 777 + 3498 + 0 + 0 + + + 714 + 777 + 3497 + 0 + 0 + + + 714 + 777 + 3496 + 0 + 0 + + + 831 + 776 + 3502 + 0 + 0 + + + 168 + 744 + 3499 + 0 + 1 + + + 873 + 737 + 3489 + 2 + 0 + + + 865 + 739 + 3502 + 0 + 0 + + + 734 + 737 + 3498 + 5 + 0 + + + 714 + 775 + 3510 + 2 + 0 + + + 714 + 774 + 3510 + 2 + 0 + + + 715 + 773 + 3510 + 2 + 0 + + + 831 + 770 + 3511 + 0 + 0 + + + 714 + 769 + 3510 + 2 + 0 + + + 716 + 768 + 3508 + 0 + 0 + + + 716 + 768 + 3505 + 0 + 0 + + + 169 + 739 + 3489 + 1 + 1 + + + 873 + 735 + 3489 + 2 + 0 + + + 874 + 733 + 3489 + 2 + 0 + + + 864 + 732 + 3494 + 2 + 0 + + + 730 + 729 + 3490 + 0 + 0 + + + 734 + 735 + 3496 + 5 + 0 + + + 862 + 733 + 3496 + 6 + 0 + + + 940 + 730 + 3501 + 0 + 0 + + + 866 + 728 + 3498 + 0 + 0 + + + 170 + 730 + 3489 + 1 + 1 + + + 730 + 727 + 3493 + 5 + 0 + + + 730 + 727 + 3488 + 7 + 0 + + + 730 + 726 + 3491 + 6 + 0 + + + 730 + 722 + 3491 + 3 + 0 + + + 867 + 720 + 3501 + 0 + 0 + + + 940 + 724 + 3499 + 0 + 0 + + + 169 + 725 + 3491 + 1 + 1 + + + 51 + 718 + 3507 + 6 + 0 + + + 51 + 716 + 3505 + 0 + 0 + + + 51 + 714 + 3507 + 4 + 0 + + + 117 + 713 + 3511 + 5 + 0 + + + 5 + 712 + 3511 + 0 + 0 + + + 51 + 711 + 3505 + 0 + 0 + + + 51 + 708 + 3507 + 4 + 0 + + + 51 + 704 + 3505 + 0 + 0 + + + 714 + 771 + 3514 + 0 + 0 + + + 716 + 771 + 3513 + 0 + 0 + + + 714 + 771 + 3512 + 0 + 0 + + + 831 + 770 + 3517 + 0 + 0 + + + 714 + 782 + 3510 + 2 + 0 + + + 716 + 781 + 3510 + 2 + 0 + + + 713 + 780 + 3510 + 2 + 0 + + + 713 + 779 + 3510 + 2 + 0 + + + 831 + 778 + 3511 + 2 + 0 + + + 714 + 777 + 3508 + 0 + 0 + + + 904 + 777 + 3505 + 0 + 0 + + + 713 + 777 + 3504 + 0 + 0 + + + 906 + 780 + 3519 + 6 + 0 + + + 713 + 779 + 3519 + 2 + 0 + + + 872 + 765 + 3439 + 2 + 0 + + + 729 + 764 + 3437 + 3 + 0 + + + 730 + 764 + 3433 + 1 + 0 + + + 729 + 762 + 3438 + 0 + 0 + + + 729 + 762 + 3435 + 1 + 0 + + + 730 + 762 + 3433 + 2 + 0 + + + 940 + 760 + 3439 + 0 + 0 + + + 730 + 760 + 3435 + 1 + 0 + + + 734 + 773 + 3429 + 1 + 0 + + + 734 + 774 + 3438 + 2 + 0 + + + 714 + 782 + 3431 + 0 + 0 + + + 715 + 782 + 3430 + 0 + 0 + + + 716 + 782 + 3429 + 0 + 0 + + + 713 + 782 + 3428 + 0 + 0 + + + 892 + 782 + 3425 + 0 + 0 + + + 716 + 782 + 3424 + 0 + 0 + + + 734 + 777 + 3427 + 7 + 0 + + + 734 + 776 + 3431 + 2 + 0 + + + 896 + 782 + 3439 + 0 + 0 + + + 714 + 782 + 3438 + 0 + 0 + + + 713 + 782 + 3437 + 0 + 0 + + + 713 + 782 + 3433 + 0 + 0 + + + 714 + 782 + 3432 + 0 + 0 + + + 831 + 781 + 3434 + 6 + 0 + + + 715 + 780 + 3435 + 2 + 0 + + + 715 + 779 + 3435 + 2 + 0 + + + 714 + 778 + 3435 + 2 + 0 + + + 714 + 777 + 3439 + 0 + 0 + + + 714 + 777 + 3438 + 0 + 0 + + + 714 + 777 + 3437 + 0 + 0 + + + 716 + 777 + 3436 + 0 + 0 + + + 886 + 777 + 3435 + 0 + 0 + + + 730 + 759 + 3419 + 1 + 0 + + + 734 + 758 + 3420 + 3 + 0 + + + 729 + 757 + 3418 + 5 + 0 + + + 734 + 757 + 3416 + 3 + 0 + + + 729 + 755 + 3417 + 1 + 0 + + + 876 + 766 + 3417 + 0 + 0 + + + 722 + 764 + 3417 + 0 + 0 + + + 940 + 762 + 3421 + 0 + 0 + + + 734 + 761 + 3419 + 3 + 0 + + + 97 + 761 + 3416 + 4 + 0 + + + 97 + 760 + 3417 + 4 + 0 + + + 830 + 760 + 3416 + 6 + 0 + + + 891 + 774 + 3417 + 6 + 0 + + + 889 + 773 + 3418 + 0 + 0 + + + 716 + 773 + 3417 + 6 + 0 + + + 734 + 772 + 3421 + 5 + 0 + + + 714 + 772 + 3417 + 6 + 0 + + + 875 + 768 + 3416 + 4 + 0 + + + 714 + 782 + 3423 + 0 + 0 + + + 713 + 782 + 3422 + 0 + 0 + + + 713 + 782 + 3421 + 0 + 0 + + + 717 + 782 + 3417 + 6 + 0 + + + 734 + 779 + 3421 + 5 + 0 + + + 715 + 778 + 3417 + 2 + 0 + + + 716 + 777 + 3417 + 6 + 0 + + + 734 + 776 + 3419 + 5 + 0 + + + 883 + 737 + 3420 + 2 + 0 + + + 729 + 737 + 3419 + 4 + 0 + + + 734 + 741 + 3413 + 3 + 0 + + + 882 + 737 + 3411 + 2 + 0 + + + 729 + 737 + 3410 + 4 + 0 + + + 734 + 736 + 3412 + 5 + 0 + + + 734 + 736 + 3409 + 5 + 0 + + + 729 + 758 + 3415 + 6 + 0 + + + 734 + 758 + 3413 + 3 + 0 + + + 940 + 756 + 3415 + 0 + 0 + + + 734 + 762 + 3414 + 3 + 0 + + + 734 + 762 + 3412 + 3 + 0 + + + 729 + 760 + 3414 + 7 + 0 + + + 734 + 775 + 3415 + 5 + 0 + + + 734 + 772 + 3411 + 5 + 0 + + + 713 + 782 + 3413 + 0 + 0 + + + 716 + 782 + 3412 + 0 + 0 + + + 715 + 782 + 3411 + 0 + 0 + + + 714 + 782 + 3410 + 0 + 0 + + + 734 + 781 + 3412 + 5 + 0 + + + 734 + 778 + 3413 + 5 + 0 + + + 886 + 791 + 3414 + 0 + 0 + + + 714 + 791 + 3413 + 0 + 0 + + + 714 + 791 + 3412 + 0 + 0 + + + 888 + 791 + 3409 + 6 + 0 + + + 831 + 790 + 3409 + 6 + 0 + + + 714 + 791 + 3423 + 0 + 0 + + + 715 + 791 + 3422 + 0 + 0 + + + 713 + 791 + 3418 + 0 + 0 + + + 886 + 791 + 3417 + 0 + 0 + + + 888 + 790 + 3420 + 0 + 0 + + + 831 + 790 + 3419 + 6 + 0 + + + 714 + 790 + 3417 + 2 + 0 + + + 715 + 789 + 3417 + 2 + 0 + + + 713 + 788 + 3417 + 2 + 0 + + + 714 + 787 + 3417 + 2 + 0 + + + 714 + 786 + 3417 + 2 + 0 + + + 922 + 785 + 3418 + 0 + 0 + + + 713 + 791 + 3431 + 2 + 0 + + + 714 + 791 + 3430 + 0 + 0 + + + 713 + 791 + 3429 + 0 + 0 + + + 713 + 791 + 3428 + 0 + 0 + + + 713 + 791 + 3424 + 0 + 0 + + + 715 + 790 + 3431 + 2 + 0 + + + 888 + 790 + 3426 + 0 + 0 + + + 831 + 790 + 3425 + 6 + 0 + + + 888 + 788 + 3430 + 6 + 0 + + + 734 + 786 + 3424 + 5 + 0 + + + 734 + 785 + 3427 + 5 + 0 + + + 888 + 791 + 3435 + 0 + 0 + + + 831 + 789 + 3432 + 2 + 0 + + + 730 + 722 + 605 + 7 + 0 + + + 877 + 734 + 605 + 7 + 0 + + + 730 + 732 + 600 + 4 + 0 + + + 877 + 742 + 587 + 7 + 0 + + + 877 + 742 + 584 + 7 + 0 + + + 729 + 740 + 585 + 5 + 0 + + + 877 + 738 + 588 + 7 + 0 + + + 730 + 737 + 591 + 3 + 0 + + + 407 + 743 + 598 + 1 + 0 + + + 877 + 742 + 592 + 7 + 0 + + + 407 + 740 + 592 + 5 + 0 + + + 877 + 738 + 596 + 7 + 0 + + + 730 + 737 + 598 + 1 + 0 + + + 877 + 742 + 605 + 7 + 0 + + + 729 + 740 + 602 + 6 + 0 + + + 877 + 738 + 600 + 7 + 0 + + + 407 + 736 + 607 + 0 + 0 + + + 729 + 751 + 586 + 3 + 0 + + + 877 + 748 + 584 + 7 + 0 + + + 729 + 751 + 596 + 4 + 0 + + + 407 + 751 + 592 + 6 + 0 + + + 407 + 750 + 599 + 3 + 0 + + + 730 + 750 + 595 + 5 + 0 + + + 729 + 746 + 595 + 7 + 0 + + + 877 + 750 + 605 + 7 + 0 + + + 730 + 749 + 601 + 6 + 0 + + + 877 + 746 + 605 + 7 + 0 + + + 730 + 744 + 602 + 7 + 0 + + + 729 + 755 + 590 + 2 + 0 + + + 877 + 754 + 584 + 7 + 0 + + + 877 + 758 + 596 + 7 + 0 + + + 729 + 754 + 595 + 0 + 0 + + + 729 + 759 + 605 + 1 + 0 + + + 877 + 758 + 600 + 7 + 0 + + + 730 + 757 + 603 + 7 + 0 + + + 877 + 755 + 605 + 7 + 0 + + + 877 + 755 + 600 + 7 + 0 + + + 730 + 752 + 602 + 6 + 0 + + + 171 + 727 + 607 + 0 + 1 + + + 171 + 728 + 607 + 0 + 1 + + + 890 + 766 + 585 + 2 + 0 + + + 729 + 761 + 597 + 3 + 0 + + + 729 + 760 + 603 + 2 + 0 + + + 877 + 742 + 612 + 7 + 0 + + + 407 + 742 + 608 + 7 + 0 + + + 729 + 740 + 612 + 1 + 0 + + + 729 + 739 + 614 + 2 + 0 + + + 877 + 737 + 612 + 7 + 0 + + + 877 + 746 + 612 + 7 + 0 + + + 884 + 759 + 612 + 1 + 0 + + + 407 + 759 + 609 + 7 + 0 + + + 884 + 758 + 615 + 2 + 0 + + + 877 + 757 + 614 + 7 + 0 + + + 877 + 755 + 610 + 7 + 0 + + + 729 + 763 + 610 + 7 + 0 + + + 884 + 761 + 613 + 7 + 0 + + + 729 + 742 + 617 + 1 + 0 + + + 877 + 741 + 621 + 7 + 0 + + + 877 + 737 + 617 + 7 + 0 + + + 877 + 751 + 621 + 7 + 0 + + + 877 + 746 + 621 + 7 + 0 + + + 877 + 746 + 616 + 7 + 0 + + + 884 + 759 + 618 + 6 + 0 + + + 877 + 757 + 621 + 7 + 0 + + + 729 + 752 + 617 + 4 + 0 + + + 729 + 762 + 616 + 6 + 0 + + + 884 + 760 + 616 + 3 + 0 + + + 877 + 741 + 626 + 0 + 0 + + + 877 + 736 + 626 + 0 + 0 + + + 877 + 749 + 630 + 0 + 0 + + + 877 + 747 + 627 + 0 + 0 + + + 730 + 744 + 631 + 6 + 0 + + + 729 + 758 + 628 + 0 + 0 + + + 877 + 758 + 625 + 0 + 0 + + + 877 + 754 + 630 + 0 + 0 + + + 730 + 743 + 633 + 7 + 0 + + + 877 + 741 + 638 + 0 + 0 + + + 877 + 741 + 633 + 0 + 0 + + + 877 + 749 + 635 + 0 + 0 + + + 730 + 746 + 633 + 6 + 0 + + + 729 + 755 + 634 + 0 + 0 + + + 877 + 763 + 638 + 0 + 0 + + + 877 + 743 + 644 + 0 + 0 + + + 407 + 738 + 641 + 6 + 0 + + + 877 + 737 + 646 + 0 + 0 + + + 877 + 749 + 644 + 0 + 0 + + + 877 + 749 + 640 + 0 + 0 + + + 729 + 746 + 643 + 0 + 0 + + + 877 + 757 + 644 + 0 + 0 + + + 877 + 752 + 644 + 0 + 0 + + + 877 + 743 + 650 + 0 + 0 + + + 407 + 741 + 655 + 7 + 0 + + + 877 + 739 + 650 + 0 + 0 + + + 729 + 748 + 650 + 2 + 0 + + + 407 + 747 + 648 + 5 + 0 + + + 377 + 758 + 651 + 1 + 0 + + + 377 + 757 + 654 + 1 + 0 + + + 407 + 754 + 651 + 5 + 0 + + + 407 + 752 + 655 + 3 + 0 + + + 377 + 765 + 654 + 7 + 0 + + + 22 + 763 + 655 + 4 + 0 + + + 21 + 763 + 654 + 0 + 0 + + + 21 + 763 + 652 + 0 + 0 + + + 21 + 760 + 654 + 4 + 0 + + + 21 + 760 + 652 + 4 + 0 + + + 407 + 739 + 661 + 1 + 0 + + + 407 + 749 + 658 + 6 + 0 + + + 729 + 747 + 656 + 0 + 0 + + + 22 + 759 + 656 + 4 + 0 + + + 50 + 758 + 661 + 0 + 0 + + + 21 + 758 + 658 + 4 + 0 + + + 21 + 758 + 656 + 4 + 0 + + + 278 + 757 + 662 + 0 + 0 + + + 377 + 757 + 658 + 1 + 0 + + + 8 + 756 + 663 + 1 + 0 + + + 8 + 755 + 662 + 3 + 0 + + + 21 + 754 + 661 + 4 + 0 + + + 377 + 754 + 657 + 1 + 0 + + + 377 + 752 + 660 + 1 + 0 + + + 21 + 765 + 660 + 0 + 0 + + + 21 + 765 + 657 + 0 + 0 + + + 22 + 764 + 660 + 3 + 0 + + + 22 + 764 + 659 + 3 + 0 + + + 51 + 763 + 663 + 0 + 0 + + + 97 + 762 + 660 + 5 + 0 + + + 50 + 760 + 661 + 0 + 0 + + + 278 + 760 + 660 + 0 + 0 + + + 1 + 764 + 663 + 0 + 1 + + + 729 + 740 + 666 + 0 + 0 + + + 920 + 739 + 668 + 0 + 0 + + + 729 + 748 + 666 + 2 + 0 + + + 51 + 759 + 667 + 4 + 0 + + + 51 + 757 + 667 + 5 + 0 + + + 3 + 756 + 666 + 6 + 0 + + + 3 + 756 + 665 + 6 + 0 + + + 51 + 756 + 664 + 0 + 0 + + + 21 + 754 + 667 + 4 + 0 + + + 21 + 754 + 664 + 4 + 0 + + + 377 + 752 + 664 + 1 + 0 + + + 880 + 764 + 665 + 3 + 0 + + + 22 + 763 + 666 + 3 + 0 + + + 3 + 763 + 665 + 6 + 0 + + + 51 + 762 + 664 + 0 + 0 + + + 55 + 760 + 667 + 4 + 0 + + + 51 + 760 + 664 + 0 + 0 + + + 1 + 758 + 664 + 0 + 1 + + + 884 + 735 + 641 + 2 + 0 + + + 884 + 733 + 642 + 0 + 0 + + + 407 + 732 + 645 + 6 + 0 + + + 407 + 729 + 647 + 6 + 0 + + + 407 + 733 + 651 + 3 + 0 + + + 407 + 731 + 654 + 6 + 0 + + + 881 + 730 + 650 + 3 + 0 + + + 407 + 735 + 658 + 6 + 0 + + + 729 + 733 + 661 + 2 + 0 + + + 877 + 734 + 633 + 0 + 0 + + + 877 + 732 + 638 + 0 + 0 + + + 877 + 728 + 638 + 0 + 0 + + + 877 + 728 + 633 + 0 + 0 + + + 877 + 734 + 630 + 0 + 0 + + + 729 + 732 + 628 + 0 + 0 + + + 877 + 728 + 627 + 0 + 0 + + + 729 + 734 + 617 + 0 + 0 + + + 730 + 725 + 614 + 4 + 0 + + + 730 + 723 + 608 + 1 + 0 + + + 729 + 734 + 614 + 6 + 0 + + + 877 + 729 + 612 + 7 + 0 + + + 713 + 799 + 3414 + 2 + 0 + + + 734 + 799 + 3411 + 2 + 0 + + + 831 + 799 + 3410 + 2 + 0 + + + 714 + 798 + 3414 + 2 + 0 + + + 715 + 798 + 3413 + 0 + 0 + + + 714 + 798 + 3412 + 0 + 0 + + + 714 + 798 + 3411 + 0 + 0 + + + 888 + 798 + 3408 + 6 + 0 + + + 888 + 796 + 3413 + 6 + 0 + + + 831 + 795 + 3413 + 6 + 0 + + + 714 + 794 + 3414 + 2 + 0 + + + 715 + 793 + 3414 + 2 + 0 + + + 734 + 793 + 3413 + 2 + 0 + + + 714 + 792 + 3414 + 2 + 0 + + + 713 + 799 + 3420 + 2 + 0 + + + 734 + 799 + 3418 + 2 + 0 + + + 714 + 798 + 3420 + 2 + 0 + + + 715 + 797 + 3422 + 0 + 0 + + + 715 + 797 + 3421 + 0 + 0 + + + 715 + 797 + 3420 + 2 + 0 + + + 716 + 796 + 3420 + 2 + 0 + + + 715 + 796 + 3419 + 0 + 0 + + + 714 + 796 + 3418 + 0 + 0 + + + 714 + 796 + 3417 + 0 + 0 + + + 715 + 796 + 3416 + 0 + 0 + + + 715 + 795 + 3420 + 2 + 0 + + + 734 + 794 + 3422 + 2 + 0 + + + 714 + 794 + 3420 + 2 + 0 + + + 714 + 793 + 3420 + 2 + 0 + + + 734 + 793 + 3416 + 2 + 0 + + + 714 + 799 + 3431 + 2 + 0 + + + 831 + 798 + 3425 + 2 + 0 + + + 888 + 798 + 3424 + 4 + 0 + + + 715 + 797 + 3429 + 0 + 0 + + + 715 + 797 + 3428 + 0 + 0 + + + 715 + 797 + 3427 + 0 + 0 + + + 715 + 797 + 3426 + 0 + 0 + + + 714 + 795 + 3431 + 2 + 0 + + + 716 + 794 + 3431 + 2 + 0 + + + 734 + 794 + 3427 + 2 + 0 + + + 713 + 793 + 3431 + 2 + 0 + + + 713 + 792 + 3431 + 2 + 0 + + + 713 + 799 + 3435 + 2 + 0 + + + 716 + 798 + 3435 + 2 + 0 + + + 831 + 798 + 3432 + 2 + 0 + + + 714 + 797 + 3435 + 2 + 0 + + + 888 + 797 + 3432 + 2 + 0 + + + 734 + 796 + 3438 + 2 + 0 + + + 713 + 796 + 3435 + 2 + 0 + + + 716 + 795 + 3435 + 2 + 0 + + + 713 + 794 + 3435 + 2 + 0 + + + 831 + 793 + 3436 + 2 + 0 + + + 714 + 792 + 3433 + 0 + 0 + + + 713 + 792 + 3432 + 0 + 0 + + + 831 + 807 + 3413 + 6 + 0 + + + 714 + 806 + 3414 + 2 + 0 + + + 713 + 805 + 3414 + 2 + 0 + + + 734 + 805 + 3413 + 4 + 0 + + + 714 + 804 + 3414 + 2 + 0 + + + 831 + 803 + 3415 + 2 + 0 + + + 888 + 802 + 3413 + 6 + 0 + + + 713 + 800 + 3414 + 2 + 0 + + + 888 + 807 + 3422 + 0 + 0 + + + 888 + 803 + 3420 + 4 + 0 + + + 716 + 802 + 3423 + 0 + 0 + + + 713 + 802 + 3422 + 0 + 0 + + + 715 + 802 + 3418 + 0 + 0 + + + 714 + 802 + 3417 + 0 + 0 + + + 713 + 802 + 3416 + 0 + 0 + + + 831 + 801 + 3419 + 6 + 0 + + + 713 + 800 + 3420 + 2 + 0 + + + 888 + 807 + 3429 + 0 + 0 + + + 831 + 807 + 3428 + 6 + 0 + + + 715 + 807 + 3426 + 2 + 0 + + + 898 + 804 + 3426 + 6 + 0 + + + 831 + 803 + 3427 + 2 + 0 + + + 713 + 802 + 3431 + 0 + 0 + + + 714 + 802 + 3430 + 0 + 0 + + + 714 + 802 + 3429 + 0 + 0 + + + 714 + 802 + 3428 + 0 + 0 + + + 715 + 802 + 3424 + 0 + 0 + + + 715 + 801 + 3431 + 2 + 0 + + + 734 + 801 + 3430 + 4 + 0 + + + 888 + 801 + 3426 + 0 + 0 + + + 716 + 800 + 3431 + 2 + 0 + + + 887 + 807 + 3434 + 0 + 0 + + + 886 + 802 + 3433 + 4 + 0 + + + 714 + 802 + 3432 + 0 + 0 + + + 893 + 801 + 3438 + 0 + 0 + + + 714 + 801 + 3437 + 0 + 0 + + + 888 + 801 + 3434 + 6 + 0 + + + 831 + 800 + 3434 + 6 + 0 + + + 714 + 813 + 3414 + 2 + 0 + + + 716 + 812 + 3414 + 2 + 0 + + + 734 + 811 + 3415 + 4 + 0 + + + 715 + 811 + 3414 + 2 + 0 + + + 714 + 810 + 3414 + 2 + 0 + + + 888 + 808 + 3413 + 6 + 0 + + + 831 + 809 + 3423 + 2 + 0 + + + 714 + 808 + 3420 + 0 + 0 + + + 897 + 808 + 3417 + 0 + 0 + + + 713 + 808 + 3416 + 0 + 0 + + + 713 + 814 + 3426 + 2 + 0 + + + 888 + 812 + 3425 + 6 + 0 + + + 831 + 811 + 3425 + 6 + 0 + + + 734 + 810 + 3428 + 4 + 0 + + + 715 + 810 + 3426 + 2 + 0 + + + 715 + 809 + 3426 + 2 + 0 + + + 713 + 808 + 3431 + 0 + 0 + + + 713 + 808 + 3427 + 0 + 0 + + + 886 + 808 + 3426 + 0 + 0 + + + 715 + 808 + 3425 + 0 + 0 + + + 714 + 808 + 3424 + 0 + 0 + + + 831 + 809 + 3435 + 2 + 0 + + + 713 + 808 + 3432 + 0 + 0 + + + 717 + 789 + 3445 + 0 + 0 + + + 713 + 785 + 3445 + 2 + 0 + + + 713 + 784 + 3445 + 2 + 0 + + + 714 + 797 + 3445 + 2 + 0 + + + 715 + 796 + 3445 + 2 + 0 + + + 716 + 795 + 3445 + 2 + 0 + + + 715 + 794 + 3445 + 2 + 0 + + + 713 + 793 + 3445 + 2 + 0 + + + 714 + 807 + 3445 + 2 + 0 + + + 714 + 806 + 3445 + 2 + 0 + + + 734 + 806 + 3444 + 4 + 0 + + + 714 + 805 + 3445 + 2 + 0 + + + 734 + 805 + 3441 + 4 + 0 + + + 717 + 801 + 3445 + 0 + 0 + + + 714 + 801 + 3441 + 0 + 0 + + + 713 + 812 + 3445 + 2 + 0 + + + 713 + 811 + 3445 + 2 + 0 + + + 734 + 809 + 3447 + 4 + 0 + + + 894 + 808 + 3445 + 6 + 0 + + + 734 + 790 + 3451 + 4 + 0 + + + 714 + 789 + 3452 + 0 + 0 + + + 714 + 789 + 3451 + 0 + 0 + + + 713 + 789 + 3450 + 0 + 0 + + + 713 + 789 + 3449 + 0 + 0 + + + 831 + 788 + 3453 + 6 + 0 + + + 713 + 787 + 3454 + 2 + 0 + + + 714 + 786 + 3454 + 2 + 0 + + + 716 + 785 + 3454 + 2 + 0 + + + 714 + 784 + 3454 + 2 + 0 + + + 734 + 798 + 3448 + 4 + 0 + + + 730 + 791 + 3463 + 0 + 0 + + + 730 + 796 + 3460 + 5 + 0 + + + 729 + 796 + 3457 + 6 + 0 + + + 729 + 794 + 3462 + 0 + 0 + + + 729 + 794 + 3458 + 1 + 0 + + + 734 + 806 + 3459 + 4 + 0 + + + 729 + 804 + 3462 + 6 + 0 + + + 715 + 787 + 3466 + 2 + 0 + + + 715 + 786 + 3466 + 2 + 0 + + + 714 + 785 + 3466 + 2 + 0 + + + 715 + 784 + 3466 + 2 + 0 + + + 784 + 798 + 3469 + 2 + 0 + + + 729 + 798 + 3465 + 0 + 0 + + + 729 + 797 + 3471 + 4 + 0 + + + 730 + 797 + 3465 + 5 + 0 + + + 869 + 793 + 3469 + 2 + 0 + + + 729 + 793 + 3464 + 2 + 0 + + + 729 + 806 + 3465 + 7 + 0 + + + 730 + 803 + 3467 + 5 + 0 + + + 913 + 802 + 3469 + 2 + 0 + + + 730 + 802 + 3465 + 5 + 0 + + + 729 + 801 + 3464 + 2 + 0 + + + 730 + 791 + 3477 + 5 + 0 + + + 729 + 790 + 3474 + 4 + 0 + + + 715 + 787 + 3472 + 2 + 0 + + + 715 + 786 + 3472 + 2 + 0 + + + 714 + 785 + 3472 + 2 + 0 + + + 713 + 784 + 3472 + 2 + 0 + + + 729 + 797 + 3472 + 5 + 0 + + + 729 + 796 + 3478 + 7 + 0 + + + 730 + 795 + 3475 + 7 + 0 + + + 729 + 793 + 3479 + 5 + 0 + + + 729 + 793 + 3476 + 3 + 0 + + + 730 + 793 + 3474 + 3 + 0 + + + 734 + 786 + 3482 + 2 + 0 + + + 734 + 785 + 3480 + 2 + 0 + + + 734 + 796 + 3487 + 4 + 0 + + + 730 + 795 + 3481 + 1 + 0 + + + 734 + 794 + 3485 + 0 + 0 + + + 734 + 789 + 3494 + 2 + 0 + + + 716 + 799 + 3490 + 2 + 0 + + + 715 + 798 + 3490 + 2 + 0 + + + 715 + 797 + 3490 + 2 + 0 + + + 714 + 793 + 3495 + 0 + 0 + + + 713 + 793 + 3494 + 0 + 0 + + + 717 + 793 + 3490 + 0 + 0 + + + 831 + 784 + 3498 + 0 + 0 + + + 713 + 799 + 3500 + 2 + 0 + + + 734 + 799 + 3499 + 4 + 0 + + + 734 + 798 + 3502 + 4 + 0 + + + 716 + 798 + 3500 + 2 + 0 + + + 715 + 797 + 3500 + 2 + 0 + + + 714 + 796 + 3500 + 2 + 0 + + + 714 + 795 + 3500 + 2 + 0 + + + 734 + 795 + 3496 + 4 + 0 + + + 714 + 793 + 3503 + 0 + 0 + + + 713 + 793 + 3502 + 0 + 0 + + + 715 + 793 + 3498 + 0 + 0 + + + 714 + 793 + 3497 + 0 + 0 + + + 716 + 793 + 3496 + 0 + 0 + + + 831 + 792 + 3501 + 0 + 0 + + + 905 + 787 + 3510 + 6 + 0 + + + 714 + 786 + 3510 + 2 + 0 + + + 831 + 785 + 3511 + 2 + 0 + + + 716 + 799 + 3510 + 2 + 0 + + + 714 + 798 + 3510 + 2 + 0 + + + 714 + 797 + 3510 + 2 + 0 + + + 717 + 793 + 3510 + 2 + 0 + + + 713 + 793 + 3506 + 0 + 0 + + + 713 + 793 + 3505 + 0 + 0 + + + 713 + 793 + 3504 + 0 + 0 + + + 714 + 791 + 3519 + 2 + 0 + + + 714 + 787 + 3519 + 2 + 0 + + + 715 + 786 + 3519 + 2 + 0 + + + 714 + 784 + 3517 + 0 + 0 + + + 713 + 784 + 3516 + 0 + 0 + + + 715 + 784 + 3515 + 0 + 0 + + + 716 + 784 + 3514 + 0 + 0 + + + 715 + 784 + 3513 + 0 + 0 + + + 713 + 784 + 3512 + 0 + 0 + + + 716 + 799 + 3519 + 2 + 0 + + + 715 + 798 + 3519 + 2 + 0 + + + 713 + 797 + 3519 + 2 + 0 + + + 714 + 793 + 3519 + 2 + 0 + + + 714 + 792 + 3519 + 2 + 0 + + + 714 + 772 + 3527 + 2 + 0 + + + 714 + 771 + 3527 + 2 + 0 + + + 713 + 770 + 3527 + 2 + 0 + + + 831 + 783 + 3520 + 0 + 0 + + + 715 + 780 + 3527 + 2 + 0 + + + 831 + 778 + 3520 + 2 + 0 + + + 907 + 777 + 3527 + 6 + 0 + + + 714 + 776 + 3527 + 2 + 0 + + + 714 + 791 + 3527 + 2 + 0 + + + 716 + 790 + 3527 + 2 + 0 + + + 831 + 790 + 3520 + 2 + 0 + + + 715 + 789 + 3527 + 2 + 0 + + + 714 + 788 + 3527 + 2 + 0 + + + 717 + 784 + 3527 + 2 + 0 + + + 713 + 784 + 3523 + 0 + 0 + + + 714 + 784 + 3522 + 0 + 0 + + + 714 + 784 + 3521 + 0 + 0 + + + 714 + 798 + 3527 + 2 + 0 + + + 714 + 797 + 3527 + 2 + 0 + + + 713 + 795 + 3525 + 0 + 0 + + + 714 + 795 + 3524 + 0 + 0 + + + 716 + 795 + 3523 + 0 + 0 + + + 715 + 795 + 3522 + 0 + 0 + + + 715 + 795 + 3521 + 0 + 0 + + + 831 + 794 + 3520 + 0 + 0 + + + 714 + 793 + 3527 + 2 + 0 + + + 713 + 792 + 3527 + 2 + 0 + + + 15 + 438 + 1642 + 6 + 0 + + + 6 + 443 + 1646 + 0 + 0 + + + 3 + 442 + 1646 + 0 + 0 + + + 145 + 441 + 1642 + 4 + 0 + + + 145 + 440 + 1646 + 0 + 0 + + + 51 + 503 + 3373 + 2 + 0 + + + 51 + 503 + 3371 + 2 + 0 + + + 51 + 511 + 3374 + 6 + 0 + + + 51 + 511 + 3371 + 6 + 0 + + + 205 + 508 + 3369 + 0 + 0 + + + 205 + 507 + 3375 + 0 + 0 + + + 51 + 507 + 3369 + 0 + 0 + + + 205 + 506 + 3370 + 0 + 0 + + + 51 + 505 + 3369 + 0 + 0 + + + 205 + 510 + 3376 + 0 + 0 + + + 51 + 508 + 3380 + 2 + 0 + + + 20 + 510 + 3386 + 6 + 0 + + + 51 + 508 + 3389 + 2 + 0 + + + 51 + 508 + 3385 + 2 + 0 + + + 51 + 519 + 3375 + 2 + 0 + + + 117 + 519 + 3374 + 2 + 0 + + + 51 + 518 + 3368 + 0 + 0 + + + 41 + 515 + 3370 + 6 + 0 + + + 730 + 519 + 3390 + 0 + 0 + + + 51 + 519 + 3388 + 6 + 0 + + + 51 + 519 + 3384 + 6 + 0 + + + 729 + 518 + 3387 + 0 + 0 + + + 730 + 515 + 3391 + 0 + 0 + + + 729 + 515 + 3386 + 0 + 0 + + + 729 + 514 + 3390 + 0 + 0 + + + 729 + 513 + 3387 + 0 + 0 + + + 730 + 512 + 3386 + 0 + 0 + + + 117 + 521 + 3374 + 6 + 0 + + + 51 + 521 + 3371 + 6 + 0 + + + 51 + 520 + 3368 + 0 + 0 + + + 369 + 534 + 3371 + 6 + 0 + + + 51 + 511 + 3396 + 4 + 0 + + + 20 + 510 + 3393 + 6 + 0 + + + 51 + 508 + 3394 + 2 + 0 + + + 51 + 514 + 3394 + 6 + 0 + + + 24 + 543 + 3373 + 2 + 1 + + + 24 + 542 + 3374 + 2 + 1 + + + 42 + 508 + 1479 + 4 + 0 + + + 41 + 516 + 1479 + 0 + 0 + + + 29 + 512 + 1482 + 0 + 0 + + + 1 + 513 + 1479 + 0 + 1 + + + 29 + 509 + 2421 + 2 + 0 + + + 29 + 509 + 2426 + 2 + 0 + + + 42 + 516 + 2423 + 0 + 0 + + + 1 + 514 + 2426 + 1 + 1 + + + 1 + 514 + 2424 + 0 + 1 + + + 5 + 343 + 1579 + 0 + 0 + + + 5 + 342 + 1579 + 0 + 0 + + + 6 + 340 + 1582 + 6 + 0 + + + 6 + 350 + 1582 + 0 + 0 + + + 6 + 350 + 1577 + 0 + 0 + + + 6 + 346 + 1582 + 0 + 0 + + + 2 + 340 + 1579 + 0 + 1 + + + 2 + 349 + 1581 + 0 + 1 + + + 2 + 348 + 1580 + 0 + 1 + + + 1 + 346 + 1578 + 0 + 1 + + + 2 + 345 + 1577 + 1 + 1 + + + 6 + 341 + 2516 + 0 + 0 + + + 6 + 339 + 2516 + 0 + 0 + + + 6 + 338 + 2514 + 0 + 0 + + + 6 + 343 + 2523 + 0 + 0 + + + 6 + 342 + 2524 + 0 + 0 + + + 6 + 342 + 2523 + 0 + 0 + + + 6 + 339 + 2522 + 0 + 0 + + + 6 + 338 + 2526 + 0 + 0 + + + 6 + 345 + 2513 + 6 + 0 + + + 6 + 346 + 2523 + 0 + 0 + + + 2 + 341 + 2518 + 0 + 1 + + + 2 + 341 + 2515 + 1 + 1 + + + 1 + 346 + 2514 + 0 + 1 + + + 2 + 349 + 2520 + 0 + 1 + + + 2 + 347 + 2520 + 0 + 1 + + + 2 + 345 + 2520 + 0 + 1 + + + 1007 + 639 + 3559 + 0 + 0 + + + 1007 + 637 + 3555 + 0 + 0 + + + 1007 + 636 + 3558 + 0 + 0 + + + 51 + 647 + 3535 + 6 + 0 + + + 51 + 646 + 3533 + 0 + 0 + + + 51 + 647 + 3537 + 6 + 0 + + + 51 + 646 + 3540 + 4 + 0 + + + 51 + 646 + 3538 + 2 + 0 + + + 51 + 646 + 3536 + 2 + 0 + + + 1007 + 642 + 3555 + 0 + 0 + + + 481 + 655 + 3535 + 0 + 0 + + + 290 + 655 + 3534 + 0 + 0 + + + 290 + 655 + 3533 + 0 + 0 + + + 290 + 654 + 3531 + 3 + 0 + + + 290 + 653 + 3534 + 0 + 0 + + + 290 + 653 + 3533 + 0 + 0 + + + 51 + 653 + 3531 + 0 + 0 + + + 55 + 651 + 3534 + 3 + 0 + + + 290 + 651 + 3532 + 0 + 0 + + + 7 + 650 + 3535 + 3 + 0 + + + 290 + 649 + 3535 + 0 + 0 + + + 51 + 649 + 3534 + 2 + 0 + + + 51 + 654 + 3542 + 4 + 0 + + + 51 + 654 + 3539 + 0 + 0 + + + 51 + 654 + 3536 + 4 + 0 + + + 290 + 653 + 3536 + 0 + 0 + + + 5 + 652 + 3541 + 2 + 0 + + + 51 + 652 + 3536 + 4 + 0 + + + 51 + 651 + 3539 + 0 + 0 + + + 290 + 651 + 3536 + 0 + 0 + + + 51 + 650 + 3542 + 4 + 0 + + + 51 + 650 + 3536 + 4 + 0 + + + 51 + 648 + 3539 + 0 + 0 + + + 164 + 653 + 3555 + 2 + 0 + + + 164 + 653 + 3554 + 5 + 0 + + + 164 + 652 + 3554 + 4 + 0 + + + 205 + 649 + 3559 + 4 + 0 + + + 116 + 648 + 3558 + 1 + 0 + + + 51 + 663 + 3527 + 2 + 0 + + + 63 + 663 + 3531 + 6 + 0 + + + 480 + 663 + 3530 + 6 + 0 + + + 51 + 661 + 3535 + 2 + 0 + + + 8 + 661 + 3534 + 3 + 0 + + + 51 + 661 + 3532 + 2 + 0 + + + 51 + 659 + 3534 + 6 + 0 + + + 51 + 658 + 3533 + 0 + 0 + + + 290 + 663 + 3536 + 3 + 0 + + + 51 + 662 + 3536 + 4 + 0 + + + 51 + 659 + 3540 + 4 + 0 + + + 51 + 659 + 3537 + 6 + 0 + + + 51 + 658 + 3538 + 2 + 0 + + + 51 + 658 + 3536 + 2 + 0 + + + 51 + 657 + 3539 + 0 + 0 + + + 1007 + 661 + 3556 + 0 + 0 + + + 1007 + 658 + 3559 + 0 + 0 + + + 51 + 669 + 3527 + 6 + 0 + + + 25 + 669 + 3526 + 6 + 0 + + + 51 + 669 + 3525 + 6 + 0 + + + 55 + 668 + 3527 + 0 + 0 + + + 55 + 668 + 3526 + 6 + 0 + + + 22 + 668 + 3525 + 6 + 0 + + + 55 + 668 + 3524 + 4 + 0 + + + 22 + 667 + 3527 + 6 + 0 + + + 17 + 667 + 3524 + 4 + 0 + + + 51 + 666 + 3524 + 0 + 0 + + + 55 + 665 + 3525 + 3 + 0 + + + 51 + 668 + 3528 + 4 + 0 + + + 51 + 666 + 3535 + 6 + 0 + + + 51 + 666 + 3532 + 6 + 0 + + + 3 + 665 + 3534 + 6 + 0 + + + 7 + 665 + 3532 + 2 + 0 + + + 51 + 665 + 3528 + 4 + 0 + + + 3 + 664 + 3534 + 6 + 0 + + + 51 + 665 + 3536 + 4 + 0 + + + 1007 + 667 + 3559 + 0 + 0 + + + 1 + 649 + 3533 + 1 + 1 + + + 188 + 649 + 3554 + 2 + 1 + + + 1 + 661 + 3533 + 1 + 1 + + + 117 + 678 + 3526 + 5 + 0 + + + 937 + 677 + 3526 + 4 + 0 + + + 51 + 673 + 3523 + 2 + 0 + + + 51 + 673 + 3520 + 2 + 0 + + + 51 + 673 + 3531 + 2 + 0 + + + 51 + 673 + 3528 + 2 + 0 + + + 51 + 678 + 3543 + 4 + 0 + + + 51 + 675 + 3538 + 0 + 0 + + + 116 + 674 + 3539 + 1 + 0 + + + 51 + 673 + 3540 + 2 + 0 + + + 51 + 675 + 3550 + 4 + 0 + + + 51 + 673 + 3547 + 2 + 0 + + + 116 + 678 + 3515 + 1 + 0 + + + 51 + 677 + 3512 + 4 + 0 + + + 51 + 674 + 3512 + 4 + 0 + + + 25 + 206 + 1486 + 0 + 0 + + + 25 + 202 + 1486 + 0 + 0 + + + 25 + 205 + 1494 + 0 + 0 + + + 117 + 204 + 1495 + 0 + 0 + + + 25 + 202 + 1494 + 0 + 0 + + + 25 + 202 + 1489 + 0 + 0 + + + 25 + 206 + 1499 + 2 + 0 + + + 14 + 202 + 1498 + 6 + 0 + + + 117 + 202 + 1497 + 2 + 0 + + + 25 + 215 + 1486 + 0 + 0 + + + 25 + 210 + 1486 + 0 + 0 + + + 5 + 215 + 1492 + 0 + 0 + + + 25 + 215 + 1488 + 0 + 0 + + + 45 + 212 + 1495 + 0 + 0 + + + 45 + 212 + 1494 + 6 + 0 + + + 45 + 212 + 1493 + 6 + 0 + + + 45 + 212 + 1492 + 6 + 0 + + + 45 + 212 + 1491 + 6 + 0 + + + 45 + 212 + 1490 + 4 + 0 + + + 45 + 211 + 1495 + 0 + 0 + + + 24 + 211 + 1489 + 0 + 0 + + + 45 + 210 + 1495 + 0 + 0 + + + 44 + 210 + 1491 + 4 + 0 + + + 25 + 210 + 1488 + 0 + 0 + + + 45 + 209 + 1495 + 0 + 0 + + + 45 + 209 + 1494 + 2 + 0 + + + 45 + 209 + 1493 + 2 + 0 + + + 45 + 209 + 1492 + 2 + 0 + + + 45 + 209 + 1491 + 2 + 0 + + + 45 + 209 + 1490 + 4 + 0 + + + 27 + 209 + 1489 + 0 + 0 + + + 25 + 208 + 1495 + 2 + 0 + + + 51 + 213 + 1498 + 2 + 0 + + + 51 + 213 + 1496 + 2 + 0 + + + 20 + 217 + 1495 + 6 + 0 + + + 20 + 222 + 1498 + 6 + 0 + + + 20 + 221 + 1496 + 6 + 0 + + + 51 + 219 + 1499 + 4 + 0 + + + 20 + 219 + 1497 + 6 + 0 + + + 20 + 216 + 1498 + 6 + 0 + + + 51 + 224 + 1496 + 6 + 0 + + + 1 + 207 + 1495 + 0 + 1 + + + 1 + 206 + 1491 + 1 + 1 + + + 24 + 202 + 1495 + 2 + 1 + + + 24 + 215 + 1494 + 2 + 1 + + + 1 + 209 + 1497 + 1 + 1 + + + 24 + 208 + 1499 + 2 + 1 + + + 17 + 202 + 2441 + 0 + 0 + + + 3 + 215 + 2438 + 0 + 0 + + + 6 + 215 + 2436 + 0 + 0 + + + 120 + 212 + 2439 + 0 + 0 + + + 3 + 208 + 2438 + 0 + 0 + + + 116 + 202 + 2438 + 0 + 1 + + + 1 + 211 + 2438 + 0 + 1 + + + 38 + 213 + 568 + 6 + 0 + + + 70 + 211 + 574 + 6 + 0 + + + 70 + 210 + 573 + 6 + 0 + + + 58 + 210 + 570 + 6 + 0 + + + 38 + 209 + 574 + 6 + 0 + + + 51 + 207 + 3383 + 6 + 0 + + + 25 + 207 + 3382 + 0 + 0 + + + 51 + 207 + 3381 + 6 + 0 + + + 25 + 207 + 3379 + 0 + 0 + + + 51 + 206 + 3379 + 0 + 0 + + + 41 + 204 + 3383 + 0 + 0 + + + 136 + 204 + 3380 + 2 + 0 + + + 51 + 203 + 3379 + 0 + 0 + + + 51 + 202 + 3383 + 2 + 0 + + + 25 + 202 + 3382 + 0 + 0 + + + 51 + 202 + 3381 + 2 + 0 + + + 25 + 202 + 3379 + 0 + 0 + + + 51 + 207 + 3385 + 6 + 0 + + + 51 + 202 + 3385 + 2 + 0 + + + 127 + 223 + 3375 + 4 + 0 + + + 125 + 222 + 3382 + 6 + 0 + + + 126 + 222 + 3378 + 6 + 0 + + + 51 + 222 + 3376 + 2 + 0 + + + 130 + 223 + 3385 + 0 + 0 + + + 51 + 222 + 3384 + 2 + 0 + + + 128 + 229 + 3375 + 4 + 0 + + + 51 + 226 + 3375 + 0 + 0 + + + 51 + 230 + 3383 + 4 + 0 + + + 51 + 230 + 3381 + 0 + 0 + + + 51 + 230 + 3379 + 6 + 0 + + + 51 + 230 + 3377 + 6 + 0 + + + 129 + 230 + 3376 + 2 + 0 + + + 51 + 229 + 3380 + 4 + 0 + + + 51 + 225 + 3378 + 0 + 0 + + + 51 + 227 + 3386 + 4 + 0 + + + 51 + 227 + 3384 + 6 + 0 + + + 124 + 225 + 3386 + 0 + 0 + + + 32 + 223 + 3381 + 0 + 1 + + + 31 + 229 + 3378 + 0 + 1 + + + 29 + 228 + 3382 + 1 + 1 + + + 28 + 228 + 3379 + 1 + 1 + + + 26 + 228 + 3376 + 1 + 1 + + + 33 + 226 + 3381 + 0 + 1 + + + 30 + 226 + 3378 + 0 + 1 + + + 27 + 225 + 3379 + 1 + 1 + + + 25 + 225 + 3376 + 1 + 1 + + + 45 + 319 + 1606 + 0 + 0 + + + 45 + 318 + 1606 + 0 + 0 + + + 45 + 317 + 1606 + 0 + 0 + + + 45 + 316 + 1606 + 0 + 0 + + + 45 + 315 + 1606 + 0 + 0 + + + 45 + 315 + 1605 + 2 + 0 + + + 42 + 315 + 1603 + 6 + 0 + + + 27 + 314 + 1603 + 0 + 0 + + + 210 + 268 + 3000 + 2 + 0 + + + 216 + 267 + 3001 + 5 + 0 + + + 214 + 267 + 3000 + 6 + 0 + + + 216 + 264 + 3012 + 2 + 0 + + + 214 + 273 + 3002 + 6 + 0 + + + 487 + 282 + 3020 + 0 + 0 + + + 5 + 282 + 3017 + 0 + 0 + + + 51 + 571 + 3319 + 6 + 0 + + + 51 + 571 + 3316 + 6 + 0 + + + 51 + 569 + 3315 + 0 + 0 + + + 51 + 571 + 3325 + 6 + 0 + + + 51 + 571 + 3322 + 6 + 0 + + + 5 + 245 + 3012 + 2 + 0 + + + 215 + 254 + 3008 + 5 + 0 + + + 217 + 263 + 3011 + 4 + 0 + + + 215 + 260 + 3016 + 6 + 0 + + + 215 + 270 + 2997 + 6 + 0 + + + 143 + 581 + 3527 + 6 + 0 + + + 633 + 581 + 3525 + 2 + 0 + + + 277 + 579 + 3527 + 4 + 0 + + + 143 + 579 + 3524 + 0 + 0 + + + 277 + 577 + 3526 + 4 + 0 + + + 143 + 576 + 3527 + 2 + 0 + + + 143 + 579 + 3531 + 4 + 0 + + + 629 + 576 + 3529 + 0 + 0 + + + 962 + 647 + 796 + 7 + 0 + + + 397 + 647 + 792 + 0 + 0 + + + 1001 + 646 + 795 + 4 + 0 + + + 398 + 646 + 793 + 0 + 0 + + + 377 + 645 + 794 + 0 + 0 + + + 394 + 643 + 799 + 0 + 0 + + + 951 + 643 + 797 + 4 + 0 + + + 951 + 643 + 796 + 0 + 0 + + + 951 + 642 + 797 + 4 + 0 + + + 951 + 642 + 796 + 0 + 0 + + + 951 + 641 + 797 + 4 + 0 + + + 951 + 641 + 796 + 0 + 0 + + + 951 + 640 + 797 + 4 + 0 + + + 951 + 640 + 796 + 0 + 0 + + + 34 + 655 + 799 + 0 + 0 + + + 394 + 655 + 798 + 0 + 0 + + + 962 + 655 + 793 + 4 + 0 + + + 973 + 652 + 792 + 0 + 0 + + + 398 + 650 + 794 + 3 + 0 + + + 34 + 649 + 799 + 0 + 0 + + + 377 + 649 + 796 + 6 + 0 + + + 395 + 649 + 793 + 4 + 0 + + + 996 + 648 + 799 + 0 + 0 + + + 377 + 648 + 792 + 0 + 0 + + + 951 + 647 + 804 + 6 + 0 + + + 951 + 647 + 803 + 6 + 0 + + + 995 + 647 + 802 + 0 + 0 + + + 951 + 646 + 804 + 2 + 0 + + + 951 + 646 + 803 + 2 + 0 + + + 951 + 646 + 802 + 2 + 0 + + + 377 + 644 + 806 + 2 + 0 + + + 34 + 643 + 806 + 0 + 0 + + + 164 + 655 + 801 + 6 + 0 + + + 962 + 654 + 803 + 1 + 0 + + + 395 + 651 + 804 + 6 + 0 + + + 377 + 649 + 804 + 0 + 0 + + + 975 + 647 + 812 + 2 + 0 + + + 951 + 646 + 812 + 4 + 0 + + + 951 + 646 + 811 + 0 + 0 + + + 951 + 645 + 812 + 4 + 0 + + + 951 + 645 + 811 + 0 + 0 + + + 951 + 644 + 812 + 4 + 0 + + + 951 + 644 + 811 + 0 + 0 + + + 951 + 643 + 812 + 4 + 0 + + + 951 + 643 + 811 + 0 + 0 + + + 951 + 642 + 812 + 4 + 0 + + + 951 + 642 + 811 + 0 + 0 + + + 951 + 641 + 812 + 4 + 0 + + + 951 + 641 + 811 + 0 + 0 + + + 951 + 640 + 812 + 4 + 0 + + + 951 + 640 + 811 + 0 + 0 + + + 397 + 645 + 817 + 0 + 0 + + + 962 + 644 + 822 + 0 + 0 + + + 394 + 644 + 818 + 0 + 0 + + + 286 + 640 + 830 + 3 + 0 + + + 951 + 655 + 812 + 4 + 0 + + + 951 + 655 + 811 + 0 + 0 + + + 377 + 651 + 813 + 0 + 0 + + + 962 + 651 + 821 + 0 + 0 + + + 34 + 649 + 821 + 0 + 0 + + + 398 + 653 + 828 + 0 + 0 + + + 398 + 652 + 831 + 0 + 0 + + + 962 + 652 + 829 + 1 + 0 + + + 205 + 652 + 828 + 2 + 0 + + + 395 + 651 + 828 + 6 + 0 + + + 398 + 650 + 829 + 6 + 0 + + + 398 + 649 + 827 + 6 + 0 + + + 205 + 661 + 798 + 0 + 0 + + + 395 + 659 + 796 + 4 + 0 + + + 377 + 656 + 799 + 0 + 0 + + + 962 + 663 + 806 + 3 + 0 + + + 1003 + 659 + 804 + 2 + 0 + + + 164 + 659 + 802 + 2 + 0 + + + 398 + 659 + 800 + 0 + 0 + + + 377 + 658 + 806 + 4 + 0 + + + 962 + 658 + 801 + 3 + 0 + + + 97 + 657 + 803 + 0 + 0 + + + 164 + 657 + 802 + 4 + 0 + + + 164 + 657 + 801 + 4 + 0 + + + 164 + 657 + 800 + 7 + 0 + + + 164 + 656 + 801 + 0 + 0 + + + 164 + 656 + 800 + 0 + 0 + + + 951 + 663 + 812 + 4 + 0 + + + 951 + 663 + 811 + 0 + 0 + + + 951 + 662 + 812 + 4 + 0 + + + 951 + 662 + 811 + 0 + 0 + + + 951 + 661 + 812 + 4 + 0 + + + 951 + 661 + 811 + 0 + 0 + + + 951 + 660 + 812 + 4 + 0 + + + 951 + 660 + 811 + 0 + 0 + + + 951 + 659 + 812 + 4 + 0 + + + 951 + 659 + 811 + 0 + 0 + + + 951 + 658 + 812 + 4 + 0 + + + 951 + 658 + 811 + 0 + 0 + + + 951 + 657 + 812 + 4 + 0 + + + 951 + 657 + 811 + 0 + 0 + + + 951 + 656 + 812 + 4 + 0 + + + 951 + 656 + 811 + 0 + 0 + + + 38 + 662 + 831 + 0 + 0 + + + 962 + 660 + 825 + 0 + 0 + + + 34 + 657 + 825 + 0 + 0 + + + 951 + 666 + 790 + 2 + 0 + + + 951 + 666 + 789 + 2 + 0 + + + 951 + 666 + 788 + 2 + 0 + + + 951 + 666 + 787 + 2 + 0 + + + 88 + 665 + 784 + 1 + 0 + + + 955 + 664 + 788 + 2 + 0 + + + 34 + 664 + 786 + 2 + 0 + + + 396 + 667 + 793 + 0 + 0 + + + 407 + 666 + 796 + 4 + 0 + + + 394 + 666 + 792 + 0 + 0 + + + 205 + 665 + 798 + 0 + 0 + + + 205 + 664 + 792 + 2 + 0 + + + 951 + 669 + 807 + 6 + 0 + + + 951 + 669 + 806 + 6 + 0 + + + 951 + 669 + 805 + 6 + 0 + + + 951 + 669 + 804 + 6 + 0 + + + 951 + 669 + 803 + 6 + 0 + + + 951 + 668 + 807 + 2 + 0 + + + 951 + 668 + 806 + 2 + 0 + + + 951 + 668 + 805 + 2 + 0 + + + 951 + 668 + 804 + 2 + 0 + + + 951 + 668 + 803 + 2 + 0 + + + 394 + 666 + 803 + 6 + 0 + + + 398 + 666 + 801 + 0 + 0 + + + 999 + 664 + 803 + 0 + 0 + + + 401 + 669 + 814 + 6 + 0 + + + 951 + 669 + 808 + 6 + 0 + + + 962 + 668 + 812 + 5 + 0 + + + 951 + 668 + 808 + 2 + 0 + + + 394 + 666 + 809 + 0 + 0 + + + 401 + 665 + 814 + 6 + 0 + + + 951 + 664 + 812 + 4 + 0 + + + 951 + 664 + 811 + 0 + 0 + + + 195 + 665 + 812 + 1 + 1 + + + 195 + 665 + 811 + 1 + 1 + + + 1 + 670 + 822 + 3 + 0 + + + 962 + 666 + 822 + 1 + 0 + + + 985 + 616 + 1436 + 0 + 0 + + + 3 + 655 + 1434 + 4 + 0 + + + 6 + 654 + 1435 + 0 + 0 + + + 3 + 653 + 1438 + 2 + 0 + + + 3 + 653 + 1433 + 4 + 0 + + + 7 + 652 + 1438 + 6 + 0 + + + 3 + 652 + 1436 + 4 + 0 + + + 3 + 652 + 1435 + 4 + 0 + + + 7 + 652 + 1433 + 6 + 0 + + + 7 + 651 + 1436 + 6 + 0 + + + 470 + 650 + 1435 + 0 + 0 + + + 47 + 657 + 1435 + 4 + 0 + + + 15 + 656 + 1391 + 2 + 0 + + + 6 + 656 + 1394 + 0 + 0 + + + 6 + 548 + 1524 + 0 + 0 + + + 14 + 544 + 1520 + 4 + 0 + + + 25 + 565 + 1525 + 6 + 0 + + + 25 + 563 + 1525 + 6 + 0 + + + 14 + 560 + 1526 + 6 + 0 + + + 145 + 567 + 1535 + 2 + 0 + + + 145 + 567 + 1533 + 2 + 0 + + + 257 + 567 + 1532 + 0 + 0 + + + 45 + 565 + 1534 + 0 + 0 + + + 45 + 565 + 1533 + 6 + 0 + + + 45 + 565 + 1532 + 6 + 0 + + + 45 + 565 + 1531 + 6 + 0 + + + 45 + 565 + 1530 + 6 + 0 + + + 25 + 565 + 1529 + 6 + 0 + + + 44 + 563 + 1531 + 0 + 0 + + + 25 + 563 + 1529 + 6 + 0 + + + 45 + 562 + 1534 + 0 + 0 + + + 45 + 562 + 1533 + 2 + 0 + + + 45 + 562 + 1532 + 2 + 0 + + + 45 + 562 + 1531 + 2 + 0 + + + 45 + 562 + 1530 + 2 + 0 + + + 27 + 561 + 1530 + 0 + 0 + + + 332 + 560 + 1531 + 5 + 0 + + + 24 + 560 + 1530 + 0 + 0 + + + 215 + 567 + 1536 + 0 + 0 + + + 299 + 565 + 1536 + 0 + 0 + + + 217 + 564 + 1536 + 0 + 0 + + + 121 + 563 + 1536 + 6 + 0 + + + 299 + 560 + 1536 + 0 + 0 + + + 1 + 566 + 1530 + 0 + 1 + + + 80 + 550 + 3423 + 4 + 0 + + + 111 + 549 + 3431 + 0 + 0 + + + 103 + 549 + 3430 + 0 + 0 + + + 103 + 549 + 3429 + 0 + 0 + + + 80 + 544 + 3430 + 6 + 0 + + + 80 + 544 + 3428 + 6 + 0 + + + 103 + 550 + 3434 + 0 + 0 + + + 51 + 550 + 3433 + 6 + 0 + + + 111 + 550 + 3432 + 0 + 0 + + + 111 + 548 + 3436 + 0 + 0 + + + 51 + 547 + 3436 + 4 + 0 + + + 111 + 545 + 3435 + 0 + 0 + + + 111 + 545 + 3434 + 0 + 0 + + + 51 + 544 + 3432 + 2 + 0 + + + 80 + 583 + 3408 + 4 + 0 + + + 51 + 580 + 3410 + 0 + 0 + + + 290 + 578 + 3412 + 5 + 0 + + + 80 + 577 + 3414 + 6 + 0 + + + 290 + 577 + 3411 + 0 + 0 + + + 80 + 577 + 3409 + 4 + 0 + + + 46 + 559 + 581 + 0 + 0 + + + 283 + 558 + 582 + 4 + 0 + + + 306 + 558 + 578 + 0 + 0 + + + 283 + 555 + 582 + 4 + 0 + + + 58 + 554 + 578 + 4 + 0 + + + 15 + 554 + 568 + 4 + 0 + + + 1 + 553 + 573 + 0 + 1 + + + 72 + 559 + 567 + 3 + 0 + + + 72 + 559 + 565 + 3 + 0 + + + 72 + 559 + 563 + 3 + 0 + + + 72 + 559 + 561 + 3 + 0 + + + 72 + 558 + 567 + 3 + 0 + + + 72 + 558 + 565 + 3 + 0 + + + 72 + 558 + 563 + 3 + 0 + + + 72 + 558 + 561 + 3 + 0 + + + 72 + 557 + 567 + 3 + 0 + + + 72 + 557 + 565 + 3 + 0 + + + 72 + 557 + 563 + 3 + 0 + + + 72 + 557 + 561 + 3 + 0 + + + 72 + 556 + 567 + 3 + 0 + + + 72 + 556 + 565 + 3 + 0 + + + 72 + 556 + 563 + 3 + 0 + + + 72 + 556 + 561 + 3 + 0 + + + 72 + 555 + 565 + 3 + 0 + + + 72 + 555 + 563 + 3 + 0 + + + 72 + 555 + 561 + 3 + 0 + + + 72 + 554 + 567 + 3 + 0 + + + 72 + 554 + 565 + 3 + 0 + + + 72 + 554 + 563 + 3 + 0 + + + 72 + 554 + 561 + 3 + 0 + + + 72 + 553 + 567 + 3 + 0 + + + 72 + 553 + 565 + 3 + 0 + + + 72 + 553 + 563 + 3 + 0 + + + 72 + 553 + 561 + 3 + 0 + + + 72 + 552 + 567 + 3 + 0 + + + 72 + 552 + 565 + 3 + 0 + + + 72 + 552 + 563 + 3 + 0 + + + 72 + 552 + 561 + 3 + 0 + + + 1 + 541 + 565 + 0 + 0 + + + 20 + 541 + 573 + 0 + 0 + + + 20 + 541 + 571 + 0 + 0 + + + 20 + 540 + 575 + 0 + 0 + + + 273 + 542 + 577 + 6 + 0 + + + 34 + 546 + 566 + 0 + 0 + + + 1 + 545 + 562 + 0 + 0 + + + 3 + 551 + 572 + 4 + 0 + + + 7 + 551 + 571 + 4 + 0 + + + 15 + 551 + 568 + 4 + 0 + + + 20 + 544 + 568 + 0 + 0 + + + 324 + 551 + 583 + 0 + 0 + + + 5 + 548 + 580 + 6 + 0 + + + 273 + 548 + 577 + 6 + 0 + + + 45 + 546 + 577 + 2 + 0 + + + 45 + 544 + 577 + 6 + 0 + + + 1 + 545 + 581 + 0 + 1 + + + 729 + 615 + 3318 + 0 + 0 + + + 729 + 615 + 3314 + 6 + 0 + + + 986 + 615 + 3313 + 0 + 0 + + + 986 + 614 + 3316 + 0 + 0 + + + 22 + 614 + 3314 + 0 + 0 + + + 986 + 614 + 3313 + 0 + 0 + + + 986 + 613 + 3315 + 0 + 0 + + + 22 + 613 + 3314 + 0 + 0 + + + 730 + 612 + 3318 + 0 + 0 + + + 730 + 610 + 3317 + 0 + 0 + + + 730 + 610 + 3320 + 0 + 0 + + + 986 + 609 + 3327 + 0 + 0 + + + 986 + 608 + 3321 + 0 + 0 + + + 22 + 622 + 3315 + 0 + 0 + + + 22 + 622 + 3314 + 0 + 0 + + + 986 + 621 + 3316 + 0 + 0 + + + 729 + 621 + 3315 + 0 + 0 + + + 986 + 621 + 3313 + 0 + 0 + + + 986 + 620 + 3319 + 0 + 0 + + + 986 + 620 + 3317 + 0 + 0 + + + 987 + 620 + 3313 + 0 + 0 + + + 986 + 619 + 3313 + 0 + 0 + + + 940 + 618 + 3314 + 0 + 0 + + + 986 + 617 + 3313 + 0 + 0 + + + 986 + 616 + 3313 + 0 + 0 + + + 986 + 620 + 3320 + 0 + 0 + + + 986 + 619 + 3321 + 0 + 0 + + + 51 + 631 + 3293 + 0 + 0 + + + 23 + 629 + 3295 + 6 + 0 + + + 64 + 631 + 3299 + 6 + 0 + + + 51 + 630 + 3302 + 4 + 0 + + + 51 + 630 + 3299 + 0 + 0 + + + 24 + 629 + 3300 + 2 + 0 + + + 5 + 631 + 3306 + 4 + 0 + + + 51 + 630 + 3305 + 0 + 0 + + + 507 + 634 + 3295 + 4 + 0 + + + 51 + 632 + 3293 + 0 + 0 + + + 21 + 639 + 3303 + 4 + 0 + + + 51 + 639 + 3301 + 0 + 0 + + + 24 + 634 + 3300 + 6 + 0 + + + 3 + 633 + 3301 + 4 + 0 + + + 51 + 633 + 3299 + 0 + 0 + + + 51 + 632 + 3302 + 4 + 0 + + + 3 + 632 + 3301 + 4 + 0 + + + 7 + 632 + 3300 + 4 + 0 + + + 51 + 639 + 3308 + 4 + 0 + + + 21 + 639 + 3306 + 4 + 0 + + + 63 + 635 + 3304 + 4 + 0 + + + 51 + 632 + 3305 + 0 + 0 + + + 37 + 647 + 3302 + 0 + 0 + + + 34 + 646 + 3302 + 2 + 0 + + + 0 + 645 + 3303 + 0 + 0 + + + 34 + 644 + 3303 + 2 + 0 + + + 37 + 643 + 3303 + 0 + 0 + + + 23 + 642 + 3302 + 2 + 0 + + + 51 + 641 + 3301 + 0 + 0 + + + 37 + 646 + 3306 + 0 + 0 + + + 467 + 646 + 3305 + 0 + 0 + + + 37 + 646 + 3304 + 0 + 0 + + + 0 + 644 + 3306 + 0 + 0 + + + 23 + 642 + 3306 + 2 + 0 + + + 63 + 642 + 3304 + 4 + 0 + + + 51 + 641 + 3308 + 4 + 0 + + + 22 + 634 + 3303 + 0 + 1 + + + 37 + 647 + 3302 + 0 + 0 + + + 34 + 646 + 3302 + 2 + 0 + + + 0 + 645 + 3303 + 0 + 0 + + + 34 + 644 + 3303 + 2 + 0 + + + 37 + 643 + 3303 + 0 + 0 + + + 23 + 642 + 3302 + 2 + 0 + + + 51 + 641 + 3301 + 0 + 0 + + + 37 + 646 + 3306 + 0 + 0 + + + 467 + 646 + 3305 + 0 + 0 + + + 37 + 646 + 3304 + 0 + 0 + + + 0 + 644 + 3306 + 0 + 0 + + + 23 + 642 + 3306 + 2 + 0 + + + 63 + 642 + 3304 + 4 + 0 + + + 51 + 641 + 3308 + 4 + 0 + + + 51 + 655 + 3294 + 4 + 0 + + + 51 + 655 + 3292 + 6 + 0 + + + 22 + 655 + 3291 + 0 + 0 + + + 51 + 655 + 3290 + 0 + 0 + + + 7 + 654 + 3292 + 2 + 0 + + + 22 + 654 + 3291 + 0 + 0 + + + 63 + 653 + 3295 + 6 + 0 + + + 3 + 653 + 3292 + 0 + 0 + + + 51 + 653 + 3290 + 0 + 0 + + + 55 + 652 + 3293 + 1 + 0 + + + 7 + 652 + 3292 + 6 + 0 + + + 51 + 651 + 3294 + 4 + 0 + + + 51 + 651 + 3290 + 0 + 0 + + + 492 + 650 + 3290 + 0 + 0 + + + 51 + 649 + 3294 + 4 + 0 + + + 47 + 649 + 3291 + 0 + 0 + + + 51 + 649 + 3290 + 0 + 0 + + + 51 + 655 + 3297 + 0 + 0 + + + 51 + 653 + 3297 + 2 + 0 + + + 37 + 648 + 3303 + 0 + 0 + + + 51 + 663 + 3294 + 4 + 0 + + + 51 + 663 + 3292 + 2 + 0 + + + 22 + 663 + 3291 + 0 + 0 + + + 51 + 663 + 3290 + 0 + 0 + + + 20 + 661 + 3295 + 0 + 0 + + + 51 + 661 + 3288 + 4 + 0 + + + 51 + 660 + 3293 + 6 + 0 + + + 51 + 660 + 3291 + 6 + 0 + + + 63 + 659 + 3295 + 6 + 0 + + + 51 + 659 + 3292 + 2 + 0 + + + 51 + 659 + 3290 + 2 + 0 + + + 64 + 659 + 3289 + 6 + 0 + + + 20 + 658 + 3295 + 6 + 0 + + + 51 + 658 + 3288 + 4 + 0 + + + 51 + 662 + 3298 + 6 + 0 + + + 51 + 662 + 3296 + 6 + 0 + + + 51 + 661 + 3299 + 4 + 0 + + + 471 + 659 + 3303 + 6 + 0 + + + 51 + 658 + 3299 + 4 + 0 + + + 51 + 657 + 3298 + 2 + 0 + + + 51 + 657 + 3296 + 2 + 0 + + + 469 + 659 + 3304 + 4 + 0 + + + 51 + 670 + 3292 + 6 + 0 + + + 51 + 669 + 3294 + 4 + 0 + + + 55 + 669 + 3291 + 6 + 0 + + + 51 + 669 + 3290 + 0 + 0 + + + 20 + 668 + 3292 + 6 + 0 + + + 63 + 667 + 3295 + 6 + 0 + + + 51 + 667 + 3290 + 0 + 0 + + + 51 + 665 + 3290 + 0 + 0 + + + 71 + 664 + 3294 + 2 + 0 + + + 22 + 664 + 3292 + 0 + 0 + + + 22 + 664 + 3291 + 0 + 0 + + + 51 + 664 + 3297 + 0 + 0 + + + 1 + 663 + 3297 + 1 + 1 + + + 1 + 657 + 3297 + 1 + 1 + + + 2 + 670 + 3290 + 0 + 1 + + + 51 + 663 + 3287 + 6 + 0 + + + 51 + 663 + 3285 + 6 + 0 + + + 51 + 663 + 3283 + 6 + 0 + + + 7 + 662 + 3284 + 2 + 0 + + + 51 + 662 + 3282 + 0 + 0 + + + 20 + 661 + 3287 + 6 + 0 + + + 274 + 659 + 3282 + 4 + 0 + + + 20 + 658 + 3287 + 6 + 0 + + + 9 + 658 + 3284 + 4 + 0 + + + 7 + 657 + 3284 + 6 + 0 + + + 51 + 657 + 3282 + 0 + 0 + + + 51 + 656 + 3287 + 2 + 0 + + + 51 + 656 + 3285 + 2 + 0 + + + 51 + 656 + 3283 + 2 + 0 + + + 51 + 669 + 3286 + 4 + 0 + + + 51 + 668 + 3283 + 6 + 0 + + + 51 + 667 + 3286 + 4 + 0 + + + 51 + 667 + 3284 + 2 + 0 + + + 51 + 667 + 3281 + 2 + 0 + + + 2 + 668 + 3281 + 0 + 1 + + + 497 + 659 + 3303 + 6 + 0 + + + 471 + 659 + 3303 + 6 + 0 + + + 610 + 683 + 3280 + 6 + 0 + + + 610 + 687 + 3303 + 0 + 0 + + + 610 + 683 + 3298 + 3 + 0 + + + 486 + 649 + 3275 + 6 + 0 + + + 51 + 648 + 3274 + 4 + 0 + + + 478 + 648 + 3272 + 2 + 0 + + + 51 + 662 + 3278 + 4 + 0 + + + 475 + 662 + 3273 + 0 + 0 + + + 476 + 668 + 3273 + 4 + 0 + + + 63 + 667 + 3279 + 6 + 0 + + + 51 + 666 + 3278 + 4 + 0 + + + 478 + 666 + 3276 + 2 + 0 + + + 484 + 665 + 3273 + 0 + 0 + + + 51 + 664 + 3278 + 4 + 0 + + + 477 + 664 + 3276 + 2 + 0 + + + 107 + 679 + 3277 + 7 + 0 + + + 102 + 679 + 3275 + 0 + 0 + + + 102 + 678 + 3272 + 0 + 0 + + + 102 + 677 + 3275 + 0 + 0 + + + 107 + 676 + 3272 + 6 + 0 + + + 110 + 686 + 3272 + 0 + 0 + + + 110 + 685 + 3278 + 0 + 0 + + + 110 + 685 + 3275 + 0 + 0 + + + 111 + 683 + 3275 + 2 + 0 + + + 114 + 683 + 3273 + 0 + 0 + + + 102 + 681 + 3278 + 0 + 0 + + + 102 + 681 + 3276 + 0 + 0 + + + 102 + 680 + 3273 + 0 + 0 + + + 476 + 650 + 3269 + 4 + 0 + + + 51 + 650 + 3265 + 0 + 0 + + + 474 + 648 + 3267 + 6 + 0 + + + 51 + 662 + 3269 + 0 + 0 + + + 51 + 668 + 3269 + 0 + 0 + + + 474 + 666 + 3271 + 6 + 0 + + + 483 + 665 + 3270 + 4 + 0 + + + 473 + 664 + 3271 + 6 + 0 + + + 114 + 678 + 3268 + 0 + 0 + + + 102 + 677 + 3270 + 0 + 0 + + + 110 + 686 + 3268 + 0 + 0 + + + 110 + 684 + 3270 + 0 + 0 + + + 195 + 682 + 3270 + 0 + 0 + + + 195 + 682 + 3267 + 0 + 0 + + + 195 + 682 + 3265 + 0 + 0 + + + 114 + 680 + 3269 + 0 + 0 + + + 195 + 680 + 3267 + 0 + 0 + + + 34 + 52 + 711 + 2 + 0 + + + 34 + 49 + 710 + 2 + 0 + + + 34 + 55 + 718 + 2 + 0 + + + 34 + 54 + 713 + 2 + 0 + + + 8 + 53 + 714 + 2 + 0 + + + 11 + 52 + 718 + 2 + 0 + + + 8 + 52 + 714 + 0 + 0 + + + 34 + 50 + 712 + 2 + 0 + + + 34 + 49 + 713 + 2 + 0 + + + 35 + 51 + 735 + 0 + 0 + + + 34 + 57 + 717 + 2 + 0 + + + 34 + 56 + 719 + 2 + 0 + + + 34 + 56 + 716 + 2 + 0 + + + 34 + 56 + 714 + 2 + 0 + + + 55 + 60 + 725 + 5 + 0 + + + 916 + 62 + 733 + 6 + 0 + + + 21 + 60 + 732 + 2 + 0 + + + 21 + 60 + 728 + 2 + 0 + + + 55 + 59 + 730 + 5 + 0 + + + 55 + 59 + 728 + 7 + 0 + + + 942 + 58 + 731 + 7 + 0 + + + 35 + 62 + 738 + 0 + 0 + + + 33 + 66 + 704 + 0 + 0 + + + 35 + 67 + 714 + 0 + 0 + + + 55 + 64 + 725 + 2 + 0 + + + 21 + 64 + 732 + 0 + 0 + + + 21 + 64 + 728 + 0 + 0 + + + 944 + 66 + 741 + 0 + 0 + + + 35 + 78 + 711 + 0 + 0 + + + 33 + 75 + 708 + 0 + 0 + + + 33 + 76 + 718 + 0 + 0 + + + 35 + 78 + 734 + 0 + 0 + + + 35 + 74 + 740 + 0 + 0 + + + 1 + 51 + 715 + 0 + 1 + + + 176 + 66 + 729 + 1 + 1 + + + 35 + 61 + 749 + 0 + 0 + + + 35 + 70 + 758 + 0 + 0 + + + 35 + 79 + 752 + 3 + 0 + + + 35 + 55 + 761 + 0 + 0 + + + 35 + 75 + 766 + 3 + 0 + + + 35 + 51 + 783 + 0 + 0 + + + 35 + 78 + 782 + 0 + 0 + + + 35 + 62 + 786 + 0 + 0 + + + 35 + 74 + 788 + 0 + 0 + + + 35 + 61 + 797 + 0 + 0 + + + 35 + 70 + 806 + 0 + 0 + + + 35 + 55 + 809 + 0 + 0 + + + 5 + 86 + 799 + 0 + 0 + + + 3 + 85 + 801 + 6 + 0 + + + 1025 + 84 + 807 + 6 + 0 + + + 3 + 84 + 801 + 4 + 0 + + + 7 + 84 + 800 + 5 + 0 + + + 105 + 81 + 807 + 0 + 0 + + + 105 + 81 + 806 + 0 + 0 + + + 958 + 81 + 801 + 7 + 0 + + + 103 + 86 + 812 + 0 + 0 + + + 103 + 86 + 811 + 0 + 0 + + + 111 + 84 + 812 + 4 + 0 + + + 111 + 83 + 812 + 4 + 0 + + + 101 + 83 + 810 + 4 + 0 + + + 101 + 82 + 809 + 4 + 0 + + + 1 + 85 + 804 + 0 + 1 + + + 35 + 81 + 788 + 0 + 0 + + + 35 + 89 + 789 + 0 + 0 + + + 932 + 92 + 807 + 0 + 0 + + + 954 + 92 + 800 + 0 + 0 + + + 953 + 91 + 801 + 4 + 0 + + + 967 + 90 + 811 + 0 + 0 + + + 967 + 90 + 810 + 0 + 0 + + + 966 + 89 + 810 + 0 + 0 + + + 178 + 90 + 802 + 1 + 1 + + + 177 + 88 + 801 + 1 + 1 + + + 35 + 84 + 779 + 0 + 0 + + + 35 + 91 + 778 + 0 + 0 + + + 35 + 99 + 779 + 5 + 0 + + + 35 + 103 + 791 + 4 + 0 + + + 35 + 101 + 802 + 2 + 0 + + + 35 + 98 + 812 + 1 + 0 + + + 35 + 103 + 770 + 5 + 0 + + + 35 + 87 + 766 + 3 + 0 + + + 35 + 81 + 761 + 3 + 0 + + + 945 + 90 + 763 + 3 + 0 + + + 35 + 99 + 761 + 2 + 0 + + + 35 + 70 + 758 + 0 + 0 + + + 35 + 79 + 752 + 3 + 0 + + + 35 + 93 + 753 + 3 + 0 + + + 35 + 92 + 758 + 4 + 0 + + + 35 + 88 + 749 + 3 + 0 + + + 35 + 101 + 750 + 0 + 0 + + + 944 + 66 + 741 + 0 + 0 + + + 35 + 74 + 740 + 0 + 0 + + + 35 + 81 + 740 + 0 + 0 + + + 35 + 89 + 741 + 0 + 0 + + + 35 + 99 + 740 + 0 + 0 + + + 21 + 64 + 732 + 0 + 0 + + + 21 + 64 + 728 + 0 + 0 + + + 35 + 78 + 734 + 0 + 0 + + + 35 + 84 + 731 + 0 + 0 + + + 35 + 91 + 730 + 0 + 0 + + + 176 + 66 + 729 + 1 + 1 + + + 55 + 64 + 725 + 2 + 0 + + + 35 + 96 + 726 + 7 + 0 + + + 35 + 109 + 725 + 0 + 0 + + + 35 + 106 + 734 + 0 + 0 + + + 35 + 106 + 746 + 0 + 0 + + + 35 + 117 + 736 + 0 + 0 + + + 35 + 118 + 748 + 6 + 0 + + + 35 + 112 + 756 + 0 + 0 + + + 35 + 120 + 728 + 0 + 0 + + + 35 + 126 + 755 + 0 + 0 + + + 35 + 106 + 765 + 1 + 0 + + + 35 + 118 + 766 + 5 + 0 + + + 35 + 117 + 770 + 6 + 0 + + + 35 + 125 + 771 + 5 + 0 + + + 35 + 110 + 777 + 6 + 0 + + + 35 + 89 + 789 + 0 + 0 + + + 35 + 112 + 787 + 7 + 0 + + + 35 + 116 + 797 + 0 + 0 + + + 932 + 92 + 807 + 0 + 0 + + + 954 + 92 + 800 + 0 + 0 + + + 953 + 91 + 801 + 4 + 0 + + + 35 + 101 + 802 + 2 + 0 + + + 178 + 90 + 802 + 1 + 1 + + + 177 + 88 + 801 + 1 + 1 + + + 967 + 90 + 811 + 0 + 0 + + + 967 + 90 + 810 + 0 + 0 + + + 966 + 89 + 810 + 0 + 0 + + + 35 + 98 + 812 + 1 + 0 + + + 35 + 108 + 811 + 3 + 0 + + + 35 + 119 + 810 + 1 + 0 + + + 35 + 129 + 798 + 3 + 0 + + + 35 + 130 + 810 + 2 + 0 + + + 35 + 138 + 792 + 1 + 0 + + + 35 + 139 + 802 + 2 + 0 + + + 35 + 142 + 814 + 3 + 0 + + + 35 + 128 + 784 + 4 + 0 + + + 35 + 137 + 781 + 7 + 0 + + + 35 + 134 + 772 + 6 + 0 + + + 35 + 141 + 775 + 0 + 0 + + + 35 + 133 + 765 + 5 + 0 + + + 35 + 137 + 754 + 0 + 0 + + + 35 + 106 + 746 + 0 + 0 + + + 35 + 118 + 748 + 6 + 0 + + + 35 + 128 + 744 + 0 + 0 + + + 35 + 144 + 774 + 7 + 0 + + + 35 + 117 + 736 + 0 + 0 + + + 35 + 135 + 743 + 3 + 0 + + + 35 + 120 + 728 + 0 + 0 + + + 35 + 128 + 731 + 0 + 0 + + + 35 + 138 + 734 + 0 + 0 + + + 35 + 157 + 773 + 0 + 0 + + + 35 + 154 + 782 + 0 + 0 + + + 35 + 147 + 788 + 0 + 0 + + + 35 + 165 + 784 + 0 + 0 + + + 35 + 149 + 798 + 0 + 0 + + + 35 + 154 + 794 + 0 + 0 + + + 395 + 166 + 798 + 2 + 0 + + + 35 + 166 + 796 + 6 + 0 + + + 35 + 139 + 802 + 2 + 0 + + + 35 + 160 + 804 + 0 + 0 + + + 35 + 130 + 810 + 2 + 0 + + + 35 + 142 + 814 + 3 + 0 + + + 35 + 147 + 809 + 2 + 0 + + + 35 + 154 + 813 + 1 + 0 + + + 35 + 166 + 814 + 5 + 0 + + + 21 + 172 + 791 + 6 + 0 + + + 21 + 169 + 791 + 0 + 0 + + + 32 + 174 + 798 + 4 + 0 + + + 21 + 172 + 793 + 4 + 0 + + + 33 + 170 + 796 + 2 + 0 + + + 1006 + 170 + 792 + 4 + 0 + + + 21 + 169 + 793 + 2 + 0 + + + 21 + 175 + 807 + 4 + 0 + + + 21 + 175 + 806 + 4 + 0 + + + 21 + 173 + 804 + 0 + 0 + + + 21 + 172 + 804 + 0 + 0 + + + 405 + 172 + 800 + 2 + 0 + + + 21 + 170 + 807 + 0 + 0 + + + 21 + 170 + 806 + 0 + 0 + + + 395 + 169 + 801 + 4 + 0 + + + 21 + 173 + 809 + 2 + 0 + + + 21 + 172 + 809 + 2 + 0 + + + 198 + 171 + 794 + 0 + 1 + + + 196 + 170 + 805 + 2 + 1 + + + 35 + 183 + 791 + 3 + 0 + + + 35 + 176 + 792 + 0 + 0 + + + 35 + 181 + 813 + 5 + 0 + + + 35 + 185 + 802 + 0 + 0 + + + 35 + 168 + 776 + 0 + 0 + + + 35 + 176 + 779 + 0 + 0 + + + 35 + 186 + 782 + 0 + 0 + + + 57 + 64 + 116 + 0 + 0 + + + 6 + 304 + 2453 + 0 + 0 + + + 175 + 318 + 2454 + 6 + 0 + + + 6 + 319 + 2457 + 0 + 0 + + + 14 + 316 + 2456 + 0 + 0 + + + 51 + 413 + 3373 + 0 + 0 + + + 205 + 415 + 3382 + 6 + 0 + + + 205 + 411 + 3378 + 6 + 0 + + + 205 + 409 + 3380 + 6 + 0 + + + 51 + 409 + 3377 + 2 + 0 + + + 51 + 415 + 3390 + 6 + 0 + + + 205 + 414 + 3388 + 6 + 0 + + + 51 + 411 + 3388 + 0 + 0 + + + 51 + 415 + 3394 + 6 + 0 + + + 205 + 414 + 3397 + 6 + 0 + + + 218 + 411 + 3399 + 2 + 0 + + + 219 + 411 + 3398 + 2 + 0 + + + 51 + 411 + 3395 + 4 + 0 + + + 205 + 410 + 3393 + 6 + 0 + + + 51 + 409 + 3399 + 0 + 0 + + + 51 + 423 + 3381 + 2 + 0 + + + 205 + 423 + 3378 + 4 + 0 + + + 51 + 420 + 3379 + 4 + 0 + + + 51 + 426 + 3375 + 0 + 0 + + + 51 + 424 + 3375 + 0 + 0 + + + 51 + 430 + 3380 + 6 + 0 + + + 205 + 425 + 3381 + 4 + 0 + + + 51 + 426 + 3384 + 4 + 0 + + + 29 + 438 + 3375 + 0 + 0 + + + 1187 + 446 + 3367 + 4 + 0 + + + 1012 + 444 + 3366 + 4 + 0 + + + 730 + 442 + 3367 + 5 + 0 + + + 1155 + 446 + 3374 + 7 + 0 + + + 730 + 446 + 3373 + 2 + 0 + + + 730 + 444 + 3375 + 6 + 0 + + + 3 + 442 + 3372 + 0 + 0 + + + 29 + 441 + 3375 + 0 + 0 + + + 278 + 441 + 3372 + 0 + 0 + + + 3 + 441 + 3369 + 0 + 0 + + + 3 + 440 + 3371 + 0 + 0 + + + 278 + 440 + 3369 + 0 + 0 + + + 65 + 406 + 3392 + 1 + 1 + + + 51 + 415 + 3402 + 6 + 0 + + + 205 + 414 + 3404 + 6 + 0 + + + 205 + 414 + 3400 + 6 + 0 + + + 51 + 412 + 3405 + 4 + 0 + + + 245 + 412 + 3402 + 0 + 0 + + + 219 + 411 + 3403 + 0 + 0 + + + 218 + 411 + 3402 + 2 + 0 + + + 220 + 411 + 3401 + 2 + 0 + + + 218 + 411 + 3400 + 2 + 0 + + + 205 + 410 + 3405 + 6 + 0 + + + 219 + 410 + 3404 + 0 + 0 + + + 219 + 410 + 3403 + 4 + 0 + + + 218 + 410 + 3401 + 0 + 0 + + + 205 + 409 + 3404 + 6 + 0 + + + 51 + 408 + 3402 + 2 + 0 + + + 205 + 408 + 3400 + 6 + 0 + + + 15 + 253 + 1568 + 4 + 0 + + + 3 + 252 + 1568 + 2 + 0 + + + 6 + 249 + 1572 + 2 + 0 + + + 15 + 249 + 1568 + 4 + 0 + + + 3 + 257 + 1571 + 2 + 0 + + + 3 + 257 + 1568 + 2 + 0 + + + 15 + 256 + 1572 + 2 + 0 + + + 1 + 254 + 1572 + 1 + 1 + + + 1 + 253 + 1571 + 0 + 1 + + + 1 + 251 + 1571 + 0 + 1 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 703 + 2333 + 2 + 0 + + + 579 + 703 + 2331 + 2 + 0 + + + 579 + 703 + 2343 + 2 + 0 + + + 571 + 703 + 2337 + 4 + 0 + + + 579 + 699 + 2338 + 0 + 0 + + + 579 + 698 + 2338 + 0 + 0 + + + 579 + 696 + 2338 + 0 + 0 + + + 581 + 703 + 2349 + 4 + 0 + + + 579 + 703 + 2346 + 2 + 0 + + + 581 + 704 + 2328 + 0 + 0 + + + 579 + 711 + 2338 + 0 + 0 + + + 579 + 709 + 2338 + 0 + 0 + + + 159 + 703 + 2340 + 0 + 1 + + + 157 + 703 + 2337 + 0 + 1 + + + 160 + 702 + 2338 + 1 + 1 + + + 158 + 705 + 2338 + 1 + 1 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 703 + 2333 + 2 + 0 + + + 579 + 703 + 2331 + 2 + 0 + + + 579 + 703 + 2343 + 2 + 0 + + + 571 + 703 + 2337 + 4 + 0 + + + 579 + 699 + 2338 + 0 + 0 + + + 579 + 698 + 2338 + 0 + 0 + + + 579 + 696 + 2338 + 0 + 0 + + + 581 + 703 + 2349 + 4 + 0 + + + 579 + 703 + 2346 + 2 + 0 + + + 581 + 704 + 2328 + 0 + 0 + + + 579 + 711 + 2338 + 0 + 0 + + + 579 + 709 + 2338 + 0 + 0 + + + 159 + 703 + 2340 + 0 + 1 + + + 157 + 703 + 2337 + 0 + 1 + + + 160 + 702 + 2338 + 1 + 1 + + + 158 + 705 + 2338 + 1 + 1 + + + 3 + 716 + 2337 + 0 + 0 + + + 581 + 715 + 2339 + 6 + 0 + + + 6 + 715 + 2337 + 6 + 0 + + + 579 + 712 + 2338 + 0 + 0 + + + 585 + 416 + 2051 + 4 + 0 + + + 569 + 416 + 2050 + 4 + 0 + + + 160 + 415 + 2051 + 1 + 1 + + + 158 + 418 + 2051 + 1 + 1 + + + 159 + 416 + 2053 + 0 + 1 + + + 157 + 416 + 2050 + 0 + 1 + + + 618 + 413 + 2999 + 6 + 0 + + + 617 + 420 + 2991 + 4 + 0 + + + 617 + 420 + 2992 + 4 + 0 + + + 584 + 418 + 2994 + 0 + 0 + + + 586 + 417 + 2993 + 0 + 0 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 703 + 2333 + 2 + 0 + + + 579 + 703 + 2331 + 2 + 0 + + + 579 + 703 + 2343 + 2 + 0 + + + 571 + 703 + 2337 + 4 + 0 + + + 579 + 699 + 2338 + 0 + 0 + + + 579 + 698 + 2338 + 0 + 0 + + + 579 + 696 + 2338 + 0 + 0 + + + 581 + 703 + 2349 + 4 + 0 + + + 579 + 703 + 2346 + 2 + 0 + + + 581 + 704 + 2328 + 0 + 0 + + + 579 + 711 + 2338 + 0 + 0 + + + 579 + 709 + 2338 + 0 + 0 + + + 3 + 716 + 2337 + 0 + 0 + + + 581 + 715 + 2339 + 6 + 0 + + + 6 + 715 + 2337 + 6 + 0 + + + 579 + 712 + 2338 + 0 + 0 + + + 159 + 703 + 2340 + 0 + 1 + + + 157 + 703 + 2337 + 0 + 1 + + + 160 + 702 + 2338 + 1 + 1 + + + 158 + 705 + 2338 + 1 + 1 + + + 6 + 60 + 1383 + 0 + 0 + + + 5 + 60 + 1384 + 0 + 0 + + + 45 + 79 + 1391 + 4 + 0 + + + 45 + 78 + 1391 + 4 + 0 + + + 15 + 78 + 1386 + 4 + 0 + + + 42 + 78 + 1392 + 0 + 0 + + + 15 + 84 + 1391 + 2 + 0 + + + 3 + 82 + 1388 + 4 + 0 + + + 15 + 82 + 1386 + 6 + 0 + + + 3 + 80 + 1386 + 0 + 0 + + + 3 + 85 + 1393 + 0 + 0 + + + 15 + 84 + 1395 + 4 + 0 + + + 3 + 83 + 1395 + 4 + 0 + + + 45 + 80 + 1394 + 2 + 0 + + + 45 + 80 + 1393 + 2 + 0 + + + 45 + 80 + 1392 + 2 + 0 + + + 2 + 79 + 1389 + 0 + 1 + + + 1 + 84 + 1389 + 0 + 1 + + + 1 + 82 + 1397 + 1 + 1 + + + 1 + 82 + 1393 + 1 + 1 + + + 15 + 391 + 2714 + 0 + 0 + + + 15 + 394 + 2710 + 6 + 0 + + + 15 + 398 + 2713 + 4 + 0 + + + 15 + 395 + 2717 + 2 + 0 + + + 6 + 395 + 2714 + 0 + 0 + + + 110 + 686 + 3268 + 0 + 0 + + + 110 + 684 + 3270 + 0 + 0 + + + 195 + 682 + 3270 + 0 + 0 + + + 195 + 682 + 3267 + 0 + 0 + + + 195 + 682 + 3265 + 0 + 0 + + + 114 + 680 + 3269 + 0 + 0 + + + 195 + 680 + 3267 + 0 + 0 + + + 110 + 686 + 3272 + 0 + 0 + + + 110 + 685 + 3278 + 0 + 0 + + + 110 + 685 + 3275 + 0 + 0 + + + 111 + 683 + 3275 + 2 + 0 + + + 114 + 683 + 3273 + 0 + 0 + + + 102 + 681 + 3278 + 0 + 0 + + + 102 + 681 + 3276 + 0 + 0 + + + 102 + 680 + 3273 + 0 + 0 + + + 610 + 683 + 3280 + 6 + 0 + + + 610 + 687 + 3303 + 0 + 0 + + + 610 + 683 + 3298 + 3 + 0 + + + 112 + 692 + 3270 + 0 + 0 + + + 112 + 691 + 3265 + 0 + 0 + + + 112 + 690 + 3269 + 0 + 0 + + + 112 + 689 + 3267 + 0 + 0 + + + 110 + 688 + 3271 + 0 + 0 + + + 110 + 694 + 3276 + 0 + 0 + + + 610 + 691 + 3277 + 6 + 0 + + + 110 + 691 + 3272 + 0 + 0 + + + 110 + 689 + 3274 + 0 + 0 + + + 110 + 688 + 3276 + 0 + 0 + + + 610 + 694 + 3283 + 6 + 0 + + + 609 + 692 + 3285 + 0 + 0 + + + 610 + 692 + 3282 + 7 + 0 + + + 609 + 690 + 3280 + 3 + 0 + + + 610 + 689 + 3281 + 3 + 0 + + + 609 + 695 + 3288 + 3 + 0 + + + 610 + 693 + 3288 + 1 + 0 + + + 610 + 692 + 3292 + 3 + 0 + + + 609 + 688 + 3293 + 2 + 0 + + + 110 + 702 + 3267 + 0 + 0 + + + 639 + 701 + 3279 + 6 + 0 + + + 616 + 703 + 3283 + 0 + 0 + + + 610 + 702 + 3284 + 5 + 0 + + + 638 + 701 + 3280 + 2 + 0 + + + 609 + 696 + 3285 + 4 + 0 + + + 609 + 703 + 3293 + 4 + 0 + + + 610 + 703 + 3290 + 4 + 0 + + + 610 + 696 + 3291 + 1 + 0 + + + 610 + 710 + 3271 + 7 + 0 + + + 110 + 707 + 3268 + 0 + 0 + + + 110 + 705 + 3270 + 0 + 0 + + + 609 + 710 + 3275 + 3 + 0 + + + 114 + 707 + 3273 + 0 + 0 + + + 610 + 704 + 3274 + 1 + 0 + + + 609 + 711 + 3287 + 6 + 0 + + + 609 + 704 + 3280 + 2 + 0 + + + 610 + 710 + 3292 + 7 + 0 + + + 610 + 706 + 3292 + 7 + 0 + + + 609 + 708 + 3296 + 7 + 0 + + + 637 + 707 + 3297 + 0 + 0 + + + 610 + 705 + 3297 + 6 + 0 + + + 107 + 717 + 3266 + 6 + 0 + + + 109 + 716 + 3265 + 6 + 0 + + + 109 + 715 + 3265 + 0 + 0 + + + 610 + 716 + 3279 + 6 + 0 + + + 610 + 716 + 3273 + 2 + 0 + + + 610 + 714 + 3279 + 6 + 0 + + + 610 + 714 + 3276 + 0 + 0 + + + 609 + 713 + 3273 + 2 + 0 + + + 610 + 716 + 3286 + 7 + 0 + + + 610 + 713 + 3281 + 2 + 0 + + + 609 + 714 + 3288 + 6 + 0 + + + 111 + 713 + 3301 + 5 + 0 + + + 111 + 712 + 3301 + 5 + 0 + + + 111 + 711 + 3310 + 1 + 0 + + + 111 + 709 + 3309 + 0 + 0 + + + 111 + 709 + 3308 + 0 + 0 + + + 109 + 709 + 3304 + 7 + 0 + + + 111 + 716 + 3305 + 4 + 0 + + + 107 + 715 + 3306 + 3 + 0 + + + 107 + 714 + 3307 + 2 + 0 + + + 107 + 712 + 3310 + 1 + 0 + + + 107 + 679 + 3277 + 7 + 0 + + + 102 + 679 + 3275 + 0 + 0 + + + 102 + 678 + 3272 + 0 + 0 + + + 102 + 677 + 3275 + 0 + 0 + + + 107 + 676 + 3272 + 6 + 0 + + + 51 + 669 + 3286 + 4 + 0 + + + 51 + 668 + 3283 + 6 + 0 + + + 51 + 667 + 3286 + 4 + 0 + + + 51 + 667 + 3284 + 2 + 0 + + + 51 + 667 + 3281 + 2 + 0 + + + 51 + 670 + 3292 + 6 + 0 + + + 51 + 669 + 3294 + 4 + 0 + + + 55 + 669 + 3291 + 6 + 0 + + + 51 + 669 + 3290 + 0 + 0 + + + 20 + 668 + 3292 + 6 + 0 + + + 63 + 667 + 3295 + 6 + 0 + + + 51 + 667 + 3290 + 0 + 0 + + + 51 + 665 + 3290 + 0 + 0 + + + 71 + 664 + 3294 + 2 + 0 + + + 22 + 664 + 3292 + 0 + 0 + + + 22 + 664 + 3291 + 0 + 0 + + + 51 + 664 + 3297 + 0 + 0 + + + 135 + 668 + 3281 + 0 + 1 + + + 22 + 670 + 3290 + 0 + 1 + + + diff --git a/GameServer/conf/server/locs/GameObjectLoc.xml.gz b/GameServer/conf/server/locs/GameObjectLoc.xml.gz new file mode 100644 index 0000000..dfa1c42 Binary files /dev/null and b/GameServer/conf/server/locs/GameObjectLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/ItemLoc.xml b/GameServer/conf/server/locs/ItemLoc.xml new file mode 100644 index 0000000..4fdedf0 --- /dev/null +++ b/GameServer/conf/server/locs/ItemLoc.xml @@ -0,0 +1,2679 @@ + + + 471 + 133 + 211 + 1 +30 + + + 471 + 141 + 214 + 1 +30 + + + 469 + 362 + 602 + 1 +30 + + + 469 + 361 + 603 + 1 +30 + + + 41 + 180 + 200 + 3 +40 + + + 170 + 220 + 356 + 1 +40 + + + 32 + 327 + 153 + 5 +20 + + + 103 + 231 + 179 + 1 +110 + + + 376 + 260 + 290 + 1 +20 + + + 121 + 166 + 255 + 1 +160 + + + 28 + 118 + 627 + 1 +20 + + + 60 + 174 + 310 + 1 +20 + + + 411 + 320 + 299 + 1 +20 + + + 410 + 327 + 299 + 1 +20 + + + 410 + 309 + 302 + 1 +20 + + + 410 + 320 + 297 + 1 +20 + + + 411 + 315 + 299 + 1 +20 + + + 19 + 119 + 603 + 1 +20 + + + 27 + 317 + 410 + 1 +30 + + + 67 + 68 + 326 + 1 +30 + + + + 319 + 273 + 289 + 1 + 10 + + + 320 + 272 + 289 + 1 + 10 + + + 59 + 106 + 1476 + 1 + 5 + + + 16 + 217 + 453 + 1 + 15 + + + 337 + 170 + 3532 + 1 + 15 + + + 337 + 171 + 3532 + 1 + 15 + + + 21 + 158 + 3523 + 1 + 15 + + + 19 + 126 + 3511 + 1 + 15 + + + 133 + 586 + 614 + 1 + 30 + + + 262 + 265 + 102 + 1 + 30 + + + 637 + 129 + 112 + 3 + 10 + + + 637 + 131 + 112 + 3 + 10 + + + 637 + 131 + 114 + 3 + 10 + + + 33 + 117 + 669 + 1 + 30 + + + 35 + 138 + 668 + 1 + 30 + + + 11 + 140 + 648 + 1 + 30 + + + 241 + 160 + 621 + 1 + 5 + + + 241 + 158 + 621 + 1 + 5 + + + 241 + 160 + 623 + 1 + 5 + + + 241 + 158 + 623 + 1 + 5 + + + 1263 + 121 + 609 + 1 + 15 + + + 156 + 231 + 508 + 1 + 15 + + + 13 + 132 + 668 + 1 + 15 + + + 375 + 588 + 519 + 1 + 30 + + + 379 + 585 + 519 + 1 + 30 + + + 13 + 522 + 462 + 1 + 30 + + + 603 + 440 + 484 + 1 + 10 + + + 18 + 248 + 596 + 1 + 60 + + + 18 + 248 + 598 + 1 + 60 + + + 18 + 248 + 600 + 1 + 60 + + + 18 + 248 + 602 + 1 + 60 + + + 18 + 248 + 604 + 1 + 60 + + + 18 + 248 + 606 + 1 + 60 + + + 18 + 252 + 596 + 1 + 60 + + + 18 + 252 + 598 + 1 + 60 + + + 18 + 252 + 600 + 1 + 60 + + + 18 + 252 + 602 + 1 + 60 + + + 18 + 252 + 604 + 1 + 60 + + + 18 + 252 + 606 + 1 + 60 + + + 18 + 256 + 596 + 1 + 60 + + + 18 + 256 + 598 + 1 + 60 + + + 18 + 256 + 600 + 1 + 60 + + + 18 + 256 + 602 + 1 + 60 + + + 18 + 256 + 604 + 1 + 60 + + + 18 + 256 + 606 + 1 + 60 + + + 18 + 260 + 596 + 1 + 60 + + + 18 + 260 + 598 + 1 + 60 + + + 18 + 260 + 600 + 1 + 60 + + + 18 + 260 + 602 + 1 + 60 + + + 18 + 260 + 604 + 1 + 60 + + + 18 + 260 + 606 + 1 + 60 + + + 621 + 430 + 559 + 1 + 30 + + + 341 + 430 + 1502 + 1 + 30 + + + 377 + 403 + 567 + 1 + 30 + + + 210 + 408 + 547 + 1 + 30 + + + 190 + 277 + 1571 + 1 + 30 + + + 190 + 278 + 1578 + 1 + 30 + + + 18 + 327 + 627 + 1 + 60 + + + 18 + 329 + 627 + 1 + 60 + + + 18 + 331 + 627 + 1 + 60 + + + 18 + 327 + 629 + 1 + 60 + + + 18 + 329 + 629 + 1 + 60 + + + 18 + 331 + 629 + 1 + 60 + + + 241 + 331 + 633 + 1 + 30 + + + 241 + 329 + 633 + 1 + 30 + + + 241 + 327 + 633 + 1 + 30 + + + 140 + 345 + 605 + 1 + 30 + + + 294 + 344 + 606 + 1 + 30 + + + 167 + 343 + 606 + 1 + 30 + + + 168 + 343 + 608 + 1 + 30 + + + 295 + 346 + 1545 + 1 + 30 + + + 386 + 345 + 1545 + 1 + 30 + + + 144 + 344 + 1545 + 1 + 30 + + + 182 + 278 + 657 + 1 + 30 + + + 194 + 110 + 518 + 1 + 30 + + + 15 + 107 + 526 + 1 + 30 + + + 14 + 110 + 526 + 1 + 30 + + + 14 + 110 + 527 + 1 + 30 + + + 135 + 119 + 523 + 1 + 30 + + + 18 + 119 + 530 + 1 + 30 + + + 18 + 119 + 532 + 1 + 30 + + + 18 + 119 + 534 + 1 + 30 + + + 18 + 118 + 530 + 1 + 30 + + + 18 + 118 + 532 + 1 + 30 + + + 18 + 118 + 534 + 1 + 30 + + + 211 + 127 + 1461 + 1 + 30 + + + 13 + 124 + 1458 + 1 + 30 + + + 10 + 150 + 3330 + 100 + 60 + + + 186 + 148 + 3337 + 1 + 60 + + + 186 + 149 + 3337 + 1 + 60 + + + 152 + 150 + 3336 + 1 + 60 + + + 152 + 152 + 3335 + 1 + 60 + + + 10 + 147 + 3337 + 10 + 60 + + + 10 + 149 + 3335 + 10 + 60 + + + 10 + 149 + 3339 + 10 + 60 + + + 10 + 150 + 3335 + 10 + 60 + + + 10 + 150 + 3339 + 10 + 60 + + + 10 + 152 + 3337 + 10 + 60 + + + 251 + 121 + 465 + 1 + 30 + + + 21 + 120 + 456 + 1 + 30 + + + 10 + 118 + 452 + 10 + 30 + + + 10 + 121 + 449 + 10 + 30 + + + 189 + 377 + 1446 + 1 + 30 + + + 16 + 306 + 522 + 1 + 30 + + + 251 + 296 + 3329 + 1 + 30 + + + 135 + 234 + 507 + 1 + 30 + + + 228 + 231 + 548 + 1 + 30 + + + 228 + 230 + 548 + 1 + 30 + + + 228 + 229 + 548 + 1 + 30 + + + 228 + 231 + 549 + 1 + 30 + + + 228 + 230 + 549 + 1 + 30 + + + 228 + 229 + 549 + 1 + 30 + + + 228 + 231 + 550 + 1 + 30 + + + 228 + 230 + 550 + 1 + 30 + + + 228 + 229 + 550 + 1 + 30 + + + 19 + 122 + 603 + 1 + 30 + + + 41 + 361 + 2458 + 1 + 60 + + + 140 + 133 + 661 + 1 + 60 + + + 135 + 134 + 660 + 1 + 60 + + + 18 + 141 + 3489 + 1 + 60 + + + 17 + 141 + 3488 + 1 + 60 + + + 62 + 129 + 1601 + 1 + 60 + + + 14 + 139 + 2537 + 1 + 60 + + + 14 + 140 + 2537 + 1 + 60 + + + 14 + 140 + 2538 + 1 + 60 + + + 14 + 139 + 2536 + 1 + 60 + + + 36 + 77 + 1618 + 1 + 60 + + + 17 + 64 + 677 + 1 + 60 + + + 21 + 60 + 672 + 1 + 60 + + + 18 + 79 + 693 + 1 + 60 + + + 140 + 78 + 693 + 1 + 60 + + + 31 + 67 + 587 + 4 + 60 + + + 32 + 74 + 583 + 4 + 60 + + + 33 + 183 + 649 + 4 + 60 + + + 0 + 602 + 699 + 1 + 60 + + + 20 + 606 + 700 + 1 + 60 + + + 20 + 606 + 703 + 1 + 60 + + + 5 + 602 + 704 + 1 + 60 + + + 20 + 600 + 702 + 1 + 60 + + + 12 + 609 + 703 + 1 + 60 + + + 20 + 611 + 701 + 1 + 60 + + + 20 + 614 + 703 + 1 + 60 + + + 20 + 603 + 711 + 1 + 60 + + + 20 + 607 + 711 + 1 + 60 + + + 20 + 608 + 709 + 1 + 60 + + + 0 + 608 + 707 + 1 + 60 + + + 20 + 615 + 707 + 1 + 60 + + + 20 + 604 + 706 + 1 + 60 + + + 20 + 601 + 707 + 1 + 60 + + + 601 + 639 + 737 + 1 + 60 + + + 10 + 470 + 672 + 3 + 60 + + + 10 + 470 + 673 + 3 + 60 + + + 10 + 471 + 674 + 3 + 60 + + + 10 + 468 + 674 + 3 + 60 + + + 10 + 470 + 675 + 3 + 60 + + + 799 + 574 + 583 + 1 + 60 + + + 799 + 574 + 585 + 1 + 60 + + + 799 + 574 + 586 + 1 + 60 + + + 757 + 597 + 543 + 1 + 60 + + + 251 + 432 + 1424 + 1 + 60 + + + 465 + 429 + 1434 + 1 + 60 + + + 319 + 223 + 624 + 1 + 30 + + + 320 + 222 + 624 + 1 + 30 + + + 337 + 176 + 480 + 1 + 60 + + + 135 + 177 + 2370 + 1 + 60 + + + 252 + 175 + 2370 + 1 + 60 + + + 140 + 176 + 2370 + 1 + 30 + + + 143 + 181 + 2374 + 1 + 30 + + + 338 + 181 + 1424 + 1 + 60 + + + 341 + 180 + 1424 + 1 + 60 + + + 251 + 178 + 1424 + 1 + 60 + + + 252 + 177 + 1424 + 1 + 60 + + + 252 + 176 + 1424 + 1 + 60 + + + 596 + 367 + 3372 + 1 + 60 + + + 236 + 90 + 544 + 1 + 60 + + + 236 + 91 + 551 + 1 + 60 + + + 55 + 86 + 542 + 1 + 60 + + + 236 + 79 + 540 + 1 + 60 + + + 55 + 83 + 548 + 1 + 60 + + + 388 + 264 + 1402 + 1 + 30 + + + 389 + 265 + 1402 + 1 + 30 + + + 193 + 231 + 500 + 1 + 60 + + + 193 + 233 + 500 + 1 + 60 + + + 193 + 232 + 497 + 1 + 60 + + + 132 + 234 + 500 + 1 + 60 + + + 132 + 231 + 497 + 1 + 60 + + + 10 + 223 + 3280 + 1 + 60 + + + 10 + 223 + 3281 + 4 + 60 + + + 20 + 216 + 3289 + 1 + 15 + + + 20 + 212 + 3292 + 1 + 15 + + + 20 + 216 + 3299 + 1 + 15 + + + 20 + 205 + 3288 + 1 + 15 + + + 20 + 210 + 3288 + 1 + 15 + + + 20 + 207 + 3283 + 1 + 15 + + + 20 + 209 + 3283 + 1 + 15 + + + 11 + 197 + 3277 + 3 + 30 + + + 20 + 194 + 3267 + 1 + 30 + + + 219 + 201 + 3234 + 1 + 15 + + + 219 + 204 + 3232 + 1 + 15 + + + 219 + 209 + 3236 + 1 + 15 + + + 219 + 208 + 3240 + 1 + 15 + + + 186 + 204 + 3295 + 1 + 60 + + + 99 + 198 + 3307 + 1 + 60 + + + 7 + 106 + 489 + 1 + 60 + + + 6 + 106 + 487 + 1 + 60 + + + 128 + 106 + 485 + 1 + 60 + + + 1 + 105 + 484 + 1 + 60 + + + 0 + 103 + 484 + 1 + 60 + + + 132 + 307 + 1475 + 1 + 60 + + + 183 + 310 + 1479 + 1 + 60 + + + 21 + 35 + 542 + 1 + 60 + + + 156 + 33 + 539 + 1 + 60 + + + 140 + 13 + 541 + 1 + 60 + + + 1111 + 15 + 541 + 1 + 60 + + + 21 + 17 + 536 + 1 + 60 + + + 21 + 23 + 527 + 1 + 60 + + + 21 + 23 + 526 + 1 + 60 + + + 21 + 16 + 524 + 1 + 60 + + + 20 + 16 + 522 + 1 + 60 + + + 20 + 14 + 519 + 1 + 60 + + + 21 + 26 + 518 + 1 + 60 + + + 21 + 27 + 518 + 1 + 60 + + + 20 + 25 + 506 + 1 + 60 + + + 21 + 13 + 509 + 1 + 60 + + + 1284 + 11 + 3375 + 1 + 60 + + + 1284 + 9 + 3373 + 1 + 60 + + + 1284 + 5 + 3377 + 1 + 60 + + + 27 + 8 + 3401 + 1 + 60 + + + 27 + 17 + 3401 + 1 + 60 + + + 33 + 339 + 703 + 3 + 60 + + + 31 + 408 + 3532 + 1 + 30 + + + 31 + 405 + 3537 + 1 + 30 + + + 31 + 409 + 3543 + 1 + 30 + + + 31 + 414 + 3540 + 1 + 30 + + + 31 + 413 + 3534 + 1 + 30 + + + 219 + 404 + 3518 + 1 + 15 + + + 10 + 415 + 3476 + 100 + 60 + + + 10 + 419 + 3477 + 100 + 60 + + + 10 + 420 + 3484 + 100 + 60 + + + 10 + 415 + 3483 + 100 + 60 + + + 13 + 509 + 506 + 1 + 60 + + + 4 + 135 + 437 + 1 + 30 + + + 34 + 153 + 443 + 3 + 30 + + + + 501 + 333 + 434 + 1 + 30 + + + 413 + 116 + 238 + 1 + 15 + + + 413 + 123 + 263 + 1 + 15 + + + 413 + 130 + 259 + 1 + 15 + + + 413 + 131 + 278 + 1 + 15 + + + 342 + 543 + 3274 + 1 + 15 + + + 725 + 540 + 3273 + 1 + 15 + + + 118 + 236 + 180 + 1 + 120 + + + 36 + 232 + 177 + 10 + 120 + + + 20 + 233 + 176 + 1 + 30 + + + 714 + 580 + 3524 + 1 + 30 + + + 168 + 544 + 576 + 1 + 30 + + + 167 + 543 + 576 + 1 + 30 + + + 28 + 112 + 653 + 1 + 30 + + + 164 + 168 + 164 + 1 + 120 + + + 46 + 331 + 149 + 1 + 120 + + + 40 + 67 + 177 + 3 + 20 + + + 40 + 69 + 178 + 2 + 20 + + + 11 + 212 + 367 + 4 + 20 + + + 11 + 215 + 373 + 3 + 20 + + + 11 + 222 + 370 + 4 + 20 + + + 11 + 217 + 366 + 2 + 20 + + + 11 + 213 + 364 + 2 + 20 + + + 11 + 213 + 367 + 2 + 20 + + + 190 + 228 + 290 + 4 + 20 + + + 190 + 238 + 294 + 3 + 20 + + + 190 + 235 + 300 + 3 + 20 + + + 41 + 263 + 345 + 1 + 30 + + + 36 + 263 + 347 + 2 + 30 + + + 35 + 261 + 347 + 2 + 30 + + + 35 + 261 + 347 + 2 + 30 + + + 34 + 259 + 347 + 2 + 30 + + + 33 + 257 + 347 + 2 + 30 + + + 32 + 255 + 347 + 2 + 30 + + + 31 + 253 + 347 + 2 + 30 + + + 18 + 252 + 453 + 1 + 30 + + + 18 + 251 + 453 + 1 + 30 + + + 18 + 250 + 453 + 1 + 30 + + + 18 + 249 + 453 + 1 + 30 + + + 18 + 252 + 455 + 1 + 30 + + + 18 + 251 + 455 + 1 + 30 + + + 18 + 250 + 455 + 1 + 30 + + + 18 + 249 + 455 + 1 + 30 + + + 18 + 252 + 457 + 1 + 30 + + + 18 + 251 + 457 + 1 + 30 + + + 18 + 250 + 457 + 1 + 30 + + + 18 + 249 + 457 + 1 + 30 + + + 622 + 437 + 536 + 1 + 15 + + + 622 + 437 + 538 + 1 + 15 + + + 622 + 437 + 540 + 1 + 15 + + + 622 + 437 + 543 + 1 + 15 + + + 10 + 91 + 3301 + 1 + 30 + + + 35 + 129 + 3292 + 1 + 15 + + + 36 + 129 + 3290 + 1 + 15 + + + + 34 + 146 + 3296 + 6 + 30 + + + 10 + 150 + 3300 + 7 + 30 + + + 10 + 155 + 3301 + 5 + 30 + + + 219 + 160 + 3299 + 1 + 15 + + + 12 + 161 + 3295 + 1 + 30 + + + 219 + 158 + 3292 + 8 + 30 + + + 10 + 151 + 3290 + 7 + 30 + + + 18 + 137 + 612 + 1 + 30 + + + 18 + 139 + 612 + 1 + 30 + + + 18 + 141 + 612 + 1 + 30 + + + 18 + 143 + 612 + 1 + 30 + + + 18 + 145 + 612 + 1 + 30 + + + 18 + 147 + 612 + 1 + 30 + + + 18 + 149 + 612 + 1 + 30 + + + 18 + 151 + 612 + 1 + 30 + + + 18 + 153 + 612 + 1 + 30 + + + 18 + 137 + 609 + 1 + 30 + + + 18 + 139 + 609 + 1 + 30 + + + 18 + 141 + 609 + 1 + 30 + + + 18 + 143 + 609 + 1 + 30 + + + 18 + 145 + 609 + 1 + 30 + + + 18 + 147 + 609 + 1 + 30 + + + 18 + 149 + 609 + 1 + 30 + + + 18 + 151 + 609 + 1 + 30 + + + 18 + 153 + 609 + 1 + 30 + + + 18 + 137 + 606 + 1 + 30 + + + 18 + 139 + 606 + 1 + 30 + + + 18 + 141 + 606 + 1 + 30 + + + 18 + 143 + 606 + 1 + 30 + + + 18 + 145 + 606 + 1 + 30 + + + 18 + 147 + 606 + 1 + 30 + + + 18 + 149 + 606 + 1 + 30 + + + 18 + 151 + 606 + 1 + 30 + + + 18 + 153 + 606 + 1 + 30 + + + 18 + 137 + 603 + 1 + 30 + + + 18 + 139 + 603 + 1 + 30 + + + 18 + 141 + 603 + 1 + 30 + + + 18 + 143 + 603 + 1 + 30 + + + 18 + 145 + 603 + 1 + 30 + + + 18 + 147 + 603 + 1 + 30 + + + 18 + 149 + 603 + 1 + 30 + + + 18 + 151 + 603 + 1 + 30 + + + 18 + 153 + 603 + 1 + 30 + + + 18 + 137 + 600 + 1 + 30 + + + 18 + 139 + 600 + 1 + 30 + + + 18 + 141 + 600 + 1 + 30 + + + 18 + 143 + 600 + 1 + 30 + + + 18 + 145 + 600 + 1 + 30 + + + 18 + 147 + 600 + 1 + 30 + + + 18 + 149 + 600 + 1 + 30 + + + 18 + 151 + 600 + 1 + 30 + + + 18 + 153 + 600 + 1 + 30 + + + 20 + 568 + 3328 + 1 + 15 + + + 20 + 566 + 3326 + 1 + 15 + + + 20 + 569 + 3326 + 1 + 15 + + + 20 + 566 + 3324 + 1 + 15 + + + 20 + 569 + 3322 + 1 + 15 + + + 20 + 566 + 3319 + 1 + 15 + + + 20 + 569 + 3318 + 1 + 15 + + + 10 + 566 + 3320 + 1 + 15 + + + 10 + 567 + 3321 + 1 + 15 + + + 10 + 566 + 3318 + 1 + 15 + + + 10 + 568 + 3317 + 1 + 15 + + + 164 + 567 + 3318 + 1 + 60 + + + 283 + 565 + 3317 + 1 + 60 + + diff --git a/GameServer/conf/server/locs/ItemLoc.xml.gz b/GameServer/conf/server/locs/ItemLoc.xml.gz new file mode 100644 index 0000000..1f03245 Binary files /dev/null and b/GameServer/conf/server/locs/ItemLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/ItemLoc.xml.gz.old b/GameServer/conf/server/locs/ItemLoc.xml.gz.old new file mode 100644 index 0000000..7bd40ca Binary files /dev/null and b/GameServer/conf/server/locs/ItemLoc.xml.gz.old differ diff --git a/GameServer/conf/server/locs/NpcLoc.xml b/GameServer/conf/server/locs/NpcLoc.xml new file mode 100644 index 0000000..5847ac4 --- /dev/null +++ b/GameServer/conf/server/locs/NpcLoc.xml @@ -0,0 +1,23702 @@ + + +802 + 220 + 456 + 220 + 220 + 456 + 456 + + + + 661 + 685 + 587 + 685 + 688 + 587 + 590 + + + + 418 + 613 + 1562 + 613 + 616 + 1562 + 1565 + + + 419 + 611 + 1562 + 611 + 614 + 1562 + 1565 + + + 423 + 619 + 1564 + 619 + 622 + 1564 + 1567 + + + + 512 + 606 + 599 + 606 + 609 + 599 + 602 + + + 322 + 606 + 600 + 603 + 609 + 597 + 609 + + + + 435 + 584 + 592 + 579 + 587 + 591 + 595 + + + + 486 + 584 + 586 + 584 + 587 + 586 + 589 + + + + 335 + 556 + 579 + 556 + 559 + 579 + 582 + + + + 360 + 615 + 585 + 615 + 618 + 585 + 588 + + + + 443 + 629 + 588 + 629 + 632 + 588 + 591 + + + + 70 + 594 + 620 + 594 + 597 + 608 + 623 + + + 70 + 596 + 618 + 594 + 597 + 609 + 618 + + + + 243 + 587 + 613 + 587 + 590 + 613 + 616 + + + + 6 + 546 + 560 + 538 + 548 + 550 + 563 + + + 6 + 541 + 560 + 538 + 548 + 550 + 563 + + + 6 + 542 + 555 + 538 + 548 + 550 + 563 + + + 6 + 544 + 554 + 538 + 548 + 550 + 563 + + + 6 + 540 + 554 + 538 + 548 + 550 + 563 + + + + 315 + 230 + 3246 + 228 + 233 + 3243 + 3250 + + + + 291 + 275 + 2998 + 268 + 276 + 2993 + 3005 + + + 291 + 270 + 3008 + 266 + 273 + 3004 + 3012 + + + 292 + 247 + 3012 + 244 + 253 + 3010 + 3014 + + + 292 + 258 + 3005 + 253 + 266 + 3002 + 3017 + + + 292 + 262 + 3008 + 253 + 266 + 3002 + 3017 + + + 292 + 257 + 3013 + 253 + 266 + 3002 + 3017 + + + 292 + 263 + 3015 + 253 + 266 + 3002 + 3017 + + + 292 + 255 + 3013 + 253 + 266 + 3002 + 3017 + + + + 22 + 281 + 185 + 281 + 284 + 184 + 187 + + + 22 + 282 + 184 + 281 + 284 + 184 + 187 + + + + 584 + 208 + 3218 + 204 + 210 + 3206 + 3220 + + + 584 + 206 + 3216 + 204 + 210 + 3206 + 3220 + + + 584 + 208 + 3214 + 204 + 210 + 3206 + 3220 + + + 584 + 205 + 3212 + 204 + 210 + 3206 + 3220 + + + 584 + 208 + 3211 + 204 + 210 + 3206 + 3220 + + + 584 + 205 + 3210 + 204 + 210 + 3206 + 3220 + + + 584 + 208 + 3208 + 204 + 210 + 3206 + 3220 + + + 584 + 205 + 3207 + 204 + 210 + 3206 + 3220 + + + + 312 + 609 + 3482 + 605 + 617 + 3480 + 3485 + + + 312 + 611 + 3483 + 605 + 617 + 3480 + 3485 + + + 312 + 612 + 3485 + 605 + 617 + 3480 + 3485 + + + 312 + 614 + 3483 + 605 + 617 + 3480 + 3485 + + + 312 + 617 + 3485 + 605 + 617 + 3480 + 3485 + + + 312 + 614 + 3484 + 605 + 617 + 3480 + 3485 + + + + 291 + 411 + 3336 + 406 + 419 + 3333 + 3336 + + + 291 + 407 + 3337 + 400 + 408 + 3332 + 3341 + + + 477 + 565 + 3316 + 563 + 571 + 3315 + 3331 + + + 477 + 569 + 3316 + 563 + 571 + 3315 + 3331 + + + 312 + 662 + 759 + 657 + 666 + 755 + 763 + + + 312 + 662 + 760 + 657 + 666 + 755 + 763 + + + 312 + 661 + 759 + 657 + 666 + 755 + 763 + + + 681 + 662 + 759 + 657 + 666 + 755 + 763 + + + 243 + 711 + 562 + 703 + 722 + 555 + 577 + + + 243 + 712 + 563 + 703 + 722 + 555 + 577 + + + 243 + 713 + 560 + 703 + 722 + 555 + 577 + + + 243 + 713 + 559 + 703 + 722 + 555 + 577 + + + 243 + 711 + 561 + 703 + 722 + 555 + 577 + + + 243 + 710 + 562 + 703 + 722 + 555 + 577 + + + 153 + 731 + 570 + 717 + 750 + 559 + 570 + + + 153 + 732 + 570 + 717 + 750 + 559 + 570 + + + 153 + 732 + 569 + 717 + 750 + 559 + 570 + + + 153 + 731 + 569 + 717 + 750 + 559 + 570 + + + 153 + 730 + 569 + 717 + 750 + 559 + 570 + + + 153 + 758 + 564 + 740 + 767 + 558 + 570 + + + 153 + 759 + 565 + 740 + 767 + 558 + 570 + + + 243 + 760 + 565 + 740 + 767 + 558 + 570 + + + 243 + 759 + 561 + 740 + 767 + 558 + 570 + + + 243 + 760 + 561 + 740 + 767 + 558 + 570 + + + 0 + 89 + 545 + 78 + 94 + 536 + 567 + + + 0 + 85 + 544 + 78 + 94 + 536 + 567 + + + 243 + 591 + 851 + 581 + 594 + 848 + 856 + + + 243 + 588 + 850 + 581 + 594 + 848 + 856 + + + 243 + 584 + 855 + 581 + 594 + 848 + 856 + + + 243 + 584 + 853 + 581 + 594 + 848 + 856 + + + 61 + 587 + 854 + 581 + 598 + 850 + 856 + + + 529 + 632 + 763 + 627 + 634 + 761 + 766 + + + 190 + 342 + 3373 + 342 + 342 + 3365 + 3375 + + + 190 + 350 + 3376 + 342 + 350 + 3375 + 3377 + + + 190 + 352 + 3372 + 349 + 352 + 3371 + 3375 + + + 190 + 342 + 3373 + 342 + 342 + 3360 + 3374 + + + 190 + 342 + 3373 + 342 + 343 + 3365 + 3375 + + + 516 + 606 + 3584 + 603 + 611 + 3583 + 3586 + + + 516 + 605 + 3583 + 603 + 611 + 3583 + 3586 + + + + 516 + 610 + 3585 + 603 + 611 + 3583 + 3586 + + + + 516 + 603 + 3584 + 603 + 611 + 3583 + 3586 + + + 66 + 66 + 260 + 58 + 69 + 236 + 262 + + + + 66 + 60 + 255 + 58 + 73 + 238 + 264 + + + + 66 + 57 + 250 + 53 + 81 + 244 + 262 + + + + + + 60 + 360 + 2457 + 360 + 363 + 2457 + 2460 + + + + 60 + 363 + 2460 + 360 + 363 + 2457 + 2460 + + + 60 + 362 + 2459 + 360 + 363 + 2457 + 2460 + + + + 57 + 360 + 2458 + 360 + 363 + 2457 + 2460 + + + + + 57 + 361 + 1513 + 360 + 363 + 1513 + 1516 + + + 60 + 361 + 1515 + 360 + 363 + 1513 + 1516 + + + 60 + 360 + 1516 + 360 + 363 + 1513 + 1516 + + + + + + 57 + 363 + 569 + 360 + 363 + 568 + 573 + + + 57 + 362 + 570 + 360 + 363 + 568 + 573 + + + 60 + 361 + 571 + 360 + 363 + 568 + 573 + + + 60 + 361 + 572 + 360 + 363 + 568 + 573 + + + + 60 + 362 + 570 + 360 + 363 + 568 + 573 + + + + 57 + 363 + 569 + 360 + 363 + 568 + 573 + + + + + 19 + 597 + 3354 + 592 + 597 + 3350 + 3354 + + + 19 + 595 + 3354 + 592 + 597 + 3350 + 3354 + + + 19 + 593 + 3354 + 592 + 597 + 3350 + 3354 + + + 19 + 592 + 3352 + 592 + 597 + 3350 + 3354 + + + + + + + + + + + + + + 552 + 414 + 2996 + 414 + 414 + 2996 + 2996 + + + + + + 551 + 417 + 2994 + 417 + 419 + 2994 + 2994 + + + + + + 550 + 419 + 2991 + 419 + 419 + 2991 + 2991 + + + + + + + + + + 582 + 690 + 2338 + 690 + 694 + 2338 + 2338 + + + 582 + 703 + 2346 + 703 + 703 + 2346 + 2349 + + + 582 + 711 + 2338 + 711 + 715 + 2338 + 2338 + + + 582 + 703 + 2327 + 703 + 703 + 2327 + 2331 + + + + + + + + + + 593 + 711 + 1399 + 711 + 711 + 1395 + 1401 + + + + + + 540 + 717 + 1400 + 714 + 717 + 1400 + 1403 + + + 540 + 717 + 1402 + 714 + 717 + 1400 + 1403 + + + 540 + 717 + 1402 + 714 + 717 + 1400 + 1403 + + + 540 + 715 + 1400 + 714 + 717 + 1400 + 1403 + + + + + 586 + 715 + 1402 + 714 + 717 + 1400 + 1403 + + + + + + 586 + 716 + 1411 + 715 + 717 + 1400 + 1411 + + + + + 586 + 715 + 1409 + 715 + 717 + 1400 + 1411 + + + + + + 591 + 711 + 1391 + 711 + 711 + 1388 + 1393 + + + + + + 536 + 714 + 1388 + 713 + 717 + 1387 + 1389 + + + + + + 581 + 714 + 1387 + 713 + 717 + 1387 + 1389 + + + + + + 591 + 716 + 1387 + 713 + 717 + 1387 + 1389 + + + + + + 581 + 724 + 1387 + 722 + 725 + 1386 + 1389 + + + + + + 593 + 725 + 1389 + 722 + 725 + 1386 + 1389 + + + + + + 592 + 722 + 1387 + 722 + 725 + 1386 + 1389 + + + + + + 592 + 721 + 1388 + 717 + 721 + 1388 + 1388 + + + + + + + + 537 + 716 + 1380 + 714 + 716 + 1378 + 1380 + + + + + + 586 + 715 + 1382 + 715 + 715 + 1382 + 1385 + + + + + + + + + + + + + 201 + 145 + 195 + 132 + 162 + 190 + 215 + + + 201 + 149 + 210 + 132 + 162 + 190 + 215 + + + 201 + 137 + 207 + 132 + 162 + 190 + 215 + + + + + + + + 797 + 115 + 187 + 109 + 125 + 184 + 196 + + + 797 + 117 + 186 + 109 + 125 + 184 + 196 + + + 797 + 121 + 187 + 109 + 125 + 184 + 196 + + + 797 + 122 + 190 + 109 + 125 + 184 + 196 + + + 797 + 119 + 192 + 109 + 125 + 184 + 196 + + + 797 + 115 + 192 + 109 + 125 + 184 + 196 + + + 797 + 112 + 191 + 109 + 125 + 184 + 196 + + + 797 + 113 + 188 + 109 + 125 + 184 + 196 + + + 797 + 133 + 215 + 132 + 162 + 190 + 215 + + + 797 + 141 + 208 + 132 + 162 + 190 + 215 + + + 797 + 134 + 201 + 132 + 162 + 190 + 215 + + + 797 + 154 + 212 + 132 + 162 + 190 + 215 + + + 797 + 152 + 204 + 132 + 162 + 190 + 215 + + + 797 + 154 + 197 + 132 + 162 + 190 + 215 + + + + + + + + 296 + 111 + 295 + 108 + 133 + 293 + 311 + + + 296 + 113 + 295 + 108 + 133 + 293 + 311 + + + 296 + 112 + 297 + 108 + 133 + 293 + 311 + + + 296 + 114 + 297 + 108 + 133 + 293 + 311 + + + 296 + 116 + 298 + 108 + 133 + 293 + 311 + + + 296 + 118 + 297 + 108 + 133 + 293 + 311 + + + 296 + 117 + 304 + 108 + 133 + 293 + 311 + + + 296 + 115 + 308 + 108 + 133 + 293 + 311 + + + + + + + + 251 + 175 + 403 + 164 + 178 + 395 + 403 + + + 251 + 173 + 401 + 164 + 178 + 395 + 403 + + + 251 + 173 + 399 + 164 + 178 + 395 + 403 + + + 251 + 170 + 397 + 164 + 178 + 395 + 403 + + + 251 + 169 + 400 + 164 + 178 + 395 + 403 + + + 251 + 169 + 402 + 164 + 178 + 395 + 403 + + + 251 + 169 + 397 + 164 + 178 + 395 + 403 + + + + + + + + + 251 + 199 + 3252 + 195 + 203 + 3250 + 3257 + + + 251 + 197 + 3252 + 195 + 203 + 3250 + 3257 + + + 251 + 197 + 3255 + 195 + 203 + 3250 + 3257 + + + 251 + 198 + 3257 + 195 + 203 + 3250 + 3257 + + + 251 + 200 + 3255 + 195 + 203 + 3250 + 3257 + + + + + + 43 + 473 + 520 + 471 + 485 + 514 + 524 + + + + 43 + 475 + 519 + 471 + 485 + 514 + 524 + + + + 43 + 473 + 517 + 471 + 485 + 514 + 524 + + + + + + + 43 + 519 + 3379 + 519 + 521 + 3369 + 3379 + + + 43 + 520 + 3371 + 519 + 521 + 3369 + 3379 + + + + + + + + 786 + 513 + 3390 + 512 + 518 + 3383 + 3391 + + + + + 786 + 518 + 3388 + 512 + 518 + 3383 + 3391 + + + + + 786 + 513 + 3389 + 512 + 518 + 3383 + 3391 + + + + + 786 + 515 + 3388 + 512 + 518 + 3383 + 3391 + + + + + 786 + 516 + 3385 + 512 + 518 + 3383 + 3391 + + + + 786 + 513 + 3384 + 512 + 518 + 3383 + 3391 + + + + + 786 + 516 + 3384 + 512 + 518 + 3383 + 3391 + + + + 786 + 512 + 3383 + 512 + 518 + 3383 + 3391 + + + 786 + 518 + 3391 + 512 + 518 + 3383 + 3391 + + + + + + 43 + 509 + 3393 + 508 + 510 + 3391 + 3396 + + + 43 + 509 + 3395 + 508 + 510 + 3391 + 3396 + + + + + 787 + 505 + 3371 + 504 + 511 + 3369 + 3374 + + + 787 + 507 + 3371 + 504 + 511 + 3369 + 3374 + + + 787 + 509 + 3371 + 504 + 511 + 3369 + 3374 + + + 787 + 509 + 3373 + 504 + 511 + 3369 + 3374 + + + 787 + 507 + 3373 + 504 + 511 + 3369 + 3374 + + + 787 + 504 + 3374 + 504 + 511 + 3369 + 3374 + + + + + 144 + 325 + 490 + 323 + 327 + 487 + 492 + + + 150 + 257 + 626 + 257 + 257 + 626 + 628 + + + 152 + 323 + 447 + 321 + 326 + 445 + 449 + + + 151 + 323 + 447 + 321 + 326 + 445 + 449 + + + 22 + 282 + 186 + 281 + 284 + 184 + 187 + + + 22 + 282 + 186 + 281 + 284 + 184 + 187 + + + + 53 + 316 + 282 + 313 + 324 + 279 + 285 + + + 53 + 316 + 282 + 313 + 324 + 279 + 285 + + 53 + 316 + 282 + 313 + 324 + 279 + 285 + + 53 + 316 + 282 + 313 + 324 + 279 + 285 + + 53 + 316 + 282 + 313 + 324 + 279 + 285 + + + + 179 + 182 + 198 + 174 + 187 + 195 + 203 + + + 594 + 182 + 198 + 174 + 187 + 195 + 203 + + + 594 + 182 + 198 + 174 + 187 + 195 + 203 + + + 23 + 272 + 299 + 258 + 278 + 290 + 307 + + + + 23 + 171 + 161 + 166 + 174 + 158 + 165 + + + 23 + 171 + 161 + 166 + 174 + 158 + 165 + + + 23 + 171 + 161 + 166 + 174 + 158 + 165 + + + + + + + + 65 + 332 + 546 + 329 + 334 + 544 + 548 + + + 62 + 140 + 635 + 140 + 150 + 635 + 643 + + + + 21 + 65 + 563 + 65 + 71 + 563 + 570 + + + + 34 + 173 + 638 + 171 + 174 + 638 + 639 + + + + 89 + 287 + 609 + 276 + 292 + 609 + 617 + + + + 81 + 285 + 609 + 276 + 292 + 609 + 617 + + + + 8 + 315 + 443 + 312 + 318 + 441 + 445 + + + 8 + 180 + 654 + 176 + 192 + 647 + 660 + + + + 8 + 180 + 654 + 176 + 192 + 647 + 660 + + + 37 + 105 + 1478 + 103 + 107 + 1476 + 1479 + + + + 89 + 299 + 609 + 287 + 310 + 595 + 615 + + + + 292 + 282 + 3016 + 279 + 284 + 3014 + 3018 + + + 292 + 282 + 3016 + 279 + 284 + 3014 + 3018 + + + 292 + 282 + 3016 + 279 + 284 + 3014 + 3018 + + + 292 + 282 + 3016 + 279 + 284 + 3014 + 3018 + + + 292 + 282 + 3016 + 279 + 284 + 3014 + 3018 + + + 292 + 282 + 3016 + 279 + 284 + 3014 + 3018 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + + + + + + + + + + 290 + 231 + 3235 + 228 + 234 + 3229 + 3236 + + + 290 + 227 + 3234 + 224 + 230 + 3231 + 3235 + + + 290 + 232 + 3230 + 223 + 237 + 3226 + 3234 + + + 290 + 226 + 3233 + 222 + 230 + 3224 + 3237 + + + 290 + 227 + 3231 + 224 + 232 + 3226 + 3235 + + + + + + 292 + 382 + 3350 + 370 + 390 + 3348 + 3353 + + + 292 + 386 + 3344 + 375 + 389 + 3340 + 3347 + + + 292 + 391 + 3339 + 383 + 394 + 3330 + 3344 + + + 292 + 391 + 3345 + 388 + 395 + 3337 + 3347 + + + 292 + 394 + 3350 + 390 + 398 + 3345 + 3354 + + + 292 + 397 + 3343 + 380 + 400 + 3338 + 3346 + + + 294 + 388 + 3326 + 384 + 393 + 3323 + 3330 + + + 294 + 391 + 3316 + 377 + 398 + 3310 + 3320 + + + 294 + 395 + 3329 + 390 + 398 + 3322 + 3334 + + + + 293 + 411 + 3350 + 403 + 415 + 3345 + 3355 + + + + 293 + 409 + 3350 + 403 + 415 + 3345 + 3355 + + + + 293 + 407 + 3350 + 403 + 415 + 3345 + 3355 + + + + 293 + 407 + 3348 + 403 + 415 + 3345 + 3355 + + + + 293 + 407 + 3347 + 403 + 415 + 3345 + 3355 + + + + 293 + 409 + 3346 + 403 + 415 + 3345 + 3355 + + + + 293 + 411 + 3346 + 403 + 415 + 3345 + 3355 + + + + + 87 + 127 + 515 + 124 + 129 + 513 + 517 + + + 88 + 126 + 516 + 124 + 129 + 513 + 517 + + + 95 + 100 + 511 + 98 + 106 + 510 + 515 + + + 95 + 104 + 513 + 98 + 106 + 510 + 515 + + + 65 + 90 + 506 + 85 + 93 + 504 + 511 + + + 65 + 91 + 509 + 85 + 93 + 504 + 511 + + + 58 + 115 + 515 + 113 + 116 + 512 + 516 + + + 95 + 150 + 498 + 147 + 153 + 498 + 506 + + + 95 + 149 + 504 + 147 + 153 + 498 + 506 + + + 295 + 158 + 104 + 157 + 163 + 103 + 107 + + + 295 + 159 + 106 + 157 + 163 + 103 + 107 + + + 295 + 161 + 104 + 157 + 163 + 103 + 107 + + + 295 + 160 + 107 + 157 + 163 + 103 + 107 + + + 295 + 163 + 106 + 157 + 163 + 103 + 107 + + + 295 + 163 + 104 + 157 + 163 + 103 + 107 + + + 137 + 264 + 108 + 263 + 269 + 100 + 110 + + + 137 + 268 + 108 + 263 + 269 + 100 + 110 + + + 137 + 269 + 106 + 263 + 269 + 100 + 110 + + + 137 + 266 + 106 + 263 + 269 + 100 + 110 + + + 137 + 268 + 103 + 263 + 269 + 100 + 110 + + + 137 + 264 + 104 + 263 + 269 + 100 + 110 + + + 137 + 265 + 100 + 263 + 269 + 100 + 110 + + + 137 + 268 + 101 + 263 + 269 + 100 + 110 + + + 224 + 174 + 3527 + 172 + 176 + 3521 + 3528 + + + 224 + 174 + 3523 + 172 + 176 + 3521 + 3528 + + + 224 + 171 + 3523 + 170 + 176 + 3521 + 3525 + + + 222 + 164 + 3523 + 163 + 169 + 3521 + 3525 + + + 223 + 167 + 3524 + 163 + 169 + 3521 + 3525 + + + 466 + 175 + 3531 + 173 + 178 + 3530 + 3535 + + + 467 + 175 + 3534 + 173 + 178 + 3530 + 3535 + + + 298 + 178 + 3549 + 172 + 179 + 3541 + 3550 + + + 298 + 178 + 3547 + 172 + 179 + 3541 + 3550 + + + 298 + 178 + 3544 + 172 + 179 + 3541 + 3550 + + + 298 + 179 + 3545 + 172 + 179 + 3541 + 3550 + + + 298 + 176 + 3543 + 172 + 179 + 3541 + 3550 + + + 298 + 173 + 3543 + 172 + 179 + 3541 + 3550 + + + 298 + 174 + 3545 + 172 + 179 + 3541 + 3550 + + + 298 + 173 + 3548 + 172 + 179 + 3541 + 3550 + + + 298 + 175 + 3550 + 172 + 179 + 3541 + 3550 + + + 298 + 176 + 3548 + 172 + 179 + 3541 + 3550 + + + 217 + 140 + 3534 + 136 + 154 + 3522 + 3536 + + + 217 + 138 + 3527 + 136 + 154 + 3522 + 3536 + + + 217 + 145 + 3532 + 136 + 154 + 3522 + 3536 + + + 2 + 148 + 3522 + 136 + 154 + 3522 + 3536 + + + 2 + 151 + 3533 + 136 + 154 + 3522 + 3536 + + + 392 + 130 + 3546 + 128 + 133 + 3542 + 3547 + + + 221 + 117 + 3537 + 117 + 120 + 3534 + 3537 + + + 221 + 117 + 3537 + 117 + 120 + 3534 + 3537 + + + 318 + 584 + 620 + 583 + 589 + 619 + 623 + + + 338 + 588 + 620 + 583 + 589 + 619 + 623 + + + 13 + 580 + 621 + 579 + 582 + 620 + 623 + + + 13 + 575 + 618 + 573 + 577 + 615 + 620 + + + 338 + 571 + 611 + 564 + 578 + 608 + 613 + + + 8 + 572 + 620 + 564 + 572 + 614 + 620 + + + 8 + 565 + 615 + 564 + 572 + 614 + 620 + + + 334 + 559 + 615 + 557 + 561 + 613 + 617 + + + 95 + 552 + 610 + 551 + 554 + 609 + 616 + + + 95 + 552 + 613 + 551 + 554 + 609 + 616 + + + 95 + 553 + 615 + 551 + 554 + 609 + 616 + + + 95 + 554 + 614 + 551 + 554 + 609 + 616 + + + 336 + 578 + 600 + 577 + 583 + 598 + 602 + + + 337 + 580 + 601 + 577 + 583 + 598 + 602 + + + 436 + 585 + 603 + 574 + 588 + 598 + 607 + + + 318 + 580 + 606 + 574 + 588 + 603 + 607 + + + 43 + 211 + 112 + 202 + 213 + 100 + 114 + + + 43 + 207 + 111 + 202 + 213 + 100 + 114 + + + 43 + 203 + 109 + 202 + 213 + 100 + 114 + + + 43 + 205 + 102 + 202 + 213 + 100 + 114 + + + 43 + 211 + 103 + 202 + 213 + 100 + 114 + + + 43 + 210 + 105 + 202 + 213 + 100 + 114 + + + 43 + 209 + 109 + 202 + 213 + 100 + 114 + + + 43 + 206 + 107 + 202 + 213 + 100 + 114 + + + 712 + 445 + 3370 + 443 + 448 + 3368 + 3372 + + + 793 + 441 + 3376 + 438 + 442 + 3376 + 3377 + + + 792 + 452 + 3376 + 451 + 456 + 3376 + 3378 + + + 792 + 454 + 3376 + 451 + 456 + 3376 + 3378 + + + 61 + 267 + 2963 + 267 + 271 + 2962 + 2973 + + + 61 + 267 + 2965 + 267 + 271 + 2962 + 2973 + + + 61 + 270 + 2964 + 267 + 271 + 2962 + 2973 + + + 61 + 269 + 2968 + 267 + 271 + 2962 + 2973 + + + 61 + 267 + 2971 + 267 + 271 + 2962 + 2973 + + + 61 + 271 + 2972 + 267 + 271 + 2962 + 2973 + + + 61 + 270 + 2973 + 267 + 271 + 2962 + 2973 + + + 271 + 276 + 2973 + 275 + 280 + 2968 + 2973 + + + 271 + 279 + 2970 + 275 + 280 + 2968 + 2973 + + + 271 + 276 + 2969 + 275 + 280 + 2968 + 2973 + + + 343 + 284 + 2963 + 282 + 286 + 2963 + 2971 + + + 343 + 283 + 2964 + 282 + 286 + 2963 + 2971 + + + 343 + 285 + 2966 + 282 + 286 + 2963 + 2971 + + + 343 + 283 + 2969 + 282 + 286 + 2963 + 2971 + + + 343 + 277 + 2959 + 276 + 283 + 2956 + 2962 + + + 343 + 280 + 2956 + 276 + 283 + 2956 + 2962 + + + 343 + 282 + 2958 + 276 + 283 + 2956 + 2962 + + + 343 + 278 + 2960 + 276 + 283 + 2956 + 2962 + + + 343 + 281 + 2961 + 276 + 283 + 2956 + 2962 + + + 344 + 268 + 2954 + 265 + 273 + 2947 + 2956 + + + 344 + 272 + 2953 + 265 + 273 + 2947 + 2956 + + + 344 + 269 + 2949 + 265 + 273 + 2947 + 2956 + + + 344 + 265 + 2950 + 265 + 273 + 2947 + 2956 + + + 343 + 272 + 2949 + 265 + 273 + 2947 + 2956 + + + 343 + 271 + 2954 + 265 + 273 + 2947 + 2956 + + + 243 + 113 + 134 + 108 + 142 + 121 + 136 + + + 243 + 118 + 124 + 108 + 142 + 121 + 136 + + + 243 + 129 + 129 + 108 + 142 + 121 + 136 + + + 243 + 139 + 123 + 108 + 142 + 121 + 136 + + + 243 + 139 + 132 + 108 + 142 + 121 + 136 + + + 136 + 120 + 108 + 113 + 142 + 103 + 119 + + + 136 + 127 + 115 + 113 + 142 + 103 + 119 + + + 136 + 133 + 112 + 113 + 142 + 103 + 119 + + + 136 + 139 + 114 + 113 + 142 + 103 + 119 + + + 136 + 139 + 109 + 113 + 142 + 103 + 119 + + + 136 + 127 + 109 + 113 + 142 + 103 + 119 + + + 342 + 79 + 106 + 75 + 79 + 104 + 106 + + + 342 + 78 + 105 + 75 + 79 + 104 + 106 + + + 342 + 76 + 105 + 75 + 79 + 104 + 106 + + + 342 + 76 + 106 + 75 + 79 + 104 + 106 + + + 48 + 116 + 503 + 113 + 119 + 498 + 505 + + + 11 + 104 + 529 + 102 + 117 + 517 + 531 + + + 11 + 111 + 522 + 102 + 117 + 517 + 531 + + + 21 + 116 + 517 + 102 + 117 + 517 + 531 + + + 54 + 102 + 523 + 101 + 103 + 522 + 525 + + + 11 + 100 + 526 + 96 + 101 + 519 + 527 + + + 21 + 97 + 521 + 96 + 101 + 519 + 527 + + + 503 + 94 + 521 + 94 + 95 + 521 + 522 + + + 309 + 84 + 523 + 82 + 85 + 521 + 523 + + + 501 + 84 + 525 + 82 + 85 + 524 + 526 + + + 47 + 94 + 533 + 93 + 95 + 531 + 535 + + + 488 + 84 + 534 + 83 + 86 + 532 + 535 + + + + 95 + 339 + 705 + 339 + 340 + 704 + 707 + + + + 130 + 136 + 524 + 133 + 138 + 522 + 527 + + + 56 + 137 + 526 + 133 + 138 + 522 + 527 + + + 11 + 127 + 524 + 122 + 132 + 520 + 526 + + + 25 + 122 + 521 + 122 + 126 + 520 + 526 + + + 12 + 118 + 524 + 116 + 119 + 520 + 526 + + + 65 + 132 + 537 + 129 + 133 + 534 + 539 + + + 65 + 129 + 537 + 129 + 133 + 534 + 539 + + + 35 + 110 + 549 + 107 + 114 + 549 + 554 + + + 63 + 115 + 564 + 113 + 125 + 559 + 573 + + + 2 + 107 + 564 + 93 + 109 + 563 + 570 + + + 2 + 103 + 568 + 93 + 109 + 563 + 570 + + + 2 + 97 + 567 + 93 + 109 + 563 + 570 + + + 2 + 98 + 563 + 93 + 109 + 563 + 570 + + + 4 + 93 + 576 + 93 + 101 + 571 + 581 + + + 11 + 98 + 579 + 93 + 101 + 571 + 581 + + + 3 + 560 + 494 + 555 + 565 + 485 + 500 + + + 3 + 559 + 494 + 555 + 565 + 484 + 501 + + + 3 + 561 + 494 + 554 + 562 + 488 + 495 + + + 3 + 560 + 492 + 555 + 565 + 485 + 500 + + + 3 + 121 + 603 + 116 + 122 + 603 + 606 + + + 3 + 120 + 603 + 116 + 122 + 603 + 606 + + + 3 + 119 + 603 + 116 + 122 + 603 + 606 + + + 3 + 118 + 603 + 116 + 122 + 603 + 606 + + + 3 + 117 + 603 + 116 + 122 + 603 + 606 + + + 3 + 121 + 604 + 116 + 122 + 603 + 606 + + + 3 + 120 + 604 + 116 + 122 + 603 + 606 + + + 3 + 119 + 604 + 116 + 122 + 603 + 606 + + + 3 + 118 + 604 + 116 + 122 + 603 + 606 + + + 3 + 117 + 604 + 116 + 122 + 603 + 606 + + + 63 + 120 + 609 + 115 + 122 + 603 + 612 + + + 6 + 104 + 608 + 94 + 104 + 605 + 628 + + + 6 + 97 + 608 + 94 + 104 + 605 + 628 + + + 6 + 102 + 616 + 94 + 104 + 605 + 628 + + + 6 + 96 + 614 + 94 + 104 + 605 + 628 + + + 6 + 95 + 620 + 94 + 104 + 605 + 628 + + + 6 + 101 + 622 + 94 + 104 + 605 + 628 + + + 6 + 101 + 627 + 94 + 104 + 605 + 628 + + + 6 + 96 + 626 + 94 + 104 + 605 + 628 + + + 62 + 110 + 638 + 108 + 120 + 622 + 640 + + + 62 + 116 + 638 + 108 + 120 + 622 + 640 + + + 62 + 117 + 631 + 108 + 120 + 622 + 640 + + + 62 + 116 + 629 + 108 + 120 + 622 + 640 + + + 62 + 120 + 634 + 108 + 120 + 622 + 640 + + + 62 + 111 + 631 + 108 + 120 + 622 + 640 + + + 161 + 92 + 650 + 92 + 94 + 647 + 652 + + + 161 + 91 + 649 + 89 + 91 + 647 + 652 + + + 9 + 113 + 667 + 109 + 113 + 660 + 669 + + + 1 + 124 + 669 + 122 + 124 + 666 + 670 + + + 11 + 115 + 653 + 112 + 116 + 646 + 659 + + + 62 + 123 + 663 + 120 + 128 + 652 + 665 + + + 11 + 126 + 659 + 120 + 128 + 652 + 665 + + + 11 + 122 + 656 + 120 + 128 + 652 + 665 + + + 29 + 125 + 665 + 120 + 128 + 652 + 665 + + + 114 + 127 + 659 + 120 + 128 + 652 + 665 + + + 7 + 135 + 661 + 131 + 137 + 659 + 665 + + + 29 + 140 + 667 + 137 + 140 + 665 + 668 + + + 29 + 137 + 666 + 137 + 140 + 665 + 668 + + + 198 + 130 + 1601 + 129 + 133 + 1601 + 1606 + + + 11 + 135 + 1599 + 134 + 137 + 1596 + 1606 + + + 11 + 135 + 652 + 131 + 137 + 651 + 658 + + + 5 + 132 + 655 + 131 + 137 + 651 + 658 + + + 114 + 131 + 652 + 131 + 137 + 651 + 658 + + + 11 + 123 + 647 + 121 + 133 + 637 + 649 + + + 55 + 136 + 642 + 133 + 136 + 641 + 642 + + + 83 + 136 + 641 + 133 + 136 + 641 + 642 + + + 2 + 155 + 619 + 136 + 156 + 618 + 633 + + + 2 + 151 + 621 + 136 + 156 + 618 + 633 + + + 2 + 153 + 629 + 136 + 156 + 618 + 633 + + + 2 + 145 + 630 + 136 + 156 + 618 + 633 + + + 2 + 144 + 626 + 136 + 156 + 618 + 633 + + + 2 + 144 + 621 + 136 + 156 + 618 + 633 + + + 2 + 146 + 618 + 136 + 156 + 618 + 633 + + + 2 + 140 + 620 + 136 + 156 + 618 + 633 + + + 2 + 139 + 623 + 136 + 156 + 618 + 633 + + + 2 + 140 + 626 + 136 + 156 + 618 + 633 + + + 2 + 138 + 633 + 136 + 156 + 618 + 633 + + + 2 + 145 + 629 + 136 + 156 + 618 + 633 + + + 2 + 147 + 623 + 136 + 156 + 618 + 633 + + + 2 + 152 + 618 + 136 + 156 + 618 + 633 + + + 2 + 153 + 621 + 136 + 156 + 618 + 633 + + + 77 + 159 + 618 + 157 + 161 + 617 + 620 + + + 3 + 157 + 616 + 157 + 161 + 615 + 620 + + + 3 + 158 + 616 + 157 + 161 + 615 + 620 + + + 3 + 159 + 616 + 157 + 161 + 615 + 620 + + + 3 + 160 + 616 + 157 + 161 + 615 + 620 + + + 3 + 161 + 616 + 157 + 161 + 615 + 620 + + + 3 + 157 + 615 + 157 + 161 + 615 + 620 + + + 3 + 158 + 615 + 157 + 161 + 615 + 620 + + + 3 + 159 + 615 + 157 + 161 + 615 + 620 + + + 4 + 172 + 615 + 166 + 175 + 613 + 622 + + + 63 + 185 + 608 + 180 + 190 + 604 + 621 + + + 123 + 197 + 641 + 194 + 198 + 637 + 642 + + + 121 + 195 + 640 + 194 + 198 + 637 + 642 + + + 118 + 200 + 640 + 199 + 203 + 639 + 642 + + + 127 + 200 + 631 + 194 + 203 + 629 + 636 + + + 127 + 195 + 632 + 194 + 203 + 629 + 636 + + + 127 + 194 + 634 + 194 + 203 + 629 + 636 + + + 127 + 197 + 634 + 194 + 203 + 629 + 636 + + + 127 + 201 + 634 + 194 + 203 + 629 + 636 + + + 122 + 206 + 626 + 203 + 212 + 624 + 631 + + + 95 + 218 + 635 + 216 + 223 + 634 + 638 + + + 95 + 220 + 637 + 216 + 223 + 634 + 638 + + + 95 + 222 + 635 + 216 + 223 + 634 + 638 + + + 226 + 227 + 632 + 225 + 228 + 632 + 635 + + + 225 + 229 + 631 + 229 + 232 + 630 + 633 + + + 227 + 228 + 628 + 226 + 229 + 627 + 630 + + + 57 + 229 + 640 + 225 + 231 + 640 + 644 + + + 57 + 226 + 640 + 225 + 231 + 640 + 644 + + + 66 + 224 + 649 + 216 + 230 + 640 + 653 + + + 299 + 429 + 484 + 427 + 430 + 481 + 485 + + + 778 + 604 + 744 + 601 + 606 + 742 + 745 + + + 347 + 604 + 744 + 601 + 606 + 742 + 745 + + + 11 + 603 + 745 + 601 + 606 + 742 + 745 + + + 95 + 587 + 757 + 585 + 590 + 750 + 758 + + + 95 + 589 + 753 + 585 + 590 + 750 + 758 + + + 95 + 586 + 751 + 585 + 590 + 750 + 758 + + + 341 + 583 + 563 + 582 + 585 + 561 + 565 + + + 95 + 583 + 573 + 577 + 585 + 572 + 576 + + + 95 + 582 + 576 + 577 + 585 + 572 + 576 + + + 95 + 580 + 574 + 577 + 585 + 572 + 576 + + + 95 + 578 + 572 + 577 + 585 + 572 + 576 + + + 368 + 586 + 526 + 582 + 588 + 524 + 527 + + + 371 + 600 + 517 + 599 + 600 + 516 + 518 + + + 369 + 603 + 504 + 602 + 605 + 501 + 504 + + + 370 + 604 + 501 + 602 + 605 + 501 + 504 + + + 95 + 282 + 566 + 280 + 286 + 564 + 573 + + + 95 + 285 + 570 + 280 + 286 + 564 + 573 + + + 95 + 284 + 573 + 280 + 286 + 564 + 573 + + + 95 + 333 + 555 + 328 + 334 + 549 + 557 + + + 95 + 331 + 551 + 328 + 334 + 549 + 557 + + + 95 + 213 + 451 + 212 + 220 + 448 + 453 + + + 95 + 219 + 450 + 212 + 220 + 448 + 453 + + + 95 + 218 + 449 + 212 + 220 + 448 + 453 + + + 95 + 215 + 451 + 212 + 220 + 448 + 453 + + + 268 + 87 + 694 + 87 + 93 + 689 + 700 + + + 268 + 90 + 690 + 87 + 93 + 689 + 700 + + + 268 + 92 + 699 + 87 + 93 + 689 + 700 + + + 106 + 319 + 531 + 317 + 322 + 530 + 536 + + + 105 + 320 + 535 + 317 + 322 + 530 + 536 + + + 191 + 274 + 565 + 272 + 277 + 563 + 567 + + + 191 + 268 + 3379 + 265 + 270 + 3379 + 3380 + + + 172 + 84 + 676 + 83 + 85 + 673 + 677 + + + 72 + 84 + 674 + 83 + 85 + 673 + 677 + + + 339 + 371 + 580 + 368 + 372 + 578 + 581 + + + 160 + 104 + 520 + 102 + 106 + 518 + 521 + + + 173 + 51 + 675 + 49 + 52 + 673 + 677 + + + 95 + 503 + 449 + 498 + 504 + 447 + 453 + + + 95 + 499 + 449 + 498 + 504 + 447 + 453 + + + 95 + 500 + 451 + 498 + 504 + 447 + 453 + + + 95 + 502 + 451 + 498 + 504 + 447 + 453 + + + 318 + 517 + 459 + 515 + 518 + 459 + 461 + + + 301 + 524 + 463 + 522 + 525 + 462 + 467 + + + 318 + 520 + 451 + 519 + 526 + 448 + 454 + + + 306 + 524 + 451 + 519 + 526 + 448 + 454 + + + 318 + 497 + 457 + 495 + 526 + 455 + 463 + + + 318 + 511 + 455 + 495 + 526 + 455 + 463 + + + 282 + 448 + 492 + 448 + 450 + 492 + 493 + + + 95 + 438 + 494 + 437 + 443 + 491 + 496 + + + 95 + 441 + 495 + 437 + 443 + 491 + 496 + + + 95 + 441 + 491 + 437 + 443 + 491 + 496 + + + 11 + 433 + 491 + 432 + 435 + 490 + 493 + + + 310 + 433 + 483 + 432 + 436 + 480 + 485 + + + 289 + 427 + 489 + 425 + 429 + 487 + 491 + + + 250 + 418 + 487 + 416 + 421 + 484 + 488 + + + 149 + 273 + 632 + 271 + 274 + 630 + 634 + + + 131 + 265 + 629 + 262 + 267 + 626 + 632 + + + 129 + 275 + 658 + 273 + 276 + 655 + 659 + + + 167 + 279 + 647 + 276 + 280 + 646 + 650 + + + 157 + 279 + 632 + 277 + 280 + 630 + 634 + + + 64 + 275 + 640 + 275 + 278 + 637 + 640 + + + 64 + 277 + 638 + 275 + 278 + 637 + 640 + + + 528 + 652 + 536 + 651 + 653 + 534 + 539 + + + 115 + 327 + 539 + 327 + 328 + 537 + 540 + + + 141 + 301 + 578 + 300 + 306 + 577 + 580 + + + 172 + 345 + 1554 + 343 + 346 + 1551 + 1557 + + + 69 + 140 + 504 + 138 + 142 + 503 + 506 + + + 59 + 137 + 516 + 135 + 139 + 515 + 517 + + + 0 + 225 + 485 + 213 + 238 + 478 + 492 + + + 75 + 235 + 508 + 233 + 239 + 507 + 512 + + + 78 + 235 + 495 + 227 + 241 + 492 + 511 + + + 76 + 230 + 522 + 227 + 230 + 521 + 523 + + + 76 + 230 + 509 + 225 + 243 + 501 + 520 + + + 76 + 237 + 515 + 227 + 245 + 511 + 525 + + + 76 + 232 + 495 + 230 + 235 + 495 + 502 + + + 76 + 233 + 506 + 225 + 245 + 491 + 522 + + + 76 + 233 + 502 + 225 + 239 + 491 + 513 + + + 76 + 232 + 502 + 225 + 239 + 491 + 513 + + + 76 + 228 + 494 + 224 + 240 + 492 + 518 + + + 76 + 236 + 519 + 225 + 243 + 510 + 525 + + + 76 + 232 + 501 + 230 + 235 + 495 + 502 + + + 6 + 352 + 610 + 350 + 358 + 601 + 616 + + + 6 + 350 + 612 + 350 + 358 + 601 + 616 + + + 6 + 352 + 606 + 350 + 358 + 601 + 616 + + + 6 + 351 + 603 + 350 + 358 + 601 + 616 + + + 6 + 354 + 603 + 350 + 358 + 601 + 616 + + + 6 + 350 + 612 + 344 + 354 + 608 + 616 + + + 6 + 344 + 615 + 344 + 354 + 608 + 616 + + + 6 + 349 + 616 + 344 + 354 + 608 + 616 + + + 231 + 348 + 606 + 341 + 349 + 599 + 612 + + + 67 + 364 + 605 + 361 + 367 + 601 + 613 + + + 67 + 363 + 603 + 361 + 367 + 601 + 613 + + + 67 + 362 + 609 + 361 + 367 + 601 + 613 + + + 67 + 366 + 605 + 361 + 367 + 601 + 613 + + + 2 + 342 + 584 + 336 + 353 + 581 + 593 + + + 2 + 347 + 583 + 336 + 353 + 581 + 593 + + + 2 + 347 + 586 + 336 + 353 + 581 + 593 + + + + 136 + 268 + 3370 + 258 + 276 + 3361 + 3380 + + + 136 + 264 + 3373 + 258 + 276 + 3361 + 3380 + + + 70 + 269 + 3369 + 258 + 276 + 3361 + 3380 + + + 70 + 264 + 3369 + 258 + 276 + 3361 + 3380 + + + 70 + 265 + 3364 + 260 + 272 + 3360 + 3370 + + + 70 + 268 + 3362 + 263 + 272 + 3351 + 3365 + + + 70 + 268 + 3358 + 263 + 272 + 3351 + 3365 + + + 70 + 268 + 3353 + 263 + 272 + 3351 + 3361 + + + 70 + 271 + 3350 + 259 + 271 + 3340 + 3350 + + + 65 + 291 + 581 + 285 + 294 + 575 + 583 + + + 65 + 290 + 580 + 285 + 294 + 575 + 583 + + + 65 + 312 + 539 + 310 + 317 + 536 + 544 + + + 65 + 313 + 541 + 310 + 317 + 536 + 544 + + + 65 + 315 + 539 + 310 + 317 + 536 + 544 + + + 65 + 314 + 521 + 312 + 319 + 519 + 524 + + + 65 + 316 + 521 + 312 + 319 + 519 + 524 + + + 65 + 326 + 546 + 324 + 331 + 543 + 548 + + + 11 + 308 + 523 + 304 + 314 + 521 + 528 + + + 11 + 310 + 523 + 304 + 314 + 521 + 528 + + + 11 + 309 + 544 + 304 + 319 + 536 + 552 + + + 11 + 305 + 539 + 304 + 319 + 536 + 552 + + + 11 + 310 + 548 + 304 + 319 + 536 + 552 + + + 102 + 317 + 563 + 288 + 337 + 521 + 577 + + + 102 + 298 + 525 + 288 + 337 + 521 + 577 + + + 102 + 329 + 532 + 288 + 337 + 521 + 577 + + + 102 + 323 + 553 + 288 + 337 + 521 + 577 + + + 102 + 298 + 570 + 279 + 309 + 558 + 589 + + + 102 + 327 + 512 + 299 + 337 + 507 + 524 + + + 116 + 293 + 549 + 285 + 296 + 545 + 551 + + + 101 + 309 + 533 + 307 + 312 + 529 + 535 + + + 142 + 321 + 549 + 316 + 322 + 544 + 550 + + + 142 + 320 + 1491 + 316 + 322 + 1488 + 1494 + + + 155 + 332 + 567 + 331 + 334 + 565 + 569 + + + 114 + 310 + 548 + 300 + 336 + 537 + 577 + + + 114 + 323 + 566 + 300 + 336 + 537 + 577 + + + 3 + 313 + 564 + 304 + 319 + 563 + 570 + + + 132 + 311 + 568 + 306 + 315 + 567 + 571 + + + 110 + 304 + 1507 + 301 + 314 + 1503 + 1510 + + + 138 + 319 + 2456 + 316 + 320 + 2454 + 2459 + + + 228 + 379 + 501 + 377 + 381 + 500 + 503 + + + 230 + 369 + 506 + 366 + 370 + 504 + 508 + + + 773 + 293 + 3329 + 289 + 296 + 3327 + 3334 + + + 143 + 294 + 3339 + 289 + 295 + 3337 + 3342 + + + 308 + 81 + 663 + 79 + 83 + 660 + 663 + + + 84 + 77 + 676 + 74 + 78 + 674 + 678 + + + 87 + 55 + 683 + 54 + 58 + 679 + 684 + + + 88 + 55 + 679 + 54 + 58 + 679 + 684 + + + 85 + 55 + 686 + 54 + 57 + 685 + 688 + + + 103 + 54 + 694 + 53 + 56 + 693 + 696 + + + 90 + 88 + 684 + 85 + 88 + 682 + 685 + + + 165 + 347 + 714 + 344 + 349 + 712 + 715 + + + 168 + 360 + 715 + 358 + 364 + 712 + 716 + + + 169 + 363 + 714 + 358 + 364 + 712 + 716 + + + 331 + 556 + 603 + 554 + 557 + 600 + 605 + + + 330 + 551 + 598 + 549 + 553 + 597 + 602 + + + 328 + 554 + 594 + 553 + 558 + 592 + 595 + + + 325 + 546 + 599 + 543 + 546 + 597 + 602 + + + 329 + 546 + 591 + 542 + 547 + 588 + 593 + + + 514 + 600 + 1703 + 599 + 601 + 1703 + 1705 + + + 522 + 459 + 754 + 453 + 462 + 750 + 760 + + + 617 + 401 + 851 + 399 + 404 + 848 + 854 + + + 617 + 402 + 849 + 399 + 404 + 848 + 854 + + + 617 + 400 + 853 + 399 + 404 + 848 + 854 + + + 620 + 418 + 847 + 415 + 420 + 846 + 849 + + + + 186 + 223 + 441 + 222 + 227 + 439 + 443 + + + 185 + 225 + 441 + 222 + 227 + 439 + 443 + + + 174 + 252 + 467 + 249 + 252 + 458 + 468 + + + 204 + 362 + 459 + 355 + 369 + 455 + 469 + + + 200 + 365 + 460 + 355 + 369 + 455 + 469 + + + 200 + 361 + 461 + 355 + 369 + 455 + 469 + + + 200 + 360 + 464 + 355 + 369 + 455 + 469 + + + 200 + 364 + 464 + 355 + 369 + 455 + 469 + + + 200 + 366 + 466 + 355 + 369 + 455 + 469 + + + 200 + 374 + 506 + 358 + 384 + 480 + 513 + + + 200 + 380 + 494 + 358 + 384 + 480 + 513 + + + 200 + 369 + 493 + 358 + 384 + 480 + 513 + + + 200 + 379 + 488 + 358 + 384 + 480 + 513 + + + 200 + 370 + 489 + 358 + 384 + 480 + 513 + + + 200 + 374 + 497 + 358 + 384 + 480 + 513 + + + 200 + 364 + 505 + 358 + 384 + 480 + 513 + + + 4 + 359 + 500 + 358 + 384 + 480 + 513 + + + 86 + 66 + 687 + 63 + 81 + 685 + 692 + + + 86 + 65 + 690 + 63 + 81 + 685 + 692 + + + 86 + 70 + 689 + 63 + 81 + 685 + 692 + + + 86 + 74 + 688 + 63 + 81 + 685 + 692 + + + 86 + 79 + 690 + 63 + 81 + 685 + 692 + + + 86 + 79 + 687 + 63 + 81 + 685 + 692 + + + 29 + 318 + 450 + 308 + 342 + 439 + 465 + + + 29 + 321 + 441 + 308 + 342 + 439 + 465 + + + 29 + 329 + 448 + 308 + 342 + 439 + 465 + + + 29 + 329 + 454 + 308 + 342 + 439 + 465 + + + 29 + 317 + 456 + 308 + 342 + 439 + 465 + + + 154 + 327 + 449 + 308 + 342 + 439 + 465 + + + 154 + 318 + 452 + 308 + 342 + 439 + 465 + + + 154 + 314 + 443 + 308 + 342 + 439 + 465 + + + 154 + 329 + 443 + 308 + 342 + 439 + 465 + + + 154 + 332 + 456 + 308 + 342 + 439 + 465 + + + 154 + 325 + 458 + 308 + 342 + 439 + 465 + + + 154 + 313 + 453 + 308 + 342 + 439 + 465 + + + 153 + 332 + 456 + 308 + 342 + 439 + 465 + + + 153 + 318 + 455 + 308 + 342 + 439 + 465 + + + 153 + 332 + 448 + 308 + 342 + 439 + 465 + + + 153 + 322 + 440 + 308 + 342 + 439 + 465 + + + 153 + 319 + 446 + 308 + 342 + 439 + 465 + + + 114 + 222 + 466 + 200 + 232 + 430 + 475 + + + 114 + 225 + 449 + 200 + 232 + 430 + 475 + + + 65 + 208 + 434 + 200 + 210 + 430 + 439 + + + 65 + 202 + 435 + 200 + 210 + 430 + 439 + + + 65 + 207 + 434 + 200 + 210 + 430 + 439 + + + 65 + 208 + 436 + 200 + 210 + 430 + 439 + + + 11 + 215 + 444 + 208 + 218 + 440 + 446 + + + 11 + 211 + 444 + 208 + 218 + 440 + 446 + + + 11 + 216 + 441 + 208 + 218 + 440 + 446 + + + 11 + 212 + 441 + 208 + 218 + 440 + 446 + + + 23 + 219 + 3294 + 207 + 219 + 3287 + 3301 + + + 47 + 206 + 3286 + 204 + 211 + 3282 + 3288 + + + 47 + 209 + 3285 + 204 + 211 + 3282 + 3288 + + + 47 + 208 + 3287 + 204 + 211 + 3282 + 3288 + + + 40 + 217 + 3281 + 213 + 219 + 3277 + 3293 + + + 40 + 217 + 3288 + 213 + 219 + 3277 + 3293 + + + 47 + 220 + 3281 + 219 + 223 + 3279 + 3283 + + + 40 + 222 + 3280 + 219 + 223 + 3279 + 3283 + + + 40 + 216 + 3273 + 200 + 218 + 3270 + 3278 + + + 40 + 212 + 3273 + 200 + 218 + 3270 + 3278 + + + 40 + 215 + 3274 + 200 + 218 + 3270 + 3278 + + + 46 + 197 + 3274 + 190 + 202 + 3266 + 3277 + + + 46 + 197 + 3270 + 190 + 202 + 3266 + 3277 + + + 46 + 194 + 3274 + 190 + 202 + 3266 + 3277 + + + 41 + 179 + 3291 + 178 + 192 + 3274 + 3298 + + + 41 + 181 + 3281 + 178 + 192 + 3274 + 3298 + + + 41 + 187 + 3282 + 178 + 192 + 3274 + 3298 + + + 41 + 185 + 3275 + 178 + 192 + 3274 + 3298 + + + 45 + 192 + 3300 + 180 + 200 + 3294 + 3302 + + + 45 + 190 + 3296 + 180 + 200 + 3294 + 3302 + + + 45 + 188 + 3300 + 180 + 200 + 3294 + 3302 + + + 67 + 201 + 3298 + 190 + 210 + 3293 + 3319 + + + 67 + 208 + 3301 + 190 + 210 + 3293 + 3319 + + + 67 + 206 + 3306 + 190 + 210 + 3293 + 3319 + + + 67 + 209 + 3310 + 190 + 210 + 3293 + 3319 + + + 67 + 209 + 3316 + 190 + 210 + 3293 + 3319 + + + 68 + 202 + 3305 + 196 + 208 + 3303 + 3308 + + + 68 + 198 + 3306 + 196 + 208 + 3303 + 3308 + + + 61 + 207 + 3329 + 199 + 212 + 3318 + 3335 + + + 61 + 208 + 3320 + 199 + 212 + 3318 + 3335 + + + 61 + 210 + 3322 + 199 + 212 + 3318 + 3335 + + + 61 + 207 + 3326 + 199 + 212 + 3318 + 3335 + + + 61 + 209 + 3330 + 199 + 212 + 3318 + 3335 + + + 61 + 203 + 3329 + 199 + 212 + 3318 + 3335 + + + 61 + 200 + 3332 + 199 + 212 + 3318 + 3335 + + + + 270 + 212 + 3254 + 207 + 219 + 3241 + 3257 + + + 270 + 216 + 3252 + 207 + 219 + 3241 + 3257 + + + 270 + 219 + 3247 + 207 + 219 + 3241 + 3257 + + + 270 + 218 + 3243 + 207 + 219 + 3241 + 3257 + + + 270 + 214 + 3245 + 207 + 219 + 3241 + 3257 + + + 270 + 212 + 3250 + 207 + 219 + 3241 + 3257 + + + 195 + 211 + 3230 + 211 + 219 + 3230 + 3240 + + + 195 + 213 + 3234 + 211 + 219 + 3230 + 3240 + + + 195 + 217 + 3236 + 211 + 219 + 3230 + 3240 + + + 195 + 218 + 3238 + 211 + 219 + 3230 + 3240 + + + 195 + 216 + 3239 + 211 + 219 + 3230 + 3240 + + + 195 + 219 + 3233 + 211 + 219 + 3230 + 3240 + + + 99 + 208 + 3233 + 198 + 210 + 3227 + 3241 + + + 99 + 203 + 3235 + 198 + 210 + 3227 + 3241 + + + 99 + 207 + 3238 + 198 + 210 + 3227 + 3241 + + + 99 + 204 + 3238 + 198 + 210 + 3227 + 3241 + + + 270 + 616 + 553 + 615 + 620 + 550 + 555 + + + 270 + 616 + 551 + 615 + 620 + 550 + 555 + + + 270 + 619 + 551 + 615 + 620 + 550 + 555 + + + 270 + 618 + 554 + 615 + 620 + 550 + 555 + + + 312 + 615 + 3400 + 610 + 618 + 3396 + 3402 + + + 312 + 613 + 3400 + 610 + 618 + 3396 + 3402 + + + 312 + 611 + 3399 + 610 + 618 + 3396 + 3402 + + + 312 + 617 + 3398 + 610 + 618 + 3396 + 3402 + + + 312 + 615 + 3402 + 610 + 618 + 3396 + 3402 + + + 312 + 612 + 3402 + 610 + 618 + 3396 + 3402 + + + 43 + 595 + 3592 + 591 + 596 + 3590 + 3597 + + + 43 + 593 + 3596 + 591 + 596 + 3590 + 3597 + + + 270 + 584 + 3584 + 578 + 590 + 3581 + 3589 + + + 270 + 581 + 3583 + 578 + 590 + 3581 + 3589 + + + 270 + 581 + 3587 + 578 + 590 + 3581 + 3589 + + + 270 + 584 + 3587 + 578 + 590 + 3581 + 3589 + + + 270 + 584 + 3585 + 578 + 590 + 3581 + 3589 + + + 43 + 602 + 3552 + 600 + 606 + 3552 + 3557 + + + 43 + 605 + 3553 + 600 + 606 + 3552 + 3557 + + + 134 + 291 + 713 + 279 + 295 + 704 + 718 + + + 21 + 284 + 3544 + 278 + 286 + 3531 + 3545 + + + 21 + 284 + 3540 + 278 + 286 + 3531 + 3545 + + + 21 + 281 + 3542 + 278 + 286 + 3531 + 3545 + + + 137 + 281 + 3521 + 275 + 285 + 3516 + 3531 + + + 137 + 277 + 3522 + 275 + 285 + 3516 + 3531 + + + 137 + 281 + 3524 + 275 + 285 + 3516 + 3531 + + + 137 + 277 + 3526 + 275 + 285 + 3516 + 3531 + + + 137 + 280 + 3526 + 275 + 285 + 3516 + 3531 + + + 137 + 279 + 3529 + 275 + 285 + 3516 + 3531 + + + 67 + 292 + 3515 + 278 + 300 + 3513 + 3524 + + + 67 + 291 + 3522 + 278 + 300 + 3513 + 3524 + + + 67 + 279 + 3516 + 278 + 300 + 3513 + 3524 + + + 67 + 286 + 3522 + 278 + 300 + 3513 + 3524 + + + 67 + 282 + 3520 + 278 + 300 + 3513 + 3524 + + + 158 + 306 + 3515 + 296 + 316 + 3513 + 3528 + + + 158 + 301 + 3516 + 296 + 316 + 3513 + 3528 + + + 158 + 304 + 3520 + 296 + 316 + 3513 + 3528 + + + 158 + 300 + 3520 + 296 + 316 + 3513 + 3528 + + + 158 + 298 + 3518 + 296 + 316 + 3513 + 3528 + + + 135 + 312 + 3522 + 306 + 316 + 3513 + 3528 + + + 135 + 309 + 3526 + 306 + 316 + 3513 + 3528 + + + 135 + 311 + 3520 + 306 + 316 + 3513 + 3528 + + + 57 + 103 + 547 + 102 + 119 + 542 + 559 + + + 57 + 109 + 545 + 102 + 119 + 542 + 559 + + + 57 + 113 + 549 + 102 + 119 + 542 + 559 + + + 57 + 116 + 550 + 102 + 119 + 542 + 559 + + + 57 + 116 + 554 + 102 + 119 + 542 + 559 + + + 57 + 113 + 557 + 102 + 119 + 542 + 559 + + + 57 + 108 + 557 + 102 + 119 + 542 + 559 + + + 60 + 105 + 557 + 102 + 119 + 542 + 559 + + + 60 + 117 + 556 + 102 + 119 + 542 + 559 + + + 60 + 118 + 553 + 102 + 119 + 542 + 559 + + + 46 + 376 + 3336 + 374 + 378 + 3334 + 3345 + + + 46 + 377 + 3340 + 374 + 378 + 3334 + 3345 + + + 46 + 376 + 3343 + 374 + 378 + 3334 + 3345 + + + 206 + 374 + 3333 + 374 + 374 + 3333 + 3333 + + + 206 + 374 + 3331 + 374 + 374 + 3331 + 3331 + + + 53 + 358 + 3340 + 344 + 370 + 3336 + 3347 + + + 53 + 365 + 3340 + 344 + 370 + 3336 + 3347 + + + 43 + 358 + 3330 + 353 + 366 + 3321 + 3335 + + + 43 + 355 + 3331 + 353 + 366 + 3321 + 3335 + + + 43 + 355 + 3333 + 353 + 366 + 3321 + 3335 + + + 43 + 357 + 3333 + 353 + 366 + 3321 + 3335 + + + 43 + 360 + 3331 + 353 + 366 + 3321 + 3335 + + + 53 + 359 + 3319 + 345 + 365 + 3318 + 3332 + + + 53 + 349 + 3321 + 345 + 365 + 3318 + 3332 + + + 53 + 348 + 3329 + 345 + 365 + 3318 + 3332 + + + 270 + 345 + 3315 + 341 + 348 + 3314 + 3321 + + + 270 + 342 + 3317 + 341 + 348 + 3314 + 3321 + + + 270 + 344 + 3319 + 341 + 348 + 3314 + 3321 + + + 270 + 345 + 3318 + 341 + 348 + 3314 + 3321 + + + 270 + 346 + 3317 + 341 + 348 + 3314 + 3321 + + + 189 + 342 + 3354 + 336 + 357 + 3335 + 3363 + + + 189 + 346 + 3344 + 336 + 357 + 3335 + 3363 + + + 189 + 355 + 3340 + 336 + 357 + 3335 + 3363 + + + 295 + 330 + 3363 + 325 + 342 + 3361 + 3374 + + + 295 + 328 + 3366 + 325 + 342 + 3361 + 3374 + + + 295 + 329 + 3371 + 325 + 342 + 3361 + 3374 + + + 295 + 341 + 3365 + 325 + 342 + 3361 + 3374 + + + 271 + 344 + 3379 + 339 + 356 + 3362 + 3388 + + + 271 + 355 + 3376 + 339 + 356 + 3362 + 3388 + + + 271 + 349 + 3371 + 339 + 356 + 3362 + 3388 + + + 271 + 351 + 3375 + 339 + 356 + 3362 + 3388 + + + 271 + 342 + 3364 + 339 + 356 + 3362 + 3388 + + + 271 + 351 + 3370 + 339 + 356 + 3362 + 3388 + + + 189 + 356 + 3426 + 341 + 362 + 3391 + 3436 + + + 189 + 351 + 3433 + 341 + 362 + 3391 + 3436 + + + 189 + 348 + 3400 + 341 + 362 + 3391 + 3436 + + + 189 + 346 + 3433 + 341 + 362 + 3391 + 3436 + + + 189 + 346 + 3426 + 341 + 362 + 3391 + 3436 + + + 189 + 350 + 3426 + 341 + 362 + 3391 + 3436 + + + 189 + 349 + 3418 + 341 + 362 + 3391 + 3436 + + + 189 + 343 + 3419 + 341 + 362 + 3391 + 3436 + + + 189 + 353 + 3412 + 341 + 362 + 3391 + 3436 + + + 189 + 343 + 3413 + 341 + 362 + 3391 + 3436 + + + 189 + 353 + 3418 + 341 + 362 + 3391 + 3436 + + + 265 + 358 + 3426 + 356 + 362 + 3425 + 3427 + + + 94 + 359 + 3423 + 359 + 362 + 3422 + 3424 + + + 94 + 361 + 3423 + 359 + 362 + 3422 + 3424 + + + 272 + 361 + 3428 + 359 + 362 + 3428 + 3430 + + + 29 + 361 + 3429 + 359 + 362 + 3428 + 3430 + + + 29 + 357 + 3427 + 341 + 362 + 3391 + 3436 + + + 29 + 345 + 3426 + 341 + 362 + 3391 + 3436 + + + 29 + 353 + 3420 + 341 + 362 + 3391 + 3436 + + + 266 + 348 + 3431 + 341 + 355 + 3422 + 3436 + + + 22 + 349 + 3353 + 344 + 354 + 3350 + 3363 + + + 22 + 350 + 3357 + 344 + 354 + 3350 + 3363 + + + 22 + 346 + 3359 + 344 + 354 + 3350 + 3363 + + + 22 + 349 + 3353 + 344 + 354 + 3350 + 3363 + + + 22 + 351 + 3357 + 344 + 354 + 3350 + 3363 + + + 19 + 92 + 3302 + 90 + 122 + 3297 + 3308 + + + 19 + 107 + 3300 + 90 + 122 + 3297 + 3308 + + + 19 + 119 + 3305 + 90 + 122 + 3297 + 3308 + + + 29 + 113 + 3306 + 90 + 122 + 3297 + 3308 + + + 29 + 116 + 3306 + 90 + 122 + 3297 + 3308 + + + 29 + 117 + 3297 + 90 + 122 + 3297 + 3308 + + + 52 + 108 + 3290 + 95 + 109 + 3283 + 3296 + + + 52 + 106 + 3288 + 95 + 109 + 3283 + 3296 + + + 70 + 101 + 3281 + 99 + 106 + 3279 + 3283 + + + 70 + 104 + 3282 + 99 + 106 + 3279 + 3283 + + + 47 + 89 + 3289 + 88 + 94 + 3284 + 3292 + + + 47 + 92 + 3289 + 88 + 94 + 3284 + 3292 + + + 40 + 106 + 3276 + 90 + 108 + 3274 + 3280 + + + 40 + 102 + 3275 + 90 + 108 + 3274 + 3280 + + + 40 + 92 + 3277 + 90 + 108 + 3274 + 3280 + + + 53 + 115 + 3276 + 109 + 120 + 3272 + 3283 + + + 53 + 113 + 3275 + 109 + 120 + 3272 + 3283 + + + 53 + 110 + 3276 + 109 + 120 + 3272 + 3283 + + + 41 + 122 + 3292 + 116 + 128 + 3280 + 3295 + + + 41 + 125 + 3291 + 116 + 128 + 3280 + 3295 + + + 41 + 126 + 3286 + 116 + 128 + 3280 + 3295 + + + 41 + 121 + 3285 + 116 + 128 + 3280 + 3295 + + + 45 + 137 + 3286 + 129 + 141 + 3283 + 3289 + + + 45 + 136 + 3285 + 129 + 141 + 3283 + 3289 + + + 34 + 144 + 3295 + 134 + 150 + 3290 + 3300 + + + 34 + 141 + 3295 + 134 + 150 + 3290 + 3300 + + + 34 + 137 + 3295 + 134 + 150 + 3290 + 3300 + + + 74 + 149 + 3297 + 134 + 150 + 3290 + 3300 + + + 99 + 159 + 3294 + 143 + 161 + 3290 + 3301 + + + 99 + 158 + 3299 + 143 + 161 + 3290 + 3301 + + + 99 + 153 + 3292 + 143 + 161 + 3290 + 3301 + + + 99 + 152 + 3297 + 143 + 161 + 3290 + 3301 + + + 99 + 148 + 3297 + 143 + 161 + 3290 + 3301 + + + 104 + 162 + 3304 + 159 + 164 + 3300 + 3306 + + + 104 + 164 + 3289 + 160 + 166 + 3287 + 3294 + + + 280 + 440 + 502 + 439 + 441 + 502 + 507 + + + 113 + 268 + 3329 + 267 + 271 + 3327 + 3331 + + + 34 + 137 + 3490 + 135 + 141 + 3488 + 3493 + + + 34 + 140 + 3491 + 135 + 141 + 3488 + 3493 + + + 34 + 138 + 3492 + 135 + 141 + 3488 + 3493 + + + 519 + 640 + 753 + 635 + 646 + 744 + 767 + + + 519 + 640 + 755 + 635 + 646 + 744 + 767 + + + 519 + 639 + 756 + 635 + 646 + 744 + 767 + + + 519 + 639 + 753 + 635 + 646 + 744 + 767 + + + 519 + 642 + 754 + 635 + 646 + 744 + 767 + + + 519 + 642 + 753 + 635 + 646 + 744 + 767 + + + 518 + 645 + 754 + 635 + 646 + 744 + 767 + + + 321 + 131 + 483 + 125 + 139 + 480 + 486 + + + 321 + 134 + 483 + 125 + 139 + 480 + 486 + + + 321 + 131 + 485 + 125 + 139 + 480 + 486 + + + 159 + 139 + 464 + 137 + 141 + 457 + 465 + + + 159 + 140 + 464 + 137 + 141 + 457 + 465 + + + 65 + 140 + 453 + 138 + 142 + 451 + 458 + + + 65 + 141 + 1396 + 138 + 142 + 1395 + 1407 + + + 65 + 139 + 1397 + 138 + 142 + 1395 + 1407 + + + 65 + 141 + 1400 + 138 + 142 + 1395 + 1407 + + + 65 + 139 + 1403 + 138 + 142 + 1395 + 1407 + + + 65 + 138 + 1405 + 138 + 142 + 1395 + 1407 + + + 18 + 138 + 1406 + 138 + 142 + 1395 + 1407 + + + 0 + 451 + 462 + 435 + 466 + 454 + 481 + + + 0 + 448 + 460 + 435 + 466 + 454 + 481 + + + 0 + 519 + 493 + 513 + 529 + 487 + 504 + + + 0 + 521 + 493 + 513 + 529 + 487 + 504 + + + 3 + 273 + 601 + 269 + 275 + 600 + 607 + + + 3 + 271 + 601 + 269 + 275 + 600 + 607 + + + 3 + 271 + 604 + 269 + 275 + 600 + 607 + + + 3 + 273 + 604 + 269 + 275 + 600 + 607 + + + 3 + 272 + 605 + 269 + 275 + 600 + 607 + + + 3 + 270 + 606 + 269 + 275 + 600 + 607 + + + 4 + 620 + 493 + 568 + 627 + 486 + 529 + + + 4 + 620 + 497 + 568 + 627 + 486 + 529 + + + 4 + 619 + 503 + 568 + 627 + 486 + 529 + + + 4 + 615 + 506 + 568 + 627 + 486 + 529 + + + 4 + 616 + 511 + 568 + 627 + 486 + 529 + + + 4 + 602 + 525 + 568 + 627 + 486 + 529 + + + 4 + 591 + 528 + 568 + 627 + 486 + 529 + + + 4 + 581 + 528 + 568 + 627 + 486 + 529 + + + 4 + 576 + 527 + 568 + 627 + 486 + 529 + + + 4 + 573 + 521 + 568 + 627 + 486 + 529 + + + 4 + 573 + 524 + 568 + 627 + 486 + 529 + + + 29 + 582 + 3353 + 577 + 592 + 3345 + 3358 + + + 29 + 580 + 3353 + 577 + 592 + 3345 + 3358 + + + 29 + 583 + 3351 + 577 + 592 + 3345 + 3358 + + + + 19 + 594 + 3349 + 587 + 599 + 3345 + 3356 + + + 19 + 592 + 3351 + 587 + 599 + 3345 + 3356 + + + 19 + 592 + 3353 + 587 + 599 + 3345 + 3356 + + + 19 + 598 + 3351 + 587 + 599 + 3345 + 3356 + + + 29 + 594 + 3355 + 587 + 599 + 3345 + 3356 + + + 29 + 597 + 3353 + 587 + 599 + 3345 + 3356 + + + 62 + 605 + 3323 + 605 + 621 + 3313 + 3332 + + + 62 + 606 + 3323 + 605 + 621 + 3313 + 3332 + + + 62 + 608 + 3324 + 605 + 621 + 3313 + 3332 + + + 62 + 608 + 3326 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3319 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3318 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3317 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3316 + 605 + 621 + 3313 + 3332 + + + 4 + 620 + 3315 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3316 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3317 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3318 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3319 + 605 + 621 + 3313 + 3332 + + + 4 + 618 + 3319 + 605 + 621 + 3313 + 3332 + + + 4 + 618 + 3318 + 605 + 621 + 3313 + 3332 + + + 4 + 618 + 3317 + 605 + 621 + 3313 + 3332 + + + 47 + 600 + 3339 + 596 + 605 + 3332 + 3344 + + + 47 + 599 + 3340 + 596 + 605 + 3332 + 3344 + + + 47 + 598 + 3340 + 596 + 605 + 3332 + 3344 + + + 47 + 596 + 3341 + 596 + 605 + 3332 + 3344 + + + 43 + 596 + 3322 + 585 + 596 + 3321 + 3338 + + + 43 + 596 + 3324 + 585 + 596 + 3321 + 3338 + + + 43 + 593 + 3326 + 585 + 596 + 3321 + 3338 + + + 43 + 592 + 3326 + 585 + 596 + 3321 + 3338 + + + 4 + 584 + 3344 + 582 + 621 + 3314 + 3354 + + + 4 + 583 + 3343 + 582 + 621 + 3314 + 3354 + + + 4 + 583 + 3339 + 582 + 621 + 3314 + 3354 + + + 4 + 588 + 3339 + 582 + 621 + 3314 + 3354 + + + 4 + 592 + 3337 + 582 + 621 + 3314 + 3354 + + + 4 + 595 + 3334 + 582 + 621 + 3314 + 3354 + + + 4 + 595 + 3334 + 582 + 621 + 3314 + 3354 + + + 4 + 596 + 3331 + 582 + 621 + 3314 + 3354 + + + 29 + 597 + 3328 + 582 + 621 + 3314 + 3354 + + + 29 + 598 + 3328 + 582 + 621 + 3314 + 3354 + + + 29 + 600 + 3323 + 582 + 621 + 3314 + 3354 + + + 29 + 605 + 3323 + 582 + 621 + 3314 + 3354 + + + 29 + 608 + 3326 + 582 + 621 + 3314 + 3354 + + + 29 + 610 + 3325 + 582 + 621 + 3314 + 3354 + + + 29 + 215 + 611 + 209 + 225 + 606 + 631 + + + 29 + 219 + 615 + 209 + 225 + 606 + 631 + + + 29 + 215 + 619 + 209 + 225 + 606 + 631 + + + 29 + 220 + 621 + 209 + 225 + 606 + 631 + + + 29 + 216 + 626 + 209 + 225 + 606 + 631 + + + 29 + 223 + 626 + 209 + 225 + 606 + 631 + + + 29 + 220 + 625 + 209 + 225 + 606 + 631 + + + 29 + 216 + 630 + 209 + 225 + 606 + 631 + + + 125 + 223 + 626 + 220 + 225 + 623 + 627 + + + 34 + 221 + 627 + 209 + 225 + 606 + 631 + + + 34 + 221 + 623 + 209 + 225 + 606 + 631 + + + 34 + 219 + 623 + 209 + 225 + 606 + 631 + + + 34 + 214 + 625 + 209 + 225 + 606 + 631 + + + 97 + 215 + 618 + 214 + 217 + 618 + 621 + + + 11 + 213 + 614 + 212 + 223 + 607 + 616 + + + 124 + 214 + 627 + 212 + 219 + 622 + 627 + + + 29 + 202 + 619 + 195 + 213 + 605 + 624 + + + 29 + 207 + 619 + 195 + 213 + 605 + 624 + + + 29 + 206 + 611 + 195 + 213 + 605 + 624 + + + 367 + 584 + 3475 + 583 + 593 + 3472 + 3477 + + + 367 + 585 + 3476 + 583 + 593 + 3472 + 3477 + + + 367 + 586 + 3476 + 583 + 593 + 3472 + 3477 + + + 367 + 587 + 3476 + 583 + 593 + 3472 + 3477 + + + 367 + 589 + 3474 + 583 + 593 + 3472 + 3477 + + + 367 + 586 + 3472 + 583 + 593 + 3472 + 3477 + + + 367 + 584 + 3473 + 583 + 593 + 3472 + 3477 + + + 420 + 614 + 610 + 613 + 619 + 606 + 612 + + + 420 + 617 + 609 + 613 + 619 + 606 + 612 + + + 420 + 617 + 610 + 613 + 619 + 606 + 612 + + + 255 + 560 + 474 + 556 + 564 + 473 + 476 + + + 794 + 502 + 462 + 501 + 503 + 459 + 463 + + + 348 + 563 + 470 + 562 + 565 + 468 + 472 + + + 267 + 443 + 672 + 440 + 446 + 670 + 675 + + + 262 + 570 + 587 + 568 + 572 + 577 + 591 + + + 262 + 570 + 581 + 568 + 572 + 577 + 591 + + + 262 + 571 + 584 + 568 + 572 + 577 + 591 + + + 262 + 571 + 580 + 568 + 572 + 577 + 591 + + + 262 + 572 + 579 + 568 + 572 + 577 + 591 + + + 262 + 570 + 583 + 568 + 572 + 577 + 591 + + + 407 + 658 + 643 + 641 + 673 + 625 + 644 + + + 407 + 659 + 644 + 641 + 673 + 625 + 644 + + + 407 + 655 + 644 + 641 + 673 + 625 + 644 + + + 407 + 651 + 644 + 641 + 673 + 625 + 644 + + + 407 + 652 + 640 + 641 + 673 + 625 + 644 + + + 407 + 657 + 636 + 641 + 673 + 625 + 644 + + + 407 + 660 + 637 + 641 + 673 + 625 + 644 + + + 407 + 663 + 640 + 641 + 673 + 625 + 644 + + + 407 + 664 + 642 + 641 + 673 + 625 + 644 + + + 407 + 663 + 644 + 641 + 673 + 625 + 644 + + + 407 + 669 + 639 + 641 + 673 + 625 + 644 + + + 428 + 659 + 630 + 641 + 673 + 625 + 644 + + + 409 + 645 + 648 + 635 + 670 + 625 + 671 + + + 409 + 650 + 644 + 635 + 670 + 625 + 671 + + + 409 + 657 + 644 + 635 + 670 + 625 + 671 + + + 409 + 666 + 650 + 635 + 670 + 625 + 671 + + + 409 + 663 + 655 + 635 + 670 + 625 + 671 + + + 409 + 646 + 654 + 635 + 670 + 625 + 671 + + + 409 + 660 + 667 + 635 + 670 + 625 + 671 + + + 409 + 656 + 669 + 635 + 670 + 625 + 671 + + + 409 + 651 + 666 + 635 + 670 + 625 + 671 + + + 409 + 647 + 663 + 635 + 670 + 625 + 671 + + + 409 + 650 + 656 + 635 + 670 + 625 + 671 + + + 409 + 653 + 652 + 635 + 670 + 625 + 671 + + + 409 + 645 + 654 + 635 + 670 + 625 + 671 + + + 409 + 656 + 650 + 635 + 670 + 625 + 671 + + + 409 + 657 + 647 + 635 + 670 + 625 + 671 + + + 409 + 652 + 646 + 635 + 670 + 625 + 671 + + + 29 + 665 + 636 + 635 + 670 + 625 + 671 + + + 29 + 656 + 630 + 635 + 670 + 625 + 671 + + + 29 + 655 + 646 + 635 + 670 + 625 + 671 + + + 29 + 647 + 638 + 635 + 670 + 625 + 671 + + + 29 + 653 + 630 + 635 + 670 + 625 + 671 + + + 29 + 666 + 630 + 635 + 670 + 625 + 671 + + 29 + 656 + 660 + 635 + 670 + 625 + 671 + + 29 + 661 + 666 + 635 + 670 + 625 + 671 + + 29 + 651 + 669 + 635 + 670 + 625 + 671 + + + 66 + 277 + 448 + 263 + 296 + 435 + 466 + + + 66 + 276 + 448 + 263 + 296 + 435 + 466 + + + 66 + 283 + 451 + 263 + 296 + 435 + 466 + + + 66 + 271 + 457 + 263 + 296 + 435 + 466 + + + 66 + 276 + 454 + 263 + 296 + 435 + 466 + + + 66 + 285 + 440 + 263 + 296 + 435 + 466 + + + 100 + 266 + 438 + 264 + 270 + 436 + 445 + + + 100 + 267 + 440 + 264 + 270 + 436 + 445 + + + 100 + 268 + 442 + 264 + 270 + 436 + 445 + + + 100 + 266 + 442 + 264 + 270 + 436 + 445 + + + 100 + 272 + 437 + 271 + 274 + 435 + 442 + + + 100 + 272 + 440 + 271 + 274 + 435 + 442 + + + 100 + 273 + 1382 + 271 + 275 + 1379 + 1385 + + + 100 + 272 + 1384 + 271 + 275 + 1379 + 1385 + + + 66 + 275 + 438 + 275 + 282 + 433 + 442 + + + 66 + 282 + 438 + 275 + 282 + 433 + 442 + + + 66 + 277 + 441 + 275 + 282 + 433 + 442 + + + 109 + 281 + 1378 + 276 + 282 + 1377 + 1382 + + + 107 + 280 + 1379 + 276 + 282 + 1377 + 1382 + + + 108 + 281 + 1381 + 276 + 282 + 1377 + 1382 + + + 66 + 272 + 2323 + 271 + 282 + 2321 + 2335 + + + 66 + 277 + 2328 + 271 + 282 + 2321 + 2335 + + + 34 + 280 + 2331 + 271 + 282 + 2321 + 2335 + + + 66 + 277 + 2332 + 271 + 282 + 2321 + 2335 + + + 66 + 275 + 2334 + 271 + 282 + 2321 + 2335 + + + 66 + 273 + 2331 + 271 + 282 + 2321 + 2335 + + + 94 + 286 + 503 + 262 + 292 + 483 + 507 + + + 699 + 269 + 485 + 262 + 292 + 483 + 507 + + + 699 + 267 + 483 + 262 + 292 + 483 + 507 + + + 94 + 281 + 497 + 262 + 292 + 483 + 507 + + + 699 + 275 + 492 + 262 + 292 + 483 + 507 + + + 699 + 278 + 489 + 262 + 292 + 483 + 507 + + 699 + 278 + 493 + 262 + 292 + 483 + 507 + + + 770 + 275 + 493 + 262 + 292 + 483 + 507 + + + 94 + 264 + 3349 + 259 + 270 + 3336 + 3361 + + + 94 + 262 + 3344 + 259 + 270 + 3336 + 3361 + + + 94 + 268 + 3344 + 259 + 270 + 3336 + 3361 + + + 94 + 264 + 3340 + 259 + 270 + 3336 + 3361 + + 94 + 268 + 3338 + 259 + 270 + 3336 + 3361 + + + 94 + 279 + 3336 + 267 + 283 + 3325 + 3341 + + + 94 + 279 + 3330 + 267 + 283 + 3325 + 3341 + + + 94 + 276 + 3329 + 267 + 283 + 3325 + 3341 + + + 94 + 282 + 3349 + 276 + 314 + 3334 + 3358 + + + 94 + 284 + 3348 + 276 + 314 + 3334 + 3358 + + + 94 + 286 + 3347 + 276 + 314 + 3334 + 3358 + + + 94 + 288 + 3345 + 276 + 314 + 3334 + 3358 + + 94 + 290 + 3344 + 276 + 314 + 3334 + 3358 + + 94 + 289 + 3347 + 276 + 314 + 3334 + 3358 + + 94 + 287 + 3349 + 276 + 314 + 3334 + 3358 + + + 94 + 293 + 3348 + 276 + 314 + 3334 + 3358 + + + 176 + 250 + 1409 + 249 + 265 + 1402 + 1412 + + + 93 + 251 + 461 + 249 + 265 + 458 + 472 + + + 93 + 251 + 464 + 249 + 265 + 458 + 472 + + + 93 + 261 + 466 + 249 + 265 + 458 + 472 + + + 93 + 264 + 462 + 249 + 265 + 458 + 472 + + + 93 + 263 + 466 + 249 + 265 + 458 + 472 + + + 93 + 254 + 469 + 249 + 265 + 458 + 472 + + + 93 + 251 + 1403 + 249 + 265 + 1402 + 1412 + + + 93 + 252 + 1408 + 249 + 265 + 1402 + 1412 + + + 93 + 260 + 1411 + 249 + 265 + 1402 + 1412 + + + 93 + 260 + 1409 + 249 + 265 + 1402 + 1412 + + 93 + 262 + 1403 + 249 + 265 + 1402 + 1412 + + + 304 + 263 + 1408 + 249 + 265 + 1402 + 1412 + + + 358 + 559 + 650 + 556 + 561 + 645 + 651 + + + 358 + 556 + 648 + 556 + 561 + 645 + 651 + + + 358 + 559 + 1589 + 556 + 561 + 1587 + 1595 + + + 63 + 152 + 583 + 135 + 176 + 562 + 592 + + + 6 + 171 + 571 + 135 + 176 + 562 + 592 + + + 6 + 166 + 573 + 135 + 176 + 562 + 592 + + + 6 + 171 + 582 + 135 + 176 + 562 + 592 + + + 6 + 170 + 588 + 135 + 176 + 562 + 592 + + + 6 + 165 + 589 + 135 + 176 + 562 + 592 + + + 6 + 161 + 584 + 135 + 176 + 562 + 592 + + + 6 + 154 + 584 + 135 + 176 + 562 + 592 + + 6 + 158 + 577 + 135 + 176 + 562 + 592 + + 6 + 161 + 573 + 135 + 176 + 562 + 592 + + + 6 + 154 + 573 + 135 + 176 + 562 + 592 + + 6 + 150 + 574 + 135 + 176 + 562 + 592 + + + 6 + 147 + 579 + 135 + 176 + 562 + 592 + + + 6 + 147 + 589 + 135 + 176 + 562 + 592 + + + 6 + 141 + 581 + 135 + 176 + 562 + 592 + + + 6 + 141 + 587 + 135 + 176 + 562 + 592 + + + 6 + 137 + 585 + 135 + 176 + 562 + 592 + + + 6 + 147 + 580 + 135 + 176 + 562 + 592 + + + 6 + 156 + 577 + 135 + 176 + 562 + 592 + + + 6 + 161 + 580 + 135 + 176 + 562 + 592 + + + 6 + 167 + 584 + 135 + 176 + 562 + 592 + + + 19 + 130 + 686 + 128 + 143 + 683 + 695 + + + 19 + 132 + 686 + 128 + 143 + 683 + 695 + + + 19 + 132 + 688 + 128 + 143 + 683 + 695 + + + 19 + 131 + 692 + 128 + 143 + 683 + 695 + + + 177 + 111 + 409 + 101 + 116 + 405 + 420 + + + 177 + 108 + 409 + 101 + 116 + 405 + 420 + + + 177 + 109 + 412 + 101 + 116 + 405 + 420 + + + 177 + 111 + 412 + 101 + 116 + 405 + 420 + + + 177 + 111 + 406 + 101 + 116 + 405 + 420 + + + 70 + 263 + 409 + 248 + 276 + 395 + 424 + + + 70 + 248 + 395 + 248 + 276 + 395 + 424 + + + 70 + 263 + 409 + 248 + 276 + 395 + 424 + + + 70 + 267 + 409 + 248 + 276 + 395 + 424 + + + 70 + 263 + 414 + 248 + 276 + 395 + 424 + + + 70 + 269 + 406 + 248 + 276 + 395 + 424 + + + 70 + 270 + 417 + 248 + 276 + 395 + 424 + + + 46 + 268 + 376 + 264 + 290 + 370 + 390 + + + 46 + 274 + 379 + 264 + 290 + 370 + 390 + + + 46 + 280 + 379 + 264 + 290 + 370 + 390 + + + 46 + 284 + 380 + 264 + 290 + 370 + 390 + + + 46 + 282 + 382 + 264 + 290 + 370 + 390 + + + 46 + 282 + 376 + 264 + 290 + 370 + 390 + + + 46 + 216 + 392 + 212 + 236 + 388 + 420 + + + 46 + 219 + 394 + 212 + 236 + 388 + 420 + + + 46 + 218 + 395 + 212 + 236 + 388 + 420 + + + 46 + 227 + 399 + 212 + 236 + 388 + 420 + + + 46 + 221 + 409 + 212 + 236 + 388 + 420 + + + 46 + 230 + 410 + 212 + 236 + 388 + 420 + + + 46 + 224 + 415 + 212 + 236 + 388 + 420 + + + 46 + 232 + 419 + 212 + 236 + 388 + 420 + + + 57 + 310 + 408 + 310 + 320 + 405 + 417 + + + 57 + 313 + 410 + 310 + 320 + 405 + 417 + + + 57 + 314 + 410 + 310 + 320 + 405 + 417 + + + 57 + 316 + 411 + 310 + 320 + 405 + 417 + + + 57 + 316 + 413 + 310 + 320 + 405 + 417 + + + 57 + 319 + 410 + 310 + 320 + 405 + 417 + + + 57 + 318 + 412 + 310 + 320 + 405 + 417 + + + 57 + 315 + 408 + 310 + 320 + 405 + 417 + + + 60 + 317 + 408 + 310 + 320 + 405 + 417 + + + 139 + 688 + 638 + 681 + 694 + 630 + 648 + + + 139 + 688 + 633 + 681 + 694 + 630 + 648 + + + 139 + 692 + 639 + 681 + 694 + 630 + 648 + + + 139 + 690 + 640 + 681 + 694 + 630 + 648 + + + 139 + 687 + 638 + 681 + 694 + 630 + 648 + + + 139 + 700 + 649 + 697 + 702 + 640 + 652 + + + 140 + 699 + 647 + 697 + 702 + 640 + 652 + + + 139 + 701 + 647 + 697 + 702 + 640 + 652 + + + 140 + 701 + 645 + 697 + 702 + 640 + 652 + + + + 664 + 690 + 651 + 686 + 698 + 649 + 659 + + + 664 + 687 + 654 + 686 + 698 + 649 + 659 + + + 664 + 686 + 657 + 686 + 698 + 649 + 659 + + 664 + 690 + 659 + 686 + 698 + 649 + 659 + + + 664 + 691 + 655 + 686 + 698 + 649 + 659 + + + 664 + 693 + 657 + 686 + 698 + 649 + 659 + + + 664 + 695 + 653 + 686 + 698 + 649 + 659 + + + 665 + 692 + 650 + 690 + 695 + 650 + 652 + + + 666 + 689 + 652 + 689 + 695 + 650 + 652 + + + 666 + 691 + 651 + 689 + 695 + 650 + 652 + + + 706 + 662 + 734 + 638 + 671 + 733 + 757 + + + 706 + 662 + 747 + 638 + 671 + 733 + 757 + + + 706 + 667 + 741 + 638 + 671 + 733 + 757 + + + 706 + 663 + 737 + 638 + 671 + 733 + 757 + + + 706 + 663 + 733 + 638 + 671 + 733 + 757 + + + 706 + 658 + 734 + 638 + 671 + 733 + 757 + + + 521 + 537 + 752 + 528 + 547 + 738 + 767 + + + 521 + 541 + 749 + 528 + 547 + 738 + 767 + + + 521 + 542 + 746 + 528 + 547 + 738 + 767 + + + 521 + 540 + 751 + 528 + 547 + 738 + 767 + + + 521 + 543 + 745 + 528 + 547 + 738 + 767 + + + 521 + 533 + 761 + 528 + 547 + 738 + 767 + + + 521 + 534 + 750 + 528 + 547 + 738 + 767 + + + 521 + 544 + 756 + 528 + 547 + 738 + 767 + + + 521 + 534 + 752 + 528 + 547 + 738 + 767 + + + 521 + 534 + 761 + 528 + 547 + 738 + 767 + + + 521 + 539 + 764 + 528 + 547 + 738 + 767 + + + 521 + 539 + 759 + 528 + 547 + 738 + 767 + + + 521 + 537 + 755 + 528 + 547 + 738 + 767 + + + 521 + 529 + 755 + 528 + 547 + 738 + 767 + + + 425 + 577 + 3419 + 574 + 590 + 3406 + 3423 + + + 425 + 583 + 3420 + 574 + 590 + 3406 + 3423 + + + 425 + 588 + 3411 + 574 + 590 + 3406 + 3423 + + + 425 + 581 + 3413 + 574 + 590 + 3406 + 3423 + + + 425 + 583 + 3410 + 574 + 590 + 3406 + 3423 + + + 425 + 576 + 3419 + 574 + 590 + 3406 + 3423 + + + 426 + 580 + 3419 + 574 + 590 + 3406 + 3423 + + + 320 + 604 + 602 + 603 + 609 + 597 + 609 + + + 320 + 605 + 608 + 603 + 609 + 597 + 609 + + + 320 + 607 + 602 + 603 + 609 + 597 + 609 + + + 320 + 604 + 605 + 603 + 609 + 597 + 609 + + + 323 + 610 + 605 + 607 + 615 + 599 + 607 + + + 323 + 608 + 601 + 607 + 615 + 599 + 607 + + + 525 + 667 + 531 + 663 + 668 + 531 + 535 + + + 525 + 664 + 532 + 663 + 668 + 531 + 535 + + + 525 + 665 + 535 + 663 + 668 + 531 + 535 + + + 525 + 667 + 534 + 663 + 668 + 531 + 535 + + + 525 + 666 + 534 + 663 + 668 + 531 + 535 + + + 525 + 667 + 534 + 663 + 668 + 531 + 535 + + + 45 + 422 + 3461 + 408 + 425 + 3458 + 3474 + + + 45 + 417 + 3461 + 408 + 425 + 3458 + 3474 + + + 45 + 415 + 3466 + 408 + 425 + 3458 + 3474 + + + 45 + 417 + 3468 + 408 + 425 + 3458 + 3474 + + + 45 + 414 + 3469 + 408 + 425 + 3458 + 3474 + + + 45 + 418 + 3471 + 408 + 425 + 3458 + 3474 + + + 45 + 417 + 3468 + 408 + 425 + 3458 + 3474 + + + 45 + 415 + 3469 + 408 + 425 + 3458 + 3474 + + + 195 + 409 + 3485 + 406 + 416 + 3473 + 3486 + + + 195 + 412 + 3484 + 406 + 416 + 3473 + 3486 + + + 195 + 410 + 3480 + 406 + 416 + 3473 + 3486 + + + 195 + 413 + 3475 + 406 + 416 + 3473 + 3486 + + + 195 + 409 + 3475 + 406 + 416 + 3473 + 3486 + + + 104 + 423 + 637 + 419 + 428 + 633 + 644 + + + 104 + 420 + 640 + 419 + 428 + 633 + 644 + + + 562 + 704 + 526 + 697 + 707 + 523 + 529 + + + 562 + 700 + 526 + 697 + 707 + 523 + 529 + + + 592 + 743 + 523 + 673 + 751 + 433 + 530 + + + 592 + 743 + 495 + 673 + 751 + 433 + 530 + + + 592 + 733 + 518 + 673 + 751 + 433 + 530 + + + 592 + 702 + 488 + 673 + 751 + 433 + 530 + + + 592 + 698 + 516 + 673 + 751 + 433 + 530 + + + 592 + 750 + 481 + 673 + 751 + 433 + 530 + + + 592 + 689 + 513 + 673 + 751 + 433 + 530 + + + 592 + 745 + 517 + 673 + 751 + 433 + 530 + + + 592 + 689 + 502 + 673 + 751 + 433 + 530 + + + 592 + 677 + 486 + 673 + 751 + 433 + 530 + + + 592 + 731 + 494 + 673 + 751 + 433 + 530 + + + 592 + 750 + 480 + 673 + 751 + 433 + 530 + + + 592 + 714 + 514 + 673 + 751 + 433 + 530 + + + 592 + 682 + 497 + 673 + 751 + 433 + 530 + + + 592 + 679 + 512 + 673 + 751 + 433 + 530 + + + 592 + 728 + 519 + 673 + 751 + 433 + 530 + + + 592 + 734 + 512 + 673 + 751 + 433 + 530 + + + 592 + 725 + 522 + 673 + 751 + 433 + 530 + + + 592 + 736 + 487 + 673 + 751 + 433 + 530 + + + 592 + 746 + 510 + 673 + 751 + 433 + 530 + + + 593 + 684 + 486 + 673 + 751 + 433 + 530 + + + 593 + 695 + 529 + 673 + 751 + 433 + 530 + + + 593 + 736 + 517 + 673 + 751 + 433 + 530 + + + 593 + 710 + 503 + 673 + 751 + 433 + 530 + + + 593 + 723 + 489 + 673 + 751 + 433 + 530 + + + 593 + 711 + 529 + 673 + 751 + 433 + 530 + + + 593 + 746 + 525 + 673 + 751 + 433 + 530 + + + 593 + 674 + 484 + 673 + 751 + 433 + 530 + + + 593 + 743 + 528 + 673 + 751 + 433 + 530 + + + 593 + 701 + 496 + 673 + 751 + 433 + 530 + + + 593 + 702 + 519 + 673 + 751 + 433 + 530 + + + 593 + 706 + 526 + 673 + 751 + 433 + 530 + + + 593 + 684 + 491 + 673 + 751 + 433 + 530 + + + 593 + 745 + 502 + 673 + 751 + 433 + 530 + + + 593 + 716 + 484 + 673 + 751 + 433 + 530 + + + 593 + 702 + 509 + 673 + 751 + 433 + 530 + + + 593 + 748 + 520 + 673 + 751 + 433 + 530 + + + 593 + 720 + 509 + 673 + 751 + 433 + 530 + + + 593 + 697 + 529 + 673 + 751 + 433 + 530 + + + 593 + 733 + 516 + 673 + 751 + 433 + 530 + + + 585 + 720 + 514 + 673 + 751 + 433 + 530 + + + 585 + 746 + 494 + 673 + 751 + 433 + 530 + + + 585 + 704 + 499 + 673 + 751 + 433 + 530 + + + 585 + 681 + 498 + 673 + 751 + 433 + 530 + + + 585 + 710 + 480 + 673 + 751 + 433 + 530 + + + 585 + 707 + 508 + 673 + 751 + 433 + 530 + + + 585 + 748 + 519 + 673 + 751 + 433 + 530 + + + 585 + 701 + 487 + 673 + 751 + 433 + 530 + + + 585 + 689 + 488 + 673 + 751 + 433 + 530 + + + 585 + 675 + 500 + 673 + 751 + 433 + 530 + + + 585 + 731 + 508 + 673 + 751 + 433 + 530 + + + 585 + 704 + 528 + 673 + 751 + 433 + 530 + + + 585 + 682 + 525 + 673 + 751 + 433 + 530 + + + 585 + 728 + 497 + 673 + 751 + 433 + 530 + + + 585 + 685 + 515 + 673 + 751 + 433 + 530 + + + 585 + 735 + 480 + 673 + 751 + 433 + 530 + + + 585 + 749 + 506 + 673 + 751 + 433 + 530 + + + 585 + 698 + 499 + 673 + 751 + 433 + 530 + + + 585 + 727 + 487 + 673 + 751 + 433 + 530 + + + 585 + 674 + 511 + 673 + 751 + 433 + 530 + + + 562 + 705 + 465 + 700 + 706 + 460 + 468 + + + 562 + 701 + 467 + 700 + 706 + 460 + 468 + + + 551 + 699 + 454 + 699 + 706 + 454 + 460 + + + 551 + 701 + 455 + 699 + 706 + 454 + 460 + + + 188 + 229 + 331 + 203 + 241 + 312 + 345 + + + 188 + 224 + 328 + 203 + 241 + 312 + 345 + + + 188 + 209 + 364 + 207 + 222 + 359 + 374 + + + 188 + 213 + 365 + 207 + 222 + 359 + 374 + + + 188 + 289 + 332 + 281 + 298 + 327 + 339 + + + 188 + 291 + 332 + 281 + 298 + 327 + 339 + + + + 199 + 249 + 345 + 245 + 271 + 340 + 368 + + + 199 + 257 + 346 + 245 + 271 + 340 + 368 + + + 199 + 263 + 346 + 245 + 271 + 340 + 368 + + + 199 + 256 + 359 + 245 + 271 + 340 + 368 + + + 199 + 260 + 359 + 245 + 271 + 340 + 368 + + + 199 + 254 + 360 + 245 + 271 + 340 + 368 + + + 199 + 265 + 355 + 245 + 271 + 340 + 368 + + + 199 + 261 + 365 + 245 + 271 + 340 + 368 + + + 53 + 67 + 326 + 58 + 72 + 314 + 330 + + + 53 + 65 + 320 + 58 + 72 + 314 + 330 + + + 53 + 70 + 318 + 58 + 72 + 314 + 330 + + + 53 + 84 + 314 + 80 + 88 + 311 + 324 + + + 53 + 66 + 306 + 63 + 85 + 303 + 310 + + + 61 + 85 + 329 + 76 + 85 + 325 + 335 + + + 61 + 82 + 328 + 76 + 85 + 325 + 335 + + + 61 + 80 + 332 + 76 + 85 + 325 + 335 + + + 74 + 304 + 298 + 300 + 334 + 285 + 310 + + + 74 + 302 + 298 + 300 + 334 + 285 + 310 + + + 23 + 313 + 309 + 300 + 334 + 285 + 310 + + + 74 + 316 + 303 + 300 + 334 + 285 + 310 + + + 47 + 323 + 305 + 300 + 334 + 285 + 310 + + + 47 + 323 + 308 + 300 + 334 + 285 + 310 + + + 47 + 319 + 306 + 300 + 334 + 285 + 310 + + + 47 + 323 + 298 + 300 + 334 + 285 + 310 + + + 47 + 326 + 296 + 300 + 334 + 285 + 310 + + + 47 + 328 + 295 + 300 + 334 + 285 + 310 + + + 47 + 329 + 295 + 300 + 334 + 285 + 310 + + + 47 + 320 + 293 + 300 + 334 + 285 + 310 + + + 68 + 172 + 324 + 164 + 188 + 303 + 330 + + + 68 + 170 + 322 + 164 + 188 + 303 + 330 + + + 68 + 168 + 324 + 164 + 188 + 303 + 330 + + + 41 + 172 + 319 + 164 + 188 + 303 + 330 + + + 41 + 168 + 316 + 164 + 188 + 303 + 330 + + + 41 + 166 + 319 + 164 + 188 + 303 + 330 + + + 41 + 167 + 323 + 164 + 188 + 303 + 330 + + + 68 + 168 + 309 + 164 + 177 + 303 + 315 + + + 68 + 167 + 310 + 164 + 177 + 303 + 315 + + + 68 + 168 + 311 + 164 + 177 + 303 + 315 + + + 68 + 171 + 312 + 164 + 177 + 303 + 315 + + + 68 + 170 + 309 + 164 + 177 + 303 + 315 + + + 41 + 167 + 312 + 164 + 177 + 303 + 315 + + + 41 + 170 + 313 + 164 + 177 + 303 + 315 + + + 41 + 165 + 307 + 164 + 177 + 303 + 315 + + + 41 + 168 + 307 + 164 + 177 + 303 + 315 + + + 795 + 441 + 486 + 440 + 443 + 485 + 488 + + + 3 + 525 + 620 + 520 + 529 + 616 + 622 + + + 3 + 523 + 621 + 520 + 529 + 616 + 622 + + + 3 + 523 + 617 + 520 + 529 + 616 + 622 + + + 3 + 526 + 619 + 520 + 529 + 616 + 622 + + + 321 + 563 + 567 + 562 + 567 + 564 + 572 + + + 321 + 565 + 569 + 562 + 567 + 564 + 572 + + + 19 + 567 + 3436 + 554 + 570 + 3419 + 3437 + + + 19 + 561 + 3435 + 554 + 570 + 3419 + 3437 + + + 19 + 557 + 3435 + 554 + 570 + 3419 + 3437 + + + 19 + 560 + 3431 + 554 + 570 + 3419 + 3437 + + + 19 + 558 + 3426 + 554 + 570 + 3419 + 3437 + + + 19 + 561 + 3424 + 554 + 570 + 3419 + 3437 + + + 19 + 560 + 3421 + 554 + 570 + 3419 + 3437 + + + 19 + 563 + 3422 + 554 + 570 + 3419 + 3437 + + + 321 + 549 + 591 + 544 + 552 + 558 + 603 + + + 321 + 548 + 595 + 544 + 552 + 558 + 603 + + + 321 + 549 + 602 + 544 + 552 + 558 + 603 + + + 356 + 396 + 3299 + 390 + 402 + 3295 + 3302 + + + 356 + 393 + 3300 + 390 + 402 + 3295 + 3302 + + + 356 + 391 + 3297 + 390 + 402 + 3295 + 3302 + + + 356 + 395 + 3296 + 390 + 402 + 3295 + 3302 + + + 356 + 399 + 3297 + 390 + 402 + 3295 + 3302 + + + 356 + 402 + 3299 + 390 + 402 + 3295 + 3302 + + + 356 + 400 + 3300 + 390 + 402 + 3295 + 3302 + + + 356 + 396 + 3302 + 390 + 402 + 3295 + 3302 + + + 356 + 395 + 3300 + 390 + 402 + 3295 + 3302 + + + 184 + 83 + 164 + 79 + 87 + 156 + 165 + + + 184 + 83 + 160 + 79 + 87 + 156 + 165 + + + 6 + 609 + 736 + 605 + 612 + 732 + 741 + + + 6 + 611 + 739 + 605 + 612 + 732 + 741 + + + 6 + 612 + 737 + 605 + 612 + 732 + 741 + + + 6 + 610 + 736 + 605 + 612 + 732 + 741 + + + 574 + 638 + 1681 + 634 + 639 + 1680 + 1685 + + + 574 + 636 + 1681 + 634 + 639 + 1680 + 1685 + + + 574 + 634 + 1683 + 634 + 639 + 1680 + 1685 + + + 574 + 637 + 1685 + 634 + 639 + 1680 + 1685 + + + 270 + 581 + 3585 + 578 + 590 + 3581 + 3589 + + + 270 + 582 + 3589 + 578 + 590 + 3581 + 3589 + + + 53 + 349 + 1574 + 345 + 350 + 1570 + 1577 + + + 53 + 347 + 1573 + 345 + 350 + 1570 + 1577 + + + 53 + 345 + 1574 + 345 + 350 + 1570 + 1577 + + + 53 + 346 + 1570 + 345 + 350 + 1570 + 1577 + + + 53 + 350 + 1571 + 345 + 350 + 1570 + 1577 + + + 53 + 346 + 1577 + 345 + 350 + 1570 + 1577 + + + 181 + 341 + 3463 + 340 + 348 + 3460 + 3465 + + + 182 + 346 + 3463 + 345 + 347 + 3462 + 3467 + + + 47 + 340 + 631 + 338 + 348 + 626 + 638 + + + 47 + 342 + 634 + 338 + 348 + 626 + 638 + + + 47 + 345 + 632 + 338 + 348 + 626 + 638 + + + 47 + 343 + 630 + 338 + 348 + 626 + 638 + + + 47 + 347 + 630 + 338 + 348 + 626 + 638 + + + 47 + 346 + 636 + 338 + 348 + 626 + 638 + + + 47 + 345 + 631 + 338 + 348 + 626 + 638 + + + 47 + 345 + 628 + 338 + 348 + 626 + 638 + + + 47 + 343 + 635 + 338 + 348 + 626 + 638 + + + 47 + 341 + 627 + 338 + 348 + 626 + 638 + + + 68 + 344 + 3469 + 343 + 345 + 3467 + 3470 + + + 68 + 345 + 3467 + 343 + 345 + 3467 + 3470 + + + 72 + 316 + 1607 + 314 + 319 + 1603 + 1608 + + + 29 + 323 + 669 + 322 + 327 + 667 + 670 + + + 29 + 324 + 667 + 322 + 327 + 667 + 670 + + + 29 + 326 + 668 + 322 + 327 + 667 + 670 + + + 29 + 327 + 670 + 322 + 327 + 667 + 670 + + + 148 + 317 + 667 + 315 + 318 + 665 + 669 + + + 65 + 154 + 507 + 149 + 158 + 507 + 511 + + + 65 + 155 + 509 + 149 + 158 + 507 + 511 + + + 65 + 151 + 511 + 149 + 158 + 507 + 511 + + + 65 + 149 + 509 + 149 + 158 + 507 + 511 + + + 70 + 70 + 585 + 62 + 74 + 581 + 610 + + + 70 + 72 + 587 + 62 + 74 + 581 + 610 + + + 70 + 70 + 590 + 62 + 74 + 581 + 610 + + + 70 + 73 + 596 + 62 + 74 + 581 + 610 + + + 70 + 69 + 600 + 62 + 74 + 581 + 610 + + + 70 + 74 + 593 + 62 + 74 + 581 + 610 + + + 307 + 72 + 600 + 67 + 74 + 597 + 697 + + + 13 + 57 + 603 + 54 + 62 + 599 + 611 + + + 13 + 69 + 640 + 63 + 73 + 635 + 646 + + + 13 + 66 + 651 + 66 + 81 + 645 + 656 + + + 13 + 71 + 647 + 66 + 81 + 645 + 656 + + + 13 + 76 + 649 + 66 + 81 + 645 + 656 + + + 13 + 68 + 645 + 66 + 81 + 645 + 656 + + + 13 + 56 + 661 + 56 + 83 + 655 + 671 + + + 13 + 63 + 663 + 56 + 83 + 655 + 671 + + + 13 + 75 + 661 + 56 + 83 + 655 + 671 + + + 13 + 82 + 659 + 56 + 83 + 655 + 671 + + + 571 + 88 + 661 + 88 + 88 + 661 + 661 + + + 72 + 83 + 680 + 58 + 86 + 664 + 682 + + + 72 + 79 + 672 + 58 + 86 + 664 + 682 + + + 72 + 69 + 673 + 58 + 86 + 664 + 682 + + + 72 + 62 + 670 + 58 + 86 + 664 + 682 + + + 72 + 59 + 677 + 58 + 86 + 664 + 682 + + + 72 + 62 + 681 + 58 + 86 + 664 + 682 + + + 29 + 68 + 680 + 58 + 86 + 664 + 682 + + + 13 + 83 + 692 + 82 + 86 + 688 + 701 + + + 70 + 78 + 715 + 62 + 94 + 707 + 721 + + + 79 + 51 + 716 + 48 + 55 + 713 + 720 + + + 34 + 49 + 712 + 48 + 60 + 710 + 720 + + + 34 + 52 + 717 + 48 + 60 + 710 + 720 + + + 34 + 51 + 720 + 48 + 60 + 710 + 720 + + + 34 + 58 + 718 + 48 + 60 + 710 + 720 + + + 717 + 63 + 727 + 59 + 65 + 722 + 732 + + + 717 + 61 + 725 + 59 + 65 + 722 + 732 + + + 717 + 64 + 723 + 59 + 65 + 722 + 732 + + + 720 + 62 + 729 + 59 + 65 + 728 + 732 + + + 720 + 60 + 730 + 59 + 65 + 728 + 732 + + + 549 + 64 + 729 + 59 + 65 + 728 + 732 + + + 719 + 63 + 732 + 63 + 63 + 732 + 732 + + + 324 + 540 + 595 + 536 + 548 + 592 + 598 + + + 322 + 547 + 586 + 544 + 554 + 582 + 608 + + + 322 + 550 + 591 + 544 + 554 + 582 + 608 + + + 323 + 551 + 596 + 544 + 554 + 582 + 608 + + + 323 + 546 + 604 + 544 + 554 + 582 + 608 + + + 321 + 564 + 595 + 564 + 572 + 592 + 599 + + 321 + 568 + 597 + 564 + 572 + 592 + 599 + + + 317 + 467 + 651 + 467 + 467 + 646 + 656 + + + 21 + 444 + 676 + 438 + 447 + 669 + 678 + + + 261 + 453 + 680 + 447 + 455 + 678 + 681 + + + 64 + 448 + 685 + 447 + 455 + 682 + 687 + + + 264 + 452 + 683 + 447 + 455 + 682 + 687 + + + 260 + 453 + 686 + 447 + 455 + 682 + 687 + + + 332 + 452 + 687 + 447 + 455 + 682 + 688 + + + 262 + 458 + 676 + 454 + 458 + 672 + 680 + + + 262 + 457 + 680 + 454 + 458 + 672 + 680 + + + 262 + 455 + 677 + 454 + 458 + 672 + 680 + + + 257 + 464 + 682 + 459 + 466 + 681 + 685 + + + 258 + 469 + 676 + 459 + 469 + 672 + 680 + + + 258 + 467 + 678 + 459 + 469 + 672 + 680 + + + 258 + 465 + 676 + 459 + 469 + 672 + 680 + + + 259 + 463 + 678 + 459 + 469 + 672 + 680 + + + 271 + 494 + 659 + 483 + 508 + 644 + 671 + + + 271 + 498 + 653 + 483 + 508 + 644 + 671 + + + 271 + 502 + 659 + 483 + 508 + 644 + 671 + + + 271 + 499 + 667 + 483 + 508 + 644 + 671 + + + 271 + 506 + 665 + 483 + 508 + 644 + 671 + + + 594 + 520 + 663 + 511 + 523 + 658 + 670 + + + 594 + 516 + 662 + 511 + 523 + 658 + 670 + + + 594 + 516 + 669 + 511 + 523 + 658 + 670 + + + 594 + 513 + 668 + 511 + 523 + 658 + 670 + + + 421 + 480 + 705 + 479 + 512 + 687 + 717 + + + 421 + 487 + 709 + 479 + 512 + 687 + 717 + + + 421 + 491 + 703 + 479 + 512 + 687 + 717 + + + 421 + 497 + 708 + 479 + 512 + 687 + 717 + + + 421 + 502 + 703 + 479 + 512 + 687 + 717 + + + 421 + 507 + 700 + 479 + 512 + 687 + 717 + + + 421 + 498 + 713 + 479 + 512 + 687 + 717 + + + 421 + 492 + 711 + 479 + 512 + 687 + 717 + + + 255 + 437 + 695 + 436 + 550 + 691 + 697 + + + 256 + 439 + 692 + 436 + 550 + 691 + 697 + + + 64 + 442 + 692 + 441 + 447 + 689 + 698 + + + 29 + 446 + 697 + 441 + 447 + 689 + 698 + + + 278 + 444 + 706 + 440 + 449 + 696 + 709 + + + 279 + 451 + 705 + 449 + 454 + 702 + 706 + + + 264 + 453 + 698 + 445 + 459 + 691 + 709 + + + 264 + 450 + 699 + 445 + 459 + 691 + 709 + + + 264 + 449 + 702 + 445 + 459 + 691 + 709 + + + 264 + 453 + 703 + 445 + 459 + 691 + 709 + + + 264 + 451 + 701 + 445 + 459 + 691 + 709 + + + 264 + 449 + 704 + 445 + 459 + 691 + 709 + + + 264 + 446 + 703 + 445 + 459 + 691 + 709 + + + 264 + 446 + 697 + 445 + 459 + 691 + 709 + + + 70 + 464 + 717 + 459 + 467 + 713 + 717 + + + 421 + 466 + 742 + 448 + 466 + 738 + 749 + + + 521 + 466 + 732 + 449 + 477 + 727 + 740 + + + 521 + 457 + 735 + 449 + 477 + 727 + 740 + + + 521 + 464 + 739 + 449 + 477 + 727 + 740 + + + 67 + 466 + 763 + 451 + 473 + 750 + 771 + + + 517 + 436 + 751 + 434 + 439 + 748 + 754 + + + 523 + 420 + 764 + 416 + 430 + 755 + 767 + + + 421 + 416 + 761 + 416 + 430 + 755 + 767 + + + 521 + 417 + 763 + 416 + 430 + 755 + 767 + + + 521 + 419 + 760 + 416 + 430 + 755 + 767 + + + 521 + 422 + 759 + 416 + 430 + 755 + 767 + + + 521 + 423 + 756 + 416 + 430 + 755 + 767 + + + 521 + 426 + 759 + 416 + 430 + 755 + 767 + + + 521 + 427 + 764 + 416 + 430 + 755 + 767 + + + 521 + 422 + 766 + 416 + 430 + 755 + 767 + + + 521 + 420 + 767 + 416 + 430 + 755 + 767 + + + 521 + 424 + 766 + 416 + 430 + 755 + 767 + + + 556 + 425 + 764 + 425 + 425 + 764 + 764 + + + 521 + 426 + 771 + 425 + 429 + 769 + 773 + + + 521 + 428 + 772 + 425 + 429 + 769 + 773 + + + 521 + 410 + 769 + 393 + 413 + 760 + 771 + + + 521 + 409 + 765 + 393 + 413 + 760 + 771 + + + 521 + 405 + 763 + 393 + 413 + 760 + 771 + + + 521 + 402 + 766 + 393 + 413 + 760 + 771 + + + 521 + 399 + 763 + 393 + 413 + 760 + 771 + + + 521 + 396 + 764 + 393 + 413 + 760 + 771 + + + 521 + 399 + 766 + 393 + 413 + 760 + 771 + + + 521 + 400 + 763 + 393 + 413 + 760 + 771 + + + 557 + 402 + 766 + 398 + 405 + 763 + 766 + + + 523 + 374 + 774 + 370 + 381 + 768 + 787 + + + 521 + 374 + 782 + 370 + 381 + 768 + 787 + + + 521 + 377 + 771 + 370 + 381 + 768 + 787 + + + 521 + 385 + 784 + 379 + 385 + 777 + 795 + + + 421 + 385 + 788 + 379 + 385 + 777 + 795 + + + 70 + 379 + 786 + 379 + 385 + 777 + 795 + + + 523 + 440 + 833 + 427 + 450 + 812 + 840 + + + 521 + 436 + 831 + 427 + 450 + 812 + 840 + + + 521 + 437 + 825 + 427 + 450 + 812 + 840 + + + 521 + 433 + 820 + 427 + 450 + 812 + 840 + + + 523 + 432 + 816 + 427 + 450 + 812 + 840 + + + 523 + 440 + 816 + 427 + 450 + 812 + 840 + + + 521 + 444 + 821 + 427 + 450 + 812 + 840 + + + 521 + 442 + 828 + 427 + 450 + 812 + 840 + + + 521 + 450 + 822 + 427 + 450 + 812 + 840 + + + 542 + 382 + 847 + 380 + 390 + 845 + 856 + + + 542 + 384 + 854 + 380 + 390 + 845 + 856 + + + 542 + 386 + 854 + 380 + 390 + 845 + 856 + + + 542 + 388 + 854 + 380 + 390 + 845 + 856 + + + 542 + 386 + 852 + 380 + 390 + 845 + 856 + + + 542 + 387 + 849 + 380 + 390 + 845 + 856 + + + 542 + 388 + 849 + 380 + 390 + 845 + 856 + + + 542 + 390 + 845 + 380 + 390 + 845 + 856 + + + 542 + 388 + 850 + 380 + 390 + 845 + 856 + + + 542 + 385 + 851 + 380 + 390 + 845 + 856 + + + 542 + 387 + 856 + 380 + 390 + 845 + 856 + + + 542 + 390 + 855 + 380 + 390 + 845 + 856 + + + 765 + 397 + 865 + 394 + 402 + 863 + 866 + + + 765 + 424 + 863 + 422 + 428 + 861 + 864 + + + 311 + 523 + 3433 + 520 + 524 + 3431 + 3438 + + + 311 + 520 + 3434 + 520 + 524 + 3431 + 3438 + + + 311 + 521 + 3436 + 520 + 524 + 3431 + 3438 + + + 311 + 524 + 3435 + 520 + 524 + 3431 + 3438 + + + 312 + 511 + 3418 + 509 + 513 + 3415 + 3422 + + + 312 + 511 + 3410 + 508 + 513 + 3408 + 3415 + + + 312 + 510 + 3444 + 508 + 513 + 3440 + 3447 + + + 294 + 506 + 3428 + 500 + 508 + 3424 + 3430 + + + 23 + 206 + 576 + 194 + 212 + 569 + 581 + + + 36 + 208 + 561 + 204 + 211 + 556 + 569 + + + 40 + 210 + 546 + 208 + 211 + 545 + 546 + + + 79 + 218 + 546 + 217 + 221 + 542 + 549 + + + 29 + 218 + 554 + 214 + 224 + 550 + 555 + + + 34 + 212 + 543 + 202 + 216 + 542 + 555 + + + 80 + 217 + 1490 + 202 + 221 + 1486 + 1499 + + + 80 + 221 + 1497 + 202 + 221 + 1486 + 1499 + + + 80 + 215 + 1496 + 202 + 221 + 1486 + 1499 + + + 80 + 207 + 1491 + 202 + 221 + 1486 + 1499 + + + 80 + 213 + 1490 + 202 + 221 + 1486 + 1499 + + + 34 + 205 + 1488 + 202 + 221 + 1486 + 1499 + + + 34 + 212 + 1486 + 202 + 221 + 1486 + 1499 + + + 38 + 213 + 2441 + 208 + 215 + 2438 + 2442 + + + 91 + 209 + 2439 + 208 + 215 + 2438 + 2442 + + + 23 + 235 + 550 + 232 + 240 + 541 + 568 + + + 62 + 288 + 667 + 287 + 298 + 655 + 672 + + + 62 + 291 + 663 + 287 + 298 + 655 + 672 + + + 62 + 294 + 666 + 287 + 298 + 655 + 672 + + + 62 + 297 + 662 + 287 + 298 + 655 + 672 + + + 62 + 291 + 658 + 287 + 298 + 655 + 672 + + + 62 + 295 + 671 + 287 + 298 + 655 + 672 + + + 47 + 299 + 676 + 288 + 300 + 672 + 679 + + + 47 + 296 + 675 + 288 + 300 + 672 + 679 + + + 62 + 290 + 674 + 288 + 300 + 672 + 679 + + + 62 + 296 + 672 + 288 + 300 + 672 + 679 + + + 164 + 339 + 706 + 337 + 341 + 704 + 708 + + + 70 + 424 + 686 + 390 + 434 + 665 + 710 + + + 70 + 419 + 701 + 390 + 434 + 665 + 710 + + + 70 + 412 + 699 + 390 + 434 + 665 + 710 + + + 70 + 403 + 697 + 390 + 434 + 665 + 710 + + + 70 + 406 + 681 + 390 + 434 + 665 + 710 + + + 114 + 408 + 687 + 390 + 434 + 665 + 710 + + + 114 + 414 + 687 + 390 + 434 + 665 + 710 + + + 114 + 422 + 689 + 390 + 434 + 665 + 710 + + + 114 + 419 + 700 + 390 + 434 + 665 + 710 + + + 114 + 425 + 707 + 390 + 434 + 665 + 710 + + + 70 + 421 + 707 + 390 + 434 + 665 + 710 + + + 70 + 430 + 700 + 390 + 434 + 665 + 710 + + + 46 + 419 + 3526 + 418 + 427 + 3523 + 3533 + + + 46 + 423 + 3525 + 418 + 427 + 3523 + 3533 + + + 46 + 425 + 3529 + 418 + 427 + 3523 + 3533 + + + 46 + 420 + 3530 + 418 + 427 + 3523 + 3533 + + + 46 + 420 + 3527 + 418 + 427 + 3523 + 3533 + + + 99 + 407 + 3524 + 403 + 412 + 3518 + 3528 + + + 99 + 408 + 3522 + 403 + 412 + 3518 + 3528 + + + 99 + 404 + 3522 + 403 + 412 + 3518 + 3528 + + + 99 + 405 + 3519 + 403 + 412 + 3518 + 3528 + + + 99 + 407 + 3521 + 403 + 412 + 3518 + 3528 + + + 22 + 414 + 3536 + 404 + 415 + 3529 + 3543 + + + 22 + 411 + 3538 + 404 + 415 + 3529 + 3543 + + + 22 + 407 + 3538 + 404 + 415 + 3529 + 3543 + + + 22 + 410 + 3535 + 404 + 415 + 3529 + 3543 + + + 22 + 406 + 3493 + 403 + 411 + 3488 + 3508 + + + 22 + 404 + 3499 + 403 + 411 + 3488 + 3508 + + + 22 + 408 + 3489 + 403 + 411 + 3488 + 3508 + + + 22 + 410 + 3492 + 403 + 411 + 3488 + 3508 + + + 196 + 417 + 3478 + 414 + 428 + 3475 + 3485 + + + 22 + 420 + 621 + 413 + 421 + 613 + 623 + + + 67 + 414 + 606 + 408 + 430 + 603 + 620 + + + 67 + 422 + 608 + 408 + 430 + 603 + 620 + + + 67 + 429 + 618 + 408 + 430 + 603 + 620 + + + 136 + 406 + 615 + 405 + 408 + 603 + 617 + + + 136 + 406 + 605 + 405 + 408 + 603 + 617 + + + 45 + 413 + 639 + 405 + 415 + 619 + 640 + + + 45 + 407 + 632 + 405 + 415 + 619 + 640 + + + 45 + 408 + 622 + 405 + 415 + 619 + 640 + + + 43 + 652 + 3533 + 649 + 655 + 3531 + 3536 + + + 41 + 654 + 3533 + 649 + 655 + 3531 + 3536 + + + 41 + 654 + 3535 + 649 + 655 + 3531 + 3536 + + + 67 + 652 + 3536 + 649 + 655 + 3531 + 3536 + + + 67 + 652 + 3532 + 649 + 655 + 3531 + 3536 + + + 67 + 650 + 3533 + 649 + 655 + 3531 + 3536 + + + 67 + 664 + 3533 + 646 + 666 + 3531 + 3542 + + + 67 + 662 + 3535 + 646 + 666 + 3531 + 3542 + + + 41 + 659 + 3537 + 646 + 666 + 3531 + 3542 + + + 67 + 653 + 3541 + 646 + 666 + 3531 + 3542 + + + 67 + 649 + 3539 + 646 + 666 + 3531 + 3542 + + + 67 + 647 + 3536 + 646 + 666 + 3531 + 3542 + + + 41 + 646 + 3534 + 646 + 666 + 3531 + 3542 + + + 407 + 667 + 596 + 667 + 673 + 590 + 599 + + + 407 + 669 + 595 + 667 + 673 + 590 + 599 + + + 407 + 669 + 593 + 667 + 673 + 590 + 599 + + + 407 + 671 + 594 + 667 + 673 + 590 + 599 + + + 407 + 667 + 594 + 667 + 673 + 590 + 599 + + + 407 + 671 + 597 + 667 + 673 + 590 + 599 + + + 410 + 673 + 595 + 667 + 673 + 590 + 599 + + + 189 + 279 + 666 + 277 + 280 + 665 + 667 + + + 21 + 279 + 663 + 277 + 281 + 662 + 664 + + + 192 + 283 + 663 + 282 + 284 + 662 + 664 + + + 137 + 282 + 661 + 282 + 284 + 658 + 661 + + + 64 + 282 + 655 + 282 + 284 + 655 + 657 + + + 714 + 161 + 513 + 158 + 166 + 511 + 519 + + + 783 + 166 + 513 + 158 + 166 + 511 + 519 + + + 31 + 168 + 500 + 165 + 174 + 494 + 502 + + + 133 + 178 + 484 + 176 + 181 + 480 + 487 + + + 33 + 143 + 519 + 141 + 145 + 518 + 521 + + + 26 + 128 + 505 + 125 + 130 + 504 + 506 + + + 30 + 133 + 509 + 126 + 135 + 505 + 511 + + + + 28 + 133 + 528 + 133 + 137 + 528 + 529 + + + 64 + 146 + 534 + 141 + 151 + 532 + 535 + + + 27 + 150 + 534 + 145 + 151 + 533 + 535 + + + 64 + 147 + 531 + 145 + 151 + 524 + 532 + + + 64 + 148 + 528 + 145 + 151 + 524 + 532 + + + 21 + 160 + 544 + 158 + 168 + 533 + 550 + + + 111 + 149 + 557 + 148 + 152 + 554 + 560 + + + 3 + 146 + 558 + 145 + 147 + 557 + 562 + + + 3 + 145 + 559 + 145 + 147 + 557 + 562 + + + 3 + 147 + 560 + 145 + 147 + 557 + 562 + + + 3 + 145 + 561 + 145 + 147 + 557 + 562 + + + 3 + 147 + 562 + 145 + 147 + 557 + 562 + + + 183 + 150 + 1506 + 148 + 152 + 1504 + 1507 + + + 112 + 149 + 1499 + 148 + 152 + 1498 + 1501 + + + 14 + 136 + 511 + 133 + 137 + 508 + 515 + + + 42 + 126 + 474 + 124 + 128 + 472 + 477 + + + 20 + 128 + 456 + 126 + 134 + 455 + 459 + + + 8 + 118 + 450 + 117 + 120 + 449 + 452 + + + 39 + 100 + 493 + 97 + 106 + 484 + 496 + + + 32 + 100 + 477 + 97 + 106 + 473 + 482 + + + 49 + 98 + 1428 + 97 + 99 + 1428 + 1431 + + + 65 + 112 + 464 + 108 + 113 + 459 + 467 + + + 65 + 110 + 465 + 108 + 113 + 459 + 467 + + + 11 + 80 + 445 + 78 + 85 + 442 + 452 + + + 98 + 83 + 444 + 78 + 85 + 442 + 452 + + + 64 + 80 + 448 + 78 + 85 + 442 + 452 + + + 66 + 84 + 450 + 78 + 85 + 442 + 452 + + + 44 + 83 + 453 + 78 + 85 + 451 + 454 + + + 66 + 130 + 438 + 115 + 134 + 425 + 441 + + + 66 + 121 + 434 + 115 + 134 + 425 + 441 + + + 314 + 84 + 1387 + 83 + 85 + 1386 + 1388 + + + 189 + 254 + 186 + 250 + 272 + 177 + 196 + + + 189 + 257 + 181 + 250 + 272 + 177 + 196 + + + 189 + 259 + 179 + 250 + 272 + 177 + 196 + + + 189 + 261 + 183 + 250 + 272 + 177 + 196 + + + 189 + 265 + 185 + 250 + 272 + 177 + 196 + + + 189 + 268 + 186 + 250 + 272 + 177 + 196 + + + 189 + 254 + 189 + 250 + 272 + 177 + 196 + + + 136 + 240 + 194 + 237 + 244 + 192 + 195 + + + 136 + 235 + 191 + 227 + 235 + 187 + 191 + + + 61 + 217 + 183 + 216 + 218 + 181 + 185 + + + 61 + 225 + 187 + 224 + 225 + 187 + 190 + + + 61 + 227 + 182 + 224 + 230 + 180 + 184 + + + 61 + 225 + 171 + 222 + 228 + 168 + 171 + + + 22 + 238 + 178 + 230 + 245 + 174 + 182 + + + 22 + 233 + 178 + 230 + 245 + 174 + 182 + + + 184 + 262 + 3007 + 250 + 265 + 3002 + 3018 + + + 184 + 262 + 3013 + 250 + 265 + 3002 + 3018 + + + 184 + 255 + 3010 + 250 + 265 + 3002 + 3018 + + + 184 + 257 + 3015 + 250 + 265 + 3002 + 3018 + + + 99 + 578 + 3460 + 578 + 579 + 3460 + 3461 + + + 34 + 580 + 3460 + 580 + 581 + 3460 + 3461 + + + 34 + 580 + 3461 + 580 + 581 + 3460 + 3461 + + + 34 + 579 + 3458 + 578 + 583 + 3458 + 3459 + + + 74 + 582 + 3460 + 582 + 583 + 3460 + 3461 + + + 62 + 580 + 3457 + 580 + 581 + 3457 + 3457 + + + 29 + 578 + 3457 + 578 + 579 + 3456 + 3457 + + + 19 + 579 + 3457 + 578 + 579 + 3456 + 3457 + + + 19 + 579 + 3458 + 578 + 583 + 3458 + 3459 + + + 4 + 588 + 3478 + 576 + 597 + 3464 + 3481 + + + 4 + 585 + 3479 + 576 + 597 + 3464 + 3481 + + + 4 + 586 + 3478 + 576 + 597 + 3464 + 3481 + + + 4 + 577 + 3479 + 576 + 597 + 3464 + 3481 + + + 4 + 580 + 3477 + 576 + 597 + 3464 + 3481 + + + 367 + 588 + 3474 + 583 + 594 + 3472 + 3477 + + + 367 + 588 + 3475 + 583 + 594 + 3472 + 3477 + + + 367 + 589 + 3476 + 583 + 594 + 3472 + 3477 + + + 367 + 589 + 3477 + 583 + 594 + 3472 + 3477 + + + 367 + 587 + 3475 + 583 + 594 + 3472 + 3477 + + + 367 + 587 + 3477 + 583 + 594 + 3472 + 3477 + + + 367 + 586 + 3477 + 583 + 594 + 3472 + 3477 + + + 367 + 584 + 3476 + 583 + 594 + 3472 + 3477 + + + 367 + 585 + 3474 + 583 + 594 + 3472 + 3477 + + + 367 + 583 + 3476 + 583 + 594 + 3472 + 3477 + + + 367 + 583 + 3475 + 583 + 594 + 3472 + 3477 + + + 367 + 586 + 3473 + 583 + 594 + 3472 + 3477 + + + 41 + 666 + 578 + 657 + 675 + 575 + 587 + + + 41 + 666 + 581 + 657 + 675 + 575 + 587 + + + 41 + 662 + 583 + 657 + 675 + 575 + 587 + + + 41 + 661 + 580 + 657 + 675 + 575 + 587 + + + 41 + 668 + 578 + 657 + 675 + 575 + 587 + + + 41 + 664 + 576 + 657 + 675 + 575 + 587 + + + 29 + 666 + 578 + 657 + 675 + 575 + 587 + + + 29 + 670 + 577 + 657 + 675 + 575 + 587 + + + 29 + 664 + 578 + 657 + 675 + 575 + 587 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 311 + 521 + 3434 + 520 + 524 + 3433 + 3436 + + + 311 + 523 + 3434 + 520 + 524 + 3433 + 3436 + + + 311 + 522 + 3434 + 520 + 524 + 3433 + 3436 + + + 521 + 540 + 748 + 537 + 544 + 744 + 750 + + + 521 + 541 + 748 + 537 + 544 + 744 + 750 + + + 521 + 541 + 746 + 537 + 544 + 744 + 750 + + + 521 + 540 + 746 + 537 + 544 + 744 + 750 + + + 521 + 542 + 746 + 537 + 544 + 744 + 750 + + + 521 + 540 + 752 + 537 + 547 + 750 + 757 + + + 521 + 541 + 754 + 537 + 547 + 750 + 757 + + + 521 + 540 + 755 + 537 + 547 + 750 + 757 + + + 521 + 542 + 754 + 537 + 547 + 750 + 757 + + + 521 + 542 + 755 + 537 + 547 + 750 + 757 + + + 521 + 537 + 760 + 529 + 540 + 756 + 765 + + + 521 + 536 + 760 + 529 + 540 + 756 + 765 + + + 521 + 534 + 761 + 529 + 540 + 756 + 765 + + + 521 + 535 + 758 + 529 + 540 + 756 + 765 + + + 521 + 537 + 759 + 529 + 540 + 756 + 765 + + + 99 + 168 + 258 + 146 + 179 + 248 + 265 + + + 99 + 166 + 259 + 146 + 179 + 248 + 265 + + + 99 + 166 + 257 + 146 + 179 + 248 + 265 + + + 99 + 163 + 256 + 146 + 179 + 248 + 265 + + + 99 + 163 + 260 + 146 + 179 + 248 + 265 + + + 99 + 172 + 258 + 146 + 179 + 248 + 265 + + + 99 + 174 + 255 + 146 + 179 + 248 + 265 + + + 99 + 166 + 252 + 146 + 179 + 248 + 265 + + + 99 + 158 + 257 + 146 + 179 + 248 + 265 + + + 99 + 155 + 260 + 146 + 179 + 248 + 265 + + + 158 + 331 + 152 + 323 + 335 + 149 + 162 + + + 158 + 329 + 153 + 323 + 335 + 149 + 162 + + + 158 + 332 + 153 + 323 + 335 + 149 + 162 + + + 158 + 333 + 155 + 323 + 335 + 149 + 162 + + + 158 + 331 + 157 + 323 + 335 + 149 + 162 + + + 158 + 328 + 157 + 323 + 335 + 149 + 162 + + + 135 + 331 + 144 + 323 + 335 + 142 + 149 + + + 135 + 328 + 146 + 323 + 335 + 142 + 149 + + + 135 + 331 + 147 + 323 + 335 + 142 + 149 + + + 158 + 328 + 132 + 326 + 334 + 123 + 141 + + + 158 + 330 + 133 + 326 + 334 + 123 + 141 + + + 158 + 333 + 133 + 326 + 334 + 123 + 141 + + + 158 + 333 + 135 + 326 + 334 + 123 + 141 + + + 158 + 331 + 137 + 326 + 334 + 123 + 141 + + + 158 + 328 + 137 + 326 + 334 + 123 + 141 + + + 135 + 328 + 135 + 326 + 334 + 123 + 141 + + + 135 + 328 + 132 + 326 + 334 + 123 + 141 + + + 263 + 330 + 129 + 326 + 334 + 123 + 141 + + + 263 + 331 + 132 + 326 + 334 + 123 + 141 + + + 263 + 320 + 130 + 317 + 325 + 122 + 141 + + + 263 + 322 + 136 + 317 + 325 + 122 + 141 + + + 263 + 323 + 135 + 317 + 325 + 122 + 141 + + + 263 + 323 + 134 + 317 + 325 + 122 + 141 + + + 263 + 322 + 132 + 317 + 325 + 122 + 141 + + + 263 + 320 + 130 + 317 + 325 + 122 + 141 + + + 81 + 222 + 3515 + 213 + 225 + 3514 + 3526 + + + 3 + 216 + 3520 + 213 + 218 + 3519 + 3524 + + + 81 + 213 + 687 + 208 + 224 + 683 + 700 + + + 81 + 218 + 687 + 208 + 224 + 683 + 700 + + + 81 + 212 + 692 + 211 + 213 + 691 + 693 + + + 81 + 217 + 1636 + 216 + 219 + 1633 + 1637 + + + 81 + 212 + 1636 + 211 + 218 + 1635 + 1638 + + + 17 + 214 + 1640 + 211 + 219 + 1633 + 1642 + + + 81 + 214 + 2580 + 211 + 215 + 2580 + 2582 + + + 60 + 212 + 2581 + 211 + 215 + 2580 + 2582 + + + 81 + 216 + 2583 + 211 + 218 + 2578 + 2585 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 728 + 26 + 571 + 24 + 30 + 570 + 573 + + + 728 + 26 + 571 + 24 + 30 + 570 + 573 + + + 728 + 26 + 571 + 24 + 30 + 570 + 573 + + + 40 + 9 + 3393 + 5 + 17 + 3386 + 3399 + + + 40 + 12 + 3392 + 5 + 17 + 3386 + 3399 + + + 40 + 13 + 3395 + 5 + 17 + 3386 + 3399 + + + 40 + 11 + 3396 + 5 + 17 + 3386 + 3399 + + + 40 + 9 + 3398 + 5 + 17 + 3386 + 3399 + + + 40 + 6 + 3395 + 5 + 17 + 3386 + 3399 + + + 40 + 8 + 3391 + 5 + 17 + 3386 + 3399 + + + 40 + 10 + 3390 + 5 + 17 + 3386 + 3399 + + + 40 + 16 + 3395 + 5 + 17 + 3386 + 3399 + + + 40 + 15 + 3398 + 5 + 17 + 3386 + 3399 + + + 40 + 12 + 3398 + 5 + 17 + 3386 + 3399 + + + 626 + 713 + 582 + 713 + 713 + 582 + 582 + + + 627 + 702 + 3420 + 702 + 702 + 3420 + 3420 + + + 628 + 723 + 3461 + 723 + 723 + 3461 + 3461 + + + 629 + 763 + 3441 + 763 + 763 + 3441 + 3441 + + + 631 + 715 + 3413 + 712 + 718 + 3410 + 3415 + + + 631 + 716 + 3411 + 712 + 718 + 3410 + 3415 + + + 631 + 716 + 3413 + 712 + 718 + 3410 + 3415 + + + 631 + 713 + 3412 + 712 + 718 + 3410 + 3415 + + + 631 + 715 + 3411 + 712 + 718 + 3410 + 3415 + + + 631 + 716 + 3415 + 712 + 718 + 3410 + 3415 + + + 631 + 714 + 3441 + 712 + 717 + 3438 + 3442 + + + 631 + 714 + 3439 + 712 + 717 + 3438 + 3442 + + + 631 + 716 + 3440 + 712 + 717 + 3438 + 3442 + + + 631 + 716 + 3441 + 712 + 717 + 3438 + 3442 + + + 631 + 715 + 3442 + 712 + 717 + 3438 + 3442 + + + 631 + 713 + 3438 + 712 + 717 + 3438 + 3442 + + + 631 + 715 + 3440 + 712 + 717 + 3438 + 3442 + + + 631 + 723 + 585 + 723 + 733 + 579 + 595 + + + 631 + 731 + 589 + 723 + 733 + 579 + 595 + + + 631 + 728 + 589 + 723 + 733 + 579 + 595 + + + 631 + 727 + 589 + 723 + 733 + 579 + 595 + + + 631 + 727 + 591 + 723 + 733 + 579 + 595 + + + 631 + 724 + 592 + 723 + 733 + 579 + 595 + + + 631 + 726 + 594 + 723 + 733 + 579 + 595 + + + 631 + 732 + 581 + 723 + 733 + 579 + 595 + + + 631 + 733 + 584 + 723 + 733 + 579 + 595 + + + 34 + 727 + 591 + 723 + 733 + 579 + 595 + + + 34 + 724 + 592 + 723 + 733 + 579 + 595 + + + 34 + 726 + 594 + 723 + 733 + 579 + 595 + + + 34 + 732 + 581 + 723 + 733 + 579 + 595 + + + 34 + 733 + 584 + 723 + 733 + 579 + 595 + + + 641 + 727 + 587 + 723 + 733 + 579 + 595 + + + 4 + 711 + 3431 + 703 + 715 + 3419 + 3438 + + + 4 + 715 + 3430 + 703 + 715 + 3419 + 3438 + + + 4 + 708 + 3430 + 703 + 715 + 3419 + 3438 + + + 4 + 708 + 3434 + 703 + 715 + 3419 + 3438 + + + 4 + 750 + 3461 + 742 + 754 + 3460 + 3464 + + + 4 + 745 + 3462 + 742 + 754 + 3460 + 3464 + + + 4 + 745 + 3463 + 742 + 754 + 3460 + 3464 + + + 4 + 744 + 3464 + 742 + 754 + 3460 + 3464 + + + 4 + 743 + 3461 + 742 + 754 + 3460 + 3464 + + + 43 + 708 + 3434 + 703 + 715 + 3419 + 3438 + + + 43 + 689 + 3437 + 684 + 693 + 3436 + 3440 + + + 43 + 691 + 3440 + 684 + 693 + 3436 + 3440 + + + 43 + 677 + 3448 + 676 + 679 + 3436 + 3450 + + + 43 + 676 + 3447 + 676 + 679 + 3436 + 3450 + + + 43 + 693 + 3448 + 690 + 693 + 3444 + 3451 + + + 43 + 763 + 3476 + 756 + 765 + 3472 + 3479 + + + 43 + 759 + 3477 + 756 + 765 + 3472 + 3479 + + + 43 + 760 + 3474 + 756 + 765 + 3472 + 3479 + + + 43 + 763 + 3474 + 756 + 765 + 3472 + 3479 + + + 43 + 765 + 3474 + 756 + 765 + 3472 + 3479 + + + 43 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 43 + 725 + 3477 + 722 + 730 + 3474 + 3485 + + + 43 + 726 + 3476 + 722 + 730 + 3474 + 3485 + + + 43 + 726 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 724 + 3482 + 722 + 730 + 3474 + 3485 + + + 43 + 724 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 722 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 727 + 3479 + 722 + 730 + 3474 + 3485 + + + 43 + 727 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 741 + 586 + 737 + 744 + 577 + 587 + + + 43 + 738 + 584 + 737 + 744 + 577 + 587 + + + 43 + 741 + 579 + 737 + 744 + 577 + 587 + + + 43 + 737 + 578 + 737 + 744 + 577 + 587 + + + 43 + 758 + 623 + 754 + 765 + 607 + 625 + + + 43 + 762 + 620 + 754 + 765 + 607 + 625 + + + 43 + 758 + 618 + 754 + 765 + 607 + 625 + + + 43 + 762 + 614 + 754 + 765 + 607 + 625 + + + 41 + 707 + 3448 + 700 + 710 + 3442 + 3452 + + + 41 + 705 + 3446 + 700 + 710 + 3442 + 3452 + + + 41 + 704 + 3448 + 700 + 710 + 3442 + 3452 + + + 41 + 703 + 3447 + 700 + 710 + 3442 + 3452 + + + 41 + 706 + 3444 + 700 + 710 + 3442 + 3452 + + + 41 + 741 + 3427 + 738 + 751 + 3425 + 3434 + + + 41 + 742 + 3429 + 738 + 751 + 3425 + 3434 + + + 41 + 750 + 3428 + 738 + 751 + 3425 + 3434 + + + 542 + 750 + 3426 + 738 + 751 + 3425 + 3434 + + + 19 + 741 + 3440 + 733 + 743 + 3440 + 3442 + + + 19 + 736 + 3440 + 733 + 743 + 3440 + 3442 + + + 19 + 738 + 3440 + 733 + 743 + 3440 + 3442 + + + 23 + 734 + 3442 + 733 + 743 + 3440 + 3442 + + + 312 + 749 + 3441 + 745 + 752 + 3438 + 3443 + + + 312 + 751 + 3440 + 745 + 752 + 3438 + 3443 + + + 312 + 746 + 3440 + 745 + 752 + 3438 + 3443 + + + 630 + 735 + 3464 + 730 + 746 + 3460 + 3464 + + + 630 + 731 + 3462 + 730 + 746 + 3460 + 3464 + + + 630 + 730 + 3462 + 730 + 746 + 3460 + 3464 + + + 630 + 736 + 3464 + 730 + 746 + 3460 + 3464 + + + 630 + 745 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 746 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 747 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 745 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 746 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 747 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 745 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 746 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 747 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 634 + 745 + 3459 + 743 + 746 + 3457 + 3459 + + + 635 + 744 + 3459 + 743 + 746 + 3457 + 3459 + + + 638 + 745 + 3466 + 743 + 746 + 3465 + 3467 + + + 639 + 743 + 3466 + 743 + 746 + 3465 + 3467 + + + 636 + 749 + 3459 + 748 + 751 + 3457 + 3459 + + + 637 + 750 + 3459 + 748 + 751 + 3457 + 3459 + + + 640 + 750 + 3465 + 748 + 751 + 3465 + 3467 + + + 634 + 749 + 3465 + 748 + 751 + 3465 + 3467 + + + 45 + 762 + 3497 + 752 + 765 + 3494 + 3501 + + + 46 + 760 + 3497 + 752 + 765 + 3494 + 3501 + + + 46 + 758 + 3496 + 752 + 765 + 3494 + 3501 + + + 46 + 764 + 3498 + 752 + 765 + 3494 + 3501 + + + 46 + 763 + 3496 + 752 + 765 + 3494 + 3501 + + + 542 + 742 + 3429 + 738 + 751 + 3425 + 3434 + + + 542 + 744 + 3430 + 738 + 751 + 3425 + 3434 + + + 542 + 744 + 3429 + 738 + 751 + 3425 + 3434 + + + 542 + 748 + 3431 + 738 + 751 + 3425 + 3434 + + + 542 + 749 + 3430 + 738 + 751 + 3425 + 3434 + + + 542 + 748 + 3429 + 738 + 751 + 3425 + 3434 + + + 542 + 745 + 3428 + 738 + 751 + 3425 + 3434 + + + 542 + 744 + 3427 + 738 + 751 + 3425 + 3434 + + + 52 + 751 + 3429 + 738 + 751 + 3425 + 3434 + + + 52 + 739 + 3429 + 738 + 751 + 3425 + 3434 + + + 632 + 725 + 3416 + 722 + 732 + 3410 + 3421 + + + 633 + 725 + 3414 + 722 + 732 + 3410 + 3421 + + + 633 + 725 + 3414 + 722 + 732 + 3410 + 3421 + + + 658 + 740 + 624 + 737 + 741 + 622 + 625 + + + 642 + 759 + 661 + 755 + 764 + 657 + 667 + + + 648 + 761 + 661 + 755 + 764 + 657 + 667 + + + 657 + 763 + 661 + 755 + 764 + 657 + 667 + + + 655 + 751 + 633 + 724 + 760 + 600 + 640 + + + 655 + 753 + 628 + 724 + 760 + 600 + 640 + + + 655 + 750 + 626 + 724 + 760 + 600 + 640 + + + 655 + 748 + 627 + 724 + 760 + 600 + 640 + + + 655 + 748 + 629 + 724 + 760 + 600 + 640 + + + 655 + 746 + 632 + 724 + 760 + 600 + 640 + + + 655 + 749 + 634 + 724 + 760 + 600 + 640 + + + 655 + 751 + 635 + 724 + 760 + 600 + 640 + + + 655 + 754 + 635 + 724 + 760 + 600 + 640 + + + 655 + 741 + 629 + 724 + 760 + 600 + 640 + + + 655 + 739 + 630 + 724 + 760 + 600 + 640 + + + 655 + 740 + 632 + 724 + 760 + 600 + 640 + + + 655 + 736 + 631 + 724 + 760 + 600 + 640 + + + 655 + 734 + 628 + 724 + 760 + 600 + 640 + + + 655 + 734 + 627 + 724 + 760 + 600 + 640 + + + 655 + 736 + 624 + 724 + 760 + 600 + 640 + + + 655 + 737 + 621 + 724 + 760 + 600 + 640 + + + 655 + 735 + 618 + 724 + 760 + 600 + 640 + + + 655 + 740 + 616 + 724 + 760 + 600 + 640 + + + 655 + 742 + 615 + 724 + 760 + 600 + 640 + + + 655 + 743 + 613 + 724 + 760 + 600 + 640 + + + 655 + 746 + 611 + 724 + 760 + 600 + 640 + + + 655 + 742 + 606 + 724 + 760 + 600 + 640 + + + 655 + 739 + 605 + 724 + 760 + 600 + 640 + + + 655 + 738 + 607 + 724 + 760 + 600 + 640 + + + 655 + 737 + 609 + 724 + 760 + 600 + 640 + + + 655 + 736 + 611 + 724 + 760 + 600 + 640 + + + 655 + 735 + 613 + 724 + 760 + 600 + 640 + + + 655 + 736 + 615 + 724 + 760 + 600 + 640 + + + 655 + 738 + 622 + 724 + 760 + 600 + 640 + + + 95 + 69 + 1643 + 68 + 71 + 1642 + 1643 + + + + 140 + 331 + 435 + 328 + 333 + 433 + 438 + + + 140 + 332 + 436 + 328 + 333 + 433 + 438 + + + 140 + 332 + 437 + 328 + 333 + 433 + 438 + + + 140 + 330 + 434 + 328 + 333 + 433 + 438 + + + 140 + 330 + 435 + 328 + 333 + 433 + 438 + + + 140 + 333 + 437 + 328 + 333 + 433 + 438 + + + 140 + 332 + 438 + 328 + 333 + 433 + 438 + + + 67 + 224 + 253 + 213 + 237 + 238 + 267 + + + 67 + 225 + 252 + 213 + 237 + 238 + 267 + + + 67 + 226 + 252 + 213 + 237 + 238 + 267 + + + 67 + 228 + 251 + 213 + 237 + 238 + 267 + + + 67 + 229 + 253 + 213 + 237 + 238 + 267 + + + 67 + 228 + 255 + 213 + 237 + 238 + 267 + + + 67 + 226 + 257 + 213 + 237 + 238 + 267 + + + 67 + 223 + 256 + 213 + 237 + 238 + 267 + + + 67 + 223 + 254 + 213 + 237 + 238 + 267 + + + 67 + 220 + 254 + 213 + 237 + 238 + 267 + + + 67 + 225 + 250 + 213 + 237 + 238 + 267 + + + 67 + 224 + 248 + 213 + 237 + 238 + 267 + + + 67 + 226 + 248 + 213 + 237 + 238 + 267 + + + 67 + 228 + 248 + 213 + 237 + 238 + 267 + + + 67 + 231 + 251 + 213 + 237 + 238 + 267 + + + 67 + 232 + 253 + 213 + 237 + 238 + 267 + + + 67 + 229 + 256 + 213 + 237 + 238 + 267 + + + 232 + 270 + 329 + 266 + 280 + 319 + 332 + + + 232 + 270 + 302 + 255 + 281 + 289 + 322 + + + 232 + 272 + 301 + 255 + 281 + 289 + 322 + + + 232 + 274 + 301 + 255 + 281 + 289 + 322 + + + 232 + 276 + 302 + 255 + 281 + 289 + 322 + + + 232 + 279 + 304 + 255 + 281 + 289 + 322 + + + 232 + 272 + 308 + 255 + 281 + 289 + 322 + + + 232 + 271 + 318 + 255 + 281 + 289 + 322 + + + 232 + 269 + 319 + 255 + 281 + 289 + 322 + + + 237 + 272 + 301 + 255 + 281 + 289 + 322 + + + 238 + 272 + 301 + 255 + 281 + 289 + 322 + + + 236 + 272 + 301 + 255 + 281 + 289 + 322 + + + 235 + 269 + 290 + 267 + 273 + 289 + 292 + + + 233 + 278 + 295 + 278 + 281 + 293 + 298 + + +Rats(8) + + + 19 + 258 + 302 + 255 + 260 + 300 + 307 + + + 19 + 257 + 303 + 255 + 260 + 300 + 307 + + + 457 + 493 + 615 + 493 + 495 + 615 + 618 + + + 456 + 516 + 612 + 514 + 517 + 611 + 614 + + + 457 + 483 + 614 + 483 + 484 + 614 + 620 + + + 461 + 484 + 1560 + 483 + 486 + 1558 + 1564 + + + 462 + 493 + 1560 + 493 + 493 + 1560 + 1560 + + + 463 + 494 + 1558 + 494 + 494 + 1558 + 1558 + + + 464 + 495 + 1564 + 495 + 495 + 1564 + 1564 + + + 463 + 490 + 1564 + 490 + 490 + 1564 + 1564 + + + 462 + 488 + 1561 + 488 + 488 + 1561 + 1561 + + + 464 + 490 + 1558 + 490 + 490 + 1558 + 1558 + + + 464 + 490 + 1560 + 490 + 490 + 1560 + 1560 + + + 462 + 490 + 1562 + 490 + 490 + 1562 + 1562 + + + 463 + 492 + 1564 + 492 + 492 + 1564 + 1564 + + + 463 + 493 + 1562 + 493 + 493 + 1562 + 1562 + + + 464 + 495 + 1560 + 495 + 495 + 1560 + 1560 + + + 464 + 496 + 615 + 496 + 496 + 615 + 615 + + + 462 + 494 + 614 + 494 + 494 + 614 + 614 + + + 463 + 492 + 614 + 492 + 492 + 614 + 614 + + + 464 + 490 + 614 + 490 + 490 + 614 + 614 + + + 462 + 490 + 615 + 490 + 490 + 615 + 615 + + + 463 + 492 + 615 + 492 + 492 + 615 + 615 + + + 462 + 495 + 617 + 495 + 495 + 617 + 617 + + + 463 + 495 + 619 + 495 + 495 + 619 + 619 + + + 464 + 494 + 620 + 494 + 494 + 620 + 620 + + + 462 + 492 + 620 + 492 + 492 + 620 + 620 + + + 463 + 490 + 620 + 490 + 490 + 620 + 620 + + + 464 + 488 + 620 + 488 + 488 + 620 + 620 + + + 40 + 20 + 3380 + 16 + 23 + 3378 + 3386 + + + 40 + 21 + 3379 + 16 + 23 + 3378 + 3386 + + + 40 + 23 + 3380 + 16 + 23 + 3378 + 3386 + + + 40 + 22 + 3382 + 16 + 23 + 3378 + 3386 + + + 40 + 20 + 3383 + 16 + 23 + 3378 + 3386 + + + 40 + 20 + 3384 + 16 + 23 + 3378 + 3386 + + + 40 + 21 + 3384 + 16 + 23 + 3378 + 3386 + + + 40 + 18 + 3382 + 16 + 23 + 3378 + 3386 + + + 40 + 19 + 3379 + 16 + 23 + 3378 + 3386 + + + 40 + 21 + 3378 + 16 + 23 + 3378 + 3386 + + + 40 + 9 + 3374 + 5 + 11 + 3373 + 3381 + + + 40 + 8 + 3375 + 5 + 11 + 3373 + 3381 + + + 40 + 6 + 3376 + 5 + 11 + 3373 + 3381 + + + 40 + 7 + 3377 + 5 + 11 + 3373 + 3381 + + + 40 + 9 + 3377 + 5 + 11 + 3373 + 3381 + + + 40 + 8 + 3378 + 5 + 11 + 3373 + 3381 + + + 40 + 11 + 3378 + 5 + 11 + 3373 + 3381 + + + 40 + 9 + 3380 + 5 + 11 + 3373 + 3381 + + + 40 + 7 + 3380 + 5 + 11 + 3373 + 3381 + + + 40 + 6 + 3378 + 5 + 11 + 3373 + 3381 + + + 40 + 5 + 3376 + 5 + 11 + 3373 + 3381 + + + 67 + 657 + 3539 + 647 + 659 + 3533 + 3542 + + + 67 + 654 + 3539 + 647 + 659 + 3533 + 3542 + + + 67 + 653 + 3540 + 647 + 659 + 3533 + 3542 + + + 67 + 650 + 3540 + 647 + 659 + 3533 + 3542 + + + 67 + 647 + 3539 + 647 + 659 + 3533 + 3542 + + + 67 + 647 + 3538 + 647 + 659 + 3533 + 3542 + + + 41 + 650 + 3539 + 647 + 659 + 3533 + 3542 + + + 41 + 650 + 3540 + 647 + 659 + 3533 + 3542 + + + 41 + 654 + 3542 + 647 + 659 + 3533 + 3542 + + + 67 + 662 + 3533 + 661 + 666 + 3530 + 3536 + + + 67 + 664 + 3535 + 661 + 666 + 3530 + 3536 + + + 67 + 665 + 3536 + 661 + 666 + 3530 + 3536 + + + 67 + 663 + 3531 + 661 + 666 + 3530 + 3536 + + + 41 + 661 + 3533 + 661 + 666 + 3530 + 3536 + + + 41 + 662 + 3535 + 661 + 666 + 3530 + 3536 + + + 41 + 664 + 3535 + 661 + 666 + 3530 + 3536 + + + 264 + 620 + 3497 + 618 + 622 + 3494 + 3500 + + + 264 + 620 + 3497 + 618 + 622 + 3494 + 3500 + + + 264 + 620 + 3496 + 618 + 622 + 3494 + 3500 + + + 264 + 621 + 3496 + 618 + 622 + 3494 + 3500 + + + 264 + 622 + 3498 + 618 + 622 + 3494 + 3500 + + + 264 + 619 + 3499 + 618 + 622 + 3494 + 3500 + + + 264 + 620 + 3498 + 618 + 622 + 3494 + 3500 + + + 264 + 621 + 3498 + 618 + 622 + 3494 + 3500 + + + 264 + 618 + 3496 + 618 + 622 + 3494 + 3500 + + + 195 + 532 + 3325 + 529 + 535 + 3323 + 3328 + + + 195 + 533 + 3325 + 529 + 535 + 3323 + 3328 + + + 195 + 532 + 3326 + 529 + 535 + 3323 + 3328 + + + 195 + 531 + 3325 + 529 + 535 + 3323 + 3328 + + + 195 + 532 + 3324 + 529 + 535 + 3323 + 3328 + + + 195 + 533 + 3323 + 529 + 535 + 3323 + 3328 + + + 195 + 531 + 3323 + 529 + 535 + 3323 + 3328 + + + 195 + 530 + 3326 + 529 + 535 + 3323 + 3328 + + + 195 + 531 + 3328 + 529 + 535 + 3323 + 3328 + + + 195 + 533 + 3328 + 529 + 535 + 3323 + 3328 + + + 195 + 554 + 3286 + 551 + 557 + 3281 + 3288 + + + 195 + 555 + 3286 + 551 + 557 + 3281 + 3288 + + + 195 + 556 + 3286 + 551 + 557 + 3281 + 3288 + + + 195 + 553 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 554 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 555 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 556 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 553 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 554 + 3288 + 551 + 557 + 3281 + 3288 + + + 195 + 555 + 3288 + 551 + 557 + 3281 + 3288 + + + 67 + 536 + 3289 + 533 + 539 + 3286 + 3291 + + + 67 + 537 + 3289 + 533 + 539 + 3286 + 3291 + + + 67 + 535 + 3289 + 533 + 539 + 3286 + 3291 + + + 67 + 535 + 3288 + 533 + 539 + 3286 + 3291 + + + 67 + 535 + 3290 + 533 + 539 + 3286 + 3291 + + + 67 + 537 + 3290 + 533 + 539 + 3286 + 3291 + + + 67 + 537 + 3288 + 533 + 539 + 3286 + 3291 + + + 67 + 534 + 3287 + 533 + 539 + 3286 + 3291 + + + 67 + 538 + 3291 + 533 + 539 + 3286 + 3291 + + + 67 + 539 + 3289 + 533 + 539 + 3286 + 3291 + + + 22 + 533 + 3300 + 531 + 535 + 3297 + 3302 + + + 22 + 534 + 3299 + 531 + 535 + 3297 + 3302 + + + 22 + 532 + 3300 + 531 + 535 + 3297 + 3302 + + + 70 + 546 + 3333 + 544 + 547 + 3330 + 3337 + + + 70 + 545 + 3332 + 544 + 547 + 3330 + 3337 + + + 70 + 546 + 3333 + 544 + 547 + 3330 + 3337 + + + 70 + 544 + 3331 + 544 + 547 + 3330 + 3337 + + + 45 + 125 + 262 + 105 + 140 + 255 + 273 + + + 45 + 126 + 266 + 105 + 140 + 255 + 273 + + + 45 + 118 + 265 + 105 + 140 + 255 + 273 + + + 45 + 123 + 280 + 105 + 123 + 273 + 286 + + + 45 + 120 + 278 + 105 + 123 + 273 + 286 + + + 45 + 123 + 275 + 105 + 123 + 273 + 286 + + + 45 + 120 + 280 + 105 + 121 + 273 + 286 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 277 + 464 + 519 + 458 + 466 + 514 + 524 + + + 277 + 462 + 519 + 458 + 466 + 514 + 524 + + + 277 + 463 + 519 + 458 + 466 + 514 + 524 + + + 277 + 462 + 520 + 458 + 466 + 514 + 524 + + + 277 + 461 + 520 + 458 + 466 + 514 + 524 + + + 277 + 463 + 520 + 458 + 466 + 514 + 524 + + + 277 + 463 + 521 + 458 + 466 + 514 + 524 + + + 277 + 464 + 515 + 458 + 466 + 514 + 524 + + + 277 + 464 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 464 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 463 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 465 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 463 + 1464 + 461 + 466 + 1462 + 1467 + + + 277 + 465 + 1464 + 461 + 466 + 1462 + 1467 + + + 276 + 460 + 2407 + 460 + 463 + 2406 + 2407 + + + 248 + 413 + 437 + 410 + 417 + 435 + 439 + + + 248 + 413 + 437 + 410 + 417 + 435 + 439 + + + 248 + 411 + 438 + 410 + 417 + 435 + 439 + + + 248 + 412 + 439 + 410 + 417 + 435 + 439 + + + 248 + 410 + 436 + 410 + 417 + 435 + 439 + + + 248 + 416 + 437 + 410 + 417 + 435 + 439 + + + 248 + 416 + 436 + 410 + 417 + 435 + 439 + + + 521 + 468 + 735 + 466 + 473 + 733 + 737 + + + 521 + 467 + 734 + 466 + 473 + 733 + 737 + + + 521 + 467 + 736 + 466 + 473 + 733 + 737 + + + 521 + 469 + 734 + 466 + 473 + 733 + 737 + + + 521 + 469 + 736 + 466 + 473 + 733 + 737 + + + 521 + 470 + 734 + 466 + 473 + 733 + 737 + + + 521 + 471 + 735 + 466 + 473 + 733 + 737 + + + 521 + 469 + 735 + 466 + 473 + 733 + 737 + + + 521 + 466 + 734 + 466 + 473 + 733 + 737 + + + 202 + 375 + 3272 + 371 + 376 + 3270 + 3276 + + + 295 + 330 + 3370 + 327 + 332 + 3367 + 3374 + + + 295 + 331 + 3370 + 327 + 332 + 3367 + 3374 + + + 295 + 331 + 3371 + 327 + 332 + 3367 + 3374 + + + 295 + 330 + 3371 + 327 + 332 + 3367 + 3374 + + + 295 + 327 + 3365 + 325 + 329 + 3361 + 3369 + + + 295 + 327 + 3364 + 325 + 329 + 3361 + 3369 + + + 295 + 326 + 3364 + 325 + 329 + 3361 + 3369 + + + 34 + 318 + 1607 + 314 + 319 + 1603 + 1608 + + + 34 + 319 + 1608 + 314 + 319 + 1603 + 1608 + + + 34 + 316 + 1607 + 314 + 319 + 1603 + 1608 + + + 34 + 314 + 1608 + 314 + 319 + 1603 + 1608 + + + 34 + 314 + 1606 + 314 + 319 + 1603 + 1608 + + + 34 + 314 + 1603 + 314 + 319 + 1603 + 1608 + + + 34 + 476 + 2340 + 473 + 478 + 2335 + 2340 + + + 34 + 474 + 2338 + 473 + 478 + 2335 + 2340 + + + 34 + 473 + 2335 + 473 + 478 + 2335 + 2340 + + + 34 + 476 + 2336 + 473 + 478 + 2335 + 2340 + + + 34 + 478 + 2338 + 473 + 478 + 2335 + 2340 + + + 290 + 389 + 3372 + 382 + 391 + 3360 + 3374 + + + 290 + 385 + 3370 + 382 + 391 + 3360 + 3374 + + + 290 + 390 + 3367 + 382 + 391 + 3360 + 3374 + + + 290 + 386 + 3364 + 382 + 391 + 3360 + 3374 + + + 290 + 389 + 3364 + 382 + 391 + 3360 + 3374 + + + 202 + 370 + 3354 + 366 + 374 + 3350 + 3363 + + + 202 + 371 + 3358 + 366 + 374 + 3350 + 3363 + + + 203 + 364 + 3349 + 357 + 368 + 3347 + 3358 + + + 203 + 360 + 3350 + 357 + 368 + 3347 + 3358 + + + 203 + 360 + 3353 + 357 + 368 + 3347 + 3358 + + + 203 + 361 + 3355 + 357 + 368 + 3347 + 3358 + + + 203 + 365 + 3354 + 357 + 368 + 3347 + 3358 + + + 22 + 212 + 2584 + 212 + 212 + 2584 + 2584 + + + + + 40 + 630 + 3301 + 629 + 634 + 3293 + 3307 + + + 40 + 630 + 3299 + 629 + 634 + 3293 + 3307 + + + 40 + 634 + 3299 + 629 + 634 + 3293 + 3307 + + + 40 + 633 + 3302 + 629 + 634 + 3293 + 3307 + + + 41 + 631 + 3303 + 629 + 634 + 3293 + 3307 + + + 41 + 631 + 3305 + 629 + 634 + 3293 + 3307 + + + 41 + 630 + 3306 + 629 + 634 + 3293 + 3307 + + + 104 + 631 + 3307 + 629 + 634 + 3293 + 3307 + + + 40 + 630 + 3297 + 629 + 634 + 3293 + 3307 + + + 41 + 631 + 3307 + 629 + 634 + 3293 + 3307 + + + 41 + 633 + 3297 + 629 + 634 + 3293 + 3307 + + + 40 + 632 + 3298 + 629 + 634 + 3293 + 3307 + + + 41 + 630 + 3298 + 629 + 634 + 3293 + 3307 + + + 41 + 638 + 3306 + 634 + 648 + 3301 + 3308 + + + 40 + 637 + 3304 + 634 + 648 + 3301 + 3308 + + + 41 + 639 + 3305 + 634 + 648 + 3301 + 3308 + + + 40 + 639 + 3302 + 634 + 648 + 3301 + 3308 + + + 41 + 641 + 3302 + 634 + 648 + 3301 + 3308 + + + 40 + 641 + 3305 + 634 + 648 + 3301 + 3308 + + + 40 + 641 + 3307 + 634 + 648 + 3301 + 3308 + + + 43 + 669 + 3294 + 663 + 670 + 3290 + 3296 + + + 43 + 667 + 3293 + 663 + 670 + 3290 + 3296 + + + 43 + 666 + 3294 + 663 + 670 + 3290 + 3296 + + + 43 + 664 + 3293 + 663 + 670 + 3290 + 3296 + + + 43 + 663 + 3292 + 663 + 670 + 3290 + 3296 + + + 43 + 665 + 3291 + 663 + 670 + 3290 + 3296 + + + 43 + 667 + 3291 + 663 + 670 + 3290 + 3296 + + + 46 + 670 + 3290 + 663 + 670 + 3290 + 3296 + + + 43 + 667 + 3291 + 663 + 670 + 3290 + 3296 + + + 19 + 668 + 3295 + 663 + 670 + 3290 + 3296 + + + 555 + 601 + 3565 + 593 + 605 + 3563 + 3581 + + + 555 + 601 + 3567 + 593 + 605 + 3563 + 3581 + + + 555 + 602 + 3566 + 593 + 605 + 3563 + 3581 + + + 555 + 602 + 3568 + 593 + 605 + 3563 + 3581 + + + 555 + 600 + 3571 + 593 + 605 + 3563 + 3581 + + + 555 + 602 + 3572 + 593 + 605 + 3563 + 3581 + + + 555 + 600 + 3573 + 593 + 605 + 3563 + 3581 + + + 555 + 601 + 3573 + 593 + 605 + 3563 + 3581 + + + 555 + 603 + 3574 + 593 + 605 + 3563 + 3581 + + + 555 + 596 + 3574 + 593 + 605 + 3563 + 3581 + + + 555 + 598 + 3576 + 593 + 605 + 3563 + 3581 + + + 555 + 599 + 3577 + 593 + 605 + 3563 + 3581 + + + 555 + 597 + 3578 + 593 + 605 + 3563 + 3581 + + + 555 + 593 + 3576 + 593 + 605 + 3563 + 3581 + + + 195 + 608 + 3569 + 607 + 617 + 3564 + 3570 + + + 195 + 608 + 3567 + 607 + 617 + 3564 + 3570 + + + 195 + 610 + 3566 + 607 + 617 + 3564 + 3570 + + + 195 + 611 + 3569 + 607 + 617 + 3564 + 3570 + + + 195 + 611 + 3566 + 607 + 617 + 3564 + 3570 + + + 195 + 612 + 3567 + 607 + 617 + 3564 + 3570 + + + 195 + 614 + 3566 + 607 + 617 + 3564 + 3570 + + + 195 + 614 + 3568 + 607 + 617 + 3564 + 3570 + + + 195 + 615 + 3567 + 607 + 617 + 3564 + 3570 + + + 195 + 615 + 3565 + 607 + 617 + 3564 + 3570 + + + 195 + 616 + 3567 + 607 + 617 + 3564 + 3570 + + + 344 + 657 + 3287 + 656 + 663 + 3282 + 3288 + + + 344 + 660 + 3287 + 656 + 663 + 3282 + 3288 + + + 344 + 662 + 3285 + 656 + 663 + 3282 + 3288 + + + 344 + 662 + 3283 + 656 + 663 + 3282 + 3288 + + + 344 + 657 + 3283 + 656 + 663 + 3282 + 3288 + + + 195 + 667 + 3281 + 667 + 670 + 3281 + 3289 + + + 195 + 668 + 3283 + 667 + 670 + 3281 + 3289 + + + 195 + 667 + 3284 + 667 + 670 + 3281 + 3289 + + + 195 + 667 + 3286 + 667 + 670 + 3281 + 3289 + + + 195 + 669 + 3285 + 667 + 670 + 3281 + 3289 + + + 195 + 670 + 3284 + 667 + 670 + 3281 + 3289 + + + 195 + 670 + 3288 + 667 + 670 + 3281 + 3289 + + + 195 + 654 + 3294 + 648 + 662 + 3282 + 3302 + + + 195 + 653 + 3293 + 648 + 662 + 3282 + 3302 + + + 195 + 652 + 3294 + 648 + 662 + 3282 + 3302 + + + 195 + 650 + 3293 + 648 + 662 + 3282 + 3302 + + + 195 + 651 + 3292 + 648 + 662 + 3282 + 3302 + + + 195 + 650 + 3291 + 648 + 662 + 3282 + 3302 + + + 195 + 651 + 3290 + 648 + 662 + 3282 + 3302 + + + 195 + 652 + 3291 + 648 + 662 + 3282 + 3302 + + + 195 + 653 + 3290 + 648 + 662 + 3282 + 3302 + + + 195 + 655 + 3290 + 648 + 662 + 3282 + 3302 + + + 104 + 635 + 511 + 631 + 641 + 505 + 516 + + + 104 + 632 + 509 + 631 + 641 + 505 + 516 + + + 104 + 637 + 509 + 631 + 641 + 505 + 516 + + + 104 + 634 + 510 + 631 + 641 + 505 + 516 + + + 29 + 663 + 3277 + 660 + 670 + 3269 + 3279 + + + 29 + 668 + 3277 + 660 + 670 + 3269 + 3279 + + + 29 + 663 + 3278 + 660 + 670 + 3269 + 3279 + + + 29 + 661 + 3272 + 660 + 670 + 3269 + 3279 + + + 29 + 667 + 3276 + 660 + 670 + 3269 + 3279 + + + 343 + 659 + 3302 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3301 + 648 + 666 + 3289 + 3302 + + + 343 + 659 + 3300 + 648 + 666 + 3289 + 3302 + + + 343 + 658 + 3299 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3299 + 648 + 666 + 3289 + 3302 + + + 343 + 661 + 3298 + 648 + 666 + 3289 + 3302 + + + 343 + 659 + 3298 + 648 + 666 + 3289 + 3302 + + + 343 + 658 + 3297 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3297 + 648 + 666 + 3289 + 3302 + + + 343 + 662 + 3297 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3295 + 648 + 666 + 3289 + 3302 + + + 343 + 658 + 3296 + 648 + 666 + 3289 + 3302 + + + 99 + 256 + 152 + 251 + 260 + 152 + 160 + + + 99 + 260 + 154 + 251 + 260 + 152 + 160 + + + 99 + 259 + 159 + 251 + 260 + 152 + 160 + + + 99 + 253 + 156 + 251 + 260 + 152 + 160 + + + 99 + 256 + 156 + 251 + 260 + 152 + 160 + + + 99 + 254 + 160 + 251 + 260 + 152 + 160 + + + 177 + 65 + 361 + 60 + 66 + 360 + 366 + + + 177 + 64 + 363 + 60 + 66 + 360 + 366 + + + 177 + 61 + 361 + 60 + 66 + 360 + 366 + + + 177 + 63 + 364 + 60 + 66 + 360 + 366 + + + 177 + 64 + 363 + 60 + 66 + 360 + 366 + + + 177 + 63 + 365 + 60 + 66 + 360 + 366 + + + 177 + 63 + 365 + 60 + 66 + 360 + 366 + + + 177 + 63 + 365 + 60 + 66 + 360 + 366 + + + 177 + 63 + 364 + 60 + 66 + 360 + 366 + + + 409 + 644 + 666 + 642 + 646 + 664 + 668 + + + 409 + 644 + 664 + 642 + 646 + 662 + 666 + + + 409 + 645 + 665 + 643 + 647 + 663 + 667 + + + 409 + 645 + 667 + 643 + 647 + 665 + 669 + + + 409 + 646 + 663 + 644 + 648 + 661 + 665 + + + 409 + 647 + 661 + 645 + 649 + 659 + 663 + + + 409 + 647 + 667 + 645 + 649 + 665 + 669 + + + 409 + 648 + 669 + 646 + 650 + 667 + 671 + + + 409 + 648 + 659 + 646 + 650 + 657 + 661 + + + 409 + 649 + 657 + 647 + 651 + 655 + 659 + + + 409 + 649 + 662 + 647 + 651 + 660 + 664 + + + 409 + 650 + 665 + 648 + 652 + 663 + 667 + + + 409 + 650 + 669 + 648 + 652 + 667 + 671 + + + 409 + 651 + 667 + 649 + 653 + 665 + 669 + + + 409 + 653 + 666 + 651 + 655 + 664 + 668 + + + 409 + 653 + 669 + 647 + 653 + 667 + 671 + + + 409 + 656 + 663 + 654 + 658 + 661 + 665 + + + 409 + 657 + 659 + 655 + 659 + 657 + 661 + + + 409 + 658 + 661 + 656 + 660 + 659 + 663 + + + 409 + 658 + 670 + 656 + 660 + 668 + 672 + + + 409 + 659 + 659 + 657 + 661 + 657 + 661 + + + + 409 + 660 + 660 + 658 + 662 + 658 + 662 + + + 409 + 660 + 667 + 658 + 662 + 665 + 669 + + + 409 + 662 + 665 + 660 + 664 + 663 + 667 + + + 409 + 662 + 662 + 660 + 664 + 660 + 664 + + + 409 + 662 + 660 + 650 + 664 + 658 + 662 + + + 409 + 646 + 661 + 646 + 662 + 659 + 663 + + + 409 + 665 + 664 + 663 + 667 + 662 + 666 + + + 409 + 665 + 669 + 663 + 667 + 667 + 671 + + + 409 + 646 + 671 + 644 + 648 + 669 + 671 + + + 409 + 665 + 668 + 649 + 665 + 666 + 670 + + + 409 + 667 + 664 + 665 + 669 + 662 + 666 + + + 409 + 667 + 662 + 665 + 669 + 660 + 664 + + + 409 + 668 + 663 + 666 + 670 + 661 + 665 + + + 409 + 669 + 667 + 667 + 671 + 665 + 669 + + + 409 + 669 + 669 + 667 + 671 + 667 + 671 + + + 409 + 669 + 663 + 667 + 671 + 661 + 665 + + + 409 + 646 + 665 + 642 + 646 + 664 + 668 + + + 408 + 656 + 662 + 656 + 656 + 662 + 662 + + + 34 + 11 + 3395 + 8 + 14 + 3392 + 3398 + + + 40 + 10 + 3394 + 8 + 13 + 3392 + 3397 + + + 40 + 11 + 3397 + 9 + 13 + 3395 + 3398 + + + 40 + 11 + 3395 + 8 + 14 + 3392 + 3398 + + + 521 + 464 + 766 + 463 + 466 + 765 + 768 + + + 521 + 465 + 766 + 463 + 466 + 765 + 768 + + + 521 + 466 + 766 + 463 + 466 + 765 + 768 + + + 521 + 466 + 767 + 463 + 466 + 765 + 768 + + + 521 + 466 + 768 + 463 + 466 + 765 + 768 + + + 521 + 465 + 768 + 463 + 466 + 765 + 768 + + + 521 + 464 + 768 + 463 + 466 + 765 + 768 + + + 521 + 464 + 767 + 463 + 466 + 765 + 768 + + + 521 + 463 + 767 + 463 + 466 + 765 + 768 + + + 521 + 463 + 765 + 463 + 466 + 765 + 768 + + + 195 + 57 + 143 + 56 + 60 + 143 + 151 + + + 195 + 57 + 144 + 56 + 60 + 143 + 151 + + + 195 + 57 + 145 + 56 + 60 + 143 + 151 + + + 195 + 58 + 145 + 56 + 60 + 143 + 151 + + + 195 + 59 + 145 + 56 + 60 + 143 + 151 + + + 195 + 59 + 146 + 56 + 60 + 143 + 151 + + + 195 + 60 + 144 + 56 + 60 + 143 + 151 + + + 195 + 60 + 145 + 56 + 60 + 143 + 151 + + + 195 + 60 + 146 + 56 + 60 + 143 + 151 + + + 195 + 60 + 143 + 56 + 60 + 143 + 151 + + + 542 + 60 + 117 + 56 + 63 + 113 + 120 + + 542 + 60 + 116 + 56 + 63 + 113 + 120 + + 542 + 59 + 117 + 56 + 63 + 113 + 120 + + 542 + 60 + 115 + 56 + 63 + 113 + 120 + + 542 + 59 + 115 + 56 + 63 + 113 + 120 + + + 542 + 59 + 114 + 56 + 63 + 113 + 120 + + + 298 + 58 + 114 + 56 + 63 + 113 + 120 + + + 298 + 58 + 115 + 56 + 63 + 113 + 120 + + + 298 + 57 + 115 + 56 + 63 + 113 + 120 + + + 298 + 57 + 116 + 56 + 63 + 113 + 120 + + + 298 + 57 + 117 + 56 + 63 + 113 + 120 + + + 298 + 58 + 118 + 56 + 63 + 113 + 120 + + + 298 + 57 + 114 + 56 + 63 + 113 + 120 + + + + 190 + 175 + 174 + 173 + 206 + 165 + 185 + + + 190 + 179 + 167 + 173 + 206 + 155 + 175 + + + 190 + 182 + 156 + 173 + 206 + 155 + 175 + + + 190 + 175 + 174 + 173 + 206 + 165 + 185 + + 190 + 175 + 174 + 173 + 206 + 165 + 185 + + 190 + 175 + 174 + 173 + 206 + 165 + 185 + + 190 + 175 + 174 + 173 + 206 + 165 + 185 + + + 190 + 260 + 251 + 260 + 300 + 234 + 265 + + + 190 + 262 + 255 + 260 + 300 + 234 + 265 + + + 190 + 270 + 234 + 260 + 300 + 234 + 265 + + + 190 + 276 + 240 + 260 + 300 + 234 + 265 + + + 190 + 290 + 263 + 260 + 300 + 234 + 265 + + + 190 + 272 + 240 + 260 + 300 + 234 + 265 + + + 190 + 296 + 250 + 260 + 300 + 234 + 265 + + + 190 + 269 + 264 + 260 + 300 + 234 + 265 + + + 190 + 288 + 244 + 260 + 300 + 234 + 265 + + + 190 + 282 + 240 + 260 + 300 + 234 + 265 + + + 82 + 330 + 662 + 329 + 332 + 658 + 664 + + + 156 + 331 + 668 + 328 + 332 + 666 + 670 + + + 166 + 270 + 654 + 268 + 270 + 646 + 654 + + + 171 + 268 + 646 + 268 + 270 + 646 + 654 + + + 163 + 325 + 713 + 323 + 333 + 713 + 713 + + + 163 + 331 + 713 + 323 + 333 + 713 + 713 + + + 317 + 467 + 649 + 467 + 467 + 646 + 655 + + + 316 + 537 + 615 + 534 + 542 + 615 + 616 + + + 170 + 544 + 702 + 538 + 545 + 702 + 703 + + + 764 + 471 + 856 + 469 + 471 + 855 + 858 + + + 212 + 417 + 570 + 414 + 422 + 569 + 570 + + + 212 + 266 + 659 + 261 + 267 + 658 + 660 + + + 212 + 262 + 659 + 261 + 267 + 658 + 660 + + + 214 + 418 + 3377 + 409 + 418 + 3373 + 3382 + + + 214 + 414 + 3376 + 409 + 418 + 3373 + 3382 + + + 214 + 411 + 3377 + 409 + 418 + 3373 + 3382 + + + 214 + 410 + 3379 + 409 + 418 + 3373 + 3382 + + + 214 + 413 + 3381 + 409 + 418 + 3373 + 3382 + + + 214 + 415 + 3381 + 409 + 418 + 3373 + 3382 + + + 214 + 413 + 3382 + 409 + 418 + 3373 + 3382 + + + 184 + 413 + 3394 + 410 + 414 + 3387 + 3395 + + + 184 + 411 + 3393 + 410 + 414 + 3387 + 3395 + + + 184 + 410 + 3390 + 410 + 414 + 3387 + 3395 + + + 297 + 435 + 565 + 434 + 437 + 561 + 567 + + + 395 + 406 + 562 + 402 + 413 + 559 + 565 + + + 3 + 412 + 545 + 405 + 412 + 545 + 550 + + + 3 + 410 + 546 + 405 + 412 + 545 + 550 + + + 3 + 407 + 545 + 405 + 412 + 545 + 550 + + + 3 + 405 + 546 + 405 + 412 + 545 + 550 + + + 3 + 406 + 548 + 405 + 412 + 545 + 550 + + + 3 + 405 + 550 + 405 + 412 + 545 + 550 + + + 3 + 407 + 550 + 405 + 412 + 545 + 550 + + + 0 + 432 + 535 + 399 + 435 + 531 + 540 + + + 0 + 425 + 540 + 399 + 435 + 531 + 540 + + + 0 + 415 + 540 + 399 + 435 + 531 + 540 + + + 0 + 405 + 539 + 399 + 435 + 531 + 540 + + + 0 + 407 + 531 + 399 + 435 + 531 + 540 + + + 252 + 410 + 531 + 399 + 435 + 531 + 540 + + + 8 + 432 + 540 + 431 + 436 + 532 + 548 + + + 213 + 427 + 548 + 426 + 428 + 546 + 549 + + + 213 + 426 + 546 + 426 + 428 + 546 + 549 + + + 540 + 715 + 1451 + 712 + 716 + 1450 + 1454 + + + 540 + 713 + 1453 + 712 + 716 + 1450 + 1454 + + + 239 + 409 + 483 + 408 + 411 + 480 + 485 + + + 248 + 412 + 476 + 408 + 416 + 468 + 480 + + + 248 + 415 + 462 + 411 + 464 + 458 + 466 + + + 249 + 402 + 466 + 402 + 403 + 463 + 469 + + + 249 + 403 + 466 + 402 + 403 + 463 + 469 + + + 248 + 393 + 462 + 390 + 394 + 462 + 466 + + + 248 + 396 + 469 + 394 + 400 + 466 + 473 + + + 239 + 395 + 479 + 393 + 398 + 475 + 483 + + + 239 + 399 + 481 + 396 + 403 + 476 + 483 + + + 239 + 395 + 489 + 391 + 399 + 485 + 493 + + + 621 + 395 + 1766 + 394 + 396 + 1766 + 1770 + + + 624 + 415 + 833 + 411 + 415 + 833 + 835 + + + 320 + 612 + 532 + 608 + 621 + 528 + 541 + + + 320 + 616 + 531 + 608 + 621 + 528 + 541 + + + 320 + 619 + 533 + 608 + 621 + 528 + 541 + + + 320 + 617 + 535 + 608 + 621 + 528 + 541 + + + 320 + 619 + 538 + 608 + 621 + 528 + 541 + + + 320 + 614 + 539 + 608 + 621 + 528 + 541 + + + 2 + 618 + 530 + 617 + 625 + 526 + 532 + + + 2 + 618 + 527 + 617 + 625 + 526 + 532 + + + 2 + 622 + 530 + 617 + 625 + 526 + 532 + + + 2 + 624 + 526 + 617 + 625 + 526 + 532 + + + 2 + 579 + 563 + 576 + 581 + 554 + 567 + + + 2 + 579 + 564 + 576 + 581 + 554 + 567 + + + 2 + 579 + 565 + 576 + 581 + 554 + 567 + + + 2 + 579 + 567 + 576 + 581 + 554 + 567 + + + 541 + 417 + 163 + 414 + 418 + 161 + 165 + + + 735 + 517 + 545 + 515 + 518 + 543 + 548 + + + 736 + 511 + 551 + 510 + 516 + 551 + 552 + + + 736 + 514 + 551 + 510 + 516 + 551 + 552 + + + 788 + 512 + 1481 + 510 + 515 + 1479 + 1483 + + + 95 + 515 + 2422 + 510 + 517 + 2421 + 2423 + + + 95 + 512 + 2423 + 510 + 517 + 2421 + 2423 + + + 95 + 511 + 2422 + 510 + 517 + 2421 + 2423 + + + 779 + 510 + 2426 + 508 + 513 + 2424 + 2427 + + + 513 + 597 + 756 + 596 + 597 + 755 + 758 + + + 269 + 372 + 438 + 370 + 377 + 435 + 440 + + + 253 + 372 + 443 + 368 + 375 + 441 + 445 + + diff --git a/GameServer/conf/server/locs/NpcLoc.xml.gz b/GameServer/conf/server/locs/NpcLoc.xml.gz new file mode 100644 index 0000000..a9279f8 Binary files /dev/null and b/GameServer/conf/server/locs/NpcLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/NpcLocOLDF2P.xml.gz b/GameServer/conf/server/locs/NpcLocOLDF2P.xml.gz new file mode 100644 index 0000000..83a65eb Binary files /dev/null and b/GameServer/conf/server/locs/NpcLocOLDF2P.xml.gz differ diff --git a/GameServer/conf/server/locs/Shops.xml.gz b/GameServer/conf/server/locs/Shops.xml.gz new file mode 100644 index 0000000..6b40850 Binary files /dev/null and b/GameServer/conf/server/locs/Shops.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/NpcLoc.xml.gz b/GameServer/conf/server/locs/backup/NpcLoc.xml.gz new file mode 100644 index 0000000..dfa5332 Binary files /dev/null and b/GameServer/conf/server/locs/backup/NpcLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/NpcLoc.xml.gz.12.06.2010 b/GameServer/conf/server/locs/backup/NpcLoc.xml.gz.12.06.2010 new file mode 100644 index 0000000..69fa084 Binary files /dev/null and b/GameServer/conf/server/locs/backup/NpcLoc.xml.gz.12.06.2010 differ diff --git a/GameServer/conf/server/locs/backup/tmp/GameObjectLoc.xml b/GameServer/conf/server/locs/backup/tmp/GameObjectLoc.xml new file mode 100644 index 0000000..a6372e9 --- /dev/null +++ b/GameServer/conf/server/locs/backup/tmp/GameObjectLoc.xml @@ -0,0 +1,178076 @@ + + + 70 + 107 + 329 + 0 + 0 + + + 205 + 110 + 320 + 0 + 0 + + + 38 + 315 + 447 + 4 + 0 + + + 192 + 738 + 477 + 0 + 0 + + + 1 + 110 + 640 + 0 + 0 + + + 0 + 635 + 662 + 0 + 0 + + + 284 + 635 + 711 + 0 + 0 + + + 72 + 174 + 604 + 3 + 0 + + + 20 + 454 + 463 + 0 + 0 + + + 4 + 199 + 177 + 0 + 0 + + + 34 + 682 + 561 + 1 + 0 + + + 70 + 103 + 342 + 0 + 0 + + + 0 + 169 + 622 + 0 + 0 + + + 1079 + 512 + 550 + 2 + 0 + + + 306 + 757 + 465 + 0 + 0 + + + 284 + 661 + 683 + 2 + 0 + + + 1 + 326 + 540 + 3 + 1 + + + 21 + 598 + 471 + 0 + 0 + + + 70 + 243 + 145 + 0 + 0 + + + 284 + 663 + 681 + 2 + 0 + + + 3 + 319 + 659 + 0 + 0 + + + 205 + 131 + 269 + 0 + 0 + + + 7 + 323 + 545 + 2 + 0 + + + 1 + 523 + 598 + 0 + 0 + + + 306 + 495 + 569 + 0 + 0 + + + 525 + 693 + 508 + 6 + 0 + + + 0 + 762 + 462 + 0 + 0 + + + 20 + 267 + 132 + 6 + 0 + + + 70 + 125 + 282 + 0 + 0 + + + 113 + 618 + 842 + 3 + 0 + + + 1 + 577 + 542 + 2 + 0 + + + 313 + 749 + 470 + 3 + 0 + + + 284 + 665 + 679 + 2 + 0 + + + 4 + 229 + 154 + 0 + 0 + + + 70 + 154 + 229 + 0 + 0 + + + 1 + 593 + 709 + 0 + 1 + + + 34 + 452 + 692 + 6 + 0 + + + 22 + 652 + 540 + 2 + 0 + + + 96 + 139 + 507 + 6 + 0 + + + 309 + 548 + 447 + 0 + 0 + + + 309 + 545 + 445 + 0 + 0 + + + 309 + 544 + 450 + 0 + 0 + + + 76 + 80 + 441 + 2 + 0 + + + 15 + 252 + 140 + 0 + 0 + + + 72 + 175 + 601 + 3 + 0 + + + 597 + 724 + 432 + 4 + 0 + + + 34 + 679 + 665 + 0 + 0 + + + 597 + 719 + 435 + 6 + 0 + + + 938 + 661 + 741 + 2 + 0 + + + 284 + 628 + 719 + 0 + 0 + + + 110 + 282 + 373 + 0 + 0 + + + 70 + 213 + 331 + 0 + 0 + + + 284 + 669 + 675 + 2 + 0 + + + 38 + 97 + 364 + 0 + 0 + + + 597 + 746 + 472 + 2 + 0 + + + 205 + 307 + 115 + 0 + 0 + + + 20 + 151 + 467 + 0 + 0 + + + 145 + 283 + 2971 + 0 + 0 + + + 597 + 746 + 513 + 2 + 0 + + + 284 + 667 + 677 + 2 + 0 + + + 70 + 164 + 430 + 0 + 0 + + + 70 + 326 + 322 + 0 + 0 + + + 4 + 179 + 196 + 0 + 0 + + + 20 + 61 + 575 + 0 + 0 + + + 34 + 707 + 541 + 7 + 0 + + + 3 + 79 + 444 + 2 + 0 + + + 960 + 626 + 721 + 0 + 0 + + + 20 + 177 + 593 + 0 + 0 + + + 1180 + 541 + 707 + 4 + 0 + + + 205 + 316 + 111 + 0 + 0 + + + 309 + 550 + 445 + 0 + 0 + + + 21 + 271 + 649 + 2 + 0 + + + 597 + 672 + 524 + 6 + 0 + + + 283 + 607 + 857 + 7 + 0 + + + 70 + 234 + 150 + 0 + 0 + + + 25 + 455 + 687 + 0 + 0 + + + 284 + 633 + 713 + 0 + 0 + + + 12 + 688 + 656 + 1 + 0 + + + 217 + 133 + 264 + 0 + 0 + + + 70 + 114 + 308 + 0 + 0 + + + 0 + 668 + 468 + 0 + 0 + + + 16 + 321 + 548 + 2 + 0 + + + 36 + 722 + 433 + 2 + 0 + + + 72 + 175 + 600 + 3 + 0 + + + 446 + 623 + 614 + 4 + 0 + + + 13 + 105 + 672 + 0 + 0 + + + 1 + 112 + 630 + 0 + 0 + + + 36 + 337 + 522 + 0 + 0 + + + 70 + 173 + 408 + 0 + 0 + + + 34 + 690 + 710 + 2 + 0 + + + 284 + 657 + 687 + 2 + 0 + + + 204 + 677 + 565 + 0 + 0 + + + 4 + 182 + 193 + 0 + 0 + + + 7 + 618 + 619 + 5 + 0 + + + 70 + 233 + 303 + 0 + 0 + + + 1 + 159 + 444 + 0 + 0 + + + 34 + 646 + 484 + 0 + 0 + + + 3 + 131 + 1606 + 0 + 0 + + + 1 + 110 + 642 + 0 + 0 + + + 70 + 230 + 307 + 0 + 0 + + + 205 + 94 + 374 + 0 + 0 + + + 192 + 661 + 473 + 0 + 0 + + + 46 + 476 + 442 + 2 + 0 + + + 70 + 327 + 216 + 0 + 0 + + + 88 + 190 + 553 + 0 + 0 + + + 164 + 740 + 476 + 7 + 0 + + + 34 + 65 + 541 + 7 + 0 + + + 70 + 191 + 550 + 6 + 0 + + + 1164 + 606 + 516 + 6 + 0 + + + 20 + 150 + 471 + 0 + 0 + + + 70 + 296 + 355 + 0 + 0 + + + 111 + 614 + 459 + 0 + 0 + + + 72 + 176 + 597 + 3 + 0 + + + 70 + 247 + 286 + 0 + 0 + + + 284 + 624 + 674 + 0 + 0 + + + 70 + 90 + 391 + 0 + 0 + + + 110 + 278 + 379 + 4 + 0 + + + 4 + 257 + 273 + 0 + 0 + + + 100 + 619 + 841 + 2 + 0 + + + 24 + 279 + 630 + 0 + 0 + + + 25 + 613 + 1548 + 2 + 0 + + + 597 + 721 + 531 + 4 + 0 + + + 597 + 687 + 512 + 0 + 0 + + + 70 + 87 + 402 + 0 + 0 + + + 4 + 174 + 201 + 0 + 0 + + + 309 + 515 + 476 + 0 + 0 + + + 41 + 78 + 448 + 0 + 0 + + + 1102 + 540 + 709 + 6 + 0 + + + 72 + 175 + 602 + 3 + 0 + + + 0 + 628 + 829 + 1 + 0 + + + 34 + 81 + 432 + 4 + 0 + + + 34 + 630 + 496 + 2 + 0 + + + 7 + 79 + 443 + 4 + 0 + + + 37 + 150 + 468 + 2 + 0 + + + 597 + 672 + 465 + 6 + 0 + + + 15 + 465 + 672 + 4 + 0 + + + 70 + 200 + 351 + 0 + 0 + + + 72 + 559 + 559 + 3 + 0 + + + 0 + 713 + 537 + 1 + 0 + + + 394 + 570 + 738 + 0 + 0 + + + 965 + 622 + 787 + 6 + 0 + + + 284 + 632 + 714 + 2 + 0 + + + 729 + 722 + 625 + 0 + 0 + + + 70 + 193 + 546 + 0 + 0 + + + 70 + 159 + 220 + 0 + 0 + + + 205 + 119 + 294 + 0 + 0 + + + 16 + 590 + 713 + 0 + 0 + + + 705 + 294 + 119 + 4 + 0 + + + 72 + 176 + 599 + 3 + 0 + + + 284 + 626 + 672 + 0 + 0 + + + 402 + 609 + 741 + 1 + 0 + + + 307 + 736 + 478 + 0 + 0 + + + 238 + 266 + 661 + 0 + 0 + + + 110 + 276 + 382 + 4 + 0 + + + 34 + 755 + 466 + 3 + 0 + + + 1 + 658 + 744 + 7 + 0 + + + 524 + 693 + 451 + 0 + 0 + + + 70 + 224 + 630 + 2 + 0 + + + 1 + 155 + 453 + 2 + 0 + + + 34 + 415 + 506 + 1 + 0 + + + 1 + 276 + 637 + 0 + 1 + + + 3 + 322 + 546 + 2 + 0 + + + 285 + 472 + 445 + 6 + 0 + + + 284 + 655 + 689 + 2 + 0 + + + 34 + 163 + 647 + 0 + 0 + + + 145 + 308 + 571 + 0 + 0 + + + 70 + 267 + 395 + 0 + 0 + + + 70 + 197 + 178 + 0 + 0 + + + 33 + 451 + 693 + 2 + 0 + + + 4 + 65 + 539 + 7 + 0 + + + 12 + 105 + 669 + 0 + 0 + + + 205 + 171 + 205 + 0 + 0 + + + 1 + 254 + 138 + 0 + 1 + + + 0 + 610 + 512 + 0 + 0 + + + 402 + 65 + 536 + 0 + 0 + + + 70 + 260 + 134 + 0 + 0 + + + 45 + 107 + 657 + 4 + 0 + + + 70 + 174 + 404 + 0 + 0 + + + 70 + 303 + 232 + 0 + 0 + + + 1 + 261 + 541 + 1 + 1 + + + 38 + 184 + 382 + 0 + 0 + + + 0 + 608 + 856 + 7 + 0 + + + 54 + 608 + 692 + 1 + 0 + + + 70 + 147 + 237 + 0 + 0 + + + 34 + 749 + 511 + 3 + 0 + + + 36 + 351 + 698 + 0 + 0 + + + 597 + 723 + 432 + 4 + 0 + + + 0 + 106 + 663 + 0 + 0 + + + 70 + 125 + 279 + 0 + 0 + + + 23 + 596 + 706 + 6 + 0 + + + 34 + 719 + 681 + 1 + 0 + + + 70 + 298 + 236 + 0 + 0 + + + 98 + 666 + 469 + 2 + 0 + + + 191 + 570 + 548 + 2 + 0 + + + 0 + 621 + 503 + 0 + 0 + + + 70 + 185 + 569 + 6 + 0 + + + 428 + 682 + 458 + 4 + 0 + + + 0 + 307 + 460 + 0 + 0 + + + 0 + 520 + 404 + 0 + 0 + + + 285 + 525 + 595 + 0 + 0 + + + 1 + 213 + 663 + 0 + 0 + + + 5 + 136 + 517 + 1 + 0 + + + 34 + 686 + 513 + 2 + 0 + + + 297 + 427 + 492 + 6 + 0 + + + 70 + 252 + 279 + 0 + 0 + + + 34 + 585 + 837 + 7 + 0 + + + 72 + 176 + 598 + 3 + 0 + + + 1 + 718 + 682 + 1 + 0 + + + 29 + 278 + 632 + 6 + 0 + + + 1 + 156 + 451 + 0 + 0 + + + 1 + 250 + 565 + 0 + 0 + + + 1 + 164 + 642 + 0 + 0 + + + 1 + 161 + 654 + 0 + 0 + + + 0 + 524 + 401 + 0 + 0 + + + 38 + 87 + 401 + 0 + 0 + + + 70 + 109 + 320 + 0 + 0 + + + 1 + 717 + 683 + 0 + 0 + + + 0 + 171 + 616 + 0 + 0 + + + 1 + 113 + 623 + 0 + 0 + + + 284 + 466 + 451 + 2 + 0 + + + 597 + 697 + 505 + 2 + 0 + + + 34 + 125 + 563 + 7 + 0 + + + 220 + 276 + 255 + 2 + 0 + + + 395 + 660 + 742 + 0 + 0 + + + 63 + 467 + 450 + 6 + 0 + + + 59 + 177 + 595 + 2 + 0 + + + 284 + 482 + 436 + 2 + 0 + + + 283 + 458 + 684 + 4 + 0 + + + 34 + 590 + 831 + 2 + 0 + + + 300 + 414 + 509 + 0 + 0 + + + 283 + 607 + 743 + 4 + 0 + + + 4 + 289 + 242 + 0 + 0 + + + 34 + 676 + 520 + 2 + 0 + + + 72 + 174 + 601 + 3 + 0 + + + 34 + 732 + 522 + 3 + 0 + + + 1 + 112 + 624 + 4 + 0 + + + 70 + 144 + 248 + 0 + 0 + + + 34 + 678 + 462 + 3 + 0 + + + 1 + 53 + 674 + 1 + 1 + + + 63 + 81 + 441 + 2 + 0 + + + 3 + 322 + 545 + 2 + 0 + + + 1 + 136 + 514 + 2 + 1 + + + 0 + 158 + 662 + 0 + 0 + + + 70 + 107 + 334 + 0 + 0 + + + 70 + 308 + 227 + 0 + 0 + + + 70 + 207 + 173 + 0 + 0 + + + 284 + 624 + 673 + 2 + 0 + + + 0 + 719 + 682 + 1 + 0 + + + 284 + 638 + 707 + 2 + 0 + + + 1 + 573 + 667 + 0 + 0 + + + 205 + 599 + 753 + 0 + 0 + + + 34 + 699 + 503 + 2 + 0 + + + 0 + 618 + 507 + 0 + 0 + + + 1 + 213 + 659 + 0 + 0 + + + 0 + 684 + 514 + 1 + 0 + + + 8 + 280 + 627 + 0 + 0 + + + 70 + 299 + 234 + 0 + 0 + + + 72 + 175 + 598 + 3 + 0 + + + 3 + 79 + 453 + 0 + 0 + + + 70 + 84 + 426 + 0 + 0 + + + 38 + 168 + 213 + 0 + 0 + + + 26 + 147 + 476 + 0 + 0 + + + 70 + 182 + 575 + 6 + 0 + + + 0 + 514 + 549 + 2 + 0 + + + 36 + 337 + 521 + 0 + 0 + + + 34 + 469 + 668 + 0 + 0 + + + 0 + 680 + 517 + 1 + 0 + + + 72 + 173 + 605 + 3 + 0 + + + 70 + 179 + 200 + 0 + 0 + + + 37 + 248 + 566 + 0 + 0 + + + 284 + 665 + 678 + 2 + 0 + + + 219 + 278 + 252 + 0 + 0 + + + 72 + 173 + 604 + 3 + 0 + + + 34 + 647 + 484 + 0 + 0 + + + 1 + 617 + 844 + 7 + 0 + + + 4 + 93 + 383 + 0 + 0 + + + 215 + 134 + 266 + 3 + 0 + + + 0 + 330 + 639 + 0 + 0 + + + 192 + 662 + 473 + 0 + 0 + + + 216 + 133 + 268 + 2 + 0 + + + 1 + 78 + 457 + 0 + 0 + + + 36 + 736 + 519 + 1 + 0 + + + 20 + 270 + 132 + 0 + 0 + + + 70 + 216 + 165 + 0 + 0 + + + 38 + 99 + 360 + 0 + 0 + + + 70 + 213 + 329 + 0 + 0 + + + 70 + 180 + 198 + 0 + 0 + + + 70 + 162 + 220 + 0 + 0 + + + 0 + 601 + 521 + 0 + 0 + + + 20 + 151 + 464 + 0 + 0 + + + 70 + 157 + 227 + 0 + 0 + + + 284 + 625 + 672 + 0 + 0 + + + 1177 + 517 + 546 + 2 + 0 + + + 4 + 286 + 245 + 0 + 0 + + + 16 + 320 + 548 + 2 + 0 + + + 284 + 663 + 680 + 0 + 0 + + + 68 + 588 + 834 + 2 + 0 + + + 36 + 598 + 472 + 0 + 0 + + + 284 + 594 + 759 + 0 + 0 + + + 4 + 718 + 683 + 1 + 0 + + + 70 + 235 + 298 + 0 + 0 + + + 70 + 279 + 251 + 1 + 0 + + + 306 + 718 + 532 + 2 + 0 + + + 0 + 286 + 491 + 4 + 0 + + + 597 + 746 + 512 + 2 + 0 + + + 1 + 614 + 684 + 0 + 1 + + + 72 + 175 + 597 + 3 + 0 + + + 205 + 633 + 836 + 1 + 0 + + + 12 + 105 + 667 + 0 + 0 + + + 0 + 620 + 505 + 0 + 0 + + + 7 + 344 + 713 + 6 + 0 + + + 34 + 416 + 507 + 1 + 0 + + + 38 + 166 + 215 + 0 + 0 + + + 597 + 725 + 432 + 4 + 0 + + + 37 + 715 + 686 + 4 + 0 + + + 183 + 351 + 699 + 0 + 0 + + + 70 + 246 + 425 + 0 + 0 + + + 0 + 665 + 471 + 0 + 0 + + + 284 + 636 + 709 + 0 + 0 + + + 13 + 105 + 668 + 0 + 0 + + + 22 + 675 + 566 + 2 + 0 + + + 37 + 716 + 685 + 4 + 0 + + + 283 + 620 + 840 + 6 + 0 + + + 284 + 671 + 672 + 0 + 0 + + + 70 + 175 + 204 + 0 + 0 + + + 220 + 275 + 255 + 4 + 0 + + + 70 + 238 + 150 + 0 + 0 + + + 965 + 624 + 786 + 6 + 0 + + + 38 + 241 + 291 + 0 + 0 + + + 70 + 169 + 211 + 0 + 0 + + + 4 + 197 + 181 + 0 + 0 + + + 70 + 195 + 536 + 0 + 0 + + + 284 + 669 + 674 + 0 + 0 + + + 193 + 599 + 471 + 3 + 1 + + + 406 + 346 + 507 + 3 + 0 + + + 45 + 107 + 655 + 0 + 0 + + + 284 + 667 + 676 + 2 + 0 + + + 36 + 342 + 513 + 0 + 0 + + + 597 + 672 + 466 + 6 + 0 + + + 70 + 188 + 556 + 6 + 0 + + + 205 + 123 + 290 + 0 + 0 + + + 11 + 275 + 638 + 0 + 0 + + + 183 + 348 + 705 + 0 + 0 + + + 209 + 82 + 433 + 3 + 0 + + + 70 + 208 + 335 + 0 + 0 + + + 34 + 451 + 694 + 6 + 0 + + + 70 + 281 + 248 + 0 + 0 + + + 70 + 315 + 333 + 0 + 0 + + + 526 + 691 + 453 + 0 + 0 + + + 597 + 697 + 504 + 2 + 0 + + + 1 + 470 + 666 + 0 + 0 + + + 306 + 714 + 492 + 1 + 0 + + + 34 + 694 + 551 + 1 + 0 + + + 1 + 65 + 546 + 0 + 0 + + + 38 + 327 + 213 + 0 + 0 + + + 70 + 146 + 243 + 0 + 0 + + + 147 + 316 + 666 + 0 + 0 + + + 70 + 335 + 313 + 0 + 0 + + + 191 + 568 + 551 + 2 + 0 + + + 58 + 659 + 533 + 0 + 0 + + + 597 + 686 + 512 + 0 + 0 + + + 0 + 426 + 494 + 6 + 0 + + + 284 + 657 + 686 + 2 + 0 + + + 70 + 223 + 159 + 0 + 0 + + + 45 + 106 + 657 + 4 + 0 + + + 70 + 286 + 124 + 0 + 0 + + + 70 + 271 + 257 + 0 + 0 + + + 36 + 169 + 621 + 0 + 0 + + + 77 + 463 + 676 + 0 + 1 + + + 1 + 72 + 494 + 1 + 0 + + + 7 + 591 + 711 + 5 + 0 + + + 37 + 150 + 465 + 2 + 0 + + + 4 + 238 + 293 + 0 + 0 + + + 0 + 283 + 497 + 4 + 0 + + + 284 + 661 + 682 + 0 + 0 + + + 20 + 81 + 439 + 0 + 0 + + + 37 + 644 + 700 + 0 + 0 + + + 1 + 628 + 609 + 0 + 1 + + + 284 + 627 + 719 + 0 + 0 + + + 1 + 583 + 537 + 2 + 0 + + + 284 + 659 + 684 + 0 + 0 + + + 111 + 614 + 460 + 0 + 0 + + + 1 + 161 + 433 + 0 + 0 + + + 72 + 174 + 603 + 3 + 0 + + + 70 + 280 + 249 + 0 + 0 + + + 310 + 727 + 526 + 0 + 0 + + + 283 + 472 + 446 + 6 + 0 + + + 284 + 634 + 711 + 0 + 0 + + + 35 + 96 + 726 + 7 + 0 + + + 286 + 520 + 602 + 0 + 0 + + + 445 + 624 + 563 + 6 + 0 + + + 70 + 85 + 418 + 0 + 0 + + + 88 + 187 + 561 + 0 + 0 + + + 38 + 141 + 252 + 0 + 0 + + + 70 + 188 + 189 + 0 + 0 + + + 192 + 744 + 514 + 0 + 0 + + + 0 + 648 + 436 + 5 + 0 + + + 1 + 111 + 629 + 0 + 0 + + + 70 + 194 + 540 + 0 + 0 + + + 88 + 689 + 654 + 0 + 0 + + + 34 + 587 + 835 + 1 + 0 + + + 1 + 159 + 439 + 0 + 0 + + + 284 + 632 + 713 + 0 + 0 + + + 70 + 135 + 262 + 0 + 0 + + + 0 + 690 + 554 + 1 + 0 + + + 27 + 278 + 630 + 0 + 0 + + + 70 + 277 + 252 + 1 + 0 + + + 72 + 174 + 602 + 3 + 0 + + + 2 + 277 + 632 + 1 + 1 + + + 209 + 673 + 568 + 4 + 0 + + + 20 + 343 + 614 + 0 + 0 + + + 38 + 170 + 208 + 0 + 0 + + + 70 + 160 + 221 + 0 + 0 + + + 0 + 520 + 405 + 0 + 0 + + + 70 + 286 + 244 + 0 + 0 + + + 1 + 122 + 572 + 0 + 0 + + + 218 + 278 + 251 + 6 + 0 + + + 0 + 640 + 549 + 0 + 0 + + + 307 + 542 + 453 + 0 + 0 + + + 1 + 428 + 492 + 0 + 1 + + + 597 + 746 + 471 + 2 + 0 + + + 70 + 101 + 350 + 0 + 0 + + + 445 + 623 + 564 + 0 + 0 + + + 7 + 78 + 453 + 6 + 0 + + + 70 + 117 + 302 + 0 + 0 + + + 4 + 138 + 256 + 0 + 0 + + + 72 + 175 + 599 + 3 + 0 + + + 597 + 672 + 523 + 6 + 0 + + + 16 + 344 + 714 + 2 + 0 + + + 45 + 613 + 1547 + 2 + 0 + + + 26 + 461 + 457 + 2 + 0 + + + 274 + 607 + 579 + 4 + 0 + + + 205 + 139 + 255 + 0 + 0 + + + 70 + 176 + 397 + 0 + 0 + + + 34 + 708 + 540 + 4 + 0 + + + 597 + 720 + 531 + 4 + 0 + + + 70 + 86 + 412 + 0 + 0 + + + 283 + 464 + 454 + 0 + 0 + + + 70 + 284 + 246 + 0 + 0 + + + 4 + 328 + 213 + 0 + 0 + + + 278 + 449 + 697 + 0 + 0 + + + 70 + 108 + 328 + 0 + 0 + + + 70 + 152 + 233 + 0 + 0 + + + 45 + 543 + 704 + 4 + 0 + + + 0 + 308 + 457 + 0 + 0 + + + 34 + 110 + 635 + 4 + 0 + + + 1 + 596 + 525 + 0 + 0 + + + 4 + 199 + 178 + 0 + 0 + + + 5 + 501 + 564 + 0 + 0 + + + 70 + 111 + 319 + 0 + 0 + + + 5 + 743 + 473 + 0 + 0 + + + 70 + 211 + 331 + 0 + 0 + + + 20 + 222 + 472 + 0 + 0 + + + 7 + 322 + 544 + 4 + 0 + + + 70 + 177 + 200 + 0 + 0 + + + 284 + 511 + 553 + 0 + 0 + + + 284 + 466 + 452 + 2 + 0 + + + 284 + 482 + 437 + 2 + 0 + + + 1 + 133 + 525 + 1 + 1 + + + 0 + 710 + 495 + 0 + 0 + + + 284 + 655 + 688 + 2 + 0 + + + 0 + 306 + 457 + 0 + 0 + + + 70 + 100 + 363 + 0 + 0 + + + 34 + 153 + 694 + 4 + 0 + + + 7 + 110 + 650 + 0 + 0 + + + 70 + 250 + 286 + 0 + 0 + + + 35 + 52 + 698 + 0 + 0 + + + 34 + 699 + 546 + 1 + 0 + + + 1 + 155 + 685 + 6 + 0 + + + 70 + 295 + 360 + 0 + 0 + + + 273 + 435 + 481 + 2 + 0 + + + 72 + 177 + 600 + 3 + 0 + + + 70 + 134 + 271 + 0 + 0 + + + 70 + 178 + 204 + 3 + 0 + + + 0 + 669 + 466 + 0 + 0 + + + 46 + 465 + 450 + 2 + 0 + + + 38 + 734 + 520 + 2 + 0 + + + 70 + 211 + 339 + 0 + 0 + + + 1 + 248 + 564 + 0 + 0 + + + 70 + 285 + 251 + 0 + 0 + + + 183 + 348 + 701 + 0 + 0 + + + 70 + 318 + 334 + 0 + 0 + + + 1 + 515 + 545 + 1 + 1 + + + 34 + 54 + 673 + 2 + 0 + + + 306 + 503 + 558 + 0 + 0 + + + 70 + 319 + 333 + 0 + 0 + + + 1 + 587 + 531 + 2 + 0 + + + 399 + 484 + 644 + 1 + 0 + + + 70 + 167 + 217 + 0 + 0 + + + 1 + 157 + 455 + 0 + 0 + + + 70 + 141 + 257 + 0 + 0 + + + 5 + 731 + 522 + 4 + 0 + + + 192 + 659 + 473 + 0 + 0 + + + 110 + 610 + 460 + 2 + 0 + + + 20 + 144 + 496 + 0 + 0 + + + 45 + 542 + 704 + 4 + 0 + + + 220 + 278 + 257 + 2 + 0 + + + 4 + 212 + 337 + 0 + 0 + + + 13 + 106 + 674 + 0 + 0 + + + 284 + 640 + 707 + 0 + 0 + + + 72 + 176 + 603 + 3 + 0 + + + 283 + 482 + 434 + 2 + 0 + + + 1 + 65 + 558 + 0 + 0 + + + 70 + 176 + 206 + 3 + 0 + + + 13 + 693 + 653 + 1 + 0 + + + 191 + 572 + 545 + 2 + 0 + + + 1 + 547 + 513 + 0 + 0 + + + 70 + 131 + 277 + 0 + 0 + + + 13 + 107 + 668 + 0 + 0 + + + 284 + 632 + 716 + 2 + 0 + + + 206 + 666 + 633 + 6 + 0 + + + 0 + 636 + 490 + 6 + 0 + + + 313 + 752 + 467 + 3 + 0 + + + 37 + 581 + 845 + 6 + 0 + + + 70 + 199 + 533 + 0 + 0 + + + 219 + 304 + 119 + 4 + 0 + + + 70 + 301 + 238 + 0 + 0 + + + 284 + 631 + 717 + 0 + 0 + + + 70 + 218 + 166 + 0 + 0 + + + 0 + 627 + 497 + 2 + 0 + + + 597 + 616 + 797 + 2 + 0 + + + 36 + 341 + 513 + 0 + 0 + + + 1 + 115 + 623 + 0 + 0 + + + 34 + 685 + 455 + 3 + 0 + + + 70 + 208 + 174 + 0 + 0 + + + 0 + 517 + 405 + 0 + 0 + + + 0 + 685 + 557 + 1 + 0 + + + 398 + 668 + 735 + 3 + 0 + + + 36 + 152 + 698 + 4 + 0 + + + 0 + 439 + 477 + 0 + 0 + + + 310 + 678 + 518 + 0 + 0 + + + 70 + 182 + 199 + 0 + 0 + + + 0 + 766 + 498 + 3 + 0 + + + 38 + 141 + 256 + 0 + 0 + + + 3 + 517 + 543 + 0 + 0 + + + 70 + 269 + 394 + 0 + 0 + + + 1 + 106 + 675 + 1 + 1 + + + 38 + 267 + 397 + 0 + 0 + + + 34 + 590 + 832 + 3 + 0 + + + 1 + 78 + 463 + 0 + 0 + + + 32 + 447 + 697 + 4 + 0 + + + 55 + 610 + 691 + 0 + 0 + + + 3 + 592 + 712 + 1 + 0 + + + 4 + 223 + 321 + 0 + 0 + + + 26 + 461 + 454 + 2 + 0 + + + 884 + 728 + 579 + 0 + 0 + + + 284 + 454 + 461 + 6 + 0 + + + 34 + 718 + 489 + 2 + 0 + + + 34 + 171 + 620 + 0 + 0 + + + 1 + 611 + 510 + 0 + 0 + + + 72 + 177 + 599 + 3 + 0 + + + 13 + 660 + 578 + 6 + 0 + + + 55 + 117 + 612 + 0 + 0 + + + 70 + 251 + 144 + 0 + 0 + + + 4 + 179 + 400 + 0 + 0 + + + 3 + 110 + 651 + 0 + 0 + + + 205 + 154 + 465 + 0 + 0 + + + 1 + 158 + 451 + 0 + 0 + + + 597 + 672 + 522 + 6 + 0 + + + 12 + 107 + 666 + 0 + 0 + + + 283 + 608 + 858 + 7 + 0 + + + 34 + 67 + 538 + 7 + 0 + + + 205 + 183 + 197 + 0 + 0 + + + 70 + 135 + 267 + 0 + 0 + + + 46 + 476 + 439 + 2 + 0 + + + 1 + 112 + 636 + 0 + 0 + + + 0 + 638 + 661 + 0 + 0 + + + 1 + 303 + 577 + 0 + 1 + + + 70 + 227 + 159 + 0 + 0 + + + 36 + 153 + 696 + 4 + 0 + + + 70 + 151 + 239 + 0 + 0 + + + 1 + 242 + 440 + 0 + 0 + + + 70 + 176 + 405 + 0 + 0 + + + 666 + 499 + 563 + 0 + 0 + + + 20 + 75 + 481 + 0 + 0 + + + 0 + 631 + 556 + 0 + 0 + + + 313 + 716 + 490 + 3 + 0 + + + 9 + 613 + 688 + 0 + 0 + + + 206 + 676 + 565 + 5 + 0 + + + 284 + 638 + 709 + 0 + 0 + + + 193 + 418 + 500 + 0 + 0 + + + 70 + 184 + 196 + 0 + 0 + + + 12 + 515 + 474 + 5 + 0 + + + 709 + 305 + 118 + 4 + 0 + + + 597 + 685 + 512 + 0 + 0 + + + 524 + 703 + 443 + 2 + 0 + + + 1 + 608 + 628 + 0 + 0 + + + 284 + 667 + 678 + 2 + 0 + + + 70 + 298 + 357 + 0 + 0 + + + 34 + 251 + 558 + 0 + 0 + + + 70 + 201 + 179 + 0 + 0 + + + 37 + 714 + 687 + 4 + 0 + + + 72 + 177 + 601 + 3 + 0 + + + 284 + 629 + 719 + 0 + 0 + + + 1 + 257 + 140 + 1 + 1 + + + 284 + 669 + 676 + 2 + 0 + + + 446 + 623 + 563 + 2 + 0 + + + 70 + 262 + 406 + 0 + 0 + + + 70 + 165 + 218 + 0 + 0 + + + 1 + 214 + 1639 + 0 + 1 + + + 220 + 278 + 256 + 2 + 0 + + + 15 + 293 + 713 + 2 + 0 + + + 1 + 163 + 437 + 0 + 0 + + + 70 + 290 + 367 + 0 + 0 + + + 20 + 311 + 562 + 0 + 0 + + + 34 + 65 + 554 + 7 + 0 + + + 284 + 671 + 674 + 2 + 0 + + + 597 + 721 + 432 + 4 + 0 + + + 4 + 276 + 258 + 0 + 0 + + + 70 + 160 + 225 + 0 + 0 + + + 1 + 646 + 543 + 0 + 0 + + + 110 + 280 + 380 + 0 + 0 + + + 1 + 250 + 561 + 0 + 0 + + + 284 + 624 + 676 + 2 + 0 + + + 23 + 697 + 704 + 2 + 0 + + + 34 + 620 + 566 + 6 + 0 + + + 284 + 663 + 682 + 2 + 0 + + + 72 + 559 + 557 + 3 + 0 + + + 72 + 557 + 559 + 3 + 0 + + + 70 + 177 + 203 + 3 + 0 + + + 192 + 737 + 518 + 0 + 0 + + + 4 + 242 + 295 + 0 + 0 + + + 419 + 695 + 448 + 2 + 0 + + + 1101 + 540 + 707 + 6 + 0 + + + 72 + 176 + 604 + 3 + 0 + + + 70 + 210 + 171 + 0 + 0 + + + 285 + 472 + 443 + 6 + 0 + + + 4 + 313 + 228 + 0 + 0 + + + 3 + 590 + 715 + 0 + 0 + + + 63 + 313 + 558 + 2 + 0 + + + 12 + 107 + 667 + 0 + 0 + + + 51 + 426 + 3375 + 0 + 0 + + + 48 + 432 + 484 + 0 + 0 + + + 565 + 707 + 540 + 2 + 0 + + + 0 + 759 + 503 + 3 + 0 + + + 38 + 281 + 254 + 0 + 0 + + + 0 + 78 + 461 + 0 + 0 + + + 284 + 636 + 711 + 0 + 0 + + + 33 + 450 + 692 + 0 + 0 + + + 38 + 214 + 168 + 0 + 0 + + + 284 + 665 + 680 + 2 + 0 + + + 597 + 719 + 531 + 4 + 0 + + + 70 + 311 + 342 + 0 + 0 + + + 407 + 752 + 561 + 5 + 0 + + + 29 + 136 + 525 + 2 + 0 + + + 100 + 618 + 844 + 7 + 0 + + + 1 + 140 + 510 + 0 + 1 + + + 20 + 150 + 476 + 0 + 0 + + + 70 + 170 + 420 + 0 + 0 + + + 205 + 526 + 464 + 0 + 0 + + + 209 + 83 + 433 + 6 + 0 + + + 70 + 108 + 332 + 0 + 0 + + + 205 + 322 + 330 + 0 + 0 + + + 36 + 692 + 709 + 0 + 0 + + + 70 + 158 + 227 + 0 + 0 + + + 70 + 315 + 445 + 4 + 0 + + + 70 + 183 + 196 + 0 + 0 + + + 1 + 591 + 765 + 0 + 1 + + + 34 + 589 + 833 + 6 + 0 + + + 3 + 606 + 579 + 0 + 0 + + + 445 + 678 + 563 + 6 + 0 + + + 0 + 424 + 493 + 6 + 0 + + + 284 + 661 + 684 + 0 + 0 + + + 37 + 63 + 569 + 7 + 0 + + + 290 + 603 + 466 + 5 + 0 + + + 70 + 253 + 282 + 0 + 0 + + + 34 + 313 + 668 + 0 + 0 + + + 0 + 112 + 637 + 0 + 0 + + + 21 + 500 + 562 + 6 + 0 + + + 597 + 719 + 433 + 6 + 0 + + + 70 + 326 + 326 + 0 + 0 + + + 1 + 605 + 631 + 0 + 0 + + + 5 + 457 + 3352 + 2 + 0 + + + 7 + 614 + 687 + 4 + 0 + + + 33 + 60 + 598 + 0 + 0 + + + 4 + 195 + 184 + 0 + 0 + + + 0 + 638 + 488 + 6 + 0 + + + 283 + 705 + 697 + 0 + 0 + + + 309 + 519 + 471 + 2 + 0 + + + 19 + 304 + 690 + 2 + 0 + + + 965 + 622 + 790 + 6 + 0 + + + 597 + 615 + 799 + 4 + 0 + + + 72 + 175 + 604 + 3 + 0 + + + 1 + 616 + 507 + 0 + 0 + + + 1 + 119 + 1467 + 1 + 1 + + + 205 + 113 + 326 + 0 + 0 + + + 284 + 659 + 686 + 0 + 0 + + + 214 + 686 + 659 + 0 + 0 + + + 34 + 664 + 740 + 0 + 0 + + + 306 + 502 + 487 + 0 + 0 + + + 33 + 63 + 585 + 0 + 0 + + + 1 + 171 + 618 + 0 + 0 + + + 70 + 224 + 622 + 0 + 0 + + + 72 + 177 + 597 + 3 + 0 + + + 1 + 654 + 536 + 1 + 1 + + + 70 + 297 + 239 + 0 + 0 + + + 1 + 140 + 507 + 0 + 1 + + + 0 + 503 + 417 + 0 + 0 + + + 284 + 634 + 713 + 0 + 0 + + + 88 + 713 + 634 + 0 + 0 + + + 4 + 271 + 262 + 0 + 0 + + + 70 + 99 + 372 + 0 + 0 + + + 29 + 302 + 578 + 2 + 0 + + + 402 + 579 + 727 + 0 + 0 + + + 283 + 454 + 462 + 6 + 0 + + + 34 + 78 + 472 + 1 + 0 + + + 55 + 116 + 612 + 3 + 0 + + + 1 + 154 + 461 + 0 + 0 + + + 283 + 466 + 450 + 2 + 0 + + + 45 + 108 + 657 + 4 + 0 + + + 70 + 299 + 123 + 0 + 0 + + + 283 + 710 + 692 + 0 + 0 + + + 1 + 71 + 518 + 1 + 0 + + + 5 + 643 + 703 + 2 + 0 + + + 70 + 142 + 259 + 0 + 0 + + + 34 + 152 + 695 + 4 + 0 + + + 34 + 698 + 546 + 1 + 0 + + + 284 + 657 + 688 + 0 + 0 + + + 4 + 116 + 317 + 0 + 0 + + + 239 + 264 + 661 + 0 + 0 + + + 205 + 162 + 227 + 0 + 0 + + + 20 + 150 + 473 + 0 + 0 + + + 20 + 151 + 470 + 0 + 0 + + + 56 + 610 + 690 + 2 + 0 + + + 217 + 632 + 603 + 5 + 0 + + + 0 + 632 + 494 + 6 + 0 + + + 0 + 674 + 520 + 1 + 0 + + + 34 + 707 + 539 + 5 + 0 + + + 283 + 663 + 741 + 2 + 0 + + + 72 + 176 + 600 + 3 + 0 + + + 218 + 277 + 256 + 4 + 0 + + + 284 + 482 + 435 + 2 + 0 + + + 283 + 621 + 854 + 7 + 0 + + + 70 + 328 + 322 + 0 + 0 + + + 70 + 333 + 213 + 0 + 0 + + + 0 + 124 + 572 + 0 + 0 + + + 70 + 257 + 276 + 0 + 0 + + + 4 + 223 + 319 + 0 + 0 + + + 70 + 306 + 345 + 0 + 0 + + + 284 + 655 + 690 + 2 + 0 + + + 38 + 228 + 312 + 0 + 0 + + + 70 + 193 + 547 + 0 + 0 + + + 190 + 276 + 632 + 4 + 0 + + + 0 + 111 + 641 + 0 + 0 + + + 33 + 473 + 660 + 0 + 0 + + + 192 + 660 + 473 + 0 + 0 + + + 70 + 180 + 204 + 3 + 0 + + + 34 + 213 + 655 + 0 + 0 + + + 290 + 605 + 465 + 0 + 0 + + + 1 + 119 + 1466 + 0 + 1 + + + 34 + 583 + 843 + 6 + 0 + + + 33 + 53 + 692 + 0 + 0 + + + 306 + 764 + 459 + 0 + 0 + + + 1 + 612 + 573 + 0 + 1 + + + 884 + 726 + 580 + 0 + 0 + + + 38 + 319 + 115 + 0 + 0 + + + 1 + 125 + 569 + 0 + 0 + + + 110 + 280 + 377 + 4 + 0 + + + 34 + 590 + 833 + 1 + 0 + + + 4 + 290 + 364 + 0 + 0 + + + 70 + 100 + 367 + 0 + 0 + + + 22 + 265 + 658 + 6 + 0 + + + 47 + 518 + 543 + 4 + 0 + + + 377 + 665 + 739 + 6 + 0 + + + 994 + 601 + 468 + 0 + 0 + + + 70 + 198 + 359 + 0 + 0 + + + 7 + 82 + 447 + 6 + 0 + + + 960 + 625 + 723 + 0 + 0 + + + 1 + 226 + 617 + 0 + 0 + + + 284 + 632 + 715 + 2 + 0 + + + 25 + 305 + 688 + 6 + 0 + + + 70 + 95 + 386 + 0 + 0 + + + 33 + 451 + 692 + 4 + 0 + + + 70 + 256 + 412 + 0 + 0 + + + 25 + 613 + 1549 + 2 + 0 + + + 597 + 746 + 470 + 2 + 0 + + + 37 + 70 + 523 + 1 + 0 + + + 70 + 176 + 208 + 3 + 0 + + + 70 + 293 + 360 + 0 + 0 + + + 70 + 110 + 333 + 0 + 0 + + + 70 + 304 + 347 + 0 + 0 + + + 34 + 152 + 694 + 4 + 0 + + + 597 + 697 + 503 + 2 + 0 + + + 205 + 85 + 431 + 0 + 0 + + + 201 + 614 + 800 + 1 + 1 + + + 884 + 725 + 581 + 4 + 0 + + + 70 + 251 + 282 + 0 + 0 + + + 34 + 718 + 684 + 1 + 0 + + + 21 + 541 + 705 + 6 + 0 + + + 35 + 58 + 631 + 0 + 0 + + + 0 + 650 + 433 + 5 + 0 + + + 205 + 135 + 271 + 0 + 0 + + + 597 + 719 + 434 + 6 + 0 + + + 1 + 214 + 1637 + 1 + 1 + + + 7 + 82 + 446 + 6 + 0 + + + 72 + 176 + 602 + 3 + 0 + + + 66 + 132 + 536 + 0 + 0 + + + 70 + 176 + 402 + 0 + 0 + + + 205 + 115 + 318 + 0 + 0 + + + 36 + 152 + 697 + 4 + 0 + + + 70 + 219 + 167 + 0 + 0 + + + 22 + 675 + 565 + 2 + 0 + + + 45 + 108 + 655 + 0 + 0 + + + 192 + 739 + 474 + 0 + 0 + + + 70 + 334 + 418 + 0 + 0 + + + 33 + 504 + 695 + 0 + 0 + + + 1 + 719 + 683 + 1 + 0 + + + 0 + 613 + 509 + 0 + 0 + + + 38 + 301 + 235 + 0 + 0 + + + 70 + 93 + 393 + 0 + 0 + + + 193 + 597 + 471 + 0 + 1 + + + 38 + 254 + 417 + 0 + 0 + + + 1 + 608 + 743 + 3 + 0 + + + 70 + 179 + 395 + 0 + 0 + + + 34 + 709 + 494 + 2 + 0 + + + 1 + 573 + 735 + 0 + 0 + + + 33 + 398 + 707 + 0 + 0 + + + 183 + 348 + 703 + 0 + 0 + + + 70 + 287 + 369 + 0 + 0 + + + 284 + 639 + 707 + 0 + 0 + + + 1 + 653 + 752 + 7 + 0 + + + 46 + 536 + 525 + 0 + 0 + + + 21 + 271 + 643 + 0 + 0 + + + 597 + 684 + 512 + 0 + 0 + + + 34 + 153 + 692 + 4 + 0 + + + 70 + 169 + 216 + 0 + 0 + + + 7 + 613 + 687 + 4 + 0 + + + 34 + 66 + 553 + 7 + 0 + + + 283 + 77 + 474 + 7 + 0 + + + 38 + 283 + 129 + 0 + 0 + + + 377 + 658 + 640 + 3 + 0 + + + 70 + 292 + 242 + 0 + 0 + + + 12 + 105 + 673 + 0 + 0 + + + 4 + 302 + 234 + 0 + 0 + + + 220 + 276 + 256 + 0 + 0 + + + 1 + 214 + 652 + 0 + 0 + + + 34 + 215 + 649 + 0 + 0 + + + 70 + 192 + 190 + 0 + 0 + + + 0 + 709 + 440 + 3 + 0 + + + 1 + 51 + 715 + 0 + 1 + + + 25 + 614 + 621 + 0 + 0 + + + 284 + 627 + 672 + 0 + 0 + + + 1 + 112 + 633 + 0 + 0 + + + 72 + 177 + 598 + 3 + 0 + + + 70 + 187 + 566 + 6 + 0 + + + 34 + 583 + 535 + 6 + 0 + + + 597 + 722 + 432 + 4 + 0 + + + 70 + 179 + 396 + 0 + 0 + + + 70 + 287 + 127 + 0 + 0 + + + 284 + 630 + 717 + 0 + 0 + + + 70 + 294 + 124 + 0 + 0 + + + 51 + 284 + 2960 + 6 + 0 + + + 72 + 558 + 559 + 3 + 0 + + + 938 + 696 + 649 + 0 + 0 + + + 597 + 718 + 531 + 4 + 0 + + + 0 + 697 + 547 + 1 + 0 + + + 205 + 599 + 754 + 4 + 0 + + + 0 + 621 + 791 + 0 + 0 + + + 1 + 662 + 742 + 7 + 0 + + + 70 + 137 + 266 + 0 + 0 + + + 0 + 220 + 481 + 0 + 0 + + + 70 + 274 + 133 + 0 + 0 + + + 34 + 411 + 510 + 1 + 0 + + + 70 + 288 + 246 + 0 + 0 + + + 34 + 343 + 713 + 0 + 0 + + + 70 + 304 + 348 + 0 + 0 + + + 70 + 184 + 575 + 6 + 0 + + + 1 + 623 + 838 + 0 + 0 + + + 70 + 237 + 299 + 0 + 0 + + + 20 + 611 + 624 + 2 + 0 + + + 4 + 331 + 214 + 0 + 0 + + + 34 + 683 + 513 + 0 + 0 + + + 72 + 176 + 601 + 3 + 0 + + + 306 + 722 + 528 + 4 + 0 + + + 283 + 716 + 686 + 0 + 0 + + + 70 + 246 + 148 + 0 + 0 + + + 34 + 111 + 638 + 0 + 0 + + + 284 + 637 + 709 + 0 + 0 + + + 191 + 566 + 551 + 2 + 0 + + + 730 + 454 + 3373 + 3 + 0 + + + 34 + 706 + 540 + 6 + 0 + + + 285 + 472 + 444 + 6 + 0 + + + 3 + 626 + 609 + 0 + 0 + + + 70 + 312 + 227 + 0 + 0 + + + 70 + 145 + 251 + 0 + 0 + + + 32 + 450 + 693 + 6 + 0 + + + 284 + 625 + 674 + 0 + 0 + + + 284 + 671 + 673 + 2 + 0 + + + 37 + 490 + 499 + 0 + 0 + + + 597 + 672 + 464 + 6 + 0 + + + 37 + 584 + 841 + 6 + 0 + + + 283 + 717 + 685 + 0 + 0 + + + 36 + 341 + 717 + 0 + 0 + + + 3 + 590 + 714 + 0 + 0 + + + 34 + 401 + 702 + 0 + 0 + + + 4 + 98 + 371 + 0 + 0 + + + 597 + 746 + 511 + 2 + 0 + + + 283 + 595 + 759 + 0 + 0 + + + 37 + 71 + 512 + 1 + 0 + + + 4 + 166 + 219 + 0 + 0 + + + 0 + 166 + 637 + 0 + 0 + + + 70 + 202 + 180 + 0 + 0 + + + 70 + 180 + 202 + 3 + 0 + + + 23 + 109 + 666 + 4 + 0 + + + 1016 + 236 + 140 + 6 + 0 + + + 34 + 62 + 533 + 0 + 0 + + + 1 + 111 + 654 + 0 + 1 + + + 36 + 689 + 708 + 0 + 0 + + + 70 + 121 + 273 + 0 + 0 + + + 419 + 687 + 458 + 0 + 0 + + + 25 + 214 + 1636 + 0 + 0 + + + 284 + 659 + 688 + 0 + 0 + + + 70 + 192 + 378 + 0 + 0 + + + 597 + 672 + 521 + 6 + 0 + + + 70 + 213 + 341 + 0 + 0 + + + 70 + 199 + 365 + 0 + 0 + + + 34 + 734 + 477 + 7 + 0 + + + 377 + 659 + 635 + 4 + 0 + + + 70 + 245 + 135 + 0 + 0 + + + 1 + 75 + 441 + 0 + 0 + + + 0 + 635 + 659 + 0 + 0 + + + 1 + 156 + 660 + 0 + 0 + + + 70 + 286 + 360 + 0 + 0 + + + 708 + 298 + 111 + 0 + 0 + + + 0 + 632 + 554 + 0 + 0 + + + 70 + 266 + 273 + 0 + 0 + + + 290 + 599 + 467 + 0 + 0 + + + 1 + 522 + 465 + 1 + 1 + + + 72 + 171 + 602 + 3 + 0 + + + 33 + 447 + 704 + 4 + 0 + + + 164 + 753 + 465 + 0 + 0 + + + 70 + 327 + 315 + 0 + 0 + + + 30 + 226 + 633 + 4 + 0 + + + 21 + 496 + 564 + 2 + 0 + + + 70 + 328 + 314 + 0 + 0 + + + 70 + 243 + 299 + 0 + 0 + + + 284 + 661 + 686 + 0 + 0 + + + 37 + 251 + 570 + 0 + 0 + + + 3 + 559 + 688 + 0 + 0 + + + 70 + 134 + 247 + 0 + 0 + + + 284 + 636 + 713 + 0 + 0 + + + 34 + 340 + 714 + 0 + 0 + + + 70 + 324 + 318 + 0 + 0 + + + 1011 + 235 + 141 + 6 + 0 + + + 34 + 693 + 555 + 1 + 0 + + + 1 + 73 + 454 + 0 + 0 + + + 45 + 212 + 675 + 2 + 0 + + + 72 + 172 + 599 + 3 + 0 + + + 88 + 183 + 563 + 0 + 0 + + + 70 + 126 + 263 + 0 + 0 + + + 70 + 132 + 251 + 0 + 0 + + + 407 + 603 + 464 + 2 + 0 + + + 12 + 108 + 673 + 0 + 0 + + + 46 + 536 + 522 + 0 + 0 + + + 20 + 346 + 614 + 6 + 0 + + + 284 + 663 + 684 + 0 + 0 + + + 284 + 469 + 453 + 2 + 0 + + + 20 + 147 + 493 + 0 + 0 + + + 13 + 108 + 671 + 0 + 0 + + + 4 + 114 + 291 + 0 + 0 + + + 299 + 522 + 603 + 0 + 0 + + + 70 + 225 + 635 + 0 + 0 + + + 100 + 626 + 848 + 6 + 0 + + + 70 + 252 + 409 + 0 + 0 + + + 420 + 743 + 471 + 6 + 0 + + + 70 + 94 + 353 + 0 + 0 + + + 0 + 70 + 474 + 0 + 0 + + + 0 + 627 + 502 + 2 + 0 + + + 70 + 129 + 257 + 0 + 0 + + + 0 + 630 + 664 + 0 + 0 + + + 70 + 322 + 320 + 0 + 0 + + + 708 + 296 + 112 + 4 + 0 + + + 284 + 665 + 682 + 2 + 0 + + + 70 + 206 + 161 + 0 + 0 + + + 70 + 161 + 206 + 0 + 0 + + + 205 + 100 + 332 + 0 + 0 + + + 278 + 451 + 698 + 0 + 0 + + + 524 + 698 + 451 + 0 + 0 + + + 0 + 312 + 458 + 0 + 0 + + + 45 + 212 + 674 + 2 + 0 + + + 391 + 160 + 453 + 0 + 0 + + + 529 + 299 + 111 + 0 + 0 + + + 45 + 613 + 1545 + 2 + 0 + + + 284 + 667 + 680 + 2 + 0 + + + 37 + 711 + 686 + 4 + 0 + + + 36 + 348 + 698 + 0 + 0 + + + 36 + 347 + 700 + 0 + 0 + + + 72 + 130 + 558 + 3 + 0 + + + 68 + 631 + 773 + 3 + 0 + + + 70 + 226 + 147 + 0 + 0 + + + 652 + 294 + 113 + 0 + 0 + + + 284 + 669 + 678 + 2 + 0 + + + 146 + 599 + 757 + 1 + 1 + + + 45 + 313 + 556 + 2 + 0 + + + 0 + 76 + 437 + 4 + 0 + + + 70 + 173 + 192 + 0 + 0 + + + 1 + 153 + 474 + 0 + 0 + + + 70 + 280 + 259 + 0 + 0 + + + 284 + 671 + 676 + 2 + 0 + + + 70 + 149 + 223 + 0 + 0 + + + 72 + 171 + 603 + 3 + 0 + + + 708 + 297 + 112 + 4 + 0 + + + 960 + 630 + 720 + 0 + 0 + + + 0 + 631 + 828 + 1 + 0 + + + 205 + 84 + 396 + 0 + 0 + + + 4 + 189 + 176 + 0 + 0 + + + 965 + 619 + 788 + 6 + 0 + + + 1149 + 515 + 543 + 6 + 0 + + + 1 + 487 + 436 + 0 + 0 + + + 192 + 737 + 475 + 0 + 0 + + + 284 + 638 + 711 + 2 + 0 + + + 205 + 175 + 190 + 0 + 0 + + + 58 + 272 + 2972 + 4 + 0 + + + 1 + 73 + 449 + 0 + 0 + + + 55 + 319 + 449 + 4 + 0 + + + 284 + 632 + 717 + 0 + 0 + + + 0 + 765 + 503 + 3 + 0 + + + 313 + 678 + 516 + 0 + 0 + + + 0 + 614 + 512 + 0 + 0 + + + 0 + 717 + 680 + 0 + 0 + + + 0 + 630 + 499 + 2 + 0 + + + 209 + 636 + 605 + 2 + 0 + + + 4 + 83 + 395 + 0 + 0 + + + 665 + 298 + 110 + 4 + 0 + + + 34 + 586 + 832 + 2 + 0 + + + 38 + 597 + 759 + 4 + 0 + + + 70 + 121 + 271 + 0 + 0 + + + 1013 + 236 + 139 + 6 + 0 + + + 34 + 710 + 542 + 1 + 0 + + + 34 + 59 + 556 + 7 + 0 + + + 597 + 746 + 469 + 2 + 0 + + + 1 + 158 + 458 + 0 + 0 + + + 306 + 759 + 507 + 3 + 0 + + + 208 + 77 + 426 + 0 + 0 + + + 0 + 71 + 462 + 0 + 0 + + + 1 + 607 + 518 + 0 + 0 + + + 47 + 716 + 681 + 4 + 0 + + + 70 + 160 + 205 + 0 + 0 + + + 21 + 211 + 679 + 4 + 0 + + + 72 + 172 + 600 + 3 + 0 + + + 38 + 81 + 405 + 0 + 0 + + + 1 + 154 + 470 + 0 + 0 + + + 23 + 109 + 664 + 4 + 0 + + + 192 + 740 + 520 + 0 + 0 + + + 164 + 754 + 464 + 3 + 0 + + + 205 + 157 + 461 + 0 + 0 + + + 51 + 601 + 754 + 0 + 0 + + + 1 + 60 + 547 + 0 + 0 + + + 70 + 92 + 357 + 0 + 0 + + + 25 + 589 + 711 + 4 + 0 + + + 70 + 123 + 267 + 0 + 0 + + + 0 + 520 + 408 + 0 + 0 + + + 4 + 189 + 383 + 0 + 0 + + + 209 + 76 + 432 + 0 + 0 + + + 38 + 199 + 165 + 0 + 0 + + + 45 + 212 + 676 + 2 + 0 + + + 34 + 713 + 441 + 3 + 0 + + + 1 + 607 + 634 + 0 + 0 + + + 1012 + 233 + 141 + 4 + 0 + + + 204 + 634 + 607 + 1 + 0 + + + 1 + 74 + 444 + 0 + 0 + + + 708 + 296 + 111 + 0 + 0 + + + 70 + 271 + 381 + 0 + 0 + + + 597 + 697 + 502 + 2 + 0 + + + 284 + 641 + 707 + 0 + 0 + + + 1016 + 238 + 138 + 6 + 0 + + + 1 + 75 + 438 + 0 + 0 + + + 0 + 615 + 681 + 0 + 0 + + + 70 + 198 + 166 + 0 + 0 + + + 7 + 277 + 627 + 0 + 0 + + + 4 + 208 + 158 + 0 + 0 + + + 70 + 204 + 355 + 0 + 0 + + + 38 + 659 + 740 + 2 + 0 + + + 962 + 626 + 779 + 6 + 0 + + + 4 + 330 + 313 + 0 + 0 + + + 0 + 648 + 540 + 0 + 0 + + + 37 + 323 + 657 + 0 + 0 + + + 38 + 87 + 378 + 0 + 0 + + + 72 + 173 + 597 + 3 + 0 + + + 70 + 472 + 515 + 2 + 0 + + + 13 + 515 + 472 + 4 + 0 + + + 46 + 533 + 525 + 0 + 0 + + + 306 + 729 + 528 + 4 + 0 + + + 1013 + 235 + 140 + 6 + 0 + + + 299 + 519 + 606 + 2 + 0 + + + 150 + 615 + 455 + 4 + 0 + + + 0 + 76 + 433 + 4 + 0 + + + 70 + 159 + 207 + 0 + 0 + + + 36 + 723 + 435 + 2 + 0 + + + 34 + 438 + 484 + 2 + 0 + + + 1 + 163 + 443 + 0 + 0 + + + 70 + 151 + 218 + 0 + 0 + + + 12 + 692 + 655 + 1 + 0 + + + 3 + 274 + 634 + 0 + 0 + + + 45 + 313 + 555 + 2 + 0 + + + 666 + 497 + 563 + 0 + 0 + + + 70 + 93 + 354 + 0 + 0 + + + 22 + 264 + 658 + 6 + 0 + + + 1 + 59 + 558 + 0 + 0 + + + 51 + 272 + 2971 + 6 + 0 + + + 597 + 683 + 512 + 0 + 0 + + + 597 + 728 + 432 + 4 + 0 + + + 1 + 168 + 615 + 0 + 0 + + + 284 + 469 + 452 + 2 + 0 + + + 34 + 629 + 500 + 2 + 0 + + + 597 + 672 + 468 + 6 + 0 + + + 307 + 340 + 511 + 0 + 0 + + + 1 + 342 + 508 + 0 + 0 + + + 284 + 634 + 715 + 0 + 0 + + + 34 + 473 + 665 + 0 + 0 + + + 70 + 142 + 232 + 0 + 0 + + + 1 + 455 + 466 + 0 + 0 + + + 1011 + 237 + 139 + 6 + 0 + + + 597 + 746 + 516 + 2 + 0 + + + 4 + 261 + 396 + 0 + 0 + + + 283 + 620 + 843 + 6 + 0 + + + 205 + 107 + 308 + 0 + 0 + + + 284 + 657 + 690 + 0 + 0 + + + 708 + 297 + 111 + 0 + 0 + + + 13 + 690 + 657 + 1 + 0 + + + 70 + 106 + 311 + 0 + 0 + + + 70 + 190 + 544 + 0 + 0 + + + 1 + 320 + 543 + 0 + 1 + + + 70 + 87 + 379 + 0 + 0 + + + 597 + 725 + 531 + 4 + 0 + + + 72 + 172 + 601 + 3 + 0 + + + 445 + 627 + 614 + 2 + 0 + + + 20 + 246 + 582 + 0 + 0 + + + 164 + 749 + 467 + 0 + 0 + + + 1 + 114 + 634 + 0 + 0 + + + 34 + 627 + 723 + 0 + 0 + + + 4 + 278 + 260 + 0 + 0 + + + 21 + 498 + 562 + 0 + 0 + + + 20 + 458 + 463 + 0 + 0 + + + 283 + 464 + 457 + 0 + 0 + + + 70 + 288 + 251 + 0 + 0 + + + 22 + 602 + 465 + 5 + 0 + + + 1010 + 234 + 141 + 0 + 0 + + + 0 + 713 + 540 + 1 + 0 + + + 0 + 690 + 558 + 1 + 0 + + + 8 + 619 + 622 + 5 + 0 + + + 665 + 300 + 110 + 4 + 0 + + + 37 + 617 + 624 + 6 + 0 + + + 20 + 150 + 482 + 0 + 0 + + + 306 + 711 + 492 + 0 + 0 + + + 419 + 715 + 440 + 6 + 0 + + + 1 + 259 + 553 + 1 + 1 + + + 1 + 718 + 679 + 1 + 0 + + + 280 + 523 + 465 + 0 + 0 + + + 0 + 310 + 462 + 0 + 0 + + + 284 + 482 + 440 + 2 + 0 + + + 526 + 696 + 452 + 2 + 0 + + + 51 + 452 + 696 + 0 + 0 + + + 37 + 608 + 575 + 0 + 0 + + + 1 + 74 + 454 + 0 + 0 + + + 191 + 572 + 551 + 2 + 0 + + + 597 + 672 + 469 + 6 + 0 + + + 265 + 469 + 672 + 2 + 0 + + + 164 + 736 + 475 + 7 + 0 + + + 70 + 87 + 386 + 0 + 0 + + + 284 + 671 + 675 + 2 + 0 + + + 284 + 669 + 677 + 2 + 0 + + + 72 + 171 + 599 + 3 + 0 + + + 9 + 134 + 538 + 0 + 1 + + + 284 + 665 + 681 + 2 + 0 + + + 34 + 133 + 542 + 0 + 0 + + + 938 + 659 + 741 + 2 + 0 + + + 36 + 166 + 617 + 0 + 0 + + + 284 + 667 + 679 + 2 + 0 + + + 36 + 637 + 834 + 1 + 0 + + + 3 + 715 + 683 + 0 + 0 + + + 273 + 651 + 537 + 2 + 0 + + + 993 + 629 + 720 + 0 + 0 + + + 70 + 82 + 409 + 0 + 0 + + + 183 + 344 + 707 + 0 + 0 + + + 217 + 128 + 262 + 1 + 0 + + + 0 + 328 + 649 + 0 + 0 + + + 377 + 609 + 802 + 6 + 0 + + + 110 + 608 + 461 + 2 + 0 + + + 70 + 220 + 153 + 0 + 0 + + + 284 + 630 + 719 + 0 + 0 + + + 37 + 608 + 745 + 5 + 0 + + + 25 + 214 + 1634 + 0 + 0 + + + 70 + 186 + 388 + 0 + 0 + + + 281 + 440 + 484 + 4 + 0 + + + 283 + 466 + 457 + 2 + 0 + + + 38 + 686 + 712 + 2 + 0 + + + 284 + 638 + 710 + 2 + 0 + + + 23 + 109 + 662 + 4 + 0 + + + 34 + 156 + 657 + 0 + 0 + + + 51 + 449 + 702 + 2 + 0 + + + 34 + 706 + 544 + 1 + 0 + + + 0 + 605 + 521 + 0 + 0 + + + 45 + 313 + 554 + 2 + 0 + + + 0 + 733 + 477 + 1 + 0 + + + 70 + 235 + 307 + 0 + 0 + + + 70 + 82 + 410 + 0 + 0 + + + 111 + 274 + 374 + 0 + 0 + + + 51 + 426 + 3384 + 4 + 0 + + + 1 + 505 + 555 + 0 + 0 + + + 283 + 469 + 454 + 2 + 0 + + + 4 + 83 + 405 + 0 + 0 + + + 3 + 133 + 1601 + 0 + 0 + + + 70 + 192 + 175 + 0 + 0 + + + 70 + 175 + 192 + 0 + 0 + + + 377 + 598 + 699 + 5 + 0 + + + 34 + 685 + 713 + 2 + 0 + + + 36 + 723 + 436 + 2 + 0 + + + 1 + 165 + 621 + 0 + 0 + + + 529 + 300 + 112 + 4 + 0 + + + 164 + 742 + 471 + 0 + 0 + + + 36 + 166 + 618 + 0 + 0 + + + 58 + 274 + 2952 + 0 + 0 + + + 20 + 173 + 593 + 0 + 0 + + + 34 + 718 + 680 + 1 + 0 + + + 70 + 234 + 144 + 0 + 0 + + + 4 + 162 + 208 + 0 + 0 + + + 70 + 281 + 365 + 0 + 0 + + + 209 + 78 + 432 + 2 + 0 + + + 205 + 159 + 212 + 0 + 0 + + + 284 + 639 + 709 + 0 + 0 + + + 1 + 319 + 667 + 1 + 1 + + + 38 + 305 + 236 + 0 + 0 + + + 0 + 676 + 517 + 1 + 0 + + + 20 + 468 + 520 + 2 + 0 + + + 111 + 272 + 377 + 0 + 0 + + + 1 + 135 + 533 + 3 + 1 + + + 100 + 621 + 842 + 1 + 0 + + + 1 + 248 + 574 + 0 + 0 + + + 70 + 280 + 257 + 0 + 0 + + + 34 + 159 + 645 + 0 + 0 + + + 34 + 719 + 679 + 1 + 0 + + + 597 + 672 + 520 + 6 + 0 + + + 70 + 299 + 343 + 0 + 0 + + + 70 + 288 + 356 + 0 + 0 + + + 1 + 76 + 443 + 0 + 0 + + + 0 + 126 + 571 + 0 + 0 + + + 665 + 298 + 113 + 0 + 0 + + + 34 + 158 + 649 + 0 + 0 + + + 70 + 122 + 276 + 0 + 0 + + + 37 + 323 + 659 + 0 + 0 + + + 21 + 545 + 705 + 6 + 0 + + + 4 + 82 + 412 + 0 + 0 + + + 38 + 245 + 419 + 0 + 0 + + + 34 + 340 + 716 + 0 + 0 + + + 37 + 60 + 563 + 7 + 0 + + + 597 + 730 + 432 + 4 + 0 + + + 0 + 609 + 744 + 3 + 0 + + + 70 + 188 + 546 + 0 + 0 + + + 0 + 116 + 621 + 0 + 0 + + + 5 + 138 + 522 + 0 + 0 + + + 4 + 181 + 398 + 0 + 0 + + + 205 + 102 + 331 + 0 + 0 + + + 75 + 463 + 681 + 0 + 1 + + + 70 + 175 + 193 + 0 + 0 + + + 0 + 449 + 474 + 0 + 0 + + + 70 + 286 + 118 + 0 + 0 + + + 110 + 609 + 460 + 2 + 0 + + + 104 + 556 + 691 + 0 + 0 + + + 597 + 746 + 515 + 2 + 0 + + + 0 + 77 + 438 + 4 + 0 + + + 4 + 191 + 377 + 0 + 0 + + + 0 + 647 + 433 + 5 + 0 + + + 1 + 160 + 450 + 0 + 0 + + + 70 + 300 + 240 + 0 + 0 + + + 285 + 229 + 448 + 2 + 0 + + + 70 + 180 + 570 + 6 + 0 + + + 70 + 285 + 360 + 0 + 0 + + + 1 + 320 + 445 + 0 + 1 + + + 72 + 171 + 600 + 3 + 0 + + + 51 + 272 + 2974 + 6 + 0 + + + 4 + 264 + 389 + 0 + 0 + + + 401 + 63 + 529 + 0 + 0 + + + 20 + 150 + 479 + 0 + 0 + + + 45 + 313 + 553 + 2 + 0 + + + 100 + 648 + 486 + 6 + 0 + + + 597 + 729 + 432 + 4 + 0 + + + 4 + 85 + 392 + 0 + 0 + + + 597 + 719 + 438 + 6 + 0 + + + 0 + 713 + 490 + 0 + 0 + + + 4 + 332 + 430 + 0 + 0 + + + 0 + 611 + 629 + 0 + 0 + + + 15 + 629 + 611 + 0 + 0 + + + 34 + 665 + 734 + 0 + 0 + + + 730 + 469 + 3385 + 2 + 0 + + + 34 + 681 + 513 + 2 + 0 + + + 284 + 656 + 690 + 0 + 0 + + + 0 + 670 + 470 + 0 + 0 + + + 70 + 313 + 328 + 0 + 0 + + + 22 + 263 + 658 + 6 + 0 + + + 205 + 252 + 285 + 0 + 0 + + + 70 + 269 + 267 + 0 + 0 + + + 70 + 212 + 157 + 0 + 0 + + + 1 + 65 + 512 + 1 + 0 + + + 72 + 172 + 597 + 3 + 0 + + + 0 + 525 + 405 + 0 + 0 + + + 38 + 199 + 361 + 0 + 0 + + + 529 + 300 + 111 + 0 + 0 + + + 23 + 601 + 696 + 4 + 0 + + + 47 + 368 + 578 + 6 + 0 + + + 70 + 202 + 356 + 0 + 0 + + + 708 + 298 + 112 + 4 + 0 + + + 1 + 591 + 533 + 2 + 0 + + + 38 + 168 + 428 + 0 + 0 + + + 34 + 112 + 642 + 0 + 0 + + + 1 + 114 + 631 + 0 + 0 + + + 70 + 263 + 127 + 0 + 0 + + + 21 + 271 + 639 + 2 + 0 + + + 13 + 108 + 666 + 0 + 0 + + + 70 + 243 + 296 + 0 + 0 + + + 70 + 118 + 283 + 0 + 0 + + + 239 + 262 + 661 + 0 + 0 + + + 72 + 171 + 601 + 3 + 0 + + + 38 + 602 + 752 + 2 + 0 + + + 284 + 658 + 688 + 0 + 0 + + + 5 + 277 + 625 + 0 + 0 + + + 55 + 318 + 449 + 4 + 0 + + + 70 + 135 + 247 + 0 + 0 + + + 0 + 520 + 409 + 0 + 0 + + + 70 + 291 + 353 + 0 + 0 + + + 70 + 230 + 145 + 0 + 0 + + + 1 + 491 + 496 + 0 + 0 + + + 51 + 284 + 2971 + 4 + 0 + + + 107 + 557 + 690 + 0 + 0 + + + 730 + 468 + 3392 + 6 + 0 + + + 284 + 661 + 685 + 2 + 0 + + + 111 + 272 + 378 + 0 + 0 + + + 70 + 216 + 332 + 0 + 0 + + + 0 + 76 + 440 + 4 + 0 + + + 34 + 708 + 543 + 1 + 0 + + + 0 + 628 + 721 + 0 + 0 + + + 61 + 109 + 658 + 0 + 0 + + + 70 + 220 + 326 + 0 + 0 + + + 665 + 296 + 113 + 0 + 0 + + + 15 + 226 + 455 + 2 + 0 + + + 70 + 182 + 565 + 6 + 0 + + + 20 + 177 + 581 + 0 + 0 + + + 70 + 316 + 227 + 0 + 0 + + + 38 + 68 + 492 + 1 + 0 + + + 278 + 452 + 697 + 0 + 0 + + + 4 + 259 + 277 + 0 + 0 + + + 402 + 522 + 669 + 2 + 0 + + + 70 + 211 + 340 + 0 + 0 + + + 0 + 310 + 460 + 0 + 0 + + + 313 + 743 + 470 + 3 + 0 + + + 205 + 243 + 423 + 0 + 0 + + + 284 + 660 + 686 + 0 + 0 + + + 70 + 206 + 348 + 0 + 0 + + + 1 + 60 + 557 + 0 + 0 + + + 0 + 729 + 479 + 1 + 0 + + + 290 + 599 + 468 + 0 + 0 + + + 8 + 618 + 622 + 3 + 0 + + + 284 + 465 + 457 + 0 + 0 + + + 34 + 609 + 859 + 6 + 0 + + + 597 + 697 + 501 + 2 + 0 + + + 70 + 298 + 345 + 0 + 0 + + + 597 + 682 + 512 + 0 + 0 + + + 37 + 616 + 624 + 2 + 0 + + + 1 + 605 + 691 + 0 + 1 + + + 1 + 114 + 629 + 0 + 0 + + + 965 + 620 + 787 + 6 + 0 + + + 45 + 546 + 704 + 4 + 0 + + + 20 + 73 + 459 + 0 + 0 + + + 4 + 118 + 284 + 0 + 0 + + + 0 + 766 + 456 + 0 + 0 + + + 70 + 173 + 415 + 0 + 0 + + + 284 + 636 + 712 + 2 + 0 + + + 0 + 75 + 447 + 0 + 0 + + + 1 + 161 + 446 + 0 + 0 + + + 0 + 634 + 497 + 6 + 0 + + + 70 + 287 + 250 + 0 + 0 + + + 71 + 606 + 690 + 2 + 0 + + + 70 + 93 + 360 + 0 + 0 + + + 70 + 184 + 559 + 6 + 0 + + + 72 + 172 + 598 + 3 + 0 + + + 111 + 270 + 381 + 0 + 0 + + + 70 + 161 + 208 + 0 + 0 + + + 529 + 299 + 112 + 4 + 0 + + + 70 + 299 + 240 + 0 + 0 + + + 70 + 195 + 368 + 0 + 0 + + + 70 + 184 + 390 + 0 + 0 + + + 4 + 61 + 549 + 7 + 0 + + + 1 + 165 + 435 + 0 + 0 + + + 37 + 249 + 573 + 0 + 0 + + + 0 + 77 + 435 + 4 + 0 + + + 0 + 599 + 526 + 0 + 0 + + + 1 + 272 + 637 + 0 + 0 + + + 284 + 662 + 684 + 0 + 0 + + + 36 + 167 + 616 + 0 + 0 + + + 283 + 482 + 441 + 4 + 0 + + + 597 + 724 + 531 + 4 + 0 + + + 597 + 746 + 468 + 2 + 0 + + + 0 + 79 + 432 + 4 + 0 + + + 70 + 93 + 367 + 0 + 0 + + + 1 + 306 + 565 + 2 + 1 + + + 284 + 641 + 709 + 0 + 0 + + + 3 + 121 + 609 + 0 + 0 + + + 1 + 435 + 486 + 0 + 1 + + + 193 + 254 + 290 + 4 + 0 + + + 1 + 74 + 461 + 0 + 0 + + + 4 + 83 + 411 + 0 + 0 + + + 424 + 653 + 696 + 2 + 0 + + + 217 + 696 + 653 + 1 + 0 + + + 1 + 75 + 455 + 0 + 0 + + + 111 + 273 + 381 + 0 + 0 + + + 1 + 719 + 680 + 1 + 0 + + + 38 + 146 + 234 + 0 + 0 + + + 72 + 174 + 598 + 3 + 0 + + + 1 + 462 + 679 + 1 + 1 + + + 72 + 172 + 605 + 3 + 0 + + + 110 + 282 + 369 + 4 + 0 + + + 21 + 496 + 562 + 0 + 0 + + + 205 + 547 + 442 + 0 + 0 + + + 20 + 602 + 755 + 2 + 0 + + + 34 + 526 + 530 + 0 + 0 + + + 70 + 176 + 194 + 0 + 0 + + + 23 + 111 + 664 + 0 + 0 + + + 419 + 691 + 454 + 2 + 0 + + + 70 + 311 + 237 + 0 + 0 + + + 4 + 306 + 340 + 0 + 0 + + + 0 + 718 + 681 + 1 + 0 + + + 0 + 696 + 551 + 1 + 0 + + + 306 + 640 + 490 + 2 + 0 + + + 284 + 632 + 719 + 0 + 0 + + + 288 + 448 + 700 + 4 + 0 + + + 72 + 131 + 562 + 3 + 0 + + + 70 + 247 + 298 + 0 + 0 + + + 647 + 694 + 503 + 0 + 0 + + + 677 + 495 + 563 + 2 + 0 + + + 205 + 674 + 569 + 2 + 0 + + + 4 + 225 + 462 + 0 + 0 + + + 32 + 50 + 682 + 2 + 0 + + + 0 + 708 + 443 + 3 + 0 + + + 395 + 484 + 648 + 0 + 0 + + + 0 + 644 + 487 + 6 + 0 + + + 88 + 680 + 564 + 5 + 0 + + + 0 + 609 + 515 + 0 + 0 + + + 597 + 726 + 432 + 4 + 0 + + + 1 + 655 + 533 + 0 + 1 + + + 70 + 211 + 349 + 0 + 0 + + + 34 + 392 + 711 + 0 + 0 + + + 4 + 85 + 401 + 0 + 0 + + + 34 + 63 + 541 + 7 + 0 + + + 273 + 450 + 697 + 0 + 0 + + + 70 + 263 + 280 + 0 + 0 + + + 72 + 173 + 601 + 3 + 0 + + + 70 + 328 + 317 + 0 + 0 + + + 284 + 643 + 707 + 0 + 0 + + + 37 + 608 + 574 + 0 + 0 + + + 45 + 545 + 704 + 4 + 0 + + + 112 + 424 + 3524 + 0 + 0 + + + 72 + 173 + 602 + 3 + 0 + + + 100 + 631 + 843 + 6 + 0 + + + 306 + 679 + 514 + 4 + 0 + + + 70 + 333 + 221 + 0 + 0 + + + 4 + 196 + 175 + 0 + 0 + + + 70 + 98 + 350 + 0 + 0 + + + 597 + 672 + 467 + 6 + 0 + + + 64 + 467 + 518 + 0 + 0 + + + 20 + 270 + 127 + 2 + 0 + + + 70 + 283 + 260 + 0 + 0 + + + 1 + 449 + 699 + 1 + 1 + + + 205 + 179 + 411 + 0 + 0 + + + 30 + 226 + 628 + 0 + 0 + + + 100 + 621 + 843 + 6 + 0 + + + 4 + 112 + 306 + 0 + 0 + + + 34 + 51 + 672 + 2 + 0 + + + 70 + 200 + 171 + 0 + 0 + + + 70 + 82 + 417 + 0 + 0 + + + 284 + 624 + 672 + 0 + 0 + + + 59 + 352 + 600 + 2 + 0 + + + 70 + 181 + 406 + 0 + 0 + + + 23 + 111 + 662 + 4 + 0 + + + 55 + 679 + 565 + 3 + 0 + + + 407 + 737 + 569 + 5 + 0 + + + 70 + 220 + 334 + 0 + 0 + + + 19 + 110 + 668 + 0 + 0 + + + 110 + 279 + 373 + 4 + 0 + + + 15 + 158 + 465 + 4 + 0 + + + 34 + 586 + 834 + 2 + 0 + + + 70 + 81 + 422 + 0 + 0 + + + 72 + 129 + 570 + 3 + 0 + + + 205 + 73 + 469 + 0 + 0 + + + 216 + 694 + 655 + 0 + 0 + + + 36 + 345 + 701 + 0 + 0 + + + 55 + 321 + 442 + 4 + 0 + + + 205 + 519 + 466 + 0 + 0 + + + 309 + 541 + 447 + 0 + 0 + + + 70 + 182 + 572 + 6 + 0 + + + 34 + 56 + 611 + 0 + 0 + + + 0 + 286 + 496 + 4 + 0 + + + 1 + 118 + 623 + 0 + 0 + + + 183 + 344 + 703 + 0 + 0 + + + 284 + 634 + 717 + 0 + 0 + + + 397 + 565 + 743 + 0 + 0 + + + 32 + 502 + 695 + 0 + 0 + + + 34 + 78 + 434 + 4 + 0 + + + 3 + 274 + 630 + 0 + 0 + + + 70 + 322 + 228 + 0 + 0 + + + 0 + 510 + 414 + 0 + 0 + + + 33 + 53 + 639 + 0 + 0 + + + 3 + 223 + 638 + 2 + 0 + + + 284 + 666 + 682 + 0 + 0 + + + 0 + 637 + 659 + 0 + 0 + + + 36 + 736 + 474 + 1 + 0 + + + 1 + 70 + 484 + 1 + 0 + + + 70 + 273 + 269 + 0 + 0 + + + 495 + 645 + 486 + 1 + 0 + + + 0 + 74 + 458 + 0 + 0 + + + 88 + 712 + 638 + 0 + 0 + + + 70 + 306 + 240 + 0 + 0 + + + 1 + 160 + 459 + 0 + 0 + + + 70 + 226 + 325 + 0 + 0 + + + 205 + 150 + 226 + 0 + 0 + + + 1 + 75 + 452 + 0 + 0 + + + 665 + 300 + 113 + 0 + 0 + + + 4 + 63 + 538 + 7 + 0 + + + 191 + 572 + 548 + 2 + 0 + + + 284 + 671 + 677 + 2 + 0 + + + 284 + 668 + 680 + 0 + 0 + + + 164 + 733 + 476 + 0 + 0 + + + 524 + 695 + 451 + 0 + 0 + + + 20 + 267 + 127 + 4 + 0 + + + 284 + 669 + 679 + 2 + 0 + + + 1 + 163 + 450 + 0 + 0 + + + 0 + 285 + 499 + 4 + 0 + + + 70 + 191 + 384 + 0 + 0 + + + 70 + 226 + 461 + 6 + 0 + + + 730 + 470 + 3381 + 6 + 0 + + + 1 + 169 + 434 + 0 + 0 + + + 205 + 100 + 338 + 0 + 0 + + + 0 + 61 + 554 + 7 + 0 + + + 37 + 615 + 624 + 4 + 0 + + + 36 + 738 + 520 + 1 + 0 + + + 70 + 245 + 138 + 0 + 0 + + + 192 + 208 + 501 + 4 + 0 + + + 284 + 466 + 453 + 2 + 0 + + + 4 + 214 + 158 + 0 + 0 + + + 0 + 699 + 549 + 1 + 0 + + + 110 + 609 + 458 + 2 + 0 + + + 383 + 613 + 455 + 0 + 0 + + + 70 + 95 + 356 + 0 + 0 + + + 972 + 628 + 778 + 7 + 0 + + + 33 + 447 + 701 + 4 + 0 + + + 72 + 174 + 599 + 3 + 0 + + + 284 + 665 + 683 + 2 + 0 + + + 284 + 482 + 438 + 2 + 0 + + + 70 + 205 + 358 + 0 + 0 + + + 20 + 468 + 517 + 0 + 0 + + + 377 + 607 + 805 + 4 + 0 + + + 284 + 465 + 454 + 0 + 0 + + + 34 + 766 + 548 + 3 + 0 + + + 37 + 694 + 553 + 6 + 0 + + + 284 + 637 + 713 + 0 + 0 + + + 70 + 80 + 423 + 0 + 0 + + + 23 + 621 + 618 + 6 + 0 + + + 34 + 765 + 456 + 3 + 0 + + + 284 + 664 + 684 + 0 + 0 + + + 1 + 262 + 543 + 0 + 1 + + + 20 + 177 + 589 + 0 + 0 + + + 7 + 620 + 619 + 3 + 0 + + + 110 + 278 + 375 + 4 + 0 + + + 70 + 277 + 265 + 0 + 0 + + + 420 + 731 + 525 + 2 + 0 + + + 274 + 618 + 621 + 0 + 0 + + + 38 + 200 + 367 + 0 + 0 + + + 70 + 217 + 156 + 0 + 0 + + + 419 + 650 + 699 + 2 + 0 + + + 402 + 64 + 531 + 0 + 0 + + + 0 + 78 + 436 + 4 + 0 + + + 59 + 172 + 607 + 6 + 0 + + + 4 + 265 + 394 + 0 + 0 + + + 70 + 181 + 405 + 0 + 0 + + + 20 + 154 + 476 + 0 + 0 + + + 524 + 703 + 446 + 2 + 0 + + + 0 + 711 + 540 + 1 + 0 + + + 144 + 699 + 650 + 0 + 0 + + + 5 + 436 + 484 + 2 + 0 + + + 72 + 174 + 600 + 3 + 0 + + + 1 + 225 + 464 + 0 + 0 + + + 38 + 170 + 200 + 0 + 0 + + + 70 + 235 + 312 + 0 + 0 + + + 192 + 663 + 473 + 0 + 0 + + + 283 + 469 + 450 + 2 + 0 + + + 70 + 105 + 324 + 0 + 0 + + + 157 + 265 + 652 + 2 + 0 + + + 4 + 146 + 233 + 0 + 0 + + + 1 + 676 + 568 + 0 + 1 + + + 1 + 259 + 549 + 1 + 1 + + + 597 + 672 + 519 + 6 + 0 + + + 47 + 610 + 688 + 0 + 0 + + + 215 + 127 + 268 + 2 + 0 + + + 110 + 277 + 377 + 4 + 0 + + + 205 + 101 + 337 + 0 + 0 + + + 37 + 625 + 727 + 0 + 0 + + + 4 + 221 + 154 + 0 + 0 + + + 70 + 182 + 187 + 0 + 0 + + + 4 + 154 + 221 + 0 + 0 + + + 38 + 259 + 131 + 0 + 0 + + + 34 + 427 + 494 + 6 + 0 + + + 597 + 719 + 436 + 6 + 0 + + + 4 + 130 + 261 + 0 + 0 + + + 110 + 276 + 378 + 4 + 0 + + + 34 + 763 + 457 + 3 + 0 + + + 34 + 585 + 835 + 2 + 0 + + + 12 + 515 + 470 + 4 + 0 + + + 1 + 78 + 435 + 4 + 0 + + + 34 + 62 + 547 + 7 + 0 + + + 34 + 64 + 530 + 0 + 0 + + + 214 + 128 + 265 + 4 + 0 + + + 72 + 173 + 603 + 3 + 0 + + + 70 + 320 + 326 + 0 + 0 + + + 1012 + 444 + 3366 + 4 + 0 + + + 100 + 649 + 483 + 6 + 0 + + + 597 + 681 + 512 + 0 + 0 + + + 1 + 275 + 628 + 0 + 1 + + + 1 + 111 + 660 + 0 + 1 + + + 205 + 283 + 120 + 0 + 0 + + + 205 + 597 + 761 + 6 + 0 + + + 205 + 307 + 340 + 0 + 0 + + + 70 + 207 + 354 + 0 + 0 + + + 1181 + 543 + 707 + 4 + 0 + + + 72 + 129 + 568 + 3 + 0 + + + 25 + 618 + 679 + 4 + 0 + + + 283 + 619 + 846 + 7 + 0 + + + 377 + 661 + 739 + 3 + 0 + + + 597 + 723 + 531 + 4 + 0 + + + 1 + 76 + 447 + 0 + 0 + + + 0 + 633 + 662 + 0 + 0 + + + 98 + 556 + 689 + 0 + 0 + + + 1 + 166 + 441 + 0 + 0 + + + 70 + 240 + 305 + 0 + 0 + + + 6 + 147 + 498 + 6 + 0 + + + 46 + 471 + 450 + 2 + 0 + + + 597 + 719 + 437 + 6 + 0 + + + 70 + 120 + 289 + 0 + 0 + + + 88 + 190 + 545 + 0 + 0 + + + 72 + 172 + 602 + 3 + 0 + + + 20 + 177 + 585 + 0 + 0 + + + 70 + 82 + 423 + 0 + 0 + + + 72 + 130 + 563 + 3 + 0 + + + 37 + 689 + 556 + 6 + 0 + + + 34 + 65 + 533 + 0 + 0 + + + 0 + 522 + 406 + 0 + 0 + + + 1 + 80 + 433 + 4 + 0 + + + 1 + 77 + 450 + 0 + 0 + + + 1 + 663 + 632 + 0 + 1 + + + 1 + 521 + 536 + 3 + 0 + + + 70 + 308 + 336 + 0 + 0 + + + 32 + 51 + 679 + 2 + 0 + + + 4 + 64 + 541 + 7 + 0 + + + 70 + 191 + 383 + 0 + 0 + + + 1 + 225 + 460 + 0 + 0 + + + 111 + 276 + 375 + 0 + 0 + + + 1 + 74 + 468 + 1 + 0 + + + 7 + 78 + 444 + 6 + 0 + + + 70 + 314 + 233 + 0 + 0 + + + 70 + 233 + 314 + 0 + 0 + + + 20 + 158 + 463 + 6 + 0 + + + 3 + 112 + 653 + 0 + 0 + + + 98 + 667 + 471 + 2 + 0 + + + 192 + 738 + 519 + 0 + 0 + + + 70 + 631 + 607 + 6 + 0 + + + 34 + 436 + 486 + 2 + 0 + + + 23 + 596 + 703 + 6 + 0 + + + 34 + 754 + 508 + 3 + 0 + + + 72 + 173 + 598 + 3 + 0 + + + 70 + 225 + 325 + 0 + 0 + + + 205 + 187 + 185 + 0 + 0 + + + 1 + 474 + 447 + 0 + 1 + + + 877 + 724 + 627 + 0 + 0 + + + 70 + 237 + 146 + 0 + 0 + + + 70 + 260 + 133 + 0 + 0 + + + 284 + 642 + 707 + 0 + 0 + + + 4 + 263 + 278 + 0 + 0 + + + 307 + 740 + 471 + 7 + 0 + + + 45 + 544 + 704 + 4 + 0 + + + 70 + 120 + 288 + 0 + 0 + + + 70 + 192 + 180 + 0 + 0 + + + 4 + 180 + 192 + 0 + 0 + + + 215 + 129 + 268 + 2 + 0 + + + 70 + 134 + 258 + 0 + 0 + + + 1 + 320 + 662 + 1 + 1 + + + 70 + 232 + 315 + 0 + 0 + + + 110 + 275 + 377 + 0 + 0 + + + 70 + 169 + 206 + 0 + 0 + + + 1 + 589 + 771 + 3 + 0 + + + 377 + 649 + 537 + 2 + 0 + + + 15 + 298 + 579 + 0 + 0 + + + 419 + 697 + 451 + 0 + 0 + + + 41 + 316 + 546 + 0 + 0 + + + 34 + 114 + 641 + 1 + 0 + + + 5 + 611 + 1551 + 4 + 0 + + + 6 + 611 + 2495 + 4 + 0 + + + 36 + 726 + 433 + 0 + 0 + + + 284 + 662 + 686 + 0 + 0 + + + 5 + 299 + 577 + 4 + 0 + + + 152 + 608 + 573 + 1 + 1 + + + 4 + 156 + 223 + 0 + 0 + + + 46 + 476 + 445 + 2 + 0 + + + 70 + 142 + 245 + 0 + 0 + + + 70 + 216 + 161 + 0 + 0 + + + 1 + 72 + 483 + 1 + 0 + + + 192 + 696 + 703 + 4 + 0 + + + 70 + 185 + 188 + 0 + 0 + + + 45 + 613 + 1546 + 2 + 0 + + + 4 + 95 + 366 + 0 + 0 + + + 38 + 190 + 183 + 0 + 0 + + + 0 + 645 + 704 + 0 + 0 + + + 284 + 660 + 688 + 0 + 0 + + + 1 + 688 + 660 + 0 + 0 + + + 597 + 697 + 500 + 2 + 0 + + + 38 + 110 + 316 + 0 + 0 + + + 72 + 173 + 599 + 3 + 0 + + + 70 + 158 + 220 + 0 + 0 + + + 20 + 284 + 2966 + 0 + 0 + + + 70 + 192 + 181 + 0 + 0 + + + 70 + 261 + 397 + 0 + 0 + + + 1 + 115 + 635 + 0 + 0 + + + 70 + 183 + 399 + 0 + 0 + + + 445 + 624 + 614 + 2 + 0 + + + 1 + 248 + 570 + 0 + 0 + + + 37 + 614 + 624 + 7 + 0 + + + 70 + 234 + 312 + 0 + 0 + + + 12 + 108 + 676 + 0 + 0 + + + 407 + 689 + 659 + 2 + 0 + + + 306 + 734 + 522 + 0 + 0 + + + 3 + 317 + 544 + 0 + 0 + + + 205 + 603 + 753 + 5 + 0 + + + 37 + 80 + 434 + 4 + 0 + + + 70 + 124 + 280 + 0 + 0 + + + 34 + 56 + 620 + 0 + 0 + + + 32 + 338 + 717 + 0 + 0 + + + 70 + 242 + 428 + 0 + 0 + + + 70 + 213 + 163 + 0 + 0 + + + 284 + 635 + 715 + 0 + 0 + + + 143 + 466 + 520 + 6 + 0 + + + 206 + 626 + 612 + 0 + 0 + + + 4 + 257 + 403 + 0 + 0 + + + 34 + 588 + 832 + 2 + 0 + + + 70 + 134 + 259 + 0 + 0 + + + 284 + 658 + 690 + 0 + 0 + + + 0 + 628 + 723 + 0 + 0 + + + 1 + 114 + 640 + 0 + 0 + + + 214 + 128 + 271 + 4 + 0 + + + 70 + 177 + 196 + 0 + 0 + + + 70 + 307 + 113 + 0 + 0 + + + 12 + 664 + 577 + 6 + 0 + + + 70 + 206 + 167 + 0 + 0 + + + 7 + 317 + 543 + 4 + 0 + + + 37 + 633 + 496 + 2 + 0 + + + 70 + 173 + 199 + 0 + 0 + + + 70 + 104 + 331 + 0 + 0 + + + 36 + 346 + 701 + 0 + 0 + + + 4 + 193 + 378 + 0 + 0 + + + 72 + 173 + 600 + 3 + 0 + + + 5 + 525 + 462 + 0 + 0 + + + 597 + 746 + 467 + 2 + 0 + + + 13 + 108 + 675 + 0 + 0 + + + 20 + 150 + 486 + 0 + 0 + + + 1 + 511 + 547 + 2 + 0 + + + 38 + 219 + 157 + 0 + 0 + + + 70 + 174 + 419 + 0 + 0 + + + 183 + 344 + 705 + 0 + 0 + + + 0 + 644 + 434 + 5 + 0 + + + 70 + 95 + 362 + 0 + 0 + + + 283 + 590 + 769 + 0 + 0 + + + 36 + 725 + 433 + 2 + 0 + + + 4 + 117 + 294 + 0 + 0 + + + 20 + 149 + 489 + 4 + 0 + + + 70 + 176 + 414 + 0 + 0 + + + 72 + 172 + 603 + 3 + 0 + + + 407 + 746 + 562 + 5 + 0 + + + 284 + 631 + 719 + 0 + 0 + + + 37 + 712 + 687 + 4 + 0 + + + 70 + 106 + 324 + 0 + 0 + + + 290 + 601 + 465 + 0 + 0 + + + 2 + 713 + 686 + 4 + 0 + + + 377 + 652 + 643 + 3 + 0 + + + 278 + 451 + 696 + 0 + 0 + + + 4 + 142 + 242 + 0 + 0 + + + 70 + 247 + 420 + 0 + 0 + + + 1 + 250 + 567 + 0 + 0 + + + 42 + 268 + 128 + 4 + 0 + + + 0 + 551 + 440 + 0 + 0 + + + 6 + 338 + 626 + 0 + 0 + + + 0 + 509 + 549 + 2 + 0 + + + 70 + 114 + 301 + 0 + 0 + + + 20 + 499 + 560 + 0 + 0 + + + 205 + 157 + 464 + 0 + 0 + + + 37 + 714 + 685 + 4 + 0 + + + 34 + 66 + 520 + 1 + 0 + + + 0 + 595 + 822 + 0 + 0 + + + 284 + 482 + 439 + 2 + 0 + + + 34 + 414 + 511 + 1 + 0 + + + 283 + 466 + 454 + 2 + 0 + + + 70 + 280 + 260 + 0 + 0 + + + 205 + 200 + 364 + 0 + 0 + + + 34 + 61 + 566 + 7 + 0 + + + 38 + 89 + 388 + 0 + 0 + + + 37 + 323 + 655 + 0 + 0 + + + 278 + 523 + 464 + 0 + 0 + + + 46 + 520 + 604 + 2 + 0 + + + 1 + 550 + 508 + 0 + 0 + + + 284 + 633 + 717 + 0 + 0 + + + 36 + 338 + 718 + 0 + 0 + + + 34 + 585 + 836 + 0 + 0 + + + 7 + 715 + 684 + 0 + 0 + + + 597 + 746 + 514 + 2 + 0 + + + 284 + 469 + 451 + 2 + 0 + + + 70 + 81 + 426 + 0 + 0 + + + 597 + 727 + 432 + 4 + 0 + + + 0 + 626 + 725 + 0 + 0 + + + 72 + 174 + 597 + 3 + 0 + + + 4 + 322 + 226 + 0 + 0 + + + 191 + 570 + 551 + 2 + 0 + + + 70 + 176 + 196 + 0 + 0 + + + 1 + 117 + 622 + 0 + 0 + + + 1 + 167 + 622 + 0 + 0 + + + 70 + 93 + 371 + 0 + 0 + + + 47 + 716 + 683 + 4 + 0 + + + 0 + 717 + 438 + 3 + 0 + + + 70 + 333 + 312 + 0 + 0 + + + 156 + 265 + 650 + 2 + 0 + + + 153 + 614 + 455 + 0 + 0 + + + 70 + 708 + 641 + 0 + 0 + + + 72 + 172 + 604 + 3 + 0 + + + 445 + 681 + 563 + 6 + 0 + + + 20 + 220 + 472 + 0 + 0 + + + 37 + 63 + 547 + 7 + 0 + + + 205 + 334 + 424 + 0 + 0 + + + 4 + 214 + 340 + 0 + 0 + + + 290 + 602 + 464 + 0 + 0 + + + 143 + 463 + 524 + 4 + 0 + + + 70 + 109 + 316 + 0 + 0 + + + 70 + 101 + 341 + 0 + 0 + + + 70 + 205 + 168 + 0 + 0 + + + 4 + 168 + 205 + 0 + 0 + + + 597 + 722 + 531 + 4 + 0 + + + 938 + 659 + 742 + 2 + 0 + + + 70 + 292 + 249 + 0 + 0 + + + 597 + 680 + 512 + 0 + 0 + + + 34 + 587 + 833 + 2 + 0 + + + 214 + 131 + 263 + 3 + 0 + + + 70 + 209 + 348 + 0 + 0 + + + 0 + 114 + 638 + 0 + 0 + + + 4 + 198 + 174 + 0 + 0 + + + 70 + 174 + 198 + 0 + 0 + + + 284 + 640 + 709 + 0 + 0 + + + 70 + 202 + 360 + 0 + 0 + + + 0 + 79 + 436 + 4 + 0 + + + 402 + 65 + 530 + 0 + 0 + + + 394 + 522 + 667 + 1 + 0 + + + 205 + 272 + 243 + 4 + 0 + + + 0 + 610 + 519 + 0 + 0 + + + 20 + 83 + 471 + 0 + 0 + + + 407 + 692 + 658 + 2 + 0 + + + 445 + 623 + 608 + 0 + 0 + + + 0 + 631 + 551 + 0 + 0 + + + 70 + 92 + 425 + 0 + 0 + + + 20 + 533 + 594 + 0 + 0 + + + 1 + 89 + 439 + 4 + 0 + + + 70 + 173 + 382 + 0 + 0 + + + 70 + 222 + 176 + 0 + 0 + + + 111 + 273 + 371 + 0 + 0 + + + 1 + 500 + 572 + 0 + 0 + + + 960 + 628 + 725 + 0 + 0 + + + 37 + 680 + 557 + 6 + 0 + + + 70 + 141 + 277 + 0 + 0 + + + 70 + 166 + 398 + 0 + 0 + + + 4 + 291 + 348 + 0 + 0 + + + 38 + 279 + 140 + 0 + 0 + + + 70 + 217 + 180 + 0 + 0 + + + 284 + 632 + 672 + 0 + 0 + + + 284 + 644 + 707 + 0 + 0 + + + 4 + 158 + 641 + 0 + 0 + + + 45 + 538 + 704 + 4 + 0 + + + 70 + 102 + 383 + 0 + 0 + + + 143 + 332 + 199 + 6 + 0 + + + 0 + 415 + 496 + 6 + 0 + + + 70 + 244 + 160 + 0 + 0 + + + 205 + 160 + 244 + 0 + 0 + + + 139 + 327 + 550 + 4 + 0 + + + 285 + 525 + 603 + 0 + 0 + + + 1 + 568 + 667 + 0 + 0 + + + 34 + 699 + 542 + 1 + 0 + + + 0 + 522 + 548 + 0 + 0 + + + 1 + 629 + 724 + 6 + 0 + + + 7 + 127 + 521 + 4 + 0 + + + 284 + 660 + 690 + 0 + 0 + + + 1 + 218 + 465 + 0 + 1 + + + 34 + 155 + 654 + 0 + 0 + + + 38 + 246 + 269 + 0 + 0 + + + 70 + 95 + 412 + 0 + 0 + + + 70 + 266 + 381 + 0 + 0 + + + 34 + 593 + 534 + 6 + 0 + + + 70 + 225 + 294 + 0 + 0 + + + 7 + 715 + 679 + 4 + 0 + + + 1 + 571 + 744 + 0 + 0 + + + 951 + 637 + 811 + 0 + 0 + + + 51 + 604 + 754 + 0 + 0 + + + 597 + 733 + 432 + 4 + 0 + + + 306 + 723 + 481 + 1 + 0 + + + 70 + 161 + 243 + 0 + 0 + + + 0 + 537 + 449 + 0 + 0 + + + 20 + 620 + 611 + 2 + 0 + + + 0 + 634 + 670 + 0 + 0 + + + 113 + 337 + 611 + 0 + 0 + + + 37 + 618 + 613 + 7 + 0 + + + 20 + 617 + 614 + 2 + 0 + + + 218 + 151 + 259 + 2 + 0 + + + 7 + 612 + 619 + 6 + 0 + + + 6 + 613 + 618 + 0 + 0 + + + 1 + 145 + 456 + 2 + 0 + + + 0 + 301 + 684 + 4 + 0 + + + 22 + 341 + 707 + 4 + 0 + + + 0 + 580 + 837 + 7 + 0 + + + 1 + 90 + 433 + 4 + 0 + + + 70 + 179 + 370 + 0 + 0 + + + 218 + 151 + 258 + 2 + 0 + + + 32 + 337 + 715 + 0 + 0 + + + 306 + 691 + 548 + 2 + 0 + + + 143 + 466 + 517 + 6 + 0 + + + 70 + 308 + 215 + 0 + 0 + + + 4 + 178 + 372 + 0 + 0 + + + 70 + 205 + 323 + 0 + 0 + + + 1 + 681 + 713 + 0 + 0 + + + 278 + 713 + 681 + 0 + 0 + + + 575 + 691 + 458 + 0 + 0 + + + 1 + 79 + 493 + 1 + 0 + + + 70 + 289 + 350 + 0 + 0 + + + 36 + 601 + 476 + 4 + 0 + + + 37 + 608 + 572 + 0 + 0 + + + 0 + 206 + 491 + 0 + 0 + + + 284 + 642 + 709 + 0 + 0 + + + 55 + 168 + 602 + 0 + 0 + + + 313 + 674 + 516 + 3 + 0 + + + 597 + 697 + 499 + 2 + 0 + + + 144 + 334 + 435 + 2 + 0 + + + 55 + 668 + 636 + 4 + 0 + + + 4 + 317 + 319 + 0 + 0 + + + 164 + 740 + 470 + 0 + 0 + + + 218 + 149 + 262 + 0 + 0 + + + 1 + 711 + 683 + 1 + 1 + + + 597 + 672 + 471 + 6 + 0 + + + 34 + 223 + 652 + 0 + 0 + + + 48 + 605 + 575 + 2 + 0 + + + 3 + 127 + 522 + 0 + 0 + + + 20 + 603 + 755 + 4 + 0 + + + 143 + 665 + 639 + 0 + 0 + + + 70 + 626 + 605 + 6 + 0 + + + 4 + 253 + 262 + 0 + 0 + + + 36 + 731 + 433 + 7 + 0 + + + 284 + 635 + 717 + 0 + 0 + + + 218 + 153 + 255 + 0 + 0 + + + 284 + 624 + 681 + 2 + 0 + + + 38 + 235 + 166 + 0 + 0 + + + 70 + 94 + 415 + 0 + 0 + + + 145 + 283 + 2958 + 2 + 0 + + + 34 + 700 + 541 + 1 + 0 + + + 1 + 76 + 513 + 1 + 0 + + + 285 + 464 + 444 + 6 + 0 + + + 951 + 636 + 812 + 4 + 0 + + + 205 + 213 + 311 + 0 + 0 + + + 5 + 516 + 467 + 0 + 0 + + + 70 + 174 + 224 + 0 + 0 + + + 284 + 639 + 713 + 0 + 0 + + + 45 + 522 + 607 + 6 + 0 + + + 34 + 103 + 644 + 4 + 0 + + + 0 + 88 + 447 + 4 + 0 + + + 114 + 339 + 608 + 4 + 0 + + + 284 + 671 + 679 + 2 + 0 + + + 284 + 454 + 454 + 2 + 0 + + + 70 + 129 + 305 + 0 + 0 + + + 70 + 212 + 313 + 0 + 0 + + + 284 + 669 + 681 + 2 + 0 + + + 194 + 409 + 504 + 4 + 0 + + + 14 + 129 + 1598 + 0 + 0 + + + 1 + 133 + 499 + 0 + 0 + + + 34 + 73 + 539 + 7 + 0 + + + 4 + 274 + 242 + 0 + 0 + + + 205 + 605 + 753 + 5 + 0 + + + 218 + 150 + 262 + 0 + 0 + + + 34 + 108 + 614 + 4 + 0 + + + 395 + 619 + 834 + 7 + 0 + + + 1 + 275 + 655 + 0 + 1 + + + 70 + 126 + 312 + 0 + 0 + + + 70 + 175 + 379 + 0 + 0 + + + 70 + 189 + 208 + 0 + 0 + + + 34 + 72 + 546 + 7 + 0 + + + 16 + 450 + 704 + 2 + 0 + + + 306 + 512 + 558 + 0 + 0 + + + 0 + 313 + 463 + 0 + 0 + + + 284 + 667 + 683 + 2 + 0 + + + 279 + 634 + 766 + 0 + 0 + + + 395 + 521 + 668 + 1 + 0 + + + 70 + 200 + 197 + 0 + 0 + + + 7 + 127 + 523 + 0 + 0 + + + 597 + 713 + 531 + 4 + 0 + + + 1 + 152 + 437 + 0 + 0 + + + 100 + 621 + 845 + 6 + 0 + + + 70 + 228 + 636 + 0 + 0 + + + 220 + 151 + 261 + 6 + 0 + + + 34 + 591 + 771 + 0 + 0 + + + 284 + 628 + 676 + 0 + 0 + + + 34 + 630 + 833 + 1 + 0 + + + 38 + 272 + 244 + 0 + 0 + + + 4 + 310 + 326 + 0 + 0 + + + 21 + 537 + 705 + 6 + 0 + + + 70 + 160 + 246 + 0 + 0 + + + 205 + 155 + 254 + 0 + 0 + + + 32 + 495 + 703 + 6 + 0 + + + 70 + 92 + 428 + 0 + 0 + + + 0 + 728 + 520 + 0 + 0 + + + 34 + 706 + 536 + 4 + 0 + + + 405 + 666 + 775 + 3 + 0 + + + 113 + 337 + 612 + 0 + 0 + + + 70 + 132 + 297 + 0 + 0 + + + 0 + 163 + 619 + 0 + 0 + + + 34 + 766 + 494 + 3 + 0 + + + 192 + 739 + 471 + 0 + 0 + + + 284 + 630 + 674 + 0 + 0 + + + 4 + 195 + 341 + 0 + 0 + + + 915 + 699 + 695 + 2 + 0 + + + 647 + 692 + 503 + 0 + 0 + + + 70 + 129 + 304 + 0 + 0 + + + 1 + 579 + 547 + 2 + 0 + + + 284 + 662 + 688 + 0 + 0 + + + 4 + 240 + 277 + 0 + 0 + + + 284 + 637 + 715 + 0 + 0 + + + 70 + 207 + 321 + 0 + 0 + + + 205 + 196 + 339 + 0 + 0 + + + 70 + 470 + 512 + 2 + 0 + + + 0 + 304 + 592 + 2 + 0 + + + 1 + 118 + 563 + 7 + 0 + + + 70 + 144 + 272 + 0 + 0 + + + 37 + 72 + 544 + 7 + 0 + + + 70 + 209 + 318 + 0 + 0 + + + 0 + 503 + 410 + 0 + 0 + + + 70 + 311 + 126 + 0 + 0 + + + 37 + 693 + 546 + 3 + 0 + + + 46 + 520 + 609 + 2 + 0 + + + 70 + 149 + 263 + 0 + 0 + + + 20 + 148 + 449 + 2 + 0 + + + 36 + 728 + 435 + 2 + 0 + + + 70 + 253 + 263 + 0 + 0 + + + 70 + 173 + 227 + 0 + 0 + + + 4 + 187 + 210 + 0 + 0 + + + 218 + 154 + 255 + 0 + 0 + + + 70 + 96 + 409 + 0 + 0 + + + 70 + 265 + 381 + 0 + 0 + + + 20 + 220 + 459 + 6 + 0 + + + 192 + 736 + 473 + 0 + 0 + + + 30 + 230 + 631 + 6 + 0 + + + 70 + 145 + 271 + 0 + 0 + + + 1 + 81 + 485 + 1 + 0 + + + 34 + 697 + 543 + 1 + 0 + + + 70 + 180 + 561 + 0 + 0 + + + 1 + 127 + 524 + 1 + 1 + + + 70 + 211 + 186 + 0 + 0 + + + 51 + 283 + 2957 + 6 + 0 + + + 70 + 127 + 309 + 0 + 0 + + + 284 + 664 + 686 + 0 + 0 + + + 97 + 661 + 735 + 7 + 0 + + + 0 + 517 + 399 + 0 + 0 + + + 218 + 151 + 260 + 2 + 0 + + + 597 + 672 + 518 + 6 + 0 + + + 203 + 219 + 461 + 0 + 0 + + + 38 + 251 + 265 + 0 + 0 + + + 284 + 482 + 428 + 6 + 0 + + + 5 + 317 + 568 + 0 + 0 + + + 38 + 253 + 399 + 0 + 0 + + + 29 + 428 + 482 + 4 + 0 + + + 1 + 621 + 559 + 6 + 0 + + + 4 + 298 + 220 + 0 + 0 + + + 70 + 237 + 167 + 0 + 0 + + + 70 + 311 + 324 + 0 + 0 + + + 205 + 192 + 206 + 0 + 0 + + + 15 + 655 + 530 + 4 + 0 + + + 0 + 689 + 549 + 1 + 0 + + + 205 + 262 + 151 + 0 + 0 + + + 219 + 151 + 262 + 0 + 0 + + + 284 + 663 + 686 + 0 + 0 + + + 46 + 525 + 604 + 2 + 0 + + + 962 + 662 + 781 + 7 + 0 + + + 70 + 138 + 287 + 0 + 0 + + + 36 + 349 + 514 + 0 + 0 + + + 1 + 88 + 450 + 4 + 0 + + + 70 + 132 + 300 + 0 + 0 + + + 34 + 227 + 444 + 4 + 0 + + + 597 + 734 + 432 + 4 + 0 + + + 37 + 608 + 571 + 0 + 0 + + + 70 + 321 + 314 + 0 + 0 + + + 0 + 89 + 445 + 4 + 0 + + + 1 + 318 + 649 + 2 + 0 + + + 115 + 340 + 607 + 0 + 0 + + + 70 + 244 + 413 + 0 + 0 + + + 419 + 647 + 703 + 0 + 0 + + + 38 + 634 + 828 + 1 + 0 + + + 1 + 508 + 564 + 0 + 0 + + + 143 + 461 + 524 + 4 + 0 + + + 273 + 453 + 700 + 6 + 0 + + + 395 + 519 + 669 + 1 + 0 + + + 1 + 317 + 566 + 0 + 1 + + + 1 + 337 + 717 + 0 + 0 + + + 960 + 630 + 722 + 0 + 0 + + + 284 + 665 + 684 + 2 + 0 + + + 63 + 467 + 442 + 6 + 0 + + + 205 + 106 + 374 + 0 + 0 + + + 194 + 736 + 514 + 0 + 0 + + + 70 + 224 + 450 + 6 + 0 + + + 1 + 582 + 729 + 1 + 0 + + + 1 + 614 + 691 + 0 + 1 + + + 70 + 320 + 205 + 0 + 0 + + + 4 + 100 + 656 + 0 + 0 + + + 70 + 240 + 420 + 0 + 0 + + + 285 + 582 + 835 + 6 + 0 + + + 306 + 683 + 666 + 0 + 0 + + + 0 + 347 + 517 + 0 + 0 + + + 884 + 729 + 582 + 2 + 0 + + + 34 + 207 + 487 + 0 + 0 + + + 377 + 609 + 798 + 6 + 0 + + + 284 + 638 + 713 + 0 + 0 + + + 34 + 205 + 492 + 0 + 0 + + + 445 + 672 + 563 + 6 + 0 + + + 218 + 152 + 261 + 0 + 0 + + + 34 + 72 + 551 + 7 + 0 + + + 1 + 583 + 544 + 6 + 0 + + + 114 + 339 + 609 + 4 + 0 + + + 70 + 325 + 122 + 0 + 0 + + + 58 + 131 + 501 + 6 + 0 + + + 70 + 103 + 385 + 0 + 0 + + + 284 + 667 + 682 + 2 + 0 + + + 70 + 335 + 301 + 0 + 0 + + + 0 + 728 + 477 + 1 + 0 + + + 34 + 674 + 561 + 1 + 0 + + + 70 + 276 + 238 + 0 + 0 + + + 285 + 464 + 445 + 6 + 0 + + + 143 + 273 + 2954 + 6 + 0 + + + 29 + 277 + 647 + 4 + 0 + + + 284 + 624 + 680 + 2 + 0 + + + 4 + 173 + 228 + 0 + 0 + + + 1 + 85 + 464 + 0 + 0 + + + 4 + 113 + 349 + 0 + 0 + + + 0 + 310 + 467 + 0 + 0 + + + 4 + 248 + 159 + 0 + 0 + + + 6 + 215 + 468 + 0 + 0 + + + 4 + 248 + 265 + 0 + 0 + + + 1 + 462 + 447 + 0 + 1 + + + 38 + 168 + 235 + 0 + 0 + + + 1 + 86 + 459 + 0 + 0 + + + 34 + 103 + 638 + 4 + 0 + + + 70 + 177 + 223 + 0 + 0 + + + 34 + 765 + 454 + 3 + 0 + + + 284 + 659 + 690 + 0 + 0 + + + 70 + 218 + 181 + 0 + 0 + + + 4 + 219 + 300 + 0 + 0 + + + 37 + 634 + 500 + 2 + 0 + + + 3 + 129 + 1601 + 0 + 0 + + + 1 + 643 + 756 + 0 + 1 + + + 284 + 636 + 715 + 0 + 0 + + + 1 + 153 + 658 + 0 + 0 + + + 1 + 306 + 586 + 2 + 0 + + + 284 + 626 + 678 + 2 + 0 + + + 884 + 728 + 583 + 6 + 0 + + + 34 + 163 + 618 + 0 + 0 + + + 71 + 278 + 645 + 6 + 0 + + + 284 + 454 + 455 + 6 + 0 + + + 7 + 616 + 689 + 0 + 0 + + + 37 + 647 + 490 + 0 + 0 + + + 25 + 617 + 613 + 0 + 0 + + + 70 + 106 + 373 + 0 + 0 + + + 37 + 618 + 612 + 6 + 0 + + + 1 + 614 + 616 + 3 + 1 + + + 6 + 299 + 1521 + 4 + 0 + + + 101 + 72 + 549 + 0 + 0 + + + 20 + 177 + 569 + 0 + 0 + + + 597 + 746 + 507 + 2 + 0 + + + 34 + 632 + 818 + 0 + 0 + + + 34 + 89 + 444 + 4 + 0 + + + 205 + 304 + 130 + 0 + 0 + + + 284 + 661 + 688 + 0 + 0 + + + 1 + 252 + 573 + 0 + 0 + + + 1 + 590 + 824 + 0 + 0 + + + 302 + 638 + 762 + 4 + 0 + + + 70 + 329 + 121 + 0 + 0 + + + 70 + 335 + 431 + 0 + 0 + + + 36 + 212 + 474 + 0 + 0 + + + 69 + 756 + 500 + 3 + 0 + + + 70 + 110 + 362 + 0 + 0 + + + 205 + 235 + 280 + 0 + 0 + + + 565 + 700 + 540 + 2 + 0 + + + 47 + 716 + 679 + 4 + 0 + + + 0 + 84 + 474 + 0 + 0 + + + 960 + 632 + 720 + 0 + 0 + + + 37 + 71 + 561 + 7 + 0 + + + 284 + 629 + 674 + 0 + 0 + + + 194 + 736 + 472 + 0 + 0 + + + 34 + 584 + 726 + 0 + 0 + + + 38 + 288 + 349 + 0 + 0 + + + 70 + 290 + 227 + 0 + 0 + + + 3 + 715 + 680 + 0 + 0 + + + 70 + 326 + 443 + 4 + 0 + + + 25 + 475 + 435 + 2 + 0 + + + 0 + 209 + 481 + 0 + 0 + + + 285 + 486 + 653 + 1 + 0 + + + 1 + 519 + 465 + 1 + 1 + + + 1 + 282 + 637 + 0 + 0 + + + 70 + 284 + 354 + 0 + 0 + + + 1 + 118 + 558 + 7 + 0 + + + 70 + 97 + 411 + 0 + 0 + + + 36 + 632 + 831 + 1 + 0 + + + 597 + 672 + 517 + 6 + 0 + + + 284 + 633 + 719 + 0 + 0 + + + 111 + 266 + 378 + 0 + 0 + + + 597 + 712 + 531 + 4 + 0 + + + 38 + 254 + 157 + 0 + 0 + + + 597 + 680 + 511 + 2 + 0 + + + 34 + 112 + 588 + 1 + 0 + + + 58 + 604 + 474 + 6 + 0 + + + 1 + 321 + 450 + 3 + 1 + + + 34 + 59 + 676 + 2 + 0 + + + 34 + 762 + 456 + 3 + 0 + + + 63 + 628 + 602 + 6 + 0 + + + 34 + 72 + 554 + 7 + 0 + + + 45 + 537 + 704 + 4 + 0 + + + 41 + 602 + 756 + 4 + 0 + + + 70 + 181 + 364 + 0 + 0 + + + 283 + 522 + 608 + 1 + 0 + + + 70 + 235 + 428 + 0 + 0 + + + 285 + 224 + 449 + 2 + 0 + + + 70 + 249 + 404 + 0 + 0 + + + 143 + 668 + 566 + 0 + 0 + + + 284 + 631 + 672 + 0 + 0 + + + 70 + 184 + 217 + 0 + 0 + + + 101 + 73 + 547 + 0 + 0 + + + 218 + 153 + 261 + 0 + 0 + + + 38 + 134 + 298 + 0 + 0 + + + 70 + 164 + 402 + 0 + 0 + + + 164 + 741 + 469 + 7 + 0 + + + 70 + 189 + 210 + 0 + 0 + + + 70 + 162 + 245 + 0 + 0 + + + 284 + 671 + 678 + 2 + 0 + + + 1 + 683 + 712 + 0 + 0 + + + 3 + 333 + 434 + 0 + 0 + + + 285 + 224 + 448 + 2 + 0 + + + 29 + 428 + 483 + 4 + 0 + + + 284 + 669 + 680 + 2 + 0 + + + 597 + 672 + 472 + 6 + 0 + + + 205 + 239 + 420 + 0 + 0 + + + 70 + 283 + 233 + 0 + 0 + + + 118 + 343 + 601 + 6 + 0 + + + 0 + 207 + 485 + 0 + 0 + + + 0 + 497 + 416 + 0 + 0 + + + 25 + 711 + 684 + 0 + 0 + + + 205 + 605 + 752 + 3 + 0 + + + 4 + 235 + 169 + 0 + 0 + + + 70 + 301 + 132 + 0 + 0 + + + 1 + 133 + 496 + 0 + 0 + + + 54 + 709 + 533 + 1 + 0 + + + 960 + 631 + 721 + 0 + 0 + + + 284 + 482 + 429 + 6 + 0 + + + 36 + 663 + 432 + 2 + 0 + + + 38 + 206 + 193 + 0 + 0 + + + 70 + 106 + 375 + 0 + 0 + + + 0 + 92 + 432 + 4 + 0 + + + 70 + 97 + 410 + 0 + 0 + + + 70 + 161 + 410 + 0 + 0 + + + 34 + 659 + 738 + 0 + 0 + + + 192 + 754 + 461 + 0 + 0 + + + 0 + 311 + 465 + 0 + 0 + + + 0 + 90 + 442 + 4 + 0 + + + 273 + 651 + 534 + 2 + 0 + + + 47 + 631 + 599 + 4 + 0 + + + 597 + 746 + 466 + 2 + 0 + + + 55 + 668 + 635 + 6 + 0 + + + 70 + 116 + 343 + 0 + 0 + + + 70 + 230 + 173 + 0 + 0 + + + 1 + 58 + 686 + 1 + 1 + + + 34 + 103 + 641 + 4 + 0 + + + 15 + 468 + 678 + 4 + 0 + + + 703 + 297 + 134 + 6 + 0 + + + 36 + 744 + 508 + 1 + 0 + + + 70 + 321 + 313 + 0 + 0 + + + 1 + 669 + 727 + 7 + 0 + + + 38 + 105 + 379 + 0 + 0 + + + 205 + 178 + 371 + 0 + 0 + + + 0 + 651 + 440 + 5 + 0 + + + 1 + 148 + 454 + 2 + 0 + + + 1 + 151 + 445 + 0 + 0 + + + 97 + 661 + 736 + 7 + 0 + + + 0 + 162 + 632 + 0 + 0 + + + 1 + 59 + 681 + 1 + 1 + + + 307 + 494 + 577 + 0 + 0 + + + 597 + 719 + 439 + 6 + 0 + + + 1 + 280 + 639 + 0 + 1 + + + 285 + 228 + 449 + 2 + 0 + + + 70 + 230 + 627 + 0 + 0 + + + 960 + 633 + 721 + 0 + 0 + + + 284 + 641 + 712 + 2 + 0 + + + 110 + 69 + 582 + 0 + 0 + + + 71 + 618 + 689 + 4 + 0 + + + 70 + 326 + 206 + 0 + 0 + + + 36 + 600 + 475 + 3 + 0 + + + 36 + 694 + 701 + 0 + 0 + + + 306 + 699 + 496 + 2 + 0 + + + 36 + 346 + 517 + 0 + 0 + + + 0 + 526 + 600 + 0 + 0 + + + 1 + 635 + 546 + 0 + 0 + + + 0 + 733 + 473 + 1 + 0 + + + 1 + 145 + 463 + 2 + 0 + + + 3 + 593 + 718 + 0 + 0 + + + 34 + 137 + 490 + 1 + 0 + + + 192 + 736 + 471 + 0 + 0 + + + 308 + 523 + 459 + 0 + 0 + + + 192 + 689 + 706 + 0 + 0 + + + 35 + 62 + 647 + 0 + 0 + + + 284 + 482 + 425 + 6 + 0 + + + 70 + 701 + 651 + 1 + 0 + + + 4 + 102 + 658 + 0 + 0 + + + 284 + 628 + 678 + 2 + 0 + + + 377 + 598 + 712 + 7 + 0 + + + 70 + 249 + 161 + 0 + 0 + + + 70 + 275 + 244 + 0 + 0 + + + 70 + 161 + 249 + 0 + 0 + + + 3 + 279 + 641 + 0 + 0 + + + 70 + 310 + 330 + 0 + 0 + + + 1 + 83 + 483 + 1 + 0 + + + 1 + 299 + 685 + 4 + 0 + + + 397 + 573 + 743 + 0 + 0 + + + 70 + 293 + 229 + 0 + 0 + + + 193 + 602 + 473 + 0 + 1 + + + 34 + 60 + 668 + 0 + 0 + + + 284 + 640 + 713 + 0 + 0 + + + 419 + 695 + 454 + 2 + 0 + + + 101 + 73 + 549 + 0 + 0 + + + 38 + 128 + 313 + 0 + 0 + + + 145 + 473 + 433 + 4 + 0 + + + 394 + 605 + 804 + 1 + 0 + + + 1 + 219 + 467 + 1 + 1 + + + 220 + 276 + 243 + 4 + 0 + + + 38 + 660 + 737 + 2 + 0 + + + 1 + 339 + 708 + 0 + 1 + + + 102 + 68 + 589 + 0 + 0 + + + 0 + 673 + 678 + 0 + 0 + + + 72 + 171 + 598 + 3 + 0 + + + 0 + 234 + 437 + 4 + 0 + + + 37 + 136 + 495 + 0 + 0 + + + 34 + 110 + 612 + 4 + 0 + + + 284 + 632 + 674 + 0 + 0 + + + 1 + 338 + 710 + 0 + 0 + + + 0 + 760 + 497 + 3 + 0 + + + 261 + 406 + 505 + 0 + 0 + + + 0 + 505 + 406 + 0 + 0 + + + 565 + 706 + 535 + 2 + 0 + + + 34 + 682 + 669 + 0 + 0 + + + 284 + 669 + 682 + 2 + 0 + + + 3 + 126 + 534 + 0 + 0 + + + 1 + 295 + 606 + 2 + 0 + + + 0 + 494 + 415 + 0 + 0 + + + 0 + 763 + 495 + 3 + 0 + + + 70 + 202 + 333 + 0 + 0 + + + 1 + 137 + 491 + 1 + 0 + + + 205 + 320 + 125 + 0 + 0 + + + 38 + 598 + 763 + 7 + 0 + + + 284 + 671 + 680 + 2 + 0 + + + 38 + 117 + 342 + 0 + 0 + + + 218 + 278 + 242 + 2 + 0 + + + 0 + 674 + 468 + 3 + 0 + + + 284 + 667 + 684 + 2 + 0 + + + 10 + 468 + 438 + 2 + 0 + + + 106 + 68 + 588 + 0 + 0 + + + 34 + 676 + 513 + 2 + 0 + + + 164 + 741 + 468 + 0 + 0 + + + 36 + 749 + 463 + 1 + 0 + + + 951 + 638 + 811 + 0 + 0 + + + 3 + 594 + 717 + 0 + 0 + + + 205 + 99 + 404 + 0 + 0 + + + 70 + 198 + 202 + 0 + 0 + + + 97 + 662 + 735 + 7 + 0 + + + 70 + 205 + 195 + 0 + 0 + + + 1 + 119 + 565 + 7 + 0 + + + 597 + 680 + 510 + 2 + 0 + + + 0 + 437 + 469 + 0 + 0 + + + 411 + 615 + 614 + 2 + 0 + + + 4 + 245 + 417 + 0 + 0 + + + 10 + 469 + 437 + 4 + 0 + + + 34 + 223 + 647 + 0 + 0 + + + 70 + 106 + 377 + 0 + 0 + + + 597 + 672 + 516 + 6 + 0 + + + 70 + 97 + 412 + 0 + 0 + + + 34 + 72 + 555 + 7 + 0 + + + 1 + 105 + 640 + 0 + 0 + + + 1 + 259 + 557 + 1 + 1 + + + 15 + 226 + 452 + 2 + 0 + + + 70 + 193 + 207 + 0 + 0 + + + 284 + 630 + 676 + 0 + 0 + + + 1 + 82 + 493 + 1 + 0 + + + 5 + 468 + 675 + 0 + 0 + + + 115 + 338 + 607 + 0 + 0 + + + 0 + 154 + 438 + 0 + 0 + + + 70 + 120 + 337 + 0 + 0 + + + 20 + 608 + 621 + 4 + 0 + + + 284 + 624 + 682 + 2 + 0 + + + 20 + 177 + 577 + 0 + 0 + + + 428 + 743 + 467 + 6 + 0 + + + 1 + 309 + 664 + 0 + 0 + + + 395 + 649 + 750 + 2 + 0 + + + 43 + 643 + 757 + 0 + 0 + + + 72 + 171 + 597 + 3 + 0 + + + 525 + 683 + 508 + 2 + 0 + + + 1 + 92 + 439 + 4 + 0 + + + 1 + 321 + 639 + 2 + 0 + + + 4 + 102 + 396 + 0 + 0 + + + 143 + 273 + 2950 + 6 + 0 + + + 1 + 144 + 468 + 2 + 0 + + + 164 + 732 + 474 + 0 + 0 + + + 379 + 565 + 504 + 0 + 0 + + + 45 + 212 + 679 + 2 + 0 + + + 70 + 166 + 406 + 0 + 0 + + + 597 + 672 + 470 + 6 + 0 + + + 37 + 629 + 726 + 0 + 0 + + + 70 + 254 + 402 + 0 + 0 + + + 70 + 214 + 315 + 0 + 0 + + + 597 + 711 + 531 + 4 + 0 + + + 205 + 274 + 246 + 4 + 0 + + + 205 + 156 + 259 + 0 + 0 + + + 70 + 238 + 429 + 0 + 0 + + + 1088 + 80 + 505 + 0 + 0 + + + 38 + 186 + 217 + 0 + 0 + + + 205 + 115 + 351 + 0 + 0 + + + 283 + 464 + 442 + 6 + 0 + + + 7 + 279 + 642 + 0 + 0 + + + 4 + 236 + 171 + 0 + 0 + + + 70 + 171 + 236 + 0 + 0 + + + 1 + 350 + 586 + 0 + 0 + + + 70 + 261 + 391 + 0 + 0 + + + 1106 + 537 + 703 + 0 + 0 + + + 6 + 303 + 1507 + 0 + 0 + + + 0 + 443 + 463 + 0 + 0 + + + 283 + 621 + 833 + 0 + 0 + + + 153 + 550 + 436 + 0 + 0 + + + 70 + 180 + 567 + 6 + 0 + + + 70 + 259 + 260 + 0 + 0 + + + 104 + 74 + 545 + 4 + 0 + + + 597 + 731 + 432 + 4 + 0 + + + 70 + 201 + 335 + 0 + 0 + + + 70 + 128 + 315 + 0 + 0 + + + 145 + 465 + 441 + 0 + 0 + + + 284 + 644 + 709 + 0 + 0 + + + 70 + 186 + 362 + 0 + 0 + + + 1 + 78 + 517 + 1 + 0 + + + 0 + 636 + 669 + 0 + 0 + + + 597 + 746 + 506 + 2 + 0 + + + 1 + 273 + 656 + 1 + 1 + + + 951 + 637 + 812 + 4 + 0 + + + 218 + 276 + 244 + 6 + 0 + + + 597 + 746 + 465 + 5 + 0 + + + 386 + 540 + 699 + 4 + 0 + + + 34 + 477 + 662 + 0 + 0 + + + 219 + 278 + 243 + 0 + 0 + + + 32 + 472 + 669 + 0 + 0 + + + 284 + 635 + 719 + 0 + 0 + + + 36 + 753 + 461 + 1 + 0 + + + 36 + 658 + 433 + 2 + 0 + + + 0 + 425 + 483 + 6 + 0 + + + 196 + 341 + 602 + 0 + 0 + + + 34 + 699 + 540 + 1 + 0 + + + 0 + 645 + 660 + 4 + 0 + + + 597 + 697 + 498 + 2 + 0 + + + 0 + 628 + 727 + 0 + 0 + + + 1 + 106 + 637 + 0 + 0 + + + 284 + 626 + 680 + 2 + 0 + + + 70 + 220 + 183 + 0 + 0 + + + 70 + 122 + 330 + 0 + 0 + + + 98 + 651 + 485 + 6 + 0 + + + 395 + 488 + 647 + 0 + 0 + + + 37 + 647 + 488 + 0 + 0 + + + 283 + 588 + 828 + 0 + 0 + + + 34 + 56 + 719 + 2 + 0 + + + 36 + 601 + 474 + 4 + 0 + + + 205 + 252 + 268 + 0 + 0 + + + 34 + 93 + 433 + 4 + 0 + + + 0 + 730 + 517 + 1 + 0 + + + 1 + 87 + 463 + 0 + 0 + + + 70 + 159 + 253 + 0 + 0 + + + 647 + 690 + 503 + 0 + 0 + + + 938 + 657 + 741 + 2 + 0 + + + 0 + 108 + 625 + 0 + 0 + + + 37 + 90 + 447 + 4 + 0 + + + 1 + 118 + 572 + 0 + 0 + + + 4 + 263 + 153 + 0 + 0 + + + 70 + 157 + 430 + 0 + 0 + + + 3 + 611 + 568 + 0 + 0 + + + 1 + 467 + 676 + 0 + 1 + + + 4 + 269 + 379 + 0 + 0 + + + 210 + 258 + 156 + 2 + 0 + + + 70 + 174 + 388 + 0 + 0 + + + 425 + 711 + 444 + 0 + 0 + + + 205 + 319 + 126 + 0 + 0 + + + 0 + 639 + 494 + 6 + 0 + + + 0 + 449 + 457 + 0 + 0 + + + 1 + 718 + 678 + 1 + 0 + + + 70 + 150 + 268 + 0 + 0 + + + 4 + 120 + 335 + 0 + 0 + + + 111 + 271 + 376 + 0 + 0 + + + 70 + 188 + 542 + 0 + 0 + + + 284 + 454 + 452 + 2 + 0 + + + 1 + 217 + 2582 + 0 + 1 + + + 45 + 536 + 704 + 4 + 0 + + + 284 + 642 + 711 + 0 + 0 + + + 70 + 262 + 389 + 0 + 0 + + + 5 + 360 + 570 + 0 + 0 + + + 34 + 138 + 489 + 1 + 0 + + + 70 + 221 + 182 + 0 + 0 + + + 192 + 737 + 512 + 0 + 0 + + + 284 + 631 + 674 + 0 + 0 + + + 102 + 68 + 598 + 0 + 0 + + + 284 + 643 + 709 + 0 + 0 + + + 1 + 92 + 442 + 4 + 0 + + + 0 + 626 + 553 + 0 + 0 + + + 100 + 70 + 581 + 0 + 0 + + + 110 + 276 + 369 + 4 + 0 + + + 70 + 154 + 264 + 0 + 0 + + + 5 + 318 + 561 + 0 + 0 + + + 37 + 136 + 490 + 0 + 0 + + + 4 + 103 + 647 + 0 + 0 + + + 0 + 615 + 514 + 0 + 0 + + + 0 + 616 + 562 + 6 + 0 + + + 938 + 659 + 739 + 2 + 0 + + + 3 + 594 + 716 + 0 + 0 + + + 4 + 127 + 320 + 0 + 0 + + + 262 + 420 + 489 + 6 + 0 + + + 313 + 489 + 492 + 0 + 0 + + + 34 + 700 + 539 + 4 + 0 + + + 70 + 126 + 323 + 0 + 0 + + + 306 + 708 + 489 + 1 + 0 + + + 34 + 105 + 635 + 4 + 0 + + + 73 + 127 + 525 + 0 + 0 + + + 4 + 319 + 209 + 0 + 0 + + + 70 + 191 + 213 + 0 + 0 + + + 1 + 91 + 447 + 4 + 0 + + + 218 + 271 + 246 + 1 + 0 + + + 32 + 61 + 667 + 0 + 0 + + + 1 + 90 + 452 + 4 + 0 + + + 100 + 649 + 440 + 0 + 0 + + + 397 + 605 + 805 + 2 + 0 + + + 33 + 337 + 714 + 0 + 0 + + + 34 + 766 + 452 + 3 + 0 + + + 46 + 139 + 479 + 4 + 0 + + + 407 + 746 + 570 + 5 + 0 + + + 111 + 270 + 377 + 0 + 0 + + + 70 + 145 + 280 + 0 + 0 + + + 938 + 658 + 740 + 2 + 0 + + + 1 + 151 + 441 + 0 + 0 + + + 51 + 282 + 2966 + 2 + 0 + + + 597 + 680 + 509 + 2 + 0 + + + 3 + 603 + 574 + 2 + 0 + + + 283 + 482 + 426 + 6 + 0 + + + 4 + 157 + 424 + 0 + 0 + + + 34 + 75 + 541 + 7 + 0 + + + 63 + 298 + 689 + 4 + 0 + + + 37 + 645 + 490 + 6 + 0 + + + 951 + 638 + 812 + 4 + 0 + + + 100 + 616 + 841 + 1 + 0 + + + 32 + 476 + 664 + 0 + 0 + + + 285 + 487 + 649 + 1 + 0 + + + 34 + 202 + 504 + 0 + 0 + + + 306 + 592 + 770 + 6 + 0 + + + 284 + 634 + 719 + 0 + 0 + + + 101 + 74 + 549 + 0 + 0 + + + 0 + 579 + 841 + 5 + 0 + + + 70 + 282 + 361 + 0 + 0 + + + 34 + 165 + 617 + 0 + 0 + + + 1 + 359 + 572 + 3 + 1 + + + 1 + 72 + 563 + 0 + 0 + + + 284 + 641 + 711 + 2 + 0 + + + 1 + 603 + 524 + 0 + 0 + + + 29 + 664 + 568 + 0 + 0 + + + 1 + 225 + 452 + 0 + 1 + + + 70 + 187 + 357 + 0 + 0 + + + 306 + 681 + 464 + 2 + 0 + + + 718 + 748 + 463 + 2 + 0 + + + 36 + 740 + 468 + 1 + 0 + + + 205 + 277 + 241 + 4 + 0 + + + 34 + 684 + 462 + 3 + 0 + + + 70 + 185 + 550 + 0 + 0 + + + 70 + 323 + 315 + 0 + 0 + + + 38 + 254 + 263 + 0 + 0 + + + 877 + 731 + 582 + 7 + 0 + + + 285 + 464 + 443 + 6 + 0 + + + 70 + 252 + 161 + 0 + 0 + + + 283 + 458 + 690 + 4 + 0 + + + 5 + 724 + 521 + 4 + 0 + + + 70 + 124 + 327 + 0 + 0 + + + 205 + 314 + 324 + 0 + 0 + + + 17 + 299 + 1524 + 4 + 0 + + + 36 + 756 + 458 + 1 + 0 + + + 143 + 327 + 204 + 2 + 0 + + + 3 + 341 + 705 + 4 + 0 + + + 306 + 677 + 557 + 1 + 0 + + + 101 + 540 + 445 + 1 + 1 + + + 0 + 617 + 512 + 0 + 0 + + + 218 + 270 + 247 + 1 + 0 + + + 38 + 97 + 417 + 0 + 0 + + + 210 + 256 + 158 + 2 + 0 + + + 38 + 158 + 256 + 2 + 0 + + + 4 + 308 + 330 + 0 + 0 + + + 20 + 116 + 575 + 0 + 0 + + + 284 + 633 + 672 + 0 + 0 + + + 26 + 327 + 545 + 4 + 0 + + + 4 + 157 + 425 + 0 + 0 + + + 1 + 89 + 455 + 0 + 0 + + + 0 + 152 + 439 + 0 + 0 + + + 34 + 222 + 458 + 0 + 0 + + + 48 + 466 + 678 + 4 + 0 + + + 34 + 701 + 538 + 4 + 0 + + + 143 + 113 + 362 + 2 + 0 + + + 34 + 678 + 511 + 2 + 0 + + + 55 + 169 + 601 + 0 + 0 + + + 284 + 663 + 688 + 0 + 0 + + + 512 + 703 + 450 + 4 + 0 + + + 113 + 615 + 842 + 6 + 0 + + + 309 + 545 + 441 + 0 + 0 + + + 97 + 662 + 736 + 7 + 0 + + + 597 + 719 + 440 + 6 + 0 + + + 402 + 654 + 745 + 7 + 0 + + + 284 + 454 + 453 + 2 + 0 + + + 284 + 665 + 686 + 0 + 0 + + + 20 + 610 + 568 + 0 + 0 + + + 34 + 136 + 492 + 1 + 0 + + + 0 + 91 + 450 + 4 + 0 + + + 37 + 647 + 489 + 6 + 0 + + + 284 + 638 + 715 + 0 + 0 + + + 0 + 307 + 670 + 0 + 0 + + + 144 + 333 + 201 + 2 + 0 + + + 101 + 75 + 546 + 0 + 0 + + + 284 + 661 + 690 + 0 + 0 + + + 407 + 620 + 460 + 5 + 0 + + + 209 + 641 + 663 + 4 + 0 + + + 205 + 613 + 516 + 0 + 0 + + + 219 + 275 + 243 + 6 + 0 + + + 7 + 279 + 640 + 4 + 0 + + + 23 + 610 + 618 + 2 + 0 + + + 63 + 647 + 753 + 0 + 0 + + + 70 + 303 + 335 + 0 + 0 + + + 205 + 335 + 303 + 0 + 0 + + + 192 + 694 + 702 + 0 + 0 + + + 70 + 97 + 421 + 0 + 0 + + + 5 + 129 + 518 + 0 + 0 + + + 34 + 109 + 613 + 4 + 0 + + + 89 + 130 + 514 + 0 + 0 + + + 70 + 706 + 646 + 0 + 0 + + + 34 + 74 + 552 + 7 + 0 + + + 407 + 664 + 640 + 2 + 0 + + + 283 + 590 + 773 + 0 + 0 + + + 51 + 615 + 691 + 0 + 0 + + + 1 + 154 + 434 + 0 + 0 + + + 70 + 184 + 222 + 0 + 0 + + + 34 + 706 + 534 + 4 + 0 + + + 978 + 606 + 804 + 0 + 0 + + + 0 + 643 + 661 + 0 + 0 + + + 597 + 710 + 531 + 4 + 0 + + + 45 + 522 + 606 + 6 + 0 + + + 377 + 662 + 642 + 4 + 0 + + + 205 + 122 + 335 + 0 + 0 + + + 34 + 57 + 717 + 2 + 0 + + + 278 + 450 + 703 + 0 + 0 + + + 70 + 278 + 147 + 0 + 0 + + + 70 + 98 + 417 + 0 + 0 + + + 730 + 452 + 3378 + 7 + 0 + + + 20 + 614 + 614 + 4 + 0 + + + 597 + 697 + 497 + 2 + 0 + + + 205 + 280 + 146 + 0 + 0 + + + 192 + 739 + 469 + 0 + 0 + + + 181 + 603 + 473 + 3 + 1 + + + 70 + 182 + 224 + 0 + 0 + + + 34 + 689 + 459 + 3 + 0 + + + 32 + 493 + 703 + 6 + 0 + + + 34 + 91 + 448 + 4 + 0 + + + 34 + 222 + 457 + 0 + 0 + + + 445 + 623 + 605 + 0 + 0 + + + 284 + 645 + 707 + 0 + 0 + + + 284 + 636 + 717 + 0 + 0 + + + 70 + 242 + 277 + 0 + 0 + + + 597 + 732 + 432 + 4 + 0 + + + 0 + 525 + 392 + 0 + 0 + + + 4 + 120 + 340 + 0 + 0 + + + 4 + 253 + 265 + 0 + 0 + + + 143 + 666 + 566 + 0 + 0 + + + 4 + 203 + 201 + 0 + 0 + + + 70 + 201 + 203 + 0 + 0 + + + 284 + 629 + 676 + 0 + 0 + + + 153 + 551 + 436 + 0 + 0 + + + 306 + 718 + 525 + 1 + 0 + + + 104 + 70 + 583 + 0 + 0 + + + 0 + 521 + 395 + 0 + 0 + + + 70 + 179 + 228 + 0 + 0 + + + 34 + 136 + 493 + 1 + 0 + + + 192 + 747 + 464 + 0 + 0 + + + 70 + 130 + 314 + 0 + 0 + + + 284 + 482 + 427 + 6 + 0 + + + 37 + 607 + 571 + 0 + 0 + + + 4 + 103 + 650 + 0 + 0 + + + 34 + 250 + 574 + 0 + 0 + + + 37 + 94 + 433 + 4 + 0 + + + 1 + 130 + 515 + 1 + 1 + + + 70 + 116 + 351 + 0 + 0 + + + 1 + 163 + 622 + 0 + 0 + + + 34 + 204 + 497 + 0 + 0 + + + 394 + 500 + 693 + 7 + 0 + + + 70 + 262 + 387 + 0 + 0 + + + 203 + 219 + 463 + 0 + 0 + + + 55 + 169 + 600 + 0 + 0 + + + 0 + 200 + 507 + 0 + 0 + + + 34 + 707 + 533 + 4 + 0 + + + 38 + 253 + 161 + 0 + 0 + + + 34 + 677 + 467 + 3 + 0 + + + 11 + 467 + 677 + 2 + 0 + + + 4 + 241 + 169 + 0 + 0 + + + 102 + 75 + 543 + 4 + 0 + + + 70 + 208 + 322 + 0 + 0 + + + 192 + 739 + 510 + 0 + 0 + + + 164 + 725 + 478 + 4 + 0 + + + 70 + 141 + 289 + 0 + 0 + + + 70 + 167 + 244 + 0 + 0 + + + 0 + 312 + 460 + 0 + 0 + + + 36 + 653 + 437 + 2 + 0 + + + 0 + 105 + 638 + 0 + 0 + + + 20 + 177 + 573 + 0 + 0 + + + 1 + 620 + 510 + 0 + 0 + + + 313 + 717 + 441 + 3 + 0 + + + 38 + 165 + 247 + 0 + 0 + + + 70 + 248 + 409 + 0 + 0 + + + 4 + 187 + 218 + 0 + 0 + + + 1 + 89 + 458 + 0 + 0 + + + 313 + 678 + 510 + 3 + 0 + + + 70 + 161 + 424 + 0 + 0 + + + 0 + 187 + 530 + 4 + 0 + + + 37 + 686 + 555 + 4 + 0 + + + 4 + 147 + 251 + 0 + 0 + + + 34 + 152 + 652 + 0 + 0 + + + 4 + 246 + 150 + 0 + 0 + + + 70 + 100 + 369 + 0 + 0 + + + 283 + 78 + 473 + 6 + 0 + + + 597 + 717 + 531 + 4 + 0 + + + 0 + 674 + 513 + 1 + 0 + + + 4 + 102 + 362 + 0 + 0 + + + 34 + 412 + 505 + 1 + 0 + + + 1 + 67 + 551 + 0 + 0 + + + 202 + 214 + 463 + 4 + 0 + + + 205 + 125 + 295 + 0 + 0 + + + 1 + 363 + 573 + 2 + 1 + + + 1 + 216 + 2581 + 1 + 1 + + + 0 + 710 + 644 + 0 + 0 + + + 70 + 179 + 206 + 3 + 0 + + + 7 + 593 + 713 + 1 + 0 + + + 20 + 84 + 439 + 0 + 0 + + + 88 + 697 + 656 + 0 + 0 + + + 70 + 322 + 646 + 1 + 0 + + + 718 + 750 + 461 + 2 + 0 + + + 218 + 274 + 249 + 0 + 0 + + + 70 + 195 + 350 + 0 + 0 + + + 20 + 130 + 525 + 0 + 0 + + + 4 + 157 + 235 + 0 + 0 + + + 32 + 139 + 491 + 1 + 0 + + + 5 + 54 + 683 + 2 + 0 + + + 7 + 614 + 620 + 2 + 0 + + + 20 + 620 + 614 + 2 + 0 + + + 1 + 578 + 551 + 0 + 0 + + + 34 + 52 + 711 + 2 + 0 + + + 34 + 78 + 474 + 2 + 0 + + + 20 + 112 + 610 + 0 + 0 + + + 36 + 211 + 470 + 0 + 0 + + + 93 + 538 + 592 + 0 + 1 + + + 34 + 618 + 839 + 7 + 0 + + + 0 + 537 + 445 + 0 + 0 + + + 70 + 201 + 184 + 0 + 0 + + + 0 + 495 + 574 + 0 + 0 + + + 209 + 634 + 667 + 5 + 0 + + + 938 + 657 + 736 + 2 + 0 + + + 284 + 645 + 709 + 0 + 0 + + + 20 + 216 + 459 + 0 + 0 + + + 4 + 246 + 403 + 0 + 0 + + + 1 + 643 + 752 + 0 + 1 + + + 34 + 682 + 709 + 0 + 0 + + + 0 + 577 + 838 + 6 + 0 + + + 597 + 672 + 474 + 6 + 0 + + + 153 + 548 + 436 + 0 + 0 + + + 70 + 95 + 389 + 0 + 0 + + + 419 + 711 + 448 + 2 + 0 + + + 1 + 307 + 579 + 1 + 1 + + + 284 + 636 + 719 + 0 + 0 + + + 70 + 230 + 297 + 0 + 0 + + + 70 + 277 + 246 + 0 + 0 + + + 398 + 664 + 781 + 6 + 0 + + + 284 + 629 + 672 + 0 + 0 + + + 0 + 626 + 509 + 2 + 0 + + + 70 + 147 + 252 + 0 + 0 + + + 4 + 130 + 285 + 0 + 0 + + + 575 + 716 + 445 + 4 + 0 + + + 70 + 307 + 222 + 0 + 0 + + + 34 + 108 + 631 + 4 + 0 + + + 51 + 601 + 761 + 4 + 0 + + + 278 + 631 + 766 + 0 + 0 + + + 36 + 599 + 474 + 2 + 0 + + + 70 + 158 + 431 + 0 + 0 + + + 4 + 311 + 219 + 0 + 0 + + + 5 + 226 + 439 + 0 + 0 + + + 0 + 448 + 464 + 0 + 0 + + + 394 + 498 + 694 + 7 + 0 + + + 219 + 278 + 245 + 2 + 0 + + + 4 + 266 + 373 + 0 + 0 + + + 70 + 285 + 239 + 0 + 0 + + + 283 + 524 + 608 + 1 + 0 + + + 3 + 83 + 446 + 2 + 0 + + + 205 + 673 + 566 + 2 + 0 + + + 34 + 153 + 649 + 0 + 0 + + + 0 + 631 + 670 + 0 + 0 + + + 23 + 734 + 471 + 6 + 0 + + + 0 + 670 + 516 + 6 + 0 + + + 70 + 58 + 112 + 0 + 0 + + + 51 + 454 + 702 + 6 + 0 + + + 4 + 122 + 304 + 0 + 0 + + + 597 + 697 + 496 + 2 + 0 + + + 3 + 83 + 447 + 2 + 0 + + + 70 + 162 + 421 + 0 + 0 + + + 928 + 712 + 679 + 4 + 0 + + + 1 + 619 + 683 + 1 + 1 + + + 70 + 244 + 407 + 0 + 0 + + + 284 + 663 + 690 + 0 + 0 + + + 407 + 603 + 471 + 6 + 0 + + + 63 + 642 + 753 + 4 + 0 + + + 215 + 133 + 279 + 1 + 0 + + + 284 + 638 + 717 + 0 + 0 + + + 34 + 708 + 538 + 4 + 0 + + + 597 + 736 + 433 + 2 + 0 + + + 70 + 89 + 417 + 0 + 0 + + + 70 + 109 + 340 + 0 + 0 + + + 70 + 284 + 240 + 0 + 0 + + + 38 + 282 + 352 + 0 + 0 + + + 284 + 647 + 707 + 0 + 0 + + + 0 + 67 + 553 + 7 + 0 + + + 0 + 314 + 469 + 0 + 0 + + + 0 + 312 + 472 + 0 + 0 + + + 4 + 164 + 226 + 0 + 0 + + + 34 + 138 + 494 + 1 + 0 + + + 16 + 82 + 452 + 2 + 0 + + + 97 + 609 + 1548 + 0 + 1 + + + 284 + 454 + 458 + 6 + 0 + + + 285 + 488 + 653 + 1 + 0 + + + 0 + 614 + 519 + 0 + 0 + + + 283 + 581 + 832 + 2 + 0 + + + 286 + 491 + 649 + 1 + 0 + + + 118 + 146 + 254 + 0 + 0 + + + 70 + 191 + 357 + 0 + 0 + + + 63 + 649 + 491 + 4 + 0 + + + 34 + 201 + 494 + 0 + 0 + + + 70 + 90 + 412 + 0 + 0 + + + 308 + 513 + 466 + 0 + 0 + + + 45 + 541 + 704 + 4 + 0 + + + 37 + 149 + 460 + 2 + 0 + + + 23 + 596 + 709 + 6 + 0 + + + 70 + 169 + 220 + 0 + 0 + + + 32 + 55 + 676 + 2 + 0 + + + 299 + 526 + 606 + 2 + 0 + + + 0 + 613 + 520 + 0 + 0 + + + 597 + 746 + 510 + 2 + 0 + + + 27 + 212 + 694 + 0 + 0 + + + 1 + 154 + 445 + 0 + 0 + + + 3 + 54 + 688 + 0 + 0 + + + 284 + 665 + 688 + 0 + 0 + + + 597 + 749 + 462 + 5 + 0 + + + 100 + 651 + 436 + 0 + 0 + + + 70 + 183 + 203 + 0 + 0 + + + 283 + 410 + 508 + 1 + 0 + + + 308 + 631 + 725 + 0 + 0 + + + 3 + 165 + 599 + 0 + 0 + + + 45 + 216 + 681 + 2 + 0 + + + 70 + 136 + 273 + 0 + 0 + + + 34 + 121 + 566 + 7 + 0 + + + 8 + 52 + 714 + 0 + 0 + + + 278 + 634 + 763 + 0 + 0 + + + 1 + 598 + 533 + 6 + 0 + + + 7 + 84 + 442 + 4 + 0 + + + 3 + 278 + 640 + 0 + 0 + + + 70 + 271 + 137 + 0 + 0 + + + 704 + 297 + 125 + 2 + 0 + + + 214 + 138 + 269 + 3 + 0 + + + 1 + 107 + 640 + 0 + 0 + + + 209 + 86 + 433 + 7 + 0 + + + 1 + 166 + 596 + 0 + 0 + + + 205 + 425 + 3381 + 4 + 0 + + + 34 + 721 + 480 + 3 + 0 + + + 597 + 672 + 515 + 6 + 0 + + + 70 + 214 + 174 + 0 + 0 + + + 29 + 427 + 488 + 0 + 0 + + + 22 + 604 + 470 + 0 + 0 + + + 34 + 106 + 647 + 4 + 0 + + + 1 + 252 + 584 + 0 + 0 + + + 70 + 132 + 282 + 0 + 0 + + + 70 + 188 + 198 + 0 + 0 + + + 70 + 282 + 132 + 0 + 0 + + + 284 + 669 + 684 + 2 + 0 + + + 71 + 652 + 489 + 6 + 0 + + + 3 + 276 + 645 + 4 + 0 + + + 597 + 723 + 441 + 0 + 0 + + + 3 + 84 + 443 + 2 + 0 + + + 402 + 652 + 742 + 7 + 0 + + + 36 + 741 + 467 + 1 + 0 + + + 205 + 281 + 244 + 4 + 0 + + + 34 + 79 + 471 + 4 + 0 + + + 205 + 122 + 305 + 0 + 0 + + + 70 + 322 + 457 + 4 + 0 + + + 0 + 517 + 403 + 0 + 0 + + + 377 + 660 + 733 + 1 + 0 + + + 209 + 230 + 430 + 1 + 0 + + + 284 + 627 + 674 + 0 + 0 + + + 284 + 667 + 686 + 0 + 0 + + + 4 + 155 + 638 + 0 + 0 + + + 205 + 166 + 413 + 0 + 0 + + + 70 + 246 + 402 + 0 + 0 + + + 50 + 293 + 711 + 0 + 0 + + + 24 + 339 + 704 + 0 + 0 + + + 951 + 639 + 811 + 0 + 0 + + + 24 + 518 + 548 + 6 + 0 + + + 70 + 111 + 335 + 0 + 0 + + + 1 + 67 + 555 + 0 + 0 + + + 70 + 112 + 332 + 0 + 0 + + + 0 + 506 + 561 + 0 + 0 + + + 0 + 539 + 443 + 0 + 0 + + + 20 + 150 + 456 + 2 + 0 + + + 0 + 509 + 409 + 0 + 0 + + + 11 + 314 + 663 + 0 + 0 + + + 16 + 590 + 716 + 0 + 0 + + + 1 + 253 + 581 + 0 + 0 + + + 70 + 233 + 160 + 0 + 0 + + + 938 + 703 + 651 + 1 + 0 + + + 284 + 624 + 677 + 2 + 0 + + + 70 + 103 + 362 + 0 + 0 + + + 34 + 79 + 472 + 1 + 0 + + + 0 + 682 + 558 + 1 + 0 + + + 0 + 441 + 472 + 0 + 0 + + + 36 + 733 + 435 + 2 + 0 + + + 38 + 318 + 215 + 0 + 0 + + + 284 + 640 + 715 + 0 + 0 + + + 70 + 123 + 303 + 0 + 0 + + + 70 + 303 + 123 + 0 + 0 + + + 283 + 617 + 840 + 3 + 0 + + + 205 + 519 + 460 + 0 + 0 + + + 70 + 192 + 194 + 0 + 0 + + + 34 + 603 + 802 + 0 + 0 + + + 4 + 139 + 268 + 0 + 0 + + + 34 + 685 + 706 + 0 + 0 + + + 0 + 108 + 633 + 0 + 0 + + + 70 + 180 + 207 + 0 + 0 + + + 284 + 671 + 682 + 2 + 0 + + + 70 + 159 + 235 + 0 + 0 + + + 445 + 623 + 611 + 0 + 0 + + + 45 + 610 + 1546 + 6 + 0 + + + 34 + 732 + 520 + 3 + 0 + + + 1 + 203 + 488 + 0 + 0 + + + 220 + 275 + 249 + 0 + 0 + + + 283 + 79 + 473 + 2 + 0 + + + 7 + 615 + 687 + 4 + 0 + + + 0 + 215 + 684 + 0 + 0 + + + 1 + 138 + 496 + 1 + 0 + + + 145 + 312 + 571 + 0 + 0 + + + 37 + 647 + 493 + 2 + 0 + + + 0 + 518 + 402 + 0 + 0 + + + 70 + 314 + 218 + 0 + 0 + + + 70 + 247 + 401 + 0 + 0 + + + 205 + 97 + 385 + 0 + 0 + + + 70 + 210 + 326 + 0 + 0 + + + 284 + 482 + 432 + 2 + 0 + + + 20 + 315 + 661 + 0 + 0 + + + 36 + 736 + 470 + 1 + 0 + + + 16 + 453 + 704 + 2 + 0 + + + 38 + 607 + 754 + 1 + 0 + + + 70 + 247 + 277 + 0 + 0 + + + 3 + 518 + 461 + 0 + 0 + + + 36 + 688 + 703 + 0 + 0 + + + 4 + 106 + 352 + 0 + 0 + + + 8 + 161 + 615 + 0 + 0 + + + 34 + 67 + 557 + 7 + 0 + + + 1 + 292 + 713 + 1 + 1 + + + 70 + 143 + 261 + 0 + 0 + + + 284 + 637 + 717 + 0 + 0 + + + 153 + 549 + 436 + 0 + 0 + + + 7 + 84 + 445 + 4 + 0 + + + 1 + 105 + 645 + 0 + 0 + + + 4 + 89 + 420 + 0 + 0 + + + 284 + 646 + 707 + 0 + 0 + + + 43 + 474 + 673 + 4 + 0 + + + 192 + 744 + 511 + 0 + 0 + + + 70 + 256 + 385 + 0 + 0 + + + 71 + 612 + 690 + 2 + 0 + + + 407 + 608 + 468 + 0 + 0 + + + 45 + 540 + 704 + 4 + 0 + + + 7 + 129 + 525 + 4 + 0 + + + 5 + 665 + 635 + 0 + 0 + + + 214 + 135 + 277 + 2 + 0 + + + 25 + 490 + 651 + 1 + 0 + + + 24 + 651 + 490 + 0 + 0 + + + 70 + 236 + 287 + 0 + 0 + + + 143 + 332 + 204 + 6 + 0 + + + 0 + 304 + 686 + 4 + 0 + + + 3 + 343 + 608 + 0 + 0 + + + 70 + 313 + 315 + 0 + 0 + + + 306 + 727 + 523 + 0 + 0 + + + 70 + 167 + 224 + 0 + 0 + + + 1 + 329 + 206 + 0 + 1 + + + 33 + 463 + 689 + 4 + 0 + + + 34 + 708 + 537 + 4 + 0 + + + 597 + 716 + 531 + 4 + 0 + + + 4 + 242 + 280 + 0 + 0 + + + 20 + 112 + 605 + 0 + 0 + + + 70 + 231 + 427 + 0 + 0 + + + 283 + 79 + 474 + 5 + 0 + + + 377 + 662 + 638 + 4 + 0 + + + 530 + 692 + 499 + 0 + 0 + + + 1 + 502 + 567 + 0 + 0 + + + 7 + 613 + 689 + 0 + 0 + + + 1 + 324 + 547 + 1 + 1 + + + 0 + 750 + 507 + 3 + 0 + + + 284 + 662 + 690 + 0 + 0 + + + 70 + 127 + 295 + 0 + 0 + + + 70 + 253 + 268 + 0 + 0 + + + 3 + 84 + 446 + 2 + 0 + + + 20 + 150 + 452 + 0 + 0 + + + 20 + 209 + 472 + 0 + 0 + + + 70 + 279 + 243 + 0 + 0 + + + 34 + 402 + 708 + 0 + 0 + + + 4 + 311 + 218 + 0 + 0 + + + 5 + 165 + 598 + 0 + 0 + + + 68 + 347 + 601 + 0 + 1 + + + 70 + 245 + 153 + 0 + 0 + + + 35 + 51 + 735 + 0 + 0 + + + 34 + 137 + 495 + 1 + 0 + + + 1 + 305 + 684 + 2 + 0 + + + 202 + 214 + 461 + 4 + 0 + + + 70 + 109 + 344 + 0 + 0 + + + 0 + 699 + 544 + 1 + 0 + + + 283 + 472 + 442 + 6 + 0 + + + 284 + 454 + 459 + 6 + 0 + + + 70 + 257 + 263 + 0 + 0 + + + 34 + 421 + 495 + 0 + 0 + + + 29 + 83 + 452 + 0 + 0 + + + 70 + 284 + 238 + 0 + 0 + + + 111 + 617 + 461 + 0 + 0 + + + 36 + 210 + 470 + 0 + 0 + + + 23 + 302 + 690 + 6 + 0 + + + 284 + 664 + 688 + 0 + 0 + + + 51 + 452 + 706 + 4 + 0 + + + 283 + 499 + 570 + 0 + 0 + + + 206 + 146 + 257 + 4 + 0 + + + 32 + 422 + 674 + 0 + 0 + + + 0 + 299 + 593 + 2 + 0 + + + 0 + 521 + 400 + 0 + 0 + + + 34 + 404 + 704 + 0 + 0 + + + 4 + 625 + 731 + 6 + 0 + + + 100 + 69 + 544 + 4 + 0 + + + 70 + 97 + 387 + 0 + 0 + + + 284 + 639 + 715 + 0 + 0 + + + 70 + 96 + 391 + 0 + 0 + + + 0 + 525 + 397 + 0 + 0 + + + 112 + 340 + 613 + 4 + 0 + + + 55 + 164 + 602 + 0 + 0 + + + 3 + 84 + 447 + 2 + 0 + + + 55 + 611 + 691 + 0 + 0 + + + 219 + 276 + 245 + 6 + 0 + + + 205 + 149 + 252 + 0 + 0 + + + 34 + 107 + 632 + 0 + 0 + + + 70 + 214 + 316 + 0 + 0 + + + 70 + 158 + 428 + 0 + 0 + + + 15 + 519 + 665 + 2 + 0 + + + 34 + 605 + 858 + 6 + 0 + + + 193 + 601 + 473 + 0 + 1 + + + 70 + 89 + 422 + 0 + 0 + + + 37 + 689 + 552 + 1 + 0 + + + 70 + 321 + 117 + 0 + 0 + + + 4 + 293 + 337 + 0 + 0 + + + 205 + 58 + 120 + 0 + 0 + + + 70 + 234 + 422 + 0 + 0 + + + 0 + 715 + 532 + 1 + 0 + + + 143 + 330 + 205 + 4 + 0 + + + 1 + 151 + 448 + 0 + 0 + + + 70 + 51 + 137 + 0 + 0 + + + 34 + 612 + 564 + 6 + 0 + + + 597 + 752 + 459 + 2 + 0 + + + 70 + 144 + 261 + 0 + 0 + + + 4 + 187 + 201 + 0 + 0 + + + 4 + 219 + 309 + 0 + 0 + + + 29 + 219 + 451 + 2 + 0 + + + 284 + 667 + 685 + 2 + 0 + + + 3 + 344 + 606 + 0 + 0 + + + 1 + 483 + 496 + 0 + 0 + + + 25 + 303 + 688 + 6 + 0 + + + 306 + 508 + 560 + 4 + 0 + + + 283 + 80 + 470 + 3 + 0 + + + 4 + 235 + 160 + 0 + 0 + + + 2 + 222 + 445 + 0 + 0 + + + 425 + 650 + 703 + 4 + 0 + + + 284 + 671 + 681 + 2 + 0 + + + 938 + 703 + 650 + 3 + 0 + + + 284 + 669 + 683 + 2 + 0 + + + 70 + 185 + 366 + 0 + 0 + + + 205 + 608 + 525 + 0 + 0 + + + 597 + 672 + 475 + 6 + 0 + + + 0 + 632 + 723 + 0 + 0 + + + 4 + 312 + 217 + 0 + 0 + + + 1 + 156 + 434 + 0 + 0 + + + 182 + 337 + 711 + 0 + 0 + + + 36 + 736 + 469 + 1 + 0 + + + 70 + 273 + 248 + 1 + 0 + + + 70 + 325 + 451 + 4 + 0 + + + 419 + 719 + 444 + 0 + 0 + + + 313 + 488 + 490 + 0 + 0 + + + 70 + 191 + 356 + 0 + 0 + + + 284 + 628 + 672 + 0 + 0 + + + 218 + 150 + 251 + 2 + 0 + + + 419 + 691 + 462 + 2 + 0 + + + 0 + 582 + 832 + 3 + 0 + + + 20 + 130 + 523 + 0 + 0 + + + 219 + 273 + 249 + 4 + 0 + + + 286 + 709 + 683 + 0 + 0 + + + 1 + 563 + 505 + 1 + 1 + + + 0 + 82 + 459 + 0 + 0 + + + 8 + 292 + 715 + 0 + 0 + + + 402 + 500 + 691 + 3 + 0 + + + 205 + 196 + 192 + 0 + 0 + + + 7 + 84 + 448 + 0 + 0 + + + 395 + 665 + 780 + 0 + 0 + + + 164 + 732 + 472 + 3 + 0 + + + 70 + 274 + 359 + 0 + 0 + + + 20 + 533 + 599 + 0 + 0 + + + 70 + 57 + 120 + 0 + 0 + + + 71 + 83 + 454 + 2 + 0 + + + 1 + 156 + 436 + 0 + 0 + + + 38 + 157 + 240 + 0 + 0 + + + 70 + 314 + 120 + 0 + 0 + + + 70 + 227 + 166 + 0 + 0 + + + 34 + 80 + 471 + 3 + 0 + + + 70 + 182 + 207 + 3 + 0 + + + 597 + 724 + 441 + 0 + 0 + + + 34 + 87 + 433 + 4 + 0 + + + 70 + 234 + 161 + 0 + 0 + + + 70 + 272 + 250 + 1 + 0 + + + 45 + 610 + 1545 + 6 + 0 + + + 284 + 641 + 713 + 0 + 0 + + + 34 + 227 + 646 + 0 + 0 + + + 938 + 658 + 736 + 2 + 0 + + + 1 + 106 + 642 + 0 + 0 + + + 36 + 729 + 438 + 2 + 0 + + + 283 + 592 + 772 + 0 + 0 + + + 524 + 708 + 451 + 0 + 0 + + + 37 + 138 + 493 + 0 + 0 + + + 284 + 454 + 460 + 6 + 0 + + + 219 + 149 + 253 + 4 + 0 + + + 295 + 280 + 634 + 0 + 0 + + + 6 + 412 + 507 + 1 + 0 + + + 34 + 137 + 497 + 1 + 0 + + + 70 + 266 + 370 + 0 + 0 + + + 420 + 714 + 484 + 2 + 0 + + + 4 + 244 + 279 + 0 + 0 + + + 0 + 754 + 504 + 3 + 0 + + + 960 + 627 + 729 + 0 + 0 + + + 34 + 696 + 546 + 1 + 0 + + + 445 + 675 + 563 + 6 + 0 + + + 8 + 160 + 615 + 2 + 0 + + + 396 + 517 + 668 + 2 + 0 + + + 4 + 117 + 323 + 0 + 0 + + + 70 + 141 + 268 + 0 + 0 + + + 20 + 608 + 568 + 6 + 0 + + + 218 + 277 + 245 + 4 + 0 + + + 36 + 759 + 455 + 3 + 0 + + + 1 + 80 + 472 + 7 + 0 + + + 3 + 613 + 620 + 0 + 0 + + + 70 + 101 + 374 + 0 + 0 + + + 70 + 287 + 343 + 0 + 0 + + + 70 + 133 + 284 + 0 + 0 + + + 70 + 264 + 257 + 0 + 0 + + + 25 + 612 + 621 + 0 + 0 + + + 3 + 129 + 526 + 0 + 0 + + + 285 + 634 + 721 + 2 + 0 + + + 1 + 617 + 616 + 2 + 1 + + + 34 + 295 + 602 + 2 + 0 + + + 192 + 738 + 468 + 0 + 0 + + + 70 + 186 + 365 + 0 + 0 + + + 70 + 159 + 427 + 0 + 0 + + + 938 + 656 + 738 + 2 + 0 + + + 284 + 626 + 674 + 0 + 0 + + + 36 + 210 + 469 + 0 + 0 + + + 34 + 138 + 492 + 1 + 0 + + + 43 + 615 + 618 + 0 + 0 + + + 38 + 163 + 232 + 0 + 0 + + + 7 + 614 + 619 + 2 + 0 + + + 1 + 189 + 521 + 0 + 0 + + + 164 + 609 + 795 + 3 + 0 + + + 70 + 175 + 216 + 0 + 0 + + + 70 + 168 + 225 + 0 + 0 + + + 218 + 150 + 252 + 2 + 0 + + + 1 + 82 + 461 + 0 + 0 + + + 4 + 119 + 318 + 0 + 0 + + + 34 + 80 + 473 + 0 + 0 + + + 597 + 736 + 434 + 2 + 0 + + + 597 + 672 + 514 + 6 + 0 + + + 70 + 114 + 332 + 0 + 0 + + + 218 + 149 + 254 + 2 + 0 + + + 205 + 275 + 247 + 4 + 0 + + + 284 + 643 + 711 + 0 + 0 + + + 70 + 192 + 197 + 0 + 0 + + + 729 + 468 + 3383 + 7 + 0 + + + 70 + 181 + 209 + 0 + 0 + + + 951 + 639 + 812 + 4 + 0 + + + 1 + 296 + 600 + 2 + 0 + + + 0 + 681 + 711 + 0 + 0 + + + 11 + 711 + 681 + 0 + 0 + + + 4 + 104 + 653 + 0 + 0 + + + 284 + 482 + 433 + 2 + 0 + + + 70 + 270 + 365 + 0 + 0 + + + 70 + 144 + 263 + 0 + 0 + + + 100 + 649 + 438 + 4 + 0 + + + 70 + 289 + 341 + 0 + 0 + + + 70 + 107 + 354 + 0 + 0 + + + 34 + 687 + 465 + 3 + 0 + + + 273 + 434 + 481 + 2 + 0 + + + 597 + 680 + 508 + 2 + 0 + + + 7 + 278 + 639 + 4 + 0 + + + 960 + 635 + 720 + 0 + 0 + + + 36 + 339 + 524 + 0 + 0 + + + 36 + 655 + 434 + 2 + 0 + + + 718 + 751 + 460 + 2 + 0 + + + 34 + 656 + 487 + 5 + 0 + + + 36 + 211 + 467 + 0 + 0 + + + 70 + 201 + 345 + 0 + 0 + + + 1 + 467 + 680 + 1 + 1 + + + 36 + 730 + 435 + 5 + 0 + + + 45 + 524 + 606 + 2 + 0 + + + 1 + 427 + 485 + 1 + 1 + + + 205 + 239 + 159 + 0 + 0 + + + 219 + 149 + 255 + 6 + 0 + + + 34 + 76 + 500 + 1 + 0 + + + 100 + 70 + 543 + 4 + 0 + + + 25 + 301 + 688 + 6 + 0 + + + 20 + 169 + 593 + 0 + 0 + + + 54 + 116 + 598 + 0 + 0 + + + 394 + 662 + 732 + 1 + 0 + + + 306 + 761 + 499 + 3 + 0 + + + 59 + 114 + 608 + 4 + 0 + + + 1 + 315 + 561 + 3 + 1 + + + 12 + 103 + 673 + 0 + 0 + + + 443 + 588 + 540 + 4 + 0 + + + 597 + 735 + 432 + 4 + 0 + + + 113 + 617 + 842 + 5 + 0 + + + 34 + 619 + 557 + 6 + 0 + + + 0 + 109 + 636 + 0 + 0 + + + 597 + 720 + 441 + 0 + 0 + + + 205 + 292 + 130 + 0 + 0 + + + 0 + 682 + 672 + 0 + 0 + + + 7 + 592 + 716 + 0 + 0 + + + 938 + 704 + 651 + 3 + 0 + + + 1 + 681 + 673 + 0 + 0 + + + 284 + 641 + 715 + 0 + 0 + + + 70 + 273 + 367 + 0 + 0 + + + 29 + 451 + 704 + 0 + 0 + + + 597 + 746 + 509 + 2 + 0 + + + 284 + 671 + 683 + 2 + 0 + + + 205 + 134 + 283 + 0 + 0 + + + 990 + 633 + 724 + 0 + 0 + + + 205 + 607 + 755 + 5 + 0 + + + 597 + 680 + 507 + 2 + 0 + + + 1 + 520 + 663 + 0 + 1 + + + 70 + 310 + 323 + 0 + 0 + + + 394 + 510 + 676 + 0 + 0 + + + 394 + 507 + 680 + 0 + 0 + + + 38 + 205 + 338 + 0 + 0 + + + 192 + 743 + 464 + 0 + 0 + + + 37 + 150 + 462 + 2 + 0 + + + 216 + 135 + 281 + 1 + 0 + + + 209 + 636 + 597 + 2 + 0 + + + 284 + 627 + 676 + 0 + 0 + + + 597 + 672 + 513 + 6 + 0 + + + 21 + 271 + 652 + 0 + 0 + + + 219 + 150 + 253 + 0 + 0 + + + 283 + 454 + 456 + 6 + 0 + + + 0 + 515 + 402 + 0 + 0 + + + 4 + 672 + 565 + 2 + 0 + + + 70 + 199 + 348 + 0 + 0 + + + 192 + 761 + 453 + 0 + 0 + + + 6 + 523 + 607 + 4 + 0 + + + 38 + 243 + 285 + 0 + 0 + + + 597 + 715 + 531 + 4 + 0 + + + 16 + 525 + 453 + 4 + 0 + + + 70 + 184 + 206 + 0 + 0 + + + 70 + 156 + 243 + 0 + 0 + + + 70 + 333 + 208 + 0 + 0 + + + 70 + 223 + 170 + 0 + 0 + + + 23 + 300 + 690 + 6 + 0 + + + 0 + 529 + 535 + 6 + 0 + + + 7 + 85 + 446 + 2 + 0 + + + 209 + 637 + 596 + 2 + 0 + + + 45 + 610 + 1547 + 6 + 0 + + + 4 + 89 + 426 + 0 + 0 + + + 284 + 668 + 686 + 0 + 0 + + + 100 + 615 + 845 + 1 + 0 + + + 283 + 464 + 446 + 6 + 0 + + + 284 + 626 + 677 + 2 + 0 + + + 205 + 662 + 785 + 2 + 0 + + + 1 + 670 + 567 + 1 + 1 + + + 70 + 230 + 301 + 0 + 0 + + + 1 + 108 + 641 + 0 + 0 + + + 1 + 55 + 693 + 0 + 1 + + + 36 + 213 + 471 + 0 + 0 + + + 153 + 546 + 436 + 0 + 0 + + + 286 + 488 + 651 + 1 + 0 + + + 408 + 328 + 446 + 0 + 0 + + + 730 + 444 + 3375 + 6 + 0 + + + 5 + 425 + 487 + 0 + 0 + + + 59 + 647 + 491 + 0 + 0 + + + 960 + 635 + 722 + 0 + 0 + + + 4 + 246 + 155 + 0 + 0 + + + 14 + 129 + 1604 + 0 + 0 + + + 284 + 643 + 713 + 2 + 0 + + + 20 + 161 + 623 + 0 + 0 + + + 70 + 295 + 340 + 0 + 0 + + + 100 + 70 + 544 + 4 + 0 + + + 70 + 188 + 368 + 0 + 0 + + + 34 + 697 + 545 + 1 + 0 + + + 1 + 314 + 659 + 0 + 1 + + + 215 + 137 + 278 + 1 + 0 + + + 112 + 425 + 3526 + 0 + 0 + + + 205 + 72 + 104 + 0 + 0 + + + 34 + 628 + 730 + 0 + 0 + + + 0 + 87 + 438 + 4 + 0 + + + 205 + 103 + 370 + 0 + 0 + + + 45 + 456 + 522 + 4 + 0 + + + 34 + 718 + 480 + 2 + 0 + + + 22 + 602 + 470 + 5 + 0 + + + 70 + 200 + 346 + 0 + 0 + + + 0 + 696 + 696 + 0 + 0 + + + 309 + 541 + 440 + 0 + 0 + + + 1 + 159 + 435 + 0 + 0 + + + 34 + 694 + 698 + 2 + 0 + + + 1 + 166 + 604 + 0 + 1 + + + 283 + 463 + 686 + 4 + 0 + + + 0 + 686 + 463 + 3 + 0 + + + 70 + 247 + 280 + 0 + 0 + + + 20 + 151 + 458 + 0 + 0 + + + 205 + 274 + 366 + 0 + 0 + + + 215 + 141 + 270 + 2 + 0 + + + 34 + 607 + 856 + 6 + 0 + + + 36 + 344 + 514 + 0 + 0 + + + 92 + 132 + 524 + 4 + 0 + + + 38 + 122 + 312 + 0 + 0 + + + 45 + 216 + 677 + 0 + 0 + + + 34 + 81 + 470 + 1 + 0 + + + 655 + 692 + 498 + 0 + 0 + + + 70 + 124 + 307 + 0 + 0 + + + 4 + 98 + 388 + 0 + 0 + + + 70 + 194 + 196 + 0 + 0 + + + 51 + 271 + 2963 + 6 + 0 + + + 36 + 338 + 523 + 0 + 0 + + + 70 + 259 + 387 + 0 + 0 + + + 70 + 99 + 384 + 0 + 0 + + + 0 + 641 + 661 + 0 + 0 + + + 34 + 68 + 559 + 7 + 0 + + + 284 + 624 + 679 + 2 + 0 + + + 0 + 88 + 432 + 4 + 0 + + + 37 + 634 + 723 + 2 + 0 + + + 100 + 600 + 633 + 0 + 0 + + + 91 + 134 + 516 + 4 + 0 + + + 283 + 620 + 838 + 0 + 0 + + + 205 + 258 + 268 + 0 + 0 + + + 938 + 659 + 735 + 2 + 0 + + + 205 + 61 + 122 + 0 + 0 + + + 36 + 339 + 702 + 0 + 0 + + + 34 + 149 + 464 + 2 + 0 + + + 0 + 640 + 662 + 0 + 0 + + + 0 + 313 + 467 + 0 + 0 + + + 1 + 327 + 447 + 1 + 1 + + + 284 + 645 + 711 + 0 + 0 + + + 205 + 246 + 283 + 0 + 0 + + + 278 + 454 + 700 + 3 + 0 + + + 70 + 302 + 331 + 0 + 0 + + + 70 + 211 + 330 + 0 + 0 + + + 0 + 110 + 633 + 0 + 0 + + + 70 + 200 + 348 + 0 + 0 + + + 20 + 151 + 461 + 0 + 0 + + + 218 + 150 + 255 + 0 + 0 + + + 34 + 149 + 467 + 2 + 0 + + + 307 + 345 + 513 + 0 + 0 + + + 16 + 590 + 718 + 0 + 0 + + + 104 + 70 + 546 + 4 + 0 + + + 313 + 486 + 489 + 0 + 0 + + + 313 + 489 + 486 + 0 + 0 + + + 34 + 634 + 819 + 0 + 0 + + + 283 + 81 + 472 + 2 + 0 + + + 192 + 742 + 465 + 0 + 0 + + + 45 + 539 + 704 + 4 + 0 + + + 44 + 611 + 1545 + 4 + 0 + + + 34 + 69 + 554 + 7 + 0 + + + 313 + 484 + 491 + 0 + 0 + + + 70 + 58 + 127 + 0 + 0 + + + 1 + 82 + 466 + 0 + 0 + + + 34 + 224 + 446 + 4 + 0 + + + 70 + 113 + 338 + 0 + 0 + + + 377 + 500 + 690 + 7 + 0 + + + 71 + 622 + 681 + 4 + 0 + + + 29 + 138 + 504 + 0 + 0 + + + 1 + 225 + 444 + 0 + 1 + + + 0 + 199 + 502 + 0 + 0 + + + 217 + 135 + 283 + 0 + 0 + + + 153 + 545 + 436 + 0 + 0 + + + 0 + 109 + 638 + 0 + 0 + + + 597 + 697 + 495 + 2 + 0 + + + 278 + 452 + 703 + 0 + 0 + + + 7 + 612 + 620 + 6 + 0 + + + 3 + 613 + 619 + 0 + 0 + + + 70 + 222 + 172 + 0 + 0 + + + 37 + 636 + 721 + 2 + 0 + + + 284 + 482 + 430 + 6 + 0 + + + 0 + 157 + 443 + 0 + 0 + + + 205 + 441 + 470 + 0 + 0 + + + 1 + 134 + 519 + 1 + 0 + + + 70 + 201 + 190 + 0 + 0 + + + 284 + 655 + 700 + 2 + 0 + + + 283 + 716 + 677 + 4 + 0 + + + 205 + 265 + 144 + 0 + 0 + + + 70 + 225 + 309 + 0 + 0 + + + 40 + 103 + 675 + 0 + 0 + + + 4 + 188 + 203 + 0 + 0 + + + 70 + 220 + 316 + 0 + 0 + + + 1 + 158 + 440 + 0 + 0 + + + 205 + 60 + 122 + 0 + 0 + + + 26 + 147 + 473 + 0 + 0 + + + 1 + 470 + 676 + 1 + 1 + + + 38 + 638 + 498 + 2 + 0 + + + 70 + 240 + 416 + 0 + 0 + + + 1 + 312 + 567 + 0 + 1 + + + 283 + 81 + 471 + 3 + 0 + + + 51 + 613 + 691 + 0 + 0 + + + 70 + 317 + 315 + 0 + 0 + + + 205 + 602 + 762 + 5 + 0 + + + 193 + 745 + 463 + 0 + 0 + + + 34 + 219 + 457 + 0 + 0 + + + 38 + 307 + 326 + 0 + 0 + + + 284 + 638 + 719 + 0 + 0 + + + 284 + 647 + 709 + 0 + 0 + + + 1 + 594 + 713 + 3 + 1 + + + 38 + 660 + 787 + 2 + 0 + + + 47 + 606 + 757 + 4 + 0 + + + 21 + 216 + 676 + 4 + 0 + + + 960 + 631 + 727 + 0 + 0 + + + 98 + 650 + 435 + 0 + 0 + + + 5 + 304 + 1509 + 0 + 0 + + + 20 + 218 + 459 + 6 + 0 + + + 205 + 269 + 372 + 0 + 0 + + + 70 + 203 + 189 + 0 + 0 + + + 0 + 577 + 840 + 6 + 0 + + + 329 + 559 + 617 + 0 + 0 + + + 205 + 140 + 274 + 0 + 0 + + + 0 + 68 + 564 + 7 + 0 + + + 3 + 211 + 692 + 0 + 0 + + + 37 + 632 + 503 + 2 + 0 + + + 4 + 115 + 604 + 0 + 0 + + + 45 + 333 + 714 + 4 + 0 + + + 45 + 215 + 679 + 4 + 0 + + + 36 + 737 + 468 + 1 + 0 + + + 390 + 660 + 695 + 5 + 0 + + + 1 + 155 + 448 + 0 + 0 + + + 70 + 215 + 323 + 0 + 0 + + + 395 + 489 + 650 + 6 + 0 + + + 597 + 672 + 473 + 6 + 0 + + + 0 + 637 + 499 + 2 + 0 + + + 45 + 106 + 655 + 0 + 0 + + + 34 + 723 + 477 + 7 + 0 + + + 70 + 241 + 415 + 0 + 0 + + + 37 + 720 + 479 + 7 + 0 + + + 205 + 639 + 594 + 2 + 0 + + + 43 + 474 + 437 + 4 + 0 + + + 205 + 157 + 244 + 0 + 0 + + + 143 + 667 + 569 + 2 + 0 + + + 1 + 364 + 569 + 3 + 1 + + + 70 + 232 + 431 + 0 + 0 + + + 70 + 61 + 118 + 0 + 0 + + + 38 + 185 + 207 + 0 + 0 + + + 1 + 69 + 555 + 0 + 0 + + + 70 + 257 + 149 + 0 + 0 + + + 192 + 740 + 466 + 0 + 0 + + + 38 + 145 + 264 + 0 + 0 + + + 20 + 161 + 621 + 2 + 0 + + + 205 + 177 + 392 + 0 + 0 + + + 34 + 654 + 486 + 0 + 0 + + + 1 + 298 + 695 + 2 + 0 + + + 960 + 637 + 720 + 0 + 0 + + + 12 + 103 + 668 + 0 + 0 + + + 328 + 558 + 617 + 0 + 0 + + + 143 + 670 + 566 + 2 + 0 + + + 70 + 161 + 239 + 0 + 0 + + + 74 + 165 + 604 + 6 + 0 + + + 284 + 630 + 672 + 0 + 0 + + + 205 + 600 + 763 + 5 + 0 + + + 1 + 111 + 620 + 4 + 0 + + + 70 + 60 + 136 + 0 + 0 + + + 34 + 223 + 447 + 4 + 0 + + + 15 + 603 + 571 + 4 + 0 + + + 34 + 54 + 713 + 2 + 0 + + + 45 + 524 + 607 + 2 + 0 + + + 41 + 315 + 659 + 6 + 0 + + + 34 + 721 + 526 + 3 + 0 + + + 220 + 151 + 255 + 4 + 0 + + + 4 + 262 + 147 + 0 + 0 + + + 399 + 665 + 782 + 2 + 0 + + + 34 + 701 + 541 + 3 + 0 + + + 219 + 147 + 262 + 4 + 0 + + + 70 + 90 + 428 + 0 + 0 + + + 36 + 693 + 700 + 0 + 0 + + + 997 + 604 + 803 + 2 + 0 + + + 3 + 634 + 765 + 0 + 0 + + + 70 + 198 + 194 + 0 + 0 + + + 20 + 211 + 472 + 0 + 0 + + + 20 + 114 + 603 + 6 + 0 + + + 4 + 177 + 217 + 0 + 0 + + + 33 + 476 + 668 + 0 + 0 + + + 70 + 55 + 147 + 0 + 0 + + + 0 + 200 + 498 + 0 + 0 + + + 16 + 85 + 452 + 2 + 0 + + + 597 + 721 + 441 + 0 + 0 + + + 0 + 120 + 573 + 0 + 0 + + + 597 + 714 + 531 + 4 + 0 + + + 205 + 122 + 315 + 0 + 0 + + + 70 + 90 + 427 + 0 + 0 + + + 205 + 68 + 119 + 0 + 0 + + + 1 + 615 + 517 + 0 + 0 + + + 70 + 75 + 108 + 0 + 0 + + + 45 + 105 + 655 + 0 + 0 + + + 34 + 679 + 507 + 0 + 0 + + + 70 + 289 + 238 + 0 + 0 + + + 70 + 303 + 227 + 0 + 0 + + + 179 + 343 + 605 + 6 + 0 + + + 70 + 211 + 326 + 0 + 0 + + + 34 + 109 + 631 + 6 + 0 + + + 377 + 659 + 736 + 2 + 0 + + + 38 + 216 + 178 + 0 + 0 + + + 36 + 484 + 657 + 0 + 0 + + + 36 + 636 + 830 + 1 + 0 + + + 1 + 274 + 643 + 0 + 0 + + + 46 + 476 + 436 + 2 + 0 + + + 112 + 338 + 614 + 4 + 0 + + + 45 + 523 + 608 + 0 + 0 + + + 0 + 608 + 523 + 0 + 0 + + + 70 + 335 + 205 + 0 + 0 + + + 34 + 524 + 541 + 0 + 0 + + + 283 + 82 + 471 + 0 + 0 + + + 45 + 457 + 522 + 4 + 0 + + + 38 + 141 + 274 + 0 + 0 + + + 51 + 271 + 2965 + 6 + 0 + + + 205 + 243 + 159 + 0 + 0 + + + 5 + 460 + 451 + 0 + 0 + + + 420 + 724 + 524 + 2 + 0 + + + 3 + 592 + 715 + 0 + 0 + + + 7 + 323 + 546 + 2 + 0 + + + 38 + 174 + 222 + 0 + 0 + + + 1 + 74 + 522 + 1 + 0 + + + 38 + 686 + 553 + 6 + 0 + + + 70 + 51 + 158 + 0 + 0 + + + 208 + 626 + 606 + 4 + 0 + + + 205 + 65 + 124 + 0 + 0 + + + 284 + 628 + 674 + 0 + 0 + + + 70 + 58 + 139 + 0 + 0 + + + 0 + 205 + 487 + 0 + 0 + + + 1 + 607 + 625 + 0 + 0 + + + 4 + 240 + 161 + 0 + 0 + + + 38 + 92 + 420 + 0 + 0 + + + 58 + 567 + 607 + 2 + 0 + + + 38 + 113 + 342 + 0 + 0 + + + 37 + 500 + 567 + 0 + 0 + + + 284 + 454 + 457 + 6 + 0 + + + 70 + 53 + 150 + 0 + 0 + + + 34 + 89 + 433 + 4 + 0 + + + 22 + 603 + 470 + 5 + 0 + + + 597 + 680 + 506 + 2 + 0 + + + 284 + 644 + 711 + 0 + 0 + + + 11 + 432 + 480 + 0 + 0 + + + 7 + 616 + 687 + 4 + 0 + + + 34 + 76 + 507 + 1 + 0 + + + 70 + 224 + 172 + 0 + 0 + + + 23 + 735 + 516 + 6 + 0 + + + 279 + 633 + 766 + 0 + 0 + + + 284 + 626 + 676 + 0 + 0 + + + 4 + 274 + 364 + 0 + 0 + + + 193 + 600 + 472 + 3 + 1 + + + 597 + 672 + 512 + 6 + 0 + + + 37 + 310 + 669 + 0 + 0 + + + 70 + 78 + 102 + 0 + 0 + + + 503 + 608 + 696 + 0 + 0 + + + 153 + 547 + 436 + 0 + 0 + + + 38 + 228 + 301 + 0 + 0 + + + 1 + 87 + 443 + 4 + 0 + + + 70 + 146 + 264 + 0 + 0 + + + 98 + 653 + 434 + 0 + 0 + + + 21 + 456 + 523 + 0 + 0 + + + 34 + 175 + 570 + 6 + 0 + + + 70 + 95 + 406 + 0 + 0 + + + 70 + 55 + 145 + 0 + 0 + + + 306 + 726 + 474 + 2 + 0 + + + 4 + 48 + 166 + 0 + 0 + + + 1 + 305 + 680 + 2 + 0 + + + 37 + 644 + 494 + 0 + 0 + + + 70 + 259 + 149 + 0 + 0 + + + 3 + 519 + 663 + 2 + 0 + + + 1 + 155 + 443 + 0 + 0 + + + 36 + 740 + 465 + 1 + 0 + + + 1 + 207 + 482 + 0 + 0 + + + 283 + 682 + 711 + 0 + 0 + + + 209 + 232 + 430 + 0 + 0 + + + 34 + 650 + 746 + 0 + 0 + + + 70 + 223 + 173 + 0 + 0 + + + 0 + 196 + 509 + 0 + 0 + + + 205 + 66 + 121 + 0 + 0 + + + 34 + 707 + 536 + 4 + 0 + + + 205 + 144 + 269 + 0 + 0 + + + 377 + 663 + 732 + 0 + 0 + + + 407 + 741 + 571 + 5 + 0 + + + 5 + 328 + 538 + 7 + 0 + + + 0 + 489 + 425 + 0 + 0 + + + 70 + 228 + 303 + 0 + 0 + + + 193 + 414 + 502 + 0 + 0 + + + 194 + 605 + 468 + 1 + 1 + + + 16 + 322 + 548 + 2 + 0 + + + 111 + 612 + 463 + 0 + 0 + + + 597 + 746 + 508 + 2 + 0 + + + 0 + 88 + 440 + 4 + 0 + + + 394 + 515 + 669 + 1 + 0 + + + 70 + 289 + 239 + 0 + 0 + + + 112 + 339 + 613 + 4 + 0 + + + 306 + 711 + 533 + 2 + 0 + + + 306 + 733 + 517 + 4 + 0 + + + 205 + 181 + 214 + 0 + 0 + + + 7 + 518 + 547 + 2 + 0 + + + 0 + 445 + 467 + 0 + 0 + + + 425 + 695 + 458 + 4 + 0 + + + 70 + 235 + 165 + 0 + 0 + + + 218 + 148 + 262 + 0 + 0 + + + 1 + 74 + 524 + 1 + 0 + + + 4 + 138 + 281 + 0 + 0 + + + 3 + 343 + 606 + 0 + 0 + + + 12 + 103 + 671 + 0 + 0 + + + 1 + 594 + 638 + 4 + 0 + + + 38 + 318 + 458 + 4 + 0 + + + 70 + 52 + 152 + 0 + 0 + + + 0 + 611 + 521 + 0 + 0 + + + 70 + 272 + 254 + 0 + 0 + + + 70 + 282 + 245 + 0 + 0 + + + 274 + 76 + 104 + 4 + 0 + + + 1 + 85 + 456 + 0 + 0 + + + 38 + 204 + 190 + 0 + 0 + + + 218 + 152 + 255 + 0 + 0 + + + 53 + 166 + 599 + 1 + 0 + + + 12 + 103 + 670 + 0 + 0 + + + 4 + 304 + 227 + 0 + 0 + + + 70 + 122 + 317 + 0 + 0 + + + 7 + 614 + 689 + 0 + 0 + + + 45 + 215 + 677 + 0 + 0 + + + 81 + 472 + 674 + 1 + 1 + + + 70 + 203 + 340 + 0 + 0 + + + 284 + 637 + 719 + 0 + 0 + + + 218 + 151 + 256 + 2 + 0 + + + 59 + 112 + 616 + 4 + 0 + + + 34 + 150 + 460 + 2 + 0 + + + 70 + 187 + 369 + 0 + 0 + + + 284 + 482 + 431 + 6 + 0 + + + 284 + 646 + 709 + 0 + 0 + + + 284 + 624 + 678 + 2 + 0 + + + 34 + 82 + 472 + 5 + 0 + + + 0 + 642 + 659 + 0 + 0 + + + 36 + 211 + 471 + 0 + 0 + + + 1 + 631 + 837 + 1 + 0 + + + 70 + 275 + 251 + 1 + 0 + + + 34 + 634 + 502 + 2 + 0 + + + 70 + 184 + 540 + 0 + 0 + + + 4 + 172 + 225 + 0 + 0 + + + 70 + 291 + 133 + 0 + 0 + + + 278 + 454 + 701 + 2 + 0 + + + 597 + 722 + 441 + 0 + 0 + + + 205 + 221 + 312 + 0 + 0 + + + 70 + 197 + 350 + 0 + 0 + + + 395 + 620 + 739 + 0 + 0 + + + 70 + 169 + 230 + 0 + 0 + + + 145 + 471 + 441 + 0 + 0 + + + 70 + 76 + 102 + 0 + 0 + + + 20 + 283 + 2962 + 0 + 0 + + + 299 + 522 + 610 + 0 + 0 + + + 38 + 175 + 222 + 0 + 0 + + + 70 + 207 + 333 + 0 + 0 + + + 45 + 105 + 657 + 4 + 0 + + + 21 + 214 + 680 + 0 + 0 + + + 597 + 752 + 458 + 2 + 0 + + + 164 + 602 + 806 + 5 + 0 + + + 70 + 176 + 221 + 0 + 0 + + + 284 + 666 + 688 + 0 + 0 + + + 0 + 688 + 666 + 0 + 0 + + + 0 + 592 + 774 + 3 + 0 + + + 70 + 277 + 249 + 0 + 0 + + + 16 + 590 + 717 + 0 + 0 + + + 70 + 216 + 180 + 0 + 0 + + + 70 + 237 + 291 + 0 + 0 + + + 70 + 54 + 144 + 0 + 0 + + + 70 + 72 + 108 + 0 + 0 + + + 1 + 127 + 543 + 0 + 0 + + + 37 + 752 + 504 + 3 + 0 + + + 597 + 697 + 494 + 2 + 0 + + + 47 + 602 + 761 + 2 + 0 + + + 218 + 151 + 257 + 2 + 0 + + + 70 + 280 + 246 + 0 + 0 + + + 284 + 648 + 707 + 0 + 0 + + + 1 + 707 + 648 + 0 + 0 + + + 0 + 728 + 473 + 1 + 0 + + + 0 + 633 + 544 + 0 + 0 + + + 203 + 214 + 465 + 4 + 0 + + + 70 + 179 + 217 + 0 + 0 + + + 38 + 216 + 319 + 0 + 0 + + + 0 + 108 + 638 + 0 + 0 + + + 13 + 103 + 669 + 0 + 0 + + + 70 + 161 + 428 + 0 + 0 + + + 0 + 107 + 644 + 0 + 0 + + + 284 + 664 + 690 + 0 + 0 + + + 34 + 683 + 555 + 1 + 0 + + + 284 + 639 + 717 + 0 + 0 + + + 0 + 628 + 507 + 2 + 0 + + + 396 + 521 + 661 + 1 + 0 + + + 51 + 622 + 712 + 6 + 0 + + + 70 + 88 + 100 + 0 + 0 + + + 34 + 406 + 499 + 6 + 0 + + + 278 + 614 + 586 + 0 + 0 + + + 70 + 250 + 176 + 0 + 0 + + + 70 + 74 + 119 + 0 + 0 + + + 34 + 468 + 687 + 4 + 0 + + + 70 + 201 + 389 + 0 + 0 + + + 34 + 715 + 546 + 1 + 0 + + + 21 + 272 + 486 + 0 + 0 + + + 70 + 232 + 337 + 0 + 0 + + + 205 + 314 + 421 + 0 + 0 + + + 407 + 614 + 473 + 0 + 0 + + + 1 + 517 + 459 + 0 + 1 + + + 16 + 525 + 452 + 4 + 0 + + + 0 + 748 + 481 + 3 + 0 + + + 284 + 659 + 672 + 0 + 0 + + + 0 + 609 + 641 + 3 + 0 + + + 70 + 91 + 97 + 0 + 0 + + + 38 + 750 + 549 + 3 + 0 + + + 0 + 294 + 689 + 4 + 0 + + + 36 + 164 + 688 + 4 + 0 + + + 597 + 729 + 441 + 0 + 0 + + + 445 + 639 + 563 + 6 + 0 + + + 15 + 337 + 704 + 4 + 0 + + + 4 + 317 + 417 + 0 + 0 + + + 191 + 185 + 610 + 0 + 0 + + + 70 + 166 + 265 + 0 + 0 + + + 4 + 81 + 543 + 7 + 0 + + + 284 + 657 + 674 + 0 + 0 + + + 0 + 654 + 444 + 5 + 0 + + + 404 + 665 + 771 + 0 + 0 + + + 283 + 680 + 709 + 0 + 0 + + + 70 + 209 + 540 + 0 + 0 + + + 70 + 105 + 419 + 0 + 0 + + + 34 + 665 + 725 + 0 + 0 + + + 4 + 127 + 346 + 0 + 0 + + + 20 + 630 + 571 + 0 + 0 + + + 70 + 301 + 146 + 0 + 0 + + + 4 + 55 + 159 + 0 + 0 + + + 70 + 53 + 165 + 0 + 0 + + + 278 + 631 + 764 + 0 + 0 + + + 70 + 149 + 295 + 0 + 0 + + + 34 + 434 + 669 + 0 + 0 + + + 16 + 617 + 583 + 4 + 0 + + + 4 + 116 + 379 + 0 + 0 + + + 70 + 263 + 429 + 0 + 0 + + + 205 + 73 + 120 + 0 + 0 + + + 88 + 210 + 537 + 0 + 0 + + + 70 + 466 + 509 + 2 + 0 + + + 4 + 325 + 347 + 0 + 0 + + + 1 + 98 + 448 + 0 + 0 + + + 70 + 327 + 404 + 0 + 0 + + + 0 + 752 + 519 + 3 + 0 + + + 283 + 525 + 553 + 0 + 0 + + + 284 + 655 + 676 + 0 + 0 + + + 153 + 544 + 436 + 0 + 0 + + + 34 + 219 + 515 + 1 + 0 + + + 4 + 80 + 549 + 0 + 0 + + + 597 + 672 + 432 + 6 + 0 + + + 407 + 619 + 469 + 0 + 0 + + + 70 + 152 + 289 + 0 + 0 + + + 306 + 609 + 727 + 2 + 0 + + + 205 + 159 + 276 + 0 + 0 + + + 34 + 719 + 447 + 3 + 0 + + + 38 + 701 + 688 + 2 + 0 + + + 284 + 628 + 705 + 2 + 0 + + + 205 + 72 + 124 + 0 + 0 + + + 34 + 707 + 552 + 1 + 0 + + + 284 + 653 + 678 + 0 + 0 + + + 70 + 52 + 172 + 0 + 0 + + + 70 + 233 + 568 + 6 + 0 + + + 45 + 457 + 519 + 0 + 0 + + + 70 + 195 + 578 + 6 + 0 + + + 34 + 79 + 555 + 7 + 0 + + + 0 + 263 + 503 + 0 + 0 + + + 20 + 155 + 505 + 4 + 0 + + + 306 + 724 + 539 + 0 + 0 + + + 3 + 117 + 669 + 0 + 0 + + + 34 + 209 + 633 + 0 + 0 + + + 34 + 80 + 548 + 7 + 0 + + + 1 + 174 + 450 + 0 + 0 + + + 0 + 355 + 571 + 0 + 0 + + + 70 + 51 + 175 + 0 + 0 + + + 0 + 168 + 671 + 0 + 0 + + + 1 + 169 + 667 + 0 + 0 + + + 1 + 573 + 681 + 1 + 1 + + + 285 + 581 + 830 + 6 + 0 + + + 284 + 651 + 680 + 0 + 0 + + + 51 + 596 + 691 + 0 + 0 + + + 70 + 197 + 572 + 0 + 0 + + + 419 + 714 + 504 + 6 + 0 + + + 45 + 125 + 626 + 4 + 0 + + + 70 + 115 + 381 + 0 + 0 + + + 1 + 198 + 668 + 0 + 0 + + + 37 + 120 + 652 + 0 + 0 + + + 0 + 517 + 392 + 0 + 0 + + + 0 + 545 + 533 + 6 + 0 + + + 4 + 217 + 202 + 0 + 0 + + + 1 + 511 + 464 + 0 + 0 + + + 5 + 636 + 696 + 0 + 0 + + + 70 + 182 + 430 + 0 + 0 + + + 70 + 164 + 267 + 0 + 0 + + + 34 + 688 + 523 + 2 + 0 + + + 445 + 693 + 563 + 6 + 0 + + + 38 + 724 + 497 + 2 + 0 + + + 0 + 696 + 517 + 1 + 0 + + + 21 + 552 + 746 + 4 + 0 + + + 6 + 285 + 711 + 0 + 0 + + + 218 + 171 + 256 + 2 + 0 + + + 0 + 433 + 468 + 0 + 0 + + + 143 + 120 + 365 + 6 + 0 + + + 102 + 75 + 584 + 0 + 0 + + + 1 + 175 + 447 + 0 + 0 + + + 70 + 237 + 558 + 6 + 0 + + + 70 + 232 + 571 + 6 + 0 + + + 70 + 277 + 158 + 0 + 0 + + + 70 + 259 + 169 + 0 + 0 + + + 416 + 622 + 578 + 4 + 0 + + + 1 + 79 + 554 + 7 + 0 + + + 283 + 582 + 828 + 6 + 0 + + + 0 + 292 + 693 + 2 + 0 + + + 1 + 117 + 666 + 3 + 1 + + + 0 + 206 + 643 + 0 + 0 + + + 4 + 60 + 151 + 0 + 0 + + + 0 + 285 + 710 + 0 + 0 + + + 284 + 649 + 682 + 2 + 0 + + + 208 + 167 + 262 + 0 + 0 + + + 1 + 302 + 670 + 0 + 0 + + + 3 + 598 + 689 + 4 + 0 + + + 51 + 558 + 700 + 4 + 0 + + + 206 + 656 + 628 + 6 + 0 + + + 0 + 628 + 656 + 0 + 0 + + + 70 + 111 + 394 + 0 + 0 + + + 38 + 76 + 119 + 0 + 0 + + + 309 + 509 + 571 + 0 + 0 + + + 21 + 625 + 465 + 0 + 0 + + + 70 + 154 + 284 + 0 + 0 + + + 0 + 694 + 518 + 1 + 0 + + + 597 + 672 + 478 + 6 + 0 + + + 597 + 677 + 531 + 4 + 0 + + + 38 + 180 + 243 + 0 + 0 + + + 395 + 661 + 729 + 0 + 0 + + + 12 + 670 + 583 + 6 + 0 + + + 63 + 522 + 455 + 6 + 0 + + + 143 + 463 + 513 + 0 + 0 + + + 562 + 667 + 539 + 0 + 0 + + + 34 + 174 + 650 + 1 + 0 + + + 34 + 737 + 530 + 3 + 0 + + + 1 + 621 + 629 + 0 + 0 + + + 284 + 626 + 707 + 2 + 0 + + + 45 + 206 + 549 + 4 + 0 + + + 313 + 686 + 524 + 0 + 0 + + + 51 + 554 + 705 + 4 + 0 + + + 0 + 634 + 698 + 0 + 0 + + + 0 + 200 + 662 + 3 + 0 + + + 1 + 165 + 472 + 0 + 0 + + + 70 + 186 + 235 + 0 + 0 + + + 21 + 550 + 749 + 0 + 0 + + + 70 + 167 + 677 + 0 + 0 + + + 286 + 524 + 613 + 0 + 0 + + + 284 + 647 + 684 + 0 + 0 + + + 38 + 130 + 336 + 0 + 0 + + + 4 + 252 + 309 + 0 + 0 + + + 118 + 306 + 546 + 2 + 0 + + + 34 + 716 + 502 + 2 + 0 + + + 4 + 279 + 279 + 0 + 0 + + + 45 + 587 + 495 + 0 + 0 + + + 1 + 175 + 646 + 0 + 0 + + + 70 + 62 + 145 + 0 + 0 + + + 70 + 310 + 427 + 0 + 0 + + + 34 + 634 + 809 + 0 + 0 + + + 217 + 685 + 646 + 3 + 0 + + + 29 + 266 + 628 + 0 + 0 + + + 55 + 261 + 640 + 2 + 0 + + + 0 + 291 + 695 + 2 + 0 + + + 4 + 184 + 423 + 0 + 0 + + + 1 + 99 + 441 + 0 + 0 + + + 7 + 604 + 682 + 4 + 0 + + + 70 + 149 + 293 + 0 + 0 + + + 205 + 78 + 115 + 0 + 0 + + + 395 + 491 + 654 + 6 + 0 + + + 70 + 273 + 286 + 0 + 0 + + + 70 + 303 + 373 + 0 + 0 + + + 70 + 215 + 203 + 0 + 0 + + + 283 + 454 + 446 + 2 + 0 + + + 1 + 286 + 708 + 0 + 0 + + + 284 + 645 + 686 + 0 + 0 + + + 938 + 686 + 645 + 0 + 0 + + + 34 + 652 + 446 + 0 + 0 + + + 445 + 636 + 614 + 2 + 0 + + + 34 + 284 + 713 + 0 + 0 + + + 407 + 699 + 633 + 0 + 0 + + + 34 + 204 + 650 + 1 + 0 + + + 278 + 515 + 461 + 0 + 0 + + + 25 + 82 + 532 + 6 + 0 + + + 43 + 461 + 515 + 4 + 0 + + + 34 + 217 + 611 + 0 + 0 + + + 70 + 74 + 124 + 0 + 0 + + + 205 + 309 + 429 + 0 + 0 + + + 23 + 457 + 443 + 2 + 0 + + + 285 + 580 + 831 + 6 + 0 + + + 70 + 299 + 261 + 0 + 0 + + + 37 + 263 + 635 + 0 + 0 + + + 218 + 171 + 255 + 2 + 0 + + + 104 + 687 + 644 + 7 + 0 + + + 5 + 654 + 491 + 0 + 0 + + + 1 + 599 + 688 + 0 + 1 + + + 283 + 482 + 420 + 6 + 0 + + + 70 + 201 + 562 + 0 + 0 + + + 562 + 661 + 544 + 0 + 0 + + + 1 + 611 + 639 + 3 + 0 + + + 70 + 154 + 283 + 0 + 0 + + + 1 + 77 + 566 + 0 + 0 + + + 0 + 199 + 666 + 0 + 0 + + + 70 + 208 + 375 + 0 + 0 + + + 45 + 125 + 624 + 0 + 0 + + + 284 + 632 + 700 + 2 + 0 + + + 51 + 570 + 685 + 0 + 0 + + + 70 + 106 + 411 + 0 + 0 + + + 0 + 506 + 400 + 0 + 0 + + + 5 + 118 + 661 + 0 + 0 + + + 1 + 632 + 569 + 0 + 1 + + + 284 + 624 + 709 + 2 + 0 + + + 1 + 167 + 467 + 0 + 0 + + + 20 + 119 + 366 + 0 + 0 + + + 70 + 183 + 238 + 0 + 0 + + + 0 + 519 + 390 + 0 + 0 + + + 205 + 86 + 106 + 0 + 0 + + + 0 + 631 + 653 + 0 + 0 + + + 70 + 191 + 228 + 0 + 0 + + + 70 + 317 + 246 + 0 + 0 + + + 16 + 630 + 765 + 0 + 0 + + + 204 + 691 + 565 + 2 + 0 + + + 1 + 295 + 686 + 4 + 0 + + + 1 + 553 + 706 + 0 + 1 + + + 597 + 746 + 482 + 2 + 0 + + + 25 + 461 + 439 + 2 + 0 + + + 4 + 94 + 463 + 0 + 0 + + + 70 + 196 + 576 + 6 + 0 + + + 34 + 413 + 490 + 6 + 0 + + + 597 + 728 + 441 + 0 + 0 + + + 0 + 176 + 644 + 3 + 0 + + + 70 + 70 + 118 + 0 + 0 + + + 153 + 543 + 436 + 0 + 0 + + + 0 + 207 + 641 + 0 + 0 + + + 4 + 194 + 224 + 0 + 0 + + + 34 + 762 + 541 + 3 + 0 + + + 38 + 263 + 431 + 0 + 0 + + + 70 + 161 + 270 + 0 + 0 + + + 36 + 165 + 687 + 4 + 0 + + + 70 + 280 + 281 + 0 + 0 + + + 1 + 349 + 579 + 0 + 0 + + + 0 + 756 + 517 + 3 + 0 + + + 973 + 650 + 788 + 0 + 0 + + + 70 + 313 + 424 + 0 + 0 + + + 307 + 685 + 526 + 4 + 0 + + + 16 + 525 + 451 + 4 + 0 + + + 1 + 607 + 644 + 3 + 0 + + + 70 + 288 + 151 + 0 + 0 + + + 575 + 723 + 444 + 0 + 0 + + + 70 + 507 + 467 + 0 + 0 + + + 20 + 289 + 581 + 0 + 0 + + + 205 + 67 + 124 + 0 + 0 + + + 284 + 652 + 680 + 0 + 0 + + + 70 + 230 + 493 + 6 + 0 + + + 205 + 313 + 139 + 0 + 0 + + + 70 + 139 + 313 + 0 + 0 + + + 55 + 60 + 725 + 5 + 0 + + + 284 + 628 + 706 + 2 + 0 + + + 407 + 722 + 571 + 6 + 0 + + + 4 + 51 + 163 + 0 + 0 + + + 110 + 225 + 504 + 4 + 0 + + + 34 + 703 + 685 + 2 + 0 + + + 70 + 203 + 558 + 6 + 0 + + + 70 + 199 + 395 + 0 + 0 + + + 70 + 155 + 280 + 0 + 0 + + + 1 + 120 + 655 + 1 + 1 + + + 205 + 117 + 371 + 0 + 0 + + + 284 + 649 + 683 + 2 + 0 + + + 3 + 272 + 289 + 0 + 0 + + + 0 + 98 + 443 + 0 + 0 + + + 0 + 604 + 647 + 3 + 0 + + + 597 + 736 + 436 + 2 + 0 + + + 38 + 260 + 167 + 0 + 0 + + + 45 + 206 + 550 + 6 + 0 + + + 1 + 181 + 626 + 0 + 0 + + + 1 + 179 + 633 + 0 + 0 + + + 1 + 595 + 745 + 0 + 0 + + + 278 + 79 + 104 + 4 + 0 + + + 8 + 228 + 497 + 0 + 0 + + + 4 + 93 + 467 + 0 + 0 + + + 51 + 424 + 3375 + 0 + 0 + + + 38 + 687 + 701 + 2 + 0 + + + 110 + 112 + 702 + 0 + 0 + + + 1 + 173 + 655 + 0 + 0 + + + 45 + 126 + 624 + 0 + 0 + + + 192 + 125 + 629 + 0 + 0 + + + 394 + 493 + 651 + 1 + 0 + + + 71 + 646 + 605 + 2 + 0 + + + 3 + 632 + 570 + 0 + 0 + + + 219 + 171 + 254 + 2 + 0 + + + 70 + 203 + 214 + 0 + 0 + + + 1 + 77 + 107 + 0 + 1 + + + 205 + 80 + 103 + 0 + 0 + + + 284 + 453 + 446 + 4 + 0 + + + 0 + 616 + 521 + 0 + 0 + + + 143 + 120 + 362 + 6 + 0 + + + 36 + 521 + 616 + 6 + 0 + + + 0 + 201 + 660 + 2 + 0 + + + 447 + 620 + 581 + 4 + 0 + + + 36 + 487 + 659 + 0 + 0 + + + 1 + 174 + 452 + 0 + 0 + + + 285 + 454 + 445 + 6 + 0 + + + 70 + 209 + 377 + 0 + 0 + + + 36 + 734 + 491 + 6 + 0 + + + 205 + 73 + 115 + 0 + 0 + + + 70 + 199 + 569 + 0 + 0 + + + 70 + 135 + 321 + 0 + 0 + + + 191 + 185 + 612 + 0 + 0 + + + 284 + 626 + 708 + 2 + 0 + + + 70 + 291 + 149 + 0 + 0 + + + 25 + 610 + 676 + 4 + 0 + + + 0 + 713 + 548 + 1 + 0 + + + 1 + 579 + 832 + 0 + 0 + + + 284 + 670 + 719 + 0 + 0 + + + 208 + 172 + 252 + 2 + 0 + + + 145 + 467 + 433 + 4 + 0 + + + 1 + 284 + 712 + 0 + 0 + + + 102 + 74 + 586 + 0 + 0 + + + 7 + 585 + 668 + 0 + 0 + + + 1 + 309 + 543 + 0 + 1 + + + 281 + 614 + 587 + 0 + 0 + + + 37 + 750 + 521 + 3 + 0 + + + 70 + 218 + 199 + 0 + 0 + + + 938 + 684 + 648 + 0 + 0 + + + 34 + 79 + 549 + 7 + 0 + + + 45 + 456 + 519 + 0 + 0 + + + 286 + 519 + 456 + 0 + 0 + + + 0 + 717 + 545 + 1 + 0 + + + 55 + 262 + 640 + 4 + 0 + + + 1 + 319 + 1510 + 0 + 1 + + + 37 + 475 + 498 + 0 + 0 + + + 104 + 686 + 646 + 4 + 0 + + + 3 + 652 + 492 + 6 + 0 + + + 284 + 646 + 686 + 0 + 0 + + + 1 + 160 + 492 + 4 + 0 + + + 4 + 308 + 431 + 0 + 0 + + + 0 + 525 + 385 + 0 + 0 + + + 597 + 746 + 483 + 2 + 0 + + + 34 + 77 + 562 + 7 + 0 + + + 273 + 617 + 584 + 6 + 0 + + + 36 + 337 + 702 + 0 + 0 + + + 70 + 82 + 102 + 0 + 0 + + + 70 + 288 + 393 + 0 + 0 + + + 70 + 216 + 524 + 0 + 0 + + + 34 + 251 + 529 + 0 + 0 + + + 37 + 469 + 684 + 4 + 0 + + + 1 + 172 + 458 + 0 + 0 + + + 51 + 630 + 572 + 4 + 0 + + + 70 + 217 + 363 + 0 + 0 + + + 20 + 119 + 364 + 0 + 0 + + + 70 + 67 + 125 + 0 + 0 + + + 70 + 303 + 375 + 0 + 0 + + + 70 + 199 + 571 + 0 + 0 + + + 110 + 225 + 505 + 4 + 0 + + + 70 + 247 + 175 + 0 + 0 + + + 70 + 284 + 400 + 0 + 0 + + + 72 + 139 + 564 + 7 + 0 + + + 191 + 160 + 490 + 0 + 0 + + + 70 + 232 + 573 + 6 + 0 + + + 4 + 300 + 144 + 0 + 0 + + + 205 + 65 + 131 + 0 + 0 + + + 1 + 177 + 443 + 0 + 0 + + + 597 + 678 + 531 + 4 + 0 + + + 37 + 633 + 700 + 0 + 0 + + + 70 + 259 + 167 + 0 + 0 + + + 70 + 178 + 243 + 0 + 0 + + + 45 + 332 + 714 + 4 + 0 + + + 70 + 212 + 204 + 0 + 0 + + + 1 + 571 + 685 + 0 + 1 + + + 319 + 243 + 178 + 2 + 0 + + + 0 + 607 + 478 + 0 + 0 + + + 34 + 710 + 678 + 7 + 0 + + + 70 + 218 + 610 + 0 + 0 + + + 1 + 172 + 456 + 0 + 0 + + + 1 + 597 + 691 + 0 + 1 + + + 36 + 729 + 440 + 2 + 0 + + + 70 + 155 + 279 + 0 + 0 + + + 283 + 580 + 830 + 6 + 0 + + + 3 + 604 + 683 + 4 + 0 + + + 261 + 585 + 496 + 4 + 0 + + + 377 + 601 + 801 + 2 + 0 + + + 407 + 626 + 575 + 0 + 0 + + + 38 + 203 + 386 + 0 + 0 + + + 36 + 111 + 706 + 0 + 0 + + + 37 + 120 + 653 + 0 + 0 + + + 526 + 711 + 451 + 6 + 0 + + + 205 + 128 + 337 + 0 + 0 + + + 0 + 643 + 689 + 0 + 0 + + + 8 + 228 + 498 + 7 + 0 + + + 1 + 215 + 618 + 0 + 1 + + + 34 + 206 + 645 + 1 + 0 + + + 284 + 632 + 701 + 2 + 0 + + + 45 + 586 + 495 + 0 + 0 + + + 191 + 185 + 614 + 0 + 0 + + + 70 + 151 + 286 + 0 + 0 + + + 306 + 731 + 535 + 0 + 0 + + + 4 + 184 + 426 + 0 + 0 + + + 284 + 624 + 710 + 2 + 0 + + + 3 + 630 + 764 + 0 + 0 + + + 70 + 282 + 278 + 0 + 0 + + + 70 + 239 + 328 + 0 + 0 + + + 0 + 639 + 454 + 5 + 0 + + + 0 + 613 + 638 + 0 + 0 + + + 0 + 520 + 388 + 0 + 0 + + + 70 + 257 + 168 + 0 + 0 + + + 20 + 603 + 597 + 0 + 0 + + + 218 + 170 + 254 + 0 + 0 + + + 70 + 217 + 199 + 0 + 0 + + + 46 + 460 + 439 + 2 + 0 + + + 3 + 81 + 532 + 4 + 0 + + + 4 + 221 + 195 + 0 + 0 + + + 70 + 195 + 221 + 0 + 0 + + + 205 + 71 + 122 + 0 + 0 + + + 70 + 133 + 324 + 0 + 0 + + + 70 + 189 + 228 + 0 + 0 + + + 307 + 497 + 584 + 0 + 0 + + + 70 + 210 + 374 + 0 + 0 + + + 1 + 170 + 462 + 0 + 0 + + + 20 + 119 + 362 + 0 + 0 + + + 597 + 727 + 441 + 0 + 0 + + + 34 + 89 + 484 + 1 + 0 + + + 994 + 271 + 491 + 7 + 0 + + + 55 + 59 + 730 + 5 + 0 + + + 0 + 737 + 435 + 7 + 0 + + + 1 + 344 + 587 + 0 + 0 + + + 70 + 195 + 403 + 0 + 0 + + + 105 + 79 + 546 + 0 + 0 + + + 0 + 705 + 683 + 0 + 0 + + + 70 + 53 + 164 + 0 + 0 + + + 4 + 330 + 344 + 0 + 0 + + + 54 + 709 + 508 + 2 + 0 + + + 45 + 206 + 551 + 6 + 0 + + + 70 + 317 + 136 + 0 + 0 + + + 284 + 482 + 419 + 6 + 0 + + + 309 + 554 + 524 + 4 + 0 + + + 0 + 537 + 441 + 0 + 0 + + + 284 + 630 + 703 + 2 + 0 + + + 1 + 204 + 652 + 0 + 0 + + + 1 + 167 + 470 + 0 + 0 + + + 55 + 662 + 669 + 5 + 0 + + + 205 + 85 + 101 + 0 + 0 + + + 193 + 625 + 464 + 1 + 1 + + + 962 + 634 + 808 + 1 + 0 + + + 70 + 187 + 230 + 0 + 0 + + + 0 + 728 + 537 + 3 + 0 + + + 38 + 135 + 319 + 0 + 0 + + + 70 + 111 + 388 + 0 + 0 + + + 100 + 74 + 582 + 0 + 0 + + + 38 + 631 + 508 + 2 + 0 + + + 597 + 672 + 477 + 6 + 0 + + + 193 + 608 + 477 + 3 + 1 + + + 34 + 742 + 432 + 7 + 0 + + + 70 + 184 + 234 + 0 + 0 + + + 205 + 88 + 98 + 0 + 0 + + + 38 + 123 + 350 + 0 + 0 + + + 70 + 105 + 410 + 0 + 0 + + + 5 + 82 + 525 + 0 + 0 + + + 395 + 648 + 743 + 4 + 0 + + + 70 + 188 + 229 + 0 + 0 + + + 4 + 94 + 458 + 0 + 0 + + + 34 + 707 + 681 + 2 + 0 + + + 4 + 326 + 348 + 0 + 0 + + + 1 + 174 + 652 + 0 + 0 + + + 0 + 522 + 556 + 0 + 0 + + + 524 + 703 + 456 + 2 + 0 + + + 27 + 516 + 459 + 0 + 0 + + + 70 + 306 + 372 + 0 + 0 + + + 70 + 228 + 575 + 6 + 0 + + + 70 + 329 + 346 + 0 + 0 + + + 7 + 593 + 696 + 4 + 0 + + + 284 + 626 + 709 + 2 + 0 + + + 70 + 154 + 292 + 0 + 0 + + + 38 + 713 + 546 + 6 + 0 + + + 377 + 635 + 809 + 4 + 0 + + + 70 + 80 + 122 + 0 + 0 + + + 34 + 716 + 501 + 0 + 0 + + + 70 + 198 + 575 + 0 + 0 + + + 71 + 599 + 689 + 4 + 0 + + + 21 + 456 + 518 + 2 + 0 + + + 34 + 98 + 459 + 0 + 0 + + + 281 + 634 + 762 + 0 + 0 + + + 206 + 689 + 565 + 7 + 0 + + + 179 + 609 + 589 + 0 + 0 + + + 24 + 208 + 547 + 2 + 1 + + + 100 + 656 + 441 + 2 + 0 + + + 306 + 695 + 461 + 7 + 0 + + + 70 + 239 + 188 + 0 + 0 + + + 70 + 188 + 239 + 0 + 0 + + + 70 + 70 + 139 + 0 + 0 + + + 70 + 108 + 416 + 0 + 0 + + + 284 + 482 + 418 + 6 + 0 + + + 1 + 270 + 293 + 0 + 1 + + + 70 + 252 + 314 + 0 + 0 + + + 0 + 613 + 635 + 0 + 0 + + + 4 + 292 + 271 + 0 + 0 + + + 1 + 127 + 623 + 0 + 0 + + + 24 + 84 + 535 + 4 + 0 + + + 0 + 177 + 643 + 3 + 0 + + + 313 + 489 + 483 + 0 + 0 + + + 4 + 58 + 168 + 0 + 0 + + + 20 + 89 + 506 + 0 + 0 + + + 4 + 66 + 149 + 0 + 0 + + + 306 + 698 + 514 + 0 + 0 + + + 70 + 307 + 371 + 0 + 0 + + + 45 + 594 + 604 + 4 + 0 + + + 70 + 63 + 156 + 0 + 0 + + + 205 + 84 + 117 + 0 + 0 + + + 0 + 759 + 513 + 3 + 0 + + + 70 + 265 + 170 + 0 + 0 + + + 284 + 452 + 446 + 4 + 0 + + + 70 + 120 + 375 + 0 + 0 + + + 1 + 199 + 659 + 0 + 0 + + + 237 + 172 + 662 + 0 + 0 + + + 402 + 599 + 741 + 1 + 0 + + + 37 + 756 + 515 + 3 + 0 + + + 70 + 71 + 138 + 0 + 0 + + + 34 + 616 + 834 + 7 + 0 + + + 70 + 302 + 149 + 0 + 0 + + + 22 + 230 + 495 + 6 + 0 + + + 25 + 650 + 493 + 0 + 0 + + + 70 + 312 + 365 + 0 + 0 + + + 36 + 166 + 686 + 4 + 0 + + + 70 + 90 + 109 + 0 + 0 + + + 38 + 242 + 186 + 0 + 0 + + + 70 + 65 + 151 + 0 + 0 + + + 0 + 580 + 833 + 1 + 0 + + + 283 + 584 + 760 + 0 + 0 + + + 34 + 112 + 707 + 0 + 0 + + + 284 + 647 + 686 + 0 + 0 + + + 4 + 311 + 422 + 0 + 0 + + + 38 + 662 + 730 + 2 + 0 + + + 22 + 656 + 547 + 2 + 0 + + + 70 + 236 + 190 + 0 + 0 + + + 70 + 190 + 236 + 0 + 0 + + + 51 + 552 + 705 + 4 + 0 + + + 1 + 313 + 531 + 1 + 1 + + + 45 + 206 + 552 + 6 + 0 + + + 597 + 746 + 481 + 2 + 0 + + + 284 + 624 + 711 + 2 + 0 + + + 284 + 632 + 702 + 2 + 0 + + + 98 + 628 + 510 + 2 + 0 + + + 37 + 726 + 536 + 3 + 0 + + + 34 + 97 + 462 + 0 + 0 + + + 70 + 281 + 282 + 0 + 0 + + + 562 + 662 + 542 + 0 + 0 + + + 209 + 713 + 579 + 4 + 0 + + + 45 + 127 + 624 + 0 + 0 + + + 0 + 714 + 545 + 1 + 0 + + + 37 + 647 + 495 + 6 + 0 + + + 70 + 195 + 583 + 6 + 0 + + + 0 + 532 + 544 + 6 + 0 + + + 1 + 206 + 637 + 0 + 0 + + + 34 + 765 + 469 + 3 + 0 + + + 34 + 656 + 783 + 2 + 0 + + + 70 + 76 + 131 + 0 + 0 + + + 70 + 325 + 404 + 0 + 0 + + + 70 + 326 + 349 + 0 + 0 + + + 70 + 59 + 169 + 0 + 0 + + + 1 + 261 + 304 + 1 + 1 + + + 4 + 194 + 409 + 0 + 0 + + + 34 + 410 + 492 + 6 + 0 + + + 306 + 759 + 544 + 3 + 0 + + + 1 + 675 + 716 + 0 + 0 + + + 38 + 67 + 149 + 0 + 0 + + + 994 + 269 + 488 + 7 + 0 + + + 70 + 227 + 501 + 6 + 0 + + + 51 + 618 + 718 + 4 + 0 + + + 0 + 198 + 663 + 0 + 0 + + + 70 + 162 + 277 + 0 + 0 + + + 25 + 589 + 701 + 4 + 0 + + + 1 + 175 + 650 + 0 + 0 + + + 0 + 622 + 515 + 0 + 0 + + + 419 + 715 + 448 + 2 + 0 + + + 445 + 623 + 576 + 0 + 0 + + + 1 + 120 + 661 + 1 + 1 + + + 1 + 86 + 522 + 1 + 1 + + + 70 + 51 + 197 + 0 + 0 + + + 597 + 726 + 441 + 0 + 0 + + + 205 + 83 + 121 + 0 + 0 + + + 34 + 708 + 682 + 2 + 0 + + + 70 + 142 + 315 + 0 + 0 + + + 1 + 646 + 603 + 1 + 1 + + + 597 + 736 + 435 + 2 + 0 + + + 3 + 273 + 289 + 0 + 0 + + + 21 + 585 + 495 + 6 + 0 + + + 205 + 215 + 208 + 0 + 0 + + + 286 + 501 + 578 + 0 + 0 + + + 97 + 668 + 664 + 6 + 0 + + + 313 + 688 + 521 + 0 + 0 + + + 191 + 161 + 490 + 0 + 0 + + + 37 + 121 + 652 + 0 + 0 + + + 70 + 283 + 158 + 0 + 0 + + + 45 + 126 + 626 + 4 + 0 + + + 25 + 608 + 1548 + 2 + 0 + + + 37 + 692 + 518 + 0 + 0 + + + 397 + 568 + 727 + 0 + 0 + + + 70 + 291 + 392 + 0 + 0 + + + 192 + 125 + 631 + 0 + 0 + + + 407 + 727 + 568 + 2 + 0 + + + 205 + 325 + 351 + 0 + 0 + + + 4 + 581 + 551 + 0 + 0 + + + 284 + 630 + 704 + 2 + 0 + + + 51 + 275 + 2974 + 4 + 0 + + + 284 + 660 + 672 + 0 + 0 + + + 70 + 318 + 248 + 0 + 0 + + + 70 + 234 + 337 + 0 + 0 + + + 55 + 663 + 669 + 2 + 0 + + + 4 + 54 + 185 + 0 + 0 + + + 36 + 112 + 704 + 0 + 0 + + + 0 + 128 + 616 + 0 + 0 + + + 70 + 330 + 398 + 0 + 0 + + + 597 + 675 + 531 + 4 + 0 + + + 313 + 714 + 502 + 0 + 0 + + + 70 + 237 + 189 + 0 + 0 + + + 70 + 189 + 237 + 0 + 0 + + + 5 + 642 + 691 + 2 + 0 + + + 70 + 268 + 426 + 0 + 0 + + + 0 + 511 + 394 + 0 + 0 + + + 70 + 215 + 531 + 0 + 0 + + + 36 + 112 + 705 + 0 + 0 + + + 1 + 168 + 470 + 0 + 0 + + + 70 + 177 + 253 + 0 + 0 + + + 20 + 540 + 438 + 0 + 0 + + + 1 + 283 + 587 + 0 + 0 + + + 133 + 78 + 574 + 0 + 0 + + + 112 + 75 + 597 + 0 + 0 + + + 51 + 630 + 569 + 0 + 0 + + + 193 + 608 + 476 + 1 + 1 + + + 38 + 202 + 565 + 6 + 0 + + + 132 + 156 + 506 + 2 + 0 + + + 283 + 579 + 834 + 7 + 0 + + + 34 + 707 + 683 + 2 + 0 + + + 37 + 262 + 634 + 0 + 0 + + + 70 + 275 + 415 + 0 + 0 + + + 524 + 710 + 451 + 0 + 0 + + + 45 + 206 + 554 + 0 + 0 + + + 4 + 285 + 157 + 0 + 0 + + + 143 + 461 + 513 + 0 + 0 + + + 0 + 585 + 706 + 0 + 0 + + + 70 + 234 + 562 + 6 + 0 + + + 35 + 109 + 725 + 0 + 0 + + + 70 + 606 + 797 + 1 + 0 + + + 1 + 571 + 682 + 0 + 1 + + + 307 + 688 + 702 + 0 + 0 + + + 34 + 411 + 490 + 6 + 0 + + + 562 + 664 + 540 + 0 + 0 + + + 34 + 746 + 522 + 3 + 0 + + + 45 + 331 + 714 + 4 + 0 + + + 70 + 193 + 231 + 0 + 0 + + + 284 + 629 + 705 + 0 + 0 + + + 20 + 628 + 571 + 0 + 0 + + + 205 + 117 + 381 + 0 + 0 + + + 4 + 284 + 157 + 0 + 0 + + + 0 + 683 + 525 + 1 + 0 + + + 20 + 166 + 476 + 0 + 0 + + + 191 + 185 + 616 + 0 + 0 + + + 41 + 621 + 714 + 0 + 0 + + + 153 + 542 + 436 + 0 + 0 + + + 205 + 209 + 378 + 0 + 0 + + + 100 + 622 + 626 + 6 + 0 + + + 35 + 72 + 619 + 0 + 0 + + + 70 + 135 + 330 + 0 + 0 + + + 4 + 150 + 297 + 0 + 0 + + + 70 + 165 + 270 + 0 + 0 + + + 0 + 638 + 695 + 0 + 0 + + + 70 + 301 + 148 + 0 + 0 + + + 34 + 710 + 505 + 2 + 0 + + + 45 + 206 + 553 + 6 + 0 + + + 0 + 523 + 385 + 0 + 0 + + + 70 + 174 + 256 + 0 + 0 + + + 284 + 654 + 678 + 0 + 0 + + + 0 + 619 + 517 + 0 + 0 + + + 34 + 208 + 632 + 0 + 0 + + + 145 + 465 + 433 + 4 + 0 + + + 281 + 615 + 583 + 0 + 0 + + + 153 + 703 + 455 + 0 + 1 + + + 284 + 658 + 674 + 0 + 0 + + + 97 + 636 + 808 + 0 + 0 + + + 962 + 629 + 817 + 0 + 0 + + + 145 + 286 + 2968 + 2 + 0 + + + 25 + 461 + 437 + 2 + 0 + + + 1 + 101 + 442 + 0 + 0 + + + 70 + 123 + 363 + 0 + 0 + + + 70 + 244 + 183 + 0 + 0 + + + 3 + 216 + 609 + 4 + 0 + + + 1 + 134 + 590 + 0 + 0 + + + 284 + 656 + 676 + 0 + 0 + + + 70 + 50 + 204 + 0 + 0 + + + 4 + 129 + 346 + 0 + 0 + + + 34 + 693 + 697 + 2 + 0 + + + 219 + 173 + 258 + 5 + 0 + + + 70 + 65 + 157 + 0 + 0 + + + 0 + 697 + 693 + 0 + 0 + + + 4 + 278 + 597 + 0 + 0 + + + 284 + 657 + 675 + 2 + 0 + + + 25 + 84 + 531 + 4 + 0 + + + 20 + 155 + 510 + 4 + 0 + + + 70 + 201 + 222 + 0 + 0 + + + 1 + 170 + 465 + 0 + 0 + + + 34 + 174 + 657 + 1 + 0 + + + 38 + 209 + 381 + 0 + 0 + + + 70 + 219 + 522 + 0 + 0 + + + 38 + 177 + 251 + 0 + 0 + + + 205 + 75 + 123 + 0 + 0 + + + 70 + 322 + 355 + 0 + 0 + + + 34 + 685 + 467 + 3 + 0 + + + 16 + 630 + 766 + 0 + 0 + + + 1 + 614 + 585 + 1 + 1 + + + 4 + 266 + 167 + 0 + 0 + + + 191 + 185 + 618 + 0 + 0 + + + 284 + 632 + 703 + 2 + 0 + + + 597 + 672 + 476 + 6 + 0 + + + 205 + 322 + 138 + 0 + 0 + + + 23 + 733 + 490 + 6 + 0 + + + 1 + 205 + 642 + 0 + 0 + + + 1 + 168 + 474 + 0 + 0 + + + 164 + 607 + 795 + 2 + 0 + + + 284 + 624 + 712 + 2 + 0 + + + 261 + 398 + 505 + 4 + 0 + + + 345 + 613 + 586 + 4 + 0 + + + 313 + 480 + 491 + 0 + 0 + + + 70 + 203 + 219 + 0 + 0 + + + 51 + 628 + 572 + 4 + 0 + + + 313 + 717 + 501 + 3 + 0 + + + 33 + 465 + 688 + 4 + 0 + + + 284 + 482 + 417 + 6 + 0 + + + 1 + 177 + 646 + 0 + 0 + + + 1 + 131 + 608 + 0 + 0 + + + 0 + 206 + 639 + 0 + 0 + + + 313 + 483 + 488 + 0 + 0 + + + 0 + 614 + 673 + 0 + 0 + + + 70 + 112 + 397 + 0 + 0 + + + 51 + 598 + 691 + 0 + 0 + + + 145 + 83 + 534 + 1 + 1 + + + 313 + 485 + 486 + 0 + 0 + + + 306 + 675 + 474 + 2 + 0 + + + 38 + 57 + 163 + 0 + 0 + + + 0 + 201 + 655 + 0 + 0 + + + 70 + 166 + 268 + 0 + 0 + + + 70 + 266 + 430 + 0 + 0 + + + 5 + 319 + 1513 + 0 + 0 + + + 70 + 118 + 377 + 0 + 0 + + + 37 + 162 + 492 + 0 + 0 + + + 34 + 652 + 443 + 0 + 0 + + + 1 + 198 + 665 + 0 + 0 + + + 70 + 207 + 215 + 0 + 0 + + + 34 + 598 + 535 + 6 + 0 + + + 70 + 187 + 238 + 0 + 0 + + + 0 + 639 + 452 + 5 + 0 + + + 70 + 75 + 124 + 0 + 0 + + + 70 + 74 + 126 + 0 + 0 + + + 313 + 739 + 433 + 3 + 0 + + + 70 + 159 + 280 + 0 + 0 + + + 306 + 744 + 524 + 3 + 0 + + + 70 + 262 + 170 + 0 + 0 + + + 0 + 645 + 557 + 0 + 0 + + + 34 + 479 + 668 + 0 + 0 + + + 34 + 82 + 543 + 7 + 0 + + + 70 + 176 + 253 + 0 + 0 + + + 1 + 173 + 660 + 0 + 0 + + + 70 + 113 + 392 + 0 + 0 + + + 0 + 515 + 561 + 0 + 0 + + + 70 + 138 + 321 + 0 + 0 + + + 306 + 512 + 460 + 0 + 0 + + + 419 + 709 + 451 + 4 + 0 + + + 38 + 276 + 289 + 0 + 0 + + + 284 + 659 + 674 + 0 + 0 + + + 70 + 210 + 211 + 0 + 0 + + + 3 + 593 + 697 + 4 + 0 + + + 70 + 91 + 103 + 0 + 0 + + + 70 + 127 + 349 + 0 + 0 + + + 37 + 454 + 443 + 6 + 0 + + + 70 + 59 + 159 + 0 + 0 + + + 1 + 172 + 664 + 0 + 0 + + + 394 + 489 + 654 + 0 + 0 + + + 20 + 135 + 591 + 0 + 0 + + + 47 + 607 + 681 + 4 + 0 + + + 37 + 452 + 445 + 6 + 0 + + + 70 + 58 + 162 + 0 + 0 + + + 284 + 661 + 672 + 0 + 0 + + + 283 + 451 + 446 + 2 + 0 + + + 70 + 181 + 245 + 0 + 0 + + + 98 + 637 + 502 + 2 + 0 + + + 7 + 120 + 665 + 5 + 0 + + + 7 + 216 + 610 + 0 + 0 + + + 45 + 595 + 604 + 4 + 0 + + + 70 + 272 + 420 + 0 + 0 + + + 70 + 204 + 560 + 6 + 0 + + + 37 + 99 + 448 + 0 + 0 + + + 70 + 48 + 196 + 0 + 0 + + + 1 + 130 + 614 + 0 + 0 + + + 70 + 82 + 115 + 0 + 0 + + + 70 + 278 + 411 + 0 + 0 + + + 205 + 290 + 394 + 0 + 0 + + + 1 + 179 + 446 + 0 + 0 + + + 4 + 276 + 414 + 0 + 0 + + + 70 + 223 + 199 + 0 + 0 + + + 0 + 526 + 608 + 0 + 0 + + + 1 + 215 + 613 + 0 + 1 + + + 143 + 407 + 3513 + 6 + 0 + + + 37 + 263 + 634 + 0 + 0 + + + 34 + 682 + 527 + 2 + 0 + + + 71 + 594 + 696 + 4 + 0 + + + 45 + 330 + 714 + 4 + 0 + + + 70 + 69 + 137 + 0 + 0 + + + 70 + 330 + 242 + 0 + 0 + + + 15 + 249 + 459 + 6 + 0 + + + 0 + 182 + 628 + 0 + 0 + + + 1 + 134 + 596 + 0 + 0 + + + 3 + 83 + 535 + 6 + 0 + + + 193 + 608 + 475 + 1 + 1 + + + 37 + 647 + 494 + 0 + 0 + + + 21 + 552 + 749 + 0 + 0 + + + 70 + 107 + 413 + 0 + 0 + + + 1 + 180 + 441 + 0 + 0 + + + 70 + 242 + 328 + 0 + 0 + + + 70 + 203 + 391 + 0 + 0 + + + 1 + 79 + 559 + 7 + 0 + + + 195 + 75 + 589 + 0 + 0 + + + 1 + 469 + 503 + 1 + 1 + + + 34 + 651 + 444 + 0 + 0 + + + 1 + 171 + 670 + 0 + 0 + + + 70 + 64 + 148 + 0 + 0 + + + 70 + 142 + 311 + 0 + 0 + + + 225 + 259 + 643 + 4 + 0 + + + 0 + 128 + 620 + 0 + 0 + + + 38 + 165 + 268 + 0 + 0 + + + 0 + 628 + 509 + 2 + 0 + + + 25 + 208 + 551 + 4 + 0 + + + 34 + 654 + 442 + 0 + 0 + + + 284 + 655 + 678 + 2 + 0 + + + 0 + 209 + 631 + 0 + 0 + + + 70 + 105 + 421 + 0 + 0 + + + 597 + 676 + 531 + 4 + 0 + + + 70 + 200 + 573 + 0 + 0 + + + 34 + 99 + 447 + 0 + 0 + + + 70 + 118 + 375 + 0 + 0 + + + 34 + 606 + 796 + 0 + 0 + + + 70 + 291 + 273 + 0 + 0 + + + 11 + 273 + 291 + 4 + 0 + + + 4 + 112 + 395 + 0 + 0 + + + 1 + 178 + 644 + 0 + 0 + + + 70 + 322 + 356 + 0 + 0 + + + 193 + 624 + 463 + 3 + 1 + + + 1 + 648 + 554 + 0 + 0 + + + 110 + 113 + 703 + 0 + 0 + + + 510 + 648 + 602 + 6 + 0 + + + 38 + 114 + 388 + 0 + 0 + + + 51 + 622 + 714 + 6 + 0 + + + 70 + 90 + 106 + 0 + 0 + + + 25 + 608 + 1549 + 2 + 0 + + + 3 + 85 + 521 + 0 + 0 + + + 34 + 82 + 540 + 7 + 0 + + + 103 + 629 + 855 + 6 + 0 + + + 597 + 725 + 441 + 0 + 0 + + + 46 + 525 + 609 + 2 + 0 + + + 1 + 302 + 665 + 0 + 0 + + + 284 + 657 + 676 + 0 + 0 + + + 407 + 667 + 620 + 0 + 0 + + + 70 + 157 + 282 + 0 + 0 + + + 284 + 630 + 705 + 2 + 0 + + + 1 + 102 + 434 + 0 + 0 + + + 1 + 248 + 532 + 0 + 0 + + + 70 + 57 + 168 + 0 + 0 + + + 38 + 58 + 165 + 0 + 0 + + + 4 + 96 + 461 + 0 + 0 + + + 32 + 429 + 674 + 0 + 0 + + + 395 + 572 + 723 + 0 + 0 + + + 45 + 127 + 626 + 4 + 0 + + + 37 + 766 + 509 + 3 + 0 + + + 284 + 649 + 684 + 2 + 0 + + + 34 + 204 + 647 + 0 + 0 + + + 1 + 654 + 549 + 0 + 0 + + + 1 + 602 + 687 + 1 + 1 + + + 38 + 60 + 160 + 0 + 0 + + + 284 + 671 + 719 + 0 + 0 + + + 4 + 582 + 549 + 0 + 0 + + + 205 + 218 + 202 + 0 + 0 + + + 70 + 207 + 384 + 0 + 0 + + + 0 + 128 + 621 + 0 + 0 + + + 70 + 189 + 233 + 0 + 0 + + + 1 + 249 + 530 + 0 + 0 + + + 4 + 95 + 464 + 0 + 0 + + + 51 + 286 + 2966 + 6 + 0 + + + 70 + 214 + 206 + 0 + 0 + + + 35 + 71 + 621 + 0 + 0 + + + 278 + 634 + 761 + 0 + 0 + + + 70 + 151 + 292 + 0 + 0 + + + 70 + 292 + 392 + 0 + 0 + + + 4 + 310 + 426 + 0 + 0 + + + 0 + 201 + 657 + 3 + 0 + + + 70 + 137 + 322 + 0 + 0 + + + 97 + 267 + 298 + 6 + 0 + + + 306 + 766 + 540 + 3 + 0 + + + 70 + 196 + 406 + 0 + 0 + + + 70 + 125 + 353 + 0 + 0 + + + 219 + 171 + 258 + 3 + 0 + + + 1 + 86 + 513 + 1 + 1 + + + 286 + 523 + 611 + 0 + 0 + + + 1 + 611 + 523 + 0 + 0 + + + 6 + 245 + 180 + 2 + 0 + + + 7 + 611 + 677 + 4 + 0 + + + 0 + 740 + 527 + 3 + 0 + + + 1 + 306 + 544 + 1 + 1 + + + 284 + 628 + 707 + 2 + 0 + + + 70 + 248 + 178 + 0 + 0 + + + 4 + 290 + 395 + 0 + 0 + + + 1 + 183 + 435 + 0 + 0 + + + 4 + 123 + 359 + 0 + 0 + + + 1 + 83 + 532 + 0 + 1 + + + 34 + 222 + 516 + 1 + 0 + + + 1 + 477 + 670 + 0 + 0 + + + 1 + 81 + 545 + 7 + 0 + + + 284 + 652 + 681 + 2 + 0 + + + 283 + 585 + 759 + 0 + 0 + + + 70 + 319 + 414 + 0 + 0 + + + 205 + 278 + 412 + 0 + 0 + + + 153 + 541 + 436 + 0 + 0 + + + 51 + 230 + 498 + 2 + 0 + + + 0 + 624 + 625 + 6 + 0 + + + 0 + 625 + 624 + 6 + 0 + + + 70 + 198 + 402 + 0 + 0 + + + 70 + 268 + 297 + 0 + 0 + + + 5 + 680 + 470 + 0 + 0 + + + 143 + 458 + 515 + 2 + 0 + + + 1 + 283 + 710 + 0 + 0 + + + 70 + 84 + 131 + 0 + 0 + + + 38 + 314 + 428 + 0 + 0 + + + 4 + 285 + 282 + 0 + 0 + + + 59 + 274 + 603 + 0 + 0 + + + 1 + 94 + 445 + 4 + 0 + + + 51 + 276 + 2960 + 2 + 0 + + + 284 + 657 + 677 + 2 + 0 + + + 0 + 723 + 495 + 1 + 0 + + + 70 + 319 + 347 + 0 + 0 + + + 306 + 696 + 690 + 0 + 0 + + + 34 + 686 + 700 + 0 + 0 + + + 597 + 730 + 443 + 4 + 0 + + + 6 + 113 + 1462 + 0 + 0 + + + 204 + 700 + 686 + 4 + 0 + + + 284 + 655 + 679 + 2 + 0 + + + 37 + 254 + 529 + 0 + 0 + + + 283 + 454 + 451 + 6 + 0 + + + 1 + 631 + 761 + 0 + 1 + + + 70 + 268 + 156 + 0 + 0 + + + 407 + 619 + 466 + 3 + 0 + + + 34 + 700 + 462 + 3 + 0 + + + 97 + 266 + 302 + 6 + 0 + + + 0 + 608 + 674 + 0 + 0 + + + 1 + 253 + 531 + 0 + 0 + + + 70 + 220 + 190 + 0 + 0 + + + 0 + 620 + 661 + 3 + 0 + + + 50 + 558 + 703 + 0 + 0 + + + 306 + 720 + 497 + 1 + 0 + + + 0 + 175 + 459 + 0 + 0 + + + 186 + 624 + 462 + 1 + 1 + + + 34 + 766 + 535 + 3 + 0 + + + 37 + 473 + 497 + 0 + 0 + + + 70 + 108 + 387 + 0 + 0 + + + 70 + 320 + 251 + 0 + 0 + + + 70 + 208 + 532 + 0 + 0 + + + 70 + 124 + 337 + 0 + 0 + + + 0 + 702 + 684 + 2 + 0 + + + 70 + 127 + 329 + 0 + 0 + + + 37 + 75 + 557 + 7 + 0 + + + 1 + 202 + 665 + 0 + 0 + + + 206 + 693 + 566 + 0 + 0 + + + 283 + 685 + 701 + 0 + 0 + + + 205 + 119 + 351 + 0 + 0 + + + 70 + 197 + 212 + 0 + 0 + + + 37 + 246 + 546 + 0 + 0 + + + 306 + 766 + 512 + 3 + 0 + + + 19 + 588 + 667 + 4 + 0 + + + 70 + 50 + 218 + 0 + 0 + + + 46 + 460 + 445 + 2 + 0 + + + 38 + 325 + 247 + 0 + 0 + + + 70 + 247 + 325 + 0 + 0 + + + 283 + 704 + 682 + 0 + 0 + + + 1 + 178 + 451 + 0 + 0 + + + 38 + 127 + 632 + 0 + 0 + + + 398 + 542 + 756 + 1 + 0 + + + 1 + 176 + 456 + 0 + 0 + + + 20 + 114 + 366 + 6 + 0 + + + 34 + 61 + 688 + 0 + 0 + + + 70 + 302 + 367 + 0 + 0 + + + 205 + 236 + 340 + 0 + 0 + + + 283 + 705 + 681 + 0 + 0 + + + 38 + 226 + 355 + 0 + 0 + + + 205 + 276 + 152 + 0 + 0 + + + 284 + 624 + 713 + 2 + 0 + + + 1 + 76 + 552 + 7 + 0 + + + 70 + 111 + 378 + 0 + 0 + + + 70 + 311 + 258 + 0 + 0 + + + 70 + 206 + 538 + 0 + 0 + + + 286 + 494 + 655 + 1 + 0 + + + 21 + 329 + 715 + 0 + 0 + + + 0 + 535 + 539 + 6 + 0 + + + 0 + 696 + 514 + 1 + 0 + + + 70 + 69 + 157 + 0 + 0 + + + 306 + 486 + 484 + 0 + 0 + + + 313 + 484 + 486 + 0 + 0 + + + 222 + 233 + 180 + 0 + 0 + + + 284 + 662 + 672 + 0 + 0 + + + 272 + 616 + 637 + 0 + 0 + + + 34 + 733 + 488 + 3 + 0 + + + 38 + 196 + 214 + 0 + 0 + + + 1 + 171 + 648 + 5 + 0 + + + 97 + 271 + 296 + 6 + 0 + + + 547 + 617 + 636 + 3 + 0 + + + 313 + 481 + 489 + 0 + 0 + + + 0 + 737 + 439 + 7 + 0 + + + 0 + 766 + 467 + 0 + 0 + + + 37 + 473 + 684 + 4 + 0 + + + 37 + 94 + 446 + 4 + 0 + + + 4 + 317 + 253 + 0 + 0 + + + 41 + 632 + 566 + 2 + 0 + + + 70 + 174 + 241 + 0 + 0 + + + 70 + 74 + 146 + 0 + 0 + + + 70 + 107 + 101 + 0 + 0 + + + 191 + 181 + 612 + 0 + 0 + + + 108 + 72 + 582 + 0 + 0 + + + 1 + 97 + 432 + 0 + 0 + + + 70 + 190 + 422 + 0 + 0 + + + 284 + 660 + 674 + 0 + 0 + + + 70 + 167 + 251 + 0 + 0 + + + 4 + 290 + 382 + 0 + 0 + + + 34 + 63 + 665 + 0 + 0 + + + 283 + 707 + 679 + 0 + 0 + + + 0 + 641 + 694 + 0 + 0 + + + 1 + 210 + 639 + 0 + 0 + + + 70 + 187 + 224 + 0 + 0 + + + 34 + 716 + 548 + 1 + 0 + + + 272 + 615 + 638 + 0 + 0 + + + 55 + 214 + 627 + 0 + 0 + + + 1 + 131 + 612 + 0 + 0 + + + 1 + 248 + 541 + 0 + 0 + + + 38 + 705 + 581 + 2 + 0 + + + 1 + 245 + 452 + 0 + 0 + + + 0 + 74 + 566 + 0 + 0 + + + 307 + 497 + 580 + 0 + 0 + + + 70 + 55 + 196 + 0 + 0 + + + 1 + 208 + 645 + 0 + 0 + + + 1 + 183 + 438 + 0 + 0 + + + 55 + 201 + 551 + 0 + 0 + + + 70 + 161 + 260 + 0 + 0 + + + 70 + 328 + 409 + 0 + 0 + + + 445 + 639 + 614 + 2 + 0 + + + 70 + 84 + 128 + 0 + 0 + + + 38 + 252 + 318 + 0 + 0 + + + 10 + 467 + 438 + 2 + 0 + + + 4 + 106 + 395 + 0 + 0 + + + 1 + 678 + 708 + 0 + 0 + + + 110 + 114 + 703 + 0 + 0 + + + 100 + 76 + 547 + 4 + 0 + + + 1 + 593 + 545 + 1 + 1 + + + 70 + 99 + 420 + 0 + 0 + + + 70 + 105 + 396 + 0 + 0 + + + 1 + 560 + 701 + 0 + 1 + + + 208 + 686 + 648 + 4 + 0 + + + 23 + 646 + 447 + 1 + 0 + + + 284 + 648 + 686 + 0 + 0 + + + 70 + 194 + 572 + 0 + 0 + + + 34 + 204 + 660 + 1 + 0 + + + 70 + 76 + 148 + 0 + 0 + + + 70 + 209 + 199 + 0 + 0 + + + 0 + 636 + 454 + 5 + 0 + + + 1 + 360 + 568 + 2 + 1 + + + 45 + 594 + 602 + 0 + 0 + + + 205 + 277 + 150 + 0 + 0 + + + 4 + 50 + 224 + 0 + 0 + + + 34 + 286 + 715 + 0 + 0 + + + 70 + 236 + 176 + 0 + 0 + + + 0 + 88 + 472 + 0 + 0 + + + 10 + 469 + 436 + 4 + 0 + + + 306 + 689 + 519 + 4 + 0 + + + 205 + 183 + 227 + 0 + 0 + + + 37 + 685 + 522 + 5 + 0 + + + 45 + 592 + 604 + 4 + 0 + + + 70 + 214 + 629 + 2 + 0 + + + 938 + 687 + 647 + 0 + 0 + + + 1 + 596 + 688 + 0 + 1 + + + 70 + 276 + 290 + 0 + 0 + + + 37 + 163 + 491 + 0 + 0 + + + 0 + 628 + 625 + 6 + 0 + + + 1 + 265 + 302 + 1 + 1 + + + 278 + 629 + 763 + 0 + 0 + + + 70 + 76 + 147 + 0 + 0 + + + 1 + 307 + 666 + 0 + 0 + + + 34 + 208 + 647 + 0 + 0 + + + 597 + 736 + 439 + 2 + 0 + + + 314 + 688 + 646 + 0 + 0 + + + 1 + 581 + 826 + 0 + 0 + + + 70 + 71 + 157 + 0 + 0 + + + 70 + 701 + 634 + 0 + 0 + + + 45 + 251 + 536 + 0 + 0 + + + 70 + 288 + 144 + 0 + 0 + + + 34 + 113 + 708 + 0 + 0 + + + 20 + 114 + 364 + 6 + 0 + + + 4 + 166 + 250 + 0 + 0 + + + 98 + 631 + 512 + 2 + 0 + + + 145 + 276 + 2959 + 6 + 0 + + + 70 + 193 + 215 + 0 + 0 + + + 23 + 658 + 491 + 6 + 0 + + + 22 + 595 + 543 + 0 + 0 + + + 70 + 66 + 169 + 0 + 0 + + + 34 + 652 + 736 + 0 + 0 + + + 70 + 150 + 278 + 0 + 0 + + + 70 + 208 + 534 + 0 + 0 + + + 284 + 652 + 682 + 2 + 0 + + + 70 + 236 + 570 + 6 + 0 + + + 377 + 639 + 806 + 6 + 0 + + + 0 + 230 + 483 + 0 + 0 + + + 1 + 617 + 524 + 0 + 0 + + + 70 + 262 + 424 + 0 + 0 + + + 88 + 695 + 565 + 5 + 0 + + + 1 + 418 + 489 + 0 + 1 + + + 70 + 113 + 98 + 0 + 0 + + + 284 + 628 + 708 + 2 + 0 + + + 20 + 123 + 650 + 0 + 0 + + + 1 + 262 + 630 + 1 + 1 + + + 962 + 668 + 771 + 7 + 0 + + + 70 + 199 + 558 + 6 + 0 + + + 1 + 683 + 651 + 0 + 0 + + + 4 + 77 + 144 + 0 + 0 + + + 70 + 304 + 263 + 0 + 0 + + + 70 + 105 + 397 + 0 + 0 + + + 70 + 287 + 387 + 0 + 0 + + + 58 + 241 + 173 + 2 + 0 + + + 284 + 482 + 424 + 6 + 0 + + + 16 + 628 + 764 + 2 + 0 + + + 63 + 116 + 359 + 2 + 0 + + + 15 + 120 + 666 + 0 + 0 + + + 306 + 738 + 532 + 0 + 0 + + + 34 + 287 + 712 + 0 + 0 + + + 70 + 231 + 346 + 0 + 0 + + + 15 + 164 + 254 + 4 + 0 + + + 70 + 206 + 388 + 0 + 0 + + + 597 + 672 + 481 + 6 + 0 + + + 37 + 694 + 515 + 1 + 0 + + + 0 + 516 + 396 + 0 + 0 + + + 951 + 635 + 811 + 0 + 0 + + + 153 + 540 + 436 + 0 + 0 + + + 1 + 212 + 634 + 0 + 0 + + + 284 + 454 + 450 + 2 + 0 + + + 284 + 671 + 715 + 0 + 0 + + + 420 + 636 + 699 + 2 + 0 + + + 284 + 649 + 685 + 2 + 0 + + + 70 + 145 + 287 + 0 + 0 + + + 0 + 127 + 629 + 0 + 0 + + + 34 + 722 + 495 + 3 + 0 + + + 5 + 601 + 682 + 0 + 0 + + + 4 + 101 + 412 + 0 + 0 + + + 70 + 206 + 202 + 0 + 0 + + + 70 + 81 + 136 + 0 + 0 + + + 34 + 754 + 474 + 3 + 0 + + + 21 + 257 + 642 + 4 + 0 + + + 70 + 219 + 190 + 0 + 0 + + + 38 + 107 + 389 + 0 + 0 + + + 23 + 743 + 481 + 2 + 0 + + + 3 + 627 + 570 + 0 + 0 + + + 70 + 144 + 289 + 0 + 0 + + + 70 + 297 + 269 + 0 + 0 + + + 70 + 102 + 408 + 0 + 0 + + + 70 + 296 + 375 + 0 + 0 + + + 70 + 207 + 386 + 0 + 0 + + + 278 + 273 + 494 + 2 + 0 + + + 0 + 130 + 622 + 0 + 0 + + + 70 + 326 + 248 + 0 + 0 + + + 26 + 124 + 652 + 0 + 0 + + + 938 + 685 + 650 + 0 + 0 + + + 0 + 751 + 523 + 3 + 0 + + + 34 + 470 + 687 + 4 + 0 + + + 21 + 550 + 746 + 4 + 0 + + + 0 + 445 + 459 + 0 + 0 + + + 284 + 628 + 709 + 2 + 0 + + + 1 + 74 + 558 + 0 + 0 + + + 70 + 59 + 177 + 0 + 0 + + + 95 + 121 + 668 + 4 + 0 + + + 153 + 538 + 436 + 0 + 0 + + + 34 + 653 + 441 + 0 + 0 + + + 0 + 177 + 457 + 0 + 0 + + + 70 + 159 + 260 + 0 + 0 + + + 989 + 666 + 772 + 0 + 0 + + + 70 + 76 + 138 + 0 + 0 + + + 0 + 605 + 476 + 0 + 0 + + + 1 + 219 + 616 + 3 + 1 + + + 525 + 716 + 451 + 6 + 0 + + + 205 + 334 + 333 + 0 + 0 + + + 70 + 287 + 144 + 0 + 0 + + + 205 + 187 + 221 + 0 + 0 + + + 4 + 293 + 276 + 0 + 0 + + + 35 + 59 + 699 + 0 + 0 + + + 191 + 181 + 614 + 0 + 0 + + + 143 + 113 + 365 + 2 + 0 + + + 205 + 88 + 118 + 0 + 0 + + + 153 + 533 + 440 + 0 + 0 + + + 313 + 693 + 517 + 0 + 0 + + + 58 + 155 + 266 + 6 + 0 + + + 70 + 169 + 244 + 0 + 0 + + + 306 + 718 + 499 + 1 + 0 + + + 32 + 537 + 764 + 0 + 0 + + + 284 + 649 + 686 + 0 + 0 + + + 938 + 686 + 649 + 0 + 0 + + + 205 + 310 + 133 + 0 + 0 + + + 97 + 689 + 570 + 5 + 0 + + + 70 + 232 + 581 + 6 + 0 + + + 1 + 127 + 636 + 0 + 0 + + + 44 + 251 + 537 + 6 + 0 + + + 0 + 513 + 398 + 0 + 0 + + + 20 + 114 + 362 + 6 + 0 + + + 205 + 308 + 134 + 0 + 0 + + + 102 + 76 + 543 + 4 + 0 + + + 34 + 674 + 479 + 3 + 0 + + + 35 + 63 + 655 + 0 + 0 + + + 193 + 607 + 474 + 3 + 1 + + + 284 + 669 + 717 + 0 + 0 + + + 38 + 264 + 421 + 0 + 0 + + + 20 + 318 + 521 + 0 + 0 + + + 70 + 50 + 208 + 0 + 0 + + + 70 + 101 + 103 + 0 + 0 + + + 59 + 184 + 604 + 6 + 0 + + + 70 + 223 + 185 + 0 + 0 + + + 4 + 202 + 400 + 0 + 0 + + + 1 + 171 + 651 + 0 + 0 + + + 110 + 115 + 702 + 0 + 0 + + + 4 + 241 + 335 + 0 + 0 + + + 284 + 667 + 719 + 0 + 0 + + + 285 + 582 + 824 + 6 + 0 + + + 205 + 321 + 129 + 0 + 0 + + + 4 + 300 + 371 + 0 + 0 + + + 70 + 228 + 354 + 0 + 0 + + + 284 + 655 + 680 + 2 + 0 + + + 70 + 320 + 421 + 0 + 0 + + + 70 + 54 + 191 + 0 + 0 + + + 284 + 630 + 707 + 0 + 0 + + + 70 + 313 + 258 + 0 + 0 + + + 131 + 125 + 646 + 3 + 0 + + + 102 + 318 + 642 + 0 + 0 + + + 50 + 583 + 764 + 1 + 0 + + + 377 + 601 + 798 + 1 + 0 + + + 205 + 507 + 463 + 0 + 0 + + + 70 + 135 + 307 + 0 + 0 + + + 313 + 487 + 482 + 0 + 0 + + + 1 + 177 + 629 + 0 + 0 + + + 205 + 76 + 136 + 0 + 0 + + + 70 + 220 + 367 + 0 + 0 + + + 70 + 90 + 115 + 0 + 0 + + + 45 + 250 + 539 + 6 + 0 + + + 94 + 539 + 599 + 0 + 1 + + + 284 + 652 + 683 + 2 + 0 + + + 1 + 94 + 440 + 4 + 0 + + + 55 + 652 + 629 + 4 + 0 + + + 3 + 562 + 699 + 0 + 0 + + + 306 + 754 + 521 + 3 + 0 + + + 0 + 725 + 494 + 1 + 0 + + + 70 + 125 + 331 + 0 + 0 + + + 22 + 651 + 630 + 4 + 0 + + + 103 + 76 + 544 + 0 + 0 + + + 1 + 297 + 687 + 4 + 0 + + + 0 + 128 + 630 + 0 + 0 + + + 4 + 50 + 205 + 0 + 0 + + + 38 + 67 + 153 + 0 + 0 + + + 45 + 595 + 602 + 0 + 0 + + + 1 + 611 + 643 + 3 + 0 + + + 34 + 648 + 740 + 0 + 0 + + + 285 + 477 + 492 + 0 + 0 + + + 205 + 127 + 326 + 0 + 0 + + + 51 + 622 + 716 + 6 + 0 + + + 38 + 201 + 206 + 0 + 0 + + + 70 + 206 + 201 + 0 + 0 + + + 34 + 75 + 552 + 7 + 0 + + + 1 + 172 + 647 + 5 + 0 + + + 407 + 611 + 471 + 0 + 0 + + + 45 + 593 + 604 + 4 + 0 + + + 1 + 92 + 450 + 4 + 0 + + + 205 + 310 + 359 + 0 + 0 + + + 34 + 697 + 688 + 2 + 0 + + + 1 + 649 + 632 + 0 + 1 + + + 29 + 264 + 628 + 0 + 0 + + + 1 + 92 + 446 + 4 + 0 + + + 70 + 226 + 493 + 6 + 0 + + + 70 + 255 + 316 + 0 + 0 + + + 70 + 57 + 188 + 0 + 0 + + + 597 + 746 + 480 + 2 + 0 + + + 70 + 200 + 403 + 0 + 0 + + + 45 + 203 + 549 + 4 + 0 + + + 70 + 132 + 311 + 0 + 0 + + + 70 + 277 + 291 + 0 + 0 + + + 34 + 62 + 662 + 0 + 0 + + + 70 + 135 + 304 + 0 + 0 + + + 205 + 240 + 171 + 0 + 0 + + + 377 + 625 + 573 + 4 + 0 + + + 524 + 703 + 459 + 2 + 0 + + + 938 + 690 + 645 + 0 + 0 + + + 34 + 206 + 656 + 0 + 0 + + + 4 + 177 + 232 + 0 + 0 + + + 502 + 635 + 564 + 0 + 0 + + + 70 + 99 + 415 + 0 + 0 + + + 151 + 535 + 439 + 6 + 0 + + + 1 + 692 + 568 + 0 + 1 + + + 1 + 84 + 489 + 1 + 0 + + + 70 + 325 + 343 + 0 + 0 + + + 70 + 198 + 563 + 0 + 0 + + + 0 + 76 + 539 + 7 + 0 + + + 36 + 667 + 432 + 2 + 0 + + + 274 + 524 + 448 + 4 + 0 + + + 70 + 299 + 137 + 0 + 0 + + + 70 + 193 + 577 + 6 + 0 + + + 272 + 615 + 639 + 0 + 0 + + + 1 + 286 + 713 + 0 + 0 + + + 70 + 209 + 196 + 0 + 0 + + + 70 + 162 + 253 + 0 + 0 + + + 38 + 239 + 337 + 0 + 0 + + + 70 + 99 + 414 + 0 + 0 + + + 0 + 749 + 478 + 0 + 0 + + + 153 + 536 + 438 + 2 + 0 + + + 597 + 672 + 480 + 6 + 0 + + + 284 + 632 + 704 + 2 + 0 + + + 0 + 763 + 538 + 3 + 0 + + + 4 + 164 + 250 + 0 + 0 + + + 51 + 276 + 2957 + 2 + 0 + + + 70 + 306 + 134 + 0 + 0 + + + 70 + 153 + 268 + 0 + 0 + + + 70 + 55 + 194 + 0 + 0 + + + 1 + 657 + 545 + 0 + 0 + + + 272 + 616 + 638 + 0 + 0 + + + 45 + 252 + 536 + 0 + 0 + + + 145 + 471 + 433 + 4 + 0 + + + 34 + 652 + 442 + 0 + 0 + + + 1 + 74 + 554 + 0 + 0 + + + 445 + 636 + 563 + 6 + 0 + + + 55 + 220 + 614 + 0 + 0 + + + 70 + 206 + 391 + 0 + 0 + + + 34 + 93 + 441 + 4 + 0 + + + 1 + 680 + 705 + 2 + 0 + + + 0 + 757 + 473 + 0 + 0 + + + 1 + 88 + 466 + 0 + 0 + + + 205 + 176 + 233 + 0 + 0 + + + 34 + 522 + 618 + 6 + 0 + + + 1 + 168 + 664 + 0 + 0 + + + 938 + 688 + 647 + 0 + 0 + + + 55 + 201 + 555 + 0 + 0 + + + 283 + 708 + 677 + 0 + 0 + + + 4 + 55 + 192 + 0 + 0 + + + 21 + 548 + 749 + 0 + 0 + + + 0 + 307 + 664 + 0 + 0 + + + 284 + 454 + 449 + 2 + 0 + + + 70 + 192 + 581 + 6 + 0 + + + 70 + 140 + 294 + 0 + 0 + + + 278 + 614 + 583 + 0 + 0 + + + 70 + 161 + 693 + 0 + 0 + + + 306 + 752 + 476 + 0 + 0 + + + 153 + 534 + 440 + 0 + 0 + + + 34 + 203 + 665 + 1 + 0 + + + 285 + 634 + 756 + 0 + 0 + + + 286 + 492 + 656 + 1 + 0 + + + 6 + 317 + 1512 + 0 + 0 + + + 70 + 236 + 341 + 0 + 0 + + + 606 + 732 + 441 + 0 + 0 + + + 22 + 601 + 683 + 4 + 0 + + + 1 + 160 + 503 + 4 + 0 + + + 70 + 314 + 430 + 0 + 0 + + + 70 + 107 + 99 + 0 + 0 + + + 217 + 687 + 648 + 1 + 0 + + + 142 + 474 + 681 + 6 + 0 + + + 70 + 106 + 100 + 0 + 0 + + + 419 + 711 + 454 + 2 + 0 + + + 153 + 539 + 436 + 0 + 0 + + + 4 + 103 + 400 + 0 + 0 + + + 1 + 80 + 515 + 1 + 0 + + + 70 + 103 + 103 + 0 + 0 + + + 0 + 581 + 825 + 6 + 0 + + + 34 + 93 + 443 + 4 + 0 + + + 284 + 482 + 423 + 6 + 0 + + + 36 + 524 + 616 + 6 + 0 + + + 51 + 620 + 718 + 4 + 0 + + + 0 + 623 + 518 + 0 + 0 + + + 1187 + 446 + 3367 + 4 + 0 + + + 38 + 128 + 628 + 0 + 0 + + + 284 + 626 + 711 + 0 + 0 + + + 0 + 410 + 497 + 6 + 0 + + + 0 + 648 + 498 + 6 + 0 + + + 191 + 181 + 616 + 0 + 0 + + + 306 + 747 + 432 + 7 + 0 + + + 1 + 629 + 569 + 0 + 1 + + + 34 + 62 + 663 + 0 + 0 + + + 306 + 518 + 556 + 0 + 0 + + + 428 + 691 + 467 + 6 + 0 + + + 597 + 674 + 531 + 4 + 0 + + + 59 + 184 + 606 + 2 + 0 + + + 45 + 329 + 714 + 4 + 0 + + + 407 + 609 + 473 + 1 + 0 + + + 195 + 338 + 603 + 4 + 0 + + + 70 + 196 + 569 + 0 + 0 + + + 0 + 722 + 447 + 7 + 0 + + + 261 + 402 + 507 + 0 + 0 + + + 37 + 724 + 543 + 3 + 0 + + + 37 + 687 + 521 + 6 + 0 + + + 938 + 689 + 646 + 0 + 0 + + + 70 + 331 + 243 + 0 + 0 + + + 1 + 619 + 663 + 3 + 0 + + + 278 + 615 + 582 + 0 + 0 + + + 70 + 296 + 139 + 0 + 0 + + + 70 + 162 + 254 + 0 + 0 + + + 34 + 81 + 508 + 1 + 0 + + + 3 + 215 + 620 + 4 + 0 + + + 70 + 164 + 261 + 0 + 0 + + + 70 + 86 + 139 + 0 + 0 + + + 1 + 600 + 652 + 2 + 0 + + + 951 + 635 + 812 + 4 + 0 + + + 70 + 245 + 332 + 0 + 0 + + + 88 + 690 + 646 + 7 + 0 + + + 45 + 203 + 550 + 2 + 0 + + + 70 + 231 + 577 + 6 + 0 + + + 70 + 199 + 215 + 0 + 0 + + + 205 + 51 + 234 + 0 + 0 + + + 70 + 155 + 276 + 0 + 0 + + + 70 + 256 + 167 + 0 + 0 + + + 0 + 201 + 663 + 0 + 0 + + + 1 + 172 + 649 + 0 + 0 + + + 205 + 228 + 357 + 0 + 0 + + + 284 + 627 + 711 + 0 + 0 + + + 309 + 507 + 567 + 0 + 0 + + + 597 + 672 + 531 + 6 + 0 + + + 1 + 135 + 603 + 0 + 0 + + + 1152 + 465 + 3398 + 6 + 0 + + + 45 + 259 + 634 + 2 + 0 + + + 377 + 645 + 637 + 3 + 0 + + + 1 + 81 + 529 + 0 + 1 + + + 70 + 212 + 527 + 0 + 0 + + + 153 + 532 + 440 + 0 + 0 + + + 118 + 130 + 626 + 6 + 0 + + + 97 + 274 + 297 + 6 + 0 + + + 70 + 236 + 565 + 6 + 0 + + + 274 + 497 + 471 + 0 + 0 + + + 70 + 191 + 426 + 0 + 0 + + + 196 + 339 + 601 + 0 + 0 + + + 70 + 108 + 111 + 0 + 0 + + + 193 + 606 + 474 + 0 + 1 + + + 70 + 326 + 409 + 0 + 0 + + + 285 + 577 + 834 + 6 + 0 + + + 597 + 736 + 438 + 2 + 0 + + + 1 + 202 + 553 + 1 + 1 + + + 0 + 158 + 515 + 5 + 0 + + + 597 + 731 + 441 + 0 + 0 + + + 938 + 689 + 647 + 0 + 0 + + + 34 + 406 + 708 + 0 + 0 + + + 377 + 648 + 634 + 3 + 0 + + + 70 + 106 + 404 + 0 + 0 + + + 34 + 609 + 732 + 0 + 0 + + + 1 + 79 + 542 + 7 + 0 + + + 70 + 298 + 273 + 0 + 0 + + + 34 + 605 + 533 + 6 + 0 + + + 283 + 533 + 605 + 2 + 0 + + + 70 + 257 + 316 + 0 + 0 + + + 0 + 626 + 656 + 0 + 0 + + + 70 + 230 + 579 + 6 + 0 + + + 284 + 628 + 710 + 2 + 0 + + + 70 + 147 + 292 + 0 + 0 + + + 195 + 337 + 604 + 4 + 0 + + + 70 + 228 + 584 + 6 + 0 + + + 4 + 53 + 223 + 0 + 0 + + + 4 + 138 + 311 + 0 + 0 + + + 283 + 614 + 840 + 6 + 0 + + + 70 + 270 + 414 + 0 + 0 + + + 70 + 230 + 486 + 0 + 0 + + + 4 + 248 + 173 + 0 + 0 + + + 306 + 509 + 460 + 0 + 0 + + + 70 + 223 + 364 + 0 + 0 + + + 205 + 88 + 134 + 0 + 0 + + + 103 + 318 + 640 + 0 + 0 + + + 72 + 617 + 578 + 4 + 0 + + + 0 + 128 + 634 + 0 + 0 + + + 0 + 199 + 669 + 0 + 0 + + + 1 + 603 + 681 + 1 + 1 + + + 3 + 648 + 604 + 6 + 0 + + + 1 + 170 + 658 + 0 + 0 + + + 407 + 676 + 579 + 0 + 0 + + + 1 + 166 + 259 + 0 + 1 + + + 10 + 466 + 437 + 0 + 0 + + + 70 + 58 + 205 + 0 + 0 + + + 405 + 544 + 755 + 0 + 0 + + + 22 + 594 + 543 + 0 + 0 + + + 191 + 181 + 618 + 0 + 0 + + + 280 + 467 + 436 + 6 + 0 + + + 45 + 203 + 551 + 2 + 0 + + + 7 + 601 + 742 + 4 + 0 + + + 34 + 87 + 494 + 1 + 0 + + + 70 + 272 + 158 + 0 + 0 + + + 205 + 95 + 125 + 0 + 0 + + + 70 + 250 + 325 + 0 + 0 + + + 284 + 650 + 686 + 0 + 0 + + + 70 + 292 + 383 + 0 + 0 + + + 45 + 328 + 714 + 4 + 0 + + + 34 + 521 + 619 + 6 + 0 + + + 70 + 121 + 98 + 0 + 0 + + + 38 + 279 + 154 + 0 + 0 + + + 70 + 198 + 217 + 0 + 0 + + + 32 + 539 + 762 + 0 + 0 + + + 38 + 104 + 413 + 0 + 0 + + + 34 + 163 + 686 + 4 + 0 + + + 10 + 468 + 435 + 6 + 0 + + + 377 + 663 + 538 + 0 + 0 + + + 0 + 131 + 620 + 0 + 0 + + + 284 + 671 + 717 + 2 + 0 + + + 395 + 669 + 771 + 0 + 0 + + + 951 + 636 + 811 + 0 + 0 + + + 70 + 115 + 103 + 0 + 0 + + + 286 + 158 + 513 + 3 + 0 + + + 70 + 298 + 272 + 0 + 0 + + + 205 + 139 + 306 + 0 + 0 + + + 1 + 606 + 646 + 4 + 0 + + + 63 + 287 + 571 + 0 + 0 + + + 70 + 122 + 100 + 0 + 0 + + + 34 + 210 + 636 + 0 + 0 + + + 3 + 652 + 494 + 6 + 0 + + + 0 + 519 + 392 + 0 + 0 + + + 306 + 746 + 551 + 0 + 0 + + + 284 + 659 + 676 + 0 + 0 + + + 4 + 82 + 149 + 0 + 0 + + + 1 + 174 + 466 + 0 + 0 + + + 70 + 158 + 269 + 0 + 0 + + + 38 + 254 + 319 + 0 + 0 + + + 70 + 125 + 340 + 0 + 0 + + + 7 + 215 + 621 + 0 + 0 + + + 0 + 737 + 437 + 7 + 0 + + + 1 + 169 + 662 + 0 + 0 + + + 105 + 78 + 545 + 0 + 0 + + + 284 + 454 + 448 + 2 + 0 + + + 70 + 308 + 138 + 0 + 0 + + + 4 + 333 + 336 + 0 + 0 + + + 284 + 657 + 678 + 0 + 0 + + + 34 + 251 + 532 + 0 + 0 + + + 0 + 516 + 454 + 0 + 0 + + + 15 + 112 + 1463 + 2 + 0 + + + 70 + 317 + 353 + 0 + 0 + + + 284 + 482 + 422 + 6 + 0 + + + 37 + 471 + 684 + 4 + 0 + + + 45 + 259 + 633 + 2 + 0 + + + 70 + 119 + 103 + 0 + 0 + + + 284 + 669 + 719 + 0 + 0 + + + 3 + 693 + 565 + 2 + 0 + + + 4 + 92 + 463 + 0 + 0 + + + 34 + 651 + 442 + 0 + 0 + + + 70 + 240 + 338 + 0 + 0 + + + 4 + 263 + 162 + 0 + 0 + + + 284 + 632 + 705 + 2 + 0 + + + 37 + 628 + 513 + 2 + 0 + + + 51 + 587 + 667 + 4 + 0 + + + 597 + 746 + 478 + 2 + 0 + + + 284 + 663 + 672 + 0 + 0 + + + 1 + 176 + 461 + 0 + 0 + + + 284 + 624 + 714 + 2 + 0 + + + 70 + 91 + 135 + 0 + 0 + + + 70 + 133 + 320 + 0 + 0 + + + 70 + 112 + 380 + 0 + 0 + + + 273 + 536 + 601 + 0 + 0 + + + 70 + 264 + 424 + 0 + 0 + + + 70 + 215 + 198 + 0 + 0 + + + 70 + 325 + 411 + 0 + 0 + + + 35 + 68 + 626 + 0 + 0 + + + 0 + 721 + 543 + 3 + 0 + + + 313 + 687 + 519 + 0 + 0 + + + 70 + 255 + 167 + 0 + 0 + + + 43 + 643 + 748 + 4 + 0 + + + 284 + 661 + 674 + 0 + 0 + + + 100 + 612 + 843 + 1 + 0 + + + 72 + 619 + 576 + 0 + 0 + + + 0 + 79 + 539 + 7 + 0 + + + 105 + 78 + 546 + 0 + 0 + + + 284 + 625 + 713 + 0 + 0 + + + 286 + 600 + 594 + 4 + 0 + + + 70 + 71 + 170 + 0 + 0 + + + 38 + 248 + 172 + 0 + 0 + + + 70 + 282 + 287 + 0 + 0 + + + 34 + 95 + 449 + 4 + 0 + + + 45 + 592 + 602 + 0 + 0 + + + 45 + 203 + 552 + 2 + 0 + + + 445 + 633 + 563 + 6 + 0 + + + 0 + 174 + 644 + 3 + 0 + + + 38 + 153 + 279 + 0 + 0 + + + 0 + 524 + 388 + 0 + 0 + + + 70 + 168 + 254 + 0 + 0 + + + 46 + 460 + 442 + 2 + 0 + + + 50 + 584 + 763 + 1 + 0 + + + 70 + 194 + 417 + 0 + 0 + + + 0 + 687 + 469 + 3 + 0 + + + 45 + 204 + 549 + 4 + 0 + + + 1 + 127 + 637 + 0 + 0 + + + 526 + 716 + 450 + 4 + 0 + + + 34 + 681 + 706 + 2 + 0 + + + 70 + 64 + 188 + 0 + 0 + + + 1 + 171 + 655 + 0 + 0 + + + 205 + 275 + 155 + 0 + 0 + + + 70 + 296 + 144 + 0 + 0 + + + 70 + 128 + 333 + 0 + 0 + + + 597 + 696 + 512 + 0 + 0 + + + 313 + 717 + 497 + 3 + 0 + + + 70 + 74 + 163 + 0 + 0 + + + 20 + 170 + 476 + 0 + 0 + + + 178 + 604 + 590 + 0 + 0 + + + 4 + 205 + 208 + 0 + 0 + + + 38 + 164 + 260 + 0 + 0 + + + 407 + 641 + 641 + 6 + 0 + + + 0 + 150 + 540 + 4 + 0 + + + 70 + 119 + 102 + 0 + 0 + + + 38 + 196 + 218 + 0 + 0 + + + 4 + 324 + 250 + 0 + 0 + + + 70 + 300 + 270 + 0 + 0 + + + 0 + 180 + 450 + 0 + 0 + + + 306 + 679 + 525 + 2 + 0 + + + 0 + 735 + 485 + 1 + 0 + + + 34 + 670 + 481 + 5 + 0 + + + 70 + 98 + 124 + 0 + 0 + + + 29 + 309 + 531 + 2 + 0 + + + 70 + 217 + 197 + 0 + 0 + + + 105 + 574 + 716 + 0 + 0 + + + 205 + 171 + 250 + 0 + 0 + + + 70 + 69 + 176 + 0 + 0 + + + 70 + 233 + 481 + 0 + 0 + + + 34 + 611 + 787 + 5 + 0 + + + 1 + 187 + 433 + 0 + 0 + + + 205 + 84 + 144 + 0 + 0 + + + 70 + 56 + 216 + 0 + 0 + + + 70 + 111 + 109 + 0 + 0 + + + 34 + 684 + 703 + 2 + 0 + + + 205 + 220 + 368 + 0 + 0 + + + 70 + 189 + 226 + 0 + 0 + + + 192 + 741 + 481 + 0 + 0 + + + 70 + 317 + 421 + 0 + 0 + + + 70 + 97 + 125 + 0 + 0 + + + 70 + 212 + 382 + 0 + 0 + + + 70 + 278 + 152 + 0 + 0 + + + 407 + 714 + 576 + 5 + 0 + + + 284 + 664 + 672 + 0 + 0 + + + 272 + 500 + 467 + 2 + 0 + + + 4 + 270 + 303 + 0 + 0 + + + 205 + 326 + 344 + 0 + 0 + + + 45 + 327 + 714 + 4 + 0 + + + 205 + 263 + 311 + 0 + 0 + + + 70 + 118 + 358 + 0 + 0 + + + 280 + 520 + 449 + 6 + 0 + + + 4 + 292 + 384 + 0 + 0 + + + 10 + 467 + 435 + 6 + 0 + + + 70 + 315 + 356 + 0 + 0 + + + 196 + 338 + 601 + 0 + 0 + + + 70 + 61 + 187 + 0 + 0 + + + 1 + 279 + 590 + 0 + 0 + + + 70 + 111 + 381 + 0 + 0 + + + 70 + 110 + 104 + 0 + 0 + + + 70 + 266 + 159 + 0 + 0 + + + 205 + 240 + 341 + 0 + 0 + + + 70 + 218 + 194 + 0 + 0 + + + 38 + 54 + 212 + 0 + 0 + + + 1 + 599 + 745 + 0 + 0 + + + 0 + 613 + 525 + 0 + 0 + + + 15 + 616 + 580 + 0 + 0 + + + 10 + 466 + 436 + 0 + 0 + + + 70 + 151 + 280 + 0 + 0 + + + 217 + 596 + 540 + 1 + 0 + + + 283 + 709 + 678 + 0 + 0 + + + 112 + 315 + 645 + 0 + 0 + + + 70 + 331 + 339 + 0 + 0 + + + 0 + 735 + 533 + 3 + 0 + + + 16 + 633 + 705 + 0 + 1 + + + 278 + 519 + 450 + 6 + 0 + + + 191 + 181 + 620 + 0 + 0 + + + 597 + 746 + 479 + 2 + 0 + + + 0 + 619 + 520 + 0 + 0 + + + 0 + 614 + 839 + 7 + 0 + + + 283 + 708 + 679 + 0 + 0 + + + 204 + 164 + 258 + 5 + 0 + + + 70 + 300 + 374 + 0 + 0 + + + 0 + 204 + 656 + 0 + 0 + + + 51 + 628 + 569 + 0 + 0 + + + 0 + 413 + 492 + 6 + 0 + + + 0 + 629 + 654 + 0 + 0 + + + 597 + 672 + 479 + 6 + 0 + + + 70 + 229 + 185 + 0 + 0 + + + 285 + 470 + 497 + 0 + 0 + + + 313 + 709 + 454 + 3 + 0 + + + 1 + 361 + 563 + 0 + 0 + + + 34 + 84 + 504 + 1 + 0 + + + 1 + 298 + 682 + 2 + 0 + + + 217 + 161 + 263 + 5 + 0 + + + 597 + 673 + 531 + 4 + 0 + + + 420 + 740 + 435 + 6 + 0 + + + 150 + 666 + 536 + 0 + 1 + + + 70 + 313 + 427 + 0 + 0 + + + 72 + 620 + 576 + 1 + 0 + + + 1 + 94 + 451 + 4 + 0 + + + 51 + 572 + 685 + 0 + 0 + + + 285 + 493 + 653 + 1 + 0 + + + 597 + 730 + 441 + 0 + 0 + + + 284 + 626 + 713 + 0 + 0 + + + 20 + 533 + 604 + 2 + 0 + + + 70 + 328 + 249 + 0 + 0 + + + 34 + 218 + 613 + 0 + 0 + + + 34 + 653 + 789 + 2 + 0 + + + 45 + 203 + 553 + 2 + 0 + + + 36 + 116 + 704 + 0 + 0 + + + 1 + 77 + 551 + 0 + 0 + + + 16 + 629 + 764 + 2 + 0 + + + 0 + 286 + 710 + 0 + 0 + + + 70 + 56 + 202 + 0 + 0 + + + 22 + 602 + 683 + 4 + 0 + + + 205 + 303 + 140 + 0 + 0 + + + 205 + 279 + 152 + 0 + 0 + + + 4 + 248 + 171 + 0 + 0 + + + 70 + 171 + 248 + 0 + 0 + + + 419 + 646 + 691 + 4 + 0 + + + 70 + 268 + 419 + 0 + 0 + + + 1 + 63 + 673 + 1 + 1 + + + 70 + 265 + 160 + 0 + 0 + + + 38 + 241 + 339 + 0 + 0 + + + 70 + 232 + 484 + 0 + 0 + + + 34 + 164 + 685 + 4 + 0 + + + 21 + 274 + 488 + 0 + 0 + + + 296 + 116 + 366 + 0 + 0 + + + 0 + 624 + 628 + 6 + 0 + + + 0 + 626 + 626 + 6 + 0 + + + 70 + 50 + 227 + 0 + 0 + + + 34 + 726 + 492 + 3 + 0 + + + 37 + 635 + 703 + 0 + 0 + + + 70 + 214 + 382 + 0 + 0 + + + 70 + 250 + 327 + 0 + 0 + + + 70 + 162 + 262 + 0 + 0 + + + 360 + 578 + 678 + 4 + 0 + + + 70 + 90 + 126 + 0 + 0 + + + 70 + 335 + 244 + 0 + 0 + + + 34 + 304 + 668 + 0 + 0 + + + 72 + 618 + 578 + 0 + 0 + + + 313 + 683 + 523 + 0 + 0 + + + 145 + 469 + 433 + 4 + 0 + + + 1 + 278 + 593 + 0 + 0 + + + 1 + 214 + 625 + 1 + 1 + + + 1 + 76 + 559 + 0 + 0 + + + 1 + 170 + 661 + 0 + 0 + + + 23 + 80 + 531 + 0 + 0 + + + 36 + 118 + 693 + 6 + 0 + + + 70 + 107 + 397 + 0 + 0 + + + 285 + 475 + 492 + 0 + 0 + + + 1 + 492 + 475 + 0 + 0 + + + 151 + 536 + 436 + 2 + 0 + + + 283 + 160 + 511 + 3 + 0 + + + 0 + 625 + 658 + 0 + 0 + + + 0 + 636 + 451 + 5 + 0 + + + 524 + 713 + 451 + 0 + 0 + + + 70 + 219 + 612 + 0 + 0 + + + 1 + 164 + 256 + 1 + 1 + + + 70 + 91 + 128 + 0 + 0 + + + 70 + 104 + 112 + 0 + 0 + + + 0 + 617 + 667 + 3 + 0 + + + 70 + 247 + 170 + 0 + 0 + + + 1 + 85 + 494 + 1 + 0 + + + 283 + 478 + 489 + 0 + 0 + + + 1 + 563 + 510 + 3 + 1 + + + 284 + 652 + 684 + 0 + 0 + + + 1 + 182 + 448 + 0 + 0 + + + 1 + 128 + 637 + 0 + 0 + + + 70 + 262 + 429 + 0 + 0 + + + 37 + 477 + 490 + 0 + 0 + + + 110 + 116 + 703 + 0 + 0 + + + 33 + 426 + 674 + 0 + 0 + + + 0 + 748 + 524 + 3 + 0 + + + 70 + 319 + 636 + 1 + 0 + + + 1 + 348 + 583 + 0 + 0 + + + 42 + 204 + 551 + 0 + 0 + + + 5 + 714 + 500 + 0 + 0 + + + 38 + 314 + 358 + 0 + 0 + + + 284 + 629 + 709 + 0 + 0 + + + 7 + 649 + 604 + 2 + 0 + + + 34 + 696 + 513 + 0 + 0 + + + 284 + 671 + 716 + 2 + 0 + + + 4 + 331 + 405 + 0 + 0 + + + 313 + 480 + 487 + 0 + 0 + + + 70 + 133 + 316 + 0 + 0 + + + 1 + 281 + 585 + 0 + 0 + + + 14 + 79 + 532 + 4 + 0 + + + 284 + 454 + 447 + 2 + 0 + + + 284 + 482 + 421 + 6 + 0 + + + 23 + 632 + 565 + 0 + 0 + + + 1 + 136 + 600 + 0 + 0 + + + 205 + 292 + 144 + 0 + 0 + + + 4 + 315 + 357 + 0 + 0 + + + 70 + 202 + 404 + 0 + 0 + + + 45 + 203 + 554 + 0 + 0 + + + 70 + 198 + 568 + 0 + 0 + + + 1 + 122 + 669 + 1 + 1 + + + 70 + 179 + 235 + 0 + 0 + + + 38 + 326 + 345 + 0 + 0 + + + 70 + 230 + 489 + 0 + 0 + + + 70 + 230 + 583 + 6 + 0 + + + 1 + 295 + 688 + 4 + 0 + + + 1 + 179 + 456 + 0 + 0 + + + 70 + 187 + 225 + 0 + 0 + + + 70 + 91 + 129 + 0 + 0 + + + 191 + 185 + 608 + 0 + 0 + + + 34 + 221 + 509 + 1 + 0 + + + 151 + 529 + 442 + 6 + 0 + + + 70 + 111 + 106 + 0 + 0 + + + 308 + 503 + 571 + 0 + 0 + + + 1127 + 500 + 406 + 6 + 0 + + + 36 + 731 + 440 + 0 + 0 + + + 420 + 680 + 473 + 2 + 0 + + + 1 + 173 + 472 + 0 + 0 + + + 4 + 75 + 157 + 0 + 0 + + + 70 + 121 + 348 + 0 + 0 + + + 0 + 129 + 633 + 0 + 0 + + + 194 + 453 + 710 + 2 + 0 + + + 70 + 107 + 110 + 0 + 0 + + + 597 + 736 + 437 + 2 + 0 + + + 205 + 63 + 183 + 0 + 0 + + + 21 + 257 + 640 + 6 + 0 + + + 283 + 159 + 512 + 3 + 0 + + + 884 + 723 + 617 + 5 + 0 + + + 4 + 318 + 256 + 0 + 0 + + + 1 + 514 + 455 + 0 + 1 + + + 0 + 94 + 448 + 4 + 0 + + + 70 + 74 + 156 + 0 + 0 + + + 5 + 553 + 709 + 0 + 0 + + + 70 + 310 + 363 + 0 + 0 + + + 50 + 565 + 508 + 7 + 0 + + + 55 + 278 + 293 + 0 + 0 + + + 1 + 677 + 659 + 0 + 0 + + + 69 + 641 + 696 + 0 + 0 + + + 5 + 216 + 620 + 0 + 0 + + + 1 + 132 + 617 + 0 + 0 + + + 34 + 638 + 808 + 0 + 0 + + + 45 + 205 + 549 + 4 + 0 + + + 0 + 438 + 463 + 0 + 0 + + + 4 + 160 + 509 + 0 + 0 + + + 97 + 267 + 305 + 6 + 0 + + + 4 + 54 + 214 + 0 + 0 + + + 284 + 658 + 678 + 0 + 0 + + + 0 + 683 + 471 + 3 + 0 + + + 153 + 528 + 443 + 0 + 0 + + + 34 + 721 + 495 + 3 + 0 + + + 284 + 631 + 707 + 0 + 0 + + + 306 + 761 + 469 + 0 + 0 + + + 284 + 668 + 719 + 0 + 0 + + + 36 + 742 + 481 + 3 + 0 + + + 1 + 157 + 519 + 0 + 0 + + + 70 + 158 + 267 + 0 + 0 + + + 284 + 624 + 715 + 2 + 0 + + + 284 + 660 + 676 + 0 + 0 + + + 34 + 755 + 545 + 3 + 0 + + + 1 + 305 + 665 + 0 + 0 + + + 34 + 209 + 641 + 0 + 0 + + + 4 + 250 + 326 + 0 + 0 + + + 566 + 632 + 760 + 2 + 0 + + + 70 + 233 + 575 + 6 + 0 + + + 70 + 330 + 406 + 0 + 0 + + + 562 + 661 + 540 + 0 + 0 + + + 205 + 620 + 519 + 0 + 0 + + + 445 + 623 + 573 + 0 + 0 + + + 4 + 76 + 153 + 0 + 0 + + + 70 + 291 + 387 + 0 + 0 + + + 70 + 244 + 173 + 0 + 0 + + + 284 + 632 + 706 + 2 + 0 + + + 45 + 593 + 602 + 0 + 0 + + + 205 + 263 + 310 + 0 + 0 + + + 284 + 662 + 674 + 0 + 0 + + + 45 + 250 + 536 + 6 + 0 + + + 284 + 661 + 675 + 2 + 0 + + + 70 + 283 + 169 + 0 + 0 + + + 70 + 305 + 242 + 0 + 0 + + + 70 + 177 + 417 + 0 + 0 + + + 0 + 554 + 532 + 6 + 0 + + + 284 + 630 + 709 + 0 + 0 + + + 70 + 106 + 124 + 0 + 0 + + + 70 + 316 + 345 + 0 + 0 + + + 7 + 603 + 690 + 2 + 0 + + + 35 + 67 + 714 + 0 + 0 + + + 193 + 628 + 469 + 1 + 1 + + + 3 + 655 + 450 + 0 + 0 + + + 34 + 718 + 495 + 2 + 0 + + + 70 + 65 + 202 + 0 + 0 + + + 0 + 676 + 436 + 3 + 0 + + + 285 + 487 + 407 + 6 + 0 + + + 34 + 86 + 556 + 7 + 0 + + + 70 + 328 + 225 + 0 + 0 + + + 285 + 632 + 756 + 0 + 0 + + + 306 + 723 + 450 + 4 + 0 + + + 45 + 586 + 503 + 2 + 0 + + + 1 + 616 + 577 + 0 + 1 + + + 0 + 511 + 388 + 0 + 0 + + + 153 + 527 + 443 + 0 + 0 + + + 34 + 677 + 525 + 2 + 0 + + + 70 + 208 + 230 + 0 + 0 + + + 55 + 597 + 545 + 6 + 0 + + + 278 + 92 + 520 + 2 + 0 + + + 0 + 721 + 493 + 1 + 0 + + + 284 + 655 + 682 + 0 + 0 + + + 4 + 259 + 421 + 0 + 0 + + + 191 + 177 + 616 + 0 + 0 + + + 70 + 86 + 152 + 0 + 0 + + + 597 + 672 + 484 + 6 + 0 + + + 597 + 726 + 448 + 6 + 0 + + + 398 + 658 + 726 + 1 + 0 + + + 597 + 694 + 512 + 0 + 0 + + + 4 + 170 + 281 + 0 + 0 + + + 38 + 619 + 822 + 3 + 0 + + + 0 + 642 + 459 + 2 + 0 + + + 205 + 133 + 359 + 0 + 0 + + + 0 + 584 + 818 + 0 + 0 + + + 0 + 208 + 656 + 0 + 0 + + + 70 + 112 + 117 + 0 + 0 + + + 70 + 184 + 401 + 0 + 0 + + + 143 + 158 + 467 + 2 + 0 + + + 34 + 250 + 546 + 0 + 0 + + + 281 + 629 + 565 + 0 + 0 + + + 7 + 135 + 1468 + 0 + 0 + + + 70 + 257 + 424 + 0 + 0 + + + 70 + 181 + 264 + 0 + 0 + + + 284 + 653 + 684 + 0 + 0 + + + 284 + 671 + 712 + 2 + 0 + + + 70 + 227 + 325 + 0 + 0 + + + 3 + 601 + 743 + 0 + 0 + + + 1 + 636 + 559 + 0 + 0 + + + 4 + 71 + 187 + 0 + 0 + + + 1 + 301 + 659 + 0 + 0 + + + 1 + 157 + 471 + 0 + 0 + + + 37 + 637 + 701 + 0 + 0 + + + 0 + 708 + 675 + 1 + 0 + + + 34 + 106 + 450 + 0 + 0 + + + 285 + 633 + 755 + 0 + 0 + + + 34 + 103 + 463 + 0 + 0 + + + 23 + 111 + 666 + 4 + 0 + + + 70 + 130 + 102 + 0 + 0 + + + 313 + 485 + 481 + 0 + 0 + + + 313 + 483 + 483 + 0 + 0 + + + 21 + 260 + 658 + 6 + 0 + + + 70 + 160 + 298 + 0 + 0 + + + 113 + 495 + 657 + 0 + 0 + + + 13 + 110 + 672 + 0 + 0 + + + 70 + 176 + 420 + 0 + 0 + + + 37 + 690 + 560 + 4 + 0 + + + 4 + 146 + 327 + 0 + 0 + + + 70 + 152 + 314 + 0 + 0 + + + 72 + 130 + 569 + 3 + 0 + + + 70 + 53 + 251 + 0 + 0 + + + 70 + 265 + 411 + 0 + 0 + + + 70 + 323 + 229 + 0 + 0 + + + 21 + 275 + 497 + 2 + 0 + + + 4 + 695 + 556 + 1 + 0 + + + 205 + 172 + 430 + 0 + 0 + + + 284 + 651 + 686 + 0 + 0 + + + 70 + 63 + 211 + 0 + 0 + + + 938 + 689 + 648 + 0 + 0 + + + 4 + 166 + 287 + 0 + 0 + + + 1 + 658 + 448 + 1 + 1 + + + 1 + 162 + 456 + 0 + 0 + + + 111 + 519 + 568 + 0 + 0 + + + 70 + 147 + 324 + 0 + 0 + + + 597 + 697 + 510 + 2 + 0 + + + 34 + 669 + 486 + 5 + 0 + + + 38 + 84 + 157 + 0 + 0 + + + 284 + 492 + 403 + 6 + 0 + + + 4 + 291 + 254 + 0 + 0 + + + 34 + 736 + 483 + 3 + 0 + + + 0 + 506 + 461 + 0 + 0 + + + 284 + 628 + 711 + 0 + 0 + + + 1 + 296 + 670 + 0 + 0 + + + 597 + 672 + 529 + 6 + 0 + + + 306 + 686 + 474 + 0 + 0 + + + 45 + 213 + 511 + 0 + 0 + + + 70 + 126 + 105 + 0 + 0 + + + 452 + 614 + 579 + 0 + 0 + + + 34 + 693 + 513 + 0 + 0 + + + 70 + 114 + 116 + 0 + 0 + + + 938 + 688 + 649 + 0 + 0 + + + 718 + 743 + 520 + 2 + 0 + + + 22 + 276 + 495 + 2 + 0 + + + 37 + 685 + 519 + 4 + 0 + + + 70 + 230 + 209 + 0 + 0 + + + 1 + 703 + 680 + 0 + 0 + + + 1 + 117 + 633 + 0 + 1 + + + 23 + 101 + 476 + 0 + 0 + + + 306 + 644 + 694 + 0 + 0 + + + 3 + 197 + 552 + 0 + 0 + + + 38 + 57 + 226 + 0 + 0 + + + 205 + 56 + 230 + 0 + 0 + + + 0 + 679 + 704 + 2 + 0 + + + 306 + 750 + 515 + 3 + 0 + + + 70 + 229 + 210 + 0 + 0 + + + 45 + 212 + 513 + 4 + 0 + + + 70 + 288 + 167 + 0 + 0 + + + 393 + 658 + 632 + 0 + 0 + + + 70 + 50 + 258 + 0 + 0 + + + 143 + 407 + 3507 + 6 + 0 + + + 70 + 203 + 365 + 0 + 0 + + + 15 + 245 + 444 + 0 + 0 + + + 597 + 752 + 433 + 2 + 0 + + + 284 + 634 + 705 + 0 + 0 + + + 191 + 495 + 401 + 6 + 0 + + + 70 + 319 + 341 + 0 + 0 + + + 0 + 212 + 643 + 0 + 0 + + + 4 + 243 + 198 + 0 + 0 + + + 72 + 130 + 570 + 3 + 0 + + + 70 + 300 + 247 + 0 + 0 + + + 951 + 639 + 796 + 0 + 0 + + + 45 + 99 + 486 + 2 + 0 + + + 70 + 68 + 190 + 0 + 0 + + + 151 + 530 + 440 + 2 + 0 + + + 283 + 583 + 820 + 2 + 0 + + + 5 + 684 + 520 + 2 + 0 + + + 70 + 283 + 384 + 0 + 0 + + + 70 + 192 + 566 + 0 + 0 + + + 191 + 177 + 614 + 0 + 0 + + + 207 + 80 + 160 + 0 + 0 + + + 285 + 454 + 437 + 6 + 0 + + + 70 + 227 + 326 + 0 + 0 + + + 45 + 99 + 485 + 2 + 0 + + + 1 + 87 + 552 + 7 + 0 + + + 21 + 531 + 613 + 2 + 0 + + + 284 + 663 + 674 + 0 + 0 + + + 34 + 680 + 523 + 2 + 0 + + + 72 + 131 + 565 + 3 + 0 + + + 4 + 146 + 329 + 0 + 0 + + + 284 + 451 + 440 + 2 + 0 + + + 70 + 69 + 186 + 0 + 0 + + + 402 + 621 + 819 + 7 + 0 + + + 285 + 452 + 439 + 6 + 0 + + + 100 + 312 + 636 + 0 + 0 + + + 1 + 162 + 457 + 0 + 0 + + + 0 + 705 + 678 + 0 + 0 + + + 284 + 665 + 672 + 0 + 0 + + + 4 + 104 + 462 + 0 + 0 + + + 70 + 180 + 267 + 0 + 0 + + + 70 + 65 + 200 + 0 + 0 + + + 34 + 699 + 509 + 2 + 0 + + + 72 + 132 + 562 + 3 + 0 + + + 0 + 107 + 448 + 0 + 0 + + + 72 + 499 + 398 + 0 + 0 + + + 70 + 244 + 304 + 0 + 0 + + + 718 + 744 + 519 + 2 + 0 + + + 70 + 170 + 282 + 0 + 0 + + + 284 + 659 + 678 + 0 + 0 + + + 4 + 291 + 255 + 0 + 0 + + + 951 + 638 + 797 + 4 + 0 + + + 55 + 634 + 609 + 7 + 0 + + + 1 + 220 + 620 + 0 + 1 + + + 70 + 217 + 221 + 0 + 0 + + + 718 + 733 + 444 + 0 + 0 + + + 284 + 624 + 716 + 2 + 0 + + + 37 + 488 + 407 + 6 + 0 + + + 70 + 318 + 429 + 0 + 0 + + + 4 + 55 + 237 + 0 + 0 + + + 4 + 307 + 647 + 2 + 0 + + + 306 + 706 + 504 + 0 + 0 + + + 284 + 661 + 676 + 2 + 0 + + + 4 + 234 + 205 + 0 + 0 + + + 0 + 224 + 485 + 0 + 0 + + + 1 + 297 + 577 + 0 + 1 + + + 4 + 50 + 261 + 0 + 0 + + + 123 + 637 + 606 + 0 + 1 + + + 34 + 323 + 615 + 2 + 0 + + + 34 + 103 + 466 + 0 + 0 + + + 100 + 554 + 697 + 6 + 0 + + + 284 + 632 + 707 + 0 + 0 + + + 38 + 61 + 214 + 0 + 0 + + + 70 + 301 + 361 + 0 + 0 + + + 70 + 279 + 172 + 0 + 0 + + + 1 + 86 + 558 + 0 + 0 + + + 1 + 170 + 436 + 0 + 0 + + + 278 + 520 + 448 + 6 + 0 + + + 394 + 559 + 744 + 0 + 0 + + + 3 + 197 + 551 + 0 + 0 + + + 284 + 489 + 406 + 6 + 0 + + + 70 + 65 + 199 + 0 + 0 + + + 70 + 158 + 687 + 0 + 0 + + + 1 + 271 + 632 + 1 + 1 + + + 34 + 422 + 698 + 0 + 0 + + + 306 + 711 + 543 + 5 + 0 + + + 15 + 465 + 501 + 4 + 0 + + + 1 + 252 + 541 + 0 + 1 + + + 4 + 166 + 654 + 7 + 0 + + + 70 + 227 + 211 + 0 + 0 + + + 13 + 110 + 674 + 0 + 0 + + + 205 + 70 + 185 + 0 + 0 + + + 70 + 155 + 309 + 0 + 0 + + + 45 + 99 + 484 + 2 + 0 + + + 284 + 665 + 719 + 0 + 0 + + + 37 + 702 + 550 + 4 + 0 + + + 1 + 698 + 685 + 1 + 1 + + + 29 + 148 + 501 + 2 + 0 + + + 70 + 135 + 96 + 0 + 0 + + + 4 + 286 + 599 + 0 + 0 + + + 45 + 253 + 539 + 4 + 0 + + + 284 + 657 + 680 + 0 + 0 + + + 20 + 129 + 575 + 0 + 0 + + + 34 + 524 + 621 + 6 + 0 + + + 45 + 530 + 614 + 0 + 0 + + + 27 + 97 + 494 + 2 + 0 + + + 153 + 526 + 443 + 0 + 0 + + + 0 + 511 + 387 + 0 + 0 + + + 38 + 60 + 211 + 0 + 0 + + + 70 + 328 + 334 + 0 + 0 + + + 29 + 149 + 499 + 4 + 0 + + + 34 + 116 + 641 + 0 + 0 + + + 1 + 244 + 449 + 0 + 0 + + + 12 + 110 + 676 + 0 + 0 + + + 377 + 653 + 638 + 3 + 0 + + + 38 + 166 + 660 + 0 + 0 + + + 284 + 629 + 711 + 0 + 0 + + + 4 + 87 + 544 + 7 + 0 + + + 38 + 122 + 388 + 0 + 0 + + + 37 + 487 + 406 + 6 + 0 + + + 21 + 585 + 503 + 4 + 0 + + + 38 + 306 + 358 + 0 + 0 + + + 39 + 97 + 488 + 2 + 0 + + + 32 + 424 + 694 + 0 + 0 + + + 5 + 321 + 535 + 4 + 0 + + + 20 + 529 + 614 + 6 + 0 + + + 0 + 611 + 832 + 0 + 0 + + + 205 + 125 + 101 + 0 + 0 + + + 718 + 740 + 523 + 2 + 0 + + + 70 + 81 + 156 + 0 + 0 + + + 22 + 91 + 520 + 6 + 0 + + + 37 + 251 + 546 + 0 + 0 + + + 1 + 565 + 685 + 0 + 1 + + + 70 + 305 + 359 + 0 + 0 + + + 0 + 481 + 411 + 0 + 0 + + + 7 + 590 + 706 + 4 + 0 + + + 283 + 675 + 707 + 0 + 0 + + + 70 + 50 + 252 + 0 + 0 + + + 70 + 126 + 100 + 0 + 0 + + + 7 + 601 + 744 + 0 + 0 + + + 36 + 161 + 680 + 6 + 0 + + + 70 + 58 + 217 + 0 + 0 + + + 34 + 648 + 454 + 0 + 0 + + + 21 + 267 + 643 + 6 + 0 + + + 0 + 649 + 689 + 0 + 0 + + + 1 + 573 + 727 + 0 + 0 + + + 8 + 103 + 459 + 2 + 0 + + + 525 + 703 + 462 + 4 + 0 + + + 70 + 80 + 157 + 0 + 0 + + + 70 + 235 + 316 + 0 + 0 + + + 0 + 87 + 543 + 7 + 0 + + + 70 + 204 + 364 + 0 + 0 + + + 597 + 746 + 477 + 2 + 0 + + + 597 + 695 + 512 + 0 + 0 + + + 70 + 246 + 192 + 0 + 0 + + + 34 + 687 + 518 + 2 + 0 + + + 4 + 317 + 149 + 0 + 0 + + + 70 + 51 + 246 + 0 + 0 + + + 34 + 116 + 640 + 4 + 0 + + + 37 + 488 + 405 + 0 + 0 + + + 5 + 691 + 515 + 2 + 0 + + + 45 + 586 + 502 + 2 + 0 + + + 70 + 256 + 290 + 0 + 0 + + + 50 + 145 + 512 + 0 + 0 + + + 164 + 750 + 433 + 4 + 0 + + + 1 + 560 + 691 + 0 + 1 + + + 38 + 275 + 270 + 0 + 0 + + + 12 + 110 + 675 + 0 + 0 + + + 20 + 130 + 573 + 0 + 0 + + + 284 + 664 + 719 + 0 + 0 + + + 100 + 628 + 848 + 6 + 0 + + + 4 + 680 + 569 + 2 + 0 + + + 70 + 280 + 266 + 0 + 0 + + + 70 + 92 + 139 + 0 + 0 + + + 38 + 223 + 334 + 0 + 0 + + + 938 + 691 + 647 + 0 + 0 + + + 281 + 628 + 567 + 0 + 0 + + + 219 + 116 + 407 + 0 + 0 + + + 313 + 482 + 483 + 0 + 0 + + + 70 + 71 + 180 + 0 + 0 + + + 4 + 258 + 183 + 0 + 0 + + + 1 + 684 + 698 + 0 + 0 + + + 1 + 578 + 826 + 1 + 0 + + + 70 + 277 + 395 + 0 + 0 + + + 54 + 222 + 618 + 0 + 0 + + + 284 + 627 + 713 + 0 + 0 + + + 88 + 200 + 547 + 0 + 0 + + + 70 + 138 + 342 + 0 + 0 + + + 597 + 672 + 438 + 6 + 0 + + + 0 + 712 + 456 + 3 + 0 + + + 20 + 620 + 624 + 4 + 0 + + + 21 + 260 + 660 + 4 + 0 + + + 1 + 146 + 510 + 0 + 1 + + + 70 + 159 + 688 + 0 + 0 + + + 205 + 195 + 242 + 0 + 0 + + + 4 + 264 + 282 + 0 + 0 + + + 191 + 177 + 618 + 0 + 0 + + + 45 + 326 + 714 + 4 + 0 + + + 34 + 682 + 700 + 0 + 0 + + + 70 + 70 + 182 + 0 + 0 + + + 8 + 103 + 458 + 1 + 0 + + + 20 + 88 + 536 + 0 + 0 + + + 37 + 486 + 407 + 6 + 0 + + + 70 + 237 + 199 + 0 + 0 + + + 565 + 463 + 3399 + 4 + 0 + + + 34 + 668 + 486 + 5 + 0 + + + 32 + 73 + 646 + 0 + 0 + + + 1 + 611 + 682 + 0 + 1 + + + 1183 + 91 + 518 + 6 + 0 + + + 1 + 618 + 626 + 0 + 0 + + + 5 + 542 + 599 + 0 + 0 + + + 72 + 131 + 568 + 7 + 0 + + + 205 + 284 + 262 + 0 + 0 + + + 100 + 311 + 636 + 0 + 0 + + + 1 + 142 + 524 + 0 + 1 + + + 45 + 214 + 511 + 0 + 0 + + + 34 + 83 + 568 + 7 + 0 + + + 205 + 178 + 418 + 0 + 0 + + + 1 + 599 + 542 + 6 + 0 + + + 70 + 204 + 536 + 0 + 0 + + + 46 + 97 + 486 + 0 + 0 + + + 445 + 630 + 614 + 2 + 0 + + + 70 + 328 + 418 + 0 + 0 + + + 21 + 277 + 495 + 2 + 0 + + + 377 + 658 + 541 + 2 + 0 + + + 3 + 197 + 555 + 0 + 0 + + + 34 + 636 + 799 + 0 + 0 + + + 70 + 76 + 167 + 0 + 0 + + + 284 + 492 + 402 + 6 + 0 + + + 306 + 737 + 483 + 6 + 0 + + + 205 + 231 + 322 + 0 + 0 + + + 36 + 161 + 679 + 6 + 0 + + + 308 + 570 + 731 + 0 + 0 + + + 1 + 580 + 823 + 0 + 0 + + + 283 + 507 + 459 + 0 + 0 + + + 70 + 175 + 425 + 0 + 0 + + + 37 + 654 + 450 + 2 + 0 + + + 29 + 148 + 504 + 2 + 0 + + + 37 + 689 + 517 + 4 + 0 + + + 283 + 451 + 439 + 4 + 0 + + + 70 + 155 + 307 + 0 + 0 + + + 306 + 711 + 501 + 0 + 0 + + + 97 + 654 + 777 + 0 + 0 + + + 376 + 588 + 500 + 0 + 0 + + + 718 + 741 + 522 + 2 + 0 + + + 70 + 325 + 421 + 0 + 0 + + + 70 + 297 + 368 + 0 + 0 + + + 36 + 739 + 482 + 4 + 0 + + + 70 + 106 + 117 + 0 + 0 + + + 70 + 238 + 200 + 0 + 0 + + + 4 + 112 + 425 + 0 + 0 + + + 1 + 107 + 445 + 0 + 0 + + + 191 + 495 + 400 + 6 + 0 + + + 445 + 687 + 563 + 6 + 0 + + + 70 + 260 + 287 + 0 + 0 + + + 284 + 658 + 680 + 0 + 0 + + + 4 + 680 + 658 + 0 + 0 + + + 12 + 668 + 579 + 6 + 0 + + + 284 + 666 + 717 + 0 + 0 + + + 4 + 312 + 239 + 0 + 0 + + + 205 + 201 + 371 + 0 + 0 + + + 208 + 116 + 410 + 2 + 0 + + + 597 + 697 + 511 + 2 + 0 + + + 70 + 260 + 183 + 0 + 0 + + + 45 + 213 + 513 + 4 + 0 + + + 0 + 627 + 664 + 0 + 0 + + + 32 + 71 + 670 + 6 + 0 + + + 70 + 68 + 182 + 0 + 0 + + + 597 + 672 + 530 + 6 + 0 + + + 284 + 624 + 717 + 2 + 0 + + + 50 + 145 + 514 + 0 + 0 + + + 1 + 88 + 540 + 7 + 0 + + + 70 + 274 + 272 + 0 + 0 + + + 20 + 161 + 463 + 0 + 0 + + + 70 + 92 + 134 + 0 + 0 + + + 38 + 104 + 457 + 0 + 0 + + + 1 + 89 + 534 + 1 + 1 + + + 284 + 657 + 681 + 2 + 0 + + + 0 + 164 + 666 + 0 + 0 + + + 43 + 97 + 490 + 4 + 0 + + + 34 + 414 + 710 + 0 + 0 + + + 283 + 454 + 436 + 6 + 0 + + + 7 + 593 + 702 + 2 + 0 + + + 284 + 656 + 682 + 0 + 0 + + + 0 + 707 + 547 + 1 + 0 + + + 8 + 627 + 568 + 0 + 0 + + + 70 + 283 + 168 + 0 + 0 + + + 70 + 185 + 403 + 0 + 0 + + + 38 + 69 + 179 + 0 + 0 + + + 70 + 306 + 357 + 0 + 0 + + + 36 + 606 + 485 + 4 + 0 + + + 36 + 659 + 446 + 0 + 0 + + + 284 + 631 + 709 + 0 + 0 + + + 70 + 82 + 150 + 0 + 0 + + + 34 + 650 + 500 + 0 + 0 + + + 206 + 682 + 567 + 6 + 0 + + + 284 + 655 + 683 + 2 + 0 + + + 70 + 115 + 107 + 0 + 0 + + + 139 + 216 + 633 + 2 + 0 + + + 1 + 87 + 546 + 7 + 0 + + + 377 + 653 + 778 + 3 + 0 + + + 3 + 558 + 693 + 0 + 0 + + + 26 + 456 + 434 + 2 + 0 + + + 205 + 207 + 360 + 0 + 0 + + + 0 + 120 + 621 + 0 + 0 + + + 70 + 335 + 326 + 0 + 0 + + + 36 + 525 + 619 + 6 + 0 + + + 70 + 140 + 339 + 0 + 0 + + + 285 + 488 + 406 + 6 + 0 + + + 283 + 579 + 825 + 2 + 0 + + + 51 + 562 + 688 + 2 + 0 + + + 284 + 654 + 684 + 0 + 0 + + + 72 + 133 + 562 + 3 + 0 + + + 0 + 708 + 459 + 3 + 0 + + + 565 + 727 + 447 + 4 + 0 + + + 34 + 760 + 548 + 3 + 0 + + + 153 + 525 + 443 + 0 + 0 + + + 402 + 618 + 822 + 4 + 0 + + + 70 + 48 + 261 + 0 + 0 + + + 22 + 276 + 496 + 2 + 0 + + + 1 + 169 + 442 + 0 + 0 + + + 1 + 248 + 552 + 0 + 0 + + + 306 + 716 + 540 + 1 + 0 + + + 36 + 160 + 682 + 3 + 0 + + + 70 + 170 + 279 + 0 + 0 + + + 4 + 102 + 465 + 0 + 0 + + + 20 + 248 + 440 + 6 + 0 + + + 70 + 120 + 104 + 0 + 0 + + + 407 + 727 + 657 + 6 + 0 + + + 72 + 132 + 566 + 3 + 0 + + + 72 + 499 + 397 + 0 + 0 + + + 278 + 608 + 586 + 4 + 0 + + + 425 + 711 + 457 + 2 + 0 + + + 70 + 322 + 232 + 0 + 0 + + + 70 + 326 + 420 + 0 + 0 + + + 284 + 489 + 405 + 6 + 0 + + + 193 + 620 + 474 + 3 + 1 + + + 38 + 183 + 259 + 0 + 0 + + + 7 + 589 + 707 + 6 + 0 + + + 0 + 630 + 661 + 0 + 0 + + + 1 + 87 + 545 + 7 + 0 + + + 34 + 652 + 451 + 0 + 0 + + + 272 + 500 + 465 + 2 + 0 + + + 284 + 652 + 686 + 0 + 0 + + + 70 + 219 + 341 + 0 + 0 + + + 72 + 131 + 570 + 7 + 0 + + + 37 + 475 + 684 + 4 + 0 + + + 0 + 620 + 524 + 0 + 0 + + + 0 + 513 + 386 + 0 + 0 + + + 3 + 566 + 683 + 0 + 0 + + + 34 + 733 + 486 + 3 + 0 + + + 70 + 190 + 574 + 6 + 0 + + + 70 + 125 + 379 + 0 + 0 + + + 38 + 165 + 661 + 0 + 0 + + + 1 + 610 + 584 + 1 + 1 + + + 113 + 493 + 659 + 0 + 0 + + + 4 + 166 + 657 + 2 + 0 + + + 0 + 676 + 527 + 1 + 0 + + + 70 + 128 + 370 + 0 + 0 + + + 30 + 71 + 667 + 6 + 0 + + + 70 + 199 + 238 + 0 + 0 + + + 0 + 764 + 506 + 3 + 0 + + + 718 + 742 + 521 + 2 + 0 + + + 597 + 752 + 432 + 2 + 0 + + + 70 + 248 + 301 + 0 + 0 + + + 70 + 122 + 102 + 0 + 0 + + + 938 + 687 + 651 + 0 + 0 + + + 70 + 282 + 168 + 0 + 0 + + + 1 + 143 + 522 + 0 + 1 + + + 597 + 728 + 531 + 4 + 0 + + + 284 + 667 + 716 + 2 + 0 + + + 597 + 692 + 512 + 0 + 0 + + + 70 + 260 + 423 + 0 + 0 + + + 193 + 627 + 468 + 3 + 1 + + + 38 + 75 + 188 + 0 + 0 + + + 70 + 316 + 348 + 0 + 0 + + + 37 + 654 + 449 + 0 + 0 + + + 0 + 117 + 639 + 0 + 0 + + + 70 + 161 + 303 + 0 + 0 + + + 420 + 688 + 515 + 0 + 0 + + + 1 + 120 + 623 + 0 + 0 + + + 718 + 727 + 446 + 2 + 0 + + + 313 + 480 + 484 + 0 + 0 + + + 4 + 229 + 213 + 0 + 0 + + + 26 + 71 + 687 + 0 + 0 + + + 38 + 178 + 274 + 0 + 0 + + + 70 + 323 + 151 + 0 + 0 + + + 21 + 325 + 715 + 0 + 0 + + + 70 + 285 + 386 + 0 + 0 + + + 597 + 672 + 437 + 6 + 0 + + + 4 + 105 + 465 + 0 + 0 + + + 1 + 103 + 474 + 1 + 1 + + + 556 + 93 + 525 + 2 + 0 + + + 22 + 681 + 566 + 2 + 0 + + + 21 + 585 + 502 + 6 + 0 + + + 70 + 144 + 339 + 0 + 0 + + + 70 + 267 + 412 + 0 + 0 + + + 38 + 737 + 523 + 2 + 0 + + + 597 + 746 + 475 + 2 + 0 + + + 284 + 635 + 705 + 0 + 0 + + + 1 + 249 + 544 + 0 + 0 + + + 70 + 317 + 347 + 0 + 0 + + + 285 + 488 + 404 + 0 + 0 + + + 55 + 657 + 447 + 2 + 0 + + + 283 + 521 + 446 + 0 + 0 + + + 597 + 732 + 443 + 4 + 0 + + + 1 + 213 + 636 + 0 + 0 + + + 205 + 243 + 308 + 0 + 0 + + + 55 + 634 + 608 + 1 + 0 + + + 36 + 660 + 445 + 0 + 0 + + + 34 + 683 + 701 + 2 + 0 + + + 306 + 754 + 470 + 0 + 0 + + + 36 + 663 + 443 + 0 + 0 + + + 4 + 299 + 368 + 0 + 0 + + + 70 + 95 + 149 + 0 + 0 + + + 70 + 69 + 205 + 0 + 0 + + + 70 + 209 + 358 + 0 + 0 + + + 70 + 218 + 224 + 0 + 0 + + + 70 + 224 + 334 + 0 + 0 + + + 597 + 726 + 531 + 4 + 0 + + + 3 + 590 + 707 + 4 + 0 + + + 45 + 101 + 484 + 6 + 0 + + + 285 + 487 + 405 + 0 + 0 + + + 70 + 94 + 151 + 0 + 0 + + + 0 + 206 + 658 + 0 + 0 + + + 20 + 293 + 581 + 0 + 0 + + + 70 + 121 + 404 + 0 + 0 + + + 70 + 91 + 156 + 0 + 0 + + + 1 + 621 + 721 + 1 + 0 + + + 20 + 85 + 575 + 0 + 0 + + + 0 + 547 + 537 + 6 + 0 + + + 0 + 764 + 546 + 3 + 0 + + + 207 + 86 + 165 + 0 + 0 + + + 1 + 346 + 570 + 0 + 0 + + + 1 + 89 + 549 + 7 + 0 + + + 0 + 579 + 827 + 4 + 0 + + + 419 + 716 + 453 + 2 + 0 + + + 284 + 666 + 719 + 0 + 0 + + + 4 + 93 + 153 + 0 + 0 + + + 283 + 695 + 689 + 0 + 0 + + + 70 + 133 + 107 + 0 + 0 + + + 313 + 679 + 522 + 3 + 0 + + + 0 + 543 + 541 + 6 + 0 + + + 4 + 696 + 688 + 0 + 0 + + + 284 + 661 + 677 + 2 + 0 + + + 34 + 88 + 553 + 7 + 0 + + + 70 + 227 + 330 + 0 + 0 + + + 70 + 319 + 425 + 0 + 0 + + + 34 + 680 + 432 + 3 + 0 + + + 70 + 138 + 103 + 0 + 0 + + + 5 + 740 + 438 + 4 + 0 + + + 70 + 74 + 192 + 0 + 0 + + + 70 + 134 + 363 + 0 + 0 + + + 286 + 516 + 450 + 0 + 0 + + + 34 + 87 + 559 + 7 + 0 + + + 70 + 90 + 158 + 0 + 0 + + + 306 + 698 + 552 + 1 + 0 + + + 1 + 243 + 452 + 0 + 0 + + + 37 + 707 + 545 + 6 + 0 + + + 120 + 642 + 600 + 0 + 1 + + + 70 + 295 + 254 + 0 + 0 + + + 1 + 118 + 635 + 0 + 0 + + + 45 + 253 + 536 + 0 + 0 + + + 0 + 650 + 452 + 5 + 0 + + + 70 + 602 + 693 + 4 + 0 + + + 70 + 207 + 362 + 0 + 0 + + + 1 + 247 + 549 + 0 + 0 + + + 284 + 633 + 707 + 0 + 0 + + + 597 + 735 + 441 + 0 + 0 + + + 284 + 492 + 401 + 6 + 0 + + + 284 + 664 + 674 + 0 + 0 + + + 70 + 208 + 234 + 0 + 0 + + + 205 + 89 + 160 + 0 + 0 + + + 70 + 57 + 250 + 0 + 0 + + + 4 + 333 + 225 + 0 + 0 + + + 3 + 682 + 565 + 2 + 0 + + + 0 + 227 + 484 + 0 + 0 + + + 36 + 522 + 621 + 6 + 0 + + + 0 + 604 + 638 + 3 + 0 + + + 284 + 666 + 672 + 0 + 0 + + + 109 + 161 + 465 + 0 + 1 + + + 278 + 274 + 495 + 2 + 0 + + + 285 + 486 + 406 + 6 + 0 + + + 3 + 198 + 555 + 0 + 0 + + + 25 + 428 + 461 + 4 + 0 + + + 4 + 239 + 204 + 0 + 0 + + + 306 + 731 + 485 + 1 + 0 + + + 34 + 88 + 554 + 7 + 0 + + + 70 + 230 + 212 + 0 + 0 + + + 70 + 265 + 184 + 0 + 0 + + + 284 + 668 + 717 + 0 + 0 + + + 284 + 626 + 715 + 2 + 0 + + + 70 + 706 + 634 + 0 + 0 + + + 1 + 163 + 460 + 0 + 0 + + + 34 + 160 + 687 + 6 + 0 + + + 70 + 279 + 394 + 0 + 0 + + + 70 + 149 + 96 + 0 + 0 + + + 0 + 229 + 480 + 0 + 0 + + + 72 + 132 + 568 + 3 + 0 + + + 1 + 168 + 653 + 6 + 0 + + + 21 + 619 + 474 + 0 + 0 + + + 34 + 322 + 613 + 2 + 0 + + + 1 + 505 + 581 + 0 + 0 + + + 70 + 228 + 329 + 0 + 0 + + + 34 + 652 + 450 + 0 + 0 + + + 205 + 85 + 163 + 0 + 0 + + + 70 + 327 + 150 + 0 + 0 + + + 0 + 89 + 551 + 7 + 0 + + + 285 + 485 + 407 + 6 + 0 + + + 284 + 630 + 711 + 0 + 0 + + + 34 + 720 + 535 + 0 + 0 + + + 191 + 177 + 620 + 0 + 0 + + + 597 + 726 + 447 + 6 + 0 + + + 213 + 663 + 581 + 6 + 0 + + + 32 + 74 + 663 + 0 + 0 + + + 70 + 221 + 222 + 0 + 0 + + + 146 + 160 + 469 + 2 + 0 + + + 139 + 148 + 507 + 6 + 0 + + + 70 + 268 + 280 + 0 + 0 + + + 70 + 280 + 268 + 0 + 0 + + + 70 + 303 + 162 + 0 + 0 + + + 21 + 588 + 499 + 0 + 0 + + + 104 + 308 + 641 + 0 + 0 + + + 34 + 712 + 541 + 1 + 0 + + + 70 + 133 + 369 + 0 + 0 + + + 1 + 296 + 667 + 0 + 0 + + + 70 + 243 + 309 + 0 + 0 + + + 34 + 679 + 478 + 3 + 0 + + + 153 + 524 + 443 + 0 + 0 + + + 70 + 100 + 139 + 0 + 0 + + + 70 + 139 + 100 + 0 + 0 + + + 286 + 517 + 449 + 0 + 0 + + + 205 + 274 + 274 + 0 + 0 + + + 284 + 653 + 686 + 0 + 0 + + + 0 + 347 + 669 + 0 + 0 + + + 34 + 160 + 686 + 0 + 0 + + + 1 + 605 + 689 + 1 + 1 + + + 0 + 301 + 656 + 0 + 0 + + + 8 + 107 + 459 + 0 + 0 + + + 215 + 122 + 114 + 7 + 0 + + + 1 + 655 + 448 + 1 + 1 + + + 284 + 670 + 715 + 0 + 0 + + + 45 + 214 + 513 + 4 + 0 + + + 1 + 212 + 638 + 0 + 0 + + + 284 + 671 + 714 + 2 + 0 + + + 70 + 229 + 328 + 0 + 0 + + + 72 + 132 + 569 + 3 + 0 + + + 70 + 203 + 370 + 0 + 0 + + + 1 + 90 + 546 + 7 + 0 + + + 597 + 672 + 483 + 6 + 0 + + + 45 + 251 + 539 + 4 + 0 + + + 70 + 156 + 315 + 0 + 0 + + + 284 + 628 + 713 + 2 + 0 + + + 70 + 128 + 109 + 0 + 0 + + + 0 + 626 + 666 + 0 + 0 + + + 284 + 453 + 436 + 0 + 0 + + + 444 + 593 + 547 + 2 + 0 + + + 29 + 320 + 532 + 4 + 0 + + + 35 + 78 + 627 + 0 + 0 + + + 34 + 708 + 501 + 2 + 0 + + + 445 + 630 + 563 + 6 + 0 + + + 70 + 89 + 157 + 0 + 0 + + + 37 + 452 + 437 + 6 + 0 + + + 38 + 307 + 357 + 0 + 0 + + + 1 + 118 + 637 + 0 + 0 + + + 70 + 52 + 269 + 0 + 0 + + + 205 + 162 + 464 + 0 + 0 + + + 284 + 451 + 438 + 6 + 0 + + + 34 + 160 + 685 + 6 + 0 + + + 70 + 208 + 527 + 0 + 0 + + + 1 + 248 + 442 + 0 + 0 + + + 110 + 515 + 570 + 0 + 0 + + + 70 + 290 + 378 + 0 + 0 + + + 113 + 493 + 658 + 0 + 0 + + + 284 + 489 + 404 + 6 + 0 + + + 3 + 274 + 494 + 2 + 0 + + + 284 + 450 + 439 + 4 + 0 + + + 70 + 144 + 340 + 0 + 0 + + + 216 + 124 + 113 + 7 + 0 + + + 146 + 160 + 470 + 6 + 0 + + + 70 + 235 + 576 + 6 + 0 + + + 34 + 161 + 681 + 4 + 0 + + + 597 + 697 + 509 + 2 + 0 + + + 38 + 733 + 484 + 2 + 0 + + + 70 + 61 + 230 + 0 + 0 + + + 20 + 158 + 476 + 0 + 0 + + + 45 + 586 + 501 + 2 + 0 + + + 445 + 684 + 563 + 6 + 0 + + + 45 + 547 + 704 + 4 + 0 + + + 34 + 603 + 538 + 6 + 0 + + + 100 + 625 + 855 + 6 + 0 + + + 20 + 115 + 426 + 0 + 0 + + + 45 + 101 + 485 + 6 + 0 + + + 973 + 645 + 790 + 2 + 0 + + + 7 + 559 + 689 + 0 + 0 + + + 70 + 250 + 196 + 0 + 0 + + + 70 + 76 + 185 + 0 + 0 + + + 70 + 198 + 380 + 0 + 0 + + + 4 + 48 + 293 + 0 + 0 + + + 1 + 169 + 649 + 5 + 0 + + + 37 + 199 + 551 + 0 + 1 + + + 205 + 175 + 430 + 0 + 0 + + + 0 + 763 + 465 + 0 + 0 + + + 70 + 323 + 233 + 0 + 0 + + + 70 + 127 + 386 + 0 + 0 + + + 13 + 689 + 650 + 0 + 0 + + + 55 + 217 + 624 + 0 + 0 + + + 205 + 215 + 228 + 0 + 0 + + + 45 + 325 + 714 + 4 + 0 + + + 51 + 580 + 664 + 2 + 0 + + + 1 + 169 + 654 + 0 + 0 + + + 3 + 615 + 577 + 0 + 0 + + + 45 + 99 + 488 + 2 + 0 + + + 4 + 280 + 269 + 0 + 0 + + + 285 + 488 + 403 + 0 + 0 + + + 205 + 92 + 148 + 0 + 0 + + + 284 + 661 + 678 + 2 + 0 + + + 284 + 663 + 676 + 0 + 0 + + + 72 + 134 + 562 + 3 + 0 + + + 283 + 451 + 436 + 6 + 0 + + + 420 + 714 + 497 + 6 + 0 + + + 4 + 688 + 561 + 2 + 0 + + + 70 + 50 + 272 + 0 + 0 + + + 176 + 66 + 729 + 1 + 1 + + + 1 + 594 + 703 + 1 + 1 + + + 4 + 282 + 267 + 0 + 0 + + + 38 + 267 + 282 + 0 + 0 + + + 597 + 672 + 528 + 6 + 0 + + + 34 + 257 + 529 + 0 + 0 + + + 313 + 673 + 481 + 3 + 0 + + + 597 + 693 + 512 + 0 + 0 + + + 72 + 133 + 566 + 7 + 0 + + + 23 + 101 + 478 + 0 + 0 + + + 884 + 724 + 619 + 3 + 0 + + + 70 + 279 + 173 + 0 + 0 + + + 48 + 273 + 625 + 6 + 0 + + + 70 + 306 + 246 + 0 + 0 + + + 284 + 667 + 717 + 0 + 0 + + + 50 + 514 + 451 + 0 + 0 + + + 205 + 127 + 380 + 0 + 0 + + + 397 + 569 + 734 + 0 + 0 + + + 284 + 634 + 707 + 0 + 0 + + + 38 + 118 + 116 + 0 + 0 + + + 284 + 667 + 672 + 0 + 0 + + + 70 + 174 + 278 + 0 + 0 + + + 34 + 760 + 467 + 3 + 0 + + + 72 + 132 + 571 + 7 + 0 + + + 283 + 577 + 829 + 2 + 0 + + + 284 + 669 + 715 + 0 + 0 + + + 597 + 731 + 443 + 4 + 0 + + + 1 + 251 + 542 + 0 + 0 + + + 597 + 727 + 531 + 4 + 0 + + + 192 + 741 + 479 + 0 + 0 + + + 286 + 524 + 618 + 0 + 0 + + + 70 + 237 + 574 + 6 + 0 + + + 4 + 227 + 213 + 0 + 0 + + + 1 + 168 + 658 + 0 + 0 + + + 100 + 553 + 698 + 0 + 0 + + + 36 + 636 + 461 + 2 + 0 + + + 70 + 131 + 369 + 0 + 0 + + + 70 + 335 + 330 + 0 + 0 + + + 0 + 89 + 543 + 7 + 0 + + + 284 + 626 + 716 + 2 + 0 + + + 284 + 448 + 439 + 4 + 0 + + + 21 + 277 + 491 + 0 + 0 + + + 1 + 650 + 546 + 0 + 0 + + + 34 + 614 + 730 + 0 + 0 + + + 284 + 665 + 674 + 0 + 0 + + + 4 + 310 + 243 + 0 + 0 + + + 4 + 186 + 405 + 0 + 0 + + + 394 + 632 + 806 + 0 + 0 + + + 34 + 503 + 461 + 0 + 0 + + + 3 + 349 + 664 + 2 + 0 + + + 70 + 230 + 328 + 0 + 0 + + + 6 + 422 + 695 + 2 + 0 + + + 284 + 624 + 718 + 2 + 0 + + + 313 + 744 + 435 + 3 + 0 + + + 313 + 710 + 500 + 3 + 0 + + + 0 + 601 + 642 + 3 + 0 + + + 1 + 168 + 449 + 0 + 0 + + + 0 + 639 + 459 + 2 + 0 + + + 306 + 723 + 491 + 1 + 0 + + + 34 + 211 + 645 + 0 + 0 + + + 70 + 214 + 225 + 0 + 0 + + + 45 + 548 + 704 + 4 + 0 + + + 36 + 632 + 464 + 2 + 0 + + + 70 + 121 + 398 + 0 + 0 + + + 7 + 295 + 578 + 4 + 0 + + + 284 + 655 + 684 + 0 + 0 + + + 938 + 684 + 655 + 1 + 0 + + + 207 + 83 + 165 + 5 + 0 + + + 70 + 248 + 304 + 0 + 0 + + + 37 + 487 + 404 + 0 + 0 + + + 70 + 126 + 382 + 0 + 0 + + + 0 + 755 + 511 + 3 + 0 + + + 4 + 145 + 332 + 0 + 0 + + + 951 + 639 + 797 + 4 + 0 + + + 21 + 267 + 639 + 4 + 0 + + + 25 + 102 + 473 + 0 + 0 + + + 597 + 734 + 441 + 0 + 0 + + + 294 + 475 + 488 + 0 + 0 + + + 143 + 161 + 469 + 4 + 0 + + + 70 + 98 + 141 + 0 + 0 + + + 100 + 310 + 635 + 0 + 0 + + + 718 + 745 + 518 + 2 + 0 + + + 45 + 427 + 461 + 0 + 0 + + + 4 + 176 + 274 + 0 + 0 + + + 0 + 633 + 660 + 0 + 0 + + + 284 + 659 + 680 + 0 + 0 + + + 3 + 91 + 530 + 6 + 0 + + + 0 + 206 + 661 + 0 + 0 + + + 34 + 161 + 686 + 1 + 0 + + + 70 + 268 + 412 + 0 + 0 + + + 45 + 99 + 487 + 2 + 0 + + + 37 + 486 + 405 + 0 + 0 + + + 100 + 71 + 679 + 2 + 0 + + + 5 + 303 + 563 + 0 + 0 + + + 4 + 171 + 282 + 0 + 0 + + + 1 + 682 + 657 + 0 + 0 + + + 1 + 111 + 680 + 0 + 0 + + + 283 + 582 + 822 + 6 + 0 + + + 70 + 164 + 294 + 0 + 0 + + + 70 + 270 + 409 + 0 + 0 + + + 70 + 123 + 392 + 0 + 0 + + + 284 + 657 + 682 + 2 + 0 + + + 718 + 729 + 444 + 2 + 0 + + + 4 + 105 + 459 + 0 + 0 + + + 205 + 139 + 99 + 0 + 0 + + + 284 + 492 + 400 + 6 + 0 + + + 284 + 632 + 709 + 0 + 0 + + + 191 + 181 + 610 + 0 + 0 + + + 38 + 313 + 154 + 0 + 0 + + + 284 + 671 + 713 + 2 + 0 + + + 164 + 749 + 474 + 3 + 0 + + + 70 + 204 + 238 + 0 + 0 + + + 101 + 555 + 695 + 0 + 0 + + + 155 + 265 + 645 + 2 + 0 + + + 70 + 234 + 580 + 6 + 0 + + + 70 + 207 + 365 + 0 + 0 + + + 70 + 221 + 342 + 0 + 0 + + + 445 + 623 + 570 + 0 + 0 + + + 34 + 648 + 452 + 0 + 0 + + + 4 + 70 + 191 + 0 + 0 + + + 0 + 709 + 544 + 1 + 0 + + + 37 + 485 + 406 + 6 + 0 + + + 205 + 228 + 213 + 0 + 0 + + + 597 + 746 + 517 + 2 + 0 + + + 70 + 314 + 351 + 0 + 0 + + + 70 + 254 + 191 + 0 + 0 + + + 597 + 746 + 476 + 2 + 0 + + + 45 + 428 + 460 + 2 + 0 + + + 284 + 628 + 714 + 2 + 0 + + + 72 + 133 + 568 + 3 + 0 + + + 4 + 214 + 353 + 0 + 0 + + + 4 + 230 + 211 + 0 + 0 + + + 33 + 485 + 668 + 1 + 0 + + + 6 + 318 + 1505 + 0 + 0 + + + 103 + 626 + 853 + 2 + 0 + + + 97 + 731 + 571 + 0 + 0 + + + 0 + 752 + 513 + 3 + 0 + + + 205 + 170 + 286 + 0 + 0 + + + 117 + 219 + 620 + 0 + 0 + + + 420 + 745 + 435 + 6 + 0 + + + 313 + 719 + 494 + 3 + 0 + + + 70 + 223 + 218 + 0 + 0 + + + 70 + 218 + 223 + 0 + 0 + + + 394 + 657 + 775 + 0 + 0 + + + 24 + 98 + 496 + 4 + 0 + + + 4 + 281 + 173 + 0 + 0 + + + 51 + 612 + 682 + 0 + 0 + + + 4 + 92 + 146 + 0 + 0 + + + 70 + 326 + 232 + 0 + 0 + + + 0 + 227 + 486 + 0 + 0 + + + 70 + 75 + 179 + 0 + 0 + + + 0 + 687 + 517 + 1 + 0 + + + 33 + 471 + 688 + 4 + 0 + + + 37 + 633 + 756 + 0 + 0 + + + 0 + 651 + 450 + 5 + 0 + + + 70 + 49 + 273 + 0 + 0 + + + 0 + 111 + 681 + 0 + 0 + + + 34 + 90 + 540 + 7 + 0 + + + 1 + 637 + 704 + 0 + 0 + + + 70 + 189 + 400 + 0 + 0 + + + 70 + 216 + 350 + 0 + 0 + + + 70 + 210 + 360 + 0 + 0 + + + 1 + 86 + 565 + 7 + 0 + + + 70 + 285 + 387 + 0 + 0 + + + 205 + 164 + 461 + 0 + 0 + + + 205 + 48 + 279 + 0 + 0 + + + 70 + 273 + 404 + 0 + 0 + + + 278 + 275 + 494 + 2 + 0 + + + 1 + 614 + 628 + 0 + 0 + + + 4 + 89 + 544 + 7 + 0 + + + 70 + 180 + 269 + 0 + 0 + + + 70 + 276 + 399 + 0 + 0 + + + 37 + 696 + 554 + 6 + 0 + + + 161 + 326 + 710 + 0 + 0 + + + 70 + 186 + 407 + 0 + 0 + + + 70 + 48 + 281 + 0 + 0 + + + 70 + 71 + 190 + 0 + 0 + + + 70 + 234 + 207 + 0 + 0 + + + 1 + 166 + 456 + 0 + 0 + + + 34 + 698 + 464 + 3 + 0 + + + 70 + 56 + 241 + 0 + 0 + + + 205 + 226 + 335 + 0 + 0 + + + 394 + 662 + 723 + 7 + 0 + + + 121 + 295 + 579 + 0 + 0 + + + 1 + 519 + 446 + 0 + 1 + + + 205 + 100 + 135 + 0 + 0 + + + 207 + 84 + 160 + 3 + 0 + + + 38 + 105 + 128 + 0 + 0 + + + 1 + 170 + 445 + 0 + 0 + + + 70 + 320 + 344 + 0 + 0 + + + 1 + 167 + 453 + 0 + 0 + + + 70 + 171 + 283 + 0 + 0 + + + 37 + 484 + 407 + 6 + 0 + + + 0 + 751 + 473 + 0 + 0 + + + 70 + 219 + 221 + 0 + 0 + + + 70 + 118 + 114 + 0 + 0 + + + 38 + 121 + 400 + 0 + 0 + + + 45 + 586 + 500 + 2 + 0 + + + 191 + 495 + 398 + 6 + 0 + + + 70 + 116 + 116 + 0 + 0 + + + 45 + 252 + 539 + 4 + 0 + + + 597 + 736 + 440 + 2 + 0 + + + 730 + 446 + 3373 + 2 + 0 + + + 597 + 672 + 436 + 6 + 0 + + + 45 + 99 + 489 + 2 + 0 + + + 4 + 242 + 313 + 0 + 0 + + + 55 + 221 + 615 + 0 + 0 + + + 718 + 728 + 445 + 2 + 0 + + + 23 + 101 + 480 + 0 + 0 + + + 284 + 451 + 437 + 6 + 0 + + + 16 + 92 + 527 + 6 + 0 + + + 284 + 636 + 705 + 0 + 0 + + + 70 + 116 + 418 + 0 + 0 + + + 283 + 679 + 705 + 0 + 0 + + + 0 + 122 + 621 + 0 + 0 + + + 70 + 125 + 388 + 0 + 0 + + + 284 + 449 + 439 + 4 + 0 + + + 70 + 263 + 419 + 0 + 0 + + + 70 + 134 + 362 + 0 + 0 + + + 214 + 120 + 113 + 7 + 0 + + + 4 + 71 + 191 + 0 + 0 + + + 70 + 282 + 172 + 0 + 0 + + + 513 + 93 + 521 + 4 + 0 + + + 70 + 329 + 413 + 0 + 0 + + + 32 + 72 + 673 + 2 + 0 + + + 88 + 204 + 540 + 0 + 0 + + + 1 + 706 + 678 + 0 + 0 + + + 37 + 634 + 755 + 0 + 0 + + + 597 + 672 + 482 + 6 + 0 + + + 284 + 489 + 403 + 6 + 0 + + + 25 + 620 + 1562 + 4 + 0 + + + 205 + 66 + 205 + 0 + 0 + + + 284 + 452 + 436 + 0 + 0 + + + 313 + 723 + 448 + 3 + 0 + + + 34 + 212 + 641 + 0 + 0 + + + 70 + 201 + 378 + 0 + 0 + + + 285 + 470 + 492 + 0 + 0 + + + 36 + 605 + 484 + 4 + 0 + + + 205 + 287 + 159 + 0 + 0 + + + 45 + 533 + 614 + 0 + 0 + + + 261 + 588 + 498 + 4 + 0 + + + 0 + 620 + 668 + 3 + 0 + + + 70 + 329 + 231 + 0 + 0 + + + 597 + 672 + 526 + 6 + 0 + + + 34 + 300 + 668 + 0 + 0 + + + 407 + 733 + 565 + 7 + 0 + + + 34 + 753 + 550 + 3 + 0 + + + 38 + 132 + 116 + 0 + 0 + + + 22 + 86 + 531 + 6 + 0 + + + 38 + 225 + 203 + 0 + 0 + + + 445 + 690 + 563 + 6 + 0 + + + 38 + 252 + 424 + 0 + 0 + + + 37 + 472 + 490 + 0 + 0 + + + 70 + 185 + 247 + 0 + 0 + + + 597 + 672 + 487 + 6 + 0 + + + 34 + 713 + 459 + 3 + 0 + + + 34 + 522 + 561 + 0 + 0 + + + 70 + 155 + 99 + 0 + 0 + + + 22 + 667 + 530 + 2 + 0 + + + 4 + 157 + 291 + 0 + 0 + + + 1 + 317 + 533 + 1 + 1 + + + 70 + 314 + 340 + 0 + 0 + + + 0 + 763 + 509 + 3 + 0 + + + 205 + 689 + 651 + 4 + 0 + + + 55 + 264 + 640 + 6 + 0 + + + 63 + 219 + 633 + 2 + 0 + + + 208 + 643 + 604 + 2 + 0 + + + 283 + 610 + 780 + 0 + 0 + + + 0 + 642 + 456 + 2 + 0 + + + 1 + 248 + 559 + 0 + 0 + + + 4 + 165 + 647 + 0 + 0 + + + 70 + 147 + 310 + 0 + 0 + + + 34 + 764 + 542 + 3 + 0 + + + 283 + 88 + 518 + 0 + 0 + + + 0 + 111 + 684 + 0 + 0 + + + 50 + 148 + 513 + 0 + 0 + + + 70 + 191 + 559 + 6 + 0 + + + 70 + 265 + 403 + 0 + 0 + + + 283 + 591 + 759 + 0 + 0 + + + 45 + 209 + 511 + 0 + 0 + + + 100 + 628 + 852 + 6 + 0 + + + 34 + 742 + 441 + 7 + 0 + + + 284 + 630 + 712 + 2 + 0 + + + 1 + 285 + 593 + 0 + 0 + + + 0 + 605 + 642 + 3 + 0 + + + 1 + 120 + 633 + 0 + 0 + + + 4 + 117 + 390 + 0 + 0 + + + 70 + 110 + 139 + 0 + 0 + + + 70 + 125 + 365 + 0 + 0 + + + 34 + 172 + 621 + 0 + 0 + + + 0 + 673 + 707 + 2 + 0 + + + 0 + 84 + 543 + 7 + 0 + + + 34 + 658 + 723 + 0 + 0 + + + 205 + 293 + 365 + 0 + 0 + + + 36 + 606 + 483 + 4 + 0 + + + 4 + 54 + 281 + 0 + 0 + + + 1 + 160 + 474 + 0 + 0 + + + 718 + 739 + 443 + 2 + 0 + + + 284 + 657 + 683 + 2 + 0 + + + 72 + 134 + 566 + 7 + 0 + + + 284 + 671 + 709 + 2 + 0 + + + 102 + 311 + 644 + 0 + 0 + + + 209 + 555 + 746 + 1 + 0 + + + 37 + 744 + 440 + 7 + 0 + + + 306 + 642 + 699 + 0 + 0 + + + 72 + 178 + 601 + 3 + 0 + + + 70 + 107 + 428 + 0 + 0 + + + 70 + 190 + 563 + 6 + 0 + + + 37 + 252 + 550 + 0 + 0 + + + 205 + 53 + 287 + 0 + 0 + + + 0 + 122 + 622 + 0 + 0 + + + 24 + 236 + 194 + 1 + 1 + + + 145 + 286 + 2964 + 2 + 0 + + + 34 + 423 + 692 + 0 + 0 + + + 1 + 165 + 460 + 0 + 0 + + + 597 + 697 + 507 + 2 + 0 + + + 70 + 141 + 108 + 0 + 0 + + + 284 + 624 + 719 + 0 + 0 + + + 4 + 136 + 336 + 0 + 0 + + + 205 + 192 + 238 + 0 + 0 + + + 1 + 350 + 572 + 0 + 0 + + + 0 + 617 + 828 + 0 + 0 + + + 205 + 286 + 265 + 0 + 0 + + + 143 + 163 + 465 + 0 + 0 + + + 285 + 454 + 441 + 6 + 0 + + + 71 + 588 + 704 + 2 + 0 + + + 38 + 80 + 189 + 0 + 0 + + + 718 + 733 + 530 + 2 + 0 + + + 37 + 630 + 755 + 0 + 0 + + + 284 + 654 + 686 + 0 + 0 + + + 70 + 322 + 332 + 0 + 0 + + + 70 + 161 + 284 + 0 + 0 + + + 597 + 690 + 512 + 0 + 0 + + + 284 + 669 + 711 + 0 + 0 + + + 45 + 324 + 714 + 4 + 0 + + + 70 + 323 + 331 + 0 + 0 + + + 3 + 222 + 624 + 0 + 0 + + + 70 + 153 + 99 + 0 + 0 + + + 21 + 534 + 613 + 2 + 0 + + + 70 + 65 + 233 + 0 + 0 + + + 29 + 454 + 3375 + 0 + 0 + + + 70 + 247 + 307 + 0 + 0 + + + 283 + 492 + 407 + 6 + 0 + + + 55 + 568 + 684 + 0 + 0 + + + 204 + 684 + 568 + 0 + 0 + + + 284 + 451 + 444 + 2 + 0 + + + 38 + 151 + 303 + 0 + 0 + + + 37 + 101 + 453 + 0 + 0 + + + 285 + 452 + 443 + 6 + 0 + + + 597 + 731 + 531 + 4 + 0 + + + 395 + 635 + 804 + 2 + 0 + + + 70 + 216 + 353 + 0 + 0 + + + 284 + 626 + 717 + 0 + 0 + + + 4 + 151 + 304 + 0 + 0 + + + 110 + 279 + 382 + 4 + 0 + + + 36 + 671 + 436 + 2 + 0 + + + 70 + 262 + 291 + 0 + 0 + + + 217 + 132 + 114 + 6 + 0 + + + 34 + 102 + 450 + 0 + 0 + + + 284 + 663 + 677 + 2 + 0 + + + 70 + 330 + 231 + 0 + 0 + + + 1 + 121 + 630 + 0 + 0 + + + 70 + 308 + 149 + 0 + 0 + + + 4 + 154 + 298 + 0 + 0 + + + 70 + 50 + 302 + 0 + 0 + + + 597 + 741 + 442 + 4 + 0 + + + 32 + 438 + 668 + 0 + 0 + + + 261 + 399 + 503 + 0 + 0 + + + 284 + 451 + 445 + 2 + 0 + + + 7 + 145 + 526 + 6 + 0 + + + 284 + 664 + 676 + 0 + 0 + + + 1 + 561 + 692 + 1 + 1 + + + 0 + 748 + 519 + 3 + 0 + + + 4 + 328 + 325 + 0 + 0 + + + 407 + 724 + 620 + 7 + 0 + + + 38 + 252 + 423 + 0 + 0 + + + 284 + 666 + 674 + 0 + 0 + + + 208 + 178 + 258 + 0 + 0 + + + 29 + 89 + 516 + 0 + 0 + + + 36 + 662 + 442 + 2 + 0 + + + 37 + 614 + 576 + 0 + 0 + + + 1 + 81 + 566 + 0 + 0 + + + 0 + 292 + 687 + 2 + 0 + + + 313 + 685 + 478 + 3 + 0 + + + 597 + 726 + 451 + 6 + 0 + + + 216 + 135 + 111 + 7 + 0 + + + 70 + 194 + 549 + 0 + 0 + + + 0 + 513 + 391 + 0 + 0 + + + 70 + 59 + 254 + 0 + 0 + + + 284 + 633 + 709 + 0 + 0 + + + 278 + 89 + 515 + 0 + 0 + + + 0 + 628 + 659 + 0 + 0 + + + 0 + 119 + 640 + 0 + 0 + + + 70 + 140 + 107 + 0 + 0 + + + 70 + 71 + 211 + 0 + 0 + + + 72 + 136 + 560 + 3 + 0 + + + 70 + 235 + 195 + 0 + 0 + + + 0 + 299 + 671 + 0 + 0 + + + 70 + 133 + 345 + 0 + 0 + + + 23 + 651 + 503 + 6 + 0 + + + 1 + 717 + 712 + 0 + 0 + + + 34 + 685 + 695 + 0 + 0 + + + 72 + 177 + 602 + 3 + 0 + + + 284 + 660 + 680 + 0 + 0 + + + 0 + 629 + 658 + 0 + 0 + + + 4 + 181 + 421 + 0 + 0 + + + 284 + 664 + 717 + 0 + 0 + + + 70 + 312 + 147 + 0 + 0 + + + 70 + 54 + 278 + 0 + 0 + + + 34 + 686 + 694 + 0 + 0 + + + 118 + 310 + 546 + 2 + 0 + + + 284 + 661 + 679 + 2 + 0 + + + 55 + 687 + 565 + 4 + 0 + + + 193 + 626 + 467 + 3 + 1 + + + 25 + 461 + 435 + 2 + 0 + + + 70 + 284 + 268 + 0 + 0 + + + 155 + 531 + 617 + 4 + 0 + + + 72 + 134 + 568 + 3 + 0 + + + 284 + 662 + 719 + 0 + 0 + + + 597 + 746 + 474 + 2 + 0 + + + 34 + 167 + 639 + 1 + 0 + + + 718 + 734 + 529 + 2 + 0 + + + 70 + 95 + 157 + 0 + 0 + + + 70 + 236 + 195 + 0 + 0 + + + 70 + 328 + 232 + 0 + 0 + + + 4 + 295 + 258 + 0 + 0 + + + 70 + 191 + 241 + 0 + 0 + + + 284 + 482 + 416 + 6 + 0 + + + 193 + 259 + 294 + 4 + 0 + + + 70 + 299 + 357 + 0 + 0 + + + 285 + 467 + 495 + 0 + 0 + + + 97 + 700 + 680 + 4 + 0 + + + 46 + 460 + 436 + 2 + 0 + + + 70 + 76 + 197 + 0 + 0 + + + 35 + 71 + 649 + 0 + 0 + + + 718 + 738 + 444 + 2 + 0 + + + 70 + 74 + 202 + 0 + 0 + + + 70 + 230 + 331 + 0 + 0 + + + 38 + 699 + 681 + 2 + 0 + + + 58 + 617 + 474 + 6 + 0 + + + 284 + 628 + 715 + 2 + 0 + + + 72 + 177 + 603 + 3 + 0 + + + 1 + 508 + 455 + 0 + 0 + + + 284 + 668 + 672 + 0 + 0 + + + 5 + 257 + 538 + 0 + 0 + + + 2 + 117 + 650 + 0 + 0 + + + 34 + 617 + 573 + 6 + 0 + + + 0 + 676 + 523 + 1 + 0 + + + 313 + 709 + 462 + 3 + 0 + + + 36 + 153 + 697 + 4 + 0 + + + 63 + 150 + 507 + 6 + 0 + + + 0 + 735 + 481 + 1 + 0 + + + 34 + 307 + 653 + 0 + 0 + + + 6 + 136 + 1474 + 0 + 0 + + + 3 + 619 + 1565 + 4 + 0 + + + 5 + 605 + 742 + 4 + 0 + + + 70 + 64 + 232 + 0 + 0 + + + 70 + 317 + 240 + 0 + 0 + + + 70 + 240 + 317 + 0 + 0 + + + 0 + 579 + 822 + 0 + 0 + + + 1 + 505 + 579 + 0 + 0 + + + 70 + 115 + 400 + 0 + 0 + + + 4 + 184 + 250 + 0 + 0 + + + 70 + 54 + 276 + 0 + 0 + + + 4 + 147 + 313 + 0 + 0 + + + 4 + 215 + 214 + 0 + 0 + + + 0 + 755 + 548 + 3 + 0 + + + 70 + 65 + 229 + 0 + 0 + + + 1 + 566 + 731 + 0 + 0 + + + 284 + 635 + 707 + 0 + 0 + + + 8 + 583 + 666 + 0 + 1 + + + 4 + 53 + 281 + 0 + 0 + + + 38 + 186 + 409 + 0 + 0 + + + 145 + 463 + 433 + 4 + 0 + + + 70 + 334 + 414 + 0 + 0 + + + 7 + 348 + 664 + 2 + 0 + + + 1 + 347 + 665 + 1 + 1 + + + 34 + 355 + 650 + 4 + 0 + + + 34 + 654 + 447 + 0 + 0 + + + 70 + 68 + 218 + 0 + 0 + + + 0 + 684 + 695 + 0 + 0 + + + 33 + 71 + 636 + 0 + 0 + + + 70 + 95 + 156 + 0 + 0 + + + 22 + 668 + 530 + 2 + 0 + + + 70 + 173 + 261 + 0 + 0 + + + 4 + 272 + 166 + 0 + 0 + + + 70 + 136 + 332 + 0 + 0 + + + 1 + 86 + 525 + 1 + 1 + + + 38 + 234 + 327 + 0 + 0 + + + 88 + 197 + 545 + 0 + 0 + + + 70 + 101 + 147 + 0 + 0 + + + 597 + 672 + 435 + 6 + 0 + + + 58 + 490 + 408 + 6 + 0 + + + 725 + 715 + 580 + 2 + 0 + + + 284 + 663 + 717 + 0 + 0 + + + 1 + 686 + 567 + 1 + 1 + + + 70 + 53 + 280 + 0 + 0 + + + 70 + 129 + 115 + 0 + 0 + + + 283 + 611 + 778 + 0 + 0 + + + 70 + 223 + 343 + 0 + 0 + + + 34 + 81 + 557 + 7 + 0 + + + 193 + 615 + 475 + 0 + 1 + + + 205 + 267 + 169 + 0 + 0 + + + 377 + 652 + 636 + 4 + 0 + + + 152 + 522 + 442 + 4 + 0 + + + 110 + 284 + 378 + 0 + 0 + + + 0 + 403 + 496 + 6 + 0 + + + 59 + 496 + 403 + 6 + 0 + + + 38 + 292 + 262 + 0 + 0 + + + 70 + 190 + 565 + 6 + 0 + + + 70 + 108 + 418 + 0 + 0 + + + 285 + 469 + 492 + 0 + 0 + + + 22 + 85 + 531 + 6 + 0 + + + 70 + 80 + 185 + 0 + 0 + + + 34 + 711 + 547 + 1 + 0 + + + 284 + 637 + 705 + 0 + 0 + + + 45 + 210 + 511 + 0 + 0 + + + 597 + 726 + 450 + 6 + 0 + + + 310 + 718 + 493 + 0 + 0 + + + 70 + 138 + 107 + 0 + 0 + + + 4 + 283 + 599 + 0 + 0 + + + 70 + 254 + 301 + 0 + 0 + + + 36 + 739 + 479 + 1 + 0 + + + 313 + 686 + 516 + 3 + 0 + + + 402 + 620 + 823 + 1 + 0 + + + 70 + 309 + 146 + 0 + 0 + + + 38 + 271 + 396 + 0 + 0 + + + 70 + 71 + 208 + 0 + 0 + + + 113 + 495 + 660 + 0 + 0 + + + 38 + 259 + 174 + 0 + 0 + + + 511 + 86 + 524 + 0 + 0 + + + 215 + 127 + 116 + 0 + 0 + + + 0 + 519 + 385 + 0 + 0 + + + 70 + 152 + 97 + 0 + 0 + + + 143 + 407 + 3510 + 6 + 0 + + + 38 + 273 + 393 + 0 + 0 + + + 3 + 223 + 624 + 0 + 0 + + + 283 + 581 + 818 + 6 + 0 + + + 70 + 281 + 272 + 0 + 0 + + + 70 + 81 + 182 + 0 + 0 + + + 0 + 653 + 688 + 0 + 0 + + + 1 + 112 + 682 + 0 + 0 + + + 70 + 217 + 352 + 0 + 0 + + + 1 + 176 + 434 + 0 + 0 + + + 192 + 212 + 507 + 4 + 0 + + + 4 + 72 + 204 + 0 + 0 + + + 382 + 607 + 683 + 4 + 0 + + + 7 + 67 + 676 + 3 + 0 + + + 1 + 252 + 552 + 0 + 0 + + + 70 + 239 + 582 + 6 + 0 + + + 1 + 702 + 677 + 2 + 0 + + + 70 + 153 + 296 + 0 + 0 + + + 70 + 204 + 222 + 0 + 0 + + + 0 + 102 + 444 + 0 + 0 + + + 214 + 130 + 113 + 7 + 0 + + + 313 + 480 + 481 + 0 + 0 + + + 284 + 661 + 719 + 0 + 0 + + + 4 + 321 + 238 + 0 + 0 + + + 70 + 135 + 109 + 0 + 0 + + + 284 + 451 + 443 + 2 + 0 + + + 284 + 492 + 406 + 6 + 0 + + + 0 + 694 + 471 + 3 + 0 + + + 4 + 108 + 419 + 0 + 0 + + + 103 + 624 + 857 + 6 + 0 + + + 278 + 607 + 583 + 4 + 0 + + + 4 + 317 + 339 + 0 + 0 + + + 1 + 115 + 664 + 1 + 1 + + + 113 + 496 + 659 + 0 + 0 + + + 70 + 82 + 179 + 0 + 0 + + + 70 + 237 + 191 + 0 + 0 + + + 183 + 616 + 474 + 2 + 1 + + + 70 + 67 + 219 + 0 + 0 + + + 306 + 704 + 675 + 0 + 0 + + + 34 + 612 + 834 + 7 + 0 + + + 5 + 608 + 582 + 0 + 0 + + + 70 + 194 + 554 + 6 + 0 + + + 394 + 564 + 735 + 0 + 0 + + + 70 + 110 + 133 + 0 + 0 + + + 70 + 288 + 373 + 0 + 0 + + + 0 + 691 + 473 + 3 + 0 + + + 47 + 85 + 532 + 6 + 0 + + + 205 + 203 + 376 + 0 + 0 + + + 0 + 356 + 561 + 0 + 0 + + + 284 + 630 + 713 + 0 + 0 + + + 70 + 49 + 299 + 0 + 0 + + + 1 + 292 + 684 + 2 + 0 + + + 4 + 99 + 457 + 0 + 0 + + + 55 + 655 + 446 + 2 + 0 + + + 1 + 149 + 512 + 1 + 1 + + + 34 + 82 + 551 + 7 + 0 + + + 0 + 516 + 387 + 0 + 0 + + + 34 + 84 + 538 + 7 + 0 + + + 70 + 264 + 289 + 0 + 0 + + + 425 + 650 + 691 + 6 + 0 + + + 1 + 610 + 580 + 1 + 1 + + + 36 + 606 + 482 + 4 + 0 + + + 153 + 521 + 443 + 0 + 0 + + + 36 + 635 + 460 + 2 + 0 + + + 597 + 691 + 512 + 0 + 0 + + + 0 + 666 + 491 + 6 + 0 + + + 284 + 657 + 684 + 2 + 0 + + + 34 + 353 + 653 + 4 + 0 + + + 0 + 627 + 661 + 0 + 0 + + + 1 + 250 + 556 + 0 + 0 + + + 70 + 201 + 226 + 0 + 0 + + + 20 + 79 + 575 + 0 + 0 + + + 37 + 757 + 432 + 7 + 0 + + + 106 + 110 + 698 + 0 + 0 + + + 4 + 174 + 261 + 0 + 0 + + + 23 + 457 + 438 + 2 + 0 + + + 1 + 609 + 781 + 3 + 0 + + + 283 + 88 + 516 + 0 + 0 + + + 1 + 83 + 547 + 7 + 0 + + + 37 + 615 + 576 + 0 + 0 + + + 284 + 632 + 711 + 0 + 0 + + + 0 + 353 + 567 + 0 + 0 + + + 0 + 344 + 670 + 0 + 0 + + + 397 + 632 + 807 + 0 + 0 + + + 70 + 68 + 214 + 0 + 0 + + + 0 + 279 + 498 + 4 + 0 + + + 33 + 483 + 677 + 6 + 0 + + + 38 + 313 + 145 + 0 + 0 + + + 284 + 625 + 719 + 0 + 0 + + + 214 + 685 + 656 + 0 + 0 + + + 0 + 732 + 531 + 4 + 0 + + + 70 + 203 + 378 + 0 + 0 + + + 70 + 132 + 110 + 0 + 0 + + + 4 + 289 + 157 + 0 + 0 + + + 205 + 54 + 269 + 0 + 0 + + + 70 + 330 + 421 + 0 + 0 + + + 70 + 168 + 270 + 0 + 0 + + + 205 + 165 + 465 + 0 + 0 + + + 0 + 625 + 663 + 0 + 0 + + + 50 + 511 + 451 + 0 + 0 + + + 205 + 280 + 274 + 0 + 0 + + + 70 + 235 + 193 + 0 + 0 + + + 72 + 499 + 401 + 0 + 0 + + + 4 + 217 + 209 + 0 + 0 + + + 5 + 613 + 676 + 0 + 0 + + + 284 + 655 + 686 + 0 + 0 + + + 445 + 633 + 614 + 2 + 0 + + + 284 + 592 + 759 + 0 + 0 + + + 284 + 667 + 713 + 2 + 0 + + + 70 + 272 + 282 + 0 + 0 + + + 32 + 430 + 679 + 0 + 0 + + + 286 + 502 + 459 + 0 + 0 + + + 15 + 295 + 1523 + 4 + 0 + + + 35 + 73 + 621 + 0 + 0 + + + 34 + 765 + 463 + 3 + 0 + + + 34 + 752 + 471 + 3 + 0 + + + 1 + 312 + 544 + 1 + 1 + + + 215 + 128 + 113 + 0 + 0 + + + 0 + 644 + 550 + 0 + 0 + + + 205 + 261 + 410 + 0 + 0 + + + 70 + 304 + 352 + 0 + 0 + + + 284 + 634 + 709 + 0 + 0 + + + 70 + 149 + 97 + 0 + 0 + + + 70 + 146 + 99 + 0 + 0 + + + 70 + 329 + 233 + 0 + 0 + + + 70 + 275 + 390 + 0 + 0 + + + 106 + 110 + 697 + 0 + 0 + + + 597 + 672 + 527 + 6 + 0 + + + 284 + 663 + 678 + 2 + 0 + + + 70 + 132 + 345 + 0 + 0 + + + 0 + 175 + 438 + 0 + 0 + + + 70 + 236 + 193 + 0 + 0 + + + 284 + 482 + 415 + 6 + 0 + + + 45 + 323 + 714 + 4 + 0 + + + 21 + 585 + 499 + 4 + 0 + + + 420 + 681 + 520 + 0 + 0 + + + 45 + 209 + 513 + 4 + 0 + + + 284 + 661 + 680 + 0 + 0 + + + 1 + 680 + 661 + 0 + 0 + + + 4 + 309 + 248 + 0 + 0 + + + 70 + 206 + 372 + 0 + 0 + + + 4 + 648 + 600 + 4 + 0 + + + 70 + 252 + 304 + 0 + 0 + + + 7 + 591 + 701 + 4 + 0 + + + 284 + 665 + 715 + 0 + 0 + + + 1 + 242 + 443 + 1 + 1 + + + 21 + 612 + 477 + 0 + 0 + + + 29 + 320 + 531 + 4 + 0 + + + 1 + 122 + 628 + 4 + 0 + + + 55 + 656 + 445 + 3 + 0 + + + 597 + 752 + 435 + 2 + 0 + + + 143 + 164 + 467 + 6 + 0 + + + 1 + 68 + 669 + 1 + 1 + + + 597 + 740 + 442 + 4 + 0 + + + 962 + 654 + 780 + 1 + 0 + + + 279 + 88 + 517 + 2 + 0 + + + 1 + 67 + 679 + 2 + 1 + + + 34 + 251 + 553 + 0 + 0 + + + 3 + 611 + 678 + 2 + 0 + + + 70 + 116 + 392 + 0 + 0 + + + 4 + 98 + 464 + 0 + 0 + + + 71 + 85 + 535 + 2 + 0 + + + 20 + 89 + 511 + 0 + 0 + + + 72 + 137 + 559 + 3 + 0 + + + 72 + 178 + 602 + 3 + 0 + + + 70 + 322 + 431 + 0 + 0 + + + 1 + 174 + 440 + 0 + 0 + + + 240 + 257 + 661 + 0 + 0 + + + 123 + 635 + 612 + 0 + 1 + + + 70 + 188 + 570 + 6 + 0 + + + 72 + 136 + 563 + 7 + 0 + + + 1 + 619 + 628 + 6 + 0 + + + 70 + 114 + 126 + 0 + 0 + + + 597 + 697 + 508 + 2 + 0 + + + 0 + 514 + 389 + 0 + 0 + + + 0 + 623 + 624 + 6 + 0 + + + 284 + 659 + 682 + 0 + 0 + + + 70 + 50 + 287 + 0 + 0 + + + 6 + 621 + 626 + 6 + 0 + + + 1 + 222 + 625 + 1 + 1 + + + 284 + 667 + 674 + 0 + 0 + + + 284 + 627 + 717 + 0 + 0 + + + 11 + 115 + 669 + 0 + 0 + + + 34 + 667 + 489 + 5 + 0 + + + 21 + 64 + 728 + 0 + 0 + + + 34 + 104 + 448 + 0 + 0 + + + 4 + 244 + 191 + 0 + 0 + + + 0 + 177 + 609 + 0 + 0 + + + 284 + 665 + 717 + 0 + 0 + + + 34 + 593 + 550 + 6 + 0 + + + 70 + 155 + 105 + 0 + 0 + + + 1 + 606 + 685 + 0 + 1 + + + 284 + 665 + 676 + 0 + 0 + + + 70 + 140 + 333 + 0 + 0 + + + 70 + 210 + 222 + 0 + 0 + + + 70 + 163 + 286 + 0 + 0 + + + 205 + 88 + 185 + 0 + 0 + + + 37 + 454 + 439 + 6 + 0 + + + 34 + 248 + 555 + 0 + 0 + + + 193 + 610 + 478 + 0 + 1 + + + 313 + 712 + 495 + 3 + 0 + + + 70 + 125 + 373 + 0 + 0 + + + 283 + 485 + 411 + 1 + 0 + + + 398 + 669 + 765 + 7 + 0 + + + 37 + 452 + 441 + 6 + 0 + + + 38 + 57 + 286 + 0 + 0 + + + 307 + 683 + 516 + 4 + 0 + + + 70 + 163 + 100 + 0 + 0 + + + 306 + 697 + 468 + 2 + 0 + + + 70 + 319 + 338 + 0 + 0 + + + 45 + 211 + 511 + 0 + 0 + + + 284 + 669 + 672 + 0 + 0 + + + 34 + 106 + 440 + 0 + 0 + + + 70 + 182 + 423 + 0 + 0 + + + 4 + 136 + 343 + 0 + 0 + + + 23 + 98 + 476 + 0 + 0 + + + 284 + 451 + 442 + 2 + 0 + + + 35 + 77 + 606 + 0 + 0 + + + 1 + 616 + 674 + 1 + 1 + + + 7 + 244 + 442 + 4 + 0 + + + 38 + 183 + 255 + 0 + 0 + + + 70 + 239 + 576 + 6 + 0 + + + 0 + 124 + 621 + 0 + 0 + + + 38 + 280 + 275 + 0 + 0 + + + 70 + 55 + 297 + 0 + 0 + + + 70 + 327 + 421 + 0 + 0 + + + 34 + 527 + 619 + 6 + 0 + + + 395 + 484 + 674 + 1 + 0 + + + 38 + 198 + 389 + 0 + 0 + + + 70 + 194 + 556 + 6 + 0 + + + 973 + 652 + 785 + 2 + 0 + + + 285 + 467 + 493 + 0 + 0 + + + 284 + 636 + 707 + 0 + 0 + + + 718 + 738 + 525 + 2 + 0 + + + 70 + 237 + 325 + 0 + 0 + + + 284 + 628 + 716 + 2 + 0 + + + 70 + 197 + 391 + 0 + 0 + + + 420 + 750 + 435 + 6 + 0 + + + 38 + 324 + 425 + 0 + 0 + + + 1 + 315 + 633 + 2 + 0 + + + 38 + 100 + 467 + 0 + 0 + + + 34 + 208 + 662 + 0 + 0 + + + 0 + 584 + 711 + 0 + 0 + + + 0 + 632 + 657 + 0 + 0 + + + 284 + 484 + 412 + 1 + 0 + + + 284 + 667 + 715 + 2 + 0 + + + 46 + 68 + 687 + 0 + 0 + + + 4 + 230 + 335 + 0 + 0 + + + 38 + 99 + 163 + 0 + 0 + + + 70 + 311 + 347 + 0 + 0 + + + 70 + 188 + 574 + 6 + 0 + + + 284 + 663 + 719 + 0 + 0 + + + 306 + 675 + 432 + 3 + 0 + + + 1 + 280 + 491 + 0 + 1 + + + 70 + 122 + 383 + 0 + 0 + + + 70 + 74 + 218 + 0 + 0 + + + 3 + 146 + 526 + 4 + 0 + + + 4 + 48 + 336 + 0 + 0 + + + 1 + 344 + 579 + 0 + 0 + + + 70 + 214 + 359 + 0 + 0 + + + 0 + 326 + 611 + 2 + 0 + + + 308 + 544 + 536 + 6 + 0 + + + 597 + 688 + 512 + 0 + 0 + + + 1 + 637 + 553 + 0 + 0 + + + 36 + 158 + 683 + 6 + 0 + + + 1 + 611 + 534 + 6 + 0 + + + 0 + 83 + 563 + 7 + 0 + + + 70 + 184 + 254 + 0 + 0 + + + 0 + 113 + 680 + 0 + 0 + + + 294 + 471 + 489 + 0 + 0 + + + 193 + 611 + 477 + 2 + 1 + + + 205 + 648 + 790 + 2 + 0 + + + 70 + 183 + 420 + 0 + 0 + + + 313 + 677 + 482 + 3 + 0 + + + 34 + 711 + 545 + 1 + 0 + + + 5 + 745 + 438 + 4 + 0 + + + 1 + 219 + 628 + 0 + 1 + + + 34 + 84 + 557 + 7 + 0 + + + 42 + 591 + 761 + 6 + 0 + + + 4 + 73 + 222 + 0 + 0 + + + 70 + 172 + 272 + 0 + 0 + + + 70 + 295 + 366 + 0 + 0 + + + 70 + 178 + 263 + 0 + 0 + + + 261 + 588 + 496 + 4 + 0 + + + 283 + 612 + 779 + 0 + 0 + + + 597 + 672 + 434 + 6 + 0 + + + 284 + 629 + 715 + 0 + 0 + + + 12 + 667 + 581 + 6 + 0 + + + 70 + 260 + 180 + 0 + 0 + + + 34 + 723 + 536 + 0 + 0 + + + 22 + 90 + 520 + 6 + 0 + + + 383 + 520 + 443 + 4 + 0 + + + 20 + 124 + 620 + 0 + 0 + + + 0 + 715 + 542 + 1 + 0 + + + 306 + 709 + 497 + 1 + 0 + + + 284 + 492 + 405 + 6 + 0 + + + 70 + 61 + 266 + 0 + 0 + + + 70 + 162 + 289 + 0 + 0 + + + 1 + 240 + 450 + 0 + 0 + + + 70 + 200 + 540 + 0 + 0 + + + 70 + 288 + 375 + 0 + 0 + + + 33 + 438 + 666 + 0 + 0 + + + 113 + 496 + 658 + 0 + 0 + + + 70 + 181 + 425 + 0 + 0 + + + 597 + 752 + 434 + 2 + 0 + + + 0 + 694 + 687 + 0 + 0 + + + 70 + 484 + 476 + 0 + 0 + + + 38 + 63 + 258 + 0 + 0 + + + 285 + 477 + 483 + 0 + 0 + + + 23 + 98 + 478 + 0 + 0 + + + 70 + 118 + 397 + 0 + 0 + + + 33 + 436 + 669 + 0 + 0 + + + 138 + 343 + 581 + 6 + 0 + + + 70 + 149 + 109 + 0 + 0 + + + 70 + 236 + 583 + 6 + 0 + + + 38 + 314 + 344 + 0 + 0 + + + 284 + 638 + 705 + 2 + 0 + + + 70 + 214 + 219 + 0 + 0 + + + 21 + 322 + 714 + 4 + 0 + + + 420 + 680 + 480 + 6 + 0 + + + 36 + 157 + 685 + 6 + 0 + + + 38 + 106 + 442 + 0 + 0 + + + 281 + 607 + 581 + 0 + 0 + + + 285 + 475 + 484 + 0 + 0 + + + 21 + 64 + 732 + 0 + 0 + + + 70 + 192 + 244 + 0 + 0 + + + 597 + 729 + 531 + 4 + 0 + + + 284 + 671 + 711 + 2 + 0 + + + 70 + 92 + 174 + 0 + 0 + + + 283 + 482 + 414 + 6 + 0 + + + 70 + 261 + 412 + 0 + 0 + + + 70 + 310 + 347 + 0 + 0 + + + 34 + 709 + 546 + 1 + 0 + + + 70 + 81 + 579 + 0 + 0 + + + 70 + 193 + 243 + 0 + 0 + + + 3 + 591 + 702 + 4 + 0 + + + 597 + 697 + 506 + 2 + 0 + + + 1 + 603 + 746 + 0 + 1 + + + 4 + 286 + 164 + 0 + 0 + + + 36 + 606 + 481 + 4 + 0 + + + 70 + 329 + 327 + 0 + 0 + + + 72 + 499 + 400 + 0 + 0 + + + 70 + 162 + 99 + 0 + 0 + + + 70 + 319 + 147 + 0 + 0 + + + 205 + 142 + 113 + 0 + 0 + + + 153 + 519 + 443 + 4 + 0 + + + 193 + 612 + 476 + 2 + 1 + + + 206 + 684 + 566 + 7 + 0 + + + 19 + 99 + 474 + 4 + 0 + + + 1 + 176 + 439 + 0 + 0 + + + 100 + 609 + 840 + 0 + 0 + + + 1 + 265 + 635 + 0 + 0 + + + 4 + 64 + 251 + 0 + 0 + + + 1 + 294 + 679 + 2 + 0 + + + 4 + 102 + 460 + 0 + 0 + + + 5 + 627 + 761 + 0 + 0 + + + 45 + 530 + 616 + 4 + 0 + + + 70 + 296 + 261 + 0 + 0 + + + 0 + 645 + 452 + 2 + 0 + + + 205 + 281 + 167 + 0 + 0 + + + 34 + 725 + 534 + 3 + 0 + + + 34 + 721 + 537 + 0 + 0 + + + 205 + 667 + 767 + 1 + 0 + + + 284 + 631 + 713 + 0 + 0 + + + 313 + 716 + 456 + 3 + 0 + + + 37 + 632 + 755 + 0 + 0 + + + 71 + 604 + 687 + 4 + 0 + + + 70 + 116 + 139 + 0 + 0 + + + 70 + 181 + 427 + 0 + 0 + + + 4 + 229 + 205 + 0 + 0 + + + 70 + 278 + 278 + 0 + 0 + + + 36 + 738 + 478 + 1 + 0 + + + 313 + 717 + 492 + 0 + 0 + + + 34 + 298 + 670 + 0 + 0 + + + 4 + 61 + 264 + 0 + 0 + + + 1 + 171 + 452 + 0 + 0 + + + 18 + 97 + 484 + 4 + 0 + + + 5 + 118 + 655 + 0 + 0 + + + 278 + 91 + 516 + 0 + 0 + + + 308 + 499 + 461 + 0 + 0 + + + 1 + 353 + 565 + 0 + 0 + + + 261 + 585 + 498 + 4 + 0 + + + 32 + 497 + 657 + 1 + 0 + + + 420 + 640 + 703 + 0 + 0 + + + 70 + 116 + 137 + 0 + 0 + + + 162 + 324 + 710 + 0 + 0 + + + 0 + 622 + 525 + 0 + 0 + + + 1 + 304 + 656 + 0 + 0 + + + 395 + 612 + 836 + 7 + 0 + + + 220 + 116 + 405 + 2 + 0 + + + 70 + 306 + 252 + 0 + 0 + + + 70 + 189 + 408 + 0 + 0 + + + 20 + 162 + 476 + 0 + 0 + + + 206 + 639 + 606 + 1 + 0 + + + 38 + 134 + 351 + 0 + 0 + + + 718 + 739 + 524 + 2 + 0 + + + 1 + 266 + 633 + 0 + 1 + + + 0 + 122 + 632 + 0 + 0 + + + 193 + 613 + 475 + 1 + 1 + + + 284 + 483 + 413 + 1 + 0 + + + 34 + 250 + 549 + 0 + 0 + + + 0 + 678 + 520 + 1 + 0 + + + 197 + 278 + 493 + 1 + 1 + + + 7 + 602 + 689 + 4 + 0 + + + 34 + 258 + 532 + 0 + 0 + + + 37 + 347 + 663 + 0 + 0 + + + 1 + 590 + 703 + 1 + 1 + + + 1 + 610 + 578 + 0 + 0 + + + 70 + 120 + 133 + 0 + 0 + + + 4 + 101 + 466 + 0 + 0 + + + 597 + 672 + 486 + 6 + 0 + + + 45 + 210 + 513 + 4 + 0 + + + 70 + 53 + 301 + 0 + 0 + + + 284 + 669 + 713 + 0 + 0 + + + 70 + 130 + 362 + 0 + 0 + + + 284 + 655 + 687 + 2 + 0 + + + 55 + 596 + 548 + 0 + 0 + + + 70 + 134 + 119 + 0 + 0 + + + 1 + 649 + 735 + 7 + 0 + + + 70 + 320 + 147 + 0 + 0 + + + 38 + 147 + 320 + 0 + 0 + + + 23 + 98 + 480 + 0 + 0 + + + 22 + 610 + 680 + 4 + 0 + + + 70 + 149 + 107 + 0 + 0 + + + 960 + 625 + 720 + 0 + 0 + + + 46 + 97 + 485 + 0 + 0 + + + 0 + 721 + 453 + 7 + 0 + + + 42 + 637 + 608 + 4 + 0 + + + 218 + 116 + 406 + 2 + 0 + + + 718 + 734 + 445 + 0 + 0 + + + 37 + 631 + 756 + 0 + 0 + + + 70 + 157 + 300 + 0 + 0 + + + 70 + 54 + 296 + 0 + 0 + + + 70 + 315 + 245 + 0 + 0 + + + 70 + 170 + 277 + 0 + 0 + + + 22 + 653 + 540 + 2 + 0 + + + 38 + 218 + 354 + 0 + 0 + + + 5 + 218 + 630 + 2 + 0 + + + 58 + 406 + 3518 + 0 + 1 + + + 4 + 244 + 193 + 0 + 0 + + + 284 + 657 + 685 + 2 + 0 + + + 1 + 89 + 529 + 1 + 1 + + + 70 + 214 + 220 + 0 + 0 + + + 34 + 652 + 447 + 0 + 0 + + + 193 + 625 + 466 + 3 + 1 + + + 70 + 131 + 122 + 0 + 0 + + + 45 + 532 + 614 + 0 + 0 + + + 205 + 49 + 322 + 0 + 0 + + + 191 + 177 + 612 + 0 + 0 + + + 4 + 183 + 252 + 0 + 0 + + + 70 + 60 + 263 + 0 + 0 + + + 45 + 212 + 511 + 0 + 0 + + + 313 + 688 + 513 + 0 + 0 + + + 70 + 239 + 193 + 0 + 0 + + + 205 + 65 + 243 + 0 + 0 + + + 284 + 593 + 759 + 0 + 0 + + + 70 + 233 + 198 + 0 + 0 + + + 306 + 712 + 669 + 0 + 0 + + + 284 + 626 + 719 + 0 + 0 + + + 718 + 736 + 527 + 2 + 0 + + + 4 + 237 + 327 + 0 + 0 + + + 70 + 123 + 128 + 0 + 0 + + + 4 + 320 + 144 + 0 + 0 + + + 4 + 320 + 242 + 0 + 0 + + + 106 + 110 + 704 + 0 + 0 + + + 34 + 82 + 562 + 7 + 0 + + + 284 + 658 + 684 + 0 + 0 + + + 70 + 197 + 234 + 0 + 0 + + + 33 + 474 + 687 + 4 + 0 + + + 34 + 609 + 739 + 0 + 0 + + + 71 + 613 + 678 + 4 + 0 + + + 4 + 100 + 461 + 0 + 0 + + + 284 + 633 + 711 + 0 + 0 + + + 70 + 109 + 423 + 0 + 0 + + + 1 + 102 + 452 + 0 + 0 + + + 34 + 640 + 455 + 2 + 0 + + + 0 + 606 + 640 + 3 + 0 + + + 285 + 631 + 755 + 0 + 0 + + + 284 + 662 + 680 + 0 + 0 + + + 70 + 57 + 278 + 0 + 0 + + + 34 + 104 + 444 + 0 + 0 + + + 70 + 72 + 220 + 0 + 0 + + + 284 + 671 + 710 + 2 + 0 + + + 110 + 286 + 379 + 4 + 0 + + + 106 + 110 + 705 + 0 + 0 + + + 205 + 514 + 447 + 0 + 0 + + + 445 + 627 + 563 + 6 + 0 + + + 70 + 138 + 115 + 0 + 0 + + + 0 + 609 + 637 + 4 + 0 + + + 70 + 278 + 279 + 0 + 0 + + + 70 + 150 + 308 + 0 + 0 + + + 283 + 451 + 441 + 6 + 0 + + + 284 + 670 + 711 + 0 + 0 + + + 182 + 609 + 478 + 0 + 1 + + + 284 + 634 + 710 + 2 + 0 + + + 70 + 181 + 255 + 0 + 0 + + + 205 + 597 + 754 + 2 + 0 + + + 209 + 713 + 583 + 4 + 0 + + + 70 + 289 + 375 + 0 + 0 + + + 37 + 249 + 555 + 0 + 0 + + + 284 + 660 + 682 + 0 + 0 + + + 37 + 347 + 662 + 0 + 0 + + + 70 + 185 + 250 + 0 + 0 + + + 284 + 668 + 674 + 0 + 0 + + + 70 + 191 + 405 + 0 + 0 + + + 0 + 683 + 477 + 3 + 0 + + + 597 + 672 + 525 + 6 + 0 + + + 70 + 202 + 229 + 0 + 0 + + + 284 + 665 + 677 + 2 + 0 + + + 70 + 191 + 242 + 0 + 0 + + + 306 + 708 + 548 + 1 + 0 + + + 0 + 516 + 385 + 0 + 0 + + + 70 + 329 + 235 + 0 + 0 + + + 1 + 242 + 448 + 0 + 0 + + + 205 + 55 + 284 + 0 + 0 + + + 70 + 99 + 158 + 0 + 0 + + + 215 + 136 + 115 + 7 + 0 + + + 597 + 689 + 512 + 0 + 0 + + + 4 + 215 + 215 + 0 + 0 + + + 284 + 668 + 713 + 0 + 0 + + + 34 + 720 + 539 + 3 + 0 + + + 718 + 735 + 528 + 2 + 0 + + + 285 + 630 + 756 + 0 + 0 + + + 70 + 60 + 262 + 0 + 0 + + + 285 + 578 + 824 + 6 + 0 + + + 284 + 636 + 708 + 2 + 0 + + + 0 + 298 + 667 + 0 + 0 + + + 4 + 81 + 194 + 0 + 0 + + + 215 + 139 + 113 + 7 + 0 + + + 1 + 267 + 290 + 1 + 1 + + + 1 + 252 + 548 + 0 + 0 + + + 284 + 492 + 404 + 6 + 0 + + + 38 + 99 + 159 + 0 + 0 + + + 322 + 544 + 599 + 0 + 0 + + + 1 + 107 + 433 + 0 + 0 + + + 20 + 529 + 616 + 4 + 0 + + + 313 + 676 + 522 + 3 + 0 + + + 284 + 628 + 717 + 0 + 0 + + + 38 + 65 + 242 + 0 + 0 + + + 3 + 592 + 702 + 4 + 0 + + + 1 + 215 + 3525 + 0 + 1 + + + 22 + 89 + 520 + 6 + 0 + + + 38 + 111 + 417 + 0 + 0 + + + 110 + 284 + 382 + 4 + 0 + + + 70 + 71 + 221 + 0 + 0 + + + 45 + 124 + 624 + 0 + 0 + + + 284 + 667 + 714 + 2 + 0 + + + 597 + 746 + 473 + 2 + 0 + + + 4 + 225 + 344 + 0 + 0 + + + 4 + 180 + 430 + 0 + 0 + + + 4 + 100 + 463 + 0 + 0 + + + 55 + 688 + 564 + 6 + 0 + + + 284 + 670 + 672 + 0 + 0 + + + 34 + 169 + 642 + 1 + 0 + + + 1 + 84 + 551 + 7 + 0 + + + 0 + 507 + 392 + 0 + 0 + + + 4 + 176 + 263 + 0 + 0 + + + 37 + 104 + 446 + 0 + 0 + + + 70 + 209 + 372 + 0 + 0 + + + 4 + 74 + 210 + 0 + 0 + + + 70 + 226 + 344 + 0 + 0 + + + 597 + 672 + 485 + 6 + 0 + + + 597 + 672 + 433 + 6 + 0 + + + 100 + 89 + 521 + 0 + 0 + + + 34 + 648 + 503 + 0 + 0 + + + 89 + 316 + 534 + 4 + 0 + + + 70 + 207 + 224 + 0 + 0 + + + 34 + 715 + 494 + 2 + 0 + + + 1 + 87 + 533 + 1 + 1 + + + 0 + 126 + 617 + 0 + 0 + + + 70 + 299 + 260 + 0 + 0 + + + 4 + 187 + 248 + 0 + 0 + + + 597 + 730 + 531 + 4 + 0 + + + 36 + 158 + 684 + 2 + 0 + + + 34 + 766 + 506 + 3 + 0 + + + 25 + 98 + 473 + 0 + 0 + + + 1 + 157 + 495 + 4 + 0 + + + 34 + 101 + 459 + 0 + 0 + + + 70 + 173 + 268 + 0 + 0 + + + 377 + 648 + 641 + 3 + 0 + + + 34 + 354 + 648 + 4 + 0 + + + 25 + 97 + 478 + 0 + 0 + + + 70 + 64 + 242 + 0 + 0 + + + 70 + 128 + 121 + 0 + 0 + + + 3 + 602 + 690 + 0 + 0 + + + 306 + 674 + 524 + 1 + 0 + + + 398 + 634 + 806 + 0 + 0 + + + 3 + 570 + 680 + 0 + 0 + + + 4 + 100 + 155 + 0 + 0 + + + 26 + 313 + 539 + 0 + 0 + + + 278 + 90 + 515 + 0 + 0 + + + 308 + 536 + 543 + 6 + 0 + + + 0 + 649 + 694 + 0 + 0 + + + 941 + 694 + 649 + 0 + 0 + + + 4 + 84 + 553 + 7 + 0 + + + 7 + 607 + 582 + 0 + 0 + + + 4 + 272 + 286 + 0 + 0 + + + 70 + 286 + 272 + 0 + 0 + + + 306 + 653 + 541 + 0 + 0 + + + 0 + 539 + 540 + 6 + 0 + + + 1 + 611 + 680 + 0 + 1 + + + 21 + 588 + 495 + 0 + 0 + + + 284 + 638 + 706 + 2 + 0 + + + 35 + 106 + 734 + 0 + 0 + + + 150 + 518 + 443 + 0 + 0 + + + 34 + 85 + 546 + 7 + 0 + + + 70 + 302 + 358 + 0 + 0 + + + 70 + 66 + 236 + 0 + 0 + + + 445 + 623 + 567 + 0 + 0 + + + 597 + 726 + 449 + 6 + 0 + + + 205 + 232 + 200 + 0 + 0 + + + 70 + 85 + 183 + 0 + 0 + + + 55 + 64 + 725 + 2 + 0 + + + 718 + 737 + 526 + 2 + 0 + + + 34 + 718 + 454 + 3 + 0 + + + 968 + 607 + 742 + 4 + 0 + + + 70 + 273 + 396 + 0 + 0 + + + 34 + 399 + 499 + 6 + 0 + + + 45 + 124 + 626 + 4 + 0 + + + 0 + 705 + 550 + 1 + 0 + + + 164 + 748 + 472 + 3 + 0 + + + 70 + 324 + 334 + 0 + 0 + + + 285 + 509 + 451 + 0 + 0 + + + 0 + 105 + 443 + 0 + 0 + + + 70 + 115 + 134 + 0 + 0 + + + 70 + 116 + 401 + 0 + 0 + + + 70 + 138 + 337 + 0 + 0 + + + 4 + 262 + 413 + 0 + 0 + + + 1 + 178 + 436 + 0 + 0 + + + 1 + 116 + 669 + 0 + 1 + + + 38 + 124 + 375 + 0 + 0 + + + 71 + 617 + 673 + 6 + 0 + + + 35 + 78 + 596 + 0 + 0 + + + 0 + 122 + 636 + 0 + 0 + + + 34 + 722 + 537 + 0 + 0 + + + 108 + 111 + 699 + 0 + 0 + + + 205 + 62 + 248 + 0 + 0 + + + 45 + 531 + 614 + 0 + 0 + + + 70 + 63 + 244 + 0 + 0 + + + 70 + 84 + 183 + 0 + 0 + + + 70 + 121 + 384 + 0 + 0 + + + 33 + 66 + 704 + 0 + 0 + + + 113 + 494 + 660 + 0 + 0 + + + 205 + 64 + 240 + 0 + 0 + + + 70 + 192 + 404 + 0 + 0 + + + 143 + 656 + 633 + 0 + 0 + + + 284 + 630 + 715 + 0 + 0 + + + 70 + 98 + 158 + 0 + 0 + + + 283 + 489 + 407 + 6 + 0 + + + 1 + 85 + 548 + 7 + 0 + + + 205 + 321 + 242 + 0 + 0 + + + 70 + 137 + 340 + 0 + 0 + + + 70 + 284 + 164 + 0 + 0 + + + 34 + 350 + 656 + 4 + 0 + + + 6 + 279 + 494 + 0 + 0 + + + 70 + 189 + 411 + 0 + 0 + + + 70 + 199 + 544 + 0 + 0 + + + 70 + 307 + 253 + 0 + 0 + + + 70 + 249 + 187 + 0 + 0 + + + 4 + 187 + 249 + 0 + 0 + + + 70 + 120 + 388 + 0 + 0 + + + 205 + 131 + 118 + 0 + 0 + + + 3 + 216 + 638 + 2 + 0 + + + 70 + 238 + 579 + 6 + 0 + + + 51 + 562 + 690 + 2 + 0 + + + 4 + 165 + 656 + 3 + 0 + + + 377 + 635 + 805 + 0 + 0 + + + 70 + 329 + 329 + 0 + 0 + + + 45 + 211 + 513 + 4 + 0 + + + 21 + 322 + 713 + 6 + 0 + + + 4 + 68 + 227 + 0 + 0 + + + 0 + 84 + 554 + 7 + 0 + + + 70 + 265 + 293 + 0 + 0 + + + 4 + 166 + 652 + 5 + 0 + + + 1 + 595 + 698 + 1 + 1 + + + 70 + 76 + 203 + 0 + 0 + + + 0 + 225 + 481 + 0 + 0 + + + 38 + 615 + 821 + 0 + 0 + + + 37 + 646 + 675 + 3 + 0 + + + 0 + 619 + 477 + 0 + 0 + + + 37 + 341 + 662 + 0 + 0 + + + 597 + 749 + 447 + 2 + 0 + + + 407 + 721 + 562 + 7 + 0 + + + 306 + 709 + 515 + 3 + 0 + + + 0 + 731 + 458 + 1 + 0 + + + 0 + 353 + 542 + 0 + 0 + + + 70 + 240 + 219 + 0 + 0 + + + 402 + 594 + 850 + 1 + 0 + + + 97 + 613 + 661 + 3 + 0 + + + 5 + 249 + 628 + 2 + 0 + + + 70 + 86 + 205 + 0 + 0 + + + 7 + 134 + 657 + 0 + 0 + + + 4 + 220 + 239 + 0 + 0 + + + 284 + 632 + 690 + 2 + 0 + + + 70 + 59 + 299 + 0 + 0 + + + 205 + 284 + 310 + 0 + 0 + + + 70 + 216 + 567 + 0 + 0 + + + 0 + 338 + 668 + 0 + 0 + + + 12 + 173 + 304 + 0 + 0 + + + 0 + 187 + 655 + 0 + 0 + + + 70 + 107 + 165 + 0 + 0 + + + 401 + 479 + 699 + 6 + 0 + + + 70 + 289 + 182 + 0 + 0 + + + 1 + 700 + 678 + 2 + 0 + + + 11 + 497 + 385 + 2 + 0 + + + 34 + 506 + 446 + 0 + 0 + + + 1 + 313 + 611 + 2 + 0 + + + 1 + 675 + 703 + 2 + 0 + + + 4 + 121 + 145 + 0 + 0 + + + 4 + 145 + 362 + 0 + 0 + + + 70 + 136 + 129 + 0 + 0 + + + 38 + 162 + 324 + 0 + 0 + + + 34 + 742 + 492 + 3 + 0 + + + 1 + 186 + 658 + 0 + 0 + + + 72 + 199 + 615 + 3 + 0 + + + 278 + 645 + 566 + 0 + 0 + + + 101 + 569 + 712 + 0 + 0 + + + 36 + 759 + 441 + 3 + 0 + + + 193 + 621 + 475 + 1 + 1 + + + 72 + 200 + 612 + 3 + 0 + + + 145 + 278 + 2962 + 0 + 0 + + + 70 + 300 + 408 + 0 + 0 + + + 0 + 204 + 600 + 0 + 0 + + + 394 + 481 + 696 + 2 + 0 + + + 284 + 645 + 676 + 0 + 0 + + + 70 + 118 + 149 + 0 + 0 + + + 63 + 261 + 469 + 6 + 0 + + + 306 + 643 + 738 + 0 + 0 + + + 284 + 660 + 719 + 0 + 0 + + + 34 + 650 + 515 + 2 + 0 + + + 70 + 83 + 212 + 0 + 0 + + + 4 + 139 + 378 + 0 + 0 + + + 5 + 656 + 450 + 0 + 0 + + + 70 + 115 + 153 + 0 + 0 + + + 70 + 199 + 264 + 0 + 0 + + + 34 + 186 + 659 + 1 + 0 + + + 70 + 139 + 379 + 0 + 0 + + + 38 + 217 + 405 + 0 + 0 + + + 38 + 760 + 533 + 3 + 0 + + + 4 + 169 + 520 + 0 + 0 + + + 72 + 198 + 619 + 3 + 0 + + + 70 + 91 + 192 + 0 + 0 + + + 284 + 624 + 699 + 2 + 0 + + + 70 + 320 + 383 + 0 + 0 + + + 597 + 672 + 498 + 6 + 0 + + + 0 + 664 + 504 + 6 + 0 + + + 21 + 248 + 630 + 4 + 0 + + + 399 + 645 + 783 + 0 + 0 + + + 0 + 481 + 398 + 6 + 0 + + + 1 + 478 + 472 + 0 + 0 + + + 70 + 140 + 125 + 0 + 0 + + + 70 + 155 + 340 + 0 + 0 + + + 72 + 199 + 616 + 3 + 0 + + + 70 + 301 + 292 + 0 + 0 + + + 313 + 679 + 435 + 3 + 0 + + + 34 + 712 + 513 + 2 + 0 + + + 205 + 126 + 139 + 0 + 0 + + + 399 + 538 + 753 + 1 + 0 + + + 72 + 200 + 613 + 3 + 0 + + + 3 + 133 + 661 + 0 + 0 + + + 0 + 594 + 682 + 4 + 0 + + + 298 + 454 + 497 + 3 + 0 + + + 70 + 211 + 581 + 6 + 0 + + + 104 + 565 + 717 + 0 + 0 + + + 45 + 605 + 721 + 6 + 0 + + + 13 + 169 + 312 + 0 + 0 + + + 37 + 726 + 461 + 7 + 0 + + + 0 + 324 + 591 + 2 + 0 + + + 402 + 597 + 846 + 0 + 0 + + + 70 + 138 + 127 + 0 + 0 + + + 508 + 285 + 185 + 0 + 0 + + + 284 + 671 + 707 + 2 + 0 + + + 377 + 664 + 550 + 4 + 0 + + + 205 + 291 + 421 + 0 + 0 + + + 79 + 111 + 474 + 0 + 0 + + + 34 + 378 + 699 + 0 + 0 + + + 962 + 632 + 799 + 7 + 0 + + + 0 + 750 + 540 + 3 + 0 + + + 718 + 737 + 454 + 0 + 0 + + + 306 + 508 + 444 + 0 + 0 + + + 111 + 519 + 569 + 0 + 0 + + + 1 + 514 + 514 + 4 + 0 + + + 394 + 640 + 789 + 3 + 0 + + + 285 + 467 + 483 + 0 + 0 + + + 1 + 104 + 506 + 0 + 1 + + + 70 + 278 + 316 + 0 + 0 + + + 214 + 61 + 286 + 6 + 0 + + + 0 + 181 + 677 + 0 + 0 + + + 597 + 752 + 445 + 2 + 0 + + + 70 + 212 + 578 + 6 + 0 + + + 45 + 586 + 504 + 2 + 0 + + + 34 + 706 + 474 + 3 + 0 + + + 70 + 150 + 351 + 0 + 0 + + + 70 + 161 + 327 + 0 + 0 + + + 70 + 267 + 329 + 0 + 0 + + + 394 + 472 + 709 + 4 + 0 + + + 193 + 628 + 470 + 1 + 1 + + + 938 + 689 + 633 + 0 + 0 + + + 70 + 266 + 198 + 0 + 0 + + + 70 + 230 + 229 + 0 + 0 + + + 4 + 303 + 290 + 0 + 0 + + + 284 + 649 + 672 + 0 + 0 + + + 70 + 272 + 323 + 0 + 0 + + + 36 + 521 + 433 + 0 + 0 + + + 70 + 165 + 317 + 0 + 0 + + + 7 + 134 + 655 + 4 + 0 + + + 34 + 675 + 437 + 3 + 0 + + + 70 + 66 + 271 + 0 + 0 + + + 70 + 259 + 202 + 0 + 0 + + + 70 + 152 + 344 + 0 + 0 + + + 284 + 669 + 709 + 2 + 0 + + + 70 + 88 + 203 + 0 + 0 + + + 34 + 117 + 447 + 0 + 0 + + + 1 + 603 + 606 + 1 + 1 + + + 70 + 143 + 366 + 0 + 0 + + + 20 + 186 + 472 + 0 + 0 + + + 70 + 145 + 361 + 0 + 0 + + + 597 + 672 + 439 + 6 + 0 + + + 38 + 150 + 349 + 0 + 0 + + + 597 + 680 + 492 + 2 + 0 + + + 283 + 465 + 485 + 0 + 0 + + + 70 + 89 + 201 + 0 + 0 + + + 25 + 132 + 665 + 0 + 0 + + + 1 + 340 + 562 + 0 + 0 + + + 110 + 514 + 574 + 0 + 0 + + + 284 + 628 + 694 + 2 + 0 + + + 23 + 98 + 534 + 0 + 0 + + + 0 + 617 + 478 + 0 + 0 + + + 70 + 130 + 137 + 0 + 0 + + + 34 + 684 + 489 + 0 + 0 + + + 7 + 280 + 438 + 4 + 0 + + + 36 + 357 + 535 + 0 + 0 + + + 205 + 151 + 118 + 0 + 0 + + + 192 + 616 + 543 + 0 + 0 + + + 37 + 340 + 663 + 0 + 0 + + + 377 + 662 + 763 + 3 + 0 + + + 285 + 497 + 673 + 1 + 0 + + + 597 + 688 + 531 + 4 + 0 + + + 70 + 309 + 397 + 0 + 0 + + + 103 + 571 + 710 + 0 + 0 + + + 25 + 99 + 528 + 0 + 0 + + + 69 + 748 + 542 + 3 + 0 + + + 70 + 113 + 158 + 0 + 0 + + + 24 + 221 + 555 + 3 + 1 + + + 284 + 638 + 683 + 2 + 0 + + + 4 + 94 + 556 + 7 + 0 + + + 34 + 694 + 482 + 4 + 0 + + + 396 + 537 + 755 + 1 + 0 + + + 0 + 171 + 513 + 4 + 0 + + + 74 + 182 + 482 + 0 + 0 + + + 7 + 250 + 626 + 2 + 0 + + + 0 + 713 + 469 + 3 + 0 + + + 4 + 293 + 179 + 0 + 0 + + + 115 + 162 + 541 + 0 + 0 + + + 4 + 95 + 552 + 7 + 0 + + + 4 + 227 + 231 + 0 + 0 + + + 15 + 254 + 345 + 4 + 0 + + + 70 + 49 + 362 + 0 + 0 + + + 38 + 73 + 243 + 0 + 0 + + + 36 + 358 + 534 + 0 + 0 + + + 63 + 107 + 490 + 0 + 0 + + + 70 + 90 + 197 + 0 + 0 + + + 70 + 126 + 416 + 0 + 0 + + + 0 + 503 + 518 + 0 + 0 + + + 23 + 263 + 467 + 0 + 0 + + + 395 + 652 + 775 + 0 + 0 + + + 398 + 539 + 752 + 1 + 0 + + + 0 + 165 + 531 + 4 + 0 + + + 70 + 171 + 104 + 0 + 0 + + + 306 + 677 + 494 + 1 + 0 + + + 1 + 515 + 506 + 4 + 0 + + + 402 + 614 + 823 + 0 + 0 + + + 597 + 746 + 490 + 2 + 0 + + + 6 + 617 + 657 + 4 + 0 + + + 100 + 692 + 630 + 7 + 0 + + + 41 + 647 + 565 + 4 + 0 + + + 284 + 667 + 711 + 2 + 0 + + + 284 + 630 + 692 + 2 + 0 + + + 192 + 737 + 496 + 0 + 0 + + + 205 + 201 + 261 + 0 + 0 + + + 70 + 79 + 225 + 0 + 0 + + + 284 + 643 + 678 + 2 + 0 + + + 70 + 55 + 323 + 0 + 0 + + + 70 + 63 + 282 + 0 + 0 + + + 70 + 141 + 372 + 0 + 0 + + + 45 + 602 + 724 + 2 + 0 + + + 4 + 58 + 305 + 0 + 0 + + + 4 + 66 + 268 + 0 + 0 + + + 70 + 203 + 258 + 0 + 0 + + + 70 + 125 + 419 + 0 + 0 + + + 34 + 730 + 458 + 7 + 0 + + + 70 + 207 + 253 + 0 + 0 + + + 33 + 373 + 709 + 0 + 0 + + + 72 + 198 + 620 + 3 + 0 + + + 306 + 345 + 653 + 0 + 0 + + + 7 + 279 + 440 + 0 + 0 + + + 4 + 293 + 419 + 0 + 0 + + + 306 + 718 + 509 + 1 + 0 + + + 209 + 206 + 425 + 7 + 0 + + + 38 + 185 + 283 + 0 + 0 + + + 284 + 641 + 680 + 2 + 0 + + + 597 + 681 + 491 + 0 + 0 + + + 34 + 477 + 701 + 2 + 0 + + + 72 + 200 + 614 + 3 + 0 + + + 284 + 665 + 713 + 2 + 0 + + + 70 + 279 + 314 + 0 + 0 + + + 45 + 617 + 1563 + 2 + 0 + + + 70 + 227 + 541 + 0 + 0 + + + 70 + 110 + 161 + 0 + 0 + + + 32 + 534 + 759 + 0 + 0 + + + 376 + 589 + 501 + 4 + 0 + + + 1 + 118 + 444 + 0 + 0 + + + 72 + 199 + 617 + 3 + 0 + + + 0 + 520 + 501 + 0 + 0 + + + 4 + 205 + 259 + 0 + 0 + + + 205 + 56 + 324 + 0 + 0 + + + 70 + 162 + 112 + 0 + 0 + + + 0 + 168 + 521 + 0 + 0 + + + 3 + 249 + 626 + 4 + 0 + + + 70 + 277 + 316 + 0 + 0 + + + 193 + 621 + 476 + 3 + 1 + + + 70 + 191 + 278 + 0 + 0 + + + 38 + 139 + 382 + 0 + 0 + + + 962 + 624 + 810 + 6 + 0 + + + 70 + 189 + 281 + 0 + 0 + + + 72 + 198 + 616 + 3 + 0 + + + 284 + 624 + 698 + 2 + 0 + + + 38 + 259 + 338 + 0 + 0 + + + 34 + 121 + 439 + 0 + 0 + + + 102 + 616 + 657 + 0 + 0 + + + 70 + 115 + 158 + 0 + 0 + + + 38 + 231 + 379 + 0 + 0 + + + 0 + 765 + 529 + 3 + 0 + + + 70 + 140 + 379 + 0 + 0 + + + 45 + 588 + 503 + 4 + 0 + + + 407 + 715 + 566 + 6 + 0 + + + 12 + 169 + 314 + 0 + 0 + + + 283 + 613 + 775 + 0 + 0 + + + 70 + 209 + 254 + 0 + 0 + + + 34 + 294 + 649 + 0 + 0 + + + 72 + 197 + 619 + 7 + 0 + + + 70 + 225 + 542 + 0 + 0 + + + 70 + 113 + 160 + 0 + 0 + + + 284 + 671 + 708 + 2 + 0 + + + 50 + 102 + 520 + 0 + 0 + + + 70 + 334 + 365 + 0 + 0 + + + 70 + 48 + 377 + 0 + 0 + + + 103 + 517 + 572 + 0 + 0 + + + 70 + 178 + 298 + 0 + 0 + + + 100 + 162 + 540 + 0 + 0 + + + 5 + 180 + 486 + 0 + 0 + + + 273 + 486 + 545 + 0 + 0 + + + 70 + 192 + 276 + 0 + 0 + + + 377 + 483 + 692 + 0 + 0 + + + 0 + 551 + 473 + 0 + 0 + + + 25 + 617 + 1562 + 4 + 0 + + + 407 + 764 + 570 + 5 + 0 + + + 70 + 261 + 335 + 0 + 0 + + + 70 + 70 + 258 + 0 + 0 + + + 49 + 106 + 500 + 7 + 0 + + + 1 + 252 + 347 + 1 + 1 + + + 1 + 183 + 666 + 0 + 0 + + + 284 + 648 + 672 + 0 + 0 + + + 47 + 220 + 554 + 4 + 0 + + + 38 + 282 + 188 + 0 + 0 + + + 70 + 265 + 330 + 0 + 0 + + + 597 + 672 + 440 + 6 + 0 + + + 7 + 277 + 440 + 0 + 0 + + + 70 + 138 + 131 + 0 + 0 + + + 34 + 443 + 668 + 0 + 0 + + + 284 + 637 + 684 + 0 + 0 + + + 216 + 63 + 286 + 7 + 0 + + + 70 + 233 + 524 + 0 + 0 + + + 284 + 626 + 696 + 0 + 0 + + + 283 + 599 + 609 + 4 + 0 + + + 43 + 179 + 488 + 0 + 1 + + + 7 + 280 + 436 + 0 + 0 + + + 285 + 481 + 397 + 0 + 0 + + + 597 + 746 + 489 + 2 + 0 + + + 49 + 106 + 502 + 6 + 0 + + + 70 + 174 + 306 + 0 + 0 + + + 1138 + 496 + 385 + 0 + 0 + + + 1 + 196 + 446 + 0 + 0 + + + 668 + 731 + 499 + 0 + 0 + + + 70 + 110 + 164 + 0 + 0 + + + 37 + 292 + 654 + 0 + 0 + + + 0 + 620 + 539 + 6 + 0 + + + 70 + 49 + 368 + 0 + 0 + + + 70 + 195 + 273 + 0 + 0 + + + 105 + 163 + 536 + 0 + 0 + + + 4 + 135 + 394 + 0 + 0 + + + 70 + 197 + 270 + 0 + 0 + + + 113 + 474 + 705 + 0 + 0 + + + 70 + 320 + 273 + 0 + 0 + + + 0 + 602 + 672 + 0 + 0 + + + 4 + 188 + 283 + 0 + 0 + + + 70 + 297 + 411 + 0 + 0 + + + 7 + 133 + 657 + 0 + 0 + + + 0 + 170 + 514 + 0 + 0 + + + 111 + 220 + 397 + 0 + 0 + + + 0 + 549 + 475 + 0 + 0 + + + 103 + 573 + 706 + 0 + 0 + + + 22 + 341 + 663 + 2 + 0 + + + 38 + 48 + 374 + 0 + 0 + + + 70 + 134 + 134 + 0 + 0 + + + 70 + 210 + 581 + 6 + 0 + + + 70 + 317 + 385 + 0 + 0 + + + 70 + 162 + 111 + 0 + 0 + + + 3 + 340 + 665 + 2 + 0 + + + 70 + 116 + 155 + 0 + 0 + + + 1 + 135 + 647 + 0 + 0 + + + 4 + 206 + 424 + 0 + 0 + + + 306 + 612 + 776 + 6 + 0 + + + 1 + 487 + 392 + 1 + 1 + + + 70 + 238 + 367 + 0 + 0 + + + 284 + 667 + 712 + 2 + 0 + + + 205 + 55 + 326 + 0 + 0 + + + 284 + 635 + 686 + 0 + 0 + + + 111 + 519 + 570 + 0 + 0 + + + 70 + 79 + 227 + 0 + 0 + + + 38 + 122 + 147 + 0 + 0 + + + 70 + 183 + 98 + 0 + 0 + + + 13 + 165 + 322 + 2 + 0 + + + 70 + 58 + 309 + 0 + 0 + + + 70 + 300 + 291 + 0 + 0 + + + 72 + 199 + 613 + 3 + 0 + + + 377 + 661 + 659 + 0 + 0 + + + 70 + 137 + 131 + 0 + 0 + + + 388 + 657 + 663 + 4 + 0 + + + 313 + 696 + 480 + 3 + 0 + + + 72 + 200 + 610 + 3 + 0 + + + 70 + 122 + 151 + 0 + 0 + + + 70 + 292 + 181 + 0 + 0 + + + 597 + 749 + 446 + 2 + 0 + + + 70 + 302 + 175 + 0 + 0 + + + 33 + 424 + 697 + 0 + 0 + + + 70 + 98 + 188 + 0 + 0 + + + 70 + 188 + 98 + 0 + 0 + + + 103 + 221 + 395 + 0 + 0 + + + 284 + 643 + 677 + 2 + 0 + + + 115 + 568 + 713 + 0 + 0 + + + 34 + 194 + 630 + 0 + 0 + + + 205 + 59 + 312 + 0 + 0 + + + 34 + 373 + 711 + 0 + 0 + + + 100 + 164 + 532 + 0 + 0 + + + 9 + 133 + 656 + 0 + 0 + + + 1 + 250 + 349 + 0 + 1 + + + 70 + 58 + 317 + 0 + 0 + + + 37 + 466 + 485 + 0 + 0 + + + 402 + 597 + 847 + 6 + 0 + + + 72 + 200 + 611 + 3 + 0 + + + 0 + 188 + 650 + 3 + 0 + + + 70 + 84 + 219 + 0 + 0 + + + 7 + 279 + 438 + 4 + 0 + + + 34 + 648 + 456 + 2 + 0 + + + 70 + 240 + 220 + 0 + 0 + + + 1 + 120 + 440 + 0 + 0 + + + 38 + 167 + 110 + 0 + 0 + + + 193 + 627 + 471 + 2 + 1 + + + 4 + 322 + 164 + 0 + 0 + + + 5 + 78 + 677 + 2 + 0 + + + 1 + 131 + 666 + 0 + 0 + + + 72 + 199 + 614 + 3 + 0 + + + 70 + 74 + 248 + 0 + 0 + + + 70 + 69 + 266 + 0 + 0 + + + 286 + 525 + 497 + 0 + 0 + + + 0 + 621 + 652 + 7 + 0 + + + 70 + 54 + 340 + 0 + 0 + + + 72 + 198 + 617 + 7 + 0 + + + 597 + 672 + 497 + 6 + 0 + + + 20 + 620 + 702 + 4 + 0 + + + 284 + 641 + 679 + 2 + 0 + + + 105 + 163 + 535 + 0 + 0 + + + 33 + 445 + 664 + 0 + 0 + + + 45 + 602 + 723 + 2 + 0 + + + 100 + 670 + 441 + 4 + 0 + + + 284 + 665 + 714 + 2 + 0 + + + 34 + 651 + 513 + 2 + 0 + + + 402 + 632 + 800 + 0 + 0 + + + 284 + 628 + 693 + 2 + 0 + + + 4 + 218 + 242 + 0 + 0 + + + 36 + 759 + 440 + 3 + 0 + + + 72 + 197 + 620 + 3 + 0 + + + 284 + 664 + 715 + 0 + 0 + + + 20 + 295 + 529 + 0 + 0 + + + 0 + 505 + 585 + 0 + 0 + + + 194 + 585 + 505 + 4 + 0 + + + 34 + 377 + 692 + 0 + 0 + + + 0 + 481 + 396 + 6 + 0 + + + 597 + 687 + 531 + 4 + 0 + + + 445 + 648 + 563 + 6 + 0 + + + 0 + 721 + 506 + 1 + 0 + + + 20 + 607 + 717 + 0 + 0 + + + 70 + 318 + 384 + 0 + 0 + + + 34 + 740 + 493 + 3 + 0 + + + 1 + 579 + 820 + 1 + 0 + + + 23 + 647 + 673 + 4 + 0 + + + 407 + 698 + 580 + 0 + 0 + + + 1 + 190 + 644 + 0 + 0 + + + 1 + 184 + 665 + 0 + 0 + + + 70 + 60 + 305 + 0 + 0 + + + 70 + 148 + 358 + 0 + 0 + + + 70 + 179 + 296 + 0 + 0 + + + 70 + 308 + 283 + 0 + 0 + + + 72 + 198 + 618 + 3 + 0 + + + 1 + 508 + 514 + 4 + 0 + + + 1 + 591 + 685 + 0 + 0 + + + 4 + 72 + 254 + 0 + 0 + + + 70 + 155 + 118 + 0 + 0 + + + 284 + 632 + 689 + 2 + 0 + + + 41 + 268 + 2960 + 4 + 0 + + + 193 + 626 + 472 + 2 + 1 + + + 70 + 49 + 373 + 0 + 0 + + + 70 + 224 + 389 + 0 + 0 + + + 1 + 187 + 466 + 0 + 0 + + + 0 + 347 + 651 + 0 + 0 + + + 46 + 564 + 592 + 0 + 0 + + + 1 + 189 + 461 + 0 + 0 + + + 597 + 752 + 444 + 2 + 0 + + + 34 + 122 + 434 + 0 + 0 + + + 7 + 278 + 440 + 0 + 0 + + + 36 + 383 + 692 + 0 + 0 + + + 38 + 691 + 687 + 2 + 0 + + + 7 + 133 + 655 + 0 + 0 + + + 13 + 173 + 306 + 0 + 0 + + + 70 + 218 + 561 + 6 + 0 + + + 145 + 279 + 2954 + 4 + 0 + + + 70 + 252 + 210 + 0 + 0 + + + 4 + 135 + 392 + 0 + 0 + + + 25 + 134 + 650 + 0 + 0 + + + 44 + 603 + 722 + 0 + 0 + + + 21 + 590 + 501 + 4 + 0 + + + 0 + 758 + 534 + 3 + 0 + + + 23 + 263 + 465 + 0 + 0 + + + 34 + 374 + 698 + 0 + 0 + + + 0 + 593 + 563 + 6 + 0 + + + 45 + 542 + 616 + 4 + 0 + + + 1 + 695 + 683 + 1 + 1 + + + 70 + 185 + 286 + 0 + 0 + + + 102 + 618 + 655 + 0 + 0 + + + 70 + 116 + 157 + 0 + 0 + + + 70 + 225 + 387 + 0 + 0 + + + 597 + 680 + 491 + 0 + 0 + + + 34 + 652 + 512 + 2 + 0 + + + 0 + 195 + 627 + 0 + 0 + + + 284 + 630 + 691 + 2 + 0 + + + 34 + 501 + 521 + 0 + 0 + + + 307 + 512 + 441 + 0 + 0 + + + 284 + 662 + 717 + 0 + 0 + + + 51 + 267 + 2971 + 2 + 0 + + + 283 + 680 + 698 + 0 + 0 + + + 70 + 297 + 178 + 0 + 0 + + + 0 + 183 + 668 + 0 + 0 + + + 284 + 644 + 676 + 0 + 0 + + + 70 + 60 + 303 + 0 + 0 + + + 105 + 163 + 534 + 0 + 0 + + + 4 + 320 + 382 + 0 + 0 + + + 878 + 724 + 654 + 6 + 0 + + + 1 + 511 + 511 + 0 + 1 + + + 72 + 197 + 616 + 7 + 0 + + + 1 + 192 + 632 + 0 + 0 + + + 70 + 86 + 192 + 0 + 0 + + + 38 + 128 + 129 + 0 + 0 + + + 0 + 621 + 477 + 0 + 0 + + + 7 + 633 + 748 + 0 + 0 + + + 284 + 665 + 712 + 2 + 0 + + + 111 + 219 + 397 + 0 + 0 + + + 70 + 111 + 149 + 0 + 0 + + + 13 + 165 + 312 + 0 + 0 + + + 0 + 294 + 654 + 0 + 0 + + + 37 + 117 + 440 + 0 + 0 + + + 102 + 616 + 656 + 0 + 0 + + + 1 + 185 + 656 + 0 + 0 + + + 36 + 378 + 702 + 0 + 0 + + + 273 + 486 + 546 + 0 + 0 + + + 394 + 595 + 731 + 0 + 0 + + + 70 + 61 + 271 + 0 + 0 + + + 7 + 628 + 583 + 4 + 0 + + + 103 + 517 + 573 + 0 + 0 + + + 32 + 496 + 677 + 6 + 0 + + + 63 + 536 + 754 + 0 + 0 + + + 72 + 198 + 613 + 3 + 0 + + + 70 + 289 + 420 + 0 + 0 + + + 38 + 324 + 159 + 0 + 0 + + + 70 + 318 + 162 + 0 + 0 + + + 70 + 283 + 429 + 0 + 0 + + + 1 + 605 + 668 + 2 + 0 + + + 1 + 269 + 585 + 0 + 0 + + + 4 + 201 + 604 + 0 + 0 + + + 0 + 758 + 483 + 3 + 0 + + + 45 + 249 + 632 + 2 + 0 + + + 70 + 322 + 377 + 0 + 0 + + + 8 + 233 + 521 + 1 + 0 + + + 72 + 199 + 610 + 3 + 0 + + + 102 + 617 + 655 + 0 + 0 + + + 70 + 90 + 184 + 0 + 0 + + + 718 + 738 + 455 + 0 + 0 + + + 23 + 260 + 467 + 0 + 0 + + + 205 + 226 + 228 + 0 + 0 + + + 1 + 132 + 659 + 0 + 1 + + + 70 + 58 + 286 + 0 + 0 + + + 0 + 166 + 524 + 0 + 0 + + + 70 + 121 + 137 + 0 + 0 + + + 1 + 115 + 448 + 0 + 0 + + + 7 + 341 + 665 + 2 + 0 + + + 1 + 160 + 103 + 0 + 1 + + + 36 + 378 + 691 + 0 + 0 + + + 284 + 636 + 684 + 0 + 0 + + + 48 + 497 + 387 + 2 + 0 + + + 401 + 597 + 844 + 6 + 0 + + + 283 + 491 + 532 + 0 + 0 + + + 45 + 589 + 503 + 4 + 0 + + + 1 + 181 + 671 + 0 + 0 + + + 4 + 110 + 151 + 0 + 0 + + + 597 + 684 + 491 + 0 + 0 + + + 193 + 626 + 473 + 1 + 1 + + + 110 + 518 + 572 + 0 + 0 + + + 205 + 294 + 296 + 0 + 0 + + + 284 + 667 + 710 + 2 + 0 + + + 205 + 477 + 475 + 0 + 0 + + + 1 + 475 + 477 + 0 + 0 + + + 107 + 569 + 710 + 0 + 0 + + + 310 + 548 + 484 + 4 + 0 + + + 464 + 660 + 449 + 0 + 0 + + + 0 + 752 + 487 + 3 + 0 + + + 667 + 731 + 501 + 0 + 0 + + + 20 + 122 + 423 + 0 + 0 + + + 1 + 76 + 679 + 0 + 1 + + + 4 + 200 + 258 + 0 + 0 + + + 114 + 565 + 715 + 0 + 0 + + + 34 + 296 + 650 + 0 + 0 + + + 285 + 481 + 400 + 0 + 0 + + + 70 + 58 + 283 + 0 + 0 + + + 286 + 511 + 580 + 0 + 0 + + + 1 + 93 + 555 + 7 + 0 + + + 70 + 72 + 228 + 0 + 0 + + + 46 + 567 + 592 + 0 + 0 + + + 34 + 196 + 443 + 0 + 0 + + + 70 + 309 + 281 + 0 + 0 + + + 38 + 75 + 219 + 0 + 0 + + + 0 + 648 + 518 + 6 + 0 + + + 4 + 331 + 156 + 0 + 0 + + + 401 + 595 + 847 + 4 + 0 + + + 70 + 228 + 533 + 0 + 0 + + + 7 + 280 + 434 + 4 + 0 + + + 70 + 52 + 316 + 0 + 0 + + + 51 + 606 + 718 + 4 + 0 + + + 1 + 167 + 520 + 0 + 0 + + + 4 + 304 + 633 + 2 + 0 + + + 597 + 672 + 441 + 6 + 0 + + + 398 + 533 + 758 + 1 + 0 + + + 284 + 638 + 682 + 2 + 0 + + + 70 + 319 + 381 + 0 + 0 + + + 20 + 184 + 472 + 0 + 0 + + + 70 + 333 + 365 + 0 + 0 + + + 597 + 746 + 491 + 2 + 0 + + + 1 + 252 + 624 + 0 + 1 + + + 29 + 105 + 492 + 0 + 0 + + + 70 + 163 + 101 + 0 + 0 + + + 4 + 170 + 511 + 0 + 0 + + + 72 + 197 + 617 + 3 + 0 + + + 38 + 317 + 163 + 0 + 0 + + + 205 + 297 + 174 + 0 + 0 + + + 205 + 103 + 160 + 0 + 0 + + + 1 + 118 + 438 + 0 + 0 + + + 70 + 219 + 236 + 0 + 0 + + + 306 + 698 + 481 + 0 + 0 + + + 72 + 198 + 614 + 7 + 0 + + + 0 + 606 + 554 + 6 + 0 + + + 24 + 221 + 550 + 2 + 1 + + + 4 + 66 + 250 + 0 + 0 + + + 1139 + 500 + 385 + 0 + 0 + + + 72 + 199 + 611 + 7 + 0 + + + 286 + 514 + 441 + 0 + 0 + + + 371 + 621 + 700 + 0 + 0 + + + 284 + 630 + 690 + 2 + 0 + + + 0 + 753 + 537 + 3 + 0 + + + 284 + 660 + 717 + 0 + 0 + + + 283 + 716 + 704 + 0 + 0 + + + 306 + 724 + 506 + 5 + 0 + + + 37 + 644 + 675 + 4 + 0 + + + 9 + 277 + 439 + 0 + 0 + + + 405 + 537 + 753 + 7 + 0 + + + 1 + 562 + 597 + 0 + 0 + + + 70 + 320 + 380 + 0 + 0 + + + 283 + 714 + 706 + 0 + 0 + + + 70 + 303 + 286 + 0 + 0 + + + 70 + 320 + 160 + 0 + 0 + + + 21 + 249 + 633 + 0 + 0 + + + 20 + 279 + 2956 + 0 + 0 + + + 7 + 98 + 523 + 4 + 0 + + + 163 + 319 + 710 + 0 + 0 + + + 70 + 57 + 295 + 0 + 0 + + + 7 + 279 + 436 + 0 + 0 + + + 395 + 598 + 727 + 2 + 0 + + + 36 + 370 + 718 + 0 + 0 + + + 4 + 301 + 638 + 2 + 0 + + + 402 + 598 + 843 + 4 + 0 + + + 283 + 466 + 486 + 0 + 0 + + + 597 + 690 + 531 + 4 + 0 + + + 407 + 707 + 572 + 2 + 0 + + + 254 + 434 + 682 + 4 + 0 + + + 1 + 189 + 459 + 0 + 0 + + + 208 + 689 + 631 + 3 + 0 + + + 38 + 249 + 206 + 0 + 0 + + + 597 + 749 + 448 + 2 + 0 + + + 51 + 278 + 2967 + 0 + 0 + + + 668 + 727 + 504 + 0 + 0 + + + 34 + 706 + 519 + 2 + 0 + + + 23 + 96 + 534 + 0 + 0 + + + 70 + 206 + 421 + 0 + 0 + + + 100 + 160 + 542 + 0 + 0 + + + 20 + 298 + 529 + 0 + 0 + + + 38 + 167 + 307 + 0 + 0 + + + 306 + 522 + 509 + 3 + 0 + + + 37 + 471 + 481 + 0 + 0 + + + 139 + 499 + 454 + 6 + 0 + + + 4 + 63 + 268 + 0 + 0 + + + 284 + 647 + 672 + 0 + 0 + + + 70 + 259 + 335 + 0 + 0 + + + 284 + 662 + 715 + 0 + 0 + + + 38 + 684 + 692 + 2 + 0 + + + 1 + 112 + 458 + 0 + 0 + + + 284 + 632 + 688 + 2 + 0 + + + 72 + 197 + 618 + 3 + 0 + + + 1 + 297 + 647 + 0 + 0 + + + 284 + 658 + 719 + 0 + 0 + + + 1 + 182 + 669 + 0 + 0 + + + 3 + 98 + 524 + 0 + 0 + + + 1 + 235 + 518 + 2 + 1 + + + 29 + 135 + 641 + 0 + 0 + + + 1 + 118 + 435 + 0 + 0 + + + 70 + 231 + 527 + 0 + 0 + + + 4 + 317 + 273 + 0 + 0 + + + 20 + 146 + 593 + 0 + 0 + + + 1 + 250 + 630 + 0 + 1 + + + 70 + 247 + 208 + 0 + 0 + + + 13 + 169 + 304 + 0 + 0 + + + 1 + 187 + 463 + 0 + 0 + + + 1 + 185 + 468 + 0 + 0 + + + 597 + 752 + 446 + 2 + 0 + + + 1 + 116 + 443 + 0 + 0 + + + 105 + 571 + 708 + 0 + 0 + + + 668 + 733 + 500 + 0 + 0 + + + 70 + 138 + 121 + 0 + 0 + + + 72 + 199 + 612 + 3 + 0 + + + 70 + 229 + 378 + 0 + 0 + + + 306 + 748 + 490 + 3 + 0 + + + 1 + 489 + 543 + 1 + 1 + + + 37 + 633 + 687 + 0 + 0 + + + 34 + 762 + 481 + 3 + 0 + + + 4 + 122 + 421 + 0 + 0 + + + 70 + 292 + 417 + 0 + 0 + + + 70 + 323 + 268 + 0 + 0 + + + 63 + 107 + 480 + 0 + 0 + + + 23 + 263 + 463 + 0 + 0 + + + 7 + 278 + 438 + 4 + 0 + + + 70 + 323 + 377 + 0 + 0 + + + 72 + 198 + 615 + 3 + 0 + + + 0 + 290 + 543 + 6 + 0 + + + 445 + 651 + 563 + 6 + 0 + + + 70 + 126 + 408 + 0 + 0 + + + 70 + 252 + 204 + 0 + 0 + + + 144 + 97 + 530 + 0 + 0 + + + 70 + 76 + 220 + 0 + 0 + + + 103 + 161 + 538 + 0 + 0 + + + 4 + 116 + 144 + 0 + 0 + + + 70 + 328 + 264 + 0 + 0 + + + 10 + 132 + 656 + 0 + 0 + + + 0 + 311 + 618 + 2 + 0 + + + 37 + 343 + 660 + 2 + 0 + + + 70 + 210 + 580 + 6 + 0 + + + 34 + 381 + 697 + 0 + 0 + + + 70 + 327 + 265 + 0 + 0 + + + 283 + 445 + 432 + 4 + 0 + + + 284 + 634 + 686 + 0 + 0 + + + 38 + 723 + 507 + 2 + 0 + + + 284 + 624 + 697 + 2 + 0 + + + 402 + 594 + 849 + 3 + 0 + + + 1 + 188 + 648 + 0 + 0 + + + 1 + 165 + 525 + 0 + 0 + + + 4 + 92 + 559 + 7 + 0 + + + 286 + 497 + 675 + 1 + 0 + + + 47 + 342 + 662 + 0 + 0 + + + 950 + 625 + 807 + 2 + 0 + + + 284 + 663 + 715 + 0 + 0 + + + 32 + 367 + 713 + 0 + 0 + + + 102 + 517 + 574 + 0 + 0 + + + 70 + 306 + 395 + 0 + 0 + + + 49 + 104 + 500 + 0 + 0 + + + 70 + 208 + 250 + 0 + 0 + + + 284 + 638 + 681 + 2 + 0 + + + 70 + 296 + 292 + 0 + 0 + + + 70 + 220 + 393 + 0 + 0 + + + 119 + 131 + 660 + 0 + 0 + + + 23 + 291 + 539 + 6 + 0 + + + 70 + 215 + 242 + 0 + 0 + + + 25 + 130 + 665 + 0 + 0 + + + 1 + 112 + 464 + 1 + 1 + + + 70 + 128 + 406 + 0 + 0 + + + 4 + 66 + 258 + 0 + 0 + + + 284 + 626 + 694 + 0 + 0 + + + 419 + 714 + 512 + 6 + 0 + + + 70 + 84 + 203 + 0 + 0 + + + 306 + 695 + 526 + 1 + 0 + + + 205 + 142 + 120 + 0 + 0 + + + 1 + 302 + 635 + 1 + 0 + + + 0 + 182 + 664 + 0 + 0 + + + 597 + 680 + 493 + 2 + 0 + + + 34 + 291 + 659 + 0 + 0 + + + 1 + 99 + 526 + 1 + 1 + + + 1 + 167 + 518 + 0 + 0 + + + 70 + 173 + 301 + 0 + 0 + + + 51 + 534 + 756 + 4 + 0 + + + 597 + 683 + 491 + 0 + 0 + + + 34 + 372 + 715 + 0 + 0 + + + 34 + 117 + 445 + 0 + 0 + + + 66 + 126 + 686 + 1 + 1 + + + 34 + 424 + 700 + 0 + 0 + + + 4 + 307 + 394 + 0 + 0 + + + 597 + 672 + 499 + 6 + 0 + + + 401 + 477 + 703 + 6 + 0 + + + 100 + 670 + 443 + 4 + 0 + + + 32 + 447 + 664 + 0 + 0 + + + 0 + 622 + 649 + 7 + 0 + + + 0 + 668 + 502 + 6 + 0 + + + 70 + 171 + 100 + 0 + 0 + + + 20 + 444 + 432 + 6 + 0 + + + 70 + 249 + 209 + 0 + 0 + + + 70 + 103 + 166 + 0 + 0 + + + 1 + 118 + 441 + 0 + 0 + + + 45 + 249 + 630 + 2 + 0 + + + 23 + 260 + 465 + 0 + 0 + + + 34 + 186 + 650 + 0 + 0 + + + 45 + 590 + 503 + 4 + 0 + + + 38 + 190 + 274 + 0 + 0 + + + 0 + 742 + 544 + 3 + 0 + + + 4 + 308 + 169 + 0 + 0 + + + 13 + 169 + 308 + 0 + 0 + + + 0 + 166 + 521 + 0 + 0 + + + 47 + 174 + 496 + 4 + 0 + + + 34 + 629 + 472 + 0 + 0 + + + 205 + 144 + 362 + 0 + 0 + + + 37 + 548 + 485 + 4 + 0 + + + 394 + 504 + 665 + 1 + 0 + + + 38 + 166 + 102 + 0 + 0 + + + 0 + 322 + 596 + 2 + 0 + + + 962 + 637 + 792 + 2 + 0 + + + 23 + 98 + 532 + 0 + 0 + + + 402 + 616 + 819 + 0 + 0 + + + 47 + 220 + 550 + 4 + 0 + + + 38 + 132 + 395 + 0 + 0 + + + 14 + 173 + 499 + 0 + 0 + + + 284 + 641 + 678 + 0 + 0 + + + 450 + 622 + 588 + 4 + 0 + + + 313 + 694 + 527 + 0 + 0 + + + 184 + 622 + 477 + 0 + 1 + + + 205 + 318 + 164 + 0 + 0 + + + 0 + 481 + 399 + 6 + 0 + + + 205 + 241 + 358 + 0 + 0 + + + 402 + 597 + 845 + 0 + 0 + + + 70 + 71 + 238 + 0 + 0 + + + 70 + 210 + 576 + 6 + 0 + + + 284 + 628 + 692 + 2 + 0 + + + 72 + 197 + 614 + 3 + 0 + + + 34 + 312 + 615 + 2 + 0 + + + 209 + 203 + 425 + 0 + 0 + + + 98 + 652 + 514 + 2 + 0 + + + 1 + 631 + 751 + 0 + 1 + + + 334 + 158 + 107 + 0 + 0 + + + 398 + 474 + 707 + 6 + 0 + + + 70 + 142 + 367 + 0 + 0 + + + 72 + 198 + 611 + 3 + 0 + + + 70 + 204 + 423 + 0 + 0 + + + 70 + 286 + 423 + 0 + 0 + + + 278 + 449 + 3371 + 0 + 0 + + + 38 + 60 + 282 + 0 + 0 + + + 34 + 610 + 777 + 3 + 0 + + + 70 + 208 + 582 + 6 + 0 + + + 402 + 595 + 848 + 0 + 0 + + + 47 + 491 + 391 + 2 + 0 + + + 34 + 724 + 463 + 7 + 0 + + + 194 + 588 + 505 + 4 + 0 + + + 46 + 76 + 687 + 0 + 0 + + + 70 + 94 + 181 + 0 + 0 + + + 286 + 663 + 761 + 6 + 0 + + + 334 + 159 + 107 + 0 + 0 + + + 70 + 295 + 177 + 0 + 0 + + + 70 + 73 + 233 + 0 + 0 + + + 308 + 506 + 449 + 0 + 0 + + + 59 + 535 + 555 + 4 + 0 + + + 36 + 736 + 497 + 7 + 0 + + + 284 + 643 + 676 + 0 + 0 + + + 70 + 276 + 189 + 0 + 0 + + + 70 + 138 + 378 + 0 + 0 + + + 45 + 602 + 722 + 2 + 0 + + + 284 + 661 + 717 + 0 + 0 + + + 193 + 626 + 474 + 1 + 1 + + + 21 + 248 + 632 + 4 + 0 + + + 6 + 282 + 185 + 0 + 0 + + + 38 + 699 + 678 + 2 + 0 + + + 1 + 321 + 598 + 2 + 0 + + + 281 + 554 + 605 + 6 + 0 + + + 3 + 168 + 514 + 0 + 0 + + + 1 + 496 + 387 + 1 + 1 + + + 70 + 88 + 197 + 0 + 0 + + + 597 + 689 + 531 + 4 + 0 + + + 70 + 102 + 170 + 0 + 0 + + + 70 + 60 + 289 + 0 + 0 + + + 1 + 180 + 673 + 0 + 0 + + + 29 + 105 + 493 + 2 + 0 + + + 63 + 500 + 454 + 6 + 0 + + + 334 + 162 + 107 + 0 + 0 + + + 284 + 633 + 686 + 0 + 0 + + + 313 + 716 + 511 + 3 + 0 + + + 7 + 168 + 513 + 3 + 0 + + + 70 + 308 + 168 + 0 + 0 + + + 70 + 132 + 392 + 0 + 0 + + + 0 + 358 + 535 + 0 + 0 + + + 4 + 318 + 271 + 0 + 0 + + + 205 + 258 + 334 + 0 + 0 + + + 0 + 129 + 668 + 0 + 0 + + + 15 + 167 + 516 + 0 + 0 + + + 284 + 632 + 687 + 2 + 0 + + + 284 + 671 + 706 + 2 + 0 + + + 0 + 631 + 640 + 6 + 0 + + + 205 + 244 + 212 + 0 + 0 + + + 38 + 268 + 193 + 0 + 0 + + + 285 + 482 + 695 + 2 + 0 + + + 1131 + 486 + 394 + 4 + 0 + + + 4 + 217 + 397 + 0 + 0 + + + 70 + 128 + 404 + 0 + 0 + + + 38 + 234 + 221 + 0 + 0 + + + 12 + 169 + 306 + 0 + 0 + + + 0 + 670 + 500 + 6 + 0 + + + 7 + 279 + 434 + 4 + 0 + + + 113 + 621 + 699 + 0 + 1 + + + 70 + 129 + 134 + 0 + 0 + + + 70 + 116 + 149 + 0 + 0 + + + 70 + 149 + 116 + 0 + 0 + + + 7 + 278 + 436 + 0 + 0 + + + 70 + 150 + 116 + 0 + 0 + + + 34 + 524 + 500 + 0 + 0 + + + 20 + 182 + 474 + 0 + 0 + + + 0 + 697 + 525 + 1 + 0 + + + 4 + 142 + 365 + 0 + 0 + + + 33 + 377 + 695 + 0 + 0 + + + 70 + 84 + 207 + 0 + 0 + + + 306 + 674 + 440 + 0 + 0 + + + 205 + 110 + 158 + 0 + 0 + + + 1 + 160 + 108 + 0 + 1 + + + 205 + 303 + 171 + 0 + 0 + + + 12 + 165 + 314 + 0 + 0 + + + 22 + 653 + 665 + 4 + 0 + + + 34 + 187 + 648 + 0 + 0 + + + 72 + 198 + 612 + 7 + 0 + + + 377 + 652 + 774 + 1 + 0 + + + 285 + 472 + 481 + 0 + 0 + + + 209 + 201 + 429 + 0 + 0 + + + 284 + 659 + 719 + 0 + 0 + + + 70 + 183 + 283 + 0 + 0 + + + 34 + 755 + 535 + 3 + 0 + + + 45 + 249 + 631 + 2 + 0 + + + 70 + 254 + 477 + 6 + 0 + + + 360 + 664 + 654 + 0 + 0 + + + 396 + 540 + 748 + 1 + 0 + + + 0 + 185 + 466 + 0 + 0 + + + 72 + 197 + 615 + 3 + 0 + + + 55 + 654 + 664 + 6 + 0 + + + 34 + 376 + 697 + 0 + 0 + + + 284 + 635 + 684 + 0 + 0 + + + 70 + 94 + 183 + 0 + 0 + + + 70 + 93 + 185 + 0 + 0 + + + 214 + 473 + 708 + 2 + 0 + + + 400 + 471 + 711 + 4 + 0 + + + 33 + 366 + 716 + 0 + 0 + + + 209 + 202 + 426 + 1 + 0 + + + 284 + 669 + 708 + 2 + 0 + + + 34 + 750 + 488 + 3 + 0 + + + 597 + 682 + 491 + 0 + 0 + + + 284 + 624 + 696 + 2 + 0 + + + 284 + 668 + 709 + 0 + 0 + + + 23 + 263 + 461 + 0 + 0 + + + 1 + 129 + 667 + 0 + 0 + + + 38 + 253 + 340 + 0 + 0 + + + 0 + 674 + 543 + 1 + 0 + + + 43 + 273 + 444 + 6 + 0 + + + 113 + 475 + 705 + 0 + 0 + + + 0 + 642 + 462 + 2 + 0 + + + 34 + 286 + 670 + 0 + 0 + + + 205 + 60 + 286 + 0 + 0 + + + 205 + 305 + 170 + 0 + 0 + + + 1 + 256 + 613 + 0 + 0 + + + 54 + 643 + 628 + 4 + 0 + + + 83 + 221 + 549 + 0 + 0 + + + 7 + 277 + 438 + 4 + 0 + + + 105 + 161 + 535 + 0 + 0 + + + 4 + 53 + 326 + 0 + 0 + + + 0 + 638 + 465 + 5 + 0 + + + 402 + 596 + 847 + 4 + 0 + + + 20 + 272 + 446 + 6 + 0 + + + 283 + 577 + 821 + 6 + 0 + + + 395 + 489 + 685 + 1 + 0 + + + 306 + 685 + 489 + 0 + 0 + + + 34 + 419 + 708 + 0 + 0 + + + 63 + 607 + 603 + 4 + 0 + + + 407 + 701 + 576 + 0 + 0 + + + 53 + 179 + 481 + 0 + 0 + + + 63 + 102 + 509 + 2 + 0 + + + 404 + 532 + 759 + 3 + 0 + + + 100 + 160 + 538 + 0 + 0 + + + 70 + 121 + 429 + 0 + 0 + + + 1 + 489 + 392 + 0 + 1 + + + 70 + 179 + 290 + 0 + 0 + + + 70 + 67 + 257 + 0 + 0 + + + 70 + 311 + 390 + 0 + 0 + + + 70 + 73 + 236 + 0 + 0 + + + 1 + 346 + 554 + 0 + 0 + + + 29 + 101 + 514 + 0 + 0 + + + 45 + 104 + 487 + 6 + 0 + + + 70 + 133 + 147 + 0 + 0 + + + 284 + 671 + 704 + 2 + 0 + + + 38 + 132 + 148 + 0 + 0 + + + 70 + 148 + 132 + 0 + 0 + + + 306 + 716 + 513 + 0 + 0 + + + 1 + 325 + 487 + 0 + 1 + + + 70 + 122 + 160 + 0 + 0 + + + 6 + 118 + 1605 + 0 + 0 + + + 45 + 540 + 616 + 4 + 0 + + + 597 + 672 + 495 + 6 + 0 + + + 70 + 327 + 155 + 0 + 0 + + + 37 + 345 + 660 + 0 + 0 + + + 34 + 693 + 480 + 2 + 0 + + + 72 + 197 + 612 + 3 + 0 + + + 4 + 306 + 394 + 0 + 0 + + + 205 + 295 + 305 + 0 + 0 + + + 70 + 206 + 246 + 0 + 0 + + + 34 + 428 + 695 + 0 + 0 + + + 4 + 134 + 146 + 0 + 0 + + + 30 + 442 + 673 + 0 + 0 + + + 1 + 181 + 666 + 0 + 0 + + + 34 + 664 + 501 + 0 + 0 + + + 70 + 123 + 159 + 0 + 0 + + + 51 + 533 + 756 + 4 + 0 + + + 21 + 626 + 475 + 0 + 0 + + + 34 + 645 + 461 + 2 + 0 + + + 209 + 211 + 426 + 0 + 0 + + + 70 + 51 + 382 + 0 + 0 + + + 70 + 281 + 180 + 0 + 0 + + + 284 + 652 + 672 + 0 + 0 + + + 70 + 209 + 242 + 0 + 0 + + + 34 + 738 + 546 + 3 + 0 + + + 34 + 734 + 549 + 3 + 0 + + + 193 + 623 + 477 + 0 + 1 + + + 21 + 590 + 504 + 0 + 0 + + + 70 + 70 + 278 + 0 + 0 + + + 32 + 374 + 701 + 0 + 0 + + + 34 + 749 + 538 + 3 + 0 + + + 36 + 522 + 436 + 0 + 0 + + + 32 + 79 + 640 + 0 + 0 + + + 1 + 178 + 677 + 0 + 0 + + + 34 + 114 + 444 + 0 + 0 + + + 70 + 206 + 585 + 0 + 0 + + + 34 + 290 + 653 + 0 + 0 + + + 70 + 299 + 403 + 0 + 0 + + + 70 + 210 + 241 + 0 + 0 + + + 3 + 105 + 482 + 0 + 0 + + + 20 + 272 + 443 + 4 + 0 + + + 1 + 314 + 603 + 2 + 0 + + + 284 + 657 + 719 + 0 + 0 + + + 284 + 626 + 700 + 2 + 0 + + + 70 + 150 + 130 + 0 + 0 + + + 9 + 277 + 435 + 0 + 0 + + + 4 + 310 + 290 + 0 + 0 + + + 20 + 88 + 575 + 0 + 0 + + + 38 + 115 + 440 + 0 + 0 + + + 214 + 689 + 636 + 3 + 0 + + + 0 + 679 + 438 + 3 + 0 + + + 407 + 712 + 566 + 4 + 0 + + + 20 + 611 + 717 + 0 + 0 + + + 38 + 154 + 328 + 0 + 0 + + + 215 + 69 + 285 + 7 + 0 + + + 80 + 162 + 556 + 4 + 0 + + + 4 + 183 + 658 + 0 + 0 + + + 205 + 329 + 366 + 0 + 0 + + + 5 + 139 + 648 + 0 + 0 + + + 37 + 463 + 492 + 0 + 0 + + + 306 + 708 + 470 + 7 + 0 + + + 71 + 96 + 526 + 0 + 0 + + + 70 + 209 + 576 + 6 + 0 + + + 70 + 104 + 189 + 0 + 0 + + + 70 + 108 + 182 + 0 + 0 + + + 205 + 168 + 117 + 0 + 0 + + + 0 + 202 + 596 + 0 + 0 + + + 1 + 609 + 662 + 3 + 0 + + + 97 + 616 + 823 + 6 + 0 + + + 32 + 369 + 711 + 0 + 0 + + + 342 + 611 + 601 + 4 + 0 + + + 70 + 208 + 579 + 6 + 0 + + + 70 + 127 + 398 + 0 + 0 + + + 45 + 104 + 486 + 6 + 0 + + + 407 + 727 + 650 + 6 + 0 + + + 1 + 289 + 655 + 0 + 0 + + + 70 + 82 + 240 + 0 + 0 + + + 24 + 273 + 185 + 3 + 1 + + + 45 + 542 + 614 + 0 + 0 + + + 70 + 195 + 101 + 0 + 0 + + + 103 + 165 + 546 + 0 + 0 + + + 399 + 536 + 752 + 1 + 0 + + + 4 + 617 + 595 + 0 + 0 + + + 70 + 100 + 196 + 0 + 0 + + + 1 + 220 + 547 + 1 + 1 + + + 45 + 605 + 724 + 6 + 0 + + + 38 + 307 + 392 + 0 + 0 + + + 70 + 106 + 185 + 0 + 0 + + + 1 + 344 + 662 + 0 + 1 + + + 0 + 728 + 457 + 1 + 0 + + + 70 + 151 + 334 + 0 + 0 + + + 70 + 96 + 204 + 0 + 0 + + + 938 + 692 + 633 + 0 + 0 + + + 45 + 104 + 485 + 4 + 0 + + + 4 + 177 + 285 + 0 + 0 + + + 70 + 299 + 301 + 0 + 0 + + + 122 + 645 + 569 + 0 + 1 + + + 70 + 194 + 260 + 0 + 0 + + + 284 + 648 + 676 + 0 + 0 + + + 20 + 115 + 439 + 0 + 0 + + + 72 + 197 + 611 + 3 + 0 + + + 284 + 624 + 702 + 2 + 0 + + + 0 + 509 + 584 + 0 + 0 + + + 4 + 77 + 255 + 0 + 0 + + + 394 + 485 + 686 + 6 + 0 + + + 36 + 665 + 447 + 2 + 0 + + + 70 + 59 + 333 + 0 + 0 + + + 46 + 562 + 592 + 0 + 0 + + + 12 + 165 + 306 + 0 + 0 + + + 23 + 260 + 463 + 0 + 0 + + + 1 + 709 + 715 + 0 + 0 + + + 45 + 591 + 503 + 4 + 0 + + + 284 + 659 + 717 + 0 + 0 + + + 7 + 253 + 626 + 4 + 0 + + + 306 + 714 + 710 + 0 + 0 + + + 100 + 668 + 445 + 4 + 0 + + + 188 + 289 + 548 + 0 + 0 + + + 72 + 198 + 610 + 3 + 0 + + + 284 + 665 + 710 + 2 + 0 + + + 100 + 183 + 660 + 0 + 0 + + + 83 + 220 + 549 + 0 + 0 + + + 445 + 623 + 590 + 0 + 0 + + + 284 + 632 + 693 + 2 + 0 + + + 1 + 320 + 591 + 2 + 0 + + + 38 + 211 + 425 + 0 + 0 + + + 7 + 277 + 436 + 0 + 0 + + + 70 + 257 + 196 + 0 + 0 + + + 38 + 283 + 178 + 0 + 0 + + + 38 + 222 + 404 + 0 + 0 + + + 284 + 645 + 679 + 2 + 0 + + + 20 + 94 + 536 + 0 + 0 + + + 70 + 263 + 341 + 0 + 0 + + + 70 + 196 + 101 + 0 + 0 + + + 3 + 439 + 677 + 0 + 0 + + + 281 + 554 + 600 + 6 + 0 + + + 196 + 164 + 547 + 0 + 0 + + + 0 + 677 + 543 + 1 + 0 + + + 32 + 79 + 638 + 0 + 0 + + + 0 + 195 + 460 + 0 + 0 + + + 70 + 140 + 360 + 0 + 0 + + + 1 + 112 + 450 + 0 + 0 + + + 36 + 659 + 451 + 0 + 0 + + + 377 + 635 + 799 + 4 + 0 + + + 70 + 191 + 264 + 0 + 0 + + + 407 + 659 + 612 + 3 + 0 + + + 597 + 752 + 442 + 2 + 0 + + + 70 + 76 + 261 + 0 + 0 + + + 4 + 137 + 368 + 0 + 0 + + + 284 + 646 + 678 + 0 + 0 + + + 1 + 486 + 468 + 0 + 0 + + + 70 + 79 + 251 + 0 + 0 + + + 70 + 313 + 386 + 0 + 0 + + + 51 + 610 + 718 + 4 + 0 + + + 1 + 256 + 619 + 0 + 0 + + + 4 + 181 + 278 + 0 + 0 + + + 1 + 90 + 559 + 0 + 0 + + + 19 + 638 + 576 + 0 + 0 + + + 4 + 94 + 210 + 0 + 0 + + + 0 + 194 + 462 + 0 + 0 + + + 4 + 92 + 547 + 7 + 0 + + + 70 + 275 + 183 + 0 + 0 + + + 205 + 78 + 253 + 0 + 0 + + + 261 + 593 + 501 + 4 + 0 + + + 51 + 622 + 704 + 6 + 0 + + + 205 + 111 + 178 + 0 + 0 + + + 70 + 223 + 402 + 0 + 0 + + + 0 + 611 + 660 + 3 + 0 + + + 0 + 166 + 540 + 4 + 0 + + + 70 + 216 + 559 + 6 + 0 + + + 405 + 542 + 744 + 0 + 0 + + + 72 + 197 + 613 + 3 + 0 + + + 2 + 275 + 439 + 1 + 1 + + + 70 + 130 + 152 + 0 + 0 + + + 88 + 223 + 541 + 0 + 0 + + + 8 + 232 + 520 + 1 + 0 + + + 284 + 630 + 695 + 2 + 0 + + + 205 + 615 + 483 + 0 + 0 + + + 100 + 695 + 630 + 0 + 0 + + + 70 + 52 + 383 + 0 + 0 + + + 7 + 278 + 434 + 4 + 0 + + + 395 + 503 + 661 + 1 + 0 + + + 0 + 614 + 657 + 3 + 0 + + + 70 + 132 + 151 + 0 + 0 + + + 597 + 672 + 442 + 6 + 0 + + + 205 + 147 + 342 + 0 + 0 + + + 34 + 114 + 441 + 0 + 0 + + + 407 + 656 + 615 + 0 + 0 + + + 27 + 491 + 385 + 0 + 0 + + + 70 + 49 + 407 + 0 + 0 + + + 284 + 643 + 681 + 0 + 0 + + + 284 + 669 + 706 + 2 + 0 + + + 70 + 133 + 150 + 0 + 0 + + + 70 + 95 + 210 + 0 + 0 + + + 394 + 471 + 706 + 3 + 0 + + + 70 + 214 + 235 + 0 + 0 + + + 37 + 295 + 538 + 4 + 0 + + + 405 + 489 + 680 + 1 + 0 + + + 32 + 473 + 703 + 2 + 0 + + + 4 + 249 + 202 + 0 + 0 + + + 597 + 692 + 531 + 4 + 0 + + + 395 + 558 + 723 + 0 + 0 + + + 70 + 135 + 147 + 0 + 0 + + + 4 + 291 + 545 + 6 + 0 + + + 1 + 192 + 628 + 0 + 0 + + + 192 + 759 + 438 + 0 + 0 + + + 70 + 95 + 209 + 0 + 0 + + + 7 + 633 + 746 + 4 + 0 + + + 308 + 538 + 488 + 4 + 0 + + + 70 + 123 + 408 + 0 + 0 + + + 1 + 140 + 641 + 0 + 0 + + + 1 + 613 + 658 + 3 + 0 + + + 284 + 640 + 684 + 0 + 0 + + + 34 + 647 + 459 + 2 + 0 + + + 1 + 236 + 511 + 0 + 1 + + + 38 + 66 + 301 + 0 + 0 + + + 281 + 94 + 534 + 6 + 0 + + + 3 + 253 + 627 + 4 + 0 + + + 306 + 756 + 486 + 3 + 0 + + + 6 + 136 + 660 + 0 + 0 + + + 45 + 251 + 632 + 4 + 0 + + + 5 + 96 + 523 + 0 + 0 + + + 20 + 191 + 470 + 0 + 0 + + + 20 + 108 + 465 + 0 + 0 + + + 70 + 61 + 326 + 0 + 0 + + + 0 + 171 + 525 + 0 + 0 + + + 38 + 130 + 153 + 0 + 0 + + + 1 + 618 + 1564 + 1 + 1 + + + 70 + 67 + 297 + 0 + 0 + + + 70 + 201 + 99 + 0 + 0 + + + 70 + 102 + 197 + 0 + 0 + + + 404 + 536 + 751 + 7 + 0 + + + 70 + 290 + 414 + 0 + 0 + + + 38 + 81 + 248 + 0 + 0 + + + 34 + 114 + 449 + 0 + 0 + + + 32 + 374 + 692 + 0 + 0 + + + 1 + 267 + 591 + 0 + 0 + + + 36 + 160 + 559 + 0 + 0 + + + 70 + 173 + 116 + 0 + 0 + + + 70 + 96 + 209 + 0 + 0 + + + 0 + 526 + 492 + 0 + 0 + + + 70 + 227 + 394 + 0 + 0 + + + 1 + 560 + 532 + 0 + 1 + + + 284 + 667 + 709 + 0 + 0 + + + 0 + 758 + 531 + 3 + 0 + + + 0 + 741 + 495 + 1 + 0 + + + 402 + 619 + 820 + 6 + 0 + + + 70 + 283 + 316 + 0 + 0 + + + 0 + 622 + 479 + 0 + 0 + + + 308 + 611 + 774 + 6 + 0 + + + 34 + 646 + 732 + 0 + 0 + + + 24 + 607 + 721 + 1 + 1 + + + 0 + 591 + 681 + 4 + 0 + + + 205 + 300 + 298 + 0 + 0 + + + 70 + 120 + 426 + 0 + 0 + + + 284 + 638 + 686 + 0 + 0 + + + 70 + 125 + 409 + 0 + 0 + + + 4 + 317 + 282 + 0 + 0 + + + 0 + 593 + 560 + 6 + 0 + + + 70 + 122 + 419 + 0 + 0 + + + 70 + 325 + 275 + 0 + 0 + + + 205 + 275 + 325 + 0 + 0 + + + 70 + 168 + 119 + 0 + 0 + + + 70 + 196 + 102 + 0 + 0 + + + 70 + 175 + 292 + 0 + 0 + + + 111 + 198 + 101 + 0 + 0 + + + 0 + 118 + 433 + 0 + 0 + + + 306 + 607 + 779 + 6 + 0 + + + 15 + 259 + 345 + 4 + 0 + + + 1 + 308 + 613 + 2 + 0 + + + 146 + 602 + 727 + 6 + 0 + + + 70 + 108 + 185 + 0 + 0 + + + 7 + 136 + 657 + 0 + 0 + + + 3 + 633 + 747 + 0 + 0 + + + 205 + 52 + 384 + 0 + 0 + + + 70 + 304 + 168 + 0 + 0 + + + 23 + 96 + 532 + 0 + 0 + + + 1 + 112 + 456 + 0 + 0 + + + 1 + 440 + 677 + 0 + 1 + + + 70 + 230 + 222 + 0 + 0 + + + 284 + 671 + 705 + 2 + 0 + + + 285 + 466 + 490 + 0 + 0 + + + 41 + 490 + 466 + 0 + 0 + + + 34 + 181 + 495 + 0 + 0 + + + 37 + 627 + 475 + 2 + 0 + + + 70 + 205 + 249 + 0 + 0 + + + 395 + 493 + 674 + 1 + 0 + + + 34 + 116 + 440 + 0 + 0 + + + 205 + 121 + 167 + 0 + 0 + + + 0 + 656 + 559 + 0 + 0 + + + 193 + 624 + 477 + 0 + 1 + + + 70 + 273 + 187 + 0 + 0 + + + 1 + 190 + 631 + 0 + 0 + + + 284 + 626 + 699 + 2 + 0 + + + 70 + 206 + 582 + 6 + 0 + + + 34 + 423 + 704 + 0 + 0 + + + 34 + 117 + 436 + 0 + 0 + + + 394 + 476 + 698 + 1 + 0 + + + 430 + 644 + 788 + 1 + 0 + + + 205 + 126 + 160 + 0 + 0 + + + 71 + 216 + 555 + 2 + 0 + + + 21 + 585 + 509 + 4 + 0 + + + 4 + 51 + 395 + 0 + 0 + + + 23 + 260 + 461 + 0 + 0 + + + 80 + 161 + 556 + 4 + 0 + + + 4 + 250 + 204 + 0 + 0 + + + 49 + 102 + 500 + 0 + 0 + + + 37 + 183 + 655 + 0 + 0 + + + 4 + 55 + 366 + 0 + 0 + + + 38 + 183 + 110 + 0 + 0 + + + 24 + 606 + 722 + 2 + 1 + + + 35 + 84 + 607 + 0 + 0 + + + 34 + 349 + 654 + 4 + 0 + + + 45 + 541 + 614 + 0 + 0 + + + 0 + 667 + 498 + 6 + 0 + + + 70 + 274 + 186 + 0 + 0 + + + 1 + 189 + 634 + 0 + 0 + + + 34 + 761 + 529 + 3 + 0 + + + 1 + 322 + 586 + 2 + 0 + + + 5 + 510 + 507 + 6 + 0 + + + 1 + 92 + 554 + 7 + 0 + + + 70 + 172 + 117 + 0 + 0 + + + 70 + 154 + 331 + 0 + 0 + + + 29 + 438 + 3375 + 0 + 0 + + + 70 + 87 + 231 + 0 + 0 + + + 1 + 315 + 599 + 2 + 0 + + + 6 + 118 + 1599 + 0 + 0 + + + 0 + 94 + 542 + 7 + 0 + + + 0 + 295 + 535 + 6 + 0 + + + 284 + 669 + 707 + 2 + 0 + + + 70 + 203 + 251 + 0 + 0 + + + 0 + 719 + 462 + 3 + 0 + + + 70 + 171 + 298 + 0 + 0 + + + 70 + 91 + 221 + 0 + 0 + + + 0 + 348 + 655 + 0 + 0 + + + 34 + 594 + 618 + 2 + 0 + + + 285 + 470 + 485 + 0 + 0 + + + 70 + 224 + 537 + 0 + 0 + + + 34 + 371 + 709 + 0 + 0 + + + 70 + 127 + 160 + 0 + 0 + + + 597 + 672 + 443 + 6 + 0 + + + 20 + 189 + 472 + 0 + 0 + + + 38 + 65 + 313 + 0 + 0 + + + 306 + 504 + 514 + 0 + 0 + + + 70 + 133 + 383 + 0 + 0 + + + 283 + 594 + 855 + 7 + 0 + + + 0 + 760 + 483 + 3 + 0 + + + 284 + 651 + 672 + 0 + 0 + + + 70 + 223 + 400 + 0 + 0 + + + 1 + 484 + 471 + 0 + 0 + + + 70 + 58 + 350 + 0 + 0 + + + 107 + 201 + 101 + 0 + 0 + + + 185 + 625 + 476 + 2 + 1 + + + 36 + 663 + 449 + 0 + 0 + + + 38 + 199 + 102 + 0 + 0 + + + 38 + 689 + 686 + 2 + 0 + + + 4 + 92 + 553 + 7 + 0 + + + 63 + 103 + 494 + 0 + 0 + + + 34 + 592 + 620 + 2 + 0 + + + 377 + 617 + 709 + 0 + 0 + + + 70 + 126 + 404 + 0 + 0 + + + 150 + 518 + 440 + 0 + 0 + + + 34 + 743 + 494 + 3 + 0 + + + 951 + 638 + 796 + 0 + 0 + + + 139 + 100 + 509 + 2 + 0 + + + 37 + 628 + 474 + 2 + 0 + + + 3 + 219 + 549 + 6 + 0 + + + 45 + 104 + 489 + 6 + 0 + + + 192 + 661 + 502 + 4 + 0 + + + 70 + 48 + 422 + 0 + 0 + + + 1 + 682 + 693 + 0 + 0 + + + 11 + 221 + 544 + 4 + 0 + + + 394 + 499 + 665 + 1 + 0 + + + 284 + 624 + 701 + 2 + 0 + + + 70 + 201 + 253 + 0 + 0 + + + 597 + 746 + 492 + 2 + 0 + + + 6 + 129 + 1462 + 0 + 0 + + + 103 + 195 + 104 + 0 + 0 + + + 45 + 605 + 723 + 6 + 0 + + + 1 + 185 + 650 + 0 + 0 + + + 0 + 686 + 535 + 1 + 0 + + + 70 + 136 + 374 + 0 + 0 + + + 284 + 661 + 715 + 0 + 0 + + + 278 + 439 + 678 + 4 + 0 + + + 143 + 264 + 2950 + 2 + 0 + + + 70 + 301 + 296 + 0 + 0 + + + 306 + 721 + 509 + 5 + 0 + + + 38 + 230 + 221 + 0 + 0 + + + 70 + 130 + 391 + 0 + 0 + + + 285 + 465 + 490 + 0 + 0 + + + 4 + 242 + 210 + 0 + 0 + + + 13 + 165 + 308 + 0 + 0 + + + 97 + 617 + 823 + 6 + 0 + + + 183 + 474 + 700 + 2 + 0 + + + 0 + 171 + 521 + 0 + 0 + + + 0 + 679 + 696 + 0 + 0 + + + 70 + 77 + 263 + 0 + 0 + + + 205 + 124 + 410 + 0 + 0 + + + 7 + 277 + 434 + 4 + 0 + + + 55 + 696 + 679 + 1 + 0 + + + 70 + 125 + 162 + 0 + 0 + + + 1 + 609 + 776 + 3 + 0 + + + 47 + 486 + 388 + 4 + 0 + + + 115 + 615 + 711 + 2 + 1 + + + 25 + 134 + 665 + 0 + 0 + + + 70 + 179 + 284 + 0 + 0 + + + 273 + 486 + 541 + 0 + 0 + + + 1 + 621 + 761 + 0 + 0 + + + 21 + 594 + 501 + 4 + 0 + + + 70 + 142 + 144 + 0 + 0 + + + 284 + 665 + 711 + 2 + 0 + + + 70 + 132 + 155 + 0 + 0 + + + 34 + 179 + 499 + 0 + 0 + + + 72 + 197 + 610 + 3 + 0 + + + 284 + 647 + 676 + 0 + 0 + + + 4 + 326 + 274 + 0 + 0 + + + 38 + 53 + 386 + 0 + 0 + + + 27 + 137 + 652 + 0 + 0 + + + 284 + 632 + 692 + 2 + 0 + + + 0 + 521 + 497 + 0 + 0 + + + 0 + 766 + 526 + 3 + 0 + + + 4 + 65 + 315 + 0 + 0 + + + 45 + 104 + 488 + 6 + 0 + + + 70 + 123 + 166 + 0 + 0 + + + 206 + 64 + 319 + 0 + 0 + + + 0 + 611 + 487 + 0 + 0 + + + 1 + 310 + 608 + 2 + 0 + + + 205 + 484 + 389 + 1 + 1 + + + 284 + 645 + 678 + 2 + 0 + + + 4 + 52 + 393 + 0 + 0 + + + 70 + 61 + 335 + 0 + 0 + + + 0 + 178 + 675 + 0 + 0 + + + 597 + 691 + 531 + 4 + 0 + + + 306 + 684 + 435 + 0 + 0 + + + 450 + 624 + 588 + 0 + 0 + + + 1 + 306 + 616 + 2 + 0 + + + 70 + 273 + 186 + 0 + 0 + + + 1 + 186 + 646 + 0 + 0 + + + 1 + 91 + 558 + 0 + 0 + + + 597 + 672 + 494 + 6 + 0 + + + 70 + 52 + 392 + 0 + 0 + + + 1 + 107 + 474 + 1 + 1 + + + 70 + 319 + 159 + 0 + 0 + + + 659 + 638 + 741 + 0 + 0 + + + 1 + 250 + 357 + 0 + 1 + + + 106 + 198 + 103 + 0 + 0 + + + 103 + 569 + 708 + 0 + 0 + + + 1 + 172 + 519 + 0 + 0 + + + 7 + 251 + 630 + 6 + 0 + + + 938 + 693 + 631 + 0 + 0 + + + 70 + 53 + 385 + 0 + 0 + + + 5 + 273 + 440 + 0 + 0 + + + 4 + 264 + 192 + 0 + 0 + + + 25 + 96 + 528 + 0 + 0 + + + 284 + 663 + 713 + 2 + 0 + + + 105 + 164 + 544 + 0 + 0 + + + 70 + 129 + 393 + 0 + 0 + + + 23 + 289 + 547 + 0 + 0 + + + 70 + 130 + 390 + 0 + 0 + + + 70 + 93 + 219 + 0 + 0 + + + 70 + 321 + 278 + 0 + 0 + + + 313 + 676 + 491 + 3 + 0 + + + 70 + 312 + 286 + 0 + 0 + + + 70 + 245 + 207 + 0 + 0 + + + 4 + 71 + 287 + 0 + 0 + + + 4 + 237 + 214 + 0 + 0 + + + 3 + 254 + 627 + 4 + 0 + + + 177 + 327 + 487 + 0 + 0 + + + 597 + 672 + 444 + 6 + 0 + + + 217 + 65 + 284 + 2 + 0 + + + 37 + 296 + 538 + 4 + 0 + + + 4 + 314 + 283 + 0 + 0 + + + 70 + 237 + 504 + 6 + 0 + + + 37 + 107 + 463 + 0 + 0 + + + 70 + 283 + 422 + 0 + 0 + + + 70 + 266 + 334 + 0 + 0 + + + 16 + 94 + 527 + 6 + 0 + + + 70 + 161 + 308 + 0 + 0 + + + 565 + 748 + 446 + 0 + 0 + + + 179 + 228 + 524 + 6 + 0 + + + 70 + 60 + 308 + 0 + 0 + + + 70 + 88 + 210 + 0 + 0 + + + 0 + 609 + 490 + 0 + 0 + + + 27 + 556 + 600 + 0 + 0 + + + 70 + 206 + 580 + 6 + 0 + + + 32 + 531 + 757 + 0 + 0 + + + 205 + 181 + 274 + 0 + 0 + + + 70 + 322 + 371 + 0 + 0 + + + 70 + 268 + 185 + 0 + 0 + + + 205 + 185 + 268 + 0 + 0 + + + 70 + 124 + 149 + 0 + 0 + + + 0 + 691 + 533 + 1 + 0 + + + 313 + 719 + 464 + 3 + 0 + + + 58 + 405 + 3518 + 0 + 1 + + + 45 + 252 + 632 + 4 + 0 + + + 205 + 161 + 115 + 0 + 0 + + + 70 + 149 + 333 + 0 + 0 + + + 70 + 189 + 98 + 0 + 0 + + + 428 + 716 + 466 + 6 + 0 + + + 70 + 160 + 310 + 0 + 0 + + + 284 + 642 + 681 + 0 + 0 + + + 70 + 148 + 125 + 0 + 0 + + + 26 + 72 + 689 + 0 + 0 + + + 70 + 93 + 199 + 0 + 0 + + + 70 + 83 + 223 + 0 + 0 + + + 143 + 264 + 2953 + 2 + 0 + + + 284 + 663 + 711 + 0 + 0 + + + 284 + 630 + 694 + 2 + 0 + + + 70 + 173 + 287 + 0 + 0 + + + 20 + 150 + 593 + 0 + 0 + + + 70 + 106 + 175 + 0 + 0 + + + 70 + 70 + 265 + 0 + 0 + + + 38 + 271 + 441 + 1 + 1 + + + 68 + 631 + 473 + 2 + 0 + + + 313 + 699 + 527 + 3 + 0 + + + 34 + 681 + 490 + 0 + 0 + + + 1 + 190 + 628 + 0 + 0 + + + 0 + 593 + 678 + 4 + 0 + + + 113 + 474 + 704 + 0 + 0 + + + 4 + 107 + 462 + 0 + 0 + + + 70 + 57 + 326 + 0 + 0 + + + 70 + 163 + 114 + 0 + 0 + + + 283 + 505 + 453 + 0 + 0 + + + 668 + 729 + 505 + 0 + 0 + + + 1 + 187 + 638 + 0 + 0 + + + 313 + 755 + 442 + 3 + 0 + + + 70 + 49 + 379 + 0 + 0 + + + 70 + 174 + 284 + 0 + 0 + + + 4 + 98 + 190 + 0 + 0 + + + 4 + 207 + 430 + 0 + 0 + + + 313 + 681 + 438 + 3 + 0 + + + 7 + 534 + 753 + 2 + 0 + + + 284 + 665 + 709 + 2 + 0 + + + 70 + 315 + 157 + 0 + 0 + + + 7 + 253 + 630 + 2 + 0 + + + 0 + 636 + 469 + 5 + 0 + + + 20 + 115 + 430 + 0 + 0 + + + 146 + 602 + 726 + 2 + 0 + + + 23 + 637 + 578 + 0 + 0 + + + 217 + 65 + 286 + 6 + 0 + + + 196 + 163 + 546 + 0 + 0 + + + 4 + 74 + 252 + 0 + 0 + + + 4 + 63 + 296 + 0 + 0 + + + 377 + 613 + 713 + 2 + 0 + + + 0 + 92 + 538 + 7 + 0 + + + 70 + 300 + 165 + 0 + 0 + + + 70 + 132 + 375 + 0 + 0 + + + 70 + 91 + 205 + 0 + 0 + + + 38 + 291 + 306 + 0 + 0 + + + 47 + 493 + 386 + 4 + 0 + + + 70 + 280 + 318 + 0 + 0 + + + 70 + 136 + 137 + 0 + 0 + + + 3 + 306 + 521 + 4 + 0 + + + 153 + 520 + 440 + 0 + 0 + + + 445 + 654 + 563 + 6 + 0 + + + 4 + 213 + 418 + 0 + 0 + + + 4 + 125 + 149 + 0 + 0 + + + 45 + 102 + 485 + 4 + 0 + + + 962 + 634 + 798 + 4 + 0 + + + 284 + 639 + 684 + 0 + 0 + + + 1 + 284 + 670 + 0 + 0 + + + 7 + 136 + 655 + 4 + 0 + + + 70 + 244 + 203 + 0 + 0 + + + 597 + 732 + 456 + 0 + 0 + + + 4 + 75 + 249 + 0 + 0 + + + 284 + 628 + 696 + 2 + 0 + + + 38 + 183 + 102 + 0 + 0 + + + 273 + 486 + 542 + 0 + 0 + + + 313 + 673 + 496 + 3 + 0 + + + 71 + 104 + 476 + 2 + 0 + + + 20 + 620 + 705 + 4 + 0 + + + 70 + 242 + 368 + 0 + 0 + + + 383 + 519 + 440 + 4 + 0 + + + 597 + 731 + 456 + 0 + 0 + + + 70 + 128 + 146 + 0 + 0 + + + 37 + 346 + 660 + 2 + 0 + + + 283 + 503 + 454 + 0 + 0 + + + 284 + 657 + 717 + 0 + 0 + + + 0 + 288 + 660 + 0 + 0 + + + 3 + 218 + 549 + 6 + 0 + + + 394 + 499 + 668 + 1 + 0 + + + 284 + 671 + 702 + 2 + 0 + + + 4 + 237 + 208 + 0 + 0 + + + 70 + 156 + 316 + 0 + 0 + + + 3 + 93 + 530 + 6 + 0 + + + 597 + 746 + 494 + 2 + 0 + + + 70 + 300 + 399 + 0 + 0 + + + 3 + 254 + 628 + 4 + 0 + + + 597 + 694 + 531 + 4 + 0 + + + 597 + 672 + 496 + 6 + 0 + + + 97 + 654 + 668 + 6 + 0 + + + 70 + 175 + 107 + 0 + 0 + + + 70 + 60 + 312 + 0 + 0 + + + 389 + 658 + 664 + 4 + 0 + + + 0 + 730 + 551 + 3 + 0 + + + 21 + 252 + 633 + 6 + 0 + + + 306 + 680 + 542 + 5 + 0 + + + 1 + 648 + 727 + 1 + 0 + + + 0 + 670 + 445 + 5 + 0 + + + 70 + 261 + 189 + 0 + 0 + + + 4 + 285 + 311 + 0 + 0 + + + 70 + 86 + 218 + 0 + 0 + + + 37 + 469 + 487 + 0 + 0 + + + 215 + 66 + 284 + 2 + 0 + + + 11 + 629 + 749 + 0 + 0 + + + 70 + 192 + 257 + 0 + 0 + + + 284 + 626 + 698 + 2 + 0 + + + 34 + 760 + 485 + 3 + 0 + + + 70 + 210 + 235 + 0 + 0 + + + 306 + 511 + 447 + 0 + 0 + + + 1 + 508 + 587 + 0 + 0 + + + 97 + 179 + 669 + 2 + 0 + + + 597 + 679 + 491 + 6 + 0 + + + 70 + 220 + 403 + 0 + 0 + + + 33 + 479 + 696 + 2 + 0 + + + 34 + 368 + 716 + 0 + 0 + + + 178 + 229 + 523 + 2 + 0 + + + 284 + 637 + 686 + 0 + 0 + + + 5 + 494 + 385 + 0 + 0 + + + 37 + 295 + 541 + 4 + 0 + + + 1 + 136 + 652 + 0 + 1 + + + 70 + 116 + 162 + 0 + 0 + + + 294 + 472 + 484 + 0 + 0 + + + 4 + 74 + 254 + 0 + 0 + + + 1 + 186 + 644 + 0 + 0 + + + 1 + 184 + 651 + 0 + 0 + + + 32 + 477 + 699 + 2 + 0 + + + 7 + 135 + 657 + 0 + 0 + + + 285 + 475 + 481 + 0 + 0 + + + 70 + 100 + 188 + 0 + 0 + + + 1 + 349 + 545 + 0 + 0 + + + 0 + 89 + 555 + 7 + 0 + + + 70 + 200 + 247 + 0 + 0 + + + 718 + 736 + 453 + 0 + 0 + + + 19 + 261 + 459 + 4 + 0 + + + 402 + 618 + 819 + 0 + 0 + + + 4 + 305 + 392 + 0 + 0 + + + 70 + 203 + 589 + 0 + 0 + + + 405 + 469 + 711 + 7 + 0 + + + 70 + 192 + 256 + 0 + 0 + + + 284 + 659 + 715 + 0 + 0 + + + 398 + 473 + 705 + 6 + 0 + + + 306 + 512 + 582 + 0 + 0 + + + 313 + 751 + 444 + 3 + 0 + + + 395 + 475 + 702 + 1 + 0 + + + 70 + 69 + 273 + 0 + 0 + + + 34 + 351 + 651 + 4 + 0 + + + 97 + 179 + 668 + 0 + 0 + + + 70 + 196 + 251 + 0 + 0 + + + 58 + 204 + 435 + 4 + 0 + + + 24 + 176 + 107 + 0 + 1 + + + 34 + 517 + 442 + 0 + 0 + + + 5 + 104 + 473 + 0 + 0 + + + 1 + 173 + 513 + 0 + 0 + + + 4 + 199 + 601 + 0 + 0 + + + 377 + 666 + 760 + 6 + 0 + + + 70 + 76 + 248 + 0 + 0 + + + 4 + 52 + 363 + 0 + 0 + + + 286 + 524 + 495 + 0 + 0 + + + 0 + 481 + 395 + 6 + 0 + + + 37 + 299 + 534 + 4 + 0 + + + 70 + 89 + 212 + 0 + 0 + + + 34 + 621 + 537 + 6 + 0 + + + 5 + 714 + 516 + 0 + 0 + + + 395 + 484 + 689 + 6 + 0 + + + 51 + 278 + 2974 + 4 + 0 + + + 220 + 120 + 410 + 0 + 0 + + + 0 + 89 + 553 + 7 + 0 + + + 668 + 734 + 502 + 0 + 0 + + + 100 + 562 + 716 + 0 + 0 + + + 119 + 691 + 682 + 0 + 0 + + + 36 + 127 + 699 + 6 + 0 + + + 70 + 265 + 335 + 0 + 0 + + + 1 + 606 + 664 + 2 + 0 + + + 70 + 230 + 214 + 0 + 0 + + + 45 + 605 + 722 + 6 + 0 + + + 8 + 107 + 460 + 3 + 0 + + + 70 + 137 + 138 + 0 + 0 + + + 1 + 554 + 602 + 1 + 1 + + + 70 + 62 + 305 + 0 + 0 + + + 88 + 644 + 786 + 7 + 0 + + + 718 + 733 + 455 + 2 + 0 + + + 36 + 375 + 703 + 0 + 0 + + + 284 + 650 + 672 + 0 + 0 + + + 306 + 600 + 728 + 2 + 0 + + + 284 + 624 + 700 + 2 + 0 + + + 1 + 191 + 465 + 0 + 0 + + + 70 + 159 + 119 + 0 + 0 + + + 284 + 661 + 713 + 2 + 0 + + + 0 + 688 + 685 + 2 + 0 + + + 4 + 250 + 197 + 0 + 0 + + + 38 + 125 + 394 + 0 + 0 + + + 1 + 543 + 549 + 0 + 0 + + + 103 + 523 + 570 + 0 + 0 + + + 37 + 264 + 605 + 2 + 0 + + + 4 + 72 + 263 + 0 + 0 + + + 70 + 142 + 347 + 0 + 0 + + + 307 + 654 + 510 + 2 + 0 + + + 1 + 540 + 552 + 0 + 0 + + + 70 + 177 + 107 + 0 + 0 + + + 205 + 649 + 780 + 0 + 0 + + + 36 + 381 + 692 + 0 + 0 + + + 63 + 71 + 694 + 2 + 0 + + + 34 + 710 + 519 + 2 + 0 + + + 3 + 306 + 522 + 4 + 0 + + + 38 + 244 + 364 + 0 + 0 + + + 27 + 101 + 496 + 4 + 0 + + + 205 + 59 + 322 + 0 + 0 + + + 597 + 746 + 493 + 2 + 0 + + + 4 + 83 + 229 + 0 + 0 + + + 70 + 181 + 105 + 0 + 0 + + + 306 + 515 + 445 + 0 + 0 + + + 51 + 622 + 702 + 6 + 0 + + + 70 + 157 + 319 + 0 + 0 + + + 37 + 294 + 540 + 4 + 0 + + + 3 + 252 + 630 + 2 + 0 + + + 4 + 189 + 265 + 0 + 0 + + + 70 + 226 + 391 + 0 + 0 + + + 1 + 188 + 470 + 0 + 0 + + + 179 + 227 + 524 + 6 + 0 + + + 396 + 536 + 749 + 1 + 0 + + + 70 + 101 + 188 + 0 + 0 + + + 38 + 188 + 101 + 0 + 0 + + + 36 + 522 + 439 + 0 + 0 + + + 402 + 617 + 821 + 0 + 0 + + + 70 + 242 + 207 + 0 + 0 + + + 38 + 120 + 158 + 0 + 0 + + + 70 + 149 + 336 + 0 + 0 + + + 70 + 147 + 129 + 0 + 0 + + + 1 + 586 + 685 + 0 + 0 + + + 70 + 326 + 271 + 0 + 0 + + + 70 + 321 + 156 + 0 + 0 + + + 34 + 699 + 675 + 2 + 0 + + + 70 + 272 + 184 + 0 + 0 + + + 306 + 763 + 482 + 3 + 0 + + + 205 + 335 + 355 + 0 + 0 + + + 0 + 648 + 514 + 6 + 0 + + + 205 + 514 + 446 + 0 + 0 + + + 70 + 207 + 575 + 0 + 0 + + + 70 + 220 + 228 + 0 + 0 + + + 151 + 521 + 440 + 0 + 0 + + + 55 + 695 + 679 + 2 + 0 + + + 70 + 48 + 397 + 0 + 0 + + + 938 + 691 + 632 + 0 + 0 + + + 1 + 179 + 665 + 0 + 0 + + + 4 + 131 + 383 + 0 + 0 + + + 3 + 134 + 660 + 0 + 0 + + + 284 + 632 + 691 + 2 + 0 + + + 70 + 223 + 225 + 0 + 0 + + + 0 + 613 + 655 + 3 + 0 + + + 1 + 619 + 483 + 0 + 0 + + + 37 + 298 + 533 + 4 + 0 + + + 14 + 618 + 1561 + 4 + 0 + + + 70 + 252 + 199 + 0 + 0 + + + 70 + 126 + 398 + 0 + 0 + + + 4 + 92 + 207 + 0 + 0 + + + 4 + 680 + 694 + 0 + 0 + + + 7 + 135 + 655 + 0 + 0 + + + 38 + 185 + 103 + 0 + 0 + + + 1 + 294 + 646 + 0 + 0 + + + 97 + 612 + 656 + 3 + 0 + + + 3 + 104 + 482 + 0 + 0 + + + 283 + 493 + 535 + 0 + 0 + + + 20 + 115 + 436 + 0 + 0 + + + 3 + 106 + 473 + 2 + 0 + + + 394 + 638 + 794 + 4 + 0 + + + 286 + 169 + 523 + 3 + 0 + + + 192 + 661 + 504 + 4 + 0 + + + 597 + 752 + 443 + 2 + 0 + + + 284 + 646 + 676 + 0 + 0 + + + 286 + 495 + 673 + 1 + 0 + + + 36 + 127 + 696 + 6 + 0 + + + 63 + 495 + 463 + 2 + 0 + + + 20 + 603 + 610 + 0 + 0 + + + 70 + 74 + 257 + 0 + 0 + + + 0 + 182 + 653 + 0 + 0 + + + 196 + 163 + 543 + 0 + 0 + + + 938 + 694 + 629 + 0 + 0 + + + 70 + 285 + 417 + 0 + 0 + + + 284 + 641 + 681 + 2 + 0 + + + 4 + 53 + 361 + 0 + 0 + + + 70 + 134 + 373 + 0 + 0 + + + 26 + 255 + 466 + 6 + 0 + + + 283 + 609 + 775 + 0 + 0 + + + 70 + 153 + 125 + 0 + 0 + + + 718 + 734 + 454 + 2 + 0 + + + 1 + 307 + 618 + 2 + 0 + + + 15 + 484 + 392 + 0 + 0 + + + 45 + 103 + 485 + 4 + 0 + + + 3 + 253 + 628 + 4 + 0 + + + 34 + 373 + 696 + 0 + 0 + + + 205 + 72 + 265 + 0 + 0 + + + 70 + 267 + 187 + 0 + 0 + + + 396 + 539 + 745 + 1 + 0 + + + 1 + 228 + 521 + 0 + 1 + + + 70 + 240 + 208 + 0 + 0 + + + 70 + 260 + 192 + 0 + 0 + + + 34 + 422 + 708 + 0 + 0 + + + 70 + 318 + 157 + 0 + 0 + + + 284 + 661 + 714 + 2 + 0 + + + 97 + 178 + 668 + 1 + 0 + + + 100 + 693 + 630 + 0 + 0 + + + 70 + 221 + 538 + 0 + 0 + + + 3 + 215 + 553 + 2 + 0 + + + 70 + 106 + 181 + 0 + 0 + + + 20 + 118 + 424 + 0 + 0 + + + 0 + 199 + 445 + 0 + 0 + + + 51 + 532 + 755 + 2 + 0 + + + 284 + 663 + 712 + 2 + 0 + + + 1 + 75 + 667 + 0 + 1 + + + 70 + 151 + 127 + 0 + 0 + + + 284 + 630 + 693 + 2 + 0 + + + 284 + 643 + 679 + 2 + 0 + + + 214 + 67 + 286 + 7 + 0 + + + 205 + 295 + 403 + 0 + 0 + + + 281 + 94 + 532 + 6 + 0 + + + 1 + 603 + 666 + 2 + 0 + + + 70 + 223 + 397 + 0 + 0 + + + 70 + 72 + 266 + 0 + 0 + + + 34 + 616 + 541 + 6 + 0 + + + 51 + 608 + 718 + 4 + 0 + + + 45 + 541 + 616 + 4 + 0 + + + 70 + 165 + 303 + 0 + 0 + + + 5 + 690 + 483 + 4 + 0 + + + 188 + 290 + 548 + 0 + 0 + + + 88 + 213 + 558 + 0 + 0 + + + 70 + 288 + 173 + 0 + 0 + + + 70 + 173 + 288 + 0 + 0 + + + 718 + 748 + 445 + 0 + 0 + + + 103 + 569 + 706 + 0 + 0 + + + 70 + 53 + 363 + 0 + 0 + + + 70 + 252 + 473 + 6 + 0 + + + 4 + 65 + 296 + 0 + 0 + + + 70 + 267 + 330 + 0 + 0 + + + 34 + 295 + 539 + 4 + 0 + + + 1 + 182 + 655 + 0 + 0 + + + 4 + 178 + 280 + 0 + 0 + + + 4 + 131 + 147 + 0 + 0 + + + 70 + 248 + 201 + 0 + 0 + + + 4 + 60 + 321 + 0 + 0 + + + 70 + 107 + 180 + 0 + 0 + + + 284 + 627 + 696 + 0 + 0 + + + 284 + 638 + 684 + 0 + 0 + + + 284 + 667 + 707 + 0 + 0 + + + 20 + 115 + 433 + 0 + 0 + + + 70 + 193 + 258 + 0 + 0 + + + 36 + 376 + 702 + 0 + 0 + + + 23 + 300 + 530 + 4 + 0 + + + 38 + 129 + 149 + 0 + 0 + + + 7 + 628 + 586 + 0 + 0 + + + 0 + 674 + 546 + 1 + 0 + + + 407 + 618 + 820 + 0 + 0 + + + 1 + 617 + 651 + 7 + 0 + + + 1 + 137 + 643 + 0 + 0 + + + 284 + 656 + 719 + 0 + 0 + + + 32 + 535 + 751 + 0 + 0 + + + 34 + 299 + 532 + 4 + 0 + + + 0 + 526 + 502 + 0 + 0 + + + 70 + 157 + 123 + 0 + 0 + + + 34 + 751 + 535 + 3 + 0 + + + 4 + 308 + 162 + 0 + 0 + + + 962 + 654 + 775 + 3 + 0 + + + 4 + 221 + 399 + 0 + 0 + + + 32 + 374 + 706 + 0 + 0 + + + 45 + 602 + 725 + 0 + 0 + + + 313 + 712 + 517 + 3 + 0 + + + 1 + 138 + 639 + 0 + 0 + + + 214 + 68 + 284 + 2 + 0 + + + 110 + 525 + 569 + 0 + 0 + + + 284 + 628 + 695 + 2 + 0 + + + 32 + 381 + 693 + 0 + 0 + + + 38 + 119 + 419 + 0 + 0 + + + 283 + 607 + 777 + 0 + 0 + + + 1 + 184 + 648 + 0 + 0 + + + 34 + 654 + 509 + 6 + 0 + + + 70 + 112 + 172 + 0 + 0 + + + 70 + 172 + 112 + 0 + 0 + + + 284 + 669 + 705 + 0 + 0 + + + 70 + 81 + 238 + 0 + 0 + + + 597 + 730 + 456 + 0 + 0 + + + 38 + 61 + 316 + 0 + 0 + + + 0 + 92 + 542 + 7 + 0 + + + 1 + 607 + 835 + 0 + 0 + + + 48 + 220 + 542 + 6 + 0 + + + 1 + 485 + 391 + 0 + 1 + + + 283 + 501 + 457 + 0 + 0 + + + 25 + 213 + 3519 + 0 + 0 + + + 417 + 619 + 649 + 7 + 0 + + + 70 + 145 + 344 + 0 + 0 + + + 5 + 333 + 569 + 0 + 0 + + + 1 + 171 + 516 + 0 + 0 + + + 7 + 253 + 629 + 0 + 0 + + + 34 + 298 + 534 + 4 + 0 + + + 97 + 178 + 669 + 0 + 0 + + + 1 + 181 + 658 + 0 + 0 + + + 284 + 671 + 703 + 2 + 0 + + + 38 + 239 + 208 + 0 + 0 + + + 63 + 104 + 478 + 0 + 0 + + + 207 + 60 + 323 + 0 + 0 + + + 7 + 346 + 662 + 2 + 0 + + + 406 + 291 + 651 + 4 + 0 + + + 71 + 487 + 389 + 0 + 0 + + + 938 + 687 + 635 + 0 + 0 + + + 205 + 231 + 215 + 0 + 0 + + + 718 + 735 + 453 + 2 + 0 + + + 38 + 151 + 128 + 0 + 0 + + + 1 + 186 + 640 + 0 + 0 + + + 3 + 559 + 534 + 0 + 0 + + + 37 + 347 + 660 + 1 + 0 + + + 59 + 148 + 596 + 2 + 0 + + + 38 + 675 + 545 + 6 + 0 + + + 68 + 685 + 637 + 0 + 0 + + + 597 + 693 + 531 + 4 + 0 + + + 70 + 123 + 158 + 0 + 0 + + + 37 + 630 + 474 + 3 + 0 + + + 38 + 313 + 159 + 0 + 0 + + + 70 + 185 + 105 + 0 + 0 + + + 69 + 652 + 458 + 2 + 0 + + + 70 + 283 + 421 + 0 + 0 + + + 377 + 665 + 762 + 5 + 0 + + + 284 + 658 + 717 + 0 + 0 + + + 205 + 127 + 392 + 0 + 0 + + + 284 + 626 + 697 + 2 + 0 + + + 194 + 596 + 501 + 4 + 0 + + + 4 + 62 + 313 + 0 + 0 + + + 70 + 281 + 177 + 0 + 0 + + + 0 + 638 + 468 + 5 + 0 + + + 4 + 61 + 318 + 0 + 0 + + + 70 + 52 + 373 + 0 + 0 + + + 284 + 636 + 686 + 0 + 0 + + + 15 + 441 + 677 + 4 + 0 + + + 70 + 316 + 377 + 0 + 0 + + + 3 + 234 + 507 + 2 + 0 + + + 70 + 59 + 373 + 0 + 0 + + + 70 + 213 + 265 + 0 + 0 + + + 34 + 86 + 656 + 0 + 0 + + + 284 + 624 + 705 + 2 + 0 + + + 106 + 223 + 253 + 4 + 0 + + + 70 + 313 + 379 + 0 + 0 + + + 1 + 124 + 455 + 0 + 1 + + + 104 + 229 + 518 + 4 + 0 + + + 1 + 633 + 695 + 0 + 0 + + + 70 + 156 + 141 + 0 + 0 + + + 70 + 190 + 297 + 0 + 0 + + + 597 + 746 + 443 + 4 + 0 + + + 34 + 301 + 534 + 4 + 0 + + + 70 + 169 + 130 + 0 + 0 + + + 25 + 450 + 492 + 3 + 0 + + + 7 + 120 + 470 + 4 + 0 + + + 143 + 648 + 632 + 0 + 0 + + + 284 + 632 + 696 + 2 + 0 + + + 0 + 180 + 659 + 0 + 0 + + + 7 + 119 + 474 + 4 + 0 + + + 37 + 627 + 477 + 0 + 0 + + + 395 + 624 + 803 + 0 + 0 + + + 70 + 112 + 196 + 0 + 0 + + + 284 + 654 + 719 + 0 + 0 + + + 70 + 195 + 429 + 0 + 0 + + + 107 + 222 + 254 + 0 + 0 + + + 310 + 521 + 492 + 0 + 0 + + + 284 + 667 + 705 + 0 + 0 + + + 29 + 359 + 714 + 0 + 0 + + + 70 + 205 + 275 + 0 + 0 + + + 97 + 276 + 303 + 6 + 0 + + + 70 + 308 + 385 + 0 + 0 + + + 1 + 48 + 457 + 1 + 0 + + + 37 + 483 + 404 + 0 + 0 + + + 205 + 324 + 366 + 0 + 0 + + + 70 + 59 + 372 + 0 + 0 + + + 70 + 62 + 354 + 0 + 0 + + + 1 + 185 + 641 + 0 + 0 + + + 597 + 672 + 445 + 6 + 0 + + + 33 + 379 + 709 + 0 + 0 + + + 34 + 120 + 697 + 6 + 0 + + + 4 + 63 + 348 + 0 + 0 + + + 34 + 297 + 541 + 4 + 0 + + + 38 + 706 + 666 + 0 + 0 + + + 359 + 426 + 458 + 4 + 0 + + + 70 + 195 + 289 + 0 + 0 + + + 1 + 163 + 513 + 1 + 1 + + + 1 + 185 + 452 + 0 + 0 + + + 205 + 113 + 194 + 0 + 0 + + + 284 + 489 + 399 + 6 + 0 + + + 70 + 241 + 347 + 0 + 0 + + + 4 + 244 + 231 + 0 + 0 + + + 0 + 358 + 545 + 0 + 0 + + + 70 + 286 + 197 + 0 + 0 + + + 306 + 696 + 519 + 1 + 0 + + + 284 + 643 + 684 + 0 + 0 + + + 106 + 229 + 246 + 4 + 0 + + + 15 + 561 + 533 + 0 + 0 + + + 22 + 651 + 629 + 4 + 0 + + + 217 + 78 + 281 + 0 + 0 + + + 562 + 664 + 544 + 0 + 0 + + + 70 + 317 + 374 + 0 + 0 + + + 284 + 665 + 707 + 0 + 0 + + + 1 + 277 + 580 + 0 + 0 + + + 45 + 425 + 459 + 6 + 0 + + + 70 + 176 + 320 + 0 + 0 + + + 0 + 750 + 546 + 3 + 0 + + + 70 + 92 + 238 + 0 + 0 + + + 114 + 615 + 715 + 0 + 1 + + + 25 + 448 + 494 + 3 + 0 + + + 70 + 251 + 333 + 0 + 0 + + + 22 + 273 + 435 + 0 + 1 + + + 51 + 266 + 2965 + 2 + 0 + + + 445 + 642 + 563 + 6 + 0 + + + 38 + 708 + 664 + 0 + 0 + + + 0 + 617 + 485 + 0 + 0 + + + 34 + 703 + 713 + 2 + 0 + + + 46 + 450 + 434 + 2 + 0 + + + 1 + 177 + 671 + 0 + 0 + + + 34 + 505 + 532 + 0 + 0 + + + 12 + 174 + 325 + 0 + 0 + + + 70 + 195 + 290 + 0 + 0 + + + 0 + 130 + 435 + 0 + 0 + + + 1 + 190 + 625 + 0 + 0 + + + 205 + 548 + 468 + 0 + 0 + + + 70 + 245 + 341 + 0 + 0 + + + 34 + 749 + 441 + 7 + 0 + + + 70 + 306 + 273 + 0 + 0 + + + 70 + 221 + 378 + 0 + 0 + + + 34 + 181 + 656 + 1 + 0 + + + 70 + 328 + 362 + 0 + 0 + + + 284 + 452 + 432 + 4 + 0 + + + 9 + 119 + 475 + 0 + 0 + + + 45 + 538 + 614 + 0 + 0 + + + 0 + 627 + 653 + 0 + 0 + + + 36 + 504 + 439 + 0 + 0 + + + 284 + 649 + 678 + 0 + 0 + + + 70 + 88 + 248 + 0 + 0 + + + 70 + 74 + 295 + 0 + 0 + + + 37 + 754 + 543 + 3 + 0 + + + 70 + 68 + 321 + 0 + 0 + + + 34 + 428 + 699 + 0 + 0 + + + 4 + 277 + 204 + 0 + 0 + + + 70 + 139 + 157 + 0 + 0 + + + 0 + 299 + 537 + 6 + 0 + + + 0 + 129 + 438 + 0 + 0 + + + 45 + 166 + 503 + 6 + 0 + + + 34 + 291 + 671 + 0 + 0 + + + 284 + 482 + 459 + 2 + 0 + + + 98 + 649 + 461 + 2 + 0 + + + 377 + 668 + 541 + 6 + 0 + + + 32 + 381 + 705 + 0 + 0 + + + 284 + 663 + 709 + 0 + 0 + + + 205 + 77 + 283 + 0 + 0 + + + 3 + 215 + 552 + 2 + 0 + + + 37 + 184 + 645 + 0 + 0 + + + 4 + 156 + 362 + 0 + 0 + + + 45 + 254 + 632 + 4 + 0 + + + 12 + 177 + 319 + 6 + 0 + + + 7 + 109 + 518 + 6 + 0 + + + 70 + 180 + 121 + 0 + 0 + + + 70 + 173 + 686 + 0 + 0 + + + 1 + 555 + 539 + 0 + 0 + + + 1 + 179 + 663 + 0 + 0 + + + 37 + 488 + 400 + 0 + 0 + + + 117 + 606 + 726 + 4 + 0 + + + 284 + 647 + 680 + 2 + 0 + + + 1 + 614 + 1564 + 1 + 1 + + + 70 + 319 + 177 + 0 + 0 + + + 310 + 519 + 494 + 0 + 0 + + + 0 + 625 + 655 + 0 + 0 + + + 4 + 70 + 311 + 0 + 0 + + + 3 + 123 + 459 + 0 + 0 + + + 16 + 256 + 627 + 4 + 0 + + + 70 + 194 + 291 + 0 + 0 + + + 37 + 482 + 405 + 0 + 0 + + + 70 + 170 + 128 + 0 + 0 + + + 70 + 184 + 308 + 0 + 0 + + + 205 + 161 + 352 + 0 + 0 + + + 70 + 112 + 194 + 0 + 0 + + + 597 + 680 + 531 + 4 + 0 + + + 34 + 86 + 659 + 0 + 0 + + + 1 + 695 + 677 + 2 + 1 + + + 2 + 349 + 635 + 1 + 1 + + + 21 + 594 + 504 + 0 + 0 + + + 70 + 52 + 418 + 0 + 0 + + + 1 + 109 + 520 + 1 + 1 + + + 284 + 655 + 672 + 0 + 0 + + + 597 + 746 + 484 + 2 + 0 + + + 70 + 91 + 239 + 0 + 0 + + + 36 + 505 + 439 + 0 + 0 + + + 37 + 300 + 535 + 4 + 0 + + + 70 + 152 + 373 + 0 + 0 + + + 70 + 146 + 149 + 0 + 0 + + + 104 + 229 + 517 + 4 + 0 + + + 70 + 252 + 225 + 0 + 0 + + + 29 + 84 + 675 + 0 + 0 + + + 70 + 64 + 339 + 0 + 0 + + + 0 + 693 + 521 + 1 + 0 + + + 157 + 536 + 617 + 4 + 0 + + + 70 + 236 + 240 + 0 + 0 + + + 7 + 120 + 472 + 0 + 0 + + + 37 + 654 + 673 + 5 + 0 + + + 7 + 119 + 476 + 0 + 0 + + + 70 + 206 + 275 + 0 + 0 + + + 70 + 194 + 292 + 0 + 0 + + + 192 + 762 + 434 + 0 + 0 + + + 33 + 375 + 716 + 0 + 0 + + + 70 + 184 + 118 + 0 + 0 + + + 4 + 225 + 373 + 0 + 0 + + + 284 + 658 + 715 + 0 + 0 + + + 278 + 614 + 588 + 0 + 0 + + + 1 + 323 + 605 + 2 + 0 + + + 1 + 113 + 501 + 1 + 1 + + + 34 + 427 + 701 + 0 + 0 + + + 0 + 296 + 660 + 0 + 0 + + + 4 + 313 + 268 + 0 + 0 + + + 70 + 56 + 387 + 0 + 0 + + + 20 + 444 + 440 + 6 + 0 + + + 0 + 664 + 498 + 6 + 0 + + + 70 + 242 + 234 + 0 + 0 + + + 38 + 156 + 363 + 0 + 0 + + + 34 + 179 + 661 + 2 + 0 + + + 8 + 232 + 510 + 1 + 0 + + + 34 + 129 + 439 + 0 + 0 + + + 0 + 760 + 475 + 0 + 0 + + + 70 + 235 + 357 + 0 + 0 + + + 70 + 219 + 99 + 0 + 0 + + + 70 + 80 + 271 + 0 + 0 + + + 1 + 117 + 484 + 6 + 0 + + + 70 + 206 + 407 + 0 + 0 + + + 284 + 626 + 703 + 2 + 0 + + + 21 + 588 + 509 + 0 + 0 + + + 70 + 128 + 169 + 0 + 0 + + + 205 + 208 + 104 + 0 + 0 + + + 46 + 447 + 437 + 2 + 0 + + + 1 + 128 + 442 + 0 + 0 + + + 37 + 297 + 540 + 4 + 0 + + + 70 + 249 + 475 + 6 + 0 + + + 284 + 492 + 397 + 6 + 0 + + + 4 + 79 + 274 + 0 + 0 + + + 1 + 188 + 446 + 0 + 0 + + + 1 + 191 + 439 + 0 + 0 + + + 110 + 230 + 246 + 4 + 0 + + + 70 + 245 + 231 + 0 + 0 + + + 283 + 445 + 439 + 4 + 0 + + + 562 + 666 + 542 + 0 + 0 + + + 284 + 657 + 716 + 2 + 0 + + + 205 + 318 + 372 + 0 + 0 + + + 1 + 612 + 489 + 0 + 0 + + + 597 + 672 + 492 + 6 + 0 + + + 284 + 651 + 676 + 0 + 0 + + + 183 + 473 + 699 + 2 + 0 + + + 4 + 241 + 348 + 0 + 0 + + + 1 + 301 + 649 + 0 + 0 + + + 70 + 119 + 182 + 0 + 0 + + + 34 + 389 + 690 + 0 + 0 + + + 1 + 302 + 531 + 4 + 0 + + + 70 + 316 + 375 + 0 + 0 + + + 70 + 90 + 240 + 0 + 0 + + + 70 + 291 + 288 + 0 + 0 + + + 55 + 563 + 532 + 0 + 0 + + + 310 + 524 + 489 + 0 + 0 + + + 5 + 350 + 633 + 0 + 0 + + + 285 + 488 + 454 + 0 + 0 + + + 1 + 497 + 540 + 6 + 0 + + + 313 + 711 + 508 + 3 + 0 + + + 70 + 212 + 102 + 0 + 0 + + + 111 + 231 + 246 + 0 + 0 + + + 1 + 168 + 499 + 0 + 1 + + + 284 + 671 + 701 + 2 + 0 + + + 192 + 760 + 435 + 0 + 0 + + + 205 + 92 + 235 + 0 + 0 + + + 70 + 58 + 372 + 0 + 0 + + + 34 + 754 + 479 + 3 + 0 + + + 114 + 306 + 639 + 0 + 0 + + + 286 + 596 + 606 + 4 + 0 + + + 407 + 637 + 567 + 0 + 0 + + + 0 + 714 + 463 + 3 + 0 + + + 15 + 109 + 521 + 4 + 0 + + + 306 + 702 + 670 + 4 + 0 + + + 1 + 164 + 511 + 0 + 1 + + + 12 + 185 + 307 + 2 + 0 + + + 23 + 484 + 404 + 0 + 0 + + + 21 + 465 + 644 + 6 + 0 + + + 70 + 205 + 277 + 0 + 0 + + + 0 + 319 + 613 + 2 + 0 + + + 70 + 208 + 273 + 0 + 0 + + + 70 + 85 + 254 + 0 + 0 + + + 1 + 121 + 469 + 0 + 1 + + + 12 + 173 + 328 + 0 + 0 + + + 45 + 425 + 460 + 6 + 0 + + + 1 + 179 + 468 + 0 + 0 + + + 114 + 619 + 711 + 1 + 1 + + + 0 + 599 + 683 + 4 + 0 + + + 70 + 217 + 386 + 0 + 0 + + + 284 + 628 + 701 + 2 + 0 + + + 274 + 618 + 761 + 2 + 0 + + + 33 + 479 + 690 + 2 + 0 + + + 718 + 728 + 454 + 0 + 0 + + + 0 + 182 + 460 + 0 + 0 + + + 16 + 256 + 626 + 4 + 0 + + + 38 + 690 + 638 + 0 + 0 + + + 284 + 655 + 718 + 2 + 0 + + + 70 + 207 + 572 + 0 + 0 + + + 3 + 281 + 298 + 0 + 0 + + + 38 + 61 + 353 + 0 + 0 + + + 0 + 757 + 477 + 0 + 0 + + + 13 + 183 + 310 + 3 + 0 + + + 205 + 73 + 295 + 0 + 0 + + + 1 + 542 + 495 + 0 + 0 + + + 37 + 629 + 476 + 2 + 0 + + + 34 + 682 + 439 + 3 + 0 + + + 938 + 693 + 634 + 0 + 0 + + + 34 + 699 + 472 + 3 + 0 + + + 70 + 207 + 275 + 0 + 0 + + + 20 + 99 + 575 + 0 + 0 + + + 286 + 159 + 523 + 3 + 0 + + + 70 + 144 + 156 + 0 + 0 + + + 70 + 192 + 117 + 0 + 0 + + + 44 + 150 + 554 + 0 + 1 + + + 20 + 543 + 473 + 0 + 0 + + + 0 + 766 + 471 + 0 + 0 + + + 70 + 59 + 381 + 0 + 0 + + + 4 + 271 + 210 + 0 + 0 + + + 8 + 232 + 509 + 0 + 0 + + + 284 + 489 + 398 + 6 + 0 + + + 37 + 264 + 607 + 2 + 0 + + + 5 + 123 + 463 + 0 + 0 + + + 7 + 214 + 552 + 6 + 0 + + + 0 + 501 + 443 + 0 + 0 + + + 7 + 117 + 711 + 6 + 0 + + + 284 + 650 + 676 + 0 + 0 + + + 597 + 672 + 491 + 6 + 0 + + + 377 + 656 + 550 + 4 + 0 + + + 205 + 150 + 150 + 0 + 0 + + + 292 + 436 + 509 + 6 + 0 + + + 45 + 425 + 458 + 6 + 0 + + + 70 + 193 + 431 + 0 + 0 + + + 51 + 612 + 718 + 4 + 0 + + + 938 + 692 + 635 + 0 + 0 + + + 164 + 86 + 662 + 5 + 0 + + + 70 + 121 + 186 + 0 + 0 + + + 284 + 664 + 709 + 0 + 0 + + + 70 + 272 + 209 + 0 + 0 + + + 4 + 304 + 187 + 0 + 0 + + + 394 + 476 + 693 + 1 + 0 + + + 445 + 623 + 579 + 0 + 0 + + + 313 + 693 + 476 + 3 + 0 + + + 70 + 101 + 222 + 0 + 0 + + + 37 + 131 + 434 + 0 + 0 + + + 284 + 624 + 704 + 2 + 0 + + + 70 + 115 + 195 + 0 + 0 + + + 37 + 763 + 536 + 3 + 0 + + + 70 + 224 + 100 + 0 + 0 + + + 4 + 54 + 415 + 0 + 0 + + + 70 + 196 + 290 + 0 + 0 + + + 398 + 643 + 732 + 7 + 0 + + + 284 + 662 + 711 + 0 + 0 + + + 37 + 161 + 516 + 4 + 0 + + + 34 + 720 + 501 + 3 + 0 + + + 0 + 612 + 539 + 6 + 0 + + + 70 + 143 + 157 + 0 + 0 + + + 50 + 114 + 499 + 0 + 0 + + + 0 + 188 + 628 + 0 + 0 + + + 7 + 120 + 474 + 4 + 0 + + + 20 + 634 + 569 + 0 + 0 + + + 205 + 206 + 109 + 0 + 0 + + + 20 + 585 + 751 + 2 + 0 + + + 70 + 224 + 527 + 0 + 0 + + + 284 + 648 + 678 + 0 + 0 + + + 70 + 165 + 136 + 0 + 0 + + + 70 + 136 + 165 + 0 + 0 + + + 205 + 170 + 132 + 0 + 0 + + + 7 + 121 + 470 + 4 + 0 + + + 0 + 669 + 448 + 5 + 0 + + + 0 + 763 + 473 + 0 + 0 + + + 597 + 672 + 446 + 6 + 0 + + + 111 + 222 + 257 + 0 + 0 + + + 20 + 479 + 463 + 6 + 0 + + + 37 + 297 + 539 + 4 + 0 + + + 284 + 654 + 672 + 0 + 0 + + + 88 + 103 + 217 + 2 + 0 + + + 25 + 213 + 555 + 4 + 0 + + + 20 + 140 + 593 + 0 + 0 + + + 110 + 524 + 572 + 0 + 0 + + + 3 + 107 + 533 + 0 + 0 + + + 88 + 102 + 219 + 2 + 0 + + + 70 + 264 + 216 + 0 + 0 + + + 70 + 153 + 146 + 0 + 0 + + + 70 + 146 + 153 + 0 + 0 + + + 70 + 333 + 355 + 0 + 0 + + + 108 + 229 + 249 + 4 + 0 + + + 70 + 146 + 391 + 0 + 0 + + + 70 + 284 + 201 + 0 + 0 + + + 0 + 481 + 405 + 6 + 0 + + + 22 + 441 + 503 + 0 + 0 + + + 34 + 547 + 548 + 0 + 0 + + + 0 + 466 + 476 + 0 + 0 + + + 205 + 232 + 246 + 0 + 0 + + + 21 + 546 + 749 + 0 + 0 + + + 1 + 215 + 550 + 0 + 1 + + + 21 + 373 + 689 + 2 + 0 + + + 4 + 99 + 226 + 0 + 0 + + + 70 + 198 + 113 + 0 + 0 + + + 4 + 292 + 548 + 6 + 0 + + + 164 + 758 + 435 + 5 + 0 + + + 205 + 205 + 278 + 0 + 0 + + + 284 + 659 + 714 + 2 + 0 + + + 0 + 649 + 556 + 0 + 0 + + + 284 + 482 + 460 + 2 + 0 + + + 1133 + 498 + 391 + 0 + 0 + + + 4 + 244 + 340 + 0 + 0 + + + 4 + 272 + 305 + 0 + 0 + + + 38 + 308 + 185 + 0 + 0 + + + 285 + 488 + 399 + 0 + 0 + + + 3 + 110 + 518 + 2 + 0 + + + 284 + 626 + 702 + 2 + 0 + + + 377 + 635 + 790 + 0 + 0 + + + 1 + 178 + 466 + 0 + 0 + + + 70 + 284 + 416 + 0 + 0 + + + 70 + 258 + 221 + 0 + 0 + + + 306 + 716 + 504 + 0 + 0 + + + 70 + 300 + 394 + 0 + 0 + + + 70 + 155 + 144 + 0 + 0 + + + 1 + 109 + 523 + 1 + 1 + + + 70 + 307 + 385 + 0 + 0 + + + 97 + 692 + 680 + 4 + 0 + + + 313 + 694 + 520 + 0 + 0 + + + 209 + 691 + 636 + 4 + 0 + + + 12 + 177 + 322 + 1 + 0 + + + 396 + 538 + 760 + 1 + 0 + + + 116 + 607 + 724 + 6 + 0 + + + 1 + 690 + 682 + 0 + 0 + + + 285 + 482 + 404 + 0 + 0 + + + 8 + 161 + 518 + 0 + 0 + + + 1 + 217 + 543 + 1 + 1 + + + 36 + 120 + 695 + 6 + 0 + + + 102 + 226 + 253 + 4 + 0 + + + 1 + 279 + 299 + 0 + 1 + + + 38 + 98 + 227 + 0 + 0 + + + 34 + 299 + 535 + 4 + 0 + + + 192 + 524 + 424 + 0 + 0 + + + 32 + 386 + 697 + 0 + 0 + + + 284 + 482 + 461 + 2 + 0 + + + 37 + 630 + 476 + 4 + 0 + + + 597 + 679 + 531 + 4 + 0 + + + 88 + 104 + 214 + 2 + 0 + + + 37 + 264 + 606 + 2 + 0 + + + 38 + 228 + 366 + 0 + 0 + + + 21 + 548 + 746 + 4 + 0 + + + 70 + 303 + 643 + 1 + 0 + + + 70 + 332 + 251 + 0 + 0 + + + 15 + 497 + 392 + 2 + 0 + + + 377 + 664 + 662 + 0 + 0 + + + 3 + 639 + 737 + 0 + 0 + + + 45 + 166 + 502 + 6 + 0 + + + 597 + 752 + 439 + 2 + 0 + + + 284 + 668 + 705 + 0 + 0 + + + 45 + 253 + 632 + 4 + 0 + + + 70 + 172 + 332 + 0 + 0 + + + 283 + 711 + 705 + 0 + 0 + + + 313 + 506 + 507 + 0 + 0 + + + 283 + 492 + 396 + 6 + 0 + + + 7 + 121 + 472 + 0 + 0 + + + 284 + 451 + 432 + 4 + 0 + + + 70 + 199 + 287 + 0 + 0 + + + 1 + 297 + 656 + 0 + 0 + + + 7 + 120 + 476 + 0 + 0 + + + 0 + 707 + 467 + 3 + 0 + + + 70 + 169 + 338 + 0 + 0 + + + 284 + 628 + 700 + 2 + 0 + + + 25 + 213 + 553 + 4 + 0 + + + 1 + 119 + 480 + 6 + 0 + + + 71 + 602 + 679 + 4 + 0 + + + 37 + 300 + 533 + 4 + 0 + + + 284 + 655 + 719 + 0 + 0 + + + 4 + 321 + 178 + 0 + 0 + + + 0 + 710 + 465 + 3 + 0 + + + 26 + 255 + 462 + 6 + 0 + + + 0 + 588 + 695 + 4 + 0 + + + 98 + 641 + 468 + 2 + 0 + + + 111 + 231 + 248 + 0 + 0 + + + 37 + 551 + 488 + 4 + 0 + + + 32 + 537 + 761 + 0 + 0 + + + 38 + 160 + 138 + 0 + 0 + + + 12 + 183 + 313 + 2 + 0 + + + 284 + 666 + 707 + 0 + 0 + + + 38 + 707 + 666 + 0 + 0 + + + 327 + 551 + 599 + 0 + 0 + + + 36 + 736 + 490 + 3 + 0 + + + 24 + 181 + 122 + 0 + 1 + + + 68 + 104 + 551 + 0 + 0 + + + 5 + 566 + 530 + 0 + 0 + + + 205 + 191 + 300 + 0 + 0 + + + 32 + 431 + 696 + 0 + 0 + + + 70 + 312 + 267 + 0 + 0 + + + 3 + 117 + 712 + 0 + 0 + + + 4 + 234 + 356 + 0 + 0 + + + 70 + 267 + 312 + 0 + 0 + + + 34 + 296 + 540 + 4 + 0 + + + 0 + 691 + 522 + 1 + 0 + + + 419 + 716 + 461 + 6 + 0 + + + 306 + 338 + 657 + 0 + 0 + + + 70 + 141 + 157 + 0 + 0 + + + 205 + 254 + 328 + 0 + 0 + + + 37 + 164 + 508 + 4 + 0 + + + 33 + 484 + 682 + 6 + 0 + + + 47 + 126 + 455 + 0 + 0 + + + 70 + 334 + 353 + 0 + 0 + + + 58 + 598 + 603 + 4 + 0 + + + 671 + 487 + 552 + 0 + 0 + + + 4 + 192 + 298 + 0 + 0 + + + 4 + 323 + 365 + 0 + 0 + + + 97 + 271 + 307 + 6 + 0 + + + 70 + 182 + 121 + 0 + 0 + + + 70 + 93 + 237 + 0 + 0 + + + 70 + 292 + 285 + 0 + 0 + + + 286 + 596 + 605 + 4 + 0 + + + 36 + 494 + 668 + 0 + 0 + + + 284 + 630 + 698 + 2 + 0 + + + 89 + 361 + 711 + 2 + 0 + + + 597 + 745 + 443 + 4 + 0 + + + 284 + 641 + 686 + 0 + 0 + + + 34 + 101 + 567 + 7 + 0 + + + 662 + 665 + 754 + 0 + 0 + + + 70 + 197 + 112 + 0 + 0 + + + 38 + 708 + 665 + 0 + 0 + + + 284 + 665 + 708 + 2 + 0 + + + 38 + 138 + 415 + 0 + 0 + + + 1 + 184 + 449 + 0 + 0 + + + 284 + 626 + 701 + 2 + 0 + + + 55 + 563 + 533 + 0 + 0 + + + 284 + 653 + 672 + 0 + 0 + + + 428 + 636 + 690 + 2 + 0 + + + 70 + 236 + 350 + 0 + 0 + + + 1 + 175 + 472 + 0 + 0 + + + 283 + 454 + 432 + 0 + 0 + + + 1 + 275 + 588 + 0 + 0 + + + 3 + 106 + 522 + 4 + 0 + + + 36 + 119 + 694 + 6 + 0 + + + 4 + 318 + 174 + 0 + 0 + + + 70 + 86 + 243 + 0 + 0 + + + 405 + 541 + 755 + 3 + 0 + + + 34 + 755 + 541 + 3 + 0 + + + 1 + 230 + 511 + 0 + 1 + + + 1 + 148 + 558 + 1 + 1 + + + 377 + 657 + 761 + 3 + 0 + + + 313 + 685 + 438 + 3 + 0 + + + 70 + 211 + 99 + 0 + 0 + + + 938 + 691 + 635 + 0 + 0 + + + 205 + 92 + 227 + 0 + 0 + + + 13 + 179 + 309 + 2 + 0 + + + 0 + 577 + 520 + 0 + 0 + + + 70 + 133 + 157 + 0 + 0 + + + 313 + 690 + 525 + 3 + 0 + + + 306 + 750 + 483 + 3 + 0 + + + 70 + 87 + 240 + 0 + 0 + + + 1 + 157 + 526 + 0 + 0 + + + 285 + 493 + 451 + 0 + 0 + + + 37 + 483 + 406 + 0 + 0 + + + 70 + 248 + 223 + 0 + 0 + + + 70 + 192 + 430 + 0 + 0 + + + 51 + 235 + 500 + 6 + 0 + + + 205 + 111 + 188 + 0 + 0 + + + 33 + 399 + 676 + 0 + 0 + + + 70 + 204 + 576 + 6 + 0 + + + 55 + 278 + 297 + 0 + 0 + + + 70 + 122 + 172 + 0 + 0 + + + 100 + 309 + 635 + 0 + 0 + + + 46 + 449 + 437 + 2 + 0 + + + 70 + 151 + 367 + 0 + 0 + + + 36 + 664 + 452 + 0 + 0 + + + 70 + 132 + 159 + 0 + 0 + + + 4 + 53 + 396 + 0 + 0 + + + 1 + 130 + 636 + 0 + 0 + + + 0 + 741 + 489 + 1 + 0 + + + 70 + 78 + 269 + 0 + 0 + + + 1 + 562 + 727 + 0 + 0 + + + 34 + 450 + 667 + 0 + 0 + + + 70 + 98 + 214 + 0 + 0 + + + 205 + 243 + 228 + 0 + 0 + + + 205 + 665 + 752 + 0 + 0 + + + 1 + 131 + 631 + 0 + 1 + + + 48 + 629 + 746 + 0 + 0 + + + 306 + 695 + 477 + 2 + 0 + + + 3 + 332 + 670 + 0 + 0 + + + 46 + 450 + 436 + 2 + 0 + + + 70 + 224 + 369 + 0 + 0 + + + 70 + 629 + 576 + 6 + 0 + + + 4 + 181 + 306 + 0 + 0 + + + 70 + 54 + 388 + 0 + 0 + + + 1 + 187 + 442 + 0 + 0 + + + 70 + 108 + 194 + 0 + 0 + + + 37 + 488 + 402 + 0 + 0 + + + 205 + 62 + 338 + 0 + 0 + + + 45 + 466 + 644 + 2 + 0 + + + 4 + 136 + 154 + 0 + 0 + + + 70 + 77 + 272 + 0 + 0 + + + 34 + 651 + 461 + 0 + 0 + + + 0 + 689 + 681 + 0 + 0 + + + 284 + 659 + 712 + 2 + 0 + + + 216 + 74 + 283 + 0 + 0 + + + 38 + 127 + 436 + 0 + 0 + + + 1 + 182 + 454 + 0 + 0 + + + 70 + 96 + 218 + 0 + 0 + + + 284 + 671 + 699 + 2 + 0 + + + 107 + 198 + 105 + 0 + 0 + + + 284 + 639 + 734 + 2 + 0 + + + 70 + 207 + 268 + 0 + 0 + + + 70 + 627 + 578 + 6 + 0 + + + 110 + 523 + 574 + 0 + 0 + + + 70 + 235 + 351 + 0 + 0 + + + 70 + 195 + 423 + 0 + 0 + + + 34 + 117 + 705 + 0 + 0 + + + 205 + 476 + 696 + 2 + 0 + + + 70 + 184 + 113 + 0 + 0 + + + 1 + 603 + 601 + 1 + 1 + + + 597 + 672 + 493 + 6 + 0 + + + 34 + 539 + 557 + 0 + 0 + + + 70 + 295 + 188 + 0 + 0 + + + 4 + 129 + 161 + 0 + 0 + + + 35 + 78 + 711 + 0 + 0 + + + 38 + 62 + 335 + 0 + 0 + + + 428 + 725 + 457 + 0 + 0 + + + 284 + 633 + 741 + 0 + 0 + + + 284 + 628 + 699 + 2 + 0 + + + 70 + 53 + 392 + 0 + 0 + + + 110 + 196 + 106 + 0 + 0 + + + 37 + 487 + 403 + 0 + 0 + + + 70 + 332 + 167 + 0 + 0 + + + 0 + 181 + 650 + 0 + 0 + + + 110 + 220 + 252 + 4 + 0 + + + 1 + 301 + 652 + 0 + 0 + + + 1 + 126 + 440 + 0 + 0 + + + 104 + 228 + 516 + 4 + 0 + + + 0 + 752 + 543 + 3 + 0 + + + 284 + 447 + 439 + 4 + 0 + + + 36 + 376 + 717 + 0 + 0 + + + 1 + 267 + 605 + 0 + 1 + + + 145 + 148 + 557 + 6 + 0 + + + 3 + 256 + 631 + 0 + 0 + + + 20 + 295 + 548 + 0 + 0 + + + 1 + 130 + 635 + 0 + 0 + + + 205 + 156 + 356 + 0 + 0 + + + 4 + 63 + 331 + 0 + 0 + + + 285 + 486 + 404 + 0 + 0 + + + 23 + 651 + 509 + 6 + 0 + + + 205 + 202 + 275 + 0 + 0 + + + 1 + 182 + 647 + 0 + 0 + + + 4 + 142 + 391 + 0 + 0 + + + 1 + 696 + 674 + 0 + 0 + + + 1 + 186 + 633 + 0 + 0 + + + 1 + 450 + 494 + 2 + 1 + + + 284 + 492 + 399 + 6 + 0 + + + 70 + 276 + 299 + 0 + 0 + + + 70 + 119 + 175 + 0 + 0 + + + 1 + 293 + 670 + 0 + 0 + + + 38 + 49 + 425 + 0 + 0 + + + 1 + 476 + 467 + 0 + 0 + + + 70 + 218 + 540 + 0 + 0 + + + 4 + 53 + 393 + 0 + 0 + + + 37 + 302 + 650 + 0 + 0 + + + 111 + 200 + 104 + 0 + 0 + + + 183 + 470 + 705 + 2 + 0 + + + 38 + 263 + 211 + 0 + 0 + + + 598 + 485 + 556 + 0 + 0 + + + 407 + 725 + 647 + 6 + 0 + + + 34 + 177 + 665 + 1 + 0 + + + 107 + 222 + 250 + 0 + 0 + + + 25 + 213 + 3524 + 0 + 0 + + + 45 + 426 + 461 + 0 + 0 + + + 70 + 118 + 175 + 0 + 0 + + + 46 + 716 + 698 + 0 + 0 + + + 70 + 58 + 356 + 0 + 0 + + + 395 + 609 + 721 + 2 + 0 + + + 272 + 490 + 550 + 0 + 0 + + + 70 + 160 + 129 + 0 + 0 + + + 206 + 65 + 318 + 0 + 0 + + + 27 + 717 + 697 + 6 + 0 + + + 70 + 134 + 415 + 0 + 0 + + + 205 + 333 + 167 + 0 + 0 + + + 0 + 178 + 659 + 0 + 0 + + + 718 + 729 + 455 + 0 + 0 + + + 70 + 181 + 307 + 0 + 0 + + + 70 + 162 + 343 + 0 + 0 + + + 143 + 268 + 2947 + 0 + 0 + + + 20 + 174 + 476 + 0 + 0 + + + 377 + 663 + 546 + 4 + 0 + + + 306 + 721 + 460 + 4 + 0 + + + 70 + 251 + 330 + 0 + 0 + + + 3 + 120 + 463 + 0 + 0 + + + 718 + 747 + 444 + 0 + 0 + + + 415 + 622 + 582 + 4 + 0 + + + 1 + 361 + 712 + 0 + 1 + + + 70 + 282 + 197 + 0 + 0 + + + 20 + 634 + 571 + 0 + 0 + + + 970 + 649 + 770 + 1 + 0 + + + 45 + 597 + 503 + 4 + 0 + + + 0 + 187 + 443 + 0 + 0 + + + 0 + 612 + 667 + 3 + 0 + + + 111 + 359 + 547 + 0 + 0 + + + 55 + 278 + 298 + 0 + 0 + + + 284 + 629 + 698 + 0 + 0 + + + 12 + 171 + 325 + 0 + 0 + + + 70 + 69 + 299 + 0 + 0 + + + 284 + 640 + 686 + 0 + 0 + + + 110 + 525 + 572 + 0 + 0 + + + 371 + 621 + 707 + 0 + 0 + + + 1 + 298 + 659 + 0 + 0 + + + 70 + 55 + 375 + 0 + 0 + + + 1 + 159 + 521 + 0 + 0 + + + 70 + 194 + 427 + 0 + 0 + + + 1 + 177 + 468 + 0 + 0 + + + 283 + 482 + 462 + 4 + 0 + + + 45 + 428 + 459 + 2 + 0 + + + 38 + 230 + 242 + 0 + 0 + + + 3 + 231 + 508 + 4 + 0 + + + 1 + 131 + 633 + 0 + 0 + + + 192 + 524 + 425 + 0 + 0 + + + 0 + 101 + 551 + 4 + 0 + + + 70 + 313 + 375 + 0 + 0 + + + 4 + 260 + 319 + 0 + 0 + + + 1 + 605 + 776 + 3 + 0 + + + 70 + 226 + 367 + 0 + 0 + + + 597 + 672 + 447 + 6 + 0 + + + 70 + 53 + 391 + 0 + 0 + + + 377 + 662 + 755 + 0 + 0 + + + 25 + 213 + 551 + 4 + 0 + + + 0 + 646 + 465 + 2 + 0 + + + 1 + 115 + 484 + 6 + 0 + + + 70 + 56 + 370 + 0 + 0 + + + 70 + 112 + 185 + 0 + 0 + + + 1 + 701 + 713 + 2 + 0 + + + 34 + 180 + 652 + 2 + 0 + + + 0 + 509 + 386 + 0 + 0 + + + 51 + 622 + 706 + 6 + 0 + + + 70 + 241 + 231 + 0 + 0 + + + 46 + 714 + 700 + 0 + 0 + + + 32 + 478 + 694 + 2 + 0 + + + 4 + 305 + 644 + 2 + 0 + + + 0 + 127 + 438 + 0 + 0 + + + 284 + 642 + 684 + 0 + 0 + + + 70 + 137 + 151 + 0 + 0 + + + 285 + 485 + 405 + 0 + 0 + + + 34 + 653 + 460 + 0 + 0 + + + 33 + 490 + 677 + 6 + 0 + + + 284 + 664 + 707 + 0 + 0 + + + 5 + 271 + 433 + 0 + 0 + + + 104 + 571 + 715 + 0 + 0 + + + 37 + 635 + 473 + 2 + 0 + + + 313 + 678 + 443 + 3 + 0 + + + 284 + 630 + 697 + 2 + 0 + + + 34 + 653 + 508 + 0 + 0 + + + 479 + 631 + 476 + 4 + 0 + + + 15 + 122 + 456 + 4 + 0 + + + 191 + 495 + 397 + 6 + 0 + + + 38 + 111 + 185 + 0 + 0 + + + 70 + 261 + 317 + 0 + 0 + + + 45 + 540 + 614 + 0 + 0 + + + 70 + 87 + 236 + 0 + 0 + + + 1 + 179 + 656 + 0 + 0 + + + 70 + 324 + 172 + 0 + 0 + + + 0 + 516 + 522 + 0 + 0 + + + 597 + 682 + 531 + 4 + 0 + + + 70 + 151 + 136 + 0 + 0 + + + 306 + 523 + 515 + 0 + 0 + + + 38 + 85 + 241 + 0 + 0 + + + 395 + 484 + 685 + 6 + 0 + + + 1 + 136 + 608 + 0 + 0 + + + 3 + 120 + 464 + 0 + 0 + + + 0 + 179 + 462 + 0 + 0 + + + 70 + 234 + 238 + 0 + 0 + + + 111 + 197 + 104 + 0 + 0 + + + 70 + 164 + 125 + 0 + 0 + + + 309 + 513 + 525 + 0 + 0 + + + 106 + 201 + 102 + 0 + 0 + + + 38 + 153 + 134 + 0 + 0 + + + 1 + 253 + 464 + 1 + 1 + + + 285 + 484 + 406 + 6 + 0 + + + 284 + 660 + 711 + 0 + 0 + + + 13 + 173 + 322 + 0 + 0 + + + 36 + 736 + 492 + 5 + 0 + + + 0 + 708 + 706 + 2 + 0 + + + 672 + 487 + 553 + 4 + 0 + + + 1 + 707 + 707 + 2 + 0 + + + 284 + 489 + 402 + 6 + 0 + + + 36 + 507 + 439 + 0 + 0 + + + 283 + 606 + 825 + 6 + 0 + + + 407 + 725 + 563 + 2 + 0 + + + 285 + 483 + 407 + 6 + 0 + + + 70 + 62 + 332 + 0 + 0 + + + 597 + 752 + 441 + 2 + 0 + + + 306 + 486 + 458 + 0 + 0 + + + 70 + 148 + 377 + 0 + 0 + + + 3 + 120 + 465 + 0 + 0 + + + 70 + 310 + 180 + 0 + 0 + + + 70 + 189 + 109 + 0 + 0 + + + 1 + 188 + 625 + 0 + 0 + + + 284 + 662 + 709 + 0 + 0 + + + 4 + 142 + 393 + 0 + 0 + + + 20 + 114 + 489 + 0 + 0 + + + 70 + 268 + 208 + 0 + 0 + + + 45 + 600 + 449 + 2 + 0 + + + 441 + 614 + 1562 + 4 + 0 + + + 3 + 106 + 526 + 0 + 0 + + + 286 + 519 + 579 + 0 + 0 + + + 0 + 579 + 519 + 0 + 0 + + + 198 + 251 + 468 + 0 + 0 + + + 70 + 330 + 169 + 0 + 0 + + + 284 + 645 + 681 + 0 + 0 + + + 284 + 632 + 695 + 2 + 0 + + + 70 + 139 + 148 + 0 + 0 + + + 1 + 603 + 830 + 0 + 0 + + + 70 + 174 + 123 + 0 + 0 + + + 284 + 489 + 400 + 6 + 0 + + + 24 + 607 + 722 + 3 + 1 + + + 45 + 428 + 457 + 4 + 0 + + + 597 + 752 + 440 + 2 + 0 + + + 45 + 587 + 512 + 6 + 0 + + + 205 + 275 + 203 + 0 + 0 + + + 70 + 206 + 271 + 0 + 0 + + + 675 + 486 + 556 + 0 + 0 + + + 285 + 483 + 405 + 0 + 0 + + + 284 + 655 + 717 + 2 + 0 + + + 284 + 669 + 702 + 0 + 0 + + + 70 + 206 + 568 + 0 + 0 + + + 70 + 310 + 631 + 1 + 0 + + + 34 + 379 + 713 + 0 + 0 + + + 3 + 234 + 500 + 6 + 0 + + + 70 + 72 + 297 + 0 + 0 + + + 70 + 81 + 264 + 0 + 0 + + + 22 + 442 + 680 + 4 + 0 + + + 70 + 115 + 186 + 0 + 0 + + + 70 + 274 + 427 + 0 + 0 + + + 45 + 255 + 632 + 4 + 0 + + + 0 + 606 + 775 + 3 + 0 + + + 45 + 466 + 645 + 2 + 0 + + + 1 + 186 + 629 + 0 + 0 + + + 70 + 183 + 305 + 0 + 0 + + + 4 + 57 + 376 + 0 + 0 + + + 53 + 565 + 532 + 0 + 0 + + + 70 + 259 + 317 + 0 + 0 + + + 284 + 639 + 735 + 2 + 0 + + + 70 + 289 + 405 + 0 + 0 + + + 38 + 210 + 266 + 0 + 0 + + + 20 + 133 + 420 + 0 + 0 + + + 51 + 714 + 701 + 4 + 0 + + + 51 + 235 + 498 + 6 + 0 + + + 306 + 725 + 499 + 6 + 0 + + + 0 + 703 + 712 + 2 + 0 + + + 1 + 187 + 439 + 0 + 0 + + + 1 + 276 + 584 + 0 + 0 + + + 46 + 559 + 592 + 0 + 0 + + + 70 + 287 + 286 + 0 + 0 + + + 70 + 318 + 368 + 0 + 0 + + + 1 + 184 + 636 + 0 + 0 + + + 70 + 133 + 161 + 0 + 0 + + + 111 + 219 + 255 + 0 + 0 + + + 1 + 182 + 643 + 0 + 0 + + + 284 + 628 + 698 + 0 + 0 + + + 205 + 611 + 492 + 0 + 0 + + + 70 + 154 + 363 + 0 + 0 + + + 45 + 539 + 614 + 0 + 0 + + + 306 + 700 + 671 + 4 + 0 + + + 70 + 223 + 525 + 0 + 0 + + + 4 + 73 + 294 + 0 + 0 + + + 284 + 671 + 700 + 2 + 0 + + + 0 + 675 + 536 + 1 + 0 + + + 70 + 191 + 430 + 0 + 0 + + + 70 + 55 + 390 + 0 + 0 + + + 597 + 746 + 485 + 2 + 0 + + + 111 + 229 + 244 + 0 + 0 + + + 284 + 639 + 686 + 0 + 0 + + + 286 + 522 + 494 + 0 + 0 + + + 7 + 119 + 470 + 4 + 0 + + + 29 + 123 + 668 + 6 + 0 + + + 13 + 181 + 309 + 2 + 0 + + + 4 + 273 + 429 + 0 + 0 + + + 70 + 301 + 273 + 0 + 0 + + + 1 + 166 + 495 + 2 + 1 + + + 284 + 453 + 432 + 4 + 0 + + + 1 + 185 + 633 + 0 + 0 + + + 8 + 167 + 492 + 0 + 0 + + + 70 + 204 + 574 + 0 + 0 + + + 70 + 252 + 326 + 0 + 0 + + + 284 + 657 + 715 + 0 + 0 + + + 4 + 211 + 265 + 0 + 0 + + + 4 + 187 + 299 + 0 + 0 + + + 4 + 93 + 231 + 0 + 0 + + + 395 + 500 + 662 + 1 + 0 + + + 285 + 488 + 401 + 0 + 0 + + + 70 + 122 + 176 + 0 + 0 + + + 285 + 482 + 406 + 0 + 0 + + + 284 + 653 + 719 + 0 + 0 + + + 36 + 737 + 491 + 1 + 0 + + + 938 + 685 + 640 + 0 + 0 + + + 0 + 478 + 466 + 0 + 0 + + + 0 + 101 + 554 + 4 + 0 + + + 938 + 697 + 629 + 0 + 0 + + + 286 + 519 + 497 + 0 + 0 + + + 37 + 633 + 475 + 2 + 0 + + + 70 + 304 + 184 + 0 + 0 + + + 38 + 329 + 356 + 0 + 0 + + + 1 + 261 + 617 + 0 + 0 + + + 38 + 128 + 166 + 0 + 0 + + + 70 + 249 + 329 + 0 + 0 + + + 283 + 160 + 512 + 3 + 0 + + + 1 + 492 + 549 + 0 + 1 + + + 1 + 83 + 674 + 1 + 1 + + + 105 + 572 + 713 + 0 + 0 + + + 284 + 666 + 705 + 0 + 0 + + + 0 + 352 + 556 + 0 + 0 + + + 106 + 222 + 252 + 4 + 0 + + + 1 + 133 + 616 + 0 + 0 + + + 407 + 713 + 572 + 4 + 0 + + + 191 + 189 + 620 + 0 + 0 + + + 284 + 641 + 684 + 0 + 0 + + + 938 + 684 + 641 + 0 + 0 + + + 205 + 159 + 352 + 0 + 0 + + + 164 + 757 + 437 + 4 + 0 + + + 4 + 314 + 261 + 0 + 0 + + + 4 + 157 + 522 + 0 + 0 + + + 70 + 202 + 580 + 6 + 0 + + + 45 + 467 + 644 + 0 + 0 + + + 1 + 356 + 550 + 0 + 0 + + + 3 + 121 + 463 + 0 + 0 + + + 205 + 313 + 262 + 0 + 0 + + + 38 + 77 + 277 + 0 + 0 + + + 102 + 225 + 249 + 4 + 0 + + + 205 + 174 + 322 + 0 + 0 + + + 1 + 278 + 295 + 1 + 1 + + + 70 + 127 + 168 + 0 + 0 + + + 70 + 179 + 313 + 0 + 0 + + + 395 + 476 + 695 + 2 + 0 + + + 284 + 446 + 439 + 4 + 0 + + + 104 + 696 + 630 + 0 + 0 + + + 70 + 114 + 187 + 0 + 0 + + + 0 + 183 + 448 + 0 + 0 + + + 284 + 630 + 696 + 2 + 0 + + + 3 + 635 + 570 + 0 + 0 + + + 7 + 122 + 459 + 5 + 0 + + + 37 + 642 + 683 + 5 + 0 + + + 50 + 205 + 104 + 0 + 0 + + + 5 + 685 + 483 + 4 + 0 + + + 34 + 633 + 791 + 2 + 0 + + + 9 + 119 + 471 + 0 + 0 + + + 396 + 541 + 754 + 1 + 0 + + + 1 + 280 + 293 + 0 + 1 + + + 1 + 179 + 655 + 0 + 0 + + + 33 + 474 + 698 + 3 + 0 + + + 283 + 159 + 516 + 3 + 0 + + + 1 + 129 + 636 + 0 + 0 + + + 308 + 703 + 668 + 4 + 0 + + + 45 + 598 + 503 + 4 + 0 + + + 34 + 118 + 695 + 6 + 0 + + + 284 + 492 + 398 + 6 + 0 + + + 38 + 92 + 232 + 0 + 0 + + + 3 + 615 + 1559 + 4 + 0 + + + 36 + 664 + 453 + 0 + 0 + + + 34 + 321 + 610 + 2 + 0 + + + 70 + 96 + 220 + 0 + 0 + + + 70 + 88 + 240 + 0 + 0 + + + 4 + 110 + 192 + 0 + 0 + + + 7 + 255 + 631 + 6 + 0 + + + 0 + 669 + 495 + 6 + 0 + + + 70 + 262 + 214 + 0 + 0 + + + 12 + 171 + 328 + 2 + 0 + + + 14 + 165 + 499 + 0 + 0 + + + 70 + 293 + 281 + 0 + 0 + + + 3 + 281 + 293 + 0 + 0 + + + 63 + 210 + 556 + 6 + 0 + + + 313 + 506 + 509 + 0 + 0 + + + 1 + 505 + 510 + 4 + 0 + + + 70 + 109 + 194 + 0 + 0 + + + 11 + 510 + 505 + 6 + 0 + + + 285 + 486 + 403 + 0 + 0 + + + 205 + 141 + 150 + 0 + 0 + + + 70 + 50 + 423 + 0 + 0 + + + 395 + 482 + 687 + 3 + 0 + + + 313 + 687 + 482 + 3 + 0 + + + 3 + 509 + 506 + 6 + 0 + + + 1 + 185 + 445 + 0 + 0 + + + 38 + 70 + 302 + 0 + 0 + + + 70 + 319 + 366 + 0 + 0 + + + 70 + 191 + 431 + 0 + 0 + + + 153 + 600 + 450 + 0 + 0 + + + 4 + 85 + 249 + 0 + 0 + + + 32 + 637 + 850 + 6 + 0 + + + 290 + 441 + 506 + 0 + 0 + + + 70 + 71 + 298 + 0 + 0 + + + 1 + 124 + 664 + 0 + 1 + + + 70 + 123 + 172 + 0 + 0 + + + 38 + 244 + 230 + 0 + 0 + + + 26 + 255 + 458 + 6 + 0 + + + 51 + 632 + 572 + 4 + 0 + + + 272 + 490 + 551 + 0 + 0 + + + 214 + 74 + 286 + 7 + 0 + + + 4 + 168 + 334 + 0 + 0 + + + 284 + 644 + 681 + 0 + 0 + + + 70 + 145 + 146 + 0 + 0 + + + 428 + 690 + 436 + 2 + 0 + + + 284 + 632 + 694 + 2 + 0 + + + 667 + 694 + 632 + 2 + 0 + + + 70 + 231 + 243 + 0 + 0 + + + 70 + 288 + 286 + 0 + 0 + + + 191 + 189 + 618 + 0 + 0 + + + 284 + 661 + 711 + 0 + 0 + + + 16 + 617 + 586 + 4 + 0 + + + 284 + 645 + 680 + 2 + 0 + + + 420 + 690 + 480 + 6 + 0 + + + 1 + 620 + 758 + 0 + 0 + + + 3 + 121 + 464 + 6 + 0 + + + 378 + 616 + 712 + 1 + 0 + + + 25 + 425 + 461 + 4 + 0 + + + 38 + 55 + 386 + 0 + 0 + + + 70 + 174 + 122 + 0 + 0 + + + 70 + 193 + 427 + 0 + 0 + + + 0 + 758 + 538 + 3 + 0 + + + 7 + 119 + 472 + 0 + 0 + + + 396 + 538 + 758 + 1 + 0 + + + 107 + 222 + 253 + 0 + 0 + + + 1 + 117 + 480 + 6 + 0 + + + 395 + 485 + 683 + 3 + 0 + + + 1 + 189 + 436 + 0 + 0 + + + 70 + 288 + 195 + 0 + 0 + + + 70 + 96 + 221 + 0 + 0 + + + 70 + 208 + 102 + 0 + 0 + + + 34 + 396 + 682 + 0 + 0 + + + 1 + 510 + 590 + 0 + 0 + + + 70 + 188 + 113 + 0 + 0 + + + 34 + 388 + 696 + 0 + 0 + + + 45 + 605 + 725 + 0 + 0 + + + 192 + 524 + 426 + 0 + 0 + + + 5 + 308 + 522 + 4 + 0 + + + 284 + 624 + 703 + 2 + 0 + + + 402 + 592 + 741 + 1 + 0 + + + 1 + 126 + 446 + 0 + 0 + + + 16 + 256 + 628 + 4 + 0 + + + 38 + 50 + 420 + 0 + 0 + + + 205 + 210 + 100 + 0 + 0 + + + 0 + 650 + 463 + 0 + 0 + + + 205 + 202 + 104 + 0 + 0 + + + 70 + 154 + 365 + 0 + 0 + + + 21 + 540 + 613 + 2 + 0 + + + 70 + 110 + 191 + 0 + 0 + + + 597 + 681 + 531 + 4 + 0 + + + 70 + 103 + 204 + 0 + 0 + + + 1 + 596 + 736 + 1 + 0 + + + 70 + 205 + 401 + 0 + 0 + + + 284 + 647 + 678 + 0 + 0 + + + 306 + 678 + 647 + 0 + 0 + + + 70 + 300 + 274 + 0 + 0 + + + 45 + 439 + 508 + 4 + 0 + + + 34 + 719 + 503 + 2 + 0 + + + 1126 + 500 + 392 + 6 + 0 + + + 1 + 350 + 560 + 0 + 0 + + + 8 + 695 + 676 + 2 + 0 + + + 70 + 185 + 304 + 0 + 0 + + + 70 + 152 + 370 + 0 + 0 + + + 1 + 122 + 461 + 0 + 1 + + + 107 + 218 + 258 + 0 + 0 + + + 45 + 428 + 458 + 2 + 0 + + + 37 + 484 + 405 + 0 + 0 + + + 70 + 237 + 347 + 0 + 0 + + + 70 + 97 + 217 + 0 + 0 + + + 204 + 66 + 319 + 0 + 0 + + + 392 + 648 + 629 + 2 + 0 + + + 286 + 160 + 514 + 3 + 0 + + + 143 + 266 + 2956 + 4 + 0 + + + 4 + 51 + 413 + 0 + 0 + + + 1 + 116 + 709 + 0 + 1 + + + 110 + 117 + 703 + 0 + 0 + + + 70 + 55 + 383 + 0 + 0 + + + 3 + 121 + 465 + 0 + 0 + + + 36 + 663 + 454 + 2 + 0 + + + 1 + 620 + 534 + 6 + 0 + + + 284 + 649 + 676 + 0 + 0 + + + 32 + 638 + 849 + 5 + 0 + + + 29 + 361 + 714 + 0 + 0 + + + 1 + 182 + 452 + 0 + 0 + + + 70 + 71 + 297 + 0 + 0 + + + 70 + 99 + 213 + 0 + 0 + + + 0 + 697 + 475 + 3 + 0 + + + 215 + 75 + 281 + 7 + 0 + + + 34 + 653 + 507 + 6 + 0 + + + 108 + 199 + 106 + 0 + 0 + + + 12 + 181 + 311 + 3 + 0 + + + 164 + 756 + 438 + 3 + 0 + + + 70 + 95 + 222 + 0 + 0 + + + 34 + 130 + 433 + 0 + 0 + + + 420 + 689 + 525 + 0 + 0 + + + 34 + 752 + 481 + 3 + 0 + + + 51 + 717 + 698 + 6 + 0 + + + 45 + 466 + 646 + 2 + 0 + + + 70 + 306 + 184 + 0 + 0 + + + 284 + 489 + 401 + 6 + 0 + + + 284 + 659 + 713 + 2 + 0 + + + 70 + 228 + 247 + 0 + 0 + + + 70 + 54 + 391 + 0 + 0 + + + 37 + 162 + 508 + 4 + 0 + + + 205 + 182 + 116 + 0 + 0 + + + 48 + 311 + 523 + 4 + 0 + + + 37 + 488 + 396 + 0 + 0 + + + 45 + 599 + 503 + 4 + 0 + + + 284 + 654 + 676 + 0 + 0 + + + 0 + 164 + 522 + 0 + 0 + + + 286 + 503 + 444 + 0 + 0 + + + 37 + 268 + 607 + 2 + 0 + + + 402 + 597 + 843 + 5 + 0 + + + 38 + 706 + 663 + 0 + 0 + + + 4 + 317 + 172 + 0 + 0 + + + 668 + 727 + 500 + 0 + 0 + + + 4 + 165 + 145 + 0 + 0 + + + 284 + 651 + 719 + 0 + 0 + + + 183 + 363 + 701 + 0 + 0 + + + 34 + 762 + 477 + 3 + 0 + + + 5 + 350 + 638 + 0 + 0 + + + 34 + 677 + 445 + 3 + 0 + + + 0 + 515 + 494 + 0 + 0 + + + 0 + 641 + 470 + 5 + 0 + + + 15 + 102 + 534 + 0 + 0 + + + 4 + 153 + 356 + 0 + 0 + + + 3 + 436 + 691 + 0 + 0 + + + 64 + 232 + 503 + 6 + 0 + + + 284 + 652 + 678 + 0 + 0 + + + 70 + 74 + 323 + 0 + 0 + + + 982 + 576 + 523 + 5 + 0 + + + 718 + 736 + 446 + 2 + 0 + + + 70 + 181 + 301 + 0 + 0 + + + 284 + 662 + 707 + 0 + 0 + + + 1 + 132 + 648 + 0 + 0 + + + 4 + 324 + 168 + 0 + 0 + + + 70 + 108 + 221 + 0 + 0 + + + 205 + 62 + 385 + 0 + 0 + + + 34 + 645 + 467 + 2 + 0 + + + 70 + 71 + 336 + 0 + 0 + + + 284 + 42 + 568 + 2 + 0 + + + 32 + 377 + 707 + 0 + 0 + + + 4 + 244 + 223 + 0 + 0 + + + 45 + 170 + 503 + 2 + 0 + + + 21 + 546 + 746 + 4 + 0 + + + 284 + 42 + 567 + 2 + 0 + + + 284 + 650 + 680 + 0 + 0 + + + 205 + 476 + 469 + 0 + 0 + + + 22 + 467 + 645 + 0 + 0 + + + 0 + 621 + 485 + 0 + 0 + + + 70 + 72 + 331 + 0 + 0 + + + 214 + 86 + 277 + 7 + 0 + + + 70 + 298 + 287 + 0 + 0 + + + 105 + 574 + 710 + 0 + 0 + + + 5 + 680 + 483 + 4 + 0 + + + 4 + 55 + 437 + 2 + 0 + + + 13 + 171 + 318 + 0 + 0 + + + 1130 + 484 + 399 + 6 + 0 + + + 402 + 599 + 840 + 7 + 0 + + + 37 + 755 + 435 + 7 + 0 + + + 658 + 637 + 735 + 0 + 0 + + + 284 + 626 + 706 + 2 + 0 + + + 70 + 245 + 350 + 0 + 0 + + + 143 + 103 + 528 + 0 + 0 + + + 38 + 65 + 370 + 0 + 0 + + + 50 + 105 + 518 + 0 + 0 + + + 4 + 57 + 422 + 0 + 0 + + + 26 + 653 + 717 + 0 + 0 + + + 48 + 118 + 461 + 0 + 0 + + + 1 + 227 + 106 + 0 + 1 + + + 1 + 175 + 666 + 0 + 0 + + + 107 + 220 + 247 + 0 + 0 + + + 1 + 138 + 621 + 0 + 0 + + + 0 + 745 + 547 + 3 + 0 + + + 45 + 587 + 513 + 6 + 0 + + + 70 + 174 + 138 + 0 + 0 + + + 37 + 630 + 478 + 2 + 0 + + + 0 + 337 + 663 + 0 + 0 + + + 70 + 158 + 344 + 0 + 0 + + + 38 + 740 + 491 + 2 + 0 + + + 0 + 513 + 587 + 0 + 0 + + + 21 + 439 + 509 + 0 + 0 + + + 307 + 509 + 439 + 0 + 0 + + + 121 + 229 + 509 + 2 + 0 + + + 1 + 51 + 471 + 1 + 0 + + + 32 + 381 + 700 + 0 + 0 + + + 284 + 447 + 432 + 4 + 0 + + + 575 + 717 + 458 + 4 + 0 + + + 0 + 298 + 648 + 0 + 0 + + + 70 + 90 + 267 + 0 + 0 + + + 70 + 211 + 406 + 0 + 0 + + + 0 + 624 + 653 + 0 + 0 + + + 406 + 491 + 455 + 2 + 0 + + + 7 + 171 + 501 + 0 + 0 + + + 88 + 107 + 224 + 2 + 0 + + + 4 + 110 + 218 + 0 + 0 + + + 407 + 218 + 110 + 0 + 0 + + + 597 + 746 + 487 + 2 + 0 + + + 217 + 636 + 791 + 3 + 0 + + + 70 + 252 + 340 + 0 + 0 + + + 20 + 180 + 476 + 0 + 0 + + + 12 + 173 + 314 + 0 + 0 + + + 314 + 697 + 634 + 0 + 0 + + + 284 + 647 + 683 + 2 + 0 + + + 5 + 692 + 525 + 2 + 0 + + + 38 + 163 + 333 + 0 + 0 + + + 1 + 182 + 640 + 0 + 0 + + + 278 + 643 + 565 + 0 + 0 + + + 213 + 167 + 325 + 0 + 0 + + + 70 + 330 + 353 + 0 + 0 + + + 284 + 664 + 705 + 0 + 0 + + + 38 + 705 + 664 + 0 + 0 + + + 70 + 295 + 184 + 0 + 0 + + + 3 + 118 + 460 + 0 + 0 + + + 1 + 115 + 472 + 0 + 0 + + + 23 + 636 + 736 + 4 + 0 + + + 0 + 156 + 549 + 4 + 0 + + + 970 + 640 + 786 + 5 + 0 + + + 38 + 212 + 113 + 0 + 0 + + + 4 + 232 + 234 + 0 + 0 + + + 3 + 233 + 500 + 0 + 0 + + + 284 + 646 + 684 + 0 + 0 + + + 70 + 332 + 258 + 0 + 0 + + + 597 + 672 + 448 + 6 + 0 + + + 313 + 760 + 432 + 3 + 0 + + + 13 + 167 + 328 + 1 + 0 + + + 20 + 581 + 519 + 0 + 0 + + + 4 + 147 + 161 + 0 + 0 + + + 45 + 257 + 632 + 4 + 0 + + + 34 + 761 + 535 + 3 + 0 + + + 284 + 655 + 715 + 2 + 0 + + + 938 + 689 + 642 + 0 + 0 + + + 70 + 175 + 313 + 0 + 0 + + + 205 + 179 + 306 + 0 + 0 + + + 291 + 441 + 507 + 0 + 0 + + + 34 + 507 + 441 + 0 + 0 + + + 70 + 140 + 169 + 0 + 0 + + + 70 + 91 + 260 + 0 + 0 + + + 20 + 298 + 545 + 0 + 0 + + + 45 + 466 + 647 + 2 + 0 + + + 284 + 669 + 700 + 2 + 0 + + + 41 + 448 + 673 + 4 + 0 + + + 597 + 684 + 531 + 4 + 0 + + + 34 + 85 + 644 + 0 + 0 + + + 7 + 167 + 514 + 0 + 0 + + + 285 + 632 + 741 + 0 + 0 + + + 29 + 499 + 448 + 0 + 0 + + + 191 + 189 + 616 + 0 + 0 + + + 283 + 623 + 710 + 0 + 0 + + + 306 + 700 + 669 + 4 + 0 + + + 51 + 635 + 572 + 4 + 0 + + + 70 + 93 + 254 + 0 + 0 + + + 32 + 491 + 669 + 1 + 0 + + + 0 + 582 + 518 + 2 + 0 + + + 34 + 178 + 654 + 0 + 0 + + + 216 + 84 + 281 + 0 + 0 + + + 45 + 535 + 614 + 0 + 0 + + + 1 + 174 + 669 + 0 + 0 + + + 70 + 223 + 522 + 0 + 0 + + + 25 + 132 + 650 + 0 + 0 + + + 45 + 440 + 508 + 4 + 0 + + + 1 + 496 + 390 + 1 + 1 + + + 4 + 129 + 424 + 0 + 0 + + + 1 + 189 + 454 + 0 + 0 + + + 1 + 121 + 452 + 0 + 0 + + + 5 + 750 + 438 + 4 + 0 + + + 938 + 690 + 641 + 0 + 0 + + + 0 + 98 + 558 + 4 + 0 + + + 0 + 294 + 658 + 0 + 0 + + + 117 + 212 + 549 + 2 + 0 + + + 51 + 616 + 718 + 4 + 0 + + + 397 + 563 + 723 + 0 + 0 + + + 97 + 635 + 792 + 0 + 0 + + + 284 + 667 + 702 + 0 + 0 + + + 445 + 645 + 563 + 6 + 0 + + + 1 + 622 + 711 + 0 + 1 + + + 402 + 598 + 841 + 0 + 0 + + + 0 + 619 + 487 + 0 + 0 + + + 70 + 272 + 201 + 0 + 0 + + + 70 + 243 + 97 + 0 + 0 + + + 4 + 142 + 604 + 0 + 0 + + + 70 + 95 + 248 + 0 + 0 + + + 38 + 181 + 302 + 0 + 0 + + + 205 + 288 + 404 + 0 + 0 + + + 70 + 313 + 274 + 0 + 0 + + + 284 + 630 + 702 + 2 + 0 + + + 0 + 722 + 503 + 1 + 0 + + + 1 + 167 + 515 + 1 + 1 + + + 36 + 661 + 456 + 2 + 0 + + + 8 + 694 + 675 + 2 + 0 + + + 36 + 495 + 664 + 0 + 0 + + + 7 + 229 + 508 + 4 + 0 + + + 307 + 660 + 498 + 2 + 0 + + + 70 + 175 + 136 + 0 + 0 + + + 313 + 693 + 524 + 3 + 0 + + + 1 + 471 + 475 + 0 + 0 + + + 1 + 475 + 471 + 0 + 0 + + + 70 + 205 + 116 + 0 + 0 + + + 360 + 663 + 667 + 6 + 0 + + + 22 + 501 + 386 + 0 + 0 + + + 2 + 581 + 761 + 2 + 1 + + + 205 + 281 + 414 + 0 + 0 + + + 11 + 118 + 463 + 0 + 0 + + + 34 + 325 + 595 + 2 + 0 + + + 306 + 680 + 534 + 2 + 0 + + + 34 + 195 + 441 + 0 + 0 + + + 70 + 144 + 165 + 0 + 0 + + + 70 + 72 + 330 + 0 + 0 + + + 115 + 161 + 534 + 0 + 0 + + + 70 + 327 + 167 + 0 + 0 + + + 4 + 299 + 389 + 0 + 0 + + + 51 + 220 + 108 + 2 + 0 + + + 3 + 234 + 497 + 6 + 0 + + + 0 + 481 + 402 + 6 + 0 + + + 284 + 658 + 672 + 0 + 0 + + + 70 + 57 + 417 + 0 + 0 + + + 7 + 173 + 497 + 0 + 0 + + + 37 + 629 + 703 + 1 + 0 + + + 0 + 695 + 674 + 0 + 0 + + + 0 + 603 + 545 + 6 + 0 + + + 283 + 42 + 566 + 2 + 0 + + + 38 + 56 + 424 + 0 + 0 + + + 402 + 593 + 848 + 3 + 0 + + + 15 + 249 + 467 + 6 + 0 + + + 0 + 738 + 492 + 1 + 0 + + + 1 + 104 + 525 + 1 + 1 + + + 284 + 657 + 713 + 0 + 0 + + + 21 + 468 + 644 + 0 + 0 + + + 70 + 260 + 210 + 0 + 0 + + + 70 + 140 + 390 + 0 + 0 + + + 20 + 130 + 420 + 0 + 0 + + + 20 + 114 + 479 + 0 + 0 + + + 34 + 600 + 737 + 0 + 0 + + + 4 + 335 + 163 + 0 + 0 + + + 70 + 163 + 335 + 0 + 0 + + + 47 + 174 + 494 + 4 + 0 + + + 0 + 100 + 546 + 4 + 0 + + + 1 + 182 + 639 + 0 + 0 + + + 70 + 235 + 101 + 0 + 0 + + + 284 + 639 + 733 + 2 + 0 + + + 34 + 674 + 656 + 0 + 0 + + + 70 + 262 + 328 + 0 + 0 + + + 21 + 373 + 681 + 2 + 0 + + + 0 + 289 + 669 + 0 + 0 + + + 565 + 727 + 452 + 4 + 0 + + + 1 + 103 + 530 + 0 + 1 + + + 597 + 672 + 489 + 6 + 0 + + + 213 + 176 + 310 + 0 + 0 + + + 0 + 653 + 556 + 0 + 0 + + + 38 + 76 + 312 + 0 + 0 + + + 4 + 185 + 295 + 0 + 0 + + + 597 + 752 + 437 + 2 + 0 + + + 214 + 85 + 279 + 7 + 0 + + + 33 + 76 + 718 + 0 + 0 + + + 70 + 255 + 337 + 0 + 0 + + + 70 + 317 + 271 + 0 + 0 + + + 38 + 150 + 158 + 0 + 0 + + + 0 + 709 + 512 + 0 + 0 + + + 284 + 671 + 698 + 2 + 0 + + + 1 + 122 + 447 + 0 + 0 + + + 139 + 287 + 566 + 0 + 0 + + + 0 + 610 + 494 + 0 + 0 + + + 20 + 483 + 463 + 0 + 0 + + + 107 + 219 + 249 + 0 + 0 + + + 38 + 205 + 419 + 0 + 0 + + + 70 + 199 + 119 + 0 + 0 + + + 45 + 197 + 436 + 4 + 0 + + + 70 + 159 + 343 + 0 + 0 + + + 45 + 196 + 434 + 0 + 0 + + + 1 + 179 + 649 + 0 + 0 + + + 70 + 331 + 257 + 0 + 0 + + + 70 + 174 + 316 + 0 + 0 + + + 70 + 182 + 134 + 0 + 0 + + + 36 + 210 + 553 + 0 + 1 + + + 70 + 231 + 238 + 0 + 0 + + + 284 + 629 + 702 + 0 + 0 + + + 1009 + 226 + 108 + 2 + 0 + + + 420 + 639 + 691 + 0 + 0 + + + 394 + 475 + 690 + 1 + 0 + + + 4 + 649 + 505 + 6 + 0 + + + 284 + 659 + 711 + 2 + 0 + + + 436 + 617 + 1559 + 4 + 0 + + + 37 + 268 + 605 + 2 + 0 + + + 4 + 140 + 393 + 0 + 0 + + + 1 + 181 + 642 + 0 + 0 + + + 1 + 105 + 524 + 0 + 1 + + + 70 + 86 + 284 + 0 + 0 + + + 1 + 185 + 460 + 0 + 0 + + + 5 + 106 + 519 + 0 + 0 + + + 70 + 335 + 254 + 0 + 0 + + + 205 + 74 + 330 + 0 + 0 + + + 208 + 109 + 224 + 4 + 0 + + + 51 + 220 + 111 + 0 + 0 + + + 34 + 527 + 622 + 6 + 0 + + + 0 + 596 + 550 + 6 + 0 + + + 401 + 592 + 851 + 3 + 0 + + + 4 + 58 + 421 + 0 + 0 + + + 306 + 711 + 461 + 7 + 0 + + + 7 + 257 + 631 + 2 + 0 + + + 0 + 316 + 610 + 2 + 0 + + + 1 + 615 + 718 + 1 + 1 + + + 70 + 152 + 362 + 0 + 0 + + + 21 + 256 + 633 + 6 + 0 + + + 34 + 477 + 687 + 4 + 0 + + + 192 + 524 + 427 + 0 + 0 + + + 1 + 291 + 662 + 0 + 0 + + + 1 + 623 + 752 + 0 + 0 + + + 70 + 256 + 332 + 0 + 0 + + + 45 + 587 + 514 + 6 + 0 + + + 70 + 226 + 243 + 0 + 0 + + + 70 + 327 + 260 + 0 + 0 + + + 0 + 593 + 686 + 0 + 0 + + + 0 + 126 + 436 + 0 + 0 + + + 1 + 494 + 390 + 1 + 1 + + + 34 + 720 + 504 + 3 + 0 + + + 1 + 622 + 654 + 3 + 0 + + + 205 + 234 + 104 + 0 + 0 + + + 284 + 655 + 674 + 2 + 0 + + + 48 + 176 + 483 + 0 + 0 + + + 45 + 169 + 503 + 4 + 0 + + + 70 + 84 + 290 + 0 + 0 + + + 284 + 446 + 432 + 4 + 0 + + + 283 + 502 + 532 + 0 + 0 + + + 1 + 609 + 725 + 1 + 0 + + + 1 + 634 + 739 + 1 + 1 + + + 102 + 569 + 715 + 0 + 0 + + + 45 + 195 + 436 + 4 + 0 + + + 59 + 135 + 630 + 4 + 0 + + + 55 + 532 + 616 + 4 + 0 + + + 398 + 536 + 759 + 1 + 0 + + + 597 + 672 + 449 + 6 + 0 + + + 4 + 146 + 167 + 0 + 0 + + + 70 + 202 + 575 + 0 + 0 + + + 284 + 657 + 672 + 0 + 0 + + + 4 + 121 + 704 + 0 + 0 + + + 34 + 224 + 518 + 1 + 0 + + + 284 + 653 + 676 + 0 + 0 + + + 138 + 633 + 573 + 0 + 1 + + + 1 + 119 + 461 + 0 + 1 + + + 191 + 189 + 614 + 0 + 0 + + + 217 + 87 + 282 + 0 + 0 + + + 209 + 200 + 426 + 0 + 0 + + + 1 + 300 + 642 + 1 + 0 + + + 402 + 596 + 845 + 1 + 0 + + + 11 + 118 + 465 + 0 + 0 + + + 1 + 489 + 458 + 0 + 0 + + + 597 + 752 + 436 + 2 + 0 + + + 45 + 534 + 614 + 0 + 0 + + + 70 + 324 + 263 + 0 + 0 + + + 1188 + 223 + 110 + 6 + 0 + + + 34 + 653 + 462 + 2 + 0 + + + 20 + 175 + 487 + 2 + 0 + + + 1 + 613 + 664 + 3 + 0 + + + 38 + 283 + 194 + 0 + 0 + + + 0 + 607 + 497 + 0 + 0 + + + 38 + 150 + 366 + 0 + 0 + + + 0 + 173 + 671 + 0 + 0 + + + 38 + 327 + 355 + 0 + 0 + + + 1 + 213 + 545 + 0 + 1 + + + 562 + 667 + 544 + 0 + 0 + + + 3 + 106 + 518 + 0 + 0 + + + 33 + 455 + 663 + 0 + 0 + + + 7 + 615 + 762 + 0 + 0 + + + 4 + 261 + 210 + 0 + 0 + + + 205 + 210 + 261 + 0 + 0 + + + 70 + 92 + 266 + 0 + 0 + + + 1 + 179 + 648 + 0 + 0 + + + 718 + 735 + 446 + 0 + 0 + + + 38 + 72 + 340 + 0 + 0 + + + 70 + 191 + 287 + 0 + 0 + + + 20 + 103 + 532 + 0 + 1 + + + 34 + 635 + 475 + 0 + 0 + + + 3 + 232 + 500 + 0 + 0 + + + 4 + 106 + 231 + 0 + 0 + + + 68 + 631 + 478 + 2 + 0 + + + 3 + 170 + 501 + 2 + 0 + + + 284 + 651 + 678 + 0 + 0 + + + 284 + 661 + 709 + 0 + 0 + + + 1 + 709 + 661 + 0 + 0 + + + 0 + 175 + 663 + 0 + 0 + + + 1 + 309 + 525 + 0 + 1 + + + 404 + 535 + 760 + 1 + 0 + + + 70 + 327 + 169 + 0 + 0 + + + 33 + 500 + 656 + 1 + 0 + + + 45 + 170 + 502 + 2 + 0 + + + 1 + 177 + 655 + 0 + 0 + + + 54 + 572 + 528 + 0 + 0 + + + 284 + 624 + 708 + 2 + 0 + + + 1 + 125 + 442 + 0 + 0 + + + 70 + 203 + 571 + 0 + 0 + + + 284 + 665 + 705 + 0 + 0 + + + 38 + 705 + 665 + 0 + 0 + + + 32 + 497 + 660 + 1 + 0 + + + 575 + 714 + 508 + 0 + 0 + + + 33 + 393 + 679 + 0 + 0 + + + 70 + 82 + 295 + 0 + 0 + + + 215 + 87 + 278 + 0 + 0 + + + 0 + 186 + 459 + 0 + 0 + + + 20 + 114 + 485 + 0 + 0 + + + 402 + 598 + 842 + 6 + 0 + + + 313 + 682 + 481 + 3 + 0 + + + 160 + 257 + 630 + 6 + 0 + + + 1 + 296 + 652 + 0 + 0 + + + 107 + 222 + 249 + 0 + 0 + + + 34 + 707 + 464 + 3 + 0 + + + 70 + 196 + 282 + 0 + 0 + + + 642 + 729 + 450 + 6 + 0 + + + 283 + 591 + 852 + 7 + 0 + + + 102 + 618 + 658 + 0 + 0 + + + 70 + 133 + 415 + 0 + 0 + + + 597 + 672 + 488 + 6 + 0 + + + 70 + 317 + 269 + 0 + 0 + + + 4 + 319 + 173 + 0 + 0 + + + 13 + 173 + 319 + 0 + 0 + + + 38 + 56 + 430 + 0 + 0 + + + 38 + 112 + 215 + 0 + 0 + + + 4 + 283 + 195 + 0 + 0 + + + 284 + 663 + 707 + 0 + 0 + + + 38 + 707 + 663 + 0 + 0 + + + 108 + 108 + 223 + 2 + 0 + + + 70 + 181 + 133 + 0 + 0 + + + 205 + 291 + 293 + 0 + 0 + + + 45 + 256 + 632 + 4 + 0 + + + 70 + 59 + 408 + 0 + 0 + + + 45 + 466 + 648 + 2 + 0 + + + 70 + 253 + 337 + 0 + 0 + + + 38 + 132 + 418 + 0 + 0 + + + 1012 + 225 + 107 + 0 + 0 + + + 38 + 294 + 290 + 0 + 0 + + + 0 + 342 + 655 + 0 + 0 + + + 718 + 737 + 445 + 2 + 0 + + + 70 + 63 + 382 + 0 + 0 + + + 1 + 181 + 471 + 0 + 0 + + + 88 + 113 + 213 + 2 + 0 + + + 70 + 166 + 145 + 0 + 0 + + + 38 + 145 + 166 + 0 + 0 + + + 1 + 128 + 666 + 0 + 0 + + + 38 + 235 + 235 + 0 + 0 + + + 284 + 632 + 699 + 2 + 0 + + + 1 + 272 + 595 + 0 + 0 + + + 70 + 137 + 176 + 0 + 0 + + + 0 + 616 + 660 + 3 + 0 + + + 0 + 340 + 659 + 0 + 0 + + + 0 + 583 + 518 + 4 + 0 + + + 45 + 441 + 508 + 4 + 0 + + + 597 + 683 + 531 + 4 + 0 + + + 70 + 215 + 539 + 0 + 0 + + + 284 + 644 + 686 + 0 + 0 + + + 20 + 96 + 575 + 0 + 0 + + + 4 + 276 + 309 + 0 + 0 + + + 284 + 652 + 719 + 0 + 0 + + + 1 + 115 + 480 + 6 + 0 + + + 34 + 86 + 641 + 0 + 0 + + + 215 + 87 + 279 + 5 + 0 + + + 70 + 199 + 122 + 0 + 0 + + + 938 + 715 + 704 + 0 + 0 + + + 1 + 183 + 467 + 0 + 0 + + + 45 + 196 + 436 + 4 + 0 + + + 3 + 233 + 497 + 0 + 0 + + + 70 + 221 + 524 + 0 + 0 + + + 284 + 668 + 702 + 0 + 0 + + + 70 + 238 + 359 + 0 + 0 + + + 70 + 216 + 536 + 0 + 0 + + + 34 + 356 + 715 + 0 + 0 + + + 445 + 623 + 582 + 0 + 0 + + + 70 + 320 + 267 + 0 + 0 + + + 1 + 118 + 467 + 1 + 1 + + + 34 + 743 + 488 + 3 + 0 + + + 1 + 474 + 473 + 0 + 0 + + + 283 + 604 + 442 + 0 + 0 + + + 597 + 726 + 452 + 6 + 0 + + + 938 + 713 + 706 + 0 + 0 + + + 1 + 127 + 434 + 0 + 0 + + + 36 + 355 + 717 + 0 + 0 + + + 15 + 497 + 388 + 2 + 0 + + + 938 + 688 + 642 + 0 + 0 + + + 4 + 56 + 434 + 4 + 0 + + + 97 + 234 + 495 + 0 + 0 + + + 284 + 631 + 700 + 0 + 0 + + + 1 + 166 + 515 + 0 + 1 + + + 51 + 225 + 108 + 6 + 0 + + + 24 + 227 + 107 + 0 + 1 + + + 70 + 98 + 248 + 0 + 0 + + + 11 + 311 + 521 + 4 + 0 + + + 45 + 197 + 434 + 0 + 0 + + + 1139 + 501 + 385 + 0 + 0 + + + 284 + 669 + 701 + 2 + 0 + + + 0 + 481 + 401 + 6 + 0 + + + 34 + 548 + 551 + 0 + 0 + + + 284 + 655 + 716 + 2 + 0 + + + 70 + 88 + 276 + 0 + 0 + + + 306 + 711 + 510 + 0 + 0 + + + 70 + 209 + 409 + 0 + 0 + + + 38 + 90 + 270 + 0 + 0 + + + 3 + 172 + 497 + 0 + 0 + + + 1 + 553 + 546 + 0 + 0 + + + 4 + 303 + 182 + 0 + 0 + + + 70 + 148 + 372 + 0 + 0 + + + 1 + 293 + 658 + 0 + 0 + + + 4 + 207 + 266 + 0 + 0 + + + 70 + 133 + 414 + 0 + 0 + + + 13 + 171 + 322 + 2 + 0 + + + 0 + 511 + 498 + 4 + 0 + + + 70 + 305 + 280 + 0 + 0 + + + 70 + 189 + 128 + 0 + 0 + + + 1 + 359 + 537 + 0 + 0 + + + 108 + 109 + 222 + 2 + 0 + + + 8 + 55 + 440 + 0 + 0 + + + 938 + 718 + 701 + 4 + 0 + + + 102 + 619 + 657 + 0 + 0 + + + 1 + 189 + 452 + 0 + 0 + + + 183 + 360 + 707 + 0 + 0 + + + 1 + 116 + 475 + 0 + 0 + + + 0 + 671 + 489 + 6 + 0 + + + 597 + 746 + 486 + 2 + 0 + + + 4 + 95 + 255 + 0 + 0 + + + 70 + 306 + 180 + 0 + 0 + + + 70 + 180 + 306 + 0 + 0 + + + 70 + 153 + 360 + 0 + 0 + + + 4 + 162 + 340 + 0 + 0 + + + 36 + 662 + 456 + 2 + 0 + + + 108 + 223 + 247 + 4 + 0 + + + 70 + 293 + 188 + 0 + 0 + + + 205 + 166 + 146 + 0 + 0 + + + 1 + 185 + 625 + 0 + 0 + + + 70 + 55 + 415 + 0 + 0 + + + 70 + 310 + 373 + 0 + 0 + + + 21 + 465 + 650 + 6 + 0 + + + 49 + 106 + 504 + 6 + 0 + + + 1 + 179 + 646 + 0 + 0 + + + 0 + 158 + 535 + 4 + 0 + + + 38 + 297 + 654 + 0 + 0 + + + 70 + 126 + 424 + 0 + 0 + + + 70 + 295 + 392 + 0 + 0 + + + 1132 + 498 + 390 + 6 + 0 + + + 284 + 630 + 700 + 0 + 0 + + + 37 + 488 + 398 + 0 + 0 + + + 45 + 425 + 457 + 4 + 0 + + + 445 + 623 + 585 + 0 + 0 + + + 284 + 669 + 698 + 2 + 0 + + + 70 + 264 + 320 + 0 + 0 + + + 3 + 176 + 480 + 0 + 0 + + + 70 + 217 + 246 + 0 + 0 + + + 88 + 105 + 217 + 2 + 0 + + + 377 + 659 + 762 + 3 + 0 + + + 729 + 471 + 3398 + 7 + 0 + + + 377 + 636 + 573 + 4 + 0 + + + 88 + 106 + 215 + 2 + 0 + + + 70 + 153 + 349 + 0 + 0 + + + 25 + 130 + 650 + 0 + 0 + + + 70 + 200 + 578 + 6 + 0 + + + 0 + 601 + 676 + 0 + 0 + + + 4 + 207 + 258 + 0 + 0 + + + 45 + 168 + 503 + 4 + 0 + + + 4 + 300 + 178 + 0 + 0 + + + 70 + 150 + 356 + 0 + 0 + + + 1 + 120 + 445 + 0 + 0 + + + 38 + 87 + 263 + 0 + 0 + + + 66 + 93 + 575 + 0 + 0 + + + 20 + 127 + 666 + 0 + 0 + + + 20 + 278 + 2959 + 0 + 0 + + + 208 + 104 + 220 + 2 + 0 + + + 1 + 694 + 673 + 0 + 0 + + + 321 + 468 + 646 + 6 + 0 + + + 45 + 194 + 436 + 4 + 0 + + + 70 + 118 + 194 + 0 + 0 + + + 718 + 727 + 453 + 0 + 0 + + + 0 + 163 + 519 + 0 + 0 + + + 34 + 427 + 708 + 0 + 0 + + + 1 + 174 + 665 + 0 + 0 + + + 34 + 619 + 532 + 6 + 0 + + + 34 + 605 + 729 + 0 + 0 + + + 70 + 224 + 102 + 0 + 0 + + + 1128 + 493 + 394 + 6 + 0 + + + 29 + 102 + 524 + 0 + 0 + + + 4 + 57 + 401 + 0 + 0 + + + 70 + 312 + 271 + 0 + 0 + + + 1 + 180 + 127 + 0 + 1 + + + 38 + 302 + 177 + 0 + 0 + + + 38 + 177 + 302 + 0 + 0 + + + 1 + 183 + 632 + 0 + 0 + + + 70 + 243 + 348 + 0 + 0 + + + 29 + 104 + 514 + 0 + 0 + + + 191 + 189 + 612 + 0 + 0 + + + 0 + 687 + 440 + 3 + 0 + + + 284 + 655 + 713 + 0 + 0 + + + 70 + 213 + 251 + 0 + 0 + + + 284 + 671 + 696 + 2 + 0 + + + 597 + 672 + 490 + 6 + 0 + + + 38 + 161 + 331 + 0 + 0 + + + 3 + 231 + 500 + 0 + 0 + + + 284 + 657 + 711 + 0 + 0 + + + 4 + 90 + 255 + 0 + 0 + + + 395 + 488 + 675 + 1 + 0 + + + 12 + 173 + 308 + 0 + 0 + + + 1 + 50 + 459 + 1 + 0 + + + 38 + 691 + 676 + 2 + 0 + + + 597 + 752 + 438 + 2 + 0 + + + 36 + 736 + 495 + 7 + 0 + + + 284 + 639 + 731 + 2 + 0 + + + 1 + 170 + 498 + 1 + 1 + + + 70 + 239 + 223 + 0 + 0 + + + 70 + 86 + 267 + 0 + 0 + + + 284 + 628 + 702 + 0 + 0 + + + 4 + 692 + 675 + 0 + 0 + + + 1 + 97 + 549 + 4 + 0 + + + 284 + 40 + 573 + 0 + 0 + + + 1 + 132 + 641 + 2 + 1 + + + 0 + 640 + 472 + 5 + 0 + + + 70 + 148 + 155 + 0 + 0 + + + 12 + 167 + 319 + 0 + 0 + + + 37 + 340 + 660 + 0 + 0 + + + 284 + 656 + 672 + 0 + 0 + + + 0 + 52 + 441 + 0 + 0 + + + 1 + 131 + 646 + 0 + 0 + + + 308 + 489 + 522 + 3 + 0 + + + 45 + 195 + 434 + 0 + 0 + + + 70 + 273 + 310 + 0 + 0 + + + 70 + 270 + 428 + 0 + 0 + + + 70 + 233 + 229 + 0 + 0 + + + 430 + 634 + 792 + 0 + 0 + + + 34 + 177 + 653 + 1 + 0 + + + 45 + 258 + 635 + 0 + 0 + + + 35 + 212 + 545 + 1 + 1 + + + 32 + 369 + 692 + 0 + 0 + + + 32 + 375 + 714 + 0 + 0 + + + 1 + 685 + 682 + 0 + 0 + + + 4 + 147 + 363 + 0 + 0 + + + 1 + 182 + 635 + 0 + 0 + + + 597 + 742 + 444 + 0 + 0 + + + 139 + 584 + 755 + 4 + 0 + + + 70 + 215 + 248 + 0 + 0 + + + 70 + 136 + 169 + 0 + 0 + + + 1 + 122 + 437 + 0 + 0 + + + 34 + 392 + 683 + 0 + 0 + + + 70 + 242 + 350 + 0 + 0 + + + 4 + 264 + 202 + 0 + 0 + + + 143 + 101 + 528 + 0 + 0 + + + 21 + 441 + 509 + 6 + 0 + + + 284 + 489 + 397 + 6 + 0 + + + 88 + 106 + 213 + 2 + 0 + + + 284 + 659 + 709 + 2 + 0 + + + 70 + 220 + 244 + 0 + 0 + + + 36 + 761 + 433 + 3 + 0 + + + 1 + 180 + 641 + 0 + 0 + + + 205 + 211 + 107 + 0 + 0 + + + 284 + 647 + 682 + 2 + 0 + + + 0 + 697 + 434 + 3 + 0 + + + 1 + 124 + 433 + 0 + 0 + + + 20 + 143 + 593 + 0 + 0 + + + 70 + 287 + 187 + 0 + 0 + + + 273 + 614 + 761 + 0 + 0 + + + 38 + 206 + 560 + 6 + 0 + + + 70 + 231 + 367 + 0 + 0 + + + 205 + 54 + 418 + 0 + 0 + + + 193 + 373 + 684 + 0 + 0 + + + 46 + 446 + 436 + 2 + 0 + + + 4 + 275 + 594 + 0 + 0 + + + 36 + 494 + 667 + 0 + 0 + + + 0 + 754 + 483 + 3 + 0 + + + 70 + 86 + 262 + 0 + 0 + + + 143 + 101 + 531 + 6 + 0 + + + 32 + 85 + 631 + 0 + 0 + + + 97 + 233 + 495 + 0 + 0 + + + 1 + 496 + 392 + 1 + 1 + + + 38 + 709 + 659 + 0 + 0 + + + 70 + 115 + 196 + 0 + 0 + + + 0 + 695 + 524 + 1 + 0 + + + 199 + 51 + 438 + 1 + 1 + + + 597 + 686 + 531 + 4 + 0 + + + 25 + 208 + 555 + 4 + 0 + + + 88 + 102 + 222 + 2 + 0 + + + 70 + 148 + 153 + 0 + 0 + + + 70 + 296 + 390 + 0 + 0 + + + 1 + 610 + 496 + 0 + 0 + + + 0 + 189 + 449 + 0 + 0 + + + 284 + 649 + 680 + 0 + 0 + + + 285 + 549 + 487 + 4 + 0 + + + 597 + 744 + 443 + 4 + 0 + + + 284 + 626 + 705 + 2 + 0 + + + 0 + 127 + 668 + 0 + 0 + + + 27 + 436 + 694 + 2 + 0 + + + 205 + 73 + 310 + 0 + 0 + + + 70 + 277 + 194 + 0 + 0 + + + 284 + 661 + 707 + 0 + 0 + + + 1 + 707 + 661 + 0 + 0 + + + 70 + 157 + 144 + 0 + 0 + + + 38 + 133 + 170 + 0 + 0 + + + 70 + 70 + 323 + 0 + 0 + + + 88 + 205 + 563 + 0 + 0 + + + 283 + 712 + 705 + 0 + 0 + + + 70 + 141 + 381 + 0 + 0 + + + 20 + 127 + 423 + 0 + 0 + + + 70 + 316 + 170 + 0 + 0 + + + 183 + 363 + 703 + 0 + 0 + + + 70 + 222 + 242 + 0 + 0 + + + 70 + 218 + 389 + 0 + 0 + + + 70 + 274 + 196 + 0 + 0 + + + 70 + 196 + 274 + 0 + 0 + + + 70 + 165 + 137 + 0 + 0 + + + 307 + 513 + 438 + 0 + 0 + + + 70 + 260 + 206 + 0 + 0 + + + 70 + 82 + 277 + 0 + 0 + + + 70 + 204 + 565 + 0 + 0 + + + 286 + 516 + 586 + 0 + 0 + + + 70 + 315 + 170 + 0 + 0 + + + 70 + 197 + 431 + 0 + 0 + + + 6 + 119 + 450 + 0 + 0 + + + 4 + 194 + 276 + 0 + 0 + + + 217 + 698 + 632 + 1 + 0 + + + 284 + 632 + 698 + 2 + 0 + + + 4 + 308 + 631 + 2 + 0 + + + 284 + 643 + 686 + 0 + 0 + + + 938 + 686 + 643 + 0 + 0 + + + 37 + 177 + 651 + 0 + 0 + + + 70 + 57 + 398 + 0 + 0 + + + 88 + 107 + 212 + 2 + 0 + + + 4 + 162 + 524 + 0 + 0 + + + 1 + 101 + 530 + 0 + 1 + + + 0 + 607 + 543 + 6 + 0 + + + 980 + 617 + 490 + 6 + 0 + + + 34 + 691 + 477 + 3 + 0 + + + 0 + 481 + 404 + 6 + 0 + + + 20 + 585 + 754 + 0 + 0 + + + 70 + 301 + 282 + 0 + 0 + + + 0 + 683 + 533 + 1 + 0 + + + 0 + 52 + 436 + 0 + 0 + + + 205 + 208 + 109 + 0 + 0 + + + 597 + 746 + 488 + 2 + 0 + + + 4 + 616 + 591 + 0 + 0 + + + 284 + 650 + 719 + 0 + 0 + + + 70 + 145 + 369 + 0 + 0 + + + 395 + 487 + 677 + 1 + 0 + + + 12 + 165 + 325 + 0 + 0 + + + 45 + 466 + 649 + 2 + 0 + + + 59 + 558 + 542 + 0 + 0 + + + 7 + 171 + 497 + 0 + 0 + + + 70 + 303 + 177 + 0 + 0 + + + 46 + 449 + 433 + 2 + 0 + + + 1 + 165 + 515 + 1 + 1 + + + 1012 + 448 + 3366 + 4 + 0 + + + 283 + 450 + 432 + 4 + 0 + + + 45 + 537 + 614 + 0 + 0 + + + 4 + 333 + 161 + 0 + 0 + + + 24 + 172 + 494 + 0 + 0 + + + 1 + 593 + 556 + 6 + 0 + + + 3 + 232 + 497 + 0 + 0 + + + 70 + 144 + 158 + 0 + 0 + + + 1 + 121 + 443 + 0 + 0 + + + 1 + 180 + 472 + 0 + 0 + + + 34 + 426 + 710 + 0 + 0 + + + 36 + 495 + 666 + 0 + 0 + + + 15 + 249 + 463 + 6 + 0 + + + 9 + 77 + 696 + 0 + 0 + + + 597 + 672 + 450 + 6 + 0 + + + 7 + 615 + 760 + 4 + 0 + + + 191 + 189 + 610 + 0 + 0 + + + 34 + 721 + 505 + 3 + 0 + + + 0 + 666 + 495 + 6 + 0 + + + 70 + 119 + 191 + 0 + 0 + + + 284 + 645 + 684 + 0 + 0 + + + 37 + 634 + 477 + 2 + 0 + + + 1 + 314 + 619 + 2 + 0 + + + 37 + 723 + 456 + 7 + 0 + + + 284 + 624 + 707 + 2 + 0 + + + 284 + 663 + 705 + 0 + 0 + + + 70 + 92 + 247 + 0 + 0 + + + 394 + 482 + 684 + 3 + 0 + + + 0 + 757 + 481 + 3 + 0 + + + 70 + 101 + 225 + 0 + 0 + + + 70 + 208 + 112 + 0 + 0 + + + 70 + 122 + 191 + 0 + 0 + + + 283 + 711 + 707 + 0 + 0 + + + 34 + 611 + 538 + 6 + 0 + + + 34 + 708 + 710 + 2 + 0 + + + 20 + 313 + 521 + 0 + 0 + + + 23 + 664 + 704 + 0 + 0 + + + 110 + 227 + 507 + 4 + 0 + + + 104 + 685 + 643 + 0 + 0 + + + 283 + 601 + 446 + 0 + 0 + + + 70 + 184 + 293 + 0 + 0 + + + 597 + 742 + 443 + 2 + 0 + + + 4 + 88 + 265 + 0 + 0 + + + 70 + 203 + 567 + 0 + 0 + + + 70 + 81 + 288 + 0 + 0 + + + 45 + 167 + 503 + 4 + 0 + + + 183 + 363 + 705 + 0 + 0 + + + 34 + 396 + 677 + 0 + 0 + + + 0 + 674 + 540 + 1 + 0 + + + 70 + 65 + 359 + 0 + 0 + + + 284 + 644 + 684 + 0 + 0 + + + 20 + 175 + 480 + 0 + 0 + + + 70 + 321 + 168 + 0 + 0 + + + 284 + 632 + 697 + 2 + 0 + + + 70 + 299 + 385 + 0 + 0 + + + 1 + 97 + 556 + 4 + 0 + + + 77 + 117 + 461 + 4 + 0 + + + 103 + 637 + 853 + 6 + 0 + + + 4 + 222 + 243 + 0 + 0 + + + 70 + 325 + 166 + 0 + 0 + + + 34 + 83 + 650 + 0 + 0 + + + 205 + 102 + 229 + 0 + 0 + + + 285 + 488 + 397 + 0 + 0 + + + 1 + 271 + 602 + 1 + 1 + + + 70 + 132 + 177 + 0 + 0 + + + 938 + 683 + 645 + 0 + 0 + + + 70 + 80 + 292 + 0 + 0 + + + 70 + 58 + 403 + 0 + 0 + + + 70 + 62 + 377 + 0 + 0 + + + 110 + 228 + 505 + 4 + 0 + + + 37 + 645 + 683 + 3 + 0 + + + 70 + 261 + 322 + 0 + 0 + + + 1 + 616 + 759 + 0 + 1 + + + 51 + 617 + 714 + 4 + 0 + + + 70 + 283 + 297 + 0 + 0 + + + 70 + 297 + 283 + 0 + 0 + + + 284 + 666 + 702 + 0 + 0 + + + 286 + 515 + 497 + 0 + 0 + + + 0 + 608 + 498 + 0 + 0 + + + 13 + 173 + 312 + 0 + 0 + + + 38 + 330 + 349 + 0 + 0 + + + 283 + 701 + 667 + 4 + 0 + + + 70 + 271 + 425 + 0 + 0 + + + 51 + 266 + 2963 + 2 + 0 + + + 70 + 195 + 120 + 0 + 0 + + + 284 + 624 + 706 + 2 + 0 + + + 313 + 696 + 523 + 3 + 0 + + + 70 + 112 + 209 + 0 + 0 + + + 4 + 294 + 286 + 0 + 0 + + + 38 + 300 + 180 + 0 + 0 + + + 32 + 539 + 753 + 0 + 0 + + + 70 + 219 + 526 + 0 + 0 + + + 420 + 685 + 480 + 6 + 0 + + + 34 + 513 + 499 + 0 + 0 + + + 70 + 157 + 344 + 0 + 0 + + + 306 + 763 + 532 + 3 + 0 + + + 15 + 163 + 516 + 0 + 0 + + + 29 + 502 + 448 + 0 + 0 + + + 4 + 143 + 376 + 0 + 0 + + + 88 + 107 + 219 + 2 + 0 + + + 284 + 448 + 432 + 4 + 0 + + + 284 + 654 + 715 + 0 + 0 + + + 205 + 190 + 283 + 0 + 0 + + + 89 + 131 + 642 + 4 + 0 + + + 38 + 214 + 393 + 0 + 0 + + + 4 + 96 + 244 + 0 + 0 + + + 70 + 289 + 291 + 0 + 0 + + + 63 + 490 + 395 + 6 + 0 + + + 278 + 645 + 564 + 0 + 0 + + + 106 + 216 + 249 + 4 + 0 + + + 46 + 447 + 433 + 2 + 0 + + + 13 + 167 + 322 + 2 + 0 + + + 205 + 197 + 119 + 0 + 0 + + + 192 + 659 + 499 + 4 + 0 + + + 46 + 446 + 434 + 2 + 0 + + + 51 + 622 + 708 + 6 + 0 + + + 70 + 305 + 377 + 0 + 0 + + + 34 + 697 + 522 + 2 + 0 + + + 284 + 669 + 699 + 2 + 0 + + + 70 + 237 + 227 + 0 + 0 + + + 38 + 170 + 138 + 0 + 0 + + + 70 + 68 + 345 + 0 + 0 + + + 1 + 134 + 628 + 1 + 1 + + + 51 + 230 + 500 + 2 + 0 + + + 1 + 150 + 561 + 0 + 1 + + + 70 + 198 + 425 + 0 + 0 + + + 70 + 275 + 306 + 0 + 0 + + + 70 + 121 + 194 + 0 + 0 + + + 15 + 118 + 456 + 6 + 0 + + + 306 + 674 + 488 + 1 + 0 + + + 143 + 101 + 533 + 6 + 0 + + + 284 + 642 + 686 + 0 + 0 + + + 284 + 655 + 714 + 2 + 0 + + + 311 + 494 + 543 + 0 + 0 + + + 273 + 644 + 565 + 0 + 0 + + + 70 + 325 + 259 + 0 + 0 + + + 38 + 58 + 405 + 0 + 0 + + + 102 + 567 + 716 + 0 + 0 + + + 960 + 638 + 733 + 0 + 0 + + + 4 + 276 + 305 + 0 + 0 + + + 34 + 637 + 789 + 0 + 0 + + + 25 + 208 + 553 + 4 + 0 + + + 70 + 111 + 212 + 0 + 0 + + + 1 + 161 + 523 + 0 + 0 + + + 55 + 569 + 532 + 0 + 0 + + + 664 + 664 + 757 + 7 + 0 + + + 4 + 268 + 201 + 0 + 0 + + + 70 + 315 + 171 + 0 + 0 + + + 55 + 534 + 616 + 4 + 0 + + + 70 + 191 + 282 + 0 + 0 + + + 45 + 194 + 434 + 0 + 0 + + + 70 + 217 + 388 + 0 + 0 + + + 88 + 105 + 224 + 2 + 0 + + + 4 + 269 + 313 + 0 + 0 + + + 283 + 489 + 396 + 6 + 0 + + + 494 + 622 + 585 + 4 + 0 + + + 284 + 671 + 697 + 2 + 0 + + + 1012 + 220 + 107 + 0 + 0 + + + 0 + 614 + 493 + 0 + 0 + + + 102 + 617 + 658 + 0 + 0 + + + 70 + 125 + 431 + 0 + 0 + + + 4 + 259 + 208 + 0 + 0 + + + 70 + 208 + 259 + 0 + 0 + + + 1 + 104 + 518 + 0 + 1 + + + 224 + 254 + 643 + 4 + 0 + + + 407 + 638 + 570 + 0 + 0 + + + 313 + 698 + 521 + 3 + 0 + + + 38 + 61 + 378 + 0 + 0 + + + 70 + 183 + 126 + 0 + 0 + + + 70 + 189 + 122 + 0 + 0 + + + 563 + 660 + 551 + 2 + 0 + + + 284 + 626 + 704 + 2 + 0 + + + 7 + 118 + 459 + 4 + 0 + + + 0 + 120 + 702 + 0 + 0 + + + 192 + 654 + 503 + 4 + 0 + + + 20 + 177 + 476 + 0 + 0 + + + 38 + 244 + 222 + 0 + 0 + + + 70 + 198 + 580 + 6 + 0 + + + 284 + 656 + 713 + 0 + 0 + + + 63 + 128 + 658 + 4 + 0 + + + 70 + 312 + 368 + 0 + 0 + + + 116 + 208 + 552 + 2 + 0 + + + 306 + 732 + 554 + 0 + 0 + + + 306 + 764 + 476 + 0 + 0 + + + 396 + 535 + 758 + 1 + 0 + + + 284 + 639 + 732 + 2 + 0 + + + 0 + 695 + 436 + 3 + 0 + + + 284 + 449 + 432 + 4 + 0 + + + 306 + 746 + 441 + 7 + 0 + + + 43 + 210 + 547 + 4 + 0 + + + 284 + 652 + 676 + 0 + 0 + + + 70 + 269 + 427 + 0 + 0 + + + 37 + 341 + 660 + 0 + 0 + + + 1 + 182 + 463 + 0 + 0 + + + 70 + 334 + 344 + 0 + 0 + + + 309 + 647 + 723 + 0 + 0 + + + 44 + 615 + 1562 + 0 + 0 + + + 70 + 257 + 211 + 0 + 0 + + + 70 + 225 + 241 + 0 + 0 + + + 428 + 681 + 445 + 4 + 0 + + + 1 + 500 + 388 + 0 + 1 + + + 205 + 299 + 282 + 0 + 0 + + + 205 + 56 + 413 + 0 + 0 + + + 205 + 131 + 414 + 0 + 0 + + + 38 + 712 + 657 + 0 + 0 + + + 70 + 320 + 359 + 0 + 0 + + + 407 + 218 + 106 + 0 + 0 + + + 70 + 121 + 191 + 0 + 0 + + + 597 + 685 + 531 + 4 + 0 + + + 34 + 649 + 507 + 0 + 0 + + + 419 + 720 + 457 + 0 + 0 + + + 3 + 164 + 514 + 0 + 0 + + + 70 + 323 + 261 + 0 + 0 + + + 70 + 54 + 428 + 0 + 0 + + + 38 + 115 + 201 + 0 + 0 + + + 1 + 168 + 502 + 0 + 1 + + + 1 + 176 + 653 + 0 + 0 + + + 70 + 66 + 351 + 0 + 0 + + + 70 + 99 + 234 + 0 + 0 + + + 274 + 451 + 672 + 4 + 0 + + + 597 + 672 + 451 + 6 + 0 + + + 11 + 447 + 678 + 6 + 0 + + + 981 + 616 + 492 + 0 + 0 + + + 70 + 136 + 399 + 0 + 0 + + + 70 + 204 + 266 + 0 + 0 + + + 5 + 102 + 532 + 0 + 0 + + + 5 + 308 + 529 + 0 + 0 + + + 284 + 655 + 673 + 2 + 0 + + + 668 + 729 + 499 + 0 + 0 + + + 191 + 189 + 608 + 0 + 0 + + + 1 + 170 + 496 + 1 + 1 + + + 38 + 160 + 339 + 0 + 0 + + + 284 + 658 + 711 + 0 + 0 + + + 38 + 711 + 658 + 0 + 0 + + + 70 + 221 + 520 + 0 + 0 + + + 407 + 649 + 625 + 0 + 0 + + + 37 + 166 + 508 + 4 + 0 + + + 143 + 101 + 535 + 6 + 0 + + + 21 + 373 + 685 + 2 + 0 + + + 70 + 56 + 414 + 0 + 0 + + + 70 + 176 + 307 + 0 + 0 + + + 70 + 261 + 207 + 0 + 0 + + + 164 + 730 + 498 + 0 + 0 + + + 191 + 185 + 620 + 0 + 0 + + + 38 + 697 + 582 + 2 + 0 + + + 1 + 185 + 456 + 0 + 0 + + + 7 + 614 + 762 + 0 + 0 + + + 45 + 536 + 614 + 0 + 0 + + + 33 + 390 + 687 + 0 + 0 + + + 325 + 555 + 593 + 0 + 0 + + + 70 + 270 + 425 + 0 + 0 + + + 285 + 481 + 403 + 0 + 0 + + + 88 + 109 + 213 + 2 + 0 + + + 284 + 647 + 681 + 2 + 0 + + + 20 + 610 + 596 + 2 + 0 + + + 349 + 180 + 129 + 0 + 0 + + + 1 + 162 + 521 + 0 + 0 + + + 70 + 298 + 385 + 0 + 0 + + + 45 + 466 + 650 + 2 + 0 + + + 4 + 139 + 167 + 0 + 0 + + + 313 + 506 + 505 + 0 + 0 + + + 105 + 573 + 708 + 0 + 0 + + + 284 + 659 + 710 + 2 + 0 + + + 401 + 598 + 840 + 5 + 0 + + + 70 + 182 + 297 + 0 + 0 + + + 0 + 669 + 492 + 6 + 0 + + + 70 + 327 + 351 + 0 + 0 + + + 597 + 743 + 443 + 4 + 0 + + + 70 + 102 + 228 + 0 + 0 + + + 70 + 69 + 337 + 0 + 0 + + + 51 + 618 + 713 + 6 + 0 + + + 284 + 648 + 680 + 0 + 0 + + + 22 + 501 + 387 + 0 + 0 + + + 70 + 184 + 294 + 0 + 0 + + + 205 + 196 + 276 + 0 + 0 + + + 38 + 123 + 189 + 0 + 0 + + + 306 + 739 + 549 + 3 + 0 + + + 205 + 66 + 352 + 0 + 0 + + + 21 + 537 + 613 + 2 + 0 + + + 4 + 292 + 393 + 0 + 0 + + + 164 + 755 + 436 + 4 + 0 + + + 307 + 545 + 469 + 0 + 0 + + + 45 + 258 + 632 + 4 + 0 + + + 7 + 171 + 494 + 4 + 0 + + + 70 + 280 + 410 + 0 + 0 + + + 70 + 272 + 199 + 0 + 0 + + + 3 + 231 + 497 + 0 + 0 + + + 1 + 289 + 671 + 0 + 0 + + + 70 + 206 + 113 + 0 + 0 + + + 32 + 536 + 757 + 0 + 0 + + + 284 + 650 + 678 + 0 + 0 + + + 38 + 206 + 410 + 0 + 0 + + + 70 + 175 + 133 + 0 + 0 + + + 13 + 165 + 328 + 2 + 0 + + + 205 + 235 + 99 + 0 + 0 + + + 284 + 634 + 674 + 2 + 0 + + + 205 + 619 + 491 + 0 + 0 + + + 34 + 58 + 453 + 0 + 0 + + + 34 + 214 + 447 + 4 + 0 + + + 193 + 224 + 659 + 4 + 0 + + + 407 + 759 + 563 + 5 + 0 + + + 285 + 516 + 589 + 0 + 0 + + + 1 + 555 + 617 + 0 + 1 + + + 209 + 223 + 429 + 7 + 0 + + + 70 + 256 + 239 + 0 + 0 + + + 565 + 702 + 531 + 2 + 0 + + + 70 + 306 + 425 + 0 + 0 + + + 306 + 721 + 517 + 6 + 0 + + + 34 + 727 + 471 + 7 + 0 + + + 0 + 256 + 508 + 0 + 0 + + + 70 + 217 + 282 + 0 + 0 + + + 1039 + 59 + 445 + 0 + 0 + + + 0 + 750 + 497 + 3 + 0 + + + 47 + 436 + 697 + 2 + 0 + + + 29 + 213 + 449 + 2 + 0 + + + 1 + 608 + 652 + 3 + 0 + + + 34 + 195 + 667 + 1 + 0 + + + 70 + 101 + 260 + 0 + 0 + + + 23 + 630 + 741 + 0 + 0 + + + 284 + 665 + 702 + 0 + 0 + + + 5 + 60 + 439 + 0 + 0 + + + 5 + 743 + 461 + 0 + 0 + + + 1 + 269 + 549 + 1 + 1 + + + 313 + 735 + 466 + 3 + 0 + + + 38 + 105 + 251 + 0 + 0 + + + 20 + 107 + 573 + 0 + 0 + + + 204 + 329 + 291 + 0 + 0 + + + 70 + 156 + 393 + 0 + 0 + + + 284 + 667 + 700 + 0 + 0 + + + 307 + 543 + 465 + 0 + 0 + + + 29 + 332 + 550 + 2 + 0 + + + 205 + 281 + 218 + 0 + 0 + + + 100 + 503 + 502 + 4 + 0 + + + 20 + 471 + 463 + 6 + 0 + + + 206 + 319 + 300 + 0 + 0 + + + 205 + 463 + 471 + 0 + 0 + + + 70 + 70 + 376 + 0 + 0 + + + 70 + 235 + 112 + 0 + 0 + + + 407 + 755 + 566 + 5 + 0 + + + 284 + 653 + 715 + 0 + 0 + + + 1 + 566 + 537 + 0 + 1 + + + 4 + 276 + 222 + 0 + 0 + + + 68 + 110 + 557 + 2 + 0 + + + 25 + 129 + 475 + 0 + 0 + + + 1 + 544 + 502 + 0 + 0 + + + 34 + 193 + 495 + 0 + 0 + + + 1 + 197 + 661 + 0 + 0 + + + 70 + 284 + 216 + 0 + 0 + + + 284 + 624 + 685 + 2 + 0 + + + 0 + 160 + 597 + 0 + 0 + + + 0 + 737 + 506 + 0 + 0 + + + 70 + 196 + 313 + 0 + 0 + + + 306 + 713 + 523 + 1 + 0 + + + 1 + 197 + 485 + 0 + 0 + + + 1041 + 60 + 436 + 0 + 0 + + + 6 + 118 + 520 + 0 + 0 + + + 70 + 191 + 137 + 0 + 0 + + + 70 + 98 + 267 + 0 + 0 + + + 79 + 632 + 590 + 0 + 0 + + + 38 + 256 + 102 + 0 + 0 + + + 284 + 482 + 452 + 2 + 0 + + + 0 + 578 + 526 + 0 + 0 + + + 284 + 662 + 705 + 0 + 0 + + + 34 + 169 + 565 + 6 + 0 + + + 1039 + 59 + 443 + 0 + 0 + + + 70 + 161 + 381 + 0 + 0 + + + 70 + 210 + 620 + 0 + 0 + + + 37 + 636 + 478 + 0 + 0 + + + 4 + 237 + 403 + 0 + 0 + + + 70 + 235 + 554 + 6 + 0 + + + 70 + 228 + 269 + 0 + 0 + + + 284 + 636 + 672 + 0 + 0 + + + 70 + 179 + 146 + 0 + 0 + + + 70 + 73 + 358 + 0 + 0 + + + 70 + 254 + 376 + 0 + 0 + + + 1041 + 60 + 437 + 0 + 0 + + + 1 + 198 + 658 + 0 + 0 + + + 4 + 167 + 157 + 0 + 0 + + + 38 + 687 + 577 + 2 + 0 + + + 407 + 234 + 112 + 5 + 0 + + + 70 + 102 + 257 + 0 + 0 + + + 0 + 177 + 540 + 4 + 0 + + + 34 + 206 + 464 + 0 + 0 + + + 70 + 91 + 288 + 0 + 0 + + + 70 + 117 + 224 + 0 + 0 + + + 407 + 224 + 117 + 0 + 0 + + + 0 + 139 + 442 + 0 + 0 + + + 1 + 703 + 664 + 0 + 0 + + + 36 + 740 + 504 + 7 + 0 + + + 0 + 654 + 465 + 0 + 0 + + + 205 + 227 + 421 + 0 + 0 + + + 45 + 216 + 683 + 2 + 0 + + + 70 + 70 + 374 + 0 + 0 + + + 4 + 320 + 407 + 0 + 0 + + + 34 + 125 + 491 + 1 + 0 + + + 4 + 123 + 213 + 0 + 0 + + + 3 + 279 + 655 + 0 + 0 + + + 0 + 638 + 670 + 0 + 0 + + + 205 + 237 + 112 + 0 + 0 + + + 1 + 56 + 474 + 1 + 0 + + + 284 + 628 + 680 + 0 + 0 + + + 273 + 628 + 594 + 0 + 0 + + + 377 + 658 + 756 + 1 + 0 + + + 36 + 344 + 530 + 0 + 0 + + + 7 + 114 + 535 + 0 + 0 + + + 0 + 196 + 665 + 0 + 0 + + + 0 + 725 + 472 + 7 + 0 + + + 0 + 61 + 435 + 0 + 0 + + + 47 + 277 + 658 + 1 + 1 + + + 1010 + 223 + 119 + 0 + 0 + + + 205 + 124 + 214 + 0 + 0 + + + 1 + 130 + 469 + 0 + 1 + + + 284 + 660 + 707 + 0 + 0 + + + 4 + 253 + 241 + 0 + 0 + + + 0 + 642 + 473 + 5 + 0 + + + 1 + 642 + 581 + 1 + 1 + + + 7 + 629 + 593 + 4 + 0 + + + 70 + 230 + 265 + 0 + 0 + + + 597 + 746 + 500 + 2 + 0 + + + 20 + 488 + 560 + 0 + 0 + + + 1016 + 221 + 120 + 2 + 0 + + + 0 + 626 + 485 + 6 + 0 + + + 145 + 128 + 476 + 2 + 0 + + + 205 + 239 + 399 + 0 + 0 + + + 597 + 752 + 455 + 2 + 0 + + + 70 + 220 + 277 + 0 + 0 + + + 20 + 161 + 593 + 0 + 0 + + + 70 + 307 + 311 + 0 + 0 + + + 0 + 140 + 436 + 0 + 0 + + + 70 + 228 + 572 + 6 + 0 + + + 394 + 517 + 662 + 1 + 0 + + + 1011 + 220 + 121 + 2 + 0 + + + 38 + 275 + 222 + 0 + 0 + + + 32 + 496 + 690 + 6 + 0 + + + 1 + 609 + 562 + 6 + 0 + + + 70 + 62 + 429 + 0 + 0 + + + 0 + 200 + 652 + 0 + 0 + + + 1039 + 61 + 436 + 0 + 0 + + + 38 + 258 + 370 + 0 + 0 + + + 1 + 207 + 630 + 0 + 0 + + + 0 + 662 + 517 + 6 + 0 + + + 70 + 94 + 283 + 0 + 0 + + + 70 + 195 + 313 + 0 + 0 + + + 284 + 649 + 719 + 0 + 0 + + + 313 + 679 + 504 + 3 + 0 + + + 1 + 297 + 614 + 2 + 0 + + + 25 + 129 + 473 + 0 + 0 + + + 401 + 510 + 671 + 2 + 0 + + + 34 + 207 + 461 + 0 + 0 + + + 1 + 58 + 458 + 1 + 0 + + + 36 + 353 + 716 + 0 + 0 + + + 7 + 614 + 760 + 4 + 0 + + + 36 + 350 + 521 + 0 + 0 + + + 70 + 212 + 615 + 0 + 0 + + + 70 + 244 + 250 + 0 + 0 + + + 284 + 639 + 730 + 2 + 0 + + + 1 + 202 + 646 + 0 + 0 + + + 597 + 672 + 509 + 6 + 0 + + + 205 + 72 + 367 + 0 + 0 + + + 193 + 85 + 719 + 0 + 0 + + + 70 + 323 + 295 + 0 + 0 + + + 70 + 315 + 194 + 0 + 0 + + + 4 + 210 + 291 + 0 + 0 + + + 1011 + 222 + 119 + 2 + 0 + + + 70 + 93 + 284 + 0 + 0 + + + 4 + 203 + 301 + 0 + 0 + + + 70 + 160 + 165 + 0 + 0 + + + 445 + 623 + 599 + 0 + 0 + + + 193 + 368 + 687 + 0 + 0 + + + 395 + 659 + 755 + 1 + 0 + + + 597 + 672 + 452 + 6 + 0 + + + 36 + 755 + 453 + 1 + 0 + + + 34 + 147 + 648 + 0 + 0 + + + 0 + 465 + 468 + 0 + 0 + + + 284 + 630 + 678 + 2 + 0 + + + 4 + 68 + 388 + 0 + 0 + + + 70 + 109 + 242 + 0 + 0 + + + 36 + 599 + 571 + 6 + 0 + + + 4 + 155 + 394 + 0 + 0 + + + 1 + 51 + 517 + 1 + 0 + + + 597 + 680 + 503 + 2 + 0 + + + 70 + 232 + 411 + 0 + 0 + + + 6 + 412 + 443 + 2 + 0 + + + 70 + 88 + 301 + 0 + 0 + + + 70 + 164 + 373 + 0 + 0 + + + 284 + 632 + 676 + 0 + 0 + + + 0 + 614 + 646 + 3 + 0 + + + 45 + 218 + 678 + 6 + 0 + + + 38 + 312 + 196 + 0 + 0 + + + 20 + 581 + 523 + 2 + 0 + + + 205 + 63 + 420 + 0 + 0 + + + 32 + 387 + 706 + 0 + 0 + + + 1 + 57 + 464 + 1 + 0 + + + 70 + 282 + 338 + 0 + 0 + + + 34 + 108 + 566 + 7 + 0 + + + 34 + 227 + 651 + 0 + 0 + + + 34 + 125 + 489 + 1 + 0 + + + 45 + 466 + 652 + 2 + 0 + + + 38 + 167 + 366 + 0 + 0 + + + 283 + 696 + 670 + 4 + 0 + + + 445 + 663 + 563 + 6 + 0 + + + 36 + 350 + 523 + 0 + 0 + + + 0 + 222 + 433 + 4 + 0 + + + 70 + 83 + 310 + 0 + 0 + + + 145 + 128 + 474 + 2 + 0 + + + 1 + 197 + 488 + 0 + 0 + + + 70 + 211 + 122 + 0 + 0 + + + 38 + 130 + 198 + 0 + 0 + + + 384 + 534 + 699 + 4 + 0 + + + 205 + 230 + 418 + 0 + 0 + + + 82 + 448 + 677 + 1 + 1 + + + 45 + 466 + 651 + 2 + 0 + + + 4 + 150 + 641 + 0 + 0 + + + 283 + 713 + 654 + 4 + 0 + + + 607 + 697 + 492 + 2 + 0 + + + 205 + 289 + 210 + 0 + 0 + + + 143 + 271 + 2956 + 4 + 0 + + + 70 + 159 + 162 + 0 + 0 + + + 70 + 188 + 137 + 0 + 0 + + + 597 + 752 + 456 + 2 + 0 + + + 88 + 116 + 222 + 2 + 0 + + + 0 + 748 + 499 + 3 + 0 + + + 38 + 232 + 111 + 0 + 0 + + + 70 + 63 + 409 + 0 + 0 + + + 407 + 230 + 112 + 0 + 0 + + + 1 + 206 + 634 + 0 + 0 + + + 74 + 565 + 537 + 6 + 0 + + + 34 + 137 + 702 + 0 + 0 + + + 70 + 211 + 619 + 0 + 0 + + + 70 + 323 + 188 + 0 + 0 + + + 1041 + 59 + 437 + 0 + 0 + + + 626 + 703 + 531 + 2 + 0 + + + 284 + 631 + 678 + 0 + 0 + + + 9 + 215 + 689 + 0 + 1 + + + 284 + 671 + 695 + 2 + 0 + + + 70 + 251 + 242 + 0 + 0 + + + 208 + 636 + 587 + 2 + 0 + + + 1 + 502 + 543 + 6 + 0 + + + 4 + 58 + 445 + 0 + 0 + + + 407 + 764 + 560 + 5 + 0 + + + 70 + 145 + 419 + 0 + 0 + + + 34 + 124 + 490 + 1 + 0 + + + 46 + 614 + 608 + 2 + 0 + + + 284 + 656 + 711 + 0 + 0 + + + 37 + 247 + 529 + 0 + 0 + + + 5 + 347 + 627 + 0 + 0 + + + 34 + 196 + 491 + 0 + 0 + + + 310 + 718 + 520 + 0 + 0 + + + 1 + 116 + 524 + 1 + 1 + + + 1039 + 59 + 438 + 0 + 0 + + + 205 + 232 + 262 + 0 + 0 + + + 88 + 699 + 568 + 5 + 0 + + + 70 + 94 + 275 + 0 + 0 + + + 70 + 204 + 298 + 0 + 0 + + + 205 + 92 + 281 + 0 + 0 + + + 0 + 314 + 472 + 0 + 0 + + + 50 + 568 + 699 + 2 + 0 + + + 1 + 612 + 1562 + 0 + 1 + + + 205 + 109 + 235 + 0 + 0 + + + 284 + 666 + 700 + 0 + 0 + + + 34 + 600 + 777 + 3 + 0 + + + 34 + 400 + 681 + 0 + 0 + + + 70 + 190 + 320 + 0 + 0 + + + 205 + 200 + 128 + 0 + 0 + + + 0 + 670 + 453 + 5 + 0 + + + 70 + 71 + 361 + 0 + 0 + + + 205 + 222 + 274 + 0 + 0 + + + 38 + 86 + 298 + 0 + 0 + + + 34 + 735 + 508 + 3 + 0 + + + 88 + 117 + 219 + 2 + 0 + + + 284 + 652 + 715 + 0 + 0 + + + 36 + 345 + 531 + 0 + 0 + + + 38 + 187 + 137 + 0 + 0 + + + 284 + 633 + 676 + 0 + 0 + + + 55 + 278 + 659 + 0 + 0 + + + 284 + 667 + 699 + 2 + 0 + + + 1 + 203 + 644 + 0 + 0 + + + 51 + 430 + 3380 + 6 + 0 + + + 0 + 58 + 442 + 0 + 0 + + + 46 + 127 + 479 + 4 + 0 + + + 70 + 144 + 178 + 0 + 0 + + + 1 + 151 + 636 + 0 + 0 + + + 284 + 482 + 451 + 2 + 0 + + + 0 + 310 + 591 + 2 + 0 + + + 21 + 368 + 685 + 4 + 0 + + + 70 + 236 + 407 + 0 + 0 + + + 70 + 66 + 389 + 0 + 0 + + + 653 + 683 + 502 + 4 + 0 + + + 3 + 213 + 695 + 0 + 0 + + + 1 + 644 + 724 + 1 + 0 + + + 70 + 82 + 313 + 0 + 0 + + + 70 + 292 + 329 + 0 + 0 + + + 70 + 227 + 576 + 6 + 0 + + + 0 + 625 + 635 + 6 + 0 + + + 70 + 186 + 138 + 0 + 0 + + + 205 + 236 + 258 + 0 + 0 + + + 3 + 452 + 3370 + 0 + 0 + + + 1039 + 58 + 443 + 0 + 0 + + + 668 + 704 + 487 + 1 + 0 + + + 33 + 124 + 491 + 1 + 0 + + + 193 + 224 + 661 + 4 + 0 + + + 70 + 252 + 102 + 0 + 0 + + + 0 + 582 + 682 + 0 + 0 + + + 309 + 697 + 669 + 4 + 0 + + + 407 + 705 + 563 + 6 + 0 + + + 284 + 654 + 713 + 0 + 0 + + + 70 + 310 + 310 + 0 + 0 + + + 284 + 669 + 697 + 2 + 0 + + + 3 + 585 + 519 + 0 + 0 + + + 11 + 116 + 525 + 0 + 0 + + + 34 + 131 + 465 + 7 + 0 + + + 34 + 618 + 804 + 6 + 0 + + + 205 + 270 + 356 + 0 + 0 + + + 47 + 133 + 458 + 0 + 0 + + + 0 + 258 + 507 + 0 + 0 + + + 1 + 492 + 442 + 0 + 0 + + + 1 + 329 + 661 + 1 + 1 + + + 1 + 251 + 590 + 0 + 0 + + + 0 + 640 + 668 + 0 + 0 + + + 70 + 130 + 200 + 0 + 0 + + + 1 + 134 + 451 + 0 + 0 + + + 1 + 559 + 613 + 0 + 1 + + + 278 + 452 + 3371 + 0 + 0 + + + 0 + 138 + 438 + 0 + 0 + + + 145 + 128 + 472 + 2 + 0 + + + 0 + 174 + 551 + 4 + 0 + + + 70 + 147 + 411 + 0 + 0 + + + 0 + 137 + 441 + 0 + 0 + + + 1 + 188 + 510 + 0 + 0 + + + 307 + 547 + 461 + 0 + 0 + + + 0 + 170 + 564 + 6 + 0 + + + 37 + 586 + 848 + 6 + 0 + + + 21 + 372 + 678 + 4 + 0 + + + 284 + 629 + 741 + 0 + 0 + + + 70 + 334 + 181 + 0 + 0 + + + 10 + 127 + 476 + 2 + 0 + + + 21 + 59 + 441 + 0 + 0 + + + 399 + 612 + 812 + 2 + 0 + + + 308 + 485 + 520 + 3 + 0 + + + 11 + 583 + 520 + 0 + 0 + + + 37 + 130 + 465 + 0 + 0 + + + 47 + 132 + 458 + 4 + 0 + + + 307 + 737 + 465 + 0 + 0 + + + 4 + 72 + 362 + 0 + 0 + + + 1 + 149 + 644 + 0 + 0 + + + 205 + 199 + 304 + 0 + 0 + + + 1 + 620 + 489 + 0 + 0 + + + 0 + 652 + 465 + 0 + 0 + + + 597 + 672 + 510 + 6 + 0 + + + 395 + 504 + 680 + 4 + 0 + + + 70 + 246 + 106 + 0 + 0 + + + 330 + 560 + 612 + 2 + 0 + + + 597 + 680 + 504 + 2 + 0 + + + 1039 + 59 + 442 + 0 + 0 + + + 284 + 664 + 702 + 0 + 0 + + + 1 + 135 + 448 + 0 + 0 + + + 308 + 497 + 549 + 6 + 0 + + + 70 + 320 + 409 + 0 + 0 + + + 205 + 229 + 419 + 0 + 0 + + + 36 + 353 + 518 + 0 + 0 + + + 4 + 284 + 213 + 0 + 0 + + + 1 + 115 + 526 + 1 + 1 + + + 37 + 688 + 543 + 2 + 0 + + + 183 + 363 + 695 + 0 + 0 + + + 0 + 196 + 668 + 0 + 0 + + + 971 + 638 + 779 + 0 + 0 + + + 51 + 570 + 697 + 4 + 0 + + + 70 + 70 + 373 + 0 + 0 + + + 45 + 218 + 681 + 6 + 0 + + + 38 + 248 + 244 + 0 + 0 + + + 70 + 327 + 454 + 4 + 0 + + + 283 + 616 + 443 + 0 + 0 + + + 47 + 133 + 455 + 0 + 0 + + + 70 + 164 + 369 + 0 + 0 + + + 38 + 306 + 428 + 0 + 0 + + + 3 + 213 + 696 + 0 + 0 + + + 4 + 176 + 147 + 0 + 0 + + + 38 + 154 + 168 + 0 + 0 + + + 34 + 48 + 539 + 0 + 0 + + + 655 + 692 + 495 + 0 + 0 + + + 38 + 115 + 225 + 0 + 0 + + + 70 + 65 + 398 + 0 + 0 + + + 283 + 602 + 774 + 0 + 0 + + + 70 + 61 + 424 + 0 + 0 + + + 50 + 659 + 567 + 0 + 0 + + + 3 + 116 + 522 + 0 + 0 + + + 214 + 93 + 278 + 6 + 0 + + + 70 + 151 + 401 + 0 + 0 + + + 290 + 557 + 615 + 0 + 0 + + + 70 + 256 + 101 + 0 + 0 + + + 286 + 509 + 673 + 1 + 0 + + + 29 + 330 + 658 + 0 + 0 + + + 7 + 628 + 595 + 4 + 0 + + + 286 + 515 + 490 + 0 + 0 + + + 55 + 569 + 533 + 0 + 0 + + + 70 + 227 + 422 + 0 + 0 + + + 962 + 634 + 784 + 2 + 0 + + + 34 + 401 + 680 + 0 + 0 + + + 4 + 312 + 307 + 0 + 0 + + + 307 + 732 + 468 + 0 + 0 + + + 21 + 59 + 439 + 0 + 0 + + + 307 + 545 + 463 + 0 + 0 + + + 70 + 260 + 233 + 0 + 0 + + + 38 + 138 + 439 + 0 + 0 + + + 33 + 404 + 675 + 0 + 0 + + + 70 + 93 + 279 + 0 + 0 + + + 284 + 629 + 680 + 0 + 0 + + + 70 + 226 + 424 + 0 + 0 + + + 20 + 262 + 99 + 4 + 0 + + + 70 + 180 + 144 + 0 + 0 + + + 70 + 80 + 324 + 0 + 0 + + + 183 + 360 + 701 + 0 + 0 + + + 284 + 661 + 705 + 0 + 0 + + + 1 + 569 + 698 + 0 + 1 + + + 70 + 68 + 382 + 0 + 0 + + + 0 + 628 + 483 + 6 + 0 + + + 3 + 279 + 656 + 0 + 0 + + + 3 + 116 + 523 + 0 + 0 + + + 70 + 189 + 321 + 0 + 0 + + + 70 + 237 + 553 + 6 + 0 + + + 34 + 355 + 711 + 0 + 0 + + + 34 + 230 + 645 + 0 + 0 + + + 0 + 311 + 477 + 0 + 0 + + + 0 + 580 + 523 + 0 + 0 + + + 70 + 172 + 151 + 0 + 0 + + + 70 + 287 + 334 + 0 + 0 + + + 284 + 630 + 679 + 2 + 0 + + + 38 + 168 + 361 + 0 + 0 + + + 597 + 746 + 501 + 2 + 0 + + + 205 + 326 + 402 + 0 + 0 + + + 36 + 352 + 717 + 0 + 0 + + + 27 + 439 + 691 + 0 + 0 + + + 70 + 225 + 426 + 0 + 0 + + + 1 + 123 + 493 + 1 + 0 + + + 183 + 357 + 707 + 0 + 0 + + + 38 + 281 + 337 + 0 + 0 + + + 284 + 627 + 680 + 0 + 0 + + + 34 + 204 + 633 + 0 + 0 + + + 1166 + 471 + 3383 + 7 + 0 + + + 217 + 660 + 646 + 6 + 0 + + + 284 + 648 + 719 + 0 + 0 + + + 70 + 324 + 186 + 0 + 0 + + + 70 + 186 + 324 + 0 + 0 + + + 284 + 659 + 707 + 0 + 0 + + + 407 + 224 + 113 + 5 + 0 + + + 107 + 561 + 705 + 0 + 0 + + + 36 + 742 + 463 + 1 + 0 + + + 4 + 83 + 305 + 0 + 0 + + + 70 + 269 + 224 + 0 + 0 + + + 21 + 368 + 689 + 4 + 0 + + + 29 + 331 + 662 + 2 + 0 + + + 191 + 102 + 591 + 0 + 0 + + + 0 + 625 + 488 + 6 + 0 + + + 3 + 214 + 695 + 0 + 0 + + + 36 + 755 + 455 + 3 + 0 + + + 70 + 207 + 291 + 0 + 0 + + + 0 + 198 + 652 + 3 + 0 + + + 407 + 232 + 109 + 6 + 0 + + + 34 + 137 + 691 + 0 + 0 + + + 0 + 196 + 483 + 0 + 0 + + + 70 + 190 + 317 + 0 + 0 + + + 407 + 230 + 110 + 7 + 0 + + + 34 + 129 + 467 + 7 + 0 + + + 34 + 194 + 488 + 0 + 0 + + + 1 + 55 + 460 + 0 + 0 + + + 284 + 626 + 681 + 2 + 0 + + + 70 + 91 + 278 + 0 + 0 + + + 70 + 93 + 272 + 0 + 0 + + + 62 + 212 + 609 + 0 + 0 + + + 0 + 766 + 488 + 3 + 0 + + + 70 + 107 + 236 + 0 + 0 + + + 38 + 108 + 234 + 0 + 0 + + + 38 + 234 + 108 + 0 + 0 + + + 284 + 639 + 729 + 2 + 0 + + + 1 + 286 + 642 + 0 + 0 + + + 36 + 135 + 701 + 6 + 0 + + + 37 + 138 + 436 + 0 + 0 + + + 70 + 174 + 145 + 0 + 0 + + + 8 + 58 + 435 + 0 + 0 + + + 307 + 745 + 461 + 7 + 0 + + + 0 + 616 + 495 + 0 + 0 + + + 0 + 203 + 466 + 0 + 0 + + + 36 + 353 + 520 + 0 + 0 + + + 284 + 657 + 709 + 2 + 0 + + + 284 + 625 + 682 + 0 + 0 + + + 1 + 130 + 463 + 0 + 1 + + + 185 + 279 + 658 + 0 + 0 + + + 1 + 149 + 635 + 0 + 0 + + + 36 + 354 + 716 + 0 + 0 + + + 5 + 714 + 481 + 0 + 0 + + + 38 + 81 + 311 + 0 + 0 + + + 70 + 302 + 428 + 0 + 0 + + + 38 + 334 + 387 + 0 + 0 + + + 7 + 594 + 718 + 0 + 0 + + + 1179 + 529 + 707 + 4 + 0 + + + 597 + 680 + 505 + 2 + 0 + + + 70 + 257 + 368 + 0 + 0 + + + 407 + 225 + 112 + 1 + 0 + + + 38 + 56 + 450 + 0 + 0 + + + 70 + 93 + 271 + 0 + 0 + + + 93 + 140 + 180 + 2 + 0 + + + 0 + 739 + 535 + 3 + 0 + + + 597 + 672 + 511 + 6 + 0 + + + 1 + 603 + 506 + 3 + 1 + + + 6 + 412 + 446 + 2 + 0 + + + 70 + 117 + 215 + 0 + 0 + + + 70 + 129 + 195 + 0 + 0 + + + 193 + 373 + 680 + 0 + 0 + + + 4 + 312 + 303 + 0 + 0 + + + 0 + 609 + 501 + 0 + 0 + + + 34 + 699 + 535 + 4 + 0 + + + 70 + 85 + 296 + 0 + 0 + + + 3 + 450 + 678 + 6 + 0 + + + 0 + 350 + 525 + 0 + 0 + + + 597 + 672 + 454 + 6 + 0 + + + 70 + 157 + 160 + 0 + 0 + + + 1 + 139 + 434 + 0 + 0 + + + 38 + 701 + 708 + 2 + 0 + + + 1 + 205 + 461 + 0 + 0 + + + 395 + 521 + 659 + 1 + 0 + + + 34 + 577 + 739 + 0 + 0 + + + 70 + 304 + 425 + 0 + 0 + + + 38 + 314 + 301 + 0 + 0 + + + 307 + 524 + 484 + 0 + 0 + + + 284 + 628 + 679 + 2 + 0 + + + 284 + 655 + 711 + 0 + 0 + + + 34 + 170 + 556 + 4 + 0 + + + 34 + 147 + 643 + 1 + 0 + + + 58 + 615 + 608 + 2 + 0 + + + 70 + 319 + 189 + 0 + 0 + + + 70 + 203 + 297 + 0 + 0 + + + 1009 + 226 + 111 + 2 + 0 + + + 70 + 327 + 395 + 0 + 0 + + + 32 + 499 + 688 + 6 + 0 + + + 4 + 300 + 201 + 0 + 0 + + + 1 + 287 + 640 + 0 + 0 + + + 70 + 268 + 225 + 0 + 0 + + + 70 + 229 + 564 + 6 + 0 + + + 1 + 158 + 598 + 0 + 0 + + + 215 + 90 + 279 + 5 + 0 + + + 1 + 581 + 525 + 0 + 0 + + + 34 + 694 + 671 + 0 + 0 + + + 284 + 671 + 694 + 2 + 0 + + + 420 + 726 + 515 + 0 + 0 + + + 960 + 637 + 731 + 0 + 0 + + + 76 + 439 + 694 + 0 + 1 + + + 13 + 183 + 328 + 6 + 0 + + + 70 + 164 + 366 + 0 + 0 + + + 34 + 392 + 700 + 0 + 0 + + + 36 + 502 + 436 + 0 + 0 + + + 38 + 176 + 341 + 0 + 0 + + + 0 + 313 + 476 + 0 + 0 + + + 4 + 249 + 241 + 0 + 0 + + + 38 + 174 + 147 + 0 + 0 + + + 402 + 517 + 664 + 2 + 0 + + + 45 + 466 + 654 + 2 + 0 + + + 183 + 360 + 705 + 0 + 0 + + + 3 + 214 + 696 + 0 + 0 + + + 655 + 692 + 496 + 0 + 0 + + + 284 + 634 + 672 + 0 + 0 + + + 0 + 283 + 648 + 0 + 0 + + + 283 + 696 + 669 + 4 + 0 + + + 284 + 669 + 696 + 2 + 0 + + + 10 + 126 + 476 + 2 + 0 + + + 191 + 102 + 588 + 0 + 0 + + + 55 + 119 + 504 + 0 + 0 + + + 284 + 482 + 454 + 2 + 0 + + + 205 + 295 + 320 + 0 + 0 + + + 59 + 105 + 571 + 6 + 0 + + + 320 + 468 + 651 + 6 + 0 + + + 29 + 451 + 3375 + 0 + 0 + + + 284 + 667 + 698 + 2 + 0 + + + 68 + 110 + 545 + 2 + 0 + + + 70 + 176 + 145 + 0 + 0 + + + 34 + 491 + 699 + 6 + 0 + + + 70 + 309 + 194 + 0 + 0 + + + 70 + 194 + 309 + 0 + 0 + + + 45 + 218 + 683 + 6 + 0 + + + 949 + 630 + 788 + 5 + 0 + + + 183 + 363 + 699 + 0 + 0 + + + 192 + 756 + 454 + 0 + 0 + + + 284 + 653 + 713 + 0 + 0 + + + 4 + 71 + 359 + 0 + 0 + + + 1 + 646 + 579 + 1 + 1 + + + 640 + 712 + 482 + 2 + 0 + + + 960 + 636 + 732 + 0 + 0 + + + 398 + 669 + 742 + 7 + 0 + + + 0 + 702 + 434 + 3 + 0 + + + 70 + 331 + 181 + 0 + 0 + + + 0 + 651 + 468 + 0 + 0 + + + 38 + 58 + 439 + 0 + 0 + + + 2 + 617 + 556 + 0 + 1 + + + 0 + 257 + 504 + 0 + 0 + + + 34 + 212 + 611 + 0 + 0 + + + 70 + 226 + 573 + 6 + 0 + + + 13 + 185 + 325 + 6 + 0 + + + 70 + 212 + 120 + 0 + 0 + + + 37 + 507 + 541 + 5 + 0 + + + 285 + 592 + 515 + 7 + 0 + + + 4 + 257 + 367 + 0 + 0 + + + 0 + 258 + 502 + 0 + 0 + + + 1 + 113 + 532 + 0 + 1 + + + 34 + 693 + 540 + 1 + 0 + + + 0 + 337 + 649 + 0 + 0 + + + 0 + 638 + 668 + 0 + 0 + + + 284 + 624 + 683 + 2 + 0 + + + 70 + 159 + 378 + 0 + 0 + + + 4 + 97 + 262 + 0 + 0 + + + 25 + 447 + 682 + 2 + 0 + + + 70 + 192 + 313 + 0 + 0 + + + 70 + 164 + 155 + 0 + 0 + + + 284 + 665 + 700 + 0 + 0 + + + 34 + 455 + 670 + 0 + 0 + + + 34 + 48 + 529 + 0 + 0 + + + 70 + 102 + 249 + 0 + 0 + + + 70 + 203 + 296 + 0 + 0 + + + 0 + 642 + 725 + 1 + 0 + + + 70 + 181 + 332 + 0 + 0 + + + 0 + 639 + 477 + 2 + 0 + + + 1039 + 58 + 438 + 0 + 0 + + + 70 + 116 + 219 + 0 + 0 + + + 70 + 205 + 293 + 0 + 0 + + + 0 + 667 + 457 + 5 + 0 + + + 1 + 215 + 692 + 2 + 1 + + + 67 + 132 + 455 + 4 + 0 + + + 192 + 741 + 505 + 0 + 0 + + + 70 + 74 + 343 + 0 + 0 + + + 70 + 90 + 282 + 0 + 0 + + + 80 + 208 + 122 + 4 + 0 + + + 284 + 651 + 715 + 0 + 0 + + + 1 + 457 + 667 + 1 + 1 + + + 205 + 278 + 216 + 0 + 0 + + + 58 + 614 + 694 + 0 + 0 + + + 4 + 318 + 407 + 0 + 0 + + + 0 + 622 + 490 + 0 + 0 + + + 1 + 269 + 553 + 1 + 1 + + + 70 + 330 + 182 + 0 + 0 + + + 70 + 143 + 420 + 0 + 0 + + + 70 + 125 + 203 + 0 + 0 + + + 284 + 663 + 702 + 0 + 0 + + + 1041 + 58 + 437 + 0 + 0 + + + 36 + 134 + 703 + 6 + 0 + + + 34 + 702 + 533 + 4 + 0 + + + 306 + 488 + 448 + 0 + 0 + + + 0 + 165 + 571 + 6 + 0 + + + 395 + 519 + 661 + 1 + 0 + + + 1 + 256 + 581 + 0 + 0 + + + 565 + 705 + 531 + 2 + 0 + + + 70 + 316 + 189 + 0 + 0 + + + 70 + 189 + 316 + 0 + 0 + + + 70 + 311 + 192 + 0 + 0 + + + 1 + 200 + 648 + 6 + 0 + + + 0 + 310 + 594 + 2 + 0 + + + 38 + 64 + 387 + 0 + 0 + + + 306 + 764 + 490 + 3 + 0 + + + 183 + 363 + 697 + 0 + 0 + + + 34 + 701 + 534 + 4 + 0 + + + 0 + 282 + 653 + 0 + 0 + + + 23 + 661 + 704 + 0 + 0 + + + 70 + 330 + 181 + 0 + 0 + + + 285 + 628 + 741 + 0 + 0 + + + 284 + 624 + 684 + 2 + 0 + + + 306 + 724 + 547 + 0 + 0 + + + 286 + 525 + 580 + 0 + 0 + + + 34 + 743 + 533 + 3 + 0 + + + 38 + 159 + 156 + 0 + 0 + + + 70 + 224 + 425 + 0 + 0 + + + 36 + 138 + 690 + 0 + 0 + + + 0 + 201 + 645 + 3 + 0 + + + 70 + 223 + 268 + 0 + 0 + + + 1 + 134 + 446 + 0 + 0 + + + 36 + 381 + 718 + 0 + 0 + + + 307 + 500 + 437 + 0 + 0 + + + 273 + 628 + 596 + 0 + 0 + + + 54 + 158 + 602 + 0 + 0 + + + 70 + 249 + 382 + 0 + 0 + + + 284 + 660 + 705 + 0 + 0 + + + 205 + 58 + 426 + 0 + 0 + + + 37 + 128 + 466 + 0 + 0 + + + 1 + 204 + 635 + 0 + 0 + + + 0 + 656 + 464 + 0 + 0 + + + 3 + 126 + 1461 + 0 + 0 + + + 1164 + 610 + 499 + 6 + 0 + + + 205 + 250 + 99 + 0 + 0 + + + 208 + 114 + 217 + 2 + 0 + + + 47 + 214 + 697 + 4 + 0 + + + 1 + 516 + 590 + 0 + 0 + + + 4 + 151 + 164 + 0 + 0 + + + 597 + 672 + 453 + 6 + 0 + + + 180 + 92 + 649 + 0 + 0 + + + 24 + 227 + 109 + 0 + 1 + + + 1164 + 615 + 495 + 6 + 0 + + + 206 + 327 + 291 + 0 + 0 + + + 597 + 746 + 502 + 2 + 0 + + + 70 + 160 + 154 + 0 + 0 + + + 70 + 88 + 280 + 0 + 0 + + + 1 + 657 + 570 + 0 + 1 + + + 70 + 145 + 170 + 0 + 0 + + + 70 + 175 + 342 + 0 + 0 + + + 29 + 332 + 555 + 2 + 0 + + + 38 + 260 + 499 + 0 + 0 + + + 0 + 334 + 654 + 0 + 0 + + + 306 + 729 + 543 + 0 + 0 + + + 15 + 611 + 1563 + 6 + 0 + + + 70 + 326 + 398 + 0 + 0 + + + 46 + 530 + 516 + 0 + 0 + + + 70 + 209 + 118 + 0 + 0 + + + 1 + 328 + 666 + 2 + 1 + + + 21 + 465 + 655 + 6 + 0 + + + 34 + 204 + 466 + 0 + 0 + + + 653 + 685 + 502 + 4 + 0 + + + 70 + 96 + 257 + 0 + 0 + + + 34 + 137 + 694 + 0 + 0 + + + 34 + 48 + 514 + 3 + 0 + + + 377 + 662 + 645 + 4 + 0 + + + 0 + 54 + 457 + 0 + 0 + + + 21 + 267 + 486 + 0 + 0 + + + 51 + 568 + 697 + 4 + 0 + + + 655 + 692 + 497 + 0 + 0 + + + 32 + 382 + 716 + 0 + 0 + + + 395 + 508 + 677 + 2 + 0 + + + 70 + 152 + 394 + 0 + 0 + + + 4 + 283 + 336 + 0 + 0 + + + 8 + 56 + 441 + 1 + 0 + + + 145 + 513 + 533 + 4 + 0 + + + 46 + 533 + 513 + 0 + 0 + + + 306 + 687 + 545 + 1 + 0 + + + 70 + 179 + 334 + 0 + 0 + + + 34 + 55 + 447 + 0 + 0 + + + 284 + 657 + 708 + 2 + 0 + + + 0 + 761 + 492 + 3 + 0 + + + 70 + 331 + 287 + 0 + 0 + + + 205 + 321 + 404 + 0 + 0 + + + 183 + 360 + 703 + 0 + 0 + + + 70 + 116 + 212 + 0 + 0 + + + 283 + 708 + 657 + 4 + 0 + + + 38 + 139 + 177 + 0 + 0 + + + 38 + 273 + 348 + 0 + 0 + + + 34 + 203 + 468 + 0 + 0 + + + 88 + 115 + 214 + 2 + 0 + + + 36 + 353 + 717 + 0 + 0 + + + 284 + 658 + 707 + 0 + 0 + + + 0 + 283 + 651 + 0 + 0 + + + 284 + 626 + 682 + 2 + 0 + + + 70 + 214 + 115 + 0 + 0 + + + 70 + 178 + 336 + 0 + 0 + + + 15 + 213 + 609 + 4 + 0 + + + 284 + 639 + 728 + 2 + 0 + + + 284 + 647 + 719 + 0 + 0 + + + 12 + 183 + 325 + 6 + 0 + + + 36 + 137 + 693 + 0 + 0 + + + 395 + 510 + 674 + 6 + 0 + + + 1 + 126 + 472 + 0 + 1 + + + 70 + 252 + 236 + 0 + 0 + + + 34 + 749 + 529 + 3 + 0 + + + 70 + 138 + 431 + 0 + 0 + + + 70 + 272 + 349 + 0 + 0 + + + 205 + 69 + 363 + 0 + 0 + + + 0 + 627 + 632 + 6 + 0 + + + 1 + 351 + 524 + 0 + 0 + + + 70 + 88 + 285 + 0 + 0 + + + 1 + 55 + 456 + 0 + 0 + + + 407 + 220 + 114 + 6 + 0 + + + 284 + 632 + 675 + 2 + 0 + + + 70 + 145 + 173 + 0 + 0 + + + 70 + 211 + 282 + 0 + 0 + + + 1 + 197 + 482 + 0 + 0 + + + 70 + 225 + 422 + 0 + 0 + + + 153 + 606 + 452 + 6 + 0 + + + 192 + 764 + 450 + 0 + 0 + + + 283 + 353 + 521 + 0 + 0 + + + 284 + 482 + 453 + 2 + 0 + + + 38 + 253 + 375 + 0 + 0 + + + 1 + 586 + 519 + 0 + 1 + + + 0 + 735 + 539 + 3 + 0 + + + 20 + 608 + 616 + 4 + 0 + + + 51 + 225 + 111 + 6 + 0 + + + 208 + 112 + 223 + 0 + 0 + + + 80 + 203 + 123 + 4 + 0 + + + 20 + 610 + 614 + 4 + 0 + + + 38 + 710 + 655 + 0 + 0 + + + 4 + 297 + 200 + 0 + 0 + + + 46 + 124 + 479 + 4 + 0 + + + 7 + 648 + 578 + 6 + 0 + + + 70 + 279 + 340 + 0 + 0 + + + 70 + 496 + 440 + 0 + 0 + + + 70 + 223 + 582 + 6 + 0 + + + 405 + 491 + 700 + 6 + 0 + + + 34 + 128 + 464 + 7 + 0 + + + 284 + 630 + 677 + 2 + 0 + + + 38 + 681 + 550 + 6 + 0 + + + 402 + 513 + 670 + 2 + 0 + + + 70 + 180 + 139 + 0 + 0 + + + 70 + 229 + 567 + 6 + 0 + + + 55 + 279 + 659 + 0 + 0 + + + 0 + 690 + 674 + 0 + 0 + + + 70 + 148 + 169 + 0 + 0 + + + 309 + 661 + 520 + 2 + 0 + + + 0 + 201 + 646 + 0 + 0 + + + 34 + 127 + 468 + 7 + 0 + + + 308 + 520 + 487 + 0 + 0 + + + 1164 + 617 + 493 + 6 + 0 + + + 4 + 675 + 689 + 0 + 0 + + + 34 + 209 + 454 + 0 + 0 + + + 139 + 86 + 693 + 4 + 0 + + + 70 + 274 + 346 + 0 + 0 + + + 377 + 498 + 690 + 7 + 0 + + + 0 + 200 + 650 + 3 + 0 + + + 1 + 591 + 722 + 1 + 0 + + + 209 + 221 + 429 + 6 + 0 + + + 70 + 315 + 301 + 0 + 0 + + + 597 + 697 + 493 + 2 + 0 + + + 112 + 421 + 3523 + 0 + 0 + + + 70 + 242 + 103 + 0 + 0 + + + 0 + 668 + 561 + 0 + 0 + + + 164 + 90 + 662 + 5 + 0 + + + 70 + 100 + 249 + 0 + 0 + + + 63 + 439 + 497 + 6 + 0 + + + 0 + 754 + 497 + 3 + 0 + + + 1 + 53 + 470 + 1 + 0 + + + 284 + 654 + 711 + 0 + 0 + + + 34 + 217 + 437 + 4 + 0 + + + 284 + 635 + 672 + 0 + 0 + + + 396 + 516 + 666 + 2 + 0 + + + 284 + 671 + 693 + 2 + 0 + + + 70 + 159 + 375 + 0 + 0 + + + 0 + 151 + 628 + 0 + 0 + + + 205 + 265 + 225 + 0 + 0 + + + 1 + 114 + 523 + 1 + 1 + + + 34 + 390 + 702 + 0 + 0 + + + 597 + 752 + 457 + 2 + 0 + + + 8 + 57 + 436 + 0 + 0 + + + 4 + 260 + 229 + 0 + 0 + + + 47 + 130 + 458 + 0 + 0 + + + 284 + 667 + 697 + 2 + 0 + + + 4 + 267 + 223 + 0 + 0 + + + 70 + 223 + 267 + 0 + 0 + + + 1 + 226 + 110 + 1 + 1 + + + 4 + 181 + 329 + 0 + 0 + + + 20 + 349 + 625 + 6 + 0 + + + 306 + 675 + 509 + 1 + 0 + + + 70 + 192 + 310 + 0 + 0 + + + 45 + 466 + 653 + 2 + 0 + + + 0 + 315 + 474 + 0 + 0 + + + 419 + 690 + 441 + 6 + 0 + + + 12 + 185 + 322 + 0 + 0 + + + 4 + 161 + 370 + 0 + 0 + + + 285 + 599 + 508 + 7 + 0 + + + 70 + 180 + 331 + 0 + 0 + + + 70 + 68 + 366 + 0 + 0 + + + 70 + 252 + 376 + 0 + 0 + + + 4 + 96 + 259 + 0 + 0 + + + 284 + 669 + 695 + 2 + 0 + + + 284 + 634 + 673 + 2 + 0 + + + 1 + 159 + 596 + 0 + 0 + + + 597 + 693 + 491 + 0 + 0 + + + 0 + 137 + 433 + 0 + 0 + + + 4 + 167 + 169 + 0 + 0 + + + 106 + 229 + 259 + 4 + 0 + + + 36 + 598 + 569 + 6 + 0 + + + 1012 + 217 + 130 + 2 + 0 + + + 33 + 127 + 467 + 7 + 0 + + + 445 + 666 + 563 + 6 + 0 + + + 1013 + 235 + 120 + 0 + 0 + + + 0 + 642 + 669 + 0 + 0 + + + 34 + 173 + 564 + 6 + 0 + + + 153 + 602 + 450 + 0 + 0 + + + 38 + 627 + 685 + 1 + 0 + + + 4 + 127 + 222 + 0 + 0 + + + 283 + 53 + 532 + 0 + 0 + + + 0 + 199 + 644 + 0 + 0 + + + 1 + 613 + 758 + 0 + 0 + + + 25 + 447 + 492 + 2 + 0 + + + 70 + 101 + 279 + 0 + 0 + + + 20 + 475 + 463 + 6 + 0 + + + 1 + 61 + 462 + 0 + 0 + + + 1 + 270 + 104 + 1 + 1 + + + 36 + 348 + 519 + 0 + 0 + + + 0 + 727 + 468 + 7 + 0 + + + 72 + 207 + 619 + 3 + 0 + + + 360 + 617 + 639 + 0 + 0 + + + 0 + 97 + 611 + 0 + 0 + + + 70 + 308 + 416 + 0 + 0 + + + 284 + 650 + 715 + 0 + 0 + + + 21 + 368 + 681 + 4 + 0 + + + 70 + 331 + 452 + 4 + 0 + + + 4 + 303 + 196 + 0 + 0 + + + 70 + 196 + 303 + 0 + 0 + + + 70 + 147 + 404 + 0 + 0 + + + 205 + 202 + 140 + 0 + 0 + + + 286 + 658 + 759 + 6 + 0 + + + 0 + 317 + 472 + 0 + 0 + + + 38 + 310 + 315 + 0 + 0 + + + 13 + 181 + 328 + 6 + 0 + + + 284 + 628 + 684 + 2 + 0 + + + 70 + 291 + 204 + 0 + 0 + + + 34 + 733 + 538 + 3 + 0 + + + 565 + 701 + 535 + 2 + 0 + + + 1020 + 219 + 129 + 4 + 0 + + + 608 + 706 + 482 + 0 + 0 + + + 1 + 53 + 533 + 0 + 0 + + + 209 + 227 + 430 + 7 + 0 + + + 70 + 271 + 219 + 0 + 0 + + + 420 + 743 + 458 + 6 + 0 + + + 37 + 697 + 538 + 4 + 0 + + + 70 + 249 + 392 + 0 + 0 + + + 29 + 275 + 657 + 0 + 0 + + + 24 + 172 + 164 + 2 + 1 + + + 25 + 448 + 491 + 0 + 0 + + + 29 + 87 + 682 + 2 + 0 + + + 306 + 744 + 530 + 3 + 0 + + + 284 + 662 + 702 + 0 + 0 + + + 622 + 56 + 504 + 4 + 0 + + + 70 + 288 + 206 + 0 + 0 + + + 1041 + 64 + 441 + 0 + 0 + + + 960 + 634 + 733 + 0 + 0 + + + 70 + 88 + 322 + 0 + 0 + + + 70 + 477 + 525 + 2 + 0 + + + 284 + 664 + 700 + 0 + 0 + + + 70 + 157 + 377 + 0 + 0 + + + 70 + 194 + 305 + 0 + 0 + + + 1016 + 236 + 120 + 0 + 0 + + + 35 + 83 + 713 + 0 + 0 + + + 0 + 658 + 465 + 0 + 0 + + + 34 + 199 + 491 + 0 + 0 + + + 0 + 194 + 660 + 0 + 0 + + + 70 + 236 + 414 + 0 + 0 + + + 98 + 651 + 470 + 2 + 0 + + + 63 + 327 + 552 + 4 + 0 + + + 0 + 718 + 522 + 0 + 0 + + + 284 + 624 + 688 + 2 + 0 + + + 159 + 276 + 654 + 2 + 0 + + + 70 + 78 + 363 + 0 + 0 + + + 0 + 625 + 631 + 6 + 0 + + + 90 + 116 + 510 + 2 + 0 + + + 34 + 195 + 501 + 0 + 0 + + + 109 + 231 + 256 + 0 + 0 + + + 34 + 721 + 547 + 3 + 0 + + + 70 + 297 + 431 + 0 + 0 + + + 1039 + 64 + 442 + 0 + 0 + + + 0 + 630 + 626 + 6 + 0 + + + 70 + 186 + 318 + 0 + 0 + + + 4 + 159 + 372 + 0 + 0 + + + 3 + 282 + 640 + 0 + 0 + + + 47 + 130 + 455 + 0 + 0 + + + 284 + 639 + 672 + 0 + 0 + + + 597 + 706 + 531 + 4 + 0 + + + 4 + 71 + 400 + 0 + 0 + + + 70 + 326 + 393 + 0 + 0 + + + 284 + 652 + 713 + 0 + 0 + + + 306 + 763 + 517 + 3 + 0 + + + 1 + 302 + 598 + 2 + 0 + + + 33 + 394 + 688 + 0 + 0 + + + 36 + 208 + 470 + 0 + 0 + + + 273 + 492 + 551 + 0 + 0 + + + 37 + 52 + 546 + 7 + 0 + + + 70 + 289 + 205 + 0 + 0 + + + 284 + 626 + 686 + 2 + 0 + + + 0 + 766 + 515 + 3 + 0 + + + 668 + 702 + 485 + 1 + 0 + + + 1 + 149 + 656 + 0 + 0 + + + 1 + 454 + 674 + 1 + 1 + + + 0 + 760 + 519 + 3 + 0 + + + 204 + 692 + 570 + 2 + 0 + + + 58 + 281 + 2969 + 4 + 0 + + + 4 + 129 + 220 + 0 + 0 + + + 4 + 245 + 399 + 0 + 0 + + + 55 + 439 + 697 + 2 + 0 + + + 21 + 534 + 702 + 6 + 0 + + + 70 + 185 + 320 + 0 + 0 + + + 273 + 265 + 107 + 0 + 0 + + + 306 + 677 + 452 + 4 + 0 + + + 1 + 117 + 506 + 0 + 1 + + + 0 + 680 + 450 + 3 + 0 + + + 306 + 730 + 514 + 0 + 0 + + + 1 + 111 + 532 + 0 + 1 + + + 37 + 127 + 465 + 0 + 0 + + + 1016 + 224 + 127 + 2 + 0 + + + 38 + 87 + 327 + 0 + 0 + + + 4 + 137 + 431 + 0 + 0 + + + 286 + 660 + 757 + 6 + 0 + + + 0 + 608 + 503 + 0 + 0 + + + 1 + 58 + 491 + 1 + 0 + + + 597 + 680 + 500 + 2 + 0 + + + 38 + 113 + 252 + 0 + 0 + + + 0 + 691 + 543 + 1 + 0 + + + 1041 + 65 + 438 + 0 + 0 + + + 1009 + 217 + 131 + 2 + 0 + + + 12 + 185 + 319 + 6 + 0 + + + 70 + 260 + 227 + 0 + 0 + + + 36 + 740 + 507 + 7 + 0 + + + 70 + 148 + 192 + 0 + 0 + + + 988 + 630 + 793 + 2 + 0 + + + 1 + 606 + 651 + 3 + 0 + + + 70 + 314 + 188 + 0 + 0 + + + 1 + 52 + 547 + 0 + 0 + + + 70 + 305 + 421 + 0 + 0 + + + 0 + 537 + 467 + 0 + 0 + + + 145 + 124 + 476 + 6 + 0 + + + 34 + 59 + 482 + 1 + 0 + + + 34 + 736 + 536 + 3 + 0 + + + 293 + 436 + 504 + 6 + 0 + + + 50 + 118 + 501 + 0 + 0 + + + 34 + 53 + 538 + 7 + 0 + + + 29 + 115 + 514 + 0 + 0 + + + 284 + 657 + 707 + 0 + 0 + + + 284 + 636 + 675 + 2 + 0 + + + 38 + 213 + 134 + 0 + 0 + + + 1 + 195 + 659 + 0 + 0 + + + 194 + 370 + 678 + 4 + 0 + + + 70 + 123 + 232 + 0 + 0 + + + 36 + 495 + 687 + 6 + 0 + + + 1041 + 65 + 439 + 0 + 0 + + + 29 + 329 + 668 + 0 + 0 + + + 0 + 665 + 460 + 0 + 0 + + + 306 + 707 + 481 + 7 + 0 + + + 38 + 678 + 582 + 2 + 0 + + + 71 + 612 + 1565 + 2 + 0 + + + 47 + 129 + 458 + 4 + 0 + + + 284 + 646 + 719 + 0 + 0 + + + 70 + 185 + 154 + 0 + 0 + + + 37 + 749 + 454 + 7 + 0 + + + 205 + 613 + 499 + 0 + 0 + + + 1 + 269 + 557 + 1 + 1 + + + 1040 + 64 + 445 + 0 + 0 + + + 70 + 94 + 303 + 0 + 0 + + + 70 + 282 + 101 + 0 + 0 + + + 991 + 638 + 728 + 0 + 0 + + + 70 + 223 + 576 + 6 + 0 + + + 38 + 229 + 561 + 6 + 0 + + + 597 + 672 + 506 + 6 + 0 + + + 284 + 635 + 676 + 0 + 0 + + + 70 + 294 + 201 + 0 + 0 + + + 205 + 190 + 150 + 0 + 0 + + + 597 + 746 + 503 + 2 + 0 + + + 70 + 158 + 374 + 0 + 0 + + + 34 + 686 + 547 + 1 + 0 + + + 4 + 161 + 177 + 0 + 0 + + + 47 + 215 + 697 + 0 + 0 + + + 38 + 143 + 412 + 0 + 0 + + + 70 + 322 + 183 + 0 + 0 + + + 4 + 113 + 253 + 0 + 0 + + + 70 + 232 + 254 + 0 + 0 + + + 33 + 381 + 712 + 0 + 0 + + + 4 + 158 + 373 + 0 + 0 + + + 407 + 706 + 559 + 2 + 0 + + + 284 + 639 + 727 + 2 + 0 + + + 45 + 466 + 656 + 2 + 0 + + + 70 + 235 + 546 + 6 + 0 + + + 33 + 392 + 692 + 0 + 0 + + + 413 + 622 + 603 + 4 + 0 + + + 1 + 128 + 460 + 0 + 1 + + + 33 + 396 + 685 + 0 + 0 + + + 4 + 171 + 167 + 0 + 0 + + + 1013 + 236 + 121 + 0 + 0 + + + 34 + 677 + 554 + 1 + 0 + + + 70 + 68 + 420 + 0 + 0 + + + 70 + 207 + 138 + 0 + 0 + + + 284 + 482 + 456 + 2 + 0 + + + 273 + 267 + 107 + 0 + 0 + + + 445 + 623 + 602 + 0 + 0 + + + 70 + 153 + 385 + 0 + 0 + + + 1 + 632 + 735 + 6 + 0 + + + 70 + 274 + 215 + 0 + 0 + + + 4 + 696 + 567 + 2 + 0 + + + 1 + 277 + 651 + 0 + 1 + + + 33 + 386 + 703 + 0 + 0 + + + 37 + 613 + 612 + 6 + 0 + + + 1018 + 217 + 132 + 2 + 0 + + + 70 + 281 + 347 + 0 + 0 + + + 0 + 738 + 461 + 1 + 0 + + + 1 + 612 + 645 + 3 + 0 + + + 3 + 451 + 678 + 6 + 0 + + + 0 + 731 + 540 + 3 + 0 + + + 284 + 633 + 678 + 0 + 0 + + + 153 + 603 + 450 + 0 + 0 + + + 64 + 615 + 610 + 2 + 0 + + + 396 + 504 + 675 + 1 + 0 + + + 395 + 486 + 700 + 1 + 0 + + + 313 + 675 + 504 + 3 + 0 + + + 55 + 324 + 301 + 0 + 0 + + + 46 + 617 + 608 + 2 + 0 + + + 70 + 292 + 334 + 0 + 0 + + + 0 + 172 + 567 + 6 + 0 + + + 597 + 672 + 455 + 6 + 0 + + + 20 + 488 + 556 + 0 + 0 + + + 4 + 556 + 488 + 0 + 0 + + + 34 + 658 + 517 + 0 + 0 + + + 164 + 730 + 466 + 4 + 0 + + + 70 + 233 + 253 + 0 + 0 + + + 284 + 659 + 705 + 0 + 0 + + + 70 + 307 + 192 + 0 + 0 + + + 284 + 627 + 741 + 0 + 0 + + + 70 + 135 + 212 + 0 + 0 + + + 25 + 447 + 684 + 2 + 0 + + + 34 + 679 + 501 + 0 + 0 + + + 3 + 649 + 578 + 0 + 0 + + + 377 + 493 + 690 + 7 + 0 + + + 72 + 207 + 620 + 3 + 0 + + + 145 + 509 + 533 + 4 + 0 + + + 37 + 735 + 537 + 3 + 0 + + + 38 + 273 + 216 + 0 + 0 + + + 145 + 124 + 474 + 6 + 0 + + + 70 + 101 + 274 + 0 + 0 + + + 3 + 450 + 679 + 6 + 0 + + + 70 + 332 + 177 + 0 + 0 + + + 597 + 694 + 491 + 0 + 0 + + + 1 + 115 + 511 + 0 + 1 + + + 5 + 729 + 515 + 6 + 0 + + + 33 + 389 + 695 + 0 + 0 + + + 3 + 113 + 520 + 0 + 0 + + + 285 + 591 + 517 + 7 + 0 + + + 0 + 349 + 519 + 0 + 0 + + + 34 + 602 + 771 + 3 + 0 + + + 4 + 175 + 158 + 0 + 0 + + + 70 + 153 + 384 + 0 + 0 + + + 70 + 128 + 216 + 0 + 0 + + + 38 + 249 + 394 + 0 + 0 + + + 1 + 159 + 617 + 0 + 1 + + + 0 + 312 + 481 + 0 + 0 + + + 70 + 241 + 244 + 0 + 0 + + + 284 + 651 + 713 + 0 + 0 + + + 70 + 300 + 196 + 0 + 0 + + + 34 + 150 + 654 + 0 + 0 + + + 205 + 161 + 172 + 0 + 0 + + + 70 + 141 + 417 + 0 + 0 + + + 285 + 598 + 511 + 7 + 0 + + + 283 + 609 + 444 + 0 + 0 + + + 70 + 109 + 254 + 0 + 0 + + + 20 + 173 + 160 + 0 + 0 + + + 0 + 634 + 482 + 6 + 0 + + + 201 + 344 + 638 + 0 + 0 + + + 0 + 193 + 667 + 0 + 0 + + + 306 + 491 + 447 + 2 + 0 + + + 0 + 679 + 553 + 1 + 0 + + + 313 + 710 + 480 + 3 + 0 + + + 205 + 94 + 295 + 0 + 0 + + + 0 + 204 + 631 + 0 + 0 + + + 78 + 448 + 682 + 0 + 1 + + + 1 + 471 + 466 + 0 + 0 + + + 4 + 325 + 181 + 0 + 0 + + + 21 + 63 + 440 + 0 + 0 + + + 70 + 88 + 315 + 0 + 0 + + + 70 + 84 + 330 + 0 + 0 + + + 70 + 105 + 264 + 0 + 0 + + + 0 + 134 + 439 + 0 + 0 + + + 29 + 223 + 440 + 0 + 0 + + + 1018 + 233 + 119 + 0 + 0 + + + 68 + 106 + 555 + 1 + 0 + + + 1 + 463 + 474 + 0 + 0 + + + 0 + 314 + 478 + 0 + 0 + + + 204 + 170 + 163 + 2 + 0 + + + 70 + 292 + 336 + 0 + 0 + + + 70 + 170 + 346 + 0 + 0 + + + 1 + 615 + 642 + 3 + 0 + + + 70 + 82 + 338 + 0 + 0 + + + 284 + 667 + 696 + 2 + 0 + + + 70 + 238 + 541 + 6 + 0 + + + 38 + 52 + 534 + 0 + 0 + + + 0 + 696 + 667 + 0 + 0 + + + 11 + 113 + 521 + 0 + 0 + + + 70 + 101 + 275 + 0 + 0 + + + 72 + 208 + 619 + 3 + 0 + + + 37 + 673 + 558 + 6 + 0 + + + 153 + 601 + 450 + 0 + 0 + + + 38 + 246 + 399 + 0 + 0 + + + 1 + 619 + 750 + 1 + 1 + + + 34 + 382 + 708 + 0 + 0 + + + 284 + 626 + 687 + 2 + 0 + + + 407 + 640 + 617 + 1 + 0 + + + 70 + 133 + 209 + 0 + 0 + + + 70 + 169 + 347 + 0 + 0 + + + 70 + 171 + 343 + 0 + 0 + + + 0 + 50 + 556 + 7 + 0 + + + 70 + 172 + 341 + 0 + 0 + + + 7 + 113 + 519 + 4 + 0 + + + 402 + 508 + 671 + 2 + 0 + + + 20 + 102 + 575 + 0 + 0 + + + 1041 + 63 + 441 + 0 + 0 + + + 5 + 584 + 523 + 4 + 0 + + + 4 + 256 + 229 + 0 + 0 + + + 1018 + 217 + 128 + 2 + 0 + + + 70 + 177 + 157 + 0 + 0 + + + 285 + 552 + 490 + 4 + 0 + + + 284 + 634 + 678 + 0 + 0 + + + 38 + 254 + 506 + 0 + 0 + + + 284 + 653 + 711 + 0 + 0 + + + 20 + 214 + 459 + 0 + 0 + + + 70 + 235 + 418 + 0 + 0 + + + 273 + 265 + 105 + 0 + 0 + + + 70 + 254 + 231 + 0 + 0 + + + 284 + 669 + 694 + 2 + 0 + + + 4 + 62 + 449 + 0 + 0 + + + 15 + 124 + 1460 + 0 + 0 + + + 2 + 349 + 629 + 1 + 1 + + + 5 + 282 + 642 + 0 + 0 + + + 70 + 222 + 579 + 6 + 0 + + + 72 + 208 + 618 + 3 + 0 + + + 306 + 699 + 437 + 3 + 0 + + + 70 + 158 + 176 + 0 + 0 + + + 1 + 61 + 456 + 0 + 0 + + + 36 + 595 + 573 + 6 + 0 + + + 4 + 219 + 686 + 5 + 0 + + + 205 + 70 + 398 + 0 + 0 + + + 70 + 86 + 324 + 0 + 0 + + + 70 + 162 + 172 + 0 + 0 + + + 15 + 111 + 529 + 0 + 0 + + + 284 + 671 + 692 + 2 + 0 + + + 12 + 179 + 328 + 6 + 0 + + + 283 + 692 + 671 + 4 + 0 + + + 395 + 492 + 693 + 3 + 0 + + + 1010 + 234 + 119 + 0 + 0 + + + 1041 + 63 + 442 + 0 + 0 + + + 47 + 129 + 455 + 4 + 0 + + + 70 + 227 + 433 + 4 + 0 + + + 70 + 220 + 267 + 0 + 0 + + + 70 + 180 + 155 + 0 + 0 + + + 412 + 623 + 634 + 4 + 0 + + + 597 + 707 + 531 + 4 + 0 + + + 0 + 633 + 624 + 6 + 0 + + + 398 + 629 + 793 + 5 + 0 + + + 70 + 77 + 362 + 0 + 0 + + + 284 + 624 + 689 + 2 + 0 + + + 960 + 637 + 729 + 0 + 0 + + + 284 + 636 + 676 + 0 + 0 + + + 334 + 263 + 106 + 0 + 0 + + + 0 + 135 + 435 + 0 + 0 + + + 4 + 145 + 405 + 0 + 0 + + + 70 + 261 + 225 + 0 + 0 + + + 0 + 621 + 492 + 0 + 0 + + + 19 + 524 + 477 + 4 + 0 + + + 70 + 82 + 340 + 0 + 0 + + + 193 + 368 + 680 + 0 + 0 + + + 12 + 180 + 325 + 6 + 0 + + + 70 + 103 + 271 + 0 + 0 + + + 7 + 650 + 578 + 2 + 0 + + + 38 + 699 + 714 + 2 + 0 + + + 0 + 751 + 526 + 3 + 0 + + + 34 + 51 + 547 + 7 + 0 + + + 284 + 658 + 705 + 0 + 0 + + + 3 + 111 + 527 + 0 + 0 + + + 1 + 604 + 654 + 2 + 0 + + + 194 + 760 + 448 + 0 + 0 + + + 183 + 357 + 701 + 0 + 0 + + + 70 + 105 + 266 + 0 + 0 + + + 391 + 628 + 629 + 0 + 0 + + + 70 + 80 + 349 + 0 + 0 + + + 45 + 600 + 451 + 2 + 0 + + + 70 + 247 + 396 + 0 + 0 + + + 938 + 710 + 703 + 4 + 0 + + + 183 + 354 + 707 + 0 + 0 + + + 209 + 653 + 605 + 5 + 0 + + + 285 + 503 + 677 + 1 + 0 + + + 5 + 113 + 518 + 2 + 0 + + + 34 + 352 + 711 + 0 + 0 + + + 110 + 226 + 259 + 4 + 0 + + + 313 + 723 + 471 + 3 + 0 + + + 396 + 506 + 673 + 1 + 0 + + + 145 + 124 + 472 + 6 + 0 + + + 139 + 441 + 497 + 6 + 0 + + + 284 + 639 + 726 + 2 + 0 + + + 70 + 118 + 237 + 0 + 0 + + + 1011 + 235 + 119 + 0 + 0 + + + 51 + 712 + 701 + 4 + 0 + + + 6 + 203 + 482 + 4 + 0 + + + 33 + 464 + 658 + 0 + 0 + + + 6 + 618 + 551 + 6 + 0 + + + 20 + 165 + 593 + 0 + 0 + + + 285 + 594 + 514 + 7 + 0 + + + 1 + 121 + 484 + 6 + 0 + + + 206 + 323 + 303 + 0 + 0 + + + 70 + 334 + 293 + 0 + 0 + + + 21 + 64 + 437 + 0 + 0 + + + 286 + 522 + 585 + 0 + 0 + + + 37 + 613 + 613 + 4 + 0 + + + 70 + 126 + 222 + 0 + 0 + + + 38 + 258 + 227 + 0 + 0 + + + 72 + 208 + 620 + 3 + 0 + + + 205 + 71 + 394 + 0 + 0 + + + 34 + 695 + 490 + 0 + 0 + + + 1009 + 217 + 129 + 2 + 0 + + + 307 + 543 + 461 + 0 + 0 + + + 205 + 485 + 452 + 0 + 0 + + + 70 + 106 + 264 + 0 + 0 + + + 284 + 632 + 680 + 2 + 0 + + + 4 + 90 + 311 + 0 + 0 + + + 205 + 69 + 406 + 0 + 0 + + + 0 + 258 + 500 + 0 + 0 + + + 0 + 215 + 600 + 0 + 0 + + + 34 + 725 + 545 + 3 + 0 + + + 0 + 611 + 817 + 0 + 0 + + + 70 + 100 + 280 + 0 + 0 + + + 139 + 219 + 447 + 2 + 0 + + + 34 + 51 + 549 + 7 + 0 + + + 70 + 166 + 353 + 0 + 0 + + + 0 + 62 + 452 + 0 + 0 + + + 489 + 661 + 462 + 1 + 0 + + + 283 + 52 + 539 + 0 + 0 + + + 38 + 143 + 196 + 0 + 0 + + + 70 + 77 + 364 + 0 + 0 + + + 12 + 182 + 322 + 6 + 0 + + + 189 + 278 + 651 + 6 + 0 + + + 665 + 486 + 557 + 0 + 0 + + + 70 + 232 + 422 + 0 + 0 + + + 0 + 60 + 467 + 0 + 0 + + + 284 + 661 + 702 + 0 + 0 + + + 38 + 282 + 207 + 0 + 0 + + + 70 + 240 + 408 + 0 + 0 + + + 0 + 196 + 657 + 0 + 0 + + + 70 + 73 + 384 + 0 + 0 + + + 273 + 267 + 105 + 0 + 0 + + + 1041 + 63 + 445 + 0 + 0 + + + 70 + 304 + 192 + 0 + 0 + + + 286 + 603 + 449 + 0 + 0 + + + 205 + 246 + 114 + 0 + 0 + + + 13 + 183 + 319 + 6 + 0 + + + 395 + 488 + 698 + 1 + 0 + + + 3 + 588 + 519 + 0 + 0 + + + 45 + 535 + 702 + 2 + 0 + + + 206 + 172 + 163 + 6 + 0 + + + 7 + 111 + 526 + 4 + 0 + + + 0 + 316 + 476 + 0 + 0 + + + 4 + 92 + 305 + 0 + 0 + + + 0 + 614 + 497 + 0 + 0 + + + 285 + 596 + 512 + 7 + 0 + + + 0 + 598 + 776 + 3 + 0 + + + 98 + 648 + 471 + 2 + 0 + + + 100 + 560 + 545 + 4 + 0 + + + 55 + 163 + 601 + 0 + 0 + + + 598 + 487 + 556 + 0 + 0 + + + 597 + 752 + 453 + 2 + 0 + + + 20 + 174 + 563 + 4 + 0 + + + 70 + 88 + 319 + 0 + 0 + + + 0 + 194 + 664 + 3 + 0 + + + 284 + 649 + 715 + 0 + 0 + + + 205 + 208 + 135 + 0 + 0 + + + 70 + 331 + 296 + 0 + 0 + + + 283 + 482 + 455 + 4 + 0 + + + 38 + 262 + 223 + 0 + 0 + + + 21 + 369 + 678 + 2 + 0 + + + 1 + 294 + 615 + 2 + 0 + + + 285 + 510 + 531 + 0 + 0 + + + 1041 + 63 + 446 + 0 + 0 + + + 1 + 51 + 551 + 0 + 0 + + + 1 + 563 + 702 + 1 + 1 + + + 284 + 630 + 682 + 2 + 0 + + + 4 + 253 + 231 + 0 + 0 + + + 45 + 466 + 655 + 2 + 0 + + + 23 + 202 + 485 + 0 + 1 + + + 51 + 717 + 696 + 6 + 0 + + + 695 + 510 + 668 + 2 + 0 + + + 597 + 680 + 501 + 2 + 0 + + + 38 + 98 + 287 + 0 + 0 + + + 37 + 126 + 464 + 0 + 0 + + + 419 + 686 + 445 + 0 + 0 + + + 38 + 272 + 215 + 0 + 0 + + + 284 + 663 + 700 + 0 + 0 + + + 597 + 672 + 507 + 6 + 0 + + + 70 + 114 + 247 + 0 + 0 + + + 37 + 51 + 552 + 7 + 0 + + + 217 + 102 + 276 + 5 + 0 + + + 1 + 52 + 524 + 1 + 0 + + + 183 + 360 + 699 + 0 + 0 + + + 46 + 712 + 700 + 0 + 0 + + + 4 + 104 + 262 + 0 + 0 + + + 112 + 586 + 524 + 0 + 1 + + + 1 + 58 + 470 + 1 + 0 + + + 70 + 184 + 148 + 0 + 0 + + + 34 + 194 + 498 + 0 + 0 + + + 273 + 267 + 102 + 0 + 0 + + + 37 + 191 + 666 + 0 + 0 + + + 205 + 547 + 460 + 0 + 0 + + + 597 + 680 + 502 + 2 + 0 + + + 618 + 88 + 663 + 5 + 0 + + + 402 + 518 + 659 + 2 + 0 + + + 313 + 742 + 460 + 3 + 0 + + + 70 + 270 + 216 + 0 + 0 + + + 206 + 168 + 162 + 3 + 0 + + + 70 + 108 + 252 + 0 + 0 + + + 70 + 87 + 313 + 0 + 0 + + + 215 + 99 + 275 + 6 + 0 + + + 38 + 230 + 420 + 0 + 0 + + + 306 + 749 + 502 + 3 + 0 + + + 34 + 139 + 695 + 0 + 0 + + + 70 + 621 + 690 + 4 + 0 + + + 284 + 632 + 678 + 0 + 0 + + + 925 + 713 + 699 + 0 + 0 + + + 70 + 68 + 400 + 0 + 0 + + + 1 + 615 + 754 + 0 + 1 + + + 70 + 148 + 394 + 0 + 0 + + + 70 + 174 + 335 + 0 + 0 + + + 46 + 716 + 696 + 0 + 0 + + + 0 + 684 + 449 + 3 + 0 + + + 70 + 153 + 381 + 0 + 0 + + + 100 + 53 + 513 + 1 + 0 + + + 0 + 720 + 474 + 7 + 0 + + + 70 + 147 + 185 + 0 + 0 + + + 284 + 671 + 691 + 2 + 0 + + + 70 + 261 + 370 + 0 + 0 + + + 597 + 672 + 457 + 6 + 0 + + + 70 + 220 + 265 + 0 + 0 + + + 33 + 389 + 699 + 0 + 0 + + + 1 + 195 + 652 + 0 + 0 + + + 5 + 289 + 521 + 4 + 0 + + + 48 + 451 + 681 + 2 + 0 + + + 70 + 167 + 349 + 0 + 0 + + + 1 + 124 + 470 + 1 + 1 + + + 70 + 77 + 353 + 0 + 0 + + + 597 + 746 + 504 + 2 + 0 + + + 283 + 51 + 533 + 0 + 0 + + + 1 + 565 + 604 + 0 + 1 + + + 284 + 669 + 693 + 2 + 0 + + + 34 + 186 + 519 + 0 + 0 + + + 306 + 693 + 669 + 4 + 0 + + + 1039 + 62 + 438 + 0 + 0 + + + 313 + 750 + 455 + 3 + 0 + + + 283 + 599 + 774 + 0 + 0 + + + 21 + 534 + 704 + 4 + 0 + + + 72 + 206 + 617 + 7 + 0 + + + 72 + 207 + 614 + 7 + 0 + + + 70 + 83 + 327 + 0 + 0 + + + 205 + 277 + 98 + 0 + 0 + + + 70 + 225 + 429 + 0 + 0 + + + 46 + 530 + 513 + 0 + 0 + + + 205 + 334 + 289 + 0 + 0 + + + 34 + 636 + 729 + 0 + 0 + + + 597 + 708 + 531 + 4 + 0 + + + 106 + 233 + 250 + 4 + 0 + + + 70 + 166 + 165 + 0 + 0 + + + 205 + 83 + 330 + 0 + 0 + + + 72 + 205 + 620 + 3 + 0 + + + 4 + 141 + 413 + 0 + 0 + + + 3 + 616 + 753 + 0 + 0 + + + 4 + 681 + 552 + 1 + 0 + + + 575 + 690 + 445 + 0 + 0 + + + 285 + 626 + 741 + 0 + 0 + + + 1012 + 230 + 119 + 0 + 0 + + + 284 + 630 + 680 + 2 + 0 + + + 70 + 297 + 196 + 0 + 0 + + + 668 + 704 + 485 + 1 + 0 + + + 0 + 197 + 645 + 0 + 0 + + + 0 + 656 + 468 + 0 + 0 + + + 1 + 613 + 557 + 6 + 0 + + + 394 + 515 + 663 + 1 + 0 + + + 70 + 86 + 318 + 0 + 0 + + + 273 + 492 + 553 + 0 + 0 + + + 70 + 121 + 226 + 0 + 0 + + + 1012 + 217 + 126 + 2 + 0 + + + 70 + 68 + 402 + 0 + 0 + + + 11 + 438 + 701 + 0 + 0 + + + 34 + 700 + 537 + 2 + 0 + + + 1041 + 61 + 448 + 0 + 0 + + + 70 + 244 + 112 + 0 + 0 + + + 59 + 158 + 612 + 6 + 0 + + + 70 + 89 + 307 + 0 + 0 + + + 70 + 198 + 138 + 0 + 0 + + + 597 + 752 + 454 + 2 + 0 + + + 55 + 332 + 666 + 0 + 0 + + + 70 + 293 + 330 + 0 + 0 + + + 37 + 739 + 462 + 1 + 0 + + + 0 + 758 + 519 + 3 + 0 + + + 70 + 301 + 422 + 0 + 0 + + + 284 + 656 + 707 + 0 + 0 + + + 34 + 196 + 648 + 6 + 0 + + + 0 + 60 + 455 + 0 + 0 + + + 3 + 330 + 670 + 0 + 0 + + + 284 + 645 + 719 + 0 + 0 + + + 597 + 672 + 508 + 6 + 0 + + + 284 + 628 + 682 + 2 + 0 + + + 26 + 219 + 688 + 0 + 0 + + + 4 + 124 + 220 + 0 + 0 + + + 306 + 747 + 457 + 7 + 0 + + + 37 + 554 + 491 + 4 + 0 + + + 205 + 267 + 362 + 0 + 0 + + + 143 + 664 + 566 + 0 + 0 + + + 21 + 61 + 447 + 0 + 0 + + + 205 + 205 + 133 + 0 + 0 + + + 214 + 97 + 281 + 7 + 0 + + + 0 + 182 + 531 + 4 + 0 + + + 70 + 228 + 559 + 6 + 0 + + + 4 + 87 + 316 + 0 + 0 + + + 1 + 121 + 480 + 6 + 0 + + + 54 + 218 + 442 + 0 + 0 + + + 34 + 132 + 440 + 0 + 0 + + + 151 + 605 + 450 + 0 + 0 + + + 38 + 77 + 357 + 0 + 0 + + + 1 + 51 + 539 + 0 + 0 + + + 1009 + 231 + 119 + 0 + 0 + + + 0 + 696 + 441 + 3 + 0 + + + 0 + 257 + 496 + 0 + 0 + + + 70 + 138 + 421 + 0 + 0 + + + 0 + 614 + 641 + 3 + 0 + + + 72 + 553 + 555 + 3 + 0 + + + 3 + 452 + 679 + 6 + 0 + + + 5 + 218 + 692 + 0 + 0 + + + 286 + 609 + 447 + 0 + 0 + + + 3 + 450 + 682 + 6 + 0 + + + 70 + 64 + 429 + 0 + 0 + + + 214 + 97 + 283 + 6 + 0 + + + 1106 + 536 + 702 + 0 + 0 + + + 70 + 134 + 205 + 0 + 0 + + + 284 + 650 + 713 + 0 + 0 + + + 38 + 725 + 519 + 2 + 0 + + + 70 + 328 + 177 + 0 + 0 + + + 35 + 82 + 708 + 0 + 0 + + + 70 + 121 + 227 + 0 + 0 + + + 34 + 661 + 516 + 0 + 0 + + + 36 + 351 + 517 + 0 + 0 + + + 1039 + 63 + 436 + 4 + 0 + + + 70 + 175 + 157 + 0 + 0 + + + 284 + 482 + 458 + 2 + 0 + + + 34 + 205 + 470 + 0 + 0 + + + 7 + 122 + 476 + 0 + 0 + + + 45 + 199 + 640 + 1 + 1 + + + 0 + 735 + 464 + 1 + 0 + + + 70 + 76 + 361 + 0 + 0 + + + 4 + 248 + 234 + 0 + 0 + + + 70 + 156 + 372 + 0 + 0 + + + 70 + 80 + 343 + 0 + 0 + + + 5 + 277 + 655 + 0 + 0 + + + 284 + 662 + 700 + 0 + 0 + + + 70 + 183 + 150 + 0 + 0 + + + 70 + 242 + 398 + 0 + 0 + + + 694 + 509 + 670 + 1 + 0 + + + 4 + 74 + 371 + 0 + 0 + + + 1 + 263 + 104 + 1 + 1 + + + 70 + 153 + 379 + 0 + 0 + + + 0 + 726 + 542 + 3 + 0 + + + 307 + 545 + 462 + 0 + 0 + + + 284 + 626 + 684 + 2 + 0 + + + 213 + 179 + 324 + 0 + 0 + + + 306 + 684 + 550 + 1 + 0 + + + 394 + 500 + 682 + 3 + 0 + + + 306 + 339 + 651 + 0 + 0 + + + 70 + 313 + 407 + 0 + 0 + + + 70 + 172 + 337 + 0 + 0 + + + 0 + 470 + 470 + 0 + 0 + + + 597 + 695 + 491 + 0 + 0 + + + 145 + 511 + 533 + 4 + 0 + + + 70 + 141 + 196 + 0 + 0 + + + 70 + 283 + 341 + 0 + 0 + + + 3 + 275 + 549 + 2 + 0 + + + 194 + 368 + 684 + 4 + 0 + + + 72 + 207 + 615 + 3 + 0 + + + 306 + 694 + 542 + 1 + 0 + + + 72 + 206 + 618 + 3 + 0 + + + 50 + 560 + 703 + 0 + 0 + + + 70 + 114 + 242 + 0 + 0 + + + 284 + 652 + 711 + 0 + 0 + + + 70 + 331 + 175 + 0 + 0 + + + 21 + 62 + 445 + 0 + 0 + + + 1 + 286 + 634 + 0 + 0 + + + 284 + 667 + 695 + 2 + 0 + + + 70 + 141 + 411 + 0 + 0 + + + 1 + 564 + 698 + 0 + 1 + + + 4 + 136 + 203 + 0 + 0 + + + 1012 + 232 + 119 + 0 + 0 + + + 205 + 333 + 174 + 0 + 0 + + + 70 + 107 + 258 + 0 + 0 + + + 70 + 200 + 138 + 0 + 0 + + + 205 + 92 + 300 + 0 + 0 + + + 205 + 74 + 373 + 0 + 0 + + + 38 + 136 + 426 + 0 + 0 + + + 33 + 486 + 702 + 0 + 0 + + + 0 + 729 + 468 + 1 + 0 + + + 1010 + 217 + 127 + 2 + 0 + + + 0 + 635 + 730 + 0 + 0 + + + 1 + 131 + 442 + 0 + 0 + + + 183 + 357 + 705 + 0 + 0 + + + 4 + 96 + 287 + 0 + 0 + + + 1 + 584 + 733 + 1 + 0 + + + 145 + 508 + 536 + 6 + 0 + + + 0 + 654 + 469 + 0 + 0 + + + 13 + 185 + 313 + 2 + 0 + + + 284 + 637 + 672 + 0 + 0 + + + 45 + 535 + 703 + 2 + 0 + + + 284 + 624 + 686 + 2 + 0 + + + 205 + 93 + 296 + 0 + 0 + + + 54 + 314 + 307 + 0 + 0 + + + 21 + 63 + 437 + 0 + 0 + + + 32 + 464 + 661 + 0 + 0 + + + 272 + 616 + 639 + 0 + 0 + + + 70 + 64 + 430 + 0 + 0 + + + 70 + 224 + 568 + 6 + 0 + + + 70 + 75 + 367 + 0 + 0 + + + 70 + 267 + 361 + 0 + 0 + + + 1 + 201 + 633 + 0 + 0 + + + 110 + 226 + 256 + 4 + 0 + + + 385 + 538 + 699 + 4 + 0 + + + 1 + 206 + 468 + 0 + 0 + + + 50 + 116 + 499 + 0 + 0 + + + 4 + 334 + 381 + 0 + 0 + + + 283 + 51 + 540 + 0 + 0 + + + 4 + 182 + 318 + 0 + 0 + + + 70 + 297 + 430 + 0 + 0 + + + 70 + 295 + 196 + 0 + 0 + + + 70 + 196 + 295 + 0 + 0 + + + 1041 + 61 + 438 + 0 + 0 + + + 284 + 657 + 705 + 0 + 0 + + + 0 + 617 + 497 + 0 + 0 + + + 70 + 64 + 417 + 0 + 0 + + + 38 + 139 + 192 + 0 + 0 + + + 1 + 257 + 588 + 0 + 0 + + + 0 + 192 + 665 + 2 + 0 + + + 108 + 224 + 258 + 4 + 0 + + + 1 + 266 + 100 + 0 + 1 + + + 25 + 447 + 686 + 2 + 0 + + + 205 + 129 + 207 + 0 + 0 + + + 86 + 226 + 565 + 0 + 0 + + + 4 + 150 + 178 + 0 + 0 + + + 1039 + 60 + 445 + 0 + 0 + + + 653 + 681 + 502 + 4 + 0 + + + 1013 + 221 + 121 + 2 + 0 + + + 205 + 325 + 178 + 0 + 0 + + + 70 + 86 + 311 + 0 + 0 + + + 34 + 149 + 652 + 0 + 0 + + + 1 + 163 + 596 + 0 + 0 + + + 0 + 518 + 592 + 0 + 0 + + + 192 + 758 + 451 + 0 + 0 + + + 284 + 630 + 681 + 2 + 0 + + + 1011 + 219 + 122 + 2 + 0 + + + 70 + 257 + 225 + 0 + 0 + + + 1 + 283 + 644 + 0 + 0 + + + 1 + 185 + 525 + 0 + 0 + + + 0 + 195 + 655 + 0 + 0 + + + 34 + 663 + 751 + 0 + 0 + + + 7 + 122 + 474 + 4 + 0 + + + 668 + 702 + 487 + 1 + 0 + + + 313 + 705 + 435 + 3 + 0 + + + 20 + 270 + 99 + 2 + 0 + + + 72 + 206 + 620 + 3 + 0 + + + 72 + 207 + 617 + 3 + 0 + + + 1 + 201 + 635 + 0 + 0 + + + 13 + 181 + 319 + 6 + 0 + + + 1013 + 222 + 120 + 2 + 0 + + + 15 + 461 + 665 + 2 + 0 + + + 70 + 130 + 205 + 0 + 0 + + + 284 + 625 + 741 + 0 + 0 + + + 285 + 593 + 517 + 7 + 0 + + + 205 + 328 + 176 + 0 + 0 + + + 407 + 664 + 646 + 6 + 0 + + + 70 + 310 + 313 + 0 + 0 + + + 70 + 71 + 375 + 0 + 0 + + + 1 + 108 + 535 + 1 + 1 + + + 38 + 167 + 346 + 0 + 0 + + + 70 + 259 + 103 + 0 + 0 + + + 286 + 567 + 664 + 0 + 0 + + + 597 + 709 + 531 + 4 + 0 + + + 1 + 124 + 466 + 1 + 1 + + + 215 + 97 + 275 + 5 + 0 + + + 205 + 116 + 230 + 0 + 0 + + + 205 + 248 + 233 + 0 + 0 + + + 12 + 187 + 309 + 2 + 0 + + + 38 + 119 + 224 + 0 + 0 + + + 70 + 136 + 196 + 0 + 0 + + + 1012 + 224 + 119 + 0 + 0 + + + 25 + 449 + 491 + 0 + 0 + + + 164 + 87 + 664 + 5 + 0 + + + 0 + 612 + 501 + 0 + 0 + + + 111 + 232 + 249 + 0 + 0 + + + 1013 + 220 + 122 + 2 + 0 + + + 102 + 228 + 253 + 4 + 0 + + + 1 + 300 + 607 + 2 + 0 + + + 25 + 217 + 697 + 4 + 0 + + + 70 + 227 + 562 + 6 + 0 + + + 34 + 704 + 707 + 2 + 0 + + + 283 + 706 + 705 + 0 + 0 + + + 183 + 357 + 703 + 0 + 0 + + + 98 + 648 + 473 + 2 + 0 + + + 462 + 662 + 463 + 0 + 0 + + + 4 + 63 + 426 + 0 + 0 + + + 70 + 223 + 436 + 4 + 0 + + + 284 + 648 + 715 + 0 + 0 + + + 284 + 660 + 702 + 0 + 0 + + + 1 + 305 + 597 + 2 + 0 + + + 1 + 607 + 649 + 3 + 0 + + + 70 + 223 + 572 + 6 + 0 + + + 2 + 349 + 632 + 1 + 1 + + + 1016 + 218 + 123 + 2 + 0 + + + 22 + 278 + 655 + 0 + 0 + + + 0 + 133 + 434 + 0 + 0 + + + 216 + 97 + 277 + 5 + 0 + + + 37 + 499 + 503 + 0 + 0 + + + 0 + 607 + 505 + 0 + 0 + + + 0 + 503 + 499 + 4 + 0 + + + 290 + 557 + 614 + 0 + 0 + + + 4 + 169 + 159 + 0 + 0 + + + 70 + 245 + 397 + 0 + 0 + + + 284 + 628 + 683 + 2 + 0 + + + 26 + 627 + 739 + 0 + 0 + + + 1 + 285 + 639 + 0 + 0 + + + 47 + 126 + 458 + 0 + 0 + + + 34 + 191 + 668 + 1 + 0 + + + 72 + 207 + 616 + 3 + 0 + + + 597 + 672 + 456 + 6 + 0 + + + 70 + 308 + 414 + 0 + 0 + + + 70 + 170 + 339 + 0 + 0 + + + 284 + 626 + 685 + 2 + 0 + + + 23 + 735 + 512 + 6 + 0 + + + 8 + 61 + 439 + 0 + 0 + + + 15 + 157 + 619 + 0 + 0 + + + 4 + 75 + 357 + 0 + 0 + + + 1009 + 225 + 119 + 0 + 0 + + + 70 + 69 + 388 + 0 + 0 + + + 209 + 651 + 605 + 6 + 0 + + + 70 + 194 + 297 + 0 + 0 + + + 70 + 198 + 291 + 0 + 0 + + + 70 + 299 + 325 + 0 + 0 + + + 38 + 254 + 502 + 0 + 0 + + + 37 + 729 + 469 + 1 + 0 + + + 70 + 233 + 417 + 0 + 0 + + + 34 + 675 + 454 + 3 + 0 + + + 70 + 173 + 333 + 0 + 0 + + + 1039 + 60 + 446 + 0 + 0 + + + 3 + 452 + 678 + 6 + 0 + + + 70 + 180 + 320 + 0 + 0 + + + 70 + 166 + 347 + 0 + 0 + + + 1 + 119 + 484 + 6 + 0 + + + 70 + 88 + 304 + 0 + 0 + + + 70 + 152 + 176 + 0 + 0 + + + 284 + 639 + 725 + 2 + 0 + + + 55 + 324 + 300 + 0 + 0 + + + 0 + 721 + 522 + 0 + 0 + + + 70 + 284 + 203 + 0 + 0 + + + 404 + 634 + 785 + 6 + 0 + + + 34 + 50 + 536 + 0 + 0 + + + 70 + 116 + 231 + 0 + 0 + + + 13 + 179 + 322 + 6 + 0 + + + 15 + 288 + 525 + 4 + 0 + + + 205 + 488 + 452 + 0 + 0 + + + 72 + 206 + 619 + 7 + 0 + + + 396 + 492 + 695 + 5 + 0 + + + 183 + 360 + 697 + 0 + 0 + + + 25 + 614 + 613 + 0 + 0 + + + 70 + 267 + 364 + 0 + 0 + + + 20 + 137 + 420 + 0 + 0 + + + 70 + 207 + 278 + 0 + 0 + + + 70 + 138 + 417 + 0 + 0 + + + 34 + 352 + 714 + 0 + 0 + + + 34 + 380 + 715 + 0 + 0 + + + 70 + 80 + 337 + 0 + 0 + + + 21 + 61 + 442 + 0 + 0 + + + 38 + 318 + 181 + 0 + 0 + + + 36 + 344 + 529 + 0 + 0 + + + 284 + 638 + 672 + 0 + 0 + + + 205 + 194 + 139 + 0 + 0 + + + 1009 + 221 + 122 + 4 + 0 + + + 37 + 674 + 559 + 6 + 0 + + + 103 + 234 + 246 + 0 + 0 + + + 205 + 82 + 329 + 0 + 0 + + + 285 + 602 + 509 + 7 + 0 + + + 70 + 202 + 285 + 0 + 0 + + + 3 + 157 + 617 + 2 + 0 + + + 38 + 191 + 670 + 0 + 0 + + + 0 + 162 + 598 + 0 + 0 + + + 34 + 138 + 702 + 0 + 0 + + + 34 + 691 + 670 + 0 + 0 + + + 960 + 629 + 736 + 0 + 0 + + + 7 + 122 + 472 + 0 + 0 + + + 34 + 212 + 457 + 0 + 0 + + + 38 + 56 + 482 + 1 + 0 + + + 0 + 639 + 671 + 0 + 0 + + + 70 + 203 + 133 + 0 + 0 + + + 284 + 669 + 692 + 2 + 0 + + + 1106 + 536 + 703 + 0 + 0 + + + 100 + 559 + 705 + 0 + 0 + + + 70 + 174 + 331 + 0 + 0 + + + 7 + 121 + 476 + 0 + 0 + + + 0 + 619 + 495 + 0 + 0 + + + 284 + 482 + 457 + 2 + 0 + + + 284 + 624 + 687 + 2 + 0 + + + 70 + 120 + 224 + 0 + 0 + + + 70 + 112 + 240 + 0 + 0 + + + 597 + 746 + 505 + 2 + 0 + + + 0 + 629 + 487 + 6 + 0 + + + 70 + 166 + 162 + 0 + 0 + + + 34 + 680 + 554 + 1 + 0 + + + 70 + 119 + 226 + 0 + 0 + + + 1012 + 226 + 119 + 0 + 0 + + + 70 + 100 + 269 + 0 + 0 + + + 0 + 312 + 485 + 0 + 0 + + + 34 + 722 + 473 + 7 + 0 + + + 284 + 651 + 711 + 0 + 0 + + + 70 + 296 + 327 + 0 + 0 + + + 1011 + 217 + 124 + 2 + 0 + + + 0 + 667 + 512 + 6 + 0 + + + 1 + 59 + 456 + 0 + 0 + + + 36 + 743 + 507 + 7 + 0 + + + 47 + 631 + 597 + 4 + 0 + + + 24 + 168 + 160 + 2 + 1 + + + 284 + 667 + 694 + 2 + 0 + + + 306 + 694 + 667 + 4 + 0 + + + 268 + 444 + 690 + 0 + 0 + + + 70 + 116 + 232 + 0 + 0 + + + 72 + 552 + 555 + 3 + 0 + + + 313 + 675 + 506 + 3 + 0 + + + 1 + 350 + 718 + 0 + 0 + + + 70 + 319 + 401 + 0 + 0 + + + 15 + 557 + 550 + 4 + 0 + + + 215 + 99 + 272 + 6 + 0 + + + 12 + 177 + 325 + 0 + 0 + + + 0 + 671 + 509 + 6 + 0 + + + 286 + 506 + 675 + 1 + 0 + + + 0 + 609 + 647 + 3 + 0 + + + 72 + 207 + 618 + 3 + 0 + + + 34 + 60 + 449 + 0 + 0 + + + 1013 + 219 + 123 + 2 + 0 + + + 0 + 314 + 482 + 0 + 0 + + + 0 + 59 + 459 + 0 + 0 + + + 377 + 657 + 758 + 2 + 0 + + + 51 + 215 + 2582 + 0 + 0 + + + 51 + 591 + 667 + 4 + 0 + + + 70 + 183 + 148 + 0 + 0 + + + 55 + 694 + 568 + 5 + 0 + + + 0 + 303 + 500 + 0 + 0 + + + 70 + 282 + 96 + 0 + 0 + + + 70 + 299 + 192 + 0 + 0 + + + 45 + 535 + 704 + 4 + 0 + + + 1 + 50 + 542 + 0 + 0 + + + 1 + 462 + 477 + 0 + 0 + + + 25 + 447 + 493 + 2 + 0 + + + 445 + 669 + 563 + 6 + 0 + + + 334 + 263 + 103 + 0 + 0 + + + 280 + 277 + 547 + 0 + 0 + + + 1039 + 62 + 437 + 0 + 0 + + + 37 + 275 + 551 + 2 + 0 + + + 0 + 317 + 478 + 0 + 0 + + + 63 + 217 + 447 + 2 + 0 + + + 100 + 637 + 727 + 2 + 0 + + + 70 + 149 + 182 + 0 + 0 + + + 284 + 636 + 674 + 2 + 0 + + + 205 + 88 + 308 + 0 + 0 + + + 0 + 337 + 654 + 0 + 0 + + + 1010 + 217 + 125 + 6 + 0 + + + 1 + 346 + 637 + 0 + 1 + + + 284 + 655 + 707 + 0 + 0 + + + 1027 + 228 + 119 + 0 + 0 + + + 70 + 168 + 342 + 0 + 0 + + + 5 + 276 + 659 + 0 + 0 + + + 59 + 158 + 614 + 2 + 0 + + + 34 + 197 + 649 + 6 + 0 + + + 0 + 517 + 486 + 0 + 0 + + + 205 + 125 + 217 + 0 + 0 + + + 7 + 121 + 474 + 4 + 0 + + + 1 + 284 + 640 + 0 + 0 + + + 407 + 229 + 118 + 0 + 0 + + + 0 + 214 + 597 + 0 + 0 + + + 661 + 703 + 486 + 0 + 0 + + + 0 + 256 + 499 + 0 + 0 + + + 394 + 513 + 666 + 1 + 0 + + + 0 + 646 + 474 + 2 + 0 + + + 284 + 671 + 690 + 2 + 0 + + + 7 + 122 + 470 + 4 + 0 + + + 34 + 150 + 646 + 0 + 0 + + + 1 + 103 + 557 + 4 + 0 + + + 0 + 193 + 662 + 2 + 0 + + + 7 + 289 + 524 + 6 + 0 + + + 1039 + 62 + 436 + 0 + 0 + + + 1013 + 218 + 124 + 2 + 0 + + + 273 + 265 + 102 + 0 + 0 + + + 0 + 199 + 487 + 0 + 0 + + + 32 + 86 + 667 + 0 + 0 + + + 0 + 252 + 507 + 0 + 0 + + + 4 + 91 + 297 + 0 + 0 + + + 284 + 644 + 719 + 0 + 0 + + + 306 + 599 + 773 + 6 + 0 + + + 204 + 321 + 302 + 0 + 0 + + + 1 + 151 + 642 + 0 + 0 + + + 15 + 169 + 160 + 4 + 0 + + + 0 + 306 + 495 + 0 + 0 + + + 3 + 451 + 679 + 6 + 0 + + + 1 + 302 + 602 + 2 + 0 + + + 1 + 131 + 438 + 0 + 0 + + + 153 + 604 + 450 + 0 + 0 + + + 284 + 634 + 676 + 0 + 0 + + + 36 + 737 + 511 + 7 + 0 + + + 38 + 68 + 398 + 0 + 0 + + + 1029 + 624 + 742 + 4 + 0 + + + 398 + 614 + 811 + 2 + 0 + + + 4 + 164 + 165 + 0 + 0 + + + 1 + 351 + 518 + 0 + 0 + + + 4 + 83 + 326 + 0 + 0 + + + 38 + 89 + 304 + 0 + 0 + + + 41 + 508 + 535 + 4 + 0 + + + 70 + 297 + 219 + 0 + 0 + + + 3 + 290 + 524 + 4 + 0 + + + 37 + 637 + 726 + 2 + 0 + + + 284 + 645 + 717 + 0 + 0 + + + 70 + 222 + 293 + 0 + 0 + + + 34 + 163 + 560 + 0 + 0 + + + 0 + 170 + 537 + 4 + 0 + + + 4 + 172 + 178 + 0 + 0 + + + 70 + 113 + 271 + 0 + 0 + + + 1 + 619 + 596 + 1 + 1 + + + 1018 + 239 + 128 + 2 + 0 + + + 284 + 634 + 680 + 2 + 0 + + + 70 + 136 + 225 + 0 + 0 + + + 1 + 133 + 489 + 0 + 0 + + + 143 + 327 + 199 + 2 + 0 + + + 70 + 187 + 348 + 0 + 0 + + + 102 + 559 + 717 + 0 + 0 + + + 283 + 715 + 690 + 0 + 0 + + + 70 + 199 + 154 + 0 + 0 + + + 652 + 683 + 495 + 0 + 0 + + + 70 + 194 + 158 + 0 + 0 + + + 4 + 96 + 319 + 0 + 0 + + + 60 + 338 + 632 + 1 + 1 + + + 70 + 289 + 106 + 1 + 0 + + + 0 + 251 + 503 + 0 + 0 + + + 0 + 618 + 498 + 0 + 0 + + + 209 + 71 + 432 + 6 + 0 + + + 284 + 657 + 704 + 2 + 0 + + + 34 + 593 + 832 + 0 + 0 + + + 0 + 194 + 651 + 0 + 0 + + + 1 + 61 + 503 + 1 + 0 + + + 597 + 672 + 458 + 6 + 0 + + + 70 + 217 + 582 + 6 + 0 + + + 707 + 295 + 104 + 0 + 0 + + + 284 + 624 + 691 + 2 + 0 + + + 960 + 638 + 725 + 0 + 0 + + + 7 + 450 + 684 + 4 + 0 + + + 59 + 154 + 593 + 6 + 0 + + + 1 + 263 + 578 + 0 + 0 + + + 72 + 204 + 619 + 3 + 0 + + + 70 + 226 + 288 + 0 + 0 + + + 34 + 209 + 437 + 0 + 0 + + + 72 + 206 + 613 + 3 + 0 + + + 70 + 220 + 574 + 0 + 0 + + + 72 + 205 + 616 + 3 + 0 + + + 3 + 124 + 525 + 0 + 0 + + + 1 + 606 + 558 + 6 + 0 + + + 1 + 329 + 198 + 0 + 1 + + + 209 + 215 + 425 + 3 + 0 + + + 70 + 267 + 244 + 0 + 0 + + + 46 + 136 + 479 + 4 + 0 + + + 965 + 623 + 792 + 6 + 0 + + + 284 + 636 + 678 + 2 + 0 + + + 597 + 616 + 801 + 2 + 0 + + + 306 + 721 + 469 + 0 + 0 + + + 51 + 712 + 693 + 0 + 0 + + + 205 + 206 + 149 + 0 + 0 + + + 3 + 125 + 521 + 0 + 0 + + + 0 + 612 + 503 + 0 + 0 + + + 217 + 112 + 274 + 5 + 0 + + + 4 + 160 + 407 + 0 + 0 + + + 163 + 497 + 558 + 1 + 1 + + + 70 + 306 + 213 + 0 + 0 + + + 0 + 142 + 642 + 0 + 0 + + + 37 + 326 + 655 + 0 + 0 + + + 284 + 482 + 443 + 2 + 0 + + + 3 + 614 + 753 + 0 + 0 + + + 70 + 309 + 295 + 0 + 0 + + + 70 + 321 + 203 + 0 + 0 + + + 1 + 190 + 665 + 0 + 0 + + + 51 + 709 + 696 + 2 + 0 + + + 70 + 229 + 398 + 0 + 0 + + + 1 + 127 + 513 + 0 + 1 + + + 597 + 695 + 531 + 4 + 0 + + + 405 + 530 + 756 + 7 + 0 + + + 70 + 131 + 233 + 0 + 0 + + + 284 + 654 + 707 + 0 + 0 + + + 0 + 287 + 650 + 0 + 0 + + + 0 + 356 + 524 + 0 + 0 + + + 205 + 606 + 763 + 4 + 0 + + + 70 + 165 + 185 + 0 + 0 + + + 70 + 200 + 326 + 0 + 0 + + + 70 + 163 + 400 + 0 + 0 + + + 36 + 354 + 527 + 0 + 0 + + + 1 + 548 + 506 + 0 + 0 + + + 307 + 697 + 708 + 0 + 0 + + + 597 + 680 + 497 + 2 + 0 + + + 525 + 710 + 476 + 2 + 0 + + + 0 + 308 + 493 + 0 + 0 + + + 34 + 182 + 501 + 0 + 0 + + + 4 + 306 + 413 + 0 + 0 + + + 164 + 402 + 464 + 0 + 0 + + + 284 + 638 + 676 + 0 + 0 + + + 215 + 116 + 263 + 2 + 0 + + + 0 + 665 + 463 + 0 + 0 + + + 285 + 624 + 741 + 0 + 0 + + + 377 + 617 + 699 + 3 + 0 + + + 1009 + 221 + 138 + 4 + 0 + + + 70 + 122 + 250 + 0 + 0 + + + 209 + 214 + 426 + 6 + 0 + + + 24 + 304 + 300 + 2 + 1 + + + 5 + 349 + 612 + 0 + 0 + + + 70 + 235 + 538 + 0 + 0 + + + 164 + 728 + 507 + 0 + 0 + + + 306 + 701 + 704 + 0 + 0 + + + 1 + 350 + 434 + 0 + 0 + + + 269 + 426 + 438 + 2 + 0 + + + 70 + 302 + 216 + 0 + 0 + + + 217 + 117 + 261 + 0 + 0 + + + 36 + 492 + 687 + 6 + 0 + + + 70 + 303 + 301 + 0 + 0 + + + 1 + 609 + 658 + 3 + 0 + + + 70 + 72 + 424 + 0 + 0 + + + 284 + 626 + 689 + 2 + 0 + + + 205 + 133 + 230 + 0 + 0 + + + 1011 + 220 + 139 + 4 + 0 + + + 597 + 672 + 503 + 6 + 0 + + + 15 + 461 + 668 + 2 + 0 + + + 183 + 357 + 697 + 0 + 0 + + + 1 + 148 + 441 + 2 + 0 + + + 284 + 655 + 706 + 2 + 0 + + + 707 + 294 + 104 + 0 + 0 + + + 0 + 343 + 544 + 0 + 0 + + + 1019 + 237 + 129 + 0 + 0 + + + 1 + 146 + 447 + 0 + 0 + + + 395 + 652 + 757 + 0 + 0 + + + 1 + 145 + 450 + 2 + 0 + + + 1 + 69 + 443 + 0 + 0 + + + 70 + 250 + 261 + 0 + 0 + + + 7 + 125 + 522 + 0 + 0 + + + 284 + 649 + 713 + 0 + 0 + + + 284 + 466 + 459 + 2 + 0 + + + 3 + 561 + 549 + 4 + 0 + + + 4 + 96 + 316 + 0 + 0 + + + 70 + 220 + 416 + 0 + 0 + + + 33 + 499 + 678 + 6 + 0 + + + 34 + 678 + 499 + 0 + 0 + + + 1010 + 239 + 127 + 2 + 0 + + + 309 + 633 + 731 + 0 + 0 + + + 37 + 190 + 663 + 0 + 0 + + + 164 + 404 + 462 + 0 + 0 + + + 306 + 708 + 435 + 3 + 0 + + + 0 + 523 + 409 + 0 + 0 + + + 20 + 462 + 463 + 0 + 0 + + + 1013 + 220 + 138 + 4 + 0 + + + 34 + 661 + 746 + 0 + 0 + + + 72 + 553 + 557 + 3 + 0 + + + 5 + 442 + 484 + 4 + 0 + + + 72 + 555 + 555 + 3 + 0 + + + 0 + 70 + 434 + 0 + 0 + + + 70 + 124 + 245 + 0 + 0 + + + 70 + 178 + 367 + 0 + 0 + + + 597 + 742 + 456 + 2 + 0 + + + 396 + 502 + 674 + 1 + 0 + + + 70 + 223 + 565 + 6 + 0 + + + 0 + 684 + 539 + 1 + 0 + + + 1 + 285 + 655 + 0 + 1 + + + 4 + 182 + 167 + 0 + 0 + + + 143 + 330 + 198 + 0 + 0 + + + 70 + 180 + 363 + 0 + 0 + + + 70 + 218 + 578 + 6 + 0 + + + 1 + 144 + 636 + 0 + 0 + + + 1 + 142 + 645 + 0 + 0 + + + 396 + 537 + 746 + 1 + 0 + + + 0 + 201 + 627 + 0 + 0 + + + 394 + 489 + 692 + 3 + 0 + + + 23 + 600 + 462 + 0 + 0 + + + 284 + 642 + 672 + 0 + 0 + + + 70 + 195 + 156 + 0 + 0 + + + 205 + 304 + 215 + 0 + 0 + + + 394 + 482 + 702 + 5 + 0 + + + 962 + 625 + 789 + 6 + 0 + + + 0 + 754 + 489 + 3 + 0 + + + 36 + 357 + 523 + 0 + 0 + + + 36 + 346 + 718 + 0 + 0 + + + 70 + 233 + 541 + 0 + 0 + + + 37 + 275 + 552 + 2 + 0 + + + 284 + 482 + 444 + 2 + 0 + + + 70 + 268 + 244 + 0 + 0 + + + 597 + 752 + 450 + 2 + 0 + + + 164 + 736 + 501 + 0 + 0 + + + 37 + 54 + 564 + 7 + 0 + + + 4 + 103 + 635 + 0 + 0 + + + 72 + 204 + 618 + 3 + 0 + + + 36 + 600 + 564 + 6 + 0 + + + 70 + 108 + 282 + 0 + 0 + + + 72 + 205 + 615 + 3 + 0 + + + 5 + 422 + 3527 + 2 + 0 + + + 284 + 659 + 702 + 0 + 0 + + + 32 + 411 + 674 + 0 + 0 + + + 70 + 272 + 336 + 0 + 0 + + + 105 + 168 + 544 + 0 + 0 + + + 3 + 572 + 700 + 0 + 0 + + + 597 + 740 + 457 + 0 + 0 + + + 163 + 497 + 557 + 1 + 1 + + + 284 + 647 + 715 + 0 + 0 + + + 70 + 246 + 266 + 0 + 0 + + + 1 + 133 + 492 + 0 + 0 + + + 530 + 492 + 563 + 2 + 0 + + + 1011 + 219 + 138 + 4 + 0 + + + 283 + 643 + 767 + 6 + 0 + + + 1 + 260 + 583 + 0 + 0 + + + 37 + 500 + 554 + 0 + 0 + + + 70 + 296 + 426 + 0 + 0 + + + 145 + 514 + 539 + 0 + 0 + + + 70 + 126 + 240 + 0 + 0 + + + 70 + 280 + 108 + 0 + 0 + + + 7 + 349 + 712 + 4 + 0 + + + 209 + 70 + 432 + 4 + 0 + + + 284 + 639 + 724 + 2 + 0 + + + 34 + 615 + 802 + 0 + 0 + + + 285 + 603 + 511 + 7 + 0 + + + 414 + 622 + 593 + 4 + 0 + + + 38 + 296 + 309 + 0 + 0 + + + 42 + 515 + 538 + 6 + 0 + + + 34 + 719 + 513 + 2 + 0 + + + 2 + 323 + 662 + 4 + 0 + + + 1 + 58 + 522 + 1 + 0 + + + 407 + 648 + 618 + 6 + 0 + + + 97 + 648 + 666 + 6 + 0 + + + 283 + 471 + 454 + 0 + 0 + + + 34 + 678 + 544 + 1 + 0 + + + 1164 + 609 + 506 + 6 + 0 + + + 37 + 755 + 448 + 7 + 0 + + + 34 + 634 + 778 + 3 + 0 + + + 70 + 297 + 308 + 0 + 0 + + + 34 + 195 + 647 + 2 + 0 + + + 399 + 529 + 757 + 1 + 0 + + + 0 + 662 + 511 + 6 + 0 + + + 597 + 689 + 491 + 0 + 0 + + + 70 + 212 + 309 + 0 + 0 + + + 1 + 55 + 551 + 0 + 0 + + + 34 + 313 + 597 + 2 + 0 + + + 70 + 184 + 356 + 0 + 0 + + + 145 + 517 + 536 + 2 + 0 + + + 284 + 631 + 684 + 0 + 0 + + + 15 + 370 + 578 + 4 + 0 + + + 70 + 246 + 372 + 0 + 0 + + + 153 + 609 + 455 + 0 + 0 + + + 284 + 661 + 700 + 0 + 0 + + + 1 + 326 + 201 + 1 + 1 + + + 70 + 181 + 362 + 0 + 0 + + + 0 + 737 + 459 + 1 + 0 + + + 70 + 245 + 123 + 0 + 0 + + + 38 + 81 + 372 + 0 + 0 + + + 377 + 656 + 658 + 4 + 0 + + + 4 + 68 + 443 + 6 + 0 + + + 33 + 390 + 710 + 0 + 0 + + + 284 + 639 + 723 + 2 + 0 + + + 284 + 632 + 683 + 2 + 0 + + + 26 + 509 + 544 + 2 + 0 + + + 284 + 660 + 700 + 0 + 0 + + + 306 + 688 + 537 + 2 + 0 + + + 730 + 442 + 3367 + 5 + 0 + + + 193 + 313 + 681 + 0 + 0 + + + 23 + 637 + 580 + 0 + 0 + + + 1012 + 239 + 126 + 6 + 0 + + + 4 + 318 + 203 + 0 + 0 + + + 70 + 86 + 350 + 0 + 0 + + + 38 + 221 + 292 + 0 + 0 + + + 4 + 198 + 152 + 0 + 0 + + + 4 + 218 + 296 + 0 + 0 + + + 70 + 101 + 298 + 0 + 0 + + + 38 + 78 + 386 + 0 + 0 + + + 164 + 495 + 559 + 1 + 1 + + + 36 + 595 + 569 + 6 + 0 + + + 117 + 306 + 300 + 0 + 0 + + + 70 + 233 + 277 + 0 + 0 + + + 668 + 733 + 504 + 0 + 0 + + + 36 + 495 + 684 + 6 + 0 + + + 70 + 80 + 376 + 0 + 0 + + + 30 + 281 + 665 + 0 + 1 + + + 0 + 64 + 470 + 0 + 0 + + + 445 + 623 + 593 + 0 + 0 + + + 0 + 54 + 559 + 7 + 0 + + + 285 + 584 + 844 + 6 + 0 + + + 164 + 403 + 464 + 0 + 0 + + + 36 + 739 + 500 + 7 + 0 + + + 205 + 189 + 342 + 0 + 0 + + + 401 + 479 + 707 + 6 + 0 + + + 70 + 82 + 368 + 0 + 0 + + + 30 + 285 + 656 + 1 + 1 + + + 217 + 113 + 267 + 6 + 0 + + + 34 + 201 + 631 + 0 + 0 + + + 398 + 477 + 710 + 6 + 0 + + + 1 + 289 + 647 + 0 + 0 + + + 70 + 180 + 359 + 0 + 0 + + + 405 + 538 + 746 + 0 + 0 + + + 3 + 533 + 753 + 0 + 0 + + + 205 + 208 + 145 + 0 + 0 + + + 183 + 354 + 701 + 0 + 0 + + + 597 + 741 + 457 + 0 + 0 + + + 1 + 193 + 657 + 0 + 0 + + + 183 + 351 + 707 + 0 + 0 + + + 34 + 196 + 647 + 1 + 0 + + + 284 + 648 + 713 + 0 + 0 + + + 4 + 94 + 321 + 0 + 0 + + + 4 + 282 + 229 + 0 + 0 + + + 34 + 55 + 548 + 7 + 0 + + + 70 + 309 + 209 + 0 + 0 + + + 34 + 303 + 617 + 2 + 0 + + + 205 + 224 + 410 + 0 + 0 + + + 205 + 134 + 225 + 0 + 0 + + + 8 + 69 + 437 + 0 + 0 + + + 284 + 633 + 682 + 0 + 0 + + + 597 + 680 + 498 + 2 + 0 + + + 70 + 273 + 237 + 0 + 0 + + + 0 + 639 + 481 + 6 + 0 + + + 284 + 482 + 442 + 2 + 0 + + + 1013 + 219 + 137 + 4 + 0 + + + 72 + 205 + 619 + 3 + 0 + + + 70 + 308 + 412 + 0 + 0 + + + 72 + 206 + 616 + 7 + 0 + + + 597 + 696 + 531 + 4 + 0 + + + 70 + 283 + 324 + 0 + 0 + + + 377 + 628 + 785 + 3 + 0 + + + 307 + 542 + 458 + 0 + 0 + + + 284 + 657 + 703 + 2 + 0 + + + 34 + 55 + 545 + 7 + 0 + + + 70 + 327 + 388 + 0 + 0 + + + 1 + 194 + 654 + 0 + 0 + + + 1 + 137 + 472 + 0 + 1 + + + 38 + 291 + 103 + 0 + 0 + + + 20 + 270 + 111 + 0 + 0 + + + 38 + 193 + 335 + 0 + 0 + + + 33 + 392 + 706 + 0 + 0 + + + 29 + 441 + 3375 + 0 + 0 + + + 38 + 84 + 358 + 0 + 0 + + + 284 + 636 + 679 + 2 + 0 + + + 70 + 219 + 419 + 0 + 0 + + + 134 + 230 + 552 + 0 + 0 + + + 24 + 486 + 385 + 0 + 0 + + + 597 + 749 + 452 + 2 + 0 + + + 283 + 604 + 612 + 4 + 0 + + + 104 + 562 + 714 + 0 + 0 + + + 1 + 292 + 522 + 1 + 1 + + + 205 + 315 + 403 + 0 + 0 + + + 1 + 59 + 509 + 1 + 0 + + + 1 + 580 + 530 + 2 + 0 + + + 284 + 646 + 715 + 0 + 0 + + + 284 + 624 + 692 + 2 + 0 + + + 278 + 451 + 3369 + 0 + 0 + + + 70 + 215 + 301 + 0 + 0 + + + 1 + 316 + 592 + 2 + 0 + + + 284 + 658 + 702 + 0 + 0 + + + 34 + 54 + 556 + 7 + 0 + + + 205 + 78 + 385 + 0 + 0 + + + 214 + 112 + 268 + 3 + 0 + + + 4 + 190 + 158 + 0 + 0 + + + 30 + 281 + 666 + 1 + 1 + + + 0 + 63 + 474 + 0 + 0 + + + 34 + 766 + 482 + 3 + 0 + + + 70 + 200 + 324 + 0 + 0 + + + 38 + 162 + 400 + 0 + 0 + + + 6 + 652 + 709 + 2 + 0 + + + 1 + 221 + 3514 + 1 + 1 + + + 0 + 54 + 553 + 7 + 0 + + + 46 + 530 + 522 + 0 + 0 + + + 1016 + 218 + 137 + 4 + 0 + + + 70 + 137 + 218 + 0 + 0 + + + 1010 + 239 + 125 + 2 + 0 + + + 0 + 687 + 717 + 0 + 0 + + + 284 + 466 + 458 + 2 + 0 + + + 23 + 524 + 473 + 4 + 0 + + + 153 + 608 + 455 + 0 + 0 + + + 70 + 296 + 219 + 0 + 0 + + + 4 + 322 + 286 + 0 + 0 + + + 70 + 308 + 299 + 0 + 0 + + + 4 + 183 + 163 + 0 + 0 + + + 0 + 667 + 508 + 6 + 0 + + + 565 + 748 + 453 + 0 + 0 + + + 20 + 133 + 487 + 0 + 0 + + + 70 + 170 + 381 + 0 + 0 + + + 284 + 470 + 454 + 0 + 0 + + + 284 + 667 + 693 + 2 + 0 + + + 4 + 135 + 221 + 0 + 0 + + + 72 + 554 + 555 + 3 + 0 + + + 72 + 204 + 620 + 3 + 0 + + + 72 + 206 + 614 + 3 + 0 + + + 34 + 592 + 832 + 1 + 0 + + + 70 + 323 + 285 + 0 + 0 + + + 72 + 552 + 557 + 3 + 0 + + + 1 + 590 + 732 + 1 + 0 + + + 668 + 731 + 505 + 0 + 0 + + + 25 + 219 + 695 + 4 + 0 + + + 1039 + 68 + 439 + 0 + 0 + + + 34 + 718 + 686 + 7 + 0 + + + 72 + 205 + 617 + 7 + 0 + + + 284 + 637 + 678 + 0 + 0 + + + 70 + 82 + 364 + 0 + 0 + + + 1039 + 68 + 440 + 0 + 0 + + + 284 + 671 + 689 + 2 + 0 + + + 214 + 110 + 272 + 4 + 0 + + + 34 + 195 + 649 + 6 + 0 + + + 597 + 746 + 495 + 2 + 0 + + + 1 + 620 + 647 + 7 + 0 + + + 0 + 332 + 643 + 0 + 0 + + + 1 + 583 + 845 + 6 + 0 + + + 313 + 699 + 440 + 3 + 0 + + + 120 + 631 + 585 + 1 + 1 + + + 70 + 311 + 407 + 0 + 0 + + + 36 + 356 + 526 + 0 + 0 + + + 70 + 309 + 210 + 0 + 0 + + + 51 + 532 + 754 + 2 + 0 + + + 284 + 643 + 719 + 0 + 0 + + + 205 + 98 + 305 + 0 + 0 + + + 8 + 67 + 446 + 6 + 0 + + + 88 + 700 + 573 + 5 + 0 + + + 4 + 141 + 212 + 0 + 0 + + + 284 + 639 + 676 + 0 + 0 + + + 3 + 368 + 580 + 4 + 0 + + + 284 + 626 + 690 + 2 + 0 + + + 283 + 663 + 743 + 5 + 0 + + + 117 + 304 + 303 + 2 + 0 + + + 0 + 635 + 728 + 0 + 0 + + + 284 + 669 + 691 + 2 + 0 + + + 70 + 321 + 287 + 0 + 0 + + + 4 + 280 + 329 + 0 + 0 + + + 70 + 237 + 274 + 0 + 0 + + + 70 + 137 + 217 + 0 + 0 + + + 23 + 639 + 578 + 0 + 0 + + + 34 + 208 + 442 + 4 + 0 + + + 0 + 730 + 464 + 1 + 0 + + + 34 + 659 + 514 + 0 + 0 + + + 59 + 108 + 601 + 0 + 0 + + + 1 + 553 + 500 + 0 + 0 + + + 4 + 54 + 550 + 7 + 0 + + + 163 + 497 + 556 + 1 + 1 + + + 1 + 55 + 540 + 0 + 0 + + + 70 + 312 + 208 + 0 + 0 + + + 0 + 664 + 742 + 2 + 0 + + + 37 + 275 + 553 + 2 + 0 + + + 63 + 512 + 540 + 6 + 0 + + + 25 + 522 + 475 + 6 + 0 + + + 7 + 451 + 682 + 2 + 0 + + + 34 + 682 + 451 + 3 + 0 + + + 597 + 672 + 504 + 6 + 0 + + + 38 + 608 + 760 + 7 + 0 + + + 21 + 68 + 437 + 0 + 0 + + + 730 + 450 + 3376 + 0 + 0 + + + 193 + 311 + 686 + 0 + 0 + + + 395 + 484 + 700 + 5 + 0 + + + 1 + 588 + 682 + 0 + 0 + + + 72 + 205 + 618 + 7 + 0 + + + 0 + 319 + 477 + 0 + 0 + + + 72 + 206 + 615 + 3 + 0 + + + 59 + 105 + 619 + 0 + 0 + + + 1016 + 224 + 133 + 4 + 0 + + + 70 + 156 + 191 + 0 + 0 + + + 597 + 743 + 456 + 0 + 0 + + + 597 + 690 + 491 + 0 + 0 + + + 1 + 453 + 471 + 0 + 0 + + + 46 + 536 + 516 + 0 + 0 + + + 1 + 188 + 674 + 0 + 0 + + + 205 + 225 + 409 + 0 + 0 + + + 36 + 696 + 708 + 0 + 0 + + + 70 + 110 + 271 + 0 + 0 + + + 1 + 444 + 693 + 1 + 1 + + + 284 + 643 + 672 + 0 + 0 + + + 38 + 216 + 426 + 0 + 0 + + + 0 + 65 + 458 + 0 + 0 + + + 33 + 496 + 683 + 6 + 0 + + + 1 + 61 + 488 + 1 + 0 + + + 283 + 665 + 741 + 2 + 0 + + + 20 + 146 + 445 + 2 + 0 + + + 38 + 273 + 238 + 0 + 0 + + + 38 + 203 + 320 + 0 + 0 + + + 70 + 232 + 280 + 0 + 0 + + + 70 + 120 + 248 + 0 + 0 + + + 70 + 218 + 298 + 0 + 0 + + + 70 + 289 + 103 + 0 + 0 + + + 0 + 637 + 483 + 6 + 0 + + + 192 + 654 + 518 + 4 + 0 + + + 4 + 146 + 204 + 0 + 0 + + + 205 + 115 + 259 + 0 + 0 + + + 0 + 197 + 467 + 0 + 0 + + + 70 + 211 + 308 + 0 + 0 + + + 66 + 208 + 609 + 6 + 0 + + + 23 + 642 + 673 + 4 + 0 + + + 7 + 124 + 524 + 4 + 0 + + + 284 + 650 + 711 + 0 + 0 + + + 70 + 327 + 196 + 0 + 0 + + + 1013 + 218 + 136 + 4 + 0 + + + 1 + 572 + 752 + 0 + 0 + + + 26 + 473 + 454 + 2 + 0 + + + 597 + 752 + 451 + 2 + 0 + + + 38 + 183 + 162 + 0 + 0 + + + 27 + 440 + 488 + 4 + 0 + + + 72 + 204 + 614 + 7 + 0 + + + 38 + 189 + 339 + 0 + 0 + + + 1010 + 239 + 124 + 2 + 0 + + + 0 + 250 + 501 + 0 + 0 + + + 396 + 488 + 695 + 5 + 0 + + + 205 + 308 + 208 + 0 + 0 + + + 72 + 203 + 617 + 3 + 0 + + + 1 + 604 + 662 + 2 + 0 + + + 1140 + 482 + 389 + 6 + 0 + + + 70 + 98 + 303 + 0 + 0 + + + 597 + 746 + 496 + 2 + 0 + + + 273 + 441 + 487 + 4 + 0 + + + 102 + 560 + 714 + 0 + 0 + + + 34 + 191 + 656 + 1 + 0 + + + 70 + 222 + 407 + 0 + 0 + + + 284 + 628 + 685 + 2 + 0 + + + 58 + 600 + 717 + 0 + 0 + + + 70 + 142 + 209 + 0 + 0 + + + 284 + 667 + 692 + 2 + 0 + + + 0 + 167 + 541 + 4 + 0 + + + 36 + 495 + 685 + 3 + 0 + + + 290 + 600 + 464 + 0 + 0 + + + 4 + 317 + 395 + 0 + 0 + + + 5 + 476 + 451 + 0 + 0 + + + 406 + 490 + 692 + 6 + 0 + + + 32 + 533 + 750 + 0 + 0 + + + 70 + 127 + 233 + 0 + 0 + + + 284 + 640 + 672 + 0 + 0 + + + 70 + 627 + 590 + 6 + 0 + + + 70 + 116 + 255 + 0 + 0 + + + 70 + 282 + 227 + 0 + 0 + + + 4 + 68 + 435 + 3 + 0 + + + 34 + 591 + 833 + 1 + 0 + + + 37 + 633 + 729 + 2 + 0 + + + 205 + 88 + 336 + 0 + 0 + + + 70 + 154 + 192 + 0 + 0 + + + 0 + 66 + 448 + 0 + 0 + + + 0 + 643 + 433 + 5 + 0 + + + 205 + 293 + 308 + 0 + 0 + + + 70 + 204 + 314 + 0 + 0 + + + 117 + 302 + 299 + 2 + 0 + + + 284 + 627 + 686 + 0 + 0 + + + 50 + 303 + 298 + 0 + 0 + + + 36 + 357 + 525 + 0 + 0 + + + 284 + 650 + 710 + 2 + 0 + + + 4 + 217 + 416 + 0 + 0 + + + 70 + 191 + 155 + 0 + 0 + + + 36 + 351 + 534 + 0 + 0 + + + 383 + 612 + 455 + 0 + 0 + + + 1 + 61 + 484 + 1 + 0 + + + 1 + 188 + 667 + 0 + 0 + + + 70 + 238 + 379 + 0 + 0 + + + 348 + 621 + 596 + 2 + 0 + + + 3 + 616 + 749 + 0 + 0 + + + 70 + 185 + 347 + 0 + 0 + + + 1 + 64 + 461 + 0 + 0 + + + 20 + 276 + 554 + 6 + 0 + + + 3 + 123 + 522 + 0 + 0 + + + 0 + 637 + 485 + 6 + 0 + + + 1011 + 217 + 136 + 4 + 0 + + + 34 + 195 + 643 + 1 + 0 + + + 377 + 650 + 662 + 0 + 0 + + + 307 + 549 + 455 + 0 + 0 + + + 70 + 177 + 167 + 0 + 0 + + + 70 + 312 + 402 + 0 + 0 + + + 70 + 283 + 227 + 0 + 0 + + + 0 + 318 + 481 + 0 + 0 + + + 34 + 206 + 438 + 0 + 0 + + + 1 + 147 + 437 + 2 + 0 + + + 36 + 599 + 566 + 6 + 0 + + + 285 + 593 + 521 + 7 + 0 + + + 0 + 155 + 582 + 0 + 0 + + + 377 + 653 + 659 + 0 + 0 + + + 70 + 271 + 237 + 0 + 0 + + + 34 + 711 + 649 + 0 + 0 + + + 1 + 252 + 358 + 1 + 1 + + + 37 + 743 + 538 + 3 + 0 + + + 70 + 259 + 248 + 0 + 0 + + + 0 + 174 + 518 + 0 + 0 + + + 0 + 662 + 559 + 0 + 0 + + + 1016 + 232 + 127 + 0 + 0 + + + 0 + 608 + 508 + 0 + 0 + + + 70 + 106 + 278 + 0 + 0 + + + 70 + 172 + 373 + 0 + 0 + + + 5 + 121 + 530 + 0 + 0 + + + 70 + 167 + 384 + 0 + 0 + + + 38 + 72 + 409 + 0 + 0 + + + 284 + 629 + 684 + 0 + 0 + + + 70 + 148 + 199 + 0 + 0 + + + 194 + 760 + 446 + 0 + 0 + + + 1 + 332 + 565 + 0 + 1 + + + 34 + 306 + 613 + 2 + 0 + + + 34 + 161 + 560 + 0 + 0 + + + 0 + 204 + 442 + 0 + 0 + + + 8 + 66 + 447 + 0 + 0 + + + 1 + 136 + 663 + 0 + 1 + + + 284 + 639 + 722 + 2 + 0 + + + 597 + 697 + 531 + 4 + 0 + + + 1039 + 67 + 440 + 0 + 0 + + + 3 + 122 + 526 + 0 + 0 + + + 34 + 729 + 465 + 7 + 0 + + + 34 + 728 + 549 + 3 + 0 + + + 1 + 261 + 347 + 1 + 1 + + + 0 + 669 + 462 + 0 + 0 + + + 960 + 630 + 733 + 0 + 0 + + + 0 + 725 + 510 + 0 + 0 + + + 0 + 248 + 504 + 0 + 0 + + + 284 + 655 + 705 + 2 + 0 + + + 70 + 240 + 268 + 0 + 0 + + + 38 + 251 + 498 + 0 + 0 + + + 70 + 224 + 558 + 6 + 0 + + + 70 + 102 + 288 + 0 + 0 + + + 70 + 229 + 281 + 0 + 0 + + + 4 + 78 + 377 + 0 + 0 + + + 70 + 81 + 363 + 0 + 0 + + + 70 + 297 + 99 + 0 + 0 + + + 34 + 190 + 658 + 0 + 0 + + + 38 + 245 + 120 + 0 + 0 + + + 1011 + 239 + 123 + 0 + 0 + + + 306 + 695 + 532 + 2 + 0 + + + 34 + 315 + 596 + 2 + 0 + + + 34 + 53 + 555 + 7 + 0 + + + 0 + 305 + 501 + 0 + 0 + + + 283 + 496 + 561 + 0 + 0 + + + 654 + 683 + 497 + 4 + 0 + + + 1 + 604 + 562 + 6 + 0 + + + 37 + 524 + 531 + 0 + 0 + + + 402 + 577 + 746 + 0 + 0 + + + 8 + 66 + 446 + 0 + 0 + + + 70 + 222 + 290 + 0 + 0 + + + 34 + 707 + 523 + 2 + 0 + + + 72 + 203 + 616 + 3 + 0 + + + 0 + 611 + 654 + 3 + 0 + + + 1 + 489 + 569 + 0 + 0 + + + 1 + 129 + 499 + 0 + 0 + + + 46 + 530 + 525 + 0 + 0 + + + 283 + 595 + 776 + 0 + 0 + + + 877 + 742 + 580 + 7 + 0 + + + 401 + 508 + 668 + 2 + 0 + + + 215 + 109 + 269 + 4 + 0 + + + 70 + 322 + 388 + 0 + 0 + + + 30 + 128 + 502 + 0 + 0 + + + 1 + 64 + 458 + 0 + 0 + + + 4 + 90 + 326 + 0 + 0 + + + 394 + 630 + 781 + 3 + 0 + + + 70 + 139 + 211 + 0 + 0 + + + 36 + 693 + 710 + 2 + 0 + + + 38 + 304 + 411 + 0 + 0 + + + 284 + 632 + 681 + 2 + 0 + + + 205 + 657 + 749 + 0 + 0 + + + 70 + 126 + 233 + 0 + 0 + + + 70 + 239 + 269 + 0 + 0 + + + 36 + 697 + 706 + 0 + 0 + + + 70 + 73 + 402 + 0 + 0 + + + 70 + 146 + 201 + 0 + 0 + + + 0 + 313 + 488 + 0 + 0 + + + 404 + 532 + 751 + 7 + 0 + + + 284 + 644 + 717 + 0 + 0 + + + 597 + 672 + 505 + 6 + 0 + + + 1 + 522 + 592 + 0 + 0 + + + 70 + 110 + 267 + 0 + 0 + + + 6 + 231 + 392 + 4 + 0 + + + 336 + 267 + 110 + 0 + 0 + + + 46 + 536 + 519 + 0 + 0 + + + 34 + 590 + 834 + 4 + 0 + + + 284 + 482 + 446 + 2 + 0 + + + 306 + 688 + 671 + 4 + 0 + + + 34 + 350 + 713 + 0 + 0 + + + 70 + 217 + 297 + 0 + 0 + + + 284 + 671 + 688 + 2 + 0 + + + 1 + 194 + 645 + 0 + 0 + + + 597 + 691 + 491 + 0 + 0 + + + 205 + 238 + 380 + 0 + 0 + + + 183 + 357 + 699 + 0 + 0 + + + 33 + 412 + 675 + 0 + 0 + + + 70 + 227 + 284 + 0 + 0 + + + 5 + 142 + 454 + 0 + 0 + + + 205 + 225 + 402 + 0 + 0 + + + 283 + 689 + 670 + 4 + 0 + + + 597 + 744 + 456 + 0 + 0 + + + 70 + 82 + 357 + 0 + 0 + + + 1013 + 238 + 123 + 0 + 0 + + + 597 + 680 + 499 + 2 + 0 + + + 38 + 196 + 329 + 0 + 0 + + + 4 + 218 + 415 + 0 + 0 + + + 38 + 80 + 366 + 0 + 0 + + + 205 + 160 + 403 + 0 + 0 + + + 183 + 354 + 705 + 0 + 0 + + + 0 + 710 + 521 + 0 + 0 + + + 284 + 653 + 707 + 0 + 0 + + + 284 + 624 + 690 + 2 + 0 + + + 445 + 657 + 563 + 6 + 0 + + + 1010 + 217 + 135 + 6 + 0 + + + 407 + 602 + 462 + 0 + 0 + + + 38 + 91 + 322 + 0 + 0 + + + 597 + 749 + 453 + 2 + 0 + + + 33 + 486 + 698 + 0 + 0 + + + 72 + 204 + 613 + 7 + 0 + + + 6 + 289 + 101 + 0 + 0 + + + 597 + 616 + 799 + 2 + 0 + + + 51 + 558 + 554 + 4 + 0 + + + 72 + 557 + 555 + 3 + 0 + + + 72 + 555 + 557 + 3 + 0 + + + 0 + 307 + 497 + 0 + 0 + + + 284 + 634 + 679 + 2 + 0 + + + 284 + 642 + 719 + 0 + 0 + + + 1 + 193 + 648 + 0 + 0 + + + 284 + 470 + 457 + 0 + 0 + + + 70 + 236 + 383 + 0 + 0 + + + 0 + 314 + 486 + 0 + 0 + + + 72 + 553 + 559 + 3 + 0 + + + 14 + 140 + 460 + 4 + 0 + + + 70 + 99 + 295 + 0 + 0 + + + 70 + 324 + 279 + 0 + 0 + + + 284 + 469 + 458 + 2 + 0 + + + 1 + 497 + 502 + 0 + 0 + + + 281 + 484 + 388 + 0 + 0 + + + 1041 + 67 + 436 + 0 + 0 + + + 597 + 672 + 460 + 6 + 0 + + + 402 + 593 + 726 + 0 + 0 + + + 11 + 454 + 681 + 2 + 0 + + + 283 + 466 + 461 + 2 + 0 + + + 70 + 175 + 167 + 0 + 0 + + + 0 + 611 + 506 + 0 + 0 + + + 70 + 319 + 202 + 0 + 0 + + + 34 + 187 + 669 + 1 + 0 + + + 395 + 627 + 785 + 3 + 0 + + + 7 + 349 + 715 + 0 + 0 + + + 0 + 627 + 637 + 6 + 0 + + + 37 + 326 + 659 + 0 + 0 + + + 463 + 662 + 467 + 1 + 0 + + + 307 + 546 + 457 + 0 + 0 + + + 284 + 669 + 690 + 2 + 0 + + + 407 + 750 + 574 + 5 + 0 + + + 0 + 682 + 676 + 0 + 0 + + + 163 + 497 + 559 + 1 + 1 + + + 402 + 507 + 670 + 2 + 0 + + + 70 + 300 + 212 + 0 + 0 + + + 205 + 318 + 200 + 0 + 0 + + + 38 + 240 + 265 + 0 + 0 + + + 191 + 106 + 600 + 0 + 0 + + + 283 + 662 + 743 + 7 + 0 + + + 70 + 154 + 413 + 0 + 0 + + + 33 + 396 + 702 + 0 + 0 + + + 1 + 292 + 526 + 1 + 1 + + + 284 + 643 + 717 + 0 + 0 + + + 284 + 626 + 688 + 2 + 0 + + + 70 + 108 + 270 + 0 + 0 + + + 70 + 81 + 360 + 0 + 0 + + + 0 + 767 + 522 + 3 + 0 + + + 306 + 754 + 531 + 3 + 0 + + + 153 + 611 + 455 + 0 + 0 + + + 3 + 349 + 714 + 2 + 0 + + + 397 + 531 + 754 + 1 + 0 + + + 34 + 716 + 687 + 2 + 0 + + + 105 + 167 + 544 + 0 + 0 + + + 2 + 340 + 630 + 1 + 1 + + + 0 + 614 + 652 + 3 + 0 + + + 335 + 265 + 110 + 0 + 0 + + + 0 + 712 + 433 + 3 + 0 + + + 4 + 239 + 266 + 0 + 0 + + + 38 + 325 + 387 + 0 + 0 + + + 34 + 174 + 522 + 0 + 0 + + + 1 + 199 + 632 + 0 + 0 + + + 1 + 64 + 455 + 0 + 0 + + + 0 + 192 + 655 + 2 + 0 + + + 70 + 73 + 399 + 0 + 0 + + + 70 + 207 + 307 + 0 + 0 + + + 70 + 155 + 410 + 0 + 0 + + + 7 + 129 + 1457 + 4 + 0 + + + 34 + 589 + 835 + 2 + 0 + + + 284 + 652 + 707 + 0 + 0 + + + 1 + 200 + 454 + 0 + 0 + + + 306 + 761 + 526 + 3 + 0 + + + 34 + 753 + 492 + 3 + 0 + + + 70 + 209 + 304 + 0 + 0 + + + 0 + 143 + 635 + 0 + 0 + + + 34 + 347 + 718 + 0 + 0 + + + 70 + 276 + 329 + 0 + 0 + + + 306 + 738 + 502 + 6 + 0 + + + 0 + 633 + 487 + 6 + 0 + + + 37 + 326 + 657 + 0 + 0 + + + 70 + 291 + 100 + 0 + 0 + + + 0 + 329 + 651 + 0 + 0 + + + 205 + 275 + 231 + 0 + 0 + + + 34 + 718 + 516 + 2 + 0 + + + 284 + 671 + 687 + 2 + 0 + + + 20 + 262 + 111 + 6 + 0 + + + 1 + 350 + 537 + 0 + 0 + + + 284 + 669 + 689 + 2 + 0 + + + 1 + 661 + 744 + 7 + 0 + + + 1012 + 217 + 134 + 2 + 0 + + + 718 + 748 + 454 + 2 + 0 + + + 34 + 52 + 559 + 7 + 0 + + + 1 + 628 + 734 + 6 + 0 + + + 70 + 84 + 346 + 0 + 0 + + + 397 + 533 + 751 + 1 + 0 + + + 37 + 509 + 546 + 3 + 0 + + + 29 + 332 + 566 + 0 + 0 + + + 3 + 450 + 685 + 0 + 0 + + + 0 + 64 + 454 + 0 + 0 + + + 284 + 637 + 676 + 0 + 0 + + + 284 + 667 + 691 + 2 + 0 + + + 693 + 339 + 555 + 6 + 0 + + + 0 + 648 + 476 + 2 + 0 + + + 0 + 594 + 624 + 0 + 0 + + + 597 + 672 + 459 + 6 + 0 + + + 191 + 566 + 545 + 2 + 0 + + + 37 + 634 + 727 + 0 + 0 + + + 306 + 735 + 462 + 2 + 0 + + + 283 + 690 + 668 + 4 + 0 + + + 34 + 693 + 490 + 0 + 0 + + + 30 + 285 + 660 + 1 + 1 + + + 1016 + 238 + 122 + 0 + 0 + + + 0 + 317 + 484 + 0 + 0 + + + 0 + 593 + 625 + 4 + 0 + + + 407 + 667 + 600 + 6 + 0 + + + 284 + 641 + 719 + 0 + 0 + + + 46 + 133 + 479 + 4 + 0 + + + 283 + 692 + 666 + 4 + 0 + + + 70 + 107 + 271 + 0 + 0 + + + 70 + 183 + 348 + 0 + 0 + + + 34 + 733 + 546 + 3 + 0 + + + 4 + 145 + 200 + 0 + 0 + + + 4 + 97 + 299 + 0 + 0 + + + 284 + 628 + 686 + 2 + 0 + + + 70 + 99 + 293 + 0 + 0 + + + 597 + 698 + 531 + 4 + 0 + + + 284 + 641 + 672 + 0 + 0 + + + 72 + 204 + 617 + 7 + 0 + + + 70 + 491 + 436 + 0 + 0 + + + 72 + 205 + 614 + 3 + 0 + + + 38 + 276 + 105 + 0 + 0 + + + 1041 + 65 + 446 + 0 + 0 + + + 283 + 714 + 689 + 0 + 0 + + + 1 + 306 + 1506 + 3 + 1 + + + 0 + 308 + 498 + 0 + 0 + + + 70 + 228 + 552 + 6 + 0 + + + 72 + 203 + 620 + 3 + 0 + + + 284 + 650 + 709 + 0 + 0 + + + 286 + 616 + 451 + 0 + 0 + + + 23 + 639 + 580 + 0 + 0 + + + 1041 + 66 + 439 + 0 + 0 + + + 25 + 134 + 475 + 6 + 0 + + + 730 + 468 + 3398 + 0 + 0 + + + 70 + 68 + 426 + 0 + 0 + + + 420 + 714 + 519 + 2 + 0 + + + 34 + 54 + 536 + 0 + 0 + + + 0 + 201 + 451 + 0 + 0 + + + 4 + 242 + 263 + 0 + 0 + + + 1 + 292 + 644 + 0 + 0 + + + 0 + 628 + 491 + 6 + 0 + + + 1 + 56 + 517 + 1 + 0 + + + 306 + 741 + 540 + 3 + 0 + + + 70 + 148 + 430 + 0 + 0 + + + 114 + 562 + 712 + 0 + 0 + + + 70 + 149 + 427 + 0 + 0 + + + 404 + 530 + 755 + 1 + 0 + + + 34 + 715 + 688 + 2 + 0 + + + 4 + 233 + 389 + 0 + 0 + + + 70 + 123 + 235 + 0 + 0 + + + 4 + 137 + 211 + 0 + 0 + + + 284 + 647 + 713 + 0 + 0 + + + 308 + 596 + 774 + 6 + 0 + + + 70 + 168 + 380 + 0 + 0 + + + 284 + 659 + 700 + 0 + 0 + + + 0 + 700 + 659 + 0 + 0 + + + 1039 + 65 + 445 + 0 + 0 + + + 72 + 556 + 555 + 3 + 0 + + + 72 + 554 + 557 + 3 + 0 + + + 70 + 307 + 208 + 0 + 0 + + + 1013 + 237 + 122 + 0 + 0 + + + 164 + 739 + 460 + 7 + 0 + + + 70 + 220 + 414 + 0 + 0 + + + 30 + 283 + 665 + 0 + 1 + + + 1010 + 217 + 133 + 6 + 0 + + + 1 + 631 + 731 + 6 + 0 + + + 286 + 523 + 590 + 0 + 0 + + + 23 + 524 + 475 + 4 + 0 + + + 72 + 552 + 559 + 3 + 0 + + + 1 + 598 + 516 + 2 + 1 + + + 70 + 212 + 592 + 0 + 0 + + + 34 + 751 + 493 + 3 + 0 + + + 284 + 630 + 684 + 0 + 0 + + + 597 + 752 + 452 + 2 + 0 + + + 164 + 731 + 465 + 2 + 0 + + + 0 + 490 + 508 + 0 + 0 + + + 284 + 482 + 445 + 2 + 0 + + + 20 + 111 + 575 + 6 + 0 + + + 283 + 54 + 534 + 0 + 0 + + + 34 + 588 + 836 + 5 + 0 + + + 597 + 616 + 798 + 2 + 0 + + + 0 + 290 + 649 + 0 + 0 + + + 405 + 494 + 688 + 3 + 0 + + + 70 + 195 + 148 + 0 + 0 + + + 21 + 65 + 444 + 0 + 0 + + + 70 + 232 + 275 + 0 + 0 + + + 70 + 216 + 581 + 6 + 0 + + + 0 + 622 + 496 + 0 + 0 + + + 20 + 144 + 443 + 2 + 0 + + + 718 + 747 + 455 + 2 + 0 + + + 284 + 657 + 702 + 2 + 0 + + + 3 + 349 + 713 + 2 + 0 + + + 34 + 52 + 554 + 7 + 0 + + + 303 + 231 + 394 + 4 + 0 + + + 27 + 138 + 462 + 2 + 0 + + + 399 + 489 + 695 + 5 + 0 + + + 70 + 309 + 406 + 0 + 0 + + + 575 + 714 + 476 + 0 + 0 + + + 0 + 655 + 471 + 0 + 0 + + + 70 + 90 + 320 + 0 + 0 + + + 38 + 75 + 384 + 0 + 0 + + + 105 + 167 + 545 + 0 + 0 + + + 72 + 204 + 615 + 7 + 0 + + + 729 + 724 + 637 + 0 + 0 + + + 183 + 354 + 703 + 0 + 0 + + + 70 + 327 + 195 + 0 + 0 + + + 72 + 203 + 618 + 3 + 0 + + + 70 + 213 + 589 + 0 + 0 + + + 72 + 205 + 612 + 3 + 0 + + + 205 + 606 + 761 + 4 + 0 + + + 70 + 124 + 232 + 0 + 0 + + + 284 + 645 + 715 + 0 + 0 + + + 0 + 312 + 491 + 0 + 0 + + + 72 + 204 + 616 + 3 + 0 + + + 70 + 247 + 259 + 0 + 0 + + + 70 + 88 + 327 + 0 + 0 + + + 1041 + 66 + 436 + 3 + 0 + + + 72 + 205 + 613 + 7 + 0 + + + 104 + 561 + 713 + 0 + 0 + + + 0 + 53 + 543 + 7 + 0 + + + 70 + 319 + 394 + 0 + 0 + + + 1 + 129 + 496 + 0 + 0 + + + 306 + 502 + 553 + 4 + 0 + + + 70 + 237 + 270 + 0 + 0 + + + 70 + 162 + 395 + 0 + 0 + + + 1 + 434 + 494 + 0 + 1 + + + 1 + 61 + 472 + 1 + 0 + + + 1009 + 236 + 122 + 4 + 0 + + + 209 + 212 + 429 + 1 + 0 + + + 87 + 208 + 604 + 4 + 0 + + + 7 + 450 + 686 + 0 + 0 + + + 404 + 534 + 749 + 1 + 0 + + + 205 + 315 + 203 + 0 + 0 + + + 1 + 145 + 441 + 2 + 0 + + + 306 + 722 + 513 + 2 + 0 + + + 284 + 466 + 460 + 2 + 0 + + + 284 + 655 + 704 + 2 + 0 + + + 4 + 323 + 198 + 0 + 0 + + + 70 + 187 + 342 + 0 + 0 + + + 3 + 686 + 583 + 0 + 0 + + + 1 + 278 + 551 + 0 + 1 + + + 70 + 91 + 316 + 0 + 0 + + + 70 + 158 + 182 + 0 + 0 + + + 1 + 289 + 530 + 4 + 0 + + + 72 + 203 + 619 + 3 + 0 + + + 9 + 488 + 386 + 0 + 0 + + + 70 + 319 + 285 + 0 + 0 + + + 34 + 209 + 435 + 0 + 0 + + + 284 + 632 + 682 + 2 + 0 + + + 70 + 110 + 261 + 0 + 0 + + + 70 + 99 + 290 + 0 + 0 + + + 8 + 66 + 435 + 0 + 0 + + + 25 + 522 + 477 + 6 + 0 + + + 70 + 184 + 156 + 0 + 0 + + + 597 + 692 + 491 + 0 + 0 + + + 395 + 484 + 702 + 5 + 0 + + + 191 + 106 + 603 + 0 + 0 + + + 68 + 116 + 551 + 0 + 0 + + + 283 + 469 + 457 + 2 + 0 + + + 25 + 134 + 477 + 6 + 0 + + + 153 + 610 + 455 + 0 + 0 + + + 4 + 77 + 373 + 0 + 0 + + + 70 + 170 + 376 + 0 + 0 + + + 70 + 108 + 266 + 0 + 0 + + + 37 + 56 + 513 + 1 + 0 + + + 0 + 621 + 497 + 0 + 0 + + + 1011 + 237 + 121 + 0 + 0 + + + 0 + 762 + 486 + 3 + 0 + + + 285 + 487 + 440 + 0 + 0 + + + 38 + 120 + 239 + 0 + 0 + + + 4 + 299 + 304 + 0 + 0 + + + 0 + 616 + 501 + 0 + 0 + + + 117 + 304 + 299 + 6 + 0 + + + 702 + 745 + 456 + 6 + 0 + + + 283 + 620 + 793 + 0 + 0 + + + 70 + 100 + 287 + 0 + 0 + + + 0 + 598 + 771 + 6 + 0 + + + 205 + 326 + 196 + 0 + 0 + + + 284 + 642 + 717 + 0 + 0 + + + 23 + 735 + 457 + 0 + 0 + + + 46 + 714 + 694 + 0 + 0 + + + 1 + 264 + 353 + 1 + 1 + + + 4 + 128 + 254 + 0 + 0 + + + 286 + 484 + 694 + 2 + 0 + + + 284 + 671 + 686 + 2 + 0 + + + 34 + 466 + 665 + 0 + 0 + + + 306 + 727 + 462 + 2 + 0 + + + 1 + 298 + 619 + 2 + 0 + + + 38 + 159 + 397 + 0 + 0 + + + 399 + 632 + 784 + 3 + 0 + + + 1 + 197 + 631 + 0 + 0 + + + 1 + 200 + 466 + 0 + 0 + + + 597 + 680 + 494 + 2 + 0 + + + 205 + 226 + 144 + 0 + 0 + + + 205 + 155 + 210 + 0 + 0 + + + 12 + 526 + 469 + 6 + 0 + + + 0 + 619 + 644 + 3 + 0 + + + 1010 + 231 + 141 + 0 + 0 + + + 70 + 261 + 242 + 0 + 0 + + + 70 + 122 + 267 + 0 + 0 + + + 70 + 252 + 370 + 0 + 0 + + + 933 + 713 + 695 + 0 + 0 + + + 1009 + 236 + 138 + 4 + 0 + + + 284 + 641 + 676 + 0 + 0 + + + 70 + 217 + 573 + 0 + 0 + + + 665 + 296 + 110 + 4 + 0 + + + 70 + 167 + 195 + 0 + 0 + + + 46 + 710 + 698 + 0 + 0 + + + 402 + 533 + 748 + 1 + 0 + + + 37 + 635 + 725 + 2 + 0 + + + 38 + 187 + 665 + 0 + 0 + + + 70 + 282 + 224 + 0 + 0 + + + 20 + 345 + 625 + 0 + 0 + + + 1 + 141 + 448 + 0 + 0 + + + 98 + 660 + 509 + 2 + 0 + + + 0 + 668 + 464 + 0 + 0 + + + 24 + 601 + 721 + 1 + 1 + + + 0 + 311 + 495 + 0 + 0 + + + 34 + 134 + 696 + 0 + 0 + + + 70 + 153 + 413 + 0 + 0 + + + 70 + 84 + 388 + 0 + 0 + + + 70 + 299 + 312 + 0 + 0 + + + 37 + 721 + 466 + 1 + 0 + + + 4 + 169 + 193 + 0 + 0 + + + 183 + 351 + 703 + 0 + 0 + + + 205 + 187 + 338 + 0 + 0 + + + 1013 + 238 + 137 + 6 + 0 + + + 32 + 469 + 661 + 0 + 0 + + + 36 + 135 + 691 + 0 + 0 + + + 34 + 214 + 436 + 4 + 0 + + + 4 + 59 + 553 + 7 + 0 + + + 402 + 61 + 535 + 0 + 0 + + + 597 + 699 + 531 + 4 + 0 + + + 0 + 664 + 559 + 0 + 0 + + + 676 + 489 + 563 + 2 + 0 + + + 0 + 75 + 435 + 4 + 0 + + + 307 + 540 + 457 + 0 + 0 + + + 284 + 629 + 689 + 0 + 0 + + + 0 + 670 + 554 + 0 + 0 + + + 70 + 128 + 255 + 0 + 0 + + + 0 + 313 + 492 + 0 + 0 + + + 70 + 164 + 384 + 0 + 0 + + + 70 + 279 + 117 + 0 + 0 + + + 70 + 293 + 215 + 0 + 0 + + + 88 + 704 + 654 + 0 + 0 + + + 407 + 712 + 560 + 0 + 0 + + + 597 + 672 + 500 + 6 + 0 + + + 205 + 250 + 252 + 0 + 0 + + + 7 + 442 + 488 + 0 + 0 + + + 70 + 213 + 583 + 6 + 0 + + + 4 + 703 + 655 + 0 + 0 + + + 960 + 636 + 724 + 0 + 0 + + + 284 + 655 + 703 + 2 + 0 + + + 164 + 495 + 556 + 1 + 1 + + + 113 + 476 + 706 + 0 + 0 + + + 70 + 178 + 354 + 0 + 0 + + + 13 + 518 + 476 + 6 + 0 + + + 400 + 531 + 751 + 1 + 0 + + + 139 + 550 + 611 + 4 + 0 + + + 306 + 677 + 548 + 1 + 0 + + + 419 + 690 + 449 + 2 + 0 + + + 1 + 70 + 467 + 1 + 0 + + + 284 + 469 + 460 + 2 + 0 + + + 70 + 251 + 372 + 0 + 0 + + + 36 + 133 + 702 + 6 + 0 + + + 4 + 189 + 173 + 0 + 0 + + + 284 + 644 + 715 + 0 + 0 + + + 402 + 487 + 690 + 3 + 0 + + + 1 + 195 + 637 + 0 + 1 + + + 284 + 626 + 692 + 2 + 0 + + + 4 + 218 + 150 + 0 + 0 + + + 597 + 672 + 461 + 6 + 0 + + + 3 + 453 + 684 + 0 + 0 + + + 70 + 112 + 292 + 0 + 0 + + + 29 + 121 + 521 + 2 + 0 + + + 1 + 462 + 467 + 0 + 0 + + + 0 + 317 + 486 + 0 + 0 + + + 1 + 145 + 644 + 0 + 0 + + + 70 + 303 + 410 + 0 + 0 + + + 98 + 659 + 510 + 2 + 0 + + + 284 + 639 + 678 + 0 + 0 + + + 0 + 764 + 522 + 3 + 0 + + + 1010 + 232 + 141 + 0 + 0 + + + 1013 + 237 + 138 + 6 + 0 + + + 70 + 174 + 188 + 0 + 0 + + + 70 + 325 + 194 + 0 + 0 + + + 72 + 203 + 612 + 3 + 0 + + + 0 + 628 + 635 + 6 + 0 + + + 38 + 170 + 371 + 0 + 0 + + + 205 + 238 + 265 + 0 + 0 + + + 24 + 600 + 722 + 2 + 1 + + + 1 + 459 + 675 + 1 + 1 + + + 1 + 372 + 580 + 1 + 1 + + + 70 + 214 + 153 + 0 + 0 + + + 1 + 491 + 561 + 0 + 0 + + + 1 + 444 + 486 + 1 + 1 + + + 1011 + 239 + 137 + 6 + 0 + + + 36 + 346 + 533 + 0 + 0 + + + 1 + 129 + 489 + 0 + 0 + + + 192 + 619 + 543 + 0 + 0 + + + 38 + 67 + 489 + 1 + 0 + + + 145 + 511 + 539 + 0 + 0 + + + 20 + 580 + 747 + 0 + 0 + + + 70 + 182 + 180 + 0 + 0 + + + 70 + 215 + 577 + 6 + 0 + + + 1 + 637 + 723 + 6 + 0 + + + 25 + 134 + 473 + 6 + 0 + + + 1 + 139 + 456 + 3 + 1 + + + 34 + 390 + 705 + 0 + 0 + + + 70 + 272 + 233 + 0 + 0 + + + 70 + 221 + 146 + 0 + 0 + + + 36 + 596 + 564 + 6 + 0 + + + 70 + 109 + 296 + 0 + 0 + + + 1012 + 239 + 135 + 6 + 0 + + + 597 + 752 + 447 + 2 + 0 + + + 306 + 566 + 548 + 0 + 0 + + + 72 + 203 + 611 + 3 + 0 + + + 46 + 536 + 513 + 0 + 0 + + + 38 + 96 + 336 + 0 + 0 + + + 1 + 261 + 358 + 1 + 1 + + + 70 + 304 + 408 + 0 + 0 + + + 284 + 632 + 686 + 2 + 0 + + + 205 + 250 + 374 + 0 + 0 + + + 1 + 286 + 646 + 0 + 0 + + + 70 + 302 + 210 + 0 + 0 + + + 70 + 299 + 415 + 0 + 0 + + + 55 + 651 + 666 + 4 + 0 + + + 284 + 658 + 700 + 0 + 0 + + + 55 + 653 + 664 + 4 + 0 + + + 59 + 152 + 615 + 2 + 0 + + + 284 + 646 + 713 + 0 + 0 + + + 1009 + 229 + 141 + 4 + 0 + + + 70 + 92 + 351 + 0 + 0 + + + 22 + 652 + 665 + 4 + 0 + + + 12 + 520 + 474 + 6 + 0 + + + 38 + 290 + 428 + 0 + 0 + + + 0 + 216 + 433 + 4 + 0 + + + 1 + 262 + 357 + 0 + 1 + + + 70 + 165 + 196 + 0 + 0 + + + 33 + 447 + 694 + 4 + 0 + + + 323 + 566 + 594 + 0 + 0 + + + 24 + 122 + 520 + 0 + 0 + + + 51 + 281 + 2954 + 0 + 0 + + + 961 + 638 + 722 + 0 + 0 + + + 70 + 118 + 274 + 0 + 0 + + + 205 + 315 + 394 + 0 + 0 + + + 3 + 615 + 749 + 0 + 0 + + + 6 + 533 + 516 + 4 + 0 + + + 70 + 236 + 269 + 0 + 0 + + + 1 + 307 + 602 + 2 + 0 + + + 4 + 114 + 284 + 0 + 0 + + + 29 + 438 + 493 + 0 + 0 + + + 72 + 557 + 557 + 3 + 0 + + + 70 + 297 + 418 + 0 + 0 + + + 4 + 175 + 185 + 0 + 0 + + + 38 + 119 + 272 + 0 + 0 + + + 72 + 559 + 555 + 3 + 0 + + + 72 + 555 + 559 + 3 + 0 + + + 1 + 129 + 492 + 0 + 0 + + + 284 + 634 + 684 + 0 + 0 + + + 306 + 673 + 461 + 4 + 0 + + + 46 + 530 + 519 + 0 + 0 + + + 70 + 268 + 236 + 0 + 0 + + + 397 + 532 + 749 + 1 + 0 + + + 70 + 251 + 252 + 0 + 0 + + + 30 + 126 + 502 + 0 + 0 + + + 1 + 315 + 586 + 2 + 0 + + + 4 + 256 + 247 + 0 + 0 + + + 404 + 477 + 705 + 2 + 0 + + + 70 + 85 + 381 + 0 + 0 + + + 34 + 596 + 622 + 2 + 0 + + + 284 + 482 + 448 + 2 + 0 + + + 1 + 614 + 649 + 3 + 0 + + + 16 + 121 + 523 + 0 + 0 + + + 597 + 749 + 449 + 2 + 0 + + + 29 + 345 + 714 + 0 + 0 + + + 23 + 637 + 582 + 0 + 0 + + + 1018 + 230 + 141 + 4 + 0 + + + 37 + 191 + 649 + 0 + 0 + + + 284 + 630 + 688 + 2 + 0 + + + 70 + 102 + 318 + 0 + 0 + + + 284 + 645 + 672 + 0 + 0 + + + 63 + 523 + 471 + 2 + 0 + + + 205 + 303 + 309 + 0 + 0 + + + 151 + 606 + 454 + 4 + 0 + + + 284 + 639 + 721 + 2 + 0 + + + 70 + 107 + 303 + 0 + 0 + + + 70 + 190 + 333 + 0 + 0 + + + 70 + 222 + 285 + 0 + 0 + + + 4 + 151 + 419 + 0 + 0 + + + 32 + 56 + 579 + 0 + 0 + + + 33 + 593 + 835 + 6 + 0 + + + 284 + 648 + 711 + 2 + 0 + + + 68 + 114 + 555 + 3 + 0 + + + 0 + 189 + 656 + 0 + 0 + + + 597 + 685 + 491 + 0 + 0 + + + 597 + 746 + 497 + 2 + 0 + + + 34 + 683 + 454 + 3 + 0 + + + 3 + 454 + 683 + 0 + 0 + + + 207 + 308 + 304 + 0 + 0 + + + 70 + 300 + 211 + 0 + 0 + + + 70 + 122 + 266 + 0 + 0 + + + 70 + 275 + 118 + 0 + 0 + + + 70 + 104 + 312 + 0 + 0 + + + 70 + 196 + 323 + 0 + 0 + + + 20 + 130 + 487 + 0 + 0 + + + 0 + 700 + 443 + 3 + 0 + + + 399 + 530 + 752 + 1 + 0 + + + 15 + 214 + 2583 + 6 + 0 + + + 205 + 619 + 501 + 0 + 0 + + + 70 + 129 + 252 + 0 + 0 + + + 205 + 258 + 126 + 0 + 0 + + + 36 + 354 + 696 + 0 + 0 + + + 1018 + 239 + 136 + 2 + 0 + + + 1 + 73 + 445 + 0 + 0 + + + 72 + 200 + 620 + 3 + 0 + + + 1 + 285 + 648 + 0 + 0 + + + 70 + 203 + 160 + 0 + 0 + + + 34 + 145 + 646 + 1 + 0 + + + 0 + 720 + 515 + 1 + 0 + + + 70 + 171 + 190 + 0 + 0 + + + 1 + 73 + 439 + 0 + 0 + + + 3 + 450 + 3372 + 0 + 0 + + + 1 + 59 + 543 + 0 + 0 + + + 284 + 638 + 680 + 2 + 0 + + + 63 + 131 + 478 + 6 + 0 + + + 676 + 488 + 563 + 2 + 0 + + + 70 + 104 + 308 + 0 + 0 + + + 72 + 204 + 612 + 3 + 0 + + + 284 + 655 + 702 + 2 + 0 + + + 72 + 203 + 615 + 3 + 0 + + + 0 + 144 + 435 + 0 + 0 + + + 3 + 453 + 683 + 0 + 0 + + + 1009 + 227 + 141 + 4 + 0 + + + 70 + 200 + 313 + 0 + 0 + + + 598 + 291 + 110 + 0 + 0 + + + 5 + 119 + 526 + 0 + 0 + + + 70 + 321 + 195 + 0 + 0 + + + 4 + 291 + 322 + 0 + 0 + + + 117 + 600 + 723 + 2 + 0 + + + 1010 + 239 + 134 + 2 + 0 + + + 30 + 124 + 505 + 2 + 0 + + + 0 + 142 + 441 + 0 + 0 + + + 445 + 660 + 563 + 6 + 0 + + + 70 + 330 + 284 + 0 + 0 + + + 0 + 149 + 629 + 0 + 0 + + + 1 + 61 + 525 + 1 + 0 + + + 306 + 735 + 543 + 0 + 0 + + + 70 + 316 + 395 + 0 + 0 + + + 306 + 746 + 535 + 0 + 0 + + + 284 + 657 + 700 + 0 + 0 + + + 1 + 252 + 613 + 0 + 0 + + + 597 + 700 + 531 + 4 + 0 + + + 32 + 444 + 697 + 4 + 0 + + + 191 + 104 + 603 + 0 + 0 + + + 34 + 615 + 805 + 5 + 0 + + + 706 + 292 + 110 + 0 + 0 + + + 284 + 645 + 713 + 0 + 0 + + + 3 + 614 + 749 + 0 + 0 + + + 1 + 265 + 583 + 0 + 0 + + + 20 + 226 + 3517 + 0 + 0 + + + 70 + 328 + 286 + 0 + 0 + + + 70 + 257 + 244 + 0 + 0 + + + 205 + 327 + 382 + 0 + 0 + + + 34 + 387 + 710 + 0 + 0 + + + 284 + 627 + 692 + 0 + 0 + + + 70 + 321 + 389 + 0 + 0 + + + 205 + 84 + 382 + 0 + 0 + + + 214 + 122 + 263 + 4 + 0 + + + 80 + 459 + 674 + 0 + 1 + + + 38 + 294 + 319 + 0 + 0 + + + 70 + 233 + 536 + 0 + 0 + + + 70 + 80 + 401 + 0 + 0 + + + 13 + 525 + 469 + 7 + 0 + + + 34 + 700 + 707 + 2 + 0 + + + 34 + 111 + 563 + 7 + 0 + + + 70 + 187 + 172 + 0 + 0 + + + 215 + 120 + 268 + 2 + 0 + + + 37 + 126 + 496 + 0 + 0 + + + 205 + 96 + 335 + 0 + 0 + + + 1 + 701 + 706 + 2 + 0 + + + 183 + 351 + 701 + 0 + 0 + + + 597 + 746 + 498 + 2 + 0 + + + 70 + 234 + 533 + 0 + 0 + + + 51 + 709 + 698 + 2 + 0 + + + 3 + 281 + 550 + 2 + 0 + + + 0 + 588 + 526 + 0 + 0 + + + 425 + 695 + 445 + 6 + 0 + + + 1 + 72 + 447 + 0 + 0 + + + 284 + 624 + 695 + 2 + 0 + + + 70 + 322 + 194 + 0 + 0 + + + 34 + 135 + 695 + 0 + 0 + + + 0 + 588 + 679 + 0 + 0 + + + 36 + 740 + 502 + 7 + 0 + + + 1 + 453 + 475 + 0 + 0 + + + 1 + 119 + 525 + 0 + 1 + + + 70 + 104 + 309 + 0 + 0 + + + 37 + 58 + 554 + 7 + 0 + + + 36 + 353 + 697 + 0 + 0 + + + 404 + 478 + 704 + 2 + 0 + + + 183 + 348 + 707 + 0 + 0 + + + 1012 + 228 + 141 + 4 + 0 + + + 70 + 209 + 299 + 0 + 0 + + + 398 + 632 + 783 + 3 + 0 + + + 70 + 262 + 123 + 0 + 0 + + + 4 + 160 + 391 + 0 + 0 + + + 284 + 469 + 459 + 2 + 0 + + + 598 + 293 + 110 + 0 + 0 + + + 0 + 697 + 660 + 0 + 0 + + + 38 + 193 + 167 + 0 + 0 + + + 205 + 167 + 193 + 0 + 0 + + + 70 + 287 + 218 + 0 + 0 + + + 0 + 71 + 454 + 0 + 0 + + + 394 + 490 + 687 + 1 + 0 + + + 285 + 631 + 729 + 2 + 0 + + + 70 + 305 + 308 + 0 + 0 + + + 36 + 134 + 701 + 6 + 0 + + + 70 + 331 + 377 + 0 + 0 + + + 70 + 183 + 342 + 0 + 0 + + + 34 + 683 + 544 + 1 + 0 + + + 284 + 625 + 694 + 0 + 0 + + + 4 + 185 + 338 + 0 + 0 + + + 0 + 189 + 660 + 0 + 0 + + + 205 + 147 + 219 + 0 + 0 + + + 1 + 73 + 441 + 0 + 0 + + + 112 + 423 + 3523 + 0 + 0 + + + 63 + 550 + 612 + 4 + 0 + + + 283 + 471 + 457 + 0 + 0 + + + 597 + 680 + 495 + 2 + 0 + + + 70 + 115 + 280 + 0 + 0 + + + 4 + 313 + 300 + 0 + 0 + + + 284 + 636 + 682 + 2 + 0 + + + 960 + 638 + 721 + 0 + 0 + + + 20 + 583 + 744 + 0 + 0 + + + 525 + 703 + 440 + 0 + 0 + + + 70 + 89 + 362 + 0 + 0 + + + 70 + 186 + 171 + 0 + 0 + + + 0 + 665 + 744 + 7 + 0 + + + 205 + 212 + 150 + 0 + 0 + + + 70 + 100 + 318 + 0 + 0 + + + 70 + 265 + 120 + 0 + 0 + + + 597 + 672 + 501 + 6 + 0 + + + 1 + 562 + 551 + 1 + 1 + + + 0 + 761 + 488 + 3 + 0 + + + 70 + 284 + 331 + 0 + 0 + + + 1010 + 239 + 133 + 2 + 0 + + + 0 + 591 + 524 + 0 + 0 + + + 50 + 655 + 567 + 0 + 0 + + + 70 + 223 + 282 + 0 + 0 + + + 70 + 229 + 544 + 0 + 0 + + + 72 + 556 + 557 + 3 + 0 + + + 72 + 558 + 555 + 3 + 0 + + + 284 + 639 + 720 + 2 + 0 + + + 284 + 648 + 710 + 2 + 0 + + + 72 + 554 + 559 + 3 + 0 + + + 34 + 343 + 717 + 0 + 0 + + + 36 + 136 + 691 + 0 + 0 + + + 1 + 249 + 619 + 0 + 0 + + + 38 + 89 + 357 + 0 + 0 + + + 7 + 454 + 682 + 4 + 0 + + + 34 + 185 + 508 + 0 + 0 + + + 1170 + 512 + 536 + 2 + 0 + + + 1 + 608 + 656 + 3 + 0 + + + 1 + 486 + 506 + 0 + 0 + + + 70 + 472 + 521 + 2 + 0 + + + 284 + 630 + 689 + 2 + 0 + + + 34 + 135 + 696 + 0 + 0 + + + 0 + 584 + 683 + 4 + 0 + + + 306 + 731 + 508 + 1 + 0 + + + 1 + 72 + 441 + 0 + 0 + + + 405 + 529 + 754 + 1 + 0 + + + 70 + 219 + 287 + 0 + 0 + + + 209 + 219 + 429 + 3 + 0 + + + 284 + 649 + 709 + 0 + 0 + + + 205 + 636 + 584 + 2 + 0 + + + 1018 + 226 + 141 + 4 + 0 + + + 70 + 108 + 295 + 0 + 0 + + + 70 + 151 + 417 + 0 + 0 + + + 1 + 291 + 530 + 4 + 0 + + + 70 + 245 + 130 + 0 + 0 + + + 37 + 587 + 843 + 6 + 0 + + + 72 + 203 + 614 + 3 + 0 + + + 1 + 353 + 525 + 0 + 0 + + + 72 + 204 + 611 + 3 + 0 + + + 113 + 477 + 706 + 0 + 0 + + + 0 + 150 + 627 + 0 + 0 + + + 0 + 335 + 643 + 0 + 0 + + + 34 + 737 + 504 + 3 + 0 + + + 34 + 617 + 802 + 4 + 0 + + + 145 + 515 + 533 + 4 + 0 + + + 45 + 533 + 515 + 4 + 0 + + + 79 + 456 + 679 + 1 + 1 + + + 0 + 717 + 518 + 0 + 0 + + + 310 + 734 + 506 + 0 + 0 + + + 38 + 155 + 406 + 0 + 0 + + + 284 + 646 + 672 + 0 + 0 + + + 665 + 292 + 109 + 2 + 0 + + + 1 + 145 + 434 + 2 + 0 + + + 16 + 121 + 520 + 0 + 0 + + + 1 + 186 + 670 + 0 + 0 + + + 45 + 532 + 516 + 6 + 0 + + + 377 + 488 + 690 + 1 + 0 + + + 1 + 146 + 644 + 0 + 0 + + + 306 + 694 + 663 + 4 + 0 + + + 51 + 714 + 693 + 0 + 0 + + + 383 + 606 + 453 + 2 + 0 + + + 34 + 596 + 772 + 3 + 0 + + + 70 + 105 + 303 + 0 + 0 + + + 34 + 59 + 541 + 7 + 0 + + + 0 + 331 + 651 + 0 + 0 + + + 70 + 215 + 292 + 0 + 0 + + + 1 + 305 + 607 + 2 + 0 + + + 1 + 62 + 515 + 1 + 0 + + + 597 + 686 + 491 + 0 + 0 + + + 36 + 136 + 692 + 0 + 0 + + + 34 + 190 + 655 + 1 + 0 + + + 191 + 568 + 545 + 2 + 0 + + + 34 + 173 + 544 + 4 + 0 + + + 34 + 394 + 697 + 0 + 0 + + + 37 + 584 + 847 + 6 + 0 + + + 34 + 616 + 803 + 1 + 0 + + + 284 + 482 + 447 + 2 + 0 + + + 284 + 640 + 678 + 0 + 0 + + + 34 + 525 + 523 + 0 + 0 + + + 1 + 287 + 645 + 0 + 0 + + + 284 + 640 + 719 + 0 + 0 + + + 0 + 301 + 615 + 2 + 0 + + + 72 + 203 + 613 + 3 + 0 + + + 1 + 274 + 563 + 0 + 1 + + + 24 + 601 + 722 + 3 + 1 + + + 38 + 221 + 563 + 6 + 0 + + + 34 + 205 + 459 + 0 + 0 + + + 205 + 608 + 757 + 3 + 0 + + + 445 + 623 + 596 + 0 + 0 + + + 306 + 689 + 668 + 4 + 0 + + + 70 + 154 + 408 + 0 + 0 + + + 284 + 651 + 707 + 0 + 0 + + + 0 + 70 + 457 + 0 + 0 + + + 37 + 643 + 675 + 5 + 0 + + + 70 + 124 + 258 + 0 + 0 + + + 4 + 197 + 319 + 0 + 0 + + + 192 + 757 + 445 + 0 + 0 + + + 1 + 72 + 444 + 0 + 0 + + + 1 + 582 + 532 + 2 + 0 + + + 209 + 74 + 432 + 1 + 0 + + + 284 + 669 + 688 + 0 + 0 + + + 400 + 530 + 753 + 1 + 0 + + + 45 + 602 + 721 + 2 + 0 + + + 205 + 246 + 130 + 0 + 0 + + + 0 + 685 + 452 + 3 + 0 + + + 70 + 157 + 400 + 0 + 0 + + + 284 + 667 + 690 + 0 + 0 + + + 70 + 188 + 170 + 0 + 0 + + + 70 + 164 + 383 + 0 + 0 + + + 284 + 642 + 676 + 0 + 0 + + + 71 + 441 + 702 + 2 + 0 + + + 1 + 69 + 463 + 0 + 0 + + + 205 + 604 + 762 + 5 + 0 + + + 1 + 71 + 450 + 0 + 0 + + + 34 + 596 + 830 + 7 + 0 + + + 1 + 352 + 526 + 0 + 0 + + + 938 + 690 + 629 + 0 + 0 + + + 283 + 664 + 745 + 5 + 0 + + + 70 + 312 + 399 + 0 + 0 + + + 0 + 252 + 494 + 0 + 0 + + + 34 + 193 + 639 + 1 + 0 + + + 718 + 739 + 456 + 0 + 0 + + + 97 + 630 + 785 + 0 + 0 + + + 12 + 526 + 471 + 6 + 0 + + + 278 + 557 + 605 + 6 + 0 + + + 0 + 622 + 500 + 0 + 0 + + + 0 + 756 + 526 + 3 + 0 + + + 7 + 454 + 685 + 0 + 0 + + + 1 + 461 + 470 + 0 + 0 + + + 5 + 443 + 702 + 0 + 0 + + + 4 + 662 + 509 + 6 + 0 + + + 1012 + 224 + 141 + 4 + 0 + + + 395 + 476 + 708 + 1 + 0 + + + 313 + 714 + 472 + 3 + 0 + + + 428 + 715 + 435 + 2 + 0 + + + 285 + 500 + 674 + 1 + 0 + + + 0 + 142 + 438 + 0 + 0 + + + 1 + 598 + 723 + 1 + 0 + + + 70 + 236 + 391 + 0 + 0 + + + 308 + 638 + 720 + 0 + 0 + + + 72 + 199 + 620 + 7 + 0 + + + 164 + 731 + 461 + 2 + 0 + + + 306 + 717 + 470 + 2 + 0 + + + 960 + 625 + 735 + 0 + 0 + + + 4 + 320 + 194 + 0 + 0 + + + 0 + 723 + 466 + 7 + 0 + + + 394 + 482 + 699 + 2 + 0 + + + 38 + 100 + 315 + 0 + 0 + + + 70 + 177 + 178 + 0 + 0 + + + 34 + 505 + 547 + 0 + 0 + + + 70 + 207 + 300 + 0 + 0 + + + 20 + 610 + 610 + 0 + 0 + + + 70 + 104 + 303 + 0 + 0 + + + 597 + 752 + 448 + 2 + 0 + + + 3 + 138 + 668 + 0 + 0 + + + 0 + 617 + 504 + 0 + 0 + + + 70 + 300 + 411 + 0 + 0 + + + 1 + 457 + 474 + 0 + 0 + + + 3 + 119 + 522 + 0 + 0 + + + 36 + 352 + 527 + 0 + 0 + + + 70 + 177 + 351 + 0 + 0 + + + 6 + 223 + 553 + 0 + 0 + + + 34 + 346 + 716 + 0 + 0 + + + 34 + 450 + 691 + 6 + 0 + + + 209 + 73 + 432 + 6 + 0 + + + 284 + 632 + 684 + 2 + 0 + + + 8 + 443 + 489 + 0 + 0 + + + 1018 + 239 + 132 + 2 + 0 + + + 34 + 738 + 539 + 3 + 0 + + + 0 + 674 + 552 + 1 + 0 + + + 530 + 491 + 563 + 2 + 0 + + + 0 + 67 + 473 + 0 + 0 + + + 70 + 89 + 356 + 0 + 0 + + + 7 + 280 + 440 + 0 + 0 + + + 72 + 200 + 616 + 3 + 0 + + + 70 + 296 + 312 + 0 + 0 + + + 70 + 229 + 538 + 0 + 0 + + + 20 + 281 + 2959 + 0 + 0 + + + 0 + 510 + 542 + 2 + 0 + + + 223 + 274 + 566 + 6 + 0 + + + 34 + 632 + 727 + 0 + 0 + + + 1 + 141 + 440 + 0 + 0 + + + 101 + 565 + 704 + 0 + 0 + + + 1 + 611 + 651 + 3 + 0 + + + 283 + 600 + 824 + 0 + 0 + + + 0 + 57 + 556 + 7 + 0 + + + 394 + 483 + 698 + 2 + 0 + + + 1010 + 225 + 141 + 0 + 0 + + + 215 + 122 + 260 + 3 + 0 + + + 37 + 281 + 552 + 2 + 0 + + + 70 + 277 + 224 + 0 + 0 + + + 8 + 600 + 663 + 2 + 0 + + + 1 + 560 + 602 + 0 + 0 + + + 20 + 280 + 554 + 0 + 0 + + + 3 + 599 + 519 + 7 + 0 + + + 1 + 444 + 700 + 1 + 1 + + + 0 + 317 + 489 + 0 + 0 + + + 72 + 556 + 559 + 3 + 0 + + + 70 + 243 + 255 + 0 + 0 + + + 38 + 153 + 405 + 0 + 0 + + + 164 + 495 + 558 + 1 + 1 + + + 0 + 645 + 670 + 0 + 0 + + + 0 + 767 + 485 + 3 + 0 + + + 72 + 558 + 557 + 3 + 0 + + + 597 + 749 + 450 + 2 + 0 + + + 70 + 204 + 155 + 0 + 0 + + + 0 + 206 + 448 + 0 + 0 + + + 0 + 157 + 588 + 0 + 0 + + + 0 + 319 + 486 + 0 + 0 + + + 1 + 310 + 598 + 2 + 0 + + + 284 + 639 + 719 + 0 + 0 + + + 284 + 630 + 686 + 2 + 0 + + + 38 + 332 + 371 + 0 + 0 + + + 284 + 648 + 709 + 0 + 0 + + + 1 + 543 + 509 + 0 + 0 + + + 2 + 278 + 443 + 0 + 1 + + + 70 + 232 + 531 + 0 + 0 + + + 23 + 292 + 531 + 4 + 0 + + + 1 + 69 + 459 + 0 + 0 + + + 72 + 199 + 619 + 3 + 0 + + + 1 + 309 + 600 + 2 + 0 + + + 192 + 651 + 518 + 6 + 0 + + + 284 + 668 + 688 + 0 + 0 + + + 0 + 323 + 479 + 0 + 0 + + + 284 + 641 + 717 + 0 + 0 + + + 0 + 69 + 454 + 0 + 0 + + + 34 + 58 + 540 + 7 + 0 + + + 1 + 72 + 435 + 0 + 0 + + + 192 + 658 + 473 + 0 + 0 + + + 70 + 258 + 477 + 6 + 0 + + + 283 + 687 + 669 + 4 + 0 + + + 22 + 120 + 520 + 0 + 0 + + + 191 + 104 + 600 + 0 + 0 + + + 1009 + 239 + 131 + 2 + 0 + + + 284 + 482 + 450 + 2 + 0 + + + 70 + 293 + 213 + 0 + 0 + + + 1011 + 222 + 141 + 4 + 0 + + + 0 + 68 + 461 + 0 + 0 + + + 307 + 354 + 525 + 0 + 0 + + + 70 + 275 + 114 + 0 + 0 + + + 284 + 670 + 686 + 0 + 0 + + + 191 + 568 + 548 + 2 + 0 + + + 38 + 186 + 662 + 0 + 0 + + + 70 + 211 + 296 + 0 + 0 + + + 70 + 84 + 373 + 0 + 0 + + + 36 + 356 + 522 + 0 + 0 + + + 36 + 348 + 534 + 0 + 0 + + + 284 + 671 + 685 + 2 + 0 + + + 38 + 229 + 404 + 0 + 0 + + + 37 + 730 + 462 + 7 + 0 + + + 1 + 604 + 658 + 2 + 0 + + + 306 + 756 + 492 + 3 + 0 + + + 70 + 233 + 268 + 0 + 0 + + + 20 + 493 + 560 + 0 + 0 + + + 34 + 585 + 845 + 6 + 0 + + + 10 + 517 + 534 + 5 + 0 + + + 264 + 461 + 675 + 2 + 0 + + + 183 + 351 + 705 + 0 + 0 + + + 68 + 114 + 547 + 1 + 0 + + + 183 + 354 + 699 + 0 + 0 + + + 37 + 489 + 506 + 0 + 0 + + + 525 + 690 + 451 + 2 + 0 + + + 399 + 481 + 701 + 2 + 0 + + + 284 + 666 + 690 + 0 + 0 + + + 1 + 657 + 566 + 0 + 1 + + + 284 + 650 + 707 + 0 + 0 + + + 205 + 73 + 428 + 0 + 0 + + + 25 + 453 + 687 + 0 + 0 + + + 1 + 617 + 644 + 3 + 0 + + + 15 + 459 + 678 + 6 + 0 + + + 0 + 633 + 726 + 0 + 0 + + + 164 + 403 + 461 + 0 + 0 + + + 4 + 83 + 377 + 0 + 0 + + + 70 + 475 + 521 + 2 + 0 + + + 1 + 57 + 549 + 0 + 0 + + + 1 + 500 + 552 + 6 + 0 + + + 34 + 126 + 495 + 1 + 0 + + + 284 + 638 + 678 + 0 + 0 + + + 23 + 639 + 582 + 0 + 0 + + + 1 + 144 + 642 + 0 + 0 + + + 70 + 184 + 339 + 0 + 0 + + + 70 + 281 + 222 + 0 + 0 + + + 284 + 626 + 691 + 2 + 0 + + + 70 + 78 + 401 + 0 + 0 + + + 37 + 281 + 551 + 2 + 0 + + + 597 + 672 + 502 + 6 + 0 + + + 1010 + 223 + 141 + 0 + 0 + + + 38 + 295 + 314 + 0 + 0 + + + 4 + 131 + 240 + 0 + 0 + + + 1 + 355 + 523 + 0 + 0 + + + 34 + 169 + 548 + 4 + 0 + + + 27 + 709 + 697 + 2 + 0 + + + 0 + 633 + 628 + 6 + 0 + + + 38 + 313 + 199 + 0 + 0 + + + 113 + 603 + 717 + 1 + 1 + + + 313 + 735 + 459 + 3 + 0 + + + 371 + 604 + 716 + 2 + 0 + + + 205 + 270 + 343 + 0 + 0 + + + 46 + 710 + 696 + 0 + 0 + + + 46 + 130 + 479 + 4 + 0 + + + 209 + 216 + 429 + 2 + 0 + + + 1 + 68 + 463 + 0 + 0 + + + 597 + 672 + 463 + 6 + 0 + + + 70 + 324 + 286 + 0 + 0 + + + 72 + 200 + 615 + 3 + 0 + + + 3 + 237 + 519 + 1 + 0 + + + 0 + 686 + 542 + 1 + 0 + + + 34 + 61 + 516 + 1 + 0 + + + 284 + 636 + 680 + 2 + 0 + + + 407 + 715 + 556 + 0 + 0 + + + 1 + 201 + 461 + 0 + 0 + + + 284 + 643 + 715 + 0 + 0 + + + 0 + 609 + 554 + 6 + 0 + + + 72 + 199 + 618 + 7 + 0 + + + 70 + 276 + 114 + 0 + 0 + + + 205 + 203 + 155 + 0 + 0 + + + 70 + 260 + 121 + 0 + 0 + + + 70 + 286 + 110 + 0 + 0 + + + 34 + 449 + 693 + 6 + 0 + + + 70 + 176 + 354 + 0 + 0 + + + 5 + 139 + 666 + 0 + 0 + + + 70 + 222 + 417 + 0 + 0 + + + 34 + 726 + 512 + 3 + 0 + + + 597 + 720 + 432 + 4 + 0 + + + 3 + 119 + 523 + 0 + 0 + + + 597 + 680 + 496 + 2 + 0 + + + 51 + 604 + 761 + 4 + 0 + + + 284 + 634 + 682 + 0 + 0 + + + 461 + 659 + 472 + 4 + 0 + + + 38 + 202 + 308 + 0 + 0 + + + 70 + 299 + 411 + 0 + 0 + + + 70 + 192 + 324 + 0 + 0 + + + 70 + 162 + 384 + 0 + 0 + + + 70 + 196 + 160 + 0 + 0 + + + 283 + 665 + 743 + 5 + 0 + + + 70 + 123 + 255 + 0 + 0 + + + 0 + 345 + 538 + 0 + 0 + + + 0 + 68 + 462 + 0 + 0 + + + 597 + 687 + 491 + 0 + 0 + + + 70 + 187 + 333 + 0 + 0 + + + 216 + 119 + 264 + 7 + 0 + + + 0 + 510 + 485 + 0 + 0 + + + 34 + 664 + 508 + 0 + 0 + + + 34 + 760 + 523 + 3 + 0 + + + 4 + 104 + 302 + 0 + 0 + + + 164 + 401 + 463 + 0 + 0 + + + 36 + 491 + 687 + 6 + 0 + + + 32 + 465 + 669 + 0 + 0 + + + 46 + 712 + 694 + 0 + 0 + + + 70 + 299 + 105 + 0 + 0 + + + 284 + 624 + 693 + 2 + 0 + + + 4 + 193 + 161 + 0 + 0 + + + 37 + 57 + 545 + 7 + 0 + + + 0 + 678 + 458 + 3 + 0 + + + 1012 + 239 + 130 + 6 + 0 + + + 962 + 631 + 783 + 2 + 0 + + + 26 + 473 + 457 + 2 + 0 + + + 70 + 210 + 148 + 0 + 0 + + + 0 + 521 + 596 + 0 + 0 + + + 1013 + 222 + 140 + 4 + 0 + + + 70 + 282 + 329 + 0 + 0 + + + 673 + 296 + 105 + 4 + 0 + + + 284 + 665 + 690 + 0 + 0 + + + 20 + 610 + 611 + 4 + 0 + + + 1 + 183 + 677 + 0 + 0 + + + 205 + 146 + 213 + 0 + 0 + + + 70 + 236 + 525 + 0 + 0 + + + 60 + 105 + 587 + 0 + 0 + + + 70 + 235 + 527 + 0 + 0 + + + 0 + 630 + 632 + 6 + 0 + + + 4 + 192 + 321 + 0 + 0 + + + 597 + 616 + 802 + 2 + 0 + + + 286 + 500 + 675 + 1 + 0 + + + 306 + 675 + 500 + 1 + 0 + + + 307 + 547 + 452 + 0 + 0 + + + 396 + 487 + 693 + 5 + 0 + + + 0 + 629 + 633 + 6 + 0 + + + 70 + 322 + 288 + 0 + 0 + + + 8 + 442 + 489 + 2 + 0 + + + 284 + 649 + 707 + 0 + 0 + + + 1 + 252 + 617 + 0 + 0 + + + 89 + 328 + 659 + 4 + 0 + + + 70 + 167 + 186 + 0 + 0 + + + 597 + 672 + 462 + 6 + 0 + + + 679 + 496 + 556 + 4 + 0 + + + 0 + 747 + 533 + 3 + 0 + + + 1 + 324 + 667 + 0 + 1 + + + 214 + 114 + 272 + 4 + 0 + + + 4 + 275 + 224 + 0 + 0 + + + 4 + 200 + 308 + 0 + 0 + + + 207 + 308 + 301 + 0 + 0 + + + 70 + 136 + 228 + 0 + 0 + + + 1 + 68 + 456 + 0 + 0 + + + 1 + 146 + 635 + 0 + 0 + + + 205 + 211 + 292 + 0 + 0 + + + 1 + 717 + 689 + 0 + 0 + + + 70 + 110 + 282 + 0 + 0 + + + 70 + 260 + 237 + 0 + 0 + + + 207 + 305 + 304 + 3 + 0 + + + 70 + 305 + 406 + 0 + 0 + + + 70 + 290 + 427 + 0 + 0 + + + 34 + 124 + 497 + 1 + 0 + + + 284 + 630 + 687 + 2 + 0 + + + 37 + 125 + 493 + 0 + 0 + + + 70 + 290 + 107 + 2 + 0 + + + 70 + 332 + 373 + 0 + 0 + + + 43 + 131 + 470 + 4 + 0 + + + 51 + 280 + 2967 + 0 + 0 + + + 37 + 281 + 553 + 2 + 0 + + + 70 + 331 + 280 + 0 + 0 + + + 205 + 139 + 223 + 0 + 0 + + + 284 + 644 + 672 + 0 + 0 + + + 34 + 644 + 482 + 2 + 0 + + + 283 + 644 + 767 + 6 + 0 + + + 72 + 200 + 619 + 7 + 0 + + + 216 + 116 + 269 + 6 + 0 + + + 1 + 612 + 750 + 1 + 1 + + + 1 + 138 + 446 + 0 + 0 + + + 482 + 659 + 471 + 0 + 0 + + + 597 + 752 + 449 + 2 + 0 + + + 7 + 249 + 625 + 4 + 0 + + + 402 + 584 + 741 + 0 + 0 + + + 70 + 319 + 193 + 0 + 0 + + + 1 + 67 + 466 + 0 + 0 + + + 34 + 711 + 524 + 2 + 0 + + + 70 + 247 + 376 + 0 + 0 + + + 0 + 666 + 466 + 0 + 0 + + + 0 + 197 + 628 + 0 + 0 + + + 33 + 124 + 496 + 1 + 0 + + + 284 + 671 + 684 + 2 + 0 + + + 960 + 627 + 732 + 0 + 0 + + + 308 + 685 + 670 + 4 + 0 + + + 1 + 649 + 761 + 7 + 0 + + + 70 + 219 + 565 + 6 + 0 + + + 25 + 129 + 477 + 0 + 0 + + + 597 + 742 + 455 + 4 + 0 + + + 1 + 579 + 536 + 2 + 0 + + + 34 + 765 + 487 + 3 + 0 + + + 12 + 517 + 478 + 6 + 0 + + + 70 + 270 + 344 + 0 + 0 + + + 70 + 175 + 178 + 0 + 0 + + + 6 + 414 + 449 + 2 + 0 + + + 0 + 142 + 433 + 0 + 0 + + + 0 + 726 + 465 + 1 + 0 + + + 58 + 467 + 463 + 6 + 0 + + + 284 + 669 + 686 + 0 + 0 + + + 284 + 628 + 689 + 0 + 0 + + + 405 + 531 + 750 + 0 + 0 + + + 70 + 150 + 410 + 0 + 0 + + + 38 + 164 + 375 + 0 + 0 + + + 0 + 743 + 536 + 3 + 0 + + + 0 + 188 + 658 + 0 + 0 + + + 70 + 147 + 212 + 0 + 0 + + + 676 + 490 + 563 + 2 + 0 + + + 1 + 596 + 770 + 3 + 0 + + + 0 + 750 + 531 + 3 + 0 + + + 164 + 495 + 557 + 1 + 1 + + + 6 + 346 + 625 + 0 + 0 + + + 267 + 451 + 688 + 6 + 0 + + + 70 + 328 + 377 + 0 + 0 + + + 309 + 519 + 476 + 3 + 0 + + + 0 + 69 + 451 + 0 + 0 + + + 0 + 751 + 496 + 3 + 0 + + + 205 + 147 + 418 + 0 + 0 + + + 70 + 266 + 231 + 0 + 0 + + + 205 + 102 + 305 + 0 + 0 + + + 0 + 681 + 547 + 1 + 0 + + + 38 + 151 + 206 + 0 + 0 + + + 284 + 667 + 688 + 0 + 0 + + + 4 + 240 + 256 + 0 + 0 + + + 142 + 276 + 448 + 6 + 0 + + + 143 + 270 + 2947 + 0 + 0 + + + 33 + 90 + 683 + 0 + 0 + + + 4 + 172 + 181 + 0 + 0 + + + 283 + 469 + 461 + 2 + 0 + + + 205 + 463 + 467 + 0 + 0 + + + 36 + 742 + 502 + 7 + 0 + + + 284 + 640 + 676 + 0 + 0 + + + 1 + 508 + 543 + 4 + 0 + + + 1 + 347 + 712 + 0 + 1 + + + 284 + 640 + 717 + 0 + 0 + + + 70 + 117 + 266 + 0 + 0 + + + 34 + 204 + 455 + 0 + 0 + + + 1009 + 239 + 129 + 2 + 0 + + + 284 + 643 + 714 + 2 + 0 + + + 192 + 657 + 473 + 0 + 0 + + + 7 + 455 + 683 + 2 + 0 + + + 0 + 654 + 702 + 0 + 0 + + + 407 + 661 + 602 + 0 + 0 + + + 70 + 178 + 348 + 0 + 0 + + + 15 + 116 + 534 + 0 + 0 + + + 306 + 616 + 646 + 4 + 0 + + + 3 + 450 + 3369 + 0 + 0 + + + 70 + 119 + 259 + 0 + 0 + + + 274 + 484 + 385 + 6 + 0 + + + 1 + 67 + 460 + 0 + 0 + + + 284 + 482 + 449 + 2 + 0 + + + 38 + 187 + 661 + 0 + 0 + + + 1 + 189 + 654 + 0 + 0 + + + 37 + 494 + 500 + 0 + 0 + + + 72 + 200 + 618 + 3 + 0 + + + 37 + 55 + 560 + 7 + 0 + + + 70 + 301 + 309 + 0 + 0 + + + 70 + 204 + 151 + 0 + 0 + + + 0 + 68 + 453 + 0 + 0 + + + 4 + 205 + 302 + 0 + 0 + + + 70 + 145 + 427 + 0 + 0 + + + 143 + 403 + 3505 + 2 + 0 + + + 36 + 344 + 718 + 0 + 0 + + + 280 + 515 + 535 + 2 + 0 + + + 3 + 601 + 517 + 7 + 0 + + + 45 + 534 + 516 + 2 + 0 + + + 284 + 636 + 681 + 2 + 0 + + + 0 + 100 + 619 + 0 + 0 + + + 284 + 624 + 694 + 2 + 0 + + + 1 + 289 + 537 + 4 + 0 + + + 1 + 191 + 647 + 0 + 0 + + + 70 + 135 + 228 + 0 + 0 + + + 70 + 236 + 394 + 0 + 0 + + + 284 + 635 + 682 + 0 + 0 + + + 215 + 703 + 653 + 3 + 0 + + + 70 + 157 + 394 + 0 + 0 + + + 707 + 293 + 105 + 0 + 0 + + + 1 + 203 + 458 + 0 + 0 + + + 217 + 704 + 652 + 4 + 0 + + + 214 + 116 + 265 + 3 + 0 + + + 0 + 652 + 704 + 0 + 0 + + + 70 + 122 + 252 + 0 + 0 + + + 0 + 290 + 535 + 6 + 0 + + + 0 + 316 + 491 + 0 + 0 + + + 284 + 642 + 715 + 0 + 0 + + + 1013 + 221 + 139 + 4 + 0 + + + 70 + 209 + 147 + 0 + 0 + + + 0 + 183 + 675 + 0 + 0 + + + 4 + 80 + 384 + 0 + 0 + + + 70 + 78 + 394 + 0 + 0 + + + 25 + 522 + 473 + 6 + 0 + + + 395 + 586 + 739 + 0 + 0 + + + 284 + 645 + 712 + 2 + 0 + + + 4 + 196 + 158 + 0 + 0 + + + 70 + 281 + 220 + 0 + 0 + + + 29 + 553 + 611 + 6 + 0 + + + 306 + 691 + 489 + 0 + 0 + + + 0 + 101 + 612 + 0 + 0 + + + 36 + 494 + 684 + 1 + 0 + + + 205 + 134 + 231 + 0 + 0 + + + 34 + 190 + 650 + 2 + 0 + + + 283 + 621 + 795 + 0 + 0 + + + 1016 + 221 + 140 + 4 + 0 + + + 191 + 570 + 545 + 2 + 0 + + + 1 + 57 + 543 + 0 + 0 + + + 70 + 270 + 345 + 0 + 0 + + + 70 + 230 + 405 + 0 + 0 + + + 70 + 97 + 319 + 0 + 0 + + + 284 + 656 + 700 + 0 + 0 + + + 0 + 565 + 598 + 0 + 0 + + + 70 + 94 + 329 + 0 + 0 + + + 70 + 175 + 353 + 0 + 0 + + + 608 + 701 + 482 + 0 + 0 + + + 88 + 697 + 571 + 5 + 0 + + + 597 + 746 + 499 + 2 + 0 + + + 70 + 329 + 283 + 0 + 0 + + + 70 + 247 + 250 + 0 + 0 + + + 34 + 125 + 494 + 1 + 0 + + + 34 + 643 + 483 + 5 + 0 + + + 992 + 629 + 730 + 0 + 0 + + + 70 + 324 + 381 + 0 + 0 + + + 6 + 605 + 759 + 2 + 0 + + + 34 + 126 + 490 + 1 + 0 + + + 0 + 669 + 505 + 6 + 0 + + + 59 + 203 + 608 + 2 + 0 + + + 0 + 709 + 525 + 0 + 0 + + + 34 + 519 + 531 + 0 + 0 + + + 281 + 563 + 600 + 0 + 0 + + + 597 + 701 + 531 + 4 + 0 + + + 597 + 749 + 451 + 2 + 0 + + + 70 + 266 + 232 + 0 + 0 + + + 3 + 454 + 684 + 0 + 0 + + + 1016 + 232 + 133 + 6 + 0 + + + 72 + 200 + 617 + 3 + 0 + + + 597 + 688 + 491 + 0 + 0 + + + 284 + 632 + 685 + 2 + 0 + + + 34 + 165 + 564 + 6 + 0 + + + 38 + 215 + 287 + 0 + 0 + + + 283 + 594 + 773 + 0 + 0 + + + 284 + 655 + 701 + 2 + 0 + + + 0 + 185 + 667 + 0 + 0 + + + 618 + 402 + 463 + 0 + 0 + + + 875 + 416 + 165 + 2 + 0 + + + 14 + 223 + 3516 + 0 + 0 + + + 20 + 223 + 3514 + 0 + 0 + + + 20 + 221 + 3517 + 0 + 0 + + + 51 + 220 + 3519 + 6 + 0 + + + 25 + 218 + 3519 + 0 + 0 + + + 25 + 216 + 3519 + 0 + 0 + + + 20 + 223 + 3520 + 0 + 0 + + + 20 + 221 + 3520 + 0 + 0 + + + 51 + 220 + 3521 + 6 + 0 + + + 5 + 218 + 3526 + 0 + 0 + + + 25 + 218 + 3524 + 0 + 0 + + + 25 + 218 + 3522 + 0 + 0 + + + 3 + 218 + 3520 + 0 + 0 + + + 27 + 217 + 3525 + 0 + 0 + + + 23 + 216 + 3522 + 0 + 0 + + + 20 + 226 + 3514 + 0 + 0 + + + 20 + 226 + 3520 + 0 + 0 + + + 21 + 215 + 675 + 0 + 0 + + + 45 + 214 + 679 + 4 + 0 + + + 45 + 214 + 676 + 6 + 0 + + + 45 + 214 + 675 + 6 + 0 + + + 45 + 214 + 674 + 6 + 0 + + + 45 + 214 + 673 + 6 + 0 + + + 45 + 214 + 672 + 6 + 0 + + + 45 + 213 + 679 + 4 + 0 + + + 45 + 212 + 678 + 2 + 0 + + + 45 + 212 + 677 + 2 + 0 + + + 45 + 212 + 673 + 2 + 0 + + + 45 + 212 + 672 + 2 + 0 + + + 21 + 211 + 674 + 4 + 0 + + + 0 + 215 + 686 + 0 + 0 + + + 7 + 211 + 693 + 0 + 0 + + + 47 + 210 + 694 + 0 + 0 + + + 21 + 219 + 677 + 0 + 0 + + + 45 + 218 + 679 + 6 + 0 + + + 45 + 218 + 677 + 6 + 0 + + + 45 + 217 + 677 + 0 + 0 + + + 4 + 219 + 685 + 0 + 0 + + + 21 + 219 + 681 + 0 + 0 + + + 45 + 218 + 682 + 6 + 0 + + + 45 + 218 + 680 + 6 + 0 + + + 45 + 216 + 682 + 2 + 0 + + + 45 + 216 + 680 + 2 + 0 + + + 0 + 221 + 690 + 6 + 0 + + + 6 + 218 + 694 + 4 + 0 + + + 3 + 217 + 695 + 0 + 0 + + + 47 + 216 + 694 + 4 + 0 + + + 3 + 213 + 1635 + 0 + 0 + + + 3 + 213 + 1634 + 0 + 0 + + + 3 + 213 + 1633 + 0 + 0 + + + 7 + 212 + 1634 + 2 + 0 + + + 3 + 210 + 1639 + 0 + 0 + + + 14 + 210 + 1636 + 0 + 0 + + + 20 + 215 + 1642 + 0 + 0 + + + 20 + 215 + 1640 + 0 + 0 + + + 20 + 213 + 1642 + 0 + 0 + + + 20 + 213 + 1640 + 0 + 0 + + + 15 + 218 + 1638 + 0 + 0 + + + 6 + 218 + 1636 + 0 + 0 + + + 25 + 216 + 1639 + 0 + 0 + + + 5 + 216 + 1636 + 0 + 0 + + + 17 + 218 + 1640 + 0 + 0 + + + 25 + 216 + 1642 + 0 + 0 + + + 25 + 213 + 2583 + 0 + 0 + + + 25 + 211 + 2583 + 0 + 0 + + + 51 + 215 + 2585 + 4 + 0 + + + 47 + 218 + 2582 + 4 + 0 + + + 6 + 216 + 2580 + 0 + 0 + + + 21 + 215 + 671 + 0 + 0 + + + 45 + 214 + 671 + 6 + 0 + + + 45 + 214 + 670 + 6 + 0 + + + 45 + 214 + 669 + 6 + 0 + + + 45 + 214 + 668 + 6 + 0 + + + 45 + 214 + 667 + 6 + 0 + + + 45 + 212 + 671 + 2 + 0 + + + 45 + 212 + 670 + 2 + 0 + + + 45 + 212 + 669 + 2 + 0 + + + 45 + 212 + 668 + 2 + 0 + + + 45 + 212 + 667 + 2 + 0 + + + 21 + 211 + 670 + 4 + 0 + + + 193 + 221 + 664 + 4 + 0 + + + 191 + 566 + 554 + 2 + 0 + + + 59 + 564 + 552 + 4 + 0 + + + 72 + 560 + 559 + 3 + 0 + + + 72 + 560 + 557 + 3 + 0 + + + 72 + 560 + 555 + 3 + 0 + + + 51 + 560 + 554 + 4 + 0 + + + 72 + 560 + 567 + 3 + 0 + + + 72 + 560 + 565 + 3 + 0 + + + 72 + 560 + 563 + 3 + 0 + + + 72 + 560 + 561 + 3 + 0 + + + 20 + 566 + 568 + 0 + 0 + + + 20 + 562 + 568 + 0 + 0 + + + 46 + 567 + 581 + 0 + 0 + + + 285 + 567 + 580 + 0 + 0 + + + 37 + 566 + 581 + 0 + 0 + + + 46 + 564 + 581 + 0 + 0 + + + 308 + 563 + 578 + 0 + 0 + + + 46 + 562 + 581 + 0 + 0 + + + 283 + 561 + 581 + 6 + 0 + + + 284 + 561 + 580 + 6 + 0 + + + 284 + 561 + 579 + 6 + 0 + + + 284 + 561 + 578 + 6 + 0 + + + 284 + 561 + 577 + 6 + 0 + + + 285 + 560 + 581 + 6 + 0 + + + 285 + 560 + 578 + 6 + 0 + + + 37 + 560 + 577 + 0 + 0 + + + 331 + 563 + 587 + 0 + 0 + + + 25 + 562 + 591 + 0 + 0 + + + 25 + 562 + 586 + 0 + 0 + + + 6 + 560 + 591 + 0 + 0 + + + 328 + 560 + 588 + 0 + 0 + + + 191 + 572 + 554 + 2 + 0 + + + 191 + 570 + 554 + 2 + 0 + + + 191 + 568 + 554 + 2 + 0 + + + 286 + 569 + 582 + 0 + 0 + + + 306 + 569 + 578 + 0 + 0 + + + 37 + 568 + 582 + 0 + 0 + + + 26 + 571 + 589 + 6 + 0 + + + 37 + 571 + 588 + 0 + 0 + + + 286 + 571 + 587 + 0 + 0 + + + 285 + 571 + 586 + 0 + 0 + + + 23 + 570 + 591 + 0 + 0 + + + 285 + 569 + 588 + 0 + 0 + + + 26 + 568 + 589 + 6 + 0 + + + 37 + 568 + 587 + 0 + 0 + + + 286 + 568 + 586 + 0 + 0 + + + 285 + 568 + 584 + 0 + 0 + + + 4 + 583 + 559 + 6 + 0 + + + 4 + 583 + 556 + 0 + 0 + + + 4 + 582 + 558 + 6 + 0 + + + 4 + 581 + 559 + 6 + 0 + + + 4 + 580 + 554 + 0 + 0 + + + 1 + 580 + 552 + 0 + 0 + + + 4 + 579 + 556 + 0 + 0 + + + 4 + 578 + 557 + 0 + 0 + + + 1 + 577 + 554 + 0 + 0 + + + 8 + 583 + 566 + 0 + 0 + + + 8 + 582 + 566 + 7 + 0 + + + 7 + 582 + 564 + 0 + 0 + + + 3 + 582 + 563 + 4 + 0 + + + 7 + 582 + 562 + 4 + 0 + + + 34 + 581 + 561 + 6 + 0 + + + 4 + 580 + 566 + 6 + 0 + + + 4 + 580 + 563 + 6 + 0 + + + 4 + 579 + 561 + 6 + 0 + + + 4 + 577 + 560 + 0 + 0 + + + 139 + 583 + 571 + 2 + 0 + + + 20 + 582 + 572 + 0 + 0 + + + 20 + 579 + 572 + 6 + 0 + + + 48 + 581 + 581 + 0 + 0 + + + 11 + 581 + 578 + 0 + 0 + + + 23 + 583 + 589 + 2 + 0 + + + 3 + 583 + 587 + 2 + 0 + + + 3 + 583 + 584 + 2 + 0 + + + 23 + 581 + 589 + 2 + 0 + + + 500 + 581 + 587 + 2 + 0 + + + 47 + 581 + 584 + 6 + 0 + + + 7 + 579 + 587 + 2 + 0 + + + 48 + 579 + 584 + 6 + 0 + + + 3 + 578 + 587 + 6 + 0 + + + 19 + 577 + 591 + 2 + 0 + + + 281 + 576 + 586 + 2 + 0 + + + 281 + 576 + 584 + 2 + 0 + + + 4 + 589 + 553 + 0 + 0 + + + 1 + 587 + 554 + 0 + 0 + + + 4 + 585 + 559 + 6 + 0 + + + 406 + 585 + 556 + 1 + 0 + + + 34 + 584 + 557 + 6 + 0 + + + 34 + 590 + 561 + 6 + 0 + + + 4 + 584 + 567 + 6 + 0 + + + 15 + 584 + 561 + 4 + 0 + + + 34 + 590 + 572 + 6 + 0 + + + 20 + 589 + 568 + 0 + 0 + + + 20 + 586 + 568 + 6 + 0 + + + 5 + 585 + 578 + 0 + 0 + + + 118 + 591 + 590 + 4 + 0 + + + 23 + 585 + 589 + 2 + 0 + + + 71 + 584 + 587 + 2 + 0 + + + 7 + 584 + 584 + 2 + 0 + + + 1 + 563 + 582 + 0 + 1 + + + 2 + 565 + 586 + 0 + 1 + + + 2 + 561 + 586 + 0 + 1 + + + 94 + 581 + 580 + 1 + 1 + + + 1 + 581 + 586 + 1 + 1 + + + 1 + 578 + 585 + 1 + 1 + + + 1 + 586 + 563 + 1 + 1 + + + 94 + 586 + 581 + 1 + 1 + + + 1 + 589 + 591 + 1 + 1 + + + 1 + 586 + 586 + 1 + 1 + + + 1 + 573 + 599 + 0 + 0 + + + 1 + 572 + 595 + 0 + 0 + + + 23 + 583 + 594 + 2 + 0 + + + 23 + 581 + 594 + 2 + 0 + + + 63 + 587 + 592 + 0 + 0 + + + 23 + 585 + 594 + 2 + 0 + + + 1 + 590 + 595 + 0 + 1 + + + 344 + 569 + 607 + 0 + 0 + + + 79 + 569 + 605 + 0 + 0 + + + 1 + 582 + 603 + 0 + 1 + + + 70 + 571 + 615 + 2 + 0 + + + 20 + 589 + 611 + 2 + 0 + + + 20 + 587 + 612 + 0 + 0 + + + 70 + 571 + 618 + 2 + 0 + + + 35 + 580 + 623 + 2 + 0 + + + 35 + 577 + 619 + 2 + 0 + + + 34 + 591 + 617 + 2 + 0 + + + 25 + 559 + 591 + 0 + 0 + + + 25 + 559 + 586 + 0 + 0 + + + 285 + 558 + 591 + 4 + 0 + + + 64 + 558 + 587 + 4 + 0 + + + 285 + 557 + 591 + 4 + 0 + + + 285 + 556 + 591 + 4 + 0 + + + 58 + 556 + 586 + 2 + 0 + + + 285 + 555 + 591 + 4 + 0 + + + 1 + 571 + 630 + 0 + 0 + + + 0 + 571 + 625 + 0 + 0 + + + 286 + 568 + 630 + 0 + 0 + + + 6 + 583 + 629 + 0 + 0 + + + 283 + 582 + 630 + 0 + 0 + + + 284 + 582 + 629 + 2 + 0 + + + 283 + 582 + 628 + 2 + 0 + + + 283 + 582 + 625 + 4 + 0 + + + 284 + 582 + 624 + 2 + 0 + + + 20 + 581 + 631 + 4 + 0 + + + 284 + 581 + 630 + 0 + 0 + + + 6 + 581 + 629 + 0 + 0 + + + 6 + 581 + 624 + 0 + 0 + + + 23 + 580 + 631 + 6 + 0 + + + 283 + 580 + 630 + 0 + 0 + + + 284 + 580 + 629 + 2 + 0 + + + 283 + 580 + 628 + 2 + 0 + + + 283 + 580 + 625 + 2 + 0 + + + 284 + 580 + 624 + 2 + 0 + + + 284 + 579 + 630 + 0 + 0 + + + 6 + 579 + 629 + 0 + 0 + + + 284 + 579 + 625 + 4 + 0 + + + 6 + 579 + 624 + 0 + 0 + + + 283 + 578 + 630 + 0 + 0 + + + 6 + 578 + 626 + 0 + 0 + + + 284 + 578 + 625 + 4 + 0 + + + 283 + 577 + 627 + 4 + 0 + + + 284 + 577 + 626 + 2 + 0 + + + 283 + 577 + 625 + 2 + 0 + + + 0 + 591 + 628 + 4 + 0 + + + 0 + 591 + 626 + 0 + 0 + + + 0 + 590 + 624 + 0 + 0 + + + 0 + 589 + 626 + 0 + 0 + + + 0 + 589 + 625 + 0 + 0 + + + 1 + 588 + 629 + 4 + 0 + + + 1 + 586 + 626 + 0 + 0 + + + 0 + 585 + 628 + 0 + 0 + + + 284 + 584 + 629 + 2 + 0 + + + 283 + 584 + 628 + 2 + 0 + + + 0 + 584 + 625 + 0 + 0 + + + 1 + 584 + 624 + 0 + 0 + + + 286 + 571 + 637 + 0 + 0 + + + 22 + 583 + 639 + 0 + 0 + + + 366 + 583 + 637 + 6 + 0 + + + 7 + 583 + 634 + 6 + 0 + + + 363 + 582 + 638 + 4 + 0 + + + 365 + 581 + 639 + 2 + 0 + + + 364 + 581 + 637 + 6 + 0 + + + 362 + 580 + 638 + 0 + 0 + + + 71 + 580 + 633 + 0 + 0 + + + 51 + 579 + 636 + 0 + 0 + + + 6 + 578 + 637 + 2 + 0 + + + 5 + 578 + 636 + 2 + 0 + + + 0 + 577 + 633 + 0 + 0 + + + 0 + 590 + 636 + 4 + 0 + + + 0 + 590 + 633 + 4 + 0 + + + 3 + 584 + 634 + 4 + 0 + + + 7 + 584 + 633 + 4 + 0 + + + 1 + 581 + 636 + 0 + 1 + + + 1 + 581 + 635 + 0 + 1 + + + 1 + 585 + 632 + 1 + 1 + + + 7 + 153 + 503 + 2 + 0 + + + 7 + 153 + 502 + 2 + 0 + + + 7 + 153 + 501 + 2 + 0 + + + 7 + 153 + 504 + 2 + 0 + + + 15 + 249 + 1406 + 6 + 0 + + + 15 + 249 + 1402 + 6 + 0 + + + 6 + 251 + 1412 + 0 + 0 + + + 45 + 250 + 1412 + 6 + 0 + + + 45 + 250 + 1411 + 6 + 0 + + + 25 + 262 + 1406 + 6 + 0 + + + 25 + 262 + 1412 + 6 + 0 + + + 25 + 265 + 1406 + 6 + 0 + + + 25 + 265 + 1412 + 6 + 0 + + + 200 + 264 + 1409 + 6 + 0 + + + 1 + 253 + 1403 + 1 + 1 + + + 1 + 251 + 1405 + 0 + 1 + + + 1 + 251 + 1408 + 0 + 1 + + + 1 + 260 + 1406 + 0 + 1 + + + 1 + 259 + 1403 + 1 + 1 + + + 45 + 277 + 1390 + 2 + 0 + + + 45 + 277 + 1389 + 2 + 0 + + + 45 + 277 + 1388 + 2 + 0 + + + 45 + 277 + 1387 + 2 + 0 + + + 45 + 276 + 1390 + 4 + 0 + + + 45 + 276 + 1387 + 0 + 0 + + + 45 + 275 + 1390 + 4 + 0 + + + 45 + 275 + 1387 + 0 + 0 + + + 45 + 274 + 1390 + 4 + 0 + + + 45 + 274 + 1387 + 0 + 0 + + + 45 + 273 + 1390 + 4 + 0 + + + 44 + 273 + 1388 + 6 + 0 + + + 45 + 273 + 1387 + 0 + 0 + + + 6 + 273 + 1384 + 2 + 0 + + + 45 + 272 + 1390 + 6 + 0 + + + 45 + 272 + 1387 + 6 + 0 + + + 30 + 279 + 1386 + 0 + 1 + + + 5 + 281 + 1388 + 0 + 0 + + + 11 + 110 + 534 + 0 + 0 + + + 6 + 106 + 534 + 0 + 0 + + + 3 + 115 + 530 + 0 + 0 + + + 7 + 115 + 529 + 4 + 0 + + + 3 + 114 + 534 + 0 + 0 + + + 5 + 113 + 533 + 0 + 0 + + + 15 + 112 + 534 + 0 + 0 + + + 7 + 124 + 534 + 0 + 0 + + + 11 + 121 + 533 + 0 + 0 + + + 1 + 110 + 533 + 1 + 1 + + + 1 + 108 + 530 + 0 + 1 + + + 1 + 106 + 532 + 0 + 1 + + + 1 + 115 + 532 + 0 + 1 + + + 1 + 113 + 531 + 0 + 1 + + + 1 + 127 + 532 + 1 + 1 + + + 1 + 124 + 532 + 1 + 1 + + + 1 + 121 + 532 + 1 + 1 + + + 15 + 63 + 685 + 6 + 0 + + + 35 + 59 + 687 + 0 + 0 + + + 89 + 59 + 682 + 0 + 0 + + + 55 + 56 + 685 + 0 + 0 + + + 29 + 56 + 682 + 2 + 0 + + + 29 + 56 + 680 + 2 + 0 + + + 15 + 63 + 691 + 6 + 0 + + + 15 + 63 + 688 + 6 + 0 + + + 35 + 58 + 688 + 0 + 0 + + + 55 + 57 + 688 + 0 + 0 + + + 34 + 57 + 696 + 0 + 0 + + + 34 + 56 + 716 + 2 + 0 + + + 34 + 56 + 714 + 2 + 0 + + + 46 + 68 + 685 + 0 + 0 + + + 35 + 64 + 683 + 0 + 0 + + + 46 + 70 + 693 + 4 + 0 + + + 46 + 68 + 693 + 4 + 0 + + + 46 + 68 + 691 + 0 + 0 + + + 46 + 68 + 689 + 2 + 0 + + + 63 + 67 + 688 + 0 + 0 + + + 32 + 77 + 681 + 2 + 0 + + + 46 + 76 + 685 + 0 + 0 + + + 32 + 75 + 681 + 2 + 0 + + + 3 + 79 + 693 + 0 + 0 + + + 3 + 78 + 693 + 0 + 0 + + + 63 + 77 + 688 + 4 + 0 + + + 46 + 76 + 693 + 4 + 0 + + + 46 + 76 + 691 + 0 + 0 + + + 46 + 76 + 689 + 2 + 0 + + + 46 + 74 + 693 + 4 + 0 + + + 46 + 72 + 693 + 2 + 0 + + + 9 + 77 + 698 + 0 + 0 + + + 33 + 75 + 708 + 0 + 0 + + + 11 + 87 + 685 + 2 + 0 + + + 34 + 84 + 684 + 0 + 0 + + + 15 + 80 + 685 + 2 + 0 + + + 63 + 86 + 695 + 4 + 0 + + + 15 + 80 + 691 + 2 + 0 + + + 15 + 80 + 688 + 2 + 0 + + + 35 + 86 + 709 + 0 + 0 + + + 33 + 82 + 706 + 0 + 0 + + + 35 + 80 + 717 + 0 + 0 + + + 33 + 90 + 709 + 0 + 0 + + + 193 + 89 + 718 + 0 + 0 + + + 1 + 85 + 683 + 1 + 1 + + + 48 + 60 + 673 + 0 + 0 + + + 3 + 66 + 677 + 3 + 0 + + + 33 + 65 + 673 + 2 + 0 + + + 29 + 76 + 676 + 2 + 0 + + + 29 + 76 + 674 + 2 + 0 + + + 118 + 85 + 679 + 4 + 0 + + + 1 + 74 + 676 + 1 + 1 + + + 32 + 57 + 668 + 0 + 0 + + + 33 + 57 + 664 + 0 + 0 + + + 34 + 56 + 666 + 0 + 0 + + + 22 + 67 + 666 + 4 + 0 + + + 33 + 67 + 664 + 4 + 0 + + + 22 + 66 + 666 + 4 + 0 + + + 3 + 64 + 667 + 4 + 0 + + + 33 + 75 + 665 + 4 + 0 + + + 34 + 74 + 664 + 0 + 0 + + + 11 + 73 + 669 + 0 + 0 + + + 30 + 81 + 664 + 4 + 0 + + + 34 + 60 + 661 + 0 + 0 + + + 34 + 69 + 663 + 0 + 0 + + + 35 + 68 + 656 + 0 + 0 + + + 164 + 89 + 662 + 5 + 0 + + + 33 + 78 + 654 + 0 + 0 + + + 34 + 87 + 649 + 0 + 0 + + + 55 + 52 + 677 + 2 + 0 + + + 55 + 51 + 677 + 2 + 0 + + + 29 + 50 + 674 + 2 + 0 + + + 0 + 128 + 531 + 0 + 0 + + + 3 + 138 + 532 + 1 + 0 + + + 5 + 136 + 530 + 0 + 0 + + + 1 + 141 + 533 + 1 + 1 + + + 51 + 90 + 3292 + 4 + 0 + + + 51 + 88 + 3288 + 2 + 0 + + + 51 + 93 + 3300 + 0 + 0 + + + 51 + 103 + 3288 + 0 + 0 + + + 51 + 100 + 3288 + 0 + 0 + + + 51 + 109 + 3291 + 6 + 0 + + + 51 + 107 + 3288 + 0 + 0 + + + 51 + 105 + 3291 + 2 + 0 + + + 51 + 110 + 3299 + 0 + 0 + + + 58 + 107 + 3297 + 6 + 0 + + + 5 + 111 + 3306 + 0 + 0 + + + 80 + 116 + 3295 + 6 + 0 + + + 51 + 116 + 3293 + 2 + 0 + + + 51 + 117 + 3298 + 4 + 0 + + + 80 + 116 + 3303 + 4 + 0 + + + 80 + 114 + 3303 + 4 + 0 + + + 51 + 116 + 3308 + 4 + 0 + + + 51 + 113 + 3308 + 4 + 0 + + + 51 + 127 + 3292 + 4 + 0 + + + 51 + 127 + 3290 + 0 + 0 + + + 51 + 122 + 3294 + 6 + 0 + + + 20 + 121 + 3288 + 0 + 0 + + + 80 + 122 + 3298 + 2 + 0 + + + 117 + 134 + 3293 + 2 + 0 + + + 51 + 106 + 3285 + 6 + 0 + + + 51 + 106 + 3282 + 6 + 0 + + + 5 + 119 + 3282 + 0 + 0 + + + 51 + 117 + 3285 + 2 + 0 + + + 20 + 124 + 3286 + 4 + 0 + + + 51 + 123 + 3284 + 0 + 0 + + + 20 + 122 + 3286 + 0 + 0 + + + 20 + 120 + 3286 + 0 + 0 + + + 51 + 132 + 3285 + 0 + 0 + + + 58 + 128 + 3285 + 4 + 0 + + + 51 + 141 + 3286 + 6 + 0 + + + 51 + 138 + 3283 + 0 + 0 + + + 57 + 138 + 3294 + 4 + 0 + + + 51 + 138 + 3288 + 4 + 0 + + + 116 + 137 + 3290 + 2 + 0 + + + 51 + 101 + 3284 + 4 + 0 + + + 51 + 90 + 3283 + 2 + 0 + + + 51 + 94 + 3278 + 4 + 0 + + + 51 + 90 + 3279 + 2 + 0 + + + 51 + 103 + 3274 + 0 + 0 + + + 51 + 98 + 3275 + 0 + 0 + + + 58 + 108 + 3275 + 4 + 0 + + + 51 + 115 + 3272 + 0 + 0 + + + 51 + 112 + 3279 + 4 + 0 + + + 51 + 112 + 3272 + 0 + 0 + + + 51 + 147 + 3292 + 0 + 0 + + + 51 + 155 + 3291 + 0 + 0 + + + 51 + 153 + 3301 + 4 + 0 + + + 1 + 264 + 539 + 0 + 1 + + + 43 + 251 + 3369 + 6 + 0 + + + 104 + 263 + 3367 + 0 + 0 + + + 104 + 263 + 3366 + 0 + 0 + + + 111 + 265 + 3357 + 0 + 0 + + + 110 + 264 + 3358 + 2 + 0 + + + 101 + 270 + 3366 + 0 + 0 + + + 101 + 269 + 3366 + 0 + 0 + + + 100 + 269 + 3364 + 0 + 0 + + + 104 + 264 + 3366 + 0 + 0 + + + 107 + 271 + 3371 + 0 + 0 + + + 102 + 271 + 3368 + 0 + 0 + + + 103 + 270 + 3375 + 0 + 0 + + + 111 + 270 + 3380 + 0 + 0 + + + 51 + 267 + 3383 + 2 + 0 + + + 51 + 266 + 3380 + 4 + 0 + + + 110 + 266 + 3376 + 0 + 0 + + + 110 + 265 + 3376 + 0 + 0 + + + 113 + 264 + 3380 + 0 + 0 + + + 51 + 271 + 3387 + 6 + 0 + + + 111 + 270 + 3390 + 0 + 0 + + + 110 + 269 + 3391 + 0 + 0 + + + 110 + 269 + 3390 + 0 + 0 + + + 110 + 267 + 3389 + 0 + 0 + + + 111 + 266 + 3387 + 0 + 0 + + + 110 + 265 + 3391 + 0 + 0 + + + 110 + 265 + 3387 + 0 + 0 + + + 55 + 268 + 3381 + 0 + 1 + + + 6 + 257 + 1481 + 0 + 0 + + + 51 + 263 + 3395 + 2 + 0 + + + 51 + 263 + 3392 + 2 + 0 + + + 110 + 271 + 3397 + 0 + 0 + + + 107 + 268 + 3399 + 0 + 0 + + + 110 + 268 + 3396 + 0 + 0 + + + 107 + 267 + 3399 + 0 + 0 + + + 110 + 267 + 3396 + 0 + 0 + + + 110 + 266 + 3394 + 0 + 0 + + + 107 + 265 + 3397 + 0 + 0 + + + 110 + 265 + 3394 + 0 + 0 + + + 51 + 270 + 3400 + 4 + 0 + + + 110 + 274 + 3377 + 0 + 0 + + + 111 + 272 + 3380 + 0 + 0 + + + 111 + 272 + 3379 + 0 + 0 + + + 111 + 272 + 3391 + 0 + 0 + + + 51 + 277 + 3398 + 6 + 0 + + + 51 + 277 + 3394 + 6 + 0 + + + 111 + 275 + 3396 + 0 + 0 + + + 110 + 275 + 3395 + 0 + 0 + + + 5 + 274 + 3398 + 6 + 0 + + + 111 + 273 + 3396 + 0 + 0 + + + 110 + 273 + 3394 + 0 + 0 + + + 111 + 272 + 3397 + 0 + 0 + + + 111 + 272 + 3394 + 0 + 0 + + + 111 + 272 + 3392 + 0 + 0 + + + 51 + 273 + 3400 + 4 + 0 + + + 15 + 290 + 1467 + 0 + 0 + + + 6 + 289 + 1465 + 2 + 0 + + + 15 + 310 + 1467 + 0 + 0 + + + 6 + 308 + 1466 + 4 + 0 + + + 47 + 306 + 1466 + 0 + 0 + + + 27 + 311 + 1473 + 0 + 0 + + + 6 + 308 + 1473 + 0 + 0 + + + 15 + 307 + 1478 + 0 + 0 + + + 15 + 317 + 1479 + 0 + 0 + + + 15 + 317 + 1474 + 4 + 0 + + + 3 + 312 + 1479 + 4 + 0 + + + 47 + 312 + 1475 + 4 + 0 + + + 45 + 319 + 1492 + 2 + 0 + + + 45 + 319 + 1491 + 2 + 0 + + + 45 + 319 + 1490 + 2 + 0 + + + 45 + 319 + 1489 + 2 + 0 + + + 45 + 318 + 1492 + 4 + 0 + + + 45 + 318 + 1489 + 0 + 0 + + + 45 + 317 + 1489 + 0 + 0 + + + 42 + 316 + 1490 + 0 + 0 + + + 45 + 316 + 1489 + 0 + 0 + + + 48 + 322 + 1475 + 4 + 0 + + + 25 + 322 + 1474 + 4 + 0 + + + 6 + 321 + 1479 + 0 + 0 + + + 3 + 327 + 1484 + 7 + 0 + + + 3 + 326 + 1483 + 7 + 0 + + + 7 + 323 + 1493 + 0 + 0 + + + 3 + 323 + 1492 + 4 + 0 + + + 7 + 323 + 1491 + 4 + 0 + + + 3 + 322 + 1489 + 4 + 0 + + + 7 + 322 + 1488 + 4 + 0 + + + 1 + 321 + 1477 + 0 + 1 + + + 1 + 320 + 1478 + 1 + 1 + + + 6 + 328 + 1482 + 7 + 0 + + + 1 + 315 + 1503 + 1 + 1 + + + 15 + 331 + 1509 + 6 + 0 + + + 1 + 342 + 502 + 0 + 0 + + + 177 + 327 + 490 + 0 + 0 + + + 34 + 341 + 494 + 4 + 0 + + + 34 + 340 + 493 + 4 + 0 + + + 1 + 325 + 493 + 0 + 1 + + + 15 + 323 + 487 + 4 + 0 + + + 0 + 321 + 484 + 0 + 0 + + + 0 + 321 + 481 + 0 + 0 + + + 137 + 341 + 487 + 4 + 0 + + + 1 + 348 + 483 + 4 + 0 + + + 37 + 347 + 486 + 4 + 0 + + + 0 + 344 + 485 + 4 + 0 + + + 1 + 351 + 489 + 4 + 0 + + + 1 + 349 + 488 + 4 + 0 + + + 34 + 347 + 495 + 4 + 0 + + + 37 + 344 + 489 + 4 + 0 + + + 34 + 347 + 496 + 4 + 0 + + + 73 + 351 + 492 + 0 + 1 + + + 1 + 352 + 472 + 0 + 0 + + + 1 + 357 + 484 + 4 + 0 + + + 0 + 354 + 481 + 4 + 0 + + + 1 + 352 + 483 + 4 + 0 + + + 41 + 358 + 492 + 0 + 0 + + + 20 + 357 + 494 + 4 + 0 + + + 34 + 355 + 491 + 4 + 0 + + + 34 + 355 + 488 + 4 + 0 + + + 1 + 355 + 502 + 0 + 0 + + + 1 + 358 + 505 + 0 + 0 + + + 70 + 358 + 495 + 1 + 1 + + + 71 + 356 + 495 + 1 + 1 + + + 72 + 356 + 492 + 1 + 1 + + + 68 + 362 + 467 + 4 + 0 + + + 1 + 367 + 482 + 4 + 0 + + + 1 + 365 + 485 + 4 + 0 + + + 0 + 360 + 486 + 4 + 0 + + + 1 + 360 + 482 + 4 + 0 + + + 5 + 367 + 494 + 0 + 0 + + + 255 + 363 + 494 + 2 + 0 + + + 48 + 362 + 495 + 4 + 0 + + + 6 + 362 + 491 + 4 + 0 + + + 1 + 361 + 489 + 4 + 0 + + + 20 + 360 + 495 + 0 + 0 + + + 7 + 360 + 494 + 0 + 0 + + + 3 + 360 + 493 + 0 + 0 + + + 0 + 360 + 489 + 4 + 0 + + + 248 + 367 + 497 + 0 + 0 + + + 34 + 364 + 502 + 4 + 0 + + + 37 + 362 + 498 + 4 + 0 + + + 3 + 360 + 502 + 3 + 0 + + + 1 + 361 + 499 + 3 + 1 + + + 34 + 341 + 457 + 0 + 0 + + + 1 + 351 + 457 + 0 + 0 + + + 37 + 346 + 459 + 0 + 0 + + + 34 + 358 + 460 + 0 + 0 + + + 68 + 357 + 462 + 0 + 0 + + + 0 + 357 + 459 + 0 + 0 + + + 1 + 357 + 457 + 0 + 0 + + + 1 + 356 + 456 + 0 + 0 + + + 1 + 354 + 459 + 0 + 0 + + + 34 + 353 + 463 + 0 + 0 + + + 68 + 367 + 462 + 0 + 0 + + + 235 + 362 + 462 + 0 + 0 + + + 68 + 362 + 457 + 4 + 0 + + + 34 + 375 + 460 + 0 + 0 + + + 37 + 369 + 458 + 0 + 0 + + + 34 + 373 + 464 + 0 + 0 + + + 1 + 368 + 489 + 4 + 0 + + + 37 + 368 + 488 + 4 + 0 + + + 1 + 371 + 495 + 1 + 1 + + + 34 + 351 + 453 + 0 + 0 + + + 1 + 350 + 455 + 0 + 0 + + + 1 + 348 + 450 + 0 + 0 + + + 34 + 348 + 449 + 0 + 0 + + + 34 + 359 + 453 + 0 + 0 + + + 1 + 359 + 449 + 0 + 0 + + + 1 + 358 + 453 + 0 + 0 + + + 37 + 358 + 448 + 0 + 0 + + + 34 + 356 + 454 + 0 + 0 + + + 34 + 355 + 454 + 0 + 0 + + + 1 + 355 + 451 + 0 + 0 + + + 0 + 353 + 449 + 0 + 0 + + + 0 + 352 + 449 + 0 + 0 + + + 1 + 363 + 454 + 0 + 0 + + + 0 + 362 + 455 + 0 + 0 + + + 0 + 362 + 454 + 0 + 0 + + + 1 + 360 + 452 + 0 + 0 + + + 37 + 360 + 448 + 0 + 0 + + + 37 + 373 + 451 + 0 + 0 + + + 286 + 382 + 455 + 0 + 0 + + + 286 + 381 + 450 + 0 + 0 + + + 286 + 379 + 449 + 0 + 0 + + + 1 + 381 + 483 + 4 + 0 + + + 37 + 380 + 483 + 4 + 0 + + + 1 + 380 + 482 + 4 + 0 + + + 1 + 378 + 484 + 4 + 0 + + + 1 + 378 + 482 + 4 + 0 + + + 0 + 376 + 482 + 4 + 0 + + + 1 + 351 + 444 + 0 + 0 + + + 1 + 351 + 440 + 0 + 0 + + + 1 + 347 + 445 + 0 + 0 + + + 1 + 346 + 441 + 0 + 0 + + + 1 + 345 + 447 + 0 + 0 + + + 34 + 359 + 444 + 0 + 0 + + + 0 + 358 + 440 + 0 + 0 + + + 0 + 356 + 446 + 0 + 0 + + + 1 + 353 + 445 + 0 + 0 + + + 0 + 363 + 446 + 0 + 0 + + + 0 + 363 + 444 + 0 + 0 + + + 0 + 362 + 442 + 0 + 0 + + + 45 + 370 + 440 + 2 + 0 + + + 1 + 368 + 442 + 0 + 0 + + + 286 + 380 + 446 + 0 + 0 + + + 74 + 372 + 441 + 0 + 1 + + + 1 + 344 + 437 + 0 + 0 + + + 1 + 355 + 439 + 0 + 0 + + + 5 + 375 + 438 + 0 + 0 + + + 278 + 374 + 436 + 0 + 0 + + + 278 + 373 + 438 + 0 + 0 + + + 280 + 372 + 436 + 0 + 0 + + + 278 + 372 + 435 + 0 + 0 + + + 278 + 371 + 436 + 2 + 0 + + + 45 + 370 + 439 + 2 + 0 + + + 45 + 370 + 438 + 2 + 0 + + + 274 + 369 + 434 + 4 + 0 + + + 42 + 368 + 438 + 4 + 0 + + + 37 + 382 + 438 + 0 + 0 + + + 37 + 382 + 436 + 0 + 0 + + + 282 + 381 + 439 + 0 + 0 + + + 0 + 381 + 435 + 0 + 0 + + + 0 + 380 + 439 + 0 + 0 + + + 37 + 379 + 439 + 0 + 0 + + + 0 + 379 + 435 + 0 + 0 + + + 1 + 378 + 437 + 1 + 1 + + + 45 + 387 + 468 + 2 + 0 + + + 45 + 387 + 467 + 2 + 0 + + + 45 + 387 + 466 + 2 + 0 + + + 45 + 386 + 469 + 0 + 0 + + + 45 + 385 + 469 + 0 + 0 + + + 359 + 385 + 466 + 4 + 0 + + + 63 + 385 + 465 + 2 + 0 + + + 45 + 384 + 468 + 6 + 0 + + + 45 + 384 + 467 + 6 + 0 + + + 45 + 384 + 466 + 6 + 0 + + + 6 + 399 + 433 + 0 + 0 + + + 6 + 375 + 1382 + 0 + 0 + + + 19 + 369 + 1381 + 2 + 0 + + + 110 + 356 + 3276 + 0 + 0 + + + 210 + 353 + 3277 + 0 + 0 + + + 110 + 354 + 3281 + 0 + 0 + + + 110 + 360 + 3278 + 0 + 0 + + + 110 + 362 + 3283 + 0 + 0 + + + 41 + 368 + 3270 + 4 + 0 + + + 58 + 374 + 3276 + 6 + 0 + + + 110 + 375 + 3280 + 0 + 0 + + + 108 + 373 + 3281 + 4 + 0 + + + 110 + 372 + 3281 + 4 + 0 + + + 106 + 371 + 3281 + 4 + 0 + + + 51 + 117 + 3534 + 2 + 0 + + + 145 + 127 + 3511 + 2 + 0 + + + 3 + 126 + 3511 + 6 + 0 + + + 145 + 125 + 3511 + 6 + 0 + + + 51 + 127 + 3513 + 6 + 0 + + + 51 + 125 + 3513 + 2 + 0 + + + 51 + 122 + 3518 + 2 + 0 + + + 145 + 122 + 3516 + 6 + 0 + + + 145 + 127 + 3525 + 2 + 0 + + + 51 + 127 + 3523 + 6 + 0 + + + 145 + 125 + 3525 + 6 + 0 + + + 51 + 125 + 3523 + 2 + 0 + + + 145 + 122 + 3520 + 6 + 0 + + + 25 + 126 + 3533 + 0 + 0 + + + 51 + 123 + 3528 + 2 + 0 + + + 51 + 120 + 3531 + 2 + 0 + + + 51 + 130 + 3518 + 6 + 0 + + + 145 + 130 + 3516 + 2 + 0 + + + 5 + 128 + 3518 + 0 + 0 + + + 0 + 135 + 3524 + 7 + 0 + + + 145 + 130 + 3520 + 2 + 0 + + + 1 + 135 + 3534 + 7 + 0 + + + 25 + 128 + 3535 + 0 + 0 + + + 72 + 143 + 3527 + 7 + 0 + + + 72 + 143 + 3526 + 7 + 0 + + + 72 + 142 + 3527 + 7 + 0 + + + 72 + 142 + 3526 + 7 + 0 + + + 0 + 142 + 3521 + 7 + 0 + + + 72 + 141 + 3527 + 7 + 0 + + + 72 + 141 + 3526 + 7 + 0 + + + 72 + 140 + 3527 + 7 + 0 + + + 72 + 140 + 3526 + 7 + 0 + + + 72 + 139 + 3527 + 7 + 0 + + + 72 + 139 + 3526 + 7 + 0 + + + 0 + 138 + 3523 + 7 + 0 + + + 72 + 143 + 3530 + 7 + 0 + + + 72 + 143 + 3529 + 7 + 0 + + + 72 + 143 + 3528 + 7 + 0 + + + 72 + 142 + 3530 + 7 + 0 + + + 72 + 142 + 3529 + 7 + 0 + + + 72 + 142 + 3528 + 7 + 0 + + + 72 + 141 + 3530 + 7 + 0 + + + 72 + 141 + 3529 + 7 + 0 + + + 72 + 141 + 3528 + 7 + 0 + + + 72 + 140 + 3530 + 7 + 0 + + + 72 + 140 + 3529 + 7 + 0 + + + 72 + 140 + 3528 + 7 + 0 + + + 72 + 139 + 3530 + 7 + 0 + + + 72 + 139 + 3529 + 7 + 0 + + + 72 + 139 + 3528 + 7 + 0 + + + 1 + 137 + 3535 + 7 + 0 + + + 302 + 136 + 3533 + 4 + 0 + + + 51 + 118 + 3541 + 6 + 0 + + + 51 + 118 + 3539 + 6 + 0 + + + 51 + 115 + 3536 + 0 + 0 + + + 51 + 113 + 3536 + 0 + 0 + + + 25 + 127 + 3541 + 0 + 0 + + + 25 + 127 + 3538 + 0 + 0 + + + 51 + 120 + 3537 + 4 + 0 + + + 25 + 134 + 3541 + 0 + 0 + + + 25 + 129 + 3538 + 0 + 0 + + + 1 + 142 + 3537 + 7 + 0 + + + 67 + 117 + 3539 + 0 + 1 + + + 67 + 116 + 3537 + 1 + 1 + + + 30 + 104 + 3547 + 3 + 0 + + + 30 + 117 + 3544 + 5 + 0 + + + 30 + 115 + 3548 + 5 + 0 + + + 25 + 127 + 3547 + 0 + 0 + + + 25 + 127 + 3544 + 0 + 0 + + + 25 + 134 + 3547 + 0 + 0 + + + 25 + 134 + 3544 + 0 + 0 + + + 10 + 130 + 3547 + 2 + 0 + + + 30 + 103 + 3537 + 1 + 0 + + + 249 + 98 + 3537 + 0 + 0 + + + 51 + 150 + 3517 + 0 + 0 + + + 51 + 145 + 3519 + 0 + 0 + + + 72 + 148 + 3527 + 7 + 0 + + + 72 + 148 + 3526 + 7 + 0 + + + 72 + 147 + 3527 + 7 + 0 + + + 72 + 147 + 3526 + 7 + 0 + + + 72 + 146 + 3527 + 7 + 0 + + + 72 + 146 + 3526 + 7 + 0 + + + 72 + 145 + 3527 + 7 + 0 + + + 72 + 145 + 3526 + 7 + 0 + + + 72 + 144 + 3527 + 7 + 0 + + + 72 + 144 + 3526 + 7 + 0 + + + 72 + 148 + 3530 + 7 + 0 + + + 72 + 148 + 3529 + 7 + 0 + + + 72 + 148 + 3528 + 7 + 0 + + + 72 + 147 + 3530 + 7 + 0 + + + 72 + 147 + 3529 + 7 + 0 + + + 72 + 147 + 3528 + 7 + 0 + + + 72 + 146 + 3530 + 7 + 0 + + + 72 + 146 + 3529 + 7 + 0 + + + 72 + 146 + 3528 + 7 + 0 + + + 72 + 145 + 3530 + 7 + 0 + + + 72 + 145 + 3529 + 7 + 0 + + + 72 + 145 + 3528 + 7 + 0 + + + 72 + 144 + 3530 + 7 + 0 + + + 72 + 144 + 3529 + 7 + 0 + + + 72 + 144 + 3528 + 7 + 0 + + + 51 + 151 + 3541 + 4 + 0 + + + 1 + 150 + 3538 + 0 + 0 + + + 51 + 148 + 3541 + 4 + 0 + + + 1 + 147 + 3537 + 0 + 0 + + + 51 + 145 + 3539 + 4 + 0 + + + 51 + 156 + 3514 + 0 + 0 + + + 3 + 159 + 3523 + 0 + 0 + + + 3 + 158 + 3523 + 0 + 0 + + + 26 + 153 + 3524 + 4 + 0 + + + 246 + 159 + 3533 + 0 + 0 + + + 26 + 153 + 3531 + 4 + 0 + + + 1 + 153 + 3536 + 0 + 0 + + + 118 + 161 + 3516 + 4 + 0 + + + 51 + 160 + 3519 + 4 + 0 + + + 51 + 160 + 3514 + 0 + 0 + + + 51 + 167 + 3526 + 0 + 0 + + + 51 + 166 + 3521 + 0 + 0 + + + 51 + 164 + 3525 + 4 + 0 + + + 51 + 163 + 3526 + 0 + 0 + + + 51 + 162 + 3524 + 6 + 0 + + + 51 + 164 + 3533 + 6 + 0 + + + 53 + 162 + 3533 + 0 + 0 + + + 51 + 160 + 3535 + 4 + 0 + + + 51 + 165 + 3538 + 2 + 0 + + + 1 + 166 + 3526 + 0 + 1 + + + 1 + 160 + 3526 + 0 + 1 + + + 1 + 161 + 3531 + 0 + 1 + + + 51 + 174 + 3521 + 0 + 0 + + + 58 + 171 + 3527 + 4 + 0 + + + 51 + 171 + 3521 + 0 + 0 + + + 51 + 170 + 3525 + 4 + 0 + + + 51 + 169 + 3523 + 6 + 0 + + + 51 + 174 + 3535 + 4 + 0 + + + 11 + 172 + 3534 + 0 + 0 + + + 3 + 172 + 3532 + 0 + 0 + + + 3 + 172 + 3531 + 0 + 0 + + + 3 + 171 + 3532 + 0 + 0 + + + 3 + 171 + 3531 + 0 + 0 + + + 3 + 170 + 3532 + 0 + 0 + + + 3 + 170 + 3531 + 0 + 0 + + + 51 + 174 + 3541 + 0 + 0 + + + 11 + 172 + 3536 + 0 + 0 + + + 51 + 169 + 3543 + 4 + 0 + + + 51 + 169 + 3538 + 0 + 0 + + + 51 + 175 + 3550 + 4 + 0 + + + 51 + 172 + 3548 + 2 + 0 + + + 51 + 172 + 3545 + 2 + 0 + + + 1 + 169 + 3533 + 1 + 1 + + + 51 + 176 + 3527 + 6 + 0 + + + 51 + 176 + 3523 + 6 + 0 + + + 51 + 178 + 3534 + 6 + 0 + + + 51 + 178 + 3531 + 6 + 0 + + + 51 + 176 + 3535 + 4 + 0 + + + 51 + 176 + 3541 + 0 + 0 + + + 51 + 180 + 3545 + 6 + 0 + + + 51 + 179 + 3548 + 6 + 0 + + + 51 + 177 + 3550 + 4 + 0 + + + 326 + 544 + 590 + 0 + 0 + + + 334 + 540 + 591 + 0 + 0 + + + 51 + 558 + 3421 + 0 + 0 + + + 51 + 557 + 3424 + 2 + 0 + + + 51 + 554 + 3426 + 4 + 0 + + + 51 + 552 + 3426 + 4 + 0 + + + 51 + 559 + 3437 + 4 + 0 + + + 51 + 565 + 3420 + 6 + 0 + + + 51 + 562 + 3418 + 0 + 0 + + + 51 + 563 + 3424 + 6 + 0 + + + 80 + 561 + 3430 + 2 + 0 + + + 80 + 567 + 3434 + 4 + 0 + + + 80 + 564 + 3434 + 4 + 0 + + + 51 + 561 + 3437 + 4 + 0 + + + 5 + 569 + 3437 + 6 + 0 + + + 278 + 582 + 3418 + 5 + 0 + + + 278 + 581 + 3416 + 5 + 0 + + + 434 + 580 + 3421 + 0 + 0 + + + 97 + 580 + 3418 + 0 + 0 + + + 278 + 579 + 3416 + 5 + 0 + + + 278 + 578 + 3418 + 5 + 0 + + + 95 + 557 + 3425 + 1 + 1 + + + 51 + 423 + 3381 + 2 + 0 + + + 205 + 423 + 3378 + 4 + 0 + + + 51 + 420 + 3379 + 4 + 0 + + + 730 + 474 + 3383 + 0 + 0 + + + 729 + 474 + 3385 + 7 + 0 + + + 730 + 473 + 3388 + 4 + 0 + + + 565 + 475 + 3399 + 0 + 0 + + + 1154 + 473 + 3398 + 2 + 0 + + + 33 + 410 + 712 + 0 + 0 + + + 113 + 487 + 707 + 0 + 0 + + + 32 + 487 + 704 + 0 + 0 + + + 113 + 486 + 706 + 0 + 0 + + + 394 + 485 + 709 + 1 + 0 + + + 395 + 485 + 706 + 5 + 0 + + + 394 + 484 + 710 + 1 + 0 + + + 394 + 484 + 709 + 0 + 0 + + + 399 + 484 + 704 + 2 + 0 + + + 394 + 483 + 708 + 2 + 0 + + + 394 + 482 + 706 + 4 + 0 + + + 404 + 481 + 710 + 2 + 0 + + + 399 + 481 + 704 + 2 + 0 + + + 394 + 495 + 711 + 3 + 0 + + + 395 + 495 + 708 + 0 + 0 + + + 32 + 495 + 705 + 6 + 0 + + + 34 + 495 + 704 + 6 + 0 + + + 32 + 494 + 704 + 6 + 0 + + + 394 + 493 + 709 + 0 + 0 + + + 32 + 490 + 709 + 0 + 0 + + + 394 + 490 + 704 + 0 + 0 + + + 113 + 489 + 706 + 0 + 0 + + + 404 + 488 + 709 + 2 + 0 + + + 402 + 488 + 706 + 0 + 0 + + + 34 + 502 + 702 + 6 + 0 + + + 394 + 501 + 702 + 6 + 0 + + + 394 + 501 + 701 + 3 + 0 + + + 394 + 500 + 703 + 3 + 0 + + + 394 + 499 + 702 + 6 + 0 + + + 394 + 498 + 701 + 6 + 0 + + + 34 + 498 + 700 + 6 + 0 + + + 404 + 497 + 699 + 0 + 0 + + + 394 + 502 + 708 + 0 + 0 + + + 394 + 502 + 704 + 5 + 0 + + + 403 + 501 + 710 + 1 + 0 + + + 97 + 501 + 705 + 0 + 0 + + + 97 + 500 + 706 + 0 + 0 + + + 429 + 500 + 705 + 0 + 0 + + + 97 + 500 + 704 + 0 + 0 + + + 402 + 499 + 707 + 0 + 0 + + + 97 + 499 + 705 + 0 + 0 + + + 34 + 496 + 708 + 6 + 0 + + + 32 + 508 + 701 + 0 + 0 + + + 32 + 506 + 698 + 0 + 0 + + + 402 + 505 + 702 + 0 + 0 + + + 395 + 504 + 698 + 0 + 0 + + + 33 + 510 + 704 + 0 + 0 + + + 32 + 508 + 705 + 0 + 0 + + + 33 + 507 + 710 + 0 + 0 + + + 403 + 507 + 707 + 3 + 0 + + + 394 + 507 + 704 + 0 + 0 + + + 402 + 505 + 706 + 0 + 0 + + + 32 + 504 + 710 + 0 + 0 + + + 395 + 504 + 705 + 0 + 0 + + + 394 + 486 + 712 + 5 + 0 + + + 394 + 483 + 713 + 5 + 0 + + + 33 + 495 + 715 + 0 + 0 + + + 397 + 494 + 716 + 0 + 0 + + + 32 + 493 + 713 + 0 + 0 + + + 33 + 490 + 713 + 0 + 0 + + + 397 + 502 + 716 + 0 + 0 + + + 395 + 500 + 712 + 0 + 0 + + + 33 + 499 + 716 + 0 + 0 + + + 32 + 499 + 714 + 0 + 0 + + + 402 + 498 + 712 + 0 + 0 + + + 33 + 504 + 714 + 0 + 0 + + + 33 + 472 + 725 + 6 + 0 + + + 400 + 470 + 713 + 6 + 0 + + + 400 + 468 + 714 + 5 + 0 + + + 400 + 468 + 712 + 4 + 0 + + + 34 + 467 + 718 + 0 + 0 + + + 400 + 467 + 716 + 6 + 0 + + + 430 + 466 + 719 + 0 + 0 + + + 34 + 465 + 719 + 0 + 0 + + + 34 + 465 + 714 + 0 + 0 + + + 396 + 470 + 727 + 4 + 0 + + + 32 + 470 + 723 + 6 + 0 + + + 401 + 469 + 725 + 7 + 0 + + + 32 + 468 + 723 + 6 + 0 + + + 32 + 467 + 727 + 6 + 0 + + + 33 + 467 + 724 + 0 + 0 + + + 403 + 466 + 725 + 4 + 0 + + + 33 + 466 + 721 + 3 + 0 + + + 404 + 466 + 720 + 4 + 0 + + + 394 + 465 + 723 + 5 + 0 + + + 34 + 465 + 721 + 1 + 0 + + + 403 + 465 + 720 + 4 + 0 + + + 396 + 464 + 725 + 2 + 0 + + + 395 + 464 + 722 + 0 + 0 + + + 430 + 463 + 717 + 0 + 0 + + + 430 + 463 + 714 + 0 + 0 + + + 430 + 462 + 719 + 0 + 0 + + + 430 + 460 + 717 + 0 + 0 + + + 430 + 460 + 715 + 0 + 0 + + + 34 + 459 + 717 + 0 + 0 + + + 396 + 463 + 727 + 4 + 0 + + + 403 + 463 + 724 + 2 + 0 + + + 33 + 463 + 722 + 1 + 0 + + + 404 + 463 + 721 + 4 + 0 + + + 400 + 462 + 722 + 1 + 0 + + + 397 + 461 + 727 + 1 + 0 + + + 405 + 461 + 723 + 7 + 0 + + + 401 + 461 + 721 + 0 + 0 + + + 404 + 460 + 725 + 4 + 0 + + + 32 + 460 + 721 + 1 + 0 + + + 395 + 459 + 722 + 0 + 0 + + + 405 + 458 + 727 + 4 + 0 + + + 33 + 457 + 722 + 4 + 0 + + + 33 + 456 + 725 + 1 + 0 + + + 33 + 455 + 723 + 4 + 0 + + + 32 + 452 + 725 + 4 + 0 + + + 396 + 449 + 727 + 1 + 0 + + + 397 + 455 + 734 + 6 + 0 + + + 33 + 455 + 733 + 6 + 0 + + + 398 + 454 + 732 + 6 + 0 + + + 399 + 453 + 735 + 1 + 0 + + + 396 + 453 + 728 + 1 + 0 + + + 397 + 452 + 730 + 1 + 0 + + + 404 + 452 + 729 + 6 + 0 + + + 33 + 451 + 732 + 1 + 0 + + + 405 + 451 + 729 + 2 + 0 + + + 399 + 449 + 733 + 1 + 0 + + + 395 + 448 + 731 + 1 + 0 + + + 32 + 463 + 731 + 1 + 0 + + + 398 + 463 + 729 + 7 + 0 + + + 404 + 462 + 733 + 7 + 0 + + + 398 + 461 + 731 + 3 + 0 + + + 405 + 460 + 735 + 4 + 0 + + + 404 + 459 + 729 + 2 + 0 + + + 399 + 458 + 735 + 2 + 0 + + + 396 + 458 + 732 + 0 + 0 + + + 32 + 456 + 730 + 1 + 0 + + + 32 + 471 + 733 + 6 + 0 + + + 404 + 470 + 729 + 7 + 0 + + + 398 + 469 + 733 + 1 + 0 + + + 397 + 468 + 735 + 1 + 0 + + + 403 + 468 + 730 + 2 + 0 + + + 396 + 467 + 732 + 1 + 0 + + + 405 + 465 + 731 + 7 + 0 + + + 399 + 465 + 729 + 6 + 0 + + + 399 + 464 + 735 + 1 + 0 + + + 33 + 477 + 733 + 0 + 0 + + + 394 + 475 + 734 + 0 + 0 + + + 32 + 475 + 731 + 0 + 0 + + + 33 + 474 + 733 + 1 + 0 + + + 405 + 473 + 728 + 1 + 0 + + + 32 + 472 + 730 + 6 + 0 + + + 395 + 445 + 726 + 0 + 0 + + + 32 + 447 + 735 + 1 + 0 + + + 404 + 446 + 734 + 1 + 0 + + + 397 + 446 + 732 + 2 + 0 + + + 397 + 446 + 730 + 0 + 0 + + + 33 + 446 + 728 + 4 + 0 + + + 398 + 444 + 734 + 1 + 0 + + + 394 + 444 + 731 + 0 + 0 + + + 33 + 441 + 733 + 1 + 0 + + + 405 + 446 + 739 + 3 + 0 + + + 396 + 444 + 743 + 2 + 0 + + + 401 + 444 + 738 + 2 + 0 + + + 397 + 442 + 741 + 2 + 0 + + + 401 + 441 + 737 + 2 + 0 + + + 405 + 455 + 742 + 0 + 0 + + + 397 + 455 + 737 + 4 + 0 + + + 21 + 454 + 743 + 0 + 0 + + + 32 + 454 + 740 + 4 + 0 + + + 396 + 452 + 738 + 4 + 0 + + + 21 + 451 + 743 + 7 + 0 + + + 404 + 451 + 741 + 4 + 0 + + + 399 + 450 + 739 + 3 + 0 + + + 398 + 450 + 736 + 3 + 0 + + + 399 + 448 + 742 + 2 + 0 + + + 396 + 463 + 741 + 4 + 0 + + + 403 + 463 + 737 + 4 + 0 + + + 398 + 462 + 739 + 4 + 0 + + + 397 + 461 + 737 + 4 + 0 + + + 32 + 460 + 742 + 6 + 0 + + + 33 + 460 + 740 + 4 + 0 + + + 398 + 458 + 742 + 1 + 0 + + + 396 + 458 + 739 + 4 + 0 + + + 397 + 456 + 740 + 3 + 0 + + + 33 + 471 + 742 + 6 + 0 + + + 394 + 471 + 737 + 6 + 0 + + + 395 + 470 + 740 + 0 + 0 + + + 395 + 468 + 741 + 1 + 0 + + + 396 + 468 + 739 + 6 + 0 + + + 405 + 468 + 737 + 6 + 0 + + + 32 + 467 + 742 + 4 + 0 + + + 397 + 467 + 740 + 6 + 0 + + + 397 + 465 + 742 + 4 + 0 + + + 399 + 465 + 740 + 4 + 0 + + + 396 + 465 + 738 + 4 + 0 + + + 33 + 475 + 743 + 6 + 0 + + + 395 + 474 + 736 + 1 + 0 + + + 404 + 473 + 743 + 6 + 0 + + + 32 + 473 + 739 + 6 + 0 + + + 700 + 447 + 751 + 6 + 0 + + + 401 + 447 + 745 + 7 + 0 + + + 398 + 446 + 747 + 2 + 0 + + + 33 + 445 + 751 + 0 + 0 + + + 405 + 445 + 750 + 1 + 0 + + + 395 + 445 + 747 + 2 + 0 + + + 32 + 445 + 745 + 2 + 0 + + + 402 + 444 + 747 + 7 + 0 + + + 401 + 442 + 745 + 2 + 0 + + + 395 + 441 + 751 + 2 + 0 + + + 32 + 441 + 750 + 2 + 0 + + + 21 + 440 + 750 + 2 + 0 + + + 21 + 440 + 749 + 0 + 0 + + + 407 + 454 + 750 + 2 + 0 + + + 21 + 454 + 747 + 7 + 0 + + + 21 + 454 + 745 + 7 + 0 + + + 50 + 453 + 744 + 0 + 0 + + + 21 + 451 + 747 + 7 + 0 + + + 21 + 451 + 745 + 7 + 0 + + + 395 + 449 + 751 + 2 + 0 + + + 394 + 449 + 750 + 2 + 0 + + + 399 + 449 + 748 + 3 + 0 + + + 394 + 448 + 746 + 2 + 0 + + + 405 + 463 + 747 + 1 + 0 + + + 398 + 461 + 744 + 4 + 0 + + + 402 + 460 + 747 + 2 + 0 + + + 21 + 459 + 751 + 0 + 0 + + + 21 + 458 + 751 + 0 + 0 + + + 404 + 458 + 747 + 2 + 0 + + + 401 + 458 + 744 + 2 + 0 + + + 399 + 456 + 744 + 1 + 0 + + + 398 + 471 + 750 + 5 + 0 + + + 399 + 471 + 745 + 6 + 0 + + + 395 + 470 + 749 + 6 + 0 + + + 396 + 469 + 744 + 6 + 0 + + + 400 + 468 + 748 + 5 + 0 + + + 396 + 467 + 750 + 5 + 0 + + + 397 + 467 + 746 + 6 + 0 + + + 402 + 466 + 751 + 0 + 0 + + + 398 + 466 + 744 + 6 + 0 + + + 401 + 465 + 750 + 0 + 0 + + + 395 + 465 + 748 + 1 + 0 + + + 402 + 464 + 749 + 0 + 0 + + + 399 + 464 + 745 + 4 + 0 + + + 405 + 476 + 745 + 1 + 0 + + + 32 + 475 + 748 + 2 + 0 + + + 32 + 474 + 750 + 3 + 0 + + + 399 + 473 + 749 + 5 + 0 + + + 32 + 473 + 746 + 6 + 0 + + + 32 + 447 + 753 + 0 + 0 + + + 394 + 446 + 753 + 2 + 0 + + + 398 + 445 + 757 + 2 + 0 + + + 395 + 445 + 752 + 2 + 0 + + + 32 + 443 + 758 + 7 + 0 + + + 399 + 442 + 756 + 2 + 0 + + + 430 + 441 + 759 + 7 + 0 + + + 33 + 441 + 752 + 2 + 0 + + + 21 + 440 + 753 + 0 + 0 + + + 21 + 440 + 752 + 2 + 0 + + + 21 + 454 + 756 + 0 + 0 + + + 21 + 454 + 755 + 0 + 0 + + + 399 + 452 + 758 + 0 + 0 + + + 403 + 452 + 752 + 2 + 0 + + + 32 + 451 + 756 + 2 + 0 + + + 397 + 450 + 759 + 2 + 0 + + + 32 + 450 + 756 + 2 + 0 + + + 404 + 450 + 755 + 2 + 0 + + + 33 + 449 + 759 + 2 + 0 + + + 33 + 449 + 752 + 0 + 0 + + + 396 + 448 + 757 + 2 + 0 + + + 395 + 448 + 753 + 2 + 0 + + + 399 + 463 + 759 + 4 + 0 + + + 21 + 462 + 755 + 0 + 0 + + + 21 + 462 + 754 + 0 + 0 + + + 21 + 460 + 757 + 5 + 0 + + + 21 + 458 + 759 + 0 + 0 + + + 5 + 458 + 755 + 0 + 0 + + + 21 + 457 + 759 + 0 + 0 + + + 21 + 456 + 753 + 5 + 0 + + + 394 + 470 + 758 + 7 + 0 + + + 397 + 470 + 756 + 4 + 0 + + + 32 + 470 + 752 + 7 + 0 + + + 397 + 469 + 754 + 5 + 0 + + + 397 + 469 + 752 + 5 + 0 + + + 397 + 468 + 759 + 4 + 0 + + + 396 + 468 + 756 + 4 + 0 + + + 401 + 468 + 753 + 5 + 0 + + + 402 + 467 + 754 + 5 + 0 + + + 398 + 467 + 753 + 5 + 0 + + + 399 + 466 + 755 + 5 + 0 + + + 403 + 466 + 754 + 1 + 0 + + + 401 + 466 + 752 + 0 + 0 + + + 394 + 465 + 758 + 4 + 0 + + + 403 + 465 + 753 + 7 + 0 + + + 33 + 476 + 757 + 4 + 0 + + + 32 + 475 + 759 + 5 + 0 + + + 32 + 475 + 755 + 6 + 0 + + + 33 + 474 + 753 + 0 + 0 + + + 399 + 473 + 759 + 4 + 0 + + + 405 + 473 + 755 + 7 + 0 + + + 398 + 472 + 757 + 4 + 0 + + + 396 + 472 + 753 + 5 + 0 + + + 33 + 439 + 730 + 2 + 0 + + + 403 + 437 + 735 + 1 + 0 + + + 32 + 437 + 733 + 2 + 0 + + + 394 + 436 + 731 + 1 + 0 + + + 395 + 434 + 734 + 7 + 0 + + + 397 + 434 + 732 + 1 + 0 + + + 398 + 439 + 742 + 2 + 0 + + + 32 + 438 + 741 + 0 + 0 + + + 401 + 438 + 738 + 1 + 0 + + + 394 + 436 + 741 + 0 + 0 + + + 396 + 435 + 743 + 1 + 0 + + + 32 + 435 + 739 + 0 + 0 + + + 402 + 435 + 736 + 7 + 0 + + + 397 + 433 + 741 + 1 + 0 + + + 398 + 432 + 737 + 1 + 0 + + + 21 + 439 + 748 + 5 + 0 + + + 21 + 438 + 747 + 0 + 0 + + + 403 + 438 + 744 + 0 + 0 + + + 21 + 437 + 747 + 0 + 0 + + + 21 + 436 + 747 + 0 + 0 + + + 21 + 435 + 747 + 5 + 0 + + + 401 + 435 + 745 + 0 + 0 + + + 21 + 434 + 748 + 5 + 0 + + + 21 + 433 + 751 + 0 + 0 + + + 21 + 433 + 750 + 0 + 0 + + + 21 + 433 + 749 + 5 + 0 + + + 32 + 432 + 749 + 7 + 0 + + + 402 + 432 + 744 + 0 + 0 + + + 394 + 439 + 758 + 6 + 0 + + + 21 + 439 + 754 + 5 + 0 + + + 403 + 438 + 759 + 3 + 0 + + + 404 + 438 + 756 + 5 + 0 + + + 21 + 438 + 755 + 2 + 0 + + + 21 + 437 + 755 + 2 + 0 + + + 21 + 436 + 755 + 2 + 0 + + + 403 + 435 + 757 + 7 + 0 + + + 21 + 435 + 755 + 5 + 0 + + + 404 + 434 + 759 + 3 + 0 + + + 21 + 434 + 754 + 5 + 0 + + + 401 + 433 + 756 + 1 + 0 + + + 21 + 433 + 753 + 5 + 0 + + + 21 + 433 + 752 + 0 + 0 + + + 394 + 432 + 758 + 3 + 0 + + + 401 + 431 + 742 + 1 + 0 + + + 402 + 430 + 743 + 1 + 0 + + + 6 + 426 + 740 + 4 + 0 + + + 397 + 430 + 749 + 0 + 0 + + + 403 + 430 + 747 + 0 + 0 + + + 394 + 429 + 751 + 4 + 0 + + + 396 + 429 + 748 + 3 + 0 + + + 404 + 429 + 744 + 1 + 0 + + + 398 + 427 + 748 + 4 + 0 + + + 32 + 427 + 745 + 1 + 0 + + + 402 + 426 + 750 + 4 + 0 + + + 397 + 425 + 747 + 4 + 0 + + + 403 + 424 + 749 + 4 + 0 + + + 33 + 424 + 744 + 1 + 0 + + + 404 + 431 + 757 + 0 + 0 + + + 396 + 431 + 752 + 0 + 0 + + + 399 + 430 + 755 + 0 + 0 + + + 32 + 429 + 758 + 1 + 0 + + + 398 + 429 + 753 + 0 + 0 + + + 395 + 428 + 754 + 1 + 0 + + + 399 + 427 + 757 + 0 + 0 + + + 395 + 426 + 753 + 4 + 0 + + + 404 + 424 + 757 + 3 + 0 + + + 401 + 422 + 751 + 4 + 0 + + + 396 + 422 + 747 + 4 + 0 + + + 404 + 421 + 749 + 4 + 0 + + + 32 + 421 + 745 + 4 + 0 + + + 33 + 419 + 747 + 4 + 0 + + + 403 + 418 + 751 + 1 + 0 + + + 394 + 418 + 749 + 4 + 0 + + + 405 + 423 + 752 + 4 + 0 + + + 398 + 422 + 754 + 1 + 0 + + + 396 + 421 + 758 + 1 + 0 + + + 397 + 421 + 756 + 1 + 0 + + + 33 + 419 + 756 + 1 + 0 + + + 399 + 419 + 753 + 1 + 0 + + + 399 + 418 + 759 + 1 + 0 + + + 401 + 417 + 757 + 1 + 0 + + + 404 + 417 + 753 + 1 + 0 + + + 33 + 423 + 766 + 2 + 0 + + + 395 + 422 + 762 + 1 + 0 + + + 402 + 421 + 765 + 1 + 0 + + + 404 + 420 + 760 + 1 + 0 + + + 32 + 419 + 766 + 0 + 0 + + + 401 + 419 + 763 + 1 + 0 + + + 397 + 417 + 764 + 1 + 0 + + + 398 + 417 + 762 + 1 + 0 + + + 403 + 416 + 766 + 1 + 0 + + + 32 + 429 + 765 + 1 + 0 + + + 394 + 429 + 761 + 1 + 0 + + + 397 + 428 + 763 + 1 + 0 + + + 32 + 427 + 767 + 0 + 0 + + + 398 + 427 + 760 + 1 + 0 + + + 405 + 426 + 765 + 1 + 0 + + + 396 + 426 + 762 + 1 + 0 + + + 33 + 424 + 764 + 1 + 0 + + + 622 + 424 + 762 + 0 + 0 + + + 399 + 424 + 760 + 1 + 0 + + + 33 + 437 + 764 + 2 + 0 + + + 395 + 436 + 760 + 3 + 0 + + + 405 + 434 + 767 + 2 + 0 + + + 398 + 434 + 764 + 7 + 0 + + + 404 + 433 + 765 + 2 + 0 + + + 396 + 433 + 762 + 7 + 0 + + + 397 + 433 + 760 + 7 + 0 + + + 399 + 432 + 766 + 7 + 0 + + + 403 + 432 + 763 + 2 + 0 + + + 32 + 444 + 767 + 2 + 0 + + + 5 + 444 + 763 + 4 + 0 + + + 32 + 443 + 760 + 2 + 0 + + + 397 + 455 + 760 + 5 + 0 + + + 5 + 454 + 764 + 4 + 0 + + + 398 + 453 + 760 + 7 + 0 + + + 33 + 452 + 767 + 2 + 0 + + + 32 + 451 + 761 + 2 + 0 + + + 33 + 450 + 762 + 2 + 0 + + + 5 + 449 + 762 + 4 + 0 + + + 1 + 447 + 760 + 0 + 1 + + + 2 + 441 + 761 + 2 + 1 + + + 1 + 454 + 762 + 3 + 1 + + + 21 + 410 + 742 + 0 + 0 + + + 21 + 409 + 738 + 4 + 0 + + + 395 + 415 + 750 + 4 + 0 + + + 402 + 411 + 747 + 0 + 0 + + + 21 + 410 + 745 + 0 + 0 + + + 22 + 408 + 744 + 5 + 0 + + + 402 + 415 + 756 + 1 + 0 + + + 396 + 415 + 754 + 1 + 0 + + + 55 + 415 + 752 + 7 + 0 + + + 404 + 414 + 759 + 1 + 0 + + + 155 + 412 + 753 + 2 + 0 + + + 8 + 410 + 758 + 2 + 0 + + + 8 + 410 + 756 + 7 + 0 + + + 56 + 410 + 753 + 4 + 0 + + + 8 + 409 + 757 + 5 + 0 + + + 3 + 409 + 755 + 0 + 0 + + + 3 + 408 + 752 + 0 + 0 + + + 395 + 414 + 765 + 1 + 0 + + + 32 + 412 + 767 + 0 + 0 + + + 405 + 411 + 763 + 1 + 0 + + + 396 + 410 + 765 + 0 + 0 + + + 394 + 408 + 765 + 0 + 0 + + + 396 + 408 + 762 + 0 + 0 + + + 394 + 408 + 760 + 1 + 0 + + + 396 + 415 + 774 + 7 + 0 + + + 396 + 415 + 769 + 7 + 0 + + + 394 + 414 + 771 + 7 + 0 + + + 395 + 413 + 773 + 7 + 0 + + + 397 + 413 + 769 + 7 + 0 + + + 404 + 413 + 768 + 7 + 0 + + + 401 + 412 + 770 + 7 + 0 + + + 396 + 411 + 774 + 4 + 0 + + + 398 + 411 + 768 + 7 + 0 + + + 33 + 410 + 772 + 7 + 0 + + + 396 + 410 + 770 + 7 + 0 + + + 402 + 410 + 769 + 7 + 0 + + + 397 + 408 + 775 + 4 + 0 + + + 397 + 408 + 769 + 7 + 0 + + + 397 + 423 + 775 + 1 + 0 + + + 396 + 422 + 773 + 3 + 0 + + + 398 + 422 + 771 + 3 + 0 + + + 404 + 422 + 768 + 3 + 0 + + + 399 + 421 + 775 + 1 + 0 + + + 399 + 420 + 770 + 3 + 0 + + + 396 + 419 + 775 + 1 + 0 + + + 32 + 419 + 773 + 3 + 0 + + + 394 + 419 + 768 + 3 + 0 + + + 33 + 418 + 771 + 6 + 0 + + + 405 + 417 + 774 + 3 + 0 + + + 395 + 417 + 769 + 3 + 0 + + + 32 + 416 + 772 + 4 + 0 + + + 33 + 430 + 772 + 2 + 0 + + + 32 + 430 + 770 + 2 + 0 + + + 405 + 429 + 775 + 3 + 0 + + + 5 + 429 + 771 + 0 + 0 + + + 33 + 425 + 774 + 3 + 0 + + + 397 + 424 + 770 + 3 + 0 + + + 403 + 424 + 768 + 3 + 0 + + + 403 + 439 + 774 + 3 + 0 + + + 404 + 437 + 774 + 3 + 0 + + + 32 + 435 + 772 + 3 + 0 + + + 396 + 434 + 774 + 3 + 0 + + + 398 + 433 + 772 + 3 + 0 + + + 399 + 433 + 769 + 3 + 0 + + + 401 + 432 + 774 + 3 + 0 + + + 396 + 432 + 771 + 3 + 0 + + + 8 + 447 + 775 + 2 + 0 + + + 5 + 446 + 769 + 0 + 0 + + + 401 + 445 + 775 + 2 + 0 + + + 401 + 442 + 774 + 3 + 0 + + + 5 + 441 + 770 + 0 + 0 + + + 33 + 440 + 775 + 3 + 0 + + + 2 + 425 + 771 + 1 + 1 + + + 2 + 442 + 773 + 0 + 1 + + + 2 + 442 + 769 + 0 + 1 + + + 21 + 407 + 741 + 5 + 0 + + + 8 + 406 + 740 + 2 + 0 + + + 21 + 405 + 738 + 4 + 0 + + + 21 + 404 + 741 + 0 + 0 + + + 8 + 404 + 740 + 2 + 0 + + + 8 + 403 + 740 + 2 + 0 + + + 22 + 401 + 741 + 5 + 0 + + + 22 + 401 + 740 + 5 + 0 + + + 21 + 401 + 738 + 4 + 0 + + + 21 + 400 + 741 + 4 + 0 + + + 8 + 407 + 747 + 7 + 0 + + + 21 + 407 + 744 + 4 + 0 + + + 55 + 406 + 750 + 5 + 0 + + + 8 + 406 + 747 + 5 + 0 + + + 21 + 403 + 749 + 0 + 0 + + + 21 + 403 + 745 + 0 + 0 + + + 8 + 401 + 744 + 7 + 0 + + + 21 + 400 + 750 + 4 + 0 + + + 21 + 400 + 746 + 4 + 0 + + + 21 + 400 + 744 + 6 + 0 + + + 55 + 407 + 758 + 7 + 0 + + + 22 + 407 + 756 + 5 + 0 + + + 22 + 407 + 754 + 5 + 0 + + + 55 + 406 + 759 + 2 + 0 + + + 395 + 404 + 759 + 4 + 0 + + + 33 + 403 + 757 + 5 + 0 + + + 22 + 403 + 752 + 5 + 0 + + + 33 + 402 + 759 + 1 + 0 + + + 33 + 402 + 757 + 0 + 0 + + + 33 + 402 + 753 + 0 + 0 + + + 32 + 400 + 758 + 1 + 0 + + + 32 + 400 + 755 + 0 + 0 + + + 22 + 400 + 754 + 5 + 0 + + + 22 + 400 + 753 + 5 + 0 + + + 33 + 407 + 767 + 6 + 0 + + + 32 + 406 + 761 + 0 + 0 + + + 395 + 405 + 764 + 0 + 0 + + + 394 + 404 + 762 + 4 + 0 + + + 32 + 404 + 760 + 5 + 0 + + + 32 + 403 + 767 + 7 + 0 + + + 394 + 403 + 765 + 6 + 0 + + + 33 + 403 + 763 + 5 + 0 + + + 32 + 401 + 765 + 5 + 0 + + + 624 + 401 + 762 + 6 + 0 + + + 33 + 401 + 761 + 1 + 0 + + + 395 + 400 + 765 + 4 + 0 + + + 553 + 400 + 762 + 0 + 0 + + + 394 + 400 + 760 + 7 + 0 + + + 32 + 407 + 773 + 7 + 0 + + + 401 + 406 + 774 + 7 + 0 + + + 398 + 406 + 770 + 7 + 0 + + + 395 + 405 + 772 + 0 + 0 + + + 405 + 404 + 774 + 0 + 0 + + + 399 + 404 + 771 + 7 + 0 + + + 398 + 404 + 768 + 0 + 0 + + + 396 + 403 + 769 + 0 + 0 + + + 33 + 402 + 771 + 0 + 0 + + + 396 + 401 + 774 + 0 + 0 + + + 397 + 401 + 768 + 0 + 0 + + + 399 + 400 + 771 + 0 + 0 + + + 161 + 407 + 753 + 1 + 1 + + + 394 + 406 + 781 + 7 + 0 + + + 396 + 406 + 779 + 7 + 0 + + + 402 + 405 + 776 + 7 + 0 + + + 395 + 404 + 782 + 7 + 0 + + + 398 + 404 + 779 + 7 + 0 + + + 404 + 403 + 777 + 7 + 0 + + + 394 + 402 + 783 + 7 + 0 + + + 32 + 402 + 781 + 7 + 0 + + + 397 + 402 + 779 + 7 + 0 + + + 33 + 400 + 782 + 7 + 0 + + + 396 + 400 + 780 + 7 + 0 + + + 396 + 400 + 776 + 7 + 0 + + + 403 + 415 + 778 + 7 + 0 + + + 33 + 414 + 783 + 7 + 0 + + + 398 + 414 + 776 + 1 + 0 + + + 404 + 413 + 783 + 1 + 0 + + + 395 + 413 + 781 + 7 + 0 + + + 397 + 413 + 778 + 0 + 0 + + + 404 + 412 + 782 + 1 + 0 + + + 403 + 412 + 780 + 7 + 0 + + + 399 + 412 + 776 + 4 + 0 + + + 32 + 411 + 783 + 7 + 0 + + + 396 + 411 + 778 + 7 + 0 + + + 394 + 410 + 781 + 7 + 0 + + + 398 + 410 + 776 + 4 + 0 + + + 405 + 408 + 783 + 7 + 0 + + + 395 + 408 + 782 + 7 + 0 + + + 404 + 408 + 777 + 7 + 0 + + + 395 + 423 + 778 + 1 + 0 + + + 32 + 422 + 780 + 4 + 0 + + + 33 + 421 + 783 + 5 + 0 + + + 396 + 419 + 780 + 0 + 0 + + + 33 + 419 + 777 + 1 + 0 + + + 404 + 417 + 783 + 0 + 0 + + + 398 + 417 + 779 + 0 + 0 + + + 399 + 417 + 776 + 1 + 0 + + + 399 + 416 + 781 + 0 + 0 + + + 395 + 431 + 783 + 2 + 0 + + + 395 + 431 + 776 + 2 + 0 + + + 394 + 430 + 780 + 2 + 0 + + + 398 + 429 + 782 + 0 + 0 + + + 396 + 429 + 778 + 0 + 0 + + + 397 + 428 + 780 + 0 + 0 + + + 33 + 427 + 783 + 7 + 0 + + + 394 + 426 + 777 + 1 + 0 + + + 399 + 425 + 781 + 0 + 0 + + + 404 + 424 + 777 + 1 + 0 + + + 398 + 439 + 780 + 3 + 0 + + + 399 + 438 + 782 + 3 + 0 + + + 33 + 438 + 778 + 3 + 0 + + + 403 + 438 + 776 + 3 + 0 + + + 32 + 436 + 781 + 3 + 0 + + + 32 + 436 + 776 + 3 + 0 + + + 398 + 435 + 778 + 3 + 0 + + + 395 + 433 + 783 + 7 + 0 + + + 399 + 433 + 780 + 3 + 0 + + + 397 + 433 + 776 + 3 + 0 + + + 33 + 432 + 781 + 5 + 0 + + + 402 + 432 + 778 + 3 + 0 + + + 157 + 397 + 745 + 2 + 0 + + + 21 + 396 + 744 + 6 + 0 + + + 33 + 399 + 759 + 1 + 0 + + + 553 + 397 + 759 + 0 + 0 + + + 32 + 397 + 758 + 2 + 0 + + + 32 + 397 + 757 + 7 + 0 + + + 553 + 397 + 756 + 0 + 0 + + + 32 + 396 + 755 + 0 + 0 + + + 33 + 395 + 759 + 1 + 0 + + + 33 + 395 + 758 + 1 + 0 + + + 193 + 395 + 754 + 0 + 0 + + + 32 + 394 + 757 + 2 + 0 + + + 405 + 394 + 756 + 5 + 0 + + + 32 + 394 + 755 + 4 + 0 + + + 33 + 399 + 767 + 5 + 0 + + + 33 + 398 + 765 + 7 + 0 + + + 553 + 398 + 762 + 0 + 0 + + + 32 + 398 + 760 + 1 + 0 + + + 33 + 397 + 763 + 1 + 0 + + + 394 + 396 + 767 + 4 + 0 + + + 32 + 395 + 766 + 5 + 0 + + + 553 + 395 + 763 + 0 + 0 + + + 33 + 394 + 764 + 7 + 0 + + + 553 + 394 + 760 + 0 + 0 + + + 33 + 393 + 767 + 5 + 0 + + + 394 + 393 + 761 + 5 + 0 + + + 32 + 392 + 762 + 1 + 0 + + + 397 + 399 + 774 + 0 + 0 + + + 404 + 399 + 769 + 0 + 0 + + + 398 + 397 + 774 + 0 + 0 + + + 32 + 397 + 772 + 0 + 0 + + + 395 + 396 + 770 + 0 + 0 + + + 394 + 395 + 772 + 0 + 0 + + + 405 + 394 + 774 + 0 + 0 + + + 404 + 394 + 770 + 7 + 0 + + + 397 + 393 + 775 + 5 + 0 + + + 399 + 392 + 773 + 0 + 0 + + + 396 + 392 + 770 + 0 + 0 + + + 401 + 392 + 768 + 0 + 0 + + + 402 + 399 + 779 + 7 + 0 + + + 397 + 399 + 777 + 7 + 0 + + + 405 + 398 + 783 + 7 + 0 + + + 401 + 397 + 781 + 7 + 0 + + + 401 + 397 + 778 + 7 + 0 + + + 404 + 397 + 776 + 7 + 0 + + + 394 + 396 + 783 + 5 + 0 + + + 396 + 395 + 778 + 5 + 0 + + + 398 + 395 + 776 + 5 + 0 + + + 32 + 394 + 783 + 5 + 0 + + + 32 + 394 + 780 + 5 + 0 + + + 395 + 393 + 777 + 5 + 0 + + + 395 + 392 + 782 + 5 + 0 + + + 396 + 392 + 779 + 5 + 0 + + + 397 + 399 + 790 + 3 + 0 + + + 396 + 399 + 786 + 4 + 0 + + + 396 + 398 + 788 + 4 + 0 + + + 395 + 397 + 790 + 4 + 0 + + + 32 + 397 + 787 + 4 + 0 + + + 33 + 396 + 785 + 4 + 0 + + + 394 + 395 + 791 + 4 + 0 + + + 33 + 395 + 788 + 4 + 0 + + + 396 + 393 + 791 + 4 + 0 + + + 397 + 393 + 789 + 4 + 0 + + + 394 + 393 + 787 + 4 + 0 + + + 403 + 393 + 785 + 4 + 0 + + + 401 + 407 + 789 + 1 + 0 + + + 395 + 406 + 784 + 7 + 0 + + + 397 + 405 + 791 + 3 + 0 + + + 404 + 405 + 787 + 4 + 0 + + + 395 + 404 + 789 + 4 + 0 + + + 404 + 403 + 791 + 3 + 0 + + + 395 + 403 + 785 + 4 + 0 + + + 394 + 402 + 787 + 4 + 0 + + + 394 + 401 + 790 + 4 + 0 + + + 404 + 401 + 786 + 3 + 0 + + + 395 + 400 + 788 + 4 + 0 + + + 395 + 400 + 784 + 7 + 0 + + + 399 + 415 + 789 + 4 + 0 + + + 396 + 415 + 786 + 4 + 0 + + + 404 + 414 + 791 + 4 + 0 + + + 399 + 413 + 785 + 4 + 0 + + + 398 + 412 + 791 + 2 + 0 + + + 32 + 412 + 789 + 1 + 0 + + + 403 + 412 + 787 + 2 + 0 + + + 398 + 411 + 786 + 4 + 0 + + + 32 + 410 + 791 + 4 + 0 + + + 403 + 410 + 788 + 4 + 0 + + + 402 + 409 + 789 + 1 + 0 + + + 397 + 409 + 785 + 4 + 0 + + + 395 + 408 + 790 + 4 + 0 + + + 396 + 408 + 787 + 4 + 0 + + + 33 + 423 + 791 + 3 + 0 + + + 396 + 423 + 789 + 1 + 0 + + + 32 + 422 + 785 + 0 + 0 + + + 394 + 421 + 788 + 3 + 0 + + + 397 + 420 + 790 + 7 + 0 + + + 395 + 419 + 788 + 1 + 0 + + + 405 + 419 + 785 + 1 + 0 + + + 398 + 418 + 791 + 7 + 0 + + + 394 + 417 + 789 + 4 + 0 + + + 398 + 417 + 787 + 4 + 0 + + + 397 + 417 + 785 + 4 + 0 + + + 404 + 431 + 790 + 2 + 0 + + + 396 + 431 + 786 + 2 + 0 + + + 32 + 429 + 791 + 3 + 0 + + + 398 + 429 + 789 + 7 + 0 + + + 405 + 429 + 785 + 4 + 0 + + + 394 + 428 + 787 + 1 + 0 + + + 397 + 427 + 790 + 1 + 0 + + + 395 + 426 + 788 + 3 + 0 + + + 404 + 425 + 791 + 3 + 0 + + + 33 + 425 + 784 + 0 + 0 + + + 32 + 424 + 787 + 1 + 0 + + + 618 + 389 + 752 + 4 + 0 + + + 395 + 391 + 766 + 4 + 0 + + + 32 + 390 + 765 + 5 + 0 + + + 32 + 390 + 761 + 7 + 0 + + + 33 + 389 + 763 + 7 + 0 + + + 398 + 388 + 764 + 0 + 0 + + + 33 + 387 + 765 + 5 + 0 + + + 398 + 387 + 763 + 0 + 0 + + + 660 + 387 + 760 + 2 + 0 + + + 397 + 386 + 766 + 0 + 0 + + + 32 + 386 + 762 + 5 + 0 + + + 396 + 385 + 764 + 0 + 0 + + + 397 + 384 + 765 + 0 + 0 + + + 404 + 391 + 775 + 5 + 0 + + + 395 + 391 + 771 + 0 + 0 + + + 399 + 390 + 770 + 0 + 0 + + + 394 + 389 + 773 + 0 + 0 + + + 402 + 389 + 768 + 0 + 0 + + + 399 + 388 + 770 + 7 + 0 + + + 398 + 387 + 771 + 1 + 0 + + + 33 + 386 + 773 + 0 + 0 + + + 404 + 386 + 768 + 0 + 0 + + + 397 + 385 + 772 + 3 + 0 + + + 32 + 385 + 770 + 5 + 0 + + + 405 + 384 + 774 + 0 + 0 + + + 33 + 384 + 768 + 0 + 0 + + + 32 + 390 + 782 + 5 + 0 + + + 398 + 390 + 780 + 4 + 0 + + + 33 + 390 + 778 + 5 + 0 + + + 394 + 388 + 783 + 5 + 0 + + + 404 + 388 + 781 + 4 + 0 + + + 396 + 388 + 779 + 5 + 0 + + + 394 + 388 + 776 + 5 + 0 + + + 395 + 386 + 782 + 5 + 0 + + + 32 + 386 + 777 + 5 + 0 + + + 33 + 385 + 779 + 5 + 0 + + + 405 + 384 + 783 + 4 + 0 + + + 395 + 384 + 781 + 5 + 0 + + + 32 + 384 + 776 + 7 + 0 + + + 398 + 391 + 789 + 4 + 0 + + + 404 + 391 + 785 + 4 + 0 + + + 399 + 390 + 791 + 1 + 0 + + + 33 + 390 + 787 + 4 + 0 + + + 395 + 389 + 789 + 4 + 0 + + + 399 + 389 + 784 + 4 + 0 + + + 398 + 388 + 791 + 3 + 0 + + + 32 + 388 + 786 + 4 + 0 + + + 399 + 387 + 788 + 4 + 0 + + + 397 + 386 + 790 + 5 + 0 + + + 404 + 386 + 786 + 2 + 0 + + + 397 + 386 + 784 + 2 + 0 + + + 396 + 385 + 788 + 2 + 0 + + + 33 + 384 + 790 + 4 + 0 + + + 32 + 384 + 786 + 6 + 0 + + + 396 + 383 + 769 + 0 + 0 + + + 404 + 382 + 772 + 0 + 0 + + + 405 + 381 + 769 + 4 + 0 + + + 399 + 380 + 773 + 7 + 0 + + + 399 + 380 + 771 + 5 + 0 + + + 33 + 379 + 775 + 7 + 0 + + + 404 + 378 + 772 + 7 + 0 + + + 398 + 378 + 769 + 7 + 0 + + + 32 + 376 + 775 + 7 + 0 + + + 394 + 376 + 771 + 5 + 0 + + + 398 + 376 + 769 + 5 + 0 + + + 402 + 383 + 783 + 0 + 0 + + + 403 + 383 + 777 + 0 + 0 + + + 405 + 381 + 781 + 7 + 0 + + + 404 + 379 + 782 + 4 + 0 + + + 395 + 379 + 778 + 7 + 0 + + + 396 + 378 + 780 + 5 + 0 + + + 394 + 376 + 783 + 4 + 0 + + + 397 + 376 + 779 + 5 + 0 + + + 404 + 383 + 787 + 0 + 0 + + + 395 + 381 + 790 + 4 + 0 + + + 403 + 381 + 784 + 4 + 0 + + + 33 + 380 + 788 + 4 + 0 + + + 403 + 379 + 791 + 4 + 0 + + + 396 + 378 + 785 + 4 + 0 + + + 394 + 377 + 789 + 4 + 0 + + + 397 + 376 + 786 + 4 + 0 + + + 396 + 383 + 793 + 0 + 0 + + + 401 + 381 + 798 + 7 + 0 + + + 405 + 381 + 794 + 0 + 0 + + + 404 + 379 + 797 + 0 + 0 + + + 33 + 378 + 793 + 4 + 0 + + + 395 + 377 + 798 + 7 + 0 + + + 397 + 376 + 796 + 7 + 0 + + + 395 + 391 + 797 + 4 + 0 + + + 394 + 390 + 794 + 6 + 0 + + + 33 + 389 + 799 + 4 + 0 + + + 396 + 389 + 796 + 4 + 0 + + + 32 + 388 + 793 + 6 + 0 + + + 394 + 387 + 797 + 4 + 0 + + + 404 + 386 + 799 + 4 + 0 + + + 395 + 386 + 794 + 6 + 0 + + + 396 + 386 + 792 + 4 + 0 + + + 33 + 384 + 797 + 4 + 0 + + + 32 + 384 + 793 + 4 + 0 + + + 399 + 399 + 797 + 1 + 0 + + + 33 + 398 + 793 + 3 + 0 + + + 404 + 397 + 799 + 1 + 0 + + + 32 + 397 + 795 + 3 + 0 + + + 398 + 397 + 792 + 3 + 0 + + + 394 + 396 + 797 + 3 + 0 + + + 395 + 395 + 799 + 3 + 0 + + + 405 + 395 + 793 + 4 + 0 + + + 395 + 394 + 796 + 3 + 0 + + + 395 + 394 + 794 + 6 + 0 + + + 32 + 393 + 798 + 3 + 0 + + + 33 + 392 + 793 + 6 + 0 + + + 32 + 407 + 795 + 0 + 0 + + + 399 + 406 + 798 + 3 + 0 + + + 395 + 406 + 794 + 3 + 0 + + + 404 + 404 + 797 + 1 + 0 + + + 394 + 404 + 793 + 3 + 0 + + + 399 + 402 + 798 + 1 + 0 + + + 399 + 402 + 796 + 1 + 0 + + + 32 + 402 + 794 + 3 + 0 + + + 396 + 400 + 795 + 3 + 0 + + + 399 + 400 + 792 + 3 + 0 + + + 401 + 415 + 799 + 0 + 0 + + + 399 + 414 + 797 + 1 + 0 + + + 401 + 414 + 795 + 1 + 0 + + + 395 + 414 + 793 + 1 + 0 + + + 395 + 413 + 799 + 0 + 0 + + + 404 + 412 + 799 + 1 + 0 + + + 106 + 412 + 796 + 1 + 0 + + + 195 + 412 + 795 + 2 + 0 + + + 555 + 412 + 794 + 0 + 0 + + + 111 + 411 + 794 + 4 + 0 + + + 398 + 410 + 799 + 2 + 0 + + + 107 + 410 + 797 + 2 + 0 + + + 110 + 410 + 796 + 7 + 0 + + + 108 + 410 + 795 + 6 + 0 + + + 109 + 410 + 794 + 5 + 0 + + + 394 + 408 + 797 + 0 + 0 + + + 32 + 408 + 793 + 4 + 0 + + + 405 + 408 + 792 + 4 + 0 + + + 164 + 373 + 764 + 7 + 0 + + + 164 + 372 + 763 + 6 + 0 + + + 396 + 374 + 770 + 7 + 0 + + + 397 + 373 + 773 + 7 + 0 + + + 405 + 371 + 768 + 7 + 0 + + + 398 + 370 + 772 + 1 + 0 + + + 399 + 369 + 775 + 1 + 0 + + + 32 + 368 + 771 + 0 + 0 + + + 402 + 374 + 782 + 4 + 0 + + + 398 + 374 + 780 + 5 + 0 + + + 394 + 374 + 777 + 7 + 0 + + + 404 + 372 + 776 + 6 + 0 + + + 405 + 371 + 781 + 3 + 0 + + + 399 + 371 + 778 + 5 + 0 + + + 395 + 369 + 783 + 1 + 0 + + + 692 + 369 + 781 + 6 + 0 + + + 403 + 369 + 778 + 1 + 0 + + + 692 + 368 + 781 + 6 + 0 + + + 399 + 375 + 788 + 4 + 0 + + + 32 + 374 + 791 + 4 + 0 + + + 404 + 373 + 789 + 4 + 0 + + + 32 + 373 + 784 + 4 + 0 + + + 398 + 372 + 786 + 4 + 0 + + + 32 + 369 + 789 + 1 + 0 + + + 396 + 369 + 786 + 1 + 0 + + + 395 + 375 + 793 + 0 + 0 + + + 394 + 374 + 799 + 7 + 0 + + + 396 + 373 + 797 + 7 + 0 + + + 405 + 371 + 794 + 4 + 0 + + + 402 + 369 + 798 + 4 + 0 + + + 394 + 369 + 795 + 1 + 0 + + + 396 + 368 + 792 + 1 + 0 + + + 404 + 367 + 774 + 0 + 0 + + + 401 + 367 + 769 + 0 + 0 + + + 218 + 366 + 770 + 1 + 0 + + + 396 + 365 + 771 + 1 + 0 + + + 33 + 364 + 773 + 0 + 0 + + + 403 + 363 + 769 + 1 + 0 + + + 399 + 362 + 771 + 1 + 0 + + + 401 + 361 + 773 + 0 + 0 + + + 32 + 361 + 768 + 0 + 0 + + + 32 + 360 + 775 + 0 + 0 + + + 395 + 360 + 771 + 0 + 0 + + + 692 + 367 + 781 + 6 + 0 + + + 395 + 367 + 776 + 1 + 0 + + + 396 + 366 + 783 + 1 + 0 + + + 401 + 365 + 778 + 1 + 0 + + + 398 + 364 + 781 + 1 + 0 + + + 397 + 364 + 776 + 1 + 0 + + + 399 + 362 + 779 + 1 + 0 + + + 394 + 361 + 779 + 2 + 0 + + + 397 + 367 + 787 + 1 + 0 + + + 398 + 366 + 789 + 1 + 0 + + + 394 + 366 + 785 + 1 + 0 + + + 399 + 364 + 790 + 1 + 0 + + + 394 + 363 + 788 + 1 + 0 + + + 405 + 363 + 785 + 1 + 0 + + + 396 + 362 + 791 + 1 + 0 + + + 404 + 361 + 786 + 0 + 0 + + + 395 + 360 + 789 + 0 + 0 + + + 33 + 360 + 784 + 4 + 0 + + + 398 + 367 + 795 + 1 + 0 + + + 32 + 366 + 799 + 4 + 0 + + + 399 + 366 + 797 + 1 + 0 + + + 33 + 365 + 792 + 1 + 0 + + + 397 + 364 + 794 + 1 + 0 + + + 405 + 363 + 797 + 1 + 0 + + + 403 + 362 + 793 + 6 + 0 + + + 98 + 361 + 798 + 4 + 0 + + + 98 + 361 + 796 + 4 + 0 + + + 395 + 361 + 794 + 6 + 0 + + + 98 + 360 + 797 + 3 + 0 + + + 403 + 359 + 773 + 0 + 0 + + + 396 + 358 + 769 + 0 + 0 + + + 405 + 357 + 774 + 0 + 0 + + + 401 + 357 + 771 + 0 + 0 + + + 397 + 356 + 768 + 0 + 0 + + + 403 + 355 + 774 + 0 + 0 + + + 33 + 355 + 772 + 0 + 0 + + + 398 + 355 + 770 + 0 + 0 + + + 394 + 353 + 775 + 0 + 0 + + + 399 + 353 + 771 + 0 + 0 + + + 397 + 352 + 773 + 6 + 0 + + + 404 + 352 + 768 + 0 + 0 + + + 395 + 359 + 781 + 4 + 0 + + + 399 + 359 + 779 + 0 + 0 + + + 397 + 359 + 777 + 0 + 0 + + + 396 + 358 + 778 + 0 + 0 + + + 397 + 358 + 776 + 0 + 0 + + + 396 + 357 + 783 + 4 + 0 + + + 397 + 357 + 780 + 4 + 0 + + + 394 + 357 + 778 + 0 + 0 + + + 218 + 356 + 780 + 4 + 0 + + + 404 + 356 + 777 + 4 + 0 + + + 32 + 355 + 781 + 4 + 0 + + + 403 + 355 + 776 + 0 + 0 + + + 396 + 354 + 778 + 0 + 0 + + + 397 + 353 + 781 + 4 + 0 + + + 399 + 359 + 791 + 6 + 0 + + + 397 + 359 + 787 + 0 + 0 + + + 403 + 358 + 789 + 6 + 0 + + + 397 + 358 + 785 + 0 + 0 + + + 399 + 357 + 787 + 6 + 0 + + + 404 + 356 + 790 + 7 + 0 + + + 394 + 356 + 784 + 4 + 0 + + + 398 + 355 + 788 + 6 + 0 + + + 32 + 355 + 786 + 0 + 0 + + + 403 + 353 + 788 + 6 + 0 + + + 405 + 353 + 785 + 4 + 0 + + + 405 + 352 + 790 + 4 + 0 + + + 99 + 359 + 799 + 3 + 0 + + + 33 + 359 + 793 + 0 + 0 + + + 404 + 358 + 795 + 6 + 0 + + + 398 + 357 + 797 + 6 + 0 + + + 398 + 357 + 792 + 6 + 0 + + + 397 + 355 + 798 + 6 + 0 + + + 396 + 355 + 795 + 6 + 0 + + + 394 + 354 + 792 + 0 + 0 + + + 405 + 353 + 797 + 0 + 0 + + + 398 + 353 + 794 + 6 + 0 + + + 399 + 351 + 770 + 7 + 0 + + + 395 + 350 + 775 + 7 + 0 + + + 398 + 349 + 773 + 6 + 0 + + + 404 + 349 + 771 + 6 + 0 + + + 397 + 349 + 769 + 6 + 0 + + + 396 + 348 + 775 + 6 + 0 + + + 397 + 347 + 771 + 5 + 0 + + + 98 + 347 + 768 + 1 + 0 + + + 32 + 346 + 773 + 4 + 0 + + + 98 + 346 + 769 + 1 + 0 + + + 98 + 346 + 768 + 7 + 0 + + + 98 + 345 + 770 + 2 + 0 + + + 98 + 345 + 769 + 1 + 0 + + + 397 + 344 + 773 + 4 + 0 + + + 98 + 344 + 770 + 3 + 0 + + + 98 + 344 + 769 + 6 + 0 + + + 398 + 350 + 782 + 2 + 0 + + + 400 + 351 + 783 + 2 + 0 + + + 573 + 351 + 781 + 4 + 0 + + + 395 + 351 + 777 + 6 + 0 + + + 399 + 350 + 783 + 2 + 0 + + + 573 + 350 + 781 + 0 + 0 + + + 394 + 349 + 779 + 6 + 0 + + + 32 + 349 + 777 + 6 + 0 + + + 396 + 347 + 781 + 4 + 0 + + + 394 + 347 + 778 + 4 + 0 + + + 397 + 346 + 779 + 4 + 0 + + + 397 + 345 + 783 + 4 + 0 + + + 396 + 345 + 776 + 4 + 0 + + + 405 + 344 + 781 + 0 + 0 + + + 33 + 344 + 778 + 4 + 0 + + + 399 + 351 + 787 + 4 + 0 + + + 399 + 350 + 791 + 4 + 0 + + + 396 + 350 + 789 + 4 + 0 + + + 394 + 350 + 784 + 0 + 0 + + + 403 + 349 + 787 + 4 + 0 + + + 399 + 349 + 785 + 4 + 0 + + + 404 + 348 + 790 + 4 + 0 + + + 398 + 347 + 787 + 4 + 0 + + + 398 + 347 + 784 + 4 + 0 + + + 397 + 346 + 791 + 4 + 0 + + + 401 + 346 + 789 + 4 + 0 + + + 403 + 345 + 787 + 4 + 0 + + + 395 + 345 + 785 + 4 + 0 + + + 399 + 344 + 789 + 2 + 0 + + + 395 + 351 + 798 + 4 + 0 + + + 394 + 351 + 793 + 4 + 0 + + + 32 + 350 + 795 + 4 + 0 + + + 396 + 349 + 799 + 4 + 0 + + + 33 + 348 + 796 + 4 + 0 + + + 398 + 348 + 792 + 4 + 0 + + + 396 + 347 + 794 + 4 + 0 + + + 405 + 345 + 798 + 4 + 0 + + + 401 + 345 + 795 + 2 + 0 + + + 399 + 344 + 792 + 2 + 0 + + + 395 + 343 + 775 + 4 + 0 + + + 98 + 343 + 770 + 1 + 0 + + + 399 + 342 + 772 + 4 + 0 + + + 396 + 339 + 774 + 4 + 0 + + + 32 + 338 + 772 + 5 + 0 + + + 33 + 336 + 774 + 5 + 0 + + + 32 + 342 + 782 + 4 + 0 + + + 397 + 342 + 779 + 4 + 0 + + + 397 + 341 + 776 + 4 + 0 + + + 395 + 340 + 783 + 4 + 0 + + + 398 + 340 + 780 + 4 + 0 + + + 396 + 340 + 778 + 4 + 0 + + + 394 + 338 + 782 + 4 + 0 + + + 404 + 338 + 778 + 4 + 0 + + + 396 + 337 + 780 + 4 + 0 + + + 403 + 337 + 776 + 4 + 0 + + + 397 + 336 + 778 + 4 + 0 + + + 401 + 343 + 786 + 4 + 0 + + + 395 + 342 + 790 + 4 + 0 + + + 396 + 342 + 788 + 2 + 0 + + + 396 + 342 + 784 + 4 + 0 + + + 397 + 341 + 786 + 4 + 0 + + + 404 + 339 + 790 + 4 + 0 + + + 398 + 339 + 785 + 4 + 0 + + + 32 + 338 + 788 + 4 + 0 + + + 403 + 337 + 790 + 2 + 0 + + + 399 + 337 + 784 + 4 + 0 + + + 405 + 336 + 786 + 4 + 0 + + + 396 + 343 + 799 + 0 + 0 + + + 399 + 343 + 796 + 2 + 0 + + + 33 + 342 + 794 + 4 + 0 + + + 399 + 342 + 792 + 2 + 0 + + + 394 + 341 + 797 + 2 + 0 + + + 396 + 340 + 799 + 0 + 0 + + + 404 + 340 + 792 + 2 + 0 + + + 397 + 339 + 797 + 0 + 0 + + + 405 + 339 + 795 + 2 + 0 + + + 33 + 337 + 799 + 0 + 0 + + + 395 + 337 + 796 + 2 + 0 + + + 394 + 337 + 793 + 4 + 0 + + + 402 + 343 + 803 + 0 + 0 + + + 32 + 341 + 801 + 0 + 0 + + + 399 + 340 + 803 + 0 + 0 + + + 404 + 339 + 801 + 0 + 0 + + + 396 + 338 + 805 + 0 + 0 + + + 395 + 337 + 803 + 0 + 0 + + + 403 + 351 + 804 + 4 + 0 + + + 33 + 350 + 802 + 6 + 0 + + + 98 + 349 + 807 + 1 + 0 + + + 405 + 349 + 805 + 4 + 0 + + + 399 + 348 + 804 + 4 + 0 + + + 397 + 348 + 802 + 4 + 0 + + + 701 + 347 + 806 + 0 + 0 + + + 397 + 347 + 800 + 4 + 0 + + + 701 + 346 + 807 + 0 + 0 + + + 404 + 346 + 803 + 4 + 0 + + + 98 + 344 + 806 + 0 + 0 + + + 403 + 344 + 801 + 0 + 0 + + + 32 + 356 + 800 + 6 + 0 + + + 33 + 354 + 801 + 6 + 0 + + + 32 + 352 + 800 + 6 + 0 + + + 398 + 366 + 806 + 4 + 0 + + + 399 + 366 + 802 + 4 + 0 + + + 396 + 365 + 804 + 4 + 0 + + + 403 + 364 + 800 + 4 + 0 + + + 397 + 363 + 803 + 4 + 0 + + + 404 + 362 + 806 + 4 + 0 + + + 398 + 361 + 800 + 4 + 0 + + + 33 + 360 + 807 + 4 + 0 + + + 396 + 360 + 803 + 4 + 0 + + + 396 + 343 + 809 + 4 + 0 + + + 405 + 342 + 813 + 4 + 0 + + + 397 + 341 + 811 + 4 + 0 + + + 398 + 339 + 810 + 4 + 0 + + + 396 + 338 + 812 + 4 + 0 + + + 404 + 337 + 814 + 4 + 0 + + + 33 + 336 + 811 + 4 + 0 + + + 32 + 336 + 809 + 4 + 0 + + + 394 + 351 + 812 + 2 + 0 + + + 32 + 351 + 808 + 4 + 0 + + + 33 + 349 + 808 + 4 + 0 + + + 398 + 348 + 814 + 4 + 0 + + + 399 + 348 + 810 + 4 + 0 + + + 403 + 347 + 812 + 4 + 0 + + + 404 + 345 + 811 + 4 + 0 + + + 98 + 359 + 809 + 1 + 0 + + + 32 + 358 + 813 + 2 + 0 + + + 33 + 355 + 812 + 2 + 0 + + + 395 + 353 + 814 + 2 + 0 + + + 32 + 366 + 812 + 4 + 0 + + + 394 + 364 + 809 + 4 + 0 + + + 405 + 362 + 814 + 0 + 0 + + + 33 + 361 + 811 + 4 + 0 + + + 394 + 373 + 805 + 7 + 0 + + + 399 + 373 + 802 + 7 + 0 + + + 33 + 372 + 800 + 7 + 0 + + + 32 + 371 + 806 + 4 + 0 + + + 396 + 371 + 803 + 4 + 0 + + + 33 + 370 + 800 + 4 + 0 + + + 395 + 369 + 807 + 4 + 0 + + + 397 + 368 + 804 + 4 + 0 + + + 404 + 368 + 801 + 4 + 0 + + + 405 + 375 + 813 + 0 + 0 + + + 397 + 375 + 809 + 0 + 0 + + + 394 + 374 + 811 + 0 + 0 + + + 397 + 373 + 814 + 0 + 0 + + + 404 + 373 + 808 + 0 + 0 + + + 401 + 372 + 811 + 4 + 0 + + + 396 + 370 + 813 + 0 + 0 + + + 403 + 370 + 809 + 0 + 0 + + + 404 + 369 + 811 + 0 + 0 + + + 396 + 383 + 800 + 0 + 0 + + + 395 + 381 + 806 + 0 + 0 + + + 32 + 381 + 802 + 7 + 0 + + + 394 + 380 + 804 + 7 + 0 + + + 398 + 379 + 801 + 7 + 0 + + + 397 + 377 + 803 + 7 + 0 + + + 32 + 376 + 806 + 4 + 0 + + + 405 + 376 + 800 + 0 + 0 + + + 32 + 391 + 801 + 4 + 0 + + + 32 + 390 + 807 + 2 + 0 + + + 397 + 390 + 805 + 2 + 0 + + + 394 + 390 + 803 + 4 + 0 + + + 396 + 388 + 804 + 2 + 0 + + + 404 + 388 + 802 + 2 + 0 + + + 396 + 387 + 806 + 4 + 0 + + + 33 + 386 + 803 + 2 + 0 + + + 397 + 385 + 807 + 3 + 0 + + + 401 + 385 + 805 + 2 + 0 + + + 405 + 384 + 804 + 4 + 0 + + + 32 + 384 + 801 + 4 + 0 + + + 397 + 382 + 814 + 0 + 0 + + + 396 + 382 + 809 + 0 + 0 + + + 396 + 381 + 812 + 0 + 0 + + + 394 + 380 + 813 + 0 + 0 + + + 399 + 379 + 809 + 0 + 0 + + + 395 + 378 + 811 + 0 + 0 + + + 398 + 377 + 808 + 0 + 0 + + + 398 + 391 + 808 + 2 + 0 + + + 395 + 390 + 812 + 4 + 0 + + + 396 + 390 + 810 + 2 + 0 + + + 399 + 389 + 808 + 2 + 0 + + + 32 + 388 + 813 + 4 + 0 + + + 404 + 388 + 810 + 2 + 0 + + + 398 + 387 + 808 + 4 + 0 + + + 394 + 386 + 812 + 4 + 0 + + + 33 + 386 + 809 + 2 + 0 + + + 403 + 385 + 810 + 2 + 0 + + + 405 + 384 + 813 + 4 + 0 + + + 395 + 359 + 817 + 4 + 0 + + + 394 + 357 + 817 + 4 + 0 + + + 396 + 355 + 818 + 4 + 0 + + + 397 + 354 + 820 + 4 + 0 + + + 651 + 353 + 816 + 0 + 0 + + + 403 + 352 + 822 + 4 + 0 + + + 399 + 352 + 817 + 0 + 0 + + + 401 + 352 + 816 + 0 + 0 + + + 395 + 366 + 823 + 1 + 0 + + + 395 + 366 + 821 + 1 + 0 + + + 404 + 366 + 819 + 1 + 0 + + + 32 + 365 + 817 + 1 + 0 + + + 405 + 364 + 822 + 4 + 0 + + + 32 + 363 + 820 + 4 + 0 + + + 395 + 362 + 817 + 4 + 0 + + + 401 + 375 + 819 + 0 + 0 + + + 398 + 374 + 821 + 0 + 0 + + + 394 + 373 + 819 + 0 + 0 + + + 399 + 371 + 821 + 0 + 0 + + + 404 + 371 + 816 + 1 + 0 + + + 404 + 369 + 822 + 1 + 0 + + + 33 + 368 + 819 + 1 + 0 + + + 395 + 368 + 816 + 1 + 0 + + + 403 + 381 + 820 + 0 + 0 + + + 394 + 381 + 816 + 0 + 0 + + + 32 + 379 + 818 + 0 + 0 + + + 397 + 378 + 820 + 0 + 0 + + + 398 + 376 + 821 + 0 + 0 + + + 396 + 376 + 817 + 0 + 0 + + + 34 + 391 + 817 + 3 + 0 + + + 395 + 391 + 816 + 3 + 0 + + + 401 + 390 + 821 + 2 + 0 + + + 99 + 390 + 818 + 5 + 0 + + + 32 + 390 + 817 + 3 + 0 + + + 98 + 389 + 818 + 3 + 0 + + + 403 + 389 + 817 + 5 + 0 + + + 395 + 388 + 822 + 0 + 0 + + + 98 + 388 + 818 + 2 + 0 + + + 403 + 388 + 816 + 3 + 0 + + + 32 + 387 + 820 + 1 + 0 + + + 405 + 387 + 818 + 5 + 0 + + + 33 + 386 + 822 + 7 + 0 + + + 32 + 386 + 817 + 0 + 0 + + + 33 + 385 + 820 + 0 + 0 + + + 404 + 385 + 818 + 0 + 0 + + + 395 + 384 + 818 + 0 + 0 + + + 32 + 384 + 816 + 0 + 0 + + + 396 + 399 + 806 + 3 + 0 + + + 33 + 399 + 802 + 3 + 0 + + + 403 + 399 + 800 + 1 + 0 + + + 32 + 397 + 806 + 3 + 0 + + + 33 + 397 + 804 + 3 + 0 + + + 394 + 397 + 802 + 3 + 0 + + + 394 + 395 + 805 + 3 + 0 + + + 405 + 395 + 803 + 3 + 0 + + + 32 + 394 + 807 + 4 + 0 + + + 394 + 394 + 801 + 3 + 0 + + + 404 + 392 + 806 + 4 + 0 + + + 403 + 392 + 803 + 2 + 0 + + + 398 + 399 + 811 + 0 + 0 + + + 33 + 398 + 813 + 3 + 0 + + + 398 + 398 + 808 + 3 + 0 + + + 394 + 397 + 811 + 7 + 0 + + + 394 + 395 + 813 + 3 + 0 + + + 395 + 395 + 809 + 3 + 0 + + + 33 + 394 + 811 + 4 + 0 + + + 33 + 392 + 813 + 4 + 0 + + + 399 + 392 + 810 + 2 + 0 + + + 395 + 399 + 817 + 3 + 0 + + + 395 + 398 + 822 + 2 + 0 + + + 33 + 398 + 819 + 3 + 0 + + + 32 + 398 + 817 + 3 + 0 + + + 21 + 397 + 823 + 0 + 0 + + + 401 + 397 + 817 + 3 + 0 + + + 394 + 397 + 816 + 3 + 0 + + + 21 + 396 + 822 + 0 + 0 + + + 33 + 396 + 816 + 3 + 0 + + + 32 + 395 + 820 + 4 + 0 + + + 399 + 395 + 817 + 3 + 0 + + + 395 + 395 + 816 + 2 + 0 + + + 21 + 394 + 822 + 0 + 0 + + + 396 + 394 + 816 + 3 + 0 + + + 21 + 393 + 823 + 0 + 0 + + + 32 + 393 + 818 + 6 + 0 + + + 401 + 393 + 816 + 3 + 0 + + + 395 + 392 + 819 + 5 + 0 + + + 33 + 392 + 816 + 3 + 0 + + + 394 + 407 + 807 + 2 + 0 + + + 404 + 407 + 805 + 1 + 0 + + + 395 + 407 + 803 + 2 + 0 + + + 399 + 406 + 800 + 1 + 0 + + + 398 + 405 + 807 + 1 + 0 + + + 404 + 405 + 805 + 3 + 0 + + + 33 + 405 + 803 + 3 + 0 + + + 398 + 404 + 800 + 1 + 0 + + + 396 + 403 + 807 + 1 + 0 + + + 33 + 403 + 804 + 3 + 0 + + + 397 + 402 + 801 + 1 + 0 + + + 404 + 401 + 807 + 3 + 0 + + + 395 + 401 + 803 + 3 + 0 + + + 396 + 401 + 800 + 1 + 0 + + + 32 + 400 + 805 + 3 + 0 + + + 396 + 407 + 809 + 1 + 0 + + + 405 + 406 + 813 + 3 + 0 + + + 395 + 405 + 811 + 7 + 0 + + + 397 + 405 + 809 + 1 + 0 + + + 394 + 404 + 813 + 3 + 0 + + + 398 + 403 + 812 + 6 + 0 + + + 404 + 403 + 810 + 1 + 0 + + + 32 + 402 + 813 + 7 + 0 + + + 398 + 401 + 811 + 6 + 0 + + + 395 + 400 + 813 + 3 + 0 + + + 399 + 400 + 809 + 3 + 0 + + + 99 + 407 + 817 + 4 + 0 + + + 32 + 407 + 816 + 4 + 0 + + + 402 + 406 + 817 + 4 + 0 + + + 99 + 406 + 816 + 4 + 0 + + + 33 + 405 + 823 + 3 + 0 + + + 33 + 405 + 816 + 4 + 0 + + + 395 + 404 + 822 + 4 + 0 + + + 395 + 404 + 816 + 4 + 0 + + + 32 + 403 + 820 + 5 + 0 + + + 99 + 403 + 816 + 4 + 0 + + + 98 + 402 + 817 + 4 + 0 + + + 98 + 402 + 816 + 3 + 0 + + + 396 + 401 + 821 + 6 + 0 + + + 99 + 401 + 817 + 5 + 0 + + + 403 + 400 + 817 + 3 + 0 + + + 397 + 375 + 829 + 0 + 0 + + + 404 + 374 + 826 + 4 + 0 + + + 403 + 373 + 828 + 4 + 0 + + + 396 + 373 + 824 + 0 + 0 + + + 394 + 372 + 830 + 0 + 0 + + + 33 + 371 + 827 + 0 + 0 + + + 402 + 370 + 826 + 4 + 0 + + + 398 + 370 + 824 + 0 + 0 + + + 402 + 368 + 826 + 4 + 0 + + + 403 + 382 + 824 + 4 + 0 + + + 399 + 381 + 830 + 0 + 0 + + + 32 + 381 + 827 + 0 + 0 + + + 401 + 379 + 831 + 0 + 0 + + + 399 + 379 + 829 + 0 + 0 + + + 395 + 379 + 824 + 0 + 0 + + + 403 + 378 + 826 + 4 + 0 + + + 396 + 377 + 830 + 0 + 0 + + + 405 + 376 + 827 + 0 + 0 + + + 403 + 376 + 824 + 4 + 0 + + + 21 + 391 + 827 + 0 + 0 + + + 21 + 391 + 825 + 0 + 0 + + + 396 + 390 + 831 + 7 + 0 + + + 395 + 389 + 826 + 0 + 0 + + + 32 + 389 + 824 + 0 + 0 + + + 395 + 388 + 830 + 0 + 0 + + + 32 + 387 + 828 + 2 + 0 + + + 396 + 387 + 824 + 3 + 0 + + + 395 + 385 + 829 + 3 + 0 + + + 397 + 385 + 828 + 4 + 0 + + + 396 + 385 + 825 + 5 + 0 + + + 32 + 385 + 824 + 6 + 0 + + + 397 + 384 + 829 + 3 + 0 + + + 397 + 384 + 828 + 3 + 0 + + + 395 + 384 + 827 + 3 + 0 + + + 394 + 384 + 825 + 3 + 0 + + + 21 + 399 + 827 + 0 + 0 + + + 21 + 399 + 825 + 0 + 0 + + + 21 + 398 + 828 + 0 + 0 + + + 21 + 398 + 824 + 0 + 0 + + + 33 + 397 + 831 + 1 + 0 + + + 21 + 397 + 829 + 0 + 0 + + + 21 + 396 + 830 + 0 + 0 + + + 5 + 396 + 826 + 0 + 0 + + + 21 + 394 + 830 + 0 + 0 + + + 21 + 393 + 829 + 0 + 0 + + + 21 + 392 + 828 + 0 + 0 + + + 21 + 392 + 824 + 0 + 0 + + + 21 + 407 + 826 + 0 + 0 + + + 33 + 406 + 830 + 6 + 0 + + + 395 + 403 + 826 + 2 + 0 + + + 401 + 402 + 829 + 0 + 0 + + + 33 + 401 + 824 + 7 + 0 + + + 403 + 400 + 829 + 0 + 0 + + + 775 + 400 + 826 + 0 + 0 + + + 394 + 415 + 807 + 2 + 0 + + + 394 + 415 + 804 + 2 + 0 + + + 397 + 415 + 802 + 2 + 0 + + + 33 + 414 + 801 + 0 + 0 + + + 395 + 413 + 806 + 2 + 0 + + + 395 + 413 + 803 + 2 + 0 + + + 396 + 412 + 801 + 2 + 0 + + + 394 + 411 + 807 + 2 + 0 + + + 404 + 411 + 805 + 7 + 0 + + + 32 + 411 + 801 + 2 + 0 + + + 394 + 410 + 803 + 2 + 0 + + + 395 + 409 + 806 + 2 + 0 + + + 397 + 409 + 801 + 2 + 0 + + + 405 + 408 + 801 + 1 + 0 + + + 394 + 415 + 810 + 3 + 0 + + + 405 + 414 + 813 + 0 + 0 + + + 395 + 413 + 809 + 3 + 0 + + + 394 + 412 + 812 + 3 + 0 + + + 404 + 411 + 809 + 1 + 0 + + + 395 + 410 + 813 + 3 + 0 + + + 32 + 410 + 811 + 3 + 0 + + + 32 + 408 + 812 + 3 + 0 + + + 395 + 408 + 810 + 3 + 0 + + + 395 + 415 + 819 + 6 + 0 + + + 33 + 415 + 816 + 6 + 0 + + + 396 + 414 + 821 + 7 + 0 + + + 394 + 414 + 816 + 6 + 0 + + + 405 + 413 + 816 + 4 + 0 + + + 97 + 412 + 822 + 0 + 0 + + + 33 + 412 + 819 + 1 + 0 + + + 401 + 412 + 817 + 4 + 0 + + + 403 + 412 + 816 + 4 + 0 + + + 402 + 411 + 817 + 4 + 0 + + + 395 + 410 + 821 + 0 + 0 + + + 404 + 410 + 817 + 4 + 0 + + + 32 + 410 + 816 + 4 + 0 + + + 401 + 409 + 823 + 0 + 0 + + + 395 + 409 + 816 + 4 + 0 + + + 32 + 408 + 821 + 0 + 0 + + + 33 + 408 + 819 + 0 + 0 + + + 401 + 408 + 817 + 4 + 0 + + + 99 + 408 + 816 + 2 + 0 + + + 395 + 413 + 824 + 2 + 0 + + + 21 + 411 + 830 + 5 + 0 + + + 32 + 411 + 826 + 4 + 0 + + + 394 + 411 + 824 + 3 + 0 + + + 394 + 423 + 799 + 0 + 0 + + + 394 + 422 + 794 + 3 + 0 + + + 33 + 421 + 796 + 3 + 0 + + + 397 + 420 + 799 + 6 + 0 + + + 399 + 420 + 792 + 7 + 0 + + + 396 + 419 + 797 + 6 + 0 + + + 405 + 419 + 795 + 6 + 0 + + + 396 + 418 + 793 + 7 + 0 + + + 401 + 417 + 799 + 1 + 0 + + + 402 + 417 + 795 + 1 + 0 + + + 403 + 416 + 797 + 1 + 0 + + + 403 + 416 + 794 + 0 + 0 + + + 33 + 416 + 792 + 4 + 0 + + + 403 + 422 + 804 + 5 + 0 + + + 33 + 422 + 801 + 0 + 0 + + + 404 + 421 + 806 + 0 + 0 + + + 398 + 420 + 803 + 6 + 0 + + + 396 + 420 + 801 + 6 + 0 + + + 405 + 419 + 805 + 3 + 0 + + + 403 + 418 + 802 + 1 + 0 + + + 403 + 417 + 804 + 1 + 0 + + + 402 + 416 + 801 + 1 + 0 + + + 395 + 423 + 812 + 0 + 0 + + + 399 + 423 + 809 + 7 + 0 + + + 394 + 421 + 813 + 0 + 0 + + + 398 + 421 + 811 + 7 + 0 + + + 395 + 420 + 808 + 0 + 0 + + + 395 + 419 + 812 + 0 + 0 + + + 398 + 418 + 810 + 7 + 0 + + + 401 + 418 + 808 + 7 + 0 + + + 394 + 417 + 812 + 0 + 0 + + + 33 + 416 + 813 + 0 + 0 + + + 396 + 416 + 809 + 1 + 0 + + + 396 + 423 + 817 + 6 + 0 + + + 32 + 423 + 816 + 6 + 0 + + + 396 + 422 + 821 + 3 + 0 + + + 394 + 422 + 817 + 2 + 0 + + + 32 + 421 + 817 + 6 + 0 + + + 32 + 420 + 823 + 2 + 0 + + + 395 + 420 + 817 + 6 + 0 + + + 395 + 419 + 820 + 4 + 0 + + + 33 + 419 + 817 + 6 + 0 + + + 394 + 418 + 817 + 6 + 0 + + + 32 + 417 + 817 + 6 + 0 + + + 32 + 416 + 820 + 5 + 0 + + + 396 + 416 + 817 + 6 + 0 + + + 395 + 416 + 816 + 6 + 0 + + + 395 + 422 + 830 + 0 + 0 + + + 401 + 422 + 828 + 3 + 0 + + + 32 + 420 + 831 + 5 + 0 + + + 395 + 419 + 826 + 1 + 0 + + + 33 + 416 + 824 + 0 + 0 + + + 1 + 417 + 827 + 3 + 1 + + + 394 + 431 + 796 + 2 + 0 + + + 396 + 431 + 794 + 2 + 0 + + + 395 + 431 + 792 + 2 + 0 + + + 394 + 430 + 799 + 2 + 0 + + + 396 + 429 + 798 + 6 + 0 + + + 405 + 429 + 795 + 0 + 0 + + + 399 + 429 + 793 + 7 + 0 + + + 395 + 427 + 799 + 2 + 0 + + + 32 + 427 + 796 + 3 + 0 + + + 403 + 427 + 792 + 1 + 0 + + + 395 + 426 + 794 + 3 + 0 + + + 32 + 425 + 797 + 7 + 0 + + + 404 + 424 + 796 + 7 + 0 + + + 400 + 424 + 794 + 7 + 0 + + + 396 + 431 + 807 + 2 + 0 + + + 403 + 431 + 804 + 2 + 0 + + + 404 + 431 + 801 + 2 + 0 + + + 397 + 429 + 807 + 7 + 0 + + + 405 + 429 + 805 + 1 + 0 + + + 398 + 429 + 803 + 7 + 0 + + + 397 + 429 + 800 + 6 + 0 + + + 32 + 428 + 801 + 7 + 0 + + + 404 + 427 + 804 + 5 + 0 + + + 396 + 426 + 806 + 0 + 0 + + + 395 + 425 + 802 + 7 + 0 + + + 404 + 425 + 800 + 6 + 0 + + + 404 + 424 + 807 + 7 + 0 + + + 396 + 424 + 804 + 6 + 0 + + + 394 + 431 + 812 + 2 + 0 + + + 399 + 430 + 810 + 2 + 0 + + + 405 + 429 + 813 + 0 + 0 + + + 398 + 429 + 809 + 0 + 0 + + + 403 + 428 + 811 + 7 + 0 + + + 394 + 427 + 808 + 0 + 0 + + + 32 + 426 + 813 + 0 + 0 + + + 399 + 426 + 811 + 7 + 0 + + + 398 + 425 + 809 + 7 + 0 + + + 33 + 431 + 819 + 2 + 0 + + + 395 + 431 + 816 + 2 + 0 + + + 98 + 430 + 822 + 1 + 0 + + + 32 + 430 + 817 + 2 + 0 + + + 395 + 429 + 816 + 2 + 0 + + + 196 + 428 + 821 + 6 + 0 + + + 195 + 428 + 820 + 6 + 0 + + + 210 + 428 + 819 + 6 + 0 + + + 195 + 427 + 819 + 6 + 0 + + + 394 + 427 + 816 + 2 + 0 + + + 196 + 426 + 819 + 6 + 0 + + + 32 + 426 + 817 + 6 + 0 + + + 396 + 425 + 817 + 6 + 0 + + + 32 + 425 + 816 + 6 + 0 + + + 395 + 424 + 816 + 6 + 0 + + + 404 + 438 + 790 + 3 + 0 + + + 401 + 438 + 787 + 0 + 0 + + + 394 + 437 + 784 + 7 + 0 + + + 399 + 436 + 790 + 0 + 0 + + + 398 + 436 + 787 + 0 + 0 + + + 405 + 435 + 785 + 0 + 0 + + + 397 + 434 + 790 + 0 + 0 + + + 397 + 433 + 788 + 0 + 0 + + + 402 + 439 + 798 + 6 + 0 + + + 405 + 439 + 796 + 3 + 0 + + + 399 + 439 + 793 + 0 + 0 + + + 396 + 437 + 798 + 6 + 0 + + + 398 + 437 + 794 + 0 + 0 + + + 32 + 437 + 792 + 0 + 0 + + + 403 + 436 + 796 + 0 + 0 + + + 397 + 435 + 798 + 6 + 0 + + + 397 + 435 + 793 + 0 + 0 + + + 394 + 434 + 799 + 0 + 0 + + + 404 + 433 + 796 + 0 + 0 + + + 33 + 433 + 794 + 0 + 0 + + + 396 + 433 + 792 + 0 + 0 + + + 394 + 439 + 804 + 0 + 0 + + + 33 + 437 + 801 + 0 + 0 + + + 397 + 436 + 805 + 3 + 0 + + + 396 + 436 + 803 + 6 + 0 + + + 401 + 435 + 806 + 1 + 0 + + + 397 + 434 + 801 + 6 + 0 + + + 399 + 433 + 805 + 6 + 0 + + + 398 + 433 + 803 + 6 + 0 + + + 402 + 432 + 807 + 1 + 0 + + + 33 + 439 + 812 + 3 + 0 + + + 395 + 438 + 810 + 3 + 0 + + + 401 + 438 + 809 + 1 + 0 + + + 33 + 437 + 812 + 1 + 0 + + + 32 + 437 + 808 + 3 + 0 + + + 394 + 436 + 814 + 1 + 0 + + + 398 + 436 + 810 + 1 + 0 + + + 32 + 434 + 812 + 1 + 0 + + + 396 + 434 + 810 + 1 + 0 + + + 33 + 434 + 808 + 1 + 0 + + + 395 + 433 + 814 + 1 + 0 + + + 404 + 432 + 813 + 1 + 0 + + + 397 + 432 + 810 + 1 + 0 + + + 397 + 439 + 821 + 0 + 0 + + + 403 + 439 + 819 + 0 + 0 + + + 32 + 439 + 817 + 0 + 0 + + + 395 + 437 + 820 + 0 + 0 + + + 397 + 437 + 816 + 1 + 0 + + + 396 + 436 + 818 + 1 + 0 + + + 398 + 435 + 822 + 0 + 0 + + + 404 + 435 + 820 + 0 + 0 + + + 33 + 435 + 819 + 1 + 0 + + + 400 + 435 + 816 + 1 + 0 + + + 33 + 434 + 818 + 0 + 0 + + + 399 + 433 + 821 + 0 + 0 + + + 396 + 433 + 816 + 7 + 0 + + + 401 + 432 + 823 + 0 + 0 + + + 32 + 432 + 820 + 6 + 0 + + + 33 + 432 + 817 + 6 + 0 + + + 33 + 447 + 787 + 5 + 0 + + + 404 + 447 + 785 + 0 + 0 + + + 396 + 446 + 791 + 2 + 0 + + + 405 + 445 + 786 + 0 + 0 + + + 395 + 444 + 789 + 2 + 0 + + + 397 + 444 + 787 + 0 + 0 + + + 32 + 443 + 785 + 7 + 0 + + + 401 + 442 + 791 + 0 + 0 + + + 399 + 442 + 789 + 0 + 0 + + + 396 + 442 + 787 + 0 + 0 + + + 402 + 440 + 790 + 0 + 0 + + + 403 + 440 + 788 + 0 + 0 + + + 402 + 440 + 785 + 0 + 0 + + + 396 + 447 + 796 + 0 + 0 + + + 398 + 446 + 794 + 2 + 0 + + + 403 + 444 + 798 + 0 + 0 + + + 397 + 444 + 796 + 6 + 0 + + + 397 + 444 + 793 + 2 + 0 + + + 404 + 442 + 798 + 6 + 0 + + + 33 + 442 + 794 + 0 + 0 + + + 34 + 441 + 796 + 0 + 0 + + + 395 + 440 + 799 + 0 + 0 + + + 399 + 447 + 807 + 3 + 0 + + + 397 + 446 + 803 + 0 + 0 + + + 404 + 446 + 800 + 0 + 0 + + + 399 + 445 + 805 + 0 + 0 + + + 398 + 444 + 803 + 0 + 0 + + + 396 + 444 + 801 + 6 + 0 + + + 394 + 442 + 805 + 6 + 0 + + + 396 + 442 + 801 + 6 + 0 + + + 34 + 441 + 802 + 0 + 0 + + + 33 + 440 + 802 + 0 + 0 + + + 395 + 446 + 812 + 3 + 0 + + + 32 + 446 + 808 + 3 + 0 + + + 394 + 445 + 810 + 3 + 0 + + + 401 + 445 + 808 + 3 + 0 + + + 395 + 443 + 814 + 2 + 0 + + + 192 + 443 + 810 + 0 + 0 + + + 394 + 441 + 812 + 3 + 0 + + + 394 + 440 + 814 + 1 + 0 + + + 396 + 440 + 811 + 1 + 0 + + + 395 + 447 + 821 + 1 + 0 + + + 32 + 447 + 819 + 1 + 0 + + + 404 + 445 + 821 + 1 + 0 + + + 396 + 445 + 817 + 1 + 0 + + + 398 + 444 + 819 + 1 + 0 + + + 32 + 443 + 823 + 1 + 0 + + + 397 + 443 + 817 + 1 + 0 + + + 395 + 442 + 819 + 0 + 0 + + + 33 + 441 + 822 + 0 + 0 + + + 394 + 441 + 817 + 0 + 0 + + + 32 + 431 + 831 + 6 + 0 + + + 399 + 431 + 826 + 6 + 0 + + + 398 + 430 + 828 + 6 + 0 + + + 399 + 430 + 824 + 6 + 0 + + + 395 + 429 + 831 + 1 + 0 + + + 32 + 429 + 826 + 6 + 0 + + + 403 + 426 + 830 + 0 + 0 + + + 394 + 426 + 828 + 1 + 0 + + + 396 + 424 + 831 + 7 + 0 + + + 33 + 424 + 828 + 2 + 0 + + + 394 + 439 + 829 + 1 + 0 + + + 33 + 438 + 827 + 0 + 0 + + + 32 + 438 + 824 + 0 + 0 + + + 32 + 437 + 830 + 1 + 0 + + + 394 + 436 + 827 + 0 + 0 + + + 394 + 436 + 825 + 0 + 0 + + + 395 + 435 + 829 + 1 + 0 + + + 401 + 434 + 830 + 1 + 0 + + + 32 + 434 + 826 + 0 + 0 + + + 33 + 434 + 824 + 0 + 0 + + + 32 + 433 + 829 + 5 + 0 + + + 404 + 432 + 827 + 1 + 0 + + + 33 + 432 + 825 + 6 + 0 + + + 394 + 447 + 828 + 1 + 0 + + + 33 + 447 + 824 + 1 + 0 + + + 33 + 446 + 830 + 1 + 0 + + + 396 + 446 + 826 + 1 + 0 + + + 398 + 444 + 831 + 1 + 0 + + + 402 + 444 + 829 + 1 + 0 + + + 397 + 444 + 827 + 1 + 0 + + + 394 + 444 + 825 + 1 + 0 + + + 32 + 442 + 830 + 1 + 0 + + + 395 + 441 + 828 + 1 + 0 + + + 405 + 441 + 826 + 0 + 0 + + + 402 + 440 + 831 + 1 + 0 + + + 32 + 440 + 824 + 0 + 0 + + + 397 + 455 + 799 + 6 + 0 + + + 403 + 455 + 794 + 0 + 0 + + + 396 + 454 + 799 + 0 + 0 + + + 397 + 454 + 798 + 6 + 0 + + + 32 + 453 + 798 + 6 + 0 + + + 32 + 452 + 798 + 6 + 0 + + + 401 + 452 + 795 + 0 + 0 + + + 404 + 452 + 792 + 0 + 0 + + + 405 + 451 + 798 + 3 + 0 + + + 405 + 450 + 799 + 0 + 0 + + + 402 + 450 + 796 + 0 + 0 + + + 399 + 450 + 793 + 2 + 0 + + + 397 + 449 + 795 + 0 + 0 + + + 404 + 448 + 798 + 0 + 0 + + + 394 + 448 + 792 + 4 + 0 + + + 394 + 455 + 804 + 3 + 0 + + + 397 + 455 + 800 + 6 + 0 + + + 404 + 454 + 807 + 3 + 0 + + + 401 + 454 + 803 + 3 + 0 + + + 396 + 454 + 800 + 6 + 0 + + + 394 + 453 + 804 + 3 + 0 + + + 404 + 453 + 802 + 3 + 0 + + + 194 + 453 + 800 + 0 + 0 + + + 396 + 452 + 806 + 3 + 0 + + + 405 + 452 + 802 + 3 + 0 + + + 32 + 451 + 804 + 3 + 0 + + + 405 + 451 + 800 + 5 + 0 + + + 397 + 450 + 807 + 3 + 0 + + + 398 + 449 + 806 + 3 + 0 + + + 396 + 448 + 801 + 0 + 0 + + + 396 + 455 + 813 + 1 + 0 + + + 396 + 454 + 810 + 3 + 0 + + + 405 + 453 + 813 + 3 + 0 + + + 397 + 452 + 811 + 3 + 0 + + + 32 + 451 + 809 + 3 + 0 + + + 399 + 450 + 812 + 3 + 0 + + + 398 + 449 + 810 + 3 + 0 + + + 394 + 448 + 813 + 3 + 0 + + + 394 + 455 + 818 + 1 + 0 + + + 33 + 455 + 816 + 1 + 0 + + + 395 + 454 + 817 + 1 + 0 + + + 395 + 453 + 818 + 1 + 0 + + + 401 + 452 + 823 + 1 + 0 + + + 398 + 452 + 820 + 1 + 0 + + + 32 + 452 + 816 + 1 + 0 + + + 33 + 451 + 818 + 1 + 0 + + + 396 + 450 + 822 + 1 + 0 + + + 403 + 450 + 816 + 1 + 0 + + + 394 + 449 + 819 + 1 + 0 + + + 33 + 449 + 818 + 1 + 0 + + + 395 + 448 + 819 + 1 + 0 + + + 405 + 448 + 818 + 1 + 0 + + + 399 + 448 + 816 + 1 + 0 + + + 403 + 452 + 828 + 2 + 0 + + + 396 + 452 + 827 + 6 + 0 + + + 710 + 451 + 829 + 1 + 0 + + + 710 + 451 + 828 + 0 + 0 + + + 710 + 451 + 827 + 5 + 0 + + + 710 + 450 + 829 + 2 + 0 + + + 710 + 450 + 828 + 7 + 0 + + + 710 + 450 + 827 + 6 + 0 + + + 404 + 449 + 829 + 6 + 0 + + + 32 + 449 + 827 + 6 + 0 + + + 405 + 449 + 826 + 1 + 0 + + + 401 + 448 + 830 + 1 + 0 + + + 405 + 463 + 797 + 2 + 0 + + + 398 + 463 + 793 + 2 + 0 + + + 403 + 462 + 798 + 0 + 0 + + + 396 + 461 + 799 + 0 + 0 + + + 405 + 461 + 796 + 0 + 0 + + + 32 + 461 + 794 + 6 + 0 + + + 33 + 460 + 792 + 6 + 0 + + + 399 + 459 + 799 + 0 + 0 + + + 394 + 459 + 797 + 5 + 0 + + + 403 + 459 + 795 + 0 + 0 + + + 402 + 459 + 793 + 2 + 0 + + + 403 + 458 + 797 + 0 + 0 + + + 396 + 457 + 799 + 0 + 0 + + + 398 + 457 + 798 + 0 + 0 + + + 404 + 457 + 795 + 2 + 0 + + + 395 + 456 + 797 + 2 + 0 + + + 402 + 456 + 792 + 0 + 0 + + + 397 + 463 + 801 + 0 + 0 + + + 32 + 462 + 805 + 0 + 0 + + + 396 + 461 + 807 + 0 + 0 + + + 395 + 461 + 802 + 0 + 0 + + + 399 + 460 + 805 + 0 + 0 + + + 404 + 460 + 801 + 0 + 0 + + + 405 + 459 + 807 + 0 + 0 + + + 398 + 459 + 803 + 0 + 0 + + + 394 + 458 + 801 + 0 + 0 + + + 397 + 458 + 800 + 0 + 0 + + + 33 + 457 + 804 + 0 + 0 + + + 32 + 456 + 802 + 3 + 0 + + + 399 + 463 + 810 + 7 + 0 + + + 396 + 462 + 813 + 3 + 0 + + + 399 + 461 + 815 + 3 + 0 + + + 404 + 461 + 809 + 3 + 0 + + + 32 + 460 + 813 + 3 + 0 + + + 401 + 460 + 811 + 3 + 0 + + + 399 + 459 + 814 + 3 + 0 + + + 396 + 459 + 809 + 3 + 0 + + + 402 + 458 + 812 + 3 + 0 + + + 33 + 456 + 811 + 3 + 0 + + + 33 + 463 + 819 + 1 + 0 + + + 397 + 462 + 817 + 1 + 0 + + + 394 + 461 + 818 + 1 + 0 + + + 33 + 461 + 816 + 1 + 0 + + + 32 + 460 + 819 + 1 + 0 + + + 397 + 459 + 818 + 1 + 0 + + + 396 + 459 + 816 + 1 + 0 + + + 32 + 457 + 819 + 1 + 0 + + + 397 + 457 + 817 + 1 + 0 + + + 691 + 459 + 828 + 2 + 0 + + + 397 + 431 + 835 + 6 + 0 + + + 396 + 430 + 837 + 6 + 0 + + + 396 + 429 + 834 + 6 + 0 + + + 396 + 429 + 832 + 1 + 0 + + + 98 + 428 + 838 + 6 + 0 + + + 405 + 428 + 837 + 6 + 0 + + + 396 + 428 + 836 + 1 + 0 + + + 32 + 428 + 833 + 1 + 0 + + + 403 + 427 + 836 + 1 + 0 + + + 33 + 427 + 835 + 1 + 0 + + + 395 + 427 + 834 + 1 + 0 + + + 395 + 426 + 833 + 5 + 0 + + + 32 + 424 + 834 + 4 + 0 + + + 405 + 439 + 838 + 1 + 0 + + + 395 + 439 + 836 + 1 + 0 + + + 32 + 438 + 835 + 1 + 0 + + + 397 + 438 + 833 + 1 + 0 + + + 404 + 436 + 837 + 1 + 0 + + + 398 + 436 + 835 + 1 + 0 + + + 396 + 436 + 832 + 1 + 0 + + + 33 + 434 + 838 + 1 + 0 + + + 33 + 434 + 836 + 1 + 0 + + + 394 + 433 + 834 + 1 + 0 + + + 399 + 433 + 832 + 1 + 0 + + + 32 + 432 + 838 + 1 + 0 + + + 33 + 432 + 836 + 6 + 0 + + + 32 + 432 + 833 + 5 + 0 + + + 397 + 447 + 833 + 1 + 0 + + + 397 + 446 + 839 + 1 + 0 + + + 32 + 446 + 836 + 1 + 0 + + + 396 + 445 + 833 + 1 + 0 + + + 396 + 444 + 839 + 1 + 0 + + + 404 + 443 + 834 + 1 + 0 + + + 33 + 442 + 837 + 1 + 0 + + + 399 + 442 + 832 + 1 + 0 + + + 397 + 441 + 839 + 1 + 0 + + + 394 + 441 + 835 + 1 + 0 + + + 32 + 451 + 838 + 1 + 0 + + + 395 + 449 + 836 + 1 + 0 + + + 398 + 449 + 834 + 1 + 0 + + + 403 + 449 + 832 + 1 + 0 + + + 405 + 448 + 838 + 1 + 0 + + + 395 + 430 + 847 + 6 + 0 + + + 32 + 430 + 845 + 6 + 0 + + + 98 + 430 + 841 + 1 + 0 + + + 403 + 429 + 843 + 1 + 0 + + + 395 + 429 + 842 + 1 + 0 + + + 33 + 429 + 841 + 1 + 0 + + + 98 + 429 + 840 + 1 + 0 + + + 32 + 428 + 847 + 2 + 0 + + + 394 + 428 + 846 + 2 + 0 + + + 32 + 428 + 845 + 1 + 0 + + + 99 + 428 + 844 + 1 + 0 + + + 98 + 428 + 843 + 1 + 0 + + + 33 + 426 + 845 + 1 + 0 + + + 401 + 424 + 843 + 1 + 0 + + + 399 + 439 + 847 + 5 + 0 + + + 33 + 438 + 843 + 0 + 0 + + + 404 + 437 + 846 + 1 + 0 + + + 397 + 436 + 841 + 7 + 0 + + + 396 + 435 + 847 + 2 + 0 + + + 32 + 434 + 843 + 6 + 0 + + + 395 + 433 + 845 + 4 + 0 + + + 397 + 432 + 843 + 5 + 0 + + + 394 + 446 + 841 + 1 + 0 + + + 403 + 445 + 847 + 5 + 0 + + + 32 + 445 + 845 + 3 + 0 + + + 397 + 443 + 841 + 1 + 0 + + + 401 + 442 + 846 + 2 + 0 + + + 397 + 441 + 843 + 7 + 0 + + + 394 + 440 + 845 + 6 + 0 + + + 399 + 454 + 841 + 1 + 0 + + + 396 + 452 + 841 + 1 + 0 + + + 397 + 451 + 843 + 1 + 0 + + + 33 + 450 + 840 + 1 + 0 + + + 395 + 448 + 842 + 1 + 0 + + + 405 + 459 + 842 + 1 + 0 + + + 33 + 457 + 842 + 1 + 0 + + + 32 + 456 + 840 + 1 + 0 + + + 396 + 431 + 855 + 6 + 0 + + + 32 + 431 + 853 + 6 + 0 + + + 394 + 431 + 849 + 6 + 0 + + + 395 + 430 + 852 + 6 + 0 + + + 33 + 430 + 850 + 6 + 0 + + + 395 + 429 + 853 + 2 + 0 + + + 395 + 429 + 848 + 2 + 0 + + + 396 + 428 + 852 + 2 + 0 + + + 394 + 428 + 851 + 2 + 0 + + + 98 + 428 + 850 + 2 + 0 + + + 99 + 428 + 849 + 2 + 0 + + + 396 + 428 + 848 + 2 + 0 + + + 32 + 427 + 854 + 7 + 0 + + + 394 + 427 + 848 + 2 + 0 + + + 394 + 426 + 854 + 0 + 0 + + + 395 + 425 + 852 + 6 + 0 + + + 33 + 425 + 848 + 3 + 0 + + + 396 + 424 + 849 + 4 + 0 + + + 405 + 439 + 850 + 3 + 0 + + + 397 + 437 + 855 + 2 + 0 + + + 395 + 437 + 851 + 1 + 0 + + + 32 + 437 + 848 + 4 + 0 + + + 397 + 436 + 853 + 2 + 0 + + + 33 + 434 + 851 + 1 + 0 + + + 32 + 433 + 854 + 2 + 0 + + + 33 + 432 + 854 + 6 + 0 + + + 394 + 432 + 852 + 0 + 0 + + + 33 + 432 + 850 + 6 + 0 + + + 398 + 432 + 848 + 3 + 0 + + + 397 + 447 + 851 + 0 + 0 + + + 394 + 446 + 853 + 0 + 0 + + + 395 + 446 + 849 + 0 + 0 + + + 32 + 444 + 854 + 2 + 0 + + + 399 + 444 + 851 + 2 + 0 + + + 398 + 443 + 848 + 2 + 0 + + + 399 + 442 + 853 + 2 + 0 + + + 403 + 442 + 850 + 2 + 0 + + + 33 + 441 + 854 + 2 + 0 + + + 402 + 441 + 848 + 2 + 0 + + + 397 + 440 + 852 + 2 + 0 + + + 32 + 455 + 852 + 0 + 0 + + + 395 + 454 + 854 + 0 + 0 + + + 404 + 454 + 849 + 5 + 0 + + + 399 + 453 + 851 + 0 + 0 + + + 404 + 452 + 853 + 6 + 0 + + + 32 + 452 + 849 + 5 + 0 + + + 405 + 450 + 855 + 0 + 0 + + + 395 + 450 + 853 + 0 + 0 + + + 398 + 450 + 851 + 0 + 0 + + + 394 + 449 + 849 + 0 + 0 + + + 396 + 448 + 853 + 6 + 0 + + + 394 + 463 + 854 + 0 + 0 + + + 33 + 462 + 852 + 0 + 0 + + + 398 + 461 + 854 + 0 + 0 + + + 401 + 460 + 849 + 0 + 0 + + + 404 + 459 + 850 + 5 + 0 + + + 396 + 458 + 855 + 2 + 0 + + + 402 + 458 + 849 + 0 + 0 + + + 398 + 457 + 853 + 5 + 0 + + + 397 + 456 + 855 + 4 + 0 + + + 33 + 456 + 849 + 6 + 0 + + + 403 + 439 + 862 + 2 + 0 + + + 397 + 439 + 857 + 2 + 0 + + + 401 + 438 + 860 + 2 + 0 + + + 396 + 437 + 857 + 2 + 0 + + + 402 + 436 + 861 + 2 + 0 + + + 404 + 435 + 858 + 2 + 0 + + + 33 + 434 + 862 + 2 + 0 + + + 398 + 434 + 856 + 2 + 0 + + + 399 + 433 + 859 + 2 + 0 + + + 394 + 432 + 861 + 2 + 0 + + + 33 + 432 + 858 + 6 + 0 + + + 394 + 432 + 856 + 2 + 0 + + + 396 + 447 + 861 + 0 + 0 + + + 399 + 447 + 858 + 0 + 0 + + + 397 + 446 + 856 + 0 + 0 + + + 32 + 445 + 861 + 2 + 0 + + + 397 + 445 + 858 + 0 + 0 + + + 32 + 444 + 862 + 2 + 0 + + + 32 + 444 + 856 + 2 + 0 + + + 395 + 443 + 860 + 2 + 0 + + + 33 + 443 + 858 + 2 + 0 + + + 395 + 442 + 856 + 2 + 0 + + + 405 + 441 + 861 + 2 + 0 + + + 32 + 440 + 859 + 2 + 0 + + + 396 + 455 + 857 + 0 + 0 + + + 32 + 454 + 861 + 2 + 0 + + + 395 + 453 + 859 + 0 + 0 + + + 394 + 452 + 861 + 0 + 0 + + + 397 + 451 + 858 + 0 + 0 + + + 395 + 449 + 862 + 0 + 0 + + + 398 + 449 + 859 + 0 + 0 + + + 395 + 448 + 856 + 0 + 0 + + + 405 + 463 + 861 + 0 + 0 + + + 395 + 463 + 859 + 0 + 0 + + + 399 + 462 + 856 + 0 + 0 + + + 32 + 461 + 859 + 0 + 0 + + + 397 + 460 + 856 + 3 + 0 + + + 394 + 458 + 861 + 0 + 0 + + + 404 + 458 + 858 + 1 + 0 + + + 33 + 456 + 860 + 0 + 0 + + + 396 + 471 + 830 + 5 + 0 + + + 395 + 471 + 828 + 5 + 0 + + + 403 + 471 + 825 + 5 + 0 + + + 404 + 469 + 829 + 5 + 0 + + + 394 + 468 + 826 + 5 + 0 + + + 32 + 467 + 831 + 5 + 0 + + + 33 + 467 + 824 + 5 + 0 + + + 164 + 465 + 831 + 7 + 0 + + + 164 + 465 + 826 + 2 + 0 + + + 164 + 465 + 825 + 1 + 0 + + + 164 + 464 + 831 + 0 + 0 + + + 164 + 464 + 830 + 6 + 0 + + + 164 + 464 + 826 + 4 + 0 + + + 399 + 471 + 839 + 5 + 0 + + + 398 + 471 + 833 + 5 + 0 + + + 20 + 470 + 835 + 5 + 0 + + + 33 + 469 + 838 + 5 + 0 + + + 397 + 469 + 832 + 5 + 0 + + + 394 + 467 + 839 + 5 + 0 + + + 403 + 467 + 835 + 5 + 0 + + + 395 + 466 + 833 + 5 + 0 + + + 780 + 471 + 850 + 0 + 0 + + + 21 + 470 + 855 + 4 + 0 + + + 21 + 470 + 853 + 4 + 0 + + + 404 + 469 + 855 + 5 + 0 + + + 781 + 466 + 850 + 0 + 0 + + + 399 + 471 + 860 + 5 + 0 + + + 405 + 470 + 861 + 5 + 0 + + + 403 + 470 + 859 + 5 + 0 + + + 396 + 469 + 858 + 5 + 0 + + + 32 + 467 + 861 + 5 + 0 + + + 403 + 467 + 859 + 5 + 0 + + + 33 + 467 + 856 + 5 + 0 + + + 395 + 465 + 861 + 5 + 0 + + + 394 + 465 + 856 + 5 + 0 + + + 1100 + 439 + 868 + 5 + 0 + + + 1099 + 438 + 870 + 4 + 0 + + + 1099 + 438 + 868 + 6 + 0 + + + 1091 + 438 + 866 + 7 + 0 + + + 1086 + 437 + 866 + 0 + 0 + + + 1092 + 436 + 870 + 4 + 0 + + + 1086 + 436 + 868 + 7 + 0 + + + 1091 + 435 + 868 + 0 + 0 + + + 1099 + 435 + 866 + 1 + 0 + + + 1091 + 434 + 870 + 4 + 0 + + + 1100 + 434 + 866 + 2 + 0 + + + 399 + 434 + 864 + 1 + 0 + + + 1092 + 433 + 868 + 1 + 0 + + + 1086 + 432 + 870 + 4 + 0 + + + 1092 + 432 + 866 + 3 + 0 + + + 32 + 446 + 870 + 1 + 0 + + + 164 + 443 + 870 + 2 + 0 + + + 164 + 443 + 869 + 3 + 0 + + + 164 + 442 + 870 + 4 + 0 + + + 1092 + 441 + 868 + 4 + 0 + + + 1099 + 441 + 866 + 5 + 0 + + + 1100 + 440 + 870 + 4 + 0 + + + 1092 + 440 + 866 + 6 + 0 + + + 398 + 440 + 864 + 1 + 0 + + + 397 + 455 + 864 + 1 + 0 + + + 1176 + 452 + 870 + 0 + 0 + + + 1099 + 463 + 870 + 3 + 0 + + + 400 + 463 + 869 + 1 + 0 + + + 1099 + 463 + 866 + 0 + 0 + + + 397 + 463 + 864 + 1 + 0 + + + 1086 + 462 + 868 + 6 + 0 + + + 1100 + 461 + 870 + 4 + 0 + + + 1100 + 461 + 866 + 7 + 0 + + + 164 + 460 + 868 + 7 + 0 + + + 164 + 459 + 869 + 0 + 0 + + + 395 + 457 + 871 + 0 + 0 + + + 396 + 471 + 864 + 1 + 0 + + + 398 + 468 + 871 + 2 + 0 + + + 1086 + 465 + 870 + 2 + 0 + + + 1092 + 465 + 866 + 1 + 0 + + + 1099 + 464 + 868 + 5 + 0 + + + 204 + 439 + 870 + 2 + 1 + + + 204 + 439 + 866 + 2 + 1 + + + 204 + 437 + 871 + 0 + 1 + + + 204 + 437 + 868 + 0 + 1 + + + 204 + 436 + 866 + 3 + 1 + + + 204 + 435 + 870 + 2 + 1 + + + 204 + 434 + 868 + 0 + 1 + + + 204 + 433 + 870 + 3 + 1 + + + 204 + 433 + 866 + 3 + 1 + + + 204 + 432 + 868 + 3 + 1 + + + 204 + 442 + 868 + 2 + 1 + + + 204 + 442 + 866 + 2 + 1 + + + 204 + 441 + 870 + 3 + 1 + + + 204 + 440 + 868 + 0 + 1 + + + 204 + 463 + 868 + 3 + 1 + + + 204 + 462 + 870 + 3 + 1 + + + 204 + 462 + 867 + 0 + 1 + + + 204 + 461 + 868 + 3 + 1 + + + 204 + 460 + 870 + 3 + 1 + + + 204 + 467 + 869 + 2 + 1 + + + 204 + 466 + 870 + 2 + 1 + + + 204 + 465 + 868 + 2 + 1 + + + 204 + 464 + 870 + 2 + 1 + + + 204 + 464 + 867 + 0 + 1 + + + 403 + 474 + 836 + 5 + 0 + + + 33 + 474 + 832 + 5 + 0 + + + 394 + 473 + 834 + 5 + 0 + + + 32 + 473 + 840 + 5 + 0 + + + 21 + 472 + 855 + 0 + 0 + + + 21 + 472 + 853 + 0 + 0 + + + 32 + 476 + 858 + 5 + 0 + + + 33 + 475 + 861 + 5 + 0 + + + 399 + 474 + 859 + 5 + 0 + + + 394 + 473 + 861 + 5 + 0 + + + 398 + 473 + 858 + 5 + 0 + + + 1100 + 477 + 868 + 1 + 0 + + + 400 + 477 + 867 + 1 + 0 + + + 1092 + 477 + 866 + 1 + 0 + + + 1099 + 476 + 868 + 1 + 0 + + + 1086 + 476 + 867 + 1 + 0 + + + 1099 + 476 + 866 + 1 + 0 + + + 204 + 476 + 870 + 0 + 1 + + + 204 + 475 + 869 + 3 + 1 + + + 403 + 445 + 879 + 6 + 0 + + + 395 + 445 + 875 + 0 + 0 + + + 405 + 442 + 873 + 3 + 0 + + + 399 + 441 + 878 + 0 + 0 + + + 33 + 440 + 875 + 7 + 0 + + + 32 + 454 + 873 + 5 + 0 + + + 396 + 453 + 876 + 2 + 0 + + + 1151 + 453 + 873 + 0 + 0 + + + 1151 + 452 + 872 + 1 + 0 + + + 398 + 451 + 878 + 1 + 0 + + + 1151 + 451 + 873 + 7 + 0 + + + 32 + 450 + 873 + 6 + 0 + + + 404 + 448 + 877 + 7 + 0 + + + 397 + 448 + 872 + 1 + 0 + + + 396 + 463 + 877 + 7 + 0 + + + 404 + 463 + 873 + 7 + 0 + + + 394 + 461 + 875 + 7 + 0 + + + 404 + 460 + 879 + 7 + 0 + + + 400 + 459 + 872 + 7 + 0 + + + 403 + 457 + 876 + 7 + 0 + + + 395 + 471 + 874 + 7 + 0 + + + 404 + 471 + 872 + 0 + 0 + + + 1113 + 468 + 878 + 2 + 0 + + + 32 + 467 + 873 + 3 + 0 + + + 394 + 465 + 874 + 2 + 0 + + + 394 + 465 + 872 + 1 + 0 + + + 401 + 475 + 879 + 1 + 0 + + + 33 + 475 + 874 + 3 + 0 + + + 405 + 474 + 872 + 1 + 0 + + + 32 + 472 + 878 + 2 + 0 + + + 399 + 439 + 878 + 1 + 0 + + + 394 + 439 + 872 + 2 + 0 + + + 396 + 438 + 875 + 6 + 0 + + + 404 + 437 + 877 + 2 + 0 + + + 430 + 436 + 875 + 0 + 0 + + + 32 + 436 + 873 + 0 + 0 + + + 397 + 434 + 878 + 5 + 0 + + + 403 + 434 + 875 + 3 + 0 + + + 395 + 433 + 872 + 1 + 0 + + + 398 + 432 + 876 + 4 + 0 + + + 397 + 431 + 860 + 6 + 0 + + + 395 + 431 + 858 + 6 + 0 + + + 32 + 430 + 861 + 2 + 0 + + + 395 + 429 + 860 + 6 + 0 + + + 99 + 429 + 858 + 2 + 0 + + + 99 + 429 + 857 + 2 + 0 + + + 33 + 428 + 859 + 2 + 0 + + + 394 + 428 + 858 + 0 + 0 + + + 395 + 427 + 859 + 2 + 0 + + + 396 + 426 + 860 + 0 + 0 + + + 99 + 426 + 859 + 2 + 0 + + + 98 + 425 + 860 + 2 + 0 + + + 32 + 425 + 859 + 2 + 0 + + + 403 + 425 + 856 + 1 + 0 + + + 32 + 424 + 860 + 1 + 0 + + + 1099 + 431 + 868 + 0 + 0 + + + 1092 + 431 + 866 + 0 + 0 + + + 1086 + 431 + 865 + 4 + 0 + + + 1100 + 430 + 870 + 6 + 0 + + + 1092 + 430 + 867 + 0 + 0 + + + 1091 + 430 + 865 + 0 + 0 + + + 1100 + 429 + 868 + 0 + 0 + + + 1099 + 429 + 866 + 0 + 0 + + + 1099 + 428 + 870 + 5 + 0 + + + 1092 + 428 + 867 + 0 + 0 + + + 1099 + 428 + 865 + 0 + 0 + + + 164 + 427 + 869 + 3 + 0 + + + 164 + 427 + 868 + 1 + 0 + + + 164 + 427 + 867 + 2 + 0 + + + 1176 + 425 + 870 + 0 + 0 + + + 32 + 431 + 879 + 6 + 0 + + + 394 + 430 + 876 + 4 + 0 + + + 404 + 430 + 872 + 5 + 0 + + + 398 + 428 + 878 + 2 + 0 + + + 399 + 427 + 875 + 1 + 0 + + + 403 + 427 + 872 + 0 + 0 + + + 395 + 425 + 874 + 0 + 0 + + + 1113 + 424 + 878 + 0 + 0 + + + 204 + 431 + 867 + 2 + 1 + + + 204 + 430 + 868 + 2 + 1 + + + 204 + 430 + 866 + 2 + 1 + + + 204 + 429 + 867 + 3 + 1 + + + 204 + 429 + 865 + 3 + 1 + + + 204 + 428 + 868 + 3 + 1 + + + 204 + 428 + 866 + 3 + 1 + + + 395 + 422 + 844 + 2 + 0 + + + 32 + 421 + 842 + 6 + 0 + + + 33 + 418 + 841 + 7 + 0 + + + 33 + 423 + 854 + 2 + 0 + + + 32 + 423 + 851 + 5 + 0 + + + 394 + 422 + 855 + 3 + 0 + + + 768 + 419 + 853 + 2 + 0 + + + 33 + 417 + 852 + 6 + 0 + + + 396 + 416 + 855 + 7 + 0 + + + 395 + 423 + 860 + 2 + 0 + + + 33 + 423 + 858 + 0 + 0 + + + 32 + 422 + 861 + 4 + 0 + + + 401 + 422 + 860 + 3 + 0 + + + 395 + 422 + 858 + 0 + 0 + + + 394 + 421 + 861 + 5 + 0 + + + 397 + 420 + 861 + 6 + 0 + + + 32 + 420 + 860 + 7 + 0 + + + 32 + 420 + 856 + 0 + 0 + + + 396 + 419 + 861 + 1 + 0 + + + 33 + 419 + 860 + 7 + 0 + + + 395 + 418 + 861 + 0 + 0 + + + 33 + 418 + 858 + 3 + 0 + + + 403 + 417 + 861 + 1 + 0 + + + 32 + 417 + 860 + 2 + 0 + + + 394 + 416 + 861 + 0 + 0 + + + 395 + 419 + 864 + 0 + 0 + + + 1176 + 417 + 870 + 0 + 0 + + + 397 + 423 + 875 + 7 + 0 + + + 32 + 423 + 872 + 1 + 0 + + + 394 + 420 + 878 + 5 + 0 + + + 33 + 420 + 875 + 6 + 0 + + + 395 + 419 + 873 + 3 + 0 + + + 32 + 417 + 879 + 2 + 0 + + + 397 + 417 + 876 + 2 + 0 + + + 32 + 416 + 873 + 2 + 0 + + + 1 + 422 + 847 + 1 + 1 + + + 2 + 418 + 844 + 0 + 1 + + + 1 + 418 + 851 + 0 + 1 + + + 33 + 415 + 841 + 0 + 0 + + + 396 + 414 + 844 + 1 + 0 + + + 394 + 413 + 847 + 1 + 0 + + + 396 + 412 + 845 + 0 + 0 + + + 404 + 411 + 841 + 3 + 0 + + + 394 + 414 + 854 + 7 + 0 + + + 396 + 414 + 851 + 5 + 0 + + + 396 + 412 + 854 + 6 + 0 + + + 403 + 409 + 855 + 4 + 0 + + + 32 + 415 + 862 + 0 + 0 + + + 32 + 415 + 861 + 0 + 0 + + + 395 + 414 + 861 + 0 + 0 + + + 33 + 414 + 858 + 2 + 0 + + + 401 + 413 + 861 + 3 + 0 + + + 98 + 413 + 860 + 5 + 0 + + + 32 + 413 + 859 + 1 + 0 + + + 403 + 412 + 862 + 4 + 0 + + + 98 + 412 + 861 + 5 + 0 + + + 33 + 412 + 860 + 3 + 0 + + + 98 + 411 + 861 + 5 + 0 + + + 396 + 411 + 858 + 2 + 0 + + + 99 + 410 + 861 + 5 + 0 + + + 33 + 409 + 861 + 5 + 0 + + + 394 + 409 + 860 + 5 + 0 + + + 396 + 408 + 860 + 5 + 0 + + + 33 + 408 + 858 + 3 + 0 + + + 394 + 408 + 864 + 0 + 0 + + + 33 + 415 + 876 + 2 + 0 + + + 398 + 413 + 874 + 2 + 0 + + + 1113 + 411 + 878 + 2 + 0 + + + 395 + 410 + 875 + 2 + 0 + + + 394 + 408 + 877 + 2 + 0 + + + 1 + 415 + 847 + 1 + 1 + + + 2 + 412 + 850 + 2 + 1 + + + 404 + 407 + 843 + 3 + 0 + + + 779 + 404 + 846 + 5 + 0 + + + 290 + 402 + 842 + 6 + 0 + + + 32 + 407 + 853 + 1 + 0 + + + 395 + 405 + 849 + 7 + 0 + + + 29 + 403 + 850 + 4 + 0 + + + 33 + 407 + 860 + 5 + 0 + + + 32 + 406 + 861 + 5 + 0 + + + 395 + 406 + 860 + 5 + 0 + + + 394 + 406 + 856 + 2 + 0 + + + 404 + 405 + 861 + 5 + 0 + + + 33 + 405 + 857 + 3 + 0 + + + 394 + 404 + 861 + 5 + 0 + + + 33 + 403 + 861 + 5 + 0 + + + 395 + 402 + 861 + 5 + 0 + + + 403 + 402 + 856 + 5 + 0 + + + 396 + 401 + 861 + 5 + 0 + + + 401 + 401 + 860 + 5 + 0 + + + 32 + 400 + 861 + 5 + 0 + + + 1100 + 401 + 870 + 0 + 0 + + + 395 + 401 + 864 + 0 + 0 + + + 1086 + 400 + 870 + 7 + 0 + + + 1099 + 400 + 869 + 2 + 0 + + + 1086 + 400 + 867 + 5 + 0 + + + 404 + 407 + 874 + 2 + 0 + + + 33 + 405 + 876 + 1 + 0 + + + 396 + 405 + 873 + 2 + 0 + + + 32 + 403 + 879 + 2 + 0 + + + 395 + 402 + 873 + 0 + 0 + + + 398 + 401 + 876 + 2 + 0 + + + 1099 + 401 + 872 + 7 + 0 + + + 1086 + 400 + 872 + 6 + 0 + + + 2 + 407 + 847 + 2 + 1 + + + 2 + 400 + 845 + 0 + 1 + + + 1 + 405 + 851 + 1 + 1 + + + 1 + 402 + 855 + 0 + 1 + + + 1 + 401 + 848 + 0 + 1 + + + 204 + 402 + 871 + 2 + 1 + + + 204 + 401 + 869 + 2 + 1 + + + 204 + 401 + 867 + 2 + 1 + + + 395 + 399 + 847 + 0 + 0 + + + 3 + 399 + 843 + 4 + 0 + + + 3 + 399 + 842 + 4 + 0 + + + 118 + 399 + 840 + 0 + 0 + + + 23 + 398 + 842 + 6 + 0 + + + 32 + 395 + 844 + 6 + 0 + + + 396 + 394 + 846 + 5 + 0 + + + 395 + 393 + 843 + 5 + 0 + + + 394 + 393 + 841 + 4 + 0 + + + 164 + 392 + 846 + 0 + 0 + + + 33 + 392 + 844 + 6 + 0 + + + 29 + 399 + 852 + 4 + 0 + + + 401 + 394 + 854 + 0 + 0 + + + 712 + 394 + 851 + 0 + 0 + + + 164 + 393 + 855 + 0 + 0 + + + 403 + 393 + 853 + 0 + 0 + + + 404 + 393 + 850 + 0 + 0 + + + 405 + 393 + 848 + 2 + 0 + + + 98 + 399 + 861 + 7 + 0 + + + 99 + 398 + 861 + 6 + 0 + + + 98 + 397 + 861 + 5 + 0 + + + 395 + 397 + 860 + 5 + 0 + + + 32 + 396 + 860 + 5 + 0 + + + 395 + 395 + 860 + 5 + 0 + + + 401 + 394 + 861 + 5 + 0 + + + 396 + 394 + 860 + 5 + 0 + + + 405 + 393 + 861 + 0 + 0 + + + 402 + 393 + 860 + 0 + 0 + + + 402 + 392 + 861 + 2 + 0 + + + 401 + 392 + 860 + 0 + 0 + + + 164 + 392 + 857 + 5 + 0 + + + 164 + 392 + 856 + 0 + 0 + + + 1091 + 399 + 870 + 0 + 0 + + + 397 + 399 + 865 + 0 + 0 + + + 1086 + 398 + 870 + 1 + 0 + + + 1100 + 398 + 869 + 2 + 0 + + + 1092 + 398 + 867 + 1 + 0 + + + 1092 + 397 + 870 + 2 + 0 + + + 1100 + 397 + 867 + 0 + 0 + + + 396 + 397 + 864 + 0 + 0 + + + 1099 + 396 + 870 + 0 + 0 + + + 1091 + 396 + 869 + 2 + 0 + + + 1091 + 395 + 870 + 4 + 0 + + + 1086 + 395 + 867 + 1 + 0 + + + 394 + 395 + 865 + 0 + 0 + + + 1092 + 394 + 870 + 5 + 0 + + + 1099 + 394 + 869 + 2 + 0 + + + 398 + 393 + 865 + 0 + 0 + + + 403 + 399 + 879 + 0 + 0 + + + 399 + 399 + 874 + 2 + 0 + + + 1091 + 398 + 872 + 5 + 0 + + + 404 + 397 + 877 + 0 + 0 + + + 397 + 396 + 875 + 1 + 0 + + + 1092 + 396 + 872 + 4 + 0 + + + 1176 + 394 + 874 + 0 + 0 + + + 1099 + 394 + 872 + 3 + 0 + + + 403 + 393 + 877 + 5 + 0 + + + 1 + 395 + 840 + 0 + 1 + + + 1 + 399 + 851 + 1 + 1 + + + 204 + 399 + 869 + 3 + 1 + + + 204 + 399 + 867 + 3 + 1 + + + 204 + 397 + 869 + 2 + 1 + + + 204 + 396 + 867 + 2 + 1 + + + 204 + 395 + 869 + 3 + 1 + + + 204 + 394 + 867 + 3 + 1 + + + 204 + 393 + 871 + 3 + 1 + + + 204 + 399 + 873 + 0 + 1 + + + 204 + 397 + 873 + 0 + 1 + + + 204 + 395 + 873 + 0 + 1 + + + 33 + 391 + 845 + 0 + 0 + + + 404 + 390 + 844 + 7 + 0 + + + 396 + 390 + 841 + 0 + 0 + + + 32 + 389 + 844 + 0 + 0 + + + 164 + 388 + 843 + 2 + 0 + + + 394 + 387 + 841 + 0 + 0 + + + 164 + 386 + 847 + 7 + 0 + + + 404 + 386 + 846 + 0 + 0 + + + 99 + 385 + 845 + 6 + 0 + + + 403 + 385 + 844 + 6 + 0 + + + 402 + 385 + 843 + 6 + 0 + + + 401 + 385 + 842 + 6 + 0 + + + 405 + 385 + 841 + 6 + 0 + + + 397 + 385 + 840 + 2 + 0 + + + 99 + 384 + 847 + 3 + 0 + + + 100 + 384 + 846 + 4 + 0 + + + 98 + 384 + 845 + 5 + 0 + + + 611 + 388 + 851 + 0 + 0 + + + 402 + 386 + 848 + 0 + 0 + + + 613 + 384 + 851 + 0 + 0 + + + 32 + 384 + 848 + 3 + 0 + + + 400 + 391 + 861 + 2 + 0 + + + 164 + 391 + 858 + 6 + 0 + + + 32 + 391 + 857 + 4 + 0 + + + 33 + 390 + 861 + 2 + 0 + + + 396 + 390 + 860 + 2 + 0 + + + 164 + 390 + 857 + 3 + 0 + + + 394 + 389 + 860 + 2 + 0 + + + 32 + 388 + 860 + 2 + 0 + + + 395 + 388 + 859 + 2 + 0 + + + 98 + 387 + 859 + 2 + 0 + + + 98 + 386 + 858 + 2 + 0 + + + 98 + 386 + 857 + 1 + 0 + + + 403 + 385 + 860 + 2 + 0 + + + 402 + 385 + 858 + 2 + 0 + + + 98 + 385 + 857 + 2 + 0 + + + 394 + 387 + 866 + 0 + 0 + + + 395 + 384 + 865 + 0 + 0 + + + 395 + 391 + 873 + 1 + 0 + + + 404 + 389 + 878 + 5 + 0 + + + 32 + 389 + 875 + 5 + 0 + + + 405 + 387 + 874 + 0 + 0 + + + 396 + 385 + 877 + 6 + 0 + + + 399 + 385 + 873 + 7 + 0 + + + 33 + 381 + 845 + 0 + 0 + + + 32 + 381 + 843 + 4 + 0 + + + 32 + 379 + 847 + 0 + 0 + + + 403 + 378 + 845 + 0 + 0 + + + 399 + 376 + 841 + 4 + 0 + + + 398 + 379 + 854 + 0 + 0 + + + 396 + 378 + 850 + 0 + 0 + + + 399 + 376 + 852 + 0 + 0 + + + 33 + 382 + 856 + 0 + 0 + + + 401 + 381 + 862 + 4 + 0 + + + 32 + 381 + 859 + 0 + 0 + + + 397 + 379 + 861 + 4 + 0 + + + 396 + 379 + 857 + 0 + 0 + + + 33 + 378 + 858 + 0 + 0 + + + 402 + 377 + 862 + 4 + 0 + + + 403 + 376 + 856 + 0 + 0 + + + 403 + 383 + 876 + 5 + 0 + + + 395 + 380 + 878 + 5 + 0 + + + 394 + 379 + 874 + 5 + 0 + + + 398 + 377 + 877 + 4 + 0 + + + 401 + 375 + 847 + 0 + 0 + + + 405 + 375 + 844 + 4 + 0 + + + 32 + 373 + 842 + 0 + 0 + + + 33 + 372 + 847 + 0 + 0 + + + 33 + 371 + 841 + 0 + 0 + + + 33 + 369 + 843 + 4 + 0 + + + 402 + 368 + 847 + 0 + 0 + + + 399 + 373 + 855 + 0 + 0 + + + 404 + 373 + 850 + 0 + 0 + + + 401 + 372 + 853 + 0 + 0 + + + 395 + 369 + 852 + 0 + 0 + + + 398 + 368 + 854 + 0 + 0 + + + 405 + 375 + 861 + 4 + 0 + + + 397 + 375 + 858 + 0 + 0 + + + 33 + 374 + 857 + 0 + 0 + + + 403 + 372 + 862 + 4 + 0 + + + 396 + 372 + 858 + 0 + 0 + + + 33 + 370 + 861 + 0 + 0 + + + 397 + 370 + 857 + 0 + 0 + + + 32 + 369 + 859 + 0 + 0 + + + 33 + 368 + 862 + 0 + 0 + + + 403 + 375 + 872 + 5 + 0 + + + 404 + 373 + 878 + 4 + 0 + + + 397 + 372 + 875 + 4 + 0 + + + 396 + 370 + 878 + 4 + 0 + + + 430 + 369 + 876 + 0 + 0 + + + 1176 + 369 + 872 + 0 + 0 + + + 397 + 365 + 847 + 0 + 0 + + + 404 + 365 + 843 + 0 + 0 + + + 403 + 363 + 847 + 0 + 0 + + + 394 + 363 + 841 + 0 + 0 + + + 395 + 361 + 844 + 0 + 0 + + + 397 + 360 + 847 + 0 + 0 + + + 397 + 360 + 841 + 0 + 0 + + + 396 + 367 + 850 + 0 + 0 + + + 397 + 366 + 852 + 0 + 0 + + + 396 + 365 + 855 + 0 + 0 + + + 403 + 365 + 849 + 0 + 0 + + + 404 + 363 + 853 + 0 + 0 + + + 405 + 363 + 850 + 0 + 0 + + + 399 + 362 + 855 + 0 + 0 + + + 397 + 360 + 852 + 0 + 0 + + + 395 + 366 + 859 + 0 + 0 + + + 397 + 364 + 857 + 0 + 0 + + + 32 + 363 + 861 + 0 + 0 + + + 398 + 363 + 859 + 0 + 0 + + + 33 + 361 + 857 + 0 + 0 + + + 395 + 360 + 862 + 0 + 0 + + + 403 + 361 + 871 + 5 + 0 + + + 1091 + 360 + 871 + 4 + 0 + + + 1092 + 360 + 869 + 7 + 0 + + + 1091 + 360 + 867 + 1 + 0 + + + 398 + 360 + 864 + 4 + 0 + + + 34 + 367 + 875 + 7 + 0 + + + 1176 + 363 + 877 + 0 + 0 + + + 395 + 363 + 873 + 7 + 0 + + + 397 + 361 + 875 + 7 + 0 + + + 204 + 360 + 868 + 3 + 1 + + + 204 + 360 + 872 + 2 + 1 + + + 403 + 358 + 845 + 0 + 0 + + + 396 + 357 + 843 + 0 + 0 + + + 401 + 356 + 840 + 0 + 0 + + + 401 + 355 + 845 + 4 + 0 + + + 404 + 354 + 847 + 4 + 0 + + + 399 + 354 + 843 + 4 + 0 + + + 403 + 353 + 841 + 4 + 0 + + + 398 + 358 + 854 + 0 + 0 + + + 396 + 358 + 851 + 0 + 0 + + + 395 + 354 + 854 + 4 + 0 + + + 32 + 354 + 850 + 4 + 0 + + + 401 + 359 + 856 + 0 + 0 + + + 32 + 358 + 862 + 0 + 0 + + + 394 + 358 + 859 + 0 + 0 + + + 402 + 357 + 857 + 0 + 0 + + + 399 + 355 + 856 + 4 + 0 + + + 33 + 354 + 862 + 4 + 0 + + + 396 + 354 + 858 + 4 + 0 + + + 401 + 352 + 856 + 4 + 0 + + + 1091 + 359 + 869 + 0 + 0 + + + 1086 + 358 + 871 + 4 + 0 + + + 1086 + 358 + 869 + 1 + 0 + + + 1092 + 358 + 867 + 2 + 0 + + + 1092 + 357 + 869 + 2 + 0 + + + 397 + 357 + 865 + 5 + 0 + + + 1092 + 356 + 871 + 4 + 0 + + + 1091 + 356 + 869 + 3 + 0 + + + 1091 + 356 + 867 + 3 + 0 + + + 1086 + 355 + 869 + 3 + 0 + + + 1091 + 354 + 871 + 4 + 0 + + + 395 + 359 + 875 + 7 + 0 + + + 394 + 357 + 876 + 7 + 0 + + + 396 + 355 + 878 + 5 + 0 + + + 395 + 355 + 874 + 5 + 0 + + + 34 + 353 + 875 + 5 + 0 + + + 394 + 352 + 879 + 7 + 0 + + + 204 + 359 + 871 + 0 + 1 + + + 204 + 359 + 867 + 0 + 1 + + + 204 + 358 + 868 + 2 + 1 + + + 204 + 357 + 871 + 0 + 1 + + + 204 + 357 + 867 + 0 + 1 + + + 204 + 356 + 868 + 3 + 1 + + + 204 + 355 + 871 + 0 + 1 + + + 204 + 358 + 872 + 3 + 1 + + + 204 + 356 + 872 + 2 + 1 + + + 204 + 354 + 872 + 3 + 1 + + + 396 + 351 + 844 + 4 + 0 + + + 394 + 351 + 840 + 0 + 0 + + + 403 + 349 + 847 + 4 + 0 + + + 398 + 349 + 843 + 4 + 0 + + + 398 + 348 + 841 + 4 + 0 + + + 404 + 347 + 846 + 4 + 0 + + + 405 + 346 + 843 + 0 + 0 + + + 33 + 345 + 840 + 0 + 0 + + + 401 + 351 + 854 + 4 + 0 + + + 401 + 350 + 852 + 4 + 0 + + + 405 + 350 + 849 + 4 + 0 + + + 404 + 349 + 855 + 4 + 0 + + + 402 + 348 + 850 + 4 + 0 + + + 403 + 346 + 853 + 4 + 0 + + + 32 + 346 + 851 + 4 + 0 + + + 397 + 345 + 848 + 4 + 0 + + + 401 + 344 + 852 + 4 + 0 + + + 398 + 351 + 858 + 4 + 0 + + + 405 + 350 + 861 + 0 + 0 + + + 397 + 349 + 859 + 4 + 0 + + + 394 + 347 + 856 + 4 + 0 + + + 398 + 346 + 858 + 4 + 0 + + + 33 + 345 + 861 + 4 + 0 + + + 399 + 345 + 856 + 4 + 0 + + + 396 + 351 + 865 + 5 + 0 + + + 403 + 349 + 872 + 5 + 0 + + + 395 + 348 + 877 + 5 + 0 + + + 32 + 345 + 873 + 5 + 0 + + + 397 + 344 + 876 + 5 + 0 + + + 396 + 342 + 845 + 4 + 0 + + + 395 + 342 + 842 + 4 + 0 + + + 397 + 341 + 847 + 4 + 0 + + + 404 + 339 + 846 + 4 + 0 + + + 405 + 339 + 843 + 4 + 0 + + + 32 + 337 + 841 + 4 + 0 + + + 395 + 343 + 855 + 4 + 0 + + + 402 + 342 + 849 + 4 + 0 + + + 403 + 341 + 854 + 4 + 0 + + + 397 + 341 + 852 + 4 + 0 + + + 401 + 340 + 850 + 4 + 0 + + + 396 + 338 + 853 + 4 + 0 + + + 405 + 338 + 850 + 4 + 0 + + + 397 + 337 + 848 + 4 + 0 + + + 32 + 336 + 855 + 4 + 0 + + + 403 + 342 + 860 + 4 + 0 + + + 394 + 342 + 857 + 4 + 0 + + + 404 + 340 + 856 + 4 + 0 + + + 399 + 339 + 859 + 4 + 0 + + + 405 + 337 + 861 + 4 + 0 + + + 397 + 337 + 857 + 4 + 0 + + + 33 + 336 + 859 + 4 + 0 + + + 399 + 340 + 877 + 5 + 0 + + + 395 + 342 + 832 + 0 + 0 + + + 33 + 341 + 839 + 0 + 0 + + + 404 + 340 + 834 + 4 + 0 + + + 403 + 338 + 836 + 4 + 0 + + + 32 + 336 + 837 + 4 + 0 + + + 403 + 349 + 837 + 4 + 0 + + + 401 + 349 + 832 + 4 + 0 + + + 32 + 347 + 835 + 0 + 0 + + + 401 + 344 + 835 + 4 + 0 + + + 401 + 359 + 839 + 0 + 0 + + + 403 + 358 + 836 + 0 + 0 + + + 32 + 357 + 838 + 0 + 0 + + + 396 + 356 + 834 + 0 + 0 + + + 401 + 354 + 838 + 4 + 0 + + + 404 + 352 + 836 + 4 + 0 + + + 32 + 352 + 833 + 0 + 0 + + + 397 + 343 + 826 + 7 + 0 + + + 32 + 341 + 828 + 1 + 0 + + + 394 + 339 + 825 + 1 + 0 + + + 32 + 337 + 828 + 4 + 0 + + + 33 + 336 + 831 + 4 + 0 + + + 394 + 351 + 830 + 0 + 0 + + + 396 + 351 + 825 + 1 + 0 + + + 33 + 350 + 827 + 1 + 0 + + + 402 + 348 + 825 + 7 + 0 + + + 405 + 346 + 830 + 0 + 0 + + + 404 + 346 + 827 + 1 + 0 + + + 394 + 358 + 830 + 0 + 0 + + + 32 + 357 + 828 + 4 + 0 + + + 395 + 355 + 831 + 0 + 0 + + + 405 + 355 + 827 + 1 + 0 + + + 404 + 354 + 825 + 4 + 0 + + + 33 + 353 + 829 + 0 + 0 + + + 396 + 343 + 823 + 1 + 0 + + + 401 + 342 + 821 + 7 + 0 + + + 32 + 340 + 820 + 1 + 0 + + + 403 + 340 + 817 + 7 + 0 + + + 403 + 336 + 822 + 4 + 0 + + + 32 + 336 + 818 + 4 + 0 + + + 401 + 350 + 823 + 7 + 0 + + + 398 + 350 + 819 + 7 + 0 + + + 403 + 349 + 817 + 7 + 0 + + + 33 + 348 + 820 + 1 + 0 + + + 395 + 347 + 823 + 1 + 0 + + + 405 + 346 + 817 + 1 + 0 + + + 403 + 345 + 821 + 7 + 0 + + + 397 + 344 + 819 + 6 + 0 + + + 395 + 344 + 817 + 4 + 0 + + + 394 + 367 + 828 + 1 + 0 + + + 32 + 366 + 825 + 1 + 0 + + + 99 + 365 + 827 + 2 + 0 + + + 98 + 364 + 827 + 4 + 0 + + + 98 + 364 + 825 + 1 + 0 + + + 395 + 363 + 831 + 0 + 0 + + + 100 + 363 + 828 + 2 + 0 + + + 405 + 362 + 828 + 1 + 0 + + + 98 + 361 + 828 + 1 + 0 + + + 401 + 367 + 832 + 4 + 0 + + + 398 + 366 + 839 + 0 + 0 + + + 403 + 366 + 835 + 0 + 0 + + + 396 + 365 + 832 + 0 + 0 + + + 405 + 363 + 838 + 0 + 0 + + + 399 + 362 + 835 + 0 + 0 + + + 397 + 360 + 837 + 0 + 0 + + + 404 + 360 + 832 + 0 + 0 + + + 396 + 373 + 838 + 3 + 0 + + + 402 + 373 + 835 + 4 + 0 + + + 401 + 371 + 835 + 4 + 0 + + + 32 + 370 + 839 + 0 + 0 + + + 403 + 370 + 837 + 4 + 0 + + + 394 + 370 + 833 + 4 + 0 + + + 402 + 368 + 834 + 4 + 0 + + + 395 + 381 + 837 + 4 + 0 + + + 401 + 381 + 833 + 0 + 0 + + + 397 + 379 + 839 + 4 + 0 + + + 404 + 377 + 835 + 4 + 0 + + + 401 + 376 + 838 + 4 + 0 + + + 395 + 376 + 832 + 0 + 0 + + + 192 + 391 + 836 + 0 + 0 + + + 403 + 390 + 838 + 2 + 0 + + + 192 + 389 + 834 + 0 + 0 + + + 32 + 388 + 839 + 1 + 0 + + + 33 + 387 + 832 + 1 + 0 + + + 99 + 386 + 837 + 6 + 0 + + + 395 + 385 + 839 + 2 + 0 + + + 400 + 385 + 838 + 2 + 0 + + + 98 + 385 + 837 + 6 + 0 + + + 32 + 385 + 836 + 0 + 0 + + + 98 + 384 + 836 + 2 + 0 + + + 98 + 384 + 835 + 0 + 0 + + + 98 + 384 + 833 + 3 + 0 + + + 98 + 384 + 832 + 2 + 0 + + + 192 + 399 + 836 + 0 + 0 + + + 21 + 396 + 836 + 4 + 0 + + + 21 + 396 + 835 + 6 + 0 + + + 192 + 396 + 833 + 0 + 0 + + + 5 + 395 + 838 + 0 + 0 + + + 21 + 394 + 836 + 4 + 0 + + + 21 + 394 + 835 + 6 + 0 + + + 33 + 393 + 832 + 0 + 0 + + + 33 + 392 + 838 + 3 + 0 + + + 33 + 422 + 833 + 6 + 0 + + + 396 + 421 + 835 + 3 + 0 + + + 394 + 419 + 833 + 6 + 0 + + + 32 + 418 + 836 + 7 + 0 + + + 33 + 471 + 817 + 1 + 0 + + + 399 + 470 + 818 + 1 + 0 + + + 32 + 469 + 816 + 1 + 0 + + + 396 + 468 + 818 + 1 + 0 + + + 394 + 467 + 818 + 1 + 0 + + + 397 + 467 + 816 + 1 + 0 + + + 33 + 466 + 819 + 1 + 0 + + + 398 + 465 + 818 + 1 + 0 + + + 395 + 465 + 817 + 1 + 0 + + + 32 + 464 + 816 + 1 + 0 + + + 398 + 471 + 814 + 0 + 0 + + + 32 + 471 + 813 + 0 + 0 + + + 401 + 471 + 808 + 0 + 0 + + + 404 + 470 + 810 + 4 + 0 + + + 405 + 469 + 813 + 0 + 0 + + + 404 + 468 + 815 + 0 + 0 + + + 399 + 468 + 811 + 0 + 0 + + + 404 + 468 + 809 + 0 + 0 + + + 32 + 466 + 814 + 0 + 0 + + + 32 + 466 + 812 + 0 + 0 + + + 403 + 466 + 810 + 0 + 0 + + + 397 + 464 + 814 + 3 + 0 + + + 395 + 464 + 808 + 0 + 0 + + + 398 + 471 + 806 + 0 + 0 + + + 405 + 471 + 804 + 0 + 0 + + + 33 + 471 + 800 + 0 + 0 + + + 397 + 470 + 802 + 0 + 0 + + + 33 + 469 + 807 + 3 + 0 + + + 396 + 468 + 804 + 0 + 0 + + + 32 + 468 + 800 + 0 + 0 + + + 402 + 467 + 807 + 0 + 0 + + + 398 + 467 + 802 + 0 + 0 + + + 397 + 466 + 806 + 0 + 0 + + + 32 + 466 + 803 + 5 + 0 + + + 33 + 464 + 805 + 0 + 0 + + + 399 + 464 + 802 + 0 + 0 + + + 401 + 471 + 796 + 6 + 0 + + + 564 + 471 + 795 + 1 + 0 + + + 564 + 471 + 794 + 0 + 0 + + + 397 + 470 + 799 + 0 + 0 + + + 402 + 470 + 796 + 0 + 0 + + + 401 + 470 + 795 + 1 + 0 + + + 564 + 470 + 794 + 7 + 0 + + + 430 + 470 + 793 + 1 + 0 + + + 396 + 469 + 795 + 6 + 0 + + + 404 + 468 + 797 + 0 + 0 + + + 402 + 468 + 794 + 6 + 0 + + + 401 + 467 + 796 + 0 + 0 + + + 396 + 466 + 799 + 0 + 0 + + + 401 + 466 + 797 + 6 + 0 + + + 396 + 466 + 792 + 2 + 0 + + + 402 + 465 + 797 + 6 + 0 + + + 403 + 464 + 799 + 0 + 0 + + + 402 + 464 + 797 + 6 + 0 + + + 396 + 476 + 795 + 7 + 0 + + + 401 + 476 + 794 + 6 + 0 + + + 218 + 476 + 793 + 6 + 0 + + + 32 + 476 + 792 + 0 + 0 + + + 402 + 475 + 799 + 2 + 0 + + + 396 + 475 + 797 + 6 + 0 + + + 401 + 475 + 793 + 5 + 0 + + + 402 + 474 + 799 + 2 + 0 + + + 397 + 474 + 795 + 5 + 0 + + + 397 + 474 + 793 + 5 + 0 + + + 36 + 473 + 797 + 1 + 0 + + + 32 + 473 + 796 + 2 + 0 + + + 401 + 473 + 793 + 0 + 0 + + + 396 + 472 + 799 + 4 + 0 + + + 402 + 472 + 797 + 6 + 0 + + + 36 + 472 + 796 + 1 + 0 + + + 36 + 472 + 795 + 1 + 0 + + + 401 + 472 + 794 + 5 + 0 + + + 396 + 472 + 793 + 1 + 0 + + + 401 + 477 + 807 + 0 + 0 + + + 402 + 477 + 806 + 2 + 0 + + + 402 + 477 + 805 + 2 + 0 + + + 401 + 477 + 804 + 2 + 0 + + + 402 + 476 + 803 + 2 + 0 + + + 401 + 476 + 801 + 7 + 0 + + + 401 + 476 + 800 + 7 + 0 + + + 398 + 475 + 807 + 0 + 0 + + + 394 + 475 + 805 + 0 + 0 + + + 402 + 475 + 802 + 5 + 0 + + + 404 + 475 + 800 + 2 + 0 + + + 399 + 473 + 806 + 0 + 0 + + + 32 + 473 + 804 + 0 + 0 + + + 396 + 473 + 801 + 5 + 0 + + + 401 + 477 + 808 + 0 + 0 + + + 399 + 476 + 813 + 0 + 0 + + + 33 + 476 + 811 + 3 + 0 + + + 401 + 476 + 809 + 0 + 0 + + + 401 + 476 + 808 + 0 + 0 + + + 396 + 475 + 814 + 0 + 0 + + + 32 + 475 + 812 + 0 + 0 + + + 398 + 474 + 811 + 0 + 0 + + + 397 + 474 + 809 + 0 + 0 + + + 397 + 473 + 813 + 0 + 0 + + + 403 + 472 + 811 + 6 + 0 + + + 396 + 472 + 808 + 0 + 0 + + + 397 + 474 + 819 + 1 + 0 + + + 395 + 474 + 817 + 1 + 0 + + + 397 + 473 + 817 + 1 + 0 + + + 32 + 472 + 820 + 1 + 0 + + + 398 + 472 + 818 + 1 + 0 + + + 405 + 474 + 825 + 4 + 0 + + + 396 + 473 + 827 + 5 + 0 + + + 688 + 473 + 825 + 4 + 0 + + + 405 + 472 + 824 + 0 + 0 + + + 405 + 455 + 789 + 3 + 0 + + + 404 + 455 + 785 + 0 + 0 + + + 394 + 454 + 791 + 5 + 0 + + + 397 + 454 + 787 + 7 + 0 + + + 403 + 453 + 784 + 7 + 0 + + + 32 + 452 + 789 + 6 + 0 + + + 396 + 452 + 787 + 7 + 0 + + + 397 + 452 + 785 + 7 + 0 + + + 397 + 451 + 784 + 7 + 0 + + + 396 + 450 + 791 + 1 + 0 + + + 404 + 450 + 789 + 4 + 0 + + + 396 + 449 + 787 + 4 + 0 + + + 394 + 448 + 789 + 2 + 0 + + + 402 + 448 + 784 + 2 + 0 + + + 396 + 463 + 790 + 2 + 0 + + + 403 + 463 + 788 + 0 + 0 + + + 396 + 463 + 784 + 0 + 0 + + + 397 + 462 + 786 + 2 + 0 + + + 401 + 461 + 791 + 2 + 0 + + + 402 + 461 + 788 + 2 + 0 + + + 398 + 460 + 789 + 2 + 0 + + + 394 + 460 + 785 + 3 + 0 + + + 399 + 459 + 787 + 2 + 0 + + + 401 + 458 + 791 + 0 + 0 + + + 396 + 458 + 789 + 0 + 0 + + + 399 + 458 + 784 + 7 + 0 + + + 398 + 457 + 786 + 7 + 0 + + + 404 + 456 + 790 + 2 + 0 + + + 401 + 471 + 789 + 2 + 0 + + + 404 + 471 + 784 + 0 + 0 + + + 394 + 470 + 790 + 6 + 0 + + + 401 + 470 + 788 + 3 + 0 + + + 404 + 470 + 786 + 0 + 0 + + + 401 + 469 + 791 + 7 + 0 + + + 397 + 468 + 789 + 2 + 0 + + + 403 + 468 + 787 + 2 + 0 + + + 33 + 467 + 785 + 4 + 0 + + + 404 + 466 + 789 + 3 + 0 + + + 394 + 465 + 791 + 2 + 0 + + + 405 + 465 + 785 + 4 + 0 + + + 404 + 464 + 786 + 0 + 0 + + + 403 + 476 + 787 + 1 + 0 + + + 401 + 475 + 786 + 7 + 0 + + + 32 + 475 + 784 + 5 + 0 + + + 405 + 474 + 790 + 0 + 0 + + + 397 + 474 + 789 + 5 + 0 + + + 396 + 474 + 787 + 0 + 0 + + + 401 + 474 + 785 + 7 + 0 + + + 404 + 473 + 791 + 4 + 0 + + + 36 + 473 + 788 + 1 + 0 + + + 401 + 472 + 791 + 5 + 0 + + + 36 + 472 + 789 + 1 + 0 + + + 36 + 472 + 788 + 1 + 0 + + + 396 + 472 + 786 + 0 + 0 + + + 554 + 447 + 778 + 7 + 0 + + + 8 + 447 + 776 + 2 + 0 + + + 399 + 446 + 782 + 2 + 0 + + + 554 + 446 + 780 + 5 + 0 + + + 97 + 446 + 779 + 4 + 0 + + + 97 + 446 + 778 + 4 + 0 + + + 8 + 446 + 776 + 3 + 0 + + + 401 + 445 + 782 + 0 + 0 + + + 97 + 445 + 779 + 4 + 0 + + + 97 + 445 + 778 + 4 + 0 + + + 399 + 444 + 782 + 0 + 0 + + + 554 + 444 + 779 + 3 + 0 + + + 402 + 444 + 777 + 2 + 0 + + + 401 + 443 + 783 + 2 + 0 + + + 404 + 443 + 780 + 2 + 0 + + + 403 + 443 + 777 + 2 + 0 + + + 401 + 442 + 776 + 2 + 0 + + + 397 + 441 + 781 + 3 + 0 + + + 402 + 441 + 779 + 2 + 0 + + + 396 + 440 + 783 + 3 + 0 + + + 402 + 440 + 777 + 3 + 0 + + + 398 + 455 + 779 + 4 + 0 + + + 395 + 454 + 782 + 7 + 0 + + + 403 + 453 + 780 + 4 + 0 + + + 397 + 453 + 777 + 4 + 0 + + + 401 + 452 + 782 + 7 + 0 + + + 403 + 451 + 776 + 3 + 0 + + + 396 + 450 + 783 + 7 + 0 + + + 401 + 450 + 781 + 2 + 0 + + + 402 + 450 + 778 + 2 + 0 + + + 403 + 448 + 781 + 2 + 0 + + + 397 + 463 + 782 + 0 + 0 + + + 32 + 463 + 778 + 0 + 0 + + + 401 + 461 + 783 + 3 + 0 + + + 395 + 461 + 781 + 5 + 0 + + + 33 + 461 + 777 + 2 + 0 + + + 396 + 459 + 779 + 4 + 0 + + + 404 + 458 + 781 + 4 + 0 + + + 399 + 457 + 778 + 4 + 0 + + + 402 + 456 + 783 + 7 + 0 + + + 403 + 471 + 780 + 2 + 0 + + + 399 + 471 + 778 + 0 + 0 + + + 399 + 471 + 776 + 0 + 0 + + + 399 + 469 + 783 + 0 + 0 + + + 396 + 469 + 779 + 0 + 0 + + + 404 + 468 + 781 + 0 + 0 + + + 396 + 468 + 777 + 0 + 0 + + + 403 + 466 + 780 + 4 + 0 + + + 397 + 466 + 778 + 0 + 0 + + + 396 + 466 + 776 + 1 + 0 + + + 398 + 465 + 783 + 0 + 0 + + + 398 + 464 + 780 + 0 + 0 + + + 396 + 476 + 782 + 1 + 0 + + + 402 + 476 + 780 + 5 + 0 + + + 401 + 476 + 779 + 0 + 0 + + + 401 + 476 + 778 + 0 + 0 + + + 401 + 475 + 781 + 0 + 0 + + + 401 + 475 + 780 + 0 + 0 + + + 33 + 475 + 777 + 4 + 0 + + + 401 + 474 + 782 + 3 + 0 + + + 401 + 474 + 781 + 0 + 0 + + + 405 + 473 + 778 + 0 + 0 + + + 403 + 472 + 782 + 0 + 0 + + + 404 + 453 + 774 + 3 + 0 + + + 5 + 451 + 770 + 0 + 0 + + + 399 + 463 + 768 + 4 + 0 + + + 395 + 462 + 772 + 1 + 0 + + + 32 + 461 + 774 + 6 + 0 + + + 399 + 460 + 772 + 0 + 0 + + + 398 + 460 + 770 + 0 + 0 + + + 401 + 460 + 768 + 4 + 0 + + + 33 + 459 + 775 + 4 + 0 + + + 396 + 458 + 772 + 0 + 0 + + + 397 + 458 + 769 + 0 + 0 + + + 402 + 457 + 768 + 4 + 0 + + + 405 + 456 + 775 + 0 + 0 + + + 394 + 456 + 770 + 7 + 0 + + + 396 + 471 + 771 + 4 + 0 + + + 402 + 471 + 769 + 3 + 0 + + + 394 + 470 + 774 + 1 + 0 + + + 403 + 469 + 768 + 2 + 0 + + + 399 + 468 + 775 + 0 + 0 + + + 395 + 468 + 770 + 5 + 0 + + + 397 + 467 + 772 + 4 + 0 + + + 402 + 467 + 769 + 7 + 0 + + + 394 + 466 + 774 + 4 + 0 + + + 401 + 466 + 771 + 7 + 0 + + + 396 + 464 + 775 + 2 + 0 + + + 404 + 464 + 773 + 7 + 0 + + + 398 + 464 + 770 + 4 + 0 + + + 32 + 477 + 768 + 4 + 0 + + + 32 + 476 + 774 + 4 + 0 + + + 33 + 476 + 771 + 4 + 0 + + + 402 + 475 + 775 + 0 + 0 + + + 403 + 474 + 773 + 3 + 0 + + + 401 + 474 + 769 + 3 + 0 + + + 401 + 473 + 775 + 0 + 0 + + + 404 + 472 + 773 + 0 + 0 + + + 2 + 450 + 772 + 3 + 1 + + + 2 + 448 + 771 + 2 + 1 + + + 394 + 462 + 766 + 4 + 0 + + + 397 + 462 + 761 + 5 + 0 + + + 398 + 461 + 764 + 5 + 0 + + + 399 + 460 + 762 + 5 + 0 + + + 396 + 456 + 762 + 3 + 0 + + + 396 + 471 + 760 + 4 + 0 + + + 404 + 470 + 766 + 5 + 0 + + + 395 + 470 + 763 + 4 + 0 + + + 403 + 469 + 761 + 6 + 0 + + + 32 + 468 + 766 + 2 + 0 + + + 403 + 468 + 764 + 5 + 0 + + + 394 + 467 + 762 + 6 + 0 + + + 33 + 466 + 764 + 6 + 0 + + + 398 + 466 + 760 + 4 + 0 + + + 403 + 465 + 766 + 5 + 0 + + + 396 + 465 + 761 + 5 + 0 + + + 404 + 464 + 763 + 5 + 0 + + + 32 + 476 + 765 + 5 + 0 + + + 33 + 475 + 766 + 5 + 0 + + + 394 + 475 + 764 + 5 + 0 + + + 32 + 475 + 763 + 7 + 0 + + + 33 + 474 + 761 + 6 + 0 + + + 394 + 472 + 765 + 4 + 0 + + + 404 + 472 + 763 + 5 + 0 + + + 6 + 516 + 1411 + 0 + 0 + + + 15 + 516 + 1408 + 4 + 0 + + + 6 + 525 + 1406 + 0 + 0 + + + 55 + 522 + 1407 + 4 + 0 + + + 55 + 522 + 1406 + 4 + 0 + + + 15 + 524 + 1410 + 0 + 0 + + + 121 + 522 + 1411 + 4 + 0 + + + 47 + 522 + 1408 + 0 + 0 + + + 5 + 477 + 1393 + 0 + 0 + + + 6 + 476 + 1395 + 0 + 0 + + + 42 + 490 + 1410 + 0 + 0 + + + 1 + 473 + 1392 + 1 + 1 + + + 45 + 404 + 557 + 6 + 0 + + + 45 + 404 + 556 + 6 + 0 + + + 45 + 404 + 555 + 6 + 0 + + + 45 + 404 + 554 + 6 + 0 + + + 45 + 404 + 553 + 6 + 0 + + + 45 + 404 + 552 + 6 + 0 + + + 45 + 402 + 557 + 2 + 0 + + + 45 + 402 + 556 + 2 + 0 + + + 45 + 402 + 555 + 2 + 0 + + + 45 + 402 + 554 + 2 + 0 + + + 45 + 402 + 553 + 2 + 0 + + + 45 + 402 + 552 + 2 + 0 + + + 37 + 401 + 559 + 0 + 0 + + + 36 + 400 + 557 + 0 + 0 + + + 23 + 407 + 563 + 6 + 0 + + + 23 + 407 + 560 + 6 + 0 + + + 3 + 403 + 567 + 0 + 0 + + + 1 + 400 + 564 + 6 + 0 + + + 1 + 400 + 560 + 6 + 0 + + + 0 + 406 + 569 + 6 + 0 + + + 1 + 404 + 570 + 6 + 0 + + + 19 + 412 + 562 + 6 + 0 + + + 37 + 411 + 567 + 0 + 0 + + + 23 + 409 + 563 + 6 + 0 + + + 23 + 409 + 560 + 6 + 0 + + + 45 + 415 + 569 + 0 + 0 + + + 243 + 414 + 571 + 0 + 0 + + + 45 + 414 + 569 + 0 + 0 + + + 45 + 413 + 569 + 0 + 0 + + + 37 + 413 + 568 + 0 + 0 + + + 34 + 409 + 570 + 6 + 0 + + + 118 + 419 + 559 + 6 + 0 + + + 34 + 418 + 558 + 6 + 0 + + + 45 + 422 + 567 + 2 + 0 + + + 34 + 417 + 564 + 6 + 0 + + + 0 + 416 + 562 + 2 + 0 + + + 241 + 423 + 571 + 0 + 0 + + + 45 + 422 + 568 + 2 + 0 + + + 242 + 421 + 571 + 0 + 0 + + + 45 + 421 + 569 + 0 + 0 + + + 45 + 420 + 569 + 0 + 0 + + + 242 + 419 + 571 + 0 + 0 + + + 45 + 419 + 569 + 0 + 0 + + + 45 + 418 + 569 + 0 + 0 + + + 45 + 417 + 569 + 0 + 0 + + + 45 + 416 + 569 + 0 + 0 + + + 3 + 430 + 559 + 0 + 0 + + + 7 + 430 + 558 + 4 + 0 + + + 191 + 430 + 556 + 0 + 0 + + + 191 + 430 + 554 + 0 + 0 + + + 191 + 428 + 557 + 0 + 0 + + + 191 + 428 + 555 + 0 + 0 + + + 191 + 426 + 556 + 0 + 0 + + + 191 + 426 + 554 + 0 + 0 + + + 302 + 429 + 566 + 0 + 0 + + + 5 + 429 + 561 + 4 + 0 + + + 26 + 428 + 563 + 4 + 0 + + + 11 + 426 + 560 + 0 + 0 + + + 0 + 429 + 568 + 2 + 0 + + + 21 + 424 + 570 + 2 + 0 + + + 21 + 424 + 569 + 0 + 0 + + + 1 + 436 + 554 + 0 + 0 + + + 0 + 435 + 556 + 0 + 0 + + + 285 + 433 + 558 + 0 + 0 + + + 285 + 433 + 556 + 0 + 0 + + + 285 + 433 + 554 + 0 + 0 + + + 15 + 436 + 561 + 4 + 0 + + + 251 + 433 + 565 + 4 + 0 + + + 285 + 433 + 560 + 0 + 0 + + + 0 + 438 + 569 + 0 + 0 + + + 0 + 434 + 570 + 0 + 0 + + + 1 + 406 + 562 + 1 + 1 + + + 1 + 402 + 567 + 0 + 1 + + + 1 + 414 + 560 + 1 + 1 + + + 1 + 410 + 566 + 0 + 1 + + + 1 + 426 + 559 + 1 + 1 + + + 1 + 434 + 563 + 1 + 1 + + + 0 + 400 + 546 + 0 + 0 + + + 37 + 414 + 547 + 0 + 0 + + + 7 + 412 + 549 + 2 + 0 + + + 7 + 411 + 550 + 0 + 0 + + + 3 + 411 + 549 + 0 + 0 + + + 3 + 408 + 547 + 4 + 0 + + + 192 + 422 + 551 + 0 + 0 + + + 1 + 421 + 545 + 2 + 0 + + + 192 + 420 + 551 + 0 + 0 + + + 1 + 417 + 544 + 0 + 0 + + + 244 + 426 + 548 + 0 + 0 + + + 206 + 425 + 547 + 0 + 0 + + + 36 + 424 + 551 + 0 + 0 + + + 1 + 434 + 544 + 0 + 0 + + + 1 + 408 + 549 + 1 + 1 + + + 1 + 414 + 538 + 0 + 0 + + + 1 + 412 + 543 + 0 + 0 + + + 37 + 412 + 541 + 0 + 0 + + + 34 + 411 + 537 + 0 + 0 + + + 1 + 410 + 541 + 0 + 0 + + + 34 + 423 + 538 + 0 + 0 + + + 34 + 422 + 543 + 2 + 0 + + + 34 + 422 + 536 + 2 + 0 + + + 1 + 420 + 539 + 0 + 0 + + + 0 + 417 + 538 + 2 + 0 + + + 1 + 430 + 543 + 2 + 0 + + + 111 + 429 + 536 + 2 + 0 + + + 111 + 428 + 536 + 2 + 0 + + + 103 + 426 + 536 + 3 + 0 + + + 1 + 436 + 541 + 0 + 0 + + + 1 + 435 + 538 + 0 + 0 + + + 3 + 430 + 1502 + 4 + 0 + + + 15 + 426 + 1502 + 4 + 0 + + + 6 + 429 + 1505 + 4 + 0 + + + 0 + 397 + 547 + 2 + 0 + + + 36 + 399 + 554 + 0 + 0 + + + 36 + 398 + 553 + 0 + 0 + + + 0 + 398 + 560 + 6 + 0 + + + 1 + 407 + 538 + 0 + 0 + + + 1 + 404 + 542 + 0 + 0 + + + 1 + 402 + 539 + 0 + 0 + + + 1 + 400 + 542 + 2 + 0 + + + 1 + 400 + 538 + 2 + 0 + + + 1 + 406 + 535 + 0 + 0 + + + 1 + 404 + 535 + 0 + 0 + + + 0 + 413 + 534 + 0 + 0 + + + 0 + 410 + 530 + 0 + 0 + + + 37 + 409 + 533 + 0 + 0 + + + 36 + 423 + 531 + 2 + 0 + + + 36 + 421 + 532 + 2 + 0 + + + 34 + 419 + 535 + 0 + 0 + + + 34 + 416 + 531 + 0 + 0 + + + 36 + 416 + 528 + 2 + 0 + + + 111 + 430 + 534 + 2 + 0 + + + 113 + 430 + 533 + 3 + 0 + + + 103 + 428 + 533 + 0 + 0 + + + 103 + 428 + 532 + 0 + 0 + + + 1 + 427 + 534 + 2 + 0 + + + 1 + 434 + 533 + 0 + 0 + + + 37 + 381 + 492 + 4 + 0 + + + 3 + 381 + 500 + 0 + 0 + + + 5 + 380 + 503 + 0 + 0 + + + 250 + 376 + 502 + 4 + 0 + + + 1 + 378 + 493 + 2 + 1 + + + 1 + 377 + 488 + 1 + 1 + + + 1 + 377 + 501 + 1 + 1 + + + 29 + 366 + 507 + 2 + 0 + + + 29 + 366 + 504 + 2 + 0 + + + 251 + 371 + 505 + 0 + 0 + + + 1 + 371 + 506 + 1 + 1 + + + 1 + 367 + 516 + 0 + 0 + + + 1 + 367 + 513 + 0 + 0 + + + 1 + 364 + 516 + 0 + 0 + + + 70 + 375 + 518 + 4 + 0 + + + 34 + 372 + 516 + 4 + 0 + + + 34 + 382 + 514 + 4 + 0 + + + 34 + 380 + 513 + 4 + 0 + + + 70 + 376 + 519 + 4 + 0 + + + 34 + 376 + 512 + 4 + 0 + + + 70 + 375 + 520 + 4 + 0 + + + 34 + 374 + 527 + 4 + 0 + + + 70 + 374 + 523 + 4 + 0 + + + 34 + 370 + 525 + 4 + 0 + + + 70 + 379 + 521 + 4 + 0 + + + 70 + 378 + 522 + 4 + 0 + + + 70 + 376 + 522 + 4 + 0 + + + 6 + 376 + 520 + 6 + 0 + + + 36 + 364 + 531 + 0 + 0 + + + 36 + 363 + 532 + 0 + 0 + + + 36 + 361 + 534 + 0 + 0 + + + 36 + 360 + 535 + 0 + 0 + + + 70 + 375 + 529 + 0 + 0 + + + 70 + 374 + 533 + 0 + 0 + + + 34 + 372 + 530 + 0 + 0 + + + 70 + 368 + 529 + 0 + 0 + + + 34 + 383 + 529 + 0 + 0 + + + 34 + 380 + 529 + 0 + 0 + + + 70 + 378 + 534 + 0 + 0 + + + 70 + 376 + 534 + 0 + 0 + + + 1 + 365 + 543 + 0 + 0 + + + 1 + 363 + 539 + 0 + 0 + + + 1 + 369 + 539 + 0 + 0 + + + 70 + 381 + 536 + 0 + 0 + + + 1 + 367 + 547 + 0 + 0 + + + 0 + 365 + 544 + 0 + 0 + + + 105 + 363 + 551 + 0 + 0 + + + 105 + 362 + 551 + 0 + 0 + + + 105 + 362 + 550 + 0 + 0 + + + 105 + 362 + 549 + 0 + 0 + + + 101 + 361 + 549 + 0 + 0 + + + 101 + 361 + 544 + 0 + 0 + + + 111 + 360 + 545 + 0 + 0 + + + 1 + 371 + 546 + 0 + 0 + + + 103 + 367 + 554 + 0 + 0 + + + 103 + 366 + 553 + 0 + 0 + + + 103 + 365 + 556 + 0 + 0 + + + 1 + 365 + 552 + 0 + 0 + + + 1 + 370 + 555 + 0 + 0 + + + 5 + 363 + 1514 + 0 + 0 + + + 6 + 360 + 1514 + 0 + 0 + + + 47 + 359 + 2458 + 0 + 0 + + + 6 + 363 + 2458 + 0 + 0 + + + 47 + 361 + 2461 + 2 + 0 + + + 47 + 361 + 2456 + 6 + 0 + + + 7 + 124 + 1457 + 3 + 0 + + + 187 + 126 + 1467 + 4 + 0 + + + 15 + 125 + 1469 + 0 + 0 + + + 15 + 125 + 1464 + 4 + 0 + + + 7 + 124 + 1470 + 0 + 0 + + + 7 + 123 + 1470 + 0 + 0 + + + 15 + 121 + 1469 + 0 + 0 + + + 3 + 120 + 1464 + 0 + 0 + + + 15 + 125 + 1477 + 0 + 0 + + + 15 + 125 + 1474 + 0 + 0 + + + 15 + 121 + 1477 + 0 + 0 + + + 6 + 121 + 1474 + 0 + 0 + + + 7 + 129 + 1459 + 0 + 0 + + + 3 + 129 + 1458 + 0 + 0 + + + 3 + 135 + 1467 + 0 + 0 + + + 15 + 133 + 1470 + 0 + 0 + + + 11 + 133 + 1467 + 0 + 0 + + + 6 + 141 + 1456 + 0 + 0 + + + 15 + 138 + 1459 + 1 + 0 + + + 6 + 136 + 1461 + 1 + 0 + + + 6 + 138 + 1466 + 0 + 0 + + + 15 + 137 + 1470 + 0 + 0 + + + 85 + 145 + 1477 + 0 + 0 + + + 42 + 145 + 1473 + 4 + 0 + + + 1 + 124 + 1467 + 1 + 1 + + + 2 + 123 + 1466 + 0 + 1 + + + 2 + 122 + 1468 + 0 + 1 + + + 2 + 121 + 1466 + 0 + 1 + + + 2 + 124 + 1475 + 1 + 1 + + + 1 + 122 + 1476 + 0 + 1 + + + 1 + 128 + 1461 + 0 + 1 + + + 1 + 148 + 1477 + 1 + 1 + + + 260 + 149 + 3332 + 2 + 0 + + + 5 + 147 + 3330 + 6 + 0 + + + 7 + 463 + 1381 + 2 + 0 + + + 47 + 463 + 1377 + 6 + 0 + + + 273 + 462 + 1380 + 6 + 0 + + + 47 + 460 + 1382 + 0 + 0 + + + 47 + 460 + 1380 + 0 + 0 + + + 25 + 463 + 1390 + 0 + 0 + + + 55 + 463 + 1386 + 0 + 0 + + + 278 + 461 + 1388 + 0 + 0 + + + 24 + 461 + 1384 + 0 + 0 + + + 257 + 460 + 1390 + 0 + 0 + + + 3 + 460 + 1388 + 0 + 0 + + + 3 + 460 + 1387 + 0 + 0 + + + 3 + 460 + 1385 + 0 + 0 + + + 6 + 460 + 1395 + 0 + 0 + + + 5 + 459 + 1393 + 0 + 0 + + + 47 + 468 + 1382 + 4 + 0 + + + 47 + 468 + 1380 + 4 + 0 + + + 47 + 467 + 1377 + 6 + 0 + + + 273 + 466 + 1380 + 6 + 0 + + + 7 + 465 + 1380 + 6 + 0 + + + 47 + 465 + 1377 + 6 + 0 + + + 63 + 464 + 1384 + 6 + 0 + + + 45 + 476 + 1381 + 0 + 0 + + + 44 + 474 + 1381 + 4 + 0 + + + 45 + 473 + 1381 + 0 + 0 + + + 45 + 472 + 1383 + 6 + 0 + + + 45 + 472 + 1382 + 6 + 0 + + + 45 + 472 + 1381 + 6 + 0 + + + 25 + 476 + 1388 + 4 + 0 + + + 25 + 476 + 1386 + 4 + 0 + + + 45 + 476 + 1384 + 4 + 0 + + + 45 + 475 + 1384 + 4 + 0 + + + 19 + 474 + 1390 + 4 + 0 + + + 45 + 474 + 1384 + 4 + 0 + + + 25 + 473 + 1388 + 4 + 0 + + + 25 + 473 + 1386 + 4 + 0 + + + 45 + 473 + 1384 + 4 + 0 + + + 45 + 472 + 1384 + 6 + 0 + + + 117 + 463 + 1384 + 1 + 1 + + + 1 + 464 + 1392 + 1 + 1 + + + 287 + 461 + 2335 + 0 + 0 + + + 6 + 459 + 2337 + 0 + 0 + + + 6 + 477 + 2337 + 0 + 0 + + + 153 + 559 + 436 + 0 + 0 + + + 0 + 558 + 438 + 0 + 0 + + + 153 + 558 + 436 + 0 + 0 + + + 153 + 557 + 436 + 0 + 0 + + + 153 + 556 + 436 + 0 + 0 + + + 0 + 555 + 437 + 0 + 0 + + + 153 + 555 + 436 + 0 + 0 + + + 153 + 554 + 436 + 0 + 0 + + + 153 + 553 + 436 + 0 + 0 + + + 153 + 552 + 436 + 0 + 0 + + + 1 + 558 + 442 + 0 + 0 + + + 0 + 556 + 445 + 0 + 0 + + + 0 + 556 + 444 + 0 + 0 + + + 205 + 556 + 442 + 0 + 0 + + + 1 + 555 + 446 + 0 + 0 + + + 205 + 555 + 442 + 0 + 0 + + + 1 + 559 + 450 + 0 + 0 + + + 22 + 557 + 453 + 0 + 0 + + + 6 + 554 + 451 + 0 + 0 + + + 0 + 553 + 454 + 0 + 0 + + + 1 + 559 + 461 + 0 + 0 + + + 205 + 557 + 456 + 0 + 0 + + + 0 + 556 + 463 + 0 + 0 + + + 205 + 556 + 460 + 0 + 0 + + + 0 + 555 + 457 + 0 + 0 + + + 1 + 554 + 456 + 0 + 0 + + + 1 + 553 + 462 + 0 + 0 + + + 0 + 552 + 462 + 0 + 0 + + + 2 + 554 + 449 + 0 + 1 + + + 310 + 567 + 438 + 0 + 0 + + + 153 + 567 + 436 + 0 + 0 + + + 153 + 566 + 436 + 0 + 0 + + + 153 + 565 + 436 + 0 + 0 + + + 153 + 564 + 436 + 0 + 0 + + + 153 + 563 + 436 + 0 + 0 + + + 153 + 562 + 436 + 0 + 0 + + + 153 + 561 + 436 + 0 + 0 + + + 153 + 560 + 436 + 0 + 0 + + + 310 + 567 + 440 + 0 + 0 + + + 1 + 565 + 447 + 0 + 0 + + + 1 + 565 + 443 + 0 + 0 + + + 310 + 565 + 441 + 0 + 0 + + + 0 + 564 + 447 + 0 + 0 + + + 310 + 564 + 441 + 0 + 0 + + + 1 + 562 + 447 + 0 + 0 + + + 1 + 562 + 444 + 0 + 0 + + + 0 + 560 + 445 + 0 + 0 + + + 219 + 567 + 452 + 6 + 0 + + + 355 + 567 + 451 + 6 + 0 + + + 355 + 567 + 450 + 6 + 0 + + + 355 + 567 + 449 + 6 + 0 + + + 1 + 566 + 455 + 0 + 0 + + + 1 + 566 + 451 + 0 + 0 + + + 0 + 564 + 455 + 0 + 0 + + + 0 + 563 + 449 + 0 + 0 + + + 1 + 561 + 452 + 0 + 0 + + + 153 + 575 + 436 + 0 + 0 + + + 153 + 574 + 436 + 0 + 0 + + + 0 + 573 + 437 + 0 + 0 + + + 153 + 573 + 436 + 0 + 0 + + + 153 + 572 + 436 + 0 + 0 + + + 153 + 571 + 436 + 0 + 0 + + + 0 + 570 + 438 + 0 + 0 + + + 153 + 570 + 436 + 0 + 0 + + + 153 + 569 + 436 + 0 + 0 + + + 153 + 568 + 436 + 0 + 0 + + + 205 + 568 + 435 + 0 + 0 + + + 310 + 573 + 445 + 0 + 0 + + + 1 + 573 + 440 + 0 + 0 + + + 1 + 569 + 443 + 0 + 0 + + + 205 + 568 + 446 + 0 + 0 + + + 1 + 571 + 453 + 0 + 0 + + + 0 + 571 + 452 + 0 + 0 + + + 1 + 570 + 448 + 0 + 0 + + + 355 + 569 + 452 + 4 + 0 + + + 0 + 569 + 450 + 0 + 0 + + + 355 + 568 + 454 + 2 + 0 + + + 355 + 568 + 453 + 2 + 0 + + + 220 + 568 + 452 + 4 + 0 + + + 151 + 583 + 439 + 0 + 0 + + + 153 + 582 + 439 + 0 + 0 + + + 0 + 582 + 437 + 0 + 0 + + + 153 + 581 + 439 + 0 + 0 + + + 1 + 580 + 435 + 0 + 0 + + + 151 + 579 + 438 + 4 + 0 + + + 283 + 578 + 438 + 0 + 0 + + + 151 + 578 + 436 + 0 + 0 + + + 153 + 577 + 436 + 4 + 0 + + + 153 + 576 + 436 + 4 + 0 + + + 0 + 583 + 447 + 0 + 0 + + + 1 + 582 + 446 + 0 + 0 + + + 1 + 578 + 445 + 0 + 0 + + + 1 + 578 + 444 + 0 + 0 + + + 283 + 576 + 443 + 0 + 0 + + + 283 + 578 + 452 + 0 + 0 + + + 1 + 578 + 448 + 0 + 0 + + + 283 + 577 + 455 + 0 + 0 + + + 0 + 577 + 451 + 0 + 0 + + + 283 + 588 + 444 + 0 + 0 + + + 153 + 584 + 447 + 2 + 0 + + + 153 + 584 + 446 + 2 + 0 + + + 153 + 584 + 445 + 2 + 0 + + + 153 + 584 + 444 + 2 + 0 + + + 153 + 584 + 443 + 2 + 0 + + + 153 + 584 + 442 + 2 + 0 + + + 153 + 584 + 441 + 2 + 0 + + + 153 + 591 + 450 + 0 + 0 + + + 153 + 590 + 450 + 0 + 0 + + + 153 + 589 + 450 + 0 + 0 + + + 149 + 588 + 450 + 0 + 0 + + + 149 + 587 + 450 + 0 + 0 + + + 149 + 586 + 450 + 0 + 0 + + + 151 + 584 + 449 + 4 + 0 + + + 153 + 584 + 448 + 2 + 0 + + + 45 + 599 + 451 + 4 + 0 + + + 383 + 599 + 450 + 0 + 0 + + + 45 + 599 + 449 + 0 + 0 + + + 45 + 598 + 451 + 4 + 0 + + + 153 + 598 + 450 + 0 + 0 + + + 45 + 598 + 449 + 0 + 0 + + + 45 + 597 + 451 + 4 + 0 + + + 153 + 597 + 450 + 0 + 0 + + + 45 + 597 + 449 + 0 + 0 + + + 45 + 596 + 451 + 4 + 0 + + + 153 + 596 + 450 + 0 + 0 + + + 45 + 596 + 449 + 0 + 0 + + + 45 + 595 + 451 + 4 + 0 + + + 153 + 595 + 450 + 0 + 0 + + + 45 + 595 + 449 + 0 + 0 + + + 45 + 594 + 451 + 4 + 0 + + + 153 + 594 + 450 + 0 + 0 + + + 45 + 594 + 449 + 0 + 0 + + + 45 + 593 + 451 + 4 + 0 + + + 149 + 593 + 450 + 0 + 0 + + + 45 + 593 + 449 + 0 + 0 + + + 45 + 592 + 451 + 6 + 0 + + + 153 + 592 + 450 + 0 + 0 + + + 45 + 592 + 449 + 6 + 0 + + + 0 + 567 + 463 + 0 + 0 + + + 205 + 567 + 457 + 0 + 0 + + + 1 + 566 + 462 + 0 + 0 + + + 205 + 565 + 461 + 0 + 0 + + + 0 + 562 + 461 + 0 + 0 + + + 1 + 561 + 462 + 0 + 0 + + + 0 + 561 + 458 + 0 + 0 + + + 0 + 570 + 463 + 0 + 0 + + + 0 + 569 + 461 + 0 + 0 + + + 1 + 569 + 457 + 0 + 0 + + + 1 + 568 + 461 + 0 + 0 + + + 7 + 583 + 463 + 6 + 0 + + + 5 + 583 + 459 + 2 + 0 + + + 283 + 583 + 457 + 0 + 0 + + + 308 + 578 + 460 + 0 + 0 + + + 308 + 577 + 462 + 0 + 0 + + + 55 + 587 + 460 + 2 + 0 + + + 55 + 587 + 459 + 2 + 0 + + + 7 + 585 + 463 + 2 + 0 + + + 3 + 584 + 463 + 2 + 0 + + + 286 + 599 + 457 + 0 + 0 + + + 407 + 598 + 461 + 4 + 0 + + + 681 + 597 + 458 + 2 + 0 + + + 681 + 596 + 458 + 2 + 0 + + + 530 + 595 + 458 + 2 + 0 + + + 680 + 594 + 458 + 2 + 0 + + + 680 + 593 + 458 + 2 + 0 + + + 1 + 588 + 462 + 1 + 1 + + + 1 + 585 + 459 + 0 + 1 + + + 308 + 574 + 469 + 0 + 0 + + + 205 + 572 + 466 + 0 + 0 + + + 308 + 571 + 468 + 0 + 0 + + + 205 + 571 + 465 + 0 + 0 + + + 1 + 569 + 464 + 0 + 0 + + + 0 + 568 + 471 + 0 + 0 + + + 308 + 579 + 468 + 0 + 0 + + + 283 + 578 + 466 + 0 + 0 + + + 308 + 577 + 468 + 0 + 0 + + + 308 + 577 + 464 + 0 + 0 + + + 283 + 590 + 470 + 0 + 0 + + + 1 + 589 + 471 + 0 + 0 + + + 0 + 589 + 470 + 0 + 0 + + + 1 + 588 + 471 + 0 + 0 + + + 283 + 588 + 470 + 0 + 0 + + + 0 + 572 + 475 + 0 + 0 + + + 283 + 587 + 472 + 0 + 0 + + + 283 + 586 + 473 + 0 + 0 + + + 0 + 585 + 474 + 0 + 0 + + + 6 + 583 + 1403 + 0 + 0 + + + 0 + 566 + 474 + 0 + 0 + + + 356 + 560 + 472 + 2 + 0 + + + 15 + 560 + 483 + 4 + 0 + + + 82 + 567 + 484 + 1 + 1 + + + 1 + 560 + 487 + 0 + 1 + + + 358 + 564 + 492 + 4 + 0 + + + 4 + 562 + 490 + 0 + 0 + + + 4 + 561 + 489 + 0 + 0 + + + 351 + 571 + 495 + 4 + 0 + + + 350 + 571 + 488 + 4 + 0 + + + 352 + 570 + 489 + 4 + 0 + + + 350 + 570 + 488 + 4 + 0 + + + 350 + 569 + 488 + 4 + 0 + + + 306 + 568 + 495 + 4 + 0 + + + 205 + 559 + 468 + 0 + 0 + + + 0 + 558 + 468 + 0 + 0 + + + 0 + 558 + 465 + 0 + 0 + + + 0 + 557 + 465 + 0 + 0 + + + 0 + 556 + 470 + 0 + 0 + + + 0 + 553 + 466 + 0 + 0 + + + 1 + 552 + 468 + 0 + 0 + + + 0 + 553 + 475 + 0 + 0 + + + 3 + 558 + 483 + 0 + 0 + + + 4 + 555 + 485 + 0 + 0 + + + 51 + 270 + 3327 + 0 + 0 + + + 51 + 270 + 3332 + 4 + 0 + + + 29 + 269 + 3328 + 2 + 0 + + + 51 + 267 + 3328 + 2 + 0 + + + 153 + 271 + 3337 + 0 + 0 + + + 153 + 270 + 3337 + 0 + 0 + + + 153 + 269 + 3337 + 0 + 0 + + + 153 + 268 + 3337 + 0 + 0 + + + 51 + 268 + 3336 + 0 + 0 + + + 153 + 266 + 3343 + 2 + 0 + + + 153 + 266 + 3342 + 2 + 0 + + + 153 + 266 + 3341 + 2 + 0 + + + 153 + 266 + 3340 + 2 + 0 + + + 153 + 266 + 3339 + 2 + 0 + + + 151 + 266 + 3337 + 2 + 0 + + + 5 + 279 + 3326 + 0 + 0 + + + 153 + 278 + 3335 + 2 + 0 + + + 151 + 278 + 3333 + 2 + 0 + + + 51 + 276 + 3331 + 2 + 0 + + + 101 + 277 + 3343 + 0 + 0 + + + 151 + 277 + 3336 + 6 + 0 + + + 100 + 276 + 3341 + 2 + 0 + + + 153 + 276 + 3337 + 0 + 0 + + + 153 + 275 + 3337 + 0 + 0 + + + 104 + 274 + 3342 + 2 + 0 + + + 103 + 274 + 3340 + 0 + 0 + + + 153 + 274 + 3337 + 0 + 0 + + + 153 + 273 + 3337 + 0 + 0 + + + 153 + 272 + 3337 + 0 + 0 + + + 51 + 272 + 3336 + 0 + 0 + + + 153 + 281 + 3327 + 6 + 0 + + + 150 + 281 + 3326 + 6 + 0 + + + 51 + 280 + 3325 + 0 + 0 + + + 51 + 283 + 3335 + 6 + 0 + + + 51 + 283 + 3330 + 6 + 0 + + + 153 + 281 + 3335 + 2 + 0 + + + 153 + 281 + 3334 + 2 + 0 + + + 153 + 281 + 3331 + 6 + 0 + + + 149 + 281 + 3330 + 6 + 0 + + + 149 + 281 + 3329 + 6 + 0 + + + 153 + 281 + 3328 + 6 + 0 + + + 152 + 280 + 3332 + 6 + 0 + + + 153 + 281 + 3343 + 2 + 0 + + + 153 + 281 + 3342 + 2 + 0 + + + 153 + 281 + 3341 + 2 + 0 + + + 153 + 281 + 3340 + 2 + 0 + + + 153 + 281 + 3339 + 2 + 0 + + + 153 + 281 + 3338 + 2 + 0 + + + 153 + 281 + 3337 + 2 + 0 + + + 153 + 281 + 3336 + 2 + 0 + + + 51 + 293 + 3327 + 0 + 0 + + + 51 + 290 + 3327 + 0 + 0 + + + 3 + 294 + 3328 + 6 + 0 + + + 29 + 291 + 3329 + 0 + 0 + + + 51 + 289 + 3330 + 2 + 0 + + + 29 + 293 + 3339 + 6 + 0 + + + 51 + 293 + 3337 + 0 + 0 + + + 51 + 290 + 3337 + 0 + 0 + + + 11 + 222 + 1385 + 0 + 0 + + + 6 + 226 + 1383 + 0 + 0 + + + 15 + 226 + 1386 + 2 + 0 + + + 51 + 207 + 3282 + 0 + 0 + + + 51 + 204 + 3285 + 2 + 0 + + + 51 + 206 + 3294 + 6 + 0 + + + 51 + 204 + 3293 + 0 + 0 + + + 51 + 204 + 3291 + 2 + 0 + + + 51 + 206 + 3296 + 6 + 0 + + + 51 + 202 + 3300 + 4 + 0 + + + 51 + 200 + 3303 + 0 + 0 + + + 51 + 200 + 3308 + 4 + 0 + + + 51 + 204 + 3316 + 4 + 0 + + + 51 + 204 + 3313 + 0 + 0 + + + 5 + 203 + 3314 + 4 + 0 + + + 55 + 211 + 3286 + 6 + 0 + + + 51 + 211 + 3285 + 6 + 0 + + + 51 + 215 + 3289 + 0 + 0 + + + 51 + 208 + 3292 + 4 + 0 + + + 5 + 215 + 3300 + 0 + 0 + + + 51 + 214 + 3298 + 2 + 0 + + + 51 + 214 + 3296 + 2 + 0 + + + 51 + 210 + 3301 + 6 + 0 + + + 51 + 208 + 3298 + 0 + 0 + + + 51 + 210 + 3307 + 6 + 0 + + + 51 + 210 + 3304 + 6 + 0 + + + 51 + 210 + 3315 + 6 + 0 + + + 51 + 210 + 3312 + 6 + 0 + + + 58 + 208 + 3317 + 2 + 0 + + + 51 + 221 + 3283 + 4 + 0 + + + 51 + 218 + 3286 + 6 + 0 + + + 51 + 216 + 3286 + 2 + 0 + + + 51 + 216 + 3280 + 2 + 0 + + + 51 + 219 + 3291 + 6 + 0 + + + 51 + 216 + 3298 + 6 + 0 + + + 51 + 216 + 3296 + 6 + 0 + + + 22 + 219 + 3282 + 1 + 1 + + + 51 + 207 + 3274 + 4 + 0 + + + 51 + 207 + 3272 + 0 + 0 + + + 51 + 204 + 3274 + 4 + 0 + + + 51 + 204 + 3272 + 0 + 0 + + + 51 + 214 + 3276 + 4 + 0 + + + 58 + 211 + 3272 + 0 + 0 + + + 51 + 221 + 3279 + 0 + 0 + + + 20 + 219 + 3276 + 0 + 0 + + + 20 + 219 + 3273 + 0 + 0 + + + 51 + 218 + 3274 + 6 + 0 + + + 20 + 213 + 3270 + 0 + 0 + + + 51 + 218 + 3271 + 6 + 0 + + + 20 + 216 + 3270 + 0 + 0 + + + 51 + 201 + 3256 + 6 + 0 + + + 209 + 200 + 3258 + 5 + 0 + + + 143 + 212 + 3257 + 4 + 0 + + + 143 + 209 + 3257 + 4 + 0 + + + 209 + 198 + 3258 + 6 + 0 + + + 51 + 196 + 3262 + 2 + 0 + + + 209 + 196 + 3256 + 1 + 0 + + + 305 + 196 + 3266 + 6 + 0 + + + 51 + 198 + 3277 + 4 + 0 + + + 51 + 195 + 3277 + 4 + 0 + + + 51 + 194 + 3272 + 2 + 0 + + + 110 + 194 + 3295 + 4 + 0 + + + 104 + 194 + 3294 + 4 + 0 + + + 195 + 192 + 3294 + 4 + 0 + + + 51 + 190 + 3274 + 0 + 0 + + + 51 + 189 + 3277 + 6 + 0 + + + 51 + 186 + 3274 + 0 + 0 + + + 51 + 184 + 3282 + 4 + 0 + + + 106 + 191 + 3294 + 4 + 0 + + + 51 + 189 + 3291 + 6 + 0 + + + 51 + 189 + 3288 + 6 + 0 + + + 51 + 187 + 3294 + 0 + 0 + + + 51 + 187 + 3288 + 2 + 0 + + + 51 + 186 + 3291 + 0 + 0 + + + 51 + 185 + 3293 + 4 + 0 + + + 51 + 182 + 3274 + 0 + 0 + + + 51 + 181 + 3280 + 0 + 0 + + + 51 + 178 + 3287 + 2 + 0 + + + 51 + 178 + 3281 + 2 + 0 + + + 51 + 181 + 3293 + 4 + 0 + + + 51 + 178 + 3290 + 2 + 0 + + + 51 + 195 + 3254 + 2 + 0 + + + 55 + 195 + 3252 + 6 + 0 + + + 51 + 195 + 3251 + 2 + 0 + + + 80 + 206 + 3248 + 4 + 0 + + + 80 + 203 + 3248 + 4 + 0 + + + 209 + 202 + 3253 + 4 + 0 + + + 209 + 201 + 3255 + 4 + 0 + + + 55 + 200 + 3250 + 7 + 0 + + + 143 + 210 + 3250 + 0 + 0 + + + 51 + 198 + 3247 + 6 + 0 + + + 51 + 198 + 3244 + 6 + 0 + + + 684 + 207 + 3224 + 0 + 0 + + + 51 + 206 + 3227 + 2 + 0 + + + 209 + 206 + 3226 + 6 + 0 + + + 598 + 206 + 3224 + 0 + 0 + + + 598 + 205 + 3224 + 0 + 0 + + + 51 + 215 + 3230 + 0 + 0 + + + 57 + 210 + 3231 + 4 + 0 + + + 51 + 208 + 3227 + 6 + 0 + + + 209 + 208 + 3226 + 6 + 0 + + + 598 + 208 + 3224 + 0 + 0 + + + 51 + 222 + 3232 + 0 + 0 + + + 143 + 219 + 3246 + 6 + 0 + + + 57 + 217 + 3241 + 6 + 0 + + + 143 + 219 + 3249 + 6 + 0 + + + 143 + 216 + 3254 + 6 + 0 + + + 598 + 207 + 3222 + 0 + 0 + + + 685 + 206 + 3222 + 0 + 0 + + + 598 + 205 + 3222 + 0 + 0 + + + 55 + 205 + 3220 + 0 + 0 + + + 51 + 204 + 3218 + 2 + 0 + + + 51 + 210 + 3218 + 6 + 0 + + + 55 + 209 + 3217 + 0 + 0 + + + 598 + 208 + 3222 + 0 + 0 + + + 51 + 203 + 3211 + 2 + 0 + + + 51 + 203 + 3208 + 2 + 0 + + + 51 + 210 + 3211 + 6 + 0 + + + 5 + 231 + 3224 + 4 + 0 + + + 51 + 229 + 3229 + 0 + 0 + + + 51 + 229 + 3236 + 4 + 0 + + + 51 + 227 + 3247 + 2 + 0 + + + 51 + 227 + 3244 + 2 + 0 + + + 51 + 234 + 3233 + 6 + 0 + + + 51 + 232 + 3236 + 4 + 0 + + + 51 + 233 + 3247 + 6 + 0 + + + 51 + 233 + 3242 + 6 + 0 + + + 304 + 230 + 3248 + 6 + 0 + + + 51 + 182 + 3302 + 4 + 0 + + + 51 + 182 + 3300 + 0 + 0 + + + 51 + 180 + 3302 + 4 + 0 + + + 51 + 180 + 3300 + 0 + 0 + + + 98 + 191 + 3302 + 0 + 0 + + + 108 + 190 + 3298 + 4 + 0 + + + 51 + 189 + 3302 + 4 + 0 + + + 102 + 189 + 3297 + 4 + 0 + + + 104 + 187 + 3302 + 4 + 0 + + + 58 + 186 + 3300 + 0 + 0 + + + 102 + 186 + 3297 + 4 + 0 + + + 100 + 186 + 3296 + 4 + 0 + + + 51 + 198 + 3299 + 4 + 0 + + + 51 + 198 + 3297 + 0 + 0 + + + 110 + 194 + 3301 + 0 + 0 + + + 51 + 194 + 3300 + 6 + 0 + + + 51 + 194 + 3296 + 6 + 0 + + + 110 + 193 + 3302 + 4 + 0 + + + 110 + 192 + 3302 + 4 + 0 + + + 195 + 192 + 3298 + 0 + 0 + + + 51 + 196 + 3305 + 2 + 0 + + + 51 + 164 + 3287 + 0 + 0 + + + 51 + 166 + 3290 + 6 + 0 + + + 51 + 161 + 3290 + 2 + 0 + + + 51 + 164 + 3303 + 6 + 0 + + + 51 + 161 + 3296 + 6 + 0 + + + 51 + 160 + 3303 + 2 + 0 + + + 51 + 161 + 3306 + 4 + 0 + + + 51 + 205 + 3325 + 2 + 0 + + + 51 + 205 + 3322 + 2 + 0 + + + 51 + 202 + 3327 + 0 + 0 + + + 51 + 212 + 3322 + 6 + 0 + + + 51 + 211 + 3326 + 6 + 0 + + + 51 + 199 + 3332 + 2 + 0 + + + 51 + 199 + 3329 + 2 + 0 + + + 51 + 203 + 3335 + 4 + 0 + + + 51 + 212 + 3329 + 6 + 0 + + + 51 + 208 + 3333 + 4 + 0 + + + 3 + 257 + 1571 + 2 + 0 + + + 3 + 257 + 1568 + 2 + 0 + + + 15 + 256 + 1572 + 2 + 0 + + + 6 + 277 + 1569 + 0 + 0 + + + 47 + 279 + 1586 + 2 + 0 + + + 47 + 280 + 1575 + 4 + 0 + + + 6 + 280 + 1578 + 0 + 0 + + + 6 + 282 + 1586 + 0 + 0 + + + 51 + 598 + 3462 + 4 + 0 + + + 51 + 598 + 3459 + 0 + 0 + + + 51 + 598 + 3456 + 0 + 0 + + + 51 + 596 + 3461 + 2 + 0 + + + 51 + 596 + 3460 + 2 + 0 + + + 51 + 593 + 3462 + 4 + 0 + + + 51 + 593 + 3461 + 6 + 0 + + + 51 + 593 + 3460 + 6 + 0 + + + 51 + 593 + 3456 + 0 + 0 + + + 51 + 593 + 3470 + 4 + 0 + + + 51 + 592 + 3465 + 6 + 0 + + + 20 + 607 + 3458 + 0 + 0 + + + 17 + 607 + 3457 + 4 + 0 + + + 20 + 606 + 3463 + 0 + 0 + + + 51 + 606 + 3462 + 0 + 0 + + + 51 + 606 + 3457 + 0 + 0 + + + 51 + 603 + 3456 + 0 + 0 + + + 51 + 606 + 3467 + 4 + 0 + + + 20 + 606 + 3466 + 0 + 0 + + + 51 + 603 + 3467 + 4 + 0 + + + 17 + 603 + 3466 + 2 + 0 + + + 51 + 603 + 3464 + 0 + 0 + + + 51 + 601 + 3467 + 4 + 0 + + + 51 + 615 + 3454 + 4 + 0 + + + 7 + 614 + 3452 + 3 + 0 + + + 3 + 613 + 3452 + 4 + 0 + + + 3 + 613 + 3451 + 4 + 0 + + + 5 + 613 + 3450 + 0 + 0 + + + 7 + 612 + 3452 + 6 + 0 + + + 439 + 611 + 3451 + 0 + 0 + + + 51 + 615 + 3456 + 0 + 0 + + + 51 + 612 + 3456 + 0 + 0 + + + 97 + 609 + 3463 + 4 + 0 + + + 51 + 608 + 3462 + 0 + 0 + + + 51 + 608 + 3460 + 4 + 0 + + + 51 + 608 + 3457 + 0 + 0 + + + 51 + 608 + 3456 + 0 + 0 + + + 97 + 609 + 3467 + 4 + 0 + + + 51 + 608 + 3467 + 4 + 0 + + + 97 + 608 + 3466 + 4 + 0 + + + 97 + 608 + 3465 + 4 + 0 + + + 97 + 608 + 3464 + 4 + 0 + + + 433 + 622 + 3436 + 0 + 0 + + + 435 + 618 + 3453 + 0 + 0 + + + 146 + 618 + 3451 + 4 + 0 + + + 51 + 618 + 3450 + 6 + 0 + + + 51 + 617 + 3454 + 4 + 0 + + + 20 + 616 + 3451 + 0 + 0 + + + 48 + 616 + 3448 + 6 + 0 + + + 5 + 621 + 3458 + 0 + 0 + + + 51 + 621 + 3456 + 0 + 0 + + + 51 + 617 + 3456 + 0 + 0 + + + 433 + 622 + 3464 + 0 + 0 + + + 80 + 621 + 3466 + 0 + 0 + + + 1 + 597 + 3463 + 0 + 1 + + + 1 + 607 + 3462 + 0 + 1 + + + 1 + 601 + 3460 + 1 + 1 + + + 1 + 607 + 3468 + 0 + 1 + + + 1 + 602 + 3468 + 0 + 1 + + + 5 + 583 + 3462 + 0 + 0 + + + 5 + 583 + 3461 + 0 + 0 + + + 51 + 582 + 3462 + 6 + 0 + + + 5 + 582 + 3456 + 0 + 0 + + + 5 + 581 + 3461 + 0 + 0 + + + 5 + 581 + 3456 + 0 + 0 + + + 279 + 580 + 3456 + 4 + 0 + + + 5 + 579 + 3461 + 0 + 0 + + + 5 + 579 + 3456 + 0 + 0 + + + 5 + 578 + 3458 + 0 + 0 + + + 5 + 577 + 3457 + 0 + 0 + + + 363 + 582 + 3470 + 4 + 0 + + + 51 + 582 + 3465 + 6 + 0 + + + 365 + 581 + 3471 + 2 + 0 + + + 364 + 581 + 3469 + 6 + 0 + + + 51 + 581 + 3468 + 0 + 0 + + + 362 + 580 + 3470 + 0 + 0 + + + 51 + 580 + 3464 + 0 + 0 + + + 51 + 579 + 3468 + 0 + 0 + + + 5 + 578 + 3469 + 2 + 0 + + + 7 + 578 + 3468 + 6 + 0 + + + 51 + 578 + 3464 + 0 + 0 + + + 51 + 577 + 3471 + 6 + 0 + + + 51 + 577 + 3467 + 6 + 0 + + + 51 + 576 + 3469 + 2 + 0 + + + 51 + 576 + 3465 + 2 + 0 + + + 51 + 581 + 3479 + 4 + 0 + + + 5 + 580 + 3473 + 4 + 0 + + + 51 + 579 + 3476 + 2 + 0 + + + 51 + 579 + 3473 + 2 + 0 + + + 51 + 578 + 3479 + 4 + 0 + + + 51 + 577 + 3475 + 6 + 0 + + + 51 + 576 + 3477 + 2 + 0 + + + 51 + 576 + 3473 + 2 + 0 + + + 51 + 591 + 3459 + 0 + 0 + + + 51 + 589 + 3462 + 2 + 0 + + + 51 + 588 + 3457 + 0 + 0 + + + 51 + 587 + 3462 + 0 + 0 + + + 23 + 585 + 3462 + 4 + 0 + + + 51 + 585 + 3457 + 0 + 0 + + + 51 + 584 + 3462 + 0 + 0 + + + 20 + 591 + 3468 + 2 + 0 + + + 51 + 589 + 3465 + 2 + 0 + + + 51 + 587 + 3465 + 4 + 0 + + + 80 + 586 + 3471 + 4 + 0 + + + 51 + 584 + 3465 + 4 + 0 + + + 375 + 591 + 3474 + 0 + 0 + + + 51 + 590 + 3479 + 4 + 0 + + + 374 + 590 + 3478 + 4 + 0 + + + 372 + 590 + 3475 + 0 + 0 + + + 51 + 587 + 3479 + 4 + 0 + + + 51 + 584 + 3479 + 4 + 0 + + + 20 + 584 + 3477 + 4 + 0 + + + 51 + 597 + 3477 + 6 + 0 + + + 51 + 597 + 3475 + 6 + 0 + + + 51 + 596 + 3479 + 4 + 0 + + + 373 + 594 + 3478 + 4 + 0 + + + 372 + 594 + 3475 + 0 + 0 + + + 51 + 593 + 3479 + 4 + 0 + + + 1 + 579 + 3462 + 1 + 1 + + + 1 + 578 + 3459 + 1 + 1 + + + 1 + 583 + 3468 + 1 + 1 + + + 111 + 583 + 3476 + 1 + 1 + + + 1 + 591 + 3462 + 1 + 1 + + + 1 + 588 + 3463 + 1 + 1 + + + 1 + 584 + 3463 + 1 + 1 + + + 22 + 584 + 3457 + 1 + 1 + + + 1 + 588 + 3464 + 1 + 1 + + + 1 + 584 + 3464 + 1 + 1 + + + 45 + 560 + 1591 + 2 + 0 + + + 45 + 560 + 1590 + 2 + 0 + + + 51 + 561 + 1593 + 6 + 0 + + + 363 + 582 + 1582 + 4 + 0 + + + 51 + 582 + 1580 + 6 + 0 + + + 365 + 581 + 1583 + 2 + 0 + + + 364 + 581 + 1581 + 6 + 0 + + + 362 + 580 + 1582 + 0 + 0 + + + 5 + 578 + 1581 + 2 + 0 + + + 6 + 578 + 1580 + 2 + 0 + + + 51 + 582 + 2527 + 6 + 0 + + + 363 + 582 + 2526 + 4 + 0 + + + 51 + 582 + 2524 + 6 + 0 + + + 365 + 581 + 2527 + 2 + 0 + + + 364 + 581 + 2525 + 6 + 0 + + + 362 + 580 + 2526 + 0 + 0 + + + 6 + 578 + 2525 + 2 + 0 + + + 278 + 578 + 2524 + 4 + 0 + + + 0 + 567 + 646 + 0 + 0 + + + 307 + 563 + 646 + 0 + 0 + + + 306 + 567 + 652 + 0 + 0 + + + 0 + 564 + 654 + 0 + 0 + + + 0 + 564 + 650 + 0 + 0 + + + 1 + 572 + 641 + 0 + 0 + + + 0 + 571 + 647 + 0 + 0 + + + 1 + 571 + 654 + 0 + 0 + + + 406 + 571 + 651 + 0 + 0 + + + 9 + 562 + 649 + 1 + 1 + + + 51 + 582 + 3482 + 2 + 0 + + + 51 + 581 + 3484 + 4 + 0 + + + 51 + 578 + 3484 + 4 + 0 + + + 20 + 576 + 3484 + 4 + 0 + + + 51 + 590 + 3484 + 4 + 0 + + + 80 + 590 + 3481 + 4 + 0 + + + 51 + 588 + 3483 + 2 + 0 + + + 51 + 592 + 3482 + 6 + 0 + + + 1 + 577 + 3483 + 0 + 1 + + + 1 + 588 + 3482 + 1 + 1 + + + 1 + 585 + 3482 + 1 + 1 + + + 20 + 605 + 3477 + 2 + 0 + + + 51 + 603 + 3474 + 0 + 0 + + + 51 + 602 + 3474 + 0 + 0 + + + 51 + 601 + 3476 + 4 + 0 + + + 51 + 607 + 3485 + 4 + 0 + + + 51 + 607 + 3480 + 0 + 0 + + + 80 + 606 + 3480 + 4 + 0 + + + 51 + 604 + 3480 + 0 + 0 + + + 20 + 603 + 3481 + 2 + 0 + + + 1 + 603 + 3480 + 0 + 1 + + + 17 + 615 + 3482 + 4 + 0 + + + 51 + 614 + 3485 + 4 + 0 + + + 80 + 614 + 3482 + 4 + 0 + + + 51 + 613 + 3482 + 0 + 0 + + + 51 + 610 + 3485 + 4 + 0 + + + 51 + 610 + 3482 + 0 + 0 + + + 55 + 608 + 3485 + 3 + 0 + + + 51 + 614 + 3494 + 0 + 0 + + + 80 + 613 + 3494 + 4 + 0 + + + 432 + 621 + 3477 + 0 + 0 + + + 80 + 620 + 3473 + 4 + 0 + + + 80 + 619 + 3473 + 4 + 0 + + + 5 + 616 + 3479 + 7 + 0 + + + 80 + 622 + 3480 + 0 + 0 + + + 80 + 617 + 3482 + 4 + 0 + + + 51 + 616 + 3485 + 4 + 0 + + + 17 + 616 + 3482 + 4 + 0 + + + 20 + 621 + 3495 + 4 + 0 + + + 51 + 620 + 3494 + 0 + 0 + + + 51 + 618 + 3490 + 4 + 0 + + + 51 + 618 + 3488 + 0 + 0 + + + 5 + 617 + 3489 + 4 + 0 + + + 51 + 616 + 3490 + 4 + 0 + + + 51 + 616 + 3488 + 0 + 0 + + + 1 + 617 + 3494 + 0 + 1 + + + 1 + 617 + 3491 + 0 + 1 + + + 1 + 617 + 3488 + 0 + 1 + + + 51 + 614 + 3498 + 4 + 0 + + + 20 + 613 + 3497 + 4 + 0 + + + 51 + 621 + 3500 + 4 + 0 + + + 20 + 621 + 3499 + 4 + 0 + + + 97 + 620 + 3497 + 4 + 0 + + + 51 + 618 + 3500 + 4 + 0 + + + 20 + 618 + 3497 + 4 + 0 + + + 22 + 617 + 3500 + 4 + 0 + + + 22 + 617 + 3499 + 4 + 0 + + + 51 + 616 + 3498 + 4 + 0 + + + 23 + 583 + 1606 + 4 + 0 + + + 25 + 582 + 1607 + 0 + 0 + + + 7 + 583 + 1611 + 6 + 0 + + + 5 + 583 + 1608 + 0 + 0 + + + 51 + 581 + 1609 + 2 + 0 + + + 51 + 581 + 1608 + 2 + 0 + + + 51 + 591 + 1608 + 0 + 0 + + + 51 + 587 + 1608 + 0 + 0 + + + 51 + 586 + 1608 + 6 + 0 + + + 3 + 584 + 1610 + 0 + 0 + + + 25 + 596 + 1607 + 0 + 0 + + + 51 + 597 + 1609 + 6 + 0 + + + 51 + 597 + 1608 + 6 + 0 + + + 17 + 595 + 1611 + 0 + 0 + + + 5 + 595 + 1608 + 0 + 0 + + + 17 + 594 + 1611 + 0 + 0 + + + 6 + 593 + 1608 + 0 + 0 + + + 51 + 592 + 1608 + 2 + 0 + + + 382 + 600 + 1623 + 0 + 0 + + + 17 + 602 + 1625 + 2 + 0 + + + 6 + 601 + 1626 + 0 + 0 + + + 17 + 613 + 1623 + 0 + 0 + + + 6 + 613 + 1620 + 0 + 0 + + + 71 + 610 + 1621 + 0 + 0 + + + 1 + 587 + 1609 + 1 + 1 + + + 1 + 592 + 1609 + 1 + 1 + + + 6 + 583 + 2552 + 0 + 0 + + + 51 + 582 + 2553 + 2 + 0 + + + 51 + 585 + 2553 + 6 + 0 + + + 51 + 596 + 2553 + 6 + 0 + + + 6 + 595 + 2552 + 0 + 0 + + + 51 + 593 + 2553 + 2 + 0 + + + 1 + 582 + 655 + 2 + 0 + + + 1 + 582 + 651 + 2 + 0 + + + 1 + 582 + 648 + 2 + 0 + + + 1 + 580 + 653 + 2 + 0 + + + 1 + 580 + 649 + 2 + 0 + + + 1 + 578 + 655 + 2 + 0 + + + 23 + 583 + 661 + 4 + 0 + + + 21 + 582 + 663 + 4 + 0 + + + 25 + 582 + 661 + 4 + 0 + + + 1 + 576 + 657 + 2 + 0 + + + 98 + 590 + 655 + 4 + 0 + + + 98 + 590 + 654 + 4 + 0 + + + 98 + 590 + 651 + 3 + 0 + + + 98 + 588 + 655 + 5 + 0 + + + 98 + 588 + 654 + 4 + 0 + + + 98 + 588 + 652 + 3 + 0 + + + 1 + 586 + 648 + 2 + 0 + + + 1 + 585 + 651 + 2 + 0 + + + 98 + 591 + 658 + 5 + 0 + + + 51 + 590 + 659 + 6 + 0 + + + 98 + 590 + 657 + 6 + 0 + + + 98 + 590 + 656 + 3 + 0 + + + 51 + 588 + 659 + 2 + 0 + + + 98 + 588 + 657 + 5 + 0 + + + 98 + 588 + 656 + 4 + 0 + + + 98 + 587 + 658 + 3 + 0 + + + 25 + 585 + 661 + 4 + 0 + + + 9 + 589 + 663 + 0 + 1 + + + 9 + 589 + 658 + 0 + 1 + + + 51 + 584 + 3558 + 6 + 0 + + + 213 + 584 + 3553 + 4 + 0 + + + 51 + 584 + 3564 + 6 + 0 + + + 51 + 584 + 3561 + 6 + 0 + + + 51 + 585 + 3573 + 6 + 0 + + + 51 + 585 + 3570 + 6 + 0 + + + 51 + 599 + 3537 + 4 + 0 + + + 205 + 598 + 3536 + 2 + 0 + + + 143 + 599 + 3567 + 2 + 0 + + + 51 + 599 + 3565 + 2 + 0 + + + 143 + 593 + 3574 + 2 + 0 + + + 34 + 602 + 3536 + 2 + 0 + + + 55 + 606 + 3555 + 0 + 0 + + + 55 + 606 + 3554 + 0 + 0 + + + 51 + 605 + 3552 + 0 + 0 + + + 43 + 603 + 3554 + 0 + 0 + + + 51 + 602 + 3552 + 0 + 0 + + + 614 + 601 + 3559 + 2 + 0 + + + 614 + 601 + 3558 + 2 + 0 + + + 55 + 601 + 3554 + 0 + 0 + + + 51 + 602 + 3565 + 6 + 0 + + + 615 + 601 + 3562 + 2 + 0 + + + 615 + 601 + 3561 + 2 + 0 + + + 614 + 601 + 3560 + 2 + 0 + + + 657 + 607 + 3568 + 6 + 0 + + + 656 + 606 + 3568 + 2 + 0 + + + 143 + 604 + 3575 + 4 + 0 + + + 143 + 604 + 3572 + 0 + 0 + + + 143 + 615 + 3564 + 0 + 0 + + + 3 + 614 + 3564 + 2 + 0 + + + 143 + 610 + 3565 + 0 + 0 + + + 143 + 610 + 3570 + 4 + 0 + + + 625 + 609 + 3573 + 2 + 0 + + + 645 + 617 + 3567 + 2 + 0 + + + 143 + 617 + 3568 + 7 + 0 + + + 143 + 616 + 3570 + 4 + 0 + + + 25 + 584 + 3582 + 0 + 0 + + + 598 + 599 + 3582 + 4 + 0 + + + 627 + 598 + 3582 + 4 + 0 + + + 598 + 597 + 3582 + 4 + 0 + + + 598 + 596 + 3582 + 4 + 0 + + + 598 + 595 + 3582 + 4 + 0 + + + 143 + 593 + 3576 + 2 + 0 + + + 51 + 606 + 3583 + 0 + 0 + + + 51 + 609 + 3583 + 0 + 0 + + + 51 + 591 + 3591 + 2 + 0 + + + 51 + 591 + 3587 + 4 + 0 + + + 51 + 591 + 3585 + 0 + 0 + + + 25 + 584 + 3589 + 0 + 0 + + + 598 + 599 + 3584 + 4 + 0 + + + 598 + 598 + 3584 + 4 + 0 + + + 598 + 597 + 3584 + 4 + 0 + + + 51 + 596 + 3591 + 6 + 0 + + + 628 + 596 + 3584 + 4 + 0 + + + 55 + 595 + 3590 + 6 + 0 + + + 51 + 595 + 3587 + 4 + 0 + + + 598 + 595 + 3584 + 4 + 0 + + + 55 + 594 + 3590 + 6 + 0 + + + 51 + 594 + 3585 + 0 + 0 + + + 51 + 606 + 3589 + 4 + 0 + + + 5 + 605 + 3591 + 2 + 0 + + + 51 + 603 + 3591 + 2 + 0 + + + 51 + 603 + 3588 + 2 + 0 + + + 51 + 603 + 3584 + 2 + 0 + + + 5 + 610 + 3588 + 2 + 0 + + + 51 + 609 + 3589 + 4 + 0 + + + 2 + 593 + 3590 + 0 + 1 + + + 150 + 604 + 3587 + 0 + 1 + + + 51 + 591 + 3596 + 2 + 0 + + + 43 + 591 + 3593 + 6 + 0 + + + 51 + 596 + 3596 + 6 + 0 + + + 22 + 596 + 3593 + 6 + 0 + + + 22 + 595 + 3597 + 6 + 0 + + + 51 + 582 + 3564 + 2 + 0 + + + 51 + 582 + 3561 + 2 + 0 + + + 103 + 581 + 3575 + 2 + 0 + + + 636 + 581 + 3573 + 2 + 0 + + + 103 + 581 + 3572 + 2 + 0 + + + 51 + 581 + 3570 + 2 + 0 + + + 25 + 581 + 3582 + 0 + 0 + + + 143 + 576 + 3583 + 2 + 0 + + + 143 + 576 + 3581 + 2 + 0 + + + 630 + 576 + 3577 + 0 + 0 + + + 213 + 582 + 3585 + 0 + 0 + + + 25 + 581 + 3589 + 0 + 0 + + + 51 + 582 + 3558 + 2 + 0 + + + 213 + 581 + 3553 + 4 + 0 + + + 205 + 599 + 3534 + 2 + 0 + + + 51 + 597 + 3532 + 0 + 0 + + + 51 + 595 + 3534 + 2 + 0 + + + 621 + 605 + 3509 + 4 + 0 + + + 51 + 602 + 3509 + 0 + 0 + + + 34 + 607 + 3518 + 4 + 0 + + + 51 + 607 + 3516 + 6 + 0 + + + 51 + 607 + 3512 + 6 + 0 + + + 286 + 606 + 3513 + 4 + 0 + + + 51 + 605 + 3519 + 4 + 0 + + + 34 + 604 + 3512 + 4 + 0 + + + 286 + 603 + 3512 + 4 + 0 + + + 286 + 601 + 3514 + 4 + 0 + + + 51 + 600 + 3516 + 2 + 0 + + + 51 + 600 + 3512 + 2 + 0 + + + 277 + 607 + 3527 + 2 + 0 + + + 402 + 607 + 3525 + 4 + 0 + + + 277 + 604 + 3524 + 4 + 0 + + + 277 + 604 + 3520 + 4 + 0 + + + 51 + 602 + 3523 + 2 + 0 + + + 51 + 602 + 3521 + 2 + 0 + + + 277 + 607 + 3533 + 2 + 0 + + + 51 + 607 + 3529 + 2 + 0 + + + 277 + 605 + 3535 + 2 + 0 + + + 51 + 611 + 3525 + 6 + 0 + + + 277 + 610 + 3526 + 4 + 0 + + + 402 + 610 + 3524 + 4 + 0 + + + 277 + 610 + 3523 + 4 + 0 + + + 51 + 608 + 3522 + 0 + 0 + + + 51 + 609 + 3530 + 6 + 0 + + + 580 + 683 + 1452 + 2 + 0 + + + 121 + 686 + 1464 + 0 + 0 + + + 6 + 684 + 1464 + 2 + 0 + + + 421 + 681 + 1464 + 0 + 0 + + + 648 + 693 + 1452 + 6 + 0 + + + 121 + 693 + 1459 + 0 + 0 + + + 6 + 691 + 1459 + 2 + 0 + + + 421 + 688 + 1459 + 0 + 0 + + + 121 + 694 + 1469 + 0 + 0 + + + 6 + 692 + 1469 + 2 + 0 + + + 421 + 689 + 1469 + 0 + 0 + + + 6 + 714 + 1444 + 0 + 0 + + + 421 + 714 + 1441 + 6 + 0 + + + 576 + 714 + 1452 + 0 + 0 + + + 418 + 714 + 1448 + 6 + 0 + + + 421 + 714 + 1463 + 2 + 0 + + + 6 + 714 + 1460 + 0 + 0 + + + 418 + 714 + 1456 + 6 + 0 + + + 421 + 726 + 1459 + 0 + 0 + + + 421 + 724 + 1468 + 2 + 0 + + + 6 + 724 + 1465 + 0 + 0 + + + 6 + 729 + 1459 + 2 + 0 + + + 421 + 731 + 1469 + 2 + 0 + + + 6 + 731 + 1466 + 0 + 0 + + + 421 + 714 + 1428 + 2 + 0 + + + 6 + 714 + 1425 + 0 + 0 + + + 22 + 727 + 3334 + 2 + 0 + + + 668 + 735 + 3335 + 2 + 0 + + + 668 + 735 + 3333 + 2 + 0 + + + 55 + 735 + 3332 + 2 + 0 + + + 5 + 729 + 3334 + 2 + 0 + + + 668 + 739 + 3335 + 2 + 0 + + + 668 + 739 + 3333 + 2 + 0 + + + 97 + 737 + 3334 + 2 + 0 + + + 668 + 737 + 3332 + 2 + 0 + + + 668 + 737 + 3336 + 2 + 0 + + + 281 + 724 + 1388 + 0 + 0 + + + 281 + 723 + 1389 + 0 + 0 + + + 576 + 723 + 1388 + 0 + 0 + + + 281 + 723 + 1387 + 0 + 0 + + + 281 + 722 + 1388 + 0 + 0 + + + 427 + 725 + 1401 + 0 + 0 + + + 418 + 720 + 1401 + 0 + 0 + + + 3 + 740 + 1384 + 4 + 0 + + + 6 + 743 + 1405 + 0 + 0 + + + 421 + 743 + 1402 + 6 + 0 + + + 421 + 743 + 1415 + 6 + 0 + + + 427 + 743 + 1411 + 6 + 0 + + + 597 + 743 + 1409 + 0 + 0 + + + 597 + 743 + 1408 + 0 + 0 + + + 641 + 743 + 1419 + 0 + 0 + + + 6 + 743 + 1418 + 0 + 0 + + + 3 + 750 + 1384 + 6 + 0 + + + 3 + 745 + 1384 + 6 + 0 + + + 51 + 415 + 161 + 0 + 0 + + + 51 + 414 + 164 + 2 + 0 + + + 51 + 414 + 162 + 2 + 0 + + + 419 + 410 + 163 + 4 + 0 + + + 526 + 409 + 164 + 2 + 0 + + + 419 + 408 + 166 + 6 + 0 + + + 419 + 408 + 160 + 6 + 0 + + + 419 + 422 + 163 + 4 + 0 + + + 51 + 418 + 164 + 6 + 0 + + + 51 + 418 + 162 + 6 + 0 + + + 51 + 417 + 161 + 0 + 0 + + + 5 + 416 + 163 + 0 + 0 + + + 567 + 416 + 162 + 4 + 0 + + + 643 + 416 + 161 + 0 + 0 + + + 419 + 424 + 166 + 6 + 0 + + + 526 + 424 + 163 + 6 + 0 + + + 419 + 424 + 160 + 6 + 0 + + + 154 + 416 + 166 + 0 + 1 + + + 51 + 415 + 1108 + 4 + 0 + + + 51 + 415 + 1106 + 0 + 0 + + + 51 + 417 + 1108 + 4 + 0 + + + 51 + 417 + 1106 + 0 + 0 + + + 6 + 416 + 1107 + 4 + 0 + + + 568 + 416 + 1106 + 4 + 0 + + + 156 + 414 + 1107 + 1 + 1 + + + 155 + 419 + 1107 + 1 + 1 + + + 418 + 687 + 1389 + 0 + 0 + + + 427 + 682 + 1389 + 4 + 0 + + + 427 + 683 + 1402 + 4 + 0 + + + 22 + 682 + 1401 + 0 + 0 + + + 22 + 681 + 1402 + 0 + 0 + + + 6 + 680 + 1414 + 0 + 0 + + + 427 + 691 + 1380 + 2 + 0 + + + 22 + 691 + 1378 + 0 + 0 + + + 22 + 690 + 1379 + 0 + 0 + + + 576 + 691 + 1389 + 0 + 0 + + + 418 + 691 + 1385 + 2 + 0 + + + 578 + 694 + 1395 + 0 + 0 + + + 418 + 692 + 1398 + 2 + 0 + + + 574 + 692 + 1397 + 0 + 0 + + + 580 + 691 + 1395 + 2 + 0 + + + 5 + 691 + 1394 + 0 + 0 + + + 418 + 691 + 1393 + 2 + 0 + + + 5 + 690 + 1394 + 0 + 0 + + + 587 + 693 + 1402 + 0 + 0 + + + 418 + 692 + 1406 + 2 + 0 + + + 576 + 692 + 1402 + 0 + 0 + + + 602 + 690 + 1401 + 2 + 0 + + + 418 + 688 + 1402 + 0 + 0 + + + 119 + 692 + 1412 + 0 + 0 + + + 427 + 692 + 1411 + 6 + 0 + + + 426 + 696 + 1389 + 6 + 0 + + + 570 + 703 + 1394 + 4 + 0 + + + 578 + 699 + 1395 + 0 + 0 + + + 418 + 698 + 1395 + 4 + 0 + + + 600 + 697 + 1398 + 0 + 0 + + + 574 + 697 + 1396 + 2 + 0 + + + 418 + 696 + 1398 + 2 + 0 + + + 578 + 696 + 1395 + 0 + 0 + + + 418 + 696 + 1392 + 2 + 0 + + + 426 + 696 + 1402 + 4 + 0 + + + 426 + 711 + 1388 + 0 + 0 + + + 578 + 704 + 1390 + 2 + 0 + + + 578 + 704 + 1387 + 2 + 0 + + + 580 + 704 + 1384 + 0 + 0 + + + 418 + 711 + 1398 + 2 + 0 + + + 574 + 711 + 1395 + 6 + 0 + + + 418 + 711 + 1392 + 2 + 0 + + + 578 + 710 + 1395 + 0 + 0 + + + 418 + 709 + 1395 + 0 + 0 + + + 578 + 708 + 1395 + 4 + 0 + + + 426 + 711 + 1401 + 2 + 0 + + + 580 + 704 + 1406 + 4 + 0 + + + 578 + 704 + 1403 + 2 + 0 + + + 578 + 704 + 1400 + 2 + 0 + + + 427 + 715 + 1379 + 2 + 0 + + + 119 + 715 + 1377 + 4 + 0 + + + 418 + 719 + 1388 + 0 + 0 + + + 603 + 716 + 1386 + 0 + 0 + + + 576 + 715 + 1388 + 0 + 0 + + + 418 + 715 + 1384 + 2 + 0 + + + 589 + 714 + 1388 + 4 + 0 + + + 418 + 716 + 1397 + 2 + 0 + + + 580 + 716 + 1395 + 6 + 0 + + + 574 + 716 + 1394 + 4 + 0 + + + 5 + 716 + 1393 + 0 + 0 + + + 5 + 715 + 1394 + 4 + 0 + + + 418 + 715 + 1392 + 2 + 0 + + + 578 + 713 + 1395 + 0 + 0 + + + 605 + 712 + 1398 + 0 + 0 + + + 601 + 712 + 1393 + 0 + 0 + + + 604 + 717 + 1404 + 0 + 0 + + + 418 + 716 + 1405 + 2 + 0 + + + 576 + 716 + 1401 + 0 + 0 + + + 182 + 716 + 1412 + 0 + 0 + + + 427 + 716 + 1410 + 6 + 0 + + + 156 + 701 + 1395 + 1 + 1 + + + 155 + 707 + 1395 + 1 + 1 + + + 598 + 687 + 2398 + 6 + 0 + + + 598 + 687 + 2397 + 6 + 0 + + + 590 + 687 + 2396 + 6 + 0 + + + 598 + 687 + 2395 + 6 + 0 + + + 598 + 687 + 2394 + 6 + 0 + + + 649 + 683 + 2396 + 2 + 0 + + + 581 + 693 + 2396 + 6 + 0 + + + 598 + 689 + 2397 + 6 + 0 + + + 598 + 689 + 2396 + 6 + 0 + + + 650 + 689 + 2395 + 6 + 0 + + + 598 + 689 + 2394 + 6 + 0 + + + 598 + 689 + 2393 + 6 + 0 + + + 421 + 680 + 1417 + 2 + 0 + + + 6 + 685 + 1427 + 4 + 0 + + + 641 + 685 + 1425 + 0 + 0 + + + 421 + 685 + 1424 + 6 + 0 + + + 6 + 680 + 1427 + 4 + 0 + + + 641 + 680 + 1425 + 0 + 0 + + + 421 + 680 + 1424 + 6 + 0 + + + 6 + 690 + 1427 + 4 + 0 + + + 641 + 690 + 1425 + 0 + 0 + + + 421 + 690 + 1424 + 6 + 0 + + + 635 + 710 + 1420 + 2 + 0 + + + 178 + 345 + 601 + 6 + 0 + + + 48 + 343 + 1547 + 0 + 0 + + + 158 + 343 + 1557 + 2 + 0 + + + 3 + 343 + 1556 + 0 + 0 + + + 7 + 343 + 1555 + 6 + 0 + + + 5 + 341 + 1572 + 0 + 0 + + + 5 + 340 + 1575 + 6 + 0 + + + 5 + 338 + 1570 + 0 + 0 + + + 3 + 346 + 1551 + 0 + 0 + + + 3 + 346 + 1550 + 6 + 0 + + + 3 + 346 + 1545 + 6 + 0 + + + 3 + 345 + 1551 + 0 + 0 + + + 3 + 345 + 1550 + 6 + 0 + + + 3 + 345 + 1545 + 6 + 0 + + + 3 + 344 + 1550 + 6 + 0 + + + 3 + 344 + 1545 + 6 + 0 + + + 6 + 349 + 1556 + 0 + 0 + + + 121 + 346 + 1555 + 0 + 0 + + + 3 + 344 + 1556 + 0 + 0 + + + 6 + 349 + 1569 + 6 + 0 + + + 45 + 348 + 1572 + 0 + 0 + + + 45 + 347 + 1572 + 0 + 0 + + + 6 + 347 + 1571 + 0 + 0 + + + 45 + 346 + 1572 + 0 + 0 + + + 1 + 346 + 1570 + 0 + 1 + + + 2 + 345 + 1575 + 1 + 1 + + + 2 + 345 + 1573 + 1 + 1 + + + 2 + 345 + 1571 + 1 + 1 + + + 5 + 338 + 3458 + 6 + 0 + + + 5 + 346 + 3457 + 6 + 0 + + + 228 + 344 + 3458 + 0 + 0 + + + 52 + 342 + 3460 + 0 + 1 + + + 54 + 349 + 3460 + 1 + 1 + + + 1 + 349 + 3458 + 0 + 1 + + + 54 + 348 + 3463 + 1 + 1 + + + 53 + 346 + 3462 + 0 + 1 + + + 54 + 346 + 3469 + 1 + 1 + + + 51 + 346 + 3467 + 1 + 1 + + + 51 + 275 + 3525 + 2 + 0 + + + 51 + 275 + 3521 + 2 + 0 + + + 51 + 278 + 3532 + 2 + 0 + + + 51 + 279 + 3541 + 2 + 0 + + + 51 + 283 + 3524 + 6 + 0 + + + 51 + 282 + 3528 + 6 + 0 + + + 51 + 280 + 3534 + 6 + 0 + + + 51 + 286 + 3542 + 6 + 0 + + + 5 + 285 + 3543 + 0 + 0 + + + 51 + 282 + 3539 + 0 + 0 + + + 51 + 286 + 3544 + 6 + 0 + + + 51 + 295 + 3523 + 6 + 0 + + + 51 + 292 + 3524 + 4 + 0 + + + 98 + 302 + 3522 + 2 + 0 + + + 51 + 284 + 3513 + 0 + 0 + + + 51 + 280 + 3519 + 0 + 0 + + + 51 + 294 + 3515 + 6 + 0 + + + 51 + 291 + 3513 + 0 + 0 + + + 51 + 303 + 3513 + 0 + 0 + + + 98 + 301 + 3514 + 2 + 0 + + + 98 + 310 + 3517 + 6 + 0 + + + 98 + 308 + 3517 + 2 + 0 + + + 51 + 308 + 3515 + 6 + 0 + + + 98 + 307 + 3514 + 2 + 0 + + + 98 + 306 + 3526 + 6 + 0 + + + 51 + 309 + 3528 + 4 + 0 + + + 51 + 315 + 3519 + 6 + 0 + + + 98 + 313 + 3517 + 6 + 0 + + + 176 + 312 + 3517 + 6 + 0 + + + 51 + 316 + 3523 + 6 + 0 + + + 98 + 316 + 3522 + 6 + 0 + + + 51 + 315 + 3526 + 6 + 0 + + + 176 + 314 + 3527 + 6 + 0 + + + 99 + 312 + 3528 + 6 + 0 + + + 24 + 98 + 1468 + 6 + 0 + + + 15 + 96 + 1470 + 6 + 0 + + + 6 + 96 + 1467 + 4 + 0 + + + 3 + 102 + 1479 + 0 + 0 + + + 6 + 102 + 1476 + 0 + 0 + + + 6 + 106 + 1463 + 0 + 0 + + + 3 + 104 + 1463 + 0 + 0 + + + 17 + 106 + 1467 + 0 + 0 + + + 15 + 104 + 1466 + 6 + 0 + + + 18 + 111 + 1476 + 0 + 0 + + + 3 + 110 + 1476 + 0 + 0 + + + 6 + 107 + 1479 + 0 + 0 + + + 6 + 119 + 1470 + 0 + 0 + + + 3 + 118 + 1470 + 0 + 0 + + + 15 + 116 + 1469 + 0 + 0 + + + 15 + 116 + 1464 + 4 + 0 + + + 6 + 113 + 1477 + 0 + 0 + + + 15 + 112 + 1478 + 0 + 0 + + + 6 + 94 + 1473 + 0 + 0 + + + 51 + 111 + 3366 + 6 + 0 + + + 51 + 108 + 3366 + 0 + 0 + + + 5 + 106 + 3366 + 0 + 0 + + + 3 + 111 + 3375 + 0 + 0 + + + 51 + 111 + 3368 + 6 + 0 + + + 51 + 108 + 3375 + 0 + 0 + + + 51 + 106 + 3375 + 0 + 0 + + + 5 + 118 + 3352 + 0 + 0 + + + 51 + 113 + 3374 + 6 + 0 + + + 51 + 113 + 3371 + 6 + 0 + + + 3 + 112 + 3375 + 0 + 0 + + + 22 + 122 + 3355 + 0 + 0 + + + 22 + 121 + 3355 + 0 + 0 + + + 51 + 121 + 3352 + 0 + 0 + + + 19 + 110 + 3370 + 0 + 1 + + + 15 + 118 + 1405 + 4 + 0 + + + 15 + 118 + 1400 + 4 + 0 + + + 6 + 123 + 1407 + 0 + 0 + + + 15 + 122 + 1400 + 4 + 0 + + + 23 + 135 + 1399 + 6 + 0 + + + 23 + 133 + 1399 + 6 + 0 + + + 23 + 130 + 1399 + 6 + 0 + + + 23 + 135 + 1402 + 6 + 0 + + + 23 + 133 + 1402 + 6 + 0 + + + 63 + 131 + 1404 + 6 + 0 + + + 23 + 130 + 1402 + 6 + 0 + + + 45 + 134 + 1415 + 2 + 0 + + + 45 + 134 + 1414 + 2 + 0 + + + 45 + 133 + 1414 + 0 + 0 + + + 44 + 131 + 1414 + 4 + 0 + + + 45 + 130 + 1414 + 0 + 0 + + + 45 + 129 + 1415 + 6 + 0 + + + 45 + 129 + 1414 + 6 + 0 + + + 45 + 134 + 1417 + 2 + 0 + + + 45 + 134 + 1416 + 2 + 0 + + + 45 + 133 + 1417 + 4 + 0 + + + 45 + 132 + 1417 + 4 + 0 + + + 45 + 131 + 1417 + 4 + 0 + + + 45 + 130 + 1417 + 4 + 0 + + + 45 + 129 + 1417 + 6 + 0 + + + 45 + 129 + 1416 + 6 + 0 + + + 6 + 142 + 1398 + 0 + 0 + + + 25 + 137 + 1399 + 6 + 0 + + + 3 + 141 + 1406 + 2 + 0 + + + 3 + 141 + 1403 + 2 + 0 + + + 15 + 141 + 1401 + 2 + 0 + + + 15 + 140 + 1407 + 0 + 0 + + + 15 + 140 + 1404 + 2 + 0 + + + 15 + 138 + 1407 + 0 + 0 + + + 25 + 137 + 1403 + 6 + 0 + + + 19 + 137 + 1401 + 6 + 0 + + + 47 + 141 + 1412 + 4 + 0 + + + 14 + 139 + 1409 + 2 + 0 + + + 25 + 140 + 1423 + 4 + 0 + + + 71 + 140 + 1420 + 4 + 0 + + + 25 + 140 + 1419 + 4 + 0 + + + 27 + 137 + 1418 + 0 + 0 + + + 14 + 136 + 1421 + 0 + 0 + + + 2 + 122 + 1404 + 0 + 1 + + + 2 + 121 + 1404 + 1 + 1 + + + 1 + 124 + 1409 + 1 + 1 + + + 1 + 121 + 1408 + 1 + 1 + + + 1 + 128 + 1414 + 1 + 1 + + + 1 + 138 + 1413 + 1 + 1 + + + 1 + 136 + 1414 + 1 + 1 + + + 1 + 138 + 1418 + 0 + 1 + + + 51 + 414 + 3276 + 2 + 0 + + + 51 + 411 + 3273 + 4 + 0 + + + 51 + 408 + 3277 + 0 + 0 + + + 51 + 408 + 3273 + 4 + 0 + + + 51 + 412 + 3280 + 0 + 0 + + + 51 + 409 + 3285 + 4 + 0 + + + 51 + 413 + 3295 + 0 + 0 + + + 51 + 413 + 3298 + 4 + 0 + + + 51 + 418 + 3278 + 2 + 0 + + + 5 + 423 + 3285 + 0 + 0 + + + 270 + 419 + 3286 + 0 + 0 + + + 51 + 418 + 3283 + 2 + 0 + + + 51 + 416 + 3282 + 2 + 0 + + + 51 + 419 + 3295 + 0 + 0 + + + 51 + 416 + 3295 + 0 + 0 + + + 51 + 423 + 3298 + 4 + 0 + + + 51 + 419 + 3298 + 4 + 0 + + + 51 + 426 + 3273 + 6 + 0 + + + 51 + 424 + 3278 + 6 + 0 + + + 51 + 425 + 3283 + 6 + 0 + + + 51 + 429 + 3292 + 6 + 0 + + + 51 + 428 + 3290 + 0 + 0 + + + 43 + 426 + 3290 + 4 + 0 + + + 270 + 424 + 3289 + 0 + 0 + + + 51 + 405 + 3274 + 0 + 0 + + + 51 + 402 + 3278 + 0 + 0 + + + 51 + 401 + 3274 + 0 + 0 + + + 51 + 407 + 3282 + 0 + 0 + + + 51 + 404 + 3282 + 4 + 0 + + + 51 + 403 + 3285 + 4 + 0 + + + 51 + 407 + 3292 + 0 + 0 + + + 51 + 404 + 3292 + 0 + 0 + + + 51 + 403 + 3294 + 4 + 0 + + + 51 + 401 + 3292 + 0 + 0 + + + 51 + 400 + 3295 + 0 + 0 + + + 51 + 402 + 3300 + 6 + 0 + + + 51 + 400 + 3302 + 4 + 0 + + + 273 + 400 + 3301 + 4 + 0 + + + 273 + 400 + 3298 + 4 + 0 + + + 5 + 399 + 3276 + 0 + 0 + + + 27 + 399 + 3272 + 6 + 0 + + + 25 + 396 + 3275 + 0 + 0 + + + 10 + 395 + 3274 + 2 + 0 + + + 51 + 399 + 3282 + 0 + 0 + + + 270 + 398 + 3280 + 0 + 0 + + + 51 + 397 + 3286 + 4 + 0 + + + 270 + 394 + 3282 + 0 + 0 + + + 51 + 398 + 3292 + 0 + 0 + + + 64 + 397 + 3294 + 2 + 0 + + + 51 + 396 + 3295 + 0 + 0 + + + 51 + 395 + 3294 + 4 + 0 + + + 51 + 395 + 3292 + 0 + 0 + + + 51 + 393 + 3295 + 0 + 0 + + + 51 + 392 + 3292 + 0 + 0 + + + 273 + 398 + 3301 + 4 + 0 + + + 273 + 398 + 3298 + 4 + 0 + + + 97 + 396 + 3301 + 4 + 0 + + + 97 + 396 + 3300 + 4 + 0 + + + 273 + 394 + 3298 + 4 + 0 + + + 51 + 393 + 3302 + 4 + 0 + + + 273 + 393 + 3301 + 4 + 0 + + + 273 + 392 + 3298 + 4 + 0 + + + 273 + 391 + 3301 + 4 + 0 + + + 51 + 390 + 3300 + 2 + 0 + + + 51 + 389 + 3299 + 6 + 0 + + + 51 + 385 + 3302 + 2 + 0 + + + 43 + 385 + 3298 + 4 + 0 + + + 51 + 385 + 3296 + 2 + 0 + + + 51 + 387 + 3304 + 4 + 0 + + + 51 + 371 + 3319 + 0 + 0 + + + 277 + 390 + 3314 + 6 + 0 + + + 51 + 389 + 3312 + 0 + 0 + + + 277 + 388 + 3316 + 6 + 0 + + + 51 + 387 + 3319 + 2 + 0 + + + 51 + 386 + 3315 + 2 + 0 + + + 51 + 396 + 3314 + 6 + 0 + + + 277 + 394 + 3316 + 6 + 0 + + + 51 + 392 + 3312 + 0 + 0 + + + 51 + 371 + 3323 + 2 + 0 + + + 145 + 368 + 3321 + 0 + 0 + + + 277 + 389 + 3325 + 0 + 0 + + + 51 + 387 + 3327 + 2 + 0 + + + 51 + 387 + 3323 + 2 + 0 + + + 51 + 396 + 3325 + 6 + 0 + + + 277 + 395 + 3326 + 0 + 0 + + + 51 + 395 + 3323 + 6 + 0 + + + 51 + 395 + 3320 + 6 + 0 + + + 277 + 393 + 3321 + 0 + 0 + + + 42 + 358 + 1436 + 0 + 0 + + + 6 + 367 + 1438 + 0 + 0 + + + 3 + 362 + 1437 + 2 + 0 + + + 45 + 360 + 1439 + 0 + 0 + + + 45 + 360 + 1438 + 6 + 0 + + + 45 + 360 + 1437 + 6 + 0 + + + 45 + 360 + 1436 + 6 + 0 + + + 45 + 360 + 1435 + 6 + 0 + + + 257 + 362 + 1440 + 0 + 0 + + + 22 + 381 + 1444 + 4 + 0 + + + 6 + 380 + 1447 + 0 + 0 + + + 3 + 377 + 1446 + 4 + 0 + + + 51 + 279 + 3354 + 4 + 0 + + + 100 + 278 + 3353 + 2 + 0 + + + 51 + 272 + 3355 + 6 + 0 + + + 109 + 276 + 3373 + 0 + 0 + + + 103 + 272 + 3370 + 0 + 0 + + + 102 + 272 + 3369 + 0 + 0 + + + 51 + 261 + 3350 + 4 + 0 + + + 114 + 261 + 3346 + 2 + 0 + + + 104 + 260 + 3349 + 2 + 0 + + + 51 + 259 + 3344 + 2 + 0 + + + 51 + 271 + 3350 + 6 + 0 + + + 150 + 266 + 3346 + 2 + 0 + + + 149 + 266 + 3345 + 2 + 0 + + + 153 + 266 + 3344 + 2 + 0 + + + 101 + 277 + 3351 + 0 + 0 + + + 114 + 277 + 3349 + 2 + 0 + + + 115 + 277 + 3348 + 0 + 0 + + + 51 + 276 + 3346 + 2 + 0 + + + 50 + 286 + 3349 + 0 + 0 + + + 50 + 286 + 3346 + 0 + 0 + + + 50 + 283 + 3349 + 0 + 0 + + + 50 + 283 + 3346 + 0 + 0 + + + 150 + 281 + 3348 + 2 + 0 + + + 153 + 281 + 3347 + 2 + 0 + + + 149 + 281 + 3346 + 2 + 0 + + + 153 + 281 + 3345 + 2 + 0 + + + 153 + 281 + 3344 + 2 + 0 + + + 102 + 261 + 3342 + 2 + 0 + + + 51 + 261 + 3340 + 0 + 0 + + + 105 + 260 + 3341 + 0 + 0 + + + 51 + 256 + 3336 + 4 + 0 + + + 230 + 255 + 3331 + 6 + 0 + + + 51 + 254 + 3335 + 2 + 0 + + + 51 + 254 + 3332 + 2 + 0 + + + 51 + 262 + 3333 + 0 + 0 + + + 51 + 260 + 3333 + 0 + 0 + + + 57 + 259 + 3334 + 1 + 1 + + + 51 + 294 + 3350 + 6 + 0 + + + 3 + 293 + 3351 + 6 + 0 + + + 51 + 292 + 3344 + 0 + 0 + + + 97 + 291 + 3348 + 6 + 0 + + + 97 + 291 + 3347 + 6 + 0 + + + 97 + 290 + 3348 + 6 + 0 + + + 97 + 290 + 3347 + 6 + 0 + + + 51 + 294 + 3356 + 6 + 0 + + + 280 + 291 + 3356 + 0 + 0 + + + 51 + 290 + 3358 + 4 + 0 + + + 3 + 301 + 3350 + 6 + 0 + + + 51 + 301 + 3346 + 6 + 0 + + + 51 + 299 + 3351 + 4 + 0 + + + 51 + 299 + 3344 + 0 + 0 + + + 51 + 311 + 3343 + 0 + 0 + + + 51 + 311 + 3351 + 4 + 0 + + + 51 + 305 + 3349 + 4 + 0 + + + 51 + 305 + 3347 + 0 + 0 + + + 281 + 305 + 3358 + 6 + 0 + + + 51 + 314 + 3349 + 6 + 0 + + + 51 + 313 + 3345 + 6 + 0 + + + 17 + 141 + 3493 + 0 + 0 + + + 17 + 141 + 3492 + 0 + 0 + + + 51 + 139 + 3493 + 4 + 0 + + + 51 + 139 + 3488 + 0 + 0 + + + 5 + 136 + 3492 + 0 + 0 + + + 6 + 139 + 1592 + 0 + 0 + + + 5 + 138 + 1593 + 0 + 0 + + + 6 + 139 + 1610 + 0 + 0 + + + 5 + 138 + 1612 + 0 + 0 + + + 6 + 138 + 2537 + 0 + 0 + + + 121 + 139 + 2554 + 2 + 0 + + + 7 + 139 + 2553 + 4 + 0 + + + 6 + 138 + 2556 + 0 + 0 + + + 27 + 56 + 1623 + 0 + 0 + + + 15 + 57 + 1627 + 0 + 0 + + + 6 + 78 + 1621 + 0 + 0 + + + 7 + 75 + 1618 + 2 + 0 + + + 3 + 74 + 1618 + 0 + 0 + + + 6 + 54 + 1627 + 2 + 0 + + + 6 + 542 + 1543 + 0 + 0 + + + 336 + 542 + 1546 + 0 + 0 + + + 339 + 539 + 1547 + 0 + 0 + + + 145 + 559 + 1535 + 6 + 0 + + + 49 + 559 + 1534 + 6 + 0 + + + 290 + 559 + 1533 + 0 + 0 + + + 145 + 559 + 1532 + 6 + 0 + + + 290 + 559 + 1530 + 0 + 0 + + + 44 + 558 + 1589 + 4 + 0 + + + 45 + 557 + 1591 + 6 + 0 + + + 45 + 557 + 1590 + 6 + 0 + + + 45 + 559 + 1592 + 0 + 0 + + + 45 + 558 + 1592 + 0 + 0 + + + 14 + 557 + 1594 + 6 + 0 + + + 51 + 556 + 1593 + 2 + 0 + + + 145 + 639 + 1685 + 2 + 0 + + + 145 + 639 + 1683 + 2 + 0 + + + 145 + 639 + 1681 + 2 + 0 + + + 25 + 639 + 1680 + 4 + 0 + + + 6 + 638 + 1685 + 0 + 0 + + + 145 + 638 + 1680 + 4 + 0 + + + 145 + 637 + 1685 + 0 + 0 + + + 1021 + 636 + 1685 + 0 + 0 + + + 145 + 636 + 1680 + 4 + 0 + + + 145 + 635 + 1685 + 0 + 0 + + + 23 + 635 + 1680 + 4 + 0 + + + 145 + 634 + 1685 + 6 + 0 + + + 145 + 634 + 1683 + 6 + 0 + + + 145 + 634 + 1681 + 6 + 0 + + + 145 + 634 + 1680 + 4 + 0 + + + 44 + 643 + 1692 + 4 + 0 + + + 44 + 643 + 1701 + 0 + 0 + + + 959 + 639 + 2629 + 6 + 0 + + + 959 + 639 + 2624 + 4 + 0 + + + 1017 + 636 + 2629 + 0 + 0 + + + 1014 + 492 + 3520 + 4 + 0 + + + 959 + 634 + 2629 + 0 + 0 + + + 959 + 634 + 2624 + 2 + 0 + + + 179 + 494 + 3523 + 1 + 1 + + + 179 + 494 + 3522 + 1 + 1 + + + 179 + 493 + 3524 + 0 + 1 + + + 179 + 493 + 3522 + 0 + 1 + + + 179 + 492 + 3524 + 0 + 1 + + + 179 + 492 + 3523 + 1 + 1 + + + 179 + 492 + 3522 + 1 + 1 + + + 51 + 599 + 1703 + 2 + 0 + + + 51 + 599 + 1700 + 2 + 0 + + + 6 + 605 + 1686 + 4 + 0 + + + 22 + 602 + 1686 + 0 + 0 + + + 22 + 601 + 1686 + 0 + 0 + + + 15 + 605 + 1688 + 0 + 0 + + + 15 + 601 + 1688 + 0 + 0 + + + 5 + 606 + 1703 + 6 + 0 + + + 51 + 606 + 1700 + 6 + 0 + + + 45 + 604 + 1702 + 2 + 0 + + + 45 + 604 + 1701 + 2 + 0 + + + 45 + 604 + 1700 + 2 + 0 + + + 51 + 604 + 1698 + 0 + 0 + + + 45 + 603 + 1703 + 0 + 0 + + + 45 + 602 + 1703 + 0 + 0 + + + 42 + 602 + 1700 + 4 + 0 + + + 45 + 601 + 1702 + 6 + 0 + + + 45 + 601 + 1701 + 6 + 0 + + + 45 + 601 + 1700 + 6 + 0 + + + 51 + 601 + 1698 + 0 + 0 + + + 22 + 605 + 1704 + 5 + 0 + + + 51 + 604 + 1705 + 4 + 0 + + + 51 + 601 + 1705 + 4 + 0 + + + 3 + 600 + 1704 + 6 + 0 + + + 1 + 600 + 1703 + 0 + 1 + + + 1 + 602 + 1704 + 1 + 1 + + + 20 + 599 + 2647 + 0 + 0 + + + 63 + 599 + 2645 + 0 + 0 + + + 20 + 599 + 2644 + 2 + 0 + + + 6 + 606 + 2647 + 0 + 0 + + + 25 + 605 + 2643 + 7 + 0 + + + 20 + 604 + 2642 + 0 + 0 + + + 63 + 602 + 2642 + 6 + 0 + + + 20 + 601 + 2642 + 6 + 0 + + + 25 + 600 + 2643 + 5 + 0 + + + 25 + 605 + 2648 + 5 + 0 + + + 20 + 604 + 2649 + 2 + 0 + + + 63 + 602 + 2649 + 2 + 0 + + + 20 + 601 + 2649 + 4 + 0 + + + 25 + 600 + 2648 + 7 + 0 + + + 148 + 599 + 2646 + 1 + 1 + + + 147 + 603 + 2642 + 0 + 1 + + + 149 + 603 + 2650 + 0 + 1 + + + 149 + 602 + 2650 + 0 + 1 + + + 15 + 446 + 1705 + 4 + 0 + + + 6 + 444 + 1707 + 2 + 0 + + + 15 + 441 + 1706 + 4 + 0 + + + 15 + 447 + 1713 + 0 + 0 + + + 6 + 446 + 1713 + 0 + 0 + + + 15 + 442 + 1714 + 0 + 0 + + + 6 + 441 + 1714 + 0 + 0 + + + 21 + 454 + 1700 + 0 + 0 + + + 21 + 454 + 1699 + 0 + 0 + + + 6 + 454 + 1708 + 2 + 0 + + + 15 + 451 + 1707 + 4 + 0 + + + 6 + 449 + 1706 + 2 + 0 + + + 15 + 452 + 1714 + 0 + 0 + + + 6 + 451 + 1714 + 0 + 0 + + + 21 + 459 + 1695 + 0 + 0 + + + 21 + 458 + 1695 + 0 + 0 + + + 21 + 462 + 1699 + 0 + 0 + + + 21 + 462 + 1698 + 0 + 0 + + + 21 + 460 + 1701 + 0 + 0 + + + 21 + 458 + 1703 + 0 + 0 + + + 6 + 458 + 1699 + 5 + 0 + + + 21 + 457 + 1703 + 0 + 0 + + + 21 + 456 + 1697 + 0 + 0 + + + 340 + 582 + 1527 + 0 + 0 + + + 15 + 581 + 1522 + 4 + 0 + + + 6 + 585 + 1522 + 0 + 0 + + + 334 + 584 + 1527 + 0 + 0 + + + 15 + 606 + 1525 + 6 + 0 + + + 730 + 582 + 3337 + 6 + 0 + + + 940 + 581 + 3342 + 0 + 0 + + + 22 + 580 + 3343 + 0 + 0 + + + 730 + 580 + 3339 + 0 + 0 + + + 730 + 581 + 3351 + 5 + 0 + + + 730 + 580 + 3348 + 0 + 0 + + + 729 + 580 + 3344 + 5 + 0 + + + 730 + 578 + 3349 + 0 + 0 + + + 729 + 581 + 3356 + 5 + 0 + + + 729 + 579 + 3355 + 6 + 0 + + + 730 + 578 + 3352 + 5 + 0 + + + 983 + 577 + 3355 + 6 + 0 + + + 730 + 590 + 3342 + 0 + 0 + + + 730 + 590 + 3336 + 0 + 0 + + + 729 + 589 + 3348 + 6 + 0 + + + 730 + 589 + 3344 + 0 + 0 + + + 730 + 587 + 3347 + 0 + 0 + + + 730 + 586 + 3349 + 0 + 0 + + + 730 + 586 + 3345 + 0 + 0 + + + 729 + 590 + 3353 + 6 + 0 + + + 730 + 587 + 3356 + 0 + 0 + + + 940 + 586 + 3353 + 0 + 0 + + + 730 + 597 + 3337 + 0 + 0 + + + 730 + 595 + 3338 + 0 + 0 + + + 730 + 593 + 3342 + 6 + 0 + + + 729 + 592 + 3336 + 6 + 0 + + + 730 + 599 + 3347 + 0 + 0 + + + 940 + 599 + 3352 + 0 + 0 + + + 730 + 598 + 3355 + 0 + 0 + + + 22 + 607 + 3342 + 0 + 0 + + + 22 + 607 + 3341 + 0 + 0 + + + 730 + 607 + 3337 + 0 + 0 + + + 730 + 600 + 3336 + 0 + 0 + + + 730 + 607 + 3345 + 0 + 0 + + + 22 + 604 + 3345 + 0 + 0 + + + 730 + 603 + 3345 + 6 + 0 + + + 730 + 601 + 3349 + 0 + 0 + + + 730 + 601 + 3347 + 0 + 0 + + + 730 + 600 + 3355 + 0 + 0 + + + 51 + 568 + 3331 + 4 + 0 + + + 730 + 581 + 3335 + 0 + 0 + + + 730 + 581 + 3332 + 0 + 0 + + + 730 + 581 + 3329 + 0 + 0 + + + 730 + 590 + 3332 + 0 + 0 + + + 730 + 590 + 3329 + 0 + 0 + + + 730 + 587 + 3331 + 0 + 0 + + + 730 + 584 + 3329 + 6 + 0 + + + 940 + 599 + 3333 + 0 + 0 + + + 940 + 594 + 3332 + 0 + 0 + + + 986 + 593 + 3334 + 0 + 0 + + + 986 + 593 + 3333 + 0 + 0 + + + 986 + 593 + 3332 + 0 + 0 + + + 730 + 607 + 3333 + 0 + 0 + + + 730 + 603 + 3332 + 0 + 0 + + + 730 + 603 + 3329 + 0 + 0 + + + 730 + 601 + 3331 + 0 + 0 + + + 986 + 600 + 3333 + 0 + 0 + + + 986 + 600 + 3332 + 0 + 0 + + + 986 + 609 + 3328 + 0 + 0 + + + 730 + 615 + 3342 + 6 + 0 + + + 940 + 615 + 3338 + 0 + 0 + + + 986 + 614 + 3337 + 0 + 0 + + + 986 + 613 + 3341 + 0 + 0 + + + 730 + 609 + 3342 + 0 + 0 + + + 730 + 583 + 3327 + 0 + 0 + + + 730 + 591 + 3321 + 0 + 0 + + + 730 + 588 + 3325 + 0 + 0 + + + 730 + 586 + 3325 + 0 + 0 + + + 986 + 599 + 3323 + 0 + 0 + + + 730 + 599 + 3320 + 0 + 0 + + + 730 + 596 + 3320 + 0 + 0 + + + 730 + 595 + 3322 + 6 + 0 + + + 986 + 594 + 3321 + 0 + 0 + + + 940 + 593 + 3324 + 0 + 0 + + + 730 + 606 + 3327 + 6 + 0 + + + 729 + 606 + 3321 + 6 + 0 + + + 730 + 605 + 3326 + 0 + 0 + + + 730 + 602 + 3321 + 0 + 0 + + + 730 + 601 + 3326 + 0 + 0 + + + 730 + 610 + 3320 + 0 + 0 + + + 986 + 609 + 3327 + 0 + 0 + + + 986 + 608 + 3321 + 0 + 0 + + + 986 + 620 + 3320 + 0 + 0 + + + 986 + 619 + 3321 + 0 + 0 + + + 22 + 616 + 3332 + 0 + 0 + + + 22 + 616 + 3331 + 0 + 0 + + + 986 + 617 + 3339 + 0 + 0 + + + 730 + 594 + 3318 + 0 + 0 + + + 729 + 615 + 3318 + 0 + 0 + + + 729 + 615 + 3314 + 6 + 0 + + + 986 + 615 + 3313 + 0 + 0 + + + 986 + 614 + 3316 + 0 + 0 + + + 22 + 614 + 3314 + 0 + 0 + + + 986 + 614 + 3313 + 0 + 0 + + + 986 + 613 + 3315 + 0 + 0 + + + 22 + 613 + 3314 + 0 + 0 + + + 730 + 612 + 3318 + 0 + 0 + + + 730 + 610 + 3317 + 0 + 0 + + + 22 + 622 + 3315 + 0 + 0 + + + 22 + 622 + 3314 + 0 + 0 + + + 986 + 621 + 3316 + 0 + 0 + + + 729 + 621 + 3315 + 0 + 0 + + + 986 + 621 + 3313 + 0 + 0 + + + 986 + 620 + 3319 + 0 + 0 + + + 986 + 620 + 3317 + 0 + 0 + + + 987 + 620 + 3313 + 0 + 0 + + + 986 + 619 + 3313 + 0 + 0 + + + 940 + 618 + 3314 + 0 + 0 + + + 986 + 617 + 3313 + 0 + 0 + + + 986 + 616 + 3313 + 0 + 0 + + + 5 + 631 + 3306 + 4 + 0 + + + 51 + 630 + 3305 + 0 + 0 + + + 6 + 333 + 1513 + 0 + 0 + + + 6 + 425 + 1431 + 0 + 0 + + + 17 + 429 + 1435 + 0 + 0 + + + 24 + 425 + 1434 + 2 + 0 + + + 6 + 436 + 1428 + 6 + 0 + + + 23 + 433 + 1424 + 4 + 0 + + + 3 + 432 + 1424 + 4 + 0 + + + 6 + 442 + 1428 + 0 + 0 + + + 15 + 440 + 1431 + 6 + 0 + + + 47 + 440 + 1428 + 0 + 0 + + + 28 + 165 + 1543 + 0 + 0 + + + 6 + 165 + 1542 + 0 + 0 + + + 5 + 166 + 1546 + 0 + 0 + + + 52 + 166 + 2487 + 0 + 0 + + + 6 + 166 + 2490 + 0 + 0 + + + 55 + 166 + 2489 + 0 + 0 + + + 15 + 214 + 1564 + 0 + 0 + + + 6 + 216 + 1564 + 0 + 0 + + + 141 + 216 + 1562 + 6 + 0 + + + 15 + 221 + 1574 + 2 + 0 + + + 6 + 218 + 1574 + 2 + 0 + + + 158 + 175 + 1431 + 0 + 0 + + + 11 + 175 + 1427 + 2 + 0 + + + 11 + 175 + 1426 + 2 + 0 + + + 3 + 181 + 1424 + 0 + 0 + + + 6 + 180 + 1430 + 0 + 0 + + + 3 + 180 + 1424 + 0 + 0 + + + 5 + 178 + 1430 + 0 + 0 + + + 28 + 178 + 1426 + 0 + 0 + + + 3 + 178 + 1424 + 0 + 0 + + + 3 + 177 + 1424 + 0 + 0 + + + 45 + 176 + 1431 + 2 + 0 + + + 45 + 176 + 1430 + 2 + 0 + + + 3 + 176 + 1424 + 0 + 0 + + + 3 + 175 + 2370 + 0 + 0 + + + 3 + 181 + 2374 + 0 + 0 + + + 173 + 179 + 2371 + 0 + 0 + + + 6 + 177 + 2374 + 0 + 0 + + + 3 + 177 + 2370 + 0 + 0 + + + 3 + 176 + 2370 + 0 + 0 + + + 51 + 365 + 3341 + 4 + 0 + + + 145 + 364 + 3339 + 4 + 0 + + + 51 + 361 + 3341 + 4 + 0 + + + 145 + 360 + 3339 + 4 + 0 + + + 145 + 367 + 3347 + 4 + 0 + + + 145 + 364 + 3347 + 4 + 0 + + + 215 + 362 + 3351 + 3 + 0 + + + 276 + 367 + 3353 + 3 + 0 + + + 51 + 365 + 3358 + 4 + 0 + + + 214 + 363 + 3355 + 3 + 0 + + + 117 + 374 + 3341 + 2 + 0 + + + 51 + 374 + 3340 + 2 + 0 + + + 51 + 374 + 3337 + 2 + 0 + + + 51 + 374 + 3344 + 2 + 0 + + + 51 + 373 + 3351 + 6 + 0 + + + 51 + 374 + 3352 + 2 + 0 + + + 51 + 373 + 3353 + 6 + 0 + + + 275 + 371 + 3354 + 6 + 0 + + + 276 + 369 + 3355 + 2 + 0 + + + 276 + 369 + 3352 + 0 + 0 + + + 51 + 368 + 3358 + 4 + 0 + + + 51 + 372 + 3362 + 2 + 0 + + + 271 + 373 + 3374 + 0 + 0 + + + 51 + 373 + 3371 + 0 + 0 + + + 51 + 370 + 3371 + 0 + 0 + + + 51 + 378 + 3340 + 6 + 0 + + + 51 + 378 + 3337 + 6 + 0 + + + 51 + 382 + 3344 + 0 + 0 + + + 51 + 379 + 3351 + 0 + 0 + + + 202 + 379 + 3349 + 4 + 0 + + + 202 + 379 + 3346 + 4 + 0 + + + 51 + 378 + 3348 + 2 + 0 + + + 51 + 378 + 3344 + 6 + 0 + + + 51 + 383 + 3354 + 6 + 0 + + + 51 + 382 + 3352 + 4 + 0 + + + 51 + 380 + 3356 + 4 + 0 + + + 51 + 378 + 3355 + 2 + 0 + + + 51 + 378 + 3352 + 6 + 0 + + + 51 + 376 + 3354 + 4 + 0 + + + 5 + 376 + 3352 + 6 + 0 + + + 51 + 377 + 3368 + 6 + 0 + + + 20 + 390 + 3340 + 4 + 0 + + + 51 + 386 + 3342 + 2 + 0 + + + 51 + 391 + 3356 + 6 + 0 + + + 51 + 385 + 3356 + 2 + 0 + + + 51 + 384 + 3353 + 2 + 0 + + + 51 + 391 + 3366 + 6 + 0 + + + 51 + 385 + 3367 + 2 + 0 + + + 51 + 385 + 3365 + 2 + 0 + + + 51 + 391 + 3369 + 6 + 0 + + + 20 + 393 + 3341 + 0 + 0 + + + 51 + 396 + 3347 + 2 + 0 + + + 51 + 396 + 3345 + 2 + 0 + + + 51 + 392 + 3350 + 6 + 0 + + + 51 + 392 + 3347 + 6 + 0 + + + 51 + 392 + 3354 + 6 + 0 + + + 2 + 369 + 3336 + 0 + 1 + + + 87 + 383 + 3353 + 0 + 1 + + + 51 + 357 + 3341 + 4 + 0 + + + 51 + 354 + 3354 + 4 + 0 + + + 145 + 353 + 3352 + 4 + 0 + + + 51 + 352 + 3354 + 4 + 0 + + + 51 + 352 + 3366 + 0 + 0 + + + 277 + 357 + 3374 + 0 + 0 + + + 51 + 356 + 3368 + 0 + 0 + + + 277 + 354 + 3371 + 0 + 0 + + + 2 + 355 + 3353 + 1 + 1 + + + 51 + 353 + 3331 + 2 + 0 + + + 51 + 353 + 3328 + 2 + 0 + + + 259 + 362 + 3328 + 2 + 0 + + + 51 + 371 + 3335 + 4 + 0 + + + 51 + 371 + 3329 + 0 + 0 + + + 236 + 369 + 3332 + 0 + 0 + + + 51 + 369 + 3329 + 0 + 0 + + + 51 + 378 + 3332 + 6 + 0 + + + 277 + 390 + 3331 + 0 + 0 + + + 51 + 387 + 3331 + 2 + 0 + + + 2 + 367 + 3332 + 1 + 1 + + + 2 + 374 + 3332 + 1 + 1 + + + 145 + 356 + 3321 + 0 + 0 + + + 145 + 364 + 3321 + 0 + 0 + + + 256 + 363 + 3325 + 2 + 0 + + + 5 + 362 + 3323 + 0 + 0 + + + 51 + 355 + 3318 + 0 + 0 + + + 51 + 365 + 3319 + 0 + 0 + + + 51 + 360 + 3318 + 0 + 0 + + + 143 + 347 + 3317 + 6 + 0 + + + 217 + 344 + 3317 + 5 + 0 + + + 143 + 344 + 3314 + 0 + 0 + + + 145 + 350 + 3326 + 2 + 0 + + + 51 + 346 + 3325 + 2 + 0 + + + 143 + 344 + 3320 + 4 + 0 + + + 145 + 350 + 3332 + 2 + 0 + + + 51 + 346 + 3330 + 2 + 0 + + + 145 + 346 + 3343 + 2 + 0 + + + 51 + 344 + 3342 + 2 + 0 + + + 143 + 341 + 3317 + 2 + 0 + + + 145 + 346 + 3346 + 2 + 0 + + + 51 + 344 + 3347 + 2 + 0 + + + 51 + 342 + 3355 + 6 + 0 + + + 51 + 340 + 3352 + 2 + 0 + + + 51 + 338 + 3358 + 2 + 0 + + + 51 + 351 + 3356 + 6 + 0 + + + 215 + 350 + 3353 + 6 + 0 + + + 51 + 345 + 3357 + 2 + 0 + + + 299 + 332 + 3367 + 6 + 0 + + + 46 + 332 + 3366 + 6 + 0 + + + 51 + 330 + 3361 + 0 + 0 + + + 51 + 340 + 3365 + 4 + 0 + + + 51 + 340 + 3363 + 0 + 0 + + + 51 + 337 + 3366 + 2 + 0 + + + 45 + 349 + 3367 + 6 + 0 + + + 45 + 349 + 3366 + 6 + 0 + + + 45 + 349 + 3365 + 6 + 0 + + + 45 + 349 + 3364 + 6 + 0 + + + 51 + 327 + 3361 + 0 + 0 + + + 299 + 325 + 3367 + 6 + 0 + + + 46 + 325 + 3366 + 4 + 0 + + + 51 + 325 + 3364 + 2 + 0 + + + 51 + 327 + 3374 + 4 + 0 + + + 51 + 325 + 3371 + 2 + 0 + + + 46 + 325 + 3369 + 6 + 0 + + + 46 + 332 + 3369 + 6 + 0 + + + 51 + 330 + 3374 + 4 + 0 + + + 277 + 341 + 3372 + 0 + 0 + + + 51 + 341 + 3371 + 2 + 0 + + + 51 + 337 + 3369 + 2 + 0 + + + 45 + 349 + 3368 + 6 + 0 + + + 51 + 342 + 3381 + 2 + 0 + + + 51 + 342 + 3377 + 2 + 0 + + + 51 + 351 + 3379 + 4 + 0 + + + 277 + 349 + 3376 + 0 + 0 + + + 51 + 346 + 3379 + 4 + 0 + + + 51 + 357 + 3378 + 4 + 0 + + + 277 + 353 + 3377 + 0 + 0 + + + 51 + 342 + 3385 + 6 + 0 + + + 22 + 340 + 3391 + 0 + 0 + + + 51 + 340 + 3389 + 2 + 0 + + + 51 + 340 + 3386 + 2 + 0 + + + 55 + 351 + 3391 + 2 + 0 + + + 272 + 350 + 3390 + 0 + 0 + + + 55 + 349 + 3389 + 1 + 0 + + + 55 + 347 + 3389 + 6 + 0 + + + 272 + 345 + 3389 + 0 + 0 + + + 272 + 344 + 3389 + 0 + 0 + + + 55 + 342 + 3395 + 3 + 0 + + + 22 + 340 + 3392 + 0 + 0 + + + 51 + 353 + 3399 + 6 + 0 + + + 51 + 353 + 3394 + 6 + 0 + + + 51 + 350 + 3405 + 6 + 0 + + + 51 + 348 + 3405 + 2 + 0 + + + 51 + 344 + 3400 + 2 + 0 + + + 15 + 341 + 3414 + 6 + 0 + + + 51 + 341 + 3412 + 2 + 0 + + + 51 + 355 + 3412 + 6 + 0 + + + 15 + 354 + 3414 + 2 + 0 + + + 1 + 345 + 3414 + 1 + 1 + + + 1 + 352 + 3414 + 1 + 1 + + + 281 + 341 + 3421 + 0 + 0 + + + 15 + 341 + 3419 + 6 + 0 + + + 51 + 341 + 3417 + 2 + 0 + + + 273 + 350 + 3416 + 6 + 0 + + + 63 + 348 + 3421 + 2 + 0 + + + 273 + 346 + 3416 + 6 + 0 + + + 281 + 355 + 3421 + 0 + 0 + + + 51 + 355 + 3417 + 6 + 0 + + + 15 + 354 + 3419 + 2 + 0 + + + 279 + 361 + 3422 + 4 + 0 + + + 1 + 345 + 3420 + 1 + 1 + + + 1 + 352 + 3420 + 1 + 1 + + + 25 + 342 + 3431 + 0 + 0 + + + 25 + 342 + 3428 + 0 + 0 + + + 9 + 342 + 3424 + 0 + 0 + + + 9 + 351 + 3424 + 0 + 0 + + + 25 + 354 + 3431 + 0 + 0 + + + 25 + 354 + 3428 + 0 + 0 + + + 279 + 361 + 3430 + 0 + 0 + + + 83 + 360 + 3428 + 0 + 1 + + + 83 + 360 + 3425 + 0 + 1 + + + 143 + 343 + 3436 + 4 + 0 + + + 25 + 342 + 3434 + 0 + 0 + + + 143 + 351 + 3436 + 4 + 0 + + + 10 + 349 + 3435 + 2 + 0 + + + 10 + 348 + 3435 + 2 + 0 + + + 10 + 347 + 3435 + 2 + 0 + + + 143 + 345 + 3436 + 4 + 0 + + + 25 + 354 + 3434 + 0 + 0 + + + 143 + 353 + 3436 + 4 + 0 + + + 143 + 407 + 3344 + 0 + 0 + + + 51 + 407 + 3340 + 4 + 0 + + + 205 + 406 + 3338 + 4 + 0 + + + 205 + 404 + 3338 + 4 + 0 + + + 51 + 412 + 3340 + 4 + 0 + + + 5 + 412 + 3339 + 0 + 0 + + + 277 + 410 + 3339 + 4 + 0 + + + 143 + 413 + 3349 + 6 + 0 + + + 143 + 413 + 3347 + 6 + 0 + + + 143 + 411 + 3351 + 4 + 0 + + + 143 + 410 + 3344 + 0 + 0 + + + 143 + 408 + 3351 + 4 + 0 + + + 51 + 413 + 3373 + 0 + 0 + + + 277 + 399 + 3331 + 0 + 0 + + + 277 + 396 + 3331 + 0 + 0 + + + 277 + 393 + 3331 + 0 + 0 + + + 51 + 407 + 3333 + 0 + 0 + + + 277 + 401 + 3334 + 0 + 0 + + + 51 + 412 + 3333 + 0 + 0 + + + 205 + 410 + 3335 + 4 + 0 + + + 51 + 409 + 3333 + 0 + 0 + + + 301 + 421 + 3336 + 0 + 0 + + + 45 + 100 + 1431 + 2 + 0 + + + 45 + 100 + 1430 + 2 + 0 + + + 45 + 100 + 1429 + 2 + 0 + + + 45 + 100 + 1428 + 2 + 0 + + + 45 + 99 + 1431 + 4 + 0 + + + 45 + 98 + 1431 + 4 + 0 + + + 45 + 97 + 1431 + 4 + 0 + + + 45 + 100 + 1437 + 2 + 0 + + + 45 + 100 + 1436 + 2 + 0 + + + 45 + 100 + 1435 + 2 + 0 + + + 45 + 100 + 1434 + 2 + 0 + + + 45 + 99 + 1437 + 4 + 0 + + + 45 + 99 + 1434 + 0 + 0 + + + 45 + 98 + 1437 + 4 + 0 + + + 45 + 97 + 1437 + 4 + 0 + + + 44 + 97 + 1434 + 4 + 0 + + + 15 + 104 + 1419 + 2 + 0 + + + 6 + 104 + 1417 + 0 + 0 + + + 6 + 581 + 1465 + 6 + 0 + + + 6 + 584 + 1467 + 4 + 0 + + + 340 + 614 + 3399 + 0 + 0 + + + 51 + 610 + 3399 + 2 + 0 + + + 51 + 610 + 3396 + 2 + 0 + + + 340 + 614 + 3401 + 0 + 0 + + + 5 + 618 + 3383 + 4 + 0 + + + 51 + 619 + 3389 + 6 + 0 + + + 51 + 619 + 3385 + 6 + 0 + + + 51 + 617 + 3385 + 2 + 0 + + + 51 + 619 + 3392 + 6 + 0 + + + 51 + 618 + 3399 + 6 + 0 + + + 51 + 618 + 3396 + 6 + 0 + + + 3 + 279 + 1599 + 6 + 0 + + + 3 + 278 + 1599 + 6 + 0 + + + 45 + 277 + 1603 + 2 + 0 + + + 45 + 277 + 1602 + 2 + 0 + + + 6 + 276 + 1603 + 2 + 0 + + + 15 + 273 + 1602 + 0 + 0 + + + 34 + 40 + 559 + 6 + 0 + + + 283 + 40 + 555 + 0 + 0 + + + 1064 + 42 + 565 + 6 + 0 + + + 283 + 42 + 562 + 2 + 0 + + + 284 + 41 + 562 + 0 + 0 + + + 34 + 41 + 561 + 0 + 0 + + + 284 + 40 + 562 + 0 + 0 + + + 34 + 40 + 561 + 2 + 0 + + + 283 + 42 + 573 + 2 + 0 + + + 284 + 42 + 572 + 2 + 0 + + + 284 + 42 + 571 + 2 + 0 + + + 284 + 42 + 570 + 2 + 0 + + + 284 + 42 + 569 + 2 + 0 + + + 284 + 41 + 573 + 0 + 0 + + + 283 + 40 + 569 + 3 + 0 + + + 34 + 54 + 562 + 7 + 0 + + + 0 + 53 + 561 + 7 + 0 + + + 0 + 51 + 567 + 7 + 0 + + + 1 + 51 + 565 + 0 + 0 + + + 37 + 50 + 563 + 7 + 0 + + + 20 + 55 + 575 + 0 + 0 + + + 34 + 55 + 568 + 7 + 0 + + + 20 + 52 + 575 + 0 + 0 + + + 1 + 51 + 569 + 0 + 0 + + + 20 + 49 + 575 + 0 + 0 + + + 32 + 55 + 585 + 0 + 0 + + + 34 + 50 + 589 + 0 + 0 + + + 34 + 60 + 561 + 7 + 0 + + + 34 + 58 + 561 + 7 + 0 + + + 0 + 57 + 564 + 7 + 0 + + + 1089 + 59 + 573 + 0 + 0 + + + 1 + 59 + 569 + 0 + 0 + + + 20 + 58 + 575 + 0 + 0 + + + 37 + 68 + 563 + 7 + 0 + + + 1 + 68 + 560 + 0 + 0 + + + 34 + 67 + 567 + 7 + 0 + + + 34 + 66 + 565 + 7 + 0 + + + 0 + 64 + 563 + 0 + 0 + + + 20 + 70 + 575 + 0 + 0 + + + 20 + 67 + 575 + 0 + 0 + + + 34 + 67 + 574 + 4 + 0 + + + 20 + 64 + 575 + 0 + 0 + + + 34 + 64 + 574 + 4 + 0 + + + 102 + 68 + 586 + 0 + 0 + + + 195 + 68 + 585 + 0 + 0 + + + 34 + 79 + 560 + 7 + 0 + + + 1 + 78 + 564 + 7 + 0 + + + 1 + 75 + 562 + 7 + 0 + + + 20 + 73 + 575 + 0 + 0 + + + 98 + 72 + 581 + 0 + 0 + + + 98 + 74 + 587 + 0 + 0 + + + 283 + 38 + 555 + 0 + 0 + + + 37 + 38 + 553 + 0 + 0 + + + 283 + 37 + 558 + 2 + 0 + + + 309 + 37 + 553 + 0 + 0 + + + 37 + 36 + 554 + 0 + 0 + + + 283 + 35 + 559 + 2 + 0 + + + 283 + 35 + 554 + 0 + 0 + + + 283 + 35 + 552 + 0 + 0 + + + 283 + 32 + 553 + 0 + 0 + + + 283 + 39 + 566 + 5 + 0 + + + 284 + 39 + 562 + 0 + 0 + + + 283 + 39 + 560 + 2 + 0 + + + 284 + 38 + 562 + 0 + 0 + + + 34 + 38 + 561 + 1 + 0 + + + 284 + 37 + 562 + 0 + 0 + + + 283 + 37 + 561 + 2 + 0 + + + 34 + 37 + 560 + 2 + 0 + + + 284 + 36 + 562 + 0 + 0 + + + 284 + 35 + 562 + 0 + 0 + + + 34 + 35 + 561 + 6 + 0 + + + 284 + 34 + 562 + 0 + 0 + + + 284 + 33 + 562 + 0 + 0 + + + 284 + 32 + 562 + 0 + 0 + + + 283 + 32 + 561 + 2 + 0 + + + 284 + 39 + 573 + 0 + 0 + + + 284 + 38 + 573 + 0 + 0 + + + 34 + 38 + 571 + 5 + 0 + + + 0 + 38 + 568 + 7 + 0 + + + 284 + 37 + 573 + 0 + 0 + + + 284 + 36 + 573 + 0 + 0 + + + 34 + 36 + 569 + 3 + 0 + + + 284 + 35 + 573 + 0 + 0 + + + 284 + 34 + 573 + 0 + 0 + + + 283 + 34 + 571 + 7 + 0 + + + 283 + 34 + 568 + 0 + 0 + + + 284 + 33 + 573 + 0 + 0 + + + 284 + 32 + 573 + 0 + 0 + + + 34 + 32 + 570 + 7 + 0 + + + 1 + 36 + 551 + 0 + 0 + + + 34 + 32 + 544 + 0 + 0 + + + 1056 + 31 + 543 + 5 + 0 + + + 1072 + 31 + 542 + 0 + 0 + + + 1044 + 31 + 538 + 2 + 0 + + + 1044 + 30 + 540 + 2 + 0 + + + 404 + 28 + 541 + 4 + 0 + + + 1044 + 27 + 542 + 0 + 0 + + + 404 + 27 + 541 + 6 + 0 + + + 1044 + 26 + 542 + 2 + 0 + + + 402 + 25 + 543 + 6 + 0 + + + 401 + 24 + 542 + 6 + 0 + + + 34 + 24 + 537 + 0 + 0 + + + 1050 + 24 + 536 + 6 + 0 + + + 34 + 30 + 545 + 0 + 0 + + + 1072 + 30 + 544 + 0 + 0 + + + 34 + 29 + 550 + 6 + 0 + + + 34 + 29 + 544 + 0 + 0 + + + 34 + 28 + 550 + 7 + 0 + + + 34 + 26 + 544 + 0 + 0 + + + 34 + 25 + 550 + 0 + 0 + + + 34 + 25 + 547 + 0 + 0 + + + 37 + 24 + 547 + 0 + 0 + + + 1044 + 24 + 545 + 0 + 0 + + + 34 + 29 + 553 + 5 + 0 + + + 34 + 27 + 554 + 2 + 0 + + + 33 + 27 + 553 + 5 + 0 + + + 284 + 31 + 562 + 0 + 0 + + + 284 + 30 + 562 + 0 + 0 + + + 285 + 29 + 566 + 2 + 0 + + + 284 + 29 + 562 + 0 + 0 + + + 285 + 28 + 567 + 2 + 0 + + + 285 + 28 + 565 + 2 + 0 + + + 284 + 28 + 562 + 0 + 0 + + + 285 + 27 + 566 + 2 + 0 + + + 284 + 27 + 562 + 0 + 0 + + + 284 + 26 + 562 + 0 + 0 + + + 284 + 25 + 562 + 0 + 0 + + + 283 + 24 + 563 + 0 + 0 + + + 284 + 24 + 562 + 0 + 0 + + + 284 + 31 + 573 + 0 + 0 + + + 283 + 31 + 570 + 2 + 0 + + + 145 + 30 + 573 + 2 + 0 + + + 145 + 30 + 572 + 2 + 0 + + + 145 + 30 + 571 + 2 + 0 + + + 145 + 30 + 570 + 2 + 0 + + + 283 + 30 + 569 + 2 + 0 + + + 17 + 29 + 573 + 0 + 0 + + + 71 + 29 + 570 + 6 + 0 + + + 283 + 28 + 574 + 0 + 0 + + + 17 + 28 + 573 + 0 + 0 + + + 182 + 28 + 571 + 6 + 0 + + + 17 + 27 + 573 + 0 + 0 + + + 182 + 27 + 571 + 6 + 0 + + + 283 + 26 + 574 + 0 + 0 + + + 17 + 26 + 573 + 0 + 0 + + + 283 + 25 + 574 + 0 + 0 + + + 17 + 25 + 573 + 0 + 0 + + + 283 + 24 + 574 + 0 + 0 + + + 25 + 24 + 573 + 6 + 0 + + + 283 + 24 + 569 + 0 + 0 + + + 34 + 34 + 540 + 0 + 0 + + + 1072 + 34 + 538 + 0 + 0 + + + 1042 + 34 + 536 + 0 + 0 + + + 1056 + 33 + 540 + 5 + 0 + + + 34 + 32 + 543 + 0 + 0 + + + 1073 + 32 + 541 + 0 + 0 + + + 1044 + 32 + 537 + 0 + 0 + + + 1 + 24 + 566 + 1 + 1 + + + 1 + 27 + 570 + 0 + 1 + + + 402 + 23 + 543 + 6 + 0 + + + 1042 + 23 + 537 + 0 + 0 + + + 1042 + 22 + 538 + 0 + 0 + + + 1042 + 21 + 538 + 0 + 0 + + + 1075 + 20 + 538 + 0 + 0 + + + 1042 + 20 + 537 + 0 + 0 + + + 1082 + 19 + 540 + 0 + 0 + + + 1082 + 19 + 539 + 0 + 0 + + + 1075 + 19 + 538 + 0 + 0 + + + 1075 + 19 + 537 + 0 + 0 + + + 1050 + 19 + 536 + 6 + 0 + + + 1082 + 18 + 540 + 0 + 0 + + + 1075 + 18 + 538 + 1 + 0 + + + 34 + 17 + 542 + 0 + 0 + + + 21 + 16 + 542 + 4 + 0 + + + 21 + 16 + 540 + 4 + 0 + + + 21 + 16 + 538 + 4 + 0 + + + 37 + 23 + 548 + 0 + 0 + + + 402 + 23 + 544 + 6 + 0 + + + 34 + 22 + 550 + 0 + 0 + + + 34 + 22 + 548 + 0 + 0 + + + 1044 + 22 + 546 + 0 + 0 + + + 37 + 21 + 549 + 0 + 0 + + + 402 + 21 + 545 + 6 + 0 + + + 402 + 20 + 550 + 6 + 0 + + + 37 + 20 + 549 + 0 + 0 + + + 402 + 20 + 548 + 6 + 0 + + + 1044 + 20 + 547 + 0 + 0 + + + 1 + 20 + 546 + 1 + 0 + + + 1072 + 19 + 551 + 7 + 0 + + + 37 + 19 + 550 + 0 + 0 + + + 1 + 19 + 549 + 1 + 0 + + + 402 + 19 + 548 + 6 + 0 + + + 1044 + 19 + 547 + 2 + 0 + + + 34 + 18 + 551 + 0 + 0 + + + 402 + 18 + 550 + 6 + 0 + + + 1044 + 18 + 549 + 2 + 0 + + + 402 + 17 + 551 + 6 + 0 + + + 402 + 17 + 550 + 6 + 0 + + + 402 + 17 + 547 + 6 + 0 + + + 1044 + 16 + 551 + 0 + 0 + + + 1072 + 16 + 549 + 5 + 0 + + + 34 + 21 + 559 + 0 + 0 + + + 402 + 19 + 552 + 6 + 0 + + + 0 + 18 + 559 + 0 + 0 + + + 402 + 18 + 553 + 6 + 0 + + + 37 + 17 + 553 + 0 + 0 + + + 1072 + 17 + 552 + 1 + 0 + + + 37 + 16 + 554 + 0 + 0 + + + 1072 + 16 + 553 + 2 + 0 + + + 71 + 23 + 567 + 4 + 0 + + + 7 + 23 + 565 + 2 + 0 + + + 7 + 23 + 564 + 2 + 0 + + + 284 + 23 + 562 + 0 + 0 + + + 3 + 22 + 564 + 2 + 0 + + + 7 + 22 + 563 + 4 + 0 + + + 284 + 22 + 562 + 0 + 0 + + + 278 + 21 + 566 + 6 + 0 + + + 3 + 21 + 564 + 2 + 0 + + + 7 + 21 + 563 + 4 + 0 + + + 284 + 21 + 562 + 0 + 0 + + + 34 + 21 + 560 + 0 + 0 + + + 27 + 20 + 563 + 0 + 0 + + + 284 + 20 + 562 + 0 + 0 + + + 29 + 19 + 565 + 2 + 0 + + + 29 + 19 + 563 + 2 + 0 + + + 284 + 19 + 562 + 0 + 0 + + + 34 + 19 + 561 + 0 + 0 + + + 1 + 19 + 560 + 0 + 0 + + + 284 + 18 + 562 + 0 + 0 + + + 71 + 17 + 563 + 6 + 0 + + + 284 + 17 + 562 + 0 + 0 + + + 1 + 17 + 560 + 0 + 0 + + + 284 + 16 + 562 + 0 + 0 + + + 1078 + 23 + 569 + 4 + 0 + + + 283 + 22 + 574 + 0 + 0 + + + 179 + 22 + 573 + 0 + 0 + + + 278 + 21 + 569 + 6 + 0 + + + 47 + 19 + 573 + 2 + 0 + + + 47 + 19 + 571 + 2 + 0 + + + 278 + 19 + 568 + 6 + 0 + + + 283 + 18 + 574 + 0 + 0 + + + 1090 + 17 + 573 + 2 + 0 + + + 47 + 17 + 571 + 2 + 0 + + + 1104 + 17 + 570 + 6 + 0 + + + 1104 + 17 + 569 + 6 + 0 + + + 24 + 17 + 568 + 2 + 0 + + + 3 + 15 + 541 + 0 + 0 + + + 21 + 14 + 538 + 4 + 0 + + + 3 + 13 + 541 + 0 + 0 + + + 21 + 12 + 538 + 7 + 0 + + + 97 + 11 + 536 + 3 + 0 + + + 21 + 10 + 542 + 2 + 0 + + + 1085 + 10 + 541 + 6 + 0 + + + 21 + 10 + 540 + 0 + 0 + + + 97 + 10 + 536 + 4 + 0 + + + 8 + 8 + 540 + 6 + 0 + + + 8 + 8 + 539 + 4 + 0 + + + 1042 + 14 + 551 + 0 + 0 + + + 283 + 12 + 546 + 1 + 0 + + + 0 + 11 + 547 + 7 + 0 + + + 1058 + 9 + 550 + 2 + 0 + + + 1058 + 9 + 546 + 7 + 0 + + + 1058 + 9 + 545 + 0 + 0 + + + 98 + 8 + 551 + 5 + 0 + + + 98 + 8 + 549 + 0 + 0 + + + 1058 + 8 + 544 + 0 + 0 + + + 34 + 15 + 555 + 0 + 0 + + + 1042 + 15 + 553 + 0 + 0 + + + 1042 + 15 + 552 + 0 + 0 + + + 1042 + 14 + 554 + 0 + 0 + + + 1072 + 14 + 552 + 4 + 0 + + + 1042 + 13 + 555 + 0 + 0 + + + 1042 + 13 + 553 + 0 + 0 + + + 0 + 12 + 556 + 1 + 0 + + + 1042 + 12 + 554 + 0 + 0 + + + 34 + 11 + 559 + 7 + 0 + + + 309 + 10 + 556 + 2 + 0 + + + 34 + 9 + 558 + 0 + 0 + + + 34 + 9 + 555 + 7 + 0 + + + 284 + 15 + 567 + 2 + 0 + + + 284 + 15 + 566 + 2 + 0 + + + 284 + 15 + 565 + 2 + 0 + + + 284 + 15 + 564 + 2 + 0 + + + 284 + 15 + 563 + 2 + 0 + + + 284 + 15 + 562 + 0 + 0 + + + 0 + 15 + 561 + 0 + 0 + + + 0 + 14 + 566 + 0 + 0 + + + 283 + 13 + 566 + 4 + 0 + + + 284 + 15 + 574 + 2 + 0 + + + 284 + 15 + 573 + 2 + 0 + + + 284 + 15 + 572 + 2 + 0 + + + 284 + 15 + 571 + 2 + 0 + + + 284 + 15 + 570 + 2 + 0 + + + 284 + 15 + 569 + 2 + 0 + + + 284 + 15 + 568 + 2 + 0 + + + 0 + 14 + 574 + 0 + 0 + + + 0 + 14 + 572 + 6 + 0 + + + 0 + 14 + 571 + 0 + 0 + + + 0 + 14 + 569 + 0 + 0 + + + 0 + 13 + 573 + 5 + 0 + + + 1072 + 13 + 572 + 5 + 0 + + + 283 + 13 + 571 + 4 + 0 + + + 1072 + 13 + 570 + 3 + 0 + + + 1072 + 13 + 569 + 3 + 0 + + + 0 + 12 + 574 + 0 + 0 + + + 0 + 12 + 573 + 4 + 0 + + + 0 + 12 + 570 + 2 + 0 + + + 283 + 12 + 568 + 4 + 0 + + + 0 + 11 + 572 + 0 + 0 + + + 1072 + 10 + 574 + 2 + 0 + + + 1072 + 10 + 573 + 2 + 0 + + + 0 + 10 + 571 + 0 + 0 + + + 1072 + 9 + 572 + 7 + 0 + + + 196 + 9 + 537 + 1 + 1 + + + 1058 + 7 + 551 + 0 + 0 + + + 1058 + 7 + 550 + 6 + 0 + + + 1058 + 7 + 544 + 0 + 0 + + + 1058 + 6 + 544 + 0 + 0 + + + 34 + 4 + 548 + 3 + 0 + + + 34 + 3 + 547 + 5 + 0 + + + 1 + 2 + 549 + 2 + 0 + + + 1 + 1 + 551 + 2 + 0 + + + 283 + 1 + 549 + 2 + 0 + + + 34 + 1 + 547 + 7 + 0 + + + 34 + 0 + 546 + 4 + 0 + + + 1058 + 7 + 553 + 7 + 0 + + + 1058 + 6 + 554 + 0 + 0 + + + 98 + 6 + 553 + 4 + 0 + + + 1058 + 6 + 552 + 4 + 0 + + + 34 + 3 + 556 + 3 + 0 + + + 286 + 2 + 553 + 2 + 0 + + + 283 + 1 + 557 + 2 + 0 + + + 34 + 6 + 566 + 5 + 0 + + + 1072 + 6 + 565 + 7 + 0 + + + 34 + 5 + 565 + 3 + 0 + + + 34 + 5 + 561 + 7 + 0 + + + 1 + 4 + 566 + 2 + 0 + + + 0 + 3 + 563 + 1 + 0 + + + 1 + 2 + 564 + 2 + 0 + + + 0 + 2 + 560 + 0 + 0 + + + 34 + 1 + 567 + 7 + 0 + + + 0 + 7 + 574 + 0 + 0 + + + 1182 + 7 + 537 + 5 + 0 + + + 1058 + 5 + 543 + 0 + 0 + + + 34 + 5 + 537 + 1 + 0 + + + 34 + 5 + 536 + 0 + 0 + + + 1058 + 4 + 542 + 5 + 0 + + + 34 + 4 + 538 + 6 + 0 + + + 283 + 4 + 536 + 1 + 0 + + + 34 + 3 + 540 + 2 + 0 + + + 283 + 3 + 539 + 1 + 0 + + + 34 + 3 + 538 + 6 + 0 + + + 98 + 3 + 537 + 6 + 0 + + + 34 + 3 + 536 + 4 + 0 + + + 98 + 2 + 540 + 4 + 0 + + + 34 + 2 + 539 + 0 + 0 + + + 98 + 2 + 538 + 7 + 0 + + + 34 + 2 + 537 + 6 + 0 + + + 98 + 1 + 539 + 7 + 0 + + + 98 + 1 + 538 + 3 + 0 + + + 1058 + 0 + 540 + 6 + 0 + + + 98 + 0 + 539 + 7 + 0 + + + 283 + 0 + 536 + 1 + 0 + + + 1067 + 15 + 528 + 4 + 0 + + + 1052 + 14 + 534 + 0 + 0 + + + 34 + 13 + 534 + 0 + 0 + + + 1044 + 13 + 533 + 0 + 0 + + + 1060 + 13 + 528 + 4 + 0 + + + 1044 + 10 + 531 + 2 + 0 + + + 1044 + 10 + 528 + 2 + 0 + + + 34 + 8 + 533 + 0 + 0 + + + 1046 + 8 + 532 + 0 + 0 + + + 1046 + 8 + 530 + 0 + 0 + + + 1046 + 8 + 528 + 0 + 0 + + + 34 + 23 + 532 + 5 + 0 + + + 34 + 22 + 531 + 4 + 0 + + + 1 + 19 + 534 + 7 + 0 + + + 1042 + 18 + 535 + 0 + 0 + + + 1042 + 18 + 534 + 0 + 0 + + + 1066 + 17 + 528 + 6 + 0 + + + 1052 + 16 + 534 + 0 + 0 + + + 1044 + 16 + 533 + 0 + 0 + + + 1065 + 16 + 528 + 5 + 0 + + + 1044 + 31 + 531 + 2 + 0 + + + 1044 + 31 + 528 + 2 + 0 + + + 1056 + 29 + 531 + 5 + 0 + + + 34 + 29 + 530 + 0 + 0 + + + 1044 + 28 + 533 + 0 + 0 + + + 34 + 28 + 531 + 0 + 0 + + + 34 + 28 + 530 + 0 + 0 + + + 1066 + 27 + 528 + 5 + 0 + + + 1075 + 26 + 534 + 2 + 0 + + + 1042 + 25 + 535 + 0 + 0 + + + 1042 + 25 + 534 + 0 + 0 + + + 1050 + 25 + 533 + 6 + 0 + + + 1067 + 25 + 528 + 3 + 0 + + + 1060 + 24 + 528 + 4 + 0 + + + 1044 + 38 + 534 + 0 + 0 + + + 34 + 37 + 530 + 0 + 0 + + + 34 + 36 + 531 + 0 + 0 + + + 34 + 36 + 530 + 0 + 0 + + + 1044 + 35 + 535 + 0 + 0 + + + 34 + 34 + 531 + 0 + 0 + + + 1042 + 43 + 531 + 0 + 0 + + + 1042 + 42 + 532 + 0 + 0 + + + 1042 + 42 + 531 + 0 + 0 + + + 1042 + 42 + 530 + 0 + 0 + + + 1042 + 41 + 533 + 0 + 0 + + + 1042 + 41 + 531 + 0 + 0 + + + 1042 + 41 + 530 + 0 + 0 + + + 1042 + 41 + 529 + 0 + 0 + + + 1042 + 41 + 528 + 0 + 0 + + + 34 + 7 + 533 + 0 + 0 + + + 34 + 6 + 535 + 7 + 0 + + + 0 + 6 + 534 + 7 + 0 + + + 1046 + 6 + 532 + 0 + 0 + + + 1046 + 6 + 530 + 0 + 0 + + + 1046 + 6 + 528 + 0 + 0 + + + 34 + 4 + 534 + 6 + 0 + + + 283 + 4 + 531 + 1 + 0 + + + 402 + 4 + 530 + 5 + 0 + + + 0 + 3 + 532 + 2 + 0 + + + 34 + 3 + 529 + 6 + 0 + + + 402 + 3 + 528 + 7 + 0 + + + 34 + 2 + 532 + 0 + 0 + + + 402 + 2 + 530 + 2 + 0 + + + 402 + 2 + 529 + 4 + 0 + + + 283 + 1 + 534 + 1 + 0 + + + 402 + 1 + 531 + 7 + 0 + + + 283 + 1 + 530 + 5 + 0 + + + 283 + 0 + 534 + 1 + 0 + + + 402 + 0 + 533 + 5 + 0 + + + 283 + 0 + 529 + 1 + 0 + + + 1048 + 23 + 525 + 0 + 0 + + + 1048 + 23 + 524 + 2 + 0 + + + 1048 + 23 + 523 + 2 + 0 + + + 1048 + 23 + 522 + 2 + 0 + + + 1063 + 23 + 521 + 2 + 0 + + + 1061 + 21 + 525 + 4 + 0 + + + 1065 + 21 + 524 + 0 + 0 + + + 1067 + 21 + 523 + 2 + 0 + + + 1066 + 21 + 522 + 2 + 0 + + + 1066 + 21 + 521 + 2 + 0 + + + 1067 + 21 + 520 + 2 + 0 + + + 1067 + 20 + 525 + 0 + 0 + + + 1065 + 20 + 524 + 0 + 0 + + + 1067 + 20 + 522 + 2 + 0 + + + 1065 + 20 + 521 + 0 + 0 + + + 1066 + 20 + 520 + 2 + 0 + + + 1066 + 19 + 525 + 0 + 0 + + + 1067 + 19 + 524 + 2 + 0 + + + 1065 + 19 + 523 + 0 + 0 + + + 1065 + 19 + 522 + 0 + 0 + + + 1065 + 19 + 521 + 2 + 0 + + + 1067 + 17 + 527 + 4 + 0 + + + 1067 + 17 + 526 + 0 + 0 + + + 1048 + 17 + 525 + 0 + 0 + + + 1048 + 17 + 524 + 6 + 0 + + + 1048 + 17 + 523 + 6 + 0 + + + 1048 + 17 + 522 + 6 + 0 + + + 1061 + 17 + 521 + 6 + 0 + + + 1067 + 16 + 526 + 0 + 0 + + + 1048 + 16 + 525 + 0 + 0 + + + 1067 + 16 + 523 + 0 + 0 + + + 1066 + 16 + 521 + 0 + 0 + + + 1065 + 16 + 520 + 0 + 0 + + + 1044 + 31 + 525 + 2 + 0 + + + 1044 + 31 + 522 + 2 + 0 + + + 1048 + 28 + 525 + 0 + 0 + + + 1048 + 28 + 524 + 6 + 0 + + + 1048 + 28 + 523 + 6 + 0 + + + 1063 + 28 + 522 + 6 + 0 + + + 1048 + 28 + 520 + 6 + 0 + + + 1067 + 27 + 527 + 2 + 0 + + + 1048 + 27 + 525 + 0 + 0 + + + 1066 + 27 + 524 + 0 + 0 + + + 1065 + 27 + 523 + 0 + 0 + + + 1066 + 27 + 522 + 2 + 0 + + + 1067 + 27 + 521 + 2 + 0 + + + 1067 + 27 + 520 + 2 + 0 + + + 1067 + 26 + 527 + 2 + 0 + + + 1066 + 26 + 526 + 2 + 0 + + + 1048 + 26 + 525 + 0 + 0 + + + 214 + 26 + 523 + 1 + 0 + + + 1067 + 26 + 522 + 0 + 0 + + + 1067 + 25 + 526 + 0 + 0 + + + 1048 + 25 + 525 + 0 + 0 + + + 1067 + 25 + 524 + 4 + 0 + + + 1065 + 25 + 523 + 4 + 0 + + + 1049 + 25 + 521 + 2 + 0 + + + 1065 + 24 + 527 + 4 + 0 + + + 1067 + 24 + 526 + 5 + 0 + + + 1048 + 24 + 525 + 0 + 0 + + + 1065 + 24 + 524 + 4 + 0 + + + 1065 + 24 + 523 + 4 + 0 + + + 1066 + 24 + 522 + 2 + 0 + + + 1067 + 24 + 521 + 2 + 0 + + + 1067 + 24 + 520 + 4 + 0 + + + 1048 + 38 + 527 + 2 + 0 + + + 1048 + 38 + 526 + 2 + 0 + + + 1048 + 38 + 525 + 2 + 0 + + + 1048 + 38 + 524 + 2 + 0 + + + 1048 + 38 + 523 + 2 + 0 + + + 1048 + 38 + 522 + 2 + 0 + + + 1048 + 38 + 521 + 2 + 0 + + + 1048 + 38 + 520 + 2 + 0 + + + 1 + 36 + 527 + 7 + 0 + + + 1046 + 35 + 525 + 0 + 0 + + + 1046 + 33 + 525 + 0 + 0 + + + 1046 + 33 + 523 + 0 + 0 + + + 1046 + 33 + 521 + 0 + 0 + + + 1048 + 43 + 525 + 2 + 0 + + + 1048 + 43 + 524 + 2 + 0 + + + 1048 + 43 + 523 + 2 + 0 + + + 1048 + 43 + 522 + 2 + 0 + + + 1048 + 43 + 521 + 2 + 0 + + + 1048 + 43 + 520 + 2 + 0 + + + 1048 + 41 + 527 + 2 + 0 + + + 1048 + 41 + 526 + 2 + 0 + + + 1048 + 41 + 525 + 2 + 0 + + + 1048 + 41 + 524 + 2 + 0 + + + 1048 + 41 + 523 + 2 + 0 + + + 1048 + 41 + 522 + 2 + 0 + + + 1048 + 41 + 521 + 2 + 0 + + + 1048 + 41 + 520 + 2 + 0 + + + 1044 + 31 + 519 + 2 + 0 + + + 1044 + 31 + 516 + 2 + 0 + + + 1044 + 31 + 513 + 2 + 0 + + + 1048 + 28 + 519 + 6 + 0 + + + 1048 + 28 + 518 + 6 + 0 + + + 1048 + 28 + 517 + 4 + 0 + + + 1048 + 28 + 515 + 6 + 0 + + + 1048 + 28 + 514 + 6 + 0 + + + 1065 + 27 + 519 + 0 + 0 + + + 1048 + 27 + 517 + 4 + 0 + + + 1059 + 27 + 515 + 4 + 0 + + + 1 + 27 + 514 + 7 + 0 + + + 1067 + 26 + 519 + 0 + 0 + + + 1048 + 26 + 517 + 4 + 0 + + + 1059 + 26 + 516 + 6 + 0 + + + 1053 + 26 + 515 + 2 + 0 + + + 1066 + 26 + 514 + 0 + 0 + + + 1044 + 26 + 513 + 0 + 0 + + + 1067 + 25 + 519 + 0 + 0 + + + 1048 + 25 + 517 + 4 + 0 + + + 1065 + 25 + 516 + 6 + 0 + + + 1067 + 25 + 515 + 0 + 0 + + + 1067 + 25 + 514 + 6 + 0 + + + 1066 + 24 + 519 + 0 + 0 + + + 1048 + 24 + 517 + 4 + 0 + + + 1062 + 24 + 515 + 2 + 0 + + + 1048 + 38 + 519 + 2 + 0 + + + 1048 + 38 + 518 + 2 + 0 + + + 1048 + 38 + 517 + 2 + 0 + + + 1048 + 38 + 516 + 2 + 0 + + + 1048 + 38 + 515 + 2 + 0 + + + 1048 + 38 + 514 + 2 + 0 + + + 1048 + 38 + 513 + 2 + 0 + + + 1048 + 38 + 512 + 2 + 0 + + + 1046 + 33 + 519 + 0 + 0 + + + 1046 + 33 + 517 + 0 + 0 + + + 1046 + 33 + 513 + 0 + 0 + + + 34 + 47 + 512 + 2 + 0 + + + 34 + 46 + 513 + 3 + 0 + + + 1048 + 43 + 519 + 2 + 0 + + + 1048 + 43 + 518 + 2 + 0 + + + 1048 + 43 + 517 + 2 + 0 + + + 1048 + 43 + 516 + 2 + 0 + + + 1048 + 43 + 515 + 2 + 0 + + + 1048 + 43 + 514 + 2 + 0 + + + 1048 + 43 + 513 + 2 + 0 + + + 1048 + 43 + 512 + 2 + 0 + + + 1048 + 41 + 519 + 2 + 0 + + + 1048 + 41 + 518 + 2 + 0 + + + 1048 + 41 + 517 + 2 + 0 + + + 1048 + 41 + 516 + 2 + 0 + + + 1048 + 41 + 515 + 2 + 0 + + + 1048 + 41 + 514 + 2 + 0 + + + 1048 + 41 + 513 + 2 + 0 + + + 1048 + 41 + 512 + 2 + 0 + + + 1048 + 38 + 511 + 2 + 0 + + + 1048 + 38 + 510 + 2 + 0 + + + 1048 + 38 + 509 + 2 + 0 + + + 1048 + 38 + 508 + 2 + 0 + + + 1048 + 38 + 507 + 2 + 0 + + + 1048 + 38 + 506 + 2 + 0 + + + 1048 + 38 + 505 + 2 + 0 + + + 1048 + 38 + 504 + 2 + 0 + + + 1046 + 33 + 511 + 0 + 0 + + + 1046 + 33 + 509 + 0 + 0 + + + 1046 + 33 + 507 + 0 + 0 + + + 1046 + 33 + 505 + 0 + 0 + + + 1048 + 32 + 504 + 4 + 0 + + + 1072 + 47 + 511 + 0 + 0 + + + 1 + 47 + 508 + 3 + 0 + + + 34 + 47 + 506 + 3 + 0 + + + 34 + 47 + 505 + 6 + 0 + + + 1072 + 46 + 507 + 0 + 0 + + + 1072 + 45 + 510 + 0 + 0 + + + 34 + 45 + 504 + 7 + 0 + + + 1048 + 43 + 511 + 2 + 0 + + + 1048 + 43 + 510 + 2 + 0 + + + 1048 + 43 + 509 + 2 + 0 + + + 1048 + 43 + 508 + 2 + 0 + + + 1048 + 43 + 507 + 2 + 0 + + + 1048 + 43 + 506 + 2 + 0 + + + 1048 + 43 + 505 + 2 + 0 + + + 1048 + 43 + 504 + 2 + 0 + + + 1048 + 41 + 511 + 2 + 0 + + + 1048 + 41 + 510 + 2 + 0 + + + 1048 + 41 + 509 + 2 + 0 + + + 1048 + 41 + 508 + 2 + 0 + + + 1048 + 41 + 507 + 2 + 0 + + + 1048 + 41 + 506 + 2 + 0 + + + 1048 + 41 + 505 + 2 + 0 + + + 1048 + 41 + 504 + 2 + 0 + + + 1 + 55 + 509 + 1 + 0 + + + 283 + 51 + 507 + 5 + 0 + + + 283 + 51 + 505 + 5 + 0 + + + 1 + 50 + 511 + 1 + 0 + + + 34 + 49 + 510 + 6 + 0 + + + 34 + 49 + 507 + 1 + 0 + + + 283 + 49 + 505 + 3 + 0 + + + 34 + 48 + 511 + 7 + 0 + + + 283 + 48 + 509 + 5 + 0 + + + 34 + 48 + 506 + 2 + 0 + + + 1048 + 39 + 499 + 4 + 0 + + + 1048 + 39 + 496 + 0 + 0 + + + 1048 + 38 + 503 + 2 + 0 + + + 1048 + 38 + 499 + 4 + 0 + + + 1048 + 38 + 496 + 0 + 0 + + + 1048 + 37 + 502 + 4 + 0 + + + 1048 + 37 + 499 + 4 + 0 + + + 1048 + 37 + 496 + 0 + 0 + + + 1048 + 36 + 502 + 4 + 0 + + + 1048 + 36 + 499 + 4 + 0 + + + 1048 + 36 + 496 + 0 + 0 + + + 1048 + 35 + 502 + 4 + 0 + + + 1048 + 35 + 499 + 4 + 0 + + + 1048 + 35 + 496 + 0 + 0 + + + 1048 + 34 + 502 + 4 + 0 + + + 1048 + 34 + 499 + 4 + 0 + + + 1048 + 34 + 496 + 0 + 0 + + + 1048 + 33 + 502 + 4 + 0 + + + 1048 + 33 + 499 + 4 + 0 + + + 1048 + 33 + 496 + 0 + 0 + + + 1048 + 32 + 502 + 4 + 0 + + + 1048 + 32 + 499 + 4 + 0 + + + 1048 + 32 + 496 + 0 + 0 + + + 34 + 47 + 502 + 0 + 0 + + + 1048 + 43 + 503 + 2 + 0 + + + 1048 + 43 + 502 + 2 + 0 + + + 1048 + 43 + 501 + 2 + 0 + + + 1048 + 43 + 500 + 2 + 0 + + + 1048 + 43 + 499 + 2 + 0 + + + 1048 + 43 + 498 + 2 + 0 + + + 1048 + 43 + 497 + 2 + 0 + + + 1048 + 43 + 496 + 2 + 0 + + + 1048 + 42 + 496 + 0 + 0 + + + 1048 + 41 + 503 + 2 + 0 + + + 1048 + 41 + 502 + 2 + 0 + + + 1048 + 41 + 501 + 2 + 0 + + + 1048 + 41 + 500 + 2 + 0 + + + 1048 + 41 + 496 + 0 + 0 + + + 34 + 40 + 500 + 3 + 0 + + + 1048 + 40 + 499 + 4 + 0 + + + 1048 + 40 + 496 + 0 + 0 + + + 34 + 53 + 497 + 1 + 0 + + + 34 + 50 + 503 + 5 + 0 + + + 1042 + 38 + 493 + 2 + 0 + + + 1042 + 35 + 492 + 3 + 0 + + + 38 + 55 + 492 + 1 + 0 + + + 1 + 53 + 495 + 1 + 0 + + + 1 + 53 + 494 + 1 + 0 + + + 1 + 51 + 491 + 1 + 0 + + + 34 + 39 + 487 + 2 + 0 + + + 1 + 39 + 485 + 7 + 0 + + + 34 + 39 + 483 + 1 + 0 + + + 0 + 38 + 486 + 1 + 0 + + + 34 + 37 + 486 + 1 + 0 + + + 0 + 37 + 485 + 1 + 0 + + + 34 + 37 + 483 + 0 + 0 + + + 34 + 36 + 484 + 0 + 0 + + + 1056 + 35 + 486 + 5 + 0 + + + 1072 + 35 + 483 + 0 + 0 + + + 34 + 34 + 485 + 4 + 0 + + + 1072 + 42 + 487 + 0 + 0 + + + 34 + 41 + 485 + 4 + 0 + + + 34 + 40 + 486 + 6 + 0 + + + 306 + 40 + 485 + 2 + 0 + + + 1 + 54 + 486 + 1 + 0 + + + 1 + 51 + 474 + 1 + 0 + + + 34 + 31 + 485 + 7 + 0 + + + 1042 + 28 + 484 + 2 + 0 + + + 1042 + 25 + 486 + 2 + 0 + + + 0 + 24 + 487 + 1 + 0 + + + 1042 + 24 + 485 + 2 + 0 + + + 1048 + 31 + 502 + 4 + 0 + + + 1048 + 31 + 499 + 4 + 0 + + + 1048 + 31 + 496 + 0 + 0 + + + 1048 + 30 + 502 + 4 + 0 + + + 1048 + 30 + 499 + 4 + 0 + + + 1048 + 30 + 496 + 0 + 0 + + + 1048 + 29 + 502 + 4 + 0 + + + 1048 + 29 + 499 + 4 + 0 + + + 1048 + 29 + 496 + 0 + 0 + + + 1048 + 28 + 502 + 4 + 0 + + + 1048 + 28 + 499 + 4 + 0 + + + 1048 + 28 + 496 + 0 + 0 + + + 1048 + 27 + 502 + 4 + 0 + + + 1048 + 27 + 499 + 4 + 0 + + + 1048 + 27 + 496 + 0 + 0 + + + 1048 + 26 + 502 + 4 + 0 + + + 1048 + 26 + 499 + 4 + 0 + + + 1048 + 26 + 496 + 0 + 0 + + + 1048 + 25 + 502 + 4 + 0 + + + 1048 + 25 + 499 + 4 + 0 + + + 1048 + 25 + 496 + 0 + 0 + + + 1048 + 24 + 502 + 4 + 0 + + + 1048 + 24 + 499 + 4 + 0 + + + 1048 + 24 + 496 + 0 + 0 + + + 1044 + 31 + 510 + 2 + 0 + + + 1044 + 31 + 507 + 2 + 0 + + + 1048 + 31 + 504 + 4 + 0 + + + 1048 + 30 + 504 + 4 + 0 + + + 34 + 29 + 505 + 2 + 0 + + + 1048 + 29 + 504 + 4 + 0 + + + 1048 + 28 + 510 + 0 + 0 + + + 1048 + 28 + 509 + 6 + 0 + + + 1048 + 28 + 508 + 6 + 0 + + + 1048 + 28 + 507 + 6 + 0 + + + 1048 + 28 + 506 + 6 + 0 + + + 1048 + 28 + 505 + 6 + 0 + + + 1048 + 28 + 504 + 4 + 0 + + + 1048 + 27 + 510 + 0 + 0 + + + 1065 + 27 + 508 + 2 + 0 + + + 1066 + 27 + 506 + 2 + 0 + + + 1065 + 27 + 505 + 0 + 0 + + + 1048 + 27 + 504 + 4 + 0 + + + 1048 + 26 + 510 + 0 + 0 + + + 1065 + 26 + 508 + 4 + 0 + + + 1065 + 26 + 507 + 4 + 0 + + + 1066 + 26 + 506 + 4 + 0 + + + 1065 + 26 + 505 + 0 + 0 + + + 1048 + 26 + 504 + 4 + 0 + + + 1048 + 25 + 510 + 0 + 0 + + + 1059 + 25 + 508 + 2 + 0 + + + 1065 + 25 + 507 + 4 + 0 + + + 1048 + 25 + 504 + 4 + 0 + + + 1065 + 24 + 508 + 4 + 0 + + + 1065 + 24 + 507 + 2 + 0 + + + 1067 + 24 + 506 + 4 + 0 + + + 1059 + 24 + 505 + 0 + 0 + + + 1048 + 24 + 504 + 4 + 0 + + + 1042 + 22 + 483 + 2 + 0 + + + 1042 + 21 + 486 + 2 + 0 + + + 1042 + 21 + 484 + 2 + 0 + + + 1072 + 19 + 485 + 0 + 0 + + + 37 + 18 + 483 + 1 + 0 + + + 1 + 17 + 486 + 1 + 0 + + + 1072 + 16 + 486 + 7 + 0 + + + 0 + 18 + 495 + 7 + 0 + + + 1048 + 17 + 495 + 6 + 0 + + + 1048 + 17 + 494 + 6 + 0 + + + 1048 + 17 + 493 + 6 + 0 + + + 1048 + 17 + 492 + 4 + 0 + + + 1048 + 16 + 492 + 4 + 0 + + + 1048 + 23 + 502 + 4 + 0 + + + 1048 + 23 + 499 + 4 + 0 + + + 1048 + 23 + 496 + 0 + 0 + + + 1048 + 22 + 502 + 4 + 0 + + + 1048 + 22 + 499 + 4 + 0 + + + 1048 + 22 + 496 + 0 + 0 + + + 1048 + 21 + 502 + 4 + 0 + + + 1048 + 21 + 496 + 0 + 0 + + + 1048 + 20 + 502 + 4 + 0 + + + 1048 + 20 + 496 + 0 + 0 + + + 1048 + 19 + 502 + 6 + 0 + + + 1048 + 19 + 501 + 6 + 0 + + + 1048 + 19 + 500 + 6 + 0 + + + 1048 + 19 + 499 + 6 + 0 + + + 1048 + 19 + 498 + 6 + 0 + + + 1048 + 19 + 497 + 6 + 0 + + + 1048 + 19 + 496 + 6 + 0 + + + 1048 + 17 + 503 + 6 + 0 + + + 1048 + 17 + 502 + 6 + 0 + + + 1048 + 17 + 501 + 6 + 0 + + + 1048 + 17 + 500 + 6 + 0 + + + 1048 + 17 + 499 + 6 + 0 + + + 1048 + 17 + 498 + 6 + 0 + + + 1048 + 17 + 497 + 6 + 0 + + + 1048 + 17 + 496 + 6 + 0 + + + 1048 + 16 + 503 + 4 + 0 + + + 1075 + 16 + 502 + 2 + 0 + + + 1075 + 16 + 501 + 6 + 0 + + + 1062 + 23 + 509 + 4 + 0 + + + 1066 + 23 + 508 + 4 + 0 + + + 1065 + 23 + 506 + 4 + 0 + + + 1066 + 23 + 505 + 2 + 0 + + + 1048 + 23 + 504 + 4 + 0 + + + 1048 + 22 + 510 + 0 + 0 + + + 1067 + 22 + 507 + 0 + 0 + + + 1067 + 22 + 506 + 4 + 0 + + + 1048 + 22 + 504 + 4 + 0 + + + 0 + 21 + 511 + 7 + 0 + + + 1048 + 21 + 510 + 0 + 0 + + + 1067 + 21 + 508 + 4 + 0 + + + 1065 + 21 + 507 + 0 + 0 + + + 1067 + 21 + 505 + 2 + 0 + + + 1048 + 21 + 504 + 4 + 0 + + + 1048 + 20 + 510 + 0 + 0 + + + 1059 + 20 + 508 + 3 + 0 + + + 1066 + 20 + 507 + 0 + 0 + + + 1067 + 20 + 506 + 0 + 0 + + + 1067 + 20 + 505 + 0 + 0 + + + 1048 + 20 + 504 + 4 + 0 + + + 1044 + 19 + 511 + 2 + 0 + + + 1048 + 19 + 510 + 0 + 0 + + + 1048 + 19 + 509 + 2 + 0 + + + 1048 + 19 + 508 + 2 + 0 + + + 1048 + 19 + 507 + 2 + 0 + + + 1048 + 19 + 506 + 2 + 0 + + + 1048 + 19 + 505 + 2 + 0 + + + 1048 + 19 + 504 + 4 + 0 + + + 0 + 18 + 505 + 3 + 0 + + + 1048 + 18 + 504 + 4 + 0 + + + 1048 + 17 + 504 + 6 + 0 + + + 1044 + 16 + 511 + 0 + 0 + + + 1048 + 16 + 508 + 6 + 0 + + + 1048 + 16 + 507 + 6 + 0 + + + 1048 + 16 + 506 + 6 + 0 + + + 1048 + 16 + 505 + 6 + 0 + + + 1048 + 16 + 504 + 6 + 0 + + + 1 + 15 + 481 + 1 + 0 + + + 0 + 14 + 487 + 1 + 0 + + + 38 + 14 + 485 + 1 + 0 + + + 37 + 13 + 485 + 1 + 0 + + + 1072 + 13 + 484 + 7 + 0 + + + 34 + 12 + 486 + 1 + 0 + + + 0 + 12 + 484 + 1 + 0 + + + 37 + 12 + 482 + 1 + 0 + + + 1 + 10 + 485 + 1 + 0 + + + 0 + 9 + 486 + 1 + 0 + + + 34 + 9 + 484 + 1 + 0 + + + 1042 + 15 + 495 + 6 + 0 + + + 1048 + 15 + 492 + 4 + 0 + + + 217 + 14 + 495 + 1 + 0 + + + 1050 + 14 + 494 + 6 + 0 + + + 1048 + 14 + 492 + 4 + 0 + + + 1065 + 13 + 495 + 2 + 0 + + + 1042 + 13 + 494 + 6 + 0 + + + 1048 + 13 + 492 + 4 + 0 + + + 1065 + 12 + 495 + 2 + 0 + + + 1042 + 12 + 494 + 6 + 0 + + + 1048 + 12 + 492 + 4 + 0 + + + 1042 + 11 + 495 + 6 + 0 + + + 1042 + 11 + 494 + 6 + 0 + + + 1048 + 11 + 492 + 4 + 0 + + + 34 + 10 + 495 + 3 + 0 + + + 1048 + 10 + 492 + 4 + 0 + + + 34 + 9 + 493 + 5 + 0 + + + 1048 + 9 + 492 + 4 + 0 + + + 34 + 8 + 493 + 5 + 0 + + + 1048 + 8 + 492 + 4 + 0 + + + 1048 + 15 + 503 + 4 + 0 + + + 1076 + 15 + 502 + 0 + 0 + + + 1042 + 15 + 499 + 6 + 0 + + + 1042 + 15 + 498 + 6 + 0 + + + 1042 + 15 + 497 + 6 + 0 + + + 1042 + 15 + 496 + 6 + 0 + + + 1048 + 14 + 503 + 4 + 0 + + + 1075 + 14 + 502 + 3 + 0 + + + 1048 + 14 + 500 + 0 + 0 + + + 1051 + 14 + 498 + 2 + 0 + + + 1067 + 14 + 497 + 0 + 0 + + + 1065 + 14 + 496 + 0 + 0 + + + 1048 + 13 + 503 + 4 + 0 + + + 1048 + 13 + 500 + 0 + 0 + + + 1067 + 13 + 498 + 0 + 0 + + + 1066 + 13 + 497 + 4 + 0 + + + 1066 + 13 + 496 + 2 + 0 + + + 1057 + 12 + 497 + 4 + 0 + + + 1063 + 11 + 499 + 4 + 0 + + + 1066 + 11 + 497 + 2 + 0 + + + 1066 + 11 + 496 + 2 + 0 + + + 1048 + 10 + 500 + 0 + 0 + + + 1067 + 10 + 498 + 0 + 0 + + + 1067 + 10 + 497 + 0 + 0 + + + 1050 + 10 + 496 + 6 + 0 + + + 34 + 9 + 503 + 7 + 0 + + + 1051 + 9 + 500 + 0 + 0 + + + 1042 + 9 + 499 + 6 + 0 + + + 1042 + 9 + 498 + 6 + 0 + + + 1042 + 9 + 497 + 6 + 0 + + + 1042 + 9 + 496 + 6 + 0 + + + 286 + 8 + 502 + 4 + 0 + + + 1066 + 15 + 508 + 0 + 0 + + + 1065 + 15 + 507 + 0 + 0 + + + 1067 + 15 + 506 + 0 + 0 + + + 1059 + 15 + 505 + 6 + 0 + + + 1065 + 15 + 504 + 0 + 0 + + + 1062 + 14 + 508 + 4 + 0 + + + 1059 + 14 + 507 + 1 + 0 + + + 1066 + 14 + 506 + 0 + 0 + + + 1095 + 14 + 504 + 4 + 0 + + + 1044 + 13 + 511 + 0 + 0 + + + 1048 + 13 + 508 + 2 + 0 + + + 1048 + 13 + 507 + 2 + 0 + + + 1048 + 13 + 506 + 2 + 0 + + + 1048 + 13 + 505 + 2 + 0 + + + 1048 + 13 + 504 + 2 + 0 + + + 402 + 12 + 504 + 3 + 0 + + + 1042 + 11 + 511 + 0 + 0 + + + 34 + 11 + 510 + 0 + 0 + + + 34 + 11 + 509 + 4 + 0 + + + 1 + 11 + 508 + 2 + 0 + + + 1044 + 10 + 510 + 2 + 0 + + + 34 + 10 + 508 + 2 + 0 + + + 1044 + 10 + 507 + 2 + 0 + + + 1 + 9 + 504 + 3 + 0 + + + 0 + 6 + 483 + 1 + 0 + + + 34 + 4 + 487 + 1 + 0 + + + 34 + 3 + 486 + 1 + 0 + + + 37 + 3 + 484 + 1 + 0 + + + 1072 + 3 + 480 + 5 + 0 + + + 1072 + 2 + 481 + 7 + 0 + + + 1048 + 7 + 495 + 2 + 0 + + + 1048 + 7 + 494 + 2 + 0 + + + 1048 + 7 + 493 + 2 + 0 + + + 1048 + 7 + 492 + 4 + 0 + + + 34 + 0 + 492 + 1 + 0 + + + 1048 + 7 + 503 + 2 + 0 + + + 1048 + 7 + 502 + 2 + 0 + + + 1048 + 7 + 501 + 2 + 0 + + + 1048 + 7 + 500 + 2 + 0 + + + 1048 + 7 + 499 + 2 + 0 + + + 1048 + 7 + 498 + 2 + 0 + + + 1048 + 7 + 497 + 2 + 0 + + + 1048 + 7 + 496 + 2 + 0 + + + 285 + 2 + 501 + 2 + 0 + + + 34 + 1 + 496 + 1 + 0 + + + 34 + 0 + 503 + 2 + 0 + + + 1044 + 7 + 510 + 2 + 0 + + + 1044 + 7 + 507 + 2 + 0 + + + 1044 + 7 + 504 + 2 + 0 + + + 34 + 4 + 507 + 2 + 0 + + + 285 + 4 + 506 + 2 + 0 + + + 285 + 3 + 510 + 2 + 0 + + + 34 + 3 + 504 + 2 + 0 + + + 1072 + 2 + 510 + 5 + 0 + + + 34 + 2 + 507 + 4 + 0 + + + 34 + 2 + 506 + 2 + 0 + + + 308 + 1 + 508 + 2 + 0 + + + 34 + 1 + 506 + 0 + 0 + + + 34 + 1 + 505 + 7 + 0 + + + 34 + 0 + 510 + 2 + 0 + + + 1044 + 7 + 519 + 2 + 0 + + + 1044 + 7 + 516 + 2 + 0 + + + 1044 + 7 + 513 + 2 + 0 + + + 1072 + 2 + 514 + 3 + 0 + + + 285 + 2 + 512 + 2 + 0 + + + 1072 + 1 + 517 + 1 + 0 + + + 285 + 1 + 514 + 2 + 0 + + + 285 + 0 + 512 + 2 + 0 + + + 1066 + 15 + 519 + 4 + 0 + + + 214 + 15 + 518 + 5 + 0 + + + 1066 + 15 + 517 + 4 + 0 + + + 1048 + 15 + 515 + 4 + 0 + + + 1065 + 14 + 518 + 4 + 0 + + + 1048 + 14 + 515 + 4 + 0 + + + 1061 + 13 + 519 + 2 + 0 + + + 1048 + 13 + 518 + 2 + 0 + + + 1048 + 13 + 517 + 2 + 0 + + + 1048 + 13 + 516 + 2 + 0 + + + 1048 + 13 + 515 + 4 + 0 + + + 402 + 11 + 517 + 0 + 0 + + + 1044 + 10 + 519 + 2 + 0 + + + 1044 + 10 + 516 + 2 + 0 + + + 1044 + 10 + 513 + 2 + 0 + + + 1048 + 23 + 519 + 2 + 0 + + + 1048 + 23 + 518 + 2 + 0 + + + 1048 + 23 + 517 + 4 + 0 + + + 1059 + 23 + 515 + 1 + 0 + + + 1044 + 23 + 513 + 0 + 0 + + + 1067 + 21 + 519 + 0 + 0 + + + 1066 + 21 + 517 + 2 + 0 + + + 1065 + 20 + 519 + 0 + 0 + + + 1059 + 20 + 518 + 4 + 0 + + + 1065 + 20 + 517 + 2 + 0 + + + 1044 + 20 + 513 + 0 + 0 + + + 1065 + 19 + 519 + 4 + 0 + + + 1066 + 19 + 518 + 2 + 0 + + + 1061 + 19 + 517 + 0 + 0 + + + 34 + 18 + 512 + 0 + 0 + + + 1048 + 17 + 519 + 6 + 0 + + + 1048 + 17 + 518 + 6 + 0 + + + 1048 + 17 + 517 + 6 + 0 + + + 1048 + 17 + 516 + 6 + 0 + + + 1048 + 17 + 515 + 4 + 0 + + + 1067 + 16 + 519 + 4 + 0 + + + 1067 + 16 + 517 + 2 + 0 + + + 1048 + 16 + 515 + 4 + 0 + + + 1044 + 7 + 525 + 2 + 0 + + + 1044 + 7 + 522 + 2 + 0 + + + 1072 + 2 + 520 + 3 + 0 + + + 1072 + 1 + 523 + 7 + 0 + + + 1066 + 15 + 527 + 2 + 0 + + + 1066 + 15 + 526 + 2 + 0 + + + 1048 + 15 + 525 + 0 + 0 + + + 1067 + 15 + 523 + 4 + 0 + + + 1066 + 15 + 522 + 2 + 0 + + + 215 + 15 + 521 + 5 + 0 + + + 1065 + 15 + 520 + 2 + 0 + + + 1067 + 14 + 527 + 0 + 0 + + + 1048 + 14 + 525 + 0 + 0 + + + 1067 + 14 + 523 + 2 + 0 + + + 1066 + 14 + 521 + 4 + 0 + + + 1067 + 14 + 520 + 2 + 0 + + + 1065 + 13 + 527 + 0 + 0 + + + 1065 + 13 + 526 + 2 + 0 + + + 1048 + 13 + 525 + 0 + 0 + + + 1048 + 13 + 524 + 2 + 0 + + + 1048 + 13 + 523 + 2 + 0 + + + 1048 + 13 + 522 + 2 + 0 + + + 1048 + 13 + 521 + 2 + 0 + + + 1044 + 10 + 525 + 2 + 0 + + + 1044 + 10 + 522 + 2 + 0 + + + 55 + 7 + 3373 + 0 + 0 + + + 22 + 6 + 3375 + 0 + 0 + + + 55 + 6 + 3374 + 2 + 0 + + + 34 + 5 + 3375 + 3 + 0 + + + 34 + 6 + 3378 + 0 + 0 + + + 34 + 5 + 3376 + 0 + 0 + + + 34 + 7 + 3397 + 4 + 0 + + + 195 + 7 + 3396 + 1 + 0 + + + 205 + 6 + 3396 + 2 + 0 + + + 402 + 6 + 3395 + 1 + 0 + + + 402 + 5 + 3399 + 7 + 0 + + + 34 + 5 + 3396 + 2 + 0 + + + 195 + 5 + 3394 + 6 + 0 + + + 34 + 4 + 3399 + 0 + 0 + + + 402 + 4 + 3398 + 2 + 0 + + + 1007 + 1 + 3397 + 0 + 0 + + + 1043 + 7 + 3402 + 5 + 0 + + + 205 + 6 + 3401 + 4 + 0 + + + 34 + 5 + 3400 + 7 + 0 + + + 34 + 10 + 3374 + 0 + 0 + + + 22 + 9 + 3375 + 0 + 0 + + + 34 + 8 + 3373 + 4 + 0 + + + 1042 + 12 + 3382 + 1 + 0 + + + 55 + 11 + 3376 + 5 + 0 + + + 22 + 10 + 3377 + 0 + 0 + + + 22 + 10 + 3376 + 0 + 0 + + + 34 + 8 + 3380 + 5 + 0 + + + 22 + 8 + 3376 + 0 + 0 + + + 1044 + 15 + 3384 + 4 + 0 + + + 1042 + 13 + 3387 + 2 + 0 + + + 1042 + 11 + 3389 + 1 + 0 + + + 1050 + 9 + 3387 + 0 + 0 + + + 1042 + 8 + 3389 + 0 + 0 + + + 1045 + 12 + 3399 + 4 + 0 + + + 1045 + 9 + 3399 + 4 + 0 + + + 402 + 8 + 3399 + 4 + 0 + + + 402 + 8 + 3398 + 4 + 0 + + + 1056 + 14 + 3403 + 2 + 0 + + + 1045 + 12 + 3402 + 4 + 0 + + + 1045 + 12 + 3401 + 4 + 0 + + + 1045 + 12 + 3400 + 4 + 0 + + + 1056 + 9 + 3403 + 2 + 0 + + + 1045 + 9 + 3402 + 4 + 0 + + + 1045 + 9 + 3401 + 0 + 0 + + + 1045 + 9 + 3400 + 4 + 0 + + + 34 + 23 + 3380 + 6 + 0 + + + 34 + 21 + 3378 + 0 + 0 + + + 34 + 19 + 3380 + 1 + 0 + + + 34 + 23 + 3391 + 0 + 0 + + + 34 + 22 + 3384 + 7 + 0 + + + 34 + 20 + 3386 + 5 + 0 + + + 1098 + 19 + 3386 + 0 + 0 + + + 277 + 23 + 3393 + 2 + 0 + + + 34 + 22 + 3392 + 2 + 0 + + + 1007 + 19 + 3397 + 1 + 0 + + + 1007 + 18 + 3397 + 7 + 0 + + + 195 + 18 + 3396 + 7 + 0 + + + 195 + 17 + 3395 + 2 + 0 + + + 1007 + 16 + 3398 + 4 + 0 + + + 1007 + 16 + 3396 + 4 + 0 + + + 1007 + 19 + 3401 + 1 + 0 + + + 1007 + 18 + 3401 + 5 + 0 + + + 205 + 18 + 3400 + 4 + 0 + + + 1007 + 17 + 3400 + 7 + 0 + + + 1043 + 16 + 3402 + 5 + 0 + + + 1075 + 30 + 3391 + 2 + 0 + + + 34 + 30 + 3390 + 5 + 0 + + + 1075 + 29 + 3391 + 1 + 0 + + + 277 + 29 + 3390 + 2 + 0 + + + 205 + 28 + 3389 + 6 + 0 + + + 1150 + 27 + 3388 + 6 + 0 + + + 34 + 27 + 3387 + 4 + 0 + + + 277 + 25 + 3390 + 7 + 0 + + + 1075 + 30 + 3392 + 7 + 0 + + + 1075 + 28 + 3393 + 4 + 0 + + + 1097 + 26 + 3395 + 0 + 0 + + + 277 + 26 + 3393 + 0 + 0 + + + 1075 + 25 + 3394 + 6 + 0 + + + 1075 + 24 + 3394 + 0 + 0 + + + 51 + 415 + 3485 + 4 + 0 + + + 51 + 409 + 3482 + 2 + 0 + + + 214 + 422 + 3484 + 0 + 0 + + + 51 + 422 + 3482 + 6 + 0 + + + 207 + 420 + 3480 + 1 + 0 + + + 51 + 419 + 3485 + 4 + 0 + + + 207 + 418 + 3484 + 3 + 0 + + + 207 + 416 + 3484 + 6 + 0 + + + 59 + 414 + 3480 + 1 + 1 + + + 51 + 409 + 3475 + 2 + 0 + + + 215 + 422 + 3479 + 0 + 0 + + + 51 + 422 + 3477 + 6 + 0 + + + 51 + 419 + 3475 + 0 + 0 + + + 207 + 418 + 3476 + 5 + 0 + + + 51 + 417 + 3475 + 0 + 0 + + + 51 + 417 + 3472 + 4 + 0 + + + 207 + 416 + 3476 + 3 + 0 + + + 51 + 414 + 3464 + 2 + 0 + + + 51 + 413 + 3467 + 2 + 0 + + + 51 + 421 + 3467 + 6 + 0 + + + 51 + 423 + 3462 + 6 + 0 + + + 41 + 419 + 3460 + 4 + 0 + + + 33 + 405 + 613 + 0 + 0 + + + 113 + 407 + 618 + 0 + 0 + + + 33 + 407 + 639 + 0 + 0 + + + 32 + 407 + 633 + 0 + 0 + + + 32 + 405 + 635 + 0 + 0 + + + 234 + 405 + 641 + 0 + 0 + + + 164 + 404 + 640 + 0 + 0 + + + 164 + 403 + 641 + 0 + 0 + + + 111 + 415 + 612 + 0 + 0 + + + 107 + 415 + 610 + 0 + 0 + + + 33 + 411 + 608 + 0 + 0 + + + 33 + 409 + 609 + 0 + 0 + + + 33 + 409 + 608 + 0 + 0 + + + 32 + 415 + 619 + 0 + 0 + + + 113 + 408 + 617 + 0 + 0 + + + 1 + 414 + 637 + 0 + 0 + + + 34 + 412 + 639 + 0 + 0 + + + 1 + 411 + 636 + 0 + 0 + + + 164 + 415 + 641 + 0 + 0 + + + 164 + 412 + 642 + 0 + 0 + + + 164 + 411 + 643 + 0 + 0 + + + 164 + 411 + 641 + 0 + 0 + + + 233 + 410 + 641 + 0 + 0 + + + 111 + 416 + 611 + 0 + 0 + + + 1 + 422 + 616 + 0 + 0 + + + 1 + 418 + 623 + 0 + 0 + + + 1 + 416 + 617 + 0 + 0 + + + 34 + 422 + 630 + 4 + 0 + + + 33 + 422 + 629 + 4 + 0 + + + 45 + 421 + 631 + 0 + 0 + + + 45 + 421 + 630 + 6 + 0 + + + 45 + 421 + 629 + 6 + 0 + + + 45 + 421 + 628 + 6 + 0 + + + 45 + 421 + 627 + 4 + 0 + + + 45 + 420 + 631 + 0 + 0 + + + 32 + 420 + 626 + 4 + 0 + + + 45 + 419 + 631 + 0 + 0 + + + 42 + 419 + 628 + 4 + 0 + + + 45 + 418 + 631 + 0 + 0 + + + 45 + 418 + 630 + 2 + 0 + + + 45 + 418 + 629 + 2 + 0 + + + 45 + 418 + 628 + 2 + 0 + + + 45 + 418 + 627 + 4 + 0 + + + 32 + 417 + 630 + 4 + 0 + + + 32 + 417 + 629 + 4 + 0 + + + 34 + 416 + 628 + 4 + 0 + + + 32 + 416 + 626 + 4 + 0 + + + 34 + 420 + 634 + 4 + 0 + + + 33 + 420 + 632 + 4 + 0 + + + 109 + 418 + 638 + 0 + 0 + + + 109 + 418 + 637 + 0 + 0 + + + 111 + 418 + 636 + 0 + 0 + + + 32 + 418 + 632 + 4 + 0 + + + 33 + 423 + 640 + 0 + 0 + + + 34 + 422 + 644 + 0 + 0 + + + 164 + 417 + 644 + 0 + 0 + + + 1 + 424 + 613 + 0 + 0 + + + 32 + 425 + 618 + 0 + 0 + + + 107 + 430 + 635 + 0 + 0 + + + 107 + 429 + 634 + 0 + 0 + + + 107 + 428 + 634 + 0 + 0 + + + 33 + 428 + 641 + 0 + 0 + + + 34 + 427 + 644 + 0 + 0 + + + 32 + 425 + 645 + 0 + 0 + + + 32 + 414 + 607 + 0 + 0 + + + 6 + 510 + 1451 + 6 + 0 + + + 47 + 512 + 1451 + 4 + 0 + + + 15 + 587 + 1465 + 2 + 0 + + + 3 + 345 + 605 + 0 + 0 + + + 30 + 564 + 469 + 0 + 0 + + + 55 + 279 + 2324 + 0 + 0 + + + 55 + 279 + 2321 + 0 + 0 + + + 25 + 278 + 2325 + 6 + 0 + + + 154 + 278 + 2323 + 0 + 0 + + + 55 + 278 + 2322 + 0 + 0 + + + 55 + 277 + 2324 + 0 + 0 + + + 25 + 275 + 2324 + 6 + 0 + + + 14 + 274 + 2325 + 6 + 0 + + + 14 + 274 + 2321 + 2 + 0 + + + 25 + 273 + 2324 + 6 + 0 + + + 25 + 272 + 2321 + 6 + 0 + + + 143 + 276 + 2335 + 4 + 0 + + + 143 + 276 + 2331 + 0 + 0 + + + 25 + 275 + 2328 + 6 + 0 + + + 143 + 274 + 2335 + 4 + 0 + + + 143 + 274 + 2331 + 0 + 0 + + + 144 + 272 + 2332 + 6 + 0 + + + 6 + 281 + 2332 + 0 + 0 + + + 1 + 272 + 2325 + 0 + 1 + + + 1 + 279 + 2333 + 1 + 1 + + + 1 + 277 + 2329 + 0 + 1 + + + 22 + 281 + 2325 + 0 + 1 + + + 625 + 439 + 3370 + 2 + 0 + + + 5 + 77 + 1641 + 2 + 1 + + + 5 + 77 + 1642 + 1 + 1 + + + 5 + 77 + 1643 + 1 + 1 + + + 5 + 78 + 1641 + 0 + 1 + + + 5 + 79 + 1641 + 0 + 1 + + + 5 + 80 + 1641 + 0 + 1 + + + 7 + 80 + 1643 + 1 + 0 + + + 23 + 79 + 1639 + 4 + 0 + + + 23 + 77 + 1639 + 4 + 0 + + + 29 + 66 + 1642 + 2 + 0 + + + 16 + 66 + 1641 + 0 + 0 + + + 16 + 66 + 1640 + 0 + 0 + + + 1176 + 64 + 1643 + 7 + 0 + + + 274 + 64 + 1641 + 6 + 0 + + + 7 + 67 + 1642 + 2 + 0 + + + 7 + 67 + 1643 + 2 + 0 + + + 22 + 64 + 1639 + 0 + 0 + + + 51 + 532 + 3334 + 2 + 0 + + + 51 + 530 + 3331 + 4 + 0 + + + 217 + 533 + 3338 + 6 + 0 + + + 51 + 532 + 3342 + 2 + 0 + + + 143 + 530 + 3339 + 2 + 0 + + + 143 + 530 + 3337 + 2 + 0 + + + 51 + 535 + 3351 + 6 + 0 + + + 51 + 535 + 3346 + 6 + 0 + + + 5 + 533 + 3348 + 0 + 0 + + + 51 + 531 + 3351 + 2 + 0 + + + 51 + 531 + 3346 + 2 + 0 + + + 51 + 533 + 3353 + 4 + 0 + + + 20 + 541 + 3329 + 6 + 0 + + + 51 + 540 + 3331 + 4 + 0 + + + 51 + 536 + 3331 + 4 + 0 + + + 0 + 537 + 3337 + 1 + 1 + + + 0 + 537 + 3338 + 1 + 1 + + + 51 + 536 + 3339 + 6 + 0 + + + 51 + 542 + 3346 + 0 + 0 + + + 51 + 537 + 3347 + 0 + 0 + + + 51 + 540 + 3352 + 4 + 0 + + + 5 + 549 + 3339 + 0 + 0 + + + 51 + 544 + 3352 + 4 + 0 + + + 2 + 533 + 3335 + 0 + 1 + + + 2 + 533 + 3342 + 0 + 1 + + + 2 + 536 + 3349 + 1 + 1 + + + 2 + 546 + 3328 + 1 + 1 + + + 51 + 533 + 3321 + 6 + 0 + + + 51 + 531 + 3321 + 2 + 0 + + + 51 + 530 + 3324 + 0 + 0 + + + 20 + 541 + 3326 + 4 + 0 + + + 51 + 540 + 3323 + 0 + 0 + + + 51 + 536 + 3323 + 0 + 0 + + + 51 + 554 + 3357 + 4 + 0 + + + 51 + 554 + 3355 + 0 + 0 + + + 51 + 521 + 3377 + 6 + 0 + + + 369 + 534 + 3393 + 6 + 0 + + + 51 + 535 + 3315 + 4 + 0 + + + 51 + 535 + 3313 + 0 + 0 + + + 51 + 533 + 3317 + 6 + 0 + + + 51 + 531 + 3317 + 2 + 0 + + + 51 + 538 + 3315 + 4 + 0 + + + 51 + 538 + 3313 + 0 + 0 + + + 51 + 535 + 3308 + 6 + 0 + + + 277 + 534 + 3307 + 4 + 0 + + + 51 + 534 + 3305 + 0 + 0 + + + 361 + 533 + 3305 + 4 + 0 + + + 277 + 532 + 3305 + 4 + 0 + + + 51 + 531 + 3308 + 2 + 0 + + + 277 + 531 + 3306 + 4 + 0 + + + 51 + 541 + 3304 + 2 + 0 + + + 51 + 548 + 3304 + 6 + 0 + + + 2 + 545 + 3307 + 0 + 1 + + + 51 + 541 + 3300 + 2 + 0 + + + 51 + 541 + 3296 + 2 + 0 + + + 51 + 548 + 3300 + 6 + 0 + + + 51 + 548 + 3296 + 6 + 0 + + + 2 + 546 + 3302 + 0 + 1 + + + 51 + 535 + 3292 + 4 + 0 + + + 51 + 533 + 3289 + 2 + 0 + + + 51 + 539 + 3290 + 6 + 0 + + + 51 + 559 + 3292 + 6 + 0 + + + 51 + 565 + 3315 + 0 + 0 + + + 51 + 563 + 3319 + 2 + 0 + + + 51 + 563 + 3316 + 2 + 0 + + + 51 + 563 + 3325 + 2 + 0 + + + 51 + 563 + 3322 + 2 + 0 + + + 488 + 567 + 3331 + 0 + 0 + + + 51 + 566 + 3331 + 4 + 0 + + + 1155 + 446 + 3374 + 7 + 0 + + + 3 + 442 + 3372 + 0 + 0 + + + 278 + 441 + 3372 + 0 + 0 + + + 3 + 441 + 3369 + 0 + 0 + + + 3 + 440 + 3371 + 0 + 0 + + + 278 + 440 + 3369 + 0 + 0 + + + 45 + 463 + 1462 + 4 + 0 + + + 45 + 463 + 1459 + 0 + 0 + + + 45 + 462 + 1462 + 4 + 0 + + + 143 + 462 + 1457 + 0 + 0 + + + 45 + 461 + 1462 + 4 + 0 + + + 44 + 461 + 1459 + 4 + 0 + + + 45 + 460 + 1462 + 4 + 0 + + + 45 + 460 + 1459 + 0 + 0 + + + 22 + 460 + 1458 + 6 + 0 + + + 45 + 459 + 1462 + 6 + 0 + + + 45 + 459 + 1461 + 6 + 0 + + + 45 + 459 + 1460 + 6 + 0 + + + 45 + 459 + 1459 + 6 + 0 + + + 22 + 459 + 1458 + 6 + 0 + + + 143 + 458 + 1462 + 2 + 0 + + + 143 + 462 + 1468 + 4 + 0 + + + 43 + 461 + 1464 + 4 + 0 + + + 143 + 458 + 1465 + 2 + 0 + + + 143 + 467 + 1462 + 6 + 0 + + + 45 + 466 + 1463 + 6 + 0 + + + 143 + 466 + 1459 + 6 + 0 + + + 45 + 464 + 1462 + 2 + 0 + + + 45 + 464 + 1461 + 2 + 0 + + + 45 + 464 + 1460 + 2 + 0 + + + 45 + 464 + 1459 + 2 + 0 + + + 6 + 467 + 1464 + 4 + 0 + + + 143 + 466 + 1466 + 6 + 0 + + + 45 + 466 + 1464 + 6 + 0 + + + 25 + 459 + 2407 + 2 + 0 + + + 25 + 459 + 2406 + 2 + 0 + + + 45 + 463 + 2408 + 0 + 0 + + + 44 + 461 + 2408 + 4 + 0 + + + 45 + 460 + 2408 + 0 + 0 + + + 45 + 459 + 2408 + 0 + 0 + + + 25 + 464 + 2407 + 2 + 0 + + + 25 + 464 + 2406 + 2 + 0 + + + 45 + 464 + 2408 + 0 + 0 + + + 51 + 509 + 3423 + 2 + 0 + + + 51 + 509 + 3417 + 2 + 0 + + + 51 + 508 + 3429 + 2 + 0 + + + 51 + 508 + 3426 + 2 + 0 + + + 207 + 505 + 3430 + 7 + 0 + + + 207 + 505 + 3425 + 6 + 0 + + + 315 + 504 + 3424 + 0 + 0 + + + 51 + 509 + 3432 + 2 + 0 + + + 51 + 508 + 3439 + 2 + 0 + + + 51 + 510 + 3445 + 4 + 0 + + + 51 + 508 + 3444 + 2 + 0 + + + 317 + 508 + 3443 + 6 + 0 + + + 51 + 513 + 3417 + 6 + 0 + + + 51 + 512 + 3423 + 6 + 0 + + + 51 + 517 + 3429 + 4 + 0 + + + 51 + 517 + 3427 + 0 + 0 + + + 51 + 515 + 3429 + 4 + 0 + + + 51 + 515 + 3427 + 0 + 0 + + + 51 + 513 + 3439 + 6 + 0 + + + 51 + 512 + 3432 + 6 + 0 + + + 51 + 513 + 3445 + 4 + 0 + + + 46 + 524 + 3436 + 6 + 0 + + + 46 + 524 + 3432 + 6 + 0 + + + 5 + 523 + 3439 + 0 + 0 + + + 46 + 520 + 3436 + 6 + 0 + + + 46 + 520 + 3432 + 6 + 0 + + + 91 + 508 + 3427 + 1 + 1 + + + 88 + 509 + 3441 + 0 + 1 + + + 90 + 512 + 3441 + 0 + 1 + + + 316 + 511 + 3415 + 4 + 0 + + + 318 + 511 + 3410 + 4 + 0 + + + 51 + 509 + 3410 + 0 + 0 + + + 51 + 508 + 3412 + 2 + 0 + + + 51 + 513 + 3412 + 6 + 0 + + + 51 + 512 + 3410 + 0 + 0 + + + 92 + 510 + 3415 + 0 + 1 + + + 51 + 503 + 3431 + 4 + 0 + + + 207 + 503 + 3428 + 0 + 0 + + + 207 + 503 + 3427 + 1 + 0 + + + 51 + 503 + 3424 + 0 + 0 + + + 315 + 502 + 3431 + 0 + 0 + + + 51 + 501 + 3429 + 2 + 0 + + + 315 + 501 + 3427 + 6 + 0 + + + 51 + 501 + 3426 + 2 + 0 + + + 21 + 498 + 613 + 4 + 0 + + + 193 + 496 + 613 + 0 + 0 + + + 21 + 498 + 616 + 0 + 0 + + + 454 + 496 + 618 + 0 + 0 + + + 407 + 487 + 612 + 0 + 0 + + + 99 + 486 + 612 + 3 + 0 + + + 22 + 485 + 615 + 0 + 0 + + + 193 + 485 + 610 + 0 + 0 + + + 3 + 484 + 615 + 0 + 0 + + + 22 + 484 + 613 + 0 + 0 + + + 193 + 484 + 610 + 0 + 0 + + + 194 + 480 + 614 + 0 + 0 + + + 3 + 485 + 618 + 0 + 0 + + + 22 + 485 + 617 + 0 + 0 + + + 22 + 482 + 616 + 0 + 0 + + + 194 + 480 + 617 + 0 + 0 + + + 21 + 495 + 613 + 4 + 0 + + + 193 + 494 + 613 + 0 + 0 + + + 21 + 492 + 613 + 4 + 0 + + + 193 + 491 + 613 + 0 + 0 + + + 193 + 491 + 611 + 0 + 0 + + + 193 + 491 + 610 + 0 + 0 + + + 193 + 489 + 608 + 0 + 0 + + + 99 + 488 + 611 + 3 + 0 + + + 193 + 488 + 608 + 0 + 0 + + + 21 + 495 + 621 + 0 + 0 + + + 458 + 494 + 618 + 2 + 0 + + + 193 + 493 + 621 + 0 + 0 + + + 21 + 492 + 621 + 0 + 0 + + + 21 + 492 + 618 + 4 + 0 + + + 21 + 492 + 616 + 0 + 0 + + + 193 + 491 + 616 + 0 + 0 + + + 193 + 490 + 621 + 0 + 0 + + + 21 + 489 + 621 + 0 + 0 + + + 21 + 489 + 618 + 4 + 0 + + + 21 + 489 + 616 + 0 + 0 + + + 193 + 488 + 618 + 0 + 0 + + + 193 + 488 + 616 + 0 + 0 + + + 455 + 511 + 634 + 5 + 0 + + + 33 + 510 + 637 + 1 + 0 + + + 32 + 509 + 636 + 1 + 0 + + + 33 + 507 + 638 + 1 + 0 + + + 1 + 487 + 615 + 1 + 1 + + + 1 + 487 + 619 + 1 + 1 + + + 1 + 485 + 619 + 1 + 1 + + + 1 + 483 + 617 + 0 + 1 + + + 45 + 487 + 1557 + 4 + 0 + + + 7 + 486 + 1559 + 2 + 0 + + + 3 + 485 + 1559 + 0 + 0 + + + 45 + 487 + 1565 + 0 + 0 + + + 22 + 487 + 1560 + 2 + 0 + + + 45 + 495 + 1557 + 4 + 0 + + + 453 + 493 + 1558 + 4 + 0 + + + 45 + 490 + 1557 + 4 + 0 + + + 45 + 489 + 1557 + 4 + 0 + + + 45 + 488 + 1557 + 4 + 0 + + + 45 + 495 + 1565 + 0 + 0 + + + 45 + 494 + 1565 + 0 + 0 + + + 6 + 494 + 1562 + 2 + 0 + + + 45 + 493 + 1565 + 0 + 0 + + + 45 + 492 + 1565 + 0 + 0 + + + 45 + 492 + 1563 + 0 + 0 + + + 45 + 492 + 1562 + 6 + 0 + + + 45 + 492 + 1561 + 6 + 0 + + + 45 + 491 + 1565 + 0 + 0 + + + 45 + 491 + 1563 + 0 + 0 + + + 45 + 491 + 1562 + 2 + 0 + + + 45 + 491 + 1561 + 2 + 0 + + + 45 + 491 + 1560 + 2 + 0 + + + 45 + 490 + 1565 + 0 + 0 + + + 45 + 489 + 1565 + 0 + 0 + + + 45 + 488 + 1565 + 0 + 0 + + + 45 + 496 + 1559 + 2 + 0 + + + 45 + 496 + 1558 + 2 + 0 + + + 45 + 496 + 1564 + 2 + 0 + + + 45 + 496 + 1563 + 2 + 0 + + + 45 + 496 + 1562 + 2 + 0 + + + 45 + 496 + 1561 + 2 + 0 + + + 45 + 496 + 1560 + 2 + 0 + + + 124 + 487 + 1558 + 1 + 1 + + + 1 + 487 + 1563 + 1 + 1 + + + 1 + 484 + 1561 + 0 + 1 + + + 404 + 414 + 3573 + 4 + 0 + + + 403 + 413 + 3571 + 0 + 0 + + + 401 + 412 + 3575 + 0 + 0 + + + 401 + 411 + 3571 + 0 + 0 + + + 403 + 415 + 3577 + 5 + 0 + + + 404 + 414 + 3576 + 5 + 0 + + + 397 + 413 + 3582 + 0 + 0 + + + 396 + 413 + 3579 + 0 + 0 + + + 34 + 409 + 3578 + 0 + 0 + + + 396 + 413 + 3584 + 0 + 0 + + + 401 + 423 + 3574 + 7 + 0 + + + 404 + 419 + 3574 + 7 + 0 + + + 403 + 422 + 3579 + 5 + 0 + + + 398 + 418 + 3577 + 5 + 0 + + + 401 + 417 + 3577 + 5 + 0 + + + 398 + 416 + 3582 + 0 + 0 + + + 399 + 416 + 3580 + 0 + 0 + + + 399 + 423 + 3587 + 0 + 0 + + + 401 + 423 + 3585 + 0 + 0 + + + 398 + 421 + 3587 + 0 + 0 + + + 397 + 420 + 3589 + 0 + 0 + + + 396 + 419 + 3588 + 0 + 0 + + + 396 + 427 + 3573 + 0 + 0 + + + 404 + 426 + 3573 + 0 + 0 + + + 5 + 426 + 3572 + 0 + 0 + + + 403 + 425 + 3573 + 0 + 0 + + + 396 + 424 + 3571 + 7 + 0 + + + 399 + 426 + 3576 + 7 + 0 + + + 402 + 424 + 3583 + 0 + 0 + + + 404 + 424 + 3579 + 5 + 0 + + + 151 + 411 + 3575 + 2 + 1 + + + 151 + 410 + 3576 + 2 + 1 + + + 151 + 409 + 3577 + 2 + 1 + + + 29 + 394 + 1767 + 0 + 0 + + + 22 + 394 + 1766 + 6 + 0 + + + 22 + 393 + 1767 + 6 + 0 + + + 3 + 399 + 1770 + 0 + 0 + + + 23 + 398 + 1771 + 0 + 0 + + + 3 + 398 + 1770 + 0 + 0 + + + 23 + 398 + 1769 + 4 + 0 + + + 23 + 396 + 1772 + 2 + 0 + + + 6 + 396 + 1770 + 0 + 0 + + + 3 + 395 + 1773 + 0 + 0 + + + 3 + 395 + 1772 + 0 + 0 + + + 776 + 395 + 1770 + 0 + 0 + + + 23 + 394 + 1772 + 6 + 0 + + + 3 + 393 + 1770 + 0 + 0 + + + 23 + 392 + 1771 + 0 + 0 + + + 3 + 392 + 1770 + 0 + 0 + + + 23 + 392 + 1769 + 4 + 0 + + + 6 + 395 + 1782 + 0 + 0 + + + 6 + 608 + 1526 + 0 + 0 + + + 3 + 608 + 1523 + 0 + 0 + + + 45 + 631 + 1511 + 6 + 0 + + + 45 + 631 + 1510 + 6 + 0 + + + 504 + 631 + 1514 + 0 + 0 + + + 22 + 631 + 1513 + 2 + 0 + + + 290 + 629 + 1516 + 0 + 0 + + + 290 + 629 + 1513 + 0 + 0 + + + 290 + 628 + 1513 + 0 + 0 + + + 290 + 627 + 1516 + 0 + 0 + + + 290 + 627 + 1515 + 0 + 0 + + + 505 + 627 + 1514 + 0 + 0 + + + 290 + 627 + 1513 + 0 + 0 + + + 20 + 646 + 589 + 0 + 0 + + + 71 + 645 + 587 + 2 + 0 + + + 273 + 645 + 584 + 2 + 0 + + + 20 + 644 + 589 + 0 + 0 + + + 7 + 644 + 584 + 6 + 0 + + + 205 + 640 + 588 + 2 + 0 + + + 208 + 646 + 596 + 4 + 0 + + + 4 + 643 + 595 + 4 + 0 + + + 5 + 642 + 597 + 0 + 0 + + + 55 + 640 + 598 + 0 + 0 + + + 55 + 640 + 597 + 0 + 0 + + + 80 + 623 + 3410 + 2 + 0 + + + 80 + 623 + 3409 + 2 + 0 + + + 51 + 622 + 3408 + 2 + 0 + + + 433 + 621 + 3409 + 0 + 0 + + + 448 + 620 + 3414 + 6 + 0 + + + 51 + 620 + 3408 + 0 + 0 + + + 51 + 622 + 3420 + 2 + 0 + + + 433 + 621 + 3422 + 0 + 0 + + + 80 + 620 + 3422 + 6 + 0 + + + 80 + 620 + 3421 + 6 + 0 + + + 449 + 636 + 3422 + 2 + 0 + + + 20 + 652 + 589 + 6 + 0 + + + 20 + 650 + 589 + 6 + 0 + + + 366 + 648 + 589 + 4 + 0 + + + 4 + 653 + 596 + 4 + 0 + + + 4 + 652 + 599 + 4 + 0 + + + 1 + 655 + 591 + 1 + 1 + + + 1 + 648 + 588 + 0 + 1 + + + 121 + 648 + 585 + 1 + 1 + + + 13 + 663 + 584 + 6 + 0 + + + 12 + 662 + 587 + 6 + 0 + + + 13 + 661 + 590 + 6 + 0 + + + 13 + 661 + 584 + 6 + 0 + + + 11 + 658 + 591 + 0 + 0 + + + 3 + 658 + 590 + 0 + 0 + + + 42 + 632 + 1510 + 2 + 0 + + + 15 + 634 + 1515 + 2 + 0 + + + 15 + 634 + 1513 + 2 + 0 + + + 42 + 647 + 1509 + 4 + 0 + + + 45 + 646 + 1511 + 6 + 0 + + + 45 + 646 + 1510 + 6 + 0 + + + 45 + 646 + 1509 + 6 + 0 + + + 15 + 643 + 1511 + 6 + 0 + + + 281 + 643 + 1510 + 6 + 0 + + + 15 + 643 + 1508 + 6 + 0 + + + 45 + 646 + 1512 + 6 + 0 + + + 141 + 633 + 1513 + 0 + 1 + + + 209 + 663 + 599 + 6 + 0 + + + 13 + 663 + 597 + 6 + 0 + + + 12 + 663 + 594 + 6 + 0 + + + 12 + 661 + 596 + 6 + 0 + + + 12 + 661 + 592 + 6 + 0 + + + 209 + 660 + 599 + 6 + 0 + + + 13 + 660 + 594 + 6 + 0 + + + 278 + 658 + 594 + 0 + 0 + + + 278 + 657 + 594 + 0 + 0 + + + 456 + 639 + 3440 + 4 + 0 + + + 457 + 637 + 3447 + 2 + 0 + + + 41 + 637 + 3440 + 4 + 0 + + + 290 + 636 + 3440 + 4 + 0 + + + 146 + 635 + 3446 + 0 + 0 + + + 51 + 635 + 3445 + 2 + 0 + + + 55 + 635 + 3443 + 6 + 0 + + + 51 + 635 + 3442 + 2 + 0 + + + 290 + 635 + 3440 + 4 + 0 + + + 146 + 638 + 3450 + 2 + 0 + + + 51 + 640 + 3445 + 6 + 0 + + + 55 + 640 + 3443 + 4 + 0 + + + 51 + 640 + 3442 + 6 + 0 + + + 22 + 640 + 3440 + 4 + 0 + + + 13 + 670 + 586 + 6 + 0 + + + 13 + 668 + 590 + 6 + 0 + + + 12 + 667 + 588 + 6 + 0 + + + 213 + 666 + 585 + 6 + 0 + + + 213 + 664 + 591 + 6 + 0 + + + 13 + 665 + 595 + 6 + 0 + + + 8 + 679 + 586 + 3 + 0 + + + 407 + 678 + 585 + 0 + 0 + + + 407 + 673 + 585 + 0 + 0 + + + 22 + 687 + 589 + 2 + 0 + + + 22 + 687 + 588 + 2 + 0 + + + 22 + 686 + 590 + 0 + 0 + + + 24 + 686 + 587 + 6 + 0 + + + 22 + 685 + 590 + 0 + 0 + + + 29 + 685 + 588 + 0 + 0 + + + 20 + 684 + 588 + 0 + 0 + + + 3 + 683 + 590 + 0 + 0 + + + 23 + 682 + 585 + 0 + 0 + + + 22 + 681 + 587 + 0 + 0 + + + 22 + 681 + 586 + 0 + 0 + + + 3 + 681 + 584 + 0 + 0 + + + 1 + 685 + 586 + 0 + 1 + + + 8 + 688 + 585 + 0 + 0 + + + 88 + 697 + 589 + 0 + 0 + + + 407 + 706 + 585 + 0 + 0 + + + 407 + 717 + 586 + 3 + 0 + + + 407 + 710 + 595 + 2 + 0 + + + 877 + 725 + 588 + 7 + 0 + + + 730 + 723 + 591 + 5 + 0 + + + 877 + 730 + 588 + 7 + 0 + + + 740 + 678 + 3415 + 0 + 0 + + + 739 + 677 + 3414 + 0 + 0 + + + 734 + 678 + 3418 + 5 + 0 + + + 734 + 676 + 3421 + 0 + 0 + + + 832 + 675 + 3422 + 0 + 0 + + + 734 + 675 + 3417 + 6 + 0 + + + 730 + 674 + 3422 + 0 + 0 + + + 730 + 674 + 3418 + 7 + 0 + + + 738 + 674 + 3416 + 0 + 0 + + + 728 + 672 + 3420 + 6 + 0 + + + 745 + 677 + 3424 + 0 + 0 + + + 778 + 675 + 3429 + 0 + 0 + + + 799 + 679 + 3435 + 2 + 0 + + + 797 + 679 + 3434 + 2 + 0 + + + 799 + 678 + 3434 + 2 + 0 + + + 799 + 677 + 3434 + 0 + 0 + + + 741 + 685 + 3410 + 0 + 0 + + + 734 + 682 + 3415 + 0 + 0 + + + 750 + 682 + 3409 + 2 + 0 + + + 754 + 687 + 3423 + 0 + 0 + + + 729 + 686 + 3418 + 0 + 0 + + + 730 + 685 + 3416 + 0 + 0 + + + 729 + 684 + 3422 + 0 + 0 + + + 940 + 684 + 3420 + 0 + 0 + + + 734 + 684 + 3417 + 0 + 0 + + + 734 + 683 + 3422 + 2 + 0 + + + 730 + 682 + 3418 + 0 + 0 + + + 734 + 681 + 3421 + 3 + 0 + + + 730 + 681 + 3417 + 0 + 0 + + + 730 + 680 + 3420 + 4 + 0 + + + 940 + 680 + 3418 + 0 + 0 + + + 753 + 685 + 3430 + 6 + 0 + + + 753 + 684 + 3430 + 2 + 0 + + + 730 + 684 + 3425 + 0 + 0 + + + 734 + 680 + 3424 + 0 + 0 + + + 833 + 684 + 3438 + 0 + 0 + + + 798 + 682 + 3435 + 0 + 0 + + + 798 + 681 + 3435 + 5 + 0 + + + 798 + 681 + 3434 + 0 + 0 + + + 796 + 680 + 3434 + 6 + 0 + + + 743 + 692 + 3412 + 0 + 0 + + + 742 + 688 + 3410 + 0 + 0 + + + 754 + 692 + 3419 + 0 + 0 + + + 754 + 692 + 3417 + 5 + 0 + + + 754 + 691 + 3423 + 6 + 0 + + + 754 + 691 + 3421 + 4 + 0 + + + 754 + 691 + 3420 + 3 + 0 + + + 754 + 691 + 3418 + 0 + 0 + + + 754 + 691 + 3416 + 4 + 0 + + + 754 + 690 + 3422 + 5 + 0 + + + 754 + 690 + 3418 + 6 + 0 + + + 754 + 689 + 3423 + 7 + 0 + + + 754 + 689 + 3421 + 2 + 0 + + + 754 + 689 + 3419 + 0 + 0 + + + 754 + 689 + 3416 + 0 + 0 + + + 754 + 688 + 3420 + 1 + 0 + + + 754 + 688 + 3418 + 7 + 0 + + + 754 + 688 + 3416 + 2 + 0 + + + 747 + 692 + 3429 + 2 + 0 + + + 754 + 692 + 3424 + 7 + 0 + + + 754 + 690 + 3425 + 5 + 0 + + + 754 + 690 + 3424 + 1 + 0 + + + 746 + 689 + 3429 + 4 + 0 + + + 754 + 689 + 3425 + 4 + 0 + + + 754 + 688 + 3425 + 2 + 0 + + + 754 + 688 + 3424 + 1 + 0 + + + 734 + 695 + 3436 + 0 + 0 + + + 734 + 693 + 3438 + 0 + 0 + + + 734 + 693 + 3435 + 0 + 0 + + + 734 + 693 + 3434 + 0 + 0 + + + 729 + 690 + 3439 + 6 + 0 + + + 940 + 688 + 3438 + 0 + 0 + + + 729 + 688 + 3436 + 0 + 0 + + + 732 + 700 + 3415 + 2 + 0 + + + 744 + 696 + 3414 + 0 + 0 + + + 55 + 702 + 3422 + 2 + 0 + + + 97 + 701 + 3420 + 0 + 0 + + + 737 + 701 + 3416 + 0 + 0 + + + 55 + 700 + 3420 + 2 + 0 + + + 55 + 700 + 3419 + 1 + 0 + + + 749 + 699 + 3423 + 2 + 0 + + + 731 + 699 + 3417 + 0 + 0 + + + 940 + 697 + 3420 + 0 + 0 + + + 751 + 696 + 3417 + 0 + 0 + + + 730 + 703 + 3426 + 0 + 0 + + + 729 + 703 + 3425 + 0 + 0 + + + 752 + 701 + 3426 + 4 + 0 + + + 752 + 700 + 3426 + 4 + 0 + + + 748 + 697 + 3426 + 3 + 0 + + + 730 + 705 + 3414 + 0 + 0 + + + 729 + 704 + 3414 + 0 + 0 + + + 729 + 711 + 3422 + 0 + 0 + + + 733 + 711 + 3418 + 0 + 0 + + + 770 + 709 + 3422 + 3 + 0 + + + 736 + 707 + 3420 + 4 + 0 + + + 730 + 706 + 3423 + 0 + 0 + + + 729 + 705 + 3423 + 0 + 0 + + + 736 + 705 + 3420 + 0 + 0 + + + 726 + 704 + 3417 + 2 + 0 + + + 734 + 711 + 3430 + 0 + 0 + + + 729 + 709 + 3429 + 0 + 0 + + + 770 + 706 + 3429 + 0 + 0 + + + 729 + 705 + 3425 + 0 + 0 + + + 730 + 704 + 3424 + 0 + 0 + + + 770 + 718 + 3412 + 0 + 0 + + + 770 + 716 + 3410 + 2 + 0 + + + 940 + 715 + 3412 + 0 + 0 + + + 770 + 714 + 3410 + 0 + 0 + + + 770 + 712 + 3411 + 4 + 0 + + + 795 + 715 + 3418 + 0 + 0 + + + 729 + 714 + 3423 + 0 + 0 + + + 795 + 714 + 3418 + 0 + 0 + + + 734 + 713 + 3421 + 0 + 0 + + + 729 + 714 + 3430 + 0 + 0 + + + 734 + 714 + 3427 + 0 + 0 + + + 97 + 714 + 3426 + 0 + 0 + + + 734 + 712 + 3424 + 0 + 0 + + + 734 + 703 + 3432 + 3 + 0 + + + 734 + 700 + 3435 + 0 + 0 + + + 771 + 698 + 3436 + 0 + 0 + + + 754 + 697 + 3439 + 2 + 0 + + + 730 + 697 + 3438 + 1 + 0 + + + 729 + 697 + 3437 + 4 + 0 + + + 771 + 697 + 3436 + 1 + 0 + + + 771 + 697 + 3435 + 3 + 0 + + + 729 + 696 + 3438 + 0 + 0 + + + 730 + 696 + 3437 + 6 + 0 + + + 772 + 696 + 3435 + 6 + 0 + + + 770 + 711 + 3436 + 0 + 0 + + + 940 + 710 + 3434 + 0 + 0 + + + 729 + 710 + 3432 + 0 + 0 + + + 770 + 709 + 3438 + 2 + 0 + + + 770 + 708 + 3439 + 3 + 0 + + + 734 + 708 + 3432 + 4 + 0 + + + 770 + 707 + 3439 + 0 + 0 + + + 734 + 707 + 3437 + 5 + 0 + + + 729 + 707 + 3434 + 0 + 0 + + + 940 + 706 + 3433 + 0 + 0 + + + 734 + 705 + 3432 + 2 + 0 + + + 734 + 704 + 3438 + 6 + 0 + + + 770 + 714 + 3433 + 0 + 0 + + + 770 + 713 + 3435 + 0 + 0 + + + 734 + 727 + 3410 + 0 + 0 + + + 729 + 726 + 3414 + 2 + 0 + + + 729 + 726 + 3412 + 4 + 0 + + + 734 + 725 + 3412 + 1 + 0 + + + 730 + 725 + 3410 + 1 + 0 + + + 940 + 724 + 3412 + 0 + 0 + + + 97 + 723 + 3415 + 2 + 0 + + + 729 + 723 + 3411 + 3 + 0 + + + 182 + 722 + 3413 + 2 + 0 + + + 734 + 727 + 3418 + 6 + 0 + + + 940 + 727 + 3416 + 0 + 0 + + + 734 + 726 + 3422 + 4 + 0 + + + 729 + 725 + 3419 + 5 + 0 + + + 734 + 725 + 3416 + 5 + 0 + + + 22 + 723 + 3416 + 3 + 0 + + + 182 + 722 + 3417 + 3 + 0 + + + 729 + 727 + 3426 + 0 + 0 + + + 734 + 724 + 3426 + 2 + 0 + + + 734 + 734 + 3413 + 5 + 0 + + + 940 + 732 + 3415 + 0 + 0 + + + 734 + 731 + 3411 + 5 + 0 + + + 734 + 730 + 3415 + 2 + 0 + + + 734 + 728 + 3413 + 6 + 0 + + + 734 + 735 + 3417 + 5 + 0 + + + 734 + 734 + 3422 + 7 + 0 + + + 734 + 732 + 3419 + 0 + 0 + + + 729 + 731 + 3417 + 7 + 0 + + + 734 + 735 + 3430 + 2 + 0 + + + 729 + 735 + 3428 + 3 + 0 + + + 734 + 733 + 3431 + 5 + 0 + + + 729 + 733 + 3429 + 1 + 0 + + + 734 + 732 + 3426 + 2 + 0 + + + 734 + 728 + 3428 + 2 + 0 + + + 828 + 728 + 3438 + 0 + 0 + + + 829 + 728 + 3436 + 0 + 0 + + + 734 + 703 + 3446 + 0 + 0 + + + 734 + 701 + 3440 + 0 + 0 + + + 754 + 699 + 3441 + 2 + 0 + + + 754 + 698 + 3443 + 2 + 0 + + + 754 + 698 + 3442 + 2 + 0 + + + 754 + 698 + 3440 + 2 + 0 + + + 754 + 697 + 3442 + 2 + 0 + + + 754 + 697 + 3441 + 2 + 0 + + + 754 + 696 + 3443 + 2 + 0 + + + 754 + 696 + 3441 + 2 + 0 + + + 754 + 696 + 3440 + 2 + 0 + + + 809 + 711 + 3447 + 2 + 0 + + + 97 + 706 + 3447 + 0 + 0 + + + 812 + 706 + 3440 + 0 + 0 + + + 811 + 715 + 3447 + 2 + 0 + + + 810 + 713 + 3447 + 2 + 0 + + + 814 + 727 + 3447 + 0 + 0 + + + 729 + 726 + 3445 + 2 + 0 + + + 734 + 726 + 3443 + 0 + 0 + + + 730 + 724 + 3446 + 0 + 0 + + + 734 + 731 + 3446 + 0 + 0 + + + 734 + 730 + 3444 + 0 + 0 + + + 730 + 730 + 3442 + 2 + 0 + + + 940 + 729 + 3446 + 0 + 0 + + + 734 + 728 + 3443 + 0 + 0 + + + 825 + 728 + 3440 + 0 + 0 + + + 754 + 695 + 3442 + 2 + 0 + + + 734 + 692 + 3447 + 0 + 0 + + + 729 + 692 + 3440 + 1 + 0 + + + 770 + 691 + 3441 + 0 + 0 + + + 801 + 689 + 3444 + 4 + 0 + + + 782 + 688 + 3447 + 0 + 0 + + + 782 + 688 + 3445 + 0 + 0 + + + 770 + 688 + 3440 + 0 + 0 + + + 806 + 695 + 3449 + 2 + 0 + + + 806 + 695 + 3448 + 2 + 0 + + + 793 + 690 + 3452 + 0 + 0 + + + 802 + 690 + 3449 + 6 + 0 + + + 801 + 689 + 3453 + 0 + 0 + + + 791 + 688 + 3453 + 0 + 0 + + + 782 + 688 + 3451 + 0 + 0 + + + 782 + 688 + 3449 + 0 + 0 + + + 808 + 699 + 3449 + 2 + 0 + + + 808 + 699 + 3448 + 2 + 0 + + + 807 + 697 + 3449 + 2 + 0 + + + 807 + 697 + 3448 + 2 + 0 + + + 809 + 711 + 3448 + 2 + 0 + + + 734 + 707 + 3451 + 0 + 0 + + + 834 + 707 + 3450 + 1 + 0 + + + 813 + 706 + 3453 + 0 + 0 + + + 940 + 704 + 3449 + 0 + 0 + + + 811 + 715 + 3448 + 2 + 0 + + + 810 + 713 + 3448 + 2 + 0 + + + 835 + 727 + 3450 + 0 + 0 + + + 144 + 725 + 3451 + 4 + 0 + + + 729 + 725 + 3449 + 4 + 0 + + + 734 + 723 + 3448 + 0 + 0 + + + 782 + 686 + 3447 + 0 + 0 + + + 782 + 686 + 3445 + 0 + 0 + + + 782 + 684 + 3447 + 0 + 0 + + + 782 + 684 + 3445 + 0 + 0 + + + 785 + 682 + 3447 + 0 + 0 + + + 782 + 682 + 3445 + 0 + 0 + + + 777 + 680 + 3447 + 0 + 0 + + + 782 + 680 + 3445 + 0 + 0 + + + 790 + 686 + 3453 + 0 + 0 + + + 789 + 686 + 3451 + 0 + 0 + + + 788 + 686 + 3449 + 0 + 0 + + + 782 + 684 + 3453 + 0 + 0 + + + 782 + 684 + 3451 + 0 + 0 + + + 787 + 684 + 3449 + 0 + 0 + + + 782 + 682 + 3453 + 0 + 0 + + + 782 + 682 + 3451 + 0 + 0 + + + 786 + 682 + 3449 + 0 + 0 + + + 782 + 680 + 3453 + 0 + 0 + + + 782 + 680 + 3451 + 0 + 0 + + + 782 + 680 + 3449 + 0 + 0 + + + 730 + 687 + 3457 + 1 + 0 + + + 758 + 686 + 3463 + 4 + 0 + + + 729 + 686 + 3461 + 2 + 0 + + + 734 + 686 + 3458 + 7 + 0 + + + 729 + 685 + 3462 + 4 + 0 + + + 730 + 685 + 3460 + 4 + 0 + + + 730 + 684 + 3461 + 4 + 0 + + + 730 + 684 + 3459 + 7 + 0 + + + 730 + 684 + 3457 + 4 + 0 + + + 729 + 683 + 3463 + 0 + 0 + + + 730 + 683 + 3462 + 5 + 0 + + + 729 + 683 + 3458 + 4 + 0 + + + 759 + 682 + 3463 + 6 + 0 + + + 730 + 681 + 3462 + 4 + 0 + + + 940 + 681 + 3461 + 0 + 0 + + + 760 + 681 + 3460 + 0 + 0 + + + 760 + 681 + 3459 + 6 + 0 + + + 729 + 681 + 3458 + 1 + 0 + + + 762 + 680 + 3462 + 0 + 0 + + + 729 + 680 + 3457 + 4 + 0 + + + 755 + 695 + 3462 + 0 + 0 + + + 755 + 694 + 3459 + 6 + 0 + + + 755 + 693 + 3461 + 7 + 0 + + + 730 + 689 + 3463 + 4 + 0 + + + 756 + 689 + 3460 + 1 + 0 + + + 730 + 688 + 3462 + 4 + 0 + + + 757 + 688 + 3461 + 2 + 0 + + + 730 + 688 + 3459 + 4 + 0 + + + 730 + 688 + 3458 + 4 + 0 + + + 792 + 679 + 3446 + 0 + 0 + + + 729 + 679 + 3451 + 0 + 0 + + + 734 + 678 + 3448 + 0 + 0 + + + 730 + 679 + 3463 + 4 + 0 + + + 729 + 679 + 3462 + 5 + 0 + + + 730 + 679 + 3459 + 4 + 0 + + + 729 + 679 + 3458 + 4 + 0 + + + 730 + 678 + 3461 + 4 + 0 + + + 730 + 678 + 3459 + 4 + 0 + + + 729 + 678 + 3458 + 1 + 0 + + + 765 + 677 + 3463 + 2 + 0 + + + 730 + 677 + 3460 + 0 + 0 + + + 730 + 676 + 3462 + 4 + 0 + + + 940 + 676 + 3461 + 0 + 0 + + + 734 + 676 + 3458 + 1 + 0 + + + 730 + 675 + 3463 + 4 + 0 + + + 755 + 674 + 3460 + 4 + 0 + + + 755 + 673 + 3459 + 6 + 0 + + + 767 + 672 + 3462 + 6 + 0 + + + 729 + 679 + 3467 + 7 + 0 + + + 764 + 679 + 3465 + 7 + 0 + + + 763 + 679 + 3464 + 1 + 0 + + + 940 + 678 + 3468 + 0 + 0 + + + 734 + 678 + 3466 + 7 + 0 + + + 730 + 677 + 3469 + 7 + 0 + + + 729 + 677 + 3465 + 4 + 0 + + + 729 + 677 + 3464 + 0 + 0 + + + 729 + 675 + 3468 + 2 + 0 + + + 766 + 675 + 3467 + 4 + 0 + + + 940 + 675 + 3466 + 0 + 0 + + + 729 + 675 + 3465 + 0 + 0 + + + 729 + 675 + 3464 + 4 + 0 + + + 730 + 674 + 3469 + 4 + 0 + + + 755 + 673 + 3467 + 4 + 0 + + + 755 + 673 + 3466 + 4 + 0 + + + 755 + 673 + 3464 + 4 + 0 + + + 755 + 672 + 3468 + 3 + 0 + + + 755 + 672 + 3465 + 2 + 0 + + + 734 + 687 + 3468 + 7 + 0 + + + 729 + 687 + 3464 + 6 + 0 + + + 729 + 686 + 3469 + 4 + 0 + + + 730 + 686 + 3467 + 4 + 0 + + + 729 + 685 + 3466 + 4 + 0 + + + 729 + 684 + 3469 + 4 + 0 + + + 940 + 684 + 3465 + 0 + 0 + + + 734 + 683 + 3467 + 7 + 0 + + + 730 + 683 + 3466 + 4 + 0 + + + 730 + 683 + 3464 + 4 + 0 + + + 729 + 682 + 3469 + 3 + 0 + + + 729 + 681 + 3466 + 0 + 0 + + + 729 + 681 + 3465 + 4 + 0 + + + 729 + 681 + 3464 + 4 + 0 + + + 729 + 680 + 3469 + 0 + 0 + + + 729 + 680 + 3467 + 0 + 0 + + + 755 + 694 + 3465 + 6 + 0 + + + 730 + 689 + 3469 + 6 + 0 + + + 730 + 689 + 3466 + 2 + 0 + + + 730 + 689 + 3464 + 4 + 0 + + + 730 + 688 + 3469 + 4 + 0 + + + 729 + 688 + 3467 + 4 + 0 + + + 940 + 688 + 3465 + 0 + 0 + + + 800 + 710 + 3465 + 0 + 0 + + + 734 + 727 + 3460 + 2 + 0 + + + 734 + 726 + 3463 + 3 + 0 + + + 729 + 726 + 3462 + 0 + 0 + + + 730 + 726 + 3458 + 7 + 0 + + + 868 + 725 + 3463 + 0 + 0 + + + 734 + 724 + 3459 + 5 + 0 + + + 734 + 723 + 3462 + 0 + 0 + + + 841 + 722 + 3461 + 6 + 0 + + + 734 + 726 + 3467 + 2 + 0 + + + 940 + 724 + 3471 + 0 + 0 + + + 734 + 723 + 3469 + 2 + 0 + + + 729 + 721 + 3470 + 2 + 0 + + + 730 + 734 + 3454 + 0 + 0 + + + 730 + 734 + 3452 + 0 + 0 + + + 730 + 730 + 3449 + 2 + 0 + + + 734 + 728 + 3450 + 0 + 0 + + + 729 + 729 + 3462 + 3 + 0 + + + 940 + 729 + 3460 + 0 + 0 + + + 730 + 743 + 3426 + 1 + 0 + + + 730 + 742 + 3430 + 1 + 0 + + + 734 + 741 + 3431 + 4 + 0 + + + 729 + 741 + 3429 + 1 + 0 + + + 734 + 741 + 3427 + 2 + 0 + + + 730 + 741 + 3424 + 1 + 0 + + + 821 + 742 + 3446 + 2 + 0 + + + 820 + 739 + 3446 + 2 + 0 + + + 819 + 736 + 3446 + 2 + 0 + + + 815 + 740 + 3452 + 2 + 0 + + + 818 + 738 + 3452 + 0 + 0 + + + 209 + 737 + 3454 + 4 + 0 + + + 839 + 743 + 3457 + 2 + 0 + + + 734 + 741 + 3461 + 5 + 0 + + + 170 + 738 + 3430 + 1 + 1 + + + 170 + 738 + 3429 + 1 + 1 + + + 734 + 728 + 3468 + 2 + 0 + + + 204 + 743 + 3465 + 0 + 0 + + + 940 + 741 + 3464 + 0 + 0 + + + 730 + 740 + 3465 + 5 + 0 + + + 730 + 747 + 3434 + 1 + 0 + + + 734 + 744 + 3432 + 2 + 0 + + + 824 + 751 + 3446 + 2 + 0 + + + 940 + 749 + 3440 + 0 + 0 + + + 823 + 748 + 3446 + 2 + 0 + + + 822 + 745 + 3446 + 2 + 0 + + + 734 + 751 + 3460 + 3 + 0 + + + 940 + 750 + 3462 + 0 + 0 + + + 22 + 750 + 3458 + 0 + 0 + + + 204 + 748 + 3457 + 0 + 0 + + + 734 + 746 + 3459 + 0 + 0 + + + 290 + 745 + 3457 + 0 + 0 + + + 734 + 744 + 3463 + 2 + 0 + + + 730 + 751 + 3465 + 5 + 0 + + + 290 + 750 + 3467 + 0 + 0 + + + 734 + 749 + 3466 + 0 + 0 + + + 206 + 748 + 3467 + 0 + 0 + + + 840 + 746 + 3470 + 0 + 0 + + + 22 + 744 + 3467 + 0 + 0 + + + 170 + 750 + 3460 + 0 + 1 + + + 167 + 744 + 3460 + 0 + 1 + + + 170 + 750 + 3465 + 0 + 1 + + + 170 + 744 + 3465 + 0 + 1 + + + 816 + 708 + 3472 + 4 + 0 + + + 734 + 727 + 3479 + 6 + 0 + + + 734 + 727 + 3474 + 6 + 0 + + + 734 + 726 + 3478 + 6 + 0 + + + 730 + 725 + 3475 + 6 + 0 + + + 730 + 724 + 3478 + 7 + 0 + + + 729 + 723 + 3479 + 6 + 0 + + + 729 + 723 + 3476 + 6 + 0 + + + 730 + 723 + 3472 + 2 + 0 + + + 856 + 734 + 3479 + 0 + 0 + + + 857 + 734 + 3476 + 0 + 0 + + + 848 + 733 + 3473 + 4 + 0 + + + 847 + 732 + 3478 + 2 + 0 + + + 858 + 732 + 3475 + 0 + 0 + + + 848 + 731 + 3479 + 4 + 0 + + + 848 + 731 + 3477 + 4 + 0 + + + 734 + 731 + 3474 + 0 + 0 + + + 848 + 729 + 3479 + 4 + 0 + + + 848 + 729 + 3477 + 4 + 0 + + + 848 + 729 + 3473 + 4 + 0 + + + 848 + 742 + 3479 + 4 + 0 + + + 734 + 742 + 3478 + 4 + 0 + + + 848 + 742 + 3477 + 4 + 0 + + + 940 + 742 + 3475 + 0 + 0 + + + 848 + 742 + 3473 + 4 + 0 + + + 853 + 740 + 3477 + 0 + 0 + + + 855 + 738 + 3479 + 0 + 0 + + + 846 + 738 + 3476 + 2 + 0 + + + 854 + 738 + 3472 + 0 + 0 + + + 848 + 737 + 3476 + 4 + 0 + + + 848 + 736 + 3474 + 4 + 0 + + + 729 + 751 + 3428 + 1 + 0 + + + 734 + 749 + 3429 + 0 + 0 + + + 729 + 748 + 3430 + 1 + 0 + + + 730 + 748 + 3425 + 1 + 0 + + + 734 + 746 + 3431 + 0 + 0 + + + 734 + 744 + 3428 + 6 + 0 + + + 730 + 754 + 3430 + 6 + 0 + + + 729 + 758 + 3439 + 7 + 0 + + + 729 + 758 + 3436 + 5 + 0 + + + 730 + 756 + 3437 + 2 + 0 + + + 730 + 756 + 3432 + 3 + 0 + + + 940 + 755 + 3434 + 0 + 0 + + + 730 + 753 + 3433 + 5 + 0 + + + 729 + 759 + 3441 + 7 + 0 + + + 170 + 753 + 3430 + 1 + 1 + + + 844 + 751 + 3474 + 2 + 0 + + + 734 + 750 + 3477 + 4 + 0 + + + 849 + 750 + 3476 + 0 + 0 + + + 848 + 749 + 3478 + 4 + 0 + + + 734 + 744 + 3478 + 4 + 0 + + + 848 + 744 + 3476 + 4 + 0 + + + 817 + 715 + 3481 + 4 + 0 + + + 730 + 725 + 3481 + 6 + 0 + + + 734 + 724 + 3482 + 1 + 0 + + + 730 + 722 + 3481 + 5 + 0 + + + 734 + 721 + 3483 + 6 + 0 + + + 848 + 735 + 3483 + 4 + 0 + + + 848 + 733 + 3483 + 4 + 0 + + + 734 + 732 + 3483 + 4 + 0 + + + 848 + 731 + 3483 + 4 + 0 + + + 859 + 731 + 3481 + 0 + 0 + + + 851 + 743 + 3483 + 0 + 0 + + + 734 + 741 + 3484 + 4 + 0 + + + 848 + 741 + 3483 + 4 + 0 + + + 852 + 741 + 3481 + 0 + 0 + + + 845 + 740 + 3484 + 2 + 0 + + + 734 + 740 + 3482 + 4 + 0 + + + 848 + 739 + 3483 + 4 + 0 + + + 848 + 738 + 3481 + 4 + 0 + + + 848 + 737 + 3483 + 4 + 0 + + + 848 + 736 + 3481 + 4 + 0 + + + 848 + 751 + 3482 + 4 + 0 + + + 843 + 751 + 3481 + 2 + 0 + + + 848 + 751 + 3480 + 4 + 0 + + + 848 + 749 + 3484 + 4 + 0 + + + 848 + 749 + 3482 + 4 + 0 + + + 848 + 749 + 3480 + 4 + 0 + + + 848 + 747 + 3482 + 4 + 0 + + + 848 + 747 + 3480 + 4 + 0 + + + 734 + 745 + 3482 + 2 + 0 + + + 850 + 745 + 3480 + 0 + 0 + + + 860 + 744 + 3481 + 0 + 0 + + + 734 + 744 + 3480 + 4 + 0 + + + 730 + 754 + 3476 + 5 + 0 + + + 734 + 759 + 3487 + 6 + 0 + + + 940 + 758 + 3487 + 0 + 0 + + + 734 + 757 + 3486 + 4 + 0 + + + 730 + 764 + 3440 + 0 + 0 + + + 730 + 762 + 3443 + 7 + 0 + + + 729 + 761 + 3441 + 5 + 0 + + + 730 + 765 + 3460 + 5 + 0 + + + 836 + 762 + 3463 + 4 + 0 + + + 730 + 761 + 3458 + 5 + 0 + + + 837 + 764 + 3464 + 4 + 0 + + + 838 + 766 + 3472 + 0 + 0 + + + 940 + 761 + 3478 + 0 + 0 + + + 940 + 761 + 3476 + 0 + 0 + + + 730 + 761 + 3474 + 5 + 0 + + + 714 + 775 + 3443 + 2 + 0 + + + 715 + 774 + 3443 + 2 + 0 + + + 831 + 773 + 3444 + 2 + 0 + + + 713 + 770 + 3443 + 2 + 0 + + + 144 + 768 + 3442 + 2 + 0 + + + 714 + 773 + 3454 + 2 + 0 + + + 713 + 772 + 3454 + 2 + 0 + + + 716 + 771 + 3454 + 2 + 0 + + + 715 + 770 + 3454 + 2 + 0 + + + 714 + 769 + 3454 + 2 + 0 + + + 734 + 775 + 3460 + 2 + 0 + + + 734 + 771 + 3470 + 2 + 0 + + + 734 + 769 + 3470 + 2 + 0 + + + 734 + 775 + 3478 + 2 + 0 + + + 734 + 774 + 3475 + 4 + 0 + + + 831 + 783 + 3446 + 2 + 0 + + + 714 + 782 + 3443 + 0 + 0 + + + 716 + 782 + 3442 + 0 + 0 + + + 734 + 780 + 3442 + 2 + 0 + + + 895 + 777 + 3447 + 0 + 0 + + + 716 + 777 + 3446 + 0 + 0 + + + 715 + 777 + 3445 + 0 + 0 + + + 715 + 777 + 3444 + 0 + 0 + + + 713 + 777 + 3443 + 0 + 0 + + + 713 + 777 + 3442 + 0 + 0 + + + 713 + 777 + 3441 + 0 + 0 + + + 716 + 777 + 3440 + 0 + 0 + + + 713 + 776 + 3443 + 2 + 0 + + + 716 + 783 + 3454 + 2 + 0 + + + 714 + 782 + 3454 + 2 + 0 + + + 713 + 781 + 3454 + 2 + 0 + + + 717 + 777 + 3454 + 7 + 0 + + + 715 + 777 + 3450 + 0 + 0 + + + 734 + 779 + 3461 + 4 + 0 + + + 714 + 777 + 3463 + 0 + 0 + + + 899 + 777 + 3460 + 0 + 0 + + + 714 + 777 + 3459 + 0 + 0 + + + 714 + 777 + 3458 + 0 + 0 + + + 713 + 783 + 3466 + 2 + 0 + + + 713 + 782 + 3466 + 2 + 0 + + + 714 + 781 + 3466 + 2 + 0 + + + 714 + 780 + 3466 + 2 + 0 + + + 734 + 779 + 3468 + 2 + 0 + + + 715 + 779 + 3466 + 2 + 0 + + + 713 + 777 + 3464 + 0 + 0 + + + 734 + 776 + 3469 + 2 + 0 + + + 831 + 776 + 3467 + 0 + 0 + + + 713 + 783 + 3472 + 2 + 0 + + + 713 + 782 + 3472 + 2 + 0 + + + 714 + 781 + 3472 + 2 + 0 + + + 715 + 780 + 3472 + 2 + 0 + + + 734 + 779 + 3479 + 4 + 0 + + + 715 + 779 + 3472 + 2 + 0 + + + 900 + 777 + 3478 + 0 + 0 + + + 716 + 777 + 3477 + 0 + 0 + + + 713 + 777 + 3476 + 0 + 0 + + + 713 + 777 + 3475 + 0 + 0 + + + 714 + 777 + 3474 + 0 + 0 + + + 831 + 776 + 3473 + 0 + 0 + + + 734 + 765 + 3486 + 3 + 0 + + + 735 + 765 + 3482 + 3 + 0 + + + 734 + 764 + 3484 + 2 + 0 + + + 735 + 763 + 3486 + 5 + 0 + + + 734 + 762 + 3483 + 1 + 0 + + + 734 + 761 + 3485 + 0 + 0 + + + 735 + 760 + 3484 + 3 + 0 + + + 734 + 771 + 3484 + 2 + 0 + + + 717 + 777 + 3484 + 7 + 0 + + + 940 + 747 + 3495 + 0 + 0 + + + 735 + 756 + 3488 + 7 + 0 + + + 940 + 764 + 3495 + 0 + 0 + + + 735 + 763 + 3489 + 1 + 0 + + + 940 + 761 + 3489 + 0 + 0 + + + 734 + 761 + 3488 + 7 + 0 + + + 713 + 775 + 3492 + 2 + 0 + + + 713 + 774 + 3492 + 2 + 0 + + + 716 + 773 + 3492 + 2 + 0 + + + 734 + 773 + 3490 + 2 + 0 + + + 715 + 772 + 3492 + 2 + 0 + + + 714 + 771 + 3492 + 2 + 0 + + + 734 + 779 + 3495 + 2 + 0 + + + 714 + 777 + 3495 + 0 + 0 + + + 713 + 777 + 3494 + 0 + 0 + + + 713 + 777 + 3490 + 0 + 0 + + + 713 + 777 + 3489 + 0 + 0 + + + 713 + 777 + 3488 + 0 + 0 + + + 831 + 776 + 3493 + 0 + 0 + + + 169 + 755 + 3489 + 1 + 1 + + + 862 + 750 + 3496 + 6 + 0 + + + 863 + 749 + 3497 + 2 + 0 + + + 734 + 747 + 3498 + 5 + 0 + + + 865 + 756 + 3502 + 0 + 0 + + + 734 + 754 + 3498 + 5 + 0 + + + 734 + 752 + 3496 + 5 + 0 + + + 863 + 766 + 3497 + 2 + 0 + + + 734 + 763 + 3499 + 5 + 0 + + + 867 + 761 + 3500 + 0 + 0 + + + 871 + 761 + 3499 + 0 + 0 + + + 713 + 783 + 3497 + 2 + 0 + + + 714 + 782 + 3497 + 2 + 0 + + + 716 + 781 + 3497 + 2 + 0 + + + 901 + 778 + 3497 + 6 + 0 + + + 714 + 777 + 3503 + 0 + 0 + + + 715 + 777 + 3499 + 0 + 0 + + + 714 + 777 + 3498 + 0 + 0 + + + 714 + 777 + 3497 + 0 + 0 + + + 714 + 777 + 3496 + 0 + 0 + + + 831 + 776 + 3502 + 0 + 0 + + + 168 + 744 + 3499 + 0 + 1 + + + 873 + 737 + 3489 + 2 + 0 + + + 865 + 739 + 3502 + 0 + 0 + + + 734 + 737 + 3498 + 5 + 0 + + + 714 + 775 + 3510 + 2 + 0 + + + 714 + 774 + 3510 + 2 + 0 + + + 715 + 773 + 3510 + 2 + 0 + + + 831 + 770 + 3511 + 0 + 0 + + + 714 + 769 + 3510 + 2 + 0 + + + 716 + 768 + 3508 + 0 + 0 + + + 716 + 768 + 3505 + 0 + 0 + + + 169 + 739 + 3489 + 1 + 1 + + + 873 + 735 + 3489 + 2 + 0 + + + 874 + 733 + 3489 + 2 + 0 + + + 864 + 732 + 3494 + 2 + 0 + + + 730 + 729 + 3490 + 0 + 0 + + + 734 + 735 + 3496 + 5 + 0 + + + 862 + 733 + 3496 + 6 + 0 + + + 940 + 730 + 3501 + 0 + 0 + + + 866 + 728 + 3498 + 0 + 0 + + + 170 + 730 + 3489 + 1 + 1 + + + 730 + 727 + 3493 + 5 + 0 + + + 730 + 727 + 3488 + 7 + 0 + + + 730 + 726 + 3491 + 6 + 0 + + + 730 + 722 + 3491 + 3 + 0 + + + 867 + 720 + 3501 + 0 + 0 + + + 940 + 724 + 3499 + 0 + 0 + + + 169 + 725 + 3491 + 1 + 1 + + + 51 + 718 + 3507 + 6 + 0 + + + 51 + 716 + 3505 + 0 + 0 + + + 51 + 714 + 3507 + 4 + 0 + + + 117 + 713 + 3511 + 5 + 0 + + + 5 + 712 + 3511 + 0 + 0 + + + 51 + 711 + 3505 + 0 + 0 + + + 51 + 708 + 3507 + 4 + 0 + + + 51 + 704 + 3505 + 0 + 0 + + + 714 + 771 + 3514 + 0 + 0 + + + 716 + 771 + 3513 + 0 + 0 + + + 714 + 771 + 3512 + 0 + 0 + + + 831 + 770 + 3517 + 0 + 0 + + + 714 + 782 + 3510 + 2 + 0 + + + 716 + 781 + 3510 + 2 + 0 + + + 713 + 780 + 3510 + 2 + 0 + + + 713 + 779 + 3510 + 2 + 0 + + + 831 + 778 + 3511 + 2 + 0 + + + 714 + 777 + 3508 + 0 + 0 + + + 904 + 777 + 3505 + 0 + 0 + + + 713 + 777 + 3504 + 0 + 0 + + + 906 + 780 + 3519 + 6 + 0 + + + 713 + 779 + 3519 + 2 + 0 + + + 872 + 765 + 3439 + 2 + 0 + + + 729 + 764 + 3437 + 3 + 0 + + + 730 + 764 + 3433 + 1 + 0 + + + 729 + 762 + 3438 + 0 + 0 + + + 729 + 762 + 3435 + 1 + 0 + + + 730 + 762 + 3433 + 2 + 0 + + + 940 + 760 + 3439 + 0 + 0 + + + 730 + 760 + 3435 + 1 + 0 + + + 734 + 773 + 3429 + 1 + 0 + + + 734 + 774 + 3438 + 2 + 0 + + + 714 + 782 + 3431 + 0 + 0 + + + 715 + 782 + 3430 + 0 + 0 + + + 716 + 782 + 3429 + 0 + 0 + + + 713 + 782 + 3428 + 0 + 0 + + + 892 + 782 + 3425 + 0 + 0 + + + 716 + 782 + 3424 + 0 + 0 + + + 734 + 777 + 3427 + 7 + 0 + + + 734 + 776 + 3431 + 2 + 0 + + + 896 + 782 + 3439 + 0 + 0 + + + 714 + 782 + 3438 + 0 + 0 + + + 713 + 782 + 3437 + 0 + 0 + + + 713 + 782 + 3433 + 0 + 0 + + + 714 + 782 + 3432 + 0 + 0 + + + 831 + 781 + 3434 + 6 + 0 + + + 715 + 780 + 3435 + 2 + 0 + + + 715 + 779 + 3435 + 2 + 0 + + + 714 + 778 + 3435 + 2 + 0 + + + 714 + 777 + 3439 + 0 + 0 + + + 714 + 777 + 3438 + 0 + 0 + + + 714 + 777 + 3437 + 0 + 0 + + + 716 + 777 + 3436 + 0 + 0 + + + 886 + 777 + 3435 + 0 + 0 + + + 730 + 759 + 3419 + 1 + 0 + + + 734 + 758 + 3420 + 3 + 0 + + + 729 + 757 + 3418 + 5 + 0 + + + 734 + 757 + 3416 + 3 + 0 + + + 729 + 755 + 3417 + 1 + 0 + + + 876 + 766 + 3417 + 0 + 0 + + + 722 + 764 + 3417 + 0 + 0 + + + 940 + 762 + 3421 + 0 + 0 + + + 734 + 761 + 3419 + 3 + 0 + + + 97 + 761 + 3416 + 4 + 0 + + + 97 + 760 + 3417 + 4 + 0 + + + 830 + 760 + 3416 + 6 + 0 + + + 891 + 774 + 3417 + 6 + 0 + + + 889 + 773 + 3418 + 0 + 0 + + + 716 + 773 + 3417 + 6 + 0 + + + 734 + 772 + 3421 + 5 + 0 + + + 714 + 772 + 3417 + 6 + 0 + + + 875 + 768 + 3416 + 4 + 0 + + + 714 + 782 + 3423 + 0 + 0 + + + 713 + 782 + 3422 + 0 + 0 + + + 713 + 782 + 3421 + 0 + 0 + + + 717 + 782 + 3417 + 6 + 0 + + + 734 + 779 + 3421 + 5 + 0 + + + 715 + 778 + 3417 + 2 + 0 + + + 716 + 777 + 3417 + 6 + 0 + + + 734 + 776 + 3419 + 5 + 0 + + + 883 + 737 + 3420 + 2 + 0 + + + 729 + 737 + 3419 + 4 + 0 + + + 734 + 741 + 3413 + 3 + 0 + + + 882 + 737 + 3411 + 2 + 0 + + + 729 + 737 + 3410 + 4 + 0 + + + 734 + 736 + 3412 + 5 + 0 + + + 734 + 736 + 3409 + 5 + 0 + + + 729 + 758 + 3415 + 6 + 0 + + + 734 + 758 + 3413 + 3 + 0 + + + 940 + 756 + 3415 + 0 + 0 + + + 734 + 762 + 3414 + 3 + 0 + + + 734 + 762 + 3412 + 3 + 0 + + + 729 + 760 + 3414 + 7 + 0 + + + 734 + 775 + 3415 + 5 + 0 + + + 734 + 772 + 3411 + 5 + 0 + + + 713 + 782 + 3413 + 0 + 0 + + + 716 + 782 + 3412 + 0 + 0 + + + 715 + 782 + 3411 + 0 + 0 + + + 714 + 782 + 3410 + 0 + 0 + + + 734 + 781 + 3412 + 5 + 0 + + + 734 + 778 + 3413 + 5 + 0 + + + 886 + 791 + 3414 + 0 + 0 + + + 714 + 791 + 3413 + 0 + 0 + + + 714 + 791 + 3412 + 0 + 0 + + + 888 + 791 + 3409 + 6 + 0 + + + 831 + 790 + 3409 + 6 + 0 + + + 714 + 791 + 3423 + 0 + 0 + + + 715 + 791 + 3422 + 0 + 0 + + + 713 + 791 + 3418 + 0 + 0 + + + 886 + 791 + 3417 + 0 + 0 + + + 888 + 790 + 3420 + 0 + 0 + + + 831 + 790 + 3419 + 6 + 0 + + + 714 + 790 + 3417 + 2 + 0 + + + 715 + 789 + 3417 + 2 + 0 + + + 713 + 788 + 3417 + 2 + 0 + + + 714 + 787 + 3417 + 2 + 0 + + + 714 + 786 + 3417 + 2 + 0 + + + 922 + 785 + 3418 + 0 + 0 + + + 713 + 791 + 3431 + 2 + 0 + + + 714 + 791 + 3430 + 0 + 0 + + + 713 + 791 + 3429 + 0 + 0 + + + 713 + 791 + 3428 + 0 + 0 + + + 713 + 791 + 3424 + 0 + 0 + + + 715 + 790 + 3431 + 2 + 0 + + + 888 + 790 + 3426 + 0 + 0 + + + 831 + 790 + 3425 + 6 + 0 + + + 888 + 788 + 3430 + 6 + 0 + + + 734 + 786 + 3424 + 5 + 0 + + + 734 + 785 + 3427 + 5 + 0 + + + 888 + 791 + 3435 + 0 + 0 + + + 831 + 789 + 3432 + 2 + 0 + + + 730 + 722 + 605 + 7 + 0 + + + 877 + 734 + 605 + 7 + 0 + + + 730 + 732 + 600 + 4 + 0 + + + 877 + 742 + 587 + 7 + 0 + + + 877 + 742 + 584 + 7 + 0 + + + 729 + 740 + 585 + 5 + 0 + + + 877 + 738 + 588 + 7 + 0 + + + 730 + 737 + 591 + 3 + 0 + + + 407 + 743 + 598 + 1 + 0 + + + 877 + 742 + 592 + 7 + 0 + + + 407 + 740 + 592 + 5 + 0 + + + 877 + 738 + 596 + 7 + 0 + + + 730 + 737 + 598 + 1 + 0 + + + 877 + 742 + 605 + 7 + 0 + + + 729 + 740 + 602 + 6 + 0 + + + 877 + 738 + 600 + 7 + 0 + + + 407 + 736 + 607 + 0 + 0 + + + 729 + 751 + 586 + 3 + 0 + + + 877 + 748 + 584 + 7 + 0 + + + 729 + 751 + 596 + 4 + 0 + + + 407 + 751 + 592 + 6 + 0 + + + 407 + 750 + 599 + 3 + 0 + + + 730 + 750 + 595 + 5 + 0 + + + 729 + 746 + 595 + 7 + 0 + + + 877 + 750 + 605 + 7 + 0 + + + 730 + 749 + 601 + 6 + 0 + + + 877 + 746 + 605 + 7 + 0 + + + 730 + 744 + 602 + 7 + 0 + + + 729 + 755 + 590 + 2 + 0 + + + 877 + 754 + 584 + 7 + 0 + + + 877 + 758 + 596 + 7 + 0 + + + 729 + 754 + 595 + 0 + 0 + + + 729 + 759 + 605 + 1 + 0 + + + 877 + 758 + 600 + 7 + 0 + + + 730 + 757 + 603 + 7 + 0 + + + 877 + 755 + 605 + 7 + 0 + + + 877 + 755 + 600 + 7 + 0 + + + 730 + 752 + 602 + 6 + 0 + + + 171 + 727 + 607 + 0 + 1 + + + 171 + 728 + 607 + 0 + 1 + + + 890 + 766 + 585 + 2 + 0 + + + 729 + 761 + 597 + 3 + 0 + + + 729 + 760 + 603 + 2 + 0 + + + 877 + 742 + 612 + 7 + 0 + + + 407 + 742 + 608 + 7 + 0 + + + 729 + 740 + 612 + 1 + 0 + + + 729 + 739 + 614 + 2 + 0 + + + 877 + 737 + 612 + 7 + 0 + + + 877 + 746 + 612 + 7 + 0 + + + 884 + 759 + 612 + 1 + 0 + + + 407 + 759 + 609 + 7 + 0 + + + 884 + 758 + 615 + 2 + 0 + + + 877 + 757 + 614 + 7 + 0 + + + 877 + 755 + 610 + 7 + 0 + + + 729 + 763 + 610 + 7 + 0 + + + 884 + 761 + 613 + 7 + 0 + + + 729 + 742 + 617 + 1 + 0 + + + 877 + 741 + 621 + 7 + 0 + + + 877 + 737 + 617 + 7 + 0 + + + 877 + 751 + 621 + 7 + 0 + + + 877 + 746 + 621 + 7 + 0 + + + 877 + 746 + 616 + 7 + 0 + + + 884 + 759 + 618 + 6 + 0 + + + 877 + 757 + 621 + 7 + 0 + + + 729 + 752 + 617 + 4 + 0 + + + 729 + 762 + 616 + 6 + 0 + + + 884 + 760 + 616 + 3 + 0 + + + 877 + 741 + 626 + 0 + 0 + + + 877 + 736 + 626 + 0 + 0 + + + 877 + 749 + 630 + 0 + 0 + + + 877 + 747 + 627 + 0 + 0 + + + 730 + 744 + 631 + 6 + 0 + + + 729 + 758 + 628 + 0 + 0 + + + 877 + 758 + 625 + 0 + 0 + + + 877 + 754 + 630 + 0 + 0 + + + 730 + 743 + 633 + 7 + 0 + + + 877 + 741 + 638 + 0 + 0 + + + 877 + 741 + 633 + 0 + 0 + + + 877 + 749 + 635 + 0 + 0 + + + 730 + 746 + 633 + 6 + 0 + + + 729 + 755 + 634 + 0 + 0 + + + 877 + 763 + 638 + 0 + 0 + + + 877 + 743 + 644 + 0 + 0 + + + 407 + 738 + 641 + 6 + 0 + + + 877 + 737 + 646 + 0 + 0 + + + 877 + 749 + 644 + 0 + 0 + + + 877 + 749 + 640 + 0 + 0 + + + 729 + 746 + 643 + 0 + 0 + + + 877 + 757 + 644 + 0 + 0 + + + 877 + 752 + 644 + 0 + 0 + + + 877 + 743 + 650 + 0 + 0 + + + 407 + 741 + 655 + 7 + 0 + + + 877 + 739 + 650 + 0 + 0 + + + 729 + 748 + 650 + 2 + 0 + + + 407 + 747 + 648 + 5 + 0 + + + 377 + 758 + 651 + 1 + 0 + + + 377 + 757 + 654 + 1 + 0 + + + 407 + 754 + 651 + 5 + 0 + + + 407 + 752 + 655 + 3 + 0 + + + 377 + 765 + 654 + 7 + 0 + + + 22 + 763 + 655 + 4 + 0 + + + 21 + 763 + 654 + 0 + 0 + + + 21 + 763 + 652 + 0 + 0 + + + 21 + 760 + 654 + 4 + 0 + + + 21 + 760 + 652 + 4 + 0 + + + 407 + 739 + 661 + 1 + 0 + + + 407 + 749 + 658 + 6 + 0 + + + 729 + 747 + 656 + 0 + 0 + + + 22 + 759 + 656 + 4 + 0 + + + 50 + 758 + 661 + 0 + 0 + + + 21 + 758 + 658 + 4 + 0 + + + 21 + 758 + 656 + 4 + 0 + + + 278 + 757 + 662 + 0 + 0 + + + 377 + 757 + 658 + 1 + 0 + + + 8 + 756 + 663 + 1 + 0 + + + 8 + 755 + 662 + 3 + 0 + + + 21 + 754 + 661 + 4 + 0 + + + 377 + 754 + 657 + 1 + 0 + + + 377 + 752 + 660 + 1 + 0 + + + 21 + 765 + 660 + 0 + 0 + + + 21 + 765 + 657 + 0 + 0 + + + 22 + 764 + 660 + 3 + 0 + + + 22 + 764 + 659 + 3 + 0 + + + 51 + 763 + 663 + 0 + 0 + + + 97 + 762 + 660 + 5 + 0 + + + 50 + 760 + 661 + 0 + 0 + + + 278 + 760 + 660 + 0 + 0 + + + 1 + 764 + 663 + 0 + 1 + + + 729 + 740 + 666 + 0 + 0 + + + 920 + 739 + 668 + 0 + 0 + + + 729 + 748 + 666 + 2 + 0 + + + 51 + 759 + 667 + 4 + 0 + + + 51 + 757 + 667 + 5 + 0 + + + 3 + 756 + 666 + 6 + 0 + + + 3 + 756 + 665 + 6 + 0 + + + 51 + 756 + 664 + 0 + 0 + + + 21 + 754 + 667 + 4 + 0 + + + 21 + 754 + 664 + 4 + 0 + + + 377 + 752 + 664 + 1 + 0 + + + 880 + 764 + 665 + 3 + 0 + + + 22 + 763 + 666 + 3 + 0 + + + 3 + 763 + 665 + 6 + 0 + + + 51 + 762 + 664 + 0 + 0 + + + 55 + 760 + 667 + 4 + 0 + + + 51 + 760 + 664 + 0 + 0 + + + 1 + 758 + 664 + 0 + 1 + + + 884 + 735 + 641 + 2 + 0 + + + 884 + 733 + 642 + 0 + 0 + + + 407 + 732 + 645 + 6 + 0 + + + 407 + 729 + 647 + 6 + 0 + + + 407 + 733 + 651 + 3 + 0 + + + 407 + 731 + 654 + 6 + 0 + + + 881 + 730 + 650 + 3 + 0 + + + 407 + 735 + 658 + 6 + 0 + + + 729 + 733 + 661 + 2 + 0 + + + 877 + 734 + 633 + 0 + 0 + + + 877 + 732 + 638 + 0 + 0 + + + 877 + 728 + 638 + 0 + 0 + + + 877 + 728 + 633 + 0 + 0 + + + 877 + 734 + 630 + 0 + 0 + + + 729 + 732 + 628 + 0 + 0 + + + 877 + 728 + 627 + 0 + 0 + + + 729 + 734 + 617 + 0 + 0 + + + 730 + 725 + 614 + 4 + 0 + + + 730 + 723 + 608 + 1 + 0 + + + 729 + 734 + 614 + 6 + 0 + + + 877 + 729 + 612 + 7 + 0 + + + 713 + 799 + 3414 + 2 + 0 + + + 734 + 799 + 3411 + 2 + 0 + + + 831 + 799 + 3410 + 2 + 0 + + + 714 + 798 + 3414 + 2 + 0 + + + 715 + 798 + 3413 + 0 + 0 + + + 714 + 798 + 3412 + 0 + 0 + + + 714 + 798 + 3411 + 0 + 0 + + + 888 + 798 + 3408 + 6 + 0 + + + 888 + 796 + 3413 + 6 + 0 + + + 831 + 795 + 3413 + 6 + 0 + + + 714 + 794 + 3414 + 2 + 0 + + + 715 + 793 + 3414 + 2 + 0 + + + 734 + 793 + 3413 + 2 + 0 + + + 714 + 792 + 3414 + 2 + 0 + + + 713 + 799 + 3420 + 2 + 0 + + + 734 + 799 + 3418 + 2 + 0 + + + 714 + 798 + 3420 + 2 + 0 + + + 715 + 797 + 3422 + 0 + 0 + + + 715 + 797 + 3421 + 0 + 0 + + + 715 + 797 + 3420 + 2 + 0 + + + 716 + 796 + 3420 + 2 + 0 + + + 715 + 796 + 3419 + 0 + 0 + + + 714 + 796 + 3418 + 0 + 0 + + + 714 + 796 + 3417 + 0 + 0 + + + 715 + 796 + 3416 + 0 + 0 + + + 715 + 795 + 3420 + 2 + 0 + + + 734 + 794 + 3422 + 2 + 0 + + + 714 + 794 + 3420 + 2 + 0 + + + 714 + 793 + 3420 + 2 + 0 + + + 734 + 793 + 3416 + 2 + 0 + + + 714 + 799 + 3431 + 2 + 0 + + + 831 + 798 + 3425 + 2 + 0 + + + 888 + 798 + 3424 + 4 + 0 + + + 715 + 797 + 3429 + 0 + 0 + + + 715 + 797 + 3428 + 0 + 0 + + + 715 + 797 + 3427 + 0 + 0 + + + 715 + 797 + 3426 + 0 + 0 + + + 714 + 795 + 3431 + 2 + 0 + + + 716 + 794 + 3431 + 2 + 0 + + + 734 + 794 + 3427 + 2 + 0 + + + 713 + 793 + 3431 + 2 + 0 + + + 713 + 792 + 3431 + 2 + 0 + + + 713 + 799 + 3435 + 2 + 0 + + + 716 + 798 + 3435 + 2 + 0 + + + 831 + 798 + 3432 + 2 + 0 + + + 714 + 797 + 3435 + 2 + 0 + + + 888 + 797 + 3432 + 2 + 0 + + + 734 + 796 + 3438 + 2 + 0 + + + 713 + 796 + 3435 + 2 + 0 + + + 716 + 795 + 3435 + 2 + 0 + + + 713 + 794 + 3435 + 2 + 0 + + + 831 + 793 + 3436 + 2 + 0 + + + 714 + 792 + 3433 + 0 + 0 + + + 713 + 792 + 3432 + 0 + 0 + + + 831 + 807 + 3413 + 6 + 0 + + + 714 + 806 + 3414 + 2 + 0 + + + 713 + 805 + 3414 + 2 + 0 + + + 734 + 805 + 3413 + 4 + 0 + + + 714 + 804 + 3414 + 2 + 0 + + + 831 + 803 + 3415 + 2 + 0 + + + 888 + 802 + 3413 + 6 + 0 + + + 713 + 800 + 3414 + 2 + 0 + + + 888 + 807 + 3422 + 0 + 0 + + + 888 + 803 + 3420 + 4 + 0 + + + 716 + 802 + 3423 + 0 + 0 + + + 713 + 802 + 3422 + 0 + 0 + + + 715 + 802 + 3418 + 0 + 0 + + + 714 + 802 + 3417 + 0 + 0 + + + 713 + 802 + 3416 + 0 + 0 + + + 831 + 801 + 3419 + 6 + 0 + + + 713 + 800 + 3420 + 2 + 0 + + + 888 + 807 + 3429 + 0 + 0 + + + 831 + 807 + 3428 + 6 + 0 + + + 715 + 807 + 3426 + 2 + 0 + + + 898 + 804 + 3426 + 6 + 0 + + + 831 + 803 + 3427 + 2 + 0 + + + 713 + 802 + 3431 + 0 + 0 + + + 714 + 802 + 3430 + 0 + 0 + + + 714 + 802 + 3429 + 0 + 0 + + + 714 + 802 + 3428 + 0 + 0 + + + 715 + 802 + 3424 + 0 + 0 + + + 715 + 801 + 3431 + 2 + 0 + + + 734 + 801 + 3430 + 4 + 0 + + + 888 + 801 + 3426 + 0 + 0 + + + 716 + 800 + 3431 + 2 + 0 + + + 887 + 807 + 3434 + 0 + 0 + + + 886 + 802 + 3433 + 4 + 0 + + + 714 + 802 + 3432 + 0 + 0 + + + 893 + 801 + 3438 + 0 + 0 + + + 714 + 801 + 3437 + 0 + 0 + + + 888 + 801 + 3434 + 6 + 0 + + + 831 + 800 + 3434 + 6 + 0 + + + 714 + 813 + 3414 + 2 + 0 + + + 716 + 812 + 3414 + 2 + 0 + + + 734 + 811 + 3415 + 4 + 0 + + + 715 + 811 + 3414 + 2 + 0 + + + 714 + 810 + 3414 + 2 + 0 + + + 888 + 808 + 3413 + 6 + 0 + + + 831 + 809 + 3423 + 2 + 0 + + + 714 + 808 + 3420 + 0 + 0 + + + 897 + 808 + 3417 + 0 + 0 + + + 713 + 808 + 3416 + 0 + 0 + + + 713 + 814 + 3426 + 2 + 0 + + + 888 + 812 + 3425 + 6 + 0 + + + 831 + 811 + 3425 + 6 + 0 + + + 734 + 810 + 3428 + 4 + 0 + + + 715 + 810 + 3426 + 2 + 0 + + + 715 + 809 + 3426 + 2 + 0 + + + 713 + 808 + 3431 + 0 + 0 + + + 713 + 808 + 3427 + 0 + 0 + + + 886 + 808 + 3426 + 0 + 0 + + + 715 + 808 + 3425 + 0 + 0 + + + 714 + 808 + 3424 + 0 + 0 + + + 831 + 809 + 3435 + 2 + 0 + + + 713 + 808 + 3432 + 0 + 0 + + + 717 + 789 + 3445 + 0 + 0 + + + 713 + 785 + 3445 + 2 + 0 + + + 713 + 784 + 3445 + 2 + 0 + + + 714 + 797 + 3445 + 2 + 0 + + + 715 + 796 + 3445 + 2 + 0 + + + 716 + 795 + 3445 + 2 + 0 + + + 715 + 794 + 3445 + 2 + 0 + + + 713 + 793 + 3445 + 2 + 0 + + + 714 + 807 + 3445 + 2 + 0 + + + 714 + 806 + 3445 + 2 + 0 + + + 734 + 806 + 3444 + 4 + 0 + + + 714 + 805 + 3445 + 2 + 0 + + + 734 + 805 + 3441 + 4 + 0 + + + 717 + 801 + 3445 + 0 + 0 + + + 714 + 801 + 3441 + 0 + 0 + + + 713 + 812 + 3445 + 2 + 0 + + + 713 + 811 + 3445 + 2 + 0 + + + 734 + 809 + 3447 + 4 + 0 + + + 894 + 808 + 3445 + 6 + 0 + + + 734 + 790 + 3451 + 4 + 0 + + + 714 + 789 + 3452 + 0 + 0 + + + 714 + 789 + 3451 + 0 + 0 + + + 713 + 789 + 3450 + 0 + 0 + + + 713 + 789 + 3449 + 0 + 0 + + + 831 + 788 + 3453 + 6 + 0 + + + 713 + 787 + 3454 + 2 + 0 + + + 714 + 786 + 3454 + 2 + 0 + + + 716 + 785 + 3454 + 2 + 0 + + + 714 + 784 + 3454 + 2 + 0 + + + 734 + 798 + 3448 + 4 + 0 + + + 730 + 791 + 3463 + 0 + 0 + + + 730 + 796 + 3460 + 5 + 0 + + + 729 + 796 + 3457 + 6 + 0 + + + 729 + 794 + 3462 + 0 + 0 + + + 729 + 794 + 3458 + 1 + 0 + + + 734 + 806 + 3459 + 4 + 0 + + + 729 + 804 + 3462 + 6 + 0 + + + 715 + 787 + 3466 + 2 + 0 + + + 715 + 786 + 3466 + 2 + 0 + + + 714 + 785 + 3466 + 2 + 0 + + + 715 + 784 + 3466 + 2 + 0 + + + 784 + 798 + 3469 + 2 + 0 + + + 729 + 798 + 3465 + 0 + 0 + + + 729 + 797 + 3471 + 4 + 0 + + + 730 + 797 + 3465 + 5 + 0 + + + 869 + 793 + 3469 + 2 + 0 + + + 729 + 793 + 3464 + 2 + 0 + + + 729 + 806 + 3465 + 7 + 0 + + + 730 + 803 + 3467 + 5 + 0 + + + 913 + 802 + 3469 + 2 + 0 + + + 730 + 802 + 3465 + 5 + 0 + + + 729 + 801 + 3464 + 2 + 0 + + + 730 + 791 + 3477 + 5 + 0 + + + 729 + 790 + 3474 + 4 + 0 + + + 715 + 787 + 3472 + 2 + 0 + + + 715 + 786 + 3472 + 2 + 0 + + + 714 + 785 + 3472 + 2 + 0 + + + 713 + 784 + 3472 + 2 + 0 + + + 729 + 797 + 3472 + 5 + 0 + + + 729 + 796 + 3478 + 7 + 0 + + + 730 + 795 + 3475 + 7 + 0 + + + 729 + 793 + 3479 + 5 + 0 + + + 729 + 793 + 3476 + 3 + 0 + + + 730 + 793 + 3474 + 3 + 0 + + + 734 + 786 + 3482 + 2 + 0 + + + 734 + 785 + 3480 + 2 + 0 + + + 734 + 796 + 3487 + 4 + 0 + + + 730 + 795 + 3481 + 1 + 0 + + + 734 + 794 + 3485 + 0 + 0 + + + 734 + 789 + 3494 + 2 + 0 + + + 716 + 799 + 3490 + 2 + 0 + + + 715 + 798 + 3490 + 2 + 0 + + + 715 + 797 + 3490 + 2 + 0 + + + 714 + 793 + 3495 + 0 + 0 + + + 713 + 793 + 3494 + 0 + 0 + + + 717 + 793 + 3490 + 0 + 0 + + + 831 + 784 + 3498 + 0 + 0 + + + 713 + 799 + 3500 + 2 + 0 + + + 734 + 799 + 3499 + 4 + 0 + + + 734 + 798 + 3502 + 4 + 0 + + + 716 + 798 + 3500 + 2 + 0 + + + 715 + 797 + 3500 + 2 + 0 + + + 714 + 796 + 3500 + 2 + 0 + + + 714 + 795 + 3500 + 2 + 0 + + + 734 + 795 + 3496 + 4 + 0 + + + 714 + 793 + 3503 + 0 + 0 + + + 713 + 793 + 3502 + 0 + 0 + + + 715 + 793 + 3498 + 0 + 0 + + + 714 + 793 + 3497 + 0 + 0 + + + 716 + 793 + 3496 + 0 + 0 + + + 831 + 792 + 3501 + 0 + 0 + + + 905 + 787 + 3510 + 6 + 0 + + + 714 + 786 + 3510 + 2 + 0 + + + 831 + 785 + 3511 + 2 + 0 + + + 716 + 799 + 3510 + 2 + 0 + + + 714 + 798 + 3510 + 2 + 0 + + + 714 + 797 + 3510 + 2 + 0 + + + 717 + 793 + 3510 + 2 + 0 + + + 713 + 793 + 3506 + 0 + 0 + + + 713 + 793 + 3505 + 0 + 0 + + + 713 + 793 + 3504 + 0 + 0 + + + 714 + 791 + 3519 + 2 + 0 + + + 714 + 787 + 3519 + 2 + 0 + + + 715 + 786 + 3519 + 2 + 0 + + + 714 + 784 + 3517 + 0 + 0 + + + 713 + 784 + 3516 + 0 + 0 + + + 715 + 784 + 3515 + 0 + 0 + + + 716 + 784 + 3514 + 0 + 0 + + + 715 + 784 + 3513 + 0 + 0 + + + 713 + 784 + 3512 + 0 + 0 + + + 716 + 799 + 3519 + 2 + 0 + + + 715 + 798 + 3519 + 2 + 0 + + + 713 + 797 + 3519 + 2 + 0 + + + 714 + 793 + 3519 + 2 + 0 + + + 714 + 792 + 3519 + 2 + 0 + + + 714 + 772 + 3527 + 2 + 0 + + + 714 + 771 + 3527 + 2 + 0 + + + 713 + 770 + 3527 + 2 + 0 + + + 831 + 783 + 3520 + 0 + 0 + + + 715 + 780 + 3527 + 2 + 0 + + + 831 + 778 + 3520 + 2 + 0 + + + 907 + 777 + 3527 + 6 + 0 + + + 714 + 776 + 3527 + 2 + 0 + + + 714 + 791 + 3527 + 2 + 0 + + + 716 + 790 + 3527 + 2 + 0 + + + 831 + 790 + 3520 + 2 + 0 + + + 715 + 789 + 3527 + 2 + 0 + + + 714 + 788 + 3527 + 2 + 0 + + + 717 + 784 + 3527 + 2 + 0 + + + 713 + 784 + 3523 + 0 + 0 + + + 714 + 784 + 3522 + 0 + 0 + + + 714 + 784 + 3521 + 0 + 0 + + + 714 + 798 + 3527 + 2 + 0 + + + 714 + 797 + 3527 + 2 + 0 + + + 713 + 795 + 3525 + 0 + 0 + + + 714 + 795 + 3524 + 0 + 0 + + + 716 + 795 + 3523 + 0 + 0 + + + 715 + 795 + 3522 + 0 + 0 + + + 715 + 795 + 3521 + 0 + 0 + + + 831 + 794 + 3520 + 0 + 0 + + + 714 + 793 + 3527 + 2 + 0 + + + 713 + 792 + 3527 + 2 + 0 + + + 15 + 438 + 1642 + 6 + 0 + + + 6 + 443 + 1646 + 0 + 0 + + + 3 + 442 + 1646 + 0 + 0 + + + 145 + 441 + 1642 + 4 + 0 + + + 145 + 440 + 1646 + 0 + 0 + + + 51 + 503 + 3373 + 2 + 0 + + + 51 + 503 + 3371 + 2 + 0 + + + 51 + 511 + 3374 + 6 + 0 + + + 51 + 511 + 3371 + 6 + 0 + + + 205 + 508 + 3369 + 0 + 0 + + + 205 + 507 + 3375 + 0 + 0 + + + 51 + 507 + 3369 + 0 + 0 + + + 205 + 506 + 3370 + 0 + 0 + + + 51 + 505 + 3369 + 0 + 0 + + + 205 + 510 + 3376 + 0 + 0 + + + 51 + 508 + 3380 + 2 + 0 + + + 20 + 510 + 3386 + 6 + 0 + + + 51 + 508 + 3389 + 2 + 0 + + + 51 + 508 + 3385 + 2 + 0 + + + 51 + 519 + 3375 + 2 + 0 + + + 117 + 519 + 3374 + 2 + 0 + + + 51 + 518 + 3368 + 0 + 0 + + + 41 + 515 + 3370 + 6 + 0 + + + 730 + 519 + 3390 + 0 + 0 + + + 51 + 519 + 3388 + 6 + 0 + + + 51 + 519 + 3384 + 6 + 0 + + + 729 + 518 + 3387 + 0 + 0 + + + 730 + 515 + 3391 + 0 + 0 + + + 729 + 515 + 3386 + 0 + 0 + + + 729 + 514 + 3390 + 0 + 0 + + + 729 + 513 + 3387 + 0 + 0 + + + 730 + 512 + 3386 + 0 + 0 + + + 117 + 521 + 3374 + 6 + 0 + + + 51 + 521 + 3371 + 6 + 0 + + + 51 + 520 + 3368 + 0 + 0 + + + 369 + 534 + 3371 + 6 + 0 + + + 51 + 511 + 3396 + 4 + 0 + + + 20 + 510 + 3393 + 6 + 0 + + + 51 + 508 + 3394 + 2 + 0 + + + 51 + 514 + 3394 + 6 + 0 + + + 24 + 543 + 3373 + 2 + 1 + + + 24 + 542 + 3374 + 2 + 1 + + + 42 + 508 + 1479 + 4 + 0 + + + 41 + 516 + 1479 + 0 + 0 + + + 29 + 512 + 1482 + 0 + 0 + + + 1 + 513 + 1479 + 0 + 1 + + + 29 + 509 + 2421 + 2 + 0 + + + 29 + 509 + 2426 + 2 + 0 + + + 42 + 516 + 2423 + 0 + 0 + + + 1 + 514 + 2426 + 1 + 1 + + + 1 + 514 + 2424 + 0 + 1 + + + 5 + 343 + 1579 + 0 + 0 + + + 5 + 342 + 1579 + 0 + 0 + + + 6 + 340 + 1582 + 6 + 0 + + + 6 + 350 + 1582 + 0 + 0 + + + 6 + 350 + 1577 + 0 + 0 + + + 6 + 346 + 1582 + 0 + 0 + + + 2 + 340 + 1579 + 0 + 1 + + + 2 + 349 + 1581 + 0 + 1 + + + 2 + 348 + 1580 + 0 + 1 + + + 1 + 346 + 1578 + 0 + 1 + + + 2 + 345 + 1577 + 1 + 1 + + + 6 + 341 + 2516 + 0 + 0 + + + 6 + 339 + 2516 + 0 + 0 + + + 6 + 338 + 2514 + 0 + 0 + + + 6 + 343 + 2523 + 0 + 0 + + + 6 + 342 + 2524 + 0 + 0 + + + 6 + 342 + 2523 + 0 + 0 + + + 6 + 339 + 2522 + 0 + 0 + + + 6 + 338 + 2526 + 0 + 0 + + + 6 + 345 + 2513 + 6 + 0 + + + 6 + 346 + 2523 + 0 + 0 + + + 2 + 341 + 2518 + 0 + 1 + + + 2 + 341 + 2515 + 1 + 1 + + + 1 + 346 + 2514 + 0 + 1 + + + 2 + 349 + 2520 + 0 + 1 + + + 2 + 347 + 2520 + 0 + 1 + + + 2 + 345 + 2520 + 0 + 1 + + + 1007 + 639 + 3559 + 0 + 0 + + + 1007 + 637 + 3555 + 0 + 0 + + + 1007 + 636 + 3558 + 0 + 0 + + + 51 + 647 + 3535 + 6 + 0 + + + 51 + 646 + 3533 + 0 + 0 + + + 51 + 647 + 3537 + 6 + 0 + + + 51 + 646 + 3540 + 4 + 0 + + + 51 + 646 + 3538 + 2 + 0 + + + 51 + 646 + 3536 + 2 + 0 + + + 1007 + 642 + 3555 + 0 + 0 + + + 481 + 655 + 3535 + 0 + 0 + + + 290 + 655 + 3534 + 0 + 0 + + + 290 + 655 + 3533 + 0 + 0 + + + 290 + 654 + 3531 + 3 + 0 + + + 290 + 653 + 3534 + 0 + 0 + + + 290 + 653 + 3533 + 0 + 0 + + + 51 + 653 + 3531 + 0 + 0 + + + 55 + 651 + 3534 + 3 + 0 + + + 290 + 651 + 3532 + 0 + 0 + + + 7 + 650 + 3535 + 3 + 0 + + + 290 + 649 + 3535 + 0 + 0 + + + 51 + 649 + 3534 + 2 + 0 + + + 51 + 654 + 3542 + 4 + 0 + + + 51 + 654 + 3539 + 0 + 0 + + + 51 + 654 + 3536 + 4 + 0 + + + 290 + 653 + 3536 + 0 + 0 + + + 5 + 652 + 3541 + 2 + 0 + + + 51 + 652 + 3536 + 4 + 0 + + + 51 + 651 + 3539 + 0 + 0 + + + 290 + 651 + 3536 + 0 + 0 + + + 51 + 650 + 3542 + 4 + 0 + + + 51 + 650 + 3536 + 4 + 0 + + + 51 + 648 + 3539 + 0 + 0 + + + 164 + 653 + 3555 + 2 + 0 + + + 164 + 653 + 3554 + 5 + 0 + + + 164 + 652 + 3554 + 4 + 0 + + + 205 + 649 + 3559 + 4 + 0 + + + 116 + 648 + 3558 + 1 + 0 + + + 51 + 663 + 3527 + 2 + 0 + + + 63 + 663 + 3531 + 6 + 0 + + + 480 + 663 + 3530 + 6 + 0 + + + 51 + 661 + 3535 + 2 + 0 + + + 8 + 661 + 3534 + 3 + 0 + + + 51 + 661 + 3532 + 2 + 0 + + + 51 + 659 + 3534 + 6 + 0 + + + 51 + 658 + 3533 + 0 + 0 + + + 290 + 663 + 3536 + 3 + 0 + + + 51 + 662 + 3536 + 4 + 0 + + + 51 + 659 + 3540 + 4 + 0 + + + 51 + 659 + 3537 + 6 + 0 + + + 51 + 658 + 3538 + 2 + 0 + + + 51 + 658 + 3536 + 2 + 0 + + + 51 + 657 + 3539 + 0 + 0 + + + 1007 + 661 + 3556 + 0 + 0 + + + 1007 + 658 + 3559 + 0 + 0 + + + 51 + 669 + 3527 + 6 + 0 + + + 25 + 669 + 3526 + 6 + 0 + + + 51 + 669 + 3525 + 6 + 0 + + + 55 + 668 + 3527 + 0 + 0 + + + 55 + 668 + 3526 + 6 + 0 + + + 22 + 668 + 3525 + 6 + 0 + + + 55 + 668 + 3524 + 4 + 0 + + + 22 + 667 + 3527 + 6 + 0 + + + 17 + 667 + 3524 + 4 + 0 + + + 51 + 666 + 3524 + 0 + 0 + + + 55 + 665 + 3525 + 3 + 0 + + + 51 + 668 + 3528 + 4 + 0 + + + 51 + 666 + 3535 + 6 + 0 + + + 51 + 666 + 3532 + 6 + 0 + + + 3 + 665 + 3534 + 6 + 0 + + + 7 + 665 + 3532 + 2 + 0 + + + 51 + 665 + 3528 + 4 + 0 + + + 3 + 664 + 3534 + 6 + 0 + + + 51 + 665 + 3536 + 4 + 0 + + + 1007 + 667 + 3559 + 0 + 0 + + + 1 + 649 + 3533 + 1 + 1 + + + 188 + 649 + 3554 + 2 + 1 + + + 1 + 661 + 3533 + 1 + 1 + + + 117 + 678 + 3526 + 5 + 0 + + + 937 + 677 + 3526 + 4 + 0 + + + 51 + 673 + 3523 + 2 + 0 + + + 51 + 673 + 3520 + 2 + 0 + + + 51 + 673 + 3531 + 2 + 0 + + + 51 + 673 + 3528 + 2 + 0 + + + 51 + 678 + 3543 + 4 + 0 + + + 51 + 675 + 3538 + 0 + 0 + + + 116 + 674 + 3539 + 1 + 0 + + + 51 + 673 + 3540 + 2 + 0 + + + 51 + 675 + 3550 + 4 + 0 + + + 51 + 673 + 3547 + 2 + 0 + + + 116 + 678 + 3515 + 1 + 0 + + + 51 + 677 + 3512 + 4 + 0 + + + 51 + 674 + 3512 + 4 + 0 + + + 25 + 206 + 1486 + 0 + 0 + + + 25 + 202 + 1486 + 0 + 0 + + + 25 + 205 + 1494 + 0 + 0 + + + 117 + 204 + 1495 + 0 + 0 + + + 25 + 202 + 1494 + 0 + 0 + + + 25 + 202 + 1489 + 0 + 0 + + + 25 + 206 + 1499 + 2 + 0 + + + 14 + 202 + 1498 + 6 + 0 + + + 117 + 202 + 1497 + 2 + 0 + + + 25 + 215 + 1486 + 0 + 0 + + + 25 + 210 + 1486 + 0 + 0 + + + 5 + 215 + 1492 + 0 + 0 + + + 25 + 215 + 1488 + 0 + 0 + + + 45 + 212 + 1495 + 0 + 0 + + + 45 + 212 + 1494 + 6 + 0 + + + 45 + 212 + 1493 + 6 + 0 + + + 45 + 212 + 1492 + 6 + 0 + + + 45 + 212 + 1491 + 6 + 0 + + + 45 + 212 + 1490 + 4 + 0 + + + 45 + 211 + 1495 + 0 + 0 + + + 24 + 211 + 1489 + 0 + 0 + + + 45 + 210 + 1495 + 0 + 0 + + + 44 + 210 + 1491 + 4 + 0 + + + 25 + 210 + 1488 + 0 + 0 + + + 45 + 209 + 1495 + 0 + 0 + + + 45 + 209 + 1494 + 2 + 0 + + + 45 + 209 + 1493 + 2 + 0 + + + 45 + 209 + 1492 + 2 + 0 + + + 45 + 209 + 1491 + 2 + 0 + + + 45 + 209 + 1490 + 4 + 0 + + + 27 + 209 + 1489 + 0 + 0 + + + 25 + 208 + 1495 + 2 + 0 + + + 51 + 213 + 1498 + 2 + 0 + + + 51 + 213 + 1496 + 2 + 0 + + + 20 + 217 + 1495 + 6 + 0 + + + 20 + 222 + 1498 + 6 + 0 + + + 20 + 221 + 1496 + 6 + 0 + + + 51 + 219 + 1499 + 4 + 0 + + + 20 + 219 + 1497 + 6 + 0 + + + 20 + 216 + 1498 + 6 + 0 + + + 51 + 224 + 1496 + 6 + 0 + + + 1 + 207 + 1495 + 0 + 1 + + + 1 + 206 + 1491 + 1 + 1 + + + 24 + 202 + 1495 + 2 + 1 + + + 24 + 215 + 1494 + 2 + 1 + + + 1 + 209 + 1497 + 1 + 1 + + + 24 + 208 + 1499 + 2 + 1 + + + 17 + 202 + 2441 + 0 + 0 + + + 3 + 215 + 2438 + 0 + 0 + + + 6 + 215 + 2436 + 0 + 0 + + + 120 + 212 + 2439 + 0 + 0 + + + 3 + 208 + 2438 + 0 + 0 + + + 116 + 202 + 2438 + 0 + 1 + + + 1 + 211 + 2438 + 0 + 1 + + + 38 + 213 + 568 + 6 + 0 + + + 70 + 211 + 574 + 6 + 0 + + + 70 + 210 + 573 + 6 + 0 + + + 58 + 210 + 570 + 6 + 0 + + + 38 + 209 + 574 + 6 + 0 + + + 51 + 207 + 3383 + 6 + 0 + + + 25 + 207 + 3382 + 0 + 0 + + + 51 + 207 + 3381 + 6 + 0 + + + 25 + 207 + 3379 + 0 + 0 + + + 51 + 206 + 3379 + 0 + 0 + + + 41 + 204 + 3383 + 0 + 0 + + + 136 + 204 + 3380 + 2 + 0 + + + 51 + 203 + 3379 + 0 + 0 + + + 51 + 202 + 3383 + 2 + 0 + + + 25 + 202 + 3382 + 0 + 0 + + + 51 + 202 + 3381 + 2 + 0 + + + 25 + 202 + 3379 + 0 + 0 + + + 51 + 207 + 3385 + 6 + 0 + + + 51 + 202 + 3385 + 2 + 0 + + + 127 + 223 + 3375 + 4 + 0 + + + 125 + 222 + 3382 + 6 + 0 + + + 126 + 222 + 3378 + 6 + 0 + + + 51 + 222 + 3376 + 2 + 0 + + + 130 + 223 + 3385 + 0 + 0 + + + 51 + 222 + 3384 + 2 + 0 + + + 128 + 229 + 3375 + 4 + 0 + + + 51 + 226 + 3375 + 0 + 0 + + + 51 + 230 + 3383 + 4 + 0 + + + 51 + 230 + 3381 + 0 + 0 + + + 51 + 230 + 3379 + 6 + 0 + + + 51 + 230 + 3377 + 6 + 0 + + + 129 + 230 + 3376 + 2 + 0 + + + 51 + 229 + 3380 + 4 + 0 + + + 51 + 225 + 3378 + 0 + 0 + + + 51 + 227 + 3386 + 4 + 0 + + + 51 + 227 + 3384 + 6 + 0 + + + 124 + 225 + 3386 + 0 + 0 + + + 32 + 223 + 3381 + 0 + 1 + + + 31 + 229 + 3378 + 0 + 1 + + + 29 + 228 + 3382 + 1 + 1 + + + 28 + 228 + 3379 + 1 + 1 + + + 26 + 228 + 3376 + 1 + 1 + + + 33 + 226 + 3381 + 0 + 1 + + + 30 + 226 + 3378 + 0 + 1 + + + 27 + 225 + 3379 + 1 + 1 + + + 25 + 225 + 3376 + 1 + 1 + + + 45 + 319 + 1606 + 0 + 0 + + + 45 + 318 + 1606 + 0 + 0 + + + 45 + 317 + 1606 + 0 + 0 + + + 45 + 316 + 1606 + 0 + 0 + + + 45 + 315 + 1606 + 0 + 0 + + + 45 + 315 + 1605 + 2 + 0 + + + 42 + 315 + 1603 + 6 + 0 + + + 27 + 314 + 1603 + 0 + 0 + + + 210 + 268 + 3000 + 2 + 0 + + + 216 + 267 + 3001 + 5 + 0 + + + 214 + 267 + 3000 + 6 + 0 + + + 216 + 264 + 3012 + 2 + 0 + + + 214 + 273 + 3002 + 6 + 0 + + + 487 + 282 + 3020 + 0 + 0 + + + 5 + 282 + 3017 + 0 + 0 + + + 51 + 571 + 3319 + 6 + 0 + + + 51 + 571 + 3316 + 6 + 0 + + + 51 + 569 + 3315 + 0 + 0 + + + 51 + 571 + 3325 + 6 + 0 + + + 51 + 571 + 3322 + 6 + 0 + + + 5 + 245 + 3012 + 2 + 0 + + + 215 + 254 + 3008 + 5 + 0 + + + 217 + 263 + 3011 + 4 + 0 + + + 215 + 260 + 3016 + 6 + 0 + + + 215 + 270 + 2997 + 6 + 0 + + + 143 + 581 + 3527 + 6 + 0 + + + 633 + 581 + 3525 + 2 + 0 + + + 277 + 579 + 3527 + 4 + 0 + + + 143 + 579 + 3524 + 0 + 0 + + + 277 + 577 + 3526 + 4 + 0 + + + 143 + 576 + 3527 + 2 + 0 + + + 143 + 579 + 3531 + 4 + 0 + + + 629 + 576 + 3529 + 0 + 0 + + + 962 + 647 + 796 + 7 + 0 + + + 397 + 647 + 792 + 0 + 0 + + + 1001 + 646 + 795 + 4 + 0 + + + 398 + 646 + 793 + 0 + 0 + + + 377 + 645 + 794 + 0 + 0 + + + 394 + 643 + 799 + 0 + 0 + + + 951 + 643 + 797 + 4 + 0 + + + 951 + 643 + 796 + 0 + 0 + + + 951 + 642 + 797 + 4 + 0 + + + 951 + 642 + 796 + 0 + 0 + + + 951 + 641 + 797 + 4 + 0 + + + 951 + 641 + 796 + 0 + 0 + + + 951 + 640 + 797 + 4 + 0 + + + 951 + 640 + 796 + 0 + 0 + + + 34 + 655 + 799 + 0 + 0 + + + 394 + 655 + 798 + 0 + 0 + + + 962 + 655 + 793 + 4 + 0 + + + 973 + 652 + 792 + 0 + 0 + + + 398 + 650 + 794 + 3 + 0 + + + 34 + 649 + 799 + 0 + 0 + + + 377 + 649 + 796 + 6 + 0 + + + 395 + 649 + 793 + 4 + 0 + + + 996 + 648 + 799 + 0 + 0 + + + 377 + 648 + 792 + 0 + 0 + + + 951 + 647 + 804 + 6 + 0 + + + 951 + 647 + 803 + 6 + 0 + + + 995 + 647 + 802 + 0 + 0 + + + 951 + 646 + 804 + 2 + 0 + + + 951 + 646 + 803 + 2 + 0 + + + 951 + 646 + 802 + 2 + 0 + + + 377 + 644 + 806 + 2 + 0 + + + 34 + 643 + 806 + 0 + 0 + + + 164 + 655 + 801 + 6 + 0 + + + 962 + 654 + 803 + 1 + 0 + + + 395 + 651 + 804 + 6 + 0 + + + 377 + 649 + 804 + 0 + 0 + + + 975 + 647 + 812 + 2 + 0 + + + 951 + 646 + 812 + 4 + 0 + + + 951 + 646 + 811 + 0 + 0 + + + 951 + 645 + 812 + 4 + 0 + + + 951 + 645 + 811 + 0 + 0 + + + 951 + 644 + 812 + 4 + 0 + + + 951 + 644 + 811 + 0 + 0 + + + 951 + 643 + 812 + 4 + 0 + + + 951 + 643 + 811 + 0 + 0 + + + 951 + 642 + 812 + 4 + 0 + + + 951 + 642 + 811 + 0 + 0 + + + 951 + 641 + 812 + 4 + 0 + + + 951 + 641 + 811 + 0 + 0 + + + 951 + 640 + 812 + 4 + 0 + + + 951 + 640 + 811 + 0 + 0 + + + 397 + 645 + 817 + 0 + 0 + + + 962 + 644 + 822 + 0 + 0 + + + 394 + 644 + 818 + 0 + 0 + + + 286 + 640 + 830 + 3 + 0 + + + 951 + 655 + 812 + 4 + 0 + + + 951 + 655 + 811 + 0 + 0 + + + 377 + 651 + 813 + 0 + 0 + + + 962 + 651 + 821 + 0 + 0 + + + 34 + 649 + 821 + 0 + 0 + + + 398 + 653 + 828 + 0 + 0 + + + 398 + 652 + 831 + 0 + 0 + + + 962 + 652 + 829 + 1 + 0 + + + 205 + 652 + 828 + 2 + 0 + + + 395 + 651 + 828 + 6 + 0 + + + 398 + 650 + 829 + 6 + 0 + + + 398 + 649 + 827 + 6 + 0 + + + 205 + 661 + 798 + 0 + 0 + + + 395 + 659 + 796 + 4 + 0 + + + 377 + 656 + 799 + 0 + 0 + + + 962 + 663 + 806 + 3 + 0 + + + 1003 + 659 + 804 + 2 + 0 + + + 164 + 659 + 802 + 2 + 0 + + + 398 + 659 + 800 + 0 + 0 + + + 377 + 658 + 806 + 4 + 0 + + + 962 + 658 + 801 + 3 + 0 + + + 97 + 657 + 803 + 0 + 0 + + + 164 + 657 + 802 + 4 + 0 + + + 164 + 657 + 801 + 4 + 0 + + + 164 + 657 + 800 + 7 + 0 + + + 164 + 656 + 801 + 0 + 0 + + + 164 + 656 + 800 + 0 + 0 + + + 951 + 663 + 812 + 4 + 0 + + + 951 + 663 + 811 + 0 + 0 + + + 951 + 662 + 812 + 4 + 0 + + + 951 + 662 + 811 + 0 + 0 + + + 951 + 661 + 812 + 4 + 0 + + + 951 + 661 + 811 + 0 + 0 + + + 951 + 660 + 812 + 4 + 0 + + + 951 + 660 + 811 + 0 + 0 + + + 951 + 659 + 812 + 4 + 0 + + + 951 + 659 + 811 + 0 + 0 + + + 951 + 658 + 812 + 4 + 0 + + + 951 + 658 + 811 + 0 + 0 + + + 951 + 657 + 812 + 4 + 0 + + + 951 + 657 + 811 + 0 + 0 + + + 951 + 656 + 812 + 4 + 0 + + + 951 + 656 + 811 + 0 + 0 + + + 38 + 662 + 831 + 0 + 0 + + + 962 + 660 + 825 + 0 + 0 + + + 34 + 657 + 825 + 0 + 0 + + + 951 + 666 + 790 + 2 + 0 + + + 951 + 666 + 789 + 2 + 0 + + + 951 + 666 + 788 + 2 + 0 + + + 951 + 666 + 787 + 2 + 0 + + + 88 + 665 + 784 + 1 + 0 + + + 955 + 664 + 788 + 2 + 0 + + + 34 + 664 + 786 + 2 + 0 + + + 396 + 667 + 793 + 0 + 0 + + + 407 + 666 + 796 + 4 + 0 + + + 394 + 666 + 792 + 0 + 0 + + + 205 + 665 + 798 + 0 + 0 + + + 205 + 664 + 792 + 2 + 0 + + + 951 + 669 + 807 + 6 + 0 + + + 951 + 669 + 806 + 6 + 0 + + + 951 + 669 + 805 + 6 + 0 + + + 951 + 669 + 804 + 6 + 0 + + + 951 + 669 + 803 + 6 + 0 + + + 951 + 668 + 807 + 2 + 0 + + + 951 + 668 + 806 + 2 + 0 + + + 951 + 668 + 805 + 2 + 0 + + + 951 + 668 + 804 + 2 + 0 + + + 951 + 668 + 803 + 2 + 0 + + + 394 + 666 + 803 + 6 + 0 + + + 398 + 666 + 801 + 0 + 0 + + + 999 + 664 + 803 + 0 + 0 + + + 401 + 669 + 814 + 6 + 0 + + + 951 + 669 + 808 + 6 + 0 + + + 962 + 668 + 812 + 5 + 0 + + + 951 + 668 + 808 + 2 + 0 + + + 394 + 666 + 809 + 0 + 0 + + + 401 + 665 + 814 + 6 + 0 + + + 951 + 664 + 812 + 4 + 0 + + + 951 + 664 + 811 + 0 + 0 + + + 195 + 665 + 812 + 1 + 1 + + + 195 + 665 + 811 + 1 + 1 + + + 1 + 670 + 822 + 3 + 0 + + + 962 + 666 + 822 + 1 + 0 + + + 985 + 616 + 1436 + 0 + 0 + + + 3 + 655 + 1434 + 4 + 0 + + + 6 + 654 + 1435 + 0 + 0 + + + 3 + 653 + 1438 + 2 + 0 + + + 3 + 653 + 1433 + 4 + 0 + + + 7 + 652 + 1438 + 6 + 0 + + + 3 + 652 + 1436 + 4 + 0 + + + 3 + 652 + 1435 + 4 + 0 + + + 7 + 652 + 1433 + 6 + 0 + + + 7 + 651 + 1436 + 6 + 0 + + + 470 + 650 + 1435 + 0 + 0 + + + 47 + 657 + 1435 + 4 + 0 + + + 15 + 656 + 1391 + 2 + 0 + + + 6 + 656 + 1394 + 0 + 0 + + + 6 + 548 + 1524 + 0 + 0 + + + 14 + 544 + 1520 + 4 + 0 + + + 25 + 565 + 1525 + 6 + 0 + + + 25 + 563 + 1525 + 6 + 0 + + + 14 + 560 + 1526 + 6 + 0 + + + 145 + 567 + 1535 + 2 + 0 + + + 145 + 567 + 1533 + 2 + 0 + + + 257 + 567 + 1532 + 0 + 0 + + + 45 + 565 + 1534 + 0 + 0 + + + 45 + 565 + 1533 + 6 + 0 + + + 45 + 565 + 1532 + 6 + 0 + + + 45 + 565 + 1531 + 6 + 0 + + + 45 + 565 + 1530 + 6 + 0 + + + 25 + 565 + 1529 + 6 + 0 + + + 44 + 563 + 1531 + 0 + 0 + + + 25 + 563 + 1529 + 6 + 0 + + + 45 + 562 + 1534 + 0 + 0 + + + 45 + 562 + 1533 + 2 + 0 + + + 45 + 562 + 1532 + 2 + 0 + + + 45 + 562 + 1531 + 2 + 0 + + + 45 + 562 + 1530 + 2 + 0 + + + 27 + 561 + 1530 + 0 + 0 + + + 332 + 560 + 1531 + 5 + 0 + + + 24 + 560 + 1530 + 0 + 0 + + + 215 + 567 + 1536 + 0 + 0 + + + 299 + 565 + 1536 + 0 + 0 + + + 217 + 564 + 1536 + 0 + 0 + + + 121 + 563 + 1536 + 6 + 0 + + + 299 + 560 + 1536 + 0 + 0 + + + 1 + 566 + 1530 + 0 + 1 + + + 80 + 550 + 3423 + 4 + 0 + + + 111 + 549 + 3431 + 0 + 0 + + + 103 + 549 + 3430 + 0 + 0 + + + 103 + 549 + 3429 + 0 + 0 + + + 80 + 544 + 3430 + 6 + 0 + + + 80 + 544 + 3428 + 6 + 0 + + + 103 + 550 + 3434 + 0 + 0 + + + 51 + 550 + 3433 + 6 + 0 + + + 111 + 550 + 3432 + 0 + 0 + + + 111 + 548 + 3436 + 0 + 0 + + + 51 + 547 + 3436 + 4 + 0 + + + 111 + 545 + 3435 + 0 + 0 + + + 111 + 545 + 3434 + 0 + 0 + + + 51 + 544 + 3432 + 2 + 0 + + + 80 + 583 + 3408 + 4 + 0 + + + 51 + 580 + 3410 + 0 + 0 + + + 290 + 578 + 3412 + 5 + 0 + + + 80 + 577 + 3414 + 6 + 0 + + + 290 + 577 + 3411 + 0 + 0 + + + 80 + 577 + 3409 + 4 + 0 + + + 46 + 559 + 581 + 0 + 0 + + + 283 + 558 + 582 + 4 + 0 + + + 306 + 558 + 578 + 0 + 0 + + + 283 + 555 + 582 + 4 + 0 + + + 58 + 554 + 578 + 4 + 0 + + + 15 + 554 + 568 + 4 + 0 + + + 1 + 553 + 573 + 0 + 1 + + + 72 + 559 + 567 + 3 + 0 + + + 72 + 559 + 565 + 3 + 0 + + + 72 + 559 + 563 + 3 + 0 + + + 72 + 559 + 561 + 3 + 0 + + + 72 + 558 + 567 + 3 + 0 + + + 72 + 558 + 565 + 3 + 0 + + + 72 + 558 + 563 + 3 + 0 + + + 72 + 558 + 561 + 3 + 0 + + + 72 + 557 + 567 + 3 + 0 + + + 72 + 557 + 565 + 3 + 0 + + + 72 + 557 + 563 + 3 + 0 + + + 72 + 557 + 561 + 3 + 0 + + + 72 + 556 + 567 + 3 + 0 + + + 72 + 556 + 565 + 3 + 0 + + + 72 + 556 + 563 + 3 + 0 + + + 72 + 556 + 561 + 3 + 0 + + + 72 + 555 + 565 + 3 + 0 + + + 72 + 555 + 563 + 3 + 0 + + + 72 + 555 + 561 + 3 + 0 + + + 72 + 554 + 567 + 3 + 0 + + + 72 + 554 + 565 + 3 + 0 + + + 72 + 554 + 563 + 3 + 0 + + + 72 + 554 + 561 + 3 + 0 + + + 72 + 553 + 567 + 3 + 0 + + + 72 + 553 + 565 + 3 + 0 + + + 72 + 553 + 563 + 3 + 0 + + + 72 + 553 + 561 + 3 + 0 + + + 72 + 552 + 567 + 3 + 0 + + + 72 + 552 + 565 + 3 + 0 + + + 72 + 552 + 563 + 3 + 0 + + + 72 + 552 + 561 + 3 + 0 + + + 1 + 541 + 565 + 0 + 0 + + + 20 + 541 + 573 + 0 + 0 + + + 20 + 541 + 571 + 0 + 0 + + + 20 + 540 + 575 + 0 + 0 + + + 273 + 542 + 577 + 6 + 0 + + + 34 + 546 + 566 + 0 + 0 + + + 1 + 545 + 562 + 0 + 0 + + + 3 + 551 + 572 + 4 + 0 + + + 7 + 551 + 571 + 4 + 0 + + + 15 + 551 + 568 + 4 + 0 + + + 20 + 544 + 568 + 0 + 0 + + + 324 + 551 + 583 + 0 + 0 + + + 5 + 548 + 580 + 6 + 0 + + + 273 + 548 + 577 + 6 + 0 + + + 45 + 546 + 577 + 2 + 0 + + + 45 + 544 + 577 + 6 + 0 + + + 1 + 545 + 581 + 0 + 1 + + + 729 + 615 + 3318 + 0 + 0 + + + 729 + 615 + 3314 + 6 + 0 + + + 986 + 615 + 3313 + 0 + 0 + + + 986 + 614 + 3316 + 0 + 0 + + + 22 + 614 + 3314 + 0 + 0 + + + 986 + 614 + 3313 + 0 + 0 + + + 986 + 613 + 3315 + 0 + 0 + + + 22 + 613 + 3314 + 0 + 0 + + + 730 + 612 + 3318 + 0 + 0 + + + 730 + 610 + 3317 + 0 + 0 + + + 730 + 610 + 3320 + 0 + 0 + + + 986 + 609 + 3327 + 0 + 0 + + + 986 + 608 + 3321 + 0 + 0 + + + 22 + 622 + 3315 + 0 + 0 + + + 22 + 622 + 3314 + 0 + 0 + + + 986 + 621 + 3316 + 0 + 0 + + + 729 + 621 + 3315 + 0 + 0 + + + 986 + 621 + 3313 + 0 + 0 + + + 986 + 620 + 3319 + 0 + 0 + + + 986 + 620 + 3317 + 0 + 0 + + + 987 + 620 + 3313 + 0 + 0 + + + 986 + 619 + 3313 + 0 + 0 + + + 940 + 618 + 3314 + 0 + 0 + + + 986 + 617 + 3313 + 0 + 0 + + + 986 + 616 + 3313 + 0 + 0 + + + 986 + 620 + 3320 + 0 + 0 + + + 986 + 619 + 3321 + 0 + 0 + + + 51 + 631 + 3293 + 0 + 0 + + + 23 + 629 + 3295 + 6 + 0 + + + 64 + 631 + 3299 + 6 + 0 + + + 51 + 630 + 3302 + 4 + 0 + + + 51 + 630 + 3299 + 0 + 0 + + + 24 + 629 + 3300 + 2 + 0 + + + 5 + 631 + 3306 + 4 + 0 + + + 51 + 630 + 3305 + 0 + 0 + + + 507 + 634 + 3295 + 4 + 0 + + + 51 + 632 + 3293 + 0 + 0 + + + 21 + 639 + 3303 + 4 + 0 + + + 51 + 639 + 3301 + 0 + 0 + + + 24 + 634 + 3300 + 6 + 0 + + + 3 + 633 + 3301 + 4 + 0 + + + 51 + 633 + 3299 + 0 + 0 + + + 51 + 632 + 3302 + 4 + 0 + + + 3 + 632 + 3301 + 4 + 0 + + + 7 + 632 + 3300 + 4 + 0 + + + 51 + 639 + 3308 + 4 + 0 + + + 21 + 639 + 3306 + 4 + 0 + + + 63 + 635 + 3304 + 4 + 0 + + + 51 + 632 + 3305 + 0 + 0 + + + 37 + 647 + 3302 + 0 + 0 + + + 34 + 646 + 3302 + 2 + 0 + + + 0 + 645 + 3303 + 0 + 0 + + + 34 + 644 + 3303 + 2 + 0 + + + 37 + 643 + 3303 + 0 + 0 + + + 23 + 642 + 3302 + 2 + 0 + + + 51 + 641 + 3301 + 0 + 0 + + + 37 + 646 + 3306 + 0 + 0 + + + 467 + 646 + 3305 + 0 + 0 + + + 37 + 646 + 3304 + 0 + 0 + + + 0 + 644 + 3306 + 0 + 0 + + + 23 + 642 + 3306 + 2 + 0 + + + 63 + 642 + 3304 + 4 + 0 + + + 51 + 641 + 3308 + 4 + 0 + + + 22 + 634 + 3303 + 0 + 1 + + + 37 + 647 + 3302 + 0 + 0 + + + 34 + 646 + 3302 + 2 + 0 + + + 0 + 645 + 3303 + 0 + 0 + + + 34 + 644 + 3303 + 2 + 0 + + + 37 + 643 + 3303 + 0 + 0 + + + 23 + 642 + 3302 + 2 + 0 + + + 51 + 641 + 3301 + 0 + 0 + + + 37 + 646 + 3306 + 0 + 0 + + + 467 + 646 + 3305 + 0 + 0 + + + 37 + 646 + 3304 + 0 + 0 + + + 0 + 644 + 3306 + 0 + 0 + + + 23 + 642 + 3306 + 2 + 0 + + + 63 + 642 + 3304 + 4 + 0 + + + 51 + 641 + 3308 + 4 + 0 + + + 51 + 655 + 3294 + 4 + 0 + + + 51 + 655 + 3292 + 6 + 0 + + + 22 + 655 + 3291 + 0 + 0 + + + 51 + 655 + 3290 + 0 + 0 + + + 7 + 654 + 3292 + 2 + 0 + + + 22 + 654 + 3291 + 0 + 0 + + + 63 + 653 + 3295 + 6 + 0 + + + 3 + 653 + 3292 + 0 + 0 + + + 51 + 653 + 3290 + 0 + 0 + + + 55 + 652 + 3293 + 1 + 0 + + + 7 + 652 + 3292 + 6 + 0 + + + 51 + 651 + 3294 + 4 + 0 + + + 51 + 651 + 3290 + 0 + 0 + + + 492 + 650 + 3290 + 0 + 0 + + + 51 + 649 + 3294 + 4 + 0 + + + 47 + 649 + 3291 + 0 + 0 + + + 51 + 649 + 3290 + 0 + 0 + + + 51 + 655 + 3297 + 0 + 0 + + + 51 + 653 + 3297 + 2 + 0 + + + 37 + 648 + 3303 + 0 + 0 + + + 51 + 663 + 3294 + 4 + 0 + + + 51 + 663 + 3292 + 2 + 0 + + + 22 + 663 + 3291 + 0 + 0 + + + 51 + 663 + 3290 + 0 + 0 + + + 20 + 661 + 3295 + 0 + 0 + + + 51 + 661 + 3288 + 4 + 0 + + + 51 + 660 + 3293 + 6 + 0 + + + 51 + 660 + 3291 + 6 + 0 + + + 63 + 659 + 3295 + 6 + 0 + + + 51 + 659 + 3292 + 2 + 0 + + + 51 + 659 + 3290 + 2 + 0 + + + 64 + 659 + 3289 + 6 + 0 + + + 20 + 658 + 3295 + 6 + 0 + + + 51 + 658 + 3288 + 4 + 0 + + + 51 + 662 + 3298 + 6 + 0 + + + 51 + 662 + 3296 + 6 + 0 + + + 51 + 661 + 3299 + 4 + 0 + + + 471 + 659 + 3303 + 6 + 0 + + + 51 + 658 + 3299 + 4 + 0 + + + 51 + 657 + 3298 + 2 + 0 + + + 51 + 657 + 3296 + 2 + 0 + + + 469 + 659 + 3304 + 4 + 0 + + + 51 + 670 + 3292 + 6 + 0 + + + 51 + 669 + 3294 + 4 + 0 + + + 55 + 669 + 3291 + 6 + 0 + + + 51 + 669 + 3290 + 0 + 0 + + + 20 + 668 + 3292 + 6 + 0 + + + 63 + 667 + 3295 + 6 + 0 + + + 51 + 667 + 3290 + 0 + 0 + + + 51 + 665 + 3290 + 0 + 0 + + + 71 + 664 + 3294 + 2 + 0 + + + 22 + 664 + 3292 + 0 + 0 + + + 22 + 664 + 3291 + 0 + 0 + + + 51 + 664 + 3297 + 0 + 0 + + + 1 + 663 + 3297 + 1 + 1 + + + 1 + 657 + 3297 + 1 + 1 + + + 2 + 670 + 3290 + 0 + 1 + + + 51 + 663 + 3287 + 6 + 0 + + + 51 + 663 + 3285 + 6 + 0 + + + 51 + 663 + 3283 + 6 + 0 + + + 7 + 662 + 3284 + 2 + 0 + + + 51 + 662 + 3282 + 0 + 0 + + + 20 + 661 + 3287 + 6 + 0 + + + 274 + 659 + 3282 + 4 + 0 + + + 20 + 658 + 3287 + 6 + 0 + + + 9 + 658 + 3284 + 4 + 0 + + + 7 + 657 + 3284 + 6 + 0 + + + 51 + 657 + 3282 + 0 + 0 + + + 51 + 656 + 3287 + 2 + 0 + + + 51 + 656 + 3285 + 2 + 0 + + + 51 + 656 + 3283 + 2 + 0 + + + 51 + 669 + 3286 + 4 + 0 + + + 51 + 668 + 3283 + 6 + 0 + + + 51 + 667 + 3286 + 4 + 0 + + + 51 + 667 + 3284 + 2 + 0 + + + 51 + 667 + 3281 + 2 + 0 + + + 2 + 668 + 3281 + 0 + 1 + + + 497 + 659 + 3303 + 6 + 0 + + + 471 + 659 + 3303 + 6 + 0 + + + 610 + 683 + 3280 + 6 + 0 + + + 610 + 687 + 3303 + 0 + 0 + + + 610 + 683 + 3298 + 3 + 0 + + + 486 + 649 + 3275 + 6 + 0 + + + 51 + 648 + 3274 + 4 + 0 + + + 478 + 648 + 3272 + 2 + 0 + + + 51 + 662 + 3278 + 4 + 0 + + + 475 + 662 + 3273 + 0 + 0 + + + 476 + 668 + 3273 + 4 + 0 + + + 63 + 667 + 3279 + 6 + 0 + + + 51 + 666 + 3278 + 4 + 0 + + + 478 + 666 + 3276 + 2 + 0 + + + 484 + 665 + 3273 + 0 + 0 + + + 51 + 664 + 3278 + 4 + 0 + + + 477 + 664 + 3276 + 2 + 0 + + + 107 + 679 + 3277 + 7 + 0 + + + 102 + 679 + 3275 + 0 + 0 + + + 102 + 678 + 3272 + 0 + 0 + + + 102 + 677 + 3275 + 0 + 0 + + + 107 + 676 + 3272 + 6 + 0 + + + 110 + 686 + 3272 + 0 + 0 + + + 110 + 685 + 3278 + 0 + 0 + + + 110 + 685 + 3275 + 0 + 0 + + + 111 + 683 + 3275 + 2 + 0 + + + 114 + 683 + 3273 + 0 + 0 + + + 102 + 681 + 3278 + 0 + 0 + + + 102 + 681 + 3276 + 0 + 0 + + + 102 + 680 + 3273 + 0 + 0 + + + 476 + 650 + 3269 + 4 + 0 + + + 51 + 650 + 3265 + 0 + 0 + + + 474 + 648 + 3267 + 6 + 0 + + + 51 + 662 + 3269 + 0 + 0 + + + 51 + 668 + 3269 + 0 + 0 + + + 474 + 666 + 3271 + 6 + 0 + + + 483 + 665 + 3270 + 4 + 0 + + + 473 + 664 + 3271 + 6 + 0 + + + 114 + 678 + 3268 + 0 + 0 + + + 102 + 677 + 3270 + 0 + 0 + + + 110 + 686 + 3268 + 0 + 0 + + + 110 + 684 + 3270 + 0 + 0 + + + 195 + 682 + 3270 + 0 + 0 + + + 195 + 682 + 3267 + 0 + 0 + + + 195 + 682 + 3265 + 0 + 0 + + + 114 + 680 + 3269 + 0 + 0 + + + 195 + 680 + 3267 + 0 + 0 + + + 34 + 52 + 711 + 2 + 0 + + + 34 + 49 + 710 + 2 + 0 + + + 34 + 55 + 718 + 2 + 0 + + + 34 + 54 + 713 + 2 + 0 + + + 8 + 53 + 714 + 2 + 0 + + + 11 + 52 + 718 + 2 + 0 + + + 8 + 52 + 714 + 0 + 0 + + + 34 + 50 + 712 + 2 + 0 + + + 34 + 49 + 713 + 2 + 0 + + + 35 + 51 + 735 + 0 + 0 + + + 34 + 57 + 717 + 2 + 0 + + + 34 + 56 + 719 + 2 + 0 + + + 34 + 56 + 716 + 2 + 0 + + + 34 + 56 + 714 + 2 + 0 + + + 55 + 60 + 725 + 5 + 0 + + + 916 + 62 + 733 + 6 + 0 + + + 21 + 60 + 732 + 2 + 0 + + + 21 + 60 + 728 + 2 + 0 + + + 55 + 59 + 730 + 5 + 0 + + + 55 + 59 + 728 + 7 + 0 + + + 942 + 58 + 731 + 7 + 0 + + + 35 + 62 + 738 + 0 + 0 + + + 33 + 66 + 704 + 0 + 0 + + + 35 + 67 + 714 + 0 + 0 + + + 55 + 64 + 725 + 2 + 0 + + + 21 + 64 + 732 + 0 + 0 + + + 21 + 64 + 728 + 0 + 0 + + + 944 + 66 + 741 + 0 + 0 + + + 35 + 78 + 711 + 0 + 0 + + + 33 + 75 + 708 + 0 + 0 + + + 33 + 76 + 718 + 0 + 0 + + + 35 + 78 + 734 + 0 + 0 + + + 35 + 74 + 740 + 0 + 0 + + + 1 + 51 + 715 + 0 + 1 + + + 176 + 66 + 729 + 1 + 1 + + + 35 + 61 + 749 + 0 + 0 + + + 35 + 70 + 758 + 0 + 0 + + + 35 + 79 + 752 + 3 + 0 + + + 35 + 55 + 761 + 0 + 0 + + + 35 + 75 + 766 + 3 + 0 + + + 35 + 51 + 783 + 0 + 0 + + + 35 + 78 + 782 + 0 + 0 + + + 35 + 62 + 786 + 0 + 0 + + + 35 + 74 + 788 + 0 + 0 + + + 35 + 61 + 797 + 0 + 0 + + + 35 + 70 + 806 + 0 + 0 + + + 35 + 55 + 809 + 0 + 0 + + + 5 + 86 + 799 + 0 + 0 + + + 3 + 85 + 801 + 6 + 0 + + + 1025 + 84 + 807 + 6 + 0 + + + 3 + 84 + 801 + 4 + 0 + + + 7 + 84 + 800 + 5 + 0 + + + 105 + 81 + 807 + 0 + 0 + + + 105 + 81 + 806 + 0 + 0 + + + 958 + 81 + 801 + 7 + 0 + + + 103 + 86 + 812 + 0 + 0 + + + 103 + 86 + 811 + 0 + 0 + + + 111 + 84 + 812 + 4 + 0 + + + 111 + 83 + 812 + 4 + 0 + + + 101 + 83 + 810 + 4 + 0 + + + 101 + 82 + 809 + 4 + 0 + + + 1 + 85 + 804 + 0 + 1 + + + 35 + 81 + 788 + 0 + 0 + + + 35 + 89 + 789 + 0 + 0 + + + 932 + 92 + 807 + 0 + 0 + + + 954 + 92 + 800 + 0 + 0 + + + 953 + 91 + 801 + 4 + 0 + + + 967 + 90 + 811 + 0 + 0 + + + 967 + 90 + 810 + 0 + 0 + + + 966 + 89 + 810 + 0 + 0 + + + 178 + 90 + 802 + 1 + 1 + + + 177 + 88 + 801 + 1 + 1 + + + 35 + 84 + 779 + 0 + 0 + + + 35 + 91 + 778 + 0 + 0 + + + 35 + 99 + 779 + 5 + 0 + + + 35 + 103 + 791 + 4 + 0 + + + 35 + 101 + 802 + 2 + 0 + + + 35 + 98 + 812 + 1 + 0 + + + 35 + 103 + 770 + 5 + 0 + + + 35 + 87 + 766 + 3 + 0 + + + 35 + 81 + 761 + 3 + 0 + + + 945 + 90 + 763 + 3 + 0 + + + 35 + 99 + 761 + 2 + 0 + + + 35 + 70 + 758 + 0 + 0 + + + 35 + 79 + 752 + 3 + 0 + + + 35 + 93 + 753 + 3 + 0 + + + 35 + 92 + 758 + 4 + 0 + + + 35 + 88 + 749 + 3 + 0 + + + 35 + 101 + 750 + 0 + 0 + + + 944 + 66 + 741 + 0 + 0 + + + 35 + 74 + 740 + 0 + 0 + + + 35 + 81 + 740 + 0 + 0 + + + 35 + 89 + 741 + 0 + 0 + + + 35 + 99 + 740 + 0 + 0 + + + 21 + 64 + 732 + 0 + 0 + + + 21 + 64 + 728 + 0 + 0 + + + 35 + 78 + 734 + 0 + 0 + + + 35 + 84 + 731 + 0 + 0 + + + 35 + 91 + 730 + 0 + 0 + + + 176 + 66 + 729 + 1 + 1 + + + 55 + 64 + 725 + 2 + 0 + + + 35 + 96 + 726 + 7 + 0 + + + 35 + 109 + 725 + 0 + 0 + + + 35 + 106 + 734 + 0 + 0 + + + 35 + 106 + 746 + 0 + 0 + + + 35 + 117 + 736 + 0 + 0 + + + 35 + 118 + 748 + 6 + 0 + + + 35 + 112 + 756 + 0 + 0 + + + 35 + 120 + 728 + 0 + 0 + + + 35 + 126 + 755 + 0 + 0 + + + 35 + 106 + 765 + 1 + 0 + + + 35 + 118 + 766 + 5 + 0 + + + 35 + 117 + 770 + 6 + 0 + + + 35 + 125 + 771 + 5 + 0 + + + 35 + 110 + 777 + 6 + 0 + + + 35 + 89 + 789 + 0 + 0 + + + 35 + 112 + 787 + 7 + 0 + + + 35 + 116 + 797 + 0 + 0 + + + 932 + 92 + 807 + 0 + 0 + + + 954 + 92 + 800 + 0 + 0 + + + 953 + 91 + 801 + 4 + 0 + + + 35 + 101 + 802 + 2 + 0 + + + 178 + 90 + 802 + 1 + 1 + + + 177 + 88 + 801 + 1 + 1 + + + 967 + 90 + 811 + 0 + 0 + + + 967 + 90 + 810 + 0 + 0 + + + 966 + 89 + 810 + 0 + 0 + + + 35 + 98 + 812 + 1 + 0 + + + 35 + 108 + 811 + 3 + 0 + + + 35 + 119 + 810 + 1 + 0 + + + 35 + 129 + 798 + 3 + 0 + + + 35 + 130 + 810 + 2 + 0 + + + 35 + 138 + 792 + 1 + 0 + + + 35 + 139 + 802 + 2 + 0 + + + 35 + 142 + 814 + 3 + 0 + + + 35 + 128 + 784 + 4 + 0 + + + 35 + 137 + 781 + 7 + 0 + + + 35 + 134 + 772 + 6 + 0 + + + 35 + 141 + 775 + 0 + 0 + + + 35 + 133 + 765 + 5 + 0 + + + 35 + 137 + 754 + 0 + 0 + + + 35 + 106 + 746 + 0 + 0 + + + 35 + 118 + 748 + 6 + 0 + + + 35 + 128 + 744 + 0 + 0 + + + 35 + 144 + 774 + 7 + 0 + + + 35 + 117 + 736 + 0 + 0 + + + 35 + 135 + 743 + 3 + 0 + + + 35 + 120 + 728 + 0 + 0 + + + 35 + 128 + 731 + 0 + 0 + + + 35 + 138 + 734 + 0 + 0 + + + 35 + 157 + 773 + 0 + 0 + + + 35 + 154 + 782 + 0 + 0 + + + 35 + 147 + 788 + 0 + 0 + + + 35 + 165 + 784 + 0 + 0 + + + 35 + 149 + 798 + 0 + 0 + + + 35 + 154 + 794 + 0 + 0 + + + 395 + 166 + 798 + 2 + 0 + + + 35 + 166 + 796 + 6 + 0 + + + 35 + 139 + 802 + 2 + 0 + + + 35 + 160 + 804 + 0 + 0 + + + 35 + 130 + 810 + 2 + 0 + + + 35 + 142 + 814 + 3 + 0 + + + 35 + 147 + 809 + 2 + 0 + + + 35 + 154 + 813 + 1 + 0 + + + 35 + 166 + 814 + 5 + 0 + + + 21 + 172 + 791 + 6 + 0 + + + 21 + 169 + 791 + 0 + 0 + + + 32 + 174 + 798 + 4 + 0 + + + 21 + 172 + 793 + 4 + 0 + + + 33 + 170 + 796 + 2 + 0 + + + 1006 + 170 + 792 + 4 + 0 + + + 21 + 169 + 793 + 2 + 0 + + + 21 + 175 + 807 + 4 + 0 + + + 21 + 175 + 806 + 4 + 0 + + + 21 + 173 + 804 + 0 + 0 + + + 21 + 172 + 804 + 0 + 0 + + + 405 + 172 + 800 + 2 + 0 + + + 21 + 170 + 807 + 0 + 0 + + + 21 + 170 + 806 + 0 + 0 + + + 395 + 169 + 801 + 4 + 0 + + + 21 + 173 + 809 + 2 + 0 + + + 21 + 172 + 809 + 2 + 0 + + + 198 + 171 + 794 + 0 + 1 + + + 196 + 170 + 805 + 2 + 1 + + + 35 + 183 + 791 + 3 + 0 + + + 35 + 176 + 792 + 0 + 0 + + + 35 + 181 + 813 + 5 + 0 + + + 35 + 185 + 802 + 0 + 0 + + + 35 + 168 + 776 + 0 + 0 + + + 35 + 176 + 779 + 0 + 0 + + + 35 + 186 + 782 + 0 + 0 + + + 57 + 64 + 116 + 0 + 0 + + + 6 + 304 + 2453 + 0 + 0 + + + 175 + 318 + 2454 + 6 + 0 + + + 6 + 319 + 2457 + 0 + 0 + + + 14 + 316 + 2456 + 0 + 0 + + + 51 + 413 + 3373 + 0 + 0 + + + 205 + 415 + 3382 + 6 + 0 + + + 205 + 411 + 3378 + 6 + 0 + + + 205 + 409 + 3380 + 6 + 0 + + + 51 + 409 + 3377 + 2 + 0 + + + 51 + 415 + 3390 + 6 + 0 + + + 205 + 414 + 3388 + 6 + 0 + + + 51 + 411 + 3388 + 0 + 0 + + + 51 + 415 + 3394 + 6 + 0 + + + 205 + 414 + 3397 + 6 + 0 + + + 218 + 411 + 3399 + 2 + 0 + + + 219 + 411 + 3398 + 2 + 0 + + + 51 + 411 + 3395 + 4 + 0 + + + 205 + 410 + 3393 + 6 + 0 + + + 51 + 409 + 3399 + 0 + 0 + + + 51 + 423 + 3381 + 2 + 0 + + + 205 + 423 + 3378 + 4 + 0 + + + 51 + 420 + 3379 + 4 + 0 + + + 51 + 426 + 3375 + 0 + 0 + + + 51 + 424 + 3375 + 0 + 0 + + + 51 + 430 + 3380 + 6 + 0 + + + 205 + 425 + 3381 + 4 + 0 + + + 51 + 426 + 3384 + 4 + 0 + + + 29 + 438 + 3375 + 0 + 0 + + + 1187 + 446 + 3367 + 4 + 0 + + + 1012 + 444 + 3366 + 4 + 0 + + + 730 + 442 + 3367 + 5 + 0 + + + 1155 + 446 + 3374 + 7 + 0 + + + 730 + 446 + 3373 + 2 + 0 + + + 730 + 444 + 3375 + 6 + 0 + + + 3 + 442 + 3372 + 0 + 0 + + + 29 + 441 + 3375 + 0 + 0 + + + 278 + 441 + 3372 + 0 + 0 + + + 3 + 441 + 3369 + 0 + 0 + + + 3 + 440 + 3371 + 0 + 0 + + + 278 + 440 + 3369 + 0 + 0 + + + 65 + 406 + 3392 + 1 + 1 + + + 51 + 415 + 3402 + 6 + 0 + + + 205 + 414 + 3404 + 6 + 0 + + + 205 + 414 + 3400 + 6 + 0 + + + 51 + 412 + 3405 + 4 + 0 + + + 245 + 412 + 3402 + 0 + 0 + + + 219 + 411 + 3403 + 0 + 0 + + + 218 + 411 + 3402 + 2 + 0 + + + 220 + 411 + 3401 + 2 + 0 + + + 218 + 411 + 3400 + 2 + 0 + + + 205 + 410 + 3405 + 6 + 0 + + + 219 + 410 + 3404 + 0 + 0 + + + 219 + 410 + 3403 + 4 + 0 + + + 218 + 410 + 3401 + 0 + 0 + + + 205 + 409 + 3404 + 6 + 0 + + + 51 + 408 + 3402 + 2 + 0 + + + 205 + 408 + 3400 + 6 + 0 + + + 15 + 253 + 1568 + 4 + 0 + + + 3 + 252 + 1568 + 2 + 0 + + + 6 + 249 + 1572 + 2 + 0 + + + 15 + 249 + 1568 + 4 + 0 + + + 3 + 257 + 1571 + 2 + 0 + + + 3 + 257 + 1568 + 2 + 0 + + + 15 + 256 + 1572 + 2 + 0 + + + 1 + 254 + 1572 + 1 + 1 + + + 1 + 253 + 1571 + 0 + 1 + + + 1 + 251 + 1571 + 0 + 1 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 703 + 2333 + 2 + 0 + + + 579 + 703 + 2331 + 2 + 0 + + + 579 + 703 + 2343 + 2 + 0 + + + 571 + 703 + 2337 + 4 + 0 + + + 579 + 699 + 2338 + 0 + 0 + + + 579 + 698 + 2338 + 0 + 0 + + + 579 + 696 + 2338 + 0 + 0 + + + 581 + 703 + 2349 + 4 + 0 + + + 579 + 703 + 2346 + 2 + 0 + + + 581 + 704 + 2328 + 0 + 0 + + + 579 + 711 + 2338 + 0 + 0 + + + 579 + 709 + 2338 + 0 + 0 + + + 159 + 703 + 2340 + 0 + 1 + + + 157 + 703 + 2337 + 0 + 1 + + + 160 + 702 + 2338 + 1 + 1 + + + 158 + 705 + 2338 + 1 + 1 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 703 + 2333 + 2 + 0 + + + 579 + 703 + 2331 + 2 + 0 + + + 579 + 703 + 2343 + 2 + 0 + + + 571 + 703 + 2337 + 4 + 0 + + + 579 + 699 + 2338 + 0 + 0 + + + 579 + 698 + 2338 + 0 + 0 + + + 579 + 696 + 2338 + 0 + 0 + + + 581 + 703 + 2349 + 4 + 0 + + + 579 + 703 + 2346 + 2 + 0 + + + 581 + 704 + 2328 + 0 + 0 + + + 579 + 711 + 2338 + 0 + 0 + + + 579 + 709 + 2338 + 0 + 0 + + + 159 + 703 + 2340 + 0 + 1 + + + 157 + 703 + 2337 + 0 + 1 + + + 160 + 702 + 2338 + 1 + 1 + + + 158 + 705 + 2338 + 1 + 1 + + + 3 + 716 + 2337 + 0 + 0 + + + 581 + 715 + 2339 + 6 + 0 + + + 6 + 715 + 2337 + 6 + 0 + + + 579 + 712 + 2338 + 0 + 0 + + + 585 + 416 + 2051 + 4 + 0 + + + 569 + 416 + 2050 + 4 + 0 + + + 160 + 415 + 2051 + 1 + 1 + + + 158 + 418 + 2051 + 1 + 1 + + + 159 + 416 + 2053 + 0 + 1 + + + 157 + 416 + 2050 + 0 + 1 + + + 618 + 413 + 2999 + 6 + 0 + + + 617 + 420 + 2991 + 4 + 0 + + + 617 + 420 + 2992 + 4 + 0 + + + 584 + 418 + 2994 + 0 + 0 + + + 586 + 417 + 2993 + 0 + 0 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 694 + 2338 + 0 + 0 + + + 6 + 691 + 2339 + 4 + 0 + + + 581 + 691 + 2338 + 2 + 0 + + + 3 + 690 + 2339 + 0 + 0 + + + 579 + 703 + 2333 + 2 + 0 + + + 579 + 703 + 2331 + 2 + 0 + + + 579 + 703 + 2343 + 2 + 0 + + + 571 + 703 + 2337 + 4 + 0 + + + 579 + 699 + 2338 + 0 + 0 + + + 579 + 698 + 2338 + 0 + 0 + + + 579 + 696 + 2338 + 0 + 0 + + + 581 + 703 + 2349 + 4 + 0 + + + 579 + 703 + 2346 + 2 + 0 + + + 581 + 704 + 2328 + 0 + 0 + + + 579 + 711 + 2338 + 0 + 0 + + + 579 + 709 + 2338 + 0 + 0 + + + 3 + 716 + 2337 + 0 + 0 + + + 581 + 715 + 2339 + 6 + 0 + + + 6 + 715 + 2337 + 6 + 0 + + + 579 + 712 + 2338 + 0 + 0 + + + 159 + 703 + 2340 + 0 + 1 + + + 157 + 703 + 2337 + 0 + 1 + + + 160 + 702 + 2338 + 1 + 1 + + + 158 + 705 + 2338 + 1 + 1 + + + 6 + 60 + 1383 + 0 + 0 + + + 5 + 60 + 1384 + 0 + 0 + + + 45 + 79 + 1391 + 4 + 0 + + + 45 + 78 + 1391 + 4 + 0 + + + 15 + 78 + 1386 + 4 + 0 + + + 42 + 78 + 1392 + 0 + 0 + + + 15 + 84 + 1391 + 2 + 0 + + + 3 + 82 + 1388 + 4 + 0 + + + 15 + 82 + 1386 + 6 + 0 + + + 3 + 80 + 1386 + 0 + 0 + + + 3 + 85 + 1393 + 0 + 0 + + + 15 + 84 + 1395 + 4 + 0 + + + 3 + 83 + 1395 + 4 + 0 + + + 45 + 80 + 1394 + 2 + 0 + + + 45 + 80 + 1393 + 2 + 0 + + + 45 + 80 + 1392 + 2 + 0 + + + 2 + 79 + 1389 + 0 + 1 + + + 1 + 84 + 1389 + 0 + 1 + + + 1 + 82 + 1397 + 1 + 1 + + + 1 + 82 + 1393 + 1 + 1 + + + 15 + 391 + 2714 + 0 + 0 + + + 15 + 394 + 2710 + 6 + 0 + + + 15 + 398 + 2713 + 4 + 0 + + + 15 + 395 + 2717 + 2 + 0 + + + 6 + 395 + 2714 + 0 + 0 + + + 110 + 686 + 3268 + 0 + 0 + + + 110 + 684 + 3270 + 0 + 0 + + + 195 + 682 + 3270 + 0 + 0 + + + 195 + 682 + 3267 + 0 + 0 + + + 195 + 682 + 3265 + 0 + 0 + + + 114 + 680 + 3269 + 0 + 0 + + + 195 + 680 + 3267 + 0 + 0 + + + 110 + 686 + 3272 + 0 + 0 + + + 110 + 685 + 3278 + 0 + 0 + + + 110 + 685 + 3275 + 0 + 0 + + + 111 + 683 + 3275 + 2 + 0 + + + 114 + 683 + 3273 + 0 + 0 + + + 102 + 681 + 3278 + 0 + 0 + + + 102 + 681 + 3276 + 0 + 0 + + + 102 + 680 + 3273 + 0 + 0 + + + 610 + 683 + 3280 + 6 + 0 + + + 610 + 687 + 3303 + 0 + 0 + + + 610 + 683 + 3298 + 3 + 0 + + + 112 + 692 + 3270 + 0 + 0 + + + 112 + 691 + 3265 + 0 + 0 + + + 112 + 690 + 3269 + 0 + 0 + + + 112 + 689 + 3267 + 0 + 0 + + + 110 + 688 + 3271 + 0 + 0 + + + 110 + 694 + 3276 + 0 + 0 + + + 610 + 691 + 3277 + 6 + 0 + + + 110 + 691 + 3272 + 0 + 0 + + + 110 + 689 + 3274 + 0 + 0 + + + 110 + 688 + 3276 + 0 + 0 + + + 610 + 694 + 3283 + 6 + 0 + + + 609 + 692 + 3285 + 0 + 0 + + + 610 + 692 + 3282 + 7 + 0 + + + 609 + 690 + 3280 + 3 + 0 + + + 610 + 689 + 3281 + 3 + 0 + + + 609 + 695 + 3288 + 3 + 0 + + + 610 + 693 + 3288 + 1 + 0 + + + 610 + 692 + 3292 + 3 + 0 + + + 609 + 688 + 3293 + 2 + 0 + + + 110 + 702 + 3267 + 0 + 0 + + + 639 + 701 + 3279 + 6 + 0 + + + 616 + 703 + 3283 + 0 + 0 + + + 610 + 702 + 3284 + 5 + 0 + + + 638 + 701 + 3280 + 2 + 0 + + + 609 + 696 + 3285 + 4 + 0 + + + 609 + 703 + 3293 + 4 + 0 + + + 610 + 703 + 3290 + 4 + 0 + + + 610 + 696 + 3291 + 1 + 0 + + + 610 + 710 + 3271 + 7 + 0 + + + 110 + 707 + 3268 + 0 + 0 + + + 110 + 705 + 3270 + 0 + 0 + + + 609 + 710 + 3275 + 3 + 0 + + + 114 + 707 + 3273 + 0 + 0 + + + 610 + 704 + 3274 + 1 + 0 + + + 609 + 711 + 3287 + 6 + 0 + + + 609 + 704 + 3280 + 2 + 0 + + + 610 + 710 + 3292 + 7 + 0 + + + 610 + 706 + 3292 + 7 + 0 + + + 609 + 708 + 3296 + 7 + 0 + + + 637 + 707 + 3297 + 0 + 0 + + + 610 + 705 + 3297 + 6 + 0 + + + 107 + 717 + 3266 + 6 + 0 + + + 109 + 716 + 3265 + 6 + 0 + + + 109 + 715 + 3265 + 0 + 0 + + + 610 + 716 + 3279 + 6 + 0 + + + 610 + 716 + 3273 + 2 + 0 + + + 610 + 714 + 3279 + 6 + 0 + + + 610 + 714 + 3276 + 0 + 0 + + + 609 + 713 + 3273 + 2 + 0 + + + 610 + 716 + 3286 + 7 + 0 + + + 610 + 713 + 3281 + 2 + 0 + + + 609 + 714 + 3288 + 6 + 0 + + + 111 + 713 + 3301 + 5 + 0 + + + 111 + 712 + 3301 + 5 + 0 + + + 111 + 711 + 3310 + 1 + 0 + + + 111 + 709 + 3309 + 0 + 0 + + + 111 + 709 + 3308 + 0 + 0 + + + 109 + 709 + 3304 + 7 + 0 + + + 111 + 716 + 3305 + 4 + 0 + + + 107 + 715 + 3306 + 3 + 0 + + + 107 + 714 + 3307 + 2 + 0 + + + 107 + 712 + 3310 + 1 + 0 + + + 107 + 679 + 3277 + 7 + 0 + + + 102 + 679 + 3275 + 0 + 0 + + + 102 + 678 + 3272 + 0 + 0 + + + 102 + 677 + 3275 + 0 + 0 + + + 107 + 676 + 3272 + 6 + 0 + + + 51 + 669 + 3286 + 4 + 0 + + + 51 + 668 + 3283 + 6 + 0 + + + 51 + 667 + 3286 + 4 + 0 + + + 51 + 667 + 3284 + 2 + 0 + + + 51 + 667 + 3281 + 2 + 0 + + + 51 + 670 + 3292 + 6 + 0 + + + 51 + 669 + 3294 + 4 + 0 + + + 55 + 669 + 3291 + 6 + 0 + + + 51 + 669 + 3290 + 0 + 0 + + + 20 + 668 + 3292 + 6 + 0 + + + 63 + 667 + 3295 + 6 + 0 + + + 51 + 667 + 3290 + 0 + 0 + + + 51 + 665 + 3290 + 0 + 0 + + + 71 + 664 + 3294 + 2 + 0 + + + 22 + 664 + 3292 + 0 + 0 + + + 22 + 664 + 3291 + 0 + 0 + + + 51 + 664 + 3297 + 0 + 0 + + + 135 + 668 + 3281 + 0 + 1 + + + 22 + 670 + 3290 + 0 + 1 + + + diff --git a/GameServer/conf/server/locs/backup/tmp/GameObjectLoc.xml.gz b/GameServer/conf/server/locs/backup/tmp/GameObjectLoc.xml.gz new file mode 100644 index 0000000..fc3af75 Binary files /dev/null and b/GameServer/conf/server/locs/backup/tmp/GameObjectLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/tmp/ItemLoc.xml b/GameServer/conf/server/locs/backup/tmp/ItemLoc.xml new file mode 100644 index 0000000..1707b44 --- /dev/null +++ b/GameServer/conf/server/locs/backup/tmp/ItemLoc.xml @@ -0,0 +1,2460 @@ + + + 739 + 89 + 516 + 1 + 15 + + + 16 + 217 + 453 + 1 + 15 + + + 337 + 170 + 3532 + 1 + 15 + + + 337 + 171 + 3532 + 1 + 15 + + + 21 + 158 + 3523 + 1 + 15 + + + 19 + 126 + 3511 + 1 + 15 + + + 133 + 586 + 614 + 1 + 30 + + + 262 + 265 + 102 + 1 + 30 + + + 637 + 129 + 112 + 3 + 10 + + + 637 + 131 + 112 + 3 + 10 + + + 637 + 131 + 114 + 3 + 10 + + + 33 + 117 + 669 + 1 + 30 + + + 35 + 138 + 668 + 1 + 30 + + + 11 + 140 + 648 + 1 + 30 + + + 241 + 160 + 621 + 1 + 5 + + + 241 + 158 + 621 + 1 + 5 + + + 241 + 160 + 623 + 1 + 5 + + + 241 + 158 + 623 + 1 + 5 + + + 1263 + 121 + 609 + 1 + 15 + + + 156 + 231 + 508 + 1 + 15 + + + 13 + 132 + 668 + 1 + 15 + + + 375 + 588 + 519 + 1 + 30 + + + 379 + 585 + 519 + 1 + 30 + + + 13 + 522 + 462 + 1 + 30 + + + 603 + 440 + 484 + 1 + 10 + + + 18 + 248 + 596 + 1 + 60 + + + 18 + 248 + 598 + 1 + 60 + + + 18 + 248 + 600 + 1 + 60 + + + 18 + 248 + 602 + 1 + 60 + + + 18 + 248 + 604 + 1 + 60 + + + 18 + 248 + 606 + 1 + 60 + + + 18 + 252 + 596 + 1 + 60 + + + 18 + 252 + 598 + 1 + 60 + + + 18 + 252 + 600 + 1 + 60 + + + 18 + 252 + 602 + 1 + 60 + + + 18 + 252 + 604 + 1 + 60 + + + 18 + 252 + 606 + 1 + 60 + + + 18 + 256 + 596 + 1 + 60 + + + 18 + 256 + 598 + 1 + 60 + + + 18 + 256 + 600 + 1 + 60 + + + 18 + 256 + 602 + 1 + 60 + + + 18 + 256 + 604 + 1 + 60 + + + 18 + 256 + 606 + 1 + 60 + + + 18 + 260 + 596 + 1 + 60 + + + 18 + 260 + 598 + 1 + 60 + + + 18 + 260 + 600 + 1 + 60 + + + 18 + 260 + 602 + 1 + 60 + + + 18 + 260 + 604 + 1 + 60 + + + 18 + 260 + 606 + 1 + 60 + + + 621 + 430 + 559 + 1 + 30 + + + 341 + 430 + 1502 + 1 + 30 + + + 377 + 403 + 567 + 1 + 30 + + + 210 + 408 + 547 + 1 + 30 + + + 190 + 277 + 1571 + 1 + 30 + + + 190 + 278 + 1578 + 1 + 30 + + + 18 + 327 + 627 + 1 + 60 + + + 18 + 329 + 627 + 1 + 60 + + + 18 + 331 + 627 + 1 + 60 + + + 18 + 327 + 629 + 1 + 60 + + + 18 + 329 + 629 + 1 + 60 + + + 18 + 331 + 629 + 1 + 60 + + + 241 + 331 + 633 + 1 + 30 + + + 241 + 329 + 633 + 1 + 30 + + + 241 + 327 + 633 + 1 + 30 + + + 469 + 362 + 602 + 1 + 10 + + + 469 + 361 + 603 + 1 + 10 + + + 140 + 345 + 605 + 1 + 30 + + + 294 + 344 + 606 + 1 + 30 + + + 167 + 343 + 606 + 1 + 30 + + + 168 + 343 + 608 + 1 + 30 + + + 295 + 346 + 1545 + 1 + 30 + + + 386 + 345 + 1545 + 1 + 30 + + + 144 + 344 + 1545 + 1 + 30 + + + 182 + 278 + 657 + 1 + 30 + + + 194 + 110 + 518 + 1 + 30 + + + 15 + 107 + 526 + 1 + 30 + + + 14 + 110 + 526 + 1 + 30 + + + 14 + 110 + 527 + 1 + 30 + + + 135 + 119 + 523 + 1 + 30 + + + 18 + 119 + 530 + 1 + 30 + + + 18 + 119 + 532 + 1 + 30 + + + 18 + 119 + 534 + 1 + 30 + + + 18 + 118 + 530 + 1 + 30 + + + 18 + 118 + 532 + 1 + 30 + + + 18 + 118 + 534 + 1 + 30 + + + 211 + 127 + 1461 + 1 + 30 + + + 13 + 124 + 1458 + 1 + 30 + + + 10 + 150 + 3330 + 100 + 60 + + + 186 + 148 + 3337 + 1 + 60 + + + 186 + 149 + 3337 + 1 + 60 + + + 152 + 150 + 3336 + 1 + 60 + + + 152 + 152 + 3335 + 1 + 60 + + + 10 + 147 + 3337 + 10 + 60 + + + 10 + 149 + 3335 + 10 + 60 + + + 10 + 149 + 3339 + 10 + 60 + + + 10 + 150 + 3335 + 10 + 60 + + + 10 + 150 + 3339 + 10 + 60 + + + 10 + 152 + 3337 + 10 + 60 + + + 251 + 121 + 465 + 1 + 30 + + + 21 + 120 + 456 + 1 + 30 + + + 10 + 118 + 452 + 10 + 30 + + + 10 + 121 + 449 + 10 + 30 + + + 189 + 377 + 1446 + 1 + 30 + + + 16 + 306 + 522 + 1 + 30 + + + 251 + 296 + 3329 + 1 + 30 + + + 135 + 234 + 507 + 1 + 30 + + + 228 + 231 + 548 + 1 + 30 + + + 228 + 230 + 548 + 1 + 30 + + + 228 + 229 + 548 + 1 + 30 + + + 228 + 231 + 549 + 1 + 30 + + + 228 + 230 + 549 + 1 + 30 + + + 228 + 229 + 549 + 1 + 30 + + + 228 + 231 + 550 + 1 + 30 + + + 228 + 230 + 550 + 1 + 30 + + + 228 + 229 + 550 + 1 + 30 + + + 19 + 122 + 603 + 1 + 30 + + + 41 + 361 + 2458 + 1 + 60 + + + 140 + 133 + 661 + 1 + 60 + + + 135 + 134 + 660 + 1 + 60 + + + 18 + 141 + 3489 + 1 + 60 + + + 17 + 141 + 3488 + 1 + 60 + + + 62 + 129 + 1601 + 1 + 60 + + + 14 + 139 + 2537 + 1 + 60 + + + 14 + 140 + 2537 + 1 + 60 + + + 14 + 140 + 2538 + 1 + 60 + + + 14 + 139 + 2536 + 1 + 60 + + + 36 + 77 + 1618 + 1 + 60 + + + 17 + 64 + 677 + 1 + 60 + + + 21 + 60 + 672 + 1 + 60 + + + 18 + 79 + 693 + 1 + 60 + + + 140 + 78 + 693 + 1 + 60 + + + 31 + 67 + 587 + 4 + 60 + + + 32 + 74 + 583 + 4 + 60 + + + 33 + 183 + 649 + 4 + 60 + + + 0 + 602 + 699 + 1 + 60 + + + 20 + 606 + 700 + 1 + 60 + + + 20 + 606 + 703 + 1 + 60 + + + 5 + 602 + 704 + 1 + 60 + + + 20 + 600 + 702 + 1 + 60 + + + 12 + 609 + 703 + 1 + 60 + + + 20 + 611 + 701 + 1 + 60 + + + 20 + 614 + 703 + 1 + 60 + + + 20 + 603 + 711 + 1 + 60 + + + 20 + 607 + 711 + 1 + 60 + + + 20 + 608 + 709 + 1 + 60 + + + 0 + 608 + 707 + 1 + 60 + + + 20 + 615 + 707 + 1 + 60 + + + 20 + 604 + 706 + 1 + 60 + + + 20 + 601 + 707 + 1 + 60 + + + 601 + 639 + 737 + 1 + 60 + + + 10 + 470 + 672 + 3 + 60 + + + 10 + 470 + 673 + 3 + 60 + + + 10 + 471 + 674 + 3 + 60 + + + 10 + 468 + 674 + 3 + 60 + + + 10 + 470 + 675 + 3 + 60 + + + 799 + 574 + 583 + 1 + 60 + + + 799 + 574 + 585 + 1 + 60 + + + 799 + 574 + 586 + 1 + 60 + + + 757 + 597 + 543 + 1 + 60 + + + 251 + 432 + 1424 + 1 + 60 + + + 465 + 429 + 1434 + 1 + 60 + + + 319 + 223 + 624 + 1 + 30 + + + 320 + 222 + 624 + 1 + 30 + + + 337 + 176 + 480 + 1 + 60 + + + 135 + 177 + 2370 + 1 + 60 + + + 252 + 175 + 2370 + 1 + 60 + + + 140 + 176 + 2370 + 1 + 60 + + + 143 + 181 + 2374 + 1 + 60 + + + 338 + 181 + 1424 + 1 + 60 + + + 341 + 180 + 1424 + 1 + 60 + + + 251 + 178 + 1424 + 1 + 60 + + + 252 + 177 + 1424 + 1 + 60 + + + 252 + 176 + 1424 + 1 + 60 + + + 596 + 367 + 3372 + 1 + 60 + + + 236 + 90 + 544 + 1 + 60 + + + 236 + 91 + 551 + 1 + 60 + + + 55 + 86 + 542 + 1 + 60 + + + 236 + 79 + 540 + 1 + 60 + + + 55 + 83 + 548 + 1 + 60 + + + 388 + 264 + 1402 + 1 + 30 + + + 389 + 265 + 1402 + 1 + 30 + + + 193 + 231 + 500 + 1 + 60 + + + 193 + 233 + 500 + 1 + 60 + + + 193 + 232 + 497 + 1 + 60 + + + 132 + 234 + 500 + 1 + 60 + + + 132 + 231 + 497 + 1 + 60 + + + 10 + 223 + 3280 + 1 + 60 + + + 10 + 223 + 3281 + 4 + 60 + + + 20 + 216 + 3289 + 1 + 15 + + + 20 + 212 + 3292 + 1 + 15 + + + 20 + 216 + 3299 + 1 + 15 + + + 20 + 205 + 3288 + 1 + 15 + + + 20 + 210 + 3288 + 1 + 15 + + + 20 + 207 + 3283 + 1 + 15 + + + 20 + 209 + 3283 + 1 + 15 + + + 11 + 197 + 3277 + 3 + 30 + + + 20 + 194 + 3267 + 1 + 30 + + + 219 + 201 + 3234 + 1 + 15 + + + 219 + 204 + 3232 + 1 + 15 + + + 219 + 209 + 3236 + 1 + 15 + + + 219 + 208 + 3240 + 1 + 15 + + + 186 + 204 + 3295 + 1 + 60 + + + 99 + 198 + 3307 + 1 + 60 + + + 7 + 106 + 489 + 1 + 60 + + + 6 + 106 + 487 + 1 + 60 + + + 128 + 106 + 485 + 1 + 60 + + + 1 + 105 + 484 + 1 + 60 + + + 0 + 103 + 484 + 1 + 60 + + + 132 + 307 + 1475 + 1 + 60 + + + 183 + 310 + 1479 + 1 + 60 + + + 21 + 35 + 542 + 1 + 60 + + + 156 + 33 + 539 + 1 + 60 + + + 140 + 13 + 541 + 1 + 60 + + + 1111 + 15 + 541 + 1 + 60 + + + 21 + 17 + 536 + 1 + 60 + + + 21 + 23 + 527 + 1 + 60 + + + 21 + 23 + 526 + 1 + 60 + + + 21 + 16 + 524 + 1 + 60 + + + 20 + 16 + 522 + 1 + 60 + + + 20 + 14 + 519 + 1 + 60 + + + 21 + 26 + 518 + 1 + 60 + + + 21 + 27 + 518 + 1 + 60 + + + 20 + 25 + 506 + 1 + 60 + + + 21 + 13 + 509 + 1 + 60 + + + 1284 + 11 + 3375 + 1 + 60 + + + 1284 + 9 + 3373 + 1 + 60 + + + 1284 + 5 + 3377 + 1 + 60 + + + 27 + 8 + 3401 + 1 + 60 + + + 27 + 17 + 3401 + 1 + 60 + + + 33 + 339 + 703 + 3 + 60 + + + 31 + 408 + 3532 + 1 + 30 + + + 31 + 405 + 3537 + 1 + 30 + + + 31 + 409 + 3543 + 1 + 30 + + + 31 + 414 + 3540 + 1 + 30 + + + 31 + 413 + 3534 + 1 + 30 + + + 219 + 404 + 3518 + 1 + 15 + + + 10 + 415 + 3476 + 100 + 60 + + + 10 + 419 + 3477 + 100 + 60 + + + 10 + 420 + 3484 + 100 + 60 + + + 10 + 415 + 3483 + 100 + 60 + + + 13 + 509 + 506 + 1 + 60 + + + 4 + 135 + 437 + 1 + 30 + + + 34 + 153 + 443 + 3 + 30 + + + 471 + 141 + 214 + 1 + 15 + + + 471 + 133 + 211 + 1 + 15 + + + 501 + 333 + 434 + 1 + 30 + + + 413 + 116 + 238 + 1 + 15 + + + 413 + 123 + 263 + 1 + 15 + + + 413 + 130 + 259 + 1 + 15 + + + 413 + 131 + 278 + 1 + 15 + + + 342 + 543 + 3274 + 1 + 15 + + + 725 + 540 + 3273 + 1 + 15 + + + 118 + 236 + 180 + 1 + 120 + + + 36 + 232 + 177 + 10 + 120 + + + 20 + 233 + 176 + 1 + 30 + + + 714 + 580 + 3524 + 1 + 30 + + + 168 + 544 + 576 + 1 + 30 + + + 167 + 543 + 576 + 1 + 30 + + + 28 + 112 + 653 + 1 + 30 + + + 160 + 168 + 164 + 1 + 120 + + + 46 + 331 + 149 + 1 + 120 + + + 40 + 67 + 177 + 3 + 20 + + + 40 + 69 + 178 + 2 + 20 + + + 11 + 212 + 367 + 4 + 20 + + + 11 + 215 + 373 + 3 + 20 + + + 11 + 222 + 370 + 4 + 20 + + + 11 + 217 + 366 + 2 + 20 + + + 11 + 213 + 364 + 2 + 20 + + + 11 + 213 + 367 + 2 + 20 + + + 190 + 228 + 290 + 4 + 20 + + + 190 + 238 + 294 + 3 + 20 + + + 190 + 235 + 300 + 3 + 20 + + + 41 + 263 + 345 + 1 + 30 + + + 36 + 263 + 347 + 2 + 30 + + + 35 + 261 + 347 + 2 + 30 + + + 35 + 261 + 347 + 2 + 30 + + + 34 + 259 + 347 + 2 + 30 + + + 33 + 257 + 347 + 2 + 30 + + + 32 + 255 + 347 + 2 + 30 + + + 31 + 253 + 347 + 2 + 30 + + + 18 + 252 + 453 + 1 + 30 + + + 18 + 251 + 453 + 1 + 30 + + + 18 + 250 + 453 + 1 + 30 + + + 18 + 249 + 453 + 1 + 30 + + + 18 + 252 + 455 + 1 + 30 + + + 18 + 251 + 455 + 1 + 30 + + + 18 + 250 + 455 + 1 + 30 + + + 18 + 249 + 455 + 1 + 30 + + + 18 + 252 + 457 + 1 + 30 + + + 18 + 251 + 457 + 1 + 30 + + + 18 + 250 + 457 + 1 + 30 + + + 18 + 249 + 457 + 1 + 30 + + + 622 + 437 + 536 + 1 + 15 + + + 622 + 437 + 538 + 1 + 15 + + + 622 + 437 + 540 + 1 + 15 + + + 622 + 437 + 543 + 1 + 15 + + + 10 + 91 + 3301 + 1 + 30 + + + 35 + 129 + 3292 + 1 + 15 + + + 36 + 129 + 3290 + 1 + 15 + + + + 34 + 146 + 3296 + 6 + 30 + + + 10 + 150 + 3300 + 7 + 30 + + + 10 + 155 + 3301 + 5 + 30 + + + 219 + 160 + 3299 + 1 + 15 + + + 12 + 161 + 3295 + 1 + 30 + + + 10 + 158 + 3292 + 8 + 30 + + + 10 + 151 + 3290 + 7 + 30 + + + 18 + 137 + 612 + 1 + 30 + + + 18 + 139 + 612 + 1 + 30 + + + 18 + 141 + 612 + 1 + 30 + + + 18 + 143 + 612 + 1 + 30 + + + 18 + 145 + 612 + 1 + 30 + + + 18 + 147 + 612 + 1 + 30 + + + 18 + 149 + 612 + 1 + 30 + + + 18 + 151 + 612 + 1 + 30 + + + 18 + 153 + 612 + 1 + 30 + + + 18 + 137 + 609 + 1 + 30 + + + 18 + 139 + 609 + 1 + 30 + + + 18 + 141 + 609 + 1 + 30 + + + 18 + 143 + 609 + 1 + 30 + + + 18 + 145 + 609 + 1 + 30 + + + 18 + 147 + 609 + 1 + 30 + + + 18 + 149 + 609 + 1 + 30 + + + 18 + 151 + 609 + 1 + 30 + + + 18 + 153 + 609 + 1 + 30 + + + 18 + 137 + 606 + 1 + 30 + + + 18 + 139 + 606 + 1 + 30 + + + 18 + 141 + 606 + 1 + 30 + + + 18 + 143 + 606 + 1 + 30 + + + 18 + 145 + 606 + 1 + 30 + + + 18 + 147 + 606 + 1 + 30 + + + 18 + 149 + 606 + 1 + 30 + + + 18 + 151 + 606 + 1 + 30 + + + 18 + 153 + 606 + 1 + 30 + + + 18 + 137 + 603 + 1 + 30 + + + 18 + 139 + 603 + 1 + 30 + + + 18 + 141 + 603 + 1 + 30 + + + 18 + 143 + 603 + 1 + 30 + + + 18 + 145 + 603 + 1 + 30 + + + 18 + 147 + 603 + 1 + 30 + + + 18 + 149 + 603 + 1 + 30 + + + 18 + 151 + 603 + 1 + 30 + + + 18 + 153 + 603 + 1 + 30 + + + 18 + 137 + 600 + 1 + 30 + + + 18 + 139 + 600 + 1 + 30 + + + 18 + 141 + 600 + 1 + 30 + + + 18 + 143 + 600 + 1 + 30 + + + 18 + 145 + 600 + 1 + 30 + + + 18 + 147 + 600 + 1 + 30 + + + 18 + 149 + 600 + 1 + 30 + + + 18 + 151 + 600 + 1 + 30 + + + 18 + 153 + 600 + 1 + 30 + + \ No newline at end of file diff --git a/GameServer/conf/server/locs/backup/tmp/NpcLoc.xml b/GameServer/conf/server/locs/backup/tmp/NpcLoc.xml new file mode 100644 index 0000000..5fbbc76 --- /dev/null +++ b/GameServer/conf/server/locs/backup/tmp/NpcLoc.xml @@ -0,0 +1,22014 @@ + + + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 611 + 2491 + 608 + 613 + 2489 + 2493 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + 323 + 610 + 1549 + 609 + 612 + 1548 + 1550 + + + + + 201 + 325 + 184 + 320 + 330 + 180 + 188 + + + + 291 + 327 + 185 + 322 + 333 + 182 + 190 + + + + + + 291 + 326 + 190 + 320 + 330 + 182 + 196 + + + + 477 + 330 + 189 + 325 + 335 + 184 + 194 + + + + 477 + 333 + 189 + 323 + 338 + 184 + 194 + + + + + + + + 290 + 231 + 3235 + 228 + 234 + 3229 + 3236 + + + 290 + 227 + 3234 + 224 + 230 + 3231 + 3235 + + + 290 + 232 + 3230 + 223 + 237 + 3226 + 3234 + + + 290 + 226 + 3233 + 222 + 230 + 3224 + 3237 + + + 290 + 227 + 3231 + 224 + 232 + 3226 + 3235 + + + + + + 292 + 382 + 3350 + 370 + 390 + 3348 + 3353 + + + 292 + 386 + 3344 + 375 + 389 + 3340 + 3347 + + + 292 + 391 + 3339 + 383 + 394 + 3330 + 3344 + + + 292 + 391 + 3345 + 388 + 395 + 3337 + 3347 + + + 292 + 394 + 3350 + 390 + 398 + 3345 + 3354 + + + 292 + 397 + 3343 + 380 + 400 + 3338 + 3346 + + + 294 + 388 + 3326 + 384 + 393 + 3323 + 3330 + + + 294 + 391 + 3316 + 377 + 398 + 3310 + 3320 + + + 294 + 395 + 3329 + 390 + 398 + 3322 + 3334 + + + 291 + 406 + 3336 + 400 + 410 + 3327 + 3341 + + + 291 + 412 + 3336 + 406 + 416 + 3332 + 3340 + + + + 293 + 411 + 3350 + 403 + 415 + 3345 + 3355 + + + + 293 + 409 + 3350 + 403 + 415 + 3345 + 3355 + + + + 293 + 407 + 3350 + 403 + 415 + 3345 + 3355 + + + + 293 + 407 + 3348 + 403 + 415 + 3345 + 3355 + + + + 293 + 407 + 3347 + 403 + 415 + 3345 + 3355 + + + + 293 + 409 + 3346 + 403 + 415 + 3345 + 3355 + + + + 293 + 411 + 3346 + 403 + 415 + 3345 + 3355 + + + + + 87 + 127 + 515 + 124 + 129 + 513 + 517 + + + 88 + 126 + 516 + 124 + 129 + 513 + 517 + + + 95 + 100 + 511 + 98 + 106 + 510 + 515 + + + 95 + 104 + 513 + 98 + 106 + 510 + 515 + + + 65 + 90 + 506 + 85 + 93 + 504 + 511 + + + 65 + 91 + 509 + 85 + 93 + 504 + 511 + + + 58 + 115 + 515 + 113 + 116 + 512 + 516 + + + 95 + 150 + 498 + 147 + 153 + 498 + 506 + + + 95 + 149 + 504 + 147 + 153 + 498 + 506 + + + 295 + 158 + 104 + 157 + 163 + 103 + 107 + + + 295 + 159 + 106 + 157 + 163 + 103 + 107 + + + 295 + 161 + 104 + 157 + 163 + 103 + 107 + + + 295 + 160 + 107 + 157 + 163 + 103 + 107 + + + 295 + 163 + 106 + 157 + 163 + 103 + 107 + + + 295 + 163 + 104 + 157 + 163 + 103 + 107 + + + 137 + 264 + 108 + 263 + 269 + 100 + 110 + + + 137 + 268 + 108 + 263 + 269 + 100 + 110 + + + 137 + 269 + 106 + 263 + 269 + 100 + 110 + + + 137 + 266 + 106 + 263 + 269 + 100 + 110 + + + 137 + 268 + 103 + 263 + 269 + 100 + 110 + + + 137 + 264 + 104 + 263 + 269 + 100 + 110 + + + 137 + 265 + 100 + 263 + 269 + 100 + 110 + + + 137 + 268 + 101 + 263 + 269 + 100 + 110 + + + 224 + 174 + 3527 + 172 + 176 + 3521 + 3528 + + + 224 + 174 + 3523 + 172 + 176 + 3521 + 3528 + + + 224 + 171 + 3523 + 170 + 176 + 3521 + 3525 + + + 222 + 164 + 3523 + 163 + 169 + 3521 + 3525 + + + 223 + 167 + 3524 + 163 + 169 + 3521 + 3525 + + + 466 + 175 + 3531 + 173 + 178 + 3530 + 3535 + + + 467 + 175 + 3534 + 173 + 178 + 3530 + 3535 + + + 298 + 178 + 3549 + 172 + 179 + 3541 + 3550 + + + 298 + 178 + 3547 + 172 + 179 + 3541 + 3550 + + + 298 + 178 + 3544 + 172 + 179 + 3541 + 3550 + + + 298 + 179 + 3545 + 172 + 179 + 3541 + 3550 + + + 298 + 176 + 3543 + 172 + 179 + 3541 + 3550 + + + 298 + 173 + 3543 + 172 + 179 + 3541 + 3550 + + + 298 + 174 + 3545 + 172 + 179 + 3541 + 3550 + + + 298 + 173 + 3548 + 172 + 179 + 3541 + 3550 + + + 298 + 175 + 3550 + 172 + 179 + 3541 + 3550 + + + 298 + 176 + 3548 + 172 + 179 + 3541 + 3550 + + + 217 + 140 + 3534 + 136 + 154 + 3522 + 3536 + + + 217 + 138 + 3527 + 136 + 154 + 3522 + 3536 + + + 217 + 145 + 3532 + 136 + 154 + 3522 + 3536 + + + 2 + 148 + 3522 + 136 + 154 + 3522 + 3536 + + + 2 + 151 + 3533 + 136 + 154 + 3522 + 3536 + + + 392 + 130 + 3546 + 128 + 133 + 3542 + 3547 + + + 221 + 117 + 3537 + 117 + 120 + 3534 + 3537 + + + 221 + 117 + 3537 + 117 + 120 + 3534 + 3537 + + + 318 + 584 + 620 + 583 + 589 + 619 + 623 + + + 338 + 588 + 620 + 583 + 589 + 619 + 623 + + + 13 + 580 + 621 + 579 + 582 + 620 + 623 + + + 13 + 575 + 618 + 573 + 577 + 615 + 620 + + + 338 + 571 + 611 + 564 + 578 + 608 + 613 + + + 8 + 572 + 620 + 564 + 572 + 614 + 620 + + + 8 + 565 + 615 + 564 + 572 + 614 + 620 + + + 334 + 559 + 615 + 557 + 561 + 613 + 617 + + + 95 + 552 + 610 + 551 + 554 + 609 + 616 + + + 95 + 552 + 613 + 551 + 554 + 609 + 616 + + + 95 + 553 + 615 + 551 + 554 + 609 + 616 + + + 95 + 554 + 614 + 551 + 554 + 609 + 616 + + + 336 + 578 + 600 + 577 + 583 + 598 + 602 + + + 337 + 580 + 601 + 577 + 583 + 598 + 602 + + + 436 + 585 + 603 + 574 + 588 + 598 + 607 + + + 318 + 580 + 606 + 574 + 588 + 603 + 607 + + + 43 + 211 + 112 + 202 + 213 + 100 + 114 + + + 43 + 207 + 111 + 202 + 213 + 100 + 114 + + + 43 + 203 + 109 + 202 + 213 + 100 + 114 + + + 43 + 205 + 102 + 202 + 213 + 100 + 114 + + + 43 + 211 + 103 + 202 + 213 + 100 + 114 + + + 43 + 210 + 105 + 202 + 213 + 100 + 114 + + + 43 + 209 + 109 + 202 + 213 + 100 + 114 + + + 43 + 206 + 107 + 202 + 213 + 100 + 114 + + + 712 + 445 + 3370 + 443 + 448 + 3368 + 3372 + + + 793 + 441 + 3376 + 438 + 442 + 3376 + 3377 + + + 792 + 452 + 3376 + 451 + 456 + 3376 + 3378 + + + 792 + 454 + 3376 + 451 + 456 + 3376 + 3378 + + + 61 + 267 + 2963 + 267 + 271 + 2962 + 2973 + + + 61 + 267 + 2965 + 267 + 271 + 2962 + 2973 + + + 61 + 270 + 2964 + 267 + 271 + 2962 + 2973 + + + 61 + 269 + 2968 + 267 + 271 + 2962 + 2973 + + + 61 + 267 + 2971 + 267 + 271 + 2962 + 2973 + + + 61 + 271 + 2972 + 267 + 271 + 2962 + 2973 + + + 61 + 270 + 2973 + 267 + 271 + 2962 + 2973 + + + 271 + 276 + 2973 + 275 + 280 + 2968 + 2973 + + + 271 + 279 + 2970 + 275 + 280 + 2968 + 2973 + + + 271 + 276 + 2969 + 275 + 280 + 2968 + 2973 + + + 343 + 284 + 2963 + 282 + 286 + 2963 + 2971 + + + 343 + 283 + 2964 + 282 + 286 + 2963 + 2971 + + + 343 + 285 + 2966 + 282 + 286 + 2963 + 2971 + + + 343 + 283 + 2969 + 282 + 286 + 2963 + 2971 + + + 343 + 277 + 2959 + 276 + 283 + 2956 + 2962 + + + 343 + 280 + 2956 + 276 + 283 + 2956 + 2962 + + + 343 + 282 + 2958 + 276 + 283 + 2956 + 2962 + + + 343 + 278 + 2960 + 276 + 283 + 2956 + 2962 + + + 343 + 281 + 2961 + 276 + 283 + 2956 + 2962 + + + 344 + 268 + 2954 + 265 + 273 + 2947 + 2956 + + + 344 + 272 + 2953 + 265 + 273 + 2947 + 2956 + + + 344 + 269 + 2949 + 265 + 273 + 2947 + 2956 + + + 344 + 265 + 2950 + 265 + 273 + 2947 + 2956 + + + 343 + 272 + 2949 + 265 + 273 + 2947 + 2956 + + + 343 + 271 + 2954 + 265 + 273 + 2947 + 2956 + + + 243 + 113 + 134 + 108 + 142 + 121 + 136 + + + 243 + 118 + 124 + 108 + 142 + 121 + 136 + + + 243 + 129 + 129 + 108 + 142 + 121 + 136 + + + 243 + 139 + 123 + 108 + 142 + 121 + 136 + + + 243 + 139 + 132 + 108 + 142 + 121 + 136 + + + 136 + 120 + 108 + 113 + 142 + 103 + 119 + + + 136 + 127 + 115 + 113 + 142 + 103 + 119 + + + 136 + 133 + 112 + 113 + 142 + 103 + 119 + + + 136 + 139 + 114 + 113 + 142 + 103 + 119 + + + 136 + 139 + 109 + 113 + 142 + 103 + 119 + + + 136 + 127 + 109 + 113 + 142 + 103 + 119 + + + 342 + 79 + 106 + 75 + 79 + 104 + 106 + + + 342 + 78 + 105 + 75 + 79 + 104 + 106 + + + 342 + 76 + 105 + 75 + 79 + 104 + 106 + + + 342 + 76 + 106 + 75 + 79 + 104 + 106 + + + 48 + 116 + 503 + 113 + 119 + 498 + 505 + + + 11 + 104 + 529 + 102 + 117 + 517 + 531 + + + 11 + 111 + 522 + 102 + 117 + 517 + 531 + + + 21 + 116 + 517 + 102 + 117 + 517 + 531 + + + 54 + 102 + 523 + 101 + 103 + 522 + 525 + + + 11 + 100 + 526 + 96 + 101 + 519 + 527 + + + 21 + 97 + 521 + 96 + 101 + 519 + 527 + + + 503 + 94 + 521 + 94 + 95 + 521 + 522 + + + 309 + 84 + 523 + 82 + 85 + 521 + 523 + + + 501 + 84 + 525 + 82 + 85 + 524 + 526 + + + 47 + 94 + 533 + 93 + 95 + 531 + 535 + + + 488 + 84 + 534 + 83 + 86 + 532 + 535 + + + 780 + 90 + 517 + 89 + 90 + 517 + 520 + + + 130 + 136 + 524 + 133 + 138 + 522 + 527 + + + 56 + 137 + 526 + 133 + 138 + 522 + 527 + + + 11 + 127 + 524 + 122 + 132 + 520 + 526 + + + 25 + 122 + 521 + 122 + 126 + 520 + 526 + + + 12 + 118 + 524 + 116 + 119 + 520 + 526 + + + 65 + 132 + 537 + 129 + 133 + 534 + 539 + + + 65 + 129 + 537 + 129 + 133 + 534 + 539 + + + 35 + 110 + 549 + 107 + 114 + 549 + 554 + + + 63 + 115 + 564 + 113 + 125 + 559 + 573 + + + 2 + 107 + 564 + 93 + 109 + 563 + 570 + + + 2 + 103 + 568 + 93 + 109 + 563 + 570 + + + 2 + 97 + 567 + 93 + 109 + 563 + 570 + + + 2 + 98 + 563 + 93 + 109 + 563 + 570 + + + 4 + 93 + 576 + 93 + 101 + 571 + 581 + + + 11 + 98 + 579 + 93 + 101 + 571 + 581 + + + 3 + 121 + 603 + 116 + 122 + 603 + 606 + + + 3 + 120 + 603 + 116 + 122 + 603 + 606 + + + 3 + 119 + 603 + 116 + 122 + 603 + 606 + + + 3 + 118 + 603 + 116 + 122 + 603 + 606 + + + 3 + 117 + 603 + 116 + 122 + 603 + 606 + + + 3 + 121 + 604 + 116 + 122 + 603 + 606 + + + 3 + 120 + 604 + 116 + 122 + 603 + 606 + + + 3 + 119 + 604 + 116 + 122 + 603 + 606 + + + 3 + 118 + 604 + 116 + 122 + 603 + 606 + + + 3 + 117 + 604 + 116 + 122 + 603 + 606 + + + 63 + 120 + 609 + 115 + 122 + 603 + 612 + + + 6 + 104 + 608 + 94 + 104 + 605 + 628 + + + 6 + 97 + 608 + 94 + 104 + 605 + 628 + + + 6 + 102 + 616 + 94 + 104 + 605 + 628 + + + 6 + 96 + 614 + 94 + 104 + 605 + 628 + + + 6 + 95 + 620 + 94 + 104 + 605 + 628 + + + 6 + 101 + 622 + 94 + 104 + 605 + 628 + + + 6 + 101 + 627 + 94 + 104 + 605 + 628 + + + 6 + 96 + 626 + 94 + 104 + 605 + 628 + + + 62 + 110 + 638 + 108 + 120 + 622 + 640 + + + 62 + 116 + 638 + 108 + 120 + 622 + 640 + + + 62 + 117 + 631 + 108 + 120 + 622 + 640 + + + 62 + 116 + 629 + 108 + 120 + 622 + 640 + + + 62 + 120 + 634 + 108 + 120 + 622 + 640 + + + 62 + 111 + 631 + 108 + 120 + 622 + 640 + + + 161 + 92 + 650 + 92 + 94 + 647 + 652 + + + 161 + 91 + 649 + 89 + 91 + 647 + 652 + + + 9 + 113 + 667 + 109 + 113 + 660 + 669 + + + 1 + 124 + 669 + 122 + 124 + 666 + 670 + + + 11 + 115 + 653 + 112 + 116 + 646 + 659 + + + 62 + 123 + 663 + 120 + 128 + 652 + 665 + + + 11 + 126 + 659 + 120 + 128 + 652 + 665 + + + 11 + 122 + 656 + 120 + 128 + 652 + 665 + + + 29 + 125 + 665 + 120 + 128 + 652 + 665 + + + 114 + 127 + 659 + 120 + 128 + 652 + 665 + + + 7 + 135 + 661 + 131 + 137 + 659 + 665 + + + 29 + 140 + 667 + 137 + 140 + 665 + 668 + + + 29 + 137 + 666 + 137 + 140 + 665 + 668 + + + 198 + 130 + 1601 + 129 + 133 + 1601 + 1606 + + + 11 + 135 + 1599 + 134 + 137 + 1596 + 1606 + + + 11 + 135 + 652 + 131 + 137 + 651 + 658 + + + 5 + 132 + 655 + 131 + 137 + 651 + 658 + + + 114 + 131 + 652 + 131 + 137 + 651 + 658 + + + 11 + 123 + 647 + 121 + 133 + 637 + 649 + + + 55 + 136 + 642 + 133 + 136 + 641 + 642 + + + 83 + 136 + 641 + 133 + 136 + 641 + 642 + + + 2 + 155 + 619 + 136 + 156 + 618 + 633 + + + 2 + 151 + 621 + 136 + 156 + 618 + 633 + + + 2 + 153 + 629 + 136 + 156 + 618 + 633 + + + 2 + 145 + 630 + 136 + 156 + 618 + 633 + + + 2 + 144 + 626 + 136 + 156 + 618 + 633 + + + 2 + 144 + 621 + 136 + 156 + 618 + 633 + + + 2 + 146 + 618 + 136 + 156 + 618 + 633 + + + 2 + 140 + 620 + 136 + 156 + 618 + 633 + + + 2 + 139 + 623 + 136 + 156 + 618 + 633 + + + 2 + 140 + 626 + 136 + 156 + 618 + 633 + + + 2 + 138 + 633 + 136 + 156 + 618 + 633 + + + 2 + 145 + 629 + 136 + 156 + 618 + 633 + + + 2 + 147 + 623 + 136 + 156 + 618 + 633 + + + 2 + 152 + 618 + 136 + 156 + 618 + 633 + + + 2 + 153 + 621 + 136 + 156 + 618 + 633 + + + 77 + 159 + 618 + 157 + 161 + 617 + 620 + + + 3 + 157 + 616 + 157 + 161 + 615 + 620 + + + 3 + 158 + 616 + 157 + 161 + 615 + 620 + + + 3 + 159 + 616 + 157 + 161 + 615 + 620 + + + 3 + 160 + 616 + 157 + 161 + 615 + 620 + + + 3 + 161 + 616 + 157 + 161 + 615 + 620 + + + 3 + 157 + 615 + 157 + 161 + 615 + 620 + + + 3 + 158 + 615 + 157 + 161 + 615 + 620 + + + 3 + 159 + 615 + 157 + 161 + 615 + 620 + + + 4 + 172 + 615 + 166 + 175 + 613 + 622 + + + 63 + 185 + 608 + 180 + 190 + 604 + 621 + + + 123 + 197 + 641 + 194 + 198 + 637 + 642 + + + 121 + 195 + 640 + 194 + 198 + 637 + 642 + + + 118 + 200 + 640 + 199 + 203 + 639 + 642 + + + 127 + 200 + 631 + 194 + 203 + 629 + 636 + + + 127 + 195 + 632 + 194 + 203 + 629 + 636 + + + 127 + 194 + 634 + 194 + 203 + 629 + 636 + + + 127 + 197 + 634 + 194 + 203 + 629 + 636 + + + 127 + 201 + 634 + 194 + 203 + 629 + 636 + + + 122 + 206 + 626 + 203 + 212 + 624 + 631 + + + 95 + 218 + 635 + 216 + 223 + 634 + 638 + + + 95 + 220 + 637 + 216 + 223 + 634 + 638 + + + 95 + 222 + 635 + 216 + 223 + 634 + 638 + + + 226 + 227 + 632 + 225 + 228 + 632 + 635 + + + 225 + 229 + 631 + 229 + 232 + 630 + 633 + + + 227 + 228 + 628 + 226 + 229 + 627 + 630 + + + 57 + 229 + 640 + 225 + 231 + 640 + 644 + + + 57 + 226 + 640 + 225 + 231 + 640 + 644 + + + 66 + 224 + 649 + 216 + 230 + 640 + 653 + + + 299 + 429 + 484 + 427 + 430 + 481 + 485 + + + 778 + 604 + 744 + 601 + 606 + 742 + 745 + + + 347 + 604 + 744 + 601 + 606 + 742 + 745 + + + 11 + 603 + 745 + 601 + 606 + 742 + 745 + + + 95 + 587 + 757 + 585 + 590 + 750 + 758 + + + 95 + 589 + 753 + 585 + 590 + 750 + 758 + + + 95 + 586 + 751 + 585 + 590 + 750 + 758 + + + 341 + 583 + 563 + 582 + 585 + 561 + 565 + + + 95 + 583 + 573 + 577 + 585 + 572 + 576 + + + 95 + 582 + 576 + 577 + 585 + 572 + 576 + + + 95 + 580 + 574 + 577 + 585 + 572 + 576 + + + 95 + 578 + 572 + 577 + 585 + 572 + 576 + + + 368 + 586 + 526 + 582 + 588 + 524 + 527 + + + 371 + 600 + 517 + 599 + 600 + 516 + 518 + + + 369 + 603 + 504 + 602 + 605 + 501 + 504 + + + 370 + 604 + 501 + 602 + 605 + 501 + 504 + + + 95 + 282 + 566 + 280 + 286 + 564 + 573 + + + 95 + 285 + 570 + 280 + 286 + 564 + 573 + + + 95 + 284 + 573 + 280 + 286 + 564 + 573 + + + 95 + 333 + 555 + 328 + 334 + 549 + 557 + + + 95 + 331 + 551 + 328 + 334 + 549 + 557 + + + 95 + 213 + 451 + 212 + 220 + 448 + 453 + + + 95 + 219 + 450 + 212 + 220 + 448 + 453 + + + 95 + 218 + 449 + 212 + 220 + 448 + 453 + + + 95 + 215 + 451 + 212 + 220 + 448 + 453 + + + 268 + 87 + 694 + 87 + 93 + 689 + 700 + + + 268 + 90 + 690 + 87 + 93 + 689 + 700 + + + 268 + 92 + 699 + 87 + 93 + 689 + 700 + + + 106 + 319 + 531 + 317 + 322 + 530 + 536 + + + 105 + 320 + 535 + 317 + 322 + 530 + 536 + + + 191 + 274 + 565 + 272 + 277 + 563 + 567 + + + 191 + 268 + 3379 + 265 + 270 + 3379 + 3380 + + + 172 + 84 + 676 + 83 + 85 + 673 + 677 + + + 72 + 84 + 674 + 83 + 85 + 673 + 677 + + + 339 + 371 + 580 + 368 + 372 + 578 + 581 + + + 160 + 104 + 520 + 102 + 106 + 518 + 521 + + + 173 + 51 + 675 + 49 + 52 + 673 + 677 + + + 95 + 503 + 449 + 498 + 504 + 447 + 453 + + + 95 + 499 + 449 + 498 + 504 + 447 + 453 + + + 95 + 500 + 451 + 498 + 504 + 447 + 453 + + + 95 + 502 + 451 + 498 + 504 + 447 + 453 + + + 318 + 517 + 459 + 515 + 518 + 459 + 461 + + + 301 + 524 + 463 + 522 + 525 + 462 + 467 + + + 318 + 520 + 451 + 519 + 526 + 448 + 454 + + + 306 + 524 + 451 + 519 + 526 + 448 + 454 + + + 318 + 497 + 457 + 495 + 526 + 455 + 463 + + + 318 + 511 + 455 + 495 + 526 + 455 + 463 + + + 282 + 448 + 492 + 448 + 450 + 492 + 493 + + + 95 + 438 + 494 + 437 + 443 + 491 + 496 + + + 95 + 441 + 495 + 437 + 443 + 491 + 496 + + + 95 + 441 + 491 + 437 + 443 + 491 + 496 + + + 11 + 433 + 491 + 432 + 435 + 490 + 493 + + + 310 + 433 + 483 + 432 + 436 + 480 + 485 + + + 289 + 427 + 489 + 425 + 429 + 487 + 491 + + + 250 + 418 + 487 + 416 + 421 + 484 + 488 + + + 149 + 273 + 632 + 271 + 274 + 630 + 634 + + + 131 + 265 + 629 + 262 + 267 + 626 + 632 + + + 129 + 275 + 658 + 273 + 276 + 655 + 659 + + + 167 + 279 + 647 + 276 + 280 + 646 + 650 + + + 157 + 279 + 632 + 277 + 280 + 630 + 634 + + + 64 + 275 + 640 + 275 + 278 + 637 + 640 + + + 64 + 277 + 638 + 275 + 278 + 637 + 640 + + + 528 + 652 + 536 + 651 + 653 + 534 + 539 + + + 115 + 327 + 539 + 327 + 328 + 537 + 540 + + + 141 + 301 + 578 + 300 + 306 + 577 + 580 + + + 172 + 345 + 1554 + 343 + 346 + 1551 + 1557 + + + 69 + 140 + 504 + 138 + 142 + 503 + 506 + + + 59 + 137 + 516 + 135 + 139 + 515 + 517 + + + 0 + 225 + 485 + 213 + 238 + 478 + 492 + + + 75 + 235 + 508 + 233 + 239 + 507 + 512 + + + 78 + 235 + 495 + 227 + 241 + 492 + 511 + + + 76 + 230 + 522 + 227 + 230 + 521 + 523 + + + 76 + 230 + 509 + 225 + 243 + 501 + 520 + + + 76 + 237 + 515 + 227 + 245 + 511 + 525 + + + 76 + 232 + 495 + 230 + 235 + 495 + 502 + + + 76 + 233 + 506 + 225 + 245 + 491 + 522 + + + 76 + 233 + 502 + 225 + 239 + 491 + 513 + + + 76 + 232 + 502 + 225 + 239 + 491 + 513 + + + 76 + 228 + 494 + 224 + 240 + 492 + 518 + + + 76 + 236 + 519 + 225 + 243 + 510 + 525 + + + 76 + 232 + 501 + 230 + 235 + 495 + 502 + + + 6 + 352 + 610 + 350 + 358 + 601 + 616 + + + 6 + 350 + 612 + 350 + 358 + 601 + 616 + + + 6 + 352 + 606 + 350 + 358 + 601 + 616 + + + 6 + 351 + 603 + 350 + 358 + 601 + 616 + + + 6 + 354 + 603 + 350 + 358 + 601 + 616 + + + 6 + 350 + 612 + 344 + 354 + 608 + 616 + + + 6 + 344 + 615 + 344 + 354 + 608 + 616 + + + 6 + 349 + 616 + 344 + 354 + 608 + 616 + + + 231 + 348 + 606 + 341 + 349 + 599 + 612 + + + 67 + 364 + 605 + 361 + 367 + 601 + 613 + + + 67 + 363 + 603 + 361 + 367 + 601 + 613 + + + 67 + 362 + 609 + 361 + 367 + 601 + 613 + + + 67 + 366 + 605 + 361 + 367 + 601 + 613 + + + 2 + 342 + 584 + 336 + 353 + 581 + 593 + + + 2 + 347 + 583 + 336 + 353 + 581 + 593 + + + 2 + 347 + 586 + 336 + 353 + 581 + 593 + + + 60 + 360 + 572 + 357 + 365 + 566 + 575 + + + 60 + 362 + 572 + 357 + 365 + 566 + 575 + + + 60 + 363 + 570 + 357 + 365 + 566 + 575 + + + 57 + 362 + 570 + 357 + 365 + 566 + 575 + + + 57 + 360 + 569 + 357 + 365 + 566 + 575 + + + 60 + 362 + 1515 + 359 + 364 + 1512 + 1517 + + + 57 + 361 + 1515 + 359 + 364 + 1512 + 1517 + + + 57 + 361 + 2458 + 360 + 364 + 2457 + 2461 + + + 57 + 361 + 2459 + 360 + 364 + 2457 + 2461 + + + 57 + 362 + 2459 + 360 + 364 + 2457 + 2461 + + + 60 + 362 + 2458 + 360 + 364 + 2457 + 2461 + + + 136 + 268 + 3370 + 258 + 276 + 3361 + 3380 + + + 136 + 264 + 3373 + 258 + 276 + 3361 + 3380 + + + 70 + 269 + 3369 + 258 + 276 + 3361 + 3380 + + + 70 + 264 + 3369 + 258 + 276 + 3361 + 3380 + + + 70 + 265 + 3364 + 260 + 272 + 3360 + 3370 + + + 70 + 268 + 3362 + 263 + 272 + 3351 + 3365 + + + 70 + 268 + 3358 + 263 + 272 + 3351 + 3365 + + + 70 + 268 + 3353 + 263 + 272 + 3351 + 3361 + + + 70 + 271 + 3350 + 259 + 271 + 3340 + 3350 + + + 65 + 291 + 581 + 285 + 294 + 575 + 583 + + + 65 + 290 + 580 + 285 + 294 + 575 + 583 + + + 65 + 312 + 539 + 310 + 317 + 536 + 544 + + + 65 + 313 + 541 + 310 + 317 + 536 + 544 + + + 65 + 315 + 539 + 310 + 317 + 536 + 544 + + + 65 + 314 + 521 + 312 + 319 + 519 + 524 + + + 65 + 316 + 521 + 312 + 319 + 519 + 524 + + + 65 + 326 + 546 + 324 + 331 + 543 + 548 + + + 11 + 308 + 523 + 304 + 314 + 521 + 528 + + + 11 + 310 + 523 + 304 + 314 + 521 + 528 + + + 11 + 309 + 544 + 304 + 319 + 536 + 552 + + + 11 + 305 + 539 + 304 + 319 + 536 + 552 + + + 11 + 310 + 548 + 304 + 319 + 536 + 552 + + + 102 + 317 + 563 + 288 + 337 + 521 + 577 + + + 102 + 298 + 525 + 288 + 337 + 521 + 577 + + + 102 + 329 + 532 + 288 + 337 + 521 + 577 + + + 102 + 323 + 553 + 288 + 337 + 521 + 577 + + + 102 + 298 + 570 + 279 + 309 + 558 + 589 + + + 102 + 327 + 512 + 299 + 337 + 507 + 524 + + + 116 + 293 + 549 + 285 + 296 + 545 + 551 + + + 101 + 309 + 533 + 307 + 312 + 529 + 535 + + + 142 + 321 + 549 + 316 + 322 + 544 + 550 + + + 142 + 320 + 1491 + 316 + 322 + 1488 + 1494 + + + 155 + 332 + 567 + 331 + 334 + 565 + 569 + + + 114 + 310 + 548 + 300 + 336 + 537 + 577 + + + 114 + 323 + 566 + 300 + 336 + 537 + 577 + + + 3 + 313 + 564 + 304 + 319 + 563 + 570 + + + 132 + 311 + 568 + 306 + 315 + 567 + 571 + + + 110 + 304 + 1507 + 301 + 314 + 1503 + 1510 + + + 138 + 319 + 2456 + 316 + 320 + 2454 + 2459 + + + 228 + 379 + 501 + 377 + 381 + 500 + 503 + + + 230 + 369 + 506 + 366 + 370 + 504 + 508 + + + 773 + 293 + 3329 + 289 + 296 + 3327 + 3334 + + + 143 + 294 + 3339 + 289 + 295 + 3337 + 3342 + + + 308 + 81 + 663 + 79 + 83 + 660 + 663 + + + 84 + 77 + 676 + 74 + 78 + 674 + 678 + + + 87 + 55 + 683 + 54 + 58 + 679 + 684 + + + 88 + 55 + 679 + 54 + 58 + 679 + 684 + + + 85 + 55 + 686 + 54 + 57 + 685 + 688 + + + 103 + 54 + 694 + 53 + 56 + 693 + 696 + + + 90 + 88 + 684 + 85 + 88 + 682 + 685 + + + 165 + 347 + 714 + 344 + 349 + 712 + 715 + + + 168 + 360 + 715 + 358 + 364 + 712 + 716 + + + 169 + 363 + 714 + 358 + 364 + 712 + 716 + + + 331 + 556 + 603 + 554 + 557 + 600 + 605 + + + 330 + 551 + 598 + 549 + 553 + 597 + 602 + + + 328 + 554 + 594 + 553 + 558 + 592 + 595 + + + 325 + 546 + 599 + 543 + 546 + 597 + 602 + + + 329 + 546 + 591 + 542 + 547 + 588 + 593 + + + 514 + 600 + 1703 + 599 + 601 + 1703 + 1705 + + + 522 + 459 + 754 + 453 + 462 + 750 + 760 + + + 617 + 401 + 851 + 399 + 404 + 848 + 854 + + + 617 + 402 + 849 + 399 + 404 + 848 + 854 + + + 617 + 400 + 853 + 399 + 404 + 848 + 854 + + + 620 + 418 + 847 + 415 + 420 + 846 + 849 + + + 144 + 268 + 3384 + 267 + 269 + 3381 + 3386 + + + 186 + 223 + 441 + 222 + 227 + 439 + 443 + + + 185 + 225 + 441 + 222 + 227 + 439 + 443 + + + 174 + 252 + 467 + 249 + 252 + 458 + 468 + + + 204 + 362 + 459 + 355 + 369 + 455 + 469 + + + 200 + 365 + 460 + 355 + 369 + 455 + 469 + + + 200 + 361 + 461 + 355 + 369 + 455 + 469 + + + 200 + 360 + 464 + 355 + 369 + 455 + 469 + + + 200 + 364 + 464 + 355 + 369 + 455 + 469 + + + 200 + 366 + 466 + 355 + 369 + 455 + 469 + + + 200 + 374 + 506 + 358 + 384 + 480 + 513 + + + 200 + 380 + 494 + 358 + 384 + 480 + 513 + + + 200 + 369 + 493 + 358 + 384 + 480 + 513 + + + 200 + 379 + 488 + 358 + 384 + 480 + 513 + + + 200 + 370 + 489 + 358 + 384 + 480 + 513 + + + 200 + 374 + 497 + 358 + 384 + 480 + 513 + + + 200 + 364 + 505 + 358 + 384 + 480 + 513 + + + 4 + 359 + 500 + 358 + 384 + 480 + 513 + + + 86 + 66 + 687 + 63 + 81 + 685 + 692 + + + 86 + 65 + 690 + 63 + 81 + 685 + 692 + + + 86 + 70 + 689 + 63 + 81 + 685 + 692 + + + 86 + 74 + 688 + 63 + 81 + 685 + 692 + + + 86 + 79 + 690 + 63 + 81 + 685 + 692 + + + 86 + 79 + 687 + 63 + 81 + 685 + 692 + + + 29 + 318 + 450 + 308 + 342 + 439 + 465 + + + 29 + 321 + 441 + 308 + 342 + 439 + 465 + + + 29 + 329 + 448 + 308 + 342 + 439 + 465 + + + 29 + 329 + 454 + 308 + 342 + 439 + 465 + + + 29 + 317 + 456 + 308 + 342 + 439 + 465 + + + 154 + 327 + 449 + 308 + 342 + 439 + 465 + + + 154 + 318 + 452 + 308 + 342 + 439 + 465 + + + 154 + 314 + 443 + 308 + 342 + 439 + 465 + + + 154 + 329 + 443 + 308 + 342 + 439 + 465 + + + 154 + 332 + 456 + 308 + 342 + 439 + 465 + + + 154 + 325 + 458 + 308 + 342 + 439 + 465 + + + 154 + 313 + 453 + 308 + 342 + 439 + 465 + + + 153 + 332 + 456 + 308 + 342 + 439 + 465 + + + 153 + 318 + 455 + 308 + 342 + 439 + 465 + + + 153 + 332 + 448 + 308 + 342 + 439 + 465 + + + 153 + 322 + 440 + 308 + 342 + 439 + 465 + + + 153 + 319 + 446 + 308 + 342 + 439 + 465 + + + 114 + 222 + 466 + 200 + 232 + 430 + 475 + + + 114 + 225 + 449 + 200 + 232 + 430 + 475 + + + 65 + 208 + 434 + 200 + 210 + 430 + 439 + + + 65 + 202 + 435 + 200 + 210 + 430 + 439 + + + 65 + 207 + 434 + 200 + 210 + 430 + 439 + + + 65 + 208 + 436 + 200 + 210 + 430 + 439 + + + 11 + 215 + 444 + 208 + 218 + 440 + 446 + + + 11 + 211 + 444 + 208 + 218 + 440 + 446 + + + 11 + 216 + 441 + 208 + 218 + 440 + 446 + + + 11 + 212 + 441 + 208 + 218 + 440 + 446 + + + 23 + 219 + 3294 + 207 + 219 + 3287 + 3301 + + + 47 + 206 + 3286 + 204 + 211 + 3282 + 3288 + + + 47 + 209 + 3285 + 204 + 211 + 3282 + 3288 + + + 47 + 208 + 3287 + 204 + 211 + 3282 + 3288 + + + 40 + 217 + 3281 + 213 + 219 + 3277 + 3293 + + + 40 + 217 + 3288 + 213 + 219 + 3277 + 3293 + + + 47 + 220 + 3281 + 219 + 223 + 3279 + 3283 + + + 40 + 222 + 3280 + 219 + 223 + 3279 + 3283 + + + 40 + 216 + 3273 + 200 + 218 + 3270 + 3278 + + + 40 + 212 + 3273 + 200 + 218 + 3270 + 3278 + + + 40 + 215 + 3274 + 200 + 218 + 3270 + 3278 + + + 46 + 197 + 3274 + 190 + 202 + 3266 + 3277 + + + 46 + 197 + 3270 + 190 + 202 + 3266 + 3277 + + + 46 + 194 + 3274 + 190 + 202 + 3266 + 3277 + + + 41 + 179 + 3291 + 178 + 192 + 3274 + 3298 + + + 41 + 181 + 3281 + 178 + 192 + 3274 + 3298 + + + 41 + 187 + 3282 + 178 + 192 + 3274 + 3298 + + + 41 + 185 + 3275 + 178 + 192 + 3274 + 3298 + + + 45 + 192 + 3300 + 180 + 200 + 3294 + 3302 + + + 45 + 190 + 3296 + 180 + 200 + 3294 + 3302 + + + 45 + 188 + 3300 + 180 + 200 + 3294 + 3302 + + + 67 + 201 + 3298 + 190 + 210 + 3293 + 3319 + + + 67 + 208 + 3301 + 190 + 210 + 3293 + 3319 + + + 67 + 206 + 3306 + 190 + 210 + 3293 + 3319 + + + 67 + 209 + 3310 + 190 + 210 + 3293 + 3319 + + + 67 + 209 + 3316 + 190 + 210 + 3293 + 3319 + + + 68 + 202 + 3305 + 196 + 208 + 3303 + 3308 + + + 68 + 198 + 3306 + 196 + 208 + 3303 + 3308 + + + 61 + 207 + 3329 + 199 + 212 + 3318 + 3335 + + + 61 + 208 + 3320 + 199 + 212 + 3318 + 3335 + + + 61 + 210 + 3322 + 199 + 212 + 3318 + 3335 + + + 61 + 207 + 3326 + 199 + 212 + 3318 + 3335 + + + 61 + 209 + 3330 + 199 + 212 + 3318 + 3335 + + + 61 + 203 + 3329 + 199 + 212 + 3318 + 3335 + + + 61 + 200 + 3332 + 199 + 212 + 3318 + 3335 + + + 251 + 199 + 3252 + 195 + 203 + 3250 + 3257 + + + 251 + 197 + 3252 + 195 + 203 + 3250 + 3257 + + + 251 + 197 + 3255 + 195 + 203 + 3250 + 3257 + + + 251 + 198 + 3257 + 195 + 203 + 3250 + 3257 + + + 251 + 200 + 3255 + 195 + 203 + 3250 + 3257 + + + 270 + 212 + 3254 + 207 + 219 + 3241 + 3257 + + + 270 + 216 + 3252 + 207 + 219 + 3241 + 3257 + + + 270 + 219 + 3247 + 207 + 219 + 3241 + 3257 + + + 270 + 218 + 3243 + 207 + 219 + 3241 + 3257 + + + 270 + 214 + 3245 + 207 + 219 + 3241 + 3257 + + + 270 + 212 + 3250 + 207 + 219 + 3241 + 3257 + + + 195 + 211 + 3230 + 211 + 219 + 3230 + 3240 + + + 195 + 213 + 3234 + 211 + 219 + 3230 + 3240 + + + 195 + 217 + 3236 + 211 + 219 + 3230 + 3240 + + + 195 + 218 + 3238 + 211 + 219 + 3230 + 3240 + + + 195 + 216 + 3239 + 211 + 219 + 3230 + 3240 + + + 195 + 219 + 3233 + 211 + 219 + 3230 + 3240 + + + 99 + 208 + 3233 + 198 + 210 + 3227 + 3241 + + + 99 + 203 + 3235 + 198 + 210 + 3227 + 3241 + + + 99 + 207 + 3238 + 198 + 210 + 3227 + 3241 + + + 99 + 204 + 3238 + 198 + 210 + 3227 + 3241 + + + 270 + 616 + 553 + 615 + 620 + 550 + 555 + + + 270 + 616 + 551 + 615 + 620 + 550 + 555 + + + 270 + 619 + 551 + 615 + 620 + 550 + 555 + + + 270 + 618 + 554 + 615 + 620 + 550 + 555 + + + 312 + 615 + 3400 + 610 + 618 + 3396 + 3402 + + + 312 + 613 + 3400 + 610 + 618 + 3396 + 3402 + + + 312 + 611 + 3399 + 610 + 618 + 3396 + 3402 + + + 312 + 617 + 3398 + 610 + 618 + 3396 + 3402 + + + 312 + 615 + 3402 + 610 + 618 + 3396 + 3402 + + + 312 + 612 + 3402 + 610 + 618 + 3396 + 3402 + + + 43 + 595 + 3592 + 591 + 596 + 3590 + 3597 + + + 43 + 593 + 3596 + 591 + 596 + 3590 + 3597 + + + 270 + 584 + 3584 + 578 + 590 + 3581 + 3589 + + + 270 + 581 + 3583 + 578 + 590 + 3581 + 3589 + + + 270 + 581 + 3587 + 578 + 590 + 3581 + 3589 + + + 270 + 584 + 3587 + 578 + 590 + 3581 + 3589 + + + 270 + 584 + 3585 + 578 + 590 + 3581 + 3589 + + + 43 + 602 + 3552 + 600 + 606 + 3552 + 3557 + + + 43 + 605 + 3553 + 600 + 606 + 3552 + 3557 + + + 134 + 291 + 713 + 279 + 295 + 704 + 718 + + + 21 + 284 + 3544 + 278 + 286 + 3531 + 3545 + + + 21 + 284 + 3540 + 278 + 286 + 3531 + 3545 + + + 21 + 281 + 3542 + 278 + 286 + 3531 + 3545 + + + 137 + 281 + 3521 + 275 + 285 + 3516 + 3531 + + + 137 + 277 + 3522 + 275 + 285 + 3516 + 3531 + + + 137 + 281 + 3524 + 275 + 285 + 3516 + 3531 + + + 137 + 277 + 3526 + 275 + 285 + 3516 + 3531 + + + 137 + 280 + 3526 + 275 + 285 + 3516 + 3531 + + + 137 + 279 + 3529 + 275 + 285 + 3516 + 3531 + + + 67 + 292 + 3515 + 278 + 300 + 3513 + 3524 + + + 67 + 291 + 3522 + 278 + 300 + 3513 + 3524 + + + 67 + 279 + 3516 + 278 + 300 + 3513 + 3524 + + + 67 + 286 + 3522 + 278 + 300 + 3513 + 3524 + + + 67 + 282 + 3520 + 278 + 300 + 3513 + 3524 + + + 158 + 306 + 3515 + 296 + 316 + 3513 + 3528 + + + 158 + 301 + 3516 + 296 + 316 + 3513 + 3528 + + + 158 + 304 + 3520 + 296 + 316 + 3513 + 3528 + + + 158 + 300 + 3520 + 296 + 316 + 3513 + 3528 + + + 158 + 298 + 3518 + 296 + 316 + 3513 + 3528 + + + 135 + 312 + 3522 + 306 + 316 + 3513 + 3528 + + + 135 + 309 + 3526 + 306 + 316 + 3513 + 3528 + + + 135 + 311 + 3520 + 306 + 316 + 3513 + 3528 + + + 57 + 103 + 547 + 102 + 119 + 542 + 559 + + + 57 + 109 + 545 + 102 + 119 + 542 + 559 + + + 57 + 113 + 549 + 102 + 119 + 542 + 559 + + + 57 + 116 + 550 + 102 + 119 + 542 + 559 + + + 57 + 116 + 554 + 102 + 119 + 542 + 559 + + + 57 + 113 + 557 + 102 + 119 + 542 + 559 + + + 57 + 108 + 557 + 102 + 119 + 542 + 559 + + + 60 + 105 + 557 + 102 + 119 + 542 + 559 + + + 60 + 117 + 556 + 102 + 119 + 542 + 559 + + + 60 + 118 + 553 + 102 + 119 + 542 + 559 + + + 46 + 376 + 3336 + 374 + 378 + 3334 + 3345 + + + 46 + 377 + 3340 + 374 + 378 + 3334 + 3345 + + + 46 + 376 + 3343 + 374 + 378 + 3334 + 3345 + + + 206 + 374 + 3333 + 374 + 374 + 3333 + 3333 + + + 206 + 374 + 3331 + 374 + 374 + 3331 + 3331 + + + 53 + 358 + 3340 + 344 + 370 + 3336 + 3347 + + + 53 + 365 + 3340 + 344 + 370 + 3336 + 3347 + + + 43 + 358 + 3330 + 353 + 366 + 3321 + 3335 + + + 43 + 355 + 3331 + 353 + 366 + 3321 + 3335 + + + 43 + 355 + 3333 + 353 + 366 + 3321 + 3335 + + + 43 + 357 + 3333 + 353 + 366 + 3321 + 3335 + + + 43 + 360 + 3331 + 353 + 366 + 3321 + 3335 + + + 53 + 359 + 3319 + 345 + 365 + 3318 + 3332 + + + 53 + 349 + 3321 + 345 + 365 + 3318 + 3332 + + + 53 + 348 + 3329 + 345 + 365 + 3318 + 3332 + + + 270 + 345 + 3315 + 341 + 348 + 3314 + 3321 + + + 270 + 342 + 3317 + 341 + 348 + 3314 + 3321 + + + 270 + 344 + 3319 + 341 + 348 + 3314 + 3321 + + + 270 + 345 + 3318 + 341 + 348 + 3314 + 3321 + + + 270 + 346 + 3317 + 341 + 348 + 3314 + 3321 + + + 189 + 342 + 3354 + 336 + 357 + 3335 + 3363 + + + 189 + 346 + 3344 + 336 + 357 + 3335 + 3363 + + + 189 + 355 + 3340 + 336 + 357 + 3335 + 3363 + + + 295 + 330 + 3363 + 325 + 342 + 3361 + 3374 + + + 295 + 328 + 3366 + 325 + 342 + 3361 + 3374 + + + 295 + 329 + 3371 + 325 + 342 + 3361 + 3374 + + + 295 + 341 + 3365 + 325 + 342 + 3361 + 3374 + + + 271 + 344 + 3379 + 339 + 356 + 3362 + 3388 + + + 271 + 355 + 3376 + 339 + 356 + 3362 + 3388 + + + 271 + 349 + 3371 + 339 + 356 + 3362 + 3388 + + + 271 + 351 + 3375 + 339 + 356 + 3362 + 3388 + + + 271 + 342 + 3364 + 339 + 356 + 3362 + 3388 + + + 271 + 351 + 3370 + 339 + 356 + 3362 + 3388 + + + 189 + 356 + 3426 + 341 + 362 + 3391 + 3436 + + + 189 + 351 + 3433 + 341 + 362 + 3391 + 3436 + + + 189 + 348 + 3400 + 341 + 362 + 3391 + 3436 + + + 189 + 346 + 3433 + 341 + 362 + 3391 + 3436 + + + 189 + 346 + 3426 + 341 + 362 + 3391 + 3436 + + + 189 + 350 + 3426 + 341 + 362 + 3391 + 3436 + + + 189 + 349 + 3418 + 341 + 362 + 3391 + 3436 + + + 189 + 343 + 3419 + 341 + 362 + 3391 + 3436 + + + 189 + 353 + 3412 + 341 + 362 + 3391 + 3436 + + + 189 + 343 + 3413 + 341 + 362 + 3391 + 3436 + + + 189 + 353 + 3418 + 341 + 362 + 3391 + 3436 + + + 265 + 358 + 3426 + 356 + 362 + 3425 + 3427 + + + 94 + 359 + 3423 + 359 + 362 + 3422 + 3424 + + + 94 + 361 + 3423 + 359 + 362 + 3422 + 3424 + + + 272 + 361 + 3428 + 359 + 362 + 3428 + 3430 + + + 29 + 361 + 3429 + 359 + 362 + 3428 + 3430 + + + 29 + 357 + 3427 + 341 + 362 + 3391 + 3436 + + + 29 + 345 + 3426 + 341 + 362 + 3391 + 3436 + + + 29 + 353 + 3420 + 341 + 362 + 3391 + 3436 + + + 266 + 348 + 3431 + 341 + 355 + 3422 + 3436 + + + 22 + 349 + 3353 + 344 + 354 + 3350 + 3363 + + + 22 + 350 + 3357 + 344 + 354 + 3350 + 3363 + + + 22 + 346 + 3359 + 344 + 354 + 3350 + 3363 + + + 22 + 349 + 3353 + 344 + 354 + 3350 + 3363 + + + 22 + 351 + 3357 + 344 + 354 + 3350 + 3363 + + + 19 + 92 + 3302 + 90 + 122 + 3297 + 3308 + + + 19 + 107 + 3300 + 90 + 122 + 3297 + 3308 + + + 19 + 119 + 3305 + 90 + 122 + 3297 + 3308 + + + 29 + 113 + 3306 + 90 + 122 + 3297 + 3308 + + + 29 + 116 + 3306 + 90 + 122 + 3297 + 3308 + + + 29 + 117 + 3297 + 90 + 122 + 3297 + 3308 + + + 52 + 108 + 3290 + 95 + 109 + 3283 + 3296 + + + 52 + 106 + 3288 + 95 + 109 + 3283 + 3296 + + + 70 + 101 + 3281 + 99 + 106 + 3279 + 3283 + + + 70 + 104 + 3282 + 99 + 106 + 3279 + 3283 + + + 47 + 89 + 3289 + 88 + 94 + 3284 + 3292 + + + 47 + 92 + 3289 + 88 + 94 + 3284 + 3292 + + + 40 + 106 + 3276 + 90 + 108 + 3274 + 3280 + + + 40 + 102 + 3275 + 90 + 108 + 3274 + 3280 + + + 40 + 92 + 3277 + 90 + 108 + 3274 + 3280 + + + 53 + 115 + 3276 + 109 + 120 + 3272 + 3283 + + + 53 + 113 + 3275 + 109 + 120 + 3272 + 3283 + + + 53 + 110 + 3276 + 109 + 120 + 3272 + 3283 + + + 41 + 122 + 3292 + 116 + 128 + 3280 + 3295 + + + 41 + 125 + 3291 + 116 + 128 + 3280 + 3295 + + + 41 + 126 + 3286 + 116 + 128 + 3280 + 3295 + + + 41 + 121 + 3285 + 116 + 128 + 3280 + 3295 + + + 45 + 137 + 3286 + 129 + 141 + 3283 + 3289 + + + 45 + 136 + 3285 + 129 + 141 + 3283 + 3289 + + + 34 + 144 + 3295 + 134 + 150 + 3290 + 3300 + + + 34 + 141 + 3295 + 134 + 150 + 3290 + 3300 + + + 34 + 137 + 3295 + 134 + 150 + 3290 + 3300 + + + 74 + 149 + 3297 + 134 + 150 + 3290 + 3300 + + + 99 + 159 + 3294 + 143 + 161 + 3290 + 3301 + + + 99 + 158 + 3299 + 143 + 161 + 3290 + 3301 + + + 99 + 153 + 3292 + 143 + 161 + 3290 + 3301 + + + 99 + 152 + 3297 + 143 + 161 + 3290 + 3301 + + + 99 + 148 + 3297 + 143 + 161 + 3290 + 3301 + + + 104 + 162 + 3304 + 159 + 164 + 3300 + 3306 + + + 104 + 164 + 3289 + 160 + 166 + 3287 + 3294 + + + 280 + 440 + 502 + 439 + 441 + 502 + 507 + + + 113 + 268 + 3329 + 267 + 271 + 3327 + 3331 + + + 34 + 137 + 3490 + 135 + 141 + 3488 + 3493 + + + 34 + 140 + 3491 + 135 + 141 + 3488 + 3493 + + + 34 + 138 + 3492 + 135 + 141 + 3488 + 3493 + + + 519 + 640 + 753 + 635 + 646 + 744 + 767 + + + 519 + 640 + 755 + 635 + 646 + 744 + 767 + + + 519 + 639 + 756 + 635 + 646 + 744 + 767 + + + 519 + 639 + 753 + 635 + 646 + 744 + 767 + + + 519 + 642 + 754 + 635 + 646 + 744 + 767 + + + 519 + 642 + 753 + 635 + 646 + 744 + 767 + + + 518 + 645 + 754 + 635 + 646 + 744 + 767 + + + 321 + 131 + 483 + 125 + 139 + 480 + 486 + + + 321 + 134 + 483 + 125 + 139 + 480 + 486 + + + 321 + 131 + 485 + 125 + 139 + 480 + 486 + + + 159 + 139 + 464 + 137 + 141 + 457 + 465 + + + 159 + 140 + 464 + 137 + 141 + 457 + 465 + + + 65 + 140 + 453 + 138 + 142 + 451 + 458 + + + 65 + 141 + 1396 + 138 + 142 + 1395 + 1407 + + + 65 + 139 + 1397 + 138 + 142 + 1395 + 1407 + + + 65 + 141 + 1400 + 138 + 142 + 1395 + 1407 + + + 65 + 139 + 1403 + 138 + 142 + 1395 + 1407 + + + 65 + 138 + 1405 + 138 + 142 + 1395 + 1407 + + + 18 + 138 + 1406 + 138 + 142 + 1395 + 1407 + + + 0 + 451 + 462 + 435 + 466 + 454 + 481 + + + 0 + 448 + 460 + 435 + 466 + 454 + 481 + + + 0 + 519 + 493 + 513 + 529 + 487 + 504 + + + 0 + 521 + 493 + 513 + 529 + 487 + 504 + + + 3 + 273 + 601 + 269 + 275 + 600 + 607 + + + 3 + 271 + 601 + 269 + 275 + 600 + 607 + + + 3 + 271 + 604 + 269 + 275 + 600 + 607 + + + 3 + 273 + 604 + 269 + 275 + 600 + 607 + + + 3 + 272 + 605 + 269 + 275 + 600 + 607 + + + 3 + 270 + 606 + 269 + 275 + 600 + 607 + + + 4 + 620 + 493 + 568 + 627 + 486 + 529 + + + 4 + 620 + 497 + 568 + 627 + 486 + 529 + + + 4 + 619 + 503 + 568 + 627 + 486 + 529 + + + 4 + 615 + 506 + 568 + 627 + 486 + 529 + + + 4 + 616 + 511 + 568 + 627 + 486 + 529 + + + 4 + 602 + 525 + 568 + 627 + 486 + 529 + + + 4 + 591 + 528 + 568 + 627 + 486 + 529 + + + 4 + 581 + 528 + 568 + 627 + 486 + 529 + + + 4 + 576 + 527 + 568 + 627 + 486 + 529 + + + 4 + 573 + 521 + 568 + 627 + 486 + 529 + + + 4 + 573 + 524 + 568 + 627 + 486 + 529 + + + 29 + 582 + 3353 + 577 + 592 + 3345 + 3358 + + + 29 + 580 + 3353 + 577 + 592 + 3345 + 3358 + + + 29 + 583 + 3351 + 577 + 592 + 3345 + 3358 + + + + 19 + 594 + 3349 + 587 + 599 + 3345 + 3356 + + + 19 + 592 + 3351 + 587 + 599 + 3345 + 3356 + + + 19 + 592 + 3353 + 587 + 599 + 3345 + 3356 + + + 19 + 598 + 3351 + 587 + 599 + 3345 + 3356 + + + 29 + 594 + 3355 + 587 + 599 + 3345 + 3356 + + + 29 + 597 + 3353 + 587 + 599 + 3345 + 3356 + + + 62 + 605 + 3323 + 605 + 621 + 3313 + 3332 + + + 62 + 606 + 3323 + 605 + 621 + 3313 + 3332 + + + 62 + 608 + 3324 + 605 + 621 + 3313 + 3332 + + + 62 + 608 + 3326 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3319 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3318 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3317 + 605 + 621 + 3313 + 3332 + + + 62 + 616 + 3316 + 605 + 621 + 3313 + 3332 + + + 4 + 620 + 3315 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3316 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3317 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3318 + 605 + 621 + 3313 + 3332 + + + 4 + 619 + 3319 + 605 + 621 + 3313 + 3332 + + + 4 + 618 + 3319 + 605 + 621 + 3313 + 3332 + + + 4 + 618 + 3318 + 605 + 621 + 3313 + 3332 + + + 4 + 618 + 3317 + 605 + 621 + 3313 + 3332 + + + 47 + 600 + 3339 + 596 + 605 + 3332 + 3344 + + + 47 + 599 + 3340 + 596 + 605 + 3332 + 3344 + + + 47 + 598 + 3340 + 596 + 605 + 3332 + 3344 + + + 47 + 596 + 3341 + 596 + 605 + 3332 + 3344 + + + 43 + 596 + 3322 + 585 + 596 + 3321 + 3338 + + + 43 + 596 + 3324 + 585 + 596 + 3321 + 3338 + + + 43 + 593 + 3326 + 585 + 596 + 3321 + 3338 + + + 43 + 592 + 3326 + 585 + 596 + 3321 + 3338 + + + 4 + 584 + 3344 + 582 + 621 + 3314 + 3354 + + + 4 + 583 + 3343 + 582 + 621 + 3314 + 3354 + + + 4 + 583 + 3339 + 582 + 621 + 3314 + 3354 + + + 4 + 588 + 3339 + 582 + 621 + 3314 + 3354 + + + 4 + 592 + 3337 + 582 + 621 + 3314 + 3354 + + + 4 + 595 + 3334 + 582 + 621 + 3314 + 3354 + + + 4 + 595 + 3334 + 582 + 621 + 3314 + 3354 + + + 4 + 596 + 3331 + 582 + 621 + 3314 + 3354 + + + 29 + 597 + 3328 + 582 + 621 + 3314 + 3354 + + + 29 + 598 + 3328 + 582 + 621 + 3314 + 3354 + + + 29 + 600 + 3323 + 582 + 621 + 3314 + 3354 + + + 29 + 605 + 3323 + 582 + 621 + 3314 + 3354 + + + 29 + 608 + 3326 + 582 + 621 + 3314 + 3354 + + + 29 + 610 + 3325 + 582 + 621 + 3314 + 3354 + + + 29 + 215 + 611 + 209 + 225 + 606 + 631 + + + 29 + 219 + 615 + 209 + 225 + 606 + 631 + + + 29 + 215 + 619 + 209 + 225 + 606 + 631 + + + 29 + 220 + 621 + 209 + 225 + 606 + 631 + + + 29 + 216 + 626 + 209 + 225 + 606 + 631 + + + 29 + 223 + 626 + 209 + 225 + 606 + 631 + + + 29 + 220 + 625 + 209 + 225 + 606 + 631 + + + 29 + 216 + 630 + 209 + 225 + 606 + 631 + + + 125 + 223 + 626 + 220 + 225 + 623 + 627 + + + 34 + 221 + 627 + 209 + 225 + 606 + 631 + + + 34 + 221 + 623 + 209 + 225 + 606 + 631 + + + 34 + 219 + 623 + 209 + 225 + 606 + 631 + + + 34 + 214 + 625 + 209 + 225 + 606 + 631 + + + 97 + 215 + 618 + 214 + 217 + 618 + 621 + + + 11 + 213 + 614 + 212 + 223 + 607 + 616 + + + 124 + 214 + 627 + 212 + 219 + 622 + 627 + + + 29 + 202 + 619 + 195 + 213 + 605 + 624 + + + 29 + 207 + 619 + 195 + 213 + 605 + 624 + + + 29 + 206 + 611 + 195 + 213 + 605 + 624 + + + 367 + 584 + 3475 + 583 + 593 + 3472 + 3477 + + + 367 + 585 + 3476 + 583 + 593 + 3472 + 3477 + + + 367 + 586 + 3476 + 583 + 593 + 3472 + 3477 + + + 367 + 587 + 3476 + 583 + 593 + 3472 + 3477 + + + 367 + 589 + 3474 + 583 + 593 + 3472 + 3477 + + + 367 + 586 + 3472 + 583 + 593 + 3472 + 3477 + + + 367 + 584 + 3473 + 583 + 593 + 3472 + 3477 + + + 420 + 614 + 610 + 613 + 619 + 606 + 612 + + + 420 + 617 + 609 + 613 + 619 + 606 + 612 + + + 420 + 617 + 610 + 613 + 619 + 606 + 612 + + + 255 + 560 + 474 + 556 + 564 + 473 + 476 + + + 794 + 502 + 462 + 501 + 503 + 459 + 463 + + + 348 + 563 + 470 + 562 + 565 + 468 + 472 + + + 267 + 443 + 672 + 440 + 446 + 670 + 675 + + + 262 + 570 + 587 + 568 + 572 + 577 + 591 + + + 262 + 570 + 581 + 568 + 572 + 577 + 591 + + + 262 + 571 + 584 + 568 + 572 + 577 + 591 + + + 262 + 571 + 580 + 568 + 572 + 577 + 591 + + + 262 + 572 + 579 + 568 + 572 + 577 + 591 + + + 262 + 570 + 583 + 568 + 572 + 577 + 591 + + + 407 + 658 + 643 + 641 + 673 + 625 + 644 + + + 407 + 659 + 644 + 641 + 673 + 625 + 644 + + + 407 + 655 + 644 + 641 + 673 + 625 + 644 + + + 407 + 651 + 644 + 641 + 673 + 625 + 644 + + + 407 + 652 + 640 + 641 + 673 + 625 + 644 + + + 407 + 657 + 636 + 641 + 673 + 625 + 644 + + + 407 + 660 + 637 + 641 + 673 + 625 + 644 + + + 407 + 663 + 640 + 641 + 673 + 625 + 644 + + + 407 + 664 + 642 + 641 + 673 + 625 + 644 + + + 407 + 663 + 644 + 641 + 673 + 625 + 644 + + + 407 + 669 + 639 + 641 + 673 + 625 + 644 + + + 428 + 659 + 630 + 641 + 673 + 625 + 644 + + + 409 + 645 + 648 + 635 + 670 + 625 + 671 + + + 409 + 650 + 644 + 635 + 670 + 625 + 671 + + + 409 + 657 + 644 + 635 + 670 + 625 + 671 + + + 409 + 666 + 650 + 635 + 670 + 625 + 671 + + + 409 + 663 + 655 + 635 + 670 + 625 + 671 + + + 409 + 646 + 654 + 635 + 670 + 625 + 671 + + + 409 + 660 + 667 + 635 + 670 + 625 + 671 + + + 409 + 656 + 669 + 635 + 670 + 625 + 671 + + + 409 + 651 + 666 + 635 + 670 + 625 + 671 + + + 409 + 647 + 663 + 635 + 670 + 625 + 671 + + + 409 + 650 + 656 + 635 + 670 + 625 + 671 + + + 409 + 653 + 652 + 635 + 670 + 625 + 671 + + + 409 + 645 + 654 + 635 + 670 + 625 + 671 + + + 409 + 656 + 650 + 635 + 670 + 625 + 671 + + + 409 + 657 + 647 + 635 + 670 + 625 + 671 + + + 409 + 652 + 646 + 635 + 670 + 625 + 671 + + + 29 + 665 + 636 + 635 + 670 + 625 + 671 + + + 29 + 656 + 630 + 635 + 670 + 625 + 671 + + + 29 + 655 + 646 + 635 + 670 + 625 + 671 + + + 29 + 647 + 638 + 635 + 670 + 625 + 671 + + + 29 + 653 + 630 + 635 + 670 + 625 + 671 + + + 29 + 666 + 630 + 635 + 670 + 625 + 671 + + 29 + 656 + 660 + 635 + 670 + 625 + 671 + + 29 + 661 + 666 + 635 + 670 + 625 + 671 + + 29 + 651 + 669 + 635 + 670 + 625 + 671 + + + 66 + 277 + 448 + 263 + 296 + 435 + 466 + + + 66 + 276 + 448 + 263 + 296 + 435 + 466 + + + 66 + 283 + 451 + 263 + 296 + 435 + 466 + + + 66 + 271 + 457 + 263 + 296 + 435 + 466 + + + 66 + 276 + 454 + 263 + 296 + 435 + 466 + + + 66 + 285 + 440 + 263 + 296 + 435 + 466 + + + 100 + 266 + 438 + 264 + 270 + 436 + 445 + + + 100 + 267 + 440 + 264 + 270 + 436 + 445 + + + 100 + 268 + 442 + 264 + 270 + 436 + 445 + + + 100 + 266 + 442 + 264 + 270 + 436 + 445 + + + 100 + 272 + 437 + 271 + 274 + 435 + 442 + + + 100 + 272 + 440 + 271 + 274 + 435 + 442 + + + 100 + 273 + 1382 + 271 + 275 + 1379 + 1385 + + + 100 + 272 + 1384 + 271 + 275 + 1379 + 1385 + + + 66 + 275 + 438 + 275 + 282 + 433 + 442 + + + 66 + 282 + 438 + 275 + 282 + 433 + 442 + + + 66 + 277 + 441 + 275 + 282 + 433 + 442 + + + 109 + 281 + 1378 + 276 + 282 + 1377 + 1382 + + + 107 + 280 + 1379 + 276 + 282 + 1377 + 1382 + + + 108 + 281 + 1381 + 276 + 282 + 1377 + 1382 + + + 66 + 272 + 2323 + 271 + 282 + 2321 + 2335 + + + 66 + 277 + 2328 + 271 + 282 + 2321 + 2335 + + + 34 + 280 + 2331 + 271 + 282 + 2321 + 2335 + + + 66 + 277 + 2332 + 271 + 282 + 2321 + 2335 + + + 66 + 275 + 2334 + 271 + 282 + 2321 + 2335 + + + 66 + 273 + 2331 + 271 + 282 + 2321 + 2335 + + + 94 + 286 + 503 + 262 + 292 + 483 + 507 + + + 699 + 269 + 485 + 262 + 292 + 483 + 507 + + + 699 + 267 + 483 + 262 + 292 + 483 + 507 + + + 94 + 281 + 497 + 262 + 292 + 483 + 507 + + + 699 + 275 + 492 + 262 + 292 + 483 + 507 + + + 699 + 278 + 489 + 262 + 292 + 483 + 507 + + 699 + 278 + 493 + 262 + 292 + 483 + 507 + + + 770 + 275 + 493 + 262 + 292 + 483 + 507 + + + 94 + 264 + 3349 + 259 + 270 + 3336 + 3361 + + + 94 + 262 + 3344 + 259 + 270 + 3336 + 3361 + + + 94 + 268 + 3344 + 259 + 270 + 3336 + 3361 + + + 94 + 264 + 3340 + 259 + 270 + 3336 + 3361 + + 94 + 268 + 3338 + 259 + 270 + 3336 + 3361 + + + 94 + 279 + 3336 + 267 + 283 + 3325 + 3341 + + + 94 + 279 + 3330 + 267 + 283 + 3325 + 3341 + + + 94 + 276 + 3329 + 267 + 283 + 3325 + 3341 + + + 94 + 282 + 3349 + 276 + 314 + 3334 + 3358 + + + 94 + 284 + 3348 + 276 + 314 + 3334 + 3358 + + + 94 + 286 + 3347 + 276 + 314 + 3334 + 3358 + + + 94 + 288 + 3345 + 276 + 314 + 3334 + 3358 + + 94 + 290 + 3344 + 276 + 314 + 3334 + 3358 + + 94 + 289 + 3347 + 276 + 314 + 3334 + 3358 + + 94 + 287 + 3349 + 276 + 314 + 3334 + 3358 + + + 94 + 293 + 3348 + 276 + 314 + 3334 + 3358 + + + 176 + 250 + 1409 + 249 + 265 + 1402 + 1412 + + + 93 + 251 + 461 + 249 + 265 + 458 + 472 + + + 93 + 251 + 464 + 249 + 265 + 458 + 472 + + + 93 + 261 + 466 + 249 + 265 + 458 + 472 + + + 93 + 264 + 462 + 249 + 265 + 458 + 472 + + + 93 + 263 + 466 + 249 + 265 + 458 + 472 + + + 93 + 254 + 469 + 249 + 265 + 458 + 472 + + + 93 + 251 + 1403 + 249 + 265 + 1402 + 1412 + + + 93 + 252 + 1408 + 249 + 265 + 1402 + 1412 + + + 93 + 260 + 1411 + 249 + 265 + 1402 + 1412 + + + 93 + 260 + 1409 + 249 + 265 + 1402 + 1412 + + 93 + 262 + 1403 + 249 + 265 + 1402 + 1412 + + + 304 + 263 + 1408 + 249 + 265 + 1402 + 1412 + + + 358 + 559 + 650 + 556 + 561 + 645 + 651 + + + 358 + 556 + 648 + 556 + 561 + 645 + 651 + + + 358 + 559 + 1589 + 556 + 561 + 1587 + 1595 + + + 63 + 152 + 583 + 135 + 176 + 562 + 592 + + + 6 + 171 + 571 + 135 + 176 + 562 + 592 + + + 6 + 166 + 573 + 135 + 176 + 562 + 592 + + + 6 + 171 + 582 + 135 + 176 + 562 + 592 + + + 6 + 170 + 588 + 135 + 176 + 562 + 592 + + + 6 + 165 + 589 + 135 + 176 + 562 + 592 + + + 6 + 161 + 584 + 135 + 176 + 562 + 592 + + + 6 + 154 + 584 + 135 + 176 + 562 + 592 + + 6 + 158 + 577 + 135 + 176 + 562 + 592 + + 6 + 161 + 573 + 135 + 176 + 562 + 592 + + + 6 + 154 + 573 + 135 + 176 + 562 + 592 + + 6 + 150 + 574 + 135 + 176 + 562 + 592 + + + 6 + 147 + 579 + 135 + 176 + 562 + 592 + + + 6 + 147 + 589 + 135 + 176 + 562 + 592 + + + 6 + 141 + 581 + 135 + 176 + 562 + 592 + + + 6 + 141 + 587 + 135 + 176 + 562 + 592 + + + 6 + 137 + 585 + 135 + 176 + 562 + 592 + + + 6 + 147 + 580 + 135 + 176 + 562 + 592 + + + 6 + 156 + 577 + 135 + 176 + 562 + 592 + + + 6 + 161 + 580 + 135 + 176 + 562 + 592 + + + 6 + 167 + 584 + 135 + 176 + 562 + 592 + + + 19 + 130 + 686 + 128 + 143 + 683 + 695 + + + 19 + 132 + 686 + 128 + 143 + 683 + 695 + + + 19 + 132 + 688 + 128 + 143 + 683 + 695 + + + 19 + 131 + 692 + 128 + 143 + 683 + 695 + + + 177 + 111 + 409 + 101 + 116 + 405 + 420 + + + 177 + 108 + 409 + 101 + 116 + 405 + 420 + + + 177 + 109 + 412 + 101 + 116 + 405 + 420 + + + 177 + 111 + 412 + 101 + 116 + 405 + 420 + + + 177 + 111 + 406 + 101 + 116 + 405 + 420 + + + 70 + 263 + 409 + 248 + 276 + 395 + 424 + + + 70 + 248 + 395 + 248 + 276 + 395 + 424 + + + 70 + 263 + 409 + 248 + 276 + 395 + 424 + + + 70 + 267 + 409 + 248 + 276 + 395 + 424 + + + 70 + 263 + 414 + 248 + 276 + 395 + 424 + + + 70 + 269 + 406 + 248 + 276 + 395 + 424 + + + 70 + 270 + 417 + 248 + 276 + 395 + 424 + + + 46 + 268 + 376 + 264 + 290 + 370 + 390 + + + 46 + 274 + 379 + 264 + 290 + 370 + 390 + + + 46 + 280 + 379 + 264 + 290 + 370 + 390 + + + 46 + 284 + 380 + 264 + 290 + 370 + 390 + + + 46 + 282 + 382 + 264 + 290 + 370 + 390 + + + 46 + 282 + 376 + 264 + 290 + 370 + 390 + + + 46 + 216 + 392 + 212 + 236 + 388 + 420 + + + 46 + 219 + 394 + 212 + 236 + 388 + 420 + + + 46 + 218 + 395 + 212 + 236 + 388 + 420 + + + 46 + 227 + 399 + 212 + 236 + 388 + 420 + + + 46 + 221 + 409 + 212 + 236 + 388 + 420 + + + 46 + 230 + 410 + 212 + 236 + 388 + 420 + + + 46 + 224 + 415 + 212 + 236 + 388 + 420 + + + 46 + 232 + 419 + 212 + 236 + 388 + 420 + + + 251 + 175 + 403 + 164 + 178 + 395 + 403 + + + 251 + 173 + 401 + 164 + 178 + 395 + 403 + + + 251 + 173 + 399 + 164 + 178 + 395 + 403 + + + 251 + 170 + 397 + 164 + 178 + 395 + 403 + + + 251 + 169 + 400 + 164 + 178 + 395 + 403 + + + 251 + 169 + 402 + 164 + 178 + 395 + 403 + + + 251 + 169 + 397 + 164 + 178 + 395 + 403 + + + 57 + 310 + 408 + 310 + 320 + 405 + 417 + + + 57 + 313 + 410 + 310 + 320 + 405 + 417 + + + 57 + 314 + 410 + 310 + 320 + 405 + 417 + + + 57 + 316 + 411 + 310 + 320 + 405 + 417 + + + 57 + 316 + 413 + 310 + 320 + 405 + 417 + + + 57 + 319 + 410 + 310 + 320 + 405 + 417 + + + 57 + 318 + 412 + 310 + 320 + 405 + 417 + + + 57 + 315 + 408 + 310 + 320 + 405 + 417 + + + 60 + 317 + 408 + 310 + 320 + 405 + 417 + + + 139 + 688 + 638 + 681 + 694 + 630 + 648 + + + 139 + 688 + 633 + 681 + 694 + 630 + 648 + + + 139 + 692 + 639 + 681 + 694 + 630 + 648 + + + 139 + 690 + 640 + 681 + 694 + 630 + 648 + + + 139 + 687 + 638 + 681 + 694 + 630 + 648 + + + 140 + 700 + 649 + 697 + 702 + 640 + 652 + + + 140 + 699 + 647 + 697 + 702 + 640 + 652 + + + 139 + 701 + 647 + 697 + 702 + 640 + 652 + + + 140 + 701 + 645 + 697 + 702 + 640 + 652 + + + + 664 + 690 + 651 + 686 + 698 + 649 + 659 + + + 664 + 687 + 654 + 686 + 698 + 649 + 659 + + + 664 + 686 + 657 + 686 + 698 + 649 + 659 + + 664 + 690 + 659 + 686 + 698 + 649 + 659 + + + 664 + 691 + 655 + 686 + 698 + 649 + 659 + + + 664 + 693 + 657 + 686 + 698 + 649 + 659 + + + 664 + 695 + 653 + 686 + 698 + 649 + 659 + + + 665 + 692 + 650 + 690 + 695 + 650 + 652 + + + 666 + 689 + 652 + 689 + 695 + 650 + 652 + + + 666 + 691 + 651 + 689 + 695 + 650 + 652 + + + 706 + 662 + 734 + 638 + 671 + 733 + 757 + + + 706 + 662 + 747 + 638 + 671 + 733 + 757 + + + 706 + 667 + 741 + 638 + 671 + 733 + 757 + + + 706 + 663 + 737 + 638 + 671 + 733 + 757 + + + 706 + 663 + 733 + 638 + 671 + 733 + 757 + + + 706 + 658 + 734 + 638 + 671 + 733 + 757 + + + 521 + 537 + 752 + 528 + 547 + 738 + 767 + + + 521 + 541 + 749 + 528 + 547 + 738 + 767 + + + 521 + 542 + 746 + 528 + 547 + 738 + 767 + + + 521 + 540 + 751 + 528 + 547 + 738 + 767 + + + 521 + 543 + 745 + 528 + 547 + 738 + 767 + + + 521 + 533 + 761 + 528 + 547 + 738 + 767 + + + 521 + 534 + 750 + 528 + 547 + 738 + 767 + + + 521 + 544 + 756 + 528 + 547 + 738 + 767 + + + 521 + 534 + 752 + 528 + 547 + 738 + 767 + + + 521 + 534 + 761 + 528 + 547 + 738 + 767 + + + 521 + 539 + 764 + 528 + 547 + 738 + 767 + + + 521 + 539 + 759 + 528 + 547 + 738 + 767 + + + 521 + 537 + 755 + 528 + 547 + 738 + 767 + + + 521 + 529 + 755 + 528 + 547 + 738 + 767 + + + 425 + 577 + 3419 + 574 + 590 + 3406 + 3423 + + + 425 + 583 + 3420 + 574 + 590 + 3406 + 3423 + + + 425 + 588 + 3411 + 574 + 590 + 3406 + 3423 + + + 425 + 581 + 3413 + 574 + 590 + 3406 + 3423 + + + 425 + 583 + 3410 + 574 + 590 + 3406 + 3423 + + + 425 + 576 + 3419 + 574 + 590 + 3406 + 3423 + + + 426 + 580 + 3419 + 574 + 590 + 3406 + 3423 + + + 320 + 604 + 602 + 603 + 609 + 597 + 609 + + + 320 + 605 + 608 + 603 + 609 + 597 + 609 + + + 320 + 607 + 602 + 603 + 609 + 597 + 609 + + + 320 + 604 + 605 + 603 + 609 + 597 + 609 + + + 323 + 610 + 605 + 607 + 615 + 599 + 607 + + + 323 + 608 + 601 + 607 + 615 + 599 + 607 + + + 525 + 667 + 531 + 663 + 668 + 531 + 535 + + + 525 + 664 + 532 + 663 + 668 + 531 + 535 + + + 525 + 665 + 535 + 663 + 668 + 531 + 535 + + + 525 + 667 + 534 + 663 + 668 + 531 + 535 + + + 525 + 666 + 534 + 663 + 668 + 531 + 535 + + + 525 + 667 + 534 + 663 + 668 + 531 + 535 + + + 45 + 422 + 3461 + 408 + 425 + 3458 + 3474 + + + 45 + 417 + 3461 + 408 + 425 + 3458 + 3474 + + + 45 + 415 + 3466 + 408 + 425 + 3458 + 3474 + + + 45 + 417 + 3468 + 408 + 425 + 3458 + 3474 + + + 45 + 414 + 3469 + 408 + 425 + 3458 + 3474 + + + 45 + 418 + 3471 + 408 + 425 + 3458 + 3474 + + + 45 + 417 + 3468 + 408 + 425 + 3458 + 3474 + + + 45 + 415 + 3469 + 408 + 425 + 3458 + 3474 + + + 195 + 409 + 3485 + 406 + 416 + 3473 + 3486 + + + 195 + 412 + 3484 + 406 + 416 + 3473 + 3486 + + + 195 + 410 + 3480 + 406 + 416 + 3473 + 3486 + + + 195 + 413 + 3475 + 406 + 416 + 3473 + 3486 + + + 195 + 409 + 3475 + 406 + 416 + 3473 + 3486 + + + 104 + 423 + 637 + 419 + 428 + 633 + 644 + + + 104 + 420 + 640 + 419 + 428 + 633 + 644 + + + 562 + 704 + 526 + 697 + 707 + 523 + 529 + + + 562 + 700 + 526 + 697 + 707 + 523 + 529 + + + 592 + 743 + 523 + 673 + 751 + 433 + 530 + + + 592 + 743 + 495 + 673 + 751 + 433 + 530 + + + 592 + 733 + 518 + 673 + 751 + 433 + 530 + + + 592 + 702 + 488 + 673 + 751 + 433 + 530 + + + 592 + 698 + 516 + 673 + 751 + 433 + 530 + + + 592 + 750 + 481 + 673 + 751 + 433 + 530 + + + 592 + 689 + 513 + 673 + 751 + 433 + 530 + + + 592 + 745 + 517 + 673 + 751 + 433 + 530 + + + 592 + 689 + 502 + 673 + 751 + 433 + 530 + + + 592 + 677 + 486 + 673 + 751 + 433 + 530 + + + 592 + 731 + 494 + 673 + 751 + 433 + 530 + + + 592 + 750 + 480 + 673 + 751 + 433 + 530 + + + 592 + 714 + 514 + 673 + 751 + 433 + 530 + + + 592 + 682 + 497 + 673 + 751 + 433 + 530 + + + 592 + 679 + 512 + 673 + 751 + 433 + 530 + + + 592 + 728 + 519 + 673 + 751 + 433 + 530 + + + 592 + 734 + 512 + 673 + 751 + 433 + 530 + + + 592 + 725 + 522 + 673 + 751 + 433 + 530 + + + 592 + 736 + 487 + 673 + 751 + 433 + 530 + + + 592 + 746 + 510 + 673 + 751 + 433 + 530 + + + 593 + 684 + 486 + 673 + 751 + 433 + 530 + + + 593 + 695 + 529 + 673 + 751 + 433 + 530 + + + 593 + 736 + 517 + 673 + 751 + 433 + 530 + + + 593 + 710 + 503 + 673 + 751 + 433 + 530 + + + 593 + 723 + 489 + 673 + 751 + 433 + 530 + + + 593 + 711 + 529 + 673 + 751 + 433 + 530 + + + 593 + 746 + 525 + 673 + 751 + 433 + 530 + + + 593 + 674 + 484 + 673 + 751 + 433 + 530 + + + 593 + 743 + 528 + 673 + 751 + 433 + 530 + + + 593 + 701 + 496 + 673 + 751 + 433 + 530 + + + 593 + 702 + 519 + 673 + 751 + 433 + 530 + + + 593 + 706 + 526 + 673 + 751 + 433 + 530 + + + 593 + 684 + 491 + 673 + 751 + 433 + 530 + + + 593 + 745 + 502 + 673 + 751 + 433 + 530 + + + 593 + 716 + 484 + 673 + 751 + 433 + 530 + + + 593 + 702 + 509 + 673 + 751 + 433 + 530 + + + 593 + 748 + 520 + 673 + 751 + 433 + 530 + + + 593 + 720 + 509 + 673 + 751 + 433 + 530 + + + 593 + 697 + 529 + 673 + 751 + 433 + 530 + + + 593 + 733 + 516 + 673 + 751 + 433 + 530 + + + 585 + 720 + 514 + 673 + 751 + 433 + 530 + + + 585 + 746 + 494 + 673 + 751 + 433 + 530 + + + 585 + 704 + 499 + 673 + 751 + 433 + 530 + + + 585 + 681 + 498 + 673 + 751 + 433 + 530 + + + 585 + 710 + 480 + 673 + 751 + 433 + 530 + + + 585 + 707 + 508 + 673 + 751 + 433 + 530 + + + 585 + 748 + 519 + 673 + 751 + 433 + 530 + + + 585 + 701 + 487 + 673 + 751 + 433 + 530 + + + 585 + 689 + 488 + 673 + 751 + 433 + 530 + + + 585 + 675 + 500 + 673 + 751 + 433 + 530 + + + 585 + 731 + 508 + 673 + 751 + 433 + 530 + + + 585 + 704 + 528 + 673 + 751 + 433 + 530 + + + 585 + 682 + 525 + 673 + 751 + 433 + 530 + + + 585 + 728 + 497 + 673 + 751 + 433 + 530 + + + 585 + 685 + 515 + 673 + 751 + 433 + 530 + + + 585 + 735 + 480 + 673 + 751 + 433 + 530 + + + 585 + 749 + 506 + 673 + 751 + 433 + 530 + + + 585 + 698 + 499 + 673 + 751 + 433 + 530 + + + 585 + 727 + 487 + 673 + 751 + 433 + 530 + + + 585 + 674 + 511 + 673 + 751 + 433 + 530 + + + 562 + 705 + 465 + 700 + 706 + 460 + 468 + + + 562 + 701 + 467 + 700 + 706 + 460 + 468 + + + 551 + 699 + 454 + 699 + 706 + 454 + 460 + + + 551 + 701 + 455 + 699 + 706 + 454 + 460 + + + 188 + 229 + 331 + 203 + 241 + 312 + 345 + + + 188 + 224 + 328 + 203 + 241 + 312 + 345 + + + 188 + 209 + 364 + 207 + 222 + 359 + 374 + + + 188 + 213 + 365 + 207 + 222 + 359 + 374 + + + 188 + 289 + 332 + 281 + 298 + 327 + 339 + + + 188 + 291 + 332 + 281 + 298 + 327 + 339 + + + 296 + 111 + 295 + 108 + 133 + 293 + 311 + + + 296 + 113 + 295 + 108 + 133 + 293 + 311 + + + 296 + 112 + 297 + 108 + 133 + 293 + 311 + + + 296 + 114 + 297 + 108 + 133 + 293 + 311 + + + 296 + 116 + 298 + 108 + 133 + 293 + 311 + + + 296 + 118 + 297 + 108 + 133 + 293 + 311 + + + 296 + 117 + 304 + 108 + 133 + 293 + 311 + + + 296 + 115 + 308 + 108 + 133 + 293 + 311 + + + 199 + 249 + 345 + 245 + 271 + 340 + 368 + + + 199 + 257 + 346 + 245 + 271 + 340 + 368 + + + 199 + 263 + 346 + 245 + 271 + 340 + 368 + + + 199 + 256 + 359 + 245 + 271 + 340 + 368 + + + 199 + 260 + 359 + 245 + 271 + 340 + 368 + + + 199 + 254 + 360 + 245 + 271 + 340 + 368 + + + 199 + 265 + 355 + 245 + 271 + 340 + 368 + + + 199 + 261 + 365 + 245 + 271 + 340 + 368 + + + 53 + 67 + 326 + 58 + 72 + 314 + 330 + + + 53 + 65 + 320 + 58 + 72 + 314 + 330 + + + 53 + 70 + 318 + 58 + 72 + 314 + 330 + + + 53 + 84 + 314 + 80 + 88 + 311 + 324 + + + 53 + 66 + 306 + 63 + 85 + 303 + 310 + + + 61 + 85 + 329 + 76 + 85 + 325 + 335 + + + 61 + 82 + 328 + 76 + 85 + 325 + 335 + + + 61 + 80 + 332 + 76 + 85 + 325 + 335 + + + 74 + 304 + 298 + 300 + 334 + 285 + 310 + + + 74 + 302 + 298 + 300 + 334 + 285 + 310 + + + 23 + 313 + 309 + 300 + 334 + 285 + 310 + + + 74 + 316 + 303 + 300 + 334 + 285 + 310 + + + 47 + 323 + 305 + 300 + 334 + 285 + 310 + + + 47 + 323 + 308 + 300 + 334 + 285 + 310 + + + 47 + 319 + 306 + 300 + 334 + 285 + 310 + + + 47 + 323 + 298 + 300 + 334 + 285 + 310 + + + 47 + 326 + 296 + 300 + 334 + 285 + 310 + + + 47 + 328 + 295 + 300 + 334 + 285 + 310 + + + 47 + 329 + 295 + 300 + 334 + 285 + 310 + + + 47 + 320 + 293 + 300 + 334 + 285 + 310 + + + 68 + 172 + 324 + 164 + 188 + 303 + 330 + + + 68 + 170 + 322 + 164 + 188 + 303 + 330 + + + 68 + 168 + 324 + 164 + 188 + 303 + 330 + + + 41 + 172 + 319 + 164 + 188 + 303 + 330 + + + 41 + 168 + 316 + 164 + 188 + 303 + 330 + + + 41 + 166 + 319 + 164 + 188 + 303 + 330 + + + 41 + 167 + 323 + 164 + 188 + 303 + 330 + + + 68 + 168 + 309 + 164 + 177 + 303 + 315 + + + 68 + 167 + 310 + 164 + 177 + 303 + 315 + + + 68 + 168 + 311 + 164 + 177 + 303 + 315 + + + 68 + 171 + 312 + 164 + 177 + 303 + 315 + + + 68 + 170 + 309 + 164 + 177 + 303 + 315 + + + 41 + 167 + 312 + 164 + 177 + 303 + 315 + + + 41 + 170 + 313 + 164 + 177 + 303 + 315 + + + 41 + 165 + 307 + 164 + 177 + 303 + 315 + + + 41 + 168 + 307 + 164 + 177 + 303 + 315 + + + 795 + 441 + 486 + 440 + 443 + 485 + 488 + + + 3 + 525 + 620 + 520 + 529 + 616 + 622 + + + 3 + 523 + 621 + 520 + 529 + 616 + 622 + + + 3 + 523 + 617 + 520 + 529 + 616 + 622 + + + 3 + 526 + 619 + 520 + 529 + 616 + 622 + + + 321 + 563 + 567 + 562 + 567 + 564 + 572 + + + 321 + 565 + 569 + 562 + 567 + 564 + 572 + + + 19 + 567 + 3436 + 554 + 570 + 3419 + 3437 + + + 19 + 561 + 3435 + 554 + 570 + 3419 + 3437 + + + 19 + 557 + 3435 + 554 + 570 + 3419 + 3437 + + + 19 + 560 + 3431 + 554 + 570 + 3419 + 3437 + + + 19 + 558 + 3426 + 554 + 570 + 3419 + 3437 + + + 19 + 561 + 3424 + 554 + 570 + 3419 + 3437 + + + 19 + 560 + 3421 + 554 + 570 + 3419 + 3437 + + + 19 + 563 + 3422 + 554 + 570 + 3419 + 3437 + + + 321 + 549 + 591 + 544 + 552 + 558 + 603 + + + 321 + 548 + 595 + 544 + 552 + 558 + 603 + + + 321 + 549 + 602 + 544 + 552 + 558 + 603 + + + 356 + 396 + 3299 + 390 + 402 + 3295 + 3302 + + + 356 + 393 + 3300 + 390 + 402 + 3295 + 3302 + + + 356 + 391 + 3297 + 390 + 402 + 3295 + 3302 + + + 356 + 395 + 3296 + 390 + 402 + 3295 + 3302 + + + 356 + 399 + 3297 + 390 + 402 + 3295 + 3302 + + + 356 + 402 + 3299 + 390 + 402 + 3295 + 3302 + + + 356 + 400 + 3300 + 390 + 402 + 3295 + 3302 + + + 356 + 396 + 3302 + 390 + 402 + 3295 + 3302 + + + 356 + 395 + 3300 + 390 + 402 + 3295 + 3302 + + + 184 + 83 + 164 + 79 + 87 + 156 + 165 + + + 184 + 83 + 160 + 79 + 87 + 156 + 165 + + + 6 + 609 + 736 + 605 + 612 + 732 + 741 + + + 6 + 611 + 739 + 605 + 612 + 732 + 741 + + + 6 + 612 + 737 + 605 + 612 + 732 + 741 + + + 6 + 610 + 736 + 605 + 612 + 732 + 741 + + + 574 + 638 + 1681 + 634 + 639 + 1680 + 1685 + + + 574 + 636 + 1681 + 634 + 639 + 1680 + 1685 + + + 574 + 634 + 1683 + 634 + 639 + 1680 + 1685 + + + 574 + 637 + 1685 + 634 + 639 + 1680 + 1685 + + + 270 + 581 + 3585 + 578 + 590 + 3581 + 3589 + + + 270 + 582 + 3589 + 578 + 590 + 3581 + 3589 + + + 53 + 349 + 1574 + 345 + 350 + 1570 + 1577 + + + 53 + 347 + 1573 + 345 + 350 + 1570 + 1577 + + + 53 + 345 + 1574 + 345 + 350 + 1570 + 1577 + + + 53 + 346 + 1570 + 345 + 350 + 1570 + 1577 + + + 53 + 350 + 1571 + 345 + 350 + 1570 + 1577 + + + 53 + 346 + 1577 + 345 + 350 + 1570 + 1577 + + + 181 + 341 + 3463 + 340 + 348 + 3460 + 3465 + + + 182 + 346 + 3463 + 345 + 347 + 3462 + 3467 + + + 47 + 340 + 631 + 338 + 348 + 626 + 638 + + + 47 + 342 + 634 + 338 + 348 + 626 + 638 + + + 47 + 345 + 632 + 338 + 348 + 626 + 638 + + + 47 + 343 + 630 + 338 + 348 + 626 + 638 + + + 47 + 347 + 630 + 338 + 348 + 626 + 638 + + + 47 + 346 + 636 + 338 + 348 + 626 + 638 + + + 47 + 345 + 631 + 338 + 348 + 626 + 638 + + + 47 + 345 + 628 + 338 + 348 + 626 + 638 + + + 47 + 343 + 635 + 338 + 348 + 626 + 638 + + + 47 + 341 + 627 + 338 + 348 + 626 + 638 + + + 68 + 344 + 3469 + 343 + 345 + 3467 + 3470 + + + 68 + 345 + 3467 + 343 + 345 + 3467 + 3470 + + + 72 + 316 + 1607 + 314 + 319 + 1603 + 1608 + + + 29 + 323 + 669 + 322 + 327 + 667 + 670 + + + 29 + 324 + 667 + 322 + 327 + 667 + 670 + + + 29 + 326 + 668 + 322 + 327 + 667 + 670 + + + 29 + 327 + 670 + 322 + 327 + 667 + 670 + + + 148 + 317 + 667 + 315 + 318 + 665 + 669 + + + 65 + 154 + 507 + 149 + 158 + 507 + 511 + + + 65 + 155 + 509 + 149 + 158 + 507 + 511 + + + 65 + 151 + 511 + 149 + 158 + 507 + 511 + + + 65 + 149 + 509 + 149 + 158 + 507 + 511 + + + 70 + 70 + 585 + 62 + 74 + 581 + 610 + + + 70 + 72 + 587 + 62 + 74 + 581 + 610 + + + 70 + 70 + 590 + 62 + 74 + 581 + 610 + + + 70 + 73 + 596 + 62 + 74 + 581 + 610 + + + 70 + 69 + 600 + 62 + 74 + 581 + 610 + + + 70 + 74 + 593 + 62 + 74 + 581 + 610 + + + 307 + 72 + 600 + 67 + 74 + 597 + 697 + + + 13 + 57 + 603 + 54 + 62 + 599 + 611 + + + 13 + 69 + 640 + 63 + 73 + 635 + 646 + + + 13 + 66 + 651 + 66 + 81 + 645 + 656 + + + 13 + 71 + 647 + 66 + 81 + 645 + 656 + + + 13 + 76 + 649 + 66 + 81 + 645 + 656 + + + 13 + 68 + 645 + 66 + 81 + 645 + 656 + + + 13 + 56 + 661 + 56 + 83 + 655 + 671 + + + 13 + 63 + 663 + 56 + 83 + 655 + 671 + + + 13 + 75 + 661 + 56 + 83 + 655 + 671 + + + 13 + 82 + 659 + 56 + 83 + 655 + 671 + + + 571 + 88 + 661 + 88 + 88 + 661 + 661 + + + 72 + 83 + 680 + 58 + 86 + 664 + 682 + + + 72 + 79 + 672 + 58 + 86 + 664 + 682 + + + 72 + 69 + 673 + 58 + 86 + 664 + 682 + + + 72 + 62 + 670 + 58 + 86 + 664 + 682 + + + 72 + 59 + 677 + 58 + 86 + 664 + 682 + + + 72 + 62 + 681 + 58 + 86 + 664 + 682 + + + 29 + 68 + 680 + 58 + 86 + 664 + 682 + + + 13 + 83 + 692 + 82 + 86 + 688 + 701 + + + 70 + 78 + 715 + 62 + 94 + 707 + 721 + + + 79 + 51 + 716 + 48 + 55 + 713 + 720 + + + 34 + 49 + 712 + 48 + 60 + 710 + 720 + + + 34 + 52 + 717 + 48 + 60 + 710 + 720 + + + 34 + 51 + 720 + 48 + 60 + 710 + 720 + + + 34 + 58 + 718 + 48 + 60 + 710 + 720 + + + 717 + 63 + 727 + 59 + 65 + 722 + 732 + + + 717 + 61 + 725 + 59 + 65 + 722 + 732 + + + 717 + 64 + 723 + 59 + 65 + 722 + 732 + + + 720 + 62 + 729 + 59 + 65 + 728 + 732 + + + 720 + 60 + 730 + 59 + 65 + 728 + 732 + + + 549 + 64 + 729 + 59 + 65 + 728 + 732 + + + 719 + 63 + 732 + 63 + 63 + 732 + 732 + + + 324 + 540 + 595 + 536 + 548 + 592 + 598 + + + 322 + 547 + 586 + 544 + 554 + 582 + 608 + + + 322 + 550 + 591 + 544 + 554 + 582 + 608 + + + 323 + 551 + 596 + 544 + 554 + 582 + 608 + + + 323 + 546 + 604 + 544 + 554 + 582 + 608 + + + 321 + 564 + 595 + 564 + 572 + 592 + 599 + + 321 + 568 + 597 + 564 + 572 + 592 + 599 + + + 317 + 467 + 651 + 467 + 467 + 646 + 656 + + + 21 + 444 + 676 + 438 + 447 + 669 + 678 + + + 261 + 453 + 680 + 447 + 455 + 678 + 681 + + + 64 + 448 + 685 + 447 + 455 + 682 + 687 + + + 264 + 452 + 683 + 447 + 455 + 682 + 687 + + + 260 + 453 + 686 + 447 + 455 + 682 + 687 + + + 332 + 452 + 687 + 447 + 455 + 682 + 688 + + + 262 + 458 + 676 + 454 + 458 + 672 + 680 + + + 262 + 457 + 680 + 454 + 458 + 672 + 680 + + + 262 + 455 + 677 + 454 + 458 + 672 + 680 + + + 257 + 464 + 682 + 459 + 466 + 681 + 685 + + + 258 + 469 + 676 + 459 + 469 + 672 + 680 + + + 258 + 467 + 678 + 459 + 469 + 672 + 680 + + + 258 + 465 + 676 + 459 + 469 + 672 + 680 + + + 259 + 463 + 678 + 459 + 469 + 672 + 680 + + + 271 + 494 + 659 + 483 + 508 + 644 + 671 + + + 271 + 498 + 653 + 483 + 508 + 644 + 671 + + + 271 + 502 + 659 + 483 + 508 + 644 + 671 + + + 271 + 499 + 667 + 483 + 508 + 644 + 671 + + + 271 + 506 + 665 + 483 + 508 + 644 + 671 + + + 594 + 520 + 663 + 511 + 523 + 658 + 670 + + + 594 + 516 + 662 + 511 + 523 + 658 + 670 + + + 594 + 516 + 669 + 511 + 523 + 658 + 670 + + + 594 + 513 + 668 + 511 + 523 + 658 + 670 + + + 421 + 480 + 705 + 479 + 512 + 687 + 717 + + + 421 + 487 + 709 + 479 + 512 + 687 + 717 + + + 421 + 491 + 703 + 479 + 512 + 687 + 717 + + + 421 + 497 + 708 + 479 + 512 + 687 + 717 + + + 421 + 502 + 703 + 479 + 512 + 687 + 717 + + + 421 + 507 + 700 + 479 + 512 + 687 + 717 + + + 421 + 498 + 713 + 479 + 512 + 687 + 717 + + + 421 + 492 + 711 + 479 + 512 + 687 + 717 + + + 255 + 437 + 695 + 436 + 550 + 691 + 697 + + + 256 + 439 + 692 + 436 + 550 + 691 + 697 + + + 64 + 442 + 692 + 441 + 447 + 689 + 698 + + + 29 + 446 + 697 + 441 + 447 + 689 + 698 + + + 278 + 444 + 706 + 440 + 449 + 696 + 709 + + + 279 + 451 + 705 + 449 + 454 + 702 + 706 + + + 264 + 453 + 698 + 445 + 459 + 691 + 709 + + + 264 + 450 + 699 + 445 + 459 + 691 + 709 + + + 264 + 449 + 702 + 445 + 459 + 691 + 709 + + + 264 + 453 + 703 + 445 + 459 + 691 + 709 + + + 264 + 451 + 701 + 445 + 459 + 691 + 709 + + + 264 + 449 + 704 + 445 + 459 + 691 + 709 + + + 264 + 446 + 703 + 445 + 459 + 691 + 709 + + + 264 + 446 + 697 + 445 + 459 + 691 + 709 + + + 70 + 464 + 717 + 459 + 467 + 713 + 717 + + + 421 + 466 + 742 + 448 + 466 + 738 + 749 + + + 521 + 466 + 732 + 449 + 477 + 727 + 740 + + + 521 + 457 + 735 + 449 + 477 + 727 + 740 + + + 521 + 464 + 739 + 449 + 477 + 727 + 740 + + + 67 + 466 + 763 + 451 + 473 + 750 + 771 + + + 517 + 436 + 751 + 434 + 439 + 748 + 754 + + + 523 + 420 + 764 + 416 + 430 + 755 + 767 + + + 421 + 416 + 761 + 416 + 430 + 755 + 767 + + + 521 + 417 + 763 + 416 + 430 + 755 + 767 + + + 521 + 419 + 760 + 416 + 430 + 755 + 767 + + + 521 + 422 + 759 + 416 + 430 + 755 + 767 + + + 521 + 423 + 756 + 416 + 430 + 755 + 767 + + + 521 + 426 + 759 + 416 + 430 + 755 + 767 + + + 521 + 427 + 764 + 416 + 430 + 755 + 767 + + + 521 + 422 + 766 + 416 + 430 + 755 + 767 + + + 521 + 420 + 767 + 416 + 430 + 755 + 767 + + + 521 + 424 + 766 + 416 + 430 + 755 + 767 + + + 556 + 425 + 764 + 425 + 425 + 764 + 764 + + + 521 + 426 + 771 + 425 + 429 + 769 + 773 + + + 521 + 428 + 772 + 425 + 429 + 769 + 773 + + + 521 + 410 + 769 + 393 + 413 + 760 + 771 + + + 521 + 409 + 765 + 393 + 413 + 760 + 771 + + + 521 + 405 + 763 + 393 + 413 + 760 + 771 + + + 521 + 402 + 766 + 393 + 413 + 760 + 771 + + + 521 + 399 + 763 + 393 + 413 + 760 + 771 + + + 521 + 396 + 764 + 393 + 413 + 760 + 771 + + + 521 + 399 + 766 + 393 + 413 + 760 + 771 + + + 521 + 400 + 763 + 393 + 413 + 760 + 771 + + + 557 + 402 + 766 + 398 + 405 + 763 + 766 + + + 523 + 374 + 774 + 370 + 381 + 768 + 787 + + + 521 + 374 + 782 + 370 + 381 + 768 + 787 + + + 521 + 377 + 771 + 370 + 381 + 768 + 787 + + + 521 + 385 + 784 + 379 + 385 + 777 + 795 + + + 421 + 385 + 788 + 379 + 385 + 777 + 795 + + + 70 + 379 + 786 + 379 + 385 + 777 + 795 + + + 523 + 440 + 833 + 427 + 450 + 812 + 840 + + + 521 + 436 + 831 + 427 + 450 + 812 + 840 + + + 521 + 437 + 825 + 427 + 450 + 812 + 840 + + + 521 + 433 + 820 + 427 + 450 + 812 + 840 + + + 523 + 432 + 816 + 427 + 450 + 812 + 840 + + + 523 + 440 + 816 + 427 + 450 + 812 + 840 + + + 521 + 444 + 821 + 427 + 450 + 812 + 840 + + + 521 + 442 + 828 + 427 + 450 + 812 + 840 + + + 521 + 450 + 822 + 427 + 450 + 812 + 840 + + + 542 + 382 + 847 + 380 + 390 + 845 + 856 + + + 542 + 384 + 854 + 380 + 390 + 845 + 856 + + + 542 + 386 + 854 + 380 + 390 + 845 + 856 + + + 542 + 388 + 854 + 380 + 390 + 845 + 856 + + + 542 + 386 + 852 + 380 + 390 + 845 + 856 + + + 542 + 387 + 849 + 380 + 390 + 845 + 856 + + + 542 + 388 + 849 + 380 + 390 + 845 + 856 + + + 542 + 390 + 845 + 380 + 390 + 845 + 856 + + + 542 + 388 + 850 + 380 + 390 + 845 + 856 + + + 542 + 385 + 851 + 380 + 390 + 845 + 856 + + + 542 + 387 + 856 + 380 + 390 + 845 + 856 + + + 542 + 390 + 855 + 380 + 390 + 845 + 856 + + + 765 + 397 + 865 + 394 + 402 + 863 + 866 + + + 765 + 424 + 863 + 422 + 428 + 861 + 864 + + + 311 + 523 + 3433 + 520 + 524 + 3431 + 3438 + + + 311 + 520 + 3434 + 520 + 524 + 3431 + 3438 + + + 311 + 521 + 3436 + 520 + 524 + 3431 + 3438 + + + 311 + 524 + 3435 + 520 + 524 + 3431 + 3438 + + + 312 + 511 + 3418 + 509 + 513 + 3415 + 3422 + + + 312 + 511 + 3410 + 508 + 513 + 3408 + 3415 + + + 312 + 510 + 3444 + 508 + 513 + 3440 + 3447 + + + 294 + 506 + 3428 + 500 + 508 + 3424 + 3430 + + + 23 + 206 + 576 + 194 + 212 + 569 + 581 + + + 36 + 208 + 561 + 204 + 211 + 556 + 569 + + + 40 + 210 + 546 + 208 + 211 + 545 + 546 + + + 79 + 218 + 546 + 217 + 221 + 542 + 549 + + + 29 + 218 + 554 + 214 + 224 + 550 + 555 + + + 34 + 212 + 543 + 202 + 216 + 542 + 555 + + + 80 + 217 + 1490 + 202 + 221 + 1486 + 1499 + + + 80 + 221 + 1497 + 202 + 221 + 1486 + 1499 + + + 80 + 215 + 1496 + 202 + 221 + 1486 + 1499 + + + 80 + 207 + 1491 + 202 + 221 + 1486 + 1499 + + + 80 + 213 + 1490 + 202 + 221 + 1486 + 1499 + + + 34 + 205 + 1488 + 202 + 221 + 1486 + 1499 + + + 34 + 212 + 1486 + 202 + 221 + 1486 + 1499 + + + 38 + 213 + 2441 + 208 + 215 + 2438 + 2442 + + + 91 + 209 + 2439 + 208 + 215 + 2438 + 2442 + + + 23 + 235 + 550 + 232 + 240 + 541 + 568 + + + 62 + 288 + 667 + 287 + 298 + 655 + 672 + + + 62 + 291 + 663 + 287 + 298 + 655 + 672 + + + 62 + 294 + 666 + 287 + 298 + 655 + 672 + + + 62 + 297 + 662 + 287 + 298 + 655 + 672 + + + 62 + 291 + 658 + 287 + 298 + 655 + 672 + + + 62 + 295 + 671 + 287 + 298 + 655 + 672 + + + 47 + 299 + 676 + 288 + 300 + 672 + 679 + + + 47 + 296 + 675 + 288 + 300 + 672 + 679 + + + 62 + 290 + 674 + 288 + 300 + 672 + 679 + + + 62 + 296 + 672 + 288 + 300 + 672 + 679 + + + 164 + 339 + 706 + 337 + 341 + 704 + 708 + + + 70 + 424 + 686 + 390 + 434 + 665 + 710 + + + 70 + 419 + 701 + 390 + 434 + 665 + 710 + + + 70 + 412 + 699 + 390 + 434 + 665 + 710 + + + 70 + 403 + 697 + 390 + 434 + 665 + 710 + + + 70 + 406 + 681 + 390 + 434 + 665 + 710 + + + 114 + 408 + 687 + 390 + 434 + 665 + 710 + + + 114 + 414 + 687 + 390 + 434 + 665 + 710 + + + 114 + 422 + 689 + 390 + 434 + 665 + 710 + + + 114 + 419 + 700 + 390 + 434 + 665 + 710 + + + 114 + 425 + 707 + 390 + 434 + 665 + 710 + + + 70 + 421 + 707 + 390 + 434 + 665 + 710 + + + 70 + 430 + 700 + 390 + 434 + 665 + 710 + + + 46 + 419 + 3526 + 418 + 427 + 3523 + 3533 + + + 46 + 423 + 3525 + 418 + 427 + 3523 + 3533 + + + 46 + 425 + 3529 + 418 + 427 + 3523 + 3533 + + + 46 + 420 + 3530 + 418 + 427 + 3523 + 3533 + + + 46 + 420 + 3527 + 418 + 427 + 3523 + 3533 + + + 99 + 407 + 3524 + 403 + 412 + 3518 + 3528 + + + 99 + 408 + 3522 + 403 + 412 + 3518 + 3528 + + + 99 + 404 + 3522 + 403 + 412 + 3518 + 3528 + + + 99 + 405 + 3519 + 403 + 412 + 3518 + 3528 + + + 99 + 407 + 3521 + 403 + 412 + 3518 + 3528 + + + 22 + 414 + 3536 + 404 + 415 + 3529 + 3543 + + + 22 + 411 + 3538 + 404 + 415 + 3529 + 3543 + + + 22 + 407 + 3538 + 404 + 415 + 3529 + 3543 + + + 22 + 410 + 3535 + 404 + 415 + 3529 + 3543 + + + 22 + 406 + 3493 + 403 + 411 + 3488 + 3508 + + + 22 + 404 + 3499 + 403 + 411 + 3488 + 3508 + + + 22 + 408 + 3489 + 403 + 411 + 3488 + 3508 + + + 22 + 410 + 3492 + 403 + 411 + 3488 + 3508 + + + 196 + 417 + 3478 + 414 + 428 + 3475 + 3485 + + + 22 + 420 + 621 + 413 + 421 + 613 + 623 + + + 67 + 414 + 606 + 408 + 430 + 603 + 620 + + + 67 + 422 + 608 + 408 + 430 + 603 + 620 + + + 67 + 429 + 618 + 408 + 430 + 603 + 620 + + + 136 + 406 + 615 + 405 + 408 + 603 + 617 + + + 136 + 406 + 605 + 405 + 408 + 603 + 617 + + + 45 + 413 + 639 + 405 + 415 + 619 + 640 + + + 45 + 407 + 632 + 405 + 415 + 619 + 640 + + + 45 + 408 + 622 + 405 + 415 + 619 + 640 + + + 43 + 652 + 3533 + 649 + 655 + 3531 + 3536 + + + 41 + 654 + 3533 + 649 + 655 + 3531 + 3536 + + + 41 + 654 + 3535 + 649 + 655 + 3531 + 3536 + + + 67 + 652 + 3536 + 649 + 655 + 3531 + 3536 + + + 67 + 652 + 3532 + 649 + 655 + 3531 + 3536 + + + 67 + 650 + 3533 + 649 + 655 + 3531 + 3536 + + + 67 + 664 + 3533 + 646 + 666 + 3531 + 3542 + + + 67 + 662 + 3535 + 646 + 666 + 3531 + 3542 + + + 41 + 659 + 3537 + 646 + 666 + 3531 + 3542 + + + 67 + 653 + 3541 + 646 + 666 + 3531 + 3542 + + + 67 + 649 + 3539 + 646 + 666 + 3531 + 3542 + + + 67 + 647 + 3536 + 646 + 666 + 3531 + 3542 + + + 41 + 646 + 3534 + 646 + 666 + 3531 + 3542 + + + 407 + 667 + 596 + 667 + 673 + 590 + 599 + + + 407 + 669 + 595 + 667 + 673 + 590 + 599 + + + 407 + 669 + 593 + 667 + 673 + 590 + 599 + + + 407 + 671 + 594 + 667 + 673 + 590 + 599 + + + 407 + 667 + 594 + 667 + 673 + 590 + 599 + + + 407 + 671 + 597 + 667 + 673 + 590 + 599 + + + 410 + 673 + 595 + 667 + 673 + 590 + 599 + + + 189 + 279 + 666 + 277 + 280 + 665 + 667 + + + 21 + 279 + 663 + 277 + 281 + 662 + 664 + + + 192 + 283 + 663 + 282 + 284 + 662 + 664 + + + 137 + 282 + 661 + 282 + 284 + 658 + 661 + + + 64 + 282 + 655 + 282 + 284 + 655 + 657 + + + 714 + 161 + 513 + 158 + 166 + 511 + 519 + + + 783 + 166 + 513 + 158 + 166 + 511 + 519 + + + 31 + 168 + 500 + 165 + 174 + 494 + 502 + + + 133 + 178 + 484 + 176 + 181 + 480 + 487 + + + 33 + 143 + 519 + 141 + 145 + 518 + 521 + + + 26 + 128 + 505 + 125 + 130 + 504 + 506 + + + 30 + 133 + 509 + 126 + 135 + 505 + 511 + + + 715 + 126 + 504 + 122 + 126 + 504 + 507 + + + 781 + 123 + 506 + 122 + 126 + 504 + 507 + + + 28 + 133 + 528 + 133 + 137 + 528 + 529 + + + 64 + 146 + 534 + 141 + 151 + 532 + 535 + + + 27 + 150 + 534 + 145 + 151 + 533 + 535 + + + 64 + 147 + 531 + 145 + 151 + 524 + 532 + + + 64 + 148 + 528 + 145 + 151 + 524 + 532 + + + 21 + 160 + 544 + 158 + 168 + 533 + 550 + + + 111 + 149 + 557 + 148 + 152 + 554 + 560 + + + 3 + 146 + 558 + 145 + 147 + 557 + 562 + + + 3 + 145 + 559 + 145 + 147 + 557 + 562 + + + 3 + 147 + 560 + 145 + 147 + 557 + 562 + + + 3 + 145 + 561 + 145 + 147 + 557 + 562 + + + 3 + 147 + 562 + 145 + 147 + 557 + 562 + + + 183 + 150 + 1506 + 148 + 152 + 1504 + 1507 + + + 112 + 149 + 1499 + 148 + 152 + 1498 + 1501 + + + 14 + 136 + 511 + 133 + 137 + 508 + 515 + + + 42 + 126 + 474 + 124 + 128 + 472 + 477 + + + 20 + 128 + 456 + 126 + 134 + 455 + 459 + + + 8 + 118 + 450 + 117 + 120 + 449 + 452 + + + 39 + 100 + 493 + 97 + 106 + 484 + 496 + + + 32 + 100 + 477 + 97 + 106 + 473 + 482 + + + 49 + 98 + 1428 + 97 + 99 + 1428 + 1431 + + + 65 + 112 + 464 + 108 + 113 + 459 + 467 + + + 65 + 110 + 465 + 108 + 113 + 459 + 467 + + + 11 + 80 + 445 + 78 + 85 + 442 + 452 + + + 98 + 83 + 444 + 78 + 85 + 442 + 452 + + + 64 + 80 + 448 + 78 + 85 + 442 + 452 + + + 66 + 84 + 450 + 78 + 85 + 442 + 452 + + + 44 + 83 + 453 + 78 + 85 + 451 + 454 + + + 66 + 130 + 438 + 115 + 134 + 425 + 441 + + + 66 + 121 + 434 + 115 + 134 + 425 + 441 + + + 314 + 84 + 1387 + 83 + 85 + 1386 + 1388 + + + 189 + 254 + 186 + 250 + 272 + 177 + 196 + + + 189 + 257 + 181 + 250 + 272 + 177 + 196 + + + 189 + 259 + 179 + 250 + 272 + 177 + 196 + + + 189 + 261 + 183 + 250 + 272 + 177 + 196 + + + 189 + 265 + 185 + 250 + 272 + 177 + 196 + + + 189 + 268 + 186 + 250 + 272 + 177 + 196 + + + 189 + 254 + 189 + 250 + 272 + 177 + 196 + + + 136 + 240 + 194 + 237 + 244 + 192 + 195 + + + 136 + 235 + 191 + 227 + 235 + 187 + 191 + + + 61 + 217 + 183 + 216 + 218 + 181 + 185 + + + 61 + 225 + 187 + 224 + 225 + 187 + 190 + + + 61 + 227 + 182 + 224 + 230 + 180 + 184 + + + 61 + 225 + 171 + 222 + 228 + 168 + 171 + + + 22 + 238 + 178 + 230 + 245 + 174 + 182 + + + 22 + 233 + 178 + 230 + 245 + 174 + 182 + + + 184 + 262 + 3007 + 250 + 265 + 3002 + 3018 + + + 184 + 262 + 3013 + 250 + 265 + 3002 + 3018 + + + 184 + 255 + 3010 + 250 + 265 + 3002 + 3018 + + + 184 + 257 + 3015 + 250 + 265 + 3002 + 3018 + + + 99 + 578 + 3460 + 578 + 579 + 3460 + 3461 + + + 34 + 580 + 3460 + 580 + 581 + 3460 + 3461 + + + 34 + 580 + 3461 + 580 + 581 + 3460 + 3461 + + + 34 + 579 + 3458 + 578 + 583 + 3458 + 3459 + + + 74 + 582 + 3460 + 582 + 583 + 3460 + 3461 + + + 62 + 580 + 3457 + 580 + 581 + 3457 + 3457 + + + 29 + 578 + 3457 + 578 + 579 + 3456 + 3457 + + + 19 + 579 + 3457 + 578 + 579 + 3456 + 3457 + + + 19 + 579 + 3458 + 578 + 583 + 3458 + 3459 + + + 4 + 588 + 3478 + 576 + 597 + 3464 + 3481 + + + 4 + 585 + 3479 + 576 + 597 + 3464 + 3481 + + + 4 + 586 + 3478 + 576 + 597 + 3464 + 3481 + + + 4 + 577 + 3479 + 576 + 597 + 3464 + 3481 + + + 4 + 580 + 3477 + 576 + 597 + 3464 + 3481 + + + 367 + 588 + 3474 + 583 + 594 + 3472 + 3477 + + + 367 + 588 + 3475 + 583 + 594 + 3472 + 3477 + + + 367 + 589 + 3476 + 583 + 594 + 3472 + 3477 + + + 367 + 589 + 3477 + 583 + 594 + 3472 + 3477 + + + 367 + 587 + 3475 + 583 + 594 + 3472 + 3477 + + + 367 + 587 + 3477 + 583 + 594 + 3472 + 3477 + + + 367 + 586 + 3477 + 583 + 594 + 3472 + 3477 + + + 367 + 584 + 3476 + 583 + 594 + 3472 + 3477 + + + 367 + 585 + 3474 + 583 + 594 + 3472 + 3477 + + + 367 + 583 + 3476 + 583 + 594 + 3472 + 3477 + + + 367 + 583 + 3475 + 583 + 594 + 3472 + 3477 + + + 367 + 586 + 3473 + 583 + 594 + 3472 + 3477 + + + 41 + 666 + 578 + 657 + 675 + 575 + 587 + + + 41 + 666 + 581 + 657 + 675 + 575 + 587 + + + 41 + 662 + 583 + 657 + 675 + 575 + 587 + + + 41 + 661 + 580 + 657 + 675 + 575 + 587 + + + 41 + 668 + 578 + 657 + 675 + 575 + 587 + + + 41 + 664 + 576 + 657 + 675 + 575 + 587 + + + 29 + 666 + 578 + 657 + 675 + 575 + 587 + + + 29 + 670 + 577 + 657 + 675 + 575 + 587 + + + 29 + 664 + 578 + 657 + 675 + 575 + 587 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 29 + 689 + 564 + 675 + 701 + 564 + 570 + + + 29 + 690 + 564 + 675 + 701 + 564 + 570 + + + 29 + 691 + 564 + 675 + 701 + 564 + 570 + + + 29 + 692 + 564 + 675 + 701 + 564 + 570 + + + 29 + 693 + 564 + 675 + 701 + 564 + 570 + + + 29 + 694 + 564 + 675 + 701 + 564 + 570 + + + 29 + 695 + 564 + 675 + 701 + 564 + 570 + + + 311 + 521 + 3434 + 520 + 524 + 3433 + 3436 + + + 311 + 523 + 3434 + 520 + 524 + 3433 + 3436 + + + 311 + 522 + 3434 + 520 + 524 + 3433 + 3436 + + + 521 + 540 + 748 + 537 + 544 + 744 + 750 + + + 521 + 541 + 748 + 537 + 544 + 744 + 750 + + + 521 + 541 + 746 + 537 + 544 + 744 + 750 + + + 521 + 540 + 746 + 537 + 544 + 744 + 750 + + + 521 + 542 + 746 + 537 + 544 + 744 + 750 + + + 521 + 540 + 752 + 537 + 547 + 750 + 757 + + + 521 + 541 + 754 + 537 + 547 + 750 + 757 + + + 521 + 540 + 755 + 537 + 547 + 750 + 757 + + + 521 + 542 + 754 + 537 + 547 + 750 + 757 + + + 521 + 542 + 755 + 537 + 547 + 750 + 757 + + + 521 + 537 + 760 + 529 + 540 + 756 + 765 + + + 521 + 536 + 760 + 529 + 540 + 756 + 765 + + + 521 + 534 + 761 + 529 + 540 + 756 + 765 + + + 521 + 535 + 758 + 529 + 540 + 756 + 765 + + + 521 + 537 + 759 + 529 + 540 + 756 + 765 + + + 99 + 168 + 258 + 146 + 179 + 248 + 265 + + + 99 + 166 + 259 + 146 + 179 + 248 + 265 + + + 99 + 166 + 257 + 146 + 179 + 248 + 265 + + + 99 + 163 + 256 + 146 + 179 + 248 + 265 + + + 99 + 163 + 260 + 146 + 179 + 248 + 265 + + + 99 + 172 + 258 + 146 + 179 + 248 + 265 + + + 99 + 174 + 255 + 146 + 179 + 248 + 265 + + + 99 + 166 + 252 + 146 + 179 + 248 + 265 + + + 99 + 158 + 257 + 146 + 179 + 248 + 265 + + + 99 + 155 + 260 + 146 + 179 + 248 + 265 + + + 158 + 331 + 152 + 323 + 335 + 149 + 162 + + + 158 + 329 + 153 + 323 + 335 + 149 + 162 + + + 158 + 332 + 153 + 323 + 335 + 149 + 162 + + + 158 + 333 + 155 + 323 + 335 + 149 + 162 + + + 158 + 331 + 157 + 323 + 335 + 149 + 162 + + + 158 + 328 + 157 + 323 + 335 + 149 + 162 + + + 135 + 331 + 144 + 323 + 335 + 142 + 149 + + + 135 + 328 + 146 + 323 + 335 + 142 + 149 + + + 135 + 331 + 147 + 323 + 335 + 142 + 149 + + + 158 + 328 + 132 + 326 + 334 + 123 + 141 + + + 158 + 330 + 133 + 326 + 334 + 123 + 141 + + + 158 + 333 + 133 + 326 + 334 + 123 + 141 + + + 158 + 333 + 135 + 326 + 334 + 123 + 141 + + + 158 + 331 + 137 + 326 + 334 + 123 + 141 + + + 158 + 328 + 137 + 326 + 334 + 123 + 141 + + + 135 + 328 + 135 + 326 + 334 + 123 + 141 + + + 135 + 328 + 132 + 326 + 334 + 123 + 141 + + + 263 + 330 + 129 + 326 + 334 + 123 + 141 + + + 263 + 331 + 132 + 326 + 334 + 123 + 141 + + + 263 + 320 + 130 + 317 + 325 + 122 + 141 + + + 263 + 322 + 136 + 317 + 325 + 122 + 141 + + + 263 + 323 + 135 + 317 + 325 + 122 + 141 + + + 263 + 323 + 134 + 317 + 325 + 122 + 141 + + + 263 + 322 + 132 + 317 + 325 + 122 + 141 + + + 263 + 320 + 130 + 317 + 325 + 122 + 141 + + + 81 + 222 + 3515 + 213 + 225 + 3514 + 3526 + + + 3 + 216 + 3520 + 213 + 218 + 3519 + 3524 + + + 81 + 213 + 687 + 208 + 224 + 683 + 700 + + + 81 + 218 + 687 + 208 + 224 + 683 + 700 + + + 81 + 212 + 692 + 211 + 213 + 691 + 693 + + + 81 + 217 + 1636 + 216 + 219 + 1633 + 1637 + + + 81 + 212 + 1636 + 211 + 218 + 1635 + 1638 + + + 17 + 214 + 1640 + 211 + 219 + 1633 + 1642 + + + 81 + 214 + 2580 + 211 + 215 + 2580 + 2582 + + + 60 + 212 + 2581 + 211 + 215 + 2580 + 2582 + + + 81 + 216 + 2583 + 211 + 218 + 2578 + 2585 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 722 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 724 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 725 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 727 + 20 + 526 + 3 + 30 + 505 + 542 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 726 + 6 + 541 + 3 + 14 + 539 + 546 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 723 + 20 + 568 + 17 + 23 + 563 + 573 + + + 728 + 26 + 571 + 24 + 30 + 570 + 573 + + + 728 + 26 + 571 + 24 + 30 + 570 + 573 + + + 728 + 26 + 571 + 24 + 30 + 570 + 573 + + + 40 + 9 + 3393 + 5 + 17 + 3386 + 3399 + + + 40 + 12 + 3392 + 5 + 17 + 3386 + 3399 + + + 40 + 13 + 3395 + 5 + 17 + 3386 + 3399 + + + 40 + 11 + 3396 + 5 + 17 + 3386 + 3399 + + + 40 + 9 + 3398 + 5 + 17 + 3386 + 3399 + + + 40 + 6 + 3395 + 5 + 17 + 3386 + 3399 + + + 40 + 8 + 3391 + 5 + 17 + 3386 + 3399 + + + 40 + 10 + 3390 + 5 + 17 + 3386 + 3399 + + + 40 + 16 + 3395 + 5 + 17 + 3386 + 3399 + + + 40 + 15 + 3398 + 5 + 17 + 3386 + 3399 + + + 40 + 12 + 3398 + 5 + 17 + 3386 + 3399 + + + 626 + 713 + 582 + 713 + 713 + 582 + 582 + + + 627 + 702 + 3420 + 702 + 702 + 3420 + 3420 + + + 628 + 723 + 3461 + 723 + 723 + 3461 + 3461 + + + 629 + 763 + 3441 + 763 + 763 + 3441 + 3441 + + + 631 + 715 + 3413 + 712 + 718 + 3410 + 3415 + + + 631 + 716 + 3411 + 712 + 718 + 3410 + 3415 + + + 631 + 716 + 3413 + 712 + 718 + 3410 + 3415 + + + 631 + 713 + 3412 + 712 + 718 + 3410 + 3415 + + + 631 + 715 + 3411 + 712 + 718 + 3410 + 3415 + + + 631 + 716 + 3415 + 712 + 718 + 3410 + 3415 + + + 631 + 714 + 3441 + 712 + 717 + 3438 + 3442 + + + 631 + 714 + 3439 + 712 + 717 + 3438 + 3442 + + + 631 + 716 + 3440 + 712 + 717 + 3438 + 3442 + + + 631 + 716 + 3441 + 712 + 717 + 3438 + 3442 + + + 631 + 715 + 3442 + 712 + 717 + 3438 + 3442 + + + 631 + 713 + 3438 + 712 + 717 + 3438 + 3442 + + + 631 + 715 + 3440 + 712 + 717 + 3438 + 3442 + + + 631 + 723 + 585 + 723 + 733 + 579 + 595 + + + 631 + 731 + 589 + 723 + 733 + 579 + 595 + + + 631 + 728 + 589 + 723 + 733 + 579 + 595 + + + 631 + 727 + 589 + 723 + 733 + 579 + 595 + + + 631 + 727 + 591 + 723 + 733 + 579 + 595 + + + 631 + 724 + 592 + 723 + 733 + 579 + 595 + + + 631 + 726 + 594 + 723 + 733 + 579 + 595 + + + 631 + 732 + 581 + 723 + 733 + 579 + 595 + + + 631 + 733 + 584 + 723 + 733 + 579 + 595 + + + 34 + 727 + 591 + 723 + 733 + 579 + 595 + + + 34 + 724 + 592 + 723 + 733 + 579 + 595 + + + 34 + 726 + 594 + 723 + 733 + 579 + 595 + + + 34 + 732 + 581 + 723 + 733 + 579 + 595 + + + 34 + 733 + 584 + 723 + 733 + 579 + 595 + + + 641 + 727 + 587 + 723 + 733 + 579 + 595 + + + 4 + 711 + 3431 + 703 + 715 + 3419 + 3438 + + + 4 + 715 + 3430 + 703 + 715 + 3419 + 3438 + + + 4 + 708 + 3430 + 703 + 715 + 3419 + 3438 + + + 4 + 708 + 3434 + 703 + 715 + 3419 + 3438 + + + 4 + 750 + 3461 + 742 + 754 + 3460 + 3464 + + + 4 + 745 + 3462 + 742 + 754 + 3460 + 3464 + + + 4 + 745 + 3463 + 742 + 754 + 3460 + 3464 + + + 4 + 744 + 3464 + 742 + 754 + 3460 + 3464 + + + 4 + 743 + 3461 + 742 + 754 + 3460 + 3464 + + + 43 + 708 + 3434 + 703 + 715 + 3419 + 3438 + + + 43 + 689 + 3437 + 684 + 693 + 3436 + 3440 + + + 43 + 691 + 3440 + 684 + 693 + 3436 + 3440 + + + 43 + 677 + 3448 + 676 + 679 + 3436 + 3450 + + + 43 + 676 + 3447 + 676 + 679 + 3436 + 3450 + + + 43 + 693 + 3448 + 690 + 693 + 3444 + 3451 + + + 43 + 763 + 3476 + 756 + 765 + 3472 + 3479 + + + 43 + 759 + 3477 + 756 + 765 + 3472 + 3479 + + + 43 + 760 + 3474 + 756 + 765 + 3472 + 3479 + + + 43 + 763 + 3474 + 756 + 765 + 3472 + 3479 + + + 43 + 765 + 3474 + 756 + 765 + 3472 + 3479 + + + 43 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 43 + 725 + 3477 + 722 + 730 + 3474 + 3485 + + + 43 + 726 + 3476 + 722 + 730 + 3474 + 3485 + + + 43 + 726 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 724 + 3482 + 722 + 730 + 3474 + 3485 + + + 43 + 724 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 722 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 727 + 3479 + 722 + 730 + 3474 + 3485 + + + 43 + 727 + 3481 + 722 + 730 + 3474 + 3485 + + + 43 + 741 + 586 + 737 + 744 + 577 + 587 + + + 43 + 738 + 584 + 737 + 744 + 577 + 587 + + + 43 + 741 + 579 + 737 + 744 + 577 + 587 + + + 43 + 737 + 578 + 737 + 744 + 577 + 587 + + + 43 + 758 + 623 + 754 + 765 + 607 + 625 + + + 43 + 762 + 620 + 754 + 765 + 607 + 625 + + + 43 + 758 + 618 + 754 + 765 + 607 + 625 + + + 43 + 762 + 614 + 754 + 765 + 607 + 625 + + + 41 + 707 + 3448 + 700 + 710 + 3442 + 3452 + + + 41 + 705 + 3446 + 700 + 710 + 3442 + 3452 + + + 41 + 704 + 3448 + 700 + 710 + 3442 + 3452 + + + 41 + 703 + 3447 + 700 + 710 + 3442 + 3452 + + + 41 + 706 + 3444 + 700 + 710 + 3442 + 3452 + + + 41 + 741 + 3427 + 738 + 751 + 3425 + 3434 + + + 41 + 742 + 3429 + 738 + 751 + 3425 + 3434 + + + 41 + 750 + 3428 + 738 + 751 + 3425 + 3434 + + + 542 + 750 + 3426 + 738 + 751 + 3425 + 3434 + + + 19 + 741 + 3440 + 733 + 743 + 3440 + 3442 + + + 19 + 736 + 3440 + 733 + 743 + 3440 + 3442 + + + 19 + 738 + 3440 + 733 + 743 + 3440 + 3442 + + + 23 + 734 + 3442 + 733 + 743 + 3440 + 3442 + + + 312 + 749 + 3441 + 745 + 752 + 3438 + 3443 + + + 312 + 751 + 3440 + 745 + 752 + 3438 + 3443 + + + 312 + 746 + 3440 + 745 + 752 + 3438 + 3443 + + + 630 + 735 + 3464 + 730 + 746 + 3460 + 3464 + + + 630 + 731 + 3462 + 730 + 746 + 3460 + 3464 + + + 630 + 730 + 3462 + 730 + 746 + 3460 + 3464 + + + 630 + 736 + 3464 + 730 + 746 + 3460 + 3464 + + + 630 + 745 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 746 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 747 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 745 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 746 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 747 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 745 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 746 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 747 + 3489 + 740 + 754 + 3484 + 3490 + + + 630 + 748 + 3489 + 740 + 754 + 3484 + 3490 + + + 634 + 745 + 3459 + 743 + 746 + 3457 + 3459 + + + 635 + 744 + 3459 + 743 + 746 + 3457 + 3459 + + + 638 + 745 + 3466 + 743 + 746 + 3465 + 3467 + + + 639 + 743 + 3466 + 743 + 746 + 3465 + 3467 + + + 636 + 749 + 3459 + 748 + 751 + 3457 + 3459 + + + 637 + 750 + 3459 + 748 + 751 + 3457 + 3459 + + + 640 + 750 + 3465 + 748 + 751 + 3465 + 3467 + + + 634 + 749 + 3465 + 748 + 751 + 3465 + 3467 + + + 45 + 762 + 3497 + 752 + 765 + 3494 + 3501 + + + 46 + 760 + 3497 + 752 + 765 + 3494 + 3501 + + + 46 + 758 + 3496 + 752 + 765 + 3494 + 3501 + + + 46 + 764 + 3498 + 752 + 765 + 3494 + 3501 + + + 46 + 763 + 3496 + 752 + 765 + 3494 + 3501 + + + 542 + 742 + 3429 + 738 + 751 + 3425 + 3434 + + + 542 + 744 + 3430 + 738 + 751 + 3425 + 3434 + + + 542 + 744 + 3429 + 738 + 751 + 3425 + 3434 + + + 542 + 748 + 3431 + 738 + 751 + 3425 + 3434 + + + 542 + 749 + 3430 + 738 + 751 + 3425 + 3434 + + + 542 + 748 + 3429 + 738 + 751 + 3425 + 3434 + + + 542 + 745 + 3428 + 738 + 751 + 3425 + 3434 + + + 542 + 744 + 3427 + 738 + 751 + 3425 + 3434 + + + 52 + 751 + 3429 + 738 + 751 + 3425 + 3434 + + + 52 + 739 + 3429 + 738 + 751 + 3425 + 3434 + + + 632 + 725 + 3416 + 722 + 732 + 3410 + 3421 + + + 633 + 725 + 3414 + 722 + 732 + 3410 + 3421 + + + 633 + 725 + 3414 + 722 + 732 + 3410 + 3421 + + + 658 + 740 + 624 + 737 + 741 + 622 + 625 + + + 642 + 759 + 661 + 755 + 764 + 657 + 667 + + + 648 + 761 + 661 + 755 + 764 + 657 + 667 + + + 657 + 763 + 661 + 755 + 764 + 657 + 667 + + + 655 + 751 + 633 + 724 + 760 + 600 + 640 + + + 655 + 753 + 628 + 724 + 760 + 600 + 640 + + + 655 + 750 + 626 + 724 + 760 + 600 + 640 + + + 655 + 748 + 627 + 724 + 760 + 600 + 640 + + + 655 + 748 + 629 + 724 + 760 + 600 + 640 + + + 655 + 746 + 632 + 724 + 760 + 600 + 640 + + + 655 + 749 + 634 + 724 + 760 + 600 + 640 + + + 655 + 751 + 635 + 724 + 760 + 600 + 640 + + + 655 + 754 + 635 + 724 + 760 + 600 + 640 + + + 655 + 741 + 629 + 724 + 760 + 600 + 640 + + + 655 + 739 + 630 + 724 + 760 + 600 + 640 + + + 655 + 740 + 632 + 724 + 760 + 600 + 640 + + + 655 + 736 + 631 + 724 + 760 + 600 + 640 + + + 655 + 734 + 628 + 724 + 760 + 600 + 640 + + + 655 + 734 + 627 + 724 + 760 + 600 + 640 + + + 655 + 736 + 624 + 724 + 760 + 600 + 640 + + + 655 + 737 + 621 + 724 + 760 + 600 + 640 + + + 655 + 735 + 618 + 724 + 760 + 600 + 640 + + + 655 + 740 + 616 + 724 + 760 + 600 + 640 + + + 655 + 742 + 615 + 724 + 760 + 600 + 640 + + + 655 + 743 + 613 + 724 + 760 + 600 + 640 + + + 655 + 746 + 611 + 724 + 760 + 600 + 640 + + + 655 + 742 + 606 + 724 + 760 + 600 + 640 + + + 655 + 739 + 605 + 724 + 760 + 600 + 640 + + + 655 + 738 + 607 + 724 + 760 + 600 + 640 + + + 655 + 737 + 609 + 724 + 760 + 600 + 640 + + + 655 + 736 + 611 + 724 + 760 + 600 + 640 + + + 655 + 735 + 613 + 724 + 760 + 600 + 640 + + + 655 + 736 + 615 + 724 + 760 + 600 + 640 + + + 655 + 738 + 622 + 724 + 760 + 600 + 640 + + + 95 + 69 + 1643 + 68 + 71 + 1642 + 1643 + + + 22 + 282 + 187 + 278 + 284 + 181 + 189 + + + 22 + 283 + 185 + 278 + 284 + 181 + 189 + + + 22 + 282 + 184 + 278 + 284 + 181 + 189 + + + 22 + 281 + 185 + 278 + 284 + 181 + 189 + + + 140 + 331 + 435 + 328 + 333 + 433 + 438 + + + 140 + 332 + 436 + 328 + 333 + 433 + 438 + + + 140 + 332 + 437 + 328 + 333 + 433 + 438 + + + 140 + 330 + 434 + 328 + 333 + 433 + 438 + + + 140 + 330 + 435 + 328 + 333 + 433 + 438 + + + 140 + 333 + 437 + 328 + 333 + 433 + 438 + + + 140 + 332 + 438 + 328 + 333 + 433 + 438 + + + 67 + 224 + 253 + 213 + 237 + 238 + 267 + + + 67 + 225 + 252 + 213 + 237 + 238 + 267 + + + 67 + 226 + 252 + 213 + 237 + 238 + 267 + + + 67 + 228 + 251 + 213 + 237 + 238 + 267 + + + 67 + 229 + 253 + 213 + 237 + 238 + 267 + + + 67 + 228 + 255 + 213 + 237 + 238 + 267 + + + 67 + 226 + 257 + 213 + 237 + 238 + 267 + + + 67 + 223 + 256 + 213 + 237 + 238 + 267 + + + 67 + 223 + 254 + 213 + 237 + 238 + 267 + + + 67 + 220 + 254 + 213 + 237 + 238 + 267 + + + 67 + 225 + 250 + 213 + 237 + 238 + 267 + + + 67 + 224 + 248 + 213 + 237 + 238 + 267 + + + 67 + 226 + 248 + 213 + 237 + 238 + 267 + + + 67 + 228 + 248 + 213 + 237 + 238 + 267 + + + 67 + 231 + 251 + 213 + 237 + 238 + 267 + + + 67 + 232 + 253 + 213 + 237 + 238 + 267 + + + 67 + 229 + 256 + 213 + 237 + 238 + 267 + + + 232 + 270 + 329 + 266 + 280 + 319 + 332 + + + 232 + 270 + 302 + 255 + 281 + 289 + 322 + + + 232 + 272 + 301 + 255 + 281 + 289 + 322 + + + 232 + 274 + 301 + 255 + 281 + 289 + 322 + + + 232 + 276 + 302 + 255 + 281 + 289 + 322 + + + 232 + 279 + 304 + 255 + 281 + 289 + 322 + + + 232 + 272 + 308 + 255 + 281 + 289 + 322 + + + 232 + 271 + 318 + 255 + 281 + 289 + 322 + + + 232 + 269 + 319 + 255 + 281 + 289 + 322 + + + 237 + 272 + 301 + 255 + 281 + 289 + 322 + + + 238 + 272 + 301 + 255 + 281 + 289 + 322 + + + 236 + 272 + 301 + 255 + 281 + 289 + 322 + + + 235 + 269 + 290 + 267 + 273 + 289 + 292 + + + 233 + 278 + 295 + 278 + 281 + 293 + 298 + + +Rats(8) + + + 19 + 258 + 302 + 255 + 260 + 300 + 307 + + + 19 + 257 + 303 + 255 + 260 + 300 + 307 + + + 457 + 493 + 615 + 493 + 495 + 615 + 618 + + + 456 + 516 + 612 + 514 + 517 + 611 + 614 + + + 457 + 483 + 614 + 483 + 484 + 614 + 620 + + + 461 + 484 + 1560 + 483 + 486 + 1558 + 1564 + + + 462 + 493 + 1560 + 493 + 493 + 1560 + 1560 + + + 463 + 494 + 1558 + 494 + 494 + 1558 + 1558 + + + 464 + 495 + 1564 + 495 + 495 + 1564 + 1564 + + + 463 + 490 + 1564 + 490 + 490 + 1564 + 1564 + + + 462 + 488 + 1561 + 488 + 488 + 1561 + 1561 + + + 464 + 490 + 1558 + 490 + 490 + 1558 + 1558 + + + 464 + 490 + 1560 + 490 + 490 + 1560 + 1560 + + + 462 + 490 + 1562 + 490 + 490 + 1562 + 1562 + + + 463 + 492 + 1564 + 492 + 492 + 1564 + 1564 + + + 463 + 493 + 1562 + 493 + 493 + 1562 + 1562 + + + 464 + 495 + 1560 + 495 + 495 + 1560 + 1560 + + + 464 + 496 + 615 + 496 + 496 + 615 + 615 + + + 462 + 494 + 614 + 494 + 494 + 614 + 614 + + + 463 + 492 + 614 + 492 + 492 + 614 + 614 + + + 464 + 490 + 614 + 490 + 490 + 614 + 614 + + + 462 + 490 + 615 + 490 + 490 + 615 + 615 + + + 463 + 492 + 615 + 492 + 492 + 615 + 615 + + + 462 + 495 + 617 + 495 + 495 + 617 + 617 + + + 463 + 495 + 619 + 495 + 495 + 619 + 619 + + + 464 + 494 + 620 + 494 + 494 + 620 + 620 + + + 462 + 492 + 620 + 492 + 492 + 620 + 620 + + + 463 + 490 + 620 + 490 + 490 + 620 + 620 + + + 464 + 488 + 620 + 488 + 488 + 620 + 620 + + + 40 + 20 + 3380 + 16 + 23 + 3378 + 3386 + + + 40 + 21 + 3379 + 16 + 23 + 3378 + 3386 + + + 40 + 23 + 3380 + 16 + 23 + 3378 + 3386 + + + 40 + 22 + 3382 + 16 + 23 + 3378 + 3386 + + + 40 + 20 + 3383 + 16 + 23 + 3378 + 3386 + + + 40 + 20 + 3384 + 16 + 23 + 3378 + 3386 + + + 40 + 21 + 3384 + 16 + 23 + 3378 + 3386 + + + 40 + 18 + 3382 + 16 + 23 + 3378 + 3386 + + + 40 + 19 + 3379 + 16 + 23 + 3378 + 3386 + + + 40 + 21 + 3378 + 16 + 23 + 3378 + 3386 + + + 40 + 9 + 3374 + 5 + 11 + 3373 + 3381 + + + 40 + 8 + 3375 + 5 + 11 + 3373 + 3381 + + + 40 + 6 + 3376 + 5 + 11 + 3373 + 3381 + + + 40 + 7 + 3377 + 5 + 11 + 3373 + 3381 + + + 40 + 9 + 3377 + 5 + 11 + 3373 + 3381 + + + 40 + 8 + 3378 + 5 + 11 + 3373 + 3381 + + + 40 + 11 + 3378 + 5 + 11 + 3373 + 3381 + + + 40 + 9 + 3380 + 5 + 11 + 3373 + 3381 + + + 40 + 7 + 3380 + 5 + 11 + 3373 + 3381 + + + 40 + 6 + 3378 + 5 + 11 + 3373 + 3381 + + + 40 + 5 + 3376 + 5 + 11 + 3373 + 3381 + + + 67 + 657 + 3539 + 647 + 659 + 3533 + 3542 + + + 67 + 654 + 3539 + 647 + 659 + 3533 + 3542 + + + 67 + 653 + 3540 + 647 + 659 + 3533 + 3542 + + + 67 + 650 + 3540 + 647 + 659 + 3533 + 3542 + + + 67 + 647 + 3539 + 647 + 659 + 3533 + 3542 + + + 67 + 647 + 3538 + 647 + 659 + 3533 + 3542 + + + 41 + 650 + 3539 + 647 + 659 + 3533 + 3542 + + + 41 + 650 + 3540 + 647 + 659 + 3533 + 3542 + + + 41 + 654 + 3542 + 647 + 659 + 3533 + 3542 + + + 67 + 662 + 3533 + 661 + 666 + 3530 + 3536 + + + 67 + 664 + 3535 + 661 + 666 + 3530 + 3536 + + + 67 + 665 + 3536 + 661 + 666 + 3530 + 3536 + + + 67 + 663 + 3531 + 661 + 666 + 3530 + 3536 + + + 41 + 661 + 3533 + 661 + 666 + 3530 + 3536 + + + 41 + 662 + 3535 + 661 + 666 + 3530 + 3536 + + + 41 + 664 + 3535 + 661 + 666 + 3530 + 3536 + + + 264 + 620 + 3497 + 618 + 622 + 3494 + 3500 + + + 264 + 620 + 3497 + 618 + 622 + 3494 + 3500 + + + 264 + 620 + 3496 + 618 + 622 + 3494 + 3500 + + + 264 + 621 + 3496 + 618 + 622 + 3494 + 3500 + + + 264 + 622 + 3498 + 618 + 622 + 3494 + 3500 + + + 264 + 619 + 3499 + 618 + 622 + 3494 + 3500 + + + 264 + 620 + 3498 + 618 + 622 + 3494 + 3500 + + + 264 + 621 + 3498 + 618 + 622 + 3494 + 3500 + + + 264 + 618 + 3496 + 618 + 622 + 3494 + 3500 + + + 195 + 532 + 3325 + 529 + 535 + 3323 + 3328 + + + 195 + 533 + 3325 + 529 + 535 + 3323 + 3328 + + + 195 + 532 + 3326 + 529 + 535 + 3323 + 3328 + + + 195 + 531 + 3325 + 529 + 535 + 3323 + 3328 + + + 195 + 532 + 3324 + 529 + 535 + 3323 + 3328 + + + 195 + 533 + 3323 + 529 + 535 + 3323 + 3328 + + + 195 + 531 + 3323 + 529 + 535 + 3323 + 3328 + + + 195 + 530 + 3326 + 529 + 535 + 3323 + 3328 + + + 195 + 531 + 3328 + 529 + 535 + 3323 + 3328 + + + 195 + 533 + 3328 + 529 + 535 + 3323 + 3328 + + + 195 + 554 + 3286 + 551 + 557 + 3281 + 3288 + + + 195 + 555 + 3286 + 551 + 557 + 3281 + 3288 + + + 195 + 556 + 3286 + 551 + 557 + 3281 + 3288 + + + 195 + 553 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 554 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 555 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 556 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 553 + 3287 + 551 + 557 + 3281 + 3288 + + + 195 + 554 + 3288 + 551 + 557 + 3281 + 3288 + + + 195 + 555 + 3288 + 551 + 557 + 3281 + 3288 + + + 67 + 536 + 3289 + 533 + 539 + 3286 + 3291 + + + 67 + 537 + 3289 + 533 + 539 + 3286 + 3291 + + + 67 + 535 + 3289 + 533 + 539 + 3286 + 3291 + + + 67 + 535 + 3288 + 533 + 539 + 3286 + 3291 + + + 67 + 535 + 3290 + 533 + 539 + 3286 + 3291 + + + 67 + 537 + 3290 + 533 + 539 + 3286 + 3291 + + + 67 + 537 + 3288 + 533 + 539 + 3286 + 3291 + + + 67 + 534 + 3287 + 533 + 539 + 3286 + 3291 + + + 67 + 538 + 3291 + 533 + 539 + 3286 + 3291 + + + 67 + 539 + 3289 + 533 + 539 + 3286 + 3291 + + + 22 + 533 + 3300 + 531 + 535 + 3297 + 3302 + + + 22 + 534 + 3299 + 531 + 535 + 3297 + 3302 + + + 22 + 532 + 3300 + 531 + 535 + 3297 + 3302 + + + 70 + 546 + 3333 + 544 + 547 + 3330 + 3337 + + + 70 + 545 + 3332 + 544 + 547 + 3330 + 3337 + + + 70 + 546 + 3333 + 544 + 547 + 3330 + 3337 + + + 70 + 544 + 3331 + 544 + 547 + 3330 + 3337 + + + 45 + 125 + 262 + 105 + 140 + 255 + 273 + + + 45 + 126 + 266 + 105 + 140 + 255 + 273 + + + 45 + 118 + 265 + 105 + 140 + 255 + 273 + + + 45 + 123 + 280 + 105 + 123 + 273 + 286 + + + 45 + 120 + 278 + 105 + 123 + 273 + 286 + + + 45 + 123 + 275 + 105 + 123 + 273 + 286 + + + 45 + 120 + 280 + 105 + 121 + 273 + 286 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 363 + 543 + 3278 + 540 + 549 + 3273 + 3282 + + + 277 + 464 + 519 + 458 + 466 + 514 + 524 + + + 277 + 462 + 519 + 458 + 466 + 514 + 524 + + + 277 + 463 + 519 + 458 + 466 + 514 + 524 + + + 277 + 462 + 520 + 458 + 466 + 514 + 524 + + + 277 + 461 + 520 + 458 + 466 + 514 + 524 + + + 277 + 463 + 520 + 458 + 466 + 514 + 524 + + + 277 + 463 + 521 + 458 + 466 + 514 + 524 + + + 277 + 464 + 515 + 458 + 466 + 514 + 524 + + + 277 + 464 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 464 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 463 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 465 + 1465 + 461 + 466 + 1462 + 1467 + + + 277 + 463 + 1464 + 461 + 466 + 1462 + 1467 + + + 277 + 465 + 1464 + 461 + 466 + 1462 + 1467 + + + 276 + 460 + 2407 + 460 + 463 + 2406 + 2407 + + + 248 + 413 + 437 + 410 + 417 + 435 + 439 + + + 248 + 413 + 437 + 410 + 417 + 435 + 439 + + + 248 + 411 + 438 + 410 + 417 + 435 + 439 + + + 248 + 412 + 439 + 410 + 417 + 435 + 439 + + + 248 + 410 + 436 + 410 + 417 + 435 + 439 + + + 248 + 416 + 437 + 410 + 417 + 435 + 439 + + + 248 + 416 + 436 + 410 + 417 + 435 + 439 + + + 521 + 468 + 735 + 466 + 473 + 733 + 737 + + + 521 + 467 + 734 + 466 + 473 + 733 + 737 + + + 521 + 467 + 736 + 466 + 473 + 733 + 737 + + + 521 + 469 + 734 + 466 + 473 + 733 + 737 + + + 521 + 469 + 736 + 466 + 473 + 733 + 737 + + + 521 + 470 + 734 + 466 + 473 + 733 + 737 + + + 521 + 471 + 735 + 466 + 473 + 733 + 737 + + + 521 + 469 + 735 + 466 + 473 + 733 + 737 + + + 521 + 466 + 734 + 466 + 473 + 733 + 737 + + + 202 + 375 + 3272 + 371 + 376 + 3270 + 3276 + + + 295 + 330 + 3370 + 327 + 332 + 3367 + 3374 + + + 295 + 331 + 3370 + 327 + 332 + 3367 + 3374 + + + 295 + 331 + 3371 + 327 + 332 + 3367 + 3374 + + + 295 + 330 + 3371 + 327 + 332 + 3367 + 3374 + + + 295 + 327 + 3365 + 325 + 329 + 3361 + 3369 + + + 295 + 327 + 3364 + 325 + 329 + 3361 + 3369 + + + 295 + 326 + 3364 + 325 + 329 + 3361 + 3369 + + + 34 + 318 + 1607 + 314 + 319 + 1603 + 1608 + + + 34 + 319 + 1608 + 314 + 319 + 1603 + 1608 + + + 34 + 316 + 1607 + 314 + 319 + 1603 + 1608 + + + 34 + 314 + 1608 + 314 + 319 + 1603 + 1608 + + + 34 + 314 + 1606 + 314 + 319 + 1603 + 1608 + + + 34 + 314 + 1603 + 314 + 319 + 1603 + 1608 + + + 34 + 476 + 2340 + 473 + 478 + 2335 + 2340 + + + 34 + 474 + 2338 + 473 + 478 + 2335 + 2340 + + + 34 + 473 + 2335 + 473 + 478 + 2335 + 2340 + + + 34 + 476 + 2336 + 473 + 478 + 2335 + 2340 + + + 34 + 478 + 2338 + 473 + 478 + 2335 + 2340 + + + 290 + 389 + 3372 + 382 + 391 + 3360 + 3374 + + + 290 + 385 + 3370 + 382 + 391 + 3360 + 3374 + + + 290 + 390 + 3367 + 382 + 391 + 3360 + 3374 + + + 290 + 386 + 3364 + 382 + 391 + 3360 + 3374 + + + 290 + 389 + 3364 + 382 + 391 + 3360 + 3374 + + + 202 + 370 + 3354 + 366 + 374 + 3350 + 3363 + + + 202 + 371 + 3358 + 366 + 374 + 3350 + 3363 + + + 203 + 364 + 3349 + 357 + 368 + 3347 + 3358 + + + 203 + 360 + 3350 + 357 + 368 + 3347 + 3358 + + + 203 + 360 + 3353 + 357 + 368 + 3347 + 3358 + + + 203 + 361 + 3355 + 357 + 368 + 3347 + 3358 + + + 203 + 365 + 3354 + 357 + 368 + 3347 + 3358 + + + 22 + 212 + 2584 + 212 + 212 + 2584 + 2584 + + + 797 + 115 + 187 + 109 + 125 + 184 + 196 + + + 797 + 117 + 186 + 109 + 125 + 184 + 196 + + + 797 + 121 + 187 + 109 + 125 + 184 + 196 + + + 797 + 122 + 190 + 109 + 125 + 184 + 196 + + + 797 + 119 + 192 + 109 + 125 + 184 + 196 + + + 797 + 115 + 192 + 109 + 125 + 184 + 196 + + + 797 + 112 + 191 + 109 + 125 + 184 + 196 + + + 797 + 113 + 188 + 109 + 125 + 184 + 196 + + + 797 + 133 + 215 + 132 + 162 + 190 + 215 + + + 797 + 141 + 208 + 132 + 162 + 190 + 215 + + + 797 + 134 + 201 + 132 + 162 + 190 + 215 + + + 797 + 154 + 212 + 132 + 162 + 190 + 215 + + + 797 + 152 + 204 + 132 + 162 + 190 + 215 + + + 797 + 154 + 197 + 132 + 162 + 190 + 215 + + + 201 + 145 + 195 + 132 + 162 + 190 + 215 + + + 201 + 149 + 210 + 132 + 162 + 190 + 215 + + + 201 + 137 + 207 + 132 + 162 + 190 + 215 + + + 40 + 630 + 3301 + 629 + 634 + 3293 + 3307 + + + 40 + 630 + 3299 + 629 + 634 + 3293 + 3307 + + + 40 + 634 + 3299 + 629 + 634 + 3293 + 3307 + + + 40 + 633 + 3302 + 629 + 634 + 3293 + 3307 + + + 41 + 631 + 3303 + 629 + 634 + 3293 + 3307 + + + 41 + 631 + 3305 + 629 + 634 + 3293 + 3307 + + + 41 + 630 + 3306 + 629 + 634 + 3293 + 3307 + + + 104 + 631 + 3307 + 629 + 634 + 3293 + 3307 + + + 40 + 630 + 3297 + 629 + 634 + 3293 + 3307 + + + 41 + 631 + 3307 + 629 + 634 + 3293 + 3307 + + + 41 + 633 + 3297 + 629 + 634 + 3293 + 3307 + + + 40 + 632 + 3298 + 629 + 634 + 3293 + 3307 + + + 41 + 630 + 3298 + 629 + 634 + 3293 + 3307 + + + 41 + 638 + 3306 + 634 + 648 + 3301 + 3308 + + + 40 + 637 + 3304 + 634 + 648 + 3301 + 3308 + + + 41 + 639 + 3305 + 634 + 648 + 3301 + 3308 + + + 40 + 639 + 3302 + 634 + 648 + 3301 + 3308 + + + 41 + 641 + 3302 + 634 + 648 + 3301 + 3308 + + + 40 + 641 + 3305 + 634 + 648 + 3301 + 3308 + + + 40 + 641 + 3307 + 634 + 648 + 3301 + 3308 + + + 43 + 669 + 3294 + 663 + 670 + 3290 + 3296 + + + 43 + 667 + 3293 + 663 + 670 + 3290 + 3296 + + + 43 + 666 + 3294 + 663 + 670 + 3290 + 3296 + + + 43 + 664 + 3293 + 663 + 670 + 3290 + 3296 + + + 43 + 663 + 3292 + 663 + 670 + 3290 + 3296 + + + 43 + 665 + 3291 + 663 + 670 + 3290 + 3296 + + + 43 + 667 + 3291 + 663 + 670 + 3290 + 3296 + + + 46 + 670 + 3290 + 663 + 670 + 3290 + 3296 + + + 43 + 667 + 3291 + 663 + 670 + 3290 + 3296 + + + 19 + 668 + 3295 + 663 + 670 + 3290 + 3296 + + + 555 + 601 + 3565 + 593 + 605 + 3563 + 3581 + + + 555 + 601 + 3567 + 593 + 605 + 3563 + 3581 + + + 555 + 602 + 3566 + 593 + 605 + 3563 + 3581 + + + 555 + 602 + 3568 + 593 + 605 + 3563 + 3581 + + + 555 + 600 + 3571 + 593 + 605 + 3563 + 3581 + + + 555 + 602 + 3572 + 593 + 605 + 3563 + 3581 + + + 555 + 600 + 3573 + 593 + 605 + 3563 + 3581 + + + 555 + 601 + 3573 + 593 + 605 + 3563 + 3581 + + + 555 + 603 + 3574 + 593 + 605 + 3563 + 3581 + + + 555 + 596 + 3574 + 593 + 605 + 3563 + 3581 + + + 555 + 598 + 3576 + 593 + 605 + 3563 + 3581 + + + 555 + 599 + 3577 + 593 + 605 + 3563 + 3581 + + + 555 + 597 + 3578 + 593 + 605 + 3563 + 3581 + + + 555 + 593 + 3576 + 593 + 605 + 3563 + 3581 + + + 195 + 608 + 3569 + 607 + 617 + 3564 + 3570 + + + 195 + 608 + 3567 + 607 + 617 + 3564 + 3570 + + + 195 + 610 + 3566 + 607 + 617 + 3564 + 3570 + + + 195 + 611 + 3569 + 607 + 617 + 3564 + 3570 + + + 195 + 611 + 3566 + 607 + 617 + 3564 + 3570 + + + 195 + 612 + 3567 + 607 + 617 + 3564 + 3570 + + + 195 + 614 + 3566 + 607 + 617 + 3564 + 3570 + + + 195 + 614 + 3568 + 607 + 617 + 3564 + 3570 + + + 195 + 615 + 3567 + 607 + 617 + 3564 + 3570 + + + 195 + 615 + 3565 + 607 + 617 + 3564 + 3570 + + + 195 + 616 + 3567 + 607 + 617 + 3564 + 3570 + + + 344 + 657 + 3287 + 656 + 663 + 3282 + 3288 + + + 344 + 660 + 3287 + 656 + 663 + 3282 + 3288 + + + 344 + 662 + 3285 + 656 + 663 + 3282 + 3288 + + + 344 + 662 + 3283 + 656 + 663 + 3282 + 3288 + + + 344 + 657 + 3283 + 656 + 663 + 3282 + 3288 + + + 195 + 667 + 3281 + 667 + 670 + 3281 + 3289 + + + 195 + 668 + 3283 + 667 + 670 + 3281 + 3289 + + + 195 + 667 + 3284 + 667 + 670 + 3281 + 3289 + + + 195 + 667 + 3286 + 667 + 670 + 3281 + 3289 + + + 195 + 669 + 3285 + 667 + 670 + 3281 + 3289 + + + 195 + 670 + 3284 + 667 + 670 + 3281 + 3289 + + + 195 + 670 + 3288 + 667 + 670 + 3281 + 3289 + + + 195 + 654 + 3294 + 648 + 662 + 3282 + 3302 + + + 195 + 653 + 3293 + 648 + 662 + 3282 + 3302 + + + 195 + 652 + 3294 + 648 + 662 + 3282 + 3302 + + + 195 + 650 + 3293 + 648 + 662 + 3282 + 3302 + + + 195 + 651 + 3292 + 648 + 662 + 3282 + 3302 + + + 195 + 650 + 3291 + 648 + 662 + 3282 + 3302 + + + 195 + 651 + 3290 + 648 + 662 + 3282 + 3302 + + + 195 + 652 + 3291 + 648 + 662 + 3282 + 3302 + + + 195 + 653 + 3290 + 648 + 662 + 3282 + 3302 + + + 195 + 655 + 3290 + 648 + 662 + 3282 + 3302 + + + 104 + 635 + 511 + 631 + 641 + 505 + 516 + + + 104 + 632 + 509 + 631 + 641 + 505 + 516 + + + 104 + 637 + 509 + 631 + 641 + 505 + 516 + + + 104 + 634 + 510 + 631 + 641 + 505 + 516 + + + 29 + 663 + 3277 + 660 + 670 + 3269 + 3279 + + + 29 + 668 + 3277 + 660 + 670 + 3269 + 3279 + + + 29 + 663 + 3278 + 660 + 670 + 3269 + 3279 + + + 29 + 661 + 3272 + 660 + 670 + 3269 + 3279 + + + 29 + 667 + 3276 + 660 + 670 + 3269 + 3279 + + + 343 + 659 + 3302 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3301 + 648 + 666 + 3289 + 3302 + + + 343 + 659 + 3300 + 648 + 666 + 3289 + 3302 + + + 343 + 658 + 3299 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3299 + 648 + 666 + 3289 + 3302 + + + 343 + 661 + 3298 + 648 + 666 + 3289 + 3302 + + + 343 + 659 + 3298 + 648 + 666 + 3289 + 3302 + + + 343 + 658 + 3297 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3297 + 648 + 666 + 3289 + 3302 + + + 343 + 662 + 3297 + 648 + 666 + 3289 + 3302 + + + 343 + 660 + 3295 + 648 + 666 + 3289 + 3302 + + + 343 + 658 + 3296 + 648 + 666 + 3289 + 3302 + + + 99 + 256 + 152 + 251 + 260 + 152 + 160 + + + 99 + 260 + 154 + 251 + 260 + 152 + 160 + + + 99 + 259 + 159 + 251 + 260 + 152 + 160 + + + 99 + 253 + 156 + 251 + 260 + 152 + 160 + + + 99 + 256 + 156 + 251 + 260 + 152 + 160 + + + 99 + 254 + 160 + 251 + 260 + 152 + 160 + + + 177 + 65 + 361 + 60 + 66 + 360 + 366 + + + 177 + 64 + 363 + 60 + 66 + 360 + 366 + + + 177 + 61 + 361 + 60 + 66 + 360 + 366 + + + 177 + 63 + 364 + 60 + 66 + 360 + 366 + + + 177 + 64 + 363 + 60 + 66 + 360 + 366 + + + 177 + 63 + 365 + 60 + 66 + 360 + 366 + + + 177 + 63 + 365 + 60 + 66 + 360 + 366 + + + 177 + 63 + 365 + 60 + 66 + 360 + 366 + + + 177 + 63 + 364 + 60 + 66 + 360 + 366 + + + 409 + 644 + 666 + 642 + 646 + 664 + 668 + + + 409 + 644 + 664 + 642 + 646 + 662 + 666 + + + 409 + 645 + 665 + 643 + 647 + 663 + 667 + + + 409 + 645 + 667 + 643 + 647 + 665 + 669 + + + 409 + 646 + 663 + 644 + 648 + 661 + 665 + + + 409 + 647 + 661 + 645 + 649 + 659 + 663 + + + 409 + 647 + 667 + 645 + 649 + 665 + 669 + + + 409 + 648 + 669 + 646 + 650 + 667 + 671 + + + 409 + 648 + 659 + 646 + 650 + 657 + 661 + + + 409 + 649 + 657 + 647 + 651 + 655 + 659 + + + 409 + 649 + 662 + 647 + 651 + 660 + 664 + + + 409 + 650 + 665 + 648 + 652 + 663 + 667 + + + 409 + 650 + 669 + 648 + 652 + 667 + 671 + + + 409 + 651 + 667 + 649 + 653 + 665 + 669 + + + 409 + 653 + 666 + 651 + 655 + 664 + 668 + + + 409 + 653 + 669 + 647 + 653 + 667 + 671 + + + 409 + 656 + 663 + 654 + 658 + 661 + 665 + + + 409 + 657 + 659 + 655 + 659 + 657 + 661 + + + 409 + 658 + 661 + 656 + 660 + 659 + 663 + + + 409 + 658 + 670 + 656 + 660 + 668 + 672 + + + 409 + 659 + 659 + 657 + 661 + 657 + 661 + + + + 409 + 660 + 660 + 658 + 662 + 658 + 662 + + + 409 + 660 + 667 + 658 + 662 + 665 + 669 + + + 409 + 662 + 665 + 660 + 664 + 663 + 667 + + + 409 + 662 + 662 + 660 + 664 + 660 + 664 + + + 409 + 662 + 660 + 650 + 664 + 658 + 662 + + + 409 + 646 + 661 + 646 + 662 + 659 + 663 + + + 409 + 665 + 664 + 663 + 667 + 662 + 666 + + + 409 + 665 + 669 + 663 + 667 + 667 + 671 + + + 409 + 646 + 671 + 644 + 648 + 669 + 671 + + + 409 + 665 + 668 + 649 + 665 + 666 + 670 + + + 409 + 667 + 664 + 665 + 669 + 662 + 666 + + + 409 + 667 + 662 + 665 + 669 + 660 + 664 + + + 409 + 668 + 663 + 666 + 670 + 661 + 665 + + + 409 + 669 + 667 + 667 + 671 + 665 + 669 + + + 409 + 669 + 669 + 667 + 671 + 667 + 671 + + + 409 + 669 + 663 + 667 + 671 + 661 + 665 + + + 409 + 646 + 665 + 642 + 646 + 664 + 668 + + + 408 + 656 + 662 + 656 + 656 + 662 + 662 + + + 34 + 11 + 3395 + 8 + 14 + 3392 + 3398 + + + 40 + 10 + 3394 + 8 + 13 + 3392 + 3397 + + + 40 + 11 + 3397 + 9 + 13 + 3395 + 3398 + + + 40 + 11 + 3395 + 8 + 14 + 3392 + 3398 + + + 521 + 464 + 766 + 463 + 466 + 765 + 768 + + + 521 + 465 + 766 + 463 + 466 + 765 + 768 + + + 521 + 466 + 766 + 463 + 466 + 765 + 768 + + + 521 + 466 + 767 + 463 + 466 + 765 + 768 + + + 521 + 466 + 768 + 463 + 466 + 765 + 768 + + + 521 + 465 + 768 + 463 + 466 + 765 + 768 + + + 521 + 464 + 768 + 463 + 466 + 765 + 768 + + + 521 + 464 + 767 + 463 + 466 + 765 + 768 + + + 521 + 463 + 767 + 463 + 466 + 765 + 768 + + + 521 + 463 + 765 + 463 + 466 + 765 + 768 + + + 195 + 57 + 143 + 56 + 60 + 143 + 151 + + + 195 + 57 + 144 + 56 + 60 + 143 + 151 + + + 195 + 57 + 145 + 56 + 60 + 143 + 151 + + + 195 + 58 + 145 + 56 + 60 + 143 + 151 + + + 195 + 59 + 145 + 56 + 60 + 143 + 151 + + + 195 + 59 + 146 + 56 + 60 + 143 + 151 + + + 195 + 60 + 144 + 56 + 60 + 143 + 151 + + + 195 + 60 + 145 + 56 + 60 + 143 + 151 + + + 195 + 60 + 146 + 56 + 60 + 143 + 151 + + + 195 + 60 + 143 + 56 + 60 + 143 + 151 + + + 542 + 60 + 117 + 56 + 63 + 113 + 120 + + 542 + 60 + 116 + 56 + 63 + 113 + 120 + + 542 + 59 + 117 + 56 + 63 + 113 + 120 + + 542 + 60 + 115 + 56 + 63 + 113 + 120 + + 542 + 59 + 115 + 56 + 63 + 113 + 120 + + + 542 + 59 + 114 + 56 + 63 + 113 + 120 + + + 298 + 58 + 114 + 56 + 63 + 113 + 120 + + + 298 + 58 + 115 + 56 + 63 + 113 + 120 + + + 298 + 57 + 115 + 56 + 63 + 113 + 120 + + + 298 + 57 + 116 + 56 + 63 + 113 + 120 + + + 298 + 57 + 117 + 56 + 63 + 113 + 120 + + + 298 + 58 + 118 + 56 + 63 + 113 + 120 + + + 298 + 57 + 114 + 56 + 63 + 113 + 120 + + + + 190 + 175 + 144 + 173 + 206 + 135 + 155 + + + 190 + 179 + 147 + 173 + 206 + 135 + 155 + + + 190 + 182 + 136 + 173 + 206 + 135 + 155 + + + 190 + 190 + 149 + 173 + 206 + 135 + 155 + + + 190 + 192 + 154 + 173 + 206 + 135 + 155 + + + 190 + 192 + 150 + 173 + 206 + 135 + 155 + + + 190 + 184 + 140 + 173 + 206 + 135 + 155 + + + 190 + 200 + 142 + 173 + 206 + 135 + 155 + + + 190 + 174 + 140 + 173 + 206 + 135 + 155 + + + 190 + 199 + 136 + 173 + 206 + 135 + 155 + + + 190 + 260 + 251 + 260 + 300 + 234 + 265 + + + 190 + 262 + 255 + 260 + 300 + 234 + 265 + + + 190 + 270 + 234 + 260 + 300 + 234 + 265 + + + 190 + 276 + 240 + 260 + 300 + 234 + 265 + + + 190 + 290 + 263 + 260 + 300 + 234 + 265 + + + 190 + 272 + 240 + 260 + 300 + 234 + 265 + + + 190 + 296 + 250 + 260 + 300 + 234 + 265 + + + 190 + 269 + 264 + 260 + 300 + 234 + 265 + + + 190 + 288 + 244 + 260 + 300 + 234 + 265 + + + 190 + 282 + 240 + 260 + 300 + 234 + 265 + + + 82 + 330 + 662 + 329 + 332 + 658 + 664 + + + 156 + 331 + 668 + 328 + 332 + 666 + 670 + + + 166 + 270 + 654 + 268 + 270 + 646 + 654 + + + 171 + 268 + 646 + 268 + 270 + 646 + 654 + + + 163 + 325 + 713 + 323 + 333 + 713 + 713 + + + 163 + 331 + 713 + 323 + 333 + 713 + 713 + + + 317 + 467 + 649 + 467 + 467 + 646 + 655 + + + 316 + 537 + 615 + 534 + 542 + 615 + 616 + + + 170 + 544 + 702 + 538 + 545 + 702 + 703 + + + 764 + 471 + 856 + 469 + 471 + 855 + 858 + + + 212 + 417 + 570 + 414 + 422 + 569 + 570 + + + 212 + 266 + 659 + 261 + 267 + 658 + 660 + + + 212 + 262 + 659 + 261 + 267 + 658 + 660 + + + 214 + 418 + 3377 + 409 + 418 + 3373 + 3382 + + + 214 + 414 + 3376 + 409 + 418 + 3373 + 3382 + + + 214 + 411 + 3377 + 409 + 418 + 3373 + 3382 + + + 214 + 410 + 3379 + 409 + 418 + 3373 + 3382 + + + 214 + 413 + 3381 + 409 + 418 + 3373 + 3382 + + + 214 + 415 + 3381 + 409 + 418 + 3373 + 3382 + + + 214 + 413 + 3382 + 409 + 418 + 3373 + 3382 + + + 184 + 413 + 3394 + 410 + 414 + 3387 + 3395 + + + 184 + 411 + 3393 + 410 + 414 + 3387 + 3395 + + + 184 + 410 + 3390 + 410 + 414 + 3387 + 3395 + + + 297 + 435 + 565 + 434 + 437 + 561 + 567 + + + 395 + 406 + 562 + 402 + 413 + 559 + 565 + + + 3 + 412 + 545 + 405 + 412 + 545 + 550 + + + 3 + 410 + 546 + 405 + 412 + 545 + 550 + + + 3 + 407 + 545 + 405 + 412 + 545 + 550 + + + 3 + 405 + 546 + 405 + 412 + 545 + 550 + + + 3 + 406 + 548 + 405 + 412 + 545 + 550 + + + 3 + 405 + 550 + 405 + 412 + 545 + 550 + + + 3 + 407 + 550 + 405 + 412 + 545 + 550 + + + 0 + 432 + 535 + 399 + 435 + 531 + 540 + + + 0 + 425 + 540 + 399 + 435 + 531 + 540 + + + 0 + 415 + 540 + 399 + 435 + 531 + 540 + + + 0 + 405 + 539 + 399 + 435 + 531 + 540 + + + 0 + 407 + 531 + 399 + 435 + 531 + 540 + + + 252 + 410 + 531 + 399 + 435 + 531 + 540 + + + 8 + 432 + 540 + 431 + 436 + 532 + 548 + + + 213 + 427 + 548 + 426 + 428 + 546 + 549 + + + 213 + 426 + 546 + 426 + 428 + 546 + 549 + + + 540 + 715 + 1451 + 712 + 716 + 1450 + 1454 + + + 540 + 713 + 1453 + 712 + 716 + 1450 + 1454 + + + 239 + 409 + 483 + 408 + 411 + 480 + 485 + + + 248 + 412 + 476 + 408 + 416 + 468 + 480 + + + 248 + 415 + 462 + 411 + 464 + 458 + 466 + + + 249 + 402 + 466 + 402 + 403 + 463 + 469 + + + 249 + 403 + 466 + 402 + 403 + 463 + 469 + + + 248 + 393 + 462 + 390 + 394 + 462 + 466 + + + 248 + 396 + 469 + 394 + 400 + 466 + 473 + + + 239 + 395 + 479 + 393 + 398 + 475 + 483 + + + 239 + 399 + 481 + 396 + 403 + 476 + 483 + + + 239 + 395 + 489 + 391 + 399 + 485 + 493 + + + 621 + 395 + 1766 + 394 + 396 + 1766 + 1770 + + + 624 + 415 + 833 + 411 + 415 + 833 + 835 + + + 320 + 612 + 532 + 608 + 621 + 528 + 541 + + + 320 + 616 + 531 + 608 + 621 + 528 + 541 + + + 320 + 619 + 533 + 608 + 621 + 528 + 541 + + + 320 + 617 + 535 + 608 + 621 + 528 + 541 + + + 320 + 619 + 538 + 608 + 621 + 528 + 541 + + + 320 + 614 + 539 + 608 + 621 + 528 + 541 + + + 2 + 618 + 530 + 617 + 625 + 526 + 532 + + + 2 + 618 + 527 + 617 + 625 + 526 + 532 + + + 2 + 622 + 530 + 617 + 625 + 526 + 532 + + + 2 + 624 + 526 + 617 + 625 + 526 + 532 + + + 2 + 579 + 563 + 576 + 581 + 554 + 567 + + + 2 + 579 + 564 + 576 + 581 + 554 + 567 + + + 2 + 579 + 565 + 576 + 581 + 554 + 567 + + + 2 + 579 + 567 + 576 + 581 + 554 + 567 + + + 541 + 417 + 163 + 414 + 418 + 161 + 165 + + + 735 + 517 + 545 + 515 + 518 + 543 + 548 + + + 736 + 511 + 551 + 510 + 516 + 551 + 552 + + + 736 + 514 + 551 + 510 + 516 + 551 + 552 + + + 788 + 512 + 1481 + 510 + 515 + 1479 + 1483 + + + 95 + 515 + 2422 + 510 + 517 + 2421 + 2423 + + + 95 + 512 + 2423 + 510 + 517 + 2421 + 2423 + + + 95 + 511 + 2422 + 510 + 517 + 2421 + 2423 + + + 779 + 510 + 2426 + 508 + 513 + 2424 + 2427 + + + 513 + 597 + 756 + 596 + 597 + 755 + 758 + + + 269 + 372 + 438 + 370 + 377 + 435 + 440 + + + 253 + 372 + 443 + 368 + 375 + 441 + 445 + + diff --git a/GameServer/conf/server/locs/backup/tmp/NpcLoc.xml.gz b/GameServer/conf/server/locs/backup/tmp/NpcLoc.xml.gz new file mode 100644 index 0000000..2c53540 Binary files /dev/null and b/GameServer/conf/server/locs/backup/tmp/NpcLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/ItemLoc.xml.gz b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/ItemLoc.xml.gz new file mode 100644 index 0000000..9e2235e Binary files /dev/null and b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/ItemLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/NpcLoc.xml.gz b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/NpcLoc.xml.gz new file mode 100644 index 0000000..2c53540 Binary files /dev/null and b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/NpcLoc.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/ObjectTelePoints.xml.gz b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/ObjectTelePoints.xml.gz new file mode 100644 index 0000000..437d171 Binary files /dev/null and b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/ObjectTelePoints.xml.gz differ diff --git a/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/Shops.xml.gz b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/Shops.xml.gz new file mode 100644 index 0000000..ba00eb7 Binary files /dev/null and b/GameServer/conf/server/locs/backup/update_backups/kbdandshopupdateBACKUP/Shops.xml.gz differ diff --git a/GameServer/conf/server/locs/extras/ObjectTelePoints.xml.gz b/GameServer/conf/server/locs/extras/ObjectTelePoints.xml.gz new file mode 100644 index 0000000..9e54a6e Binary files /dev/null and b/GameServer/conf/server/locs/extras/ObjectTelePoints.xml.gz differ diff --git a/GameServer/conf/server/quests_back/Christmas.java b/GameServer/conf/server/quests_back/Christmas.java new file mode 100644 index 0000000..f07d772 --- /dev/null +++ b/GameServer/conf/server/quests_back/Christmas.java @@ -0,0 +1,920 @@ +import msc.gs.Instance; import msc.gs.model.ActiveTile; +import msc.gs.Instance; import msc.gs.model.InvItem; +import msc.gs.Instance; import msc.gs.model.Item; +import msc.gs.Instance; import msc.gs.model.Npc; +import msc.gs.Instance; import msc.gs.model.Player; +import msc.gs.Instance; import msc.gs.model.World; +import msc.gs.Instance; import msc.gs.quest.Quest; +import msc.gs.Instance; import msc.gs.quest.QuestAction; + +import msc.gs.Instance; import msc.gs.external.EntityHandler; +import msc.gs.Instance; import msc.gs.external.ItemDropDef; +import msc.gs.Instance; import msc.gs.tools.DataConversions; + +/** + * Quest: Christmas! (v1.0) 8/1/2009 Status: COMPLETE Start: Santa (id 798), + * 290,464 NPCs: Farrel (id 799), 106,670 1st Elf (id 800), 71,589 2nd Elf (id + * 800), 656,467 3rd Elf (id 800), 403,685 Evil wizard (id 801), 279,454 Items: + * Santa hat (id 971), Santa top (id 1315), Santa legs (id 1314), Candy cane (id + * 1316), Toy 1 (id 1317), Toy 2 (id 1318), Toy 3 (id 1319), Toy 4 (id 1320), + * Gift box (id 1321) Reward: 0 quest points, Magic Gift Box (id 1321) (random + * item inside) + * + * @author punKrockeR + */ +public class Christmas extends Quest { + private static final int SANTA_ID = 798; + private static final int FARREL_ID = 799; + private static final int ELF_ID = 800; + private static final int DARKWIZ_ID = 801; + private static final int SANTA_HAT_ID = 971; + private static final int SANTA_TOP_ID = 1315; + private static final int SANTA_LEG_ID = 1314; + private static final int CANDY_CANE_ID = 1316; + private static final int TOY1_ID = 1317; + private static final int TOY2_ID = 1318; + private static final int TOY3_ID = 1319; + private static final int TOY4_ID = 1320; + private static final int GIFT_ID = 1321; + private static final int DEFAULT_DELAY = 3200; + private static final int QUEST_POINTS = 0; + private World world = Instance.getWorld(); + private static final ItemDropDef[] BOX_ITEMS = new ItemDropDef[] { + new ItemDropDef(155, 1, 3200), // Coal, 42% + new ItemDropDef(SANTA_HAT_ID, 1, 799), // Santa hat, 2.99% + new ItemDropDef(SANTA_TOP_ID, 1, 2000), // Santa top, 20% + new ItemDropDef(SANTA_LEG_ID, 1, 2000), // Santa legs, 20% + new ItemDropDef(CANDY_CANE_ID, 1, 2000), // Candy cane, 15% + new ItemDropDef(575, 1, 1) // Christmas cracker, 0.01% + }; + + /** + * @return the quest's name + */ + public String getName() { + return "Christmas!"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() { + return 5; + } + + /** + * Initialises the quest + */ + public void init() { + associateNpc(SANTA_ID); + associateNpc(FARREL_ID); + associateNpc(ELF_ID); + associateNpc(DARKWIZ_ID); + associateItem(TOY1_ID); + associateItem(TOY2_ID); + associateItem(TOY3_ID); + associateItem(TOY4_ID); + associateItem(GIFT_ID); + } + + /** + * @return if the given NPC is visible to the player + */ + public boolean isNpcVisible(Npc npc, Player player) { + + if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 + && npc.getLoc().startY() == 589) // First elf + return player.getQuestStage(this) == 2 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 + && npc.getLoc().startY() == 594) // First elf + return player.getQuestStage(this) == 2 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 72 + && npc.getLoc().startY() == 585) // First elf + return player.getQuestStage(this) == 2 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 656 + && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 653 + && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 403 + && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 419 + && npc.getLoc().startY() == 684) // Last elf + return player.getQuestStage(this) == 6 + && player.getQuestStage(this) != COMPLETE; + else if (npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 408 + && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 + && player.getQuestStage(this) != COMPLETE; + + return true; + } + + /** + * @return if the given item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) { + if (item.getID() == TOY1_ID) + return player.getQuestStage(this) >= 2; + else if (item.getID() == TOY2_ID) + return player.getQuestStage(this) >= 4; + else if (item.getID() == TOY3_ID) + return player.getQuestStage(this) >= 6; + else if (item.getID() == TOY4_ID) + return player.getQuestStage(this) >= 7; + + return true; + } + + /** + * @return if the player has the given item in his inventory, bank or if + * it's on the ground somewhere + */ + public boolean hasItem(Player player, int id) { + if (player.getInventory().hasItemId(id)) { + player.getActionSender().sendMessage( + "You already have this elf's toy!"); + return true; + } + + if (player.getBank().hasItemId(id)) { + player.getActionSender().sendMessage( + "You already have this elf's toy in your bank!"); + return true; + } + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, + 20); + for (int x = 0; x < tiles.length; x++) { + for (int y = 0; y < tiles[x].length; y++) { + ActiveTile t = tiles[x][y]; + if (t != null) { + for (Item i : t.getItems()) { + if (i.getID() == id) { + if (i.getOwner().equals(player)) { + player + .getActionSender() + .sendMessage( + "You already have this elf's toy nearby on the ground!"); + return true; + } + } + } + } + } + } + + player.getActionSender().sendMessage("The toy falls to the ground"); + return false; + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, + final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.USED_ITEM) { + if (!(args[0] instanceof InvItem)) + return; + + final InvItem item = (InvItem) args[0]; + + handleUseItem(item, player); + } else if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() == SANTA_ID) { + player.setBusy(true); + + if (stage == -1) + startQuest(player, npc); + else + handleSantaTalk(player, npc); + } else if (npc.getID() == FARREL_ID) { + player.setBusy(true); + handleFarrelTalk(player, npc); + } else if (npc.getID() == ELF_ID) { + player.setBusy(true); + handleElfTalk(player, npc); + } else if (npc.getID() == DARKWIZ_ID) { + player.setBusy(true); + handleWizardTalk(player, npc); + } + } else if (action == action.KILLED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() == ELF_ID) // If the player doesn't have the toy in + // their bank or inventory, drop the + // toy. + { + if (npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589 + && player.getQuestStage(this) == 2 + && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 71 + && npc.getLoc().startY() == 594 + && player.getQuestStage(this) == 2 + && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 72 + && npc.getLoc().startY() == 585 + && player.getQuestStage(this) == 2 + && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 653 + && npc.getLoc().startY() == 467 + && player.getQuestStage(this) == 4 + && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 656 + && npc.getLoc().startY() == 467 + && player.getQuestStage(this) == 4 + && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 403 + && npc.getLoc().startY() == 685 + && player.getQuestStage(this) == 6 + && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 419 + && npc.getLoc().startY() == 684 + && player.getQuestStage(this) == 6 + && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), + npc.getY(), 1, player)); + else if (npc.getLoc().startX() == 408 + && npc.getLoc().startY() == 685 + && player.getQuestStage(this) == 6 + && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), + npc.getY(), 1, player)); + } + } + } + + /** + * Handles item use + */ + private void handleUseItem(final InvItem item, final Player player) { + if (item.getID() == GIFT_ID) { + player.setBusy(true); + player.getActionSender().sendMessage( + "You open the " + item.getDef().getName() + "..."); + sleep(2000); + int total = 0; + for (ItemDropDef drop : BOX_ITEMS) + total += drop.getWeight(); + + int hit = DataConversions.random(0, total); + total = 0; + ItemDropDef reward = null; + for (ItemDropDef drop : BOX_ITEMS) { + if (hit >= total && hit < (total + drop.getWeight())) { + reward = drop; + break; + } + + total += drop.getWeight(); + } + + player.getInventory().remove(GIFT_ID, 1); + if (reward == null) + player.getActionSender().sendMessage( + "You don't get shit! (reward is null)"); + else + player.getInventory().add( + new InvItem(reward.getID(), reward.getAmount())); + + player.getActionSender().sendMessage( + "It contained a " + + ((reward.getAmount() > 1) ? reward.getAmount() + : "a ") + + EntityHandler.getItemDef(reward.getID()) + .getName() + + (reward.getAmount() > 1 ? "s" : "") + "!"); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + } else + player.setBusy(false); + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) { + player.setBusy(true); + sendChat("Christmas! It's ruined!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Why?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The presents... they're gone!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What presents? Gone where?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("All my Christmas presents have been stolen!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Who stole them?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, "My own elves!", + "I landed here last night in my sleigh", + "To deliver my presents to the citizens of this land", + "But an evil Dark Knight wizard cast a spell on my Elves", + "And they stole my presents and ran away!"); + player.setBusy(false); + int option = getMenuOption(player, "That sucks", "Where are they now?", + "Good luck with that"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // No + { + sendChat("Indeed it does!", npc, player); + player.setBusy(false); + npc.unblock(); + } else if (option == 1) // Yes + { + queueChat( + npc, + player, + DEFAULT_DELAY, + "I don't know. But one of the elves, Farrel, he's in Lumbridge", + "It appears the spell didn't affect him", + "But he's in hiding from the other elves who have turned evil!", + "And I'm afraid the spell is quite irreversible"); + player.setBusy(false); + option = getMenuOption(player, "Maybe I can help?", + "Christmas really is ruined then"); + if (option == -1) + return; + player.setBusy(true); + sleep(2000); + if (option == 0) { + if (player.getQuestPoints() < 2) { + sendChat( + "I doubt it, you don't have a very good reputation for helping people", + npc, player); + player.setBusy(false); + npc.unblock(); + sleep(2000); + player + .getActionSender() + .sendMessage( + "You need at least 2 Quest Points to start this quest"); + } else { + queueChat( + npc, + player, + DEFAULT_DELAY, + "Perhaps you can... I don't know where the others are", + "But if you can find Farrel, he can help you find them", + "All I know is that he's in Lumbridge", + "He said he's hiding near a church", + "Please find him and help me save Christmas!"); + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else { + sendChat("I'm afraid so!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else { + sendChat("Oh, I'll need it!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles Santa's chat if the quest is started but not finished + */ + private void handleSantaTalk(final Player player, final Npc npc) { + if (player.getQuestStage(this) == COMPLETE) { + sendChat("Merry christmas, hero!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else if (player.getQuestStage(this) != 7) { + sendChat("Oh, " + player.getUsername() + + ". Please find those elves!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else { + if (!player.getInventory().hasItemId(TOY1_ID) + || !player.getInventory().hasItemId(TOY2_ID) + || !player.getInventory().hasItemId(TOY3_ID) + || !player.getInventory().hasItemId(TOY4_ID)) { + queueChat(npc, player, DEFAULT_DELAY, + "Farrel said you'd collected the toys", + "Please bring them all to me as soon as possible!"); + npc.unblock(); + player.setBusy(false); + return; + } + + queueChat(npc, player, DEFAULT_DELAY, player.getUsername() + + "! I can't express my gratitude with words", + "You saved Christmas for your land!", + "I don't have anything I can spare for you", + "But I can give you your present early", + "It's a magic gift box. The item within is unknown", + "I hope you get something fantastic!", + "You deserve it for your heroic antics.", "Farewell kind " + + (player.isMale() ? "sir" : "lady") + + "! And meeeeery christmas!"); + + player.getActionSender().sendMessage( + "Santa takes the toys and hands you a small gift box"); + if (player.getInventory().remove(TOY1_ID, 1) == -1) { + player.setBusy(false); + return; + } + if (player.getInventory().remove(TOY2_ID, 1) == -1) { + player.setBusy(false); + return; + } + if (player.getInventory().remove(TOY3_ID, 1) == -1) { + player.setBusy(false); + return; + } + if (player.getInventory().remove(TOY4_ID, 1) == -1) { + player.setBusy(false); + return; + } + player.getInventory().add(new InvItem(GIFT_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), COMPLETE); + sleep(2500); + player + .getActionSender() + .sendMessage( + "Maybe I should go and talk to that Evil Dark Knight Wizard..."); + } + } + + /** + * Handles Farrel's chat if the quest is started but not finished + */ + private void handleFarrelTalk(final Player player, final Npc npc) { + player.setBusy(true); + if (player.getQuestStage(this) == -1) { + sendChat("Bugger off", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } else if (player.getQuestStage(this) == 1) { + player.setBusy(true); + sendChat("Who are you?", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Santa sent me to find you", player, npc); + sleep(DEFAULT_DELAY); + sendChat("What for?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "To murder you", "To help"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // No + { + sendChat( + "Go for it. It's only a matter of time before they find me anyway.", + npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Well if Santa trusts you, I guess I can.", + "We must get started at once if we're to find the others."); + player.setBusy(false); + option = getMenuOption(player, "Any idea where they are?", + "Maybe later"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // Yes + { + queueChat( + npc, + player, + DEFAULT_DELAY, + "One of them ran to the desert nearby", + "I don't know where he's hiding, but we hate the heat", + "He must be hiding near cliffs or rocks that offer shade", + "You know this land better than I", + "It would be safer for all involved if you went, and not me" + + ); + player.setBusy(false); + option = getMenuOption(player, "I agree", "Pussy"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // Yes + { + queueChat( + npc, + player, + DEFAULT_DELAY, + "Excellent. He should be carrying a small " + + EntityHandler.getItemDef(TOY1_ID) + .getName(), + "Get it and bring it to me. Use any means necessary. Any.", + "My comrades cannot be saved now."); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 2); + } else // No + { + sendChat( + "Santa's trust was misplaced. Christmas is truly ruined.", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("There won't be a \"later\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else if (player.getQuestStage(this) == 2) { + sendChat("Have you found the first toy?", npc, player); + sleep(2000); + player.setBusy(false); + int option = getMenuOption(player, "Not yet", "Yeah"); + if (option == -1) + return; + sleep(DEFAULT_DELAY); + if (option == 0) // No + { + sendChat( + "Well please act quickly. Time is running out! Remember, he's in the desert", + npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + if (player.getInventory().hasItemId(TOY1_ID)) { + sendChat("Great! Please, hand it to me", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage( + "You give Farrel the " + + EntityHandler.getItemDef(TOY1_ID) + .getName()); + player.setQuestStage(getUniqueID(), 3); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY1_ID, 1); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage3(npc, player); + } else { + sendChat( + "No you haven't. Please don't fool around. Time is running out!", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else if (player.getQuestStage(this) == 3) { + questStage3(npc, player); + } else if (player.getQuestStage(this) == 4) { + sendChat("Have you found the second toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Right on brother", "No"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // No + { + if (player.getInventory().hasItemId(TOY2_ID)) { + sendChat( + "I don't know what that means, but please hand me the toy", + npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage( + "You give Farrel the " + + EntityHandler.getItemDef(TOY2_ID) + .getName()); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY2_ID, 1); + player.setQuestStage(getUniqueID(), 5); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage5(npc, player); + } else { + sendChat( + "I don't know what that means, but you don't have the toy", + npc, player); + sleep(DEFAULT_DELAY); + sendChat("Please hurry. Christmas is almost over!", npc, + player); + player.setBusy(false); + npc.unblock(); + } + } else // Yes + { + sendChat( + "Well please hurry. Christmas is almost over! Remember, \"Baxtorian Falls\"!", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } else if (player.getQuestStage(this) == 5) { + questStage5(npc, player); + } else if (player.getQuestStage(this) == 6) // Final present + { + player.setBusy(true); + sendChat("Did you get izzy's toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // Yes + { + if (player.getInventory().hasItemId(TOY3_ID)) { + queueChat( + npc, + player, + DEFAULT_DELAY, + "Thank you so much, " + player.getUsername(), + "You single-handedly saved Christmas.", + "The elves at the north pole will write songs of you hero", + "You will be respected and remembered forever, believe me.", + "The final present, I have kept all along", + "Here, you take all four presents and give them to santa", + "I'll tell him of your bravery", + "I'm sure he'll want to reward you", "Farewell, " + + player.getUsername() + ".", + "Merry christmas."); + player.getActionSender().sendMessage( + "Farrel hands you the three toys"); + if (player.getInventory().hasItemId(TOY1_ID)) { + sendChat("Oh... You already have the toys.", npc, + player); + player.setBusy(false); + return; + } + player.getInventory().add(new InvItem(TOY1_ID, 1)); + player.getInventory().add(new InvItem(TOY2_ID, 1)); + // player.getInventory().add(new InvItem(TOY3_ID, 1)); + player.getInventory().add(new InvItem(TOY4_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 7); + } else { + sendChat("No you don't.", npc, player); + sleep(DEFAULT_DELAY); + sendChat( + "Remember, flames and lava and the ocean are Izzy's favourite things", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat( + "Please get it. Don't hesitate just because he's my brother.", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } else { + sendChat("Hey there, " + player.getUsername() + "!", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 3 chat + */ + private void questStage3(final Npc npc, final Player player) { + sendChat("So what now?", player, npc); + sleep(DEFAULT_DELAY); + queueChat( + npc, + player, + DEFAULT_DELAY, + "While you were gone, I did some reconnaissance work", + "I overheard some humans talking about a deranged Elf they saw while sightseeing"); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // Yes + { + queueChat( + npc, + player, + DEFAULT_DELAY, + "A place called the \"Baxtorian Falls\". Somewhere near a gnome stronghold.", + "It's not much of a lead, but it's all we've got"); + sendChat("I'll get on it then", player, npc); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 4); + } else // No + { + sendChat("Suit yourself, grinch.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 5 chat + */ + private void questStage5(final Npc npc, final Player player) { + sendChat("What's next little guy?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("Don't patronize me, " + player.getUsername() + + ". I'm stronger in ways you can't even imagine", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well I'll take your word for it. Where's the last elf?", + player, npc); + sleep(DEFAULT_DELAY); + sendChat("I don't know.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What? Not even a clue?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I'm afraid you'll have to find izzy on your own", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Izzy? That's his name?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The last toy to get is a " + + EntityHandler.getItemDef(TOY3_ID).getName() + + ". Izzy took that one.", npc, player); + sleep(DEFAULT_DELAY); + sendChat( + "Well did you know him very well? Where's somewhere he's likely to go?", + player, npc); + sleep(DEFAULT_DELAY); + sendChat("I knew him very well.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("He was my younger brother.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("I'm sorry, farrel.", player, npc); + sleep(DEFAULT_DELAY); + queueChat( + npc, + player, + DEFAULT_DELAY, + "What he's become... he's not my brother anymore", + "All I know that might help you is that, unlike the rest of us", + "Izzy loved the heat. Flames, lava, that sort of thing", + "And he also loved the ocean. You know this land", + "Take what little information I have to offer", + "And find my brother. Get the last toy back."); + player.setBusy(false); + int option = getMenuOption(player, "Of course, Farrel", + "No. I refuse to murder your brother", + "I've had enough of this"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, "Thank you dearly, " + + player.getUsername(), + "Good luck. Please, make his death quick."); + player.setQuestStage(getUniqueID(), 6); + player.setBusy(false); + npc.unblock(); + } else // No + { + sendChat("Then the death of Christmas is on your conscience.", npc, + player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles talking to the evil elves + */ + private void handleElfTalk(final Player player, final Npc npc) { + sendChat("Get out of my way tall one", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } + + /** + * Handles talking to the evil wizard + */ + private void handleWizardTalk(final Player player, final Npc npc) { + if (player.getQuestStage(this) == COMPLETE) { + sendChat("You! You thwarted my plans!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Christmas is for everyone! Why do you want to stop it?", + player, npc); + sleep(DEFAULT_DELAY); + queueChat( + npc, + player, + DEFAULT_DELAY, + "None of your business, fiend! I'm going to send you back in time", + "To before you ruined my plans!"); + player.setBusy(false); + int option = getMenuOption(player, "Please don't!", + "Give it your best shot"); + if (option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if (option == 0) // No + { + queueChat(npc, player, DEFAULT_DELAY, + "Bah! It makes no difference anyway", + "I have more important things to ruin"); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, "I will!", "Muahahaha!"); + player.getActionSender().sendTeleBubble( + player.getLocation().getX(), + player.getLocation().getY(), false); + player.getActionSender().sendSound("spellfail"); + player.teleport(289, 459, true); + sleep(DEFAULT_DELAY); + player.getActionSender().sendTeleBubble(289, 459, false); + sendChat("Huh? What? Where am i?", player, npc); + player.setQuestStage(getUniqueID(), -1); + npc.unblock(); + sleep(DEFAULT_DELAY); + player.setBusy(false); + if (player.getInventory().hasItemId(TOY1_ID) + || player.getInventory().hasItemId(TOY2_ID) + || player.getInventory().hasItemId(TOY3_ID) + || player.getInventory().hasItemId(TOY4_ID) + || player.getInventory().hasItemId(GIFT_ID)) + player + .getActionSender() + .sendMessage( + "Santa's presents are unaffected by the Wizard's spell!"); + } + } else { + sendChat("Hahaha! You may call me, the grinch! Bahaha!", npc, + player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage( + "He really does look quite insane"); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Construct the quest (empty) + */ + public Christmas() { + } +} diff --git a/GameServer/conf/server/quests_back/Christmas.java.bak b/GameServer/conf/server/quests_back/Christmas.java.bak new file mode 100644 index 0000000..f89fa14 --- /dev/null +++ b/GameServer/conf/server/quests_back/Christmas.java.bak @@ -0,0 +1,816 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; +import org.rscdaemon.server.entityhandling.defs.extras.ItemDropDef; +import org.rscdaemon.server.util.DataConversions; + +/** + * Quest: Christmas! (v1.0) 8/1/2009 + * Status: COMPLETE + * Start: Santa (id 798), 290,464 + * NPCs: Farrel (id 799), 106,670 + * 1st Elf (id 800), 71,589 + * 2nd Elf (id 800), 656,467 + * 3rd Elf (id 800), 403,685 + * Evil wizard (id 801), 279,454 + * Items: Santa hat (id 971), Santa top (id 1315), Santa legs (id 1314), Candy cane (id 1316), + * Toy 1 (id 1317), Toy 2 (id 1318), Toy 3 (id 1319), Toy 4 (id 1320), Gift box (id 1321) + * Reward: 0 quest points, Magic Gift Box (id 1321) (random item inside) + * + * @author punKrockeR + */ +public class Christmas extends Quest +{ + private static final int SANTA_ID = 798; + private static final int FARREL_ID = 799; + private static final int ELF_ID = 800; + private static final int DARKWIZ_ID = 801; + private static final int SANTA_HAT_ID = 971; + private static final int SANTA_TOP_ID = 1315; + private static final int SANTA_LEG_ID = 1314; + private static final int CANDY_CANE_ID = 1316; + private static final int TOY1_ID = 1317; + private static final int TOY2_ID = 1318; + private static final int TOY3_ID = 1319; + private static final int TOY4_ID = 1320; + private static final int GIFT_ID = 1321; + private static final int DEFAULT_DELAY = 3200; + private static final int QUEST_POINTS = 0; + private World world = World.getWorld(); + private static final ItemDropDef[] BOX_ITEMS = new ItemDropDef[] + { + new ItemDropDef(155, 1, 3200), // Coal, 32% + new ItemDropDef(SANTA_HAT_ID, 1, 799), // Santa hat, 7.99% + new ItemDropDef(SANTA_TOP_ID, 1, 2000), // Santa top, 20% + new ItemDropDef(SANTA_LEG_ID, 1, 2000), // Santa legs, 20% + new ItemDropDef(CANDY_CANE_ID, 1, 2000), // Candy cane, 20% + new ItemDropDef(575, 1, 1) // Christmas cracker, 0.01% + }; + + /** + * @return the quest's name + */ + public String getName() + { + return "Christmas!"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 5; + } + + /** + * Initialises the quest + */ + public void init() + { + associateNpc(SANTA_ID); + associateNpc(FARREL_ID); + associateNpc(ELF_ID); + associateNpc(DARKWIZ_ID); + associateItem(TOY1_ID); + associateItem(TOY2_ID); + associateItem(TOY3_ID); + associateItem(TOY4_ID); + associateItem(GIFT_ID); + } + + /** + * @return if the given NPC is visible to the player + */ + public boolean isNpcVisible(Npc npc, Player player) + { + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + + return true; + } + + /** + * @return if the given item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) + { + if(item.getID() == TOY1_ID) + return player.getQuestStage(this) >= 2; + else + if(item.getID() == TOY2_ID) + return player.getQuestStage(this) >= 4; + else + if(item.getID() == TOY3_ID) + return player.getQuestStage(this) >= 6; + else + if(item.getID() == TOY4_ID) + return player.getQuestStage(this) >= 7; + + return true; + } + + /** + * @return if the player has the given item in his inventory, bank or if it's on the ground somewhere + */ + public boolean hasItem(Player player, int id) + { + if(player.getInventory().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy!"); + return true; + } + + if(player.getBank().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy in your bank!"); + return true; + } + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, 20); + for(int x = 0; x < tiles.length; x++) + { + for(int y = 0; y < tiles[x].length; y++) + { + ActiveTile t = tiles[x][y]; + if(t != null) + { + for(Item i : t.getItems()) + { + if(i.getID() == id) + { + if(i.getOwner().equals(player)) + { + player.getActionSender().sendMessage("You already have this elf's toy nearby on the ground!"); + return true; + } + } + } + } + } + } + + player.getActionSender().sendMessage("The toy falls to the ground"); + return false; + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.USED_ITEM) + { + if(!(args[0] instanceof InvItem)) + return; + + final InvItem item = (InvItem)args[0]; + + handleUseItem(item, player); + } else + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == SANTA_ID) + { + player.setBusy(true); + + if(stage == -1) + startQuest(player, npc); + else + handleSantaTalk(player, npc); + } else + if(npc.getID() == FARREL_ID) + { + player.setBusy(true); + handleFarrelTalk(player, npc); + } else + if(npc.getID() == ELF_ID) + { + player.setBusy(true); + handleElfTalk(player, npc); + } + else + if(npc.getID() == DARKWIZ_ID) + { + player.setBusy(true); + handleWizardTalk(player, npc); + } + } else + if(action == action.KILLED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == ELF_ID) // If the player doesn't have the toy in their bank or inventory, drop the toy. + { + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + } + } + } + + /** + * Handles item use + */ + private void handleUseItem(final InvItem item, final Player player) + { + if(item.getID() == GIFT_ID) + { + player.setBusy(true); + player.getActionSender().sendMessage("You open the " + item.getDef().getName() + "..."); + sleep(2000); + int total = 0; + for(ItemDropDef drop : BOX_ITEMS) + total += drop.getWeight(); + + int hit = DataConversions.random(0, total); + total = 0; + ItemDropDef reward = null; + for(ItemDropDef drop : BOX_ITEMS) + { + if(hit >= total && hit < (total + drop.getWeight())) + { + reward = drop; + break; + } + + total += drop.getWeight(); + } + + player.getInventory().remove(GIFT_ID, 1); + if(reward == null) + player.getActionSender().sendMessage("You don't get shit! (reward is null)"); + else + player.getInventory().add(new InvItem(reward.getID(), reward.getAmount())); + + player.getActionSender().sendMessage("It contained a " + ((reward.getAmount() > 1) ? reward.getAmount() : "a ") + EntityHandler.getItemDef(reward.getID()).getName() + (reward.getAmount() > 1 ? "s" : "") + "!"); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + } else + player.setBusy(false); + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + player.setBusy(true); + sendChat("Christmas! It's ruined!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Why?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The presents... they're gone!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What presents? Gone where?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("All my Christmas presents have been stolen!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Who stole them?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "My own elves!", + "I landed here last night in my sleigh", + "To deliver my presents to the citizens of this land", + "But an evil Dark Knight wizard cast a spell on my Elves", + "And they stole my presents and ran away!" + ); + player.setBusy(false); + int option = getMenuOption(player, "That sucks", "Where are they now?", "Good luck with that"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Indeed it does!", npc, player); + player.setBusy(false); + npc.unblock(); + } else + if(option == 1) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I don't know. But one of the elves, Farrel, he's in Lumbridge", + "It appears the spell didn't affect him", + "But he's in hiding from the other elves who have turned evil!", + "And I'm afraid the spell is quite irreversible" + ); + player.setBusy(false); + option = getMenuOption(player, "Maybe I can help?", "Christmas really is ruined then"); + if(option == -1) + return; + player.setBusy(true); + sleep(2000); + if(option == 0) + { + if(player.getQuestPoints() < 2) + { + sendChat("I doubt it, you don't have a very good reputation for helping people", npc, player); + player.setBusy(false); + npc.unblock(); + sleep(2000); + player.getActionSender().sendMessage("You need at least 2 Quest Points to start this quest"); + } else + { + queueChat(npc, player, DEFAULT_DELAY, + "Perhaps you can... I don't know where the others are", + "But if you can find Farrel, he can help you find them", + "All I know is that he's in Lumbridge", + "He said he's hiding near a church", + "Please find him and help me save Christmas!" + ); + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("I'm afraid so!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Oh, I'll need it!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles Santa's chat if the quest is started but not finished + */ + private void handleSantaTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("Merry christmas, hero!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) != 7) + { + sendChat("Oh, " + player.getUsername() + ". Please find those elves!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + { + if(!player.getInventory().hasItemId(TOY1_ID) || !player.getInventory().hasItemId(TOY2_ID) || !player.getInventory().hasItemId(TOY3_ID) || !player.getInventory().hasItemId(TOY4_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Farrel said you'd collected the toys", + "Please bring them all to me as soon as possible!" + ); + npc.unblock(); + player.setBusy(false); + return; + } + + queueChat(npc, player, DEFAULT_DELAY, + player.getUsername() + "! I can't express my gratitude with words", + "You saved Christmas for your land!", + "I don't have anything I can spare for you", + "But I can give you your present early", + "It's a magic gift box. The item within is unknown", + "I hope you get something fantastic!", + "You deserve it for your heroic antics.", + "Farewell kind " + (player.isMale() ? "sir" : "lady") + "! And meeeeery christmas!" + ); + + player.getActionSender().sendMessage("Santa takes the toys and hands you a small gift box"); + if(player.getInventory().remove(TOY1_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY2_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY3_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY4_ID, 1) == -1) { player.setBusy(false); return; } + player.getInventory().add(new InvItem(GIFT_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), COMPLETE); + sleep(2500); + player.getActionSender().sendMessage("Maybe I should go and talk to that Evil Dark Knight Wizard..."); + } + } + + /** + * Handles Farrel's chat if the quest is started but not finished + */ + private void handleFarrelTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == -1) + { + sendChat("Bugger off", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) == 1) + { + player.setBusy(true); + sendChat("Who are you?", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Santa sent me to find you", player, npc); + sleep(DEFAULT_DELAY); + sendChat("What for?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "To murder you", "To help"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Go for it. It's only a matter of time before they find me anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Well if Santa trusts you, I guess I can.", + "We must get started at once if we're to find the others." + ); + player.setBusy(false); + option = getMenuOption(player, "Any idea where they are?", "Maybe later"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "One of them ran to the desert nearby", + "I don't know where he's hiding, but we hate the heat", + "He must be hiding near cliffs or rocks that offer shade", + "You know this land better than I", + "It would be safer for all involved if you went, and not me" + + ); + player.setBusy(false); + option = getMenuOption(player, "I agree", "Pussy"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Excellent. He should be carrying a small " + EntityHandler.getItemDef(TOY1_ID).getName(), + "Get it and bring it to me. Use any means necessary. Any.", + "My comrades cannot be saved now." + ); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 2); + } else // No + { + sendChat("Santa's trust was misplaced. Christmas is truly ruined.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("There won't be a \"later\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 2) + { + sendChat("Have you found the first toy?", npc, player); + sleep(2000); + player.setBusy(false); + int option = getMenuOption(player, "Not yet", "Yeah"); + if(option == -1) + return; + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Well please act quickly. Time is running out! Remember, he's in the desert", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + if(player.getInventory().hasItemId(TOY1_ID)) + { + sendChat("Great! Please, hand it to me", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY1_ID).getName()); + player.setQuestStage(getUniqueID(), 3); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY1_ID, 1); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage3(npc, player); + } else + { + sendChat("No you haven't. Please don't fool around. Time is running out!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 3) + { + questStage3(npc, player); + } else + if(player.getQuestStage(this) == 4) + { + sendChat("Have you found the second toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Right on brother", "No"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + if(player.getInventory().hasItemId(TOY2_ID)) + { + sendChat("I don't know what that means, but please hand me the toy", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY2_ID).getName()); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY2_ID, 1); + player.setQuestStage(getUniqueID(), 5); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage5(npc, player); + } else + { + sendChat("I don't know what that means, but you don't have the toy", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Please hurry. Christmas is almost over!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // Yes + { + sendChat("Well please hurry. Christmas is almost over! Remember, \"Baxtorian Falls\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + if(player.getQuestStage(this) == 5) + { + questStage5(npc, player); + } else + if(player.getQuestStage(this) == 6) // Final present + { + sendChat("Did you get izzy's toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + if(player.getInventory().hasItemId(TOY3_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you so much, " + player.getUsername(), + "You single-handedly saved Christmas.", + "The elves at the north pole will write songs of you hero", + "You will be respected and remembered forever, believe me.", + "The final present, I have kept all along", + "Here, you take all four presents and give them to santa", + "I'll tell him of your bravery", + "I'm sure he'll want to reward you", + "Farewell, " + player.getUsername() + ".", + "Merry christmas." + ); + player.getActionSender().sendMessage("Farrel hands you the three toys"); + player.getInventory().add(new InvItem(TOY1_ID, 1)); + player.getInventory().add(new InvItem(TOY2_ID, 1)); + //player.getInventory().add(new InvItem(TOY3_ID, 1)); + player.getInventory().add(new InvItem(TOY4_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 7); + } else + { + sendChat("No you don't.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Remember, flames and lava and the ocean are Izzy's favourite things", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("Please get it. Don't hesitate just because he's my brother.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Hey there, " + player.getUsername() + "!", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 3 chat + */ + private void questStage3(final Npc npc, final Player player) + { + sendChat("So what now?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "While you were gone, I did some reconnaissance work", + "I overheard some humans talking about a deranged Elf they saw while sightseeing" + ); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "A place called the \"Baxtorian Falls\". Somewhere near a gnome stronghold.", + "It's not much of a lead, but it's all we've got" + ); + sendChat("I'll get on it then", player, npc); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 4); + } else // No + { + sendChat("Suit yourself, grinch.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 5 chat + */ + private void questStage5(final Npc npc, final Player player) + { + sendChat("What's next little guy?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("Don't patronize me, " + player.getUsername() + ". I'm stronger in ways you can't even imagine", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well I'll take your word for it. Where's the last elf?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I don't know.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What? Not even a clue?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I'm afraid you'll have to find izzy on your own", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Izzy? That's his name?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The last toy to get is a " + EntityHandler.getItemDef(TOY3_ID).getName() + ". Izzy took that one.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well did you know him very well? Where's somewhere he's likely to go?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I knew him very well.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("He was my younger brother.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("I'm sorry, farrel.", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "What he's become... he's not my brother anymore", + "All I know that might help you is that, unlike the rest of us", + "Izzy loved the heat. Flames, lava, that sort of thing", + "And he also loved the ocean. You know this land", + "Take what little information I have to offer", + "And find my brother. Get the last toy back." + ); + player.setBusy(false); + int option = getMenuOption(player, "Of course, Farrel", "No. I refuse to murder your brother", "I've had enough of this"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you dearly, " + player.getUsername(), + "Good luck. Please, make his death quick." + ); + player.setQuestStage(getUniqueID(), 6); + player.setBusy(false); + npc.unblock(); + } else // No + { + sendChat("Then the death of Christmas is on your conscience.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles talking to the evil elves + */ + private void handleElfTalk(final Player player, final Npc npc) + { + sendChat("Get out of my way tall one", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } + + /** + * Handles talking to the evil wizard + */ + private void handleWizardTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("You! You thwarted my plans!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Christmas is for everyone! Why do you want to stop it?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "None of your business, fiend! I'm going to send you back in time", + "To before you ruined my plans!" + ); + player.setBusy(false); + int option = getMenuOption(player, "Please don't!", "Give it your best shot"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + queueChat(npc, player, DEFAULT_DELAY, + "Bah! It makes no difference anyway", + "I have more important things to ruin" + ); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I will!", + "Muahahaha!" + ); + player.getActionSender().sendTeleBubble(player.getLocation().getX(), player.getLocation().getY(), false); + player.getActionSender().sendSound("spellfail"); + player.teleport(289, 459, true); + sleep(DEFAULT_DELAY); + player.getActionSender().sendTeleBubble(289, 459, false); + sendChat("Huh? What? Where am i?", player, npc); + player.setQuestStage(getUniqueID(), -1); + npc.unblock(); + sleep(DEFAULT_DELAY); + player.setBusy(false); + if(player.getInventory().hasItemId(TOY1_ID) || player.getInventory().hasItemId(TOY2_ID) || player.getInventory().hasItemId(TOY3_ID) || player.getInventory().hasItemId(TOY4_ID) || player.getInventory().hasItemId(GIFT_ID)) + player.getActionSender().sendMessage("Santa's presents are unaffected by the Wizard's spell!"); + } + } else + { + sendChat("Hahaha! You may call me, the grinch! Bahaha!", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("He really does look quite insane"); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Construct the quest (empty) + */ + public Christmas() + { + } +} diff --git a/GameServer/conf/server/quests_back/Christmas.java.doc b/GameServer/conf/server/quests_back/Christmas.java.doc new file mode 100644 index 0000000..5aad67c --- /dev/null +++ b/GameServer/conf/server/quests_back/Christmas.java.doc @@ -0,0 +1,859 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; +import org.rscdaemon.server.entityhandling.defs.extras.ItemDropDef; +import org.rscdaemon.server.util.DataConversions; + +/** + * Quest: Christmas! (v1.0) 8/1/2009 + * Status: COMPLETE + * Start: Santa (id 798), 290,464 + * NPCs: Farrel (id 799), 106,670 + * 1st Elf (id 800), 71,589 + * 2nd Elf (id 800), 656,467 + * 3rd Elf (id 800), 403,685 + * Evil wizard (id 801), 279,454 + * Items: Santa hat (id 971), Santa top (id 1315), Santa legs (id 1314), Candy cane (id 1316), + * Toy 1 (id 1317), Toy 2 (id 1318), Toy 3 (id 1319), Toy 4 (id 1320), Gift box (id 1321) + * Reward: 0 quest points, Magic Gift Box (id 1321) (random item inside) + * + * @author punKrockeR + */ +public class Christmas extends Quest +{ + /* Here we define things which will be used in the quest, NPCs Items etc. You don't have to give the NPCs and Items a variable name but it is easier if you do and concidered 'proper' to do so. */ + private static final int SANTA_ID = 798; + private static final int FARREL_ID = 799; + private static final int ELF_ID = 800; + private static final int DARKWIZ_ID = 801; + private static final int SANTA_HAT_ID = 971; + private static final int SANTA_TOP_ID = 1315; + private static final int SANTA_LEG_ID = 1314; + private static final int CANDY_CANE_ID = 1316; + private static final int TOY1_ID = 1317; + private static final int TOY2_ID = 1318; + private static final int TOY3_ID = 1319; + private static final int TOY4_ID = 1320; + private static final int GIFT_ID = 1321; + private static final int DEFAULT_DELAY = 3200; // The default delay between chat messages, in miliseconds. + private static final int QUEST_POINTS = 0; // The amount of quest points the quest will give + /* + * private static final int REWARD_XP = 500; // Amount of XP which is given as a reward + */ + private World world = World.getWorld(); // You must include this + private static final ItemDropDef[] BOX_ITEMS = new ItemDropDef[] + { + new ItemDropDef(155, 1, 3200), // Coal, 42% + new ItemDropDef(SANTA_HAT_ID, 1, 799), // Santa hat, 2.99% + new ItemDropDef(SANTA_TOP_ID, 1, 2000), // Santa top, 20% + new ItemDropDef(SANTA_LEG_ID, 1, 2000), // Santa legs, 20% + new ItemDropDef(CANDY_CANE_ID, 1, 2000), // Candy cane, 15% + new ItemDropDef(575, 1, 1) // Christmas cracker, 0.01% + }; + + /** + * @return the quest's name + */ + public String getName() + { + return "Christmas!"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 5; + } + + /** + * Initialises the quest + * Here we associate all the NPCs, Items, GameObjects and such. It is imperative that you do this. + */ + public void init() + { + associateNpc(SANTA_ID); + associateNpc(FARREL_ID); + associateNpc(ELF_ID); + associateNpc(DARKWIZ_ID); + associateItem(TOY1_ID); + associateItem(TOY2_ID); + associateItem(TOY3_ID); + associateItem(TOY4_ID); + associateItem(GIFT_ID); + } + + /** + * @return if the given NPC is visible to the player + * This function is just an example of what can be done, it is unlikely you will need to use it and if you don't, obviously do not include it in your code. + */ + public boolean isNpcVisible(Npc npc, Player player) + { + + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 594) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 72 && npc.getLoc().startY() == 585) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 653 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 419 && npc.getLoc().startY() == 684) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 408 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + + return true; + } + + /** + * @return if the given item is visible to the player + * Same as the above function. + */ + public boolean isItemVisible(Item item, Player player) + { + if(item.getID() == TOY1_ID) + return player.getQuestStage(this) >= 2; + else + if(item.getID() == TOY2_ID) + return player.getQuestStage(this) >= 4; + else + if(item.getID() == TOY3_ID) + return player.getQuestStage(this) >= 6; + else + if(item.getID() == TOY4_ID) + return player.getQuestStage(this) >= 7; + + return true; + } + + /** + * @return if the player has the given item in his inventory, bank or if it's on the ground somewhere + * And again. + */ + public boolean hasItem(Player player, int id) + { + if(player.getInventory().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy!"); + return true; + } + + if(player.getBank().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy in your bank!"); + return true; + } + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, 20); + for(int x = 0; x < tiles.length; x++) + { + for(int y = 0; y < tiles[x].length; y++) + { + ActiveTile t = tiles[x][y]; + if(t != null) + { + for(Item i : t.getItems()) + { + if(i.getID() == id) + { + if(i.getOwner().equals(player)) + { + player.getActionSender().sendMessage("You already have this elf's toy nearby on the ground!"); + return true; + } + } + } + } + } + } + + player.getActionSender().sendMessage("The toy falls to the ground"); + return false; + } + + /** + * Handles the given quest action + * You will use this function for every quest, the arguments must be the same. + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.USED_ITEM) + { + if(!(args[0] instanceof InvItem)) + return; + + final InvItem item = (InvItem)args[0]; + + handleUseItem(item, player); + } else + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == SANTA_ID) + { + player.setBusy(true); + + if(stage == -1) + startQuest(player, npc); + else + handleSantaTalk(player, npc); + } else + if(npc.getID() == FARREL_ID) + { + player.setBusy(true); + handleFarrelTalk(player, npc); + } else + if(npc.getID() == ELF_ID) + { + player.setBusy(true); + handleElfTalk(player, npc); + } + else + if(npc.getID() == DARKWIZ_ID) + { + player.setBusy(true); + handleWizardTalk(player, npc); + } + } else + if(action == action.KILLED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == ELF_ID) // If the player doesn't have the toy in their bank or inventory, drop the toy. + { + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 594 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 72 && npc.getLoc().startY() == 585 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 653 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 419 && npc.getLoc().startY() == 684 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 408 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + } + } + } + + /** + * Handles item use + */ + private void handleUseItem(final InvItem item, final Player player) + { + if(item.getID() == GIFT_ID) + { + player.setBusy(true); + player.getActionSender().sendMessage("You open the " + item.getDef().getName() + "..."); + sleep(2000); + int total = 0; + for(ItemDropDef drop : BOX_ITEMS) + total += drop.getWeight(); + + int hit = DataConversions.random(0, total); + total = 0; + ItemDropDef reward = null; + for(ItemDropDef drop : BOX_ITEMS) + { + if(hit >= total && hit < (total + drop.getWeight())) + { + reward = drop; + break; + } + + total += drop.getWeight(); + } + + player.getInventory().remove(GIFT_ID, 1); + if(reward == null) + player.getActionSender().sendMessage("You don't get shit! (reward is null)"); + else + player.getInventory().add(new InvItem(reward.getID(), reward.getAmount())); + + player.getActionSender().sendMessage("It contained a " + ((reward.getAmount() > 1) ? reward.getAmount() : "a ") + EntityHandler.getItemDef(reward.getID()).getName() + (reward.getAmount() > 1 ? "s" : "") + "!"); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + } else + player.setBusy(false); + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + player.setBusy(true); + sendChat("Christmas! It's ruined!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Why?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The presents... they're gone!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What presents? Gone where?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("All my Christmas presents have been stolen!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Who stole them?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "My own elves!", + "I landed here last night in my sleigh", + "To deliver my presents to the citizens of this land", + "But an evil Dark Knight wizard cast a spell on my Elves", + "And they stole my presents and ran away!" + ); + player.setBusy(false); + int option = getMenuOption(player, "That sucks", "Where are they now?", "Good luck with that"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Indeed it does!", npc, player); + player.setBusy(false); + npc.unblock(); + } else + if(option == 1) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I don't know. But one of the elves, Farrel, he's in Lumbridge", + "It appears the spell didn't affect him", + "But he's in hiding from the other elves who have turned evil!", + "And I'm afraid the spell is quite irreversible" + ); + player.setBusy(false); + option = getMenuOption(player, "Maybe I can help?", "Christmas really is ruined then"); + if(option == -1) + return; + player.setBusy(true); + sleep(2000); + if(option == 0) + { + if(player.getQuestPoints() < 2) + { + sendChat("I doubt it, you don't have a very good reputation for helping people", npc, player); + player.setBusy(false); + npc.unblock(); + sleep(2000); + player.getActionSender().sendMessage("You need at least 2 Quest Points to start this quest"); + } else + { + queueChat(npc, player, DEFAULT_DELAY, + "Perhaps you can... I don't know where the others are", + "But if you can find Farrel, he can help you find them", + "All I know is that he's in Lumbridge", + "He said he's hiding near a church", + "Please find him and help me save Christmas!" + ); + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("I'm afraid so!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Oh, I'll need it!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles Santa's chat if the quest is started but not finished + */ + private void handleSantaTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("Merry christmas, hero!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) != 7) + { + sendChat("Oh, " + player.getUsername() + ". Please find those elves!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + { + if(!player.getInventory().hasItemId(TOY1_ID) || !player.getInventory().hasItemId(TOY2_ID) || !player.getInventory().hasItemId(TOY3_ID) || !player.getInventory().hasItemId(TOY4_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Farrel said you'd collected the toys", + "Please bring them all to me as soon as possible!" + ); + npc.unblock(); + player.setBusy(false); + return; + } + + queueChat(npc, player, DEFAULT_DELAY, + player.getUsername() + "! I can't express my gratitude with words", + "You saved Christmas for your land!", + "I don't have anything I can spare for you", + "But I can give you your present early", + "It's a magic gift box. The item within is unknown", + "I hope you get something fantastic!", + "You deserve it for your heroic antics.", + "Farewell kind " + (player.isMale() ? "sir" : "lady") + "! And meeeeery christmas!" + ); + + player.getActionSender().sendMessage("Santa takes the toys and hands you a small gift box"); + if(player.getInventory().remove(TOY1_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY2_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY3_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY4_ID, 1) == -1) { player.setBusy(false); return; } + player.getInventory().add(new InvItem(GIFT_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), COMPLETE); + sleep(2500); + player.getActionSender().sendMessage("Maybe I should go and talk to that Evil Dark Knight Wizard..."); + } + } + + /** + * Handles Farrel's chat if the quest is started but not finished + */ + private void handleFarrelTalk(final Player player, final Npc npc) + { + player.setBusy(true); + if(player.getQuestStage(this) == -1) + { + sendChat("Bugger off", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) == 1) + { + player.setBusy(true); + sendChat("Who are you?", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Santa sent me to find you", player, npc); + sleep(DEFAULT_DELAY); + sendChat("What for?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "To murder you", "To help"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Go for it. It's only a matter of time before they find me anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Well if Santa trusts you, I guess I can.", + "We must get started at once if we're to find the others." + ); + player.setBusy(false); + option = getMenuOption(player, "Any idea where they are?", "Maybe later"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "One of them ran to the desert nearby", + "I don't know where he's hiding, but we hate the heat", + "He must be hiding near cliffs or rocks that offer shade", + "You know this land better than I", + "It would be safer for all involved if you went, and not me" + + ); + player.setBusy(false); + option = getMenuOption(player, "I agree", "Pussy"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Excellent. He should be carrying a small " + EntityHandler.getItemDef(TOY1_ID).getName(), + "Get it and bring it to me. Use any means necessary. Any.", + "My comrades cannot be saved now." + ); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 2); + } else // No + { + sendChat("Santa's trust was misplaced. Christmas is truly ruined.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("There won't be a \"later\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 2) + { + sendChat("Have you found the first toy?", npc, player); + sleep(2000); + player.setBusy(false); + int option = getMenuOption(player, "Not yet", "Yeah"); + if(option == -1) + return; + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Well please act quickly. Time is running out! Remember, he's in the desert", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + if(player.getInventory().hasItemId(TOY1_ID)) + { + sendChat("Great! Please, hand it to me", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY1_ID).getName()); + player.setQuestStage(getUniqueID(), 3); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY1_ID, 1); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage3(npc, player); + } else + { + sendChat("No you haven't. Please don't fool around. Time is running out!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 3) + { + questStage3(npc, player); + } else + if(player.getQuestStage(this) == 4) + { + sendChat("Have you found the second toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Right on brother", "No"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + if(player.getInventory().hasItemId(TOY2_ID)) + { + sendChat("I don't know what that means, but please hand me the toy", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY2_ID).getName()); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY2_ID, 1); + player.setQuestStage(getUniqueID(), 5); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage5(npc, player); + } else + { + sendChat("I don't know what that means, but you don't have the toy", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Please hurry. Christmas is almost over!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // Yes + { + sendChat("Well please hurry. Christmas is almost over! Remember, \"Baxtorian Falls\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + if(player.getQuestStage(this) == 5) + { + questStage5(npc, player); + } else + if(player.getQuestStage(this) == 6) // Final present + { + player.setBusy(true); + sendChat("Did you get izzy's toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + if(player.getInventory().hasItemId(TOY3_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you so much, " + player.getUsername(), + "You single-handedly saved Christmas.", + "The elves at the north pole will write songs of you hero", + "You will be respected and remembered forever, believe me.", + "The final present, I have kept all along", + "Here, you take all four presents and give them to santa", + "I'll tell him of your bravery", + "I'm sure he'll want to reward you", + "Farewell, " + player.getUsername() + ".", + "Merry christmas." + ); + player.getActionSender().sendMessage("Farrel hands you the three toys"); + if(player.getInventory().hasItemId(TOY1_ID)) { sendChat("Oh... You already have the toys.", npc, player); player.setBusy(false); return; } + player.getInventory().add(new InvItem(TOY1_ID, 1)); + player.getInventory().add(new InvItem(TOY2_ID, 1)); + //player.getInventory().add(new InvItem(TOY3_ID, 1)); + player.getInventory().add(new InvItem(TOY4_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 7); + } else + { + sendChat("No you don't.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Remember, flames and lava and the ocean are Izzy's favourite things", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("Please get it. Don't hesitate just because he's my brother.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Hey there, " + player.getUsername() + "!", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 3 chat + */ + private void questStage3(final Npc npc, final Player player) + { + sendChat("So what now?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "While you were gone, I did some reconnaissance work", + "I overheard some humans talking about a deranged Elf they saw while sightseeing" + ); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "A place called the \"Baxtorian Falls\". Somewhere near a gnome stronghold.", + "It's not much of a lead, but it's all we've got" + ); + sendChat("I'll get on it then", player, npc); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 4); + } else // No + { + sendChat("Suit yourself, grinch.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 5 chat + */ + private void questStage5(final Npc npc, final Player player) + { + sendChat("What's next little guy?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("Don't patronize me, " + player.getUsername() + ". I'm stronger in ways you can't even imagine", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well I'll take your word for it. Where's the last elf?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I don't know.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What? Not even a clue?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I'm afraid you'll have to find izzy on your own", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Izzy? That's his name?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The last toy to get is a " + EntityHandler.getItemDef(TOY3_ID).getName() + ". Izzy took that one.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well did you know him very well? Where's somewhere he's likely to go?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I knew him very well.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("He was my younger brother.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("I'm sorry, farrel.", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "What he's become... he's not my brother anymore", + "All I know that might help you is that, unlike the rest of us", + "Izzy loved the heat. Flames, lava, that sort of thing", + "And he also loved the ocean. You know this land", + "Take what little information I have to offer", + "And find my brother. Get the last toy back." + ); + player.setBusy(false); + int option = getMenuOption(player, "Of course, Farrel", "No. I refuse to murder your brother", "I've had enough of this"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you dearly, " + player.getUsername(), + "Good luck. Please, make his death quick." + ); + player.setQuestStage(getUniqueID(), 6); + player.setBusy(false); + npc.unblock(); + } else // No + { + sendChat("Then the death of Christmas is on your conscience.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles talking to the evil elves + */ + private void handleElfTalk(final Player player, final Npc npc) + { + sendChat("Get out of my way tall one", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } + + /** + * Handles talking to the evil wizard + */ + private void handleWizardTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("You! You thwarted my plans!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Christmas is for everyone! Why do you want to stop it?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "None of your business, fiend! I'm going to send you back in time", + "To before you ruined my plans!" + ); + player.setBusy(false); + int option = getMenuOption(player, "Please don't!", "Give it your best shot"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + queueChat(npc, player, DEFAULT_DELAY, + "Bah! It makes no difference anyway", + "I have more important things to ruin" + ); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I will!", + "Muahahaha!" + ); + player.getActionSender().sendTeleBubble(player.getLocation().getX(), player.getLocation().getY(), false); + player.getActionSender().sendSound("spellfail"); + player.teleport(289, 459, true); + sleep(DEFAULT_DELAY); + player.getActionSender().sendTeleBubble(289, 459, false); + sendChat("Huh? What? Where am i?", player, npc); + player.setQuestStage(getUniqueID(), -1); + npc.unblock(); + sleep(DEFAULT_DELAY); + player.setBusy(false); + if(player.getInventory().hasItemId(TOY1_ID) || player.getInventory().hasItemId(TOY2_ID) || player.getInventory().hasItemId(TOY3_ID) || player.getInventory().hasItemId(TOY4_ID) || player.getInventory().hasItemId(GIFT_ID)) + player.getActionSender().sendMessage("Santa's presents are unaffected by the Wizard's spell!"); + } + } else + { + sendChat("Hahaha! You may call me, the grinch! Bahaha!", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("He really does look quite insane"); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Construct the quest (empty) + */ + public Christmas() + { + } +} diff --git a/GameServer/conf/server/quests_back/CooksAssistant.java b/GameServer/conf/server/quests_back/CooksAssistant.java new file mode 100644 index 0000000..65622d1 --- /dev/null +++ b/GameServer/conf/server/quests_back/CooksAssistant.java @@ -0,0 +1,332 @@ +import msc.gs.Instance; import msc.gs.event.SingleEvent; +import msc.gs.Instance; import msc.gs.model.MenuHandler; +import msc.gs.Instance; import msc.gs.model.Npc; +import msc.gs.Instance; import msc.gs.model.Player; +import msc.gs.Instance; import msc.gs.quest.Quest; +import msc.gs.Instance; import msc.gs.quest.QuestAction; + +/** + * Quest: Cook's Assistant (v1.0) Status: COMPLETE Start: Lumbridge cook (id 7) + * Items: 19, 136, 22 Reward: 1 quest point, 350 cooking xp + * + * @author youKnowWho + */ +public class CooksAssistant extends Quest { + private static final int COOK_ID = 7; + private static final int ITEM_EGG = 19; + private static final int ITEM_FLOUR = 136; + private static final int ITEM_MILK = 22; + private static final int REWARD_XP = 350; + private static final String[] FIRST_MENU = new String[] { "Oh, ok, sorry.", + "Well maybe I can help?" }; + private static final String[] SECOND_MENU = new String[] { + "Sure, what do you need?", "No, sorry" }; + private static final int QUEST_POINTS = 1; + + public void init() { + associateNpc(COOK_ID); + } + + public CooksAssistant() { + } + + public String getName() { + return "Cook's Assistant"; + } + + public int getUniqueID() { + return 0; + } + + public void handleAction(QuestAction action, Object[] args, + final Player player) { + int stage = player.getQuestStage(this); + + if (stage == -1) // Quest hasn't been started + { + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Sorry, I can't talk right now, I'm very busy!", npc, + player); + + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) { + public void handleReply(final int option, + final String reply) { + player.setBusy(true); + switch (option) { + case 0: + player.setBusy(false); + npc.unblock(); + sendChat("Oh, ok, sorry.", player, npc); + break; + case 1: + sendChat("Well maybe I can help?", player, + npc); + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + sendChat( + "Perhaps you can... You see, it's the duke's birthday tomorrow", + npc, player); + addSingleEvent(new SingleEvent( + player, 2000) { + public void action() { + sendChat( + "And I haven't got the ingredients for his cake yet!", + npc, player); + addSingleEvent(new SingleEvent( + player, 2000) { + public void action() { + sendChat( + "Do you think you could collect them for me?", + npc, player); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + player + .setBusy(false); + player + .setMenuHandler(new MenuHandler( + SECOND_MENU) { + public void handleReply( + final int option, + final String reply) { + player + .setBusy(true); + switch (option) { + case 0: + sendChat( + "Sure, what do you need?", + player, + npc); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + sendChat( + "Oh thank you so much! I'm going to need an egg, some milk and a pot of flour.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + sendChat( + "Please, hurry!", + npc, + player); + player + .setQuestStage( + getUniqueID(), + 1); + player + .setBusy(false); + npc + .unblock(); + } + }); + } + }); + break; + case 1: + sendChat( + "No, sorry", + player, + npc); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + sendChat( + "Fine. I didn't want your help anyway.", + npc, + player); + player + .setBusy(false); + npc + .unblock(); + } + }); + break; + default: + player + .setBusy(false); + npc + .unblock(); + break; + } + } + }); + owner + .getActionSender() + .sendMenu( + SECOND_MENU); + } + }); + } + }); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(FIRST_MENU); + } + }); + } else + return; + } else if (stage == 1) { + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "Sorry, I can't - oh, it's you! Do you have the ingredients?", + npc, player); + + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(new String[] { + "I forgot what to get!", "Yes, i have them", + "No, not yet" }) { + public void handleReply(final int option, + final String reply) { + player.setBusy(true); + sendChat(reply, player, npc); + + if (option == 0) { + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + sendChat( + "I need an egg, a pot flour and some milk! And quickly!", + npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } else if (option == 1) { + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + // check items + if (player.getInventory() + .hasItemId(ITEM_EGG) + && player.getInventory() + .hasItemId( + ITEM_FLOUR) + && player.getInventory() + .hasItemId( + ITEM_MILK)) { + finishQuest(player, npc); + } else { + sendChat( + "No you don't! Oh please, don't get my hopes up like that!", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } else { + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + sendChat("Oh, please hurry!", npc, + player); + player.setBusy(false); + npc.unblock(); + } + }); + } + } + }); + + owner.getActionSender().sendMenu( + new String[] { "I forgot what to get!", + "Yes, i have them", "No, not yet" }); + } + }); + } + } else if (stage == 0) { + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "Oh hi " + + player.getUsername() + + ". Thanks for your help! I can't talk at the moment though.", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) { + sendChat("Oh, thank you so much " + player.getUsername() + "!", npc, + player); + + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + sendChat("I'm afraid don't have any money to reward you with", + npc, player); + addSingleEvent(new SingleEvent(player, 3000) { + public void action() { + sendChat("But I can give you some cooking tips!", npc, + player); + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + player.incExp(7, REWARD_XP, false); + player.getActionSender().sendStat(7); + player.setQuestStage(getUniqueID(), + Quest.COMPLETE); + player.getInventory().remove(ITEM_EGG, 1); + player.getInventory().remove(ITEM_MILK, 1); + player.getInventory().remove(ITEM_FLOUR, 1); + player.getActionSender().sendInventory(); + player.incQuestPoints(QUEST_POINTS); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } +} diff --git a/GameServer/conf/server/quests_back/Dorics_Quest.java.bk b/GameServer/conf/server/quests_back/Dorics_Quest.java.bk new file mode 100644 index 0000000..fa24707 --- /dev/null +++ b/GameServer/conf/server/quests_back/Dorics_Quest.java.bk @@ -0,0 +1,280 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; + +/** + * Quest: Doric's Quest (v1.0) + * Status: Complete + * Start: Doric (id 144), 325, 490 + * Items: 148x6, 150x4 & 151x2 + * Reward: 1 quest point, 180 gold, Mining experience (amount depends on your level) & the use of Doric.s Anvils * + * @author DvD + */ +public class Dorics_Quest extends Quest +{ + private final int DORIC_ID = 144; + private final int ITEM_CLAY = 149; + private final int ITEM_COPPER = 150; + private final int ITEM_IRON = 151; + private final int REWARD_XP = 200; + private final int REWARD_GP = 180; + private final String[] FIRST_MENU = new String[]{"Sure, what do I need to do?", "No thanks."}; + private final String[] SECOND_MENU = new String[]{"Sorry, I don't like the sound of that.", "I'd be happy to help."}; + + public void init() + { + associateNpc(DORIC_ID); + } + + public Dorics_Quest() + { + } + + public String getName() + { + return "Doric's Quest"; + } + + public int getUniqueID() + { + return 3; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(stage == -1) // Quest hasn't been started + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != DORIC_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Ay mate, Would you be interested in helping me make an amulet?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 0: + player.setBusy(false); + npc.unblock(); + sendChat("No thanks, I'm good.", player, npc); + break; + case 1: + sendChat("Sure, what do I need to do?", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("First you need to collect 6 Clay, 4 Copper ore & 2 Iron ore.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Then I.ll need you to bring them back to me.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I.m afraid you.ll have to find your own pickaxe though.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 0: + sendChat("Sure ! I.ll get right onto it.", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I.ll be waiting for those ores don.t take to long.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setQuestStage(getUniqueID(), 1); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + break; + case 1: + sendChat("Sorry, I don't like the sound of that.", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Suit yourself. Come and see me if you change your mind.", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(SECOND_MENU); + } + }); + } + }); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(FIRST_MENU); + } + }); + } else + return; + } else + if(stage == 1) + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != DORIC_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("There you are ! Do you have my ores?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(new String[]{"No sorry, Not yet.", "I sure do!"}) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + sendChat(reply, player, npc); + + if(option == 0) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Well, come and see me when you do. I need that amulet made", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } else + if(option == 1) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + //check items + if(player.getInventory().hasItemId(ITEM_CLAY) && player.getInventory().countId(ITEM_CLAY) >= 6) && player.getInventory().hasItemId(ITEM_COPPER) && player.getInventory().countId(ITEM_COPPER) >= 4) && player.getInventory().hasItemId(ITEM_IRON) && player.getInventory().countId(ITEM_IRON) >= 2) + { + finishQuest(player, npc); + } else + { + sendChat("Um, no you don't. Please hurry I need that amulet made.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } + } + }); + + owner.getActionSender().sendMenu(new String[]{"I'm afraid not.", "Yes, I do."}); + } + }); + } + } else + if (stage == 0) { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != DORIC_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hello " + player.getUsername() + "!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) + { + sendChat("Thank you so much my amulet is now complete, Here is your reward.", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.incExp(14, REWARD_XP, false); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.getInventory().add(new InvItem(10, REWARD_GP)); + player.getInventory().remove(ITEM_CLAY, 6); + player.getInventory().remove(ITEM_COPPER, 4); + player.getInventory().remove(ITEM_IRON, 2); + player.getActionSender().sendInventory(); + player.incQuestPoints(1); + player.setBusy(false); + npc.unblock(); + } + }); + } +} diff --git a/GameServer/conf/server/quests_back/ImpCatcher.java b/GameServer/conf/server/quests_back/ImpCatcher.java new file mode 100644 index 0000000..c91c9f2 --- /dev/null +++ b/GameServer/conf/server/quests_back/ImpCatcher.java @@ -0,0 +1,926 @@ +import msc.gs.Instance; import msc.gs.event.SingleEvent; +import msc.gs.Instance; import msc.gs.external.EntityHandler; +import msc.gs.Instance; import msc.gs.model.InvItem; +import msc.gs.Instance; import msc.gs.model.MenuHandler; +import msc.gs.Instance; import msc.gs.model.Npc; +import msc.gs.Instance; import msc.gs.model.Player; +import msc.gs.Instance; import msc.gs.quest.Quest; +import msc.gs.Instance; import msc.gs.quest.QuestAction; + + +/** + * Quest: Imp Catcher (v1.0) 5/1/2009 Status: COMPLETE Start: Talborn the wizard + * (id 17), 218, 1635 Items: 231, 232, 233, 234 Reward: 1 quest point, 350 magic + * xp + * + * @author punKrockeR + */ +public class ImpCatcher extends Quest { + private static final int TALBORN_ID = 17; + private static final int RED_BEAD = 231; + private static final int YELLOW_BEAD = 232; + private static final int BLACK_BEAD = 233; + private static final int WHITE_BEAD = 234; + private static final int ITEM_REWARD = 235; + private static final int REWARD_XP = 350; + private static final String[] FIRST_MENU = new String[] { + "No way you crazy bastard", "Sure, why not" }; + private static final String[] SECOND_MENU = new String[] { "Yeah I did", + "Not yet" }; + private static final int DEFAULT_EVENT_DELAY = 3200; + private static final int QUEST_POINTS = 1; + + /** + * @return the quest's name + */ + public String getName() { + return "Imp Catcher"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() { + return 3; + } + + /** + * Initialises the quest + */ + public void init() { + associateNpc(TALBORN_ID); + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, + final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != TALBORN_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + if (stage == -1) + startQuest(player, npc); + else + handleTalk(player, npc); + } + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) { + sendChat("...Avada kedavra!", npc, player); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + spellPlayer(player, npc); + addSingleEvent(new SingleEvent(player, 1000) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Holy shit!", player, npc); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "What? Huh? Get out of the way you fool!", + npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat("You shot me you stupid sod", + player, npc); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "Hmm, indeed. But it worked!", + npc, player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "Yeah it did. You burnt my sleeve.", + player, npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Collateral damage. A necessary casualty.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Your sleeve is expendable in this war", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "What war?", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Well the war against those nasty little imps of course", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Imps? What threat could they possibly pose?", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Those little bastards stole my beads!", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Riight.. your beads. And what's so special about these beads?", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Why, absolutely nothing. It's the principle of the matter.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Surely it can't be that hard to get them to give them back", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Oh really? Why don't you try and get them back then", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Yeah right, chase imps around for free. You're crazier than I thought", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Free? Nonsense. I'd be happy to reward you.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Hmm. What kind of reward?", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + player + .setBusy(true); + sendChat( + "I've got a few valuable things lying around, I'll find something.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + player + .setBusy(true); + sendChat( + "How about it? Would you help an old wizard out?", + npc, + player); + + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(false); + player + .setMenuHandler(new MenuHandler( + FIRST_MENU) { + public void handleReply( + final int option, + final String reply) { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + reply, + player, + npc); + + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + if (option == 1) { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Excellent! Begin at once if you wish to collect them within a decade", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "There are four beads! Red, white, black, yellow and black.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Ahh you said... nevermind", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "I'll come back when I get the beads...", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "If! If you get the beads. Don't underestimate the little beasts!", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Sure, whatever old man.", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + player + .setQuestStage( + getUniqueID(), + 1); + sendChat( + "Tarantallegra!", + npc, + player); + spellPlayer( + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Ouch! Would you bloody wait til I'm gone!", + player, + npc); + player + .setBusy(false); + npc + .unblock(); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Move it!", + npc, + player); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } else { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "Fine. But don't come to me when you need some pomegranate!", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Okaaay...", + player, + npc); + player + .setBusy(false); + npc + .unblock(); + } + }); + } + } + }); + } + }); + player + .getActionSender() + .sendMenu( + FIRST_MENU); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + + /** + * Handles npc chat if the quest is started but not finished + */ + private void handleTalk(final Player player, final Npc npc) { + player.setBusy(true); + npc.blockedBy(player); + sendChat("I know you. You're that fellow that stole my beads!", npc, + player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + npc.blockedBy(player); + sendChat( + "What? No, I'm the one that offered to find them for you.", + player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + npc.blockedBy(player); + sendChat( + "It makes no difference, I still don't like you.", + npc, player); + + if (player.getQuestStage(getUniqueID()) != COMPLETE) { + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc.blockedBy(player); + sendChat( + "But my beads, did you find them?", + npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(false); + npc.blockedBy(player); + player + .setMenuHandler(new MenuHandler( + SECOND_MENU) { + public void handleReply( + final int option, + final String reply) { + sendChat(reply, + player, npc); + if (option == 0) // Yes + { + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + if (player + .getInventory() + .hasItemId( + RED_BEAD) + && player + .getInventory() + .hasItemId( + YELLOW_BEAD) + && player + .getInventory() + .hasItemId( + BLACK_BEAD) + && player + .getInventory() + .hasItemId( + WHITE_BEAD)) { + sendChat( + "Excellent! Hand them over immediately", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Alright, calm down. I thought they were useless anyway", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Useless! Oh my dear " + + (player + .isMale() ? "boy" + : "girl") + + ", they are quite important", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + finishQuest( + player, + npc); + } + }); + } + }); + } + }); + } else { + sendChat( + "Bollocks! Don't return til you have them you fool", + npc, + player); + spellPlayer( + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Hey! Watch yourself old man", + player, + npc); + player + .setBusy(false); + npc + .unblock(); + } + }); + } + } + }); + } else // No + { + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Well what are you doing here then? Move it!", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + spellPlayer( + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Would you bugger off with the spells you mad fool!", + player, + npc); + player + .setBusy(false); + npc + .unblock(); + } + }); + } + }); + } + }); + } + } + }); + player.getActionSender().sendMenu( + SECOND_MENU); + } + }); + } + }); + } else { + player.setBusy(false); + npc.unblock(); + } + } + }); + } + }); + } + + /** + * Finishes the quest + */ + private void finishQuest(final Player player, final Npc npc) { + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage("You hand over the beads"); + player.getInventory().remove(YELLOW_BEAD, 1); + player.getInventory().remove(RED_BEAD, 1); + player.getInventory().remove(WHITE_BEAD, 1); + player.getInventory().remove(BLACK_BEAD, 1); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Alright, that's my half of the bargain.", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Now what of my reward?", player, npc); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "Ah, your reward. I found this! You can take it.", + npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + player + .getActionSender() + .sendMessage( + EntityHandler + .getNpcDef( + TALBORN_ID) + .getName() + + " gives you one " + + EntityHandler + .getItemDef( + ITEM_REWARD) + .getName()); + player.getInventory().add( + new InvItem(ITEM_REWARD, 1)); + player.getActionSender() + .sendInventory(); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "What am I supposed to do with this?", + player, npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(true); + npc.blockedBy(player); + sendChat( + "I don't know, whatever you like. I certainly don't want it", + npc, player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "And have a read of this book", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat( + "It'll teach you a thing or two about magic!", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + player + .getActionSender() + .sendMessage( + "You read the wizard's book"); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + player + .incExp( + 6, + REWARD_XP, + false); + player + .getActionSender() + .sendStat( + 6); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + player + .setBusy(true); + npc + .blockedBy(player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Now I have work to do! Leave my tower!", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + spellPlayer( + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Damnit! Gladly...", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setQuestStage( + getUniqueID(), + Quest.COMPLETE); + player + .incQuestPoints(QUEST_POINTS); + player + .setBusy(false); + npc + .unblock(); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + + /** + * Casts an imaginary spell at the player + */ + private void spellPlayer(Player player, Npc npc) { + player.setLastDamage(0); + player.informOfModifiedHits(player); + player.getActionSender().sendTeleBubble(npc.getLocation().getX(), + npc.getLocation().getY(), false); + player.getActionSender().sendSound("combat1a"); + } + + /** + * Construct the quest (empty) + */ + public ImpCatcher() { + } +} \ No newline at end of file diff --git a/GameServer/conf/server/quests_back/SheepShearer.java b/GameServer/conf/server/quests_back/SheepShearer.java new file mode 100644 index 0000000..47e3bab --- /dev/null +++ b/GameServer/conf/server/quests_back/SheepShearer.java @@ -0,0 +1,297 @@ +import msc.gs.Instance; import msc.gs.event.SingleEvent; +import msc.gs.Instance; import msc.gs.model.InvItem; +import msc.gs.Instance; import msc.gs.model.MenuHandler; +import msc.gs.Instance; import msc.gs.model.Npc; +import msc.gs.Instance; import msc.gs.model.Player; +import msc.gs.Instance; import msc.gs.quest.Quest; +import msc.gs.Instance; import msc.gs.quest.QuestAction; + +/** + * Quest: Sheep Shearer (v1.0) Status: COMPLETE Start: Fred the farmer (id 77), + * 159, 619 Items: 207x20 Reward: 1 quest point, 60 gold, Crafting 350 xp + * + * @author Konijn + */ +public class SheepShearer extends Quest { + private final int FRED_ID = 77; + private final int ITEM_WOOL = 207; + private final int REWARD_XP = 350; + private final int REWARD_GP = 330; + private final String[] FIRST_MENU = new String[] { + "Sure, what do I need to do?", "No thanks, I'm good." }; + private final String[] SECOND_MENU = new String[] { + "Sorry, I don't like the sound of that.", "I'd be happy to help." }; + + public void init() { + associateNpc(FRED_ID); + } + + public SheepShearer() { + } + + public String getName() { + return "Sheep Shearer"; + } + + public int getUniqueID() { + return 1; + } + + public void handleAction(QuestAction action, Object[] args, + final Player player) { + int stage = player.getQuestStage(this); + + if (stage == -1) // Quest hasn't been started + { + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Hi there, traveller. Care to make some money?", npc, + player); + + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) { + public void handleReply(final int option, + final String reply) { + player.setBusy(true); + switch (option) { + case 1: + player.setBusy(false); + npc.unblock(); + sendChat("No thanks, I'm good.", player, + npc); + break; + case 0: + sendChat("Sure, what do I need to do?", + player, npc); + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + sendChat( + "If you collect 20 balls of wool for me, I'll pay you 500 coins.", + npc, player); + addSingleEvent(new SingleEvent( + player, 2000) { + public void action() { + sendChat( + "Maybe I'll teach you a thing or two about crafting, too.", + npc, player); + addSingleEvent(new SingleEvent( + player, 2000) { + public void action() { + sendChat( + "I'm afraid you'll have to find your own shears, but the sheep are outside.", + npc, player); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + player + .setBusy(false); + player + .setMenuHandler(new MenuHandler( + SECOND_MENU) { + public void handleReply( + final int option, + final String reply) { + player + .setBusy(true); + switch (option) { + case 1: + sendChat( + "I'd be happy to help.", + player, + npc); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + sendChat( + "Great! Come back and see me when you're done.", + npc, + player); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + player + .setQuestStage( + getUniqueID(), + 1); + player + .setBusy(false); + npc + .unblock(); + } + }); + } + }); + break; + case 0: + sendChat( + "Sorry, I don't like the sound of that.", + player, + npc); + addSingleEvent(new SingleEvent( + player, + 2000) { + public void action() { + sendChat( + "Suit yourself. Come and see me if you change your mind.", + npc, + player); + player + .setBusy(false); + npc + .unblock(); + } + }); + break; + default: + player + .setBusy(false); + npc + .unblock(); + break; + } + } + }); + owner + .getActionSender() + .sendMenu( + SECOND_MENU); + } + }); + } + }); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(FIRST_MENU); + } + }); + } else + return; + } else if (stage == 1) { + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ahh, you've returned! Do you have my wool?", npc, + player); + + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(new String[] { + "I'm afraid not.", "Yes, I do." }) { + public void handleReply(final int option, + final String reply) { + player.setBusy(true); + sendChat(reply, player, npc); + + if (option == 0) { + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + sendChat( + "Well, come and see me when you do. The offer still stands", + npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } else if (option == 1) { + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + // check items + if (player.getInventory() + .hasItemId(ITEM_WOOL) + && player.getInventory() + .countId(ITEM_WOOL) >= 20) { + finishQuest(player, npc); + } else { + sendChat( + "Um, no you don't. Get back to me when you do. The reward still stands!", + npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } + } + }); + + owner.getActionSender() + .sendMenu( + new String[] { "I'm afraid not.", + "Yes, I do." }); + } + }); + } + } else if (stage == 0) { + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hello " + player.getUsername() + "!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) { + sendChat("Thank you very much! As promised, here's your reward.", npc, + player); + + addSingleEvent(new SingleEvent(player, 2000) { + public void action() { + player.incExp(12, REWARD_XP, false); + player.getActionSender().sendStat(12); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + for (int i = 0; i < 20; i++) + player.getInventory().remove(ITEM_WOOL, 1); + player.getInventory().add(new InvItem(10, REWARD_GP)); + player.getActionSender().sendInventory(); + player.incQuestPoints(1); + player.setBusy(false); + npc.unblock(); + } + }); + } +} diff --git a/GameServer/conf/server/quests_back/VampireSlayer.java b/GameServer/conf/server/quests_back/VampireSlayer.java new file mode 100644 index 0000000..2e8431a --- /dev/null +++ b/GameServer/conf/server/quests_back/VampireSlayer.java @@ -0,0 +1,347 @@ +import msc.gs.Instance; import msc.gs.event.SingleEvent; +import msc.gs.Instance; import msc.gs.model.MenuHandler; +import msc.gs.Instance; import msc.gs.model.Npc; +import msc.gs.Instance; import msc.gs.model.Player; +import msc.gs.Instance; import msc.gs.quest.Quest; +import msc.gs.Instance; import msc.gs.quest.QuestAction; + +/** + * Quest: Vampire Slayer (v1.0) 6/1/2009 Status: INCOMPLETE Start: Morgan (id + * 97), 215,615 NPCs: Harlow (id 98), 82,444 Items: Reward: 3 quest points, 1000 + * attack xp + * + * @author punKrockeR + */ +public class VampireSlayer extends Quest { + private static final int MORGAN_ID = 97; + private static final int HARLOW_ID = 98; + private static final int REWARD_XP = 1000; + private static final int DEFAULT_EVENT_DELAY = 3200; + private static final int QUEST_POINTS = 3; + private static final String[] FIRST_MENU = new String[] { + "No. Vampires are scary", "Ok I'm up for an adventure", + "I tried fighting him. He wouldn't die" }; + private static final String[] SECOND_MENU = new String[] { + "No, you've had enough", "Ok mate", "Morgan needs your help" }; + + /** + * Don't load this quest yet it's incomplete + */ + public boolean loadQuest() { + return false; + } + + /** + * @return the quest's name + */ + public String getName() { + return "Vampire Slayer"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() { + return 4; + } + + /** + * Initialises the quest + */ + public void init() { + associateNpc(MORGAN_ID); + associateNpc(HARLOW_ID); + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, + final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + player.setBusy(true); + npc.blockedBy(player); + + if (npc.getID() == MORGAN_ID) { + if (stage == -1) + startQuest(player, npc); + else + handleMorganTalk(player, npc); + } else if (npc.getID() == HARLOW_ID) { + handleHarlowTalk(player, npc); + } + } + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) { + sendChat("Please, please help us bold hero!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + sendChat("What's the problem?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Our little village has been dreadfully ravaged by an evil vampire!", + npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat("There's hardly any of us left", npc, + player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "We need someone to get rid of him once and for good", + npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(false); + player + .setMenuHandler(new MenuHandler( + FIRST_MENU) { + public void handleReply( + final int option, + final String reply) { + player + .setBusy(true); + npc + .blockedBy(player); + sendChat(reply, + player, + npc); + + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + if (option == 0) // No + { + sendChat( + "I don't blame you", + npc, + player); + player + .setBusy(false); + npc + .unblock(); + } else // Yes + { + npc + .blockedBy(player); + sendChat( + "I think first you should seek help", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + sendChat( + "I have a friend who is a retired vampire hunter called Dr Harlow", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + sendChat( + "He may be able to give you some tips", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + sendChat( + "He's usually found in the Jolly Bar Inn these days", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + sendChat( + "He's a bit of an old soak", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + sendChat( + "Mention his old friend Morgan", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc + .blockedBy(player); + sendChat( + "I'm sure he wouldn't want me to be killed by a vampire", + npc, + player); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "I'll look him up then", + player, + npc); + addSingleEvent(new SingleEvent( + player, + DEFAULT_EVENT_DELAY) { + public void action() { + player + .setQuestStage( + getUniqueID(), + 1); // Start + // quest + player + .setBusy(false); + npc + .unblock(); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + } + }); + } + }); + player.getActionSender() + .sendMenu(FIRST_MENU); + } + }); + } + }); + } + }); + } + }); + } + }); + } + + /** + * Handles Morgan's chat if the quest is started but not finished + */ + private void handleMorganTalk(final Player player, final Npc npc) { + player.setBusy(true); + npc.blockedBy(player); + sendChat("How are you doing with your quest?", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + if (player.getQuestStage(getUniqueID()) == 1) { + npc.blockedBy(player); + sendChat("I'm working on it still", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + npc.blockedBy(player); + sendChat("Please hurry", npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + npc.blockedBy(player); + sendChat( + "Every day we live in fear of our lives", + npc, player); + addSingleEvent(new SingleEvent(player, + DEFAULT_EVENT_DELAY) { + public void action() { + sendChat( + "Afraid that we will be the vampire's next victim", + npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } else { + } + } + }); + } + + /** + * Handles Harlow's chat if the quest is started but not finished + */ + private void handleHarlowTalk(final Player player, final Npc npc) { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Buy me a drrink pleassh", npc, player); + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) { + public void handleReply(final int option, final String reply) { + player.setBusy(true); + npc.blockedBy(player); + sendChat(reply, player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) { + public void action() { + player.setBusy(false); + npc.unblock(); + + if (option == 0) { + sendChat("Fuck you", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } + }); + player.getActionSender().sendMenu(SECOND_MENU); + } + + /** + * Finishes the quest + */ + private void finishQuest(final Player player, final Npc npc) { + } + + /** + * Construct the quest (empty) + */ + public VampireSlayer() { + } +} \ No newline at end of file diff --git a/GameServer/conf/server/quests_back/clear class files.bat b/GameServer/conf/server/quests_back/clear class files.bat new file mode 100644 index 0000000..e53814f --- /dev/null +++ b/GameServer/conf/server/quests_back/clear class files.bat @@ -0,0 +1,2 @@ +@echo off +del *.class \ No newline at end of file diff --git a/GameServer/conf/server/quests_back/compile quests.bat b/GameServer/conf/server/quests_back/compile quests.bat new file mode 100644 index 0000000..0f8d39d --- /dev/null +++ b/GameServer/conf/server/quests_back/compile quests.bat @@ -0,0 +1,5 @@ +@echo off +set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_03\bin +del *.class +javac -classpath .;../../../rscd.jar *.java +pause \ No newline at end of file diff --git a/GameServer/conf/server/quests_back/compile.sh b/GameServer/conf/server/quests_back/compile.sh new file mode 100644 index 0000000..f8e12b3 --- /dev/null +++ b/GameServer/conf/server/quests_back/compile.sh @@ -0,0 +1 @@ +/usr/java/jdk1.6.0_07/bin/javac -classpath /home/mscquests/rscd.jar *.java diff --git a/GameServer/conf/server/quests_back/java.policy.applet b/GameServer/conf/server/quests_back/java.policy.applet new file mode 100644 index 0000000..35527af --- /dev/null +++ b/GameServer/conf/server/quests_back/java.policy.applet @@ -0,0 +1,7 @@ +/* AUTOMATICALLY GENERATED ON Tue Apr 16 17:20:59 EDT 2002*/ +/* DO NOT EDIT */ + +grant { + permission java.security.AllPermission; +}; + diff --git a/GameServer/conf/server/quests_back/quests.jar b/GameServer/conf/server/quests_back/quests.jar new file mode 100644 index 0000000..1bc2277 Binary files /dev/null and b/GameServer/conf/server/quests_back/quests.jar differ diff --git a/GameServer/conf/server/queststmp/BlackKnightFortress.java b/GameServer/conf/server/queststmp/BlackKnightFortress.java new file mode 100644 index 0000000..c6f880b --- /dev/null +++ b/GameServer/conf/server/queststmp/BlackKnightFortress.java @@ -0,0 +1,378 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; + +/** + * Quest: Black Knight's Fortress (v1.0) + * Status: INCOMPLETE + * Start: 304, 1507 + * Stage1: 269, 441 + * Items: - + * Rewards: - + * + * @author youKnowWho + */ +public class BlackKnightFortress extends Quest +{ + private static final int QUEST_POINTS = 1; + private static final int NPC_VARZE = 110; + private static final int WALL_ID = 22; + private static final int WALL_X = 273; + private static final int WALL_Y = 435; + private static final int GRILL_ID = -1; + private static final int GRILL_X = -1; + private static final int GRILL_Y = -1; + private static final int REQUIRED_QPOINTS = 0; // 13 + private static final String[] FIRST_MENU = new String[]{"Well what's the problem?","Well, ah.. good luck with that"}; + private static final String[] SECOND_MENU = new String[]{"Secret weapon? That sounds really scary!","I can take care of that"}; + private static final String[] THIRD_MENU = new String[]{"Sure, but it'll cost you","No, actually, I lied."}; + private static final String[] FOURTH_MENU = new String[]{"I'll get right on it then","Sorry, I can't be bothered"}; + + /** + * Don't load this quest yet it's incomplete + */ + public boolean loadQuest() + { + return false; + } + + public void init() + { + associateNpc(NPC_VARZE); + associateObject(WALL_ID, WALL_X, WALL_Y); + } + + public BlackKnightFortress() + { + } + + public String getName() + { + return "Black Knight's Fortress"; + } + + public int getUniqueID() + { + return 2; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != NPC_VARZE) + return; + + player.setBusy(true); + npc.blockedBy(player); + + // handle quest complete chat? + + if(stage == -1) + startQuest(player, npc); + else + handleTalk(player, npc); + } else + if(action == action.USED_OBJECT) + { + if(!(args[0] instanceof GameObject)) + return; + + final GameObject obj = (GameObject)args[0]; + + if(obj.getID() != WALL_ID && obj.getID() != GRILL_ID) + return; + + player.setBusy(true); + + if(obj.getID() == WALL_ID) + { + if(player.getY() < 435 || stage >= 1) + { + player.getActionSender().sendMessage("You push on the wall..."); + player.getActionSender().sendSound("secretdoor"); + world.unregisterGameObject(obj); + world.delayedSpawnObject(obj.getLoc(), 1000); + + if(player.getY() < 435) + player.teleport(273, 435, false); + else + player.teleport(273, 434, false); + + addDelayedMessage("It slides out of the way!", player, 1000); + } else + player.getActionSender().sendMessage("You see no reason to push on the wall"); + } else + if(obj.getID() == GRILL_ID) + { + // listen + } + + player.setBusy(false); + } + } + + private void handleTalk(final Player player, final Npc npc) + { + int stage = player.getQuestStage(this); + + if(stage >= 1 && stage <= 5) + { + sendChat("I don't have time to talk right now", npc, player); + addDelayedChat("Come back when you've destroyed that weapon!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + private void startQuest(final Player player, final Npc npc) + { + sendChat("Good day to you, " + (player.isMale() ? "sir" : "miss"), npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Hello sir. I've heard rumours that you're going to war with the black knights", player, npc); + addSingleEvent(new SingleEvent(player, 4000) + { + public void action() + { + sendChat("Is this true?", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + if(player.getQuestPoints() >= REQUIRED_QPOINTS) // Confirm rumour + { + sendChat("Who told you that?", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Oh, it makes no difference. Yes, the rumours are true.", npc, player); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + npc.blockedBy(player); + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + npc.blockedBy(player); + player.setBusy(true); + sendChat(reply + (option == 0 ? " Surely you'll defeat them easily?" : ""), player, npc); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + npc.blockedBy(player); + switch(option) + { + case 0: + sendChat("Yeah, well.. You're lucky you've earned yourself a good reputation", npc, player); + addSingleEvent(new SingleEvent(player, 4000) + { + public void action() + { + sendChat("Or I wouldn't tell you.", npc, player); + addSingleEvent(new SingleEvent(player, 4000) + { + public void action() + { + sendChat("The black knights have a secret weapon, and they say it will destroy us.", npc, player); + npc.blockedBy(player); + addSingleEvent(new SingleEvent(player, 4000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + npc.blockedBy(player); + player.setBusy(true); + + if(option == 1) + sendChat("Well it just so happens that I'm an expert in secret weapon thwarting.", player, npc); + else + sendChat(reply, player, npc); + + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + npc.blockedBy(player); + switch(option) + { + case 0: + sendChat("What kind of sissy talk is that? Get out of my sight!", npc, player); + player.setBusy(false); + npc.unblock(); + break; + case 1: + sendChat("I like your spirit, young warrior!", npc, player); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + sendChat("Do you think you could help us?", npc, player); + npc.blockedBy(player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(THIRD_MENU) + { + public void handleReply(final int option, final String reply) + { + sendChat(reply, player, npc); + npc.blockedBy(player); + player.setBusy(true); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + npc.blockedBy(player); + + switch(option) + { + case 0: + sendChat("Money won't be a problem, assuming you can do the job.", npc, player); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + sendChat("Well then, what do you want me to do?", player, npc); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + sendChat("First of all, you'll need to find out what the weapon is... then destroy it!", npc, player); + addSingleEvent(new SingleEvent(player, 4500) + { + public void action() + { + sendChat("Head north and search the black knight's castle.", npc, player); + npc.blockedBy(player); + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FOURTH_MENU) + { + public void handleReply(final int option, final String reply) + { + sendChat(reply, player, npc); + player.setBusy(true); + npc.blockedBy(player); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + npc.blockedBy(player); + + switch(option) + { + case 0: + player.setBusy(false); + npc.unblock(); + addDelayedChat("Good luck, " + player.getUsername() + ".", npc, player); + player.setQuestStage(getUniqueID(), 1); + break; + case 1: + addDelayedChat("Don't waste my time! Every valuable second, doom draws nearer!", npc, player); + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + } + }); + player.getActionSender().sendMenu(FOURTH_MENU); + player.setBusy(false); + } + }); + } + }); + } + }); + break; + case 1: + addDelayedChat("Don't waste my time " + player.getUsername() + "!", npc, player); + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + } + }); + player.getActionSender().sendMenu(THIRD_MENU); + player.setBusy(false); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + } + }); + player.getActionSender().sendMenu(SECOND_MENU); + player.setBusy(false); + } + }); + } + }); + } + }); + break; + case 1: + sendChat("Um, thanks. I guess...", npc, player); + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + } + }); + player.getActionSender().sendMenu(FIRST_MENU); + player.setBusy(false); + } + }); + } + }); + } else // Deny rumour + { + sendChat("Most certainly not. The Black Knights are no threat to us!", npc, player); + player.setBusy(false); + npc.unblock(); + addDelayedMessage("You need " + REQUIRED_QPOINTS + " quest points before " + npc.getDef().getName() + " will trust you", player); + } + } + }); + } + }); + } + }); + } +} diff --git a/GameServer/conf/server/queststmp/Christmas.java b/GameServer/conf/server/queststmp/Christmas.java new file mode 100644 index 0000000..2b7b8f7 --- /dev/null +++ b/GameServer/conf/server/queststmp/Christmas.java @@ -0,0 +1,850 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; +import org.rscdaemon.server.entityhandling.defs.extras.ItemDropDef; +import org.rscdaemon.server.util.DataConversions; + +/** + * Quest: Christmas! (v1.0) 8/1/2009 + * Status: COMPLETE + * Start: Santa (id 798), 290,464 + * NPCs: Farrel (id 799), 106,670 + * 1st Elf (id 800), 71,589 + * 2nd Elf (id 800), 656,467 + * 3rd Elf (id 800), 403,685 + * Evil wizard (id 801), 279,454 + * Items: Santa hat (id 971), Santa top (id 1315), Santa legs (id 1314), Candy cane (id 1316), + * Toy 1 (id 1317), Toy 2 (id 1318), Toy 3 (id 1319), Toy 4 (id 1320), Gift box (id 1321) + * Reward: 0 quest points, Magic Gift Box (id 1321) (random item inside) + * + * @author punKrockeR + */ +public class Christmas extends Quest +{ + private static final int SANTA_ID = 798; + private static final int FARREL_ID = 799; + private static final int ELF_ID = 800; + private static final int DARKWIZ_ID = 801; + private static final int SANTA_HAT_ID = 971; + private static final int SANTA_TOP_ID = 1315; + private static final int SANTA_LEG_ID = 1314; + private static final int CANDY_CANE_ID = 1316; + private static final int TOY1_ID = 1317; + private static final int TOY2_ID = 1318; + private static final int TOY3_ID = 1319; + private static final int TOY4_ID = 1320; + private static final int GIFT_ID = 1321; + private static final int DEFAULT_DELAY = 3200; + private static final int QUEST_POINTS = 0; + private World world = World.getWorld(); + private static final ItemDropDef[] BOX_ITEMS = new ItemDropDef[] + { + new ItemDropDef(155, 1, 3200), // Coal, 42% + new ItemDropDef(SANTA_HAT_ID, 1, 799), // Santa hat, 2.99% + new ItemDropDef(SANTA_TOP_ID, 1, 2000), // Santa top, 20% + new ItemDropDef(SANTA_LEG_ID, 1, 2000), // Santa legs, 20% + new ItemDropDef(CANDY_CANE_ID, 1, 2000), // Candy cane, 15% + new ItemDropDef(575, 1, 1) // Christmas cracker, 0.01% + }; + + /** + * @return the quest's name + */ + public String getName() + { + return "Christmas!"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 5; + } + + /** + * Initialises the quest + */ + public void init() + { + associateNpc(SANTA_ID); + associateNpc(FARREL_ID); + associateNpc(ELF_ID); + associateNpc(DARKWIZ_ID); + associateItem(TOY1_ID); + associateItem(TOY2_ID); + associateItem(TOY3_ID); + associateItem(TOY4_ID); + associateItem(GIFT_ID); + } + + /** + * @return if the given NPC is visible to the player + */ + public boolean isNpcVisible(Npc npc, Player player) + { + + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 594) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 72 && npc.getLoc().startY() == 585) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 653 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 419 && npc.getLoc().startY() == 684) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 408 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + + return true; + } + + /** + * @return if the given item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) + { + if(item.getID() == TOY1_ID) + return player.getQuestStage(this) >= 2; + else + if(item.getID() == TOY2_ID) + return player.getQuestStage(this) >= 4; + else + if(item.getID() == TOY3_ID) + return player.getQuestStage(this) >= 6; + else + if(item.getID() == TOY4_ID) + return player.getQuestStage(this) >= 7; + + return true; + } + + /** + * @return if the player has the given item in his inventory, bank or if it's on the ground somewhere + */ + public boolean hasItem(Player player, int id) + { + if(player.getInventory().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy!"); + return true; + } + + if(player.getBank().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy in your bank!"); + return true; + } + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, 20); + for(int x = 0; x < tiles.length; x++) + { + for(int y = 0; y < tiles[x].length; y++) + { + ActiveTile t = tiles[x][y]; + if(t != null) + { + for(Item i : t.getItems()) + { + if(i.getID() == id) + { + if(i.getOwner().equals(player)) + { + player.getActionSender().sendMessage("You already have this elf's toy nearby on the ground!"); + return true; + } + } + } + } + } + } + + player.getActionSender().sendMessage("The toy falls to the ground"); + return false; + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.USED_ITEM) + { + if(!(args[0] instanceof InvItem)) + return; + + final InvItem item = (InvItem)args[0]; + + handleUseItem(item, player); + } else + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == SANTA_ID) + { + player.setBusy(true); + + if(stage == -1) + startQuest(player, npc); + else + handleSantaTalk(player, npc); + } else + if(npc.getID() == FARREL_ID) + { + player.setBusy(true); + handleFarrelTalk(player, npc); + } else + if(npc.getID() == ELF_ID) + { + player.setBusy(true); + handleElfTalk(player, npc); + } + else + if(npc.getID() == DARKWIZ_ID) + { + player.setBusy(true); + handleWizardTalk(player, npc); + } + } else + if(action == action.KILLED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == ELF_ID) // If the player doesn't have the toy in their bank or inventory, drop the toy. + { + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 594 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 72 && npc.getLoc().startY() == 585 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 653 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 419 && npc.getLoc().startY() == 684 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 408 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + } + } + } + + /** + * Handles item use + */ + private void handleUseItem(final InvItem item, final Player player) + { + if(item.getID() == GIFT_ID) + { + player.setBusy(true); + player.getActionSender().sendMessage("You open the " + item.getDef().getName() + "..."); + sleep(2000); + int total = 0; + for(ItemDropDef drop : BOX_ITEMS) + total += drop.getWeight(); + + int hit = DataConversions.random(0, total); + total = 0; + ItemDropDef reward = null; + for(ItemDropDef drop : BOX_ITEMS) + { + if(hit >= total && hit < (total + drop.getWeight())) + { + reward = drop; + break; + } + + total += drop.getWeight(); + } + + player.getInventory().remove(GIFT_ID, 1); + if(reward == null) + player.getActionSender().sendMessage("You don't get shit! (reward is null)"); + else + player.getInventory().add(new InvItem(reward.getID(), reward.getAmount())); + + player.getActionSender().sendMessage("It contained a " + ((reward.getAmount() > 1) ? reward.getAmount() : "a ") + EntityHandler.getItemDef(reward.getID()).getName() + (reward.getAmount() > 1 ? "s" : "") + "!"); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + } else + player.setBusy(false); + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + player.setBusy(true); + sendChat("Christmas! It's ruined!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Why?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The presents... they're gone!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What presents? Gone where?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("All my Christmas presents have been stolen!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Who stole them?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "My own elves!", + "I landed here last night in my sleigh", + "To deliver my presents to the citizens of this land", + "But an evil Dark Knight wizard cast a spell on my Elves", + "And they stole my presents and ran away!" + ); + player.setBusy(false); + int option = getMenuOption(player, "That sucks", "Where are they now?", "Good luck with that"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Indeed it does!", npc, player); + player.setBusy(false); + npc.unblock(); + } else + if(option == 1) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I don't know. But one of the elves, Farrel, he's in Lumbridge", + "It appears the spell didn't affect him", + "But he's in hiding from the other elves who have turned evil!", + "And I'm afraid the spell is quite irreversible" + ); + player.setBusy(false); + option = getMenuOption(player, "Maybe I can help?", "Christmas really is ruined then"); + if(option == -1) + return; + player.setBusy(true); + sleep(2000); + if(option == 0) + { + if(player.getQuestPoints() < 2) + { + sendChat("I doubt it, you don't have a very good reputation for helping people", npc, player); + player.setBusy(false); + npc.unblock(); + sleep(2000); + player.getActionSender().sendMessage("You need at least 2 Quest Points to start this quest"); + } else + { + queueChat(npc, player, DEFAULT_DELAY, + "Perhaps you can... I don't know where the others are", + "But if you can find Farrel, he can help you find them", + "All I know is that he's in Lumbridge", + "He said he's hiding near a church", + "Please find him and help me save Christmas!" + ); + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("I'm afraid so!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Oh, I'll need it!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles Santa's chat if the quest is started but not finished + */ + private void handleSantaTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("Merry christmas, hero!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) != 7) + { + sendChat("Oh, " + player.getUsername() + ". Please find those elves!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + { + if(!player.getInventory().hasItemId(TOY1_ID) || !player.getInventory().hasItemId(TOY2_ID) || !player.getInventory().hasItemId(TOY3_ID) || !player.getInventory().hasItemId(TOY4_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Farrel said you'd collected the toys", + "Please bring them all to me as soon as possible!" + ); + npc.unblock(); + player.setBusy(false); + return; + } + + queueChat(npc, player, DEFAULT_DELAY, + player.getUsername() + "! I can't express my gratitude with words", + "You saved Christmas for your land!", + "I don't have anything I can spare for you", + "But I can give you your present early", + "It's a magic gift box. The item within is unknown", + "I hope you get something fantastic!", + "You deserve it for your heroic antics.", + "Farewell kind " + (player.isMale() ? "sir" : "lady") + "! And meeeeery christmas!" + ); + + player.getActionSender().sendMessage("Santa takes the toys and hands you a small gift box"); + if(player.getInventory().remove(TOY1_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY2_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY3_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY4_ID, 1) == -1) { player.setBusy(false); return; } + player.getInventory().add(new InvItem(GIFT_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), COMPLETE); + sleep(2500); + player.getActionSender().sendMessage("Maybe I should go and talk to that Evil Dark Knight Wizard..."); + } + } + + /** + * Handles Farrel's chat if the quest is started but not finished + */ + private void handleFarrelTalk(final Player player, final Npc npc) + { + player.setBusy(true); + if(player.getQuestStage(this) == -1) + { + sendChat("Bugger off", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) == 1) + { + player.setBusy(true); + sendChat("Who are you?", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Santa sent me to find you", player, npc); + sleep(DEFAULT_DELAY); + sendChat("What for?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "To murder you", "To help"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Go for it. It's only a matter of time before they find me anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Well if Santa trusts you, I guess I can.", + "We must get started at once if we're to find the others." + ); + player.setBusy(false); + option = getMenuOption(player, "Any idea where they are?", "Maybe later"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "One of them ran to the desert nearby", + "I don't know where he's hiding, but we hate the heat", + "He must be hiding near cliffs or rocks that offer shade", + "You know this land better than I", + "It would be safer for all involved if you went, and not me" + + ); + player.setBusy(false); + option = getMenuOption(player, "I agree", "Pussy"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Excellent. He should be carrying a small " + EntityHandler.getItemDef(TOY1_ID).getName(), + "Get it and bring it to me. Use any means necessary. Any.", + "My comrades cannot be saved now." + ); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 2); + } else // No + { + sendChat("Santa's trust was misplaced. Christmas is truly ruined.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("There won't be a \"later\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 2) + { + sendChat("Have you found the first toy?", npc, player); + sleep(2000); + player.setBusy(false); + int option = getMenuOption(player, "Not yet", "Yeah"); + if(option == -1) + return; + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Well please act quickly. Time is running out! Remember, he's in the desert", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + if(player.getInventory().hasItemId(TOY1_ID)) + { + sendChat("Great! Please, hand it to me", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY1_ID).getName()); + player.setQuestStage(getUniqueID(), 3); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY1_ID, 1); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage3(npc, player); + } else + { + sendChat("No you haven't. Please don't fool around. Time is running out!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 3) + { + questStage3(npc, player); + } else + if(player.getQuestStage(this) == 4) + { + sendChat("Have you found the second toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Right on brother", "No"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + if(player.getInventory().hasItemId(TOY2_ID)) + { + sendChat("I don't know what that means, but please hand me the toy", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY2_ID).getName()); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY2_ID, 1); + player.setQuestStage(getUniqueID(), 5); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage5(npc, player); + } else + { + sendChat("I don't know what that means, but you don't have the toy", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Please hurry. Christmas is almost over!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // Yes + { + sendChat("Well please hurry. Christmas is almost over! Remember, \"Baxtorian Falls\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + if(player.getQuestStage(this) == 5) + { + questStage5(npc, player); + } else + if(player.getQuestStage(this) == 6) // Final present + { + player.setBusy(true); + sendChat("Did you get izzy's toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + if(player.getInventory().hasItemId(TOY3_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you so much, " + player.getUsername(), + "You single-handedly saved Christmas.", + "The elves at the north pole will write songs of you hero", + "You will be respected and remembered forever, believe me.", + "The final present, I have kept all along", + "Here, you take all four presents and give them to santa", + "I'll tell him of your bravery", + "I'm sure he'll want to reward you", + "Farewell, " + player.getUsername() + ".", + "Merry christmas." + ); + player.getActionSender().sendMessage("Farrel hands you the three toys"); + if(player.getInventory().hasItemId(TOY1_ID)) { sendChat("Oh... You already have the toys.", npc, player); player.setBusy(false); return; } + player.getInventory().add(new InvItem(TOY1_ID, 1)); + player.getInventory().add(new InvItem(TOY2_ID, 1)); + //player.getInventory().add(new InvItem(TOY3_ID, 1)); + player.getInventory().add(new InvItem(TOY4_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 7); + } else + { + sendChat("No you don't.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Remember, flames and lava and the ocean are Izzy's favourite things", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("Please get it. Don't hesitate just because he's my brother.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Hey there, " + player.getUsername() + "!", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 3 chat + */ + private void questStage3(final Npc npc, final Player player) + { + sendChat("So what now?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "While you were gone, I did some reconnaissance work", + "I overheard some humans talking about a deranged Elf they saw while sightseeing" + ); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "A place called the \"Baxtorian Falls\". Somewhere near a gnome stronghold.", + "It's not much of a lead, but it's all we've got" + ); + sendChat("I'll get on it then", player, npc); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 4); + } else // No + { + sendChat("Suit yourself, grinch.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 5 chat + */ + private void questStage5(final Npc npc, final Player player) + { + sendChat("What's next little guy?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("Don't patronize me, " + player.getUsername() + ". I'm stronger in ways you can't even imagine", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well I'll take your word for it. Where's the last elf?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I don't know.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What? Not even a clue?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I'm afraid you'll have to find izzy on your own", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Izzy? That's his name?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The last toy to get is a " + EntityHandler.getItemDef(TOY3_ID).getName() + ". Izzy took that one.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well did you know him very well? Where's somewhere he's likely to go?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I knew him very well.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("He was my younger brother.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("I'm sorry, farrel.", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "What he's become... he's not my brother anymore", + "All I know that might help you is that, unlike the rest of us", + "Izzy loved the heat. Flames, lava, that sort of thing", + "And he also loved the ocean. You know this land", + "Take what little information I have to offer", + "And find my brother. Get the last toy back." + ); + player.setBusy(false); + int option = getMenuOption(player, "Of course, Farrel", "No. I refuse to murder your brother", "I've had enough of this"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you dearly, " + player.getUsername(), + "Good luck. Please, make his death quick." + ); + player.setQuestStage(getUniqueID(), 6); + player.setBusy(false); + npc.unblock(); + } else // No + { + sendChat("Then the death of Christmas is on your conscience.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles talking to the evil elves + */ + private void handleElfTalk(final Player player, final Npc npc) + { + sendChat("Get out of my way tall one", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } + + /** + * Handles talking to the evil wizard + */ + private void handleWizardTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("You! You thwarted my plans!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Christmas is for everyone! Why do you want to stop it?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "None of your business, fiend! I'm going to send you back in time", + "To before you ruined my plans!" + ); + player.setBusy(false); + int option = getMenuOption(player, "Please don't!", "Give it your best shot"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + queueChat(npc, player, DEFAULT_DELAY, + "Bah! It makes no difference anyway", + "I have more important things to ruin" + ); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I will!", + "Muahahaha!" + ); + player.getActionSender().sendTeleBubble(player.getLocation().getX(), player.getLocation().getY(), false); + player.getActionSender().sendSound("spellfail"); + player.teleport(289, 459, true); + sleep(DEFAULT_DELAY); + player.getActionSender().sendTeleBubble(289, 459, false); + sendChat("Huh? What? Where am i?", player, npc); + player.setQuestStage(getUniqueID(), -1); + npc.unblock(); + sleep(DEFAULT_DELAY); + player.setBusy(false); + if(player.getInventory().hasItemId(TOY1_ID) || player.getInventory().hasItemId(TOY2_ID) || player.getInventory().hasItemId(TOY3_ID) || player.getInventory().hasItemId(TOY4_ID) || player.getInventory().hasItemId(GIFT_ID)) + player.getActionSender().sendMessage("Santa's presents are unaffected by the Wizard's spell!"); + } + } else + { + sendChat("Hahaha! You may call me, the grinch! Bahaha!", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("He really does look quite insane"); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Construct the quest (empty) + */ + public Christmas() + { + } +} diff --git a/GameServer/conf/server/queststmp/Christmas.java.bak b/GameServer/conf/server/queststmp/Christmas.java.bak new file mode 100644 index 0000000..f89fa14 --- /dev/null +++ b/GameServer/conf/server/queststmp/Christmas.java.bak @@ -0,0 +1,816 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; +import org.rscdaemon.server.entityhandling.defs.extras.ItemDropDef; +import org.rscdaemon.server.util.DataConversions; + +/** + * Quest: Christmas! (v1.0) 8/1/2009 + * Status: COMPLETE + * Start: Santa (id 798), 290,464 + * NPCs: Farrel (id 799), 106,670 + * 1st Elf (id 800), 71,589 + * 2nd Elf (id 800), 656,467 + * 3rd Elf (id 800), 403,685 + * Evil wizard (id 801), 279,454 + * Items: Santa hat (id 971), Santa top (id 1315), Santa legs (id 1314), Candy cane (id 1316), + * Toy 1 (id 1317), Toy 2 (id 1318), Toy 3 (id 1319), Toy 4 (id 1320), Gift box (id 1321) + * Reward: 0 quest points, Magic Gift Box (id 1321) (random item inside) + * + * @author punKrockeR + */ +public class Christmas extends Quest +{ + private static final int SANTA_ID = 798; + private static final int FARREL_ID = 799; + private static final int ELF_ID = 800; + private static final int DARKWIZ_ID = 801; + private static final int SANTA_HAT_ID = 971; + private static final int SANTA_TOP_ID = 1315; + private static final int SANTA_LEG_ID = 1314; + private static final int CANDY_CANE_ID = 1316; + private static final int TOY1_ID = 1317; + private static final int TOY2_ID = 1318; + private static final int TOY3_ID = 1319; + private static final int TOY4_ID = 1320; + private static final int GIFT_ID = 1321; + private static final int DEFAULT_DELAY = 3200; + private static final int QUEST_POINTS = 0; + private World world = World.getWorld(); + private static final ItemDropDef[] BOX_ITEMS = new ItemDropDef[] + { + new ItemDropDef(155, 1, 3200), // Coal, 32% + new ItemDropDef(SANTA_HAT_ID, 1, 799), // Santa hat, 7.99% + new ItemDropDef(SANTA_TOP_ID, 1, 2000), // Santa top, 20% + new ItemDropDef(SANTA_LEG_ID, 1, 2000), // Santa legs, 20% + new ItemDropDef(CANDY_CANE_ID, 1, 2000), // Candy cane, 20% + new ItemDropDef(575, 1, 1) // Christmas cracker, 0.01% + }; + + /** + * @return the quest's name + */ + public String getName() + { + return "Christmas!"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 5; + } + + /** + * Initialises the quest + */ + public void init() + { + associateNpc(SANTA_ID); + associateNpc(FARREL_ID); + associateNpc(ELF_ID); + associateNpc(DARKWIZ_ID); + associateItem(TOY1_ID); + associateItem(TOY2_ID); + associateItem(TOY3_ID); + associateItem(TOY4_ID); + associateItem(GIFT_ID); + } + + /** + * @return if the given NPC is visible to the player + */ + public boolean isNpcVisible(Npc npc, Player player) + { + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + + return true; + } + + /** + * @return if the given item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) + { + if(item.getID() == TOY1_ID) + return player.getQuestStage(this) >= 2; + else + if(item.getID() == TOY2_ID) + return player.getQuestStage(this) >= 4; + else + if(item.getID() == TOY3_ID) + return player.getQuestStage(this) >= 6; + else + if(item.getID() == TOY4_ID) + return player.getQuestStage(this) >= 7; + + return true; + } + + /** + * @return if the player has the given item in his inventory, bank or if it's on the ground somewhere + */ + public boolean hasItem(Player player, int id) + { + if(player.getInventory().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy!"); + return true; + } + + if(player.getBank().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy in your bank!"); + return true; + } + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, 20); + for(int x = 0; x < tiles.length; x++) + { + for(int y = 0; y < tiles[x].length; y++) + { + ActiveTile t = tiles[x][y]; + if(t != null) + { + for(Item i : t.getItems()) + { + if(i.getID() == id) + { + if(i.getOwner().equals(player)) + { + player.getActionSender().sendMessage("You already have this elf's toy nearby on the ground!"); + return true; + } + } + } + } + } + } + + player.getActionSender().sendMessage("The toy falls to the ground"); + return false; + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.USED_ITEM) + { + if(!(args[0] instanceof InvItem)) + return; + + final InvItem item = (InvItem)args[0]; + + handleUseItem(item, player); + } else + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == SANTA_ID) + { + player.setBusy(true); + + if(stage == -1) + startQuest(player, npc); + else + handleSantaTalk(player, npc); + } else + if(npc.getID() == FARREL_ID) + { + player.setBusy(true); + handleFarrelTalk(player, npc); + } else + if(npc.getID() == ELF_ID) + { + player.setBusy(true); + handleElfTalk(player, npc); + } + else + if(npc.getID() == DARKWIZ_ID) + { + player.setBusy(true); + handleWizardTalk(player, npc); + } + } else + if(action == action.KILLED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == ELF_ID) // If the player doesn't have the toy in their bank or inventory, drop the toy. + { + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + } + } + } + + /** + * Handles item use + */ + private void handleUseItem(final InvItem item, final Player player) + { + if(item.getID() == GIFT_ID) + { + player.setBusy(true); + player.getActionSender().sendMessage("You open the " + item.getDef().getName() + "..."); + sleep(2000); + int total = 0; + for(ItemDropDef drop : BOX_ITEMS) + total += drop.getWeight(); + + int hit = DataConversions.random(0, total); + total = 0; + ItemDropDef reward = null; + for(ItemDropDef drop : BOX_ITEMS) + { + if(hit >= total && hit < (total + drop.getWeight())) + { + reward = drop; + break; + } + + total += drop.getWeight(); + } + + player.getInventory().remove(GIFT_ID, 1); + if(reward == null) + player.getActionSender().sendMessage("You don't get shit! (reward is null)"); + else + player.getInventory().add(new InvItem(reward.getID(), reward.getAmount())); + + player.getActionSender().sendMessage("It contained a " + ((reward.getAmount() > 1) ? reward.getAmount() : "a ") + EntityHandler.getItemDef(reward.getID()).getName() + (reward.getAmount() > 1 ? "s" : "") + "!"); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + } else + player.setBusy(false); + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + player.setBusy(true); + sendChat("Christmas! It's ruined!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Why?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The presents... they're gone!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What presents? Gone where?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("All my Christmas presents have been stolen!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Who stole them?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "My own elves!", + "I landed here last night in my sleigh", + "To deliver my presents to the citizens of this land", + "But an evil Dark Knight wizard cast a spell on my Elves", + "And they stole my presents and ran away!" + ); + player.setBusy(false); + int option = getMenuOption(player, "That sucks", "Where are they now?", "Good luck with that"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Indeed it does!", npc, player); + player.setBusy(false); + npc.unblock(); + } else + if(option == 1) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I don't know. But one of the elves, Farrel, he's in Lumbridge", + "It appears the spell didn't affect him", + "But he's in hiding from the other elves who have turned evil!", + "And I'm afraid the spell is quite irreversible" + ); + player.setBusy(false); + option = getMenuOption(player, "Maybe I can help?", "Christmas really is ruined then"); + if(option == -1) + return; + player.setBusy(true); + sleep(2000); + if(option == 0) + { + if(player.getQuestPoints() < 2) + { + sendChat("I doubt it, you don't have a very good reputation for helping people", npc, player); + player.setBusy(false); + npc.unblock(); + sleep(2000); + player.getActionSender().sendMessage("You need at least 2 Quest Points to start this quest"); + } else + { + queueChat(npc, player, DEFAULT_DELAY, + "Perhaps you can... I don't know where the others are", + "But if you can find Farrel, he can help you find them", + "All I know is that he's in Lumbridge", + "He said he's hiding near a church", + "Please find him and help me save Christmas!" + ); + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("I'm afraid so!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Oh, I'll need it!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles Santa's chat if the quest is started but not finished + */ + private void handleSantaTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("Merry christmas, hero!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) != 7) + { + sendChat("Oh, " + player.getUsername() + ". Please find those elves!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + { + if(!player.getInventory().hasItemId(TOY1_ID) || !player.getInventory().hasItemId(TOY2_ID) || !player.getInventory().hasItemId(TOY3_ID) || !player.getInventory().hasItemId(TOY4_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Farrel said you'd collected the toys", + "Please bring them all to me as soon as possible!" + ); + npc.unblock(); + player.setBusy(false); + return; + } + + queueChat(npc, player, DEFAULT_DELAY, + player.getUsername() + "! I can't express my gratitude with words", + "You saved Christmas for your land!", + "I don't have anything I can spare for you", + "But I can give you your present early", + "It's a magic gift box. The item within is unknown", + "I hope you get something fantastic!", + "You deserve it for your heroic antics.", + "Farewell kind " + (player.isMale() ? "sir" : "lady") + "! And meeeeery christmas!" + ); + + player.getActionSender().sendMessage("Santa takes the toys and hands you a small gift box"); + if(player.getInventory().remove(TOY1_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY2_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY3_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY4_ID, 1) == -1) { player.setBusy(false); return; } + player.getInventory().add(new InvItem(GIFT_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), COMPLETE); + sleep(2500); + player.getActionSender().sendMessage("Maybe I should go and talk to that Evil Dark Knight Wizard..."); + } + } + + /** + * Handles Farrel's chat if the quest is started but not finished + */ + private void handleFarrelTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == -1) + { + sendChat("Bugger off", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) == 1) + { + player.setBusy(true); + sendChat("Who are you?", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Santa sent me to find you", player, npc); + sleep(DEFAULT_DELAY); + sendChat("What for?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "To murder you", "To help"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Go for it. It's only a matter of time before they find me anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Well if Santa trusts you, I guess I can.", + "We must get started at once if we're to find the others." + ); + player.setBusy(false); + option = getMenuOption(player, "Any idea where they are?", "Maybe later"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "One of them ran to the desert nearby", + "I don't know where he's hiding, but we hate the heat", + "He must be hiding near cliffs or rocks that offer shade", + "You know this land better than I", + "It would be safer for all involved if you went, and not me" + + ); + player.setBusy(false); + option = getMenuOption(player, "I agree", "Pussy"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Excellent. He should be carrying a small " + EntityHandler.getItemDef(TOY1_ID).getName(), + "Get it and bring it to me. Use any means necessary. Any.", + "My comrades cannot be saved now." + ); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 2); + } else // No + { + sendChat("Santa's trust was misplaced. Christmas is truly ruined.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("There won't be a \"later\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 2) + { + sendChat("Have you found the first toy?", npc, player); + sleep(2000); + player.setBusy(false); + int option = getMenuOption(player, "Not yet", "Yeah"); + if(option == -1) + return; + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Well please act quickly. Time is running out! Remember, he's in the desert", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + if(player.getInventory().hasItemId(TOY1_ID)) + { + sendChat("Great! Please, hand it to me", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY1_ID).getName()); + player.setQuestStage(getUniqueID(), 3); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY1_ID, 1); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage3(npc, player); + } else + { + sendChat("No you haven't. Please don't fool around. Time is running out!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 3) + { + questStage3(npc, player); + } else + if(player.getQuestStage(this) == 4) + { + sendChat("Have you found the second toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Right on brother", "No"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + if(player.getInventory().hasItemId(TOY2_ID)) + { + sendChat("I don't know what that means, but please hand me the toy", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY2_ID).getName()); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY2_ID, 1); + player.setQuestStage(getUniqueID(), 5); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage5(npc, player); + } else + { + sendChat("I don't know what that means, but you don't have the toy", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Please hurry. Christmas is almost over!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // Yes + { + sendChat("Well please hurry. Christmas is almost over! Remember, \"Baxtorian Falls\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + if(player.getQuestStage(this) == 5) + { + questStage5(npc, player); + } else + if(player.getQuestStage(this) == 6) // Final present + { + sendChat("Did you get izzy's toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + if(player.getInventory().hasItemId(TOY3_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you so much, " + player.getUsername(), + "You single-handedly saved Christmas.", + "The elves at the north pole will write songs of you hero", + "You will be respected and remembered forever, believe me.", + "The final present, I have kept all along", + "Here, you take all four presents and give them to santa", + "I'll tell him of your bravery", + "I'm sure he'll want to reward you", + "Farewell, " + player.getUsername() + ".", + "Merry christmas." + ); + player.getActionSender().sendMessage("Farrel hands you the three toys"); + player.getInventory().add(new InvItem(TOY1_ID, 1)); + player.getInventory().add(new InvItem(TOY2_ID, 1)); + //player.getInventory().add(new InvItem(TOY3_ID, 1)); + player.getInventory().add(new InvItem(TOY4_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 7); + } else + { + sendChat("No you don't.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Remember, flames and lava and the ocean are Izzy's favourite things", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("Please get it. Don't hesitate just because he's my brother.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Hey there, " + player.getUsername() + "!", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 3 chat + */ + private void questStage3(final Npc npc, final Player player) + { + sendChat("So what now?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "While you were gone, I did some reconnaissance work", + "I overheard some humans talking about a deranged Elf they saw while sightseeing" + ); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "A place called the \"Baxtorian Falls\". Somewhere near a gnome stronghold.", + "It's not much of a lead, but it's all we've got" + ); + sendChat("I'll get on it then", player, npc); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 4); + } else // No + { + sendChat("Suit yourself, grinch.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 5 chat + */ + private void questStage5(final Npc npc, final Player player) + { + sendChat("What's next little guy?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("Don't patronize me, " + player.getUsername() + ". I'm stronger in ways you can't even imagine", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well I'll take your word for it. Where's the last elf?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I don't know.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What? Not even a clue?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I'm afraid you'll have to find izzy on your own", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Izzy? That's his name?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The last toy to get is a " + EntityHandler.getItemDef(TOY3_ID).getName() + ". Izzy took that one.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well did you know him very well? Where's somewhere he's likely to go?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I knew him very well.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("He was my younger brother.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("I'm sorry, farrel.", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "What he's become... he's not my brother anymore", + "All I know that might help you is that, unlike the rest of us", + "Izzy loved the heat. Flames, lava, that sort of thing", + "And he also loved the ocean. You know this land", + "Take what little information I have to offer", + "And find my brother. Get the last toy back." + ); + player.setBusy(false); + int option = getMenuOption(player, "Of course, Farrel", "No. I refuse to murder your brother", "I've had enough of this"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you dearly, " + player.getUsername(), + "Good luck. Please, make his death quick." + ); + player.setQuestStage(getUniqueID(), 6); + player.setBusy(false); + npc.unblock(); + } else // No + { + sendChat("Then the death of Christmas is on your conscience.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles talking to the evil elves + */ + private void handleElfTalk(final Player player, final Npc npc) + { + sendChat("Get out of my way tall one", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } + + /** + * Handles talking to the evil wizard + */ + private void handleWizardTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("You! You thwarted my plans!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Christmas is for everyone! Why do you want to stop it?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "None of your business, fiend! I'm going to send you back in time", + "To before you ruined my plans!" + ); + player.setBusy(false); + int option = getMenuOption(player, "Please don't!", "Give it your best shot"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + queueChat(npc, player, DEFAULT_DELAY, + "Bah! It makes no difference anyway", + "I have more important things to ruin" + ); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I will!", + "Muahahaha!" + ); + player.getActionSender().sendTeleBubble(player.getLocation().getX(), player.getLocation().getY(), false); + player.getActionSender().sendSound("spellfail"); + player.teleport(289, 459, true); + sleep(DEFAULT_DELAY); + player.getActionSender().sendTeleBubble(289, 459, false); + sendChat("Huh? What? Where am i?", player, npc); + player.setQuestStage(getUniqueID(), -1); + npc.unblock(); + sleep(DEFAULT_DELAY); + player.setBusy(false); + if(player.getInventory().hasItemId(TOY1_ID) || player.getInventory().hasItemId(TOY2_ID) || player.getInventory().hasItemId(TOY3_ID) || player.getInventory().hasItemId(TOY4_ID) || player.getInventory().hasItemId(GIFT_ID)) + player.getActionSender().sendMessage("Santa's presents are unaffected by the Wizard's spell!"); + } + } else + { + sendChat("Hahaha! You may call me, the grinch! Bahaha!", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("He really does look quite insane"); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Construct the quest (empty) + */ + public Christmas() + { + } +} diff --git a/GameServer/conf/server/queststmp/Christmas.java.doc b/GameServer/conf/server/queststmp/Christmas.java.doc new file mode 100644 index 0000000..5aad67c --- /dev/null +++ b/GameServer/conf/server/queststmp/Christmas.java.doc @@ -0,0 +1,859 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; +import org.rscdaemon.server.entityhandling.defs.extras.ItemDropDef; +import org.rscdaemon.server.util.DataConversions; + +/** + * Quest: Christmas! (v1.0) 8/1/2009 + * Status: COMPLETE + * Start: Santa (id 798), 290,464 + * NPCs: Farrel (id 799), 106,670 + * 1st Elf (id 800), 71,589 + * 2nd Elf (id 800), 656,467 + * 3rd Elf (id 800), 403,685 + * Evil wizard (id 801), 279,454 + * Items: Santa hat (id 971), Santa top (id 1315), Santa legs (id 1314), Candy cane (id 1316), + * Toy 1 (id 1317), Toy 2 (id 1318), Toy 3 (id 1319), Toy 4 (id 1320), Gift box (id 1321) + * Reward: 0 quest points, Magic Gift Box (id 1321) (random item inside) + * + * @author punKrockeR + */ +public class Christmas extends Quest +{ + /* Here we define things which will be used in the quest, NPCs Items etc. You don't have to give the NPCs and Items a variable name but it is easier if you do and concidered 'proper' to do so. */ + private static final int SANTA_ID = 798; + private static final int FARREL_ID = 799; + private static final int ELF_ID = 800; + private static final int DARKWIZ_ID = 801; + private static final int SANTA_HAT_ID = 971; + private static final int SANTA_TOP_ID = 1315; + private static final int SANTA_LEG_ID = 1314; + private static final int CANDY_CANE_ID = 1316; + private static final int TOY1_ID = 1317; + private static final int TOY2_ID = 1318; + private static final int TOY3_ID = 1319; + private static final int TOY4_ID = 1320; + private static final int GIFT_ID = 1321; + private static final int DEFAULT_DELAY = 3200; // The default delay between chat messages, in miliseconds. + private static final int QUEST_POINTS = 0; // The amount of quest points the quest will give + /* + * private static final int REWARD_XP = 500; // Amount of XP which is given as a reward + */ + private World world = World.getWorld(); // You must include this + private static final ItemDropDef[] BOX_ITEMS = new ItemDropDef[] + { + new ItemDropDef(155, 1, 3200), // Coal, 42% + new ItemDropDef(SANTA_HAT_ID, 1, 799), // Santa hat, 2.99% + new ItemDropDef(SANTA_TOP_ID, 1, 2000), // Santa top, 20% + new ItemDropDef(SANTA_LEG_ID, 1, 2000), // Santa legs, 20% + new ItemDropDef(CANDY_CANE_ID, 1, 2000), // Candy cane, 15% + new ItemDropDef(575, 1, 1) // Christmas cracker, 0.01% + }; + + /** + * @return the quest's name + */ + public String getName() + { + return "Christmas!"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 5; + } + + /** + * Initialises the quest + * Here we associate all the NPCs, Items, GameObjects and such. It is imperative that you do this. + */ + public void init() + { + associateNpc(SANTA_ID); + associateNpc(FARREL_ID); + associateNpc(ELF_ID); + associateNpc(DARKWIZ_ID); + associateItem(TOY1_ID); + associateItem(TOY2_ID); + associateItem(TOY3_ID); + associateItem(TOY4_ID); + associateItem(GIFT_ID); + } + + /** + * @return if the given NPC is visible to the player + * This function is just an example of what can be done, it is unlikely you will need to use it and if you don't, obviously do not include it in your code. + */ + public boolean isNpcVisible(Npc npc, Player player) + { + + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 71 && npc.getLoc().startY() == 594) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 72 && npc.getLoc().startY() == 585) // First elf + return player.getQuestStage(this) == 2 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 653 && npc.getLoc().startY() == 467) // Second elf + return player.getQuestStage(this) == 4 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 419 && npc.getLoc().startY() == 684) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + else + if(npc.getLoc().getId() == ELF_ID && npc.getLoc().startX() == 408 && npc.getLoc().startY() == 685) // Last elf + return player.getQuestStage(this) == 6 && player.getQuestStage(this) != COMPLETE; + + return true; + } + + /** + * @return if the given item is visible to the player + * Same as the above function. + */ + public boolean isItemVisible(Item item, Player player) + { + if(item.getID() == TOY1_ID) + return player.getQuestStage(this) >= 2; + else + if(item.getID() == TOY2_ID) + return player.getQuestStage(this) >= 4; + else + if(item.getID() == TOY3_ID) + return player.getQuestStage(this) >= 6; + else + if(item.getID() == TOY4_ID) + return player.getQuestStage(this) >= 7; + + return true; + } + + /** + * @return if the player has the given item in his inventory, bank or if it's on the ground somewhere + * And again. + */ + public boolean hasItem(Player player, int id) + { + if(player.getInventory().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy!"); + return true; + } + + if(player.getBank().hasItemId(id)) + { + player.getActionSender().sendMessage("You already have this elf's toy in your bank!"); + return true; + } + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, 20); + for(int x = 0; x < tiles.length; x++) + { + for(int y = 0; y < tiles[x].length; y++) + { + ActiveTile t = tiles[x][y]; + if(t != null) + { + for(Item i : t.getItems()) + { + if(i.getID() == id) + { + if(i.getOwner().equals(player)) + { + player.getActionSender().sendMessage("You already have this elf's toy nearby on the ground!"); + return true; + } + } + } + } + } + } + + player.getActionSender().sendMessage("The toy falls to the ground"); + return false; + } + + /** + * Handles the given quest action + * You will use this function for every quest, the arguments must be the same. + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.USED_ITEM) + { + if(!(args[0] instanceof InvItem)) + return; + + final InvItem item = (InvItem)args[0]; + + handleUseItem(item, player); + } else + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == SANTA_ID) + { + player.setBusy(true); + + if(stage == -1) + startQuest(player, npc); + else + handleSantaTalk(player, npc); + } else + if(npc.getID() == FARREL_ID) + { + player.setBusy(true); + handleFarrelTalk(player, npc); + } else + if(npc.getID() == ELF_ID) + { + player.setBusy(true); + handleElfTalk(player, npc); + } + else + if(npc.getID() == DARKWIZ_ID) + { + player.setBusy(true); + handleWizardTalk(player, npc); + } + } else + if(action == action.KILLED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() == ELF_ID) // If the player doesn't have the toy in their bank or inventory, drop the toy. + { + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 589 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 71 && npc.getLoc().startY() == 594 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 72 && npc.getLoc().startY() == 585 && player.getQuestStage(this) == 2 && !hasItem(player, TOY1_ID)) + world.registerItem(new Item(TOY1_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 653 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 656 && npc.getLoc().startY() == 467 && player.getQuestStage(this) == 4 && !hasItem(player, TOY2_ID)) + world.registerItem(new Item(TOY2_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 403 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 419 && npc.getLoc().startY() == 684 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + else + if(npc.getLoc().startX() == 408 && npc.getLoc().startY() == 685 && player.getQuestStage(this) == 6 && !hasItem(player, TOY3_ID)) + world.registerItem(new Item(TOY3_ID, npc.getX(), npc.getY(), 1, player)); + } + } + } + + /** + * Handles item use + */ + private void handleUseItem(final InvItem item, final Player player) + { + if(item.getID() == GIFT_ID) + { + player.setBusy(true); + player.getActionSender().sendMessage("You open the " + item.getDef().getName() + "..."); + sleep(2000); + int total = 0; + for(ItemDropDef drop : BOX_ITEMS) + total += drop.getWeight(); + + int hit = DataConversions.random(0, total); + total = 0; + ItemDropDef reward = null; + for(ItemDropDef drop : BOX_ITEMS) + { + if(hit >= total && hit < (total + drop.getWeight())) + { + reward = drop; + break; + } + + total += drop.getWeight(); + } + + player.getInventory().remove(GIFT_ID, 1); + if(reward == null) + player.getActionSender().sendMessage("You don't get shit! (reward is null)"); + else + player.getInventory().add(new InvItem(reward.getID(), reward.getAmount())); + + player.getActionSender().sendMessage("It contained a " + ((reward.getAmount() > 1) ? reward.getAmount() : "a ") + EntityHandler.getItemDef(reward.getID()).getName() + (reward.getAmount() > 1 ? "s" : "") + "!"); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + } else + player.setBusy(false); + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + player.setBusy(true); + sendChat("Christmas! It's ruined!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Why?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The presents... they're gone!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What presents? Gone where?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("All my Christmas presents have been stolen!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Who stole them?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "My own elves!", + "I landed here last night in my sleigh", + "To deliver my presents to the citizens of this land", + "But an evil Dark Knight wizard cast a spell on my Elves", + "And they stole my presents and ran away!" + ); + player.setBusy(false); + int option = getMenuOption(player, "That sucks", "Where are they now?", "Good luck with that"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Indeed it does!", npc, player); + player.setBusy(false); + npc.unblock(); + } else + if(option == 1) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I don't know. But one of the elves, Farrel, he's in Lumbridge", + "It appears the spell didn't affect him", + "But he's in hiding from the other elves who have turned evil!", + "And I'm afraid the spell is quite irreversible" + ); + player.setBusy(false); + option = getMenuOption(player, "Maybe I can help?", "Christmas really is ruined then"); + if(option == -1) + return; + player.setBusy(true); + sleep(2000); + if(option == 0) + { + if(player.getQuestPoints() < 2) + { + sendChat("I doubt it, you don't have a very good reputation for helping people", npc, player); + player.setBusy(false); + npc.unblock(); + sleep(2000); + player.getActionSender().sendMessage("You need at least 2 Quest Points to start this quest"); + } else + { + queueChat(npc, player, DEFAULT_DELAY, + "Perhaps you can... I don't know where the others are", + "But if you can find Farrel, he can help you find them", + "All I know is that he's in Lumbridge", + "He said he's hiding near a church", + "Please find him and help me save Christmas!" + ); + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("I'm afraid so!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Oh, I'll need it!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles Santa's chat if the quest is started but not finished + */ + private void handleSantaTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("Merry christmas, hero!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) != 7) + { + sendChat("Oh, " + player.getUsername() + ". Please find those elves!", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } else + { + if(!player.getInventory().hasItemId(TOY1_ID) || !player.getInventory().hasItemId(TOY2_ID) || !player.getInventory().hasItemId(TOY3_ID) || !player.getInventory().hasItemId(TOY4_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Farrel said you'd collected the toys", + "Please bring them all to me as soon as possible!" + ); + npc.unblock(); + player.setBusy(false); + return; + } + + queueChat(npc, player, DEFAULT_DELAY, + player.getUsername() + "! I can't express my gratitude with words", + "You saved Christmas for your land!", + "I don't have anything I can spare for you", + "But I can give you your present early", + "It's a magic gift box. The item within is unknown", + "I hope you get something fantastic!", + "You deserve it for your heroic antics.", + "Farewell kind " + (player.isMale() ? "sir" : "lady") + "! And meeeeery christmas!" + ); + + player.getActionSender().sendMessage("Santa takes the toys and hands you a small gift box"); + if(player.getInventory().remove(TOY1_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY2_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY3_ID, 1) == -1) { player.setBusy(false); return; } + if(player.getInventory().remove(TOY4_ID, 1) == -1) { player.setBusy(false); return; } + player.getInventory().add(new InvItem(GIFT_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), COMPLETE); + sleep(2500); + player.getActionSender().sendMessage("Maybe I should go and talk to that Evil Dark Knight Wizard..."); + } + } + + /** + * Handles Farrel's chat if the quest is started but not finished + */ + private void handleFarrelTalk(final Player player, final Npc npc) + { + player.setBusy(true); + if(player.getQuestStage(this) == -1) + { + sendChat("Bugger off", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } else + if(player.getQuestStage(this) == 1) + { + player.setBusy(true); + sendChat("Who are you?", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Santa sent me to find you", player, npc); + sleep(DEFAULT_DELAY); + sendChat("What for?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "To murder you", "To help"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Go for it. It's only a matter of time before they find me anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Well if Santa trusts you, I guess I can.", + "We must get started at once if we're to find the others." + ); + player.setBusy(false); + option = getMenuOption(player, "Any idea where they are?", "Maybe later"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "One of them ran to the desert nearby", + "I don't know where he's hiding, but we hate the heat", + "He must be hiding near cliffs or rocks that offer shade", + "You know this land better than I", + "It would be safer for all involved if you went, and not me" + + ); + player.setBusy(false); + option = getMenuOption(player, "I agree", "Pussy"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Excellent. He should be carrying a small " + EntityHandler.getItemDef(TOY1_ID).getName(), + "Get it and bring it to me. Use any means necessary. Any.", + "My comrades cannot be saved now." + ); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 2); + } else // No + { + sendChat("Santa's trust was misplaced. Christmas is truly ruined.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("There won't be a \"later\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 2) + { + sendChat("Have you found the first toy?", npc, player); + sleep(2000); + player.setBusy(false); + int option = getMenuOption(player, "Not yet", "Yeah"); + if(option == -1) + return; + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + sendChat("Well please act quickly. Time is running out! Remember, he's in the desert", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + if(player.getInventory().hasItemId(TOY1_ID)) + { + sendChat("Great! Please, hand it to me", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY1_ID).getName()); + player.setQuestStage(getUniqueID(), 3); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY1_ID, 1); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage3(npc, player); + } else + { + sendChat("No you haven't. Please don't fool around. Time is running out!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } else + if(player.getQuestStage(this) == 3) + { + questStage3(npc, player); + } else + if(player.getQuestStage(this) == 4) + { + sendChat("Have you found the second toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Right on brother", "No"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + if(player.getInventory().hasItemId(TOY2_ID)) + { + sendChat("I don't know what that means, but please hand me the toy", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("You give Farrel the " + EntityHandler.getItemDef(TOY2_ID).getName()); + player.getActionSender().sendSound("click"); + player.getInventory().remove(TOY2_ID, 1); + player.setQuestStage(getUniqueID(), 5); + player.getActionSender().sendInventory(); + sleep(DEFAULT_DELAY); + questStage5(npc, player); + } else + { + sendChat("I don't know what that means, but you don't have the toy", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Please hurry. Christmas is almost over!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // Yes + { + sendChat("Well please hurry. Christmas is almost over! Remember, \"Baxtorian Falls\"!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + if(player.getQuestStage(this) == 5) + { + questStage5(npc, player); + } else + if(player.getQuestStage(this) == 6) // Final present + { + player.setBusy(true); + sendChat("Did you get izzy's toy?", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + if(player.getInventory().hasItemId(TOY3_ID)) + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you so much, " + player.getUsername(), + "You single-handedly saved Christmas.", + "The elves at the north pole will write songs of you hero", + "You will be respected and remembered forever, believe me.", + "The final present, I have kept all along", + "Here, you take all four presents and give them to santa", + "I'll tell him of your bravery", + "I'm sure he'll want to reward you", + "Farewell, " + player.getUsername() + ".", + "Merry christmas." + ); + player.getActionSender().sendMessage("Farrel hands you the three toys"); + if(player.getInventory().hasItemId(TOY1_ID)) { sendChat("Oh... You already have the toys.", npc, player); player.setBusy(false); return; } + player.getInventory().add(new InvItem(TOY1_ID, 1)); + player.getInventory().add(new InvItem(TOY2_ID, 1)); + //player.getInventory().add(new InvItem(TOY3_ID, 1)); + player.getInventory().add(new InvItem(TOY4_ID, 1)); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 7); + } else + { + sendChat("No you don't.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Remember, flames and lava and the ocean are Izzy's favourite things", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else // No + { + sendChat("Please get it. Don't hesitate just because he's my brother.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } else + { + sendChat("Hey there, " + player.getUsername() + "!", npc, player); + sleep(DEFAULT_DELAY); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 3 chat + */ + private void questStage3(final Npc npc, final Player player) + { + sendChat("So what now?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "While you were gone, I did some reconnaissance work", + "I overheard some humans talking about a deranged Elf they saw while sightseeing" + ); + player.setBusy(false); + int option = getMenuOption(player, "Yes.", "No."); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "A place called the \"Baxtorian Falls\". Somewhere near a gnome stronghold.", + "It's not much of a lead, but it's all we've got" + ); + sendChat("I'll get on it then", player, npc); + player.setBusy(false); + npc.unblock(); + player.setQuestStage(getUniqueID(), 4); + } else // No + { + sendChat("Suit yourself, grinch.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles quest stage 5 chat + */ + private void questStage5(final Npc npc, final Player player) + { + sendChat("What's next little guy?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("Don't patronize me, " + player.getUsername() + ". I'm stronger in ways you can't even imagine", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well I'll take your word for it. Where's the last elf?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I don't know.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("What? Not even a clue?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I'm afraid you'll have to find izzy on your own", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Izzy? That's his name?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("The last toy to get is a " + EntityHandler.getItemDef(TOY3_ID).getName() + ". Izzy took that one.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Well did you know him very well? Where's somewhere he's likely to go?", player, npc); + sleep(DEFAULT_DELAY); + sendChat("I knew him very well.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("He was my younger brother.", npc, player); + sleep(DEFAULT_DELAY); + sendChat("I'm sorry, farrel.", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "What he's become... he's not my brother anymore", + "All I know that might help you is that, unlike the rest of us", + "Izzy loved the heat. Flames, lava, that sort of thing", + "And he also loved the ocean. You know this land", + "Take what little information I have to offer", + "And find my brother. Get the last toy back." + ); + player.setBusy(false); + int option = getMenuOption(player, "Of course, Farrel", "No. I refuse to murder your brother", "I've had enough of this"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "Thank you dearly, " + player.getUsername(), + "Good luck. Please, make his death quick." + ); + player.setQuestStage(getUniqueID(), 6); + player.setBusy(false); + npc.unblock(); + } else // No + { + sendChat("Then the death of Christmas is on your conscience.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Handles talking to the evil elves + */ + private void handleElfTalk(final Player player, final Npc npc) + { + sendChat("Get out of my way tall one", npc, player); + sleep(2000); + player.setBusy(false); + npc.unblock(); + } + + /** + * Handles talking to the evil wizard + */ + private void handleWizardTalk(final Player player, final Npc npc) + { + if(player.getQuestStage(this) == COMPLETE) + { + sendChat("You! You thwarted my plans!", npc, player); + sleep(DEFAULT_DELAY); + sendChat("Christmas is for everyone! Why do you want to stop it?", player, npc); + sleep(DEFAULT_DELAY); + queueChat(npc, player, DEFAULT_DELAY, + "None of your business, fiend! I'm going to send you back in time", + "To before you ruined my plans!" + ); + player.setBusy(false); + int option = getMenuOption(player, "Please don't!", "Give it your best shot"); + if(option == -1) + return; + player.setBusy(true); + sleep(DEFAULT_DELAY); + if(option == 0) // No + { + queueChat(npc, player, DEFAULT_DELAY, + "Bah! It makes no difference anyway", + "I have more important things to ruin" + ); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + queueChat(npc, player, DEFAULT_DELAY, + "I will!", + "Muahahaha!" + ); + player.getActionSender().sendTeleBubble(player.getLocation().getX(), player.getLocation().getY(), false); + player.getActionSender().sendSound("spellfail"); + player.teleport(289, 459, true); + sleep(DEFAULT_DELAY); + player.getActionSender().sendTeleBubble(289, 459, false); + sendChat("Huh? What? Where am i?", player, npc); + player.setQuestStage(getUniqueID(), -1); + npc.unblock(); + sleep(DEFAULT_DELAY); + player.setBusy(false); + if(player.getInventory().hasItemId(TOY1_ID) || player.getInventory().hasItemId(TOY2_ID) || player.getInventory().hasItemId(TOY3_ID) || player.getInventory().hasItemId(TOY4_ID) || player.getInventory().hasItemId(GIFT_ID)) + player.getActionSender().sendMessage("Santa's presents are unaffected by the Wizard's spell!"); + } + } else + { + sendChat("Hahaha! You may call me, the grinch! Bahaha!", npc, player); + sleep(DEFAULT_DELAY); + player.getActionSender().sendMessage("He really does look quite insane"); + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Construct the quest (empty) + */ + public Christmas() + { + } +} diff --git a/GameServer/conf/server/queststmp/CooksAssistant.java b/GameServer/conf/server/queststmp/CooksAssistant.java new file mode 100644 index 0000000..0d56731 --- /dev/null +++ b/GameServer/conf/server/queststmp/CooksAssistant.java @@ -0,0 +1,307 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; + +/** + * Quest: Cook's Assistant (v1.0) + * Status: COMPLETE + * Start: Lumbridge cook (id 7) + * Items: 19, 136, 22 + * Reward: 1 quest point, 350 cooking xp + * + * @author youKnowWho + */ +public class CooksAssistant extends Quest +{ + private static final int COOK_ID = 7; + private static final int ITEM_EGG = 19; + private static final int ITEM_FLOUR = 136; + private static final int ITEM_MILK = 22; + private static final int REWARD_XP = 350; + private static final String[] FIRST_MENU = new String[]{"Oh, ok, sorry.", "Well maybe I can help?"}; + private static final String[] SECOND_MENU = new String[]{"Sure, what do you need?", "No, sorry"}; + private static final int QUEST_POINTS = 1; + + public void init() + { + associateNpc(COOK_ID); + } + + public CooksAssistant() + { + } + + public String getName() + { + return "Cook's Assistant"; + } + + public int getUniqueID() + { + return 0; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(stage == -1) // Quest hasn't been started + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Sorry, I can't talk right now, I'm very busy!", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 0: + player.setBusy(false); + npc.unblock(); + sendChat("Oh, ok, sorry.", player, npc); + break; + case 1: + sendChat("Well maybe I can help?", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Perhaps you can... You see, it's the duke's birthday tomorrow", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("And I haven't got the ingredients for his cake yet!", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Do you think you could collect them for me?", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 0: + sendChat("Sure, what do you need?", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Oh thank you so much! I'm going to need an egg, some milk and a pot of flour.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Please, hurry!", npc, player); + player.setQuestStage(getUniqueID(), 1); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + break; + case 1: + sendChat("No, sorry", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Fine. I didn't want your help anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(SECOND_MENU); + } + }); + } + }); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(FIRST_MENU); + } + }); + } else + return; + } else + if(stage == 1) + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Sorry, I can't - oh, it's you! Do you have the ingredients?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(new String[]{"I forgot what to get!","Yes, i have them","No, not yet"}) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + sendChat(reply, player, npc); + + if(option == 0) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I need an egg, a pot flour and some milk! And quickly!", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } else + if(option == 1) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + //check items + if(player.getInventory().hasItemId(ITEM_EGG) && player.getInventory().hasItemId(ITEM_FLOUR) && player.getInventory().hasItemId(ITEM_MILK)) + { + finishQuest(player, npc); + } else + { + sendChat("No you don't! Oh please, don't get my hopes up like that!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } else + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Oh, please hurry!", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } + } + }); + + owner.getActionSender().sendMenu(new String[]{"I forgot what to get!","Yes, i have them","No, not yet"}); + } + }); + } + } else + if (stage == 0) { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Oh hi " + player.getUsername() + ". Thanks for your help! I can't talk at the moment though.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) + { + sendChat("Oh, thank you so much " + player.getUsername() + "!", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I'm afraid don't have any money to reward you with", npc, player); + addSingleEvent(new SingleEvent(player, 3000) + { + public void action() + { + sendChat("But I can give you some cooking tips!", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.incExp(7, REWARD_XP, false); + player.getActionSender().sendStat(7); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.getInventory().remove(ITEM_EGG, 1); + player.getInventory().remove(ITEM_MILK, 1); + player.getInventory().remove(ITEM_FLOUR, 1); + player.getActionSender().sendInventory(); + player.incQuestPoints(QUEST_POINTS); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } +} diff --git a/GameServer/conf/server/queststmp/Dorics_Quest.java.bk b/GameServer/conf/server/queststmp/Dorics_Quest.java.bk new file mode 100644 index 0000000..fa24707 --- /dev/null +++ b/GameServer/conf/server/queststmp/Dorics_Quest.java.bk @@ -0,0 +1,280 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; + +/** + * Quest: Doric's Quest (v1.0) + * Status: Complete + * Start: Doric (id 144), 325, 490 + * Items: 148x6, 150x4 & 151x2 + * Reward: 1 quest point, 180 gold, Mining experience (amount depends on your level) & the use of Doric.s Anvils * + * @author DvD + */ +public class Dorics_Quest extends Quest +{ + private final int DORIC_ID = 144; + private final int ITEM_CLAY = 149; + private final int ITEM_COPPER = 150; + private final int ITEM_IRON = 151; + private final int REWARD_XP = 200; + private final int REWARD_GP = 180; + private final String[] FIRST_MENU = new String[]{"Sure, what do I need to do?", "No thanks."}; + private final String[] SECOND_MENU = new String[]{"Sorry, I don't like the sound of that.", "I'd be happy to help."}; + + public void init() + { + associateNpc(DORIC_ID); + } + + public Dorics_Quest() + { + } + + public String getName() + { + return "Doric's Quest"; + } + + public int getUniqueID() + { + return 3; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(stage == -1) // Quest hasn't been started + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != DORIC_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Ay mate, Would you be interested in helping me make an amulet?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 0: + player.setBusy(false); + npc.unblock(); + sendChat("No thanks, I'm good.", player, npc); + break; + case 1: + sendChat("Sure, what do I need to do?", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("First you need to collect 6 Clay, 4 Copper ore & 2 Iron ore.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Then I.ll need you to bring them back to me.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I.m afraid you.ll have to find your own pickaxe though.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 0: + sendChat("Sure ! I.ll get right onto it.", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I.ll be waiting for those ores don.t take to long.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setQuestStage(getUniqueID(), 1); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + break; + case 1: + sendChat("Sorry, I don't like the sound of that.", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Suit yourself. Come and see me if you change your mind.", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(SECOND_MENU); + } + }); + } + }); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(FIRST_MENU); + } + }); + } else + return; + } else + if(stage == 1) + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != DORIC_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("There you are ! Do you have my ores?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(new String[]{"No sorry, Not yet.", "I sure do!"}) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + sendChat(reply, player, npc); + + if(option == 0) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Well, come and see me when you do. I need that amulet made", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } else + if(option == 1) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + //check items + if(player.getInventory().hasItemId(ITEM_CLAY) && player.getInventory().countId(ITEM_CLAY) >= 6) && player.getInventory().hasItemId(ITEM_COPPER) && player.getInventory().countId(ITEM_COPPER) >= 4) && player.getInventory().hasItemId(ITEM_IRON) && player.getInventory().countId(ITEM_IRON) >= 2) + { + finishQuest(player, npc); + } else + { + sendChat("Um, no you don't. Please hurry I need that amulet made.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } + } + }); + + owner.getActionSender().sendMenu(new String[]{"I'm afraid not.", "Yes, I do."}); + } + }); + } + } else + if (stage == 0) { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != DORIC_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hello " + player.getUsername() + "!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) + { + sendChat("Thank you so much my amulet is now complete, Here is your reward.", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.incExp(14, REWARD_XP, false); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.getInventory().add(new InvItem(10, REWARD_GP)); + player.getInventory().remove(ITEM_CLAY, 6); + player.getInventory().remove(ITEM_COPPER, 4); + player.getInventory().remove(ITEM_IRON, 2); + player.getActionSender().sendInventory(); + player.incQuestPoints(1); + player.setBusy(false); + npc.unblock(); + } + }); + } +} diff --git a/GameServer/conf/server/queststmp/ImpCatcher.java b/GameServer/conf/server/queststmp/ImpCatcher.java new file mode 100644 index 0000000..d0b1d9a --- /dev/null +++ b/GameServer/conf/server/queststmp/ImpCatcher.java @@ -0,0 +1,687 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; + +/** + * Quest: Imp Catcher (v1.0) 5/1/2009 + * Status: COMPLETE + * Start: Talborn the wizard (id 17), 218, 1635 + * Items: 231, 232, 233, 234 + * Reward: 1 quest point, 350 magic xp + * + * @author punKrockeR + */ +public class ImpCatcher extends Quest +{ + private static final int TALBORN_ID = 17; + private static final int RED_BEAD = 231; + private static final int YELLOW_BEAD = 232; + private static final int BLACK_BEAD = 233; + private static final int WHITE_BEAD = 234; + private static final int ITEM_REWARD = 235; + private static final int REWARD_XP = 350; + private static final String[] FIRST_MENU = new String[] { "No way you crazy bastard", "Sure, why not" }; + private static final String[] SECOND_MENU = new String[] { "Yeah I did", "Not yet" }; + private static final int DEFAULT_EVENT_DELAY = 3200; + private static final int QUEST_POINTS = 1; + + /** + * @return the quest's name + */ + public String getName() + { + return "Imp Catcher"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 3; + } + + /** + * Initialises the quest + */ + public void init() + { + associateNpc(TALBORN_ID); + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != TALBORN_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + if(stage == -1) + startQuest(player, npc); + else + handleTalk(player, npc); + } + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + sendChat("...Avada kedavra!", npc, player); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + spellPlayer(player, npc); + addSingleEvent(new SingleEvent(player, 1000) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Holy shit!", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("What? Huh? Get out of the way you fool!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("You shot me you stupid sod", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hmm, indeed. But it worked!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Yeah it did. You burnt my sleeve.", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Collateral damage. A necessary casualty.", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Your sleeve is expendable in this war", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("What war?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Well the war against those nasty little imps of course", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Imps? What threat could they possibly pose?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Those little bastards stole my beads!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Riight.. your beads. And what's so special about these beads?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Why, absolutely nothing. It's the principle of the matter.", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Surely it can't be that hard to get them to give them back", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Oh really? Why don't you try and get them back then", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Yeah right, chase imps around for free. You're crazier than I thought", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Free? Nonsense. I'd be happy to reward you.", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hmm. What kind of reward?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + player.setBusy(true); + sendChat("I've got a few valuable things lying around, I'll find something.", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + player.setBusy(true); + sendChat("How about it? Would you help an old wizard out?", npc, player); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat(reply, player, npc); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + if(option == 1) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Excellent! Begin at once if you wish to collect them within a decade", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("There are four beads! Red, white, black, yellow and black.", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ahh you said... nevermind", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("I'll come back when I get the beads...", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("If! If you get the beads. Don't underestimate the little beasts!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Sure, whatever old man.", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + player.setQuestStage(getUniqueID(), 1); + sendChat("Tarantallegra!", npc, player); + spellPlayer(player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Ouch! Would you bloody wait til I'm gone!", player, npc); + player.setBusy(false); + npc.unblock(); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Move it!", npc, player); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } else + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Fine. But don't come to me when you need some pomegranate!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Okaaay...", player, npc); + player.setBusy(false); + npc.unblock(); + } + }); + } + } + }); + } + }); + player.getActionSender().sendMenu(FIRST_MENU); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + + /** + * Handles npc chat if the quest is started but not finished + */ + private void handleTalk(final Player player, final Npc npc) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("I know you. You're that fellow that stole my beads!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("What? No, I'm the one that offered to find them for you.", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("It makes no difference, I still don't like you.", npc, player); + + if(player.getQuestStage(getUniqueID()) != COMPLETE) + { + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("But my beads, did you find them?", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(false); + npc.blockedBy(player); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + sendChat(reply, player, npc); + if(option == 0) // Yes + { + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + if(player.getInventory().hasItemId(RED_BEAD) && player.getInventory().hasItemId(YELLOW_BEAD) && player.getInventory().hasItemId(BLACK_BEAD) && player.getInventory().hasItemId(WHITE_BEAD)) + { + sendChat("Excellent! Hand them over immediately", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Alright, calm down. I thought they were useless anyway", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Useless! Oh my dear " + (player.isMale() ? "boy" : "girl") + ", they are quite important", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + finishQuest(player, npc); + } + }); + } + }); + } + }); + } else + { + sendChat("Bollocks! Don't return til you have them you fool", npc, player); + spellPlayer(player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Hey! Watch yourself old man", player, npc); + player.setBusy(false); + npc.unblock(); + } + }); + } + } + }); + } else // No + { + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Well what are you doing here then? Move it!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + spellPlayer(player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Would you bugger off with the spells you mad fool!", player, npc); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } + } + }); + player.getActionSender().sendMenu(SECOND_MENU); + } + }); + } + }); + } else + { + player.setBusy(false); + npc.unblock(); + } + } + }); + } + }); + } + + /** + * Finishes the quest + */ + private void finishQuest(final Player player, final Npc npc) + { + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage("You hand over the beads"); + player.getInventory().remove(YELLOW_BEAD, 1); + player.getInventory().remove(RED_BEAD, 1); + player.getInventory().remove(WHITE_BEAD, 1); + player.getInventory().remove(BLACK_BEAD, 1); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Alright, that's my half of the bargain.", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Now what of my reward?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ah, your reward. I found this! You can take it.", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage(EntityHandler.getNpcDef(TALBORN_ID).getName() + " gives you one " + EntityHandler.getItemDef(ITEM_REWARD).getName()); + player.getInventory().add(new InvItem(ITEM_REWARD, 1)); + player.getActionSender().sendInventory(); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("What am I supposed to do with this?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("I don't know, whatever you like. I certainly don't want it", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("And have a read of this book", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("It'll teach you a thing or two about magic!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage("You read the wizard's book"); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + player.incExp(6, REWARD_XP, false); + player.getActionSender().sendStat(6); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(true); + npc.blockedBy(player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Now I have work to do! Leave my tower!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + spellPlayer(player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Damnit! Gladly...", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.incQuestPoints(QUEST_POINTS); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + + /** + * Casts an imaginary spell at the player + */ + private void spellPlayer(Player player, Npc npc) + { + player.setLastDamage(0); + player.informOfModifiedHits(player); + player.getActionSender().sendTeleBubble(npc.getLocation().getX(), npc.getLocation().getY(), false); + player.getActionSender().sendSound("combat1a"); + } + + /** + * Construct the quest (empty) + */ + public ImpCatcher() + { + } +} \ No newline at end of file diff --git a/GameServer/conf/server/queststmp/SheepShearer.java b/GameServer/conf/server/queststmp/SheepShearer.java new file mode 100644 index 0000000..43251cf --- /dev/null +++ b/GameServer/conf/server/queststmp/SheepShearer.java @@ -0,0 +1,280 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; + +/** + * Quest: Sheep Shearer (v1.0) + * Status: COMPLETE + * Start: Fred the farmer (id 77), 159, 619 + * Items: 207x20 + * Reward: 1 quest point, 60 gold, Crafting 350 xp + * + * @author Konijn + */ +public class SheepShearer extends Quest +{ + private final int FRED_ID = 77; + private final int ITEM_WOOL = 207; + private final int REWARD_XP = 350; + private final int REWARD_GP = 330; + private final String[] FIRST_MENU = new String[]{"Sure, what do I need to do?", "No thanks, I'm good."}; + private final String[] SECOND_MENU = new String[]{"Sorry, I don't like the sound of that.", "I'd be happy to help."}; + + public void init() + { + associateNpc(FRED_ID); + } + + public SheepShearer() + { + } + + public String getName() + { + return "Sheep Shearer"; + } + + public int getUniqueID() + { + return 1; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(stage == -1) // Quest hasn't been started + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Hi there, traveller. Care to make some money?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 1: + player.setBusy(false); + npc.unblock(); + sendChat("No thanks, I'm good.", player, npc); + break; + case 0: + sendChat("Sure, what do I need to do?", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("If you collect 20 balls of wool for me, I'll pay you 500 coins.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Maybe I'll teach you a thing or two about crafting, too.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("I'm afraid you'll have to find your own shears, but the sheep are outside.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + switch(option) + { + case 1: + sendChat("I'd be happy to help.", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Great! Come back and see me when you're done.", npc, player); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setQuestStage(getUniqueID(), 1); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + break; + case 0: + sendChat("Sorry, I don't like the sound of that.", player, npc); + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Suit yourself. Come and see me if you change your mind.", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(SECOND_MENU); + } + }); + } + }); + } + }); + } + }); + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + } + }); + owner.getActionSender().sendMenu(FIRST_MENU); + } + }); + } else + return; + } else + if(stage == 1) + { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ahh, you've returned! Do you have my wool?", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(new String[]{"I'm afraid not.", "Yes, I do."}) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + sendChat(reply, player, npc); + + if(option == 0) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + sendChat("Well, come and see me when you do. The offer still stands", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } else + if(option == 1) + { + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + //check items + if(player.getInventory().hasItemId(ITEM_WOOL) && player.getInventory().countId(ITEM_WOOL) >= 20) + { + finishQuest(player, npc); + } else + { + sendChat("Um, no you don't. Get back to me when you do. The reward still stands!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } + } + }); + + owner.getActionSender().sendMenu(new String[]{"I'm afraid not.", "Yes, I do."}); + } + }); + } + } else + if (stage == 0) { + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + if(npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hello " + player.getUsername() + "!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) + { + sendChat("Thank you very much! As promised, here's your reward.", npc, player); + + addSingleEvent(new SingleEvent(player, 2000) + { + public void action() + { + player.incExp(12, REWARD_XP, false); + player.getActionSender().sendStat(12); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + for(int i=0; i < 20; i++) + player.getInventory().remove(ITEM_WOOL, 1); + player.getInventory().add(new InvItem(10, REWARD_GP)); + player.getActionSender().sendInventory(); + player.incQuestPoints(1); + player.setBusy(false); + npc.unblock(); + } + }); + } +} + diff --git a/GameServer/conf/server/queststmp/VampireSlayer.java b/GameServer/conf/server/queststmp/VampireSlayer.java new file mode 100644 index 0000000..62d0148 --- /dev/null +++ b/GameServer/conf/server/queststmp/VampireSlayer.java @@ -0,0 +1,321 @@ +import org.rscdaemon.server.quest.*; +import org.rscdaemon.server.model.*; +import org.rscdaemon.server.event.*; +import org.rscdaemon.server.entityhandling.EntityHandler; + +/** + * Quest: Vampire Slayer (v1.0) 6/1/2009 + * Status: INCOMPLETE + * Start: Morgan (id 97), 215,615 + * NPCs: Harlow (id 98), 82,444 + * Items: + * Reward: 3 quest points, 1000 attack xp + * + * @author punKrockeR + */ +public class VampireSlayer extends Quest +{ + private static final int MORGAN_ID = 97; + private static final int HARLOW_ID = 98; + private static final int REWARD_XP = 1000; + private static final int DEFAULT_EVENT_DELAY = 3200; + private static final int QUEST_POINTS = 3; + private static final String[] FIRST_MENU = new String[] { "No. Vampires are scary", "Ok I'm up for an adventure", "I tried fighting him. He wouldn't die" }; + private static final String[] SECOND_MENU = new String[] { "No, you've had enough", "Ok mate", "Morgan needs your help" }; + + /** + * Don't load this quest yet it's incomplete + */ + public boolean loadQuest() + { + return false; + } + + /** + * @return the quest's name + */ + public String getName() + { + return "Vampire Slayer"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() + { + return 4; + } + + /** + * Initialises the quest + */ + public void init() + { + associateNpc(MORGAN_ID); + associateNpc(HARLOW_ID); + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, final Player player) + { + int stage = player.getQuestStage(this); + + if(action == action.TALKED_NPC) + { + if(!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc)args[0]; + + player.setBusy(true); + npc.blockedBy(player); + + if(npc.getID() == MORGAN_ID) + { + if(stage == -1) + startQuest(player, npc); + else + handleMorganTalk(player, npc); + } else + if(npc.getID() == HARLOW_ID) + { + handleHarlowTalk(player, npc); + } + } + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) + { + sendChat("Please, please help us bold hero!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("What's the problem?", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Our little village has been dreadfully ravaged by an evil vampire!", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("There's hardly any of us left", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("We need someone to get rid of him once and for good", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(false); + player.setMenuHandler(new MenuHandler(FIRST_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat(reply, player, npc); + + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + if(option == 0) // No + { + sendChat("I don't blame you", npc, player); + player.setBusy(false); + npc.unblock(); + } else // Yes + { + npc.blockedBy(player); + sendChat("I think first you should seek help", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("I have a friend who is a retired vampire hunter called Dr Harlow", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("He may be able to give you some tips", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("He's usually found in the Jolly Bar Inn these days", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("He's a bit of an old soak", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("Mention his old friend Morgan", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("I'm sure he wouldn't want me to be killed by a vampire", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("I'll look him up then", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setQuestStage(getUniqueID(), 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + }); + } + } + }); + } + }); + player.getActionSender().sendMenu(FIRST_MENU); + } + }); + } + }); + } + }); + } + }); + } + }); + } + + /** + * Handles Morgan's chat if the quest is started but not finished + */ + private void handleMorganTalk(final Player player, final Npc npc) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("How are you doing with your quest?", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + if(player.getQuestStage(getUniqueID()) == 1) + { + npc.blockedBy(player); + sendChat("I'm working on it still", player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("Please hurry", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + npc.blockedBy(player); + sendChat("Every day we live in fear of our lives", npc, player); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + sendChat("Afraid that we will be the vampire's next victim", npc, player); + player.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + } else + { + } + } + }); + } + + /** + * Handles Harlow's chat if the quest is started but not finished + */ + private void handleHarlowTalk(final Player player, final Npc npc) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Buy me a drrink pleassh", npc, player); + player.setBusy(false); + player.setMenuHandler(new MenuHandler(SECOND_MENU) + { + public void handleReply(final int option, final String reply) + { + player.setBusy(true); + npc.blockedBy(player); + sendChat(reply, player, npc); + addSingleEvent(new SingleEvent(player, DEFAULT_EVENT_DELAY) + { + public void action() + { + player.setBusy(false); + npc.unblock(); + + if(option == 0) + { + sendChat("Fuck you", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + }); + } + }); + player.getActionSender().sendMenu(SECOND_MENU); + } + + /** + * Finishes the quest + */ + private void finishQuest(final Player player, final Npc npc) + { + } + + /** + * Construct the quest (empty) + */ + public VampireSlayer() + { + } +} \ No newline at end of file diff --git a/GameServer/conf/server/queststmp/clear class files.bat b/GameServer/conf/server/queststmp/clear class files.bat new file mode 100644 index 0000000..e53814f --- /dev/null +++ b/GameServer/conf/server/queststmp/clear class files.bat @@ -0,0 +1,2 @@ +@echo off +del *.class \ No newline at end of file diff --git a/GameServer/conf/server/queststmp/compile quests.bat b/GameServer/conf/server/queststmp/compile quests.bat new file mode 100644 index 0000000..41d33d7 --- /dev/null +++ b/GameServer/conf/server/queststmp/compile quests.bat @@ -0,0 +1,4 @@ +@echo off +del *.class +javac -classpath .;../../../rscd.jar *.java +pause \ No newline at end of file diff --git a/GameServer/conf/server/queststmp/compile.sh b/GameServer/conf/server/queststmp/compile.sh new file mode 100644 index 0000000..f8e12b3 --- /dev/null +++ b/GameServer/conf/server/queststmp/compile.sh @@ -0,0 +1 @@ +/usr/java/jdk1.6.0_07/bin/javac -classpath /home/mscquests/rscd.jar *.java diff --git a/GameServer/conf/server/queststmp/java.policy.applet b/GameServer/conf/server/queststmp/java.policy.applet new file mode 100644 index 0000000..35527af --- /dev/null +++ b/GameServer/conf/server/queststmp/java.policy.applet @@ -0,0 +1,7 @@ +/* AUTOMATICALLY GENERATED ON Tue Apr 16 17:20:59 EDT 2002*/ +/* DO NOT EDIT */ + +grant { + permission java.security.AllPermission; +}; + diff --git a/GameServer/conf/server/queststmp/quests.jar b/GameServer/conf/server/queststmp/quests.jar new file mode 100644 index 0000000..1bc2277 Binary files /dev/null and b/GameServer/conf/server/queststmp/quests.jar differ diff --git a/GameServer/lib/.svn/entries b/GameServer/lib/.svn/entries new file mode 100644 index 0000000..f84afcd --- /dev/null +++ b/GameServer/lib/.svn/entries @@ -0,0 +1,436 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/lib +svn://localhost + + + +2009-09-30T13:19:19.379816Z +273 +Pets + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +mina.jar +file + + + + +2009-07-06T11:39:37.000000Z +eeee12d76057ab31dbef0c1741a7e982 +2009-07-06T11:38:38.639876Z +49 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +315582 + +hex-string.jar +file + + + + +2009-07-02T21:39:20.000000Z +c51c9c2f2879c2908054f857a6cbc5a4 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +1685 + +mina1.1.6.jar +file + + + + +2009-07-06T11:39:37.000000Z +7292cee9b59350f473127a9095f4fd21 +2009-07-06T11:38:38.639876Z +49 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +315765 + +junit.jar +file + + + + +2009-07-02T21:39:20.000000Z +3aa45be8fd3f5ae8c69b73959a7fa57c +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +112249 + +xpp3.jar +file + + + + +2009-07-02T21:39:20.000000Z +3bad226bc0f8c641fb7c8b20071a86af +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +24538 + +jmf.jar +file + + + + +2009-07-02T21:39:20.000000Z +7a117f4c5a48c6bf6b385fd682b8da89 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +2082557 + +bsh.jar +file + + + + +2009-07-19T10:28:48.000000Z +a1c60aa83c9c9a6cb2391c1c1b85eb00 +2009-07-18T20:38:42.561223Z +77 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +281694 + +mysql-connector.jar +file + + + + +2009-07-02T21:39:20.000000Z +be0a9e53f22f34a7a2da02ab97bba569 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +456729 + +pircbot.jar +file + + + + +2009-07-02T21:39:20.000000Z +24c1232877573f3e8291803a7b8a7d79 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +76667 + +slf4j.jar +file + + + + +2009-07-02T21:39:20.000000Z +64385455c0e1e9845835429c7295b954 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +13873 + +mina2.0.0.jar +file + + + + +2009-07-06T11:39:37.000000Z +5a439378b09a83da1e388e81dfdba354 +2009-07-06T11:38:38.639876Z +49 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +637782 + +xstream.jar +file + + + + +2009-07-02T21:39:20.000000Z +318abb3d0e94f263930938b9a8d8a08b +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +261710 + diff --git a/GameServer/lib/.svn/format b/GameServer/lib/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/GameServer/lib/.svn/format @@ -0,0 +1 @@ +9 diff --git a/GameServer/lib/.svn/prop-base/bsh.jar.svn-base b/GameServer/lib/.svn/prop-base/bsh.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/bsh.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/hex-string.jar.svn-base b/GameServer/lib/.svn/prop-base/hex-string.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/hex-string.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/jmf.jar.svn-base b/GameServer/lib/.svn/prop-base/jmf.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/jmf.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/junit.jar.svn-base b/GameServer/lib/.svn/prop-base/junit.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/junit.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/mina.jar.svn-base b/GameServer/lib/.svn/prop-base/mina.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/mina.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/mina1.1.6.jar.svn-base b/GameServer/lib/.svn/prop-base/mina1.1.6.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/mina1.1.6.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/mina2.0.0.jar.svn-base b/GameServer/lib/.svn/prop-base/mina2.0.0.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/mina2.0.0.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/mysql-connector.jar.svn-base b/GameServer/lib/.svn/prop-base/mysql-connector.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/mysql-connector.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/pircbot.jar.svn-base b/GameServer/lib/.svn/prop-base/pircbot.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/pircbot.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/slf4j.jar.svn-base b/GameServer/lib/.svn/prop-base/slf4j.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/slf4j.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/xpp3.jar.svn-base b/GameServer/lib/.svn/prop-base/xpp3.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/xpp3.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/prop-base/xstream.jar.svn-base b/GameServer/lib/.svn/prop-base/xstream.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/GameServer/lib/.svn/prop-base/xstream.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/GameServer/lib/.svn/text-base/bsh.jar.svn-base b/GameServer/lib/.svn/text-base/bsh.jar.svn-base new file mode 100644 index 0000000..36fe03d Binary files /dev/null and b/GameServer/lib/.svn/text-base/bsh.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/hex-string.jar.svn-base b/GameServer/lib/.svn/text-base/hex-string.jar.svn-base new file mode 100644 index 0000000..477c6cc Binary files /dev/null and b/GameServer/lib/.svn/text-base/hex-string.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/jmf.jar.svn-base b/GameServer/lib/.svn/text-base/jmf.jar.svn-base new file mode 100644 index 0000000..53d8c64 Binary files /dev/null and b/GameServer/lib/.svn/text-base/jmf.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/junit.jar.svn-base b/GameServer/lib/.svn/text-base/junit.jar.svn-base new file mode 100644 index 0000000..2c46d67 Binary files /dev/null and b/GameServer/lib/.svn/text-base/junit.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/mina.jar.svn-base b/GameServer/lib/.svn/text-base/mina.jar.svn-base new file mode 100644 index 0000000..a5fc451 Binary files /dev/null and b/GameServer/lib/.svn/text-base/mina.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/mina1.1.6.jar.svn-base b/GameServer/lib/.svn/text-base/mina1.1.6.jar.svn-base new file mode 100644 index 0000000..55c5490 Binary files /dev/null and b/GameServer/lib/.svn/text-base/mina1.1.6.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/mina2.0.0.jar.svn-base b/GameServer/lib/.svn/text-base/mina2.0.0.jar.svn-base new file mode 100644 index 0000000..092f6be Binary files /dev/null and b/GameServer/lib/.svn/text-base/mina2.0.0.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/mysql-connector.jar.svn-base b/GameServer/lib/.svn/text-base/mysql-connector.jar.svn-base new file mode 100644 index 0000000..4741577 Binary files /dev/null and b/GameServer/lib/.svn/text-base/mysql-connector.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/pircbot.jar.svn-base b/GameServer/lib/.svn/text-base/pircbot.jar.svn-base new file mode 100644 index 0000000..95cce20 Binary files /dev/null and b/GameServer/lib/.svn/text-base/pircbot.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/slf4j.jar.svn-base b/GameServer/lib/.svn/text-base/slf4j.jar.svn-base new file mode 100644 index 0000000..c78cb25 Binary files /dev/null and b/GameServer/lib/.svn/text-base/slf4j.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/xpp3.jar.svn-base b/GameServer/lib/.svn/text-base/xpp3.jar.svn-base new file mode 100644 index 0000000..780b574 Binary files /dev/null and b/GameServer/lib/.svn/text-base/xpp3.jar.svn-base differ diff --git a/GameServer/lib/.svn/text-base/xstream.jar.svn-base b/GameServer/lib/.svn/text-base/xstream.jar.svn-base new file mode 100644 index 0000000..3eabb85 Binary files /dev/null and b/GameServer/lib/.svn/text-base/xstream.jar.svn-base differ diff --git a/GameServer/lib/apache_mina/META-INF/LICENSE.jzlib.txt b/GameServer/lib/apache_mina/META-INF/LICENSE.jzlib.txt new file mode 100644 index 0000000..cdce500 --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/LICENSE.jzlib.txt @@ -0,0 +1,29 @@ +JZlib 0.0.* were released under the GNU LGPL license. Later, we have switched +over to a BSD-style license. + +------------------------------------------------------------------------------ +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/GameServer/lib/apache_mina/META-INF/LICENSE.slf4j.txt b/GameServer/lib/apache_mina/META-INF/LICENSE.slf4j.txt new file mode 100644 index 0000000..981e31a --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/LICENSE.slf4j.txt @@ -0,0 +1,30 @@ +Copyright (c) 2004-2005 SLF4J.ORG +Copyright (c) 2004-2005 QOS.ch + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, and/or sell copies of the Software, and to permit persons +to whom the Software is furnished to do so, provided that the above +copyright notice(s) and this permission notice appear in all copies of +the Software and that both the above copyright notice(s) and this +permission notice appear in supporting documentation. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY +SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER +RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF +CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, use +or other dealings in this Software without prior written authorization +of the copyright holder. + diff --git a/GameServer/lib/apache_mina/META-INF/LICENSE.springframework.txt b/GameServer/lib/apache_mina/META-INF/LICENSE.springframework.txt new file mode 100644 index 0000000..32af289 --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/LICENSE.springframework.txt @@ -0,0 +1,177 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/GameServer/lib/apache_mina/META-INF/LICENSE.txt b/GameServer/lib/apache_mina/META-INF/LICENSE.txt new file mode 100644 index 0000000..32af289 --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/LICENSE.txt @@ -0,0 +1,177 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/GameServer/lib/apache_mina/META-INF/MANIFEST.MF b/GameServer/lib/apache_mina/META-INF/MANIFEST.MF new file mode 100644 index 0000000..c80e7b7 --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Archiver-Version: Plexus Archiver +Created-By: Apache Maven +Built-By: trustin +Build-Jdk: 1.6.0_10-beta + diff --git a/GameServer/lib/apache_mina/META-INF/NOTICE.txt b/GameServer/lib/apache_mina/META-INF/NOTICE.txt new file mode 100644 index 0000000..868ca60 --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/NOTICE.txt @@ -0,0 +1,26 @@ +Apache MINA +Copyright 2007 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Message logging is provided by the SLF4J library package, +which is open source software, written by Ceki Gülcü, and +copyright by SLF4J.ORG and QOS.ch. The original software is +available from + + http://www.slf4j.org/ + +Data compression support is provided by the JZLib library package, +which is open source software, written by JCraft, and copyright +by JCraft. The original software is available from + + http://www.jcraft.com/jzlib/ + +Spring framework is provided by the Spring framework library +package, which is open source software, written by Rod Johnson +et al, and copyright by Springframework.org. The original +software is available from + + http://www.springframework.org/ + diff --git a/GameServer/lib/apache_mina/META-INF/maven/org.apache.mina/mina-core/pom.properties b/GameServer/lib/apache_mina/META-INF/maven/org.apache.mina/mina-core/pom.properties new file mode 100644 index 0000000..a3a9fbc --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/maven/org.apache.mina/mina-core/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Sat Apr 19 17:09:50 KST 2008 +version=1.1.7 +groupId=org.apache.mina +artifactId=mina-core diff --git a/GameServer/lib/apache_mina/META-INF/maven/org.apache.mina/mina-core/pom.xml b/GameServer/lib/apache_mina/META-INF/maven/org.apache.mina/mina-core/pom.xml new file mode 100644 index 0000000..152a0df --- /dev/null +++ b/GameServer/lib/apache_mina/META-INF/maven/org.apache.mina/mina-core/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + org.apache.mina + build + 1.1.7 + + mina-core + Apache MINA Core API + jar + + + + + org.slf4j + slf4j-api + 1.4.3 + compile + + + + org.slf4j + slf4j-simple + 1.4.3 + test + + + + easymock + easymock + 1.2_Java1.3 + test + + + + + + diff --git a/GameServer/lib/apache_mina/mina.jar b/GameServer/lib/apache_mina/mina.jar new file mode 100644 index 0000000..a5fc451 Binary files /dev/null and b/GameServer/lib/apache_mina/mina.jar differ diff --git a/GameServer/lib/bsh.jar b/GameServer/lib/bsh.jar new file mode 100644 index 0000000..36fe03d Binary files /dev/null and b/GameServer/lib/bsh.jar differ diff --git a/GameServer/lib/hex-string.jar b/GameServer/lib/hex-string.jar new file mode 100644 index 0000000..477c6cc Binary files /dev/null and b/GameServer/lib/hex-string.jar differ diff --git a/GameServer/lib/jmf.jar b/GameServer/lib/jmf.jar new file mode 100644 index 0000000..53d8c64 Binary files /dev/null and b/GameServer/lib/jmf.jar differ diff --git a/GameServer/lib/junit.jar b/GameServer/lib/junit.jar new file mode 100644 index 0000000..2c46d67 Binary files /dev/null and b/GameServer/lib/junit.jar differ diff --git a/GameServer/lib/mina.jar b/GameServer/lib/mina.jar new file mode 100644 index 0000000..a5fc451 Binary files /dev/null and b/GameServer/lib/mina.jar differ diff --git a/GameServer/lib/mysql-connector.jar b/GameServer/lib/mysql-connector.jar new file mode 100644 index 0000000..4741577 Binary files /dev/null and b/GameServer/lib/mysql-connector.jar differ diff --git a/GameServer/lib/pircbot.jar b/GameServer/lib/pircbot.jar new file mode 100644 index 0000000..b5cbfd9 Binary files /dev/null and b/GameServer/lib/pircbot.jar differ diff --git a/GameServer/lib/slf4j.jar b/GameServer/lib/slf4j.jar new file mode 100644 index 0000000..c78cb25 Binary files /dev/null and b/GameServer/lib/slf4j.jar differ diff --git a/GameServer/lib/xpp3.jar b/GameServer/lib/xpp3.jar new file mode 100644 index 0000000..780b574 Binary files /dev/null and b/GameServer/lib/xpp3.jar differ diff --git a/GameServer/lib/xstream.jar b/GameServer/lib/xstream.jar new file mode 100644 index 0000000..3eabb85 Binary files /dev/null and b/GameServer/lib/xstream.jar differ diff --git a/GameServer/logs/err.log b/GameServer/logs/err.log new file mode 100644 index 0000000..e69de29 diff --git a/GameServer/logs/error.log b/GameServer/logs/error.log new file mode 100644 index 0000000..e69de29 diff --git a/GameServer/logs/event.log b/GameServer/logs/event.log new file mode 100644 index 0000000..e69de29 diff --git a/GameServer/logs/mod.log b/GameServer/logs/mod.log new file mode 100644 index 0000000..e69de29 diff --git a/GameServer/rscd.jar b/GameServer/rscd.jar new file mode 100644 index 0000000..36225f2 Binary files /dev/null and b/GameServer/rscd.jar differ diff --git a/GameServer/run_server.bat b/GameServer/run_server.bat new file mode 100644 index 0000000..4ebdc20 --- /dev/null +++ b/GameServer/run_server.bat @@ -0,0 +1,5 @@ +@echo off +title GameServer +set PATH=%PATH%;ant\bin +ant runf2p +pause \ No newline at end of file diff --git a/GameServer/scripts/.svn/entries b/GameServer/scripts/.svn/entries new file mode 100644 index 0000000..bc4bc7f --- /dev/null +++ b/GameServer/scripts/.svn/entries @@ -0,0 +1,402 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/scripts +svn://localhost + + + +2009-10-30T22:33:07.431168Z +342 +Pets + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +170 - Seaman Lorris.bsh +file + + + + +2009-07-19T10:33:44.000000Z +4792a5be5dfd0d2198160ac7a5fbbf40 +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +565 + +415 - King Percival.bsh +file + + + + +2009-11-01T09:42:24.000000Z +650bbaee2e9ac9f9dd7c1f000451acdc +2009-10-30T22:33:07.431168Z +342 +Pets + + + + + + + + + + + + + + + + + + + + + +566 + +176 - Brother Jered.bsh +file + + + + +2009-07-19T10:33:44.000000Z +9422a3bf407e4e80fb135392d0cc294a +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +1477 + +166 - Captain Tobias.bsh +file + + + + +2009-07-19T10:33:44.000000Z +c731a858485975fdc76c1373ba833c52 +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +567 + +116 - Wyson the Gardener.bsh +file + + + + +2009-07-19T10:33:44.000000Z +c2278ee810a46e5ec9d95eb962f95cc2 +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +2341 + +171 - Seaman Thresnor.bsh +file + + + + +2009-07-19T10:33:44.000000Z +4792a5be5dfd0d2198160ac7a5fbbf40 +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +565 + +125 - Aggie.bsh +file + + + + +2009-07-19T10:33:44.000000Z +a3324620fdae550246bb44da1cf840fe +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +1405 + +194 - Ned.bsh +file + + + + +2009-07-19T10:33:44.000000Z +4945506e672eeccaf9076a337d15228a +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +2492 + +163 - Customs Officer.bsh +file + + + + +2009-07-19T10:33:44.000000Z +fe18ddd982a9b849cd6bc30289084175 +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +1426 + +142 - Barmaid.bsh +file + + + + +2009-07-19T10:33:44.000000Z +c432c879bfe601dcc60e1c144b9ca173 +2009-07-18T20:38:42.561223Z +77 +Pets + + + + + + + + + + + + + + + + + + + + + +1664 + +018 - Captain Rovin.bsh +file + + + + +2009-11-01T09:42:24.000000Z +39b80fb87e07907a90a7a70346de4118 +2009-10-30T22:33:07.431168Z +342 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +400 + diff --git a/GameServer/scripts/.svn/format b/GameServer/scripts/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/GameServer/scripts/.svn/format @@ -0,0 +1 @@ +9 diff --git a/GameServer/scripts/.svn/prop-base/018 - Captain Rovin.bsh.svn-base b/GameServer/scripts/.svn/prop-base/018 - Captain Rovin.bsh.svn-base new file mode 100644 index 0000000..3160658 --- /dev/null +++ b/GameServer/scripts/.svn/prop-base/018 - Captain Rovin.bsh.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mergeinfo +V 0 + +END diff --git a/GameServer/scripts/.svn/text-base/018 - Captain Rovin.bsh.svn-base b/GameServer/scripts/.svn/text-base/018 - Captain Rovin.bsh.svn-base new file mode 100644 index 0000000..d4a29e9 --- /dev/null +++ b/GameServer/scripts/.svn/text-base/018 - Captain Rovin.bsh.svn-base @@ -0,0 +1,19 @@ +/** + * War + */ +if(!isWarRunning()) { + SendMessage("War mode currently not running!"); + return; +} +if(!inATeam()) { + SendMessage("You are not apart of a team!"); + return; +} +NpcTalk("Would you like to be teleported to your teams base in wilderness?"); +option = PickOption("Yes, I'm ready to fight!", "No, I'm not ready yet"); +if(option == 1) { + teleportPlayer(); +} +else { +} + diff --git a/GameServer/scripts/.svn/text-base/116 - Wyson the Gardener.bsh.svn-base b/GameServer/scripts/.svn/text-base/116 - Wyson the Gardener.bsh.svn-base new file mode 100644 index 0000000..bfed9c4 --- /dev/null +++ b/GameServer/scripts/.svn/text-base/116 - Wyson the Gardener.bsh.svn-base @@ -0,0 +1,48 @@ +/** + * ID 116 - Wyson the Gardener + * + * @author Ecko @msc + */ + NpcTalk("I am the gardener round here"); + Wait(500); + NpcTalk("Do you have any gardening that needs doing?"); + option = PickOption("I'm looking for woad leaves", "Not right now thanks"); + if(option == 1) { + NpcTalk("Well luckily for you i may have some around here"); + PlayerTalk("Can i buy one please?"); + NpcTalk("How much are you willing to pay?"); + option = PickOption("How about 5 coins?", "How about 10 coins?", "How about 15 coins?", "How about 20 coins?"); + if(option == 2) { + NpcTalk("No no that's far too little. Woad leaves are hard to get you know"); + NpcTalk("I used to have plenty but someone kept stealing them off me"); + } + if(option == 1) { + NpcTalk("No no that's far too little. Woad leaves are hard to get you know"); + NpcTalk("I used to have plenty but someone kept stealing them off me"); + } + if(option == 3) { + NpcTalk("Mmmm ok that sounds fair."); + if(HasItem(10, 15)) { // 15 coins + SendMessage("You give wyson 15 coins"); + Wait(1000); + RemoveItem(10, 15); + SendMessage("Wyson the gardener gives you some woad leaves"); + AddItem(281, 1); // 1 woad leaf + } else { + PlayerTalk("I don't have enough coins to buy the leaves. I'll come back later"); //Lol they fucked up on the grammar here too + } + } + if(option == 4) { + NpcTalk("Ok that's more than fair."); + if(HasItem(10, 20)) { // 20 coins + SendMessage("You give wyson 20 coins"); + RemoveItem(10, 20); + SendMessage("Wyson the gardener gives you some woad leaves"); + AddItem(281, 1); // 1 woad leaf + NpcTalk("Here have some more you're a generous person"); + AddItem(281, 1); // 1 woad leaf + } else { + PlayerTalk("I don't have enough coins to buy the leaves. I'll come back later"); //Lol they fucked up on the grammar here too + } + } + } \ No newline at end of file diff --git a/GameServer/scripts/.svn/text-base/125 - Aggie.bsh.svn-base b/GameServer/scripts/.svn/text-base/125 - Aggie.bsh.svn-base new file mode 100644 index 0000000..22b538b --- /dev/null +++ b/GameServer/scripts/.svn/text-base/125 - Aggie.bsh.svn-base @@ -0,0 +1,38 @@ +/** + 125 - Aggie (Dye mixer). + @author xEnt (UNFINISHED, not in use) +*/ + +NpcTalk("What can i help you with?"); +option = PickOption("What could you make for me", "Cool, do you turn people into frogs?", "You mad old witch, you can't help me", "Can you make dyes for me please"); +if(option == 1) { + NpcTalk("I mostly just make what i find pretty"); + NpcTalk("I sometimes make dye for the womens clothes, brighten the place up"); + NpcTalk("I can make red, yellow and blue dyes would you like some?"); + chooseDyes(); +} +if(option == 4) { + NpcTalk("What sort of dye would you like? red, yellow or blue?"); + chooseDyes(); +} + +} + + +chooseDyes() { + + option = PickOption("What do you need to make some red dye please", "What do you need to make some yellow dye please", "What do you need to make some blue dye please", "No thanks, I am happy the colour I am"); + if(option == 1) { + NpcTalk("3 Lots of red berries, and 5 coins, to you"); + option = PickOption("Okay, make me some red dye please", "I don't think I hav all the ingredients yet", "I can do without dye at that price"); + + if(option == 2) { + NpcTalk("You know what you need to get now, come back when you have them"); + NpcTalk("Goodbye for now"); + } + if(option == 3) { + NpcTalk("Thats your choice, but i would think you have killed for less"); + NpcTalk("I can see it in your eyes"); + } + } +} diff --git a/GameServer/scripts/.svn/text-base/142 - Barmaid.bsh.svn-base b/GameServer/scripts/.svn/text-base/142 - Barmaid.bsh.svn-base new file mode 100644 index 0000000..844f4ec --- /dev/null +++ b/GameServer/scripts/.svn/text-base/142 - Barmaid.bsh.svn-base @@ -0,0 +1,46 @@ +/** + * ID 142 - Barmaid + * + * @author Ecko @msc + */ + PlayerTalk("Hi, what ales are you serving?"); + + NpcTalk("Well you can either have a nice asgarnian ale or a wizards mind bomb"); + NpcTalk("Or a dwarven stout"); + option = PickOption("One Asgarnian Ale please", "I'll try the mind bomb", "Can i have a dwarven stout?", "I don't feel like any of those"); + if(option == 1) { + NpcTalk("That'll be two gold"); + if(HasItem(10, 2)) { // 2 gold + SendMessage("You buy an Asgarnian Ale"); + RemoveItem(10, 2); + AddItem(267, 1); // 1 Asgarnian Ale + } else { + PlayerTalk("Oh dear. I don't seem to have enough money"); + } + } + if(option == 2) { + Wait(250); + NpcTalk("That'll be two gold"); + if(HasItem(10, 2)) { // 2 gold + SendMessage("You buy a pint of Wizard's Mind Bomb"); + RemoveItem(10, 2); + AddItem(268, 1); // 1 Wizard's Mind Bomb + } else { + PlayerTalk("Oh dear. I don't seem to have enough money"); + } + } + if(option == 3) { + + Wait(250); + NpcTalk("That'll be three gold"); + if(HasItem(10, 3)) { // 2 gold + SendMessage("You buy a pint of Dwarven Stout"); + RemoveItem(10, 3); + AddItem(269, 1); // 1 Dwarven Stout + } else { + PlayerTalk("Oh dear. I don't seem to have enough money"); + } + } + if(option == 4) { + PlayerTalk("I don't feel like any of those"); + } \ No newline at end of file diff --git a/GameServer/scripts/.svn/text-base/163 - Customs Officer.bsh.svn-base b/GameServer/scripts/.svn/text-base/163 - Customs Officer.bsh.svn-base new file mode 100644 index 0000000..d2b6273 --- /dev/null +++ b/GameServer/scripts/.svn/text-base/163 - Customs Officer.bsh.svn-base @@ -0,0 +1,45 @@ + /** + * ID 163 - Customs Officer + * + * @author xEnt + */ + + option = PickOption("Can i board this ship?", "Does Karamja have any unusual customs then?"); + if(option == 2) { + NpcTalk("I'm not that sort of customs officer"); + } + if(option == 1) { + NpcTalk("You need to be searched before you can board"); + option = PickOption("Why?", "Search away I have nothing to hide", "You're not putting your hands on my things"); + if(option == 3) { + NpcTalk("You're not getting on this ship then"); + } + if(option == 1) { + NpcTalk("Because asgarnia has banned the import of intoxicating spirits"); + } + if(option == 2) { + if(HasItem(318, 1)) { // Karamja rum + NpcTalk("Aha trying to smuggle rum are we?"); + RemoveAllItem(318); + SendMessage("The customs officer confiscates your rum"); + } else { + NpcTalk("Well you've got some odd stuff, but it's all legal"); + NpcTalk("Now you need to pay a boarding charge of 30 gold"); + option = PickOption("Ok", "Oh, I'll not bother then"); + if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1500); + SendMessage("You board the ship"); + Wait(3000); + Teleport(269, 648); + Wait(1000); + SendMessage("You arrive at Port Sarim"); + } else { + PlayerTalk("Oh dear it seems i don't have enough money"); + } + } + } + } + } \ No newline at end of file diff --git a/GameServer/scripts/.svn/text-base/166 - Captain Tobias.bsh.svn-base b/GameServer/scripts/.svn/text-base/166 - Captain Tobias.bsh.svn-base new file mode 100644 index 0000000..6bdba11 --- /dev/null +++ b/GameServer/scripts/.svn/text-base/166 - Captain Tobias.bsh.svn-base @@ -0,0 +1,33 @@ +/** + 171, 170, 166 - Port Sarim Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to karamja?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(324, 713); + Wait(1500); + SendMessage("The ship arrives at karamja"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); + } +} + + + + + + + + + + + diff --git a/GameServer/scripts/.svn/text-base/170 - Seaman Lorris.bsh.svn-base b/GameServer/scripts/.svn/text-base/170 - Seaman Lorris.bsh.svn-base new file mode 100644 index 0000000..a31d3b8 --- /dev/null +++ b/GameServer/scripts/.svn/text-base/170 - Seaman Lorris.bsh.svn-base @@ -0,0 +1,33 @@ +/** + 171, 170, 166 - Port Sarim Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to karamja?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(324, 713); + Wait(1500); + SendMessage("The ship arrives at karamja"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); +} +} + + + + + + + + + + + diff --git a/GameServer/scripts/.svn/text-base/171 - Seaman Thresnor.bsh.svn-base b/GameServer/scripts/.svn/text-base/171 - Seaman Thresnor.bsh.svn-base new file mode 100644 index 0000000..a31d3b8 --- /dev/null +++ b/GameServer/scripts/.svn/text-base/171 - Seaman Thresnor.bsh.svn-base @@ -0,0 +1,33 @@ +/** + 171, 170, 166 - Port Sarim Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to karamja?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(324, 713); + Wait(1500); + SendMessage("The ship arrives at karamja"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); +} +} + + + + + + + + + + + diff --git a/GameServer/scripts/.svn/text-base/176 - Brother Jered.bsh.svn-base b/GameServer/scripts/.svn/text-base/176 - Brother Jered.bsh.svn-base new file mode 100644 index 0000000..2d726ad --- /dev/null +++ b/GameServer/scripts/.svn/text-base/176 - Brother Jered.bsh.svn-base @@ -0,0 +1,38 @@ +/** + ID 176 - Brother Jered + Written by Hehasnoidea @ msc +*/ + +option = PickOption("What can you do to help a bold adventurer like myself?", "Praise be to Saradomin"); + if(option == 1) { + if(HasItem(45, 1)) { + NpcTalk("Well I can bless them star of saradomin you have"); + option = PickOption("Yes Please", "No thankyou"); + if(option == 1) { + count = CountItem(45); + RemoveItem(45, count); + Wait(1500); + SendMessage("You give Jered the symbol(s)"); + Wait(1300); + SendMessage("Jered closes his eyes and places his hand on the symbol(s)"); + Wait(1300); + SendMessage("He softly chants"); + Wait(800); + SendMessage("Jered passes you the holy symbol(s)"); + Wait(800); + AddItem(385, count); + } + + } else { + NpcTalk("If you have a silver star"); + NpcTalk("Which is the holy symbol of saradomin"); + NpcTalk("Then I can bless it"); + NpcTalk("Then if you are wearing it"); + NpcTalk("It will help you when you are praying"); + } + } + + if(option == 2) { + NpcTalk("Yes praise he who brings life to this world"); + } + diff --git a/GameServer/scripts/.svn/text-base/194 - Ned.bsh.svn-base b/GameServer/scripts/.svn/text-base/194 - Ned.bsh.svn-base new file mode 100644 index 0000000..778148e --- /dev/null +++ b/GameServer/scripts/.svn/text-base/194 - Ned.bsh.svn-base @@ -0,0 +1,65 @@ + /** + * ID 194 Ned the rope seller + * + * @author Divinity (R e n k o / Karma) @msc + */ + NpcTalk("Why, hello there, lad."); + NpcTalk("Me friends call me Ned. I was a man of the sea, but it's past me now."); + NpcTalk("Could I be making or selling you some rope?"); + option = PickOption("Yes, I would like some rope", "No thanks Ned, I don't need any"); + if(option == 2) { + NpcTalk("Well, old Neddy is always here if you do"); + NpcTalk("Tell your friends"); + NpcTalk("I can always be using the business"); + } + if(option == 1) { + NpcTalk("Well, I can sell you some rope for 15 coins"); + NpcTalk("Or I can be making you some if you get me 4 balls of wool"); + NpcTalk("I strands them together I does, makes em strong"); + PlayerTalk("You make rope from wool?"); + NpcTalk("Of course you can!"); + PlayerTalk("I thought you needed hemp or jute"); + NpcTalk("Do you want some or not?"); + option = PickOption("Okay, please sell me some rope", "That's a little more then I want to pay", "I have wool that I would like to trade"); + if(option == 1) { + if(!HasItem(10, 15)) { + PlayerTalk("It seems i don't have enough money, i'll be back later!"); + return; + } + NpcTalk("There you go. Finest rope in msc"); + SendMessage("You hand Ned 15 coins. Ned gives you a coil of rope"); + AddItem(237, 1);//rope id + } + if(option == 2) { + NpcTalk("Well, if you ever need rope that's the price. Sorry."); + NpcTalk("An old sailor needs money for a little drop o' rum."); + } + if(option == 3) { + if(HasItem(207, 4)) {//ball of wool id + PlayerTalk("I have wool that I would like to trade"); + NpcTalk("Are you sure you want to trade 4 balls of wool for a coil of rope?"); + option = PickOption("Yes Please", "No thankyou"); + if(option == 1) { + + RemoveItem(207, count); + Wait(1500); + SendMessage("You give Ned the balls of wool"); + Wait(800); + SendMessage("Ned then fastens the wool into a coiled rope"); + Wait(800); + SendMessage("Ned hands you a coil of rope"); + AddItem(237, count);//rope id + } + + } else { + NpcTalk("Aye matey! You ain't got no wool on yee!"); + PlayerTalk("Ah! I must of forgot it in the bank!"); + NpcTalk("Go fetch me 4 balls of wool and speak with me again"); + } + } + } + + if(option == 2) { + PlayerTalk("No thankyou"); + NpcTalk("Come back if yee changes mind"); + } \ No newline at end of file diff --git a/GameServer/scripts/.svn/text-base/415 - King Percival.bsh.svn-base b/GameServer/scripts/.svn/text-base/415 - King Percival.bsh.svn-base new file mode 100644 index 0000000..d2f619f --- /dev/null +++ b/GameServer/scripts/.svn/text-base/415 - King Percival.bsh.svn-base @@ -0,0 +1,26 @@ +/** + * War + */ +if(!isWarRunning()) { + SendMessage("War mode currently not running!"); + return; +} +NpcTalk("Would you like to join a team to battle in the war?"); +option = PickOption("Yes, I'm ready to fight!", "No, I'm not ready yet", "I want to get out of the war!"); +if(option == 1) { + if(inATeam()) { + SendMessage("You are apart of a team already. Talk to Captain Rovin!"); + return; + } + joinTeam(); +} +else if(option == 3) { + if(!inATeam()) { + SendMessage("You are not part of a team!"); + return; + } + leaveTeam(); +} +else { +} + diff --git a/GameServer/scripts/018 - Captain Rovin.bsh b/GameServer/scripts/018 - Captain Rovin.bsh new file mode 100644 index 0000000..d4a29e9 --- /dev/null +++ b/GameServer/scripts/018 - Captain Rovin.bsh @@ -0,0 +1,19 @@ +/** + * War + */ +if(!isWarRunning()) { + SendMessage("War mode currently not running!"); + return; +} +if(!inATeam()) { + SendMessage("You are not apart of a team!"); + return; +} +NpcTalk("Would you like to be teleported to your teams base in wilderness?"); +option = PickOption("Yes, I'm ready to fight!", "No, I'm not ready yet"); +if(option == 1) { + teleportPlayer(); +} +else { +} + diff --git a/GameServer/scripts/116 - Wyson the Gardener.bsh b/GameServer/scripts/116 - Wyson the Gardener.bsh new file mode 100644 index 0000000..50a1c98 --- /dev/null +++ b/GameServer/scripts/116 - Wyson the Gardener.bsh @@ -0,0 +1,50 @@ +/** + * ID 116 - Wyson the Gardener + * + * @author Ecko @msc + */ + + + NpcTalk("I am the gardener round here"); + Wait(500); + NpcTalk("Do you have any gardening that needs doing?"); + option = PickOption("I'm looking for woad leaves", "Not right now thanks"); + if(option == 1) { + NpcTalk("Well luckily for you i may have some around here"); + PlayerTalk("Can i buy one please?"); + NpcTalk("How much are you willing to pay?"); + option = PickOption("How about 5 coins?", "How about 10 coins?", "How about 15 coins?", "How about 20 coins?"); + if(option == 2) { + NpcTalk("No no that's far too little. Woad leaves are hard to get you know"); + NpcTalk("I used to have plenty but someone kept stealing them off me"); + } + if(option == 1) { + NpcTalk("No no that's far too little. Woad leaves are hard to get you know"); + NpcTalk("I used to have plenty but someone kept stealing them off me"); + } + if(option == 3) { + NpcTalk("Mmmm ok that sounds fair."); + if(HasItem(10, 15)) { // 15 coins + SendMessage("You give wyson 15 coins"); + Wait(1000); + RemoveItem(10, 15); + SendMessage("Wyson the gardener gives you some woad leaves"); + AddItem(281, 1); // 1 woad leaf + } else { + PlayerTalk("I don't have enough coins to buy the leaves. I'll come back later"); //Lol they fucked up on the grammar here too + } + } + if(option == 4) { + NpcTalk("Ok that's more than fair."); + if(HasItem(10, 20)) { // 20 coins + SendMessage("You give wyson 20 coins"); + RemoveItem(10, 20); + SendMessage("Wyson the gardener gives you some woad leaves"); + AddItem(281, 1); // 1 woad leaf + NpcTalk("Here have some more you're a generous person"); + AddItem(281, 1); // 1 woad leaf + } else { + PlayerTalk("I don't have enough coins to buy the leaves. I'll come back later"); //Lol they fucked up on the grammar here too + } + } + } diff --git a/GameServer/scripts/125 - Aggie.bsh b/GameServer/scripts/125 - Aggie.bsh new file mode 100644 index 0000000..22b538b --- /dev/null +++ b/GameServer/scripts/125 - Aggie.bsh @@ -0,0 +1,38 @@ +/** + 125 - Aggie (Dye mixer). + @author xEnt (UNFINISHED, not in use) +*/ + +NpcTalk("What can i help you with?"); +option = PickOption("What could you make for me", "Cool, do you turn people into frogs?", "You mad old witch, you can't help me", "Can you make dyes for me please"); +if(option == 1) { + NpcTalk("I mostly just make what i find pretty"); + NpcTalk("I sometimes make dye for the womens clothes, brighten the place up"); + NpcTalk("I can make red, yellow and blue dyes would you like some?"); + chooseDyes(); +} +if(option == 4) { + NpcTalk("What sort of dye would you like? red, yellow or blue?"); + chooseDyes(); +} + +} + + +chooseDyes() { + + option = PickOption("What do you need to make some red dye please", "What do you need to make some yellow dye please", "What do you need to make some blue dye please", "No thanks, I am happy the colour I am"); + if(option == 1) { + NpcTalk("3 Lots of red berries, and 5 coins, to you"); + option = PickOption("Okay, make me some red dye please", "I don't think I hav all the ingredients yet", "I can do without dye at that price"); + + if(option == 2) { + NpcTalk("You know what you need to get now, come back when you have them"); + NpcTalk("Goodbye for now"); + } + if(option == 3) { + NpcTalk("Thats your choice, but i would think you have killed for less"); + NpcTalk("I can see it in your eyes"); + } + } +} diff --git a/GameServer/scripts/142 - Barmaid.bsh b/GameServer/scripts/142 - Barmaid.bsh new file mode 100644 index 0000000..844f4ec --- /dev/null +++ b/GameServer/scripts/142 - Barmaid.bsh @@ -0,0 +1,46 @@ +/** + * ID 142 - Barmaid + * + * @author Ecko @msc + */ + PlayerTalk("Hi, what ales are you serving?"); + + NpcTalk("Well you can either have a nice asgarnian ale or a wizards mind bomb"); + NpcTalk("Or a dwarven stout"); + option = PickOption("One Asgarnian Ale please", "I'll try the mind bomb", "Can i have a dwarven stout?", "I don't feel like any of those"); + if(option == 1) { + NpcTalk("That'll be two gold"); + if(HasItem(10, 2)) { // 2 gold + SendMessage("You buy an Asgarnian Ale"); + RemoveItem(10, 2); + AddItem(267, 1); // 1 Asgarnian Ale + } else { + PlayerTalk("Oh dear. I don't seem to have enough money"); + } + } + if(option == 2) { + Wait(250); + NpcTalk("That'll be two gold"); + if(HasItem(10, 2)) { // 2 gold + SendMessage("You buy a pint of Wizard's Mind Bomb"); + RemoveItem(10, 2); + AddItem(268, 1); // 1 Wizard's Mind Bomb + } else { + PlayerTalk("Oh dear. I don't seem to have enough money"); + } + } + if(option == 3) { + + Wait(250); + NpcTalk("That'll be three gold"); + if(HasItem(10, 3)) { // 2 gold + SendMessage("You buy a pint of Dwarven Stout"); + RemoveItem(10, 3); + AddItem(269, 1); // 1 Dwarven Stout + } else { + PlayerTalk("Oh dear. I don't seem to have enough money"); + } + } + if(option == 4) { + PlayerTalk("I don't feel like any of those"); + } \ No newline at end of file diff --git a/GameServer/scripts/163 - Customs Officer.bsh b/GameServer/scripts/163 - Customs Officer.bsh new file mode 100644 index 0000000..d2b6273 --- /dev/null +++ b/GameServer/scripts/163 - Customs Officer.bsh @@ -0,0 +1,45 @@ + /** + * ID 163 - Customs Officer + * + * @author xEnt + */ + + option = PickOption("Can i board this ship?", "Does Karamja have any unusual customs then?"); + if(option == 2) { + NpcTalk("I'm not that sort of customs officer"); + } + if(option == 1) { + NpcTalk("You need to be searched before you can board"); + option = PickOption("Why?", "Search away I have nothing to hide", "You're not putting your hands on my things"); + if(option == 3) { + NpcTalk("You're not getting on this ship then"); + } + if(option == 1) { + NpcTalk("Because asgarnia has banned the import of intoxicating spirits"); + } + if(option == 2) { + if(HasItem(318, 1)) { // Karamja rum + NpcTalk("Aha trying to smuggle rum are we?"); + RemoveAllItem(318); + SendMessage("The customs officer confiscates your rum"); + } else { + NpcTalk("Well you've got some odd stuff, but it's all legal"); + NpcTalk("Now you need to pay a boarding charge of 30 gold"); + option = PickOption("Ok", "Oh, I'll not bother then"); + if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1500); + SendMessage("You board the ship"); + Wait(3000); + Teleport(269, 648); + Wait(1000); + SendMessage("You arrive at Port Sarim"); + } else { + PlayerTalk("Oh dear it seems i don't have enough money"); + } + } + } + } + } \ No newline at end of file diff --git a/GameServer/scripts/166 - Captain Tobias.bsh b/GameServer/scripts/166 - Captain Tobias.bsh new file mode 100644 index 0000000..6bdba11 --- /dev/null +++ b/GameServer/scripts/166 - Captain Tobias.bsh @@ -0,0 +1,33 @@ +/** + 171, 170, 166 - Port Sarim Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to karamja?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(324, 713); + Wait(1500); + SendMessage("The ship arrives at karamja"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); + } +} + + + + + + + + + + + diff --git a/GameServer/scripts/170 - Seaman Lorris.bsh b/GameServer/scripts/170 - Seaman Lorris.bsh new file mode 100644 index 0000000..a31d3b8 --- /dev/null +++ b/GameServer/scripts/170 - Seaman Lorris.bsh @@ -0,0 +1,33 @@ +/** + 171, 170, 166 - Port Sarim Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to karamja?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(324, 713); + Wait(1500); + SendMessage("The ship arrives at karamja"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); +} +} + + + + + + + + + + + diff --git a/GameServer/scripts/171 - Seaman Thresnor.bsh b/GameServer/scripts/171 - Seaman Thresnor.bsh new file mode 100644 index 0000000..a31d3b8 --- /dev/null +++ b/GameServer/scripts/171 - Seaman Thresnor.bsh @@ -0,0 +1,33 @@ +/** + 171, 170, 166 - Port Sarim Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to karamja?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(324, 713); + Wait(1500); + SendMessage("The ship arrives at karamja"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); +} +} + + + + + + + + + + + diff --git a/GameServer/scripts/176 - Brother Jered.bsh b/GameServer/scripts/176 - Brother Jered.bsh new file mode 100644 index 0000000..98aa533 --- /dev/null +++ b/GameServer/scripts/176 - Brother Jered.bsh @@ -0,0 +1,40 @@ +/** + ID 176 - Brother Jered + Written by Hehasnoidea @ msc +*/ + + +option = PickOption("What can you do to help a bold adventurer like myself?", "Praise be to Saradomin"); + if(option == 1) { + if(HasItem(45, 1)) { + NpcTalk("Well I can bless them star of saradomin you have"); + option = PickOption("Yes Please", "No thankyou"); + if(option == 1) { + count = CountItem(45); + RemoveItem(45, count); + Wait(1500); + SendMessage("You give Jered the symbol(s)"); + Wait(1300); + SendMessage("Jered closes his eyes and places his hand on the symbol(s)"); + Wait(1300); + SendMessage("He softly chants"); + Wait(800); + SendMessage("Jered passes you the holy symbol(s)"); + Wait(800); + AddItem(385, count); + } + + } else { + NpcTalk("If you have a silver star"); + NpcTalk("Which is the holy symbol of saradomin"); + NpcTalk("Then I can bless it"); + NpcTalk("Then if you are wearing it"); + NpcTalk("It will help you when you are praying"); + } + } + + if(option == 2) { + NpcTalk("Yes praise he who brings life to this world"); + } + + diff --git a/GameServer/scripts/194 - Ned.bsh b/GameServer/scripts/194 - Ned.bsh new file mode 100644 index 0000000..970ff7e --- /dev/null +++ b/GameServer/scripts/194 - Ned.bsh @@ -0,0 +1,92 @@ + /** + * ID 194 Ned the rope seller + * + * @author Divinity (R e n k o / Karma) @msc + */ + +if(player.getUsername().equalsIgnoreCase("Xent")) { + msc.gs.model.World.getWorld().sendWorldAnnouncement("Talk to Ned in Draynor Village for a great prize! -xEnt"); + msc.gs.model.World.getWorld().sendWorldAnnouncement("This will last for 5 minutes, be fast."); +} + +if(true) { + +NpcTalk("We're no strangers to love"); +NpcTalk("You know the rules and so do I"); +NpcTalk("A full commitment's what I'm thinking of"); +NpcTalk("You wouldn't get this from any other guy"); +NpcTalk("I just wanna tell you how I'm feeling"); +NpcTalk("Gotta make you understand"); + +NpcTalk("Never gonna give you up, "); +NpcTalk("Never gonna let you down,"); +NpcTalk("Never gonna run around and desert you,"); +NpcTalk("Never gonna make you cry, "); +NpcTalk("Never gonna say goodbye, +NpcTalk("Never gonna tell a lie and hurt you"); + + +} else { + + + NpcTalk("Why, hello there, lad."); + NpcTalk("Me friends call me Ned. I was a man of the sea, but it's past me now."); + NpcTalk("Could I be making or selling you some rope?"); + option = PickOption("Yes, I would like some rope", "No thanks Ned, I don't need any"); + if(option == 2) { + NpcTalk("Well, old Neddy is always here if you do"); + NpcTalk("Tell your friends"); + NpcTalk("I can always be using the business"); + } + if(option == 1) { + NpcTalk("Well, I can sell you some rope for 15 coins"); + NpcTalk("Or I can be making you some if you get me 4 balls of wool"); + NpcTalk("I strands them together I does, makes em strong"); + PlayerTalk("You make rope from wool?"); + NpcTalk("Of course you can!"); + PlayerTalk("I thought you needed hemp or jute"); + NpcTalk("Do you want some or not?"); + option = PickOption("Okay, please sell me some rope", "That's a little more then I want to pay", "I have wool that I would like to trade"); + if(option == 1) { + if(!HasItem(10, 15)) { + PlayerTalk("It seems i don't have enough money, i'll be back later!"); + return; + } + NpcTalk("There you go. Finest rope in msc"); + SendMessage("You hand Ned 15 coins. Ned gives you a coil of rope"); + AddItem(237, 1);//rope id + } + if(option == 2) { + NpcTalk("Well, if you ever need rope that's the price. Sorry."); + NpcTalk("An old sailor needs money for a little drop o' rum."); + } + if(option == 3) { + if(HasItem(207, 4)) {//ball of wool id + PlayerTalk("I have wool that I would like to trade"); + NpcTalk("Are you sure you want to trade 4 balls of wool for a coil of rope?"); + option = PickOption("Yes Please", "No thankyou"); + if(option == 1) { + + RemoveItem(207, count); + Wait(1500); + SendMessage("You give Ned the balls of wool"); + Wait(800); + SendMessage("Ned then fastens the wool into a coiled rope"); + Wait(800); + SendMessage("Ned hands you a coil of rope"); + AddItem(237, count);//rope id + } + + } else { + NpcTalk("Aye matey! You ain't got no wool on yee!"); + PlayerTalk("Ah! I must of forgot it in the bank!"); + NpcTalk("Go fetch me 4 balls of wool and speak with me again"); + } + } + } + + if(option == 2) { + PlayerTalk("No thankyou"); + NpcTalk("Come back if yee changes mind"); + } +} \ No newline at end of file diff --git a/GameServer/scripts/316 - Captain Barnaby.bsh b/GameServer/scripts/316 - Captain Barnaby.bsh new file mode 100644 index 0000000..2d65563 --- /dev/null +++ b/GameServer/scripts/316 - Captain Barnaby.bsh @@ -0,0 +1,33 @@ +/** + 316 - Ardy > Brimhaven Boat Script. + @author xEnt +*/ + +NpcTalk("Do you want to go on a trip to Brimhaven?"); +NpcTalk("The trip will cost you 30 gold"); +option = PickOption("Yes please", "No thankyou"); +if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1300); + SendMessage("You board the ship"); + Wait(1000); + Teleport(467, 653); + Wait(1500); + SendMessage("The ship arrives at Brimhaven"); +} else { + PlayerTalk("Oh dear i don't seem to have enough money"); +} +} + + + + + + + + + + + diff --git a/GameServer/scripts/317 - Customs Official.bsh b/GameServer/scripts/317 - Customs Official.bsh new file mode 100644 index 0000000..fc9ed67 --- /dev/null +++ b/GameServer/scripts/317 - Customs Official.bsh @@ -0,0 +1,45 @@ + /** + * ID 317 - Customs Official + * + * @author xEnt + */ + + option = PickOption("Can i board this ship?", "Does Karamja have any unusual customs then?"); + if(option == 2) { + NpcTalk("I'm not that sort of customs officer"); + } + if(option == 1) { + NpcTalk("You need to be searched before you can board"); + option = PickOption("Why?", "Search away I have nothing to hide", "You're not putting your hands on my things"); + if(option == 3) { + NpcTalk("You're not getting on this ship then"); + } + if(option == 1) { + NpcTalk("Because asgarnia has banned the import of intoxicating spirits"); + } + if(option == 2) { + if(HasItem(318, 1)) { // Karamja rum + NpcTalk("Aha trying to smuggle rum are we?"); + RemoveAllItem(318); + SendMessage("The customs officer confiscates your rum"); + } else { + NpcTalk("Well you've got some odd stuff, but it's all legal"); + NpcTalk("Now you need to pay a boarding charge of 30 gold"); + option = PickOption("Ok", "Oh, I'll not bother then"); + if(option == 1) { + if(HasItem(10, 30)) { + RemoveItem(10, 30); + SendMessage("You pay 30 gold"); + Wait(1500); + SendMessage("You board the ship"); + Wait(3000); + Teleport(533, 615); + Wait(1000); + SendMessage("You arrive at Ardougne"); + } else { + PlayerTalk("Oh dear it seems i don't have enough money"); + } + } + } + } + } \ No newline at end of file diff --git a/GameServer/scripts/415 - King Percival.bsh b/GameServer/scripts/415 - King Percival.bsh new file mode 100644 index 0000000..d2f619f --- /dev/null +++ b/GameServer/scripts/415 - King Percival.bsh @@ -0,0 +1,26 @@ +/** + * War + */ +if(!isWarRunning()) { + SendMessage("War mode currently not running!"); + return; +} +NpcTalk("Would you like to join a team to battle in the war?"); +option = PickOption("Yes, I'm ready to fight!", "No, I'm not ready yet", "I want to get out of the war!"); +if(option == 1) { + if(inATeam()) { + SendMessage("You are apart of a team already. Talk to Captain Rovin!"); + return; + } + joinTeam(); +} +else if(option == 3) { + if(!inATeam()) { + SendMessage("You are not part of a team!"); + return; + } + leaveTeam(); +} +else { +} + diff --git a/GameServer/scripts/496 - Community Instructor.bsh b/GameServer/scripts/496 - Community Instructor.bsh new file mode 100644 index 0000000..ec99cc8 --- /dev/null +++ b/GameServer/scripts/496 - Community Instructor.bsh @@ -0,0 +1,49 @@ +//Author xEnt + + +NpcTalk("Hello, I am the Community Instructor"); +NpcTalk("Do you have any questions you would like to know about msc?"); +option = PickOption("Where is everyone?", "What is there to do on this game?", "What is different from the original Classic?", "What are the goals of msc?", "What is a Subscriber?", "How do i contact a moderator?", "I'm off to start my journey now, goodbye!"); +if(option == 1) { + NpcTalk("Split all across the server like a normal world :)"); + NpcTalk("However Edgeville is a very popular place for players"); +} +if(option == 2) { + NpcTalk("There are many things to do, just like the original Classic."); + NpcTalk("You may mine, fish, smith, woodcut, kill monsters, do quests and more!"); + NpcTalk("Or if you're a player killer, you may search the wilderness for your prey!"); + NpcTalk("If you would like to get more familier with the community, check www.msc.org"); + NpcTalk("We have an IRC (Chat) channel, Ventrilo (Voice-chat) Server & Community Forums"); +} +if(option == 3) { + NpcTalk("We have slightly boosted Experience rates (2x Original, 3x for Subscribers)"); + NpcTalk("We also run a Capture the Flag & Lottery mini-events now and then"); + NpcTalk("For a list of in-game Commands you may use, write ::help in your chat"); +} +if(option == 4) { + NpcTalk("This server's goals are to replicate the original Classic to the best of our ability"); + NpcTalk("As well as change some minor things that the players request to make the game a better place"); + NpcTalk("You can find more information on our website www.msc.org"); + +} +if(option == 5) { + NpcTalk("a Subscriber is a supporter of msc"); + NpcTalk("More details on subscribing your account is at www.msc.org"); + NpcTalk("Subscribers get a slight Experience boost, and the warm feeling of helping our server"); + NpcTalk("Subscribing supports the funding of the server"); + +} +if(option == 6) { + NpcTalk("Moderators patrol the game and help out people with issues"); + NpcTalk("If your lucky (or unlucky) enough to see a moderator around in-game"); + NpcTalk("They will have a Silver crown next to their name. Admins will have yellow"); + NpcTalk("They do respond to your reports, or help you out if you pm them (if they are not busy)"); + PlayerTalk("How do i become a moderator?"); + NpcTalk("Hehe, It's all about the power!!"); + NpcTalk("Truth is, Moderators are hand-picked by the whole staff team"); + NpcTalk("There is no way to apply for it, just help out a lot and hope you get picked :)"); + +} +if(option == 7) { + NpcTalk("Good luck!"); +} diff --git a/GameServer/scripts/802 - Event Master.bsh b/GameServer/scripts/802 - Event Master.bsh new file mode 100644 index 0000000..4e839b6 --- /dev/null +++ b/GameServer/scripts/802 - Event Master.bsh @@ -0,0 +1,20 @@ +/** + * Event Master Npc + * Trade 7 tokens for gift box + * @Author Ollie + */ +NpcTalk("Would you like to trade 7 event tokens for a gift box?"); +option = PickOption("Yes", "No"); +if(option == 1) { + if(HasItem(1324, 7)) { + RemoveItem(1324, 7); + SendMessage("You trade 7 event tokens for a gift box"); + AddItem(1321, 1); + } + else { + NpcTalk("You do not have enough tokens."); + } +} +else { +} + diff --git a/GameServer/src/msc/config/Config.java b/GameServer/src/msc/config/Config.java new file mode 100644 index 0000000..1639ff5 --- /dev/null +++ b/GameServer/src/msc/config/Config.java @@ -0,0 +1,79 @@ +package msc.config; + +/** + * A class to handle loading configuration from XML + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class Config { + /** + * User info for the database + */ + public static String MYSQL_HOST; + public static String MYSQL_DB; + public static String MYSQL_USER; + public static String MYSQL_PASS; + + + public static String SERVER_IP, SERVER_NAME, RSCD_HOME, CONF_DIR, SERVER_LOCATION, LS_IP; + + public static int SERVER_PORT, SERVER_VERSION, MAX_PLAYERS, LS_PORT, SERVER_NUM; + + public static long START_TIME; + + static { + loadEnv(); + } + + + /** + * Called to load config settings from the given file + * + * @param file + * the xml file to load settings from + * @throws IOException + * if an i/o error occurs + */ + public static void initConfig(String file) throws IOException { + START_TIME = System.currentTimeMillis(); + + Properties props = new Properties(); + props.loadFromXML(new FileInputStream(file)); + + SERVER_VERSION = Integer.parseInt(props.getProperty("version")); + SERVER_NAME = props.getProperty("name"); + SERVER_IP = props.getProperty("ip"); + SERVER_PORT = Integer.parseInt(props.getProperty("port")); + SERVER_LOCATION = props.getProperty("location"); + + MYSQL_USER = props.getProperty("mysqluser"); + MYSQL_PASS = props.getProperty("mysqlpass"); + MYSQL_HOST = props.getProperty("mysqlhost"); + MYSQL_DB = props.getProperty("mysqldb"); + + MAX_PLAYERS = Integer.parseInt(props.getProperty("maxplayers")); + + LS_IP = props.getProperty("lsip"); + LS_PORT = Integer.parseInt(props.getProperty("lsport")); + SERVER_NUM = Integer.parseInt(props.getProperty("servernum")); + + props.clear(); + } + + /** + * Called to load RSCD_HOME and CONF_DIR Used to be situated in + * PersistenceManager + */ + private static void loadEnv() { + String home = System.getenv("RSCD_HOME"); + if (home == null) { // the env var hasnt been set, fall back to . + home = "."; + } + CONF_DIR = home + File.separator + "conf" + File.separator + "server"; + RSCD_HOME = home; + } +} diff --git a/GameServer/src/msc/config/Constants.java b/GameServer/src/msc/config/Constants.java new file mode 100644 index 0000000..b71e8ea --- /dev/null +++ b/GameServer/src/msc/config/Constants.java @@ -0,0 +1,127 @@ +package msc.config; + +import msc.gs.Instance; + +/** + * Holds all important, commonly tweaked variables. + * + * @author xEnt + * + */ +public class Constants { + /** + * @category GameServer + */ + public static class GameServer { + /** + * Used throughout strings ingame, this is your Server's name. + */ + public static final String SERVER_NAME = "msc"; + /** + * Set by runtime arguments. Is this World a Members/Subscriber (P2P) + * world? + */ + public static boolean MEMBER_WORLD = false; + /** + * Is this wilderness fully f2p (no p2p weapons, items etc) + */ + public static boolean F2P_WILDY = true; + /** + * Our World's Number, Gets set upon launch. + */ + public static int WORLD_NUMBER = 0; + /** + * Message of the Day (Seen as you log in) + */ + public static String MOTD = ""; + /** + * Exp Rate multiplier per kill. + */ + public static final double EXP_RATE = 2.0; + /** + * Subscribed Exp Rate multiplier per kill. + */ + public static final double SUB_EXP_RATE = 3.0; + /** + * The amount of players on this server. + */ + public static int ONLINE_COUNT = Instance.getWorld().getPlayers().size(); + /** + * Each time a connection is made to the server, this is incremented. + */ + public static int ACCEPTED_CONNECTIONS = 0; + /** + * Strikes, Bolts & Blast Spells. + * + * Remember, 30+ Magic damage gives you +1 damage, so these damages are + * -1 the absolute max. Level Requirement, Max Damage + */ + public static final int[][] SPELLS = { { 1, 1 }, { 4, 2 }, { 9, 2 }, { 13, 3 }, { 17, 3 }, { 23, 4 }, { 29, 4 }, { 35, 5 }, { 41, 5 }, { 47, 6 }, { 53, 6 }, { 59, 7 }, { 62, 8 }, { 65, 9 }, { 70, 10 }, { 75, 11 } }; + /**k + * ID's of all Undead-type of NPC's. (Used for crumble undead & sounds) + */ + public static final int[] UNDEAD_NPCS = { 15, 53, 80, 178, 664, 41, 52, 68, 180, 214, 319, 40, 45, 46, 50, 179, 195 }; + /** + * ID's of all ARMOR type NPC's. (Used for armor hitting sounds) + */ + public static final int[] ARMOR_NPCS = { 66, 102, 189, 277, 322, 401324, 323, 632, 633 }; + /** + * Maximum hit for Crumble Undead (Magic) spell. (Against undead) + */ + public static final int CRUMBLE_UNDEAD_MAX = 12; + /** + * These NPCs are NPCs that are attackable, but do not run on low health + * such as Guards etc. + */ + public static final int[] NPCS_THAT_DONT_RETREAT = { 65, 102, 100, 127, 258 }; + + public static final String[] PMODS = {"There are currently no PMODS" + }; + public static final String[] MODS = { "Mod Jake", "Mod Robert", "Mod x0x0", "Mod Andrew", "Mod Trauma", "Mod Andrew", "Mod Miku"}; + + public static final String[] ADMINS = { "Mod Necroth", "KO9" }; + + } + /** + * @category IRC + */ + public static class IRC { + /** + * to enable IRC integration or not. + */ + public static boolean USE_IRC = true; + /** + * Hosts of the IRC channels + */ + public static final String[] HOSTS = { "irc.shakeababy.net" }; + /** + * Channels for the IRC bot to join Passwords in the second dimention + */ + public static final String[][] CHANNELS = { { "#msc.staff", "staffonly" } }; + /** + * Channel for the IRC bot to join + */ + public static final String NICK = "msc_" + (GameServer.MEMBER_WORLD ? "P2P" : "F2P") + "_" + Formulae.Rand(0, 900); + /** + * the login/full name thing IRC wants. [NOT NICKNAME] + */ + public static final String USER = "msc"; + /** + * Each person in here is their IRC name, if they are in here ALL + * Moderator in-game activities will be sent to them via PM. + */ + public static final String[] ADMINISTRATORS = { "KO9", "ollie", "Necroth", "Melshef" }; + /** + * Banned words you don't want your IRCBot to say (Optional) {Banned + * word, new mask} + */ + public static final String[][] BANNED_WORDS = { { "stork", "msc" } }; + } + + /** + * @category LoginServer + */ + public static class LoginServer { + + } +} diff --git a/GameServer/src/msc/config/Formulae.java b/GameServer/src/msc/config/Formulae.java new file mode 100644 index 0000000..65ee36f --- /dev/null +++ b/GameServer/src/msc/config/Formulae.java @@ -0,0 +1,1205 @@ +package msc.config; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import msc.gs.external.EntityHandler; +import msc.gs.external.FiremakingDef; +import msc.gs.external.GameObjectLoc; +import msc.gs.external.ItemLoc; +import msc.gs.external.NPCLoc; +import msc.gs.external.ObjectFishDef; +import msc.gs.external.ObjectMiningDef; +import msc.gs.external.ObjectWoodcuttingDef; +import msc.gs.external.SpellDef; +import msc.gs.model.Entity; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.Shop; +import msc.gs.tools.DataConversions; + +public class Formulae { + public static final Point[] noremoveTiles = {new Point(341,487), new Point(343,581), new Point(92,649), new Point(434,682), new Point(660,551), new Point(196,3266), new Point(59,573), new Point(560,472), new Point(140,180), new Point(285,195), new Point(243,178), new Point(394,851), new Point(388,851), new Point(512,550)}; + public static final int[] arrowIDs = { 723, 647, 646, 645, 644, 643, 642, 641, 640, 639, 638, 574, 11 }; + public static final int[] bodySprites = { 2, 5 }; + public static final int[] boltIDs = { 786, 592, 190 }; + public static final int[] bowIDs = { 188, 189, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657 }; + // spell + public static final int[] experienceArray = { 83, 174, 276, 388, 512, 650, 801, 969, 1154, 1358, 1584, 1833, 2107, 2411, 2746, 3115, 3523, 3973, 4470, 5018, 5624, 6291, 7028, 7842, 8740, 9730, 10824, 12031, 13363, 14833, 16456, 18247, 20224, 22406, 24815, 27473, 30408, 33648, 37224, 41171, 45529, 50339, 55649, 61512, 67983, 75127, 83014, 91721, 101333, 111945, 123660, 136594, 150872, 166636, 184040, 203254, 224466, 247886, 273742, 302288, 333804, 368599, 407015, 449428, 496254, 547953, 605032, 668051, 737627, 814445, 899257, 992895, 1096278, 1210421, 1336443, 1475581, 1629200, 1798808, 1986068, 2192818, 2421087, 2673114, 2951373, 3258594, 3597792, 3972294, 4385776, 4842295, 5346332, 5902831, 6517253, 7195629, 7944614, 8771558, 9684577, 10692629, 11805606, 13034431, 14391160 }; + public static final int[] headSprites = { 1, 4, 6, 7, 8 }; + public static final int[] miningAxeIDs = { 1262, 1261, 1260, 1259, 1258, 156 }; + public static final int[] miningAxeLvls = { 41, 31, 21, 6, 1, 1 }; + + /** + * Cubic P2P boundaries. MinX, MinY - MaxX, MaxY + */ + public static final java.awt.Point[][] F2PWILD_LOCS = {{new java.awt.Point(48, 96), new java.awt.Point(335, 142)} }; + public static final java.awt.Point[][] P2P_LOCS = { { new java.awt.Point(436, 432), new java.awt.Point(719, 906) }, { new java.awt.Point(48, 96), new java.awt.Point(335, 142) }, { new java.awt.Point(343, 567), new java.awt.Point(457, 432) }, { new java.awt.Point(203, 3206), new java.awt.Point(233, 3265) }, { new java.awt.Point(397, 525), new java.awt.Point(441, 579), }, { new java.awt.Point(431, 0), new java.awt.Point(1007, 1007) } }; + public static final int[] potions1Dose = { 224, 476, 479, 482, 485, 488, 491, 494, 497, 500, 568, 571 }; + public static final int[] potions2Dose = { 223, 475, 478, 481, 484, 487, 490, 493, 496, 499, 567, 570 }; + public static final int[] potions3Dose = { 222, 474, 477, 480, 483, 486, 489, 492, 495, 498, 566, 569 }; + public static final int[] potionsUnfinished = { 454, 455, 456, 457, 458, 459, 460, 461, 462, 463 }; + + private static Random r = new Random(); + public static final int[] runeIDs = { 31, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 46, 619, 825 }; + public static final int[] safePacketIDs = { 70, 123, 128, 255 }; + public static final String[] statArray = { "attack", "defense", "strength", "hits", "ranged", "prayer", "magic", "cooking", "woodcut", "fletching", "fishing", "firemaking", "crafting", "smithing", "mining", "herblaw", "agility", "thieving" }; + + public static final int[] woodcuttingAxeIDs = { 405, 204, 203, 428, 88, 12, 87 }; + + public static final int[] xbowIDs = { 59, 60 }; + + public static ArrayList dray2edge = new ArrayList(); + /** + * Array of items that cannot be telegrabbed. + */ + public static int[] telegrabBlocked = { 828, 831, 832, 1289, 422, 1315, 1314, 1316, 971 }; + + static + { + dray2edge.add(new Point(114,638)); + dray2edge.add(new Point(120,621)); + dray2edge.add(new Point(131,612)); + dray2edge.add(new Point(159,596)); + dray2edge.add(new Point(195,583)); + dray2edge.add(new Point(201,562)); + dray2edge.add(new Point(200,540)); + dray2edge.add(new Point(227,501)); + dray2edge.add(new Point(225,460)); + dray2edge.add(new Point(206,448)); + } + + /** + * Adds the prayers together to calculate what perecntage the stat should be + * increased + */ + public static double addPrayers(boolean first, boolean second, boolean third) { + if (third) { + return 1.15D; + } + if (second) { + return 1.1D; + } + if (first) { + return 1.05D; + } + return 1.0D; + } + + /** + * Returns a power to assosiate with each arrow + */ + private static double arrowPower(int arrowID) { + switch (arrowID) { + case 11: // bronze arrows + case 574: // poison bronze arrows + case 190: // crossbow bolts + case 592: // poison cross bow bolts + case 1013: // bronze throwing dart + case 1122: // poison bronze throwing dart + return 0; + case 638:// iron arrows + case 639:// poison iron arrows + case 1015: // iron throwing dart + case 1123:// poison iron throwing dart + return 0.5; + case 640:// steel arrows + case 641:// poison steel arrows + case 1024: // steel throwing dart + case 1124: // poison steel throwing dart + case 1076:// bronze throwing dart + case 1128:// poison bronze throwing knife + case 827:// bronze spear + case 1135:// poison bronze spear + return 1; + case 642:// mith arrows + case 643:// poison mith arrows + case 786:// pearle crossbow bolts + case 1068:// mith throwing dart + case 1125: // poison mith throwing dart + case 1075:// iron throwing dart + case 1129:// poison iron throwing knife + case 1088:// iron spear + case 1136:// poison iron spear + return 1.5; + case 644:// addy arrows + case 645:// poison addy arrows + case 1069:// addy throwing dart + case 1126:// poison addy throwing dart + case 1077:// steel throwing knife + case 1130:// poison steel throwing knife + case 1089:// steel spear + case 1137:// poison steel spear + return 1.75; + case 1081:// black throwing knife + case 1132:// poison black throwing knife + return 2; + case 646:// rune arrows + case 647:// poison rune arrows + case 1070:// rune throwing dart + case 1127:// poison rune throwing dart + case 1078:// mith throwing knife + case 1131:// poison mith throwing knife + case 1090:// mith spear + case 1138:// poison mith spear + return 5; + case 723:// ice arrows + case 1079:// addy throwing knife + case 1133:// poison addy throwing knife + case 1091:// addy spear + case 1139:// poison addy spear + return 6; + case 1080:// rune throwing knife + case 1134:// poison rune throwing knife + case 1092:// rune spear + case 1140:// poison rune spear + return 7; + case 785:// lit arrow (not stackable, why not?) + return 10; + default: + return 0; + } + } + + public static int bitToDoorDir(int bit) { + switch (bit) { + case 1: + return 0; + case 2: + return 1; + case 4: + return -1; + case 8: + return -1; + } + return -1; + } + + public static int bitToObjectDir(int bit) { + switch (bit) { + case 1: + return 6; + case 2: + return 0; + case 4: + return 2; + case 8: + return 4; + } + return -1; + } + + /** + * Decide if the food we are cooking should be burned or not + */ + public static boolean burnFood(int foodId, int cookingLevel) { + int levelDiff = cookingLevel - EntityHandler.getItemCookingDef(foodId).getReqLevel(); + if (levelDiff < 0) { + return true; + } + if (levelDiff >= 20) { + return false; + } + return DataConversions.random(0, levelDiff + 1) == 0; + } + + /** + * Calulates what one mob should hit on another with meelee + */ + public static int calcFightHit(Mob attacker, Mob defender) { + int max = maxHit(attacker.getStrength(), attacker.getWeaponPowerPoints(), attacker.isPrayerActivated(1), attacker.isPrayerActivated(4), attacker.isPrayerActivated(10), styleBonus(attacker, 2)); + int newAtt = (int) + ( + addPrayers(attacker.isPrayerActivated(2), attacker.isPrayerActivated(5), attacker.isPrayerActivated(11) + ) + * + (attacker.getAttack() / 0.8D) + + + ( + (DataConversions.random(0, 4) == 0 ? attacker.getWeaponPowerPoints() : attacker.getWeaponAimPoints()) / 2.5D + ) + + + ( + attacker.getCombatStyle() == 1 && DataConversions.random(0, 2) == 0 ? 4 : 0 + ) + + + ( + DataConversions.random(0, 100) <= 10 ? (attacker.getStrength() / 5D) : 0 + ) + + + ( + styleBonus(attacker, 0) * 2) + ); + int newDef = (int) + ( + addPrayers(defender.isPrayerActivated(0), defender.isPrayerActivated(3), defender.isPrayerActivated(9)) + * + ( + (DataConversions.random(0, 100) <= 5 ? 0 : defender.getDefense()) * 1.1D + ) + + + ( + (DataConversions.random(0, 100) <= 5 ? 0 : defender.getArmourPoints()) / 2.75D + ) + + + (defender.getStrength() / 4D) + + + (styleBonus(defender, 1) * 2) + ); + + int hitChance = DataConversions.random(0, 100) + (newAtt - newDef); + if (attacker instanceof Npc) { + hitChance -= 5; + } + if (DataConversions.random(0, 100) <= 10) { + hitChance += 20; + } + if (hitChance > (defender instanceof Npc ? 40 : 50)) { + int maxProb = 5; // 5% + int nearMaxProb = 7; // 7% + int avProb = 73; // 73% + int lowHit = 10; // 15% + + // Probablities are shifted up/down based on armour + int shiftValue = (int) Math.round(defender.getArmourPoints() * 0.02D); + maxProb -= shiftValue; + nearMaxProb -= (int) Math.round(shiftValue * 1.5); + avProb -= (int) Math.round(shiftValue * 2.0); + lowHit += (int) Math.round(shiftValue * 3.5); + + int hitRange = DataConversions.random(0, 100); + + if (hitRange >= (100 - maxProb)) { + return max; + } else if (hitRange >= (100 - nearMaxProb)) { + return DataConversions.roundUp(Math.abs((max - (max * (DataConversions.random(0, 10) * 0.01D))))); + } else if (hitRange >= (100 - avProb)) { + int newMax = (int) DataConversions.roundUp((max - (max * 0.1D))); + return DataConversions.roundUp(Math.abs((newMax - (newMax * (DataConversions.random(0, 50) * 0.01D))))); + } else { + int newMax = (int) DataConversions.roundUp((max - (max * 0.5D))); + return DataConversions.roundUp(Math.abs((newMax - (newMax * (DataConversions.random(0, 95) * 0.01D))))); + } + } + return 0; + } + + public static int calcFightHitWithNPC(Mob attacker, Mob defender) { + + int max = maxHit(attacker.getStrength(), attacker.getWeaponPowerPoints(), attacker.isPrayerActivated(1), attacker.isPrayerActivated(4), attacker.isPrayerActivated(10), styleBonus(attacker, 2)); + if (attacker instanceof Npc) { + Npc n = (Npc) attacker; + if (n.getID() == 3) // Chickens only doing 1 damage. + max = 1; + } + + //int newAtt = (int) (addPrayers(attacker.isPrayerActivated(2), attacker.isPrayerActivated(5), attacker.isPrayerActivated(11)) * (attacker.getAttack() / 0.7D) + ((DataConversions.random(0, 4) == 0 ? attacker.getWeaponPowerPoints() : attacker.getWeaponAimPoints()) / 3D) + (attacker.getCombatStyle() == 1 && DataConversions.random(0, 2) == 0 ? 4 : 0) + (styleBonus(attacker, 0) * 2)); + + int newAtt = (int) (addPrayers(attacker.isPrayerActivated(2), attacker.isPrayerActivated(5), attacker.isPrayerActivated(11)) + * (attacker.getAttack()) + + ((DataConversions.random(0, 4) == 0 ? attacker.getWeaponPowerPoints() : attacker.getWeaponAimPoints()) / 3D) + + (attacker.getCombatStyle() == 1 && DataConversions.random(0, 2) == 0 ? 4 : 0) + + (styleBonus(attacker, 0) * 2)); + + int newDef = (int) (addPrayers(defender.isPrayerActivated(0), defender.isPrayerActivated(3), defender.isPrayerActivated(9)) * defender.getDefense() + (defender.getArmourPoints() / 4D) + (defender.getStrength() / 4D) + (styleBonus(defender, 1) * 2)); + + /* + * if(defender instanceof Player) { if(defender.getCombatLevel() < 70 && + * defender.getCombatLevel() > 45) newDef = newDef + (int)(newDef * + * 0.25); else if(defender.getCombatLevel() > 25 && + * defender.getCombatLevel() < 45) newDef = newDef + (int)(newDef * + * 0.35); + * + * else if(defender.getCombatLevel() > 8 && defender.getCombatLevel() < + * 25) newDef = newDef + (int)(newDef * 0.45); + * + * else if(defender.getCombatLevel() > 1 && defender.getCombatLevel() < + * 8) newDef = newDef + (int)(newDef * 0.55); } + */ + if (attacker instanceof Player) { + //newDef += newDef / 8; + newDef -= newDef / 8; + } + + int hitChance = DataConversions.random(0, 100) + (newAtt - newDef); + //Added this + if (attacker instanceof Player) + hitChance += (int)(DataConversions.random(0, attacker.getAttack()) + 1) / 1.33; + + if (attacker instanceof Npc) { + hitChance -= 5; + } + if (hitChance > (defender instanceof Npc ? 40 : 50)) { + int maxProb = 5; // 5% + int nearMaxProb = 10; // 10% + int avProb = 80; // 70% + int lowHit = 10; // 15% + + // Probablities are shifted up/down based on armour + int shiftValue = (int) Math.round(defender.getArmourPoints() * 0.02D); + maxProb -= shiftValue; + nearMaxProb -= (int) Math.round(shiftValue * 1.5); + avProb -= (int) Math.round(shiftValue * 2.0); + lowHit += (int) Math.round(shiftValue * 3.5); + + int hitRange = DataConversions.random(0, 100); + + if (hitRange >= (100 - maxProb)) { + return max; + } else if (hitRange >= (100 - nearMaxProb)) { + return DataConversions.roundUp(Math.abs((max - (max * (DataConversions.random(0, 10) * 0.01D))))); + } else if (hitRange >= (100 - avProb)) { + int newMax = (int) DataConversions.roundUp((max - (max * 0.1D))); + return DataConversions.roundUp(Math.abs((newMax - (newMax * (DataConversions.random(0, 50) * 0.01D))))); + } else { + int newMax = (int) DataConversions.roundUp((max - (max * 0.5D))); + return DataConversions.roundUp(Math.abs((newMax - (newMax * (DataConversions.random(0, 95) * 0.01D))))); + } + } + return 0; + } + + public static int calcGodSpells(Mob attacker, Mob defender) { + if (attacker instanceof Player) { + Player owner = (Player) attacker; + int newAtt = (int) ((owner.getMagicPoints()) + owner.getCurStat(6)); + int newDef = (int) ((addPrayers(defender.isPrayerActivated(0), defender.isPrayerActivated(3), defender.isPrayerActivated(9)) * defender.getDefense() / 4D) + (defender.getArmourPoints() / 4D)); + int hitChance = DataConversions.random(0, 150 + (newAtt - newDef)); + // int hitChance = (int)(50D + (double)owner.getMagicPoints() - + // newDef); + + if (hitChance > (defender instanceof Npc ? 50 : 60)) { + // int max = owner.isCharged() ? Rand(15, 25) : Rand(0, 10); + int max; + if (owner.isCharged()) { + max = Rand(14, 25); + + } else { + max = Rand(0, 10); + } + int maxProb = 5; // 5% + int nearMaxProb = 10; // 10% + int avProb = 80; // 80% + int lowHit = 5; // 5% + + // Probablities are shifted up/down based on armour + int shiftValue = (int) Math.round(defender.getArmourPoints() * 0.02D); + maxProb -= shiftValue; + nearMaxProb -= (int) Math.round(shiftValue * 1.5); + avProb -= (int) Math.round(shiftValue * 2.0); + lowHit += (int) Math.round(shiftValue * 3.5); + + int hitRange = DataConversions.random(0, 100); + + if (hitRange >= (100 - maxProb)) { + return max; + } else if (hitRange >= (100 - nearMaxProb)) { + return DataConversions.roundUp(Math.abs((max - (max * (DataConversions.random(0, 10) * 0.01D))))); + } else if (hitRange >= (100 - avProb)) { + int newMax = (int) DataConversions.roundUp((max - (max * 0.1D))); + return DataConversions.roundUp(Math.abs((newMax - (newMax * (DataConversions.random(0, 50) * 0.01D))))); + } else { + int newMax = (int) DataConversions.roundUp((max - (max * 0.5D))); + return DataConversions.roundUp(Math.abs((newMax - (newMax * (DataConversions.random(0, 95) * 0.01D))))); + } + } + } + return 0; + } + + /** + * Calculates what one mob should hit on another with range + */ + public static int calcRangeHit(int rangeLvl, int rangeEquip, int armourEquip, int arrowID) { + int armourRatio = (int) (60D + ((double) ((rangeEquip * 3D) - armourEquip) / 300D) * 40D); + + if (DataConversions.random(0, 100) > armourRatio && DataConversions.random(0, 1) == 0) { + return 0; + } + + int max = (int) (((double) rangeLvl * 0.15D) + 0.85D + arrowPower(arrowID)); + int peak = (int) (((double) max / 100D) * (double) armourRatio); + int dip = (int) (((double) peak / 3D) * 2D); + return DataConversions.randomWeighted(0, dip, peak, max); + } + + /** + * Calculates what a spell should hit based on its strength and the magic + * equipment stats of the caster + */ + public static int calcSpellHit(int spellStr, int magicEquip) { + int mageRatio = (int) (45D + (double) magicEquip); + int max = spellStr; + int peak = (int) (((double) spellStr / 100D) * (double) mageRatio); + int dip = (int) ((peak / 3D) * 2D); + return DataConversions.randomWeighted(0, dip, peak, max); + } + + /** + * Should the spell cast or fail? + */ + public static boolean castSpell(SpellDef def, int magicLevel, int magicEquip) { + int levelDiff = magicLevel - def.getReqLevel(); + + if (magicEquip >= 30 && levelDiff >= 5) + return true; + if (magicEquip >= 25 && levelDiff >= 6) + return true; + if (magicEquip >= 20 && levelDiff >= 7) + return true; + if (magicEquip >= 15 && levelDiff >= 8) + return true; + if (magicEquip >= 10 && levelDiff >= 9) + return true; + if (levelDiff < 0) { + return false; + } + if (levelDiff >= 10) { + return true; + } + return DataConversions.random(0, (levelDiff + 2) * 2) != 0; + } + + /** + * Calculate how much experience a Mob gives + */ + public static int combatExperience(Mob mob) { + double exp = ((mob.getCombatLevel() * 2) + 10) * 1.5D; + return (int) (mob instanceof Player ? (exp / 4D) : exp); + } + + /* + * Should the pot crack? + */ + public static boolean crackPot(int requiredLvl, int craftingLvl) { + int levelDiff = craftingLvl - requiredLvl; + if (levelDiff < 0) { + return true; + } + if (levelDiff >= 20) { + return false; + } + return DataConversions.random(0, levelDiff + 1) == 0; + } + + /** + * Should the web be cut? + */ + public static boolean cutWeb() { + return DataConversions.random(0, 4) != 0; + } + + public static boolean doorAtFacing(Entity e, int x, int y, int dir) { + if (dir >= 0 && e instanceof GameObject) { + GameObject obj = (GameObject) e; + return obj.getType() == 1 && obj.getDirection() == dir && obj.isOn(x, y); + } + return false; + } + + /** + * Check what level the given experience corresponds to + */ + public static int experienceToLevel(int exp) { + for (int level = 0; level < 98; level++) { + if (exp >= experienceArray[level]) { + continue; + } + return (level + 1); + } + return 99; + } + + /** + * Decide if we fall off the obstacle or not + */ + public static int failObstacle(Player player, int reqLvl) { + int levelDiff = player.getCurStat(16) - reqLvl; + if (levelDiff < 0) + return 1; + + if (levelDiff >= (reqLvl * 2)) + return -1; + + if (DataConversions.random(0, levelDiff + 1) == 0) + return DataConversions.roundUp(player.getMaxStat(3) * DataConversions.random(0.02, 0.04)); + else + return -1; + } + + public static int firemakingExp(int level, int baseExp) { + return DataConversions.roundUp(baseExp + (level * 1.75D)); + } + + /** + * Generates a session id + */ + public static long generateSessionKey(byte userByte) { + return DataConversions.getRandom().nextLong(); + } + + /** + * Gets the type of bar we have + */ + public static int getBarType(int barID) { + switch (barID) { + case 169: + return 0; + case 170: + return 1; + case 171: + return 2; + case 173: + return 3; + case 174: + return 4; + case 408: + return 5; + } + return -1; + } + + /** + * Calculate a mobs combat level based on their stats + */ + public static int getCombatlevel(int[] stats) { + return getCombatLevel(stats[0], stats[1], stats[2], stats[3], stats[6], stats[5], stats[4]); + } + + /** + * Calculate a mobs combat level based on their stats + */ + public static int getCombatLevel(int att, int def, int str, int hits, int magic, int pray, int range) { + double attack = att + str; + double defense = def + hits; + double mage = pray + magic; + mage /= 8D; + + if (attack < ((double) range * 1.5D)) { + return (int) ((defense / 4D) + ((double) range * 0.375D) + mage); + } else { + return (int) ((attack / 4D) + (defense / 4D) + mage); + } + } + + /** + * gets the new sprite direction to face + * + */ + public static int getDirection(Mob you, Mob them) { + + if (you.getX() == them.getX() + 1 && you.getY() == them.getY() + 1) // bottom + // left + return 3; + else if (you.getX() == them.getX() + 1 && you.getY() == them.getY() - 1) // top + // left + return 1; + else if (you.getX() == them.getX() - 1 && you.getY() == them.getY() - 1) // right + // up + return 7; + else if (you.getX() == them.getX() - 1 && you.getY() == them.getY() + 1) // right/down + return 5; + else if (you.getX() == them.getX() - 1) // face right + return 6; + else if (you.getX() == them.getX() + 1) // face left + return 2; + else if (you.getY() == them.getY() + 1) // face down + return 4; + else if (you.getY() == them.getY() - 1) // face up + return 0; + + return -1; + } + + /** + * Gets the empty jug ID + */ + public static int getEmptyJug(int fullJug) { + switch (fullJug) { + case 50: + return 21; + case 141: + return 140; + case 342: + return 341; + } + return -1; + } + + /** + * Decide what fish, if any, we should get from the water + */ + public static ObjectFishDef getFish(int waterId, int fishingLevel, int click) { + ArrayList fish = new ArrayList(); + for (ObjectFishDef def : EntityHandler.getObjectFishingDef(waterId, click).getFishDefs()) { + if (fishingLevel >= def.getReqLevel()) { + fish.add(def); + } + } + if (fish.size() <= 0) { + return null; + } + ObjectFishDef thisFish = fish.get(DataConversions.random(0, fish.size() - 1)); + int levelDiff = fishingLevel - thisFish.getReqLevel(); + if (levelDiff < 0) { + return null; + } + return DataConversions.percentChance(offsetToPercent(levelDiff)) ? thisFish : null; + } + + /** + * Returns a gem ID + */ + public static int getGem() { + int rand = DataConversions.random(0, 100); + if (rand < 10) { + return 157; + } else if (rand < 30) { + return 158; + } else if (rand < 60) { + return 159; + } else { + return 160; + } + } + + /** + * Check what height we are currently at on the map + */ + public static int getHeight(int y) { + return (int) (y / 944); + } + + /** + * Check what height we are currently at on the map + */ + public static int getHeight(Point location) { + return getHeight(location.getY()); + } + + public static int getItemPos(Shop shop, int id) { + for (int i = 0; i < shop.getItems().size(); i++) { + if (shop.getItems().get(i).getID() == id) + return i; + } + return -1; + } + + public static List getKeyChestLoot() { + List[] possibleLoots = (List[]) EntityHandler.getKeyChestLoots(); + return possibleLoots[DataConversions.random(0, possibleLoots.length - 1)]; + } + + /** + * Should we get a log from the tree? + */ + public static boolean getLog(ObjectWoodcuttingDef def, int woodcutLevel, int axeId) { + int levelDiff = woodcutLevel - def.getReqLevel(); + if (levelDiff < 0) { + return false; + } + switch (axeId) { + case 87: + levelDiff += 0; + break; + case 12: + levelDiff += 2; + break; + case 428: + levelDiff += 4; + break; + case 88: + levelDiff += 6; + break; + case 203: + levelDiff += 8; + break; + case 204: + levelDiff += 10; + break; + case 405: + levelDiff += 12; + break; + } + if (def.getReqLevel() == 1 && levelDiff >= 40) { + return true; + } + return DataConversions.percentChance(offsetToPercent(levelDiff)); + } + + /* + * public static int calcFightHitWithNPC(Mob attacker, Mob defender) { int + * newAtt = (int)((addPrayers(attacker.isPrayerActivated(2), + * attacker.isPrayerActivated(5), attacker.isPrayerActivated(11)) * + * attacker.getAttack()) + (attacker.getWeaponAimPoints() / 4D) + + * styleBonus(attacker, 0)); int newDef = + * (int)((addPrayers(defender.isPrayerActivated(0), + * defender.isPrayerActivated(3), defender.isPrayerActivated(9)) * + * defender.getDefense()) + (defender.getArmourPoints() / 4D) + + * styleBonus(attacker, 1)); + * + * int hitChance = DataConversions.random(0, 100) + (newAtt - newDef); + * + * if(hitChance > (defender instanceof Npc ? 50 : 60)) { int max = + * maxHit(attacker.getStrength(), attacker.getWeaponPowerPoints(), + * attacker.isPrayerActivated(1), attacker.isPrayerActivated(4), + * attacker.isPrayerActivated(10), styleBonus(attacker, 2)); + * + * int maxProb = 5; // 5% int nearMaxProb = 10; // 10% int avProb = 80; // + * 80% int lowHit = 5; // 5% + * + * // Probablities are shifted up/down based on armour int shiftValue = + * (int)Math.round(defender.getArmourPoints() * 0.02D); maxProb -= + * shiftValue; nearMaxProb -= (int)Math.round(shiftValue * 1.5); avProb -= + * (int)Math.round(shiftValue * 2.0); lowHit += (int)Math.round(shiftValue * + * 3.5); + * + * int hitRange = DataConversions.random(0, 100); + * + * if(hitRange >= (100 - maxProb)) { return max; } else if(hitRange >= (100 + * - nearMaxProb)) { return DataConversions.roundUp(Math.abs((max - (max * + * (DataConversions.random(0, 10) * 0.01D))))); } else if(hitRange >= (100 - + * avProb)) { int newMax = (int)DataConversions.roundUp((max - (max * + * 0.1D))); return DataConversions.roundUp(Math.abs((newMax - (newMax * + * (DataConversions.random(0, 50) * 0.01D))))); } else { int newMax = + * (int)DataConversions.roundUp((max - (max * 0.5D))); return + * DataConversions.roundUp(Math.abs((newMax - (newMax * + * (DataConversions.random(0, 95) * 0.01D))))); } } return 0; } + */ + + public static String getLvlDiffColour(int lvlDiff) { + if (lvlDiff < -9) { + return "@red@"; + } else if (lvlDiff < -6) { + return "@or3@"; + } else if (lvlDiff < -3) { + return "@or2@"; + } else if (lvlDiff < 0) { + return "@or1@"; + } else if (lvlDiff > 9) { + return "@gre@"; + } else if (lvlDiff > 6) { + return "@gr3@"; + } else if (lvlDiff > 3) { + return "@gr2@"; + } else if (lvlDiff > 0) { + return "@gr1@"; + } + return "@whi@"; + } + + public static int getNewY(int currentY, boolean up) { + int height = getHeight(currentY); + int newHeight; + if (up) { + if (height == 3) { + newHeight = 0; + } else if (height >= 2) { + return currentY; + } else { + newHeight = height + 1; + } + } else { + if (height == 0) { + newHeight = 3; + } else if (height >= 3) { + return currentY; + } else { + newHeight = height - 1; + } + } + return (newHeight * 944) + (currentY % 944); + } + + /** + * Should we can get an ore from the rock? + */ + public static boolean getOre(ObjectMiningDef def, int miningLevel, int axeId) { + + int levelDiff = miningLevel - def.getReqLevel(); + if (levelDiff > 50) + return Formulae.Rand(0, 9) != 1; + if (levelDiff < 0) { + return false; + } + int bonus = 0; + switch (axeId) { + case 156: + bonus = 0; + break; + case 1258: + bonus = 2; + break; + case 1259: + bonus = 6; + break; + case 1260: + bonus = 8; + break; + case 1261: + bonus = 10; + break; + case 1262: + bonus = 12; + break; + } + return DataConversions.percentChance(offsetToPercent(levelDiff + bonus)); + } + + public static int getPotionDose(int id) { + if (DataConversions.inArray(potions1Dose, id)) { + return 1; + } + if (DataConversions.inArray(potions2Dose, id)) { + return 2; + } + if (DataConversions.inArray(potions3Dose, id)) { + return 3; + } + return 0; + } + + /** + * @author xEnt + * + * This method will calculate the new price for all items in the + * shop there are 3 different types of calculations. 1. Buy price - + * if the item is sold in the shop by default, use the base quantity + * for the calculations in the new price. + * + * 2. Buy price - if a player has sold an item to a general store, + * leaving it to have no base quantity and player driven, we perform + * some secondary calculations. + * + * 3. Sell price (this works like the second buy price, calculates + * depending on a static number of stock and does not use any type + * of base quantity calculations, may do a second one in future. + * + * @param i + * - the selected Shop item, represented as an InvItem + * @param shop + * - the shop model object + * @param buy + * - if the item is for sale, or being sold + * @return the item's calculated price of value + */ + public static int getPrice(InvItem i, Shop shop, boolean buy) { + if (buy) + return i.getDef().getBasePrice(); + else + return i.getDef().getBasePrice() / 2; + /* + * final double GENERAL_STORE_BUY_MODIFIER = 0.685; + * + * int newPrice = -1; // the newly given price. boolean playerSoldItem = + * false; // If true, there is no base quantity (a // player has sold + * this item to general // store) int curAmount = i.getAmount(); // + * current quantity the selected item has int maxStockAmount = + * shop.getEquilibrium(i.getID()); // the base // quantity of // the + * selected // shop item (if // has one) + * + * if (maxStockAmount == 0 && shop.isGeneral()) playerSoldItem = true; + * // This item is an item that has no base // quantity, was sold by a + * player in general // store + * + * if (buy) { // Decide if this item is being brought if (maxStockAmount + * == 0 && !shop.isGeneral()) // this should not // happen return + * 999999999; // rofl error price if (playerSoldItem) { // General + * store, no maximum quantity for a // player sold item. (requires + * different // calculations) // cost 15% more buying a 3rd party item + * from a general store int basePrice = shop.isGeneral() ? + * i.getDef().basePrice + (int) (i.getDef().basePrice * 0.15) : + * i.getDef().basePrice; if (basePrice > 10000) // forget any items that + * are worth past // 10k return basePrice; if (curAmount > 28) // after + * 28 quantity from a player sold // item, stick to a static price + * newPrice = basePrice - (int) (basePrice * + * GENERAL_STORE_BUY_MODIFIER); else { // do calculations to decide a + * price depending on the // quantity newPrice = basePrice - (int) + * (curAmount * 5); if (newPrice < basePrice - (int) (basePrice * + * GENERAL_STORE_BUY_MODIFIER)) newPrice = basePrice - (int) (basePrice + * * GENERAL_STORE_BUY_MODIFIER); } } else { // Has a base quantity if + * (curAmount >= maxStockAmount) // leave base price is full // stock is + * avaliable newPrice = i.getDef().basePrice; else // 75-100% quantity + * is in stock if (curAmount > maxStockAmount * 0.75 && curAmount < + * maxStockAmount) newPrice = i.getDef().basePrice + (int) + * (i.getDef().basePrice * getShopPercentage( i, 0, true)); else // + * 50-75% quantity is in stock if (curAmount > maxStockAmount * 0.50 && + * curAmount <= maxStockAmount * 0.75) newPrice = i.getDef().basePrice + + * (int) (i.getDef().basePrice * getShopPercentage( i, 1, true)); else + * // 25-50% quantity is in stock if (curAmount > maxStockAmount * 0.25 + * && curAmount <= maxStockAmount * 0.50) newPrice = + * i.getDef().basePrice + (int) (i.getDef().basePrice * + * getShopPercentage( i, 2, true)); else // 0-25% quantity is in stock + * if (curAmount > maxStockAmount * 0.0 && curAmount <= maxStockAmount * + * 0.25) newPrice = i.getDef().basePrice + (int) (i.getDef().basePrice * + * getShopPercentage( i, 3, true)); } if (newPrice == -1) return + * 99999999; // error? return newPrice; } else { // Sell if (i.getID() + * == 117) System.out.println("Current stock: " + curAmount); int base = + * i.getDef().basePrice - (int) (i.getDef().basePrice / 2.5); // Sell + * price is 125% // lower than base // price to begin // with if + * (shop.isGeneral()) // 3rd party item (player sold) base = base - + * (int) (base * 0.10); // 10% less value, if general // store. + * + * if (curAmount < 1) return base; + * + * int price; // new price if (curAmount > 12) { price = base - (int) + * (base * 0.75); // 75% loss (believe it or // not, thats how it was) } + * else { price = base; + * + * if (curAmount > 1) price = base - (int) (curAmount * (base * 0.045)); + * if (price < base - (int) (base * 0.75)) base = base - (int) (base * + * 0.75); } if (price < 1) // should not happen return 0; // error price + * else return price; } + */ + } + + public static int getRangeDirection(Mob you, Mob them) { + if (you.getX() > them.getX() && you.getY() == them.getY()) // face right + return 6; + else if (you.getX() < them.getX() && you.getY() == them.getY()) // face + // left + return 2; + else if (you.getY() < them.getY() && you.getX() == them.getX()) // face + // down + return 4; + else if (you.getY() > them.getY() && you.getX() == them.getX()) // face + // up + return 0; + else if (you.getX() <= them.getX() && you.getY() <= them.getY()) // bottom + // left + return 3; + else if (you.getX() <= them.getX() && you.getY() >= them.getY()) // top + // left + return 1; + else if (you.getX() >= them.getX() && you.getY() >= them.getY()) // right + // up + return 7; + else if (you.getX() >= them.getX() && you.getY() <= them.getY()) // right/down + return 5; + + return -1; + } + + // This is needed for the above method + public static double getShopPercentage(InvItem item, int pos, boolean buy) { + int[] prices = { 0, 10, 100, 1000, 10000 }; // base prices of the items. + double[][] percentages = { { 0.5, 1.0, 1.5, 2.0 }, // in between 0 and + // 10GP. + { 0.1, 0.3, 0.45, 0.6 }, // 10-100gp + { 0.1, 0.2, 0.3, 0.4 }, // 100-1000gp + { 0.5, 0.1, 0.15, 0.2 }, // 1000-10000gp + }; + int key = -1; + for (int i = 0; i < prices.length - 1; i++) + if (item.getDef().basePrice > prices[i] && item.getDef().basePrice < prices[i + 1]) + key = i; + if (key == -1) + return -1; + return percentages[key][pos]; + } + + /** + * Gets the smithing exp for the given amount of the right bars + */ + public static int getSmithingExp(int barID, int barCount) { + int[] exps = { 13, 25, 37, 50, 83, 74 }; + int type = getBarType(barID); + if (type < 0) { + return 0; + } + return exps[type] * barCount; + } + + public static int getStat(String stat) { + for (int i = 0; i < statArray.length; i++) { + if (statArray[i].equalsIgnoreCase(stat)) + return i; + } + + return -1; + } + + /** + * Given a stat string get its index returns -1 on failure + */ + public static int getStatIndex(String stat) { + for (int index = 0; index < statArray.length; index++) { + if (stat.equalsIgnoreCase(statArray[index])) { + return index; + } + } + return -1; + } + + public static boolean isP2P(Object... objs) { + return isP2P(false, objs); + } + + /** + * Performs coordinate checks on the locations in the P2P_LOCS array to + * decide whether items/object/npc's/general x,y coordinates are in P2P area + * + * @param objs + * - ItemLoc, GameObjectLoc, NPCLoc or an Integer. + * @return - true if inside P2P area, otherwise false. + */ + public static boolean isP2P(boolean f2pwildy, Object... objs) { + int x = -1; + int y = -1; + if (objs.length == 1) { + Object obj = objs[0]; + if (obj instanceof GameObjectLoc) { + x = ((GameObjectLoc) obj).x; + y = ((GameObjectLoc) obj).y; + } else if ((obj instanceof ItemLoc)) { + x = ((ItemLoc) obj).x; + y = ((ItemLoc) obj).y; + } else if (obj instanceof NPCLoc) { + x = ((NPCLoc) obj).startX; + y = ((NPCLoc) obj).startY; + } + } else { + if (objs[0] instanceof Integer && objs[1] instanceof Integer) { + x = (Integer) objs[0]; + y = (Integer) objs[1]; + } + } + + if (x == -1) + return false; + if(!f2pwildy) { + for (int i = 0; i < P2P_LOCS.length; i++) { + for (int ele = 0; ele < 4; ele++) { + if (x >= P2P_LOCS[i][0].getX() && x <= P2P_LOCS[i][1].getX() && y >= P2P_LOCS[i][0].getY() + ((ele) * 944) && y <= P2P_LOCS[i][1].getY() + ((ele) * 944)) + return true; + } + } + } else { + for (int i = 0; i < F2PWILD_LOCS.length; i++) { + for (int ele = 0; ele < 4; ele++) { + if (x >= F2PWILD_LOCS[i][0].getX() && x <= F2PWILD_LOCS[i][1].getX() && y >= F2PWILD_LOCS[i][0].getY() + ((ele) * 944) && y <= F2PWILD_LOCS[i][1].getY() + ((ele) * 944)) + return true; + } + } + } + return false; + } + + public static int levelToExperience(int level) { + if (level <= 1) + return 0; + + return experienceArray[level]; + } + + /** + * Should the fire light or fail? + */ + public static boolean lightLogs(FiremakingDef def, int firemakingLvl) { + int levelDiff = firemakingLvl - def.getRequiredLevel(); + if (levelDiff < 0) { + return false; + } + if (levelDiff >= 20) { + return true; + } + return DataConversions.random(0, levelDiff + 1) != 0; + } + + // maxHit + /** + * Should the arrow be dropped or disappear + */ + public static boolean looseArrow(int damage) { + return DataConversions.random(0, 6) == 0; + } + + /** + * Calculate the max hit possible with the given stats + */ + public static int maxHit(int strength, int weaponPower, boolean burst, boolean superhuman, boolean ultimate, int bonus) { + double newStrength = (double) ((strength * addPrayers(burst, superhuman, ultimate)) + bonus); + + int fin = (int) ((newStrength * ((((double) weaponPower * 0.00175D) + 0.1D)) + 1.05D) * 0.95D); + //if (fin > 31) + // fin = 31; + return fin; + + } + + /** + * Gets the min level required to smith a bar + */ + public static int minSmithingLevel(int barID) { + int[] levels = { 1, 15, 30, 50, 70, 85 }; + int type = getBarType(barID); + if (type < 0) { + return -1; + } + return levels[type]; + } + + public static boolean objectAtFacing(Entity e, int x, int y, int dir) { + if (dir >= 0 && e instanceof GameObject) { + GameObject obj = (GameObject) e; + return obj.getType() == 0 && obj.getDirection() == dir && obj.isOn(x, y); + } + return false; + } + + private static int offsetToPercent(int levelDiff) { + return levelDiff > 40 ? 70 : 30 + levelDiff; + } + + /** + * Calulates what one mob should hit on another with meelee + */ + public static double parseDouble(double number) { + String numberString = String.valueOf(number); + return Double.valueOf(numberString.substring(0, numberString.indexOf(".") + 2)); + } + + public static int Rand(int low, int high) { + return low + r.nextInt(high - low); + } + + public static int styleBonus(Mob mob, int skill) { + int style = mob.getCombatStyle(); + if (style == 0) { + return 1; + } + return (skill == 0 && style == 2) || (skill == 1 && style == 3) || (skill == 2 && style == 1) ? 3 : 0; + } + public static int[] rares = new int[]{828, 831, 832, 575, 576, 577, 578, 579, 580, 581, 971, 1316, 1315, 1314, 422, 1289, 1156, 677}; + public static boolean isRareItem(int id) { + return DataConversions.inArray(rares,id); + } + public static int getBarIdFromItem(int itemID) { + if(DataConversions.inArray(BRONZE, itemID)) + return 169; + if(DataConversions.inArray(IRON, itemID)) + return 170; + if(DataConversions.inArray(STEEL, itemID)) + return 171; + if(DataConversions.inArray(MITH, itemID)) + return 173; + if(DataConversions.inArray(ADDY, itemID)) + return 174; + if(DataConversions.inArray(RUNE, itemID)) + return 408; + return -1; + } + + public final static int[] IRON = {6,5,7,8,2,3,9,28, 1075,1, 71, 83, 77, 12, 1258, 89, 0, 670, 1063}; + public final static int[] RUNE = {112, 399, 400, 401, 404, 403, 402, 396, 1080, 397, 75, 398, 81, 405, 1262, 93, 98, 674, 1067}; + public final static int[] ADDY = {111, 107, 116, 120, 131, 127, 123, 65, 1079, 69, 74, 86, 80, 204, 1261, 92, 97, 673, 1066}; + public final static int[] MITH = {110, 106, 115, 119, 130, 126, 122, 64, 1078, 68, 73, 85, 79, 203, 1260, 91, 96, 672, 1065}; + public final static int[] STEEL = {109, 105, 114, 118, 129, 125, 121, 63, 1077, 67, 72, 84, 78, 88, 1259, 90, 95, 671, 1064}; + public final static int[] BRONZE = {108, 104, 113, 117, 128, 124, 206, 62, 1076, 66, 70, 82, 76, 87, 156, 87, 205, 669, 1062}; + +} diff --git a/GameServer/src/msc/gs/CacheHandler.java b/GameServer/src/msc/gs/CacheHandler.java new file mode 100644 index 0000000..e86303c --- /dev/null +++ b/GameServer/src/msc/gs/CacheHandler.java @@ -0,0 +1,45 @@ +package msc.gs; + +import java.util.HashMap; + +import msc.gs.model.mini.Cache; +import msc.gs.tools.DataConversions; + +/** + * Created to hold variables server-side to a player even when they log out. + * Needed for certain minor things that don't need SQL. + * + * @author xEnt + * + */ +public class CacheHandler { + + public HashMap playerNames = new HashMap(); + public static CacheHandler cache = null; + + protected CacheHandler() { + } + + public static CacheHandler getCache() { + if (cache == null) + cache = new CacheHandler(); + return cache; + } + + public boolean hasData(String name) { + if (playerNames.get(DataConversions.usernameToHash(name)) != null) + return true; + return false; + } + + public Cache getCache(String name) { + return playerNames.get(DataConversions.usernameToHash(name)); + } + + public void addCache(String name, Cache c) { + if (hasData(name)) + playerNames.remove(DataConversions.usernameToHash(name)); + playerNames.put(DataConversions.usernameToHash(name), c); + } + +} diff --git a/GameServer/src/msc/gs/Instance.java b/GameServer/src/msc/gs/Instance.java new file mode 100644 index 0000000..f31f330 --- /dev/null +++ b/GameServer/src/msc/gs/Instance.java @@ -0,0 +1,45 @@ +package msc.gs; + +import msc.gs.core.DelayedEventHandler; +import msc.gs.db.DBConnection; +import msc.gs.db.ReportHandlerQueries; +import msc.gs.model.World; +import msc.gs.plugins.dependencies.PluginHandler; +import msc.irc.IRC; + +/** + * Holds instances to commonly used Objects. + * + * @author xEnt + * + */ +public class Instance { + + public static IRC getIRC() { + return getServer().getIRC(); + } + + public static Server getServer() { + return World.getWorld().getServer(); + } + + public static World getWorld() { + return World.getWorld(); + } + + public static DelayedEventHandler getDelayedEventHandler() { + return getWorld().getDelayedEventHandler(); + } + + public static CacheHandler getCacheHandler() { + return CacheHandler.getCache(); + } + + public static PluginHandler getPluginHandler() { + return PluginHandler.getPluginHandler(); + } + + public static ReportHandlerQueries getReport() { + return DBConnection.getReport(); + } +} diff --git a/GameServer/src/msc/gs/Server.java b/GameServer/src/msc/gs/Server.java new file mode 100644 index 0000000..c831750 --- /dev/null +++ b/GameServer/src/msc/gs/Server.java @@ -0,0 +1,255 @@ +package msc.gs; + +import java.io.File; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.concurrent.Executors; + +import org.apache.mina.common.IoAcceptor; +import org.apache.mina.common.IoAcceptorConfig; +import org.apache.mina.common.ThreadModel; +import org.apache.mina.transport.socket.nio.SocketAcceptor; +import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; +import org.apache.mina.transport.socket.nio.SocketSessionConfig; + +import msc.config.Config; +import msc.config.Constants; +import msc.gs.connection.RSCConnectionHandler; +import msc.gs.core.GameEngine; +import msc.gs.core.LoginConnector; +import msc.gs.event.DelayedEvent; +import msc.gs.event.SingleEvent; +import msc.gs.model.World; +import msc.gs.util.Logger; +import msc.irc.IRC; + +/** + * The entry point for RSC server. + */ +public class Server { + + /** + * World instance + */ + private static World world = null; + + public static void main(String[] args) throws IOException { + String configFile = "conf/server/Conf.xml"; + if (args.length > 0) { + File f = new File(args[0]); + if (f.exists()) { + configFile = f.getName(); + } + } + + + if (args[2] != null && args[2].equalsIgnoreCase("no")) + Constants.IRC.USE_IRC = false; + + Constants.GameServer.MEMBER_WORLD = args[1].equalsIgnoreCase("p2p"); + Constants.GameServer.MOTD = "@yel@Welcome to @whi@" + Constants.GameServer.SERVER_NAME + "@yel@ - World @whi@" + (Constants.GameServer.WORLD_NUMBER == 0 ? 2 : Constants.GameServer.WORLD_NUMBER) + " (" + (Constants.GameServer.MEMBER_WORLD ? "P2P" : "F2P") + ")"; + + world = Instance.getWorld(); + world.wl.loadObjects(); + + Config.initConfig(configFile); + World.initilizeDB(); + + Logger.println(Constants.GameServer.SERVER_NAME + " [" + (Constants.GameServer.MEMBER_WORLD ? "P2P" : "F2P") + "] " + "Server starting up..."); + + new Server(); + } + + public static boolean isMembers() { + return Constants.GameServer.MEMBER_WORLD; + } + + /** + * The SocketAcceptor + */ + private IoAcceptor acceptor; + /** + * The login server connection + */ + private LoginConnector connector; + /** + * The game engine + */ + private GameEngine engine; + /** + * The IRC. + */ + private IRC irc; + + public IoAcceptor getAcceptor() { + return acceptor; + } + + public void setAcceptor(IoAcceptor acceptor) { + this.acceptor = acceptor; + } + + public LoginConnector getConnector() { + return connector; + } + + public void setConnector(LoginConnector connector) { + this.connector = connector; + } + + public IRC getIRC() { + return irc; + } + + public void setIRC(IRC irc) { + this.irc = irc; + } + + public boolean isRunning() { + return running; + } + + public void setRunning(boolean running) { + this.running = running; + } + + public DelayedEvent getUpdateEvent() { + return updateEvent; + } + + public void setUpdateEvent(DelayedEvent updateEvent) { + this.updateEvent = updateEvent; + } + + public static World getWorld() { + return world; + } + + public void setEngine(GameEngine engine) { + this.engine = engine; + } + + /** + * Is the server running still? + */ + private boolean running; + + /** + * Update event - if the server is shutting down + */ + private DelayedEvent updateEvent; + + /** + * Creates a new server instance, which in turn creates a new engine and + * prepares the server socket to accept connections. + */ + public Server() { + running = true; + world.setServer(this); + irc = new IRC(); + if (Constants.IRC.USE_IRC) { + new Thread(irc).start(); + } else { + Logger.println("IRC is disabled"); + } + try { + Instance.getPluginHandler().initPlugins(); + } catch (Exception e) { + e.printStackTrace(); + } + try { + connector = new LoginConnector(); + engine = new GameEngine(); + engine.start(); + while (!connector.isRegistered()) { + Thread.sleep(100); + } + + acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool()); + IoAcceptorConfig config = new SocketAcceptorConfig(); + config.setDisconnectOnUnbind(true); + + config.setThreadModel(ThreadModel.MANUAL); + SocketSessionConfig ssc = (SocketSessionConfig) config.getSessionConfig(); + ssc.setSendBufferSize(10000); + ssc.setReceiveBufferSize(10000); + acceptor.bind(new InetSocketAddress(Config.SERVER_IP, Config.SERVER_PORT), new RSCConnectionHandler(engine), config); + + } catch (Exception e) { + Logger.error(e); + } + } + + /** + * Returns the game engine for this server + */ + public GameEngine getEngine() { + return engine; + } + + public LoginConnector getLoginConnector() { + return connector; + } + + public boolean isInitialized() { + return engine != null && connector != null; + } + + /** + * Kills the game engine and irc engine + * + * @throws InterruptedException + */ + public void kill() { + Logger.print(Constants.GameServer.SERVER_NAME + " shutting down..."); + running = false; + engine.emptyWorld(); + connector.kill(); + if (Constants.IRC.USE_IRC) { + Instance.getIRC().disconnect(); + Instance.getIRC().dispose(); + } + System.exit(0); + + } + + public boolean running() { + return running; + } + + /** + * Shutdown the server in 60 seconds + */ + public boolean shutdownForUpdate() { + if (updateEvent != null) { + return false; + } + updateEvent = new SingleEvent(null, 59000) { + public void action() { + kill(); + } + }; + Instance.getDelayedEventHandler().add(updateEvent); + return true; + } + + /** + * MS till the server shuts down + */ + public int timeTillShutdown() { + if (updateEvent == null) { + return -1; + } + return updateEvent.timeTillNextRun(); + } + + /** + * Unbinds the socket acceptor + */ + public void unbind() { + try { + acceptor.unbindAll(); + } catch (Exception e) { + } + } +} diff --git a/GameServer/src/msc/gs/builders/GameObjectPositionPacketBuilder.java b/GameServer/src/msc/gs/builders/GameObjectPositionPacketBuilder.java new file mode 100644 index 0000000..d3df6d3 --- /dev/null +++ b/GameServer/src/msc/gs/builders/GameObjectPositionPacketBuilder.java @@ -0,0 +1,55 @@ +package msc.gs.builders; + +import java.util.Collection; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.GameObject; +import msc.gs.model.Player; +import msc.gs.tools.DataConversions; +import msc.gs.util.StatefulEntityCollection; + +public class GameObjectPositionPacketBuilder { + private Player playerToUpdate; + + public RSCPacket getPacket() { + StatefulEntityCollection watchedObjects = playerToUpdate.getWatchedObjects(); + if (watchedObjects.changed()) { + Collection newObjects = watchedObjects.getNewEntities(); + Collection knownObjets = watchedObjects.getKnownEntities(); + RSCPacketBuilder packet = new RSCPacketBuilder(); + packet.setID(27); + for (GameObject o : knownObjets) { + if (o.getType() != 0) { + continue; + } + // We should remove ones miles away differently I think + if (watchedObjects.isRemoving(o)) { + byte[] offsets = DataConversions.getObjectPositionOffsets(o.getLocation(), playerToUpdate.getLocation()); + packet.addShort(60000); + packet.addByte(offsets[0]); + packet.addByte(offsets[1]); + packet.addByte((byte) o.getDirection()); + } + } + for (GameObject o : newObjects) { + if (o.getType() != 0) { + continue; + } + byte[] offsets = DataConversions.getObjectPositionOffsets(o.getLocation(), playerToUpdate.getLocation()); + packet.addShort(o.getID()); + packet.addByte(offsets[0]); + packet.addByte(offsets[1]); + packet.addByte((byte) o.getDirection()); + } + return packet.toPacket(); + } + return null; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/ItemPositionPacketBuilder.java b/GameServer/src/msc/gs/builders/ItemPositionPacketBuilder.java new file mode 100644 index 0000000..6de2b4c --- /dev/null +++ b/GameServer/src/msc/gs/builders/ItemPositionPacketBuilder.java @@ -0,0 +1,55 @@ +package msc.gs.builders; + +import java.util.Collection; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.Item; +import msc.gs.model.Player; +import msc.gs.tools.DataConversions; +import msc.gs.util.StatefulEntityCollection; + +public class ItemPositionPacketBuilder { + private Player playerToUpdate; + + public RSCPacket getPacket() { + StatefulEntityCollection watchedItems = playerToUpdate.getWatchedItems(); + if (watchedItems.changed()) { + Collection newItems = watchedItems.getNewEntities(); + Collection knownItems = watchedItems.getKnownEntities(); + RSCPacketBuilder packet = new RSCPacketBuilder(); + packet.setID(109); + + for (Item i : knownItems) { + // nextTo + if (watchedItems.isRemoving(i)) { + byte[] offsets = DataConversions.getObjectPositionOffsets(i.getLocation(), playerToUpdate.getLocation()); + // if(it's miles away) { + // packet.addByte((byte)255); + // packet.addByte((byte)sectionX); + // packet.addByte((byte)sectionY); + // } + // else { + packet.addShort(i.getID() + 32768); + packet.addByte(offsets[0]); + packet.addByte(offsets[1]); + // } + } + } + for (Item i : newItems) { + byte[] offsets = DataConversions.getObjectPositionOffsets(i.getLocation(), playerToUpdate.getLocation()); + packet.addShort(i.getID()); + packet.addByte(offsets[0]); + packet.addByte(offsets[1]); + } + return packet.toPacket(); + } + return null; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/LSPacketBuilder.java b/GameServer/src/msc/gs/builders/LSPacketBuilder.java new file mode 100644 index 0000000..8577e64 --- /dev/null +++ b/GameServer/src/msc/gs/builders/LSPacketBuilder.java @@ -0,0 +1,64 @@ +package msc.gs.builders; + +import msc.gs.connection.LSPacket; +import msc.gs.core.LoginConnector; +import msc.gs.phandler.PacketHandler; +import msc.gs.tools.DataConversions; + +public class LSPacketBuilder extends StaticPacketBuilder { + /** + * ID of the packet + */ + private int pID = 0; + /** + * UID of the packet + */ + private long uID = 0; + + /** + * Sets the handler for this packet. + * + * @param handler + * The handler of the packet + */ + public LSPacketBuilder setHandler(LoginConnector connector, PacketHandler handler) { + uID = DataConversions.getRandom().nextLong(); + connector.setHandler(uID, handler); + return this; + } + + /** + * Sets the ID for this packet. + * + * @param id + * The ID of the packet + */ + public LSPacketBuilder setID(int pID) { + this.pID = pID; + return this; + } + + /** + * Sets the uID for this packet. + * + * @param id + * The uID of the packet + */ + public LSPacketBuilder setUID(long uID) { + this.uID = uID; + return this; + } + + /** + * Returns a LSPacket object for the data contained in this + * builder. + * + * @return A LSPacket object + */ + public LSPacket toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new LSPacket(null, pID, uID, data, bare); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/builders/MiscPacketBuilder.java b/GameServer/src/msc/gs/builders/MiscPacketBuilder.java new file mode 100644 index 0000000..2b12b77 --- /dev/null +++ b/GameServer/src/msc/gs/builders/MiscPacketBuilder.java @@ -0,0 +1,734 @@ +package msc.gs.builders; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; + +import msc.config.Config; +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.RSCPacket; +import msc.gs.core.GameEngine; +import msc.gs.model.Bank; +import msc.gs.model.InvItem; +import msc.gs.model.Player; +import msc.gs.model.Shop; +import msc.gs.model.World; +import msc.gs.quest.Quest; + +public class MiscPacketBuilder { + /** + * List of packets waiting to be sent to the user + */ + private java.util.List packets = new java.util.ArrayList(); + /** + * The player we are creating packets for + */ + private Player player; // getArmourPoints + /** + * The World instance + */ + private World world = Instance.getWorld(); + + /** + * Constructs a new MiscPacketBuilder + */ + public MiscPacketBuilder(Player player) { + this.player = player; + } + + /** + * Clears old packets that have already been sent + */ + public void clearPackets() { + packets.clear(); + } + + /** + * Gets a List of new packets since the last update + */ + public List getPackets() { + return packets; + } + + /** + * Hides the bank windows + */ + public void hideBank() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(171); + packets.add(s.toPacket()); + } + + /** + * Hides a question menu + */ + public void hideMenu() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(127); + packets.add(s.toPacket()); + } + + // rade + /** + * Hides the shop window + */ + public void hideShop() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(220); + packets.add(s.toPacket()); + } + + /** + * Sends a message box + */ + public void sendAlert(String message, boolean big) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(big ? 64 : 148); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + public void sendAppearanceScreen() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(207); + packets.add(s.toPacket()); + } + + /** + * Deny logging out + */ + public void sendCantLogout() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(136); + packets.add(s.toPacket()); + } + + /** + * Sends the players combat style + */ + public void sendCombatStyle() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(129); + s.addByte((byte) player.getCombatStyle()); + packets.add(s.toPacket()); + } + + /** + * Alert the client that they just died + */ + public void sendDied() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(165); + packets.add(s.toPacket()); + } + + public void sendDuelAccept() { + Player with = player.getWishToDuel(); + if (with == null) { // This shouldn't happen + return; + } + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(147); + s.addLong(with.getUsernameHash()); + s.addByte((byte) with.getDuelOffer().size()); + for (InvItem item : with.getDuelOffer()) { + s.addShort(item.getID()); + s.addInt(item.getAmount()); + } + s.addByte((byte) player.getDuelOffer().size()); + for (InvItem item : player.getDuelOffer()) { + s.addShort(item.getID()); + s.addInt(item.getAmount()); + } + + s.addByte((byte) (player.getDuelSetting(0) ? 1 : 0)); // duelCantRetreat + // = data[i7++] + // & 0xff; + s.addByte((byte) (player.getDuelSetting(1) ? 1 : 0)); // duelUseMagic = + // data[i7++] & + // 0xff; + s.addByte((byte) (player.getDuelSetting(2) ? 1 : 0)); // duelUsePrayer = + // data[i7++] & + // 0xff; + s.addByte((byte) (player.getDuelSetting(3) ? 1 : 0)); // duelUseWeapons + // = data[i7++] + // & 0xff; + + packets.add(s.toPacket()); + } + + public void sendDuelAcceptUpdate() { + Player with = player.getWishToDuel(); + if (with == null) { // This shouldn't happen + return; + } + RSCPacketBuilder s1 = new RSCPacketBuilder(); + s1.setID(97); + s1.addByte((byte) (player.isDuelOfferAccepted() ? 1 : 0)); + packets.add(s1.toPacket()); + + RSCPacketBuilder s2 = new RSCPacketBuilder(); + s2.setID(65); + s2.addByte((byte) (with.isDuelOfferAccepted() ? 1 : 0)); + packets.add(s2.toPacket()); + } + + public void sendDuelItems() { + Player with = player.getWishToDuel(); + if (with == null) { // This shouldn't happen + return; + } + ArrayList items = with.getDuelOffer(); + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(63); + s.addByte((byte) items.size()); + for (InvItem item : items) { + s.addShort(item.getID()); + s.addInt(item.getAmount()); + } + packets.add(s.toPacket()); + } + + public void sendDuelSettingUpdate() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(198); + s.addByte((byte) (player.getDuelSetting(0) ? 1 : 0)); + s.addByte((byte) (player.getDuelSetting(1) ? 1 : 0)); + s.addByte((byte) (player.getDuelSetting(2) ? 1 : 0)); + s.addByte((byte) (player.getDuelSetting(3) ? 1 : 0)); + packets.add(s.toPacket()); + }// sendSound + + public void sendDuelWindowClose() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(160); + packets.add(s.toPacket()); + } + + public void sendDuelWindowOpen() { + Player with = player.getWishToDuel(); + if (with == null) { // This shouldn't happen + return; + } + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(229); + s.addShort(with.getIndex()); + packets.add(s.toPacket()); + } + + /** + * Enter Sleep + */ + public void sendEnterSleep() { + player.isSleeping = true; + byte[] image = GameEngine.getCaptcha().generateCaptcha(player); + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(206); + s.addBytes(image, 0, image.length); + packets.add(s.toPacket()); + } + + /** + * Updates the equipment status + */ + public void sendEquipmentStats() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(177); + s.addShort(player.getArmourPoints()); + s.addShort(player.getWeaponAimPoints()); + s.addShort(player.getWeaponPowerPoints()); + s.addShort(player.getMagicPoints()); + s.addShort(player.getPrayerPoints()); + s.addShort(player.getRangePoints()); + packets.add(s.toPacket()); + } + + /** + * Updates the fatigue percentage + */ + public void sendFatigue() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(126); + s.addShort(player.getFatigue()); + packets.add(s.toPacket()); + } + + /** + * Sends the whole friendlist + */ + public void sendFriendList() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(249); + s.addByte((byte) player.getFriendList().size()); + for (Entry friend : player.getFriendList()) { + int world = friend.getValue(); + s.addLong(friend.getKey()); + s.addByte((byte) (world == Config.SERVER_NUM ? 99 : world)); + } + packets.add(s.toPacket()); + } + + /** + * Updates a friends login status + */ + public void sendFriendUpdate(long usernameHash, int world) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(25); + s.addLong(usernameHash); + s.addByte((byte) (world == Config.SERVER_NUM ? 99 : world)); + packets.add(s.toPacket()); + } + + /** + * Updates game settings, ie sound effects etc + */ + public void sendGameSettings() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(152); + s.addByte((byte) (player.getGameSetting(0) ? 1 : 0)); + s.addByte((byte) (player.getGameSetting(2) ? 1 : 0)); + s.addByte((byte) (player.getGameSetting(3) ? 1 : 0)); + s.addByte((byte) (player.getGameSetting(4) ? 1 : 0)); + s.addByte((byte) (player.getGameSetting(5) ? 1 : 0)); + s.addByte((byte) (player.getGameSetting(6) ? 1 : 0)); + packets.add(s.toPacket()); + } + + /** + * Sends the whole ignore list + */ + public void sendIgnoreList() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(2); + s.addByte((byte) player.getIgnoreList().size()); + for (Long usernameHash : player.getIgnoreList()) { + s.addLong(usernameHash.longValue()); + } + packets.add(s.toPacket()); + } + + /** + * Incorrect sleep word! + */ + public void sendIncorrectSleepword() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(225); + packets.add(s.toPacket()); + } + + public void sendInfo2() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(211); + packets.add(s.toPacket()); + } + + public void sendInventory() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(114); + s.addByte((byte) player.getInventory().size()); + for (InvItem item : player.getInventory().getItems()) { + s.addShort(item.getID() + (item.isWielded() ? 32768 : 0)); + if (item.getDef().isStackable()) { + s.addInt(item.getAmount()); + } + } + packets.add(s.toPacket()); + } + + /** + * Displays the login box and last IP and login date + */ + public void sendLoginBox() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(248); + s.addShort(player.getDaysSinceLastLogin()); + s.addShort(player.getDaysSubscriptionLeft()); + s.addBytes(player.getLastIP().getBytes()); + packets.add(s.toPacket()); + } + + /** + * Confirm logout allowed + */ + public RSCPacket sendLogout() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(222); + RSCPacket packet = s.toPacket(); + packets.add(packet); + return packet; + } + + /** + * Shows a question menu + */ + public void sendMenu(String[] options) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(223); + s.addByte((byte) options.length); + for (String option : options) { + s.addByte((byte) option.length()); + s.addBytes(option.getBytes()); + } + packets.add(s.toPacket()); + } + + public void sendMessage(String message) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(48); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + public void sendOnlinePlayers() { + this.sendMessage("@yel@Players Online: @whi@" + (int)(Instance.getWorld().getPlayers().size() * 1.1) + " @yel@Accepted Connections: @whi@" + Constants.GameServer.ACCEPTED_CONNECTIONS); + } + + /** + * Sends the prayer list of activated/deactivated prayers + */ + public void sendPrayers() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(209); + for (int x = 0; x < 14; x++) { + s.addByte((byte) (player.isPrayerActivated(x) ? 1 : 0)); + } + packets.add(s.toPacket()); + } + + + + /** + * Updates privacy settings, ie pm block etc + */ + public void sendPrivacySettings() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(158); + s.addByte((byte) (player.getPrivacySetting(0) ? 1 : 0)); + s.addByte((byte) (player.getPrivacySetting(1) ? 1 : 0)); + s.addByte((byte) (player.getPrivacySetting(2) ? 1 : 0)); + s.addByte((byte) (player.getPrivacySetting(3) ? 1 : 0)); + packets.add(s.toPacket()); + } + + /** + * Send a private message + */ + public void sendPrivateMessage(long usernameHash, byte[] message) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(170); + s.addLong(usernameHash); + s.addBytes(message); + packets.add(s.toPacket()); + } + + /** + * Sends base quest information + */ + public void sendQuestData() { + /* + * RSCPacketBuilder s = new RSCPacketBuilder(); s.setID(233); + * s.addByte((byte)player.getQuestPoints()); int size = + * world.getQuestManager().getQuests().size(); s.addByte((byte)size); + * for (int i = 0; i < size; i++) { Quest quest = + * world.getQuestManager().getQuests().get(i); + * s.addByte((byte)quest.getUniqueID()); Integer objectInteger = + * player.getQuestStages().get(quest.getUniqueID()); if + * (objectInteger.intValue() == Quest.COMPLETE) s.addByte((byte) 2); + * else if (objectInteger.intValue() >= 1) s.addByte((byte) 1); else + * s.addByte((byte) 0); } + * + * packets.add(s.toPacket()); + */ + } + + // ATTACKER + /** + * Sends this player's quest info + */ + public void sendQuestInfo() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(233); + s.addByte((byte) player.getQuestPoints()); + int size = world.getQuestManager().getQuests().size(); + s.addByte((byte) size); + for (int i = 0; i < size; i++) { + Quest quest = world.getQuestManager().getQuests().get(i); + s.addByte((byte) quest.getUniqueID()); + Integer objectInteger = player.getQuestStages().get(quest.getUniqueID()); + if (objectInteger.intValue() == Quest.COMPLETE) + s.addByte((byte) 2); + else if (objectInteger.intValue() >= 1) + s.addByte((byte) 1); + else + s.addByte((byte) 0); + } + + packets.add(s.toPacket()); + /* + * RSCPacketBuilder s = new RSCPacketBuilder(); // setID(183) + * s.setID(233); s.addByte((byte)player.getQuestPoints()); HashMap qs = + * player.getQuestStages(); Set set = qs.entrySet(); Iterator i = + * set.iterator(); int idx = 0; + * + * while (i.hasNext()) { Map.Entry qe = (Map.Entry) i.next(); Integer + * objectInteger = (Integer) qe.getValue(); s.addByte() if + * (objectInteger.intValue() == Quest.COMPLETE) s.addByte((byte) 2); + * else if (objectInteger.intValue() >= 1) s.addByte((byte) 1); else + * s.addByte((byte) 0); } + * + * packets.add(s.toPacket()); + */ + } + + public void sendRemoveItem(int slot) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(191); + s.addByte((byte) slot); + packets.add(s.toPacket()); + } + + /** + * Tells the client to save a screenshot + */ + public void sendScreenshot() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(181); + packets.add(s.toPacket()); + } + + public void sendServerInfo() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(110); + s.addLong(Config.START_TIME); + s.addBytes(Config.SERVER_LOCATION.getBytes()); + packets.add(s.toPacket()); + } + + /** + * Sends a sound effect + */ + public void sendSound(String soundName) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(11); + s.addBytes(soundName.getBytes()); + packets.add(s.toPacket()); + } + + /** + * Updates just one stat + */ + public void sendStat(int stat) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(208); + s.addByte((byte) stat); + s.addByte((byte) player.getCurStat(stat)); + s.addByte((byte) player.getMaxStat(stat)); + s.addInt(player.getExp(stat)); + packets.add(s.toPacket()); + } + + /** + * Updates the users stats + */ + public void sendStats() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(180); + for (int lvl : player.getCurStats()) + s.addByte((byte) lvl); + for (int lvl : player.getMaxStats()) + s.addByte((byte) lvl); + for (int exp : player.getExps()) + s.addInt(exp); + packets.add(s.toPacket()); + } + + public void sendTeleBubble(int x, int y, boolean grab) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(23); + s.addByte((byte) (grab ? 1 : 0)); + s.addByte((byte) (x - player.getX())); + s.addByte((byte) (y - player.getY())); + packets.add(s.toPacket()); + } + + public void sendTradeAccept() { + Player with = player.getWishToTrade(); + if (with == null) { // This shouldn't happen + return; + } + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(251); + s.addLong(with.getUsernameHash()); + s.addByte((byte) with.getTradeOffer().size()); + for (InvItem item : with.getTradeOffer()) { + s.addShort(item.getID()); + s.addInt(item.getAmount()); + } + s.addByte((byte) player.getTradeOffer().size()); + for (InvItem item : player.getTradeOffer()) { + s.addShort(item.getID()); + s.addInt(item.getAmount()); + } + packets.add(s.toPacket()); + } + + public void sendTradeAcceptUpdate() { + Player with = player.getWishToTrade(); + if (with == null) { // This shouldn't happen + return; + } + RSCPacketBuilder s1 = new RSCPacketBuilder(); + s1.setID(18); + s1.addByte((byte) (player.isTradeOfferAccepted() ? 1 : 0)); + packets.add(s1.toPacket()); + + RSCPacketBuilder s2 = new RSCPacketBuilder(); + s2.setID(92); + s2.addByte((byte) (with.isTradeOfferAccepted() ? 1 : 0)); + packets.add(s2.toPacket()); + } + + public void sendTradeItems() { + Player with = player.getWishToTrade(); + if (with == null) { // This shouldn't happen + return; + } + ArrayList items = with.getTradeOffer(); + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(250); + s.addByte((byte) items.size()); + for (InvItem item : items) { + s.addShort(item.getID()); + s.addInt(item.getAmount()); + } + packets.add(s.toPacket()); + } + + public void sendTradeWindowClose() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(187); + packets.add(s.toPacket()); + } + + public void sendTradeWindowOpen() { + Player with = player.getWishToTrade(); + if (with == null) { // This shouldn't happen + return; + } + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(4); + s.addShort(with.getIndex()); + packets.add(s.toPacket()); + } + + public void sendUpdateItem(int slot) { + InvItem item = player.getInventory().get(slot); + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(228); + s.addByte((byte) slot); + s.addShort(item.getID() + (item.isWielded() ? 32768 : 0)); + if (item.getDef().isStackable()) { + s.addInt(item.getAmount()); + } + packets.add(s.toPacket()); + } + + public void sendWakeUp(boolean heh) { + if(heh) { + player.setFatigue(0); + player.getActionSender().sendFatigue(); + player.getActionSender().sendMessage("You wake up - feeling refreshed"); + } + player.isSleeping = false; + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(224); + packets.add(s.toPacket()); + } + + /* public void sendWakeUp1() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(224); + packets.add(s.toPacket()); + } + + public void sendWakeUp2() { + player.isSleeping = false; + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(224); + packets.add(s.toPacket()); + }*/ + + /** + * Sent when the user changes coords incase they moved up/down a level + */ + public void sendWorldInfo() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(131); + s.addShort(player.getIndex()); + s.addShort(2304); + s.addShort(1776); + s.addShort(Formulae.getHeight(player.getLocation())); + s.addShort(944); + packets.add(s.toPacket()); + } + + /** + * Show the bank window + */ + public void showBank() { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(93); + s.addByte((byte) player.getBank().size()); + s.addByte((byte) Bank.MAX_SIZE); + for (InvItem i : player.getBank().getItems()) { + s.addShort(i.getID()); + s.addInt(i.getAmount()); + } + packets.add(s.toPacket()); + } + + /** + * Show the bank window + */ + public void showShop(Shop shop) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(253); + s.addByte((byte) shop.size()); + s.addByte((byte) (shop.isGeneral() ? 1 : 0)); + s.addByte((byte) shop.getSellModifier()); + s.addByte((byte) shop.getBuyModifier()); + for (InvItem i : shop.getItems()) { + s.addShort(i.getID()); + s.addShort(i.getAmount()); + s.addInt(Formulae.getPrice(shop.getItems().get(Formulae.getItemPos(shop, i.getID())), shop, true)); + s.addInt(Formulae.getPrice(shop.getItems().get(Formulae.getItemPos(shop, i.getID())), shop, false)); + } + packets.add(s.toPacket()); + } + /** + * Sends a system update message + */ + public void startShutdown(int seconds) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(172); + s.addShort((int) (((double) seconds / 32D) * 50)); + packets.add(s.toPacket()); + } + + /** + * Updates the id and amount of an item in the bank + */ + public void updateBankItem(int slot, int newId, int amount) { + RSCPacketBuilder s = new RSCPacketBuilder(); + s.setID(139); + s.addByte((byte) slot); + s.addShort(newId); + s.addInt(amount); + packets.add(s.toPacket()); + } + public void addPacket(RSCPacket packet) { + packets.add(packet); + } +} diff --git a/GameServer/src/msc/gs/builders/NpcPositionPacketBuilder.java b/GameServer/src/msc/gs/builders/NpcPositionPacketBuilder.java new file mode 100644 index 0000000..5dcce54 --- /dev/null +++ b/GameServer/src/msc/gs/builders/NpcPositionPacketBuilder.java @@ -0,0 +1,60 @@ +package msc.gs.builders; + +import java.util.Collection; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.tools.DataConversions; +import msc.gs.util.StatefulEntityCollection; + +public class NpcPositionPacketBuilder { + private Player playerToUpdate; + + public RSCPacket getPacket() { + StatefulEntityCollection watchedNpcs = playerToUpdate.getWatchedNpcs(); + Collection newNpcs = watchedNpcs.getNewEntities(); + Collection knownNpcs = watchedNpcs.getKnownEntities(); + + RSCPacketBuilder packet = new RSCPacketBuilder(); + packet.setID(77); + packet.addBits(knownNpcs.size(), 8); + for (Npc n : knownNpcs) { + packet.addBits(n.getIndex(), 16); + if (watchedNpcs.isRemoving(n)) { + packet.addBits(1, 1); + packet.addBits(1, 1); + packet.addBits(12, 4); + } + else if (n.hasMoved()) { + packet.addBits(1, 1); + packet.addBits(0, 1); + packet.addBits(n.getSprite(), 3); + } + else if (n.spriteChanged()) { + packet.addBits(1, 1); + packet.addBits(1, 1); + packet.addBits(n.getSprite(), 4); + } + else { + packet.addBits(0, 1); + } + } + for (Npc n : newNpcs) { + byte[] offsets = DataConversions.getMobPositionOffsets(n.getLocation(), playerToUpdate.getLocation()); + packet.addBits(n.getIndex(), 16); + packet.addBits(offsets[0], 5); + packet.addBits(offsets[1], 5); + packet.addBits(n.getSprite(), 4); + packet.addBits(n.getID(), 10); + } + return packet.toPacket(); + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/NpcUpdatePacketBuilder.java b/GameServer/src/msc/gs/builders/NpcUpdatePacketBuilder.java new file mode 100644 index 0000000..48cbea3 --- /dev/null +++ b/GameServer/src/msc/gs/builders/NpcUpdatePacketBuilder.java @@ -0,0 +1,72 @@ +package msc.gs.builders; + +import java.util.ConcurrentModificationException; +import java.util.List; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; + +public class NpcUpdatePacketBuilder { + private Player playerToUpdate; + + public RSCPacket getPacket() { + List npcsNeedingHitsUpdate = playerToUpdate.getNpcsRequiringHitsUpdate(); + List npcMessagesNeedingDisplayed = playerToUpdate.getNpcMessagesNeedingDisplayed(); + + int updateSize = npcMessagesNeedingDisplayed.size() + npcsNeedingHitsUpdate.size(); + if (updateSize > 0) { + try { + RSCPacketBuilder updates = new RSCPacketBuilder(); + updates.setID(190); + updates.addShort(updateSize); + for (ChatMessage cm : npcMessagesNeedingDisplayed) { + updates.addShort(cm.getSender().getIndex()); + updates.addByte((byte) 1); + updates.addShort(cm.getRecipient().getIndex()); + updates.addByte((byte) cm.getLength()); + updates.addBytes(cm.getMessage()); + // show text above heads of players around + if (cm.getRecipient() != null && cm.getRecipient() instanceof Player) { + RSCPacketBuilder updatez = new RSCPacketBuilder(); + updatez.setID(190); + updatez.addShort(1); + updatez.addShort(cm.getSender().getIndex()); + updatez.addByte((byte) 1); + updatez.addShort(-1); + updatez.addByte((byte) cm.getLength()); + updatez.addBytes(cm.getMessage()); + for (Player pl : playerToUpdate.getViewArea().getPlayersInView()) { + if (pl.equals(playerToUpdate) || pl == playerToUpdate) + continue; + pl.getActionSender().addPacket(updatez.toPacket()); + } + } + } + for (Npc n : npcsNeedingHitsUpdate) { + updates.addShort(n.getIndex()); + updates.addByte((byte) 2); + updates.addByte((byte) n.getLastDamage()); + updates.addByte((byte) n.getHits()); + updates.addByte((byte) n.getDef().getHits()); + } + return updates.toPacket(); + } + catch(ConcurrentModificationException e) { + return null; + /** + * Should fix the GS packet queue from piling up + */ + } + } + return null; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/PlayerPositionPacketBuilder.java b/GameServer/src/msc/gs/builders/PlayerPositionPacketBuilder.java new file mode 100644 index 0000000..17a42ce --- /dev/null +++ b/GameServer/src/msc/gs/builders/PlayerPositionPacketBuilder.java @@ -0,0 +1,64 @@ +package msc.gs.builders; + +import java.util.Collection; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.Player; +import msc.gs.tools.DataConversions; +import msc.gs.util.StatefulEntityCollection; + +public class PlayerPositionPacketBuilder { + + private Player playerToUpdate; + + public RSCPacket getPacket() { + StatefulEntityCollection watchedPlayers = playerToUpdate.getWatchedPlayers(); + Collection newPlayers = watchedPlayers.getNewEntities(); + Collection knownPlayers = watchedPlayers.getKnownEntities(); + RSCPacketBuilder packet = new RSCPacketBuilder(); + packet.setID(145); + packet.addBits(playerToUpdate.getX(), 11); + packet.addBits(playerToUpdate.getY(), 13); + packet.addBits(playerToUpdate.getSprite(), 4); + packet.addBits(knownPlayers.size(), 8); + for (Player p : knownPlayers) { + if (playerToUpdate.getIndex() != p.getIndex()) { + packet.addBits(p.getIndex(), 16); + if (watchedPlayers.isRemoving(p)) { + packet.addBits(1, 1); + packet.addBits(1, 1); + packet.addBits(12, 4); + } else if (p.hasMoved()) { + packet.addBits(1, 1); + packet.addBits(0, 1); + packet.addBits(p.getSprite(), 3); + } else if (p.spriteChanged()) { + packet.addBits(1, 1); + packet.addBits(1, 1); + packet.addBits(p.getSprite(), 4); + } else { + packet.addBits(0, 1); + } + } + } + for (Player p : newPlayers) { + byte[] offsets = DataConversions.getMobPositionOffsets(p.getLocation(), playerToUpdate.getLocation()); + packet.addBits(p.getIndex(), 16); + packet.addBits(offsets[0], 5); + packet.addBits(offsets[1], 5); + packet.addBits(p.getSprite(), 4); + packet.addBits(0, 1); + } + RSCPacket pkt = packet.toPacket(); + Player p = playerToUpdate; + + return pkt; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/PlayerUpdatePacketBuilder.java b/GameServer/src/msc/gs/builders/PlayerUpdatePacketBuilder.java new file mode 100644 index 0000000..ded80d4 --- /dev/null +++ b/GameServer/src/msc/gs/builders/PlayerUpdatePacketBuilder.java @@ -0,0 +1,104 @@ +package msc.gs.builders; + +import java.util.List; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.Bubble; +import msc.gs.model.ChatMessage; +import msc.gs.model.Entity; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.PlayerAppearance; +import msc.gs.model.Projectile; + +public class PlayerUpdatePacketBuilder { + + private Player playerToUpdate; + + public RSCPacket getPacket() { + List bubblesNeedingDisplayed = playerToUpdate.getBubblesNeedingDisplayed(); + List chatMessagesNeedingDisplayed = playerToUpdate.getChatMessagesNeedingDisplayed(); + List playersNeedingHitsUpdate = playerToUpdate.getPlayersRequiringHitsUpdate(); + + List projectilesNeedingDisplayed = playerToUpdate.getProjectilesNeedingDisplayed(); + List playersNeedingAppearanceUpdate = playerToUpdate.getPlayersRequiringAppearanceUpdate(); + + int updateSize = bubblesNeedingDisplayed.size() + chatMessagesNeedingDisplayed.size() + playersNeedingHitsUpdate.size() + projectilesNeedingDisplayed.size() + playersNeedingAppearanceUpdate.size(); + if (updateSize > 0) { + RSCPacketBuilder updates = new RSCPacketBuilder(); + updates.setID(53); + updates.addShort(updateSize); + for (Bubble b : bubblesNeedingDisplayed) { // 0 - Draws item over + // players head + updates.addShort(b.getOwner().getIndex()); + updates.addByte((byte) 0); + updates.addShort(b.getID()); + } + for (ChatMessage cm : chatMessagesNeedingDisplayed) { // 1/6 - + // Player + // talking + updates.addShort(cm.getSender().getIndex()); + updates.addByte((byte) (cm.getRecipient() == null ? 1 : 6)); + // System.out.println(cm.getRecipient() == null); + updates.addByte((byte) cm.getLength()); + updates.addBytes(cm.getMessage()); + } + for (Player p : playersNeedingHitsUpdate) { // 2 - Hitpoints update + // for players, draws + // health bar etc too + updates.addShort(p.getIndex()); + updates.addByte((byte) 2); + updates.addByte((byte) p.getLastDamage()); + updates.addByte((byte) p.getCurStat(3)); + updates.addByte((byte) p.getMaxStat(3)); + } + for (Projectile p : projectilesNeedingDisplayed) { // 3/4 - Draws a + // projectile + Entity victim = p.getVictim(); + if (victim instanceof Npc) { + updates.addShort(p.getCaster().getIndex()); + updates.addByte((byte) 3); + updates.addShort(p.getType()); + updates.addShort(((Npc) victim).getIndex()); + } else if (victim instanceof Player) { + updates.addShort(p.getCaster().getIndex()); + updates.addByte((byte) 4); + updates.addShort(p.getType()); + updates.addShort(((Player) victim).getIndex()); + } + } + for (Player p : playersNeedingAppearanceUpdate) { // 5 - Updates + // players + // appearance, + // clothes, + // skull, combat + // etc. + PlayerAppearance appearance = p.getPlayerAppearance(); + updates.addShort(p.getIndex()); + updates.addByte((byte) 5); + updates.addShort(p.getAppearanceID()); + updates.addLong(p.getUsernameHash()); + updates.addByte((byte) p.getWornItems().length); + for (int i : p.getWornItems()) { + updates.addByte((byte) i); + } + updates.addByte(appearance.getHairColour()); + updates.addByte(appearance.getTopColour()); + updates.addByte(appearance.getTrouserColour()); + updates.addByte(appearance.getSkinColour()); + updates.addByte((byte) p.getCombatLevel()); + updates.addByte((byte) (p.isSkulled() ? 1 : 0)); + updates.addByte((byte) (p.isAdmin() ? 3 : (p.isMod() ? 2 : (p.isPMod() ? 1 : 0)))); + } + return updates.toPacket(); + } + return null; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/RSCPacketBuilder.java b/GameServer/src/msc/gs/builders/RSCPacketBuilder.java new file mode 100644 index 0000000..83cb98a --- /dev/null +++ b/GameServer/src/msc/gs/builders/RSCPacketBuilder.java @@ -0,0 +1,34 @@ +package msc.gs.builders; + +import msc.gs.connection.RSCPacket; + +public class RSCPacketBuilder extends StaticPacketBuilder { + /** + * ID of the packet + */ + private int pID = 0; + + /** + * Sets the ID for this packet. + * + * @param id + * The ID of the packet + */ + public RSCPacketBuilder setID(int pID) { + this.pID = pID; + return this; + } + + /** + * Returns a RSCPacket object for the data contained in this + * builder. + * + * @return A RSCPacket object + */ + public RSCPacket toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new RSCPacket(null, pID, data, bare); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/builders/StaticPacketBuilder.java b/GameServer/src/msc/gs/builders/StaticPacketBuilder.java new file mode 100644 index 0000000..7528c78 --- /dev/null +++ b/GameServer/src/msc/gs/builders/StaticPacketBuilder.java @@ -0,0 +1,254 @@ +package msc.gs.builders; + +import msc.gs.connection.Packet; +import msc.gs.util.Logger; + +/** + * A mutable sequence of bytes used to construct the immutable + * RSCPacket objects. + */ +public class StaticPacketBuilder { + /** + * Bitmasks for addBits() + */ + protected static int bitmasks[] = { 0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, -1 }; + /** + * Default capacity + */ + protected static final int DEFAULT_SIZE = 32; + /** + * Whether this packet does not use the standard packet header + */ + protected boolean bare = false; + /** + * Current index into the buffer by bits + */ + protected int bitPosition = 0; + /** + * Current number of bytes used in the buffer + */ + protected int curLength; + + /** + * The payload buffer + */ + protected byte[] payload; + + /** + * Constructs a packet builder with no data and an initial capacity of + * DEFAULT_SIZE. + * + * @see DEFAULT_SIZE + */ + public StaticPacketBuilder() { + this(DEFAULT_SIZE); + } + + /** + * Constructs a packet builder with no data and an initial capacity of + * capacity. + * + * @param capacity + * The initial capacity of the buffer + */ + public StaticPacketBuilder(int capacity) { + payload = new byte[capacity]; + } + + /** + * TODO needs a proper description. + */ + public StaticPacketBuilder addBits(int value, int numBits) { + int bytePos = bitPosition >> 3; + int bitOffset = 8 - (bitPosition & 7); + bitPosition += numBits; + curLength = (bitPosition + 7) / 8; + ensureCapacity(curLength); + for (; numBits > bitOffset; bitOffset = 8) { + payload[bytePos] &= ~bitmasks[bitOffset]; // mask out the desired + // area + payload[bytePos++] |= (value >> (numBits - bitOffset)) & bitmasks[bitOffset]; + + numBits -= bitOffset; + } + if (numBits == bitOffset) { + payload[bytePos] &= ~bitmasks[bitOffset]; + payload[bytePos] |= value & bitmasks[bitOffset]; + } else { + payload[bytePos] &= ~(bitmasks[numBits] << (bitOffset - numBits)); + payload[bytePos] |= (value & bitmasks[numBits]) << (bitOffset - numBits); + } + return this; + } + + /** + * Adds a byte to the data buffer. The size of this packet will + * grow by one byte. + * + * @param val + * The byte value to add + * @return A reference to this object + */ + public StaticPacketBuilder addByte(byte val) { + return addByte(val, true); + } + + /** + * Adds a byte to the data buffer. The size of this packet will + * grow by one byte. + * + * @param val + * The byte value to add + * @param checkCapacity + * Whether the buffer capacity should be checked + * @return A reference to this object + */ + private StaticPacketBuilder addByte(byte val, boolean checkCapacity) { + if (checkCapacity) + ensureCapacity(curLength + 1); + payload[curLength++] = val; + return this; + } + + /** + * Adds the contents of byte array data to the + * packet. The size of this packet will grow by the length of the provided + * array. + * + * @param data + * The bytes to add to this packet + * @return A reference to this object + */ + public StaticPacketBuilder addBytes(byte[] data) { + return addBytes(data, 0, data.length); + } + + /** + * Adds the contents of byte array data, starting + * at index offset. The size of this packet will grow by + * len bytes. + * + * @param data + * The bytes to add to this packet + * @param offset + * The index of the first byte to append + * @param len + * The number of bytes to append + * @return A reference to this object + */ + public StaticPacketBuilder addBytes(byte[] data, int offset, int len) { + int newLength = curLength + len; + ensureCapacity(newLength); + System.arraycopy(data, offset, payload, curLength, len); + curLength = newLength; + return this; + } + + /** + * Adds a int to the data stream. The size of this packet will + * grow by four bytes. + * + * @param val + * The int value to add + * @return A reference to this object + */ + public StaticPacketBuilder addInt(int val) { + ensureCapacity(curLength + 4); + addByte((byte) (val >> 24), false); + addByte((byte) (val >> 16), false); + addByte((byte) (val >> 8), false); + addByte((byte) val, false); + return this; + } + + /** + * Adds a long to the data stream. The size of this packet will + * grow by eight bytes. + * + * @param val + * The long value to add + * @return A reference to this object + */ + public StaticPacketBuilder addLong(long val) { + addInt((int) (val >> 32)); + addInt((int) (val & -1L)); + return this; + } + + /** + * Adds a short to the data stream. The size of this packet + * will grow by two bytes. + * + * @param val + * The short value to add + * @return A reference to this object + */ + public StaticPacketBuilder addShort(int val) { + ensureCapacity(curLength + 2); + addByte((byte) (val >> 8), false); + addByte((byte) val, false); + return this; + } + + /** + * Ensures that the buffer is at least minimumBytes bytes. + * + * @param minimumCapacity + * The size needed + */ + private void ensureCapacity(int minimumCapacity) { + if (minimumCapacity >= payload.length) + expandCapacity(minimumCapacity); + } + + /** + * Expands the buffer to the specified size. + * + * @param minimumCapacity + * The minimum capacity to which to expand + * @see java.lang.AbstractStringBuilder#expandCapacity(int) + */ + private void expandCapacity(int minimumCapacity) { + int newCapacity = (payload.length + 1) * 2; + if (newCapacity < 0) { + newCapacity = Integer.MAX_VALUE; + } else if (minimumCapacity > newCapacity) { + newCapacity = minimumCapacity; + } + int oldLength = curLength; + if (oldLength > payload.length) { + oldLength = payload.length; + } + byte[] newPayload = new byte[newCapacity]; + try { + System.arraycopy(payload, 0, newPayload, 0, oldLength); + } catch (Exception e) { + Logger.error(e); + } + payload = newPayload; + } + + /** + * Sets this packet as bare. A bare packet will contain only the payload + * data, rather than having the standard packet header prepended. + * + * @param bare + * Whether this packet is to be sent bare + */ + public StaticPacketBuilder setBare(boolean bare) { + this.bare = bare; + return this; + } + + /** + * Returns a Packet object for the data contained in this + * builder. + * + * @return A Packet object + */ + public Packet toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new Packet(null, data, bare); + } +} diff --git a/GameServer/src/msc/gs/builders/WallObjectPositionPacketBuilder.java b/GameServer/src/msc/gs/builders/WallObjectPositionPacketBuilder.java new file mode 100644 index 0000000..aaeaeac --- /dev/null +++ b/GameServer/src/msc/gs/builders/WallObjectPositionPacketBuilder.java @@ -0,0 +1,55 @@ +package msc.gs.builders; + +import java.util.Collection; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.GameObject; +import msc.gs.model.Player; +import msc.gs.tools.DataConversions; +import msc.gs.util.StatefulEntityCollection; + +public class WallObjectPositionPacketBuilder { + private Player playerToUpdate; + + public RSCPacket getPacket() { + StatefulEntityCollection watchedObjects = playerToUpdate.getWatchedObjects(); + if (watchedObjects.changed()) { + Collection newObjects = watchedObjects.getNewEntities(); + Collection knownObjets = watchedObjects.getKnownEntities(); + RSCPacketBuilder packet = new RSCPacketBuilder(); + packet.setID(95); + for (GameObject o : knownObjets) { + if (o.getType() != 1) { + continue; + } + // We should remove ones miles away differently I think + if (watchedObjects.isRemoving(o)) { + byte[] offsets = DataConversions.getObjectPositionOffsets(o.getLocation(), playerToUpdate.getLocation()); + packet.addShort(60000); + packet.addByte(offsets[0]); + packet.addByte(offsets[1]); + packet.addByte((byte) o.getDirection()); + } + } + for (GameObject o : newObjects) { + if (o.getType() != 1) { + continue; + } + byte[] offsets = DataConversions.getObjectPositionOffsets(o.getLocation(), playerToUpdate.getLocation()); + packet.addShort(o.getID()); + packet.addByte(offsets[0]); + packet.addByte(offsets[1]); + packet.addByte((byte) o.getDirection()); + } + return packet.toPacket(); + } + return null; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player p) { + playerToUpdate = p; + } +} diff --git a/GameServer/src/msc/gs/builders/ls/GameSettingUpdatePacketBuilder.java b/GameServer/src/msc/gs/builders/ls/GameSettingUpdatePacketBuilder.java new file mode 100644 index 0000000..209b92f --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/GameSettingUpdatePacketBuilder.java @@ -0,0 +1,45 @@ +package msc.gs.builders.ls; + +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.Player; + +public class GameSettingUpdatePacketBuilder { + /** + * The settings index + */ + private int index; + /** + * Has the setting been turned on or off? + */ + private boolean on; + /** + * Player to update + */ + private Player player; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setID(7); + packet.addLong(player.getUsernameHash()); + packet.addByte((byte) (on ? 1 : 0)); + packet.addByte((byte) index); + return packet.toPacket(); + } + + public void setIndex(int index) { + this.index = index; + } + + public void setOn(boolean on) { + this.on = on; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player player) { + this.player = player; + } + +} diff --git a/GameServer/src/msc/gs/builders/ls/MiscPacketBuilder.java b/GameServer/src/msc/gs/builders/ls/MiscPacketBuilder.java new file mode 100644 index 0000000..bbc4119 --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/MiscPacketBuilder.java @@ -0,0 +1,273 @@ +package msc.gs.builders.ls; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.mina.common.IoSession; + +import msc.config.Config; +import msc.gs.Instance; +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.core.LoginConnector; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.phandler.PlayerLogin; +import msc.gs.tools.DataConversions; +import msc.gs.util.EntityList; +import msc.gs.util.Logger; + +public class MiscPacketBuilder { + /** + * Connector instance + */ + private final LoginConnector connector; + /** + * List of packets waiting to be sent to the user + */ + private List packets = new ArrayList(); + /** + * World instance + */ + private World world = Instance.getWorld(); + + public MiscPacketBuilder(LoginConnector connector) { + this.connector = connector; + } + + public void addFriend(long user, long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(11); + s.addLong(user); + s.addLong(friend); + packets.add(s.toPacket()); + } + + public void addIgnore(long user, long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(13); + s.addLong(user); + s.addLong(friend); + packets.add(s.toPacket()); + } + + public void banPlayer(final Player mod, final long user, final boolean ban) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(ban ? 4 : 5); + s.addLong(user); + final long modhash = DataConversions.usernameToHash(mod.getUsername()); + s.addLong(modhash); + s.setHandler(connector, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) + throws Exception { + if (p.readByte() == 1) { + Logger.mod(mod.getUsername() + " " + + (ban ? "banned" : "unbanned") + " " + + DataConversions.hashToUsername(user)); + } + mod.getActionSender().sendMessage(p.readString()); + } + }); + packets.add(s.toPacket()); + } + + /** + * Clears old packets that have already been sent + */ + public void clearPackets() { + packets.clear(); + } + + /** + * Gets a List of new packets since the last update + */ + public List getPackets() { + return packets; + } + + public void logAction(String message, int type) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(32); + s.addByte((byte) type); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + public void logKill(long user, long killed, boolean stake) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(3); + s.addLong(user); + s.addLong(killed); + s.addByte((byte) (stake ? 2 : 1)); + packets.add(s.toPacket()); + } + + public void playerLogin(Player player) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(31); + s.setHandler(connector, new PlayerLogin(player)); + s.addLong(player.getUsernameHash()); + s.addLong(DataConversions.IPToLong(player.getCurrentIP())); + s.addBytes(DataConversions.md5(player.getPassword()).getBytes()); + s.addBytes(player.getClassName().getBytes()); + packets.add(s.toPacket()); + } + + public void playerLogout(long user) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(30); + s.addLong(user); + packets.add(s.toPacket()); + } + + /** + * Tells the login server we are registered and lists players connected + * (should be 0 at startup) + */ + public void registerWorld() { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(1); + s.setHandler(connector, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) + throws Exception { + connector.setRegistered(p.readByte() == 1); + } + }); + s.addShort(Config.SERVER_NUM); + EntityList players = world.getPlayers(); + s.addShort(players.size()); + for (Player player : players) { + s.addLong(player.getUsernameHash()); + s.addLong(DataConversions.IPToLong(player.getCurrentIP())); + } + packets.add(s.toPacket()); + } + + public void removeFriend(long user, long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(12); + s.addLong(user); + s.addLong(friend); + packets.add(s.toPacket()); + } + + public void removeIgnore(long user, long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(14); + s.addLong(user); + s.addLong(friend); + packets.add(s.toPacket()); + } + + public void reportUser(long user, long reported, byte reason) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(15); + s.addLong(user); + s.addLong(reported); + s.addByte(reason); + packets.add(s.toPacket()); + } + + public void requestPlayerInfo(final Player mod, final long user) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(8); + s.addLong(user); + s.setHandler(connector, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) + throws Exception { + if (p.readByte() == 1) { + Logger.mod(mod.getUsername() + " requested information on " + + DataConversions.hashToUsername(user)); + + int world = p.readShort(); + Point location = Point.location(p.readShort(), p + .readShort()); + long loginDate = p.readLong(); + int lastMoved = (int) ((System.currentTimeMillis() - p + .readLong()) / 1000); + boolean chatBlock = p.readByte() == 1; + int fatigue = p.readShort(); + String state = p.readString(); + + mod.getActionSender().sendAlert( + "@whi@" + DataConversions.hashToUsername(user) + + " is currently on world @or1@" + world + + "@whi@ at @or1@" + location.toString() + + "@whi@ (@or1@" + + location.getDescription() + + "@whi@). State is @or1@" + state + + "@whi@. Logged in @or1@" + + DataConversions.timeSince(loginDate) + + "@whi@ ago. Last moved @or1@" + lastMoved + + " secs @whi@ ago. Chat block is @or1@" + + (chatBlock ? "on" : "off") + + "@whi@. Fatigue is at @or1@" + fatigue + + "@whi@.", false); + } else { + mod + .getActionSender() + .sendMessage( + "Invalid player, maybe they aren't currently online?"); + } + } + }); + packets.add(s.toPacket()); + } + + public void saveProfiles() { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(9); + s.setHandler(connector, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) + throws Exception { + if (p.readByte() != 1) { + Logger.error("Error saving all profiles!"); + } + } + }); + packets.add(s.toPacket()); + } + + public void sendPM(long user, long friend, boolean avoidBlock, + byte[] message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(10); + s.addLong(user); + s.addLong(friend); + s.addByte((byte) (avoidBlock ? 1 : 0)); + s.addBytes(message); + packets.add(s.toPacket()); + } + + public void tradeLog(final long from, final long to, final int item, + final long amount, final int x, final int y, final int type) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(33); + s.addLong(from); + s.addLong(to); + s.addInt(item); + s.addLong(amount); + s.addInt(x); + s.addInt(y); + s.addInt(type); + s.addLong((System.currentTimeMillis() / 1000)); + packets.add(s.toPacket()); + } + + public void unregisterWorld() { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(2); + s.setHandler(connector, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) + throws Exception { + session.close().join(); + Instance.getServer().unbind(); + Instance.getServer().getEngine().kill(); + } + }); + packets.add(s.toPacket()); + } +} diff --git a/GameServer/src/msc/gs/builders/ls/PlayerInfoRequestPacketBuilder.java b/GameServer/src/msc/gs/builders/ls/PlayerInfoRequestPacketBuilder.java new file mode 100644 index 0000000..f16f4a3 --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/PlayerInfoRequestPacketBuilder.java @@ -0,0 +1,54 @@ +package msc.gs.builders.ls; + +import msc.gs.Instance; +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class PlayerInfoRequestPacketBuilder { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + /** + * The player to provide information on + */ + private Player player; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + if (player == null) { + packet.addByte((byte) 0); + } else { + packet.addByte((byte) 1); + packet.addShort(player.getX()); + packet.addShort(player.getY()); + packet.addLong(player.getCurrentLogin()); + packet.addLong(player.getLastMoved()); + packet.addByte((byte) (player.getPrivacySetting(0) ? 1 : 0)); + packet.addShort(player.getFatigue()); + packet.addBytes(player.getStatus().toString().getBytes()); + } + return packet.toPacket(); + } + + /** + * Sets the player to provide information on + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/GameServer/src/msc/gs/builders/ls/PlayerListRequestPacketBuilder.java b/GameServer/src/msc/gs/builders/ls/PlayerListRequestPacketBuilder.java new file mode 100644 index 0000000..65a3d06 --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/PlayerListRequestPacketBuilder.java @@ -0,0 +1,40 @@ +package msc.gs.builders.ls; + +import msc.gs.Instance; +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.util.EntityList; + +public class PlayerListRequestPacketBuilder { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + EntityList players = world.getPlayers(); + + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addInt(players.size()); + for (Player p : players) { + packet.addLong(p.getUsernameHash()); + packet.addShort(p.getX()); + packet.addShort(p.getY()); + } + return packet.toPacket(); + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/GameServer/src/msc/gs/builders/ls/PrivacySettingUpdatePacketBuilder.java b/GameServer/src/msc/gs/builders/ls/PrivacySettingUpdatePacketBuilder.java new file mode 100644 index 0000000..3df6ea6 --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/PrivacySettingUpdatePacketBuilder.java @@ -0,0 +1,45 @@ +package msc.gs.builders.ls; + +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.Player; + +public class PrivacySettingUpdatePacketBuilder { + /** + * The settings index + */ + private int index; + /** + * Has the setting been turned on or off? + */ + private boolean on; + /** + * Player to update + */ + private Player player; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setID(6); + packet.addLong(player.getUsernameHash()); + packet.addByte((byte) (on ? 1 : 0)); + packet.addByte((byte) index); + return packet.toPacket(); + } + + public void setIndex(int index) { + this.index = index; + } + + public void setOn(boolean on) { + this.on = on; + } + + /** + * Sets the player to update + */ + public void setPlayer(Player player) { + this.player = player; + } + +} diff --git a/GameServer/src/msc/gs/builders/ls/ReportInfoRequestPacketBuilder.java b/GameServer/src/msc/gs/builders/ls/ReportInfoRequestPacketBuilder.java new file mode 100644 index 0000000..8652efb --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/ReportInfoRequestPacketBuilder.java @@ -0,0 +1,45 @@ +package msc.gs.builders.ls; + +import msc.gs.Instance; +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class ReportInfoRequestPacketBuilder { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + /** + * The player to provide information on + */ + private Player player; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addShort(player.getX()); + packet.addShort(player.getY()); + packet.addBytes(player.getStatus().toString().getBytes()); + return packet.toPacket(); + } + + /** + * Sets the player to provide information on + */ + public void setPlayer(Player player) { + this.player = player; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/GameServer/src/msc/gs/builders/ls/SavePacketBuilder.java b/GameServer/src/msc/gs/builders/ls/SavePacketBuilder.java new file mode 100644 index 0000000..d37fe68 --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/SavePacketBuilder.java @@ -0,0 +1,89 @@ +package msc.gs.builders.ls; + +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.Bank; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.Player; +import msc.gs.model.PlayerAppearance; +import msc.gs.tools.DataConversions; + +public class SavePacketBuilder { + /** + * Player to save + */ + private Player player; + + public LSPacket getPacket() { + + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setID(20); + packet.addLong(player.getUsernameHash()); + packet.addInt(player.getOwner()); + + packet + .addLong(player.getLastLogin() == 0L + && player.isChangingAppearance() ? 0 : player + .getCurrentLogin()); + packet.addLong(DataConversions.IPToLong(player.getCurrentIP())); + packet.addShort(player.getCombatLevel()); + packet.addShort(player.getSkillTotal()); + packet.addShort(player.getX()); + packet.addShort(player.getY()); + packet.addShort(player.getFatigue()); + + PlayerAppearance a = player.getPlayerAppearance(); + packet.addByte((byte) a.getHairColour()); + packet.addByte((byte) a.getTopColour()); + packet.addByte((byte) a.getTrouserColour()); + packet.addByte((byte) a.getSkinColour()); + packet.addByte((byte) a.getSprite(0)); + packet.addByte((byte) a.getSprite(1)); + + packet.addByte((byte) (player.isMale() ? 1 : 0)); + packet.addLong(player.getSkullTime()); + packet.addByte((byte) player.getCombatStyle()); + + for (int i = 0; i < 18; i++) { + packet.addLong(player.getExp(i)); + packet.addShort(player.getCurStat(i)); + } + + Inventory inv = player.getInventory(); + packet.addShort(inv.size()); + for (InvItem i : inv.getItems()) { + packet.addShort(i.getID()); + packet.addInt(i.getAmount()); + packet.addByte((byte) (i.isWielded() ? 1 : 0)); + } + + Bank bnk = player.getBank(); + packet.addShort(bnk.size()); + for (InvItem i : bnk.getItems()) { + packet.addShort(i.getID()); + packet.addInt(i.getAmount()); + } + + packet.addShort(player.getQuestPoints()); + java.util.HashMap questStage = (java.util.HashMap) player + .getQuestStages().clone(); + + packet.addShort(questStage.size()); + java.util.Set set = questStage.keySet(); + + for (int i : set) { + packet.addShort(i); + packet.addShort(questStage.get(i)); + } + packet.addLong(player.getEventCD()); + return packet.toPacket(); + } + + /** + * Sets the player to save + */ + public void setPlayer(Player player) { + this.player = player; + } +} diff --git a/GameServer/src/msc/gs/builders/ls/StatRequestPacketBuilder.java b/GameServer/src/msc/gs/builders/ls/StatRequestPacketBuilder.java new file mode 100644 index 0000000..702f97f --- /dev/null +++ b/GameServer/src/msc/gs/builders/ls/StatRequestPacketBuilder.java @@ -0,0 +1,34 @@ +package msc.gs.builders.ls; + +import msc.config.Config; +import msc.gs.Instance; +import msc.gs.builders.LSPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.model.World; + +public class StatRequestPacketBuilder { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addInt(world.countPlayers()); + packet.addInt(world.countNpcs()); + packet.addLong(Config.START_TIME); + return packet.toPacket(); + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/GameServer/src/msc/gs/connection/LSCodecFactory.java b/GameServer/src/msc/gs/connection/LSCodecFactory.java new file mode 100644 index 0000000..0c4abbc --- /dev/null +++ b/GameServer/src/msc/gs/connection/LSCodecFactory.java @@ -0,0 +1,37 @@ +package msc.gs.connection; + +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * Provides access to the protocol encoders and decoders for the LS protocol. + */ +public class LSCodecFactory implements ProtocolCodecFactory { + /** + * The protocol decoder in use + */ + private static ProtocolDecoder decoder = new LSProtocolDecoder(); + /** + * The protocol encoder in use + */ + private static ProtocolEncoder encoder = new LSProtocolEncoder(); + + /** + * Provides the decoder to use to format outgoing data. + * + * @return A protocol decoder + */ + public ProtocolDecoder getDecoder() { + return decoder; + } + + /** + * Provides the encoder to use to parse incoming data. + * + * @return A protocol encoder + */ + public ProtocolEncoder getEncoder() { + return encoder; + } +} diff --git a/GameServer/src/msc/gs/connection/LSConnectionHandler.java b/GameServer/src/msc/gs/connection/LSConnectionHandler.java new file mode 100644 index 0000000..04cc9a4 --- /dev/null +++ b/GameServer/src/msc/gs/connection/LSConnectionHandler.java @@ -0,0 +1,114 @@ +package msc.gs.connection; + +import org.apache.mina.common.IdleStatus; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFilter; + +import msc.gs.Instance; +import msc.gs.Server; +import msc.gs.core.LoginConnector; +import msc.gs.util.Logger; + +/** + * Handles the protocol events fired from MINA. + */ +public class LSConnectionHandler implements IoHandler { + /** + * A reference to the login connector + */ + private LoginConnector connector; + + /** + * Creates a new connection handler for the given login connector. + * + * @param connector + * The connector in use + */ + public LSConnectionHandler(LoginConnector connector) { + this.connector = connector; + } + + /** + * Invoked whenever an exception is thrown by MINA or this IoHandler. + * + * @param session + * The associated session + * @param cause + * The exception thrown + */ + public void exceptionCaught(IoSession session, Throwable cause) { + } + + /** + * Invoked whenever a packet is ready to be added to the queue. + * + * @param session + * The IO session on which the packet was received + * @param message + * The packet + */ + public void messageReceived(IoSession session, Object message) { + if (session.isClosing()) { + return; + } + LSPacket p = (LSPacket) message; + connector.getPacketQueue().add(p); + } + + /** + * Invoked whenever a packet is sent. + * + * @param session + * The associated session + * @param message + * The packet sent + */ + public void messageSent(IoSession session, Object message) { + } + + /** + * Invoked whenever an IO session is closed. This must handle unregistering + * the disconnecting player from the engine. + * + * @param session + * The IO session which has been closed + */ + public void sessionClosed(IoSession session) { + Server server = Instance.getServer(); + if (server != null && server.running()) { + Logger.error(new Exception("Lost connection the login server!")); + } + } + + /** + * Invoked whenever an IO session is created. + * + * @param session + * The session opened + */ + public void sessionCreated(IoSession session) { + session.getFilterChain().addFirst("protocolFilter", new ProtocolCodecFilter(new LSCodecFactory())); + // Logger.event("Connection to LOGIN_SERVER created"); + } + + /** + * Invoked when the idle status of a session changes. + * + * @param session + * The session in question + * @param status + * The new idle status + */ + public void sessionIdle(IoSession session, IdleStatus status) { + } + + /** + * Invoked when a new session is opened. + * + * @param session + * The session opened + */ + public void sessionOpened(IoSession session) { + } +} diff --git a/GameServer/src/msc/gs/connection/LSPacket.java b/GameServer/src/msc/gs/connection/LSPacket.java new file mode 100644 index 0000000..6b0cb74 --- /dev/null +++ b/GameServer/src/msc/gs/connection/LSPacket.java @@ -0,0 +1,55 @@ +package msc.gs.connection; + +import org.apache.mina.common.IoSession; + +/** + * An immutable packet object. + */ +public final class LSPacket extends Packet { + /** + * The ID of the packet + */ + private int pID; + /** + * The uID of the packet + */ + private long uID; + + public LSPacket(IoSession session, int pID, long uID, byte[] pData) { + this(session, pID, uID, pData, false); + } + + public LSPacket(IoSession session, int pID, long uID, byte[] pData, boolean bare) { + super(session, pData, bare); + this.pID = pID; + this.uID = uID; + } + + /** + * Returns the packet ID. + * + * @return The packet ID + */ + public int getID() { + return pID; + } + + /** + * Returns the unique ID. + * + * @return The unique ID + */ + public long getUID() { + return uID; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + return super.toString() + " pid = " + pID + " uid = " + uID; + } + +} diff --git a/GameServer/src/msc/gs/connection/LSProtocolDecoder.java b/GameServer/src/msc/gs/connection/LSProtocolDecoder.java new file mode 100644 index 0000000..607a3ab --- /dev/null +++ b/GameServer/src/msc/gs/connection/LSProtocolDecoder.java @@ -0,0 +1,57 @@ +package msc.gs.connection; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; + +/** + * A decoder for the LS protocol. Parses the incoming data from an IoSession and + * outputs it as a LSPacket object. + */ +public class LSProtocolDecoder extends CumulativeProtocolDecoder { + /** + * Releases the buffer used by the given session. + * + * @param session + * The session for which to release the buffer + * @throws Exception + * if failed to dispose all resources + */ + public void dispose(IoSession session) throws Exception { + super.dispose(session); + } + + /** + * Parses the data in the provided byte buffer and writes it to + * out as a LSPacket. + * + * @param session + * The IoSession the data was read from + * @param in + * The buffer + * @param out + * The decoder output stream to which to write the + * LSPacket + * @return Whether enough data was available to create a packet + */ + protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) { + if (in.remaining() >= 13) { + int length = in.getInt(); + if (length <= in.remaining()) { + byte[] payload = new byte[length - 9]; + + int id = in.getUnsigned(); + long uid = in.getLong(); + in.get(payload); + + out.write(new LSPacket(session, id, uid, payload)); + return true; + } else { + in.rewind(); + return false; + } + } + return false; + } +} diff --git a/GameServer/src/msc/gs/connection/LSProtocolEncoder.java b/GameServer/src/msc/gs/connection/LSProtocolEncoder.java new file mode 100644 index 0000000..a0158f7 --- /dev/null +++ b/GameServer/src/msc/gs/connection/LSProtocolEncoder.java @@ -0,0 +1,59 @@ +package msc.gs.connection; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; + +import msc.gs.util.Logger; + +/** + * Encodes the high level LSPacket class into the proper protocol + * data required for transmission. + */ +public class LSProtocolEncoder implements ProtocolEncoder { + /** + * Releases all resources used by this encoder. + * + * @param session + * The IO session + */ + public void dispose(IoSession session) { + } + + /** + * Converts a LSPacket object into the raw data needed for + * transmission. + * + * @param session + * The IO session associated with the packet + * @param message + * A LSPacket to encode + * @param out + * The output stream to which to write the data + */ + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (!(message instanceof LSPacket)) { + Logger.error(new Exception("Wrong packet type! " + message.toString())); + return; + } + LSPacket p = (LSPacket) message; + byte[] data = p.getData(); + int packetLength = data.length; + ByteBuffer buffer; + if (!p.isBare()) { + buffer = ByteBuffer.allocate(data.length + 13); + packetLength += 9; + + buffer.putInt(packetLength); + buffer.put((byte) p.getID()); + buffer.putLong(p.getUID()); + + } else { + buffer = ByteBuffer.allocate(data.length); + } + buffer.put(data, 0, data.length); + buffer.flip(); + out.write(buffer); + } +} diff --git a/GameServer/src/msc/gs/connection/Packet.java b/GameServer/src/msc/gs/connection/Packet.java new file mode 100644 index 0000000..c12d53f --- /dev/null +++ b/GameServer/src/msc/gs/connection/Packet.java @@ -0,0 +1,257 @@ +package msc.gs.connection; + +import java.net.InetSocketAddress; + +import org.apache.mina.common.IoSession; + +import msc.gs.util.Logger; + +/** + * An immutable packet object. + */ +public class Packet { + /** + * Whether this packet is without the standard packet header + */ + protected boolean bare; + /** + * The current index into the payload buffer for reading + */ + protected int caret = 0; + /** + * The payload + */ + protected byte[] pData; + /** + * The length of the payload + */ + protected int pLength; + /** + * The associated IO session + */ + protected IoSession session; + /** + * The time this packet was created + */ + protected long time; + + /** + * Creates a new packet with the specified parameters. The packet is + * considered not to be a bare packet. + * + * @param session + * The session to associate with the packet + * @param pData + * The payload the packet + */ + public Packet(IoSession session, byte[] pData) { + this(session, pData, false); + } + + /** + * Creates a new packet with the specified parameters. + * + * @param session + * The session to associate with the packet + * @param pData + * The payload of the packet + * @param bare + * Whether this packet is bare, which means that it does not + * include the standard packet header + */ + public Packet(IoSession session, byte[] pData, boolean bare) { + this.session = session; + this.pData = pData; + this.pLength = pData.length; + this.bare = bare; + time = System.currentTimeMillis(); + } + + /** + * Returns the time the packet was created. + * + * @ return the time the packet was created + */ + public long getCreated() { + return time; + } + + /** + * Returns the entire payload data of this packet. + * + * @return The payload byte array + */ + public byte[] getData() { + return pData; + } + + /** + * Returns the length of the payload of this packet. + * + * @return The length of the packet's payload + */ + public int getLength() { + return pLength; + } + + /** + * Returns the remaining payload data of this packet. + * + * @return The payload byte array + */ + public byte[] getRemainingData() { + byte[] data = new byte[pLength - caret]; + for (int i = 0; i < data.length; i++) { + data[i] = pData[i + caret]; + } + caret += data.length; + return data; + + } + + /** + * Returns the IO session associated with the packet, if any. + * + * @return The IoSession object, or null if none. + */ + public IoSession getSession() { + return session; + } + + /** + * Checks if this packet is considered to be a bare packet, which means that + * it does not include the standard packet header (ID and length values). + * + * @return Whether this packet is a bare packet + */ + public boolean isBare() { + return bare; + } + + public String printData() { + if (pLength == 0) { + return ""; + } + String data = ""; + for (int i = 0; i < pLength; i++) { + data += " " + pData[i]; + } + return data.substring(1); + } + + /** + * Reads the next byte from the payload. + * + * @return A byte + */ + public byte readByte() { + return pData[caret++]; + } + + /** + * Returns length of payload data of this packet. + * + * @return The payload byte array + */ + public byte[] readBytes(int length) { + byte[] data = new byte[length]; + try { + for (int i = 0; i < length; i++) { + data[i] = pData[i + caret]; + } + } catch (Exception e) { + Logger.error(e.getMessage()); + } + caret += length; + return data; + } + + /** + * Reads the next int from the payload. + * + * @return An int + */ + public int readInt() { + try { + return ((pData[caret++] & 0xff) << 24) | ((pData[caret++] & 0xff) << 16) | ((pData[caret++] & 0xff) << 8) | (pData[caret++] & 0xff); + } catch (Exception e) { + Logger.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the next long from the payload. + * + * @return A long + */ + public long readLong() { + try { + return (long) ((long) (pData[caret++] & 0xff) << 56) | ((long) (pData[caret++] & 0xff) << 48) | ((long) (pData[caret++] & 0xff) << 40) | ((long) (pData[caret++] & 0xff) << 32) | ((long) (pData[caret++] & 0xff) << 24) | ((long) (pData[caret++] & 0xff) << 16) | ((long) (pData[caret++] & 0xff) << 8) | ((long) (pData[caret++] & 0xff)); + } catch (Exception e) { + Logger.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the next short from the payload. + * + * @return A short + */ + public short readShort() { + try { + return (short) ((short) ((pData[caret++] & 0xff) << 8) | (short) (pData[caret++] & 0xff)); + } catch (Exception e) { + // Logger.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the string which is formed by the unread portion of the payload. + * + * @return A String + */ + public String readString() { + return readString(pLength - caret); + } + + /** + * Reads a string of the specified length from the payload. + * + * @param length + * The length of the string to be read + * @return A String + */ + public String readString(int length) { + String rv = new String(pData, caret, length); + caret += length; + return rv; + } + + public int remaining() { + return pData.length - caret; + } + + /** + * Skips the specified number of bytes in the payload. + * + * @param x + * The number of bytes to be skipped + */ + public void skip(int x) { + caret += x; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + String origin = session == null ? "this" : ((InetSocketAddress) session.getRemoteAddress()).getAddress().getHostAddress(); + return "origin = " + origin + " length = " + pLength; + } + +} diff --git a/GameServer/src/msc/gs/connection/PacketQueue.java b/GameServer/src/msc/gs/connection/PacketQueue.java new file mode 100644 index 0000000..2dc91cf --- /dev/null +++ b/GameServer/src/msc/gs/connection/PacketQueue.java @@ -0,0 +1,44 @@ +package msc.gs.connection; + +import java.util.ArrayList; +import java.util.List; + +/** + * Synchronized packet queue + */ +public class PacketQueue { + /** + * The list of packets in the queue + */ + private ArrayList packets = new ArrayList(); + + /** + * Adds a packet to the queue + */ + public void add(T p) { + //System.out.println("[DEBUG] Packet Q: " + packets.size()); + synchronized (packets) { + packets.add(p); + } + } + + /** + * Returns the packets currently in the list and removes them from the + * backing store + */ + public List getPackets() { + List tmpList; + synchronized (packets) { + tmpList = (List) packets.clone(); + packets.clear(); + } + return tmpList; + } + + /** + * Returns if there is packets to process + */ + public boolean hasPackets() { + return !packets.isEmpty(); + } +} diff --git a/GameServer/src/msc/gs/connection/RSCCodecFactory.java b/GameServer/src/msc/gs/connection/RSCCodecFactory.java new file mode 100644 index 0000000..3747bce --- /dev/null +++ b/GameServer/src/msc/gs/connection/RSCCodecFactory.java @@ -0,0 +1,37 @@ +package msc.gs.connection; + +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * Provides access to the protocol encoders and decoders for the RSC protocol. + */ +public class RSCCodecFactory implements ProtocolCodecFactory { + /** + * The protocol decoder in use + */ + private static ProtocolDecoder decoder = new RSCProtocolDecoder(); + /** + * The protocol encoder in use + */ + private static ProtocolEncoder encoder = new RSCProtocolEncoder(); + + /** + * Provides the decoder to use to format outgoing data. + * + * @return A protocol decoder + */ + public ProtocolDecoder getDecoder() { + return decoder; + } + + /** + * Provides the encoder to use to parse incoming data. + * + * @return A protocol encoder + */ + public ProtocolEncoder getEncoder() { + return encoder; + } +} diff --git a/GameServer/src/msc/gs/connection/RSCConnectionHandler.java b/GameServer/src/msc/gs/connection/RSCConnectionHandler.java new file mode 100644 index 0000000..f461218 --- /dev/null +++ b/GameServer/src/msc/gs/connection/RSCConnectionHandler.java @@ -0,0 +1,302 @@ +package msc.gs.connection; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.util.Map; + +import org.apache.mina.common.IdleStatus; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFilter; + +import msc.config.Constants; +import msc.gs.Instance; +import msc.gs.core.GameEngine; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.util.Logger; + +/** + * Handles the protocol events fired from MINA. + */ +public class RSCConnectionHandler implements IoHandler { + /** + * World instance + */ + + // sudo + private static final World world = Instance.getWorld(); + private long allowedInterval; + /* + + private int attackers = 0; + + private Map clients; + private Set connectedAddresses; + private Map counts; + private long lastAttack = 0; + */ + /** + * A reference to the game engine's packet queue + */ + + private PacketQueue packets; + + private Map written; + + /** + * Creates a new connection handler for the given engine. + * + * @param engine + * The engine in use + */ + public RSCConnectionHandler(GameEngine engine) { + packets = (PacketQueue) engine.getPacketQueue(); + this.allowedInterval = allowedInterval; + /* + clients = Collections.synchronizedMap(new HashMap()); + counts = Collections.synchronizedMap(new HashMap()); + written = Collections.synchronizedMap(new HashMap()); + connectedAddresses = new HashSet(); + */ + } + + /* + public void connectionOk(IoSession io) { + counts.remove(getAddress(io)); + } + + public void delayClient(IoSession session, int delay) { + long d = System.currentTimeMillis() - delay; + clients.put(getAddress(session), d); + } + */ + /** + * Invoked whenever an exception is thrown by MINA or this IoHandler. + * + * @param session + * The associated session + * @param cause + * The exception thrown + */ + public void exceptionCaught(IoSession session, Throwable cause) { + Player p = (Player) session.getAttachment(); + // if(p.getUsername().equalsIgnoreCase("xent")) { + + // } + if(p != null) + p.getActionSender().sendLogout(); + session.close(); + /* + * System.out.println("---MINA Error from: " + p.getUsername() + + * " -------"); cause.printStackTrace();System.out.println( + * "------------------------------------------------------------"); + */ + cause.printStackTrace(); + } + + private InetAddress getAddress(IoSession io) { + return ((InetSocketAddress) io.getRemoteAddress()).getAddress(); + } + + + + /** + * Method responsible for deciding if a connection is OK to continue + * + * @param session + * The new session that will be verified + * @return True if the session meets the criteria, otherwise false (if + * false, adds to a IPSec filter & writes IP to log. + */ + /* + public boolean isConnectionOk(IoSession session) { + final InetAddress addr = getAddress(session); + final String ip = addr.toString().replaceAll("/", ""); + // ip = ip.replaceAll("/",""); + long now = System.currentTimeMillis(); + int c = 0; + if (counts.containsKey(addr) && clients.containsKey(addr)) { + try { + c = counts.get(addr); + } catch (Exception e) { + System.out.println("Error: " + e); + } + if (c >= 5) { + if (!written.containsKey(addr)) { + attackers++; + // if(now - lastAttack > 60000) + // { + // for(Player p : world.getPlayers()) + // { + // p.save(); + // p.getActionSender().sendLogout(); + // } + // Instance.getServer().getLoginConnector().getActionSender().saveProfiles(); + // } + try { + /* + * System.out.println("ATTACKER IP: " + ip); + * BufferedWriter bf2 = new BufferedWriter(new + * FileWriter( "ddos.log", true)); + * bf2.write("sudo /sbin/route add " + + * addr.getHostAddress() + " gw 127.0.0.1"); + * bf2.newLine(); bf2.close(); + * / + written.put(addr, 1); + Instance.getDelayedEventHandler().add(new DelayedEvent(null, 3600000) { + public void run() { + written.remove(addr); + counts.remove(addr); + try { + Runtime.getRuntime().exec("sudo /sbin/route delete " + ip); + } catch (Exception err) { + System.out.println(err); + } + } + }); + try { + Runtime.getRuntime().exec("sudo /sbin/route add " + ip + " gw 127.0.0.1"); + } catch (Exception err) { + System.out.println(err); + } + + // try { Runtime.getRuntime().exec(ip + ".bat"); } + // catch (Exception err) { System.out.println(err); } + lastAttack = now; + } catch (Exception e) { + System.err.println(e); + } + } + return false; + } + } + if (clients.containsKey(addr)) { + long lastConnTime = clients.get(addr); + if (now - lastConnTime < 2000) { + if (!counts.containsKey(addr)) + counts.put(addr, 0); + else + c = counts.get(addr) + 1; + counts.put(addr, c); + return false; + } else { + clients.put(addr, now); + if (counts.containsKey(addr)) + counts.remove(addr); + return true; + } + } else { + clients.put(addr, now); + return true; + } + } + */ + /** + * Invoked whenever a packet is ready to be added to the queue. + * + * @param session + * The IO session on which the packet was received + * @param message + * The packet + */ + public void messageReceived(IoSession session, Object message) { + Player player = (Player) session.getAttachment(); + if (session.isClosing() || player.destroyed()) { + return; + } + RSCPacket p = (RSCPacket) message; + + /* if(p.getID() == 57 || p.getID() == 73 || p.getID() == 40 || p.getID() + == 51 || p.getID() == 128 || p.getID() == 206 || p.getID() == 71 || + p.getID() == 55)*/ + + if(p.getID() == 55) + player.addInterval(); + + + player.addPacket(p); + packets.add(p); + } + + /** + * Invoked whenever a packet is sent. + * + * @param session + * The associated session + * @param message + * The packet sent + */ + public void messageSent(IoSession session, Object message) { + } + + /** + * Invoked whenever an IO session is closed. This must handle unregistering + * the disconnecting player from the engine. + * + * @param session + * The IO session which has been closed + */ + public void sessionClosed(IoSession session) { + Player player = (Player) session.getAttachment(); + if (!player.destroyed()) { + player.destroy(false); + } + } + + public void sessionCreated(IoSession session) { + /* + if (!isConnectionOk(session)) { + session.close(); + return; + } else { + connectionOk(session); + } + */ + session.getFilterChain().addFirst("protocolFilter", new ProtocolCodecFilter(new RSCCodecFactory())); + // Logger.event("Connection from: " + + // ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress()); + Logger.println("Connection from: " + ((InetSocketAddress) session.getRemoteAddress()).getAddress().getHostAddress()); + } + + /** + * Invoked when the idle status of a session changes. + * + * @param session + * The session in question + * @param status + * The new idle status + */ + public void sessionIdle(IoSession session, IdleStatus status) { + Player player = (Player) session.getAttachment(); + if (!player.destroyed()) { + player.destroy(false); + } + session.close(); + } + + /** + * Invoked when a new session is opened. + * + * @param session + * The session opened + */ + public void sessionOpened(IoSession session) { + Constants.GameServer.ACCEPTED_CONNECTIONS++; + session.setAttachment(new Player(session)); + session.setIdleTime(IdleStatus.BOTH_IDLE, 30); + session.setWriteTimeout(30); + } + + /** + * Sets the interval between connections from a client. This value is + * measured in milliseconds. + * + * @param allowedInterval + * The number of milliseconds a client is allowed to wait before + * making another successful connection + */ + public void setAllowedInterval(long allowedInterval) { + this.allowedInterval = allowedInterval; + } +} diff --git a/GameServer/src/msc/gs/connection/RSCPacket.java b/GameServer/src/msc/gs/connection/RSCPacket.java new file mode 100644 index 0000000..73f07fb --- /dev/null +++ b/GameServer/src/msc/gs/connection/RSCPacket.java @@ -0,0 +1,41 @@ +package msc.gs.connection; + +import org.apache.mina.common.IoSession; + +/** + * An immutable packet object. + */ +public final class RSCPacket extends Packet { + /** + * The ID of the packet + */ + private int pID; + + public RSCPacket(IoSession session, int pID, byte[] pData) { + this(session, pID, pData, false); + } + + public RSCPacket(IoSession session, int pID, byte[] pData, boolean bare) { + super(session, pData, bare); + this.pID = pID; + } + + /** + * Returns the packet ID. + * + * @return The packet ID + */ + public int getID() { + return pID; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + return super.toString() + " pid = " + pID; + } + +} diff --git a/GameServer/src/msc/gs/connection/RSCProtocolDecoder.java b/GameServer/src/msc/gs/connection/RSCProtocolDecoder.java new file mode 100644 index 0000000..20817aa --- /dev/null +++ b/GameServer/src/msc/gs/connection/RSCProtocolDecoder.java @@ -0,0 +1,69 @@ +package msc.gs.connection; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; + +import msc.gs.util.Logger; + +/** + * A decoder for the RSC protocol. Parses the incoming data from an IoSession + * and outputs it as a RSCPacket object. + */ +public class RSCProtocolDecoder extends CumulativeProtocolDecoder { + /** + * Releases the buffer used by the given session. + * + * @param session + * The session for which to release the buffer + * @throws Exception + * if failed to dispose all resources + */ + public void dispose(IoSession session) throws Exception { + super.dispose(session); + } + + /** + * Parses the data in the provided byte buffer and writes it to + * out as a RSCPacket. + * + * @param session + * The IoSession the data was read from + * @param in + * The buffer + * @param out + * The decoder output stream to which to write the + * RSCPacket + * @return Whether enough data was available to create a packet + */ + protected synchronized boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) { + try { + if (in.remaining() >= 2) { + byte[] buf = new byte[] { in.get(), in.get() }; + int length = ((short) ((buf[0] & 0xff) << 8) | (short) (buf[1] & 0xff)); + // Logger.log("len="+length); + if (length <= in.remaining()) { + if (length - 1 < 0) { + Logger.println("Negative array length! id=" + in.getUnsigned() + ",len=" + length); + session.close(); + return true; + } + byte[] payload = new byte[length - 1]; + int id = in.get() & 0xff; + in.get(payload); + RSCPacket p = new RSCPacket(session, id, payload); + out.write(p); + return true; + } else { + in.rewind(); + return false; + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } +} diff --git a/GameServer/src/msc/gs/connection/RSCProtocolEncoder.java b/GameServer/src/msc/gs/connection/RSCProtocolEncoder.java new file mode 100644 index 0000000..f053c9d --- /dev/null +++ b/GameServer/src/msc/gs/connection/RSCProtocolEncoder.java @@ -0,0 +1,84 @@ +package msc.gs.connection; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; + +import msc.gs.model.Player; +import msc.gs.util.Logger; + +/** + * Encodes the high level RSCPacket class into the proper protocol + * data required for transmission. + */ +public class RSCProtocolEncoder implements ProtocolEncoder { + /** + * Releases all resources used by this encoder. + * + * @param session + * The IO session + */ + public void dispose(IoSession session) { + } + + /** + * Converts a RSCPacket object into the raw data needed for + * transmission. + * + * @param session + * The IO session associated with the packet + * @param message + * A RSCPacket to encode + * @param out + * The output stream to which to write the data + */ + public synchronized void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (!(message instanceof RSCPacket)) { + Logger.error(new Exception("Wrong packet type! " + message.toString())); + return; + } + try { + RSCPacket p = (RSCPacket) message; + byte[] data = p.getData(); + int dataLength = data.length; + ByteBuffer buffer; + // byte[] debug = new byte[dataLength + 4]; + if (!p.isBare()) { + buffer = ByteBuffer.allocate(dataLength + 3); + byte[] outlen = { (byte) (dataLength >> 8), (byte) (dataLength) }; + buffer.put(outlen); + // debug[0] = outlen[0]; debug[1] = outlen[1]; + int id = p.getID(); + // debug[2] = (byte)offset; debug[3] = (byte)id; + buffer.put((byte) id); + } else { + buffer = ByteBuffer.allocate(dataLength); + } + // System.arraycopy(data, 0, debug, 4, dataLength); + // System.out.println(java.util.Arrays.toString(data)); + buffer.put(data, 0, dataLength); + buffer.flip(); + out.write(buffer); + return; + + /* + * byte[] data = p.getData(); int packetLength = data.length; int + * dataLength = data.length; ByteBuffer buffer; if (!p.isBare()) { + * buffer = ByteBuffer.allocate(dataLength + 3); packetLength++; if + * (data.length >= 160) { buffer.put((byte) (160 + (packetLength / + * 256))); buffer.put((byte) (packetLength & 0xff)); } else { + * buffer.put((byte) (packetLength)); if (dataLength > 0) { + * dataLength--; buffer.put((byte) data[dataLength]); } } + * buffer.put((byte) p.getID()); } else { buffer = + * ByteBuffer.allocate(dataLength); } buffer.put(data, 0, + * dataLength); buffer.flip(); + * + * out.write(buffer); + */ + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/GameServer/src/msc/gs/core/ClientUpdater.java b/GameServer/src/msc/gs/core/ClientUpdater.java new file mode 100644 index 0000000..8fe4140 --- /dev/null +++ b/GameServer/src/msc/gs/core/ClientUpdater.java @@ -0,0 +1,413 @@ +package msc.gs.core; + +import java.util.ArrayList; +import java.util.List; + +import msc.gs.Instance; +import msc.gs.builders.GameObjectPositionPacketBuilder; +import msc.gs.builders.ItemPositionPacketBuilder; +import msc.gs.builders.NpcPositionPacketBuilder; +import msc.gs.builders.NpcUpdatePacketBuilder; +import msc.gs.builders.PlayerPositionPacketBuilder; +import msc.gs.builders.PlayerUpdatePacketBuilder; +import msc.gs.builders.WallObjectPositionPacketBuilder; +import msc.gs.connection.RSCPacket; +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Chatlog; +import msc.gs.tools.DataConversions; +import msc.gs.util.EntityList; +import msc.gs.util.Logger; +import msc.gs.util.Processor; +import msc.gs.util.WorkGroup; + +public final class ClientUpdater implements Processor { + + public static int pktcount = 0; + private static World world = Instance.getWorld(); + private GameObjectPositionPacketBuilder gameObjectPositionBuilder = new GameObjectPositionPacketBuilder(); + private ItemPositionPacketBuilder itemPositionBuilder = new ItemPositionPacketBuilder(); + private NpcUpdatePacketBuilder npcApperanceBuilder = new NpcUpdatePacketBuilder(); + private NpcPositionPacketBuilder npcPositionPacketBuilder = new NpcPositionPacketBuilder(); + private EntityList npcs = world.getNpcs(); + private PlayerUpdatePacketBuilder playerApperanceBuilder = new PlayerUpdatePacketBuilder(); + private PlayerPositionPacketBuilder playerPositionBuilder = new PlayerPositionPacketBuilder(); + private WallObjectPositionPacketBuilder wallObjectPositionPacketBuilder = new WallObjectPositionPacketBuilder(); + + private EntityList players = world.getPlayers(); + private WorkGroup clientInformerGroup = null; + + public ClientUpdater() { + world.setClientUpdater(this); + this.clientInformerGroup = new WorkGroup(this); + } + /** + * Sends queued packets to each player + */ + public void sendQueuedPackets() { + try { + for (Player p : players) { + List packets = p.getActionSender().getPackets(); + for (RSCPacket packet : packets) { + p.getSession().write(packet); + } + p.getActionSender().clearPackets(); + if (p.destroyed()) { + p.getSession().close(); + p.remove(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + /** + * Update player/npc appearances, game objects, items, wall objects, ping + */ + public void doMinor() { + for (Player p : players) { + p.updateAppearanceID(); + } + for (Player p : players) { + if (p.isFirstMajorUpdateSent()) { + updatePlayerApperances(p); + } + updateNpcApperances(p); + } + + for (Player p : players) { + if (p.isFirstMajorUpdateSent()) { + p.setAppearnceChanged(false); + p.clearProjectilesNeedingDisplayed(); + p.clearPlayersNeedingHitsUpdate(); + p.clearNpcsNeedingHitsUpdate(); + p.clearChatMessagesNeedingDisplayed(); + p.clearNpcMessagesNeedingDisplayed(); + p.clearBubblesNeedingDisplayed(); + } + } + + for (Npc n : npcs) { + n.setAppearnceChanged(false); + + } + + } + + public static boolean threaded = false; + public volatile boolean updatingCollections; + public void doMajor() { + Long delay; + Long now = System.currentTimeMillis(); + + updateNpcPositions(); + + delay = System.currentTimeMillis() - now; + if(delay > 299) Logger.println("updateNpcPositions() is taking longer than it should, exactly " + delay + "ms"); + + now = System.currentTimeMillis(); + + updatePlayersPositions(); + + delay = System.currentTimeMillis() - now; + if(delay > 299) Logger.println("updatePlayersPositions() is taking longer than it should, exactly " + delay + "ms"); + + now = System.currentTimeMillis(); + + updateMessageQueues(); + + delay = System.currentTimeMillis() - now; + if(delay > 299) Logger.println("updateMessageQueues() is taking longer than it should, exactly " + delay + "ms"); + + now = System.currentTimeMillis(); + + updateOffers(); + + if(threaded) { + try { + clientInformerGroup.processWorkload(players); + } catch(InterruptedException ie) { + ie.printStackTrace(); + } + } + else { + for (Player p : players) { + //System.out.println("Process for player " + p.getUsername() + " | threaded: " + threaded); + + updateTimeouts(p); + + updatePlayerPositions(p); + updateNpcPositions(p); + updateGameObjects(p); + updateWallObjects(p); + updateItems(p); + + p.setFirstMajorUpdateSent(true); + + } + updateCollections(); + } + } + + public void process(Player p) { + + //System.out.println("Process for player " + p.getUsername() + " | threaded: " + threaded); + + updateTimeouts(p); + + updatePlayerPositions(p); // Must be done before updating any objects/items/npcs! + updateNpcPositions(p); + updateGameObjects(p); + updateWallObjects(p); + updateItems(p); + + p.setFirstMajorUpdateSent(true); + } + + /** + * Updates collections, new becomes known, removing is removed etc. + */ + public void updateCollections() { + updatingCollections = true; + System.out.println("Updating collections start"); + for (Player p : players) { + if (p.isRemoved() && p.initialized()) { + world.unregisterPlayer(p); + } + } + for (Player p : players) { + p.getWatchedPlayers().update(); + p.getWatchedObjects().update(); + p.getWatchedItems().update(); + p.getWatchedNpcs().update(); + + //p.clearProjectilesNeedingDisplayed(); + //p.clearPlayersNeedingHitsUpdate(); + //p.clearNpcsNeedingHitsUpdate(); + //p.clearChatMessagesNeedingDisplayed(); + //p.clearNpcMessagesNeedingDisplayed(); + //p.clearBubblesNeedingDisplayed(); + + p.resetSpriteChanged(); + //p.setAppearnceChanged(false); + } + for (Npc n : npcs) { + n.resetSpriteChanged(); + //n.setAppearnceChanged(false); + } + System.out.println("Updating collections end"); + updatingCollections = false; + } + + /** + * Sends updates for game objects to the given player + */ + private void updateGameObjects(Player p) { + gameObjectPositionBuilder.setPlayer(p); + RSCPacket temp = gameObjectPositionBuilder.getPacket(); + if (temp != null) { + p.getActionSender().addPacket(temp); + //p.getSession().write(temp); + } + } + + /** + * Sends updates for game items to the given player + */ + private void updateItems(Player p) { + itemPositionBuilder.setPlayer(p); + RSCPacket temp = itemPositionBuilder.getPacket(); + if (temp != null) { + p.getActionSender().addPacket(temp); + //p.getSession().write(temp); + } + } + + /** + * Updates the messages queues for each player + */ + private void updateMessageQueues() { + for (Player sender : players) { + ChatMessage message = sender.getNextChatMessage(); + if (message == null || !sender.loggedIn()) { + continue; + } + String s = DataConversions.byteToString(message.getMessage(), 0, message.getMessage().length); + s = s.toLowerCase(); + String k = s; + s = s.replace(" ", ""); + s = s.replace(".", ""); + if (s.contains("#adm#") || s.contains("#mod#") || s.contains("#pmd#")) { + sender.getActionSender().sendMessage("@red@Your last message was not sent out due to an illegal string"); + return; + } + if(sender.isMuted()) { + sender.getActionSender().sendMessage("You are muted, you cannot send messages"); + return; + } + List recievers = sender.getViewArea().getPlayersInView(); + ArrayList recieverUsernames = new ArrayList(); + for(Player p : recievers) + recieverUsernames.add(p.getUsername()); + + world.addEntryToSnapshots(new Chatlog(sender.getUsername(), k, recieverUsernames)); + for (Player recipient : recievers) { + if (sender.getIndex() == recipient.getIndex() || !recipient.loggedIn()) { + continue; + } + if (recipient.getPrivacySetting(0) && !recipient.isFriendsWith(sender.getUsernameHash()) && !sender.isPMod()) { + continue; + } + if (recipient.isIgnoring(sender.getUsernameHash()) && !sender.isPMod()) { + continue; + } + recipient.informOfChatMessage(message); + } + recievers = null; + } + } + + /** + * Update appearance of any npcs the given player should be aware of + */ + private void updateNpcApperances(Player p) { + npcApperanceBuilder.setPlayer(p); + RSCPacket temp = npcApperanceBuilder.getPacket(); + if (temp != null) { + p.getActionSender().addPacket(temp); + //p.getSession().write(temp); + } + + } + + /** + * Update the position of npcs, and check if who (and what) they are aware + * of needs updated + */ + private void updateNpcPositions() { + for (Npc n : npcs) { + n.resetMoved(); + n.updatePosition(); + n.updateAppearanceID(); + } + } + + /** + * Sends updates for npcs to the given player + */ + private void updateNpcPositions(Player p) { + npcPositionPacketBuilder.setPlayer(p); + RSCPacket temp = npcPositionPacketBuilder.getPacket(); + if (temp != null) { + p.getActionSender().addPacket(temp); + //p.getSession().write(temp); + } + } + + public void updateOffers() { + for (Player player : players) { + if (!player.requiresOfferUpdate()) { + continue; + } + player.setRequiresOfferUpdate(false); + if (player.isTrading()) { + Player affectedPlayer = player.getWishToTrade(); + if (affectedPlayer == null) { + continue; + } + affectedPlayer.getActionSender().sendTradeItems(); + } else if (player.isDueling()) { + Player affectedPlayer = player.getWishToDuel(); + if (affectedPlayer == null) { + continue; + } + player.getActionSender().sendDuelSettingUpdate(); + affectedPlayer.getActionSender().sendDuelSettingUpdate(); + affectedPlayer.getActionSender().sendDuelItems(); + } + } + } + + /** + * Update appearance of the given player, and any players they should be + * aware of + */ + private void updatePlayerApperances(Player p) { + playerApperanceBuilder.setPlayer(p); + RSCPacket temp = playerApperanceBuilder.getPacket(); + if (temp != null) { + p.getActionSender().addPacket(temp); + //p.getSession().write(temp); + } + } + + /** + * Update positions of the given player, and any players they should be + * aware of + */ + private void updatePlayerPositions(Player p) { + playerPositionBuilder.setPlayer(p); + RSCPacket temp = playerPositionBuilder.getPacket(); + if (temp != null) { + p.getActionSender().addPacket(temp); + //p.getSession().write(temp); + } + } + + /** + * Update the position of players, and check if who (and what) they are + * aware of needs updated + */ + private void updatePlayersPositions() { + for (Player p : players) { + p.resetMoved(); + p.updatePosition(); + p.updateAppearanceID(); + } + for (Player p : players) { + p.revalidateWatchedPlayers(); + p.revalidateWatchedObjects(); + p.revalidateWatchedItems(); + p.revalidateWatchedNpcs(); + p.updateViewedPlayers(); + p.updateViewedObjects(); + p.updateViewedItems(); + p.updateViewedNpcs(); + } + } + + /** + * Checks the player has moved within the last 5mins + */ + private void updateTimeouts(Player p) { + if (p.destroyed()) { + return; + } + long curTime = System.currentTimeMillis(); + if (curTime - p.getLastPing() >= 30000) { + p.destroy(false); + } else if (p.warnedToMove()) { + if (curTime - p.getLastMoved() >= 960000 && p.loggedIn()) { + p.destroy(false); + } + } else if (curTime - p.getLastMoved() >= 900000) { + p.getActionSender().sendMessage("@cya@You have not moved for 15 mins, please move to a new area to avoid logout."); + p.warnToMove(); + } + } + + /** + * Sends updates for wall objects to the given player + */ + private void updateWallObjects(Player p) { + wallObjectPositionPacketBuilder.setPlayer(p); + RSCPacket temp = wallObjectPositionPacketBuilder.getPacket(); + if (temp != null) { + //p.getSession().write(temp); + p.getActionSender().addPacket(temp); + } + } +} + diff --git a/GameServer/src/msc/gs/core/DelayedEventHandler.java b/GameServer/src/msc/gs/core/DelayedEventHandler.java new file mode 100644 index 0000000..df63cdf --- /dev/null +++ b/GameServer/src/msc/gs/core/DelayedEventHandler.java @@ -0,0 +1,84 @@ +package msc.gs.core; + +import java.util.ArrayList; +import java.util.Iterator; + +import msc.gs.Instance; +import msc.gs.event.DelayedEvent; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.util.Logger; + +public final class DelayedEventHandler { + private static World world = Instance.getWorld(); + private ArrayList events = new ArrayList(); + private ArrayList toAdd = new ArrayList(); + + public DelayedEventHandler() { + world.setDelayedEventHandler(this); + } + + public void add(DelayedEvent event) { + if (!events.contains(event)) { + toAdd.add(event); + } + } + + public boolean contains(DelayedEvent event) { + return events.contains(event); + } + + public void doEvents() { + try { + if (toAdd.size() > 0) { + events.addAll(toAdd); + toAdd.clear(); + } + + Iterator iterator = events.iterator(); + while (iterator.hasNext()) { + DelayedEvent event = iterator.next(); + + if (event == null) { + iterator.remove(); + continue; + } + + if (event.shouldRun()) { + event.run(); + event.updateLastRun(); + } + if (event.shouldRemove()) { + iterator.remove(); + } + } + } catch (Exception e) { + e.printStackTrace(); + Logger.println("Error @ doEvents(): " + e); + } + } + + public ArrayList getEvents() { + return events; + } + + public void remove(DelayedEvent event) { + events.remove(event); + } + + public void removePlayersEvents(Player player) { + try { + Iterator iterator = events.iterator(); + while (iterator.hasNext()) { + DelayedEvent event = iterator.next(); + if (event.belongsTo(player)) { + iterator.remove(); + } + } + } catch (Exception e) { + Logger.println("Error @ removePlayer, IP address:" + player.getCurrentIP() + " Name: " + player.getUsername()); + e.printStackTrace(); + } + + } +} diff --git a/GameServer/src/msc/gs/core/GameEngine.java b/GameServer/src/msc/gs/core/GameEngine.java new file mode 100644 index 0000000..cf1106b --- /dev/null +++ b/GameServer/src/msc/gs/core/GameEngine.java @@ -0,0 +1,415 @@ +package msc.gs.core; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.TimeZone; + + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.PacketQueue; +import msc.gs.connection.RSCPacket; +import msc.gs.event.DelayedEvent; +import msc.gs.event.MiniEvent; +import msc.gs.model.ActiveTile; +import msc.gs.model.Item; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.Shop; +import msc.gs.model.World; +import msc.gs.model.snapshot.Snapshot; +import msc.gs.phandler.PacketHandler; +import msc.gs.phandler.PacketHandlerDef; +import msc.gs.plugins.dependencies.NpcAI; +import msc.gs.tools.Captcha; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; +import msc.gs.util.PersistenceManager; +import msc.config.Constants; +import msc.config.Formulae; + +/** + * The central motor of the game. This class is responsible for the primary + * operation of the entire game. + */ +public final class GameEngine extends Thread { + + private static Captcha captcha; + /** + * World instance + */ + private static final World world = Instance.getWorld(); + + public static Captcha getCaptcha() { + return captcha; + } + /** + * Responsible for updating all connected clients + */ + private ClientUpdater clientUpdater = new ClientUpdater(); + /** + * Handles delayed events rather than events to be ran every iteration + */ + private DelayedEventHandler eventHandler = new DelayedEventHandler(); + /** + * When the update loop was last ran, required for throttle + */ + private long lastSentClientUpdate = System.currentTimeMillis(); + private long lastSentClientUpdateFast = System.currentTimeMillis(); + private long lastCleanedChatlogs = 0; + private int lastCleanedChatlogsOutput = 0; + /** + * The mapping of packet IDs to their handler + */ + private TreeMap packetHandlers = new TreeMap(); + /** + * The packet queue to be processed + */ + private PacketQueue packetQueue; + /** + * Whether the engine's thread is running + */ + private boolean running = true; + long time = 0; + /** + * Processes incoming packets. + */ + private Map written = Collections.synchronizedMap(new HashMap()); + + /** + * Constructs a new game engine with an empty packet queue. + */ + public GameEngine() { + captcha = new Captcha(); + captcha.init(); + packetQueue = new PacketQueue(); + loadPacketHandlers(); + for (Shop shop : world.getShops()) { + shop.initRestock(); + } + redirectSystemStreams(); + } + + public void emptyWorld() { + for (Player p : world.getPlayers()) { + p.save(); + p.getActionSender().sendLogout(); + } + Instance.getServer().getLoginConnector().getActionSender().saveProfiles(); + } + + /** + * Ban dummy packet flood private Map clients; private + * Map counts; private Map + * written; public void flagSession(IoSession session) { InetAddress addr = + * getAddress(session); String ip = addr.toString(); ip = + * ip.replaceAll("/",""); long now = System.currentTimeMillis(); int c = 0; + * if(counts.containsKey(addr) && clients.containsKey(addr)) { try { c = + * counts.get(addr); } catch(Exception e) { System.out.println("Error: " + + * e); } if(c >= 10) { if(!written.containsKey(addr)) { try { + * System.out.println("Dummy packet flooder IP: " + ip); BufferedWriter bf2 + * = new BufferedWriter(new FileWriter("dummy.log", true)); + * bf2.write("sudo /sbin/route add " + addr.getHostAddress() + + * " gw 127.0.0.1"); bf2.newLine(); bf2.close(); written.put(addr, 1); } + * catch(Exception e) { System.err.println(e);} } } } if + * (clients.containsKey(addr)) { long lastConnTime = clients.get(addr); if + * (now - lastConnTime < 2000) { if(!counts.containsKey(addr)) { + * counts.put(addr, 0); } else c = counts.get(addr) + 1; counts.put(addr, + * c); } else { clients.put(addr, now); } } else { clients.put(addr, now); } + * } + + private InetAddress getAddress(IoSession io) { + return ((InetSocketAddress) io.getRemoteAddress()).getAddress(); + } + */ + /** + * Returns the current packet queue. + * + * @return A PacketQueue + */ + public PacketQueue getPacketQueue() { + return packetQueue; + } + + public void kill() { + Logger.println("Terminating GameEngine"); + running = false; + } + + /** + * Loads the packet handling classes from the persistence manager. + */ + protected void loadPacketHandlers() { + PacketHandlerDef[] handlerDefs = (PacketHandlerDef[]) PersistenceManager.load("PacketHandlers.xml"); + for (PacketHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + PacketHandler handler = (PacketHandler) c.newInstance(); + for (int packetID : handlerDef.getAssociatedPackets()) { + packetHandlers.put(packetID, handler); + } + } + } catch (Exception e) { + Logger.error(e); + } + } + } + private void processClients() { + clientUpdater.sendQueuedPackets(); + long now = System.currentTimeMillis(); + if (now - lastSentClientUpdate >= 600) { + if (now - lastSentClientUpdate >= 1000) { + //Logger.println("MAJOR UPDATE DELAYED: " + (now - lastSentClientUpdate)); + } + lastSentClientUpdate = now; + clientUpdater.doMajor(); + } + if (now - lastSentClientUpdateFast >= 104) { + if (now - lastSentClientUpdateFast >= 6000) { + //Logger.println("MINOR UPDATE DELAYED: " + (now - lastSentClientUpdateFast)); + } + lastSentClientUpdateFast = now; + clientUpdater.doMinor(); + } + } + + private void processEvents() { + eventHandler.doEvents(); + } + /** + * Redirects system err + */ + public static void redirectSystemStreams() { + OutputStream out = new OutputStream() { + @Override + public void write(int b) throws IOException { + String line = String.valueOf((char) b); + Logger.systemerr(line); + } + @Override + public void write(byte[] b, int off, int len) throws IOException { + String line = new String(b, off, len); + Logger.systemerr(line); + } + + @Override + public void write(byte[] b) throws IOException { + write(b, 0, b.length); + } + }; + System.setErr(new PrintStream(out, true)); + } + private void processIncomingPackets() { + for (RSCPacket p : packetQueue.getPackets()) { + IoSession session = p.getSession(); + Player player = (Player) session.getAttachment(); + if (player.getUsername() == null && p.getID() != 32 && p.getID() != 77 && p.getID() != 0) { + final String ip = player.getCurrentIP(); + // flagSession(session); + if (!written.containsKey(ip)) { + eventHandler.add(new DelayedEvent(null, 1800000) { + + public void run() { + written.remove(ip); + try { + Runtime.getRuntime().exec("sudo /sbin/route delete " + ip); + } catch (Exception err) { + System.out.println(err); + } + } + }); + try { + // Runtime.getRuntime().exec( + // "sudo /sbin/route add " + ip + " gw 127.0.0.1"); + } catch (Exception err) { + System.out.println(err); + } + Logger.println("Dummy packet from " + player.getCurrentIP() + ": " + p.getID()); + written.put(ip, 1); + } + continue; + } + PacketHandler handler = packetHandlers.get(p.getID()); + player.ping(); + if (handler != null) { + try { + handler.handlePacket(p, session); + try { + if(p.getID() != 5) { + //String s = "[PACKET] " + session.getRemoteAddress().toString().replace("/", "") + " : " + p.getID()+ " ["+handler.getClass().toString()+"]" + " : "+ player.getUsername() + " : "; + //for(Byte b : p.getData()) + // s += b; + //Logger.println(s); + } + } + catch(Exception e) { + e.printStackTrace(); + } + + } catch (Exception e) { + String s; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, true); + e.printStackTrace(pw); + pw.flush(); + sw.flush(); + s = sw.toString(); + Logger.error("Exception with p[" + p.getID() + "] from " + player.getUsername() + " [" + player.getCurrentIP() + "]: " + s); + player.getActionSender().sendLogout(); + player.destroy(false); + } + } else { + Logger.error("Unhandled packet from " + player.getCurrentIP() + ": " + p.getID() + "len: " + p.getLength()); + } + } + } + + public void processLoginServer() { + LoginConnector connector = Instance.getServer().getLoginConnector(); + if (connector != null) { + connector.processIncomingPackets(); + connector.sendQueuedPackets(); + } + } + + /** + * The thread execution process. + */ + public void run() { + Logger.println("GameEngine now running"); + // Captcha.loadCharacters(); + for (Npc n : Instance.getWorld().getNpcs()) { + for (NpcAI ai : Instance.getPluginHandler().getNpcAI()) { + if (n.getID() == ai.getID()) { + n.setScripted(true); + } + } + } + time = System.currentTimeMillis(); + + eventHandler.add(new DelayedEvent(null, 300000*10*2) { // Ran every 50*2 minutes + @Override + public void run() { + new Thread(new Runnable() { + public void run() { + garbageCollect(); + } + }).start(); + }} + ); + eventHandler.add(new DelayedEvent(null, 300000) { // 5 min + public void run() { + world.dbKeepAlive(); + Long now = System.currentTimeMillis(); + for (Player p : world.getPlayers()) { + if (now - p.getLastSaveTime() >= 900000) { + p.save(); + p.setLastSaveTime(now); + } + } + Instance.getServer().getLoginConnector().getActionSender().saveProfiles(); + } + }); + while (running) { + try { + Thread.sleep(50); + } catch (InterruptedException ie) { + } + Long AIDS = System.currentTimeMillis(); + Long Delay; + processLoginServer(); + Delay = System.currentTimeMillis() - AIDS; + if(Delay >= 1000) Logger.println("processLoginServer is taking longer than it should, exactly " + Delay + "ms"); + AIDS = System.currentTimeMillis(); + processIncomingPackets(); + Delay = System.currentTimeMillis() - AIDS; + if(Delay >= 1000) Logger.println("processIncomingPackets is taking longer than it should, exactly " + Delay + "ms"); + AIDS = System.currentTimeMillis(); + processEvents(); + Delay = System.currentTimeMillis() - AIDS; + if(Delay >= 1000) Logger.println("processEvents is taking longer than it should, exactly " + Delay + "ms"); + AIDS = System.currentTimeMillis(); + processClients(); + Delay = System.currentTimeMillis() - AIDS; + if(Delay >= 1000) Logger.println("processClients is taking longer than it should, exactly " + Delay + "ms"); + AIDS = System.currentTimeMillis(); + cleanSnapshotDeque(); + Delay = System.currentTimeMillis() - AIDS; + if(Delay >= 1000) Logger.println("processSnapshotDeque is taking longer than it should, exactly " + Delay + "ms"); + } + } + + /** + * Cleans snapshots of entries over 60 seconds old (executed every second) + */ + public void cleanSnapshotDeque() { + long curTime = System.currentTimeMillis(); + if (curTime - lastCleanedChatlogs > 1000) { + lastCleanedChatlogs = curTime; + lastCleanedChatlogsOutput++; + if(lastCleanedChatlogsOutput > 60*5) { + Logger.println("----------------------------------------------"); + Logger.println(world.getSnapshots().size() + " items on deque"); + } + Iterator i = world.getSnapshots().descendingIterator(); + Snapshot s = null; + while (i.hasNext()) { + s = i.next(); + if (curTime - s.getTimestamp() > 60000) { + i.remove(); + s = null; + } + else { + s = null; + } + } + i = null; + if(lastCleanedChatlogsOutput > 60*5) { + Logger.println(world.getSnapshots().size() + " items on deque AFTER CLEANUP"); + Logger.println("----------------------------------------------"); + lastCleanedChatlogsOutput = 0; + } + } + } + /** + * Cleans garbage (Tilecleanup) + */ + public synchronized void garbageCollect() { + long startTime = System.currentTimeMillis(); + int curMemory = (int) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000; + int tileObjs = 0; + int cleaned = 0; + for (int i = 0; i < Instance.getWorld().tiles.length; i++) { + for (int in = 0; in < Instance.getWorld().tiles[i].length; in++) { + ActiveTile tile = Instance.getWorld().tiles[i][in]; + if (tile != null) { + tileObjs++; + if (!tile.hasGameObject() && !tile.hasItems() && !tile.hasNpcs() && !tile.hasPlayers()) { + Instance.getWorld().tiles[i][in] = null; + cleaned++; + } + } + } + } + Runtime.getRuntime().gc(); + int newMemory = (int) (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000; + Logger.println("GARBAGE COLLECT | Executing Memory Cleanup"); + Logger.println("GARBAGE COLLECT | Memory before: " + curMemory + "kb" + " Memory after: " + newMemory + " (Freed: " + (curMemory - newMemory) + "kb)"); + Logger.println("GARBAGE COLLECT | Cleanup took " + (System.currentTimeMillis() - startTime) + "ms"); + } +} diff --git a/GameServer/src/msc/gs/core/LoginConnector.java b/GameServer/src/msc/gs/core/LoginConnector.java new file mode 100644 index 0000000..734c2c3 --- /dev/null +++ b/GameServer/src/msc/gs/core/LoginConnector.java @@ -0,0 +1,235 @@ +package msc.gs.core; + +import java.net.InetSocketAddress; +import java.util.List; +import java.util.TreeMap; + +import org.apache.mina.common.ConnectFuture; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.transport.socket.nio.SocketConnector; +import org.apache.mina.transport.socket.nio.SocketConnectorConfig; +import org.apache.mina.transport.socket.nio.SocketSessionConfig; + +import msc.config.Config; +import msc.gs.builders.ls.MiscPacketBuilder; +import msc.gs.connection.LSConnectionHandler; +import msc.gs.connection.LSPacket; +import msc.gs.connection.PacketQueue; +import msc.gs.phandler.PacketHandler; +import msc.gs.phandler.PacketHandlerDef; +import msc.gs.util.Logger; +import msc.gs.util.PersistenceManager; + +public class LoginConnector { + /** + * A packet builder + */ + private MiscPacketBuilder actionSender = new MiscPacketBuilder(this); + /** + * Connection attempts + */ + private int connectionAttempts = 0; + /** + * Connection Handler + */ + private IoHandler connectionHandler = new LSConnectionHandler(this); + /** + * The mapping of packet IDs to their handler + */ + private TreeMap packetHandlers = new TreeMap(); + /** + * The packet queue to be processed + */ + private PacketQueue packetQueue; + /** + * World registered + */ + private boolean registered = false; + /** + * Should we be running? + */ + private boolean running = true; + /** + * IoSession + */ + private IoSession session; + /** + * The mapping of packet UIDs to their handler + */ + private TreeMap uniqueHandlers = new TreeMap(); + + public int getConnectionAttempts() { + return connectionAttempts; + } + + public void setConnectionAttempts(int connectionAttempts) { + this.connectionAttempts = connectionAttempts; + } + + public IoHandler getConnectionHandler() { + return connectionHandler; + } + + public void setConnectionHandler(IoHandler connectionHandler) { + this.connectionHandler = connectionHandler; + } + + public TreeMap getPacketHandlers() { + return packetHandlers; + } + + public void setPacketHandlers(TreeMap packetHandlers) { + this.packetHandlers = packetHandlers; + } + + public boolean isRunning() { + return running; + } + + public void setRunning(boolean running) { + this.running = running; + } + + public TreeMap getUniqueHandlers() { + return uniqueHandlers; + } + + public void setUniqueHandlers(TreeMap uniqueHandlers) { + this.uniqueHandlers = uniqueHandlers; + } + + public void setActionSender(MiscPacketBuilder actionSender) { + this.actionSender = actionSender; + } + + public void setPacketQueue(PacketQueue packetQueue) { + this.packetQueue = packetQueue; + } + + public void setSession(IoSession session) { + this.session = session; + } + + public LoginConnector() { + packetQueue = new PacketQueue(); + loadPacketHandlers(); + reconnect(); + } + + public MiscPacketBuilder getActionSender() { + return actionSender; + } + + public PacketQueue getPacketQueue() { + return packetQueue; + } + + public IoSession getSession() { + return session; + } + + public boolean isRegistered() { + return registered; + } + + public void kill() { + running = false; + Logger.print("Unregistering world (" + Config.SERVER_NUM + ") with LS"); + actionSender.unregisterWorld(); + } + + private void loadPacketHandlers() { + PacketHandlerDef[] handlerDefs = (PacketHandlerDef[]) PersistenceManager.load("LSPacketHandlers.xml"); + for (PacketHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + PacketHandler handler = (PacketHandler) c.newInstance(); + for (int packetID : handlerDef.getAssociatedPackets()) { + packetHandlers.put(packetID, handler); + } + } + } catch (Exception e) { + Logger.error(e); + } + } + } + + public void processIncomingPackets() { + for (LSPacket p : packetQueue.getPackets()) { + PacketHandler handler; + if (((handler = uniqueHandlers.get(p.getUID())) != null) || ((handler = packetHandlers.get(p.getID())) != null)) { + try { + handler.handlePacket(p, session); + uniqueHandlers.remove(p.getUID()); + } catch (Exception e) { + Logger.error("Exception with p[" + p.getID() + "] from LOGIN_SERVER: " + e.getMessage()); + } + } else { + Logger.error("Unhandled packet from LS: " + p.getID()); + } + } + } + + public boolean reconnect() { + try { + Logger.println("Attempting to connect to LS"); + SocketConnector conn = new SocketConnector(); + SocketConnectorConfig config = new SocketConnectorConfig(); + ((SocketSessionConfig) config.getSessionConfig()).setKeepAlive(true); + ((SocketSessionConfig) config.getSessionConfig()).setTcpNoDelay(true); + ConnectFuture future = conn.connect(new InetSocketAddress(Config.LS_IP, Config.LS_PORT), connectionHandler, config); + future.join(3000); + if (future.isConnected()) { + session = future.getSession(); + Logger.println("Registering world (" + Config.SERVER_NUM + ") with LS"); + actionSender.registerWorld(); + connectionAttempts = 0; + return true; + } + if (connectionAttempts++ >= 100) { + Logger.println("Unable to connect to LS, giving up after " + connectionAttempts + " tries"); + System.exit(1); + return false; + } + return reconnect(); + + } catch (Exception e) { + Logger.println("Error connecting to LS: " + e.getMessage()); + return false; + } + } + + public boolean running() { + return running; + } + + public synchronized void sendQueuedPackets() { + try { + List packets = actionSender.getPackets(); + for (LSPacket packet : packets) { + session.write(packet); + } + actionSender.clearPackets(); + } catch (Exception e) { + Logger.println("Stack processInc: "); + e.printStackTrace(); + } + } + + public void setHandler(long uID, PacketHandler handler) { + uniqueHandlers.put(uID, handler); + } + + public void setRegistered(boolean registered) { + if (registered) { + this.registered = true; + Logger.print("World successfully registered with LS"); + } else { + Logger.error(new Exception("Error registering world")); + } + } + +} diff --git a/GameServer/src/msc/gs/db/DBConnection.java b/GameServer/src/msc/gs/db/DBConnection.java new file mode 100644 index 0000000..8bd07b2 --- /dev/null +++ b/GameServer/src/msc/gs/db/DBConnection.java @@ -0,0 +1,140 @@ +package msc.gs.db; + + + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +import msc.config.Config; +import msc.gs.util.Logger; + + + +/** + * Used to interact with the database. + */ +public class DBConnection { + + /** + * The database connection in use + */ + private Connection con; + /** + * A statement for running queries on + */ + private Statement statement; + /** + * Report2Database handleing logic + */ + private static ReportHandlerQueries reportDB = new ReportHandlerQueries(); + /** + * Getter for reportDB + * @return reportDB + */ + public static ReportHandlerQueries getReport() { + return reportDB; + } + + static + { + testForDriver(); + } + + /** + * Tests we have a mysql Driver + */ + private static void testForDriver() { + try { + Class.forName("com.mysql.jdbc.Driver"); + } + catch (ClassNotFoundException cnfe) { + cnfe.printStackTrace(); + } + } + + /** + * Instantiates a new database connection + */ + public DBConnection() { + if(!createConnection()) { + new Exception("Unable to connect to MySQL").printStackTrace(); + System.exit(1); + } + else { + Logger.println("Database connection achieved."); + } + } + public void initilizePreparedStatements(DBConnection db) { + reportDB.initilizePreparedStatements(db); + } + public boolean createConnection() { + try { + con = DriverManager.getConnection("jdbc:mysql://" + Config.MYSQL_HOST + "/" + Config.MYSQL_DB, Config.MYSQL_USER, Config.MYSQL_PASS); + statement = con.createStatement(); + statement.setEscapeProcessing(true); + return isConnected(); + } + catch(SQLException e) { + e.printStackTrace(); + return false; + } + } + + public boolean isConnected() { + try { + statement.executeQuery("SELECT CURRENT_DATE"); + return true; + } + catch(SQLException e) { + return false; + } + } + public Connection getConnection() { + return con; + } + /* + public synchronized int updateUserStats(String user, int messages, int modes, int kicks, int kicked, long lastTimeSpoken, int joins, int parts, String randomstring, int moderatedchan) throws SQLException { + existingRecord.setString(1, user); + existingRecord.execute(); + if(existingRecord.getResultSet().next()) { // Existing + existingUserQuery.setInt(1, messages); + existingUserQuery.setInt(2, modes); + existingUserQuery.setInt(3, kicks); + existingUserQuery.setInt(4, kicked); + existingUserQuery.setLong(5, lastTimeSpoken); + existingUserQuery.setInt(6, joins); + existingUserQuery.setInt(7, parts); + existingUserQuery.setString(8, randomstring); + existingUserQuery.setInt(9, moderatedchan); + existingUserQuery.setString(10, user); + return existingUserQuery.executeUpdate(); + } + else { // New record + newUserQuery.setString(1, user); + newUserQuery.setInt(2, messages); + newUserQuery.setInt(3, modes); + newUserQuery.setInt(4, kicks); + newUserQuery.setInt(5, kicked); + newUserQuery.setLong(6, lastTimeSpoken); + newUserQuery.setInt(7, joins); + newUserQuery.setInt(8, parts); + newUserQuery.setString(9, randomstring); + newUserQuery.setInt(10, moderatedchan); + return newUserQuery.executeUpdate(); + } + + } + */ + + /** + * Closes the database conection. + * + * @throws SQLException if there was an error when closing the connection + */ + public void close() throws SQLException { + con.close(); + con = null; + } +} diff --git a/GameServer/src/msc/gs/db/ReportHandlerQueries.java b/GameServer/src/msc/gs/db/ReportHandlerQueries.java new file mode 100644 index 0000000..be42349 --- /dev/null +++ b/GameServer/src/msc/gs/db/ReportHandlerQueries.java @@ -0,0 +1,133 @@ +package msc.gs.db; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Iterator; + +import msc.gs.Instance; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.model.snapshot.Chatlog; +import msc.gs.model.snapshot.Snapshot; +import msc.gs.util.Logger; +//import msc.ls.util.DataConversions; + +public class ReportHandlerQueries { + /** + * Inserts a new row into "msc2_reports" table + */ + private PreparedStatement insertNewReportRow; + + private PreparedStatement insertNewDupeDataRow; + /** + * Initilizes prepared statements, if failed, shuts down the server. + */ + public void initilizePreparedStatements(DBConnection db) { + try { + insertNewReportRow = db.getConnection().prepareStatement("INSERT INTO `msc2_reports` (`from`, `about`, `time`, `reason`, `snapshot_from`,`snapshot_about`,`chatlogs`, `from_x`, `from_y`, `about_x`, `about_y`) VALUES(?,?,?,?,?,?,?,?,?,?,?)"); + insertNewDupeDataRow = db.getConnection().prepareStatement("INSERT INTO `dupe_data` (`user`, `userhash`, `string`, `time`) VALUES(?,?,?,?);"); + + } catch (SQLException e) { + e.printStackTrace(); + Logger.error(e); + } + } + /** + * Submits a report to the database + * + * Chatlogs, snapshots, locations etc are generated inside this method. + * + * @param from Players usernameHash (who reported) + * @param about Players usernameHash (who got reported) + * @param reason What type of a report is this + */ + public synchronized void submitRepot(long from, long about, byte reason, Player from2) { + + long time = System.currentTimeMillis()/1000; + String f = msc.gs.tools.DataConversions.hashToUsername(from); + String a = msc.gs.tools.DataConversions.hashToUsername(about); + + Player about2 = World.getWorld().getPlayer(about); + int player2X; + int player2Y; + if(about2 == null) { + player2X = 0; + player2Y = 0; + } + else { + player2X = about2.getX(); + player2Y = about2.getY(); + } + StringBuilder snapshot_from = new StringBuilder(); + StringBuilder snapshot_about = new StringBuilder(); + + StringBuilder chatlog = new StringBuilder(); + Iterator i = Instance.getWorld().getSnapshots().descendingIterator(); + while (i.hasNext()) { + Snapshot s = i.next(); + if(s instanceof Chatlog) { + Chatlog cl = (Chatlog)s; + if (cl.getRecievers().contains(a) || cl.getOwner().equals(a)) { + chatlog.append((cl.getTimestamp()/1000) + " <" + cl.getOwner() + "> " + cl.getMessage() + "\n"); + } + } + else if (s instanceof Activity) { + Activity ac = (Activity)s; + if(ac.getOwner().equals(f)) { + snapshot_from.append((ac.getTimestamp()/1000) + " " + ac.getActivity() + "\n"); + } + else if(ac.getOwner().equals(a)) { + snapshot_about.append((ac.getTimestamp()/1000) + " " + ac.getActivity() + "\n"); + } + } + } + try { + insertNewReportRow.setLong(1, from); + insertNewReportRow.setLong(2, about); + insertNewReportRow.setLong(3, time); + insertNewReportRow.setInt(4, reason); + insertNewReportRow.setString(5, snapshot_from.toString()); + insertNewReportRow.setString(6, snapshot_about.toString()); + insertNewReportRow.setString(7, chatlog.toString()); + insertNewReportRow.setInt(8, from2.getX()); + insertNewReportRow.setInt(9, from2.getY()); + insertNewReportRow.setInt(10, player2X); + insertNewReportRow.setInt(11, player2Y); + insertNewReportRow.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + Logger.error(e); + } + } + + public synchronized void submitDupeData(String username, Long hash) { + StringBuilder data = new StringBuilder(); + Iterator i = Instance.getWorld().getSnapshots().descendingIterator(); + while (i.hasNext()) { + Snapshot s = i.next(); + if(s instanceof Chatlog) { + Chatlog cl = (Chatlog)s; + if (cl.getRecievers().contains(username) || cl.getOwner().equals(username)) { + data.append((cl.getTimestamp()/1000) + " <" + cl.getOwner() + "> " + cl.getMessage() + "\n"); + } + } + else if (s instanceof Activity) { + Activity ac = (Activity)s; + if(ac.getOwner().equals(username)) { + data.append((ac.getTimestamp()/1000) + " " + ac.getActivity() + "\n"); + } + } + } + try { + insertNewDupeDataRow.setString(1, username); + insertNewDupeDataRow.setLong(2, hash); + insertNewDupeDataRow.setString(3, data.toString()); + insertNewDupeDataRow.setLong(4,System.currentTimeMillis()); + insertNewDupeDataRow.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + Logger.error(e); + } + } +} diff --git a/GameServer/src/msc/gs/event/DelayedEvent.java b/GameServer/src/msc/gs/event/DelayedEvent.java new file mode 100644 index 0000000..8388b90 --- /dev/null +++ b/GameServer/src/msc/gs/event/DelayedEvent.java @@ -0,0 +1,83 @@ +package msc.gs.event; + +import msc.gs.Instance; +import msc.gs.core.DelayedEventHandler; +import msc.gs.model.Player; +import msc.gs.model.World; + +public abstract class DelayedEvent { + public static final World world = Instance.getWorld(); + protected int delay = 500; + protected final DelayedEventHandler handler = Instance.getWorld().getDelayedEventHandler(); + private long lastRun = System.currentTimeMillis(); + protected Player owner; + protected boolean matchRunning = true; + public Object[] args = null; + + // f2p + public DelayedEvent(Player owner, int delay) { + this.owner = owner; + this.delay = delay; + } + + public DelayedEvent(Player owner, int delay, Object[] arg) { + args = arg; + this.owner = owner; + this.delay = delay; + } + + public boolean belongsTo(Player player) { + return owner != null && owner.equals(player); + } + + public int getDelay() { + return delay; + } + + public Object getIdentifier() { + return null; + } + + public Player getOwner() { + return owner; + } + + public boolean hasOwner() { + return owner != null; + } + + public boolean is(DelayedEvent e) { + return (e.getIdentifier() != null && e.getIdentifier().equals(getIdentifier())); + } + + public abstract void run(); + + public void setDelay(int delay) { + this.delay = delay; + } + + public void setLastRun(long time) { + lastRun = time; + } + + public final boolean shouldRemove() { + return !matchRunning; + } + + public final boolean shouldRun() { + return matchRunning && System.currentTimeMillis() - lastRun >= delay; + } + + public final void stop() { + matchRunning = false; + } + + public int timeTillNextRun() { + int time = (int) (delay - (System.currentTimeMillis() - lastRun)); + return time < 0 ? 0 : time; + } + + public final void updateLastRun() { + lastRun = System.currentTimeMillis(); + } +} diff --git a/GameServer/src/msc/gs/event/DelayedQuestChat.java b/GameServer/src/msc/gs/event/DelayedQuestChat.java new file mode 100644 index 0000000..128f434 --- /dev/null +++ b/GameServer/src/msc/gs/event/DelayedQuestChat.java @@ -0,0 +1,32 @@ +package msc.gs.event; + +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; + +public abstract class DelayedQuestChat extends DelayedEvent { + public int curIndex; + public String[] messages; + public Npc npc; + public Player owner; + + public DelayedQuestChat(Npc npc, Player owner, String[] messages) { + super(null, 2200); + this.owner = owner; + this.npc = npc; + this.messages = messages; + curIndex = 0; + } + + public abstract void finished(); + + public void run() { + owner.informOfNpcMessage(new ChatMessage(npc, messages[curIndex], owner)); + curIndex++; + if (curIndex == messages.length) { + finished(); + stop(); + return; + } + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/DuelEvent.java b/GameServer/src/msc/gs/event/DuelEvent.java new file mode 100644 index 0000000..b2361c1 --- /dev/null +++ b/GameServer/src/msc/gs/event/DuelEvent.java @@ -0,0 +1,103 @@ +package msc.gs.event; + +import java.util.ArrayList; + +import msc.config.Formulae; +import msc.gs.model.Player; +import msc.gs.states.CombatState; +import msc.gs.tools.DataConversions; + +public class DuelEvent extends DelayedEvent { + private Player affectedPlayer; + private int hits; + + public DuelEvent(Player owner, Player affectedPlayer) { + super(owner, 1300); + this.affectedPlayer = affectedPlayer; + hits = 0; + } + + public boolean equals(Object o) { + if (o instanceof DuelEvent) { + DuelEvent e = (DuelEvent) o; + return e.belongsTo(owner) && e.getAffectedPlayer().equals(affectedPlayer); + } + return false; + } + + public Player getAffectedPlayer() { + return affectedPlayer; + } + + public void run() { + if (!owner.loggedIn() || !affectedPlayer.loggedIn()) { + owner.resetCombat(CombatState.ERROR); + affectedPlayer.resetCombat(CombatState.ERROR); + return; + } + Player attacker, opponent; + if (hits++ % 2 == 0) { + attacker = owner; + opponent = affectedPlayer; + } else { + attacker = affectedPlayer; + opponent = owner; + } + if (opponent.getHits() <= 0) { + attacker.resetCombat(CombatState.WON); + opponent.resetCombat(CombatState.LOST); + return; + } + attacker.incHitsMade(); + attacker.setLastMoved(); + + int damage = (attacker instanceof Player && opponent instanceof Player ? Formulae.calcFightHit(attacker, opponent) : Formulae.calcFightHitWithNPC(attacker, opponent)); + opponent.setLastDamage(damage); + int newHp = opponent.getHits() - damage; + opponent.setHits(newHp); + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(opponent.getViewArea().getPlayersInView()); + playersToInform.addAll(attacker.getViewArea().getPlayersInView()); + for (Player p : playersToInform) { + p.informOfModifiedHits(opponent); + } + String combatSound = damage > 0 ? "combat1b" : "combat1a"; + + opponent.getActionSender().sendStat(3); + opponent.getActionSender().sendSound(combatSound); + attacker.getActionSender().sendSound(combatSound); + + if (newHp <= 0) { + opponent.killedBy(attacker, true); + int exp = DataConversions.roundUp(Formulae.combatExperience(opponent) / 4D); + switch (attacker.getCombatStyle()) { + case 0: + for (int x = 0; x < 3; x++) { + attacker.incExp(x, exp, true); + attacker.getActionSender().sendStat(x); + } + break; + case 1: + attacker.incExp(2, exp * 3, true); + attacker.getActionSender().sendStat(2); + break; + case 2: + attacker.incExp(0, exp * 3, true); + attacker.getActionSender().sendStat(0); + break; + case 3: + attacker.incExp(1, exp * 3, true); + attacker.getActionSender().sendStat(1); + break; + } + attacker.incExp(3, exp, true); + attacker.getActionSender().sendStat(3); + + attacker.resetCombat(CombatState.WON); + opponent.resetCombat(CombatState.LOST); + + attacker.resetDueling(); + opponent.resetDueling(); + } + } +} diff --git a/GameServer/src/msc/gs/event/FightEvent.java b/GameServer/src/msc/gs/event/FightEvent.java new file mode 100644 index 0000000..107a8cb --- /dev/null +++ b/GameServer/src/msc/gs/event/FightEvent.java @@ -0,0 +1,326 @@ +package msc.gs.event; + +import java.util.ArrayList; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Path; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.mini.Damager; +import msc.gs.states.CombatState; +import msc.gs.tools.DataConversions; + +public class FightEvent extends DelayedEvent { + + private Mob affectedMob; + private int firstHit; + private int hits; + private boolean attacked = false; + boolean delay = false; + int dela = 0; + + public FightEvent(Player owner, Mob affectedMob) { + this(owner, affectedMob, false); + } + + /** + * Slowed down a fight if PvP in wildy. - not in use atm + */ + public static int getDelay(Mob owner, Mob affectedMob) { + if (owner instanceof Player && affectedMob instanceof Player) { + if (((Player) owner).getLocation().inWilderness()) { + return 1400; + } + } + return 1100; + } + + public FightEvent(Player owner, Mob affectedMob, boolean attacked) { + super(owner, 1400); + this.affectedMob = affectedMob; + firstHit = attacked ? 1 : 0; + this.attacked = attacked; + hits = 0; + } + + public boolean equals(Object o) { + if (o instanceof FightEvent) { + FightEvent e = (FightEvent) o; + return e.belongsTo(owner) && e.getAffectedMob().equals(affectedMob); + } + return false; + } + + public Mob getAffectedMob() { + return affectedMob; + } + + public void run() { + if (!owner.loggedIn() || (affectedMob instanceof Player && !((Player) affectedMob).loggedIn())) { + owner.resetCombat(CombatState.ERROR); + affectedMob.resetCombat(CombatState.ERROR); + return; + } + + Mob attacker, opponent; + + if (hits++ % 2 == firstHit) { + attacker = owner; + opponent = affectedMob; + } else { + attacker = affectedMob; + opponent = owner; + } + + if (attacker instanceof Npc) { + Npc n = (Npc) attacker; + if (attacker.getHits() <= 0) { + n.resetCombat(CombatState.ERROR); + } + if (n == null) { + Player p = (Player) opponent; + p.resetCombat(CombatState.ERROR); + } + } + if (opponent instanceof Npc) { + Npc n = (Npc) opponent; + if (opponent.getHits() <= 0) { + n.resetCombat(CombatState.ERROR); + } + if (n == null) { + Player p = (Player) attacker; + p.resetCombat(CombatState.ERROR); + } + } + if (opponent instanceof Player && attacker instanceof Player) { + if(((Player)opponent).isSleeping()) { + ((Player)opponent).getActionSender().sendWakeUp(false); + } + } + + /* + * if(opponent.getHits() <= 0) { attacker.resetCombat(CombatState.WON); + * opponent.resetCombat(CombatState.LOST); return; } + */ + attacker.incHitsMade(); + if (attacker instanceof Npc && opponent.isPrayerActivated(12) && ((Npc)attacker).getTeam() == 2) { + return; + } + int damage = (attacker instanceof Player && opponent instanceof Player ? Formulae.calcFightHit(attacker, opponent) : Formulae.calcFightHitWithNPC(attacker, opponent)); + + if (attacker instanceof Player && opponent instanceof Npc) { + Npc npc = (Npc) opponent; + + int newDmg = damage; + if (npc.getCurHits() - damage <= 0 && npc.getCurHits() > 0) { + newDmg = npc.getCurHits(); + } + npc.getSyndicate().addDamage(owner, newDmg, false, true, false); + } + + if (attacker instanceof Npc && opponent instanceof Player && attacker.getHitsMade() >= (attacked ? 4 : 3)) { + Npc npc = (Npc) attacker; + Player player = (Player) opponent; + if (npc.getCurHits() <= npc.getDef().hits * 0.10 && npc.getCurHits() > 0) { + if (!npc.getLocation().inWilderness() && npc.getDef().attackable && !npc.getDef().aggressive) { + boolean go = true; + for (int i : Constants.GameServer.NPCS_THAT_DONT_RETREAT) { + if (i == npc.getID()) { + go = false; + break; + } + } + + if (go) { + player.getActionSender().sendSound("retreat"); + npc.unblock(); + npc.resetCombat(CombatState.RUNNING); + player.resetCombat(CombatState.WAITING); + npc.setRan(true); + npc.setPath(new Path(attacker.getX(), attacker.getY(), DataConversions.random(npc.getLoc().minX(), npc.getLoc().maxX()), DataConversions.random(npc.getLoc().minY(), npc.getLoc().maxY()))); + player.resetAll(); + player.getActionSender().sendMessage("Your opponent is retreating"); + return; + } + } + } + } + + opponent.setLastDamage(damage); + int newHp = opponent.getHits() - damage; + opponent.setHits(newHp); + if (opponent instanceof Npc && newHp > 0) { + Npc n = (Npc) opponent; + + double max = n.getDef().hits; + double cur = n.getHits(); + int percent = (int) ((cur / max) * 100); + if (n.isScripted()) { + Instance.getPluginHandler().getNpcAIHandler(opponent.getID()).onHealthPercentage(n, percent); + } + } + + String combatSound = null; + combatSound = damage > 0 ? "combat1b" : "combat1a"; + if (opponent instanceof Player) { + if (attacker instanceof Npc) { + Npc n = (Npc) attacker; + if (n.hasArmor) { + combatSound = damage > 0 ? "combat2b" : "combat2a"; + } else if (n.undead) { + combatSound = damage > 0 ? "combat3b" : "combat3a"; + } else { + combatSound = damage > 0 ? "combat1b" : "combat1a"; + } + } + Player opponentPlayer = ((Player) opponent); + opponentPlayer.getActionSender().sendStat(3); + opponentPlayer.getActionSender().sendSound(combatSound); + } + if (attacker instanceof Player) { + if (opponent instanceof Npc) { + Npc n = (Npc) opponent; + if (n.hasArmor) { + combatSound = damage > 0 ? "combat2b" : "combat2a"; + } else if (n.undead) { + combatSound = damage > 0 ? "combat3b" : "combat3a"; + } else { + combatSound = damage > 0 ? "combat1b" : "combat1a"; + } + } + Player attackerPlayer = (Player) attacker; + attackerPlayer.getActionSender().sendSound(combatSound); + } + + if (newHp <= 0) { + + int tempDmg = 0; + Player toLoot = null; + + //System.out.println(opponent+" killed by "+attacker); + + if (attacker instanceof Player) { + Player attackerPlayer = (Player) attacker; + toLoot = attackerPlayer; + int exp = DataConversions.roundUp(Formulae.combatExperience(opponent) / 4D); + int newXP = 0; + if (opponent instanceof Player) { + //System.out.println(opponent+" killed by "+attacker); + opponent.killedBy(attackerPlayer, false); + } + + + if (attacker instanceof Player && opponent instanceof Npc) { + Npc npc = (Npc) opponent; + + for (Damager fig : ((Npc) opponent).getSyndicate().getDamagers()) { + // boolean found = false; + if (fig.getPlayer().isDueling()) { + continue; + } + if (fig.getDamage() > tempDmg) { + toLoot = fig.getPlayer(); + tempDmg = fig.getDamage(); + } + if (fig.isUseMagic() && !fig.isUseCombat()) { // if they + // shot + // magic, and didn't + // kill the npc with + // melee + continue; + } + /* + * for(Player p : + * attackerPlayer.getViewArea().getPlayersInView()) if(p + * == fig.player) found = true; if(!found) // skip a + * person who is not in the area. continue; + */// meh, no big deal, less cpu without it. + + if (fig.getDamage() > npc.getDef().hits) { + fig.setDamage(npc.getDef().hits); + } + if (fig.getPlayer() != null) { + newXP = (exp * fig.getDamage()) / npc.getDef().hits; + + if (fig.getPlayer() != attackerPlayer && fig.isUseRanged()) { + fig.getPlayer().incExp(4, newXP * 4, true, true); + fig.getPlayer().getActionSender().sendStat(4); + attacker.resetCombat(CombatState.WON); + opponent.resetCombat(CombatState.LOST); + continue; + } + switch (fig.getPlayer().getCombatStyle()) { + case 0: + for (int x = 0; x < 2; x++) { + fig.getPlayer().incExp(x, newXP, true, true); + fig.getPlayer().getActionSender().sendStat(x); + } + fig.getPlayer().incExp(2, newXP, true, true); + fig.getPlayer().getActionSender().sendStat(2); + break; + case 1: + fig.getPlayer().incExp(2, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(2); + break; + case 2: + fig.getPlayer().incExp(0, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(0); + break; + case 3: + fig.getPlayer().incExp(1, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(1); + break; + } + fig.getPlayer().incExp(3, newXP, true, true); + fig.getPlayer().getActionSender().sendStat(3); + } + } + + } else { + switch (attackerPlayer.getCombatStyle()) { + case 0: + + for (int x = 0; x < 2; x++) { + attackerPlayer.incExp(x, newXP, true, true); + attackerPlayer.getActionSender().sendStat(x); + } + attackerPlayer.incExp(2, newXP, true, true); + attackerPlayer.getActionSender().sendStat(2); + break; + case 1: + attackerPlayer.incExp(2, exp * 3, true, true); + attackerPlayer.getActionSender().sendStat(2); + break; + case 2: + attackerPlayer.incExp(0, exp * 3, true, true); + attackerPlayer.getActionSender().sendStat(0); + break; + case 3: + attackerPlayer.incExp(1, exp * 3, true, true); + attackerPlayer.getActionSender().sendStat(1); + break; + } + attackerPlayer.incExp(3, exp, true, true); + attackerPlayer.getActionSender().sendStat(3); + } + } + //if the dead mob isn't a player... + if (!(affectedMob instanceof Player)) { + opponent.killedBy(toLoot, false); + } + attacker.resetCombat(CombatState.WON); + opponent.resetCombat(CombatState.LOST); + } else { + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(opponent.getViewArea().getPlayersInView()); + playersToInform.addAll(attacker.getViewArea().getPlayersInView()); + for (Player p : playersToInform) { + p.informOfModifiedHits(opponent); + } + } + } +} diff --git a/GameServer/src/msc/gs/event/MiniEvent.java b/GameServer/src/msc/gs/event/MiniEvent.java new file mode 100644 index 0000000..3871972 --- /dev/null +++ b/GameServer/src/msc/gs/event/MiniEvent.java @@ -0,0 +1,21 @@ +package msc.gs.event; + +import msc.gs.model.Player; + +public abstract class MiniEvent extends SingleEvent { + + public MiniEvent(Player owner) { + super(owner, 500); + } + + public MiniEvent(Player owner, int delay) { + super(owner, delay); + } + + public MiniEvent(Player owner, int delay, Object[] arg) { + super(owner, delay, arg); + } + + public abstract void action(); + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/ObjectRemover.java b/GameServer/src/msc/gs/event/ObjectRemover.java new file mode 100644 index 0000000..b33b5c5 --- /dev/null +++ b/GameServer/src/msc/gs/event/ObjectRemover.java @@ -0,0 +1,39 @@ +package msc.gs.event; + +import msc.gs.Instance; +import msc.gs.model.ActiveTile; +import msc.gs.model.GameObject; +import msc.gs.model.World; + +public class ObjectRemover extends DelayedEvent { + public static final World world = Instance.getWorld(); + private GameObject object; + + public ObjectRemover(GameObject object, int delay) { + super(null, delay); + this.object = object; + } + + public boolean equals(Object o) { + if (o instanceof ObjectRemover) { + return ((ObjectRemover) o).getObject().equals(getObject()); + } + return false; + } + + public GameObject getObject() { + return object; + } + + public void run() { + ActiveTile tile = world.getTile(object.getLocation()); + if (!tile.hasGameObject() || !tile.getGameObject().equals(object)) { + super.matchRunning = false; + return; + } + tile.remove(object); + world.unregisterGameObject(object); + super.matchRunning = false; + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/RangeEvent.java b/GameServer/src/msc/gs/event/RangeEvent.java new file mode 100644 index 0000000..e396324 --- /dev/null +++ b/GameServer/src/msc/gs/event/RangeEvent.java @@ -0,0 +1,319 @@ +package msc.gs.event; + +import java.util.ArrayList; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.PathGenerator; +import msc.gs.model.Player; +import msc.gs.model.Projectile; +import msc.gs.model.mini.Damager; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class RangeEvent extends DelayedEvent { + private Mob affectedMob; + public int[][] allowedArrows = { { 189, 11, 638 }, // Shortbow + { 188, 11, 638 }, // Longbow + { 649, 11, 638 }, // Oak Shortbow + { 648, 11, 638, 640 }, // Oak Longbow + { 651, 11, 638, 640 }, // Willow Shortbow + { 650, 11, 638, 640, 642 }, // Willow Longbow + { 653, 11, 638, 640, 642 }, // Maple Shortbow + { 652, 11, 638, 640, 642, 644 }, // Maple Longbow + { 655, 11, 638, 640, 642, 644 }, // Yew Shortbow + { 654, 11, 638, 640, 642, 644, 646 }, // Yew Longbow + { 657, 11, 638, 640, 642, 644, 646 }, // Magic Shortbow + { 656, 11, 638, 640, 642, 644, 646 } // Magic Longbow + }; + + private boolean firstRun = true; + + public RangeEvent(Player owner, Mob affectedMob) { + super(owner, 2000); + this.affectedMob = affectedMob; + } + + public boolean equals(Object o) { + if (o instanceof RangeEvent) { + RangeEvent e = (RangeEvent) o; + return e.belongsTo(owner); + } + return false; + } + + public Mob getAffectedMob() { + return affectedMob; + } + + private Item getArrows(int id) { + for (Item i : world.getTile(affectedMob.getLocation()).getItems()) { + if (i.getID() == id && i.visibleTo(owner) && !i.isRemoved()) { + return i; + } + } + return null; + } + + public void run() { + int bowID = owner.getRangeEquip(); + if (!owner.loggedIn() || (affectedMob instanceof Player && !((Player) affectedMob).loggedIn()) || affectedMob.getHits() <= 0 || !owner.checkAttack(affectedMob, true) || bowID < 0) { + owner.resetRange(); + return; + } + if (owner.withinRange(affectedMob, 5)) { + if (owner.isFollowing()) { + owner.resetFollowing(); + } + if (!owner.finishedPath()) { + owner.resetPath(); + } + } else { + owner.setFollowing(affectedMob); + return; + } + if (!new PathGenerator(owner.getX(), owner.getY(), affectedMob.getX(), affectedMob.getY()).isValid()) { + owner.getActionSender().sendMessage("I can't get a clear shot from here"); + owner.resetPath(); + return; + } + boolean xbow = DataConversions.inArray(Formulae.xbowIDs, bowID); + int arrowID = -1; + for (int aID : (xbow ? Formulae.boltIDs : Formulae.arrowIDs)) { + int slot = owner.getInventory().getLastIndexById(aID); + if (slot < 0) { + continue; + } + InvItem arrow = owner.getInventory().get(slot); + if (arrow == null) { // This shouldn't happen + continue; + } + arrowID = aID; + if(owner.getLocation().inWilderness() && Constants.GameServer.F2P_WILDY) { + if(arrowID != 11 && arrowID != 190) { + owner.getActionSender().sendMessage("You may not use P2P (Member Item) Arrows in the F2P Wilderness"); + owner.resetRange(); + return; + } + } + int newAmount = arrow.getAmount() - 1; + if (!xbow && arrowID > 0) { + int temp = -1; + + for (int i = 0; i < allowedArrows.length; i++) + if (allowedArrows[i][0] == owner.getRangeEquip()) + temp = i; + + boolean canFire = false; + for (int i = 0; i < allowedArrows[temp].length; i++) + if (allowedArrows[temp][i] == aID) + canFire = true; + + if (!canFire) { + owner.getActionSender().sendMessage("Your arrows are too powerful for your Bow."); + owner.resetRange(); + return; + } + } + + if (newAmount <= 0) { + owner.getInventory().remove(slot); + owner.getActionSender().sendInventory(); + } else { + arrow.setAmount(newAmount); + owner.getActionSender().sendUpdateItem(slot); + } + break; + } + if (arrowID < 0) { + owner.getActionSender().sendMessage("You have run out of " + (xbow ? "bolts" : "arrows")); + owner.resetRange(); + return; + } + if (affectedMob.isPrayerActivated(13)) { + if(!owner.shouldRangePass()) { + owner.getActionSender().sendMessage("Your missile got blocked"); + return; + } + } + // if(owner.getRangeEquip()) + + int damage = Formulae.calcRangeHit(owner.getCurStat(4), owner.getRangePoints(), affectedMob.getArmourPoints(), arrowID); + + if (affectedMob instanceof Npc) { + Npc npc = (Npc) affectedMob; + if(damage > 1 && npc.getID() == 477) + damage = damage / 2; + } + if (!Formulae.looseArrow(damage)) { + Item arrows = getArrows(arrowID); + if (arrows == null) { + world.registerItem(new Item(arrowID, affectedMob.getX(), affectedMob.getY(), 1, owner)); + } else { + arrows.setAmount(arrows.getAmount() + 1); + } + } + if (firstRun) { + firstRun = false; + if (affectedMob instanceof Player) { + if(((Player)affectedMob).isSleeping()) { + ((Player)affectedMob).getActionSender().sendWakeUp(false); + } + ((Player) affectedMob).getActionSender().sendMessage(owner.getUsername() + " is shooting at you!"); + } + } + if(affectedMob instanceof Npc && ((Npc)affectedMob).isScripted()) { + Instance.getPluginHandler().getNpcAIHandler(affectedMob.getID()).onRangedAttack(owner, (Npc) affectedMob); + } + if (affectedMob instanceof Npc) { + Npc npc = (Npc) affectedMob; + npc.getSyndicate().addDamage(owner, damage, false, false, true); + } + Projectile projectile = new Projectile(owner, affectedMob, 2); + + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(owner.getViewArea().getPlayersInView()); + playersToInform.addAll(affectedMob.getViewArea().getPlayersInView()); + for (Player p : playersToInform) { + p.informOfProjectile(projectile); + } + + if (System.currentTimeMillis() - affectedMob.lastTimeShot > 500) { + affectedMob.lastTimeShot = System.currentTimeMillis(); + affectedMob.setLastDamage(damage); + int newHp = affectedMob.getHits() - damage; + affectedMob.setHits(newHp); + if (affectedMob instanceof Npc && newHp > 0) { + Npc n = (Npc) affectedMob; + double max = n.getDef().hits; + double cur = n.getHits(); + int percent = (int) ((cur / max) * 100); + if (n.isScripted()) + Instance.getPluginHandler().getNpcAIHandler(n.getID()).onHealthPercentage(n, percent); + } + for (Player p : playersToInform) { + p.informOfModifiedHits(affectedMob); + } + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + owner.getActionSender().sendSound("shoot"); + owner.setArrowFired(); + if (newHp <= 0) { + affectedMob.killedBy(owner, false); + owner.resetRange(); + if (owner instanceof Player) { + Player attackerPlayer = (Player) owner; + int exp = DataConversions.roundUp(Formulae.combatExperience(affectedMob) / 4D); + int newXP = 0; + if (owner instanceof Player && affectedMob instanceof Npc) { + Npc npc = (Npc) affectedMob; + + for (Damager fig : ((Npc) affectedMob).getSyndicate().getDamagers()) { + if (fig.isUseMagic() && attackerPlayer != fig.getPlayer()) + continue; + + if (fig.getDamage() > npc.getDef().hits) + fig.setDamage(npc.getDef().hits); + if (fig.getPlayer() != null) { + newXP = (exp * fig.getDamage()) / npc.getDef().hits; + + if (fig.isUseRanged()) { + fig.getPlayer().incExp(4, newXP * 4, true, true); + fig.getPlayer().getActionSender().sendStat(4); + continue; + } + switch (fig.getPlayer().getCombatStyle()) { + case 0: + for (int x = 0; x < 3; x++) { + fig.getPlayer().incExp(x, newXP, true, true); + fig.getPlayer().getActionSender().sendStat(x); + } + break; + case 1: + fig.getPlayer().incExp(2, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(2); + break; + case 2: + fig.getPlayer().incExp(0, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(0); + break; + case 3: + fig.getPlayer().incExp(1, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(1); + break; + } + fig.getPlayer().incExp(3, newXP, true, true); + fig.getPlayer().getActionSender().sendStat(3); + } + } + } + } + } else { + if (owner instanceof Player && affectedMob instanceof Npc) // We're ranging an NPC, so make it chase the player. + { + final Npc npc = (Npc) affectedMob; + final Player player = (Player) owner; + + if (npc.isBusy() || npc.getChasing() != null) + return; + + npc.resetPath(); + npc.setChasing(player); + + // Radius is 0 to prevent wallhacking by NPCs. Easiest + // method I + // can come up with for now. + Instance.getDelayedEventHandler().add(new WalkMobToMobEvent(affectedMob, owner, 0) { + public void arrived() { + if (affectedMob.isBusy() || player.isBusy()) { + npc.setChasing(null); + return; + } + + npc.resetPath(); + player.setBusy(true); + player.resetPath(); + player.resetAll(); + if (npc.isScripted()) + Instance.getPluginHandler().getNpcAIHandler(npc.getID()).onNpcAttack(npc, player); + player.setStatus(Action.FIGHTING_MOB); + player.getActionSender().sendSound("underattack"); + player.getActionSender().sendMessage("You are under attack!"); + + npc.setLocation(player.getLocation(), true); + for (Player p : npc.getViewArea().getPlayersInView()) + p.removeWatchedNpc(npc); + + player.setBusy(true); + player.setSprite(9); + player.setOpponent(npc); + player.setCombatTimer(); + + npc.setBusy(true); + npc.setSprite(8); + npc.setOpponent(player); + npc.setCombatTimer(); + + npc.setChasing(null); + + FightEvent fighting = new FightEvent(player, npc, true); + fighting.setLastRun(0); + Instance.getDelayedEventHandler().add(fighting); + } + + public void failed() { + npc.setChasing(null); + } + }); + } + } + } + } +} diff --git a/GameServer/src/msc/gs/event/ShortEvent.java b/GameServer/src/msc/gs/event/ShortEvent.java new file mode 100644 index 0000000..8239ae7 --- /dev/null +++ b/GameServer/src/msc/gs/event/ShortEvent.java @@ -0,0 +1,13 @@ +package msc.gs.event; + +import msc.gs.model.Player; + +public abstract class ShortEvent extends SingleEvent { + + public ShortEvent(Player owner) { + super(owner, 1500); + } + + public abstract void action(); + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/SingleEvent.java b/GameServer/src/msc/gs/event/SingleEvent.java new file mode 100644 index 0000000..0969fb9 --- /dev/null +++ b/GameServer/src/msc/gs/event/SingleEvent.java @@ -0,0 +1,22 @@ +package msc.gs.event; + +import msc.gs.model.Player; + +public abstract class SingleEvent extends DelayedEvent { + + public SingleEvent(Player owner, int delay) { + super(owner, delay); + } + + public SingleEvent(Player owner, int delay, Object[] arg) { + super(owner, delay, arg); + } + + public abstract void action(); + + public void run() { + action(); + super.matchRunning = false; + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/WalkMobToMobEvent.java b/GameServer/src/msc/gs/event/WalkMobToMobEvent.java new file mode 100644 index 0000000..a420c8f --- /dev/null +++ b/GameServer/src/msc/gs/event/WalkMobToMobEvent.java @@ -0,0 +1,92 @@ +package msc.gs.event; + +import msc.gs.external.NPCLoc; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Path; + +public abstract class WalkMobToMobEvent extends DelayedEvent { + protected Mob affectedMob; + private NPCLoc loc = null; + protected Mob owner; + private int radius; + private long startTime = 0L; + + public WalkMobToMobEvent(Mob owner, Mob affectedMob, int radius) { + super(null, 500); + + if (owner.isRemoved()) { + super.matchRunning = false; + return; + } + + if (owner instanceof Npc) { + Npc npc = (Npc) owner; + loc = npc.getLoc(); + + if (affectedMob.getX() < (loc.minX() - 4) || affectedMob.getX() > (loc.maxX() + 4) || affectedMob.getY() < (loc.minY() - 4) || affectedMob.getY() > (loc.maxY() + 4)) { + super.matchRunning = false; + return; + } + } + + this.owner = owner; + owner.setPath(new Path(owner.getX(), owner.getY(), affectedMob.getX(), affectedMob.getY())); + + this.affectedMob = affectedMob; + this.radius = radius; + + if (owner.withinRange(affectedMob, radius)) { + arrived(); + super.matchRunning = false; + return; + } + + startTime = System.currentTimeMillis(); + } + + public abstract void arrived(); + + public void failed() { + } + + public Mob getAffectedMob() { + return affectedMob; + } + + public final void run() { + if (owner.isRemoved()) { + super.matchRunning = false; + return; + } + + if (owner.withinRange(affectedMob, radius)) + arrived(); + else if (owner.hasMoved()) + return; // We're still moving + else { + if (System.currentTimeMillis() - startTime <= 10000) // Make NPCs + // give a 10 + // second + // chase + { + if (loc != null) { + if (affectedMob.getX() < (loc.minX() - 4) || affectedMob.getX() > (loc.maxX() + 4) || affectedMob.getY() < (loc.minY() - 4) || affectedMob.getY() > (loc.maxY() + 4)) { + super.matchRunning = false; + failed(); + return; + } + } + + if (owner.isBusy()) + return; + + owner.setPath(new Path(owner.getX(), owner.getY(), affectedMob.getX(), affectedMob.getY())); + return; + } else + failed(); + } + + super.matchRunning = false; + } +} diff --git a/GameServer/src/msc/gs/event/WalkToMobEvent.java b/GameServer/src/msc/gs/event/WalkToMobEvent.java new file mode 100644 index 0000000..c5372b6 --- /dev/null +++ b/GameServer/src/msc/gs/event/WalkToMobEvent.java @@ -0,0 +1,40 @@ +package msc.gs.event; + +import msc.gs.model.Mob; +import msc.gs.model.Player; + +public abstract class WalkToMobEvent extends DelayedEvent { + protected Mob affectedMob; + private int radius; + + public WalkToMobEvent(Player owner, Mob affectedMob, int radius) { + super(owner, 600); + this.affectedMob = affectedMob; + this.radius = radius; + if (owner.withinRange(affectedMob, radius)) { + arrived(); + super.matchRunning = false; + } + } + + public abstract void arrived(); + + public void failed() { + } // Not abstract as isn't required + + public Mob getAffectedMob() { + return affectedMob; + } + + public final void run() { + if (owner.withinRange(affectedMob, radius)) { + arrived(); + } else if (owner.hasMoved()) { + return; // We're still moving + } else { + failed(); + } + super.matchRunning = false; + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/WalkToObjectEvent.java b/GameServer/src/msc/gs/event/WalkToObjectEvent.java new file mode 100644 index 0000000..2a2c5d0 --- /dev/null +++ b/GameServer/src/msc/gs/event/WalkToObjectEvent.java @@ -0,0 +1,35 @@ +package msc.gs.event; + +import msc.gs.model.GameObject; +import msc.gs.model.Player; + +public abstract class WalkToObjectEvent extends DelayedEvent { + protected GameObject object; + private boolean stop; + + public WalkToObjectEvent(Player owner, GameObject object, boolean stop) { + super(owner, 601); + this.object = object; + this.stop = stop; + if (stop && owner.atObject(object)) { + owner.resetPath(); + arrived(); + super.matchRunning = false; + } + } + + public abstract void arrived(); + + public final void run() { + if (stop && owner.atObject(object)) { + owner.resetPath(); + arrived(); + } else if (owner.hasMoved()) { + return; // We're still moving + } else if (owner.atObject(object)) { + arrived(); + } + super.matchRunning = false; + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/event/WalkToPointEvent.java b/GameServer/src/msc/gs/event/WalkToPointEvent.java new file mode 100644 index 0000000..e931708 --- /dev/null +++ b/GameServer/src/msc/gs/event/WalkToPointEvent.java @@ -0,0 +1,41 @@ +package msc.gs.event; + +import msc.gs.model.Player; +import msc.gs.model.Point; + +public abstract class WalkToPointEvent extends DelayedEvent { + protected Point location; + private int radius; + private boolean stop; + + public WalkToPointEvent(Player owner, Point location, int radius, boolean stop) { + super(owner, 500); + this.location = location; + this.radius = radius; + this.stop = stop; + if (stop && owner.withinRange(location, radius)) { + owner.resetPath(); + arrived(); + super.matchRunning = false; + } + } + + public abstract void arrived(); + + public Point getLocation() { + return location; + } + + public final void run() { + if (stop && owner.withinRange(location, radius)) { + owner.resetPath(); + arrived(); + } else if (owner.hasMoved()) { + return; // We're still moving + } else if (owner.withinRange(location, radius)) { + arrived(); + } + super.matchRunning = false; + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/AgilityCourseDef.java b/GameServer/src/msc/gs/external/AgilityCourseDef.java new file mode 100644 index 0000000..d6b36e4 --- /dev/null +++ b/GameServer/src/msc/gs/external/AgilityCourseDef.java @@ -0,0 +1,84 @@ +package msc.gs.external; + +/** + * Defines an agility course + */ +public class AgilityCourseDef { + /** + * Ending object ID + */ + public int endID; + /** + * Ending object x + */ + public int endX; + /** + * Ending object y + */ + public int endY; + /** + * The exp reward for completing this course + */ + public int exp; + /** + * This course's name + */ + public String name; + /** + * Starting object x + */ + public int startX; + /** + * Starting object y + */ + public int startY; + + /** + * @return the end ID + */ + public int getEndID() { + return endID; + } + + /** + * @return the end x + */ + public int getEndX() { + return endX; + } + + /** + * @return the end y + */ + public int getEndY() { + return endY; + } + + /** + * @return the exp reward + */ + public int getExp() { + return exp; + } + + /** + * @return this course's name + */ + public String getName() { + return name; + } + + /** + * @return the starting object x + */ + public int getStartX() { + return startX; + } + + /** + * @return the starting object y + */ + public int getStartY() { + return startY; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/AgilityDef.java b/GameServer/src/msc/gs/external/AgilityDef.java new file mode 100644 index 0000000..e447207 --- /dev/null +++ b/GameServer/src/msc/gs/external/AgilityDef.java @@ -0,0 +1,128 @@ +package msc.gs.external; + +/** + * Defines an agility course object + */ +public class AgilityDef { + /** + * Can you fail this obstacle? + */ + public boolean canFail; + /** + * The xp you get for doing this obstacle safely + */ + public int exp; + /** + * The fail x coord + */ + public int failX; + /** + * The fail y coord + */ + public int failY; + /** + * What message does this object spew to the client? + */ + public String message; + /** + * What order this object is in the obstacle course + */ + public int order; + /** + * Required level + */ + public int reqLevel; + /** + * Tele x coord + */ + public int toX; + /** + * Tele y coord + */ + public int toY; + /** + * The x coord + */ + public int x; + /** + * The y coord + */ + public int y; + + /** + * @return if you can fail this def + */ + public boolean canFail() { + return canFail; + } + + /** + * @return the xp you get for doing this agility object + */ + public int getExp() { + return exp; + } + + /** + * @return the fail x coord we go to if we fail + */ + public int getFailX() { + return failX; + } + + /** + * @return the fail y coord we go to if we fail + */ + public int getFailY() { + return failY; + } + + /** + * @return the object's message + */ + public String getMessage() { + return message; + } + + /** + * @return the order of this agility object + */ + public int getOrder() { + return order; + } + + /** + * @return this def's required level + */ + public int getReqLevel() { + return reqLevel; + } + + /** + * @return this def's tele x + */ + public int getToX() { + return toX; + } + + /** + * @return this def's tele y + */ + public int getToY() { + return toY; + } + + /** + * @return this def's x coord + */ + public int getX() { + return x; + } + + /** + * @return this def's y coord + */ + public int getY() { + return y; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/CertDef.java b/GameServer/src/msc/gs/external/CertDef.java new file mode 100644 index 0000000..3d2740a --- /dev/null +++ b/GameServer/src/msc/gs/external/CertDef.java @@ -0,0 +1,28 @@ +package msc.gs.external; + +public class CertDef { + /** + * The ID of the certificate + */ + public int certID; + /** + * The ID of the assosiated item + */ + public int itemID; + /** + * The name of the item this cert is for + */ + public String name; + + public int getCertID() { + return certID; + } + + public int getItemID() { + return itemID; + } + + public String getName() { + return name; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/CerterDef.java b/GameServer/src/msc/gs/external/CerterDef.java new file mode 100644 index 0000000..c1c938d --- /dev/null +++ b/GameServer/src/msc/gs/external/CerterDef.java @@ -0,0 +1,38 @@ +package msc.gs.external; + +public class CerterDef { + /** + * Certs this stall can deal with + */ + private CertDef[] certs; + /** + * Type of stall + */ + private String type; + + public int getCertID(int index) { + if (index < 0 || index >= certs.length) { + return -1; + } + return certs[index].getCertID(); + } + + public String[] getCertNames() { + String[] names = new String[certs.length]; + for (int i = 0; i < certs.length; i++) { + names[i] = certs[i].getName(); + } + return names; + } + + public int getItemID(int index) { + if (index < 0 || index >= certs.length) { + return -1; + } + return certs[index].getItemID(); + } + + public String getType() { + return type; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/DoorDef.java b/GameServer/src/msc/gs/external/DoorDef.java new file mode 100644 index 0000000..cffc257 --- /dev/null +++ b/GameServer/src/msc/gs/external/DoorDef.java @@ -0,0 +1,56 @@ +package msc.gs.external; + +/** + * The definition wrapper for doors + */ +public class DoorDef extends EntityDef { + + /** + * The first command of the door + */ + public String command1; + /** + * The second command of the door + */ + public String command2; + /** + * The doors type. + */ + public int doorType; + public int modelVar1; + + public int modelVar2; + public int modelVar3; + /** + * Unknown + */ + public int unknown; + + public String getCommand1() { + return command1.toLowerCase(); + } + + public String getCommand2() { + return command2.toLowerCase(); + } + + public int getDoorType() { + return doorType; + } + + public int getModelVar1() { + return modelVar1; + } + + public int getModelVar2() { + return modelVar2; + } + + public int getModelVar3() { + return modelVar3; + } + + public int getUnknown() { + return unknown; + } +} diff --git a/GameServer/src/msc/gs/external/EntityDef.java b/GameServer/src/msc/gs/external/EntityDef.java new file mode 100644 index 0000000..1bf705a --- /dev/null +++ b/GameServer/src/msc/gs/external/EntityDef.java @@ -0,0 +1,31 @@ +package msc.gs.external; + +/** + * The abstract class EntityDef implements methods for return values which are + * shared between entities. + */ +public abstract class EntityDef { + + /** + * The description of the entity + */ + public String description; + /** + * The name of the entity + */ + public String name; + + /** + * Returns the description of the entity + */ + public String getDescription() { + return description; + } + + /** + * Returns the name of the entity + */ + public String getName() { + return name; + } +} diff --git a/GameServer/src/msc/gs/external/EntityHandler.java b/GameServer/src/msc/gs/external/EntityHandler.java new file mode 100644 index 0000000..5590985 --- /dev/null +++ b/GameServer/src/msc/gs/external/EntityHandler.java @@ -0,0 +1,418 @@ +package msc.gs.external; + +import java.util.HashMap; +import java.util.List; + +import msc.gs.model.Point; +import msc.gs.model.TelePoint; +import msc.gs.util.PersistenceManager; + +/** + * This class handles the loading of entities from the conf files, and provides + * methods for relaying these entities to the user. + */ +@SuppressWarnings("unchecked") +public class EntityHandler { + + private static HashMap agilityCourses; + private static HashMap agilityObjects; + private static HashMap arrowHeads; + private static HashMap bowString; + private static HashMap certers; + private static HashMap dartTips; + + private static DoorDef[] doors; + private static HashMap firemaking; + private static GameObjectDef[] gameObjects; + private static HashMap gems; + private static ItemHerbSecond[] herbSeconds; + private static HashMap itemAffectedTypes; + private static HashMap itemCooking; + private static ItemCraftingDef[] itemCrafting; + private static HashMap itemEdibleHeals; + private static HashMap itemHerb; + private static ItemDef[] items; + private static HashMap itemSmelting; + private static ItemSmithingDef[] itemSmithing; + private static HashMap itemUnIdentHerb; + private static HashMap itemWieldable; + private static List[] keyChestLoots; + private static HashMap logCut; + + private static NPCDef[] npcs; + private static HashMap objectFishing; + + private static HashMap objectMining; + private static HashMap objectTelePoints; + private static HashMap objectWoodcutting; + private static PrayerDef[] prayers; + private static HashMap spellAggressiveLvl; + private static SpellDef[] spells; + private static TileDef[] tiles; + + static { + doors = (DoorDef[]) PersistenceManager.load("defs/DoorDef.xml.gz"); + gameObjects = (GameObjectDef[]) PersistenceManager.load("defs/GameObjectDef.xml.gz"); + npcs = (NPCDef[]) PersistenceManager.load("defs/NPCDef.xml.gz"); + for (NPCDef n : npcs) { + if (n.isAttackable()) { + n.respawnTime -= (n.respawnTime / 3); + } + } + prayers = (PrayerDef[]) PersistenceManager.load("defs/PrayerDef.xml.gz"); + items = (ItemDef[]) PersistenceManager.load("defs/ItemDef.xml.gz"); + spells = (SpellDef[]) PersistenceManager.load("defs/SpellDef.xml.gz"); + tiles = (TileDef[]) PersistenceManager.load("defs/TileDef.xml.gz"); + keyChestLoots = (List[]) PersistenceManager.load("defs/extras/KeyChestLoot.xml.gz"); + herbSeconds = (ItemHerbSecond[]) PersistenceManager.load("defs/extras/ItemHerbSecond.xml.gz"); + dartTips = (HashMap) PersistenceManager.load("defs/extras/ItemDartTipDef.xml.gz"); + gems = (HashMap) PersistenceManager.load("defs/extras/ItemGemDef.xml.gz"); + logCut = (HashMap) PersistenceManager.load("defs/extras/ItemLogCutDef.xml.gz"); + bowString = (HashMap) PersistenceManager.load("defs/extras/ItemBowStringDef.xml.gz"); + arrowHeads = (HashMap) PersistenceManager.load("defs/extras/ItemArrowHeadDef.xml.gz"); + firemaking = (HashMap) PersistenceManager.load("defs/extras/FiremakingDef.xml.gz"); + itemAffectedTypes = (HashMap) PersistenceManager.load("defs/extras/ItemAffectedTypes.xml.gz"); + itemWieldable = (HashMap) PersistenceManager.load("defs/extras/ItemWieldableDef.xml.gz"); + itemUnIdentHerb = (HashMap) PersistenceManager.load("defs/extras/ItemUnIdentHerbDef.xml.gz"); + itemHerb = (HashMap) PersistenceManager.load("defs/extras/ItemHerbDef.xml.gz"); + itemEdibleHeals = (HashMap) PersistenceManager.load("defs/extras/ItemEdibleHeals.xml.gz"); + itemCooking = (HashMap) PersistenceManager.load("defs/extras/ItemCookingDef.xml.gz"); + itemSmelting = (HashMap) PersistenceManager.load("defs/extras/ItemSmeltingDef.xml.gz"); + itemSmithing = (ItemSmithingDef[]) PersistenceManager.load("defs/extras/ItemSmithingDef.xml.gz"); + itemCrafting = (ItemCraftingDef[]) PersistenceManager.load("defs/extras/ItemCraftingDef.xml.gz"); + objectMining = (HashMap) PersistenceManager.load("defs/extras/ObjectMining.xml.gz"); + objectWoodcutting = (HashMap) PersistenceManager.load("defs/extras/ObjectWoodcutting.xml.gz"); + objectFishing = (HashMap) PersistenceManager.load("defs/extras/ObjectFishing.xml.gz"); + spellAggressiveLvl = (HashMap) PersistenceManager.load("defs/extras/SpellAggressiveLvl.xml.gz"); + objectTelePoints = (HashMap) PersistenceManager.load("locs/extras/ObjectTelePoints.xml.gz"); + certers = (HashMap) PersistenceManager.load("defs/extras/NpcCerters.xml.gz"); + agilityObjects = (HashMap) PersistenceManager.load("defs/extras/AgilityDef.xml.gz"); + agilityCourses = (HashMap) PersistenceManager.load("defs/extras/AgilityCourseDef.xml.gz"); + } + + /** + * @param id + * the agility courses's start ID + * @return the AgilityCourseDef with the given start ID + */ + public static AgilityCourseDef getAgilityCourseDef(int id) { + return agilityCourses.get(id); + } + + /** + * @param id + * the agility object's ID + * @return the AgilityDef with the given object ID + */ + public static AgilityDef getAgilityDef(int id) { + return agilityObjects.get(id); + } + + /** + * @param id + * the npcs ID + * @return the CerterDef for the given npc + */ + public static CerterDef getCerterDef(int id) { + return certers.get(id); + } + + /** + * @return the ItemCraftingDef for the requested item + */ + public static ItemCraftingDef getCraftingDef(int id) { + if (id < 0 || id >= itemCrafting.length) { + return null; + } + return itemCrafting[id]; + } + + /** + * @param id + * the entities ID + * @return the DoorDef with the given ID + */ + public static DoorDef getDoorDef(int id) { + if (id < 0 || id >= doors.length) { + return null; + } + return doors[id]; + } + + /** + * @return the FiremakingDef for the given log + */ + public static FiremakingDef getFiremakingDef(int id) { + return firemaking.get(id); + } + + /** + * @param id + * the entities ID + * @return the GameObjectDef with the given ID + */ + public static GameObjectDef getGameObjectDef(int id) { + if (id < 0 || id >= gameObjects.length) { + return null; + } + return gameObjects[id]; + } + + /** + * @param the + * items type + * @return the types of items affected + */ + public static int[] getItemAffectedTypes(int type) { + return itemAffectedTypes.get(type); + } + + /** + * @return the ItemArrowHeadDef for the given arrow + */ + public static ItemArrowHeadDef getItemArrowHeadDef(int id) { + return arrowHeads.get(id); + } + + /** + * @return the ItemBowStringDef for the given bow + */ + public static ItemBowStringDef getItemBowStringDef(int id) { + return bowString.get(id); + } + + /** + * @param id + * the entities ID + * @return the ItemCookingDef with the given ID + */ + public static ItemCookingDef getItemCookingDef(int id) { + return itemCooking.get(id); + } + + /** + * @return the ItemDartTipDef for the given tip + */ + public static ItemDartTipDef getItemDartTipDef(int id) { + return dartTips.get(id); + } + + /** + * @param id + * the entities ID + * @return the ItemDef with the given ID + */ + public static ItemDef getItemDef(int id) { + if (id < 0 || id >= items.length) { + return null; + } + return items[id]; + } + + /** + * @param the + * items id + * @return the amount eating the item should heal + */ + public static int getItemEdibleHeals(int id) { + Integer heals = itemEdibleHeals.get(id); + if (heals != null) { + return heals.intValue(); + } + return 0; + } + + /** + * @return the ItemGemDef for the given gem + */ + public static ItemGemDef getItemGemDef(int id) { + return gems.get(id); + } + + /** + * @param id + * the entities ID + * @return the ItemHerbDef with the given ID + */ + public static ItemHerbDef getItemHerbDef(int id) { + return itemHerb.get(id); + } + + /** + * @return the ItemHerbSecond for the given second ingredient + */ + public static ItemHerbSecond getItemHerbSecond(int secondID, int unfinishedID) { + for (ItemHerbSecond def : herbSeconds) { + if (def.getSecondID() == secondID && def.getUnfinishedID() == unfinishedID) { + return def; + } + } + return null; + } + + /** + * @return the ItemLogCutDef for the given log + */ + public static ItemLogCutDef getItemLogCutDef(int id) { + return logCut.get(id); + } + + /** + * @param id + * the entities ID + * @return the ItemSmeltingDef with the given ID + */ + public static ItemSmeltingDef getItemSmeltingDef(int id) { + return itemSmelting.get(id); + } + + /** + * @param id + * the entities ID + * @return the ItemUnIdentHerbDef with the given ID + */ + public static ItemUnIdentHerbDef getItemUnIdentHerbDef(int id) { + return itemUnIdentHerb.get(id); + } + + /** + * @param id + * the entities ID + * @return the ItemWieldableDef with the given ID + */ + public static ItemWieldableDef getItemWieldableDef(int id) { + return itemWieldable.get(id); + } + + public static List[] getKeyChestLoots() { + return keyChestLoots; + } + + /** + * @param id + * the entities ID + * @return the NPCDef with the given ID + */ + public static NPCDef getNpcDef(int id) { + if (id < 0 || id >= npcs.length) { + return null; + } + return npcs[id]; + } + + /** + * @param id + * the entities ID + * @return the ObjectFishingDef with the given ID + */ + public static ObjectFishingDef getObjectFishingDef(int id, int click) { + ObjectFishingDef[] defs = objectFishing.get(id); + if (defs == null) { + return null; + } + return defs[click]; + } + + /** + * @param id + * the entities ID + * @return the ObjectMiningDef with the given ID + */ + public static ObjectMiningDef getObjectMiningDef(int id) { + return objectMining.get(id); + } + + /** + * @param the + * point we are currently at + * @return the point we should be teleported to + */ + public static Point getObjectTelePoint(Point location, String command) { + TelePoint point = objectTelePoints.get(location); + if (point == null) { + return null; + } + if (command == null || point.getCommand().equalsIgnoreCase(command)) { + return point; + } + return null; + } + + /** + * @param id + * the entities ID + * @return the ObjectWoodcuttingDef with the given ID + */ + public static ObjectWoodcuttingDef getObjectWoodcuttingDef(int id) { + return objectWoodcutting.get(id); + } + + /** + * @param id + * the entities ID + * @return the PrayerDef with the given ID + */ + public static PrayerDef getPrayerDef(int id) { + if (id < 0 || id >= prayers.length) { + return null; + } + return prayers[id]; + } + + /** + * @return the ItemSmithingDef for the requested item + */ + public static ItemSmithingDef getSmithingDef(int id) { + if (id < 0 || id >= itemSmithing.length) { + return null; + } + return itemSmithing[id]; + } + /** + * @return the ItemSmithingDef for the requested item + */ + public static ItemSmithingDef getSmithingDefbyID(int itemID) { + for(ItemSmithingDef i : itemSmithing) { + if(i.itemID == itemID) + return i; + } + return null; + } + + /** + * @param the + * spells id + * @return the lvl of the spell (for calculating what it hits) + */ + public static int getSpellAggressiveLvl(int id) { + Integer lvl = spellAggressiveLvl.get(id); + if (lvl != null) { + return lvl.intValue(); + } + return 0; + } + + /** + * @param id + * the entities ID + * @return the SpellDef with the given ID + */ + public static SpellDef getSpellDef(int id) { + if (id < 0 || id >= spells.length) { + return null; + } + return spells[id]; + } + + /** + * @param id + * the entities ID + * @return the TileDef with the given ID + */ + public static TileDef getTileDef(int id) { + if (id < 0 || id >= tiles.length) { + return null; + } + return tiles[id]; + } +} diff --git a/GameServer/src/msc/gs/external/FiremakingDef.java b/GameServer/src/msc/gs/external/FiremakingDef.java new file mode 100644 index 0000000..4952fe4 --- /dev/null +++ b/GameServer/src/msc/gs/external/FiremakingDef.java @@ -0,0 +1,28 @@ +package msc.gs.external; + +public class FiremakingDef { + /** + * The exp given by these logs + */ + public int exp; + /** + * How many ms the fire should last for + */ + public int length; + /** + * The firemaking level required to light these logs + */ + public int level; + + public int getExp() { + return exp; + } + + public int getLength() { + return length * 1000; + } + + public int getRequiredLevel() { + return level; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/GameObjectDef.java b/GameServer/src/msc/gs/external/GameObjectDef.java new file mode 100644 index 0000000..cc49e6c --- /dev/null +++ b/GameServer/src/msc/gs/external/GameObjectDef.java @@ -0,0 +1,63 @@ +package msc.gs.external; + +/** + * The definition wrapper for game objects + */ +public class GameObjectDef extends EntityDef { + + /** + * The first command of the object + */ + public String command1; + /** + * The second command of the object + */ + public String command2; + /** + * Can't figure out what this one is for, either. + */ + public int groundItemVar; + /** + * The height of the object + */ + public int height; + public String objectModel; + /** + * The object type. Can't figure out the significance of it. Item type 2 & 3 + * seem to be special + */ + public int type; + + /** + * The width of the object + */ + public int width; + + public String getCommand1() { + return command1.toLowerCase(); + } + + public String getCommand2() { + return command2.toLowerCase(); + } + + public int getGroundItemVar() { + return groundItemVar; + } + + public int getHeight() { + return height; + } + + public String getObjectModel() { + return objectModel; + } + + public int getType() { + return type; + } + + public int getWidth() { + return width; + } +} diff --git a/GameServer/src/msc/gs/external/GameObjectLoc.java b/GameServer/src/msc/gs/external/GameObjectLoc.java new file mode 100644 index 0000000..e99ef65 --- /dev/null +++ b/GameServer/src/msc/gs/external/GameObjectLoc.java @@ -0,0 +1,52 @@ +package msc.gs.external; + +public class GameObjectLoc { + /** + * The direction it faces + */ + public int direction; + /** + * The id of the gameObject + */ + public int id; + /** + * Type of object - 0: Object, 1: WallObject + */ + public int type; + /** + * The objects x coord + */ + public int x; + /** + * The objects y coord + */ + public int y; + + public GameObjectLoc(int id, int x, int y, int direction, int type) { + this.id = id; + this.x = x; + this.y = y; + this.direction = direction; + this.type = type; + } + + public int getDirection() { + return direction; + } + + public int getId() { + return id; + } + + public int getType() { + return type; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } +} diff --git a/GameServer/src/msc/gs/external/ItemArrowHeadDef.java b/GameServer/src/msc/gs/external/ItemArrowHeadDef.java new file mode 100644 index 0000000..27d4bf4 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemArrowHeadDef.java @@ -0,0 +1,32 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemArrowHeadDef { + + /** + * The ID of the arrow created + */ + public int arrowID; + /** + * The exp given by attaching this arrow head + */ + public double exp; + /** + * The level required to attach this head to an arrow + */ + public int requiredLvl; + + public int getArrowID() { + return arrowID; + } + + public double getExp() { + return exp; + } + + public int getReqLevel() { + return requiredLvl; + } +} diff --git a/GameServer/src/msc/gs/external/ItemBowStringDef.java b/GameServer/src/msc/gs/external/ItemBowStringDef.java new file mode 100644 index 0000000..6dfcd13 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemBowStringDef.java @@ -0,0 +1,32 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemBowStringDef { + + /** + * The ID of the bow created + */ + public int bowID; + /** + * The exp given by attaching this bow string + */ + public int exp; + /** + * The level required to attach this bow string + */ + public int requiredLvl; + + public int getBowID() { + return bowID; + } + + public int getExp() { + return exp; + } + + public int getReqLevel() { + return requiredLvl; + } +} diff --git a/GameServer/src/msc/gs/external/ItemCookingDef.java b/GameServer/src/msc/gs/external/ItemCookingDef.java new file mode 100644 index 0000000..f57e506 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemCookingDef.java @@ -0,0 +1,41 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemCookingDef { + + /** + * The id of the burned version + */ + public int burnedId; + /** + * The id of the cooked version + */ + public int cookedId; + /** + * The exp cooking this item gives + */ + public int exp; + /** + * The level required to cook this + */ + public int requiredLvl; + + public int getBurnedId() { + return burnedId; + } + + public int getCookedId() { + return cookedId; + } + + public int getExp() { + return exp; + } + + public int getReqLevel() { + return requiredLvl; + } + +} diff --git a/GameServer/src/msc/gs/external/ItemCraftingDef.java b/GameServer/src/msc/gs/external/ItemCraftingDef.java new file mode 100644 index 0000000..39cba19 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemCraftingDef.java @@ -0,0 +1,28 @@ +package msc.gs.external; + +public class ItemCraftingDef { + /** + * The exp given + */ + public int exp; + /** + * The ID of the item produced + */ + public int itemID; + /** + * The crafting level required to make this item + */ + public int requiredLvl; + + public int getExp() { + return exp; + } + + public int getItemID() { + return itemID; + } + + public int getReqLevel() { + return requiredLvl; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/ItemDartTipDef.java b/GameServer/src/msc/gs/external/ItemDartTipDef.java new file mode 100644 index 0000000..0094e1d --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemDartTipDef.java @@ -0,0 +1,32 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemDartTipDef { + + /** + * The ID of the arrow created + */ + public int dartID; + /** + * The exp given by attaching this arrow head + */ + public double exp; + /** + * The level required to attach this head to an arrow + */ + public int requiredLvl; + + public int getDartID() { + return dartID; + } + + public double getExp() { + return exp; + } + + public int getReqLevel() { + return requiredLvl; + } +} diff --git a/GameServer/src/msc/gs/external/ItemDef.java b/GameServer/src/msc/gs/external/ItemDef.java new file mode 100644 index 0000000..5d8a62c --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemDef.java @@ -0,0 +1,75 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemDef extends EntityDef { + /** + * The base price of the object + */ + public int basePrice; + /** + * The command of the object + */ + public String command; + /** + * PictureMask + */ + public int mask; + /** + * Is this item a member's item? + */ + public boolean members; + /** + * The sprite id + */ + public int sprite; + /** + * Whether the item is stackable or not + */ + public boolean stackable; + /** + * Is this item tradeable? + */ + public boolean trade; + /** + * Whether the item is wieldable or not + */ + public int wieldable; + + public boolean canTrade() { + return trade; + } + + public int getBasePrice() { + return basePrice; + } + + public String getCommand() { + return command; + } + + public String getCommandType() { + return wieldable == 16 ? "Wield" : "Wear"; + } + + public int getPictureMask() { + return mask; + } + + public int getSprite() { + return sprite; + } + + public boolean isMembers() { + return members; + } + + public boolean isStackable() { + return stackable; + } + + public boolean isWieldable() { + return wieldable > 0; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/ItemDropDef.java b/GameServer/src/msc/gs/external/ItemDropDef.java new file mode 100644 index 0000000..a59c195 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemDropDef.java @@ -0,0 +1,25 @@ +package msc.gs.external; + +public class ItemDropDef { + public int amount; + public int id; + public int weight; + + public ItemDropDef(int id, int amount, int weight) { + this.id = id; + this.amount = amount; + this.weight = weight; + } + + public int getAmount() { + return amount; + } + + public int getID() { + return id; + } + + public int getWeight() { + return weight; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/ItemGemDef.java b/GameServer/src/msc/gs/external/ItemGemDef.java new file mode 100644 index 0000000..234da0e --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemGemDef.java @@ -0,0 +1,32 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemGemDef { + + /** + * The exp given by attaching this bow string + */ + public int exp; + /** + * The ID of the gem + */ + public int gemID; + /** + * The level required to attach this bow string + */ + public int requiredLvl; + + public int getExp() { + return exp; + } + + public int getGemID() { + return gemID; + } + + public int getReqLevel() { + return requiredLvl; + } +} diff --git a/GameServer/src/msc/gs/external/ItemHerbDef.java b/GameServer/src/msc/gs/external/ItemHerbDef.java new file mode 100644 index 0000000..38573a6 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemHerbDef.java @@ -0,0 +1,33 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemHerbDef { + + /** + * The exp smelting this item gives + */ + public int exp; + /** + * The id of the related potion + */ + public int potionId; + /** + * The level required to make this + */ + public int requiredLvl; + + public int getExp() { + return exp; + } + + public int getPotionId() { + return potionId; + } + + public int getReqLevel() { + return requiredLvl; + } + +} diff --git a/GameServer/src/msc/gs/external/ItemHerbSecond.java b/GameServer/src/msc/gs/external/ItemHerbSecond.java new file mode 100644 index 0000000..46bd4fe --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemHerbSecond.java @@ -0,0 +1,48 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemHerbSecond { + + /** + * The exp given completing this potion + */ + public int exp; + /** + * The ID of the potion created + */ + public int potionID; + /** + * The level required to complete this potion + */ + public int requiredLvl; + /** + * The ID of the second ingredient + */ + public int secondID; + /** + * The ID of the unfinished potion required + */ + public int unfinishedID; + + public int getExp() { + return exp; + } + + public int getPotionID() { + return potionID; + } + + public int getReqLevel() { + return requiredLvl; + } + + public int getSecondID() { + return secondID; + } + + public int getUnfinishedID() { + return unfinishedID; + } +} diff --git a/GameServer/src/msc/gs/external/ItemLoc.java b/GameServer/src/msc/gs/external/ItemLoc.java new file mode 100644 index 0000000..f3f4390 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemLoc.java @@ -0,0 +1,44 @@ +package msc.gs.external; + +public class ItemLoc { + /** + * Amount of item (stackables) + */ + public int amount; + /** + * The id of the gameObject + */ + public int id; + /** + * How long the item takes to spawn + */ + public int respawnTime; + /** + * The objects x coord + */ + public int x; + /** + * The objects y coord + */ + public int y; + + public int getAmount() { + return amount; + } + + public int getId() { + return id; + } + + public int getRespawnTime() { + return respawnTime; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } +} diff --git a/GameServer/src/msc/gs/external/ItemLogCutDef.java b/GameServer/src/msc/gs/external/ItemLogCutDef.java new file mode 100644 index 0000000..962d367 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemLogCutDef.java @@ -0,0 +1,55 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemLogCutDef { + + public int longbowExp; + public int longbowID; + public int longbowLvl; + + public int shaftAmount; + public int shaftLvl; + public int shortbowExp; + + public int shortbowID; + public int shortbowLvl; + + public int getLongbowExp() { + return longbowExp; + } + + public int getLongbowID() { + return longbowID; + } + + public int getLongbowLvl() { + return longbowLvl; + } + + public int getShaftAmount() { + return shaftAmount; + } + + public int getShaftExp() { + return shaftAmount; + } + + public int getShaftLvl() { + return shaftLvl; + } + + public int getShortbowExp() { + return shortbowExp; + } + + public int getShortbowID() { + return shortbowID; + } + + public int getShortbowLvl() { + return shortbowLvl; + } + +} diff --git a/GameServer/src/msc/gs/external/ItemSmeltingDef.java b/GameServer/src/msc/gs/external/ItemSmeltingDef.java new file mode 100644 index 0000000..a871e77 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemSmeltingDef.java @@ -0,0 +1,41 @@ +package msc.gs.external; + +/** + * The definition wrapper for items + */ +public class ItemSmeltingDef { + + /** + * The id of the related bar + */ + public int barId; + /** + * The exp smelting this item gives + */ + public int exp; + /** + * The ores required in addition to this one + */ + public ReqOreDef[] reqOres; + /** + * The level required to smelt this + */ + public int requiredLvl; + + public int getBarId() { + return barId; + } + + public int getExp() { + return exp; + } + + public int getReqLevel() { + return requiredLvl; + } + + public ReqOreDef[] getReqOres() { + return reqOres; + } + +} diff --git a/GameServer/src/msc/gs/external/ItemSmithingDef.java b/GameServer/src/msc/gs/external/ItemSmithingDef.java new file mode 100644 index 0000000..4abdd7c --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemSmithingDef.java @@ -0,0 +1,36 @@ +package msc.gs.external; + +public class ItemSmithingDef { + /** + * The amount of the item produced + */ + public int amount; + /** + * How many bars are required + */ + public int bars; + /** + * The ID of the item produced + */ + public int itemID; + /** + * The smithing level required to make this item + */ + public int level; + + public int getAmount() { + return amount; + } + + public int getItemID() { + return itemID; + } + + public int getRequiredBars() { + return bars; + } + + public int getRequiredLevel() { + return level; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/external/ItemUnIdentHerbDef.java b/GameServer/src/msc/gs/external/ItemUnIdentHerbDef.java new file mode 100644 index 0000000..9881481 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemUnIdentHerbDef.java @@ -0,0 +1,33 @@ +package msc.gs.external; + +/** + * The definition wrapper for herbs + */ +public class ItemUnIdentHerbDef { + + /** + * How much experience identifying gives + */ + public int exp; + /** + * The id of the herb this turns into + */ + private int newId; + /** + * Herblaw level required to identify + */ + public int requiredLvl; + + public int getExp() { + return exp; + } + + public int getLevelRequired() { + return requiredLvl; + } + + public int getNewId() { + return newId; + } + +} diff --git a/GameServer/src/msc/gs/external/ItemWieldableDef.java b/GameServer/src/msc/gs/external/ItemWieldableDef.java new file mode 100644 index 0000000..d062e64 --- /dev/null +++ b/GameServer/src/msc/gs/external/ItemWieldableDef.java @@ -0,0 +1,108 @@ +package msc.gs.external; + +import java.util.HashMap; +import java.util.Set; +import java.util.Map.Entry; + +/** + * The definition wrapper for items + */ +public class ItemWieldableDef { + + /** + * How many armour points should be given + */ + public int armourPoints; + /** + * If the item can only be worn by females (used for female plates) + */ + private boolean femaleOnly; + /** + * How many magic points should be given + */ + public int magicPoints; + /** + * How many prayer points should be given + */ + public int prayerPoints; + /** + * How many range points should be given + */ + public int rangePoints; + /** + * The level of each stat required to wield + */ + public HashMap requiredStats; + /** + * Sprite Id of the item + */ + public int sprite; + /** + * Type of item + */ + public int type; + /** + * How many weapon aim points should be given + */ + public int weaponAimPoints; + /** + * How many weapon power points should be given + */ + public int weaponPowerPoints; + /** + * Body position the item is drawn on + */ + private int wieldPos; + + public boolean femaleOnly() { + return femaleOnly; + } + + public int[] getAffectedTypes() { + int[] affectedTypes = EntityHandler.getItemAffectedTypes(type); + if (affectedTypes != null) { + return affectedTypes; + } + return new int[0]; + } + + public int getArmourPoints() { + return armourPoints; + } + + public int getMagicPoints() { + return magicPoints; + } + + public int getPrayerPoints() { + return prayerPoints; + } + + public int getRangePoints() { + return rangePoints; + } + + public int getSprite() { + return sprite; + } + + public Set> getStatsRequired() { + return requiredStats.entrySet(); + } + + public int getType() { + return type; + } + + public int getWeaponAimPoints() { + return weaponAimPoints; + } + + public int getWeaponPowerPoints() { + return weaponPowerPoints; + } + + public int getWieldPos() { + return wieldPos; + } +} diff --git a/GameServer/src/msc/gs/external/NPCDef.java b/GameServer/src/msc/gs/external/NPCDef.java new file mode 100644 index 0000000..9c3550f --- /dev/null +++ b/GameServer/src/msc/gs/external/NPCDef.java @@ -0,0 +1,151 @@ +package msc.gs.external; + +/** + * The definition wrapper for npcs + */ +public class NPCDef extends EntityDef { + /** + * Whether the npc is aggressive + */ + public boolean aggressive; + /** + * The attack lvl + */ + public int attack; + /** + * Whether the npc is attackable + */ + public boolean attackable; + /** + * Colour of our legs + */ + public int bottomColour; + /** + * Something to do with the camera + */ + public int camera1, camera2; + /** + * The primary command + */ + public String command; + /** + * The def lvl + */ + public int defense; + /** + * Possible drops + */ + public ItemDropDef[] drops; + /** + * Colour of our hair + */ + public int hairColour; + /** + * The hit points + */ + public int hits; + /** + * How long the npc takes to respawn + */ + public int respawnTime; + /** + * Skin colour + */ + public int skinColour; + /** + * Sprites used to make up this npc + */ + public int[] sprites; + /** + * The strength lvl + */ + public int strength; + /** + * Colour of our top + */ + public int topColour; + /** + * Something to do with models + */ + public int walkModel, combatModel, combatSprite; + + public int getAtt() { + return attack; + } + + public int getBottomColour() { + return bottomColour; + } + + public int getCamera1() { + return camera1; + } + + public int getCamera2() { + return camera2; + } + + public int getCombatModel() { + return combatModel; + } + + public int getCombatSprite() { + return combatSprite; + } + + public String getCommand() { + return command; + } + + public int getDef() { + return defense; + } + + public ItemDropDef[] getDrops() { + return drops; + } + + public int getHairColour() { + return hairColour; + } + + public int getHits() { + return hits; + } + + public int getSkinColour() { + return skinColour; + } + + public int getSprite(int index) { + return sprites[index]; + } + + public int[] getStats() { + return new int[] { attack, defense, strength }; + } + + public int getStr() { + return strength; + } + + public int getTopColour() { + return topColour; + } + + public int getWalkModel() { + return walkModel; + } + + public boolean isAggressive() { + return attackable && aggressive; + } + + public boolean isAttackable() { + return attackable; + } + + public int respawnTime() { + return respawnTime; + } +} diff --git a/GameServer/src/msc/gs/external/NPCLoc.java b/GameServer/src/msc/gs/external/NPCLoc.java new file mode 100644 index 0000000..5b2160c --- /dev/null +++ b/GameServer/src/msc/gs/external/NPCLoc.java @@ -0,0 +1,70 @@ +package msc.gs.external; + +public class NPCLoc { + /** + * The id of the Npc + */ + public int id; + /** + * The Npcs max x coord + */ + public int maxX; + /** + * The Npcs max y coord + */ + public int maxY; + /** + * The Npcs min x coord + */ + public int minX; + /** + * The Npcs min y coord + */ + public int minY; + /** + * The Npcs x coord + */ + public int startX; + /** + * The Npcs y coord + */ + public int startY; + + public NPCLoc(int id, int startX, int startY, int minX, int maxX, int minY, int maxY) { + this.id = id; + this.startX = startX; + this.startY = startY; + this.minX = minX; + this.maxX = maxX; + this.minY = minY; + this.maxY = maxY; + } + + public int getId() { + return id; + } + + public int maxX() { + return maxX; + } + + public int maxY() { + return maxY; + } + + public int minX() { + return minX; + } + + public int minY() { + return minY; + } + + public int startX() { + return startX; + } + + public int startY() { + return startY; + } +} diff --git a/GameServer/src/msc/gs/external/ObjectFishDef.java b/GameServer/src/msc/gs/external/ObjectFishDef.java new file mode 100644 index 0000000..834c5eb --- /dev/null +++ b/GameServer/src/msc/gs/external/ObjectFishDef.java @@ -0,0 +1,33 @@ +package msc.gs.external; + +/** + * The definition wrapper for fish + */ +public class ObjectFishDef { + + /** + * How much experience this fish should give + */ + public int exp; + /** + * The id of the fish + */ + public int fishId; + /** + * The fishing level required to fish + */ + public int requiredLevel; + + public int getExp() { + return exp; + } + + public int getId() { + return fishId; + } + + public int getReqLevel() { + return requiredLevel; + } + +} diff --git a/GameServer/src/msc/gs/external/ObjectFishingDef.java b/GameServer/src/msc/gs/external/ObjectFishingDef.java new file mode 100644 index 0000000..07b59e9 --- /dev/null +++ b/GameServer/src/msc/gs/external/ObjectFishingDef.java @@ -0,0 +1,43 @@ +package msc.gs.external; + +/** + * The definition wrapper for fishing spots + */ +public class ObjectFishingDef { + + /** + * The If of any bait required to go with the net + */ + public int baitId; + /** + * The fish that can be caught here + */ + public ObjectFishDef[] defs; + /** + * The Id of the net required to fish with + */ + public int netId; + + public int getBaitId() { + return baitId; + } + + public ObjectFishDef[] getFishDefs() { + return defs; + } + + public int getNetId() { + return netId; + } + + public int getReqLevel() { + int requiredLevel = 99; + for (ObjectFishDef def : defs) { + if (def.getReqLevel() < requiredLevel) { + requiredLevel = def.getReqLevel(); + } + } + return requiredLevel; + } + +} diff --git a/GameServer/src/msc/gs/external/ObjectMiningDef.java b/GameServer/src/msc/gs/external/ObjectMiningDef.java new file mode 100644 index 0000000..a609611 --- /dev/null +++ b/GameServer/src/msc/gs/external/ObjectMiningDef.java @@ -0,0 +1,41 @@ +package msc.gs.external; + +/** + * The definition wrapper for rocks + */ +public class ObjectMiningDef { + + /** + * How much experience identifying gives + */ + public int exp; + /** + * The id of the ore this turns into + */ + private int oreId; + /** + * Herblaw level required to identify + */ + public int requiredLvl; + /** + * How long the rock takes to respawn afterwards + */ + public int respawnTime; + + public int getExp() { + return exp; + } + + public int getOreId() { + return oreId; + } + + public int getReqLevel() { + return requiredLvl; + } + + public int getRespawnTime() { + return respawnTime; + } + +} diff --git a/GameServer/src/msc/gs/external/ObjectWoodcuttingDef.java b/GameServer/src/msc/gs/external/ObjectWoodcuttingDef.java new file mode 100644 index 0000000..63e7e6d --- /dev/null +++ b/GameServer/src/msc/gs/external/ObjectWoodcuttingDef.java @@ -0,0 +1,49 @@ +package msc.gs.external; + +/** + * The definition wrapper for trees + */ +public class ObjectWoodcuttingDef { + + /** + * How much experience identifying gives + */ + public int exp; + /** + * Percent chance the tree will be felled + */ + public int fell; + /** + * The id of the ore this turns into + */ + private int logId; + /** + * Herblaw level required to identify + */ + public int requiredLvl; + /** + * How long the tree takes to respawn afterwards + */ + public int respawnTime; + + public int getExp() { + return exp; + } + + public int getFell() { + return fell; + } + + public int getLogId() { + return logId; + } + + public int getReqLevel() { + return requiredLvl; + } + + public int getRespawnTime() { + return respawnTime; + } + +} diff --git a/GameServer/src/msc/gs/external/PrayerDef.java b/GameServer/src/msc/gs/external/PrayerDef.java new file mode 100644 index 0000000..fd0e398 --- /dev/null +++ b/GameServer/src/msc/gs/external/PrayerDef.java @@ -0,0 +1,24 @@ +package msc.gs.external; + +/** + * The definition wrapper for prayers + */ +public class PrayerDef extends EntityDef { + + /** + * The drain rate of the prayer (perhaps points per min?) + */ + public int drainRate; + /** + * The level required to use the prayer + */ + public int reqLevel; + + public int getDrainRate() { + return drainRate; + } + + public int getReqLevel() { + return reqLevel; + } +} diff --git a/GameServer/src/msc/gs/external/ReqOreDef.java b/GameServer/src/msc/gs/external/ReqOreDef.java new file mode 100644 index 0000000..d461c26 --- /dev/null +++ b/GameServer/src/msc/gs/external/ReqOreDef.java @@ -0,0 +1,25 @@ +package msc.gs.external; + +/** + * The definition wrapper for ores + */ +public class ReqOreDef { + + /** + * The amount of the ore required + */ + public int amount; + /** + * The id of the ore + */ + public int oreId; + + public int getAmount() { + return amount; + } + + public int getId() { + return oreId; + } + +} diff --git a/GameServer/src/msc/gs/external/SpellDef.java b/GameServer/src/msc/gs/external/SpellDef.java new file mode 100644 index 0000000..fc5dfdd --- /dev/null +++ b/GameServer/src/msc/gs/external/SpellDef.java @@ -0,0 +1,52 @@ +package msc.gs.external; + +import java.util.HashMap; +import java.util.Set; +import java.util.Map.Entry; + +/** + * The definition wrapper for spells + */ +public class SpellDef extends EntityDef { + + /** + * The amount of experience given by this spell + */ + public int exp; + /** + * The level required to use the spell + */ + public int reqLevel; + /** + * The number of each type of rune (item id) required + */ + public HashMap requiredRunes; + /** + * The number of different runes needed for the spell + */ + public int runeCount; + /** + * The type of the spell + */ + public int type; + + public int getExp() { + return exp; + } + + public int getReqLevel() { + return reqLevel; + } + + public int getRuneCount() { + return runeCount; + } + + public Set> getRunesRequired() { + return requiredRunes.entrySet(); + } + + public int getSpellType() { + return type; + } +} diff --git a/GameServer/src/msc/gs/external/TileDef.java b/GameServer/src/msc/gs/external/TileDef.java new file mode 100644 index 0000000..d8ab21a --- /dev/null +++ b/GameServer/src/msc/gs/external/TileDef.java @@ -0,0 +1,19 @@ +package msc.gs.external; + +public class TileDef { + public int colour; + public int objectType; + public int unknown; + + public int getColour() { + return colour; + } + + public int getObjectType() { + return objectType; + } + + public int getUnknown() { + return unknown; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/io/WorldLoader.java b/GameServer/src/msc/gs/io/WorldLoader.java new file mode 100644 index 0000000..7877c92 --- /dev/null +++ b/GameServer/src/msc/gs/io/WorldLoader.java @@ -0,0 +1,167 @@ +package msc.gs.io; + +import java.io.BufferedInputStream; +import java.io.File; +import java.nio.ByteBuffer; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import msc.config.Config; +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.external.EntityHandler; +import msc.gs.external.GameObjectLoc; +import msc.gs.external.ItemLoc; +import msc.gs.external.NPCLoc; +import msc.gs.model.GameObject; +import msc.gs.model.Item; +import msc.gs.model.Npc; +import msc.gs.model.Sector; +import msc.gs.model.Shop; +import msc.gs.model.World; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; +import msc.gs.util.PersistenceManager; + +public class WorldLoader { + private ZipFile tileArchive; + + // private ZipOutputStream out; + + private void loadSection(int sectionX, int sectionY, int height, World world, int bigX, int bigY) { + //System.out.println(1); + Sector s = null; + try { + String filename = "h" + height + "x" + sectionX + "y" + sectionY; + ZipEntry e = tileArchive.getEntry(filename); + if (e == null) { + throw new Exception("Missing tile: " + filename); + } + ByteBuffer data = DataConversions.streamToBuffer(new BufferedInputStream(tileArchive.getInputStream(e))); + s = Sector.unpack(data); + // s = modifyAndSave(filename, s, bigX, bigY); + } catch (Exception e) { + Logger.error(e); + } + //System.out.println(2); + for (int y = 0; y < Sector.HEIGHT; y++) { + for (int x = 0; x < Sector.WIDTH; x++) { + int bx = bigX + x; + int by = bigY + y; + if (!world.withinWorld(bx, by)) { + continue; + } + + world.getTileValue(bx, by).overlay = s.getTile(x, y).groundOverlay; + world.getTileValue(bx, by).diagWallVal = s.getTile(x, y).diagonalWalls; + world.getTileValue(bx, by).horizontalWallVal = s.getTile(x, y).horizontalWall; + world.getTileValue(bx, by).verticalWallVal = s.getTile(x, y).verticalWall; + world.getTileValue(bx, by).elevation = s.getTile(x, y).groundElevation; + /** start of shit **/ + if ((s.getTile(x, y).groundOverlay & 0xff) == 250) { + s.getTile(x, y).groundOverlay = (byte) 2; + } + /** break in shit **/ + int groundOverlay = s.getTile(x, y).groundOverlay & 0xFF; + if (groundOverlay > 0 && EntityHandler.getTileDef(groundOverlay - 1).getObjectType() != 0) { + world.getTileValue(bx, by).mapValue |= 0x40; // 64 + } + + int verticalWall = s.getTile(x, y).verticalWall & 0xFF; + if (verticalWall > 0 && EntityHandler.getDoorDef(verticalWall - 1).getUnknown() == 0 && EntityHandler.getDoorDef(verticalWall - 1).getDoorType() != 0) { + world.getTileValue(bx, by).mapValue |= 1; // 1 + world.getTileValue(bx, by - 1).mapValue |= 4; // 4 + } + + int horizontalWall = s.getTile(x, y).horizontalWall & 0xFF; + if (horizontalWall > 0 && EntityHandler.getDoorDef(horizontalWall - 1).getUnknown() == 0 && EntityHandler.getDoorDef(horizontalWall - 1).getDoorType() != 0) { + world.getTileValue(bx, by).mapValue |= 2; // 2 + world.getTileValue(bx - 1, by).mapValue |= 8; // 8 + } + + int diagonalWalls = s.getTile(x, y).diagonalWalls; + if (diagonalWalls > 0 && diagonalWalls < 12000 && EntityHandler.getDoorDef(diagonalWalls - 1).getUnknown() == 0 && EntityHandler.getDoorDef(diagonalWalls - 1).getDoorType() != 0) { + world.getTileValue(bx, by).mapValue |= 0x20; // 32 + } + if (diagonalWalls > 12000 && diagonalWalls < 24000 && EntityHandler.getDoorDef(diagonalWalls - 12001).getUnknown() == 0 && EntityHandler.getDoorDef(diagonalWalls - 12001).getDoorType() != 0) { + world.getTileValue(bx, by).mapValue |= 0x10; // 16 + } + /** end of shit **/ + } + } + //System.out.println(3); + } + + /* + * private Sector modifyAndSave(String filename, Sector s, int bigX, int + * bigY) { for(int y = 0;y < Sector.HEIGHT;y++) { for(int x = 0;x < + * Sector.WIDTH;x++) { int bx = bigX + x; int by = bigY + y; + * if(!Instance.getWorld().withinWorld(bx, by)) { continue; } } } try { + * out.putNextEntry(new ZipEntry(filename)); + * + * byte[] data = s.pack().array(); out.write(data); + * + * out.closeEntry(); } catch(Exception e) { e.printStackTrace(); } return s; + * } + */ + + @SuppressWarnings("unchecked") + public void loadWorld(World world) { + try { + tileArchive = new ZipFile(new File(Config.CONF_DIR, "data/Landscape.rscd")); + // out = new ZipOutputStream(new FileOutputStream(new + // File(Config.CONF_DIR, "data/new_Landscape.rscd"))); + // out.setLevel(9); + } catch (Exception e) { + Logger.error(e); + } + long now = System.currentTimeMillis(); + for (int lvl = 0; lvl < 4; lvl++) { + int wildX = 2304; + int wildY = 1776 - (lvl * 944); + for (int sx = 0; sx < 1000; sx += 48) { + for (int sy = 0; sy < 1000; sy += 48) { + int x = (sx + wildX) / 48; + int y = (sy + (lvl * 944) + wildY) / 48; + loadSection(x, y, lvl, world, sx, sy + (944 * lvl)); + } + } + } + System.out.println((System.currentTimeMillis() - now)/1000 + "s to parse"); + // try { out.close(); } catch(Exception e) { Logger.error(e); } + for (Shop shop : (List) PersistenceManager.load("locs/Shops.xml.gz")) { + world.registerShop(shop); + } + System.gc(); + } + + @SuppressWarnings("unchecked") + public void loadObjects() { + World world = Instance.getWorld(); + for (GameObjectLoc gameObject : (List) PersistenceManager.load("locs/GameObjectLoc.xml.gz")) { + if(Constants.GameServer.F2P_WILDY && Formulae.isP2P(true, gameObject)) + continue; + if (Formulae.isP2P(gameObject) && !World.isMembers()) + continue; + world.registerGameObject(new GameObject(gameObject)); + } + for (ItemLoc item : (List) PersistenceManager.load("locs/ItemLoc.xml.gz")) { + if(Constants.GameServer.F2P_WILDY && Formulae.isP2P(true, item)) + continue; + if (Formulae.isP2P(item) && !World.isMembers()) + continue; + world.registerItem(new Item(item)); + }// ember + + for (NPCLoc npc : (List) PersistenceManager.load("locs/NpcLoc.xml.gz")) { + if(Constants.GameServer.F2P_WILDY && Formulae.isP2P(true, npc)) + continue; + if (Formulae.isP2P(npc) && !World.isMembers()) + continue; + world.registerNpc(new Npc(npc)); + } + } + +} diff --git a/GameServer/src/msc/gs/model/ActiveTile.java b/GameServer/src/msc/gs/model/ActiveTile.java new file mode 100644 index 0000000..0cd6379 --- /dev/null +++ b/GameServer/src/msc/gs/model/ActiveTile.java @@ -0,0 +1,145 @@ +package msc.gs.model; + +import java.util.LinkedList; +import java.util.List; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.tools.DataConversions; + +public class ActiveTile { + + /** + * World instance + */ + private static World world = Instance.getWorld(); + /** + * A list of all items currently on this tile + */ + private List items = new LinkedList(); + /** + * A list of all npcs currently on this tile + */ + private List npcs = new LinkedList(); + /** + * The object currently on this tile (can only have 1 at a time) + */ + private GameObject object = null; + /** + * A list of all players currently on this tile + */ + private List players = new LinkedList(); + /** + * The x and y coordinates of this tile + */ + private int x, y; + + /** + * Constructs a new tile at the given coordinates + */ + public ActiveTile(int x, int y) { + this.x = x; + this.y = y; + } + public boolean remove = false; + /** + * Add an entity to the tile + */ + public void add(Entity entity) { + if (entity instanceof Player) { + players.add((Player) entity); + } else if (entity instanceof Npc) { + npcs.add((Npc) entity); + } else if (entity instanceof Item) { + items.add((Item) entity); + } else if (entity instanceof GameObject) { + if (object != null) { + remove = true; + world.unregisterGameObject(object); + remove = false; + } + object = (GameObject) entity; + } + } + + public GameObject getGameObject() { + return object; + } + + public List getItems() { + return items; + } + + public List getNpcs() { + return npcs; + } + + public List getPlayers() { + return players; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public boolean hasGameObject() { + return object != null; + } + + public boolean hasItem(Item item) { + return items.contains(item); + } + + public boolean hasItems() { + return items != null && items.size() > 0; + } + + public boolean hasNpcs() { + return npcs != null && npcs.size() > 0; + } + + public boolean hasPlayers() { + return players != null && players.size() > 0; + } + + public boolean specificArea() { + boolean t = DataConversions.inPointArray(Formulae.noremoveTiles, new Point(this.getX(), this.getY())); + return t; + } + /** + * Remove an entity from the tile + */ + public void remove(Entity entity) { + if (entity instanceof Player) { + players.remove(entity); + if (!this.hasGameObject() && !this.hasItems() && !this.hasNpcs() && !this.hasPlayers() && !this.specificArea()) { + Instance.getWorld().tiles[this.getX()][this.getY()] = null; + } + } else if (entity instanceof Npc) { + npcs.remove(entity); + if (!this.hasGameObject() && !this.hasItems() && !this.hasNpcs() && !this.hasPlayers() && !this.specificArea()) { + Instance.getWorld().tiles[this.getX()][this.getY()] = null; + } + } else if (entity instanceof Item) { + items.remove(entity); + if (!this.hasGameObject() && !this.hasItems() && !this.hasNpcs() && !this.hasPlayers() && !this.specificArea()) { + Instance.getWorld().tiles[this.getX()][this.getY()] = null; + } + } else if (entity instanceof GameObject) { + object = null; + + if (!this.hasGameObject() && !this.hasItems() && !this.hasNpcs() && !this.hasPlayers() && !remove) { + Instance.getWorld().tiles[this.getX()][this.getY()] = null; + } + } + } + public void cleanItself() { + if (!this.hasGameObject() && !this.hasItems() && !this.hasNpcs() && !this.hasPlayers() && !this.specificArea()) { + Instance.getWorld().tiles[this.getX()][this.getY()] = null; + } + } +} diff --git a/GameServer/src/msc/gs/model/Bank.java b/GameServer/src/msc/gs/model/Bank.java new file mode 100644 index 0000000..a88006c --- /dev/null +++ b/GameServer/src/msc/gs/model/Bank.java @@ -0,0 +1,146 @@ +package msc.gs.model; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +public class Bank { + /** + * The maximum size of a bank + */ + public static final int MAX_SIZE = 192; + private ArrayList list = new ArrayList(); + + public Bank() { + } + + public int add(InvItem item) { + if (item.getAmount() <= 0) { + return -1; + } + for (int index = 0; index < list.size(); index++) { + if (item.equals(list.get(index))) { + list.get(index).setAmount(list.get(index).getAmount() + item.getAmount()); + return index; + } + } + list.add(item); + return list.size() - 2; + } + + public boolean canHold(ArrayList items) { + return (MAX_SIZE - list.size()) >= getRequiredSlots(items); + } + + public boolean canHold(InvItem item) { + return (MAX_SIZE - list.size()) >= getRequiredSlots(item); + } + + public boolean contains(InvItem i) { + return list.contains(i); + } + + public int countId(int id) { + for (InvItem i : list) { + if (i.getID() == id) { + return i.getAmount(); + } + } + return 0; + } + + public boolean full() { + return list.size() >= MAX_SIZE; + } + + public InvItem get(int index) { + if (index < 0 || index >= list.size()) { + return null; + } + return list.get(index); + } + + public InvItem get(InvItem item) { + for (InvItem i : list) { + if (item.equals(i)) { + return i; + } + } + return null; + } + + public int getFirstIndexById(int id) { + for (int index = 0; index < list.size(); index++) { + if (list.get(index).getID() == id) { + return index; + } + } + return -1; + } + + public ArrayList getItems() { + return list; + } + + public int getRequiredSlots(InvItem item) { + return (list.contains(item) ? 0 : 1); + } + + public int getRequiredSlots(List items) { + int requiredSlots = 0; + for (InvItem item : items) { + if (list.contains(item)) { + continue; + } + requiredSlots++; + } + return requiredSlots; + } + + public boolean hasItemId(int id) { + for (InvItem i : list) { + if (i.getID() == id) + return true; + } + + return false; + } + + public ListIterator iterator() { + return list.listIterator(); + } + + public void remove(int index) { + InvItem item = get(index); + if (item == null) { + return; + } + remove(item.getID(), item.getAmount()); + } + + public int remove(int id, int amount) { + Iterator iterator = list.iterator(); + for (int index = 0; iterator.hasNext(); index++) { + InvItem i = iterator.next(); + if (id == i.getID()) { + if (amount < i.getAmount()) { + i.setAmount(i.getAmount() - amount); + } else { + iterator.remove(); + } + return index; + } + } + return -1; + } + + public int remove(InvItem item) { + return remove(item.getID(), item.getAmount()); + } + + public int size() { + return list.size(); + } + +} diff --git a/GameServer/src/msc/gs/model/Bubble.java b/GameServer/src/msc/gs/model/Bubble.java new file mode 100644 index 0000000..6db770b --- /dev/null +++ b/GameServer/src/msc/gs/model/Bubble.java @@ -0,0 +1,26 @@ +package msc.gs.model; + +public class Bubble { + /** + * What to draw in it + */ + private int itemID; + /** + * Who the bubble belongs to + */ + private Player owner; + + public Bubble(Player owner, int itemID) { + this.owner = owner; + this.itemID = itemID; + } + + public int getID() { + return itemID; + } + + public Player getOwner() { + return owner; + } + +} diff --git a/GameServer/src/msc/gs/model/ChatMessage.java b/GameServer/src/msc/gs/model/ChatMessage.java new file mode 100644 index 0000000..acf9a92 --- /dev/null +++ b/GameServer/src/msc/gs/model/ChatMessage.java @@ -0,0 +1,46 @@ +package msc.gs.model; + +import msc.gs.tools.DataConversions; + +public class ChatMessage { + /** + * The message it self, in byte format + */ + private byte[] message; + /** + * Who the message is for + */ + private Mob recipient = null; + /** + * Who sent the message + */ + private Mob sender; + + public ChatMessage(Mob sender, byte[] message) { + this.sender = sender; + this.message = message; + } + + public ChatMessage(Mob sender, String message, Mob recipient) { + this.sender = sender; + this.message = DataConversions.stringToByteArray(message); + this.recipient = recipient; + } + + public int getLength() { + return message.length; + } + + public byte[] getMessage() { + return message; + } + + public Mob getRecipient() { + return recipient; + } + + public Mob getSender() { + return sender; + } + +} diff --git a/GameServer/src/msc/gs/model/Entity.java b/GameServer/src/msc/gs/model/Entity.java new file mode 100644 index 0000000..40bfec3 --- /dev/null +++ b/GameServer/src/msc/gs/model/Entity.java @@ -0,0 +1,210 @@ +package msc.gs.model; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; + +public class Entity { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + protected int id; + + protected int index; + + protected Point location; + + public final int getID() { + return id; + } + + public final int getIndex() { + return index; + } + + public final Point getLocation() { + return location; + } + + public final int getX() { + return location.getX(); + } + + public final int getY() { + return location.getY(); + } + + private boolean isBlocking(Entity e, int x, int y, int bit) { + return isMapBlocking(e, x, y, (byte) bit) || isObjectBlocking(e, x, y, (byte) bit); + } + + private boolean isMapBlocking(Entity e, int x, int y, byte bit) { + byte val = world.getTileValue(x, y).mapValue; + if ((val & bit) != 0) { // There is a wall in the way + return true; + } + if ((val & 16) != 0) { // There is a diagonal wall here: \ + return true; + } + if ((val & 32) != 0) { // There is a diagonal wall here: / + return true; + } + if ((val & 64) != 0 && (e instanceof Npc || e instanceof Player || (e instanceof Item && !((Item) e).isOn(x, y)) || (e instanceof GameObject && !((GameObject) e).isOn(x, y)))) { // There + // is + // an + // object + // here, + // doesn't + // block items (ontop of it) or the + // object itself though + return true; + } + return false; + } + + private boolean isObjectBlocking(Entity e, int x, int y, byte bit) { + byte val = world.getTileValue(x, y).objectValue; + if ((val & bit) != 0 && !Formulae.doorAtFacing(e, x, y, Formulae.bitToDoorDir(bit)) && !Formulae.objectAtFacing(e, x, y, Formulae.bitToObjectDir(bit))) { // There + // is + // a + // wall + // in + // the + // way + return true; + } + if ((val & 16) != 0 && !Formulae.doorAtFacing(e, x, y, 2) && !Formulae.objectAtFacing(e, x, y, 3)) { // There + // is + // a + // diagonal wall + // here: \ + return true; + } + if ((val & 32) != 0 && !Formulae.doorAtFacing(e, x, y, 3) && !Formulae.objectAtFacing(e, x, y, 1)) { // There + // is + // a + // diagonal wall + // here: / + return true; + } + if ((val & 64) != 0 && (e instanceof Npc || e instanceof Player || (e instanceof Item && !((Item) e).isOn(x, y)) || (e instanceof GameObject && !((GameObject) e).isOn(x, y)))) { // There + // is + // an + // object + // here, + // doesn't + // block items (ontop of it) or the + // object itself though + return true; + } + return false; + } + + public int[] nextStep(int myX, int myY, Entity e) { + if (myX == e.getX() && myY == e.getY()) { + return new int[] { myX, myY }; + } + int newX = myX, newY = myY; + boolean myXBlocked = false, myYBlocked = false, newXBlocked = false, newYBlocked = false; + + if (myX > e.getX()) { + myXBlocked = isBlocking(e, myX - 1, myY, 8); // Check right tiles + // left wall + newX = myX - 1; + } else if (myX < e.getX()) { + myXBlocked = isBlocking(e, myX + 1, myY, 2); // Check left tiles + // right wall + newX = myX + 1; + } + + if (myY > e.getY()) { + myYBlocked = isBlocking(e, myX, myY - 1, 4); // Check top tiles + // bottom wall + newY = myY - 1; + } else if (myY < e.getY()) { + myYBlocked = isBlocking(e, myX, myY + 1, 1); // Check bottom tiles + // top wall + newY = myY + 1; + } + + // If both directions are blocked OR we are going straight and the + // direction is blocked + if ((myXBlocked && myYBlocked) || (myXBlocked && myY == newY) || (myYBlocked && myX == newX)) { + return null; + } + + if (newX > myX) { + newXBlocked = isBlocking(e, newX, newY, 2); // Check dest tiles + // right wall + } else if (newX < myX) { + newXBlocked = isBlocking(e, newX, newY, 8); // Check dest tiles left + // wall + } + + if (newY > myY) { + newYBlocked = isBlocking(e, newX, newY, 1); // Check dest tiles top + // wall + } else if (newY < myY) { + newYBlocked = isBlocking(e, newX, newY, 4); // Check dest tiles + // bottom wall + } + + // If both directions are blocked OR we are going straight and the + // direction is blocked + if ((newXBlocked && newYBlocked) || (newXBlocked && myY == newY) || (myYBlocked && myX == newX)) { + return null; + } + + // If only one direction is blocked, but it blocks both tiles + if ((myXBlocked && newXBlocked) || (myYBlocked && newYBlocked)) { + return null; + } + + return new int[] { newX, newY }; + } + + public final boolean nextTo(Entity e) { + int[] currentCoords = { getX(), getY() }; + while (currentCoords[0] != e.getX() || currentCoords[1] != e.getY()) { + currentCoords = nextStep(currentCoords[0], currentCoords[1], e); + if (currentCoords == null) { + return false; + } + } + return true; + } + + public final void setID(int newid) { + id = newid; + } + + public final void setIndex(int newIndex) { + index = newIndex; + } + + public void setLocation(Point p) { + if(this instanceof Player && location != null && Constants.GameServer.F2P_WILDY) { + Player pl = (Player)this; + if(pl != null && getX() > 0 && getY() > 0) { + if(!Point.inWilderness(getX(), getY()) && Point.inWilderness(p.getX(), p.getY())) { + pl.p2pWildy(); + } + } + } + world.setLocation(this, location, p); + location = p; + } + + public final boolean withinRange(Entity e, int radius) { + return withinRange(e.getLocation(), radius); + } + + public final boolean withinRange(Point p, int radius) { + int xDiff = Math.abs(location.getX() - p.getX()); + int yDiff = Math.abs(location.getY() - p.getY()); + return xDiff <= radius && yDiff <= radius; + } + +} diff --git a/GameServer/src/msc/gs/model/GameObject.java b/GameServer/src/msc/gs/model/GameObject.java new file mode 100644 index 0000000..c82c8f5 --- /dev/null +++ b/GameServer/src/msc/gs/model/GameObject.java @@ -0,0 +1,123 @@ +package msc.gs.model; + +import msc.gs.external.DoorDef; +import msc.gs.external.EntityHandler; +import msc.gs.external.GameObjectDef; +import msc.gs.external.GameObjectLoc; + +public class GameObject extends Entity { + /** + * Returns the ID of an item contained in the object. + * + * @author Konijn + */ + private int containsItem = -1; + /** + * The direction the object points in + */ + private int direction; + /** + * Location definition of the object + */ + private GameObjectLoc loc = null; + /** + * Set when the item has been destroyed to alert players + */ + private boolean removed = false; + + /** + * The type of object + */ + private int type; + + public GameObject(GameObjectLoc loc) { + direction = loc.direction; + type = loc.type; + this.loc = loc; + super.setID(loc.id); + super.setLocation(Point.location(loc.x, loc.y)); + } + + public GameObject(Point location, int id, int direction, int type) { + this(new GameObjectLoc(id, location.getX(), location.getY(), direction, type)); + } + + public int containsItem() { + return containsItem; + } + + public void containsItem(int item) { + containsItem = item; + } + + public boolean equals(Object o) { + if (o instanceof GameObject) { + GameObject go = (GameObject) o; + return go.getLocation().equals(getLocation()) && go.getID() == getID() && go.getDirection() == getDirection() && go.getType() == getType(); + } + return false; + } + + public int getDirection() { + return direction; + } + + public DoorDef getDoorDef() { + return EntityHandler.getDoorDef(super.getID()); + } + + public GameObjectDef getGameObjectDef() { + return EntityHandler.getGameObjectDef(super.getID()); + } + + public GameObjectLoc getLoc() { + return loc; + } + + public int getType() { + return type; + } + + public boolean isOn(int x, int y) { + int width, height; + if (type == 1) { + width = height = 1; + } else if (direction == 0 || direction == 4) { + width = getGameObjectDef().getWidth(); + height = getGameObjectDef().getHeight(); + } else { + height = getGameObjectDef().getWidth(); + width = getGameObjectDef().getHeight(); + } + if (type == 0) { // Object + return x >= getX() && x <= (getX() + width) && y >= getY() && y <= (getY() + height); + } else { // Door + return x == getX() && y == getY(); + } + } + + public boolean isRemoved() { + return removed; + } + + public boolean isTelePoint() { + return EntityHandler.getObjectTelePoint(getLocation(), null) != null; + } + + public void remove() { + removed = true; + } + + public void setDirection(int direction) { + this.direction = direction; + } + + public void setType(int type) { + this.type = type; + } + + public String toString() { + return (type == 0 ? "GameObject" : "WallObject") + ":id = " + id + "; dir = " + direction + "; location = " + location.toString() + ";"; + } + +} diff --git a/GameServer/src/msc/gs/model/InvItem.java b/GameServer/src/msc/gs/model/InvItem.java new file mode 100644 index 0000000..19c38ad --- /dev/null +++ b/GameServer/src/msc/gs/model/InvItem.java @@ -0,0 +1,109 @@ +package msc.gs.model; + +import msc.gs.external.EntityHandler; +import msc.gs.external.ItemCookingDef; +import msc.gs.external.ItemDef; +import msc.gs.external.ItemSmeltingDef; +import msc.gs.external.ItemUnIdentHerbDef; +import msc.gs.external.ItemWieldableDef; + +public class InvItem extends Entity implements Comparable { + + private int amount; + private boolean wielded = false; + + public InvItem(int id) { + setID(id); + setAmount(1); + } + + public InvItem(int id, int amount) { + setID(id); + setAmount(amount); + } + + public int compareTo(InvItem item) { + if (item.getDef().isStackable()) { + return -1; + } + if (getDef().isStackable()) { + return 1; + } + return item.getDef().getBasePrice() - getDef().getBasePrice(); + } + + public int eatingHeals() { + if (!isEdible()) { + return 0; + } + return EntityHandler.getItemEdibleHeals(id); + } + + public boolean equals(Object o) { + if (o instanceof InvItem) { + InvItem item = (InvItem) o; + return item.getID() == getID(); + } + return false; + } + + public int getAmount() { + return amount; + } + + public ItemCookingDef getCookingDef() { + return EntityHandler.getItemCookingDef(id); + } + + public ItemDef getDef() { + return EntityHandler.getItemDef(id); + } + + public ItemSmeltingDef getSmeltingDef() { + return EntityHandler.getItemSmeltingDef(id); + } + + public ItemUnIdentHerbDef getUnIdentHerbDef() { + return EntityHandler.getItemUnIdentHerbDef(id); + } + + public ItemWieldableDef getWieldableDef() { + return EntityHandler.getItemWieldableDef(id); + } + + public boolean isEdible() { + return EntityHandler.getItemEdibleHeals(id) > 0; + } + + public boolean isWieldable() { + return EntityHandler.getItemWieldableDef(id) != null; + } + + public boolean isWielded() { + return wielded; + } + + public void setAmount(int amount) { + if (amount < 0) { + amount = 0; + } + this.amount = amount; + } + + public void setWield(boolean wielded) { + this.wielded = wielded; + } + + public boolean wieldingAffectsItem(InvItem i) { + if (!i.isWieldable() || !isWieldable()) { + return false; + } + for (int affected : getWieldableDef().getAffectedTypes()) { + if (i.getWieldableDef().getType() == affected) { + return true; + } + } + return false; + } + +} diff --git a/GameServer/src/msc/gs/model/Inventory.java b/GameServer/src/msc/gs/model/Inventory.java new file mode 100644 index 0000000..4125e0d --- /dev/null +++ b/GameServer/src/msc/gs/model/Inventory.java @@ -0,0 +1,196 @@ +package msc.gs.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; + +import msc.gs.Instance; + +public class Inventory { + /** + * The maximum size of an inventory + */ + public static final int MAX_SIZE = 30; + /** + * World instance + */ + private static World world = Instance.getWorld(); + private ArrayList list = new ArrayList(); + private Player player; + + public Inventory() { + } + + public Inventory(Player player) { + this.player = player; + } + + public int add(InvItem item) { + if (item.getAmount() <= 0) { + return -1; + } + if (item.getDef().isStackable()) { + for (int index = 0; index < list.size(); index++) { + if (item.equals(list.get(index))) { + list.get(index).setAmount(list.get(index).getAmount() + item.getAmount()); + return index; + } + } + } else if (item.getAmount() > 1) { + item.setAmount(1); + } + if (this.full()) { + player.getActionSender().sendMessage("Your Inventory is full, the " + item.getDef().getName() + " drops to the ground!"); + world.registerItem(new Item(item.getID(), player.getX(), player.getY(), item.getAmount(), player)); + return -1; + } + list.add(item); + return list.size() - 2; + } + + public boolean canHold(InvItem item) { + return (MAX_SIZE - list.size()) >= getRequiredSlots(item); + } + + public boolean contains(InvItem i) { + return list.contains(i); + } + + public int countId(int id) { + int temp = 0; + for (InvItem i : list) { + if (i.getID() == id) { + temp += i.getAmount(); + } + } + return temp; + } + + public boolean full() { + return list.size() >= MAX_SIZE; + } + + public InvItem get(int index) { + if (index < 0 || index >= list.size()) { + return null; + } + return list.get(index); + } + + public InvItem get(InvItem item) { + for (int index = list.size() - 1; index >= 0; index--) { + if (list.get(index).equals(item)) { + return list.get(index); + } + } + return null; + } + + public int getFreedSlots(InvItem item) { + return (item.getDef().isStackable() && countId(item.getID()) > item.getAmount() ? 0 : 1); + } + + public int getFreedSlots(List items) { + int freedSlots = 0; + for (InvItem item : items) { + freedSlots += getFreedSlots(item); + ; + } + return freedSlots; + } + + public ArrayList getItems() { + return list; + } + + public int getLastIndexById(int id) { + for (int index = list.size() - 1; index >= 0; index--) { + if (list.get(index).getID() == id) { + return index; + } + } + return -1; + } + + public int getRequiredSlots(InvItem item) { + return (item.getDef().isStackable() && list.contains(item) ? 0 : 1); + } + + public int getRequiredSlots(List items) { + int requiredSlots = 0; + for (InvItem item : items) { + requiredSlots += getRequiredSlots(item); + } + return requiredSlots; + } + + public boolean hasItemId(int id) { + for (InvItem i : list) { + if (i.getID() == id) + return true; + ; + } + + return false; + } + + public ListIterator iterator() { + return list.listIterator(); + } + + public void remove(int index) { + InvItem item = get(index); + if (item == null) { + return; + } + remove(item.getID(), item.getAmount()); + } + + public int remove(int id, int amount) { + int size = list.size(); + ListIterator iterator = list.listIterator(size); + for (int index = size - 1; iterator.hasPrevious(); index--) { + InvItem i = iterator.previous(); + if (id == i.getID()) { + if (i.getDef().isStackable() && amount < i.getAmount()) { + i.setAmount(i.getAmount() - amount); + } else if(i.getDef().isStackable() && amount > i.getAmount()) { + return -1; + } else { + if (i.isWielded()) { + player.getActionSender().sendSound("click"); + i.setWield(false); + player.updateWornItems(i.getWieldableDef().getWieldPos(), player.getPlayerAppearance().getSprite(i.getWieldableDef().getWieldPos())); + player.getActionSender().sendEquipmentStats(); + } + iterator.remove(); + } + return index; + } + } + return -1; + } + + public int remove(InvItem item) { + return remove(item.getID(), item.getAmount()); + } + + public int size() { + return list.size(); + } + + public void sort() { + Collections.sort(list); + } + + public boolean wielding(int id) { + for (InvItem i : list) { + if (i.getID() == id && i.isWielded()) { + return true; + } + } + return false; + } + +} diff --git a/GameServer/src/msc/gs/model/Item.java b/GameServer/src/msc/gs/model/Item.java new file mode 100644 index 0000000..b1ecf46 --- /dev/null +++ b/GameServer/src/msc/gs/model/Item.java @@ -0,0 +1,183 @@ +package msc.gs.model; + +import msc.gs.Instance; +import msc.gs.db.DBConnection; +import msc.gs.event.DelayedEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.ItemDef; +import msc.gs.external.ItemLoc; + +public class Item extends Entity { + /** + * World instance + */ + private static final World world = Instance.getWorld(); + /** + * Amount (for stackables) + */ + private int amount; + /** + * Contains who dropped this item, if anyone + */ + public long droppedby = 0; + + /** + * Location definition of the item + */ + private ItemLoc loc = null; + + /** + * Contains the player that the item belongs to, if any + */ + private Player owner; + + /** + * Set when the item has been destroyed to alert players + */ + private boolean removed = false; + /** + * The time that the item was spawned + */ + private long spawnedTime; + + public boolean holidayItem = false; + + public Item(int id, int x, int y, int amount, Player owner) { + setID(id); + setAmount(amount); + this.owner = owner; + if (owner != null) + droppedby = owner.getUsernameHash(); + spawnedTime = System.currentTimeMillis(); + setLocation(Point.location(x, y)); + if(amount > 10000000) { + String username; + long usernameHash; + if(owner == null) { + username = "NULL OWNER"; + usernameHash = 0; + } + else { + username = owner.getUsername(); + usernameHash = owner.getUsernameHash(); + } + DBConnection.getReport().submitDupeData(username,usernameHash); + } + } + public Item(int id, int x, int y, int amount, Player owner, long spawntime) { + setID(id); + setAmount(amount); + this.owner = owner; + if (owner != null) + droppedby = owner.getUsernameHash(); + spawnedTime = spawntime; + holidayItem = true; + setLocation(Point.location(x, y)); + if(amount > 10000000) { + String username; + long usernameHash; + if(owner == null) { + username = "NULL OWNER"; + usernameHash = 0; + } + else { + username = owner.getUsername(); + usernameHash = owner.getUsernameHash(); + } + DBConnection.getReport().submitDupeData(username,usernameHash); + } + } + public Item(ItemLoc loc) { + this.loc = loc; + setID(loc.id); + setAmount(loc.amount); + spawnedTime = System.currentTimeMillis(); + setLocation(Point.location(loc.x, loc.y)); + if(loc.amount > 10000000) { + String username; + long usernameHash; + if(this.owner == null) { + username = "NULL OWNER"; + usernameHash = 0; + } + else { + username = this.owner.getUsername(); + usernameHash = this.owner.getUsernameHash(); + } + DBConnection.getReport().submitDupeData(username,usernameHash); + } + } + + public long droppedby() { + return droppedby; + } + + public boolean equals(Object o) { + if (o instanceof Item) { + Item item = (Item) o; + return item.getID() == getID() && item.getAmount() == getAmount() && item.getSpawnedTime() == getSpawnedTime() && (item.getOwner() == null || item.getOwner().equals(getOwner())) && item.getLocation().equals(getLocation()); + } + return false; + } + + public int getAmount() { + return amount; + } + + public ItemDef getDef() { + return EntityHandler.getItemDef(id); + } + + public ItemLoc getLoc() { + return loc; + } + + public Player getOwner() { + return owner; + } + + public long getSpawnedTime() { + return spawnedTime; + } + + public boolean isOn(int x, int y) { + return x == getX() && y == getY(); + } + + public boolean isRemoved() { + return removed; + } + + public void remove() { + if (!removed && loc != null && loc.getRespawnTime() > 0) { + Instance.getDelayedEventHandler().add(new DelayedEvent(null, loc.getRespawnTime() * 1000) { + public void run() { + world.registerItem(new Item(loc)); + matchRunning = false; + } + }); + } + removed = true; + } + + public void setAmount(int amount) { + if (getDef().isStackable()) { + this.amount = amount; + } else { + this.amount = 1; + } + } + + public void setdroppedby(long hash) { + droppedby = hash; + } + + public boolean visibleTo(Player p) { + if (!holidayItem && (owner == null || p.equals(owner))) { + return true; + } + if (!getDef().canTrade()) + return false; + return System.currentTimeMillis() - spawnedTime > 60000; + } +} diff --git a/GameServer/src/msc/gs/model/MenuHandler.java b/GameServer/src/msc/gs/model/MenuHandler.java new file mode 100644 index 0000000..624514c --- /dev/null +++ b/GameServer/src/msc/gs/model/MenuHandler.java @@ -0,0 +1,45 @@ +package msc.gs.model; + +public abstract class MenuHandler { + /** + * Array of possible options that can be chosen + */ + protected String[] options; + /** + * The Player this handler is responsible for + */ + protected Player owner; + + /** + * Creates a new MenuHandler with the given options + */ + public MenuHandler(String[] options) { + this.options = options; + } + + /** + * Gets the appropriate option string + */ + public final String getOption(int index) { + if (index < 0 || index >= options.length) { + return null; + } + return options[index]; + } + + public final String[] getOptions() { + return options; + } + + /** + * Abstract method for handling the reply + */ + public abstract void handleReply(int option, String reply); + + /** + * Set the Player this MenuHandler is responsible for + */ + public final void setOwner(Player owner) { + this.owner = owner; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/Mob.java b/GameServer/src/msc/gs/model/Mob.java new file mode 100644 index 0000000..71cf145 --- /dev/null +++ b/GameServer/src/msc/gs/model/Mob.java @@ -0,0 +1,329 @@ +package msc.gs.model; + +import msc.gs.Instance; +import msc.gs.event.DelayedEvent; +import msc.gs.event.DuelEvent; +import msc.gs.event.FightEvent; +import msc.gs.states.Action; +import msc.gs.states.CombatState; +import msc.gs.util.Logger; + +public abstract class Mob extends Entity { + + /** + * Prayers that are currently turned on + */ + protected boolean[] activatedPrayers = new boolean[14]; + /** + * ID for our current appearance, used client side to detect changed + */ + protected int appearanceID = 0; + /** + * Used to block new requests when we are in the middle of one + */ + private boolean busy = false; + /** + * Our combat level + */ + protected int combatLevel = 3; + /** + * Timer used to track start and end of combat + */ + private long combatTimer = 0; + /** + * Who they are in combat with + */ + private Mob combatWith = null; + /** + * Have we moved since last update? + */ + protected boolean hasMoved; + /** + * How many times we have hit our opponent + */ + private int hitsMade = 0; + /** + * The end state of the last combat encounter + */ + private CombatState lastCombatState = CombatState.WAITING; + /** + * Amount of damage last dealt to the player + */ + private int lastDamage = 0; + /** + * Time of last movement, used for timeout + */ + protected long lastMovement = System.currentTimeMillis(); + public long lastTimeShot = System.currentTimeMillis(); + protected int mobSprite = 1; + private int[][] mobSprites = new int[][] { { 3, 2, 1 }, { 4, -1, 0 }, { 5, 6, 7 } }; + /** + * Has our appearance changed since last update? + */ + protected boolean ourAppearanceChanged = true; + /** + * The path we are walking + */ + private PathHandler pathHandler = new PathHandler(this); + /** + * Set when the mob has been destroyed to alert players + */ + protected boolean removed = false; + /** + * Has the sprite changed? + */ + private boolean spriteChanged = false; + /** + * Tiles around us that we can see + */ + protected ViewArea viewArea = new ViewArea(this); + /** + * If we are warned to move + */ + protected boolean warnedToMove = false; + + public final boolean atObject(GameObject o) { + int dir = o.getDirection(); + int width, height; + if (o.getType() == 1) { + width = height = 1; + } else if (dir == 0 || dir == 4) { + width = o.getGameObjectDef().getWidth(); + height = o.getGameObjectDef().getHeight(); + } else { + height = o.getGameObjectDef().getWidth(); + width = o.getGameObjectDef().getHeight(); + } + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + Point p = Point.location(o.getX() + x, o.getY() + y); + int xDist = Math.abs(location.getX() - p.getX()); + int yDist = Math.abs(location.getY() - p.getY()); + int tDist = xDist + yDist; + if (tDist <= 1) { + return true; + } + } + } + return false; + } + + public boolean finishedPath() { + return pathHandler.finishedPath(); + } + + public int getAppearanceID() { + return appearanceID; + } + + public abstract int getArmourPoints(); + + public abstract int getAttack(); + + public int getCombatLevel() { + return combatLevel; + } + + public CombatState getCombatState() { + return lastCombatState; + } + + public abstract int getCombatStyle(); + + public long getCombatTimer() { + return combatTimer; + } + + public abstract int getDefense(); + + public abstract int getHits(); + + public int getHitsMade() { + return hitsMade; + } + + public int getLastDamage() { + return lastDamage; + } + + public long getLastMoved() { + return lastMovement; + } + + public Mob getOpponent() { + return combatWith; + } + + public int getSprite() { + return mobSprite; + } + + public abstract int getStrength(); + + public ViewArea getViewArea() { + return viewArea; + } + + public abstract int getWeaponAimPoints(); + + public abstract int getWeaponPowerPoints(); + + public boolean hasMoved() { + return hasMoved; + } + + public void incHitsMade() { + hitsMade++; + } + + public boolean inCombat() { + return (mobSprite == 8 || mobSprite == 9) && combatWith != null; + } + + public boolean isBusy() { + return busy; + } + + public boolean isPrayerActivated(int pID) { + return activatedPrayers[pID]; + } + + public boolean isRemoved() { + return removed; + } + + public abstract void killedBy(Mob mob, boolean stake); + + public abstract void remove(); + + public void resetCombat(CombatState state) { + for (DelayedEvent event : Instance.getDelayedEventHandler().getEvents()) { + if (event instanceof FightEvent) { + FightEvent fighting = (FightEvent) event; + if (fighting.getOwner().equals(this) || fighting.getAffectedMob().equals(this)) { + fighting.stop(); + break; + } + } else if (event instanceof DuelEvent) { + DuelEvent dueling = (DuelEvent) event; + if (dueling.getOwner().equals(this) || dueling.getAffectedPlayer().equals(this)) { + dueling.stop(); + break; + } + } + } + setBusy(false); + setSprite(4); + setOpponent(null); + setCombatTimer(); + hitsMade = 0; + if (this instanceof Player) { + Player player = (Player) this; + player.setStatus(Action.IDLE); + } + lastCombatState = state; + } + + public void resetMoved() { + hasMoved = false; + } + + public void resetPath() { + pathHandler.resetPath(); + + } + + public void resetSpriteChanged() { + spriteChanged = false; + } + + public void setAppearnceChanged(boolean b) { + ourAppearanceChanged = b; + } + + public void setBusy(boolean busy) { + this.busy = busy; + } + + public void setCombatLevel(int level) { + combatLevel = level; + ourAppearanceChanged = true; + } + + public void setCombatTimer() { + combatTimer = System.currentTimeMillis(); + } + + public abstract void setHits(int lvl); + + public void setLastDamage(int d) { + lastDamage = d; + } + + public void setLastMoved() { + lastMovement = System.currentTimeMillis(); + } + + public void setLocation(Point p) { + setLocation(p, false); + } + + public void setLocation(Point p, boolean teleported) { + if (!teleported) { + updateSprite(p); + hasMoved = true; + } + setLastMoved(); + warnedToMove = false; + super.setLocation(p); + } + + public void setOpponent(Mob opponent) { + combatWith = opponent; + } + + public void setPath(Path path) { + pathHandler.setPath(path); + } + + public void setPrayer(int pID, boolean b) { + activatedPrayers[pID] = b; + } + + public void setSprite(int x) { + spriteChanged = true; + mobSprite = x; + } + + public boolean spriteChanged() { + return spriteChanged; + } + + public void updateAppearanceID() { + if (ourAppearanceChanged) { + appearanceID++; + } + } + + public void updatePosition() { + pathHandler.updatePosition(); + } + + protected void updateSprite(Point newLocation) { + try { + int xIndex = getLocation().getX() - newLocation.getX() + 1; + int yIndex = getLocation().getY() - newLocation.getY() + 1; + setSprite(mobSprites[xIndex][yIndex]); + } catch (Exception e) { + Logger.error(e.getMessage()); + } + } + + public boolean warnedToMove() { + return warnedToMove; + } + + public void warnToMove() { + warnedToMove = true; + } +} diff --git a/GameServer/src/msc/gs/model/Npc.java b/GameServer/src/msc/gs/model/Npc.java new file mode 100644 index 0000000..34fceca --- /dev/null +++ b/GameServer/src/msc/gs/model/Npc.java @@ -0,0 +1,600 @@ +package msc.gs.model; + +import java.util.ArrayList; +import java.util.ConcurrentModificationException; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.event.DelayedEvent; +import msc.gs.event.FightEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.ItemDropDef; +import msc.gs.external.NPCDef; +import msc.gs.external.NPCLoc; +import msc.gs.plugins.dependencies.NpcAI; +import msc.gs.states.Action; +import msc.gs.states.CombatState; +import msc.gs.tools.DataConversions; + +public class Npc extends Mob { + + /** + * Used for NPC AI scripts. + */ + private int stage = 0; + boolean scripted = false; + + public int getStage() { + return stage; + } + + public void setStage(int stage) { + this.stage = stage; + } + + public boolean isSpecial() { + return special; + } + + public void setSpecial(boolean special) { + this.special = special; + } + + public int getItemid() { + return itemid; + } + + public void setItemid(int itemid) { + this.itemid = itemid; + } + + public int getExp() { + return exp; + } + + public void setExp(int exp) { + this.exp = exp; + } + + public boolean isHasArmor() { + return hasArmor; + } + + public void setHasArmor(boolean hasArmor) { + this.hasArmor = hasArmor; + } + + public boolean isUndead() { + return undead; + } + + public void setUndead(boolean undead) { + this.undead = undead; + } + + public boolean isRan() { + return ran; + } + private boolean ran = false; + /** + * The identifier for the NPC block event + */ + private static final int BLOCKED_IDENTIFIER = 69; + /** + * World instance + */ + private static final World world = Instance.getWorld(); + /** + * The player currently blocking this npc + */ + private Player blocker = null; + /** + * DelayedEvent used for unblocking an npc after set time + */ + private DelayedEvent chaseTimeout = null; + /** + * Player (if any) that this npc is chasing + */ + private Player chasing = null; + public boolean confused = false; + /** + * The npcs hitpoints + */ + private int curHits; + public boolean cursed = false; + /** + * The definition of this npc + */ + private NPCDef def; + private Syndicate syndicate = new Syndicate(); + private boolean goingToAttack = false; + /** + * The location of this npc + */ + private NPCLoc loc; + + public boolean hasRan() { + return ran; + } + + public void setRan(boolean ran) { + this.ran = ran; + } + + public Player getBlocker() { + return blocker; + } + + public void setBlocker(Player blocker) { + this.blocker = blocker; + } + + public DelayedEvent getChaseTimeout() { + return chaseTimeout; + } + + public void setChaseTimeout(DelayedEvent chaseTimeout) { + this.chaseTimeout = chaseTimeout; + } + + public boolean isConfused() { + return confused; + } + + public void setConfused(boolean confused) { + this.confused = confused; + } + + public int getCurHits() { + return curHits; + } + + public void setCurHits(int curHits) { + this.curHits = curHits; + } + + public boolean isCursed() { + return cursed; + } + + public void setCursed(boolean cursed) { + this.cursed = cursed; + } + + public boolean isGoingToAttack() { + return goingToAttack; + } + + public void setGoingToAttack(boolean goingToAttack) { + this.goingToAttack = goingToAttack; + } + + public boolean isShouldRespawn() { + return shouldRespawn; + } + + public void setShouldRespawn(boolean shouldRespawn) { + this.shouldRespawn = shouldRespawn; + } + + public DelayedEvent getTimeout() { + return timeout; + } + + public void setTimeout(DelayedEvent timeout) { + this.timeout = timeout; + } + + public boolean isWeakend() { + return weakend; + } + + public void setWeakend(boolean weakend) { + this.weakend = weakend; + } + + public void setDef(NPCDef def) { + this.def = def; + } + + public void setLoc(NPCLoc loc) { + this.loc = loc; + } + /** + * Should this npc respawn once it has been killed? + **/ + private boolean shouldRespawn = true; + /** + * DelayedEvent used for unblocking an npc after set time + */ + private DelayedEvent timeout = null; + public boolean weakend = false; + public boolean special = false; + public int itemid = -1; + public int exp = -1; // used for events. + + public Npc(int id, int startX, int startY, int minX, int maxX, int minY, int maxY) { + this(new NPCLoc(id, startX, startY, minX, maxX, minY, maxY)); + } + + public boolean isScripted() { + return scripted; + } + + public void setScripted(boolean scripted) { + this.scripted = scripted; + } + + public Npc(NPCLoc loc) { + for (int i : Constants.GameServer.UNDEAD_NPCS) { + if (loc.getId() == i) { + this.undead = true; + } + } + for (int i : Constants.GameServer.ARMOR_NPCS) { + if (loc.getId() == i) { + this.hasArmor = true; + } + } + + def = EntityHandler.getNpcDef(loc.getId()); + curHits = def.getHits(); + this.loc = loc; + super.setID(loc.getId()); + super.setLocation(Point.location(loc.startX(), loc.startY()), true); + super.setCombatLevel(Formulae.getCombatLevel(def.getAtt(), def.getDef(), def.getStr(), def.getHits(), 0, 0, 0)); + if (this.loc.getId() == 189 || this.loc.getId() == 53) { + this.def.aggressive = true; + } + for (NpcAI ai : Instance.getPluginHandler().getNpcAI()) { + if (getID() == ai.getID()) { + setScripted(true); + } + } + } + + public Syndicate getSyndicate() { + return syndicate; + } + + public void setSyndicate(Syndicate syndicate) { + this.syndicate = syndicate; + } + + public synchronized void blockedBy(Player player) { + blocker = player; + player.setNpc(this); + setBusy(true); + boolean eventExists = false; + + if (timeout != null) { + ArrayList events = Instance.getDelayedEventHandler().getEvents(); + + // Damn punk, gettin threading problems here without it synced. + try { + synchronized (events) { + for (DelayedEvent e : events) { + if (e.is(timeout)) { + e.updateLastRun(); // If the event still exists, + // reset its + // delay time. + eventExists = true; + } + } + notifyAll(); + } + } catch (ConcurrentModificationException cme) { + } + } + + if (eventExists) { + return; + } + + timeout = new DelayedEvent(null, 15000) { + + public Object getIdentifier() { + return new Integer(BLOCKED_IDENTIFIER); + } + + public void run() { + unblock(); + matchRunning = false; + } + }; + + Instance.getDelayedEventHandler().add(timeout); + } + + private Player findVictim() { + if (goingToAttack) { + return null; + } + if (hasRan()) { + return null; + } + long now = System.currentTimeMillis(); + if (getChasing() != null) { + return null; + } + ActiveTile[][] tiles = getViewArea().getViewedArea(2, 2, 2, 2); + for (int x = 0; x < tiles.length; x++) { + for (int y = 0; y < tiles[x].length; y++) { + ActiveTile t = tiles[x][y]; + if (t != null) { + for (Player p : t.getPlayers()) { + if (p.inCombat()) { + continue; + } + /* + if(p.isBusy() || p.isNonaggro() || now - p.getCombatTimer() < (p.getCombatState() == CombatState.RUNNING || p.getCombatState() == CombatState.WAITING ? 3000 : 500) || !p.nextTo(this))) { + return p; + } + */ + + if (p.isBusy() || p.isNonaggro() || now - p.getCombatTimer() < (p.getCombatState() == CombatState.RUNNING || p.getCombatState() == CombatState.WAITING ? 3000 : 500) || !p.nextTo(this) || !p.getLocation().inBounds(loc.minX - 4, loc.minY - 4, loc.maxX + 4, loc.maxY + 4)) { + continue; + } + + if (getLocation().inWilderness() || p.getCombatLevel() < (getCombatLevel() * 2) + 1) { + return p; + } + } + } + } + } + return null; + } + + public int getArmourPoints() { + return 1; + } + + public int getAttack() { + return def.getAtt(); + } + + public Player getChasing() { + return chasing; + } + + public int getCombatStyle() { + return 0; + } + + public NPCDef getDef() { + return EntityHandler.getNpcDef(getID()); + } + + public int getDefense() { + return def.getDef(); + } + + public int getHits() { + return curHits; + } + + public NPCLoc getLoc() { + return loc; + } + + public int getStrength() { + return def.getStr(); + } + + public int getWeaponAimPoints() { + return 1; + } + + public int getWeaponPowerPoints() { + return 1; + } + + public void killedBy(Mob mob, boolean stake) { + if (mob instanceof Player) { + Player player = (Player) mob; + player.getActionSender().sendSound("victory"); + if (this.isScripted()) { + Instance.getPluginHandler().getNpcAIHandler(getID()).onNpcDeath(this, player); + } + } + + Mob opponent = super.getOpponent(); + if (opponent != null) { + opponent.resetCombat(CombatState.WON); + } + + resetCombat(CombatState.LOST); + world.unregisterNpc(this); + remove(); + + Player owner = mob instanceof Player ? (Player) mob : null; + if (!this.special) { + ItemDropDef[] drops = def.getDrops(); + + int total = 0; + for (ItemDropDef drop : drops) { + total += drop.getWeight(); + } + // + int hit = DataConversions.random(0, total); + total = 0; + if (!this.getDef().name.equalsIgnoreCase("ghost")) { + if (this.getCombatLevel() >= 90 && Constants.GameServer.MEMBER_WORLD) { + if (Formulae.Rand(0, 3000) == 500) { + if (Formulae.Rand(0, 1) == 1) { + world.registerItem(new Item(1276, getX(), getY(), 1, owner)); + } else { + world.registerItem(new Item(1277, getX(), getY(), 1, owner)); + } + } + } + for (ItemDropDef drop : drops) { + if (drop == null) { + continue; + } + if (drop.getWeight() == 0) { + world.registerItem(new Item(drop.getID(), getX(), getY(), drop.getAmount(), owner)); + continue; + } + + if (hit >= total && hit < (total + drop.getWeight())) { + if (drop.getID() != -1) { + if (EntityHandler.getItemDef(drop.getID()).members && World.isMembers()) { + world.registerItem(new Item(drop.getID(), getX(), getY(), drop.getAmount(), owner)); + break; + } + if (!EntityHandler.getItemDef(drop.getID()).members) { + world.registerItem(new Item(drop.getID(), getX(), getY(), drop.getAmount(), owner)); + break; + } + } + } + total += drop.getWeight(); + } + } + } else { + if (itemid != -1) { + world.registerItem(new Item(itemid, getX(), getY(), 1, owner)); + world.sendWorldMessage(owner.getUsername() + " has killed the correct " + getDef().name + " and found a " + EntityHandler.getItemDef(itemid).getName()); + itemid = -1; + } + special = false; + } + World.getQuestManager().handleNpcKilled(this, owner); + } + + public void remove() { + if (!removed && shouldRespawn && def.respawnTime() > 0) { + Instance.getDelayedEventHandler().add(new DelayedEvent(null, def.respawnTime() * 1000) { + + public void run() { + world.registerNpc(new Npc(loc)); + matchRunning = false; + } + }); + } + + removed = true; + + } + + public void setChasing(Player player) { + + this.chasing = player; + goingToAttack = true; + + if (player == null) { + this.chasing = null; + goingToAttack = false; + return; + } + + chaseTimeout = new DelayedEvent(null, 15000) { + + public void run() { + + goingToAttack = false; + setChasing(null); + matchRunning = false; + } + }; + + Instance.getDelayedEventHandler().add(chaseTimeout); + } + + public void setHits(int lvl) { + if (lvl <= 0) { + lvl = 0; + } + + curHits = lvl; + } + + public void setRespawn(boolean respawn) { + shouldRespawn = respawn; + } + + public void unblock() { + if (blocker != null) { + blocker.setNpc(null); + blocker = null; + } + + if (timeout == null) { + return; + } + + goingToAttack = false; + setBusy(false); + timeout.stop(); + timeout = null; + } + + public void updatePosition() { + long now = System.currentTimeMillis(); + Player victim = null; + if (!isBusy() && def.isAggressive() && now - getCombatTimer() > 3000 && (victim = findVictim()) != null) { + resetPath(); + victim.resetPath(); + victim.resetAll(); + if (this.isScripted()) { + Instance.getPluginHandler().getNpcAIHandler(getID()).onNpcAttack(this, victim); + } + victim.setStatus(Action.FIGHTING_MOB); + /* Do not want + if (victim.isSleeping()) { + victim.getActionSender().sendWakeUp(false); + } + */ + victim.getActionSender().sendSound("underattack"); + victim.getActionSender().sendMessage("You are under attack!"); + + + setLocation(victim.getLocation(), true); + for (Player p : getViewArea().getPlayersInView()) { + p.removeWatchedNpc(this); + } + + victim.setBusy(true); + victim.setSprite(9); + victim.setOpponent(this); + victim.setCombatTimer(); + + setBusy(true); + setSprite(8); + setOpponent(victim); + setCombatTimer(); + FightEvent fighting = new FightEvent(victim, this, true); + fighting.setLastRun(0); + Instance.getDelayedEventHandler().add(fighting); + } + + if (now - lastMovement > 2200) { + lastMovement = now; + int rand = DataConversions.random(0, 1); + if (!isBusy() && finishedPath() && rand == 1 && !this.isRemoved()) { + int newX = DataConversions.random(loc.minX(), loc.maxX()); + int newY = DataConversions.random(loc.minY(), loc.maxY()); + super.setPath(new Path(getX(), getY(), newX, newY)); + } + } + + super.updatePosition(); + } + + @Override + public String toString() { + return "[NPC:" + EntityHandler.getNpcDef(id).getName() + "]"; + } + public boolean hasArmor = false; + public boolean undead = false; + private int team = 2; + public int getTeam() { + return team; + } + public void setTeam(int team) { + this.team = team; + } +} diff --git a/GameServer/src/msc/gs/model/Path.java b/GameServer/src/msc/gs/model/Path.java new file mode 100644 index 0000000..acfa23d --- /dev/null +++ b/GameServer/src/msc/gs/model/Path.java @@ -0,0 +1,106 @@ +package msc.gs.model; + +public class Path { + /** + * Is this path noclip? + */ + private boolean noClip = false; + /** + * The starting coordinates for the path + */ + private int startX, startY; + /** + * Offsets for the coordinates to follow + */ + private byte[] waypointXoffsets, waypointYoffsets; + + /** + * Constructs a new path with the given coords and offsets + */ + public Path(int startX, int startY, byte[] waypointXoffsets, byte[] waypointYoffsets) { + this.startX = startX; + this.startY = startY; + this.waypointXoffsets = waypointXoffsets; + this.waypointYoffsets = waypointYoffsets; + } + + public Path(int x, int y, int endX, int endY) { + startX = endX; + startY = endY; + waypointXoffsets = new byte[0]; + waypointYoffsets = new byte[0]; + } + + public Path(int x, int y, int endX, int endY, boolean noClip) { + startX = endX; + startY = endY; + waypointXoffsets = new byte[0]; + waypointYoffsets = new byte[0]; + this.noClip = noClip; + } + + /** + * Starting X coord of our path + */ + public int getStartX() { + return startX; + } + + /** + * Starting Y coord of our path + */ + public int getStartY() { + return startY; + } + + /** + * Gets the X coord of the given waypoint + */ + public int getWaypointX(int wayPoint) { + return startX + getWaypointXoffset(wayPoint); + } + + /** + * Gets the X offset of the given waypoint + */ + public byte getWaypointXoffset(int wayPoint) { + if (wayPoint >= length()) { + return (byte) 0; + } + return waypointXoffsets[wayPoint]; + } + + /** + * Gets the Y coord of the given waypoint + */ + public int getWaypointY(int wayPoint) { + return startY + getWaypointYoffset(wayPoint); + } + + /** + * Gets the Y offset of the given waypoint + */ + public byte getWaypointYoffset(int wayPoint) { + if (wayPoint >= length()) { + return (byte) 0; + } + return waypointYoffsets[wayPoint]; + } + + /** + * @return if this path is noclip + */ + public boolean isNoClip() { + return noClip; + } + + /** + * The length of our path + */ + public int length() { + if (waypointXoffsets == null) { + return 0; + } + return waypointXoffsets.length; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/PathGenerator.java b/GameServer/src/msc/gs/model/PathGenerator.java new file mode 100644 index 0000000..055e80f --- /dev/null +++ b/GameServer/src/msc/gs/model/PathGenerator.java @@ -0,0 +1,213 @@ +package msc.gs.model; + +import msc.gs.Instance; + +/** + * + * @author xEnt Class generates a path and checks if the path is valid or not. + */ +public class PathGenerator { + + /** + * If the tile has a wall on it, here is a list of the wall id's allowed to + * shoot thru Use the landscape editor to record their ID's + */ + public static final int[][] ALLOWED_WALL_ID_TYPES = { { 5, 6, 42, 14 }, // VERTICAL + // // + // WALL + // ID's + { 5, 6, 42, 14 }, // HORIZONTAL WALL ID's + { 229, 5 } // DIAGONAL WALL ID's + }; + + private int destX; + + private int destY; + + private int ourX; + + private int ourY; + + private int stuckX; + + private int stuckY; + + public PathGenerator(int x, int y, int destx, int desty) { + ourX = x; + ourY = y; + destX = destx; + destY = desty; + } + + private int[] cancelCoords(int x, int y) { + stuckX = x; + stuckY = y; + return new int[] { -1, -1 }; + } + + private int[] getNextCoords(int startX, int destX, int startY, int destY) { + try { + int[] coords = { startX, startY }; + boolean myXBlocked = false, myYBlocked = false, newXBlocked = false, newYBlocked = false; + if (startX > destX) { + myXBlocked = isBlocking(startX - 1, startY, 8); // Check right + // tiles left + // wall + coords[0] = startX - 1; + } else if (startX < destX) { + myXBlocked = isBlocking(startX + 1, startY, 2); // Check left + // tiles right + // wall + coords[0] = startX + 1; + } + + if (startY > destY) { + myYBlocked = isBlocking(startX, startY - 1, 4); // Check top + // tiles bottom + // wall + coords[1] = startY - 1; + } else if (startY < destY) { + myYBlocked = isBlocking(startX, startY + 1, 1); // Check bottom + // tiles top + // wall + coords[1] = startY + 1; + } + + // If both directions are blocked OR we are going straight and the + // direction is blocked + if ((myXBlocked && myYBlocked) || (myXBlocked && startY == destY) || (myYBlocked && startX == destX)) { + return cancelCoords(coords[0], coords[1]); + } + + if (coords[0] > startX) { + newXBlocked = isBlocking(coords[0], coords[1], 2); // Check dest + // tiles + // right + // wall + } else if (coords[0] < startX) { + newXBlocked = isBlocking(coords[0], coords[1], 8); // Check dest + // tiles + // left wall + } + + if (coords[1] > startY) { + newYBlocked = isBlocking(coords[0], coords[1], 1); // Check dest + // tiles top + // wall + } else if (coords[1] < startY) { + newYBlocked = isBlocking(coords[0], coords[1], 4); // Check dest + // tiles + // bottom + // wall + } + + // If both directions are blocked OR we are going straight and the + // direction is blocked + if ((newXBlocked && newYBlocked) || (newXBlocked && startY == coords[1]) || (myYBlocked && startX == coords[0])) { + + return cancelCoords(coords[0], coords[1]); + } + + // If only one direction is blocked, but it blocks both tiles + if ((myXBlocked && newXBlocked) || (myYBlocked && newYBlocked)) { + return cancelCoords(coords[0], coords[1]); + } + + return coords; + } catch (Exception e) { + return cancelCoords(-1, -1); + } + } + + private boolean isBlocking(byte val, byte bit) { + if ((val & bit) != 0) { // There is a wall in the way + return true; + } + if ((val & 16) != 0) { // There is a diagonal wall here: \ + return true; + } + if ((val & 32) != 0) { // There is a diagonal wall here: / + return true; + } + if ((val & 64) != 0) { // This tile is un walkable + return true; + } + return false; + } + + private boolean isBlocking(int x, int y, int bit) { + TileValue t = Instance.getWorld().getTileValue(x, y); + ActiveTile tile = Instance.getWorld().getTile(x, y); + if (tile.hasGameObject()) { + if (tile.getGameObject().getGameObjectDef().name.equalsIgnoreCase("tree")) { + return true; + } + } + else + tile.cleanItself(); + if (t.overlay == 2 || t.overlay == 11) // water & lava + return false; + return isBlocking(t.mapValue, (byte) bit); + } + + /** + * + * @return - if the path is valid to shoot a projectile too + */ + public boolean isValid() { + return !isWallInbetween(); + } + + /** + * I've added the wall data to TileValue, now we can allow certain walls to + * be shot through. + */ + private boolean isWallAllowed(int x, int y) { + TileValue t = Instance.getWorld().getTileValue(x, y); + if (t != null) { + for (int i = 0; i < ALLOWED_WALL_ID_TYPES[0].length; i++) + if (ALLOWED_WALL_ID_TYPES[0][i] == (t.verticalWallVal & 0xff)) + return true; + + for (int i = 0; i < ALLOWED_WALL_ID_TYPES[1].length; i++) + if (ALLOWED_WALL_ID_TYPES[1][i] == (t.horizontalWallVal & 0xff)) + return true; + + for (int i = 0; i < ALLOWED_WALL_ID_TYPES[2].length; i++) + if (ALLOWED_WALL_ID_TYPES[2][i] == t.diagWallVal) + return true; + } + return false; + } + + /** + * @author xEnt Calculations to check if a wall is in between your target + * your ranging/maging at + */ + private boolean isWallInbetween() { + + int enemyX = destX; + int enemyY = destY; + + int newX = ourX; + int newY = ourY; + int[] coords; + int count = 0; + while (true) { + count++; + if (count > 30) // this should not happen + break; // in case something goes wrong, let's not tie up the CPU + + coords = getNextCoords(newX, enemyX, newY, enemyY); + newX = coords[0]; + newY = coords[1]; + if (newX == -1) + return !isWallAllowed(stuckX, stuckY); + + if (newX == enemyX && newY == enemyY) + return false; + } + return false; // should not happen. + } + +} diff --git a/GameServer/src/msc/gs/model/PathHandler.java b/GameServer/src/msc/gs/model/PathHandler.java new file mode 100644 index 0000000..df6ef04 --- /dev/null +++ b/GameServer/src/msc/gs/model/PathHandler.java @@ -0,0 +1,263 @@ +package msc.gs.model; + +import msc.gs.Instance; + +public class PathHandler { + /** + * World instance + */ + private static final World world = Instance.getWorld(); + + /** + * Attempts to create a path to the given coordinates + */ + public static Path makePath(int startX, int startY, int x1, int y1, int x2, int y2, boolean flag) { + return null; + } + + /** + * The waypoint in the path we are currently at + */ + private int curWaypoint; + /** + * The mob that this path belongs to + */ + private Mob mob; + + /** + * The path we are walking + */ + private Path path; + + /** + * Constructs a new PathHandler belonging to the given Mob + */ + public PathHandler(Mob m) { + mob = m; + resetPath(); + } + + /** + * Are we are the start of the path? + */ + protected boolean atStart() { + return mob.getX() == path.getStartX() && mob.getY() == path.getStartY(); + } + + /** + * Checks if we are at the given waypoint + */ + protected boolean atWaypoint(int waypoint) { + return path.getWaypointX(waypoint) == mob.getX() && path.getWaypointY(waypoint) == mob.getY(); + } + + private int[] cancelCoords() { + resetPath(); + return new int[] { -1, -1 }; + } + + /** + * Checks if we have reached the end of our path + */ + public boolean finishedPath() { + if (path == null) { + return true; + } + if (path.length() > 0) { + return atWaypoint(path.length() - 1); + } else { + return atStart(); + } + } + + /** + * Gets the next coordinate in the right direction + */ + protected int[] getNextCoords(int startX, int destX, int startY, int destY) { + try { + int[] coords = { startX, startY }; + boolean myXBlocked = false, myYBlocked = false, newXBlocked = false, newYBlocked = false; + if (startX > destX) { + myXBlocked = isBlocking(startX - 1, startY, 8); // Check right + // tiles left + // wall + coords[0] = startX - 1; + } else if (startX < destX) { + myXBlocked = isBlocking(startX + 1, startY, 2); // Check left + // tiles right + // wall + coords[0] = startX + 1; + } + + if (startY > destY) { + myYBlocked = isBlocking(startX, startY - 1, 4); // Check top + // tiles bottom + // wall + coords[1] = startY - 1; + } else if (startY < destY) { + myYBlocked = isBlocking(startX, startY + 1, 1); // Check bottom + // tiles top + // wall + coords[1] = startY + 1; + } + + // If both directions are blocked OR we are going straight and the + // direction is blocked + if ((myXBlocked && myYBlocked) || (myXBlocked && startY == destY) || (myYBlocked && startX == destX)) { + return cancelCoords(); + } + + if (coords[0] > startX) { + newXBlocked = isBlocking(coords[0], coords[1], 2); // Check dest + // tiles + // right + // wall + } else if (coords[0] < startX) { + newXBlocked = isBlocking(coords[0], coords[1], 8); // Check dest + // tiles + // left wall + } + + if (coords[1] > startY) { + newYBlocked = isBlocking(coords[0], coords[1], 1); // Check dest + // tiles top + // wall + } else if (coords[1] < startY) { + newYBlocked = isBlocking(coords[0], coords[1], 4); // Check dest + // tiles + // bottom + // wall + } + + // If both directions are blocked OR we are going straight and the + // direction is blocked + if ((newXBlocked && newYBlocked) || (newXBlocked && startY == coords[1]) || (myYBlocked && startX == coords[0])) { + return cancelCoords(); + } + + // If only one direction is blocked, but it blocks both tiles + if ((myXBlocked && newXBlocked) || (myYBlocked && newYBlocked)) { + return cancelCoords(); + } + + return coords; + } catch (Exception e) { + return cancelCoords(); + } + } + + private boolean isBlocking(byte val, byte bit) { + if (path.isNoClip()) + return false; + + if ((val & bit) != 0) { // There is a wall in the way + return true; + } + if ((val & 16) != 0) { // There is a diagonal wall here: \ + return true; + } + if ((val & 32) != 0) { // There is a diagonal wall here: / + return true; + } + if ((val & 64) != 0) { // This tile is unwalkable + return true; + } + return false; + } + + private boolean isBlocking(int x, int y, int bit) { + if (path.isNoClip()) + return false; + if (mob instanceof Player) { + Player p = (Player) mob; + if (p.isMod()) + return false; + } + TileValue t = world.getTileValue(x, y); + return isBlocking(t.mapValue, (byte) bit) || isBlocking(t.objectValue, (byte) bit) || isMobBlocking(x, y); + } + + private boolean isMobBlocking(int x, int y) { +// ActiveTile t = world.getTile(x, y); +// if (mob instanceof Player) { +// if (t.hasNpcs()) { +// for (Npc n : t.getNpcs()) { +// if (n.getDef().isAggressive() && !n.getLocation().inWilderness()) +// return true; +// } +// } +// } +// if (mob instanceof Npc) { +// Npc n = (Npc) mob; +// if (n.getChasing() != null) +// if (t.hasPlayers() && t.getPlayers().contains(n.getChasing())) +// if (x == n.getChasing().getX() && y == n.getChasing().getY()) +// return false; +// if (t.hasNpcs() || (t.hasPlayers() && n.getChasing() != null)) +// return true; +// } +// t.cleanItself(); + return false; + } + + /** + * Resets the path (stops movement) + */ + protected void resetPath() { + path = null; + curWaypoint = -1; + } +// + /** + * Updates our position to the next in the path + */ + protected void setNextPosition() { + int[] newCoords = { -1, -1 }; + if (curWaypoint == -1) { + if (atStart()) { + curWaypoint = 0; + } else { + newCoords = getNextCoords(mob.getX(), path.getStartX(), mob.getY(), path.getStartY()); + } + } + if (curWaypoint > -1) { + if (atWaypoint(curWaypoint)) { + curWaypoint++; + } + if (curWaypoint < path.length()) { + newCoords = getNextCoords(mob.getX(), path.getWaypointX(curWaypoint), mob.getY(), path.getWaypointY(curWaypoint)); + } else { + resetPath(); + } + } + if (newCoords[0] > -1 && newCoords[1] > -1) { + mob.setLocation(Point.location(newCoords[0], newCoords[1])); + } + } + + /** + * Creates a new path and sets us walking it + */ + public void setPath(int startX, int startY, byte[] waypointXoffsets, byte[] waypointYoffsets) { + setPath(new Path(startX, startY, waypointXoffsets, waypointYoffsets)); + } + + /** + * Sets us on the given path + */ + public void setPath(Path path) { + curWaypoint = -1; + this.path = path; + } + + /** + * Updates the point in the path to the next one assuming we are not + * finished + */ + public void updatePosition() { + if (!finishedPath()) { + setNextPosition(); + } + } + +} diff --git a/GameServer/src/msc/gs/model/Player.java b/GameServer/src/msc/gs/model/Player.java new file mode 100644 index 0000000..1917426 --- /dev/null +++ b/GameServer/src/msc/gs/model/Player.java @@ -0,0 +1,3321 @@ +package msc.gs.model; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.InetSocketAddress; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.builders.MiscPacketBuilder; +import msc.gs.builders.ls.SavePacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.RSCPacket; +import msc.gs.db.DBConnection; +import msc.gs.event.DelayedEvent; +import msc.gs.event.MiniEvent; +import msc.gs.event.RangeEvent; +import msc.gs.event.ShortEvent; +import msc.gs.external.AgilityCourseDef; +import msc.gs.external.EntityHandler; +import msc.gs.external.PrayerDef; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.client.WieldHandler; +import msc.gs.quest.Quest; +import msc.gs.states.Action; +import msc.gs.states.CombatState; +import msc.gs.tools.DataConversions; +import msc.gs.util.DuelLog; +import msc.gs.util.Logger; +import msc.gs.util.StatefulEntityCollection; +import bsh.Interpreter; + +/** + * A single player. + */ +public final class Player extends Mob { + // getX() + + private long eventcd = 0; + public void setEventCD(long eventcd) { + this.eventcd = eventcd; + } + public long getEventCD() { + return eventcd; + } + + private long lastbanktime = 0; + private int lastdepositeditem = 0; + private int lastdepositedamount = 0; + + private long lastwithdrawtime = 0; + private int lastwithdrawitem = 0; + private int lastwithdrawamount = 0; + + public void setLastWithdrawTime(int itemid, int amount) { + this.lastwithdrawtime = System.currentTimeMillis(); + + lastwithdrawitem = itemid; + lastwithdrawamount = amount; + } + + public void setLastDepositTime(int itemid, int amount) { + this.lastbanktime = System.currentTimeMillis(); + + lastdepositeditem = itemid; + lastdepositedamount = amount; + } + public void setLastInvTime(int itemposition) { + this.lastinvtime = System.currentTimeMillis(); + lastitemposition = itemposition; + } + public boolean shouldThrowDepositError(int itemid, int amount) { + if(System.currentTimeMillis() - lastbanktime < 100 && lastdepositeditem == itemid && lastdepositedamount == amount) + return false; + if(amount == 0) + return false; + return true; + } + + public boolean shouldThrowWithdrawError(int itemid, int amount) { + if(System.currentTimeMillis() - lastwithdrawtime < 100 && lastwithdrawitem == itemid && lastwithdrawamount == amount) + return false; + if(amount == 0) + return false; + return true; + } + private long lastinvtime = 0; + private int lastitemposition = 0; + + public boolean shouldThrowInvError(int itemposition) { + if(System.currentTimeMillis() - lastinvtime < 100 && lastitemposition == itemposition) + return false; + + return true; + } + public Thread interpreterThread = null; + public int lastOption = -2; + public String[] lastOptions = null; + public Interpreter interpreter = new Interpreter(); + public int click = -1; + public int tempx = -1; + public boolean hasAdminPriv = false; + public boolean hasModPriv = false; + public boolean hasPmodPriv = false; + public long lastCommandUsed = System.currentTimeMillis(); + /** + * Has the first major update for this player been sent? If not, we can't + * send them any minor updates. + */ + private boolean firstMajorUpdateSent = false; + + public boolean isFirstMajorUpdateSent() { + return firstMajorUpdateSent; + } + + public void setFirstMajorUpdateSent(boolean firstMajorUpdateSent) { + this.firstMajorUpdateSent = firstMajorUpdateSent; + } + + public Thread getInterpreterThread() { + return interpreterThread; + } + + public void setInterpreterThread(Thread interpreterThread) { + this.interpreterThread = interpreterThread; + } + + public int getLastOption() { + return lastOption; + } + + public void setLastOption(int lastOption) { + this.lastOption = lastOption; + } + + public String[] getLastOptions() { + return lastOptions; + } + + public void setLastOptions(String[] lastOptions) { + this.lastOptions = lastOptions; + } + + public Interpreter getInterpreter() { + return interpreter; + } + + public void setInterpreter(Interpreter interpreter) { + this.interpreter = interpreter; + } + + public int getClick() { + return click; + } + + public void setClick(int click) { + this.click = click; + } + + public int getTempx() { + return tempx; + } + + public void setTempx(int tempx) { + this.tempx = tempx; + } + + public int getTempy() { + return tempy; + } + + public void setTempy(int tempy) { + this.tempy = tempy; + } + + public Npc getLastNpcChasingYou() { + return lastNpcChasingYou; + } + + public void setLastNpcChasingYou(Npc lastNpcChasingYou) { + this.lastNpcChasingYou = lastNpcChasingYou; + } + + public long getLastNPCChat() { + return lastNPCChat; + } + + public void setLastNPCChat(long lastNPCChat) { + this.lastNPCChat = lastNPCChat; + } + + public boolean isDoricDependency() { + return doricDependency; + } + + public void setDoricDependency(boolean doricDependency) { + this.doricDependency = doricDependency; + } + + public LinkedList getIntervals() { + return intervals; + } + + public void setIntervals(LinkedList intervals) { + this.intervals = intervals; + } + + public long getLastInterval() { + return lastInterval; + } + + public void setLastInterval(long lastInterval) { + this.lastInterval = lastInterval; + } + + public int getKillStreak() { + return killStreak; + } + + public void setKillStreak(int killStreak) { + this.killStreak = killStreak; + } + + public int tempy = -1; + public Npc lastNpcChasingYou = null; + public long lastNPCChat = System.currentTimeMillis(); + public boolean doricDependency = false; + + public boolean flagCarrier = false; + + public boolean isFlagCarrier() { + return flagCarrier; + } + + public LinkedList intervals = new LinkedList(); + + public long lastInterval = 0; + + public void addInterval() { + if (lastInterval == 0) { + lastInterval = System.currentTimeMillis(); + } else { + intervals.addFirst(System.currentTimeMillis() - lastInterval); + if (intervals.size() > 75) { + intervals.removeLast(); + } + lastInterval = System.currentTimeMillis(); + } + } + + public void setFlagCarrier(boolean flagCarrier) { + this.flagCarrier = flagCarrier; + getActionSender().sendEquipmentStats(); + } + + /** + * How long is this player muted? + */ + private long muted = 0; + + /** + * Sets the mute time. + * + * @param muted + * EPOCH time how long is the player muted. (Multiplied by 1000 + * in this) + */ + public void setMuted(long muted) { + this.muted = (muted * 1000); + } + + /** + * Is this player muted? + * + * @return + */ + public boolean isMuted() { + return (muted - System.currentTimeMillis() > 0); + } + + /** + * How many days is the user muted for? + * + * @return day + */ + public int getDaysMuted() { + return (int) ((muted - System.currentTimeMillis()) / 1000 / 3600 / 24); + } + + /** + * Methods to send packets related to actions + */ + private MiscPacketBuilder actionSender; + /** + * The current agility course the player's doing + */ + private AgilityCourseDef agilityCourseDef = null; + /** + * The Players appearance + */ + private PlayerAppearance appearance; + /** + * Players we have been attacked by signed login, used to check if we should + * get a skull for attacking back + */ + private HashMap attackedBy = new HashMap(); + // teleport + public boolean badClient = false; + /** + * Bank for banked items + */ + private Bank bank; + /** + * Bubbles needing displayed + */ + private ArrayList bubblesNeedingDisplayed = new ArrayList(); + /** + * Controls if were allowed to accept appearance updates + */ + private boolean changingAppearance = false; + /** + * Chat messages needing displayed + */ + private ArrayList chatMessagesNeedingDisplayed = new ArrayList(); + /** + * List of chat messages to send + */ + private LinkedList chatQueue = new LinkedList(); + /** + * The name of the client class they are connecting from + */ + private String className = "NOT_SET"; + private boolean clientWarn = false; + /** + * Combat style: 0 - all, 1 - str, 2 - att, 3 - def + */ + private int combatStyle = 0; + private int Combo = 0; + /** + * Added by Zerratar: Correct sleepword we are looking for! Case SenSitIvE + */ + public String correctSleepword = ""; + /** + * The current agility course object the player's on + */ + private int currentCourseObject = -1; + /** + * Stores the current IP address used + */ + private String currentIP = "0.0.0.0"; + /** + * Unix time when the player logged in + */ + private long currentLogin = 0; + /** + * The current stat array + */ + private int[] curStat = new int[18]; + /** + * Should we destroy this player? + */ + private boolean destroy = false; + /** + * DelayedEvent responsible for handling prayer drains + */ + private DelayedEvent drainer; + int drainerDelay = Integer.MAX_VALUE; + /** + * The drain rate of the prayers currently enabled + */ + private int drainRate = 0; + /** + * If the second duel screen has been accepted + */ + private boolean duelConfirmAccepted = false; + public int killStreak = 0; + /** + * List of items offered in the current duel + */ + private ArrayList duelOffer = new ArrayList(); + /** + * If the first duel screen has been accepted + */ + private boolean duelOfferAccepted = false; + /** + * Duel options + */ + private boolean[] duelOptions = new boolean[4]; + /** + * The exp level array + */ + private int[] exp = new int[18]; + /** + * Amount of fatigue - 0 to 100 + */ + private int fatigue = 0; + /** + * Event to handle following + */ + private DelayedEvent followEvent; + /** + * Who we are currently following (if anyone) + */ + private Mob following; + /** + * Map of players on players friend list + */ + private TreeMap friendList = new TreeMap(); + /** + * Users game settings, camera rotation preference etc + */ + private boolean[] gameSettings = new boolean[7]; // Why is 1 empty? + /** + * The main accounts group is + */ + private int groupID = 4; + public boolean hasAnswered = false; + /** + * List of usernameHash's of players on players ignore list + */ + private ArrayList ignoreList = new ArrayList(); + /** + * Is the player accessing their bank? + */ + private boolean inBank = false; + /** + * Quests + */ + /** + * Has the player been registered into the world? + */ + private boolean initialized = false; + public boolean inQuiz = false; + /** + * The npc we are currently interacting with + */ + private Npc interactingNpc = null; + /** + * Inventory to hold items + */ + private Inventory inventory; + private boolean invis = false; + private boolean blink = false; + + /** + * The IO session of this player + */ + private IoSession ioSession; + /** + * If the player is currently in a duel + */ + private boolean isDueling = false; + public boolean isMining = false; + /** + * Added by Zerratar: Are we sleeping? + */ + public boolean isSleeping = false; + /** + * If the player is currently in a trade + */ + private boolean isTrading = false; + /** + * List of players this player 'knows' (recieved from the client) about + */ + private HashMap knownPlayersAppearanceIDs = new HashMap(); + public String lastAnswer = null; + /** + * Last arrow fired + */ + private long lastArrow = 0; + /** + * The last menu reply this player gave in a quest + */ + // + public long lastCast = System.currentTimeMillis(); + /** + * Time of last charge spell + */ + private long lastCharge = 0; + /** + * Last packet count time + */ + private long lastCount = 0; + public long lastDeath = System.currentTimeMillis(); + /** + * Stores the last IP address used + */ + private String lastIP = "0.0.0.0"; + /** + * Unix time when the player last logged in + */ + private long lastLogin = 0; + // Player(IoSession + public long lastMineTimer = 0; + public long lastPacketRecTime = System.currentTimeMillis() / 1000; + /** + * Queue of last 100 packets, used for auto detection purposes + */ + private LinkedList lastPackets = new LinkedList(); + public long lastPacketTime = -1; + /** + * Last time a 'ping' was received + */ + private long lastPing = System.currentTimeMillis(); + public String lastPlayerInfo2 = null; + private int lastQuestMenuReply = -1; + // don't remove this. -xEnt + public int lastRandom = 0; + public long lastRange = System.currentTimeMillis(); + /** + * Time last report was sent, used to throttle reports + */ + private long lastReport = 0; + public long lastRun = System.currentTimeMillis(); // Leave this here + private long lastSaveTime = System.currentTimeMillis() + + DataConversions.random(600000, 1800000); + private long lastSleepTime = System.currentTimeMillis(); + /** + * The time of the last spell cast, used as a throttle + */ + private long lastSpellCast = 0; + /** + * Time of last trade/duel request + */ + private long lastTradeDuelRequest = 0; + /** + * Whether the player is currently logged in + */ + private boolean loggedIn = false; + public long loginTime = -1; + public int loops = 0; + /** + * Is the character male? + */ + private boolean maleGender; + /** + * The max stat array + */ + private int[] maxStat = new int[18]; + /** + * A handler for any menu we are currently in + */ + private MenuHandler menuHandler = null; + // Player + /** + * Added by Konijn + */ + private boolean noclip = false; + // Do aggros attack? + private boolean nonaggro = false; + // Is the player PK-able? + private boolean nopk = false; + /** + * NPC messages needing displayed + */ + private ArrayList npcMessagesNeedingDisplayed = new ArrayList(); + /** + * List of players who have been hit + */ + private ArrayList npcsNeedingHitsUpdate = new ArrayList(); + /** + * Thieving + */ + public boolean[] npcThief = { false, false, false, false, false, false }; // Baker + // , + // Silver, + // Spices, + // Gem. + /** + * The ID of the owning account + */ + private int owner = 1; + /** + * Amount of packets since last count + */ + private int packetCount = 0; + private boolean packetSpam = false; + /** + * The player's password + */ + private String password; + /** + * List of players who have been hit + */ + private ArrayList playersNeedingHitsUpdate = new ArrayList(); + /** + * Users privacy settings, chat block etc. + */ + private boolean[] privacySettings = new boolean[4]; + /** + * List of all projectiles needing displayed + */ + private ArrayList projectilesNeedingDisplayed = new ArrayList(); + /** + * This player's quest points + */ + private int questPoints = 0; + /** + * This player's quest stage array + */ + private HashMap questStage = new HashMap(); + public int quizPoints = 0; + /** + * Ranging event + */ + private RangeEvent rangeEvent; + /** + * If the player is reconnecting after connection loss + */ + private boolean reconnecting = false; + /** + * Is a trade/duel update required? + */ + private boolean requiresOfferUpdate = false; + public int sessionFlags = 0; + /** + * Session keys for the players session + */ + private int[] sessionKeys = new int[4]; + private ShortEvent sEvent = null; + /** + * The shop (if any) the player is currently accessing + */ + private Shop shop = null; + /** + * DelayedEvent used for removing players skull after 20mins + */ + private DelayedEvent skullEvent = null; + /** + * Sleeping shit + */ + String sleepword; + /** + * The current status of the player + */ + private Action status = Action.IDLE; + /** + * When the users subscription expires (or 0 if they don't have one) + */ + private long subscriptionExpires = 0; + /** + * If the player has been sending suscicious packets + */ + private boolean suspicious = false; + /** + * If the second trade screen has been accepted + */ + private boolean tradeConfirmAccepted = false; + /** + * List of items offered in the current trade + */ + private ArrayList tradeOffer = new ArrayList(); + /** + * If the first trade screen has been accepted + */ + private boolean tradeOfferAccepted = false; + /** + * The player's username + */ + private String username; + /** + * The player's username hash + */ + private long usernameHash; + /** + * Nearby items that we should be aware of + */ + private StatefulEntityCollection watchedItems = new StatefulEntityCollection(); + /** + * Nearby npcs that we should be aware of + */ + private StatefulEntityCollection watchedNpcs = new StatefulEntityCollection(); + /** + * Nearby game objects that we should be aware of + */ + private StatefulEntityCollection watchedObjects = new StatefulEntityCollection(); + /** + * Nearby players that we should be aware of + */ + private StatefulEntityCollection watchedPlayers = new StatefulEntityCollection(); + /** + * The player we last requested to duel with, or null for none + */ + private Player wishToDuel = null; + /** + * The player we last requested to trade with, or null for none + */ + private Player wishToTrade = null; + /** + * The items being worn by the player + */ + private int[] wornItems = new int[12]; + private int wrongwords = 0; + + /* + * Used for the Infected Blood world event + */ + + public boolean infected = false; + public long lastInfected = System.currentTimeMillis(); + + /* + * Informs the server that the player has just used Infected Blood and activate the cooldown. + */ + + public void setLastInfected() { + lastInfected = System.currentTimeMillis(); + } + + /* + * Returns the last time a player used Infected Blood. + */ + + public long lastInfected() { + return lastInfected; + } + + /* + * Is this player infected? + */ + + public boolean isInfected() { + return infected; + } + + + /* + * This method is used for the Infected Blood world event + * @author Ollie + */ + + public void setInfected() { + infected = true; + getActionSender().sendMessage("You have been afflicted by the plague."); + } + + public Player(IoSession ios) { + + ioSession = ios; + currentIP = ((InetSocketAddress) ios.getRemoteAddress()).getAddress() + .getHostAddress(); + currentLogin = System.currentTimeMillis(); + actionSender = new MiscPacketBuilder(this); + setBusy(true); + Instance.getWorld(); + for (int i : World.getQuestManager().getQuestIds()) { + questStage.put(i, -1); + } + } + + public boolean accessingBank() { + return inBank; + } + + public boolean accessingShop() { + return shop != null; + } + + public void addAttackedBy(Player p) { + attackedBy.put(p.getUsernameHash(), System.currentTimeMillis()); + } + + public void addFriend(long id, int world) { + friendList.put(id, world); + } + + public void addIgnore(long id) { + ignoreList.add(id); + } + + public void addMessageToChatQueue(byte[] messageData) { + chatQueue.add(new ChatMessage(this, messageData)); + if (chatQueue.size() > 2) { + destroy(false); + } + } + + public void addPacket(RSCPacket p) { + long now = System.currentTimeMillis(); + if (now - lastCount > 3000) { + lastCount = now; + packetCount = 0; + } + if (!DataConversions.inArray(Formulae.safePacketIDs, p.getID()) + && packetCount++ >= 60) { + destroy(false); + } + if (lastPackets.size() >= 60) { + lastPackets.remove(); + } + lastPackets.addLast(p); + } + + public void addPlayersAppearanceIDs(int[] indicies, int[] appearanceIDs) { + for (int x = 0; x < indicies.length; x++) { + knownPlayersAppearanceIDs.put(indicies[x], appearanceIDs[x]); + } + } + + public void addPrayerDrain(int prayerID) { + drainRate = 0; + PrayerDef prayer = EntityHandler.getPrayerDef(prayerID); + for (int x = 0; x <= 13; x++) { + prayer = EntityHandler.getPrayerDef(x); + if (super.isPrayerActivated(x)) { + drainRate += prayer.getDrainRate() / 2; + } + } + drainRate = drainRate - getPrayerPoints(); + if (drainRate > 0) { + drainer.setDelay((int) (240000 / drainRate)); + } else if (drainRate <= 0) { + drainRate = 0; + drainer.setDelay(Integer.MAX_VALUE); + } + } + + public void addSkull(long timeLeft) { + if (!isSkulled()) { + skullEvent = new DelayedEvent(this, 1200000) { + + public void run() { + removeSkull(); + } + }; + Instance.getDelayedEventHandler().add(skullEvent); + super.setAppearnceChanged(true); + } + skullEvent + .setLastRun(System.currentTimeMillis() - (1200000 - timeLeft)); + } + + public void addToDuelOffer(InvItem item) { + duelOffer.add(item); + } + + public void addToTradeOffer(InvItem item) { + tradeOffer.add(item); + } + + public boolean canLogout() { + if(this.location.inWilderness()) { + if(System.currentTimeMillis() - this.getLastMoved() < 10000) { + getActionSender().sendMessage("You must stand peacefully in one place for 10 seconds!"); + return false; + } + } + return !isBusy() && System.currentTimeMillis() - getCombatTimer() > 10000; + } + + public boolean canReport() { + return System.currentTimeMillis() - lastReport > 60000; + } + + public boolean castTimer() { + return System.currentTimeMillis() - lastSpellCast > 1200; + } + + public boolean checkAttack(Mob mob, boolean missile) { + if (mob instanceof Player) { + Player victim = (Player) mob; + + if (victim.isNoPK()) { + actionSender + .sendMessage("You cannot attack this staff members"); + return false; + } + + //KO9 - Konijn - check if PK'ing is disabled in this area + int i = 0; + for(Point place[] : world.getPlaces()) { + if(getLocation().inBounds(place[0].getX(), place[0].getY(), place[1].getX(), place[1].getY()) && !world.wildAttackable(i)) { + actionSender.sendMessage("You cannot attack in this area at the moment."); + return false; + } + } + + + if ((inCombat() && isDueling()) + && (victim.inCombat() && victim.isDueling())) { + Player opponent = (Player) getOpponent(); + if (opponent != null && victim.equals(opponent)) { + return true; + } + } + if (System.currentTimeMillis() - mob.getCombatTimer() < (mob + .getCombatState() == CombatState.RUNNING + || mob.getCombatState() == CombatState.WAITING ? 3000 : 500) + && !mob.inCombat()) { + return false; + } + int myWildLvl = getLocation().wildernessLevel(); + int victimWildLvl = victim.getLocation().wildernessLevel(); + if (myWildLvl < 1 || victimWildLvl < 1) { + actionSender + .sendMessage("You cannot attack other players outside of the wilderness!"); + return false; + } + int combDiff = Math.abs(getCombatLevel() - victim.getCombatLevel()); + if (combDiff > myWildLvl) { + actionSender.sendMessage("You must move to at least level " + + combDiff + " wilderness to attack " + + victim.getUsername() + "!"); + return false; + } + if (combDiff > victimWildLvl) { + actionSender + .sendMessage(victim.getUsername() + + " is not in high enough wilderness for you to attack!"); + return false; + } + return true; + } else if (mob instanceof Npc) { + Npc victim = (Npc) mob; + if (!victim.getDef().isAttackable()) { + setSuspiciousPlayer(true); + return false; + } + return true; + } + return true; + } + + public void clearBubblesNeedingDisplayed() { + bubblesNeedingDisplayed.clear(); + } + + public void clearChatMessagesNeedingDisplayed() { + chatMessagesNeedingDisplayed.clear(); + } + + public void clearDuelOptions() { + for (int i = 0; i < 4; i++) { + duelOptions[i] = false; + } + } + + public void clearNpcMessagesNeedingDisplayed() { + npcMessagesNeedingDisplayed.clear(); + } + + public void clearNpcsNeedingHitsUpdate() { + npcsNeedingHitsUpdate.clear(); + } + + public void clearPlayersNeedingHitsUpdate() { + playersNeedingHitsUpdate.clear(); + } + + public void clearProjectilesNeedingDisplayed() { + projectilesNeedingDisplayed.clear(); + } + + public boolean clientWarn() { + return clientWarn; + } + + public void clientWarn(boolean cw) { + clientWarn = cw; + } + + public void destroy(boolean force) { + if (destroy) { + return; + } + if (force || canLogout()) { + destroy = true; + actionSender.sendLogout(); + } else { + final long startDestroy = System.currentTimeMillis(); + Instance.getDelayedEventHandler().add(new DelayedEvent(this, 3000) { + + public void run() { + if (owner.canLogout() || (!(owner.inCombat() && owner.isDueling()) && System.currentTimeMillis() - startDestroy > 600000*2)) { + owner.destroy(true); + matchRunning = false; + } + } + }); + } + } + + public void destroy(boolean force, boolean logout) { + if (destroy) { + return; + } + if (force || canLogout()) { + destroy = true; + actionSender.sendLogout(); + } else { + final long startDestroy = System.currentTimeMillis(); + Instance.getDelayedEventHandler().add(new DelayedEvent(this, 3000) { + + public void run() { + if (owner.canLogout() || (!(owner.inCombat() && owner.isDueling()) && System.currentTimeMillis() - startDestroy > 60000)) { + owner.destroy(true); + matchRunning = false; + } + } + }); + } + } + + public boolean destroyed() { + return destroy; + } + + public boolean equals(Object o) { + if (o instanceof Player) { + Player p = (Player) o; + return usernameHash == p.getUsernameHash(); + } + return false; + } + + public int friendCount() { + return friendList.size(); + } + + // getArmourPoints + public MiscPacketBuilder getActionSender() { + return actionSender; + } + + /** + * @return this player's current agility course + */ + public AgilityCourseDef getAgilityCourseDef() { + return agilityCourseDef; + } + + public int getArmourPoints() { + int points = 1; + for (InvItem item : inventory.getItems()) { + if (item.isWielded()) { + points += item.getWieldableDef().getArmourPoints(); + } + } + if (this.isFlagCarrier()) { + points = (int) (points * 0.25); + } + return points < 1 ? 1 : points; + } + + public int getAttack() { + return getCurStat(0); + } + + public Bank getBank() { + return bank; + } + + public List getBubblesNeedingDisplayed() { + return bubblesNeedingDisplayed; + } + + public long getCastTimer() { + return lastSpellCast; + } + + public List getChatMessagesNeedingDisplayed() { + return chatMessagesNeedingDisplayed; + } + + public String getClassName() { + return className; + } + + public int getCombatStyle() { + return combatStyle; + } + + public int getCombo() { + return this.Combo; + } + + /** + * @return this player's current agility course + */ + public int getCurrentCourseObject() { + return currentCourseObject; + } + + public String getCurrentIP() { + return currentIP; + } + + public long getCurrentLogin() { + return currentLogin; + } + + public int getCurStat(int id) { + return curStat[id]; + } + + public int[] getCurStats() { + return curStat; + } + + // piru.sytes.net + public int getDaysSinceLastLogin() { + long now = Calendar.getInstance().getTimeInMillis() / 1000; + return (int) ((now - lastLogin) / 86400); + } + + public int getDaysSubscriptionLeft() { + long now = (System.currentTimeMillis() / 1000); + if (subscriptionExpires == 0 || now >= subscriptionExpires) { + return 0; + } + return (int) ((subscriptionExpires - now) / 86400); + } + + public int getDefense() { + return getCurStat(1); + } + + public int getDrainRate() { + return drainRate; + } + + public ArrayList getDuelOffer() { + return duelOffer; + } + + public boolean getDuelSetting(int i) { + try { + for (InvItem item : duelOffer) { + if (DataConversions.inArray(Formulae.runeIDs, item.getID())) { + setDuelSetting(1, true); + break; + } + } + for (InvItem item : wishToDuel.getDuelOffer()) { + if (DataConversions.inArray(Formulae.runeIDs, item.getID())) { + setDuelSetting(1, true); + break; + } + } + } catch (Exception e) { + } + return duelOptions[i]; + } + + public int getExp(int id) { + return exp[id]; + } + + public int[] getExps() { + return exp; + } + + public int getFatigue() { + return fatigue; + } + + public Collection> getFriendList() { + return friendList.entrySet(); + } + + public boolean getGameSetting(int i) { + return gameSettings[i]; + } + + public int getGroupID() { + return groupID; + } + + public int getHits() { + return getCurStat(3); + } + + public ArrayList getIgnoreList() { + return ignoreList; + } + + public Inventory getInventory() { + return inventory; + } + + public String getLastIP() { + return lastIP; + } + + public long getLastLogin() { + return lastLogin; + } + + public long getLastPing() { + return lastPing; + } + + /** + * @return this player's last quest menu reply + */ + public int getLastQuestMenuReply() { + return lastQuestMenuReply; + } + + public long getLastSaveTime() { + return lastSaveTime; + } + + public long getLastSleepTime() { + return lastSleepTime; + } + + public int getMagicPoints() { + int points = 1; + for (InvItem item : inventory.getItems()) { + if (item.isWielded()) { + points += item.getWieldableDef().getMagicPoints(); + } + } + return points < 1 ? 1 : points; + } + + public int getMaxStat(int id) { + return maxStat[id]; + } + + public int[] getMaxStats() { + return maxStat; + } + + public MenuHandler getMenuHandler() { + return menuHandler; + } + + public ChatMessage getNextChatMessage() { + return chatQueue.poll(); + } + + public Npc getNpc() { + return interactingNpc; + } + + public List getNpcMessagesNeedingDisplayed() { + return npcMessagesNeedingDisplayed; + } + + public List getNpcsRequiringHitsUpdate() { + return npcsNeedingHitsUpdate; + } + + public int getOwner() { + return owner; + } + + public List getPackets() { + return lastPackets; + } + + public String getPassword() { + return password; + } + + public PlayerAppearance getPlayerAppearance() { + return appearance; + } + + public List getPlayersRequiringAppearanceUpdate() { + List needingUpdates = new ArrayList(); + needingUpdates.addAll(watchedPlayers.getNewEntities()); + if (super.ourAppearanceChanged) { + needingUpdates.add(this); + } + for (Player p : watchedPlayers.getKnownEntities()) { + if (needsAppearanceUpdateFor(p)) { + needingUpdates.add(p); + } + } + return needingUpdates; + } + + public List getPlayersRequiringHitsUpdate() { + return playersNeedingHitsUpdate; + } + + public int getPrayerPoints() { + int points = 1; + for (InvItem item : inventory.getItems()) { + if (item.isWielded()) { + points += item.getWieldableDef().getPrayerPoints(); + } + } + return points < 1 ? 1 : points; + } + + public boolean getPrivacySetting(int i) { + return privacySettings[i]; + } + + public List getProjectilesNeedingDisplayed() { + return projectilesNeedingDisplayed; + } + + public int getQuestPoints() { + return questPoints; + } + + public int getQuestStage(int questId) { + return questStage.get(questId); + } + + public int getQuestStage(Quest quest) { + return getQuestStage(quest.getUniqueID()); + } + + public HashMap getQuestStages() { + return questStage; + } + + public int getRangeEquip() { + for (InvItem item : inventory.getItems()) { + if (item.isWielded() + && (DataConversions.inArray(Formulae.bowIDs, item.getID()) || DataConversions + .inArray(Formulae.xbowIDs, item.getID()))) { + return item.getID(); + } + } + return -1; + } + + public int getRangePoints() { + int points = 1; + for (InvItem item : inventory.getItems()) { + if (item.isWielded()) { + points += item.getWieldableDef().getRangePoints(); + } + } + return points < 1 ? 1 : points; + } + + public IoSession getSession() { + return ioSession; + } + + public Shop getShop() { + return shop; + } + + public int getSkillLoops() { + return loops; + } + + public int getSkillTotal() { + int total = 0; + for (int stat : maxStat) { + total += stat; + } + return total; + } + + public int getSkullTime() { + if (isSkulled()) { + return skullEvent.timeTillNextRun(); + } + return 0; + } + + public String getSleepword() { + return sleepword; + } + + public boolean getSpam() { + return packetSpam; + } + + public int getSpellWait() { + return DataConversions.roundUp((double) (1200 - (System + .currentTimeMillis() - lastSpellCast)) / 1000D); + } + + public Action getStatus() { + return status; + } + + public int getStrength() { + return getCurStat(2); + } + + public ArrayList getTradeOffer() { + return tradeOffer; + } + + public String getUsername() { + return username; + } + + public long getUsernameHash() { + return usernameHash; + } + + public StatefulEntityCollection getWatchedItems() { + return watchedItems; + } + + public StatefulEntityCollection getWatchedNpcs() { + return watchedNpcs; + } + + public StatefulEntityCollection getWatchedObjects() { + return watchedObjects; + } + + public StatefulEntityCollection getWatchedPlayers() { + return watchedPlayers; + } + + public int getWeaponAimPoints() { + int points = 1; + for (InvItem item : inventory.getItems()) { + if (item.isWielded()) { + points += item.getWieldableDef().getWeaponAimPoints(); + } + } + points -= 1; + return points < 1 ? 1 : points; + } + + public int getWeaponPowerPoints() { + int points = 1; + for (InvItem item : inventory.getItems()) { + if (item.isWielded()) { + points += item.getWieldableDef().getWeaponPowerPoints(); + } + } + points -= 1; + return points < 1 ? 1 : points; + } + + public Player getWishToDuel() { + return wishToDuel; + } + + public Player getWishToTrade() { + return wishToTrade; + } + + public int[] getWornItems() { + return wornItems; + } + + public int getWrongWords() { + return wrongwords; + } + + // incExp + public int ignoreCount() { + return ignoreList.size(); + } + + public void incCurStat(int i, int amount) { + curStat[i] += amount; + if (curStat[i] < 0) { + curStat[i] = 0; + } + } + + public int combatStyleToIndex() { + if (getCombatStyle() == 1) { + return 2; + } + if (getCombatStyle() == 2) { + return 0; + } + if (getCombatStyle() == 3) { + return 1; + } + return -1; + } + + public void incExp(int i, int amount, boolean useFatigue, boolean combat) { + if (isPMod()) + return; + if (useFatigue) { + if (fatigue >= 100) { + actionSender + .sendMessage("@gre@You are too tired to gain experience, get some rest!"); + return; + } + if (fatigue >= 96) { + actionSender + .sendMessage("@gre@You start to feel tired, maybe you should rest soon."); + } + if (i >= 3 && useFatigue) { + fatigue++; + actionSender.sendFatigue(); + } + } + if (combat && i < 3 + && (combatStyleToIndex() != i && getCombatStyle() != 0)) { // fix + // for + // accidental + // exp + // in + // other + // stats? + return; + } + + double exprate = Constants.GameServer.EXP_RATE; + if (isSubscriber()) { + exprate = Constants.GameServer.SUB_EXP_RATE; + } + + if(getLocation().wildernessLevel() > 1) { + if(combat) exprate = exprate*2; + if(getLocation().wildernessLevel() > 10 && !combat) exprate = exprate*2; + } + + exp[i] += amount * exprate; + if (exp[i] < 0) { + exp[i] = 0; + } + + int level = Formulae.experienceToLevel(exp[i]); + if (level != maxStat[i]) { + int advanced = level - maxStat[i]; + incCurStat(i, advanced); + incMaxStat(i, advanced); + int stat = this.getMaxStat(i); + if (stat == 99) { + for (Player p : world.getPlayers()) { + if (p != null) { + p + .getActionSender() + .sendMessage( + "#adm##pmd#@gre@**********************************#pmd##adm#"); + p + .getActionSender() + .sendMessage( + "@yel@Congratulations " + + this.getUsername() + + " has just reached the maximum level (99)!! in " + + Formulae.statArray[i]); + p + .getActionSender() + .sendMessage( + "#adm##pmd#@gre@*********************************#pmd##adm#"); + } + } + } + actionSender.sendStat(i); + actionSender.sendMessage("@gre@You just advanced " + advanced + " " + + Formulae.statArray[i] + " level" + + (advanced > 1 ? "s" : "") + "!"); + actionSender.sendSound("advance"); + Instance.getDelayedEventHandler().add(new MiniEvent(this) { + + public void action() { + owner.getActionSender().sendScreenshot(); + } + }); + int comb = Formulae.getCombatlevel(maxStat); + if (comb != getCombatLevel()) { + setCombatLevel(comb); + } + } + } + + public void incExp(int i, int amount, boolean useFatigue) { + + incExp(i, amount, useFatigue, false); + } + + public void incMaxStat(int i, int amount) { + maxStat[i] += amount; + if (maxStat[i] < 0) { + maxStat[i] = 0; + } + } + + public void incQuestPoints(int amount) { + setQuestPoints(getQuestPoints() + amount, true); + } + + public void informOfBubble(Bubble b) { + bubblesNeedingDisplayed.add(b); + } + + public void informOfChatMessage(ChatMessage cm) { + chatMessagesNeedingDisplayed.add(cm); + } + + public void informOfModifiedHits(Mob mob) { + if (mob instanceof Player) { + playersNeedingHitsUpdate.add((Player) mob); + } else if (mob instanceof Npc) { + npcsNeedingHitsUpdate.add((Npc) mob); + } + } + + public void informOfNpcMessage(ChatMessage cm) { + npcMessagesNeedingDisplayed.add(cm); + } + + /** + * This is a 'another player has tapped us on the shoulder' method. + * + * If we are in another players viewArea, they should in theory be in ours. + * So they will call this method to let the player know they should probably + * be informed of them. + */ + public void informOfPlayer(Player p) { + if ((!watchedPlayers.contains(p) || watchedPlayers.isRemoving(p)) + && withinRange(p)) { + watchedPlayers.add(p); + } + } + + public void informOfProjectile(Projectile p) { + projectilesNeedingDisplayed.add(p); + } + + public boolean initialized() { + return initialized; + } + + public boolean isAdmin() { + return groupID == 1; + } + + public boolean isChangingAppearance() { + return changingAppearance; + } + + public boolean isCharged() { + return System.currentTimeMillis() - lastCharge < 600000; + } + + public boolean isDuelConfirmAccepted() { + return duelConfirmAccepted; + } + + public boolean isDueling() { + return isDueling; + } + + public boolean isDuelOfferAccepted() { + return duelOfferAccepted; + } + + public boolean isFollowing() { + return followEvent != null && following != null; + } + + public boolean isFriendsWith(long usernameHash) { + return friendList.containsKey(usernameHash); + } + + public boolean isIgnoring(long usernameHash) { + return ignoreList.contains(usernameHash); + } + + public boolean isInvis() { + return invis; + } + + public boolean blink() { + return blink; + } + + public boolean isMale() { + return maleGender; + } + + public boolean isMining() { + return isMining; + } + + public void isMining(boolean arg) { + isMining = arg; + } + + public boolean isMod() { + return groupID == 2 || isAdmin(); + } + + public boolean isNonaggro() { + return nonaggro; + } + + public boolean isNoPK() { + return nopk; + } + + public boolean isPMod() { + return groupID == 6 || isMod() || isAdmin(); + } + + public boolean isRanging() { + return rangeEvent != null; + } + + public boolean isReconnecting() { + return reconnecting; + } + + public boolean isSkulled() { + return skullEvent != null; + } + + public boolean isSubscriber() { + return groupID == 5; + } + + public boolean isSuspicious() { + return suspicious; + } + + public boolean isTradeConfirmAccepted() { + return tradeConfirmAccepted; + } + + public boolean isTradeOfferAccepted() { + return tradeOfferAccepted; + } + + public boolean isTrading() { + return isTrading; + } + + public void killedBy(Mob mob) { + killedBy(mob, false); + } + + /** + * Restricts P2P stuff in wilderness. + */ + public void p2pWildy() { + if (Constants.GameServer.F2P_WILDY) { + + boolean found = false; + for (InvItem i : getInventory().getItems()) { + if (i.isWielded() && i.getDef().isMembers()) { + WieldHandler.unWieldItem(this, i, true); + getActionSender() + .sendMessage( + "Your " + + i.getDef().name + + " has been un-equipped. (P2P Item not allowed in wilderness)"); + found = true; + } + } + if (found) { + getActionSender().sendInventory(); + getActionSender().sendEquipmentStats(); + } + for (int i = 0; i < 3; i++) { + int min = getCurStat(i); + int max = getMaxStat(i); + int baseStat = getCurStat(i) > getMaxStat(i) ? getMaxStat(i) + : getCurStat(i); + int newStat = baseStat + + DataConversions.roundUp((getMaxStat(i) / 100D) * 10) + + 2; + if (min > newStat || (min > max && (i == 1 || i == 0))) { + setCurStat(i, max); + getActionSender() + .sendMessage( + "Your super/p2p potion effect has been removed, F2P Wilderness items only"); + getActionSender().sendStat(i); + } + } + if (getCurStat(4) > getMaxStat(4)) { + setCurStat(4, getMaxStat(4)); + getActionSender() + .sendMessage( + "Your super/p2p potion effect has been removed, F2P Wilderness items only"); + getActionSender().sendStat(4); + } + } + } + + public void killedBy(Mob mob, boolean stake) { + if (!loggedIn) { + Logger.error(username + " not logged in, but killed!"); + return; + } + if (mob instanceof Player) { + Player player = (Player) mob; + player.getActionSender().sendMessage("You have defeated " + getUsername() + "!"); + player.getActionSender().sendSound("victory"); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendScreenshot(); + } + }); + Instance.getServer().getLoginConnector().getActionSender().logKill(player.getUsernameHash(), usernameHash, stake); + } + Mob opponent = super.getOpponent(); + if (opponent != null) { + opponent.resetCombat(CombatState.WON); + } + actionSender.sendSound("death"); + lastDeath = System.currentTimeMillis(); + actionSender.sendDied(); + for (int i = 0; i < 18; i++) { + curStat[i] = maxStat[i]; + actionSender.sendStat(i); + } + + Player player = mob instanceof Player ? (Player) mob : null; + if (stake) { + if (player == null) { + Logger.println("Player is null (not dropping item): " + this.getUsername()); + } + for (InvItem item : duelOffer) { + InvItem affectedItem = getInventory().get(item); + if (affectedItem == null) { + setSuspiciousPlayer(true); + Logger.error("Missing staked item [" + item.getID() + ", " + item.getAmount() + "] from = " + usernameHash + "; to = " + player.getUsernameHash() + ";"); + continue; + } + if (affectedItem.isWielded()) { + affectedItem.setWield(false); + updateWornItems(affectedItem.getWieldableDef().getWieldPos(), getPlayerAppearance().getSprite(affectedItem.getWieldableDef().getWieldPos())); + } + getInventory().remove(item); + final long playerhash = DataConversions.usernameToHash(player.getUsername()); + DuelLog.sendlog(playerhash, usernameHash, item.getID(), item.getAmount(), getX(), getY(), 2); + //newItem.setdroppedby(getUsernameHash()); + world.registerItem(new Item(item.getID(), getX(), getY(), item.getAmount(), player)); + } + } else { + inventory.sort(); + ListIterator iterator = inventory.iterator(); + if (!isSkulled()) { + for (int i = 0; i < 3 && iterator.hasNext(); i++) { + if ((iterator.next()).getDef().isStackable()) { + iterator.previous(); + break; + } + } + } + if (activatedPrayers[8] && iterator.hasNext()) { + if (((InvItem) iterator.next()).getDef().isStackable()) { + iterator.previous(); + } + } + for (int slot = 0; iterator.hasNext(); slot++) { + InvItem item = (InvItem) iterator.next(); + if (item.isWielded()) { + item.setWield(false); + updateWornItems(item.getWieldableDef().getWieldPos(), + appearance.getSprite(item.getWieldableDef() + .getWieldPos())); + } + iterator.remove(); + world.registerItem(new Item(item.getID(), getX(), getY(), item.getAmount(), player)); + } + removeSkull(); + } + world.registerItem(new Item(20, getX(), getY(), 1, player)); + + for (int x = 0; x < activatedPrayers.length; x++) { + if (activatedPrayers[x]) { + activatedPrayers[x] = false; + } + removePrayerDrain(x); + } + actionSender.sendPrayers(); + + setLocation(Point.location(122, 647), true); + Collection allWatched = watchedPlayers.getAllEntities(); + for (Player p : allWatched) { + p.removeWatchedPlayer(this); + } + + resetPath(); + resetCombat(CombatState.LOST); + actionSender.sendWorldInfo(); + actionSender.sendEquipmentStats(); + actionSender.sendInventory(); + } + + public long lastAttackedBy(Player p) { + Long time = attackedBy.get(p.getUsernameHash()); + if (time != null) { + return time; + } + return 0; + } + + public void load(String username, String password, int uid, boolean reconnecting) { + try { + setID(uid); + this.password = password; + this.reconnecting = reconnecting; + usernameHash = DataConversions.usernameToHash(username); + this.username = DataConversions.hashToUsername(usernameHash); + + Instance.getServer().getLoginConnector().getActionSender().playerLogin(this); + Instance.getDelayedEventHandler().add(new DelayedEvent(this, 60000) { + + private void checkStat(int statIndex) { + if (statIndex != 3 && owner.getCurStat(statIndex) == owner.getMaxStat(statIndex)) { + owner.getActionSender().sendMessage("Your " + Formulae.statArray[statIndex] + " ability has returned to normal."); + } + } + + public void run() { + for (int statIndex = 0; statIndex < 18; statIndex++) { + if (statIndex == 5) { + continue; + }// addByte(-1 + int curStat = getCurStat(statIndex); + int maxStat = getMaxStat(statIndex); + if (curStat > maxStat) { + setCurStat(statIndex, curStat - 1); + getActionSender().sendStat(statIndex); + checkStat(statIndex); + }// sendAppear + else if (curStat < maxStat) { + setCurStat(statIndex, curStat + 1); + getActionSender().sendStat(statIndex); + checkStat(statIndex); + } + } + } + }); + drainer = new DelayedEvent(this, Integer.MAX_VALUE) { + + public void run() { + int curPrayer = getCurStat(5); + if (getDrainRate() > 0 && curPrayer > 0) { + incCurStat(5, -1); + getActionSender().sendStat(5); + if (curPrayer <= 1) { + for (int prayerID = 0; prayerID < 14; prayerID++) { + setPrayer(prayerID, false); + } + setDrainRate(0); + setDelay(Integer.MAX_VALUE); + getActionSender().sendMessage("You have run out of prayer points. Return to a church to recharge"); + getActionSender().sendPrayers(); + } + } + if (drainRate != 0) { + setDelay((int) (240000 / drainRate)); + } + } + }; + Instance.getDelayedEventHandler().add(drainer); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public boolean loggedIn() { + return loggedIn; + } + + private boolean needsAppearanceUpdateFor(Player p) { + int playerServerIndex = p.getIndex(); + if (knownPlayersAppearanceIDs.containsKey(playerServerIndex)) { + int knownPlayerAppearanceID = knownPlayersAppearanceIDs + .get(playerServerIndex); + if (knownPlayerAppearanceID != p.getAppearanceID()) { + return true; + } + } else { + return true; + } + return false; + } + + public void ping() { + lastPing = System.currentTimeMillis(); + } + + public void remove() { + removed = true; + } + + public void removeFriend(long id) { + friendList.remove(id); + } + + public void removeIgnore(long id) { + ignoreList.remove(id); + } + + public void removePrayerDrain(int prayerID) { + addPrayerDrain(prayerID); + } + + public void removeSkull() { + if (!isSkulled()) { + return; + } + super.setAppearnceChanged(true); + skullEvent.stop(); + skullEvent = null; + } + + public void removeWatchedNpc(Npc n) { + watchedNpcs.remove(n); + } + + public void removeWatchedPlayer(Player p) { + watchedPlayers.remove(p); + } + + public boolean requiresOfferUpdate() { + return requiresOfferUpdate; + } + + public void resetAll() { + resetAllExceptTradeOrDuel(); + resetTrade(); + resetDuel(); + } + + public void resetAllExceptDueling() { + resetAllExceptTradeOrDuel(); + resetTrade(); + } + + private void resetAllExceptTradeOrDuel() { + if (getMenuHandler() != null) { + resetMenuHandler(); + } + if (accessingBank()) { + resetBank(); + } + if (accessingShop()) { + resetShop(); + } + if (interactingNpc != null) { + interactingNpc.unblock(); + } + if (isFollowing()) { + resetFollowing(); + } + if (isRanging()) { + resetRange(); + } + setStatus(Action.IDLE); + } + + public void resetAllExceptTrading() { + resetAllExceptTradeOrDuel(); + resetDuel(); + } + + public void resetBank() { + setAccessingBank(false); + actionSender.hideBank(); + } + + public void resetDuel() { + Player opponent = getWishToDuel(); + if (opponent != null) { + opponent.resetDueling(); + } + resetDueling(); + } + + public void resetDueling() { + if (isDueling()) { + actionSender.sendDuelWindowClose(); + setStatus(Action.IDLE); + } + setWishToDuel(null); + setDueling(false); + setDuelOfferAccepted(false); + setDuelConfirmAccepted(false); + resetDuelOffer(); + clearDuelOptions(); + } + + public void resetDuelOffer() { + duelOffer.clear(); + } + + public void resetFollowing() { + following = null; + if (followEvent != null) { + followEvent.stop(); + followEvent = null; + } + resetPath(); + } + + public void resetMenuHandler() { + menuHandler = null; + actionSender.hideMenu(); + } + + public void resetRange() { + if (rangeEvent != null) { + rangeEvent.stop(); + // Instance.getDelayedEventHandler().remove(rangeEvent); + rangeEvent = null; + } + setStatus(Action.IDLE); + } + + public void resetShop() { + if (shop != null) { + shop.removePlayer(this); + shop = null; + actionSender.hideShop(); + } + } + + public void resetTrade() { + Player opponent = getWishToTrade(); + if (opponent != null) { + opponent.resetTrading(); + } + resetTrading(); + } + + public void resetTradeOffer() { + tradeOffer.clear(); + } + + // drain + public void resetTrading() { + if (isTrading()) { + actionSender.sendTradeWindowClose(); + setStatus(Action.IDLE); + } + setWishToTrade(null); + setTrading(false); + setTradeOfferAccepted(false); + setTradeConfirmAccepted(false); + resetTradeOffer(); + } + + public void revalidateWatchedItems() { + for (Item i : watchedItems.getKnownEntities()) { + if (!withinRange(i) || i.isRemoved() || !i.visibleTo(this)) { + watchedItems.remove(i); + } + } + } + + public void revalidateWatchedNpcs() { + for (Npc n : watchedNpcs.getKnownEntities()) { + if (!withinRange(n) || n.isRemoved()) { + watchedNpcs.remove(n); + } + } + } + + public void revalidateWatchedObjects() { + for (GameObject o : watchedObjects.getKnownEntities()) { + if (!withinRange(o) || o.isRemoved()) { + watchedObjects.remove(o); + } + } + } + + public void revalidateWatchedPlayers() { + for (Player p : watchedPlayers.getKnownEntities()) { + if (!withinRange(p) || !p.loggedIn()) { + watchedPlayers.remove(p); + knownPlayersAppearanceIDs.remove(p.getIndex()); + } + } + }// destroy + + public void save() { + + SavePacketBuilder builder = new SavePacketBuilder(); + builder.setPlayer(this); + LSPacket temp = builder.getPacket(); + if (temp != null) { + Instance.getServer().getLoginConnector().getSession().write(temp); + } + + } + + public void sayMessage(String msg, Mob to) { + ChatMessage cm = new ChatMessage(this, msg, to); + chatMessagesNeedingDisplayed.add(cm); + } + + public void setAccessingBank(boolean b) { + inBank = b; + } + + public void setAccessingShop(Shop shop) { + this.shop = shop; + if (shop != null) { + shop.addPlayer(this); + } + } + + /** + * Sets this player's current agility course + */ + public void setAgilityCourseDef(AgilityCourseDef def) { + agilityCourseDef = def; + } + + public void setAppearance(PlayerAppearance appearance) { + this.appearance = appearance; + } + + public void setArrowFired() { + lastArrow = System.currentTimeMillis(); + } + + public void setBank(Bank b) { + bank = b; + } + + public void setCastTimer() { + lastSpellCast = System.currentTimeMillis(); + } + + public void setChangingAppearance(boolean b) { + changingAppearance = b; + } + + public void setCharged() { + lastCharge = System.currentTimeMillis(); + } + + public void setClassName(String className) { + this.className = className; + } + + public void setCombatStyle(int style) { + combatStyle = style; + } + + public void setCombo(int combo) { + this.Combo = combo; + } + + /** + * Sets this player's current course object + */ + public void setCurrentCourseObject(int order) { + currentCourseObject = order; + } + + public void setCurStat(int id, int lvl) { + if (lvl <= 0) { + lvl = 0; + } + curStat[id] = lvl; + } + + // p2p + + public void setDrainRate(int rate) { + drainRate = rate; + } + + public void setDuelConfirmAccepted(boolean b) { + duelConfirmAccepted = b; + } + + public void setDueling(boolean b) { + isDueling = b; + } + + public void setDuelOfferAccepted(boolean b) { + duelOfferAccepted = b; + } + + public void setDuelSetting(int i, boolean b) { + duelOptions[i] = b; + } + + public void setExp(int id, int lvl) { + if (lvl < 0) { + lvl = 0; + } + exp[id] = lvl; + } + + public void setExp(int[] lvls) { + exp = lvls; + } + + public void setFatigue(int fatigue) { + this.fatigue = fatigue; + } + + public void setFollowing(Mob mob) { + setFollowing(mob, 0); + } + + public void setFollowing(final Mob mob, final int radius) { + if (isFollowing()) { + resetFollowing(); + } + following = mob; + followEvent = new DelayedEvent(this, 500) { + + public void run() { + if (!owner.withinRange(mob) || mob.isRemoved() + || (owner.isBusy() && !owner.isDueling())) { + resetFollowing(); + } else if (!owner.finishedPath() + && owner.withinRange(mob, radius)) { + owner.resetPath(); + } else if (owner.finishedPath() + && !owner.withinRange(mob, radius + 1)) { + owner.setPath(new Path(owner.getX(), owner.getY(), mob + .getX(), mob.getY())); + } + } + }; + Instance.getDelayedEventHandler().add(followEvent); + } + + public void setGameSetting(int i, boolean b) { + gameSettings[i] = b; + } + + public void setGroupID(int id) { + groupID = id; + } + + public void setHits(int lvl) { + setCurStat(3, lvl); + } + + public void setInitialized() { + initialized = true; + } + + public void setInventory(Inventory i) { + inventory = i; + } + + public void setinvis(boolean arg) { + invis = arg; + } + + public void setBlink(boolean arg) { + blink = arg; + } + + + public void setLastIP(String ip) { + lastIP = ip; + } + + public void setLastLogin(long l) { + lastLogin = l; + } + + // Players Online + // sendPlayers + // killedby + /** + * Sets this player's last quest menu reply + */ + public void setLastQuestMenuReply(int i) { + lastQuestMenuReply = i; + } + + public void setLastReport() { + lastReport = System.currentTimeMillis(); + } + + public void setLastSaveTime(long save) { + lastSaveTime = save; + } + + public void setLastSleepTime(long save) { + lastSleepTime = save; + } + + public void setLoggedIn(boolean loggedIn) { + if (loggedIn) { + currentLogin = System.currentTimeMillis(); + } + this.loggedIn = loggedIn; + } + + public void setMale(boolean male) { + maleGender = male; + } + + public void setMaxStat(int id, int lvl) { + if (lvl < 0) { + lvl = 0; + } + maxStat[id] = lvl; + } + + public void setMenuHandler(MenuHandler menuHandler) { + menuHandler.setOwner(this); + this.menuHandler = menuHandler; + } + + // Added by Konijn + public void setNoclip(boolean noclip) { + this.noclip = noclip; + } + + public void setnonaggro(boolean arg) { + nonaggro = arg; + } + + public void setnopk(boolean arg) { + nopk = arg; + } + + public void setNpc(Npc npc) { + // System.out.println("setNpc(npc)"); + interactingNpc = npc; + } + + public void setOwner(int owner) { + this.owner = owner; + } + + public void setPrivacySetting(int i, boolean b) { + privacySettings[i] = b; + } + + public void setQuestMenuHandler(MenuHandler menuHandler) { + this.menuHandler = menuHandler; + menuHandler.setOwner(this); + actionSender.sendMenu(menuHandler.getOptions()); + } + + public void setQuestPoints(int newquestPoints, boolean save) { + int old = questPoints; + questPoints = newquestPoints; + int gained = questPoints - old; + + if (save) { + // save(); + setLastSaveTime(System.currentTimeMillis()); + getActionSender().sendQuestInfo(); + getActionSender().sendMessage( + "@gre@You just gained " + gained + " quest point" + + (gained > 1 ? "s" : "") + "!"); + } + } + + public void setQuestStage(int qid, int stage) { + setQuestStage(qid, stage, true); + } + + public void setQuestStage(int questId, int stage, boolean save) { + setQuestStage(questId, stage, save, true); + } + + public void setQuestStage(int questId, int stage, boolean save, + boolean verbose) { + Instance.getWorld(); + Quest q = World.getQuestManager().getQuestById(questId); + + if (q == null) { + return; + } + + questStage.put(questId, stage); + + if (save) { + // save(); + getActionSender().sendQuestInfo(); + } + + if (verbose) { + if (stage == 1) { + getActionSender().sendMessage( + "You have started the " + q.getName() + " quest!"); + } else if (stage == Quest.COMPLETE) { + getActionSender().sendMessage( + "You have completed the " + q.getName() + " quest!"); + } + } + } + + public void setQuestStage(Quest quest, int stage) { + setQuestStage(quest.getUniqueID(), stage, true); + } + + // 335000 + public void setRangeEvent(RangeEvent event) { + if (isRanging()) { + resetRange(); + } + rangeEvent = event; + rangeEvent.setLastRun(lastArrow); + setStatus(Action.RANGING_MOB); + Instance.getDelayedEventHandler().add(rangeEvent); + } + + public void setRequiresOfferUpdate(boolean b) { + requiresOfferUpdate = b; + } + + public void setServerKey(long key) { + sessionKeys[2] = (int) (key >> 32); + sessionKeys[3] = (int) key; + } + + public boolean setSessionKeys(int[] keys) { + boolean valid = (sessionKeys[2] == keys[2] && sessionKeys[3] == keys[3]); + sessionKeys = keys; + return valid; + } + + public void setSEvent(ShortEvent sEvent) { + this.sEvent = sEvent; + Instance.getDelayedEventHandler().add(sEvent); + } + + public void setSkillLoops(int arg) { + loops = arg; + } + + public void setSkulledOn(Player player) { + player.addAttackedBy(this); + if (System.currentTimeMillis() - lastAttackedBy(player) > 1200000) { + addSkull(1200000); + } + } + public boolean shouldRangePass() { + int percent = (int)((this.getMaxStat(5)-40) * 0.6); + percent += 60; + if(percent > 100) percent = 100; + if(DataConversions.random(0, 100) < percent) + return false; + else + return true; + } + public void setSleepword(String sleepword) { + this.sleepword = sleepword; + } + + public void setSpam(boolean spam) { + packetSpam = spam; + } + + public void setSpellFail() { + lastSpellCast = System.currentTimeMillis() + 20000; + } + + public void setStatus(Action a) { + status = a; + } + + public void setSubscriptionExpires(long expires) { + subscriptionExpires = expires; + }// 240000 / drainRate + + public void setSuspiciousPlayer(boolean suspicious) { + String stacktrace = ""; + Exception e = new Exception(); + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw, true); + e.printStackTrace(pw); + pw.flush(); + sw.flush(); + stacktrace = sw.toString(); + this.suspicious = suspicious; + Logger.println(this.getUsername() + " was set suspicious! Stacktrace: \n" + stacktrace); + Logger.systemerr(this.getUsername() + " was set suspicious! Stacktrace: \n" + stacktrace); + world.addEntryToSnapshots(new Activity(this.getUsername(),this.getUsername() + " was set suspicious! Stacktrace: \n" + stacktrace)); + } + public void setTradeConfirmAccepted(boolean b) { + tradeConfirmAccepted = b; + } + + public void setTradeOfferAccepted(boolean b) { + tradeOfferAccepted = b; + } + + public void setTrading(boolean b) { + isTrading = b; + } + + public void setWishToDuel(Player p) { + wishToDuel = p; + } + + public void setWishToTrade(Player p) { + wishToTrade = p; + } + + public void setWornItems(int[] worn) { + wornItems = worn; + super.ourAppearanceChanged = true; + } + + public void setWrongWords() { + wrongwords += 1; + } + + public void teleport(int x, int y, boolean bubble) { + Mob opponent = super.getOpponent(); + if (inCombat()) { + resetCombat(CombatState.ERROR); + } + int count = getInventory().countId(318); + if (count > 0) { + for (int i = 0; i < count; i++) { + getActionSender().sendMessage( + "a mysterious force steals your Karamaja rum"); + if (getInventory().remove(new InvItem(318)) > -1) { + continue; + } else { + break; + } + } + getActionSender().sendInventory(); + } + if (opponent != null) { + opponent.resetCombat(CombatState.ERROR); + } + for (Object o : getWatchedPlayers().getAllEntities()) { + Player p = ((Player) o); + if (bubble) { + p.getActionSender().sendTeleBubble(getX(), getY(), false); + } + p.removeWatchedPlayer(this); + } + if (bubble) { + actionSender.sendTeleBubble(getX(), getY(), false); + } + setLocation(Point.location(x, y), true); + resetPath(); + actionSender.sendWorldInfo(); + } + + public boolean tradeDuelThrottling() { + long now = System.currentTimeMillis(); + if (now - lastTradeDuelRequest > 1000) { + lastTradeDuelRequest = now; + return false; + } + return true; + } + + public void updateViewedItems() { + List itemsInView = viewArea.getItemsInView(); + for (Item i : itemsInView) { + if (!watchedItems.contains(i) && !i.isRemoved() && withinRange(i) + && i.visibleTo(this)) { + watchedItems.add(i); + } + } + } + + public void updateViewedNpcs() { + List npcsInView = viewArea.getNpcsInView(); + for (Npc n : npcsInView) { + if (watchedNpcs.contains(n)) { + if (!World.getQuestManager().isNpcVisible(n, this) + && !n.inCombat()) { + watchedNpcs.remove(n); + } + } + + if ((!watchedNpcs.contains(n) || watchedNpcs.isRemoving(n)) + && withinRange(n)) { + if (World.getQuestManager().isNpcVisible(n, this) + || n.inCombat()) { + watchedNpcs.add(n); + } + } + } + } + + // killed + public void updateViewedObjects() { + List objectsInView = viewArea.getGameObjectsInView(); + for (GameObject o : objectsInView) { + if (!watchedObjects.contains(o) && !o.isRemoved() && withinRange(o)) { + watchedObjects.add(o); + } + } + } + + public void updateViewedPlayers() { + List playersInView = viewArea.getPlayersInView(); + for (Player p : playersInView) { + if (p.getIndex() != getIndex() && p.loggedIn()) { + if (!p.isInvis()) { + this.informOfPlayer(p); + } + if (p.isInvis() && isMod()) { + this.informOfPlayer(p); + } + if (!this.isInvis()) { + p.informOfPlayer(this); + } + } + } + } + + public List infectedBlood() { + List playersInView = viewArea.getPlayersInView(); + List radiusPlayers = new ArrayList(); + for (Player p : playersInView) { + if((p.getX() - getX() <= 2 || p.getX() - getY() >= -2) && (p.getY() - getY() <= 2 || p.getY() - getY() >= -2) && !p.isInfected()) { + radiusPlayers.add(p); + } + } + return radiusPlayers; + } + + public void updateWornItems(int index, int id) { + wornItems[index] = id; + super.ourAppearanceChanged = true; + } + + public HashMap getAttackedBy() { + return attackedBy; + } + + public void setAttackedBy(HashMap attackedBy) { + this.attackedBy = attackedBy; + } + + public boolean isBadClient() { + return badClient; + } + + public void setBadClient(boolean badClient) { + this.badClient = badClient; + } + + public LinkedList getChatQueue() { + return chatQueue; + } + + public void setChatQueue(LinkedList chatQueue) { + this.chatQueue = chatQueue; + } + + public boolean isClientWarn() { + return clientWarn; + } + + public void setClientWarn(boolean clientWarn) { + this.clientWarn = clientWarn; + } + + public String getCorrectSleepword() { + return correctSleepword; + } + + public void setCorrectSleepword(String correctSleepword) { + this.correctSleepword = correctSleepword; + } + + public int[] getCurStat() { + return curStat; + } + + public void setCurStat(int[] curStat) { + this.curStat = curStat; + } + + public boolean isDestroy() { + return destroy; + } + + public void setDestroy(boolean destroy) { + this.destroy = destroy; + } + + public DelayedEvent getDrainer() { + return drainer; + } + + public void setDrainer(DelayedEvent drainer) { + this.drainer = drainer; + } + + public int getDrainerDelay() { + return drainerDelay; + } + + public void setDrainerDelay(int drainerDelay) { + this.drainerDelay = drainerDelay; + } + + public boolean[] getDuelOptions() { + return duelOptions; + } + + public void setDuelOptions(boolean[] duelOptions) { + this.duelOptions = duelOptions; + } + + public DelayedEvent getFollowEvent() { + return followEvent; + } + + public void setFollowEvent(DelayedEvent followEvent) { + this.followEvent = followEvent; + } + + public boolean[] getGameSettings() { + return gameSettings; + } + + public void setGameSettings(boolean[] gameSettings) { + this.gameSettings = gameSettings; + } + + public boolean isHasAnswered() { + return hasAnswered; + } + + public void setHasAnswered(boolean hasAnswered) { + this.hasAnswered = hasAnswered; + } + + public boolean isInBank() { + return inBank; + } + + public void setInBank(boolean inBank) { + this.inBank = inBank; + } + + public boolean isInitialized() { + return initialized; + } + + public void setInitialized(boolean initialized) { + this.initialized = initialized; + } + + public boolean isInQuiz() { + return inQuiz; + } + + public void setInQuiz(boolean inQuiz) { + this.inQuiz = inQuiz; + } + + public Npc getInteractingNpc() { + return interactingNpc; + } + + public void setInteractingNpc(Npc interactingNpc) { + this.interactingNpc = interactingNpc; + } + + public IoSession getIoSession() { + return ioSession; + } + + public void setIoSession(IoSession ioSession) { + this.ioSession = ioSession; + } + + public boolean isSleeping() { + return isSleeping; + } + + public void setSleeping(boolean isSleeping) { + this.isSleeping = isSleeping; + } + + public HashMap getKnownPlayersAppearanceIDs() { + return knownPlayersAppearanceIDs; + } + + public void setKnownPlayersAppearanceIDs( + HashMap knownPlayersAppearanceIDs) { + this.knownPlayersAppearanceIDs = knownPlayersAppearanceIDs; + } + + public String getLastAnswer() { + return lastAnswer; + } + + public void setLastAnswer(String lastAnswer) { + this.lastAnswer = lastAnswer; + } + + public long getLastArrow() { + return lastArrow; + } + + public void setLastArrow(long lastArrow) { + this.lastArrow = lastArrow; + } + + public long getLastCast() { + return lastCast; + } + + public void setLastCast(long lastCast) { + this.lastCast = lastCast; + } + + public long getLastCharge() { + return lastCharge; + } + + public void setLastCharge(long lastCharge) { + this.lastCharge = lastCharge; + } + + public long getLastCount() { + return lastCount; + } + + public void setLastCount(long lastCount) { + this.lastCount = lastCount; + } + + public long getLastDeath() { + return lastDeath; + } + + public void setLastDeath(long lastDeath) { + this.lastDeath = lastDeath; + } + + public long getLastMineTimer() { + return lastMineTimer; + } + + public void setLastMineTimer(long lastMineTimer) { + this.lastMineTimer = lastMineTimer; + } + + public long getLastPacketRecTime() { + return lastPacketRecTime; + } + + public void setLastPacketRecTime(long lastPacketRecTime) { + this.lastPacketRecTime = lastPacketRecTime; + } + + public LinkedList getLastPackets() { + return lastPackets; + } + + + public long getLastPacketTime() { + return lastPacketTime; + } + + public void setLastPacketTime(long lastPacketTime) { + this.lastPacketTime = lastPacketTime; + } + + public String getLastPlayerInfo2() { + return lastPlayerInfo2; + } + + public void setLastPlayerInfo2(String lastPlayerInfo2) { + this.lastPlayerInfo2 = lastPlayerInfo2; + } + + public int getLastRandom() { + return lastRandom; + } + + public void setLastRandom(int lastRandom) { + this.lastRandom = lastRandom; + } + + public long getLastRange() { + return lastRange; + } + + public void setLastRange(long lastRange) { + this.lastRange = lastRange; + } + + public long getLastReport() { + return lastReport; + } + + public void setLastReport(long lastReport) { + this.lastReport = lastReport; + } + + public long getLastRun() { + return lastRun; + } + + public void setLastRun(long lastRun) { + this.lastRun = lastRun; + } + + public long getLastSpellCast() { + return lastSpellCast; + } + + public void setLastSpellCast(long lastSpellCast) { + this.lastSpellCast = lastSpellCast; + } + + public long getLastTradeDuelRequest() { + return lastTradeDuelRequest; + } + + public void setLastTradeDuelRequest(long lastTradeDuelRequest) { + this.lastTradeDuelRequest = lastTradeDuelRequest; + } + + public long getLoginTime() { + return loginTime; + } + + public void setLoginTime(long loginTime) { + this.loginTime = loginTime; + } + + public int getLoops() { + return loops; + } + + public void setLoops(int loops) { + this.loops = loops; + } + + public boolean isMaleGender() { + return maleGender; + } + + public void setMaleGender(boolean maleGender) { + this.maleGender = maleGender; + } + + public int[] getMaxStat() { + return maxStat; + }// you have been granted + + public void setMaxStat(int[] maxStat) { + this.maxStat = maxStat; + } + + public boolean isNopk() { + return nopk; + } + + public void setNopk(boolean nopk) { + this.nopk = nopk; + } + + public ArrayList getNpcsNeedingHitsUpdate() { + return npcsNeedingHitsUpdate; + } + + public void setNpcsNeedingHitsUpdate(ArrayList npcsNeedingHitsUpdate) { + this.npcsNeedingHitsUpdate = npcsNeedingHitsUpdate; + } + + public boolean[] getNpcThief() { + return npcThief; + } + + public void setNpcThief(boolean[] npcThief) { + this.npcThief = npcThief; + } + + public int getPacketCount() { + return packetCount; + } + + public void setPacketCount(int packetCount) { + this.packetCount = packetCount; + } + + public boolean isPacketSpam() { + return packetSpam; + } + + public void setPacketSpam(boolean packetSpam) { + this.packetSpam = packetSpam; + } + + public ArrayList getPlayersNeedingHitsUpdate() { + return playersNeedingHitsUpdate; + } + + public void setPlayersNeedingHitsUpdate( + ArrayList playersNeedingHitsUpdate) { + this.playersNeedingHitsUpdate = playersNeedingHitsUpdate; + } + + public boolean[] getPrivacySettings() { + return privacySettings; + } + + public void setPrivacySettings(boolean[] privacySettings) { + this.privacySettings = privacySettings; + } + + public HashMap getQuestStage() { + return questStage; + } + + public void setQuestStage(HashMap questStage) { + this.questStage = questStage; + } + + public int getQuizPoints() { + return quizPoints; + } + + public void setQuizPoints(int quizPoints) { + this.quizPoints = quizPoints; + } + + public int getSessionFlags() { + return sessionFlags; + } + + public void setSessionFlags(int sessionFlags) { + this.sessionFlags = sessionFlags; + } + + public ShortEvent getsEvent() { + return sEvent; + } + + public void setsEvent(ShortEvent sEvent) { + this.sEvent = sEvent; + } + + public DelayedEvent getSkullEvent() { + return skullEvent; + } + + public void setSkullEvent(DelayedEvent skullEvent) { + this.skullEvent = skullEvent; + } + + public int getWrongwords() { + return wrongwords; + } + + public void setWrongwords(int wrongwords) { + this.wrongwords = wrongwords; + } + + public PlayerAppearance getAppearance() { + return appearance; + }// destroy + + public int[] getExp() { + return exp; + } + + public Mob getFollowing() { + return following; + } + + public boolean isLoggedIn() { + return loggedIn; + } + + public boolean isNoclip() { + return noclip; + } + + public RangeEvent getRangeEvent() { + return rangeEvent; + } + + public boolean isRequiresOfferUpdate() { + return requiresOfferUpdate; + } + + public int[] getSessionKeys() { + return sessionKeys; + } + + public long getSubscriptionExpires() { + return subscriptionExpires; + } + + public void setActionSender(MiscPacketBuilder actionSender) { + this.actionSender = actionSender; + } + + public void setBubblesNeedingDisplayed( + ArrayList bubblesNeedingDisplayed) { + this.bubblesNeedingDisplayed = bubblesNeedingDisplayed; + } + + public void setChatMessagesNeedingDisplayed( + ArrayList chatMessagesNeedingDisplayed) { + this.chatMessagesNeedingDisplayed = chatMessagesNeedingDisplayed; + } + + public void setCurrentIP(String currentIP) { + this.currentIP = currentIP; + } + + public void setCurrentLogin(long currentLogin) { + this.currentLogin = currentLogin; + } + + public void setDuelOffer(ArrayList duelOffer) { + this.duelOffer = duelOffer; + } + + public void setFriendList(TreeMap friendList) { + this.friendList = friendList; + } + + public void setIgnoreList(ArrayList ignoreList) { + this.ignoreList = ignoreList; + } + + public void setInvis(boolean invis) { + this.invis = invis; + } + + public void setMining(boolean isMining) { + this.isMining = isMining; + } + + public void setLastPing(long lastPing) { + this.lastPing = lastPing; + } + + public void setNonaggro(boolean nonaggro) { + this.nonaggro = nonaggro; + } + + public void setNpcMessagesNeedingDisplayed( + ArrayList npcMessagesNeedingDisplayed) { + this.npcMessagesNeedingDisplayed = npcMessagesNeedingDisplayed; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setProjectilesNeedingDisplayed( + ArrayList projectilesNeedingDisplayed) { + this.projectilesNeedingDisplayed = projectilesNeedingDisplayed; + } + + public void setQuestPoints(int questPoints) { + this.questPoints = questPoints; + } + + public void setReconnecting(boolean reconnecting) { + this.reconnecting = reconnecting; + } + + public void setShop(Shop shop) { + this.shop = shop; + } + + public void setSuspicious(boolean suspicious) { + this.suspicious = suspicious; + } + + public void setTradeOffer(ArrayList tradeOffer) { + this.tradeOffer = tradeOffer; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setUsernameHash(long usernameHash) { + this.usernameHash = usernameHash; + } + + public void setWatchedItems(StatefulEntityCollection watchedItems) { + this.watchedItems = watchedItems; + } + + public void setWatchedNpcs(StatefulEntityCollection watchedNpcs) { + this.watchedNpcs = watchedNpcs; + } + + public void setWatchedObjects( + StatefulEntityCollection watchedObjects) { + this.watchedObjects = watchedObjects; + } + + public void setWatchedPlayers( + StatefulEntityCollection watchedPlayers) { + this.watchedPlayers = watchedPlayers; + } + + public boolean withinRange(Entity e) { + int xDiff = location.getX() - e.getLocation().getX(); + int yDiff = location.getY() - e.getLocation().getY(); + return xDiff <= 16 && xDiff >= -15 && yDiff <= 16 && yDiff >= -15; + } + + @Override + public String toString() { + return "[Player:" + username + "]"; + } + private int smithingbar = -1; + public void setSmithingBar(int id) { + this.smithingbar = id; + } + public int getSmithingBar() { + return smithingbar; + } +} diff --git a/GameServer/src/msc/gs/model/PlayerAppearance.java b/GameServer/src/msc/gs/model/PlayerAppearance.java new file mode 100644 index 0000000..3a8ce79 --- /dev/null +++ b/GameServer/src/msc/gs/model/PlayerAppearance.java @@ -0,0 +1,71 @@ +package msc.gs.model; + +import msc.config.Formulae; +import msc.gs.tools.DataConversions; + +public class PlayerAppearance { + + private int body; + private byte hairColour; + private int head; + private byte skinColour; + + private byte topColour; + private byte trouserColour; + + public PlayerAppearance(int hairColour, int topColour, int trouserColour, int skinColour, int head, int body) { + this.hairColour = (byte) hairColour; + this.topColour = (byte) topColour; + this.trouserColour = (byte) trouserColour; + this.skinColour = (byte) skinColour; + this.head = head; + this.body = body; + } + + public byte getHairColour() { + return hairColour; + } + + public byte getSkinColour() { + return skinColour; + } + + public int getSprite(int pos) { + switch (pos) { + case 0: + return head; + case 1: + return body; + case 2: + return 3; + default: + return 0; + } + } + + public int[] getSprites() { + return new int[] { head, body, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + } + + public byte getTopColour() { + return topColour; + } + + public byte getTrouserColour() { + return trouserColour; + } + + public boolean isValid() { + if (!DataConversions.inArray(Formulae.headSprites, head) || !DataConversions.inArray(Formulae.bodySprites, body)) { + return false; + } + if (hairColour < 0 || topColour < 0 || trouserColour < 0 || skinColour < 0) { + return false; + } + if (hairColour > 9 || topColour > 14 || trouserColour > 14 || skinColour > 4) { + return false; + } + return true; + } + +} diff --git a/GameServer/src/msc/gs/model/Point.java b/GameServer/src/msc/gs/model/Point.java new file mode 100644 index 0000000..8387596 --- /dev/null +++ b/GameServer/src/msc/gs/model/Point.java @@ -0,0 +1,101 @@ +package msc.gs.model; + +import msc.config.Formulae; +import msc.gs.Instance; + +public class Point { + public static Point location(int x, int y) { + if (x < 0 || y < 0) { + throw new IllegalArgumentException("Point may not contain non negative values x:" + x + " y:" + y); + } + return new Point(x, y); + } + + protected int x; + + protected int y; + + protected Point() { + } + + public Point(int x, int y) { + this.x = x; + this.y = y; + } + + public final boolean equals(Object o) { + if (o instanceof Point) { + return this.x == ((Point) o).x && this.y == ((Point) o).y; + } + return false; + } + + public String getDescription() { + if (inModRoom()) { + return "Mod Room"; + } + int wild = wildernessLevel(); + if (wild > 0) { + return "Wilderness lvl-" + wild; + } + return "Unknown"; + } + + public final int getX() { + return x; + } + + public final int getY() { + return y; + } + + public int hashCode() { + return x << 16 | y; + } + + public boolean inBounds(int x1, int y1, int x2, int y2) { + return x >= x1 && x <= x2 && y >= y1 && y <= y2; + } + + public boolean inModRoom() { + return inBounds(64, 1639, 80, 1643); + } + + public boolean inWilderness() { + return wildernessLevel() > 0; + } + + public String toString() { + return "(" + x + ", " + y + ")"; + } + public int wildernessLevel() { + int wild = 2203 - (y + (1776 - (944 * Formulae.getHeight(this)))); + if (x + 2304 >= 2640) { + wild = -50; + } + if (wild > 0) { + return 1 + wild / 6; + } + return 0; + } + + public static boolean inWilderness(int x, int y) { + int wild = 2203 - (y + (1776 - (944 * (int) (y / 944)))); + if (x + 2304 >= 2640) { + wild = -50; + } + if (wild > 0) { + return (1 + wild / 6) >= 1; + } + return false; + } + + public boolean atAltar() { + if(x >= 321 && y >= 183 && x <= 334 && y <= 197) return true; + return false; + } + public boolean nearAltar() { + if(x >= 321-4 && y >= 183-4 && x <= 334+4 && y <= 193+4) return true; + return false; + } +} diff --git a/GameServer/src/msc/gs/model/Projectile.java b/GameServer/src/msc/gs/model/Projectile.java new file mode 100644 index 0000000..5b2ffec --- /dev/null +++ b/GameServer/src/msc/gs/model/Projectile.java @@ -0,0 +1,35 @@ +package msc.gs.model; + +public class Projectile { + /** + * Who fired the projectile + */ + private Mob caster; + /** + * The type: 1 = magic, 2 = ranged + */ + private int type; + /** + * Who the projectile is being fired at + */ + private Mob victim; + + public Projectile(Mob caster, Mob victim, int type) { + this.caster = caster; + this.victim = victim; + this.type = type; + } + + public Mob getCaster() { + return caster; + } + + public int getType() { + return type; + } + + public Mob getVictim() { + return victim; + } + +} diff --git a/GameServer/src/msc/gs/model/Script.java b/GameServer/src/msc/gs/model/Script.java new file mode 100644 index 0000000..5de057e --- /dev/null +++ b/GameServer/src/msc/gs/model/Script.java @@ -0,0 +1,374 @@ +package msc.gs.model; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ConcurrentModificationException; + +import msc.gs.external.EntityHandler; +import msc.gs.util.Logger; +import bsh.EvalError; + +public class Script { + + public Player player; + public Npc npc; + + /** + * DONT TOUCH THIS. Sets the Player and Npc instances for reach when + * scripting. + * + * @param p + * - the player + * @param n + * - the affected npc + */ + public Script(Player p, Npc n) { + player = p; + npc = n; + + try { + player.interpreter.getNameSpace().importObject(this); + player.interpreter.source(World.getWorld().npcScripts.get(npc.getID())); + player.interpreter.getNameSpace().clear(); + } catch (EvalError e) { + error(); + //e.printStackTrace(); + } catch (FileNotFoundException e) { + error(); + //e.printStackTrace(); + } catch (IOException e) { + error(); + //e.printStackTrace(); + } catch (ConcurrentModificationException cme) { + Logger.println("got cme"); + } catch (Exception e) { + error(); + //e.printStackTrace(); + } + + } + + /** + * Unblock the NPC/Player if something unhandled happens. + */ + private void error() { + npc.unblock(); + player.setBusy(false); + } + + /** + * Sends a normal Message to the player + * + * @param msg + * - the message + */ + public void SendMessage(String msg) { + player.getActionSender().sendMessage(msg); + } + + /** + * Sends a large black box Message to the player + * + * @param msg + * - the message + */ + public void SendBoxMessage(String msg) { + player.getActionSender().sendAlert(msg, true); + } + + /** + * Sends a medium or large black box message + * + * @param msg + * - the message + * @param big + * - true if large box, false if medium + */ + public void SendBoxMessage(String msg, boolean big) { + player.getActionSender().sendAlert(msg, big); + } + + /** + * Add item(s) to the players inventory (This is setup to handle the amount + * even when the item is non stackable) + * + * @param id + * - the item's ID + * @param amount + * - the amount given + */ + public void AddItem(int id, int amount) { + InvItem item = new InvItem(id, amount); + if (item.getDef().stackable) { + player.getInventory().add(new InvItem(id, amount)); + } else { + for (int i = 0; i < amount; i++) { + player.getInventory().add(new InvItem(id)); + } + } + player.getActionSender().sendInventory(); + } + + /** + * Says something to the NPC your talking too + * + * @param msg + * - the message + */ + public void PlayerTalk(String msg) { + player.informOfChatMessage(new ChatMessage(player, msg, npc)); + Wait(2000); + + } + + /** + * the Npc your interacting with says something to you + * + * @param msg + * - the message + */ + public void NpcTalk(String msg) { + player.informOfNpcMessage(new ChatMessage(npc, msg, player)); + Wait(2000); + } + + /** + * Sleeps for the default delay (2000) + */ + public void Wait() { + Wait(2000); + } + + /** + * Wait's the delay until the next line is executed + */ + public void Wait(int ms) { + try { + Thread.currentThread().sleep(ms); + } catch (InterruptedException e) { + SendMessage(e.getMessage()); + } + } + + /** + * AUTO EXPANDING arrays (String...) with BeanShell do not yet work. I know + * this looks dodgey, but easy-scripting support comes first. Currently set + * for 7 options max. + */ + public int PickOption(String s1, String s2, String s3, String s4, String s5, String s6, String s7) { + return PickOption(new String[] { s1, s2, s3, s4, s5, s6, s7 }); + } + + public int PickOption(String s1, String s2, String s3, String s4, String s5, String s6) { + return PickOption(new String[] { s1, s2, s3, s4, s5, s6 }); + } + + public int PickOption(String s1, String s2, String s3, String s4, String s5) { + return PickOption(new String[] { s1, s2, s3, s4, s5 }); + } + + public int PickOption(String s1, String s2, String s3, String s4) { + return PickOption(new String[] { s1, s2, s3, s4 }); + } + + public int PickOption(String s1, String s2, String s3) { + return PickOption(new String[] { s1, s2, s3 }); + } + + public int PickOption(String s1, String s2) { + return PickOption(new String[] { s1, s2 }); + } + + public int PickOption(String s1) { + return PickOption(new String[] { s1 }); + } + + /** + * Sends a question menu, waits for the response. + * + * @param strs + * - array of options + * @return the option number + */ + public int PickOption(String[] strs) { + try { + long time = System.currentTimeMillis(); + player.setBusy(false); + player.lastOption = -2; + player.setMenuHandler(new MenuHandler(strs) { + public void handleReply(int option, String reply) { + if (option < 0 || option >= getOptions().length) { + npc.unblock(); + player.setBusy(false); + owner.lastOption = -1; + return; + } + owner.lastOption = option; + } + }); + player.getActionSender().sendMenu(strs); + while (player.lastOption == -2 && System.currentTimeMillis() - time < 20000) { // timeout + Wait(25); + } + if (player.lastOption == -1 || player.lastOption == -2) { + player.setBusy(false); + npc.unblock(); + return -1; + } + player.setBusy(true); + int newOpt = player.lastOption; + player.lastOption = -2; + PlayerTalk(strs[newOpt]); + return newOpt + 1; + } catch (Exception e) { + + e.printStackTrace(); + return -1; + } + } + + /** + * Teleports you from x to y (without a bubble) + * + * @param x + * - new x axis + * @param y + * - new y axis + */ + public void Teleport(int x, int y) { + player.teleport(x, y, false); + } + + /** + * Removes all the items from inventory that you specify + * + * @param id + * - the item id to remove + */ + public void RemoveAllItem(int id) { + RemoveItem(id, player.getInventory().countId(id)); + } + + /** + * Checks inventory for items/amounts. + * + * @param id + * - the items id + * @param amount + * - the amount + * @return true if it has the items. + */ + public boolean HasItem(int id, int amount) { + if (EntityHandler.getItemDef(id).stackable) { + for (InvItem i : player.getInventory().getItems()) { + if (i.getID() == id && i.getAmount() >= amount) + return true; + } + } else { + int count = 0; + for (InvItem i : player.getInventory().getItems()) { + if (i.getID() == id) + count++; + } + if (count >= amount) + return true; + } + return false; + } + + /** + * Removes item(s) from your inventory + * + * @param id + * - the item id + * @param amount + * - the amount + */ + public void RemoveItem(int id, int amount) { + if (EntityHandler.getItemDef(id).stackable) { + player.getInventory().remove(id, amount); + } else { + for (int i = 0; i < amount; i++) + player.getInventory().remove(id, 1); + } + player.getActionSender().sendInventory(); + } + + /** + * Adds experience to the selected Stat. + * + * @param stat + * - the stat number + * @param amount + * - the amount + * + */ + public void AddExp(int stat, int amount) { + player.incExp(stat, amount, true); + } + + /** + * Gets the free space in your inventory + * + * @return - the free slots + */ + public int GetInventoryFreeSpace() { + return 30 - player.getInventory().size(); + } + + /** + * Gets the max level of a stat + * + * @param stat + * @return + */ + public int GetStatMaxLevel(int stat) { + return player.getMaxStat(stat); + } + + /** + * Gets the current level of a stat + * + * @param stat + * @return + */ + public int GetStatCurLevel(int stat) { + return player.getCurStat(stat); + } + + /** + * Adds an item to your bank + * + * @param id + * - the item id + * @param amount + * - the amount + */ + public void AddBankItem(int id, int amount) { + player.getBank().add(new InvItem(id, amount)); + } + + + public int CountItem(int id) { + return player.getInventory().countId(id); + } + + public static final int ATTACK = 0; + public static final int DEFENSE = 1; + public static final int STRENGTH = 2; + public static final int HITS = 3; + public static final int RANGED = 4; + public static final int PRAYER = 5; + public static final int MAGIC = 6; + public static final int COOKING = 7; + public static final int WOODCUT = 8; + public static final int FLETCHING = 9; + public static final int FISHING = 10; + public static final int FIREMAKING = 11; + public static final int CRAFTING = 12; + public static final int SMITHING = 13; + public static final int MINING = 14; + public static final int HERBLAW = 15; + public static final int AGILITY = 16; + public static final int THIEVING = 17; +} diff --git a/GameServer/src/msc/gs/model/Sector.java b/GameServer/src/msc/gs/model/Sector.java new file mode 100644 index 0000000..dc377ef --- /dev/null +++ b/GameServer/src/msc/gs/model/Sector.java @@ -0,0 +1,90 @@ +package msc.gs.model; + +import java.io.IOException; +import java.nio.ByteBuffer; + +public class Sector { + /** + * The height of a sector + */ + public static final short HEIGHT = 48; + + /** + * The width of a sector + */ + public static final short WIDTH = 48; + + /** + * Create a new Sector from raw data packed into the given ByteBuffer + */ + public static Sector unpack(ByteBuffer in) throws IOException { + int length = Sector.WIDTH * Sector.HEIGHT; + if (in.remaining() < (10 * length)) { + throw new IOException("Provided buffer too short"); + } + Sector sector = new Sector(); + + for (int i = 0; i < length; i++) { + sector.setTile(i, Tile.unpack(in)); + } + + return sector; + } + + /** + * An array containing all the tiles within this Sector + */ + private Tile[] tiles; + + /** + * Creates a new Sector full of blank tiles + */ + public Sector() { + tiles = new Tile[Sector.WIDTH * Sector.HEIGHT]; + for (int i = 0; i < tiles.length; i++) { + tiles[i] = new Tile(); + } + } + + /** + * Gets the Tile at the given index + */ + public Tile getTile(int i) { + return tiles[i]; + } + + /** + * Gets the Tile at the given coords + */ + public Tile getTile(int x, int y) { + return getTile(x * Sector.WIDTH + y); + } + + /** + * Writes the Sector raw data into a ByteBuffer + */ + public ByteBuffer pack() throws IOException { + ByteBuffer out = ByteBuffer.allocate(10 * tiles.length); + + for (int i = 0; i < tiles.length; i++) { + out.put(tiles[i].pack()); + } + + out.flip(); + return out; + } + + /** + * Sets the the Tile at the given coords + */ + public void setTile(int x, int y, Tile t) { + setTile(x * Sector.WIDTH + y, t); + } + + /** + * Sets the Tile at the given index + */ + public void setTile(int i, Tile t) { + tiles[i] = t; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/Shop.java b/GameServer/src/msc/gs/model/Shop.java new file mode 100644 index 0000000..22578b3 --- /dev/null +++ b/GameServer/src/msc/gs/model/Shop.java @@ -0,0 +1,245 @@ +package msc.gs.model; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +import msc.gs.Instance; +import msc.gs.event.DelayedEvent; +import msc.gs.tools.DataConversions; + +public class Shop { + /** + * The maximum size of a shop + */ + private static int MAX_SIZE = 40; + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private int buyModifier; + private int[] equilibriumAmounts; + private int[] equilibriumIds; + private boolean general; + private String greeting; + private ArrayList items; + private int minX, maxX, minY, maxY; + private String name; + private String[] options; + private ArrayList players; + private int respawnRate; + private int sellModifier; + + public int add(InvItem item) { + if (item.getAmount() <= 0) { + return -1; + } + for (int index = 0; index < items.size(); index++) { + if (item.equals(items.get(index))) { + items.get(index).setAmount(items.get(index).getAmount() + item.getAmount()); + return index; + } + } + items.add(item); + return items.size() - 2; + } + + public void addPlayer(Player player) { + players.add(player); + } + + public boolean canHold(ArrayList items) { + return (MAX_SIZE - items.size()) >= getRequiredSlots(items); + } + + public boolean canHold(InvItem item) { + return (MAX_SIZE - items.size()) >= getRequiredSlots(item); + } + + public boolean contains(InvItem i) { + return items.contains(i); + } + + public int countId(int id) { + for (InvItem i : items) { + if (i.getID() == id) { + return i.getAmount(); + } + } + return 0; + } + + public boolean equals(Object o) { + if (o instanceof Shop) { + Shop shop = (Shop) o; + return shop.getName().equals(name); + } + return false; + } + + public boolean full() { + return items.size() >= MAX_SIZE; + } + + public int getBuyModifier() { + return buyModifier; + } + + public int getEquilibrium(int id) { + for (int idx = 0; idx < equilibriumIds.length; idx++) { + if (equilibriumIds[idx] == id) { + return equilibriumAmounts[idx]; + } + } + return 0; + } + + public InvItem getFirstById(int id) { + for (int index = 0; index < items.size(); index++) { + if (items.get(index).getID() == id) { + return items.get(index); + } + } + return null; + } + + public String getGreeting() { + return greeting; + } + + public ArrayList getItems() { + return items; + } + + public String getName() { + return name; + } + + public String[] getOptions() { + return options; + } + + public int getRequiredSlots(InvItem item) { + return (items.contains(item) ? 0 : 1); + } + + public int getRequiredSlots(List items) { + int requiredSlots = 0; + for (InvItem item : items) { + if (items.contains(item)) { + continue; + } + requiredSlots++; + } + return requiredSlots; + } + + public int getSellModifier() { + return sellModifier; + } + + public void initRestock() { + players = new ArrayList(); + final Shop shop = this; + Instance.getDelayedEventHandler().add(new DelayedEvent(null, respawnRate) { + private int iterations = 0; + + public void run() { + boolean changed = false; + Iterator iterator = items.iterator(); + iterations++; + while (iterator.hasNext()) { + InvItem shopItem = iterator.next(); + int eq = shop.getEquilibrium(shopItem.getID()); + if ((iterations % 4 == 0) && shopItem.getAmount() > eq) { + shopItem.setAmount(shopItem.getAmount() - 1); + if (shopItem.getAmount() <= 0 && !DataConversions.inArray(equilibriumIds, shopItem.getID())) { + iterator.remove(); + } + changed = true; + } else if (shopItem.getAmount() < eq) { + shopItem.setAmount(shopItem.getAmount() + 1); + changed = true; + } + } + if (changed) { + shop.updatePlayers(); + } + } + }); + } + + public boolean isGeneral() { + return general; + } + + public ListIterator iterator() { + return items.listIterator(); + } + + public int remove(InvItem item) { + Iterator iterator = items.iterator(); + for (int index = 0; iterator.hasNext(); index++) { + InvItem i = iterator.next(); + if (item.getID() == i.getID()) { + if (item.getAmount() < i.getAmount()) { + i.setAmount(i.getAmount() - item.getAmount()); + } else if (DataConversions.inArray(equilibriumIds, item.getID())) { + i.setAmount(0); + } else { + iterator.remove(); + } + return index; + } + } + return -1; + } + + public void removePlayer(Player player) { + players.remove(player); + } + + public void setEquilibrium() { + equilibriumIds = new int[items.size()]; + equilibriumAmounts = new int[items.size()]; + for (int idx = 0; idx < items.size(); idx++) { + equilibriumIds[idx] = items.get(idx).getID(); + equilibriumAmounts[idx] = items.get(idx).getAmount(); + } + } + + public boolean shouldStock(int id) { + if (general) { + return true; + } + for (int eqID : equilibriumIds) { + if (eqID == id) { + return true; + } + } + return false; + } + + public int size() { + return items.size(); + } + + public void updatePlayers() { + Iterator iterator = players.iterator(); + while (iterator.hasNext()) { + Player p = iterator.next(); + if (!equals(p.getShop())) { + iterator.remove(); + continue; + } + p.getActionSender().showShop(this); + } + } + + public boolean withinShop(Point p) { + return p.getX() >= minX && p.getX() <= maxX && p.getY() >= minY && p.getY() <= maxY; + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/Syndicate.java b/GameServer/src/msc/gs/model/Syndicate.java new file mode 100644 index 0000000..b8099cf --- /dev/null +++ b/GameServer/src/msc/gs/model/Syndicate.java @@ -0,0 +1,46 @@ +package msc.gs.model; + +import java.util.ArrayList; + +import msc.gs.model.mini.Damager; + +/** + * Each NPC has a Damage Syndicate (pool of damage) binded to them. + * + * @author xEnt + * + */ +public class Syndicate { + /** + * All the damagers of this NPC Syndicate + */ + private ArrayList damagers = new ArrayList(); + + public void addDamage(Player p, int damage, boolean magic, boolean combat, boolean ranged) { + boolean exist = false; + Damager other = null; + for (Damager damager : getDamagers()) { + if (damager.getPlayer().getUsername().equals(p.getUsername())) { + exist = true; + other = damager; + break; + } + } + if (!exist) { + other = new Damager(p); + getDamagers().add(other); + } + other.setDamage(other.getDamage() + damage); + if (magic) + other.setUseMagic(true); + if (combat) + other.setUseCombat(true); + if (ranged) + other.setUseRanged(true); + } + + public ArrayList getDamagers() { + return damagers; + } + +} diff --git a/GameServer/src/msc/gs/model/TelePoint.java b/GameServer/src/msc/gs/model/TelePoint.java new file mode 100644 index 0000000..f00cf33 --- /dev/null +++ b/GameServer/src/msc/gs/model/TelePoint.java @@ -0,0 +1,9 @@ +package msc.gs.model; + +public class TelePoint extends Point { + public String command; + + public String getCommand() { + return command; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/Tile.java b/GameServer/src/msc/gs/model/Tile.java new file mode 100644 index 0000000..63af876 --- /dev/null +++ b/GameServer/src/msc/gs/model/Tile.java @@ -0,0 +1,83 @@ +package msc.gs.model; + +import java.io.IOException; +import java.nio.ByteBuffer; + +/** + * A representation of one tile within our world map + */ +public class Tile { + /** + * Create a new tile from raw data packed into the given ByteBuffer + */ + public static Tile unpack(ByteBuffer in) throws IOException { + if (in.remaining() < 10) { + throw new IOException("Provided buffer too short"); + } + Tile tile = new Tile(); + + tile.groundElevation = in.get(); + tile.groundTexture = in.get(); + tile.groundOverlay = in.get(); + tile.roofTexture = in.get(); + tile.horizontalWall = in.get(); + tile.verticalWall = in.get(); + tile.diagonalWalls = in.getInt(); + + return tile; + } + + /** + * The ID of any diagonal walls on this tile + */ + public int diagonalWalls = 0; + + /** + * The elevation of this tile + */ + public byte groundElevation = 0; + + /** + * The overlay texture ID + */ + public byte groundOverlay = 0; + + /** + * The texture ID of this tile + */ + public byte groundTexture = 0; + + /** + * The texture ID of any horizontal wall on this tile + */ + public byte horizontalWall = 0; + + /** + * The texture ID of the roof of this tile + */ + public byte roofTexture = 0; + + /** + * The texture ID of any vertical wall on this tile + */ + public byte verticalWall = 0; + + /** + * Writes the Tile raw data into a ByteBuffer + */ + public ByteBuffer pack() throws IOException { + ByteBuffer out = ByteBuffer.allocate(10); + + out.put(groundElevation); + out.put(groundTexture); + out.put(groundOverlay); + out.put(roofTexture); + + out.put(horizontalWall); + out.put(verticalWall); + out.putInt(diagonalWalls); + + out.flip(); + return out; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/TileValue.java b/GameServer/src/msc/gs/model/TileValue.java new file mode 100644 index 0000000..5951451 --- /dev/null +++ b/GameServer/src/msc/gs/model/TileValue.java @@ -0,0 +1,11 @@ +package msc.gs.model; + +public class TileValue { + public int diagWallVal = 0; + public byte horizontalWallVal = 0; + public byte mapValue = 0; + public byte objectValue = 0; + public byte overlay = 0; + public byte verticalWallVal = 0; + public byte elevation = 0; +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/model/ViewArea.java b/GameServer/src/msc/gs/model/ViewArea.java new file mode 100644 index 0000000..b25ca87 --- /dev/null +++ b/GameServer/src/msc/gs/model/ViewArea.java @@ -0,0 +1,119 @@ +package msc.gs.model; + +import java.util.ArrayList; +import java.util.List; + +import msc.gs.Instance; + +public class ViewArea { + private static World world = Instance.getWorld(); + private Mob mob; + + public ViewArea(Mob mob) { + this.mob = mob; + } + + public List getGameObjectsInView() { + List objects = new ArrayList(); + ActiveTile[][] viewArea = getViewedArea(21, 21, 21, 21); + for (int x = 0; x < viewArea.length; x++) { + for (int y = 0; y < viewArea[x].length; y++) { + ActiveTile t = viewArea[x][y]; + if (t != null) { + if (t.hasGameObject()) { + objects.add(t.getGameObject()); + } + } + } + } + return objects; + } + + public List getItemsInView() { + List items = new ArrayList(); + ActiveTile[][] viewArea = getViewedArea(21, 21, 21, 21); + for (int x = 0; x < viewArea.length; x++) { + for (int y = 0; y < viewArea[x].length; y++) { + ActiveTile t = viewArea[x][y]; + if (t != null) { + items.addAll(t.getItems()); + } + } + } + return items; + } + + public List getNpcsInView() { + List npcs = new ArrayList(); + ActiveTile[][] viewArea = getViewedArea(15, 15, 16, 16); + for (int x = 0; x < viewArea.length; x++) + for (int y = 0; y < viewArea[x].length; y++) { + ActiveTile t = viewArea[x][y]; + if (t != null) { + List temp = t.getNpcs(); + if (temp != null) { + npcs.addAll(temp); + } + } + } + return npcs; + } + + public List getPlayersInView() { + List players = new ArrayList(); + ActiveTile[][] viewArea = getViewedArea(15, 15, 16, 16); + for (int x = 0; x < viewArea.length; x++) + for (int y = 0; y < viewArea[x].length; y++) { + ActiveTile t = viewArea[x][y]; + if (t != null) { + List temp = t.getPlayers(); + if (temp != null) { + players.addAll(temp); + } + } + } + return players; + } + + public ActiveTile[][] getViewedArea(int x1, int y1, int x2, int y2) { + int mobX = mob.getX(); + int mobY = mob.getY(); + int startX, startY, endX, endY; + startX = mobX - x1; + if (startX < 0) { + startX = 0; + } + startY = mobY - y1; + if (startY < 0) { + startY = 0; + } + endX = mobX + x2; + if (endX >= World.MAX_WIDTH) { + endX = World.MAX_WIDTH - 1; + } + endY = mobY + y2; + if (endY >= World.MAX_HEIGHT) { + endY = World.MAX_HEIGHT - 1; + } + int xWidth; + int yWidth; + if (startX > endX) { + xWidth = startX - endX; + } else { + xWidth = endX - startX; + } + if (startY > endY) { + yWidth = startY - endY; + } else { + yWidth = endY - startY; + } + ActiveTile[][] temp = new ActiveTile[xWidth][yWidth]; + for (int x = 0; (x + startX) < endX; x++) { + for (int y = 0; (y + startY) < endY; y++) { + temp[x][y] = world.tiles[x + startX][y + startY]; + } + } + return temp; + } + +} diff --git a/GameServer/src/msc/gs/model/World.java b/GameServer/src/msc/gs/model/World.java new file mode 100644 index 0000000..af624fa --- /dev/null +++ b/GameServer/src/msc/gs/model/World.java @@ -0,0 +1,792 @@ +package msc.gs.model; + +import java.io.File; +import java.util.ArrayList; +import java.util.Deque; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.TreeMap; + +import msc.config.Constants; +import msc.gs.Server; +import msc.gs.core.ClientUpdater; +import msc.gs.core.DelayedEventHandler; +import msc.gs.db.DBConnection; +import msc.gs.event.DelayedEvent; +import msc.gs.event.SingleEvent; +import msc.gs.external.GameObjectLoc; +import msc.gs.external.NPCLoc; +import msc.gs.io.WorldLoader; +import msc.gs.model.snapshot.Snapshot; +import msc.gs.npchandler.NpcHandler; +import msc.gs.npchandler.NpcHandlerDef; +import msc.gs.quest.QuestManager; +import msc.gs.states.CombatState; +import msc.gs.util.EntityList; +import msc.gs.util.Logger; +import msc.gs.util.PersistenceManager; + +public final class World { + + /** + * NpcScripts are stored in here + */ + public HashMap npcScripts = new HashMap(); + /** + * Double ended queue to store snapshots into + */ + private Deque snapshots = new LinkedList(); + + /** + * Returns double-ended queue for snapshots. + */ + public synchronized Deque getSnapshots() { + return snapshots; + } + /** + * Add entry to snapshots + */ + public synchronized void addEntryToSnapshots(Snapshot snapshot) { + snapshots.offerFirst(snapshot); + } + public void loadScripts() { + int npccount = 0; + int error = 0; + for (File files : new File("scripts/").listFiles()) { + try { + int id = Integer.parseInt(files.getName().substring(0, 3).trim()); + npcScripts.put(id, files.getAbsolutePath()); + } catch (Exception e) { + error++; + continue; + } finally { + npccount++; + } + } + Logger.println(npccount + " NPC Scripts loaded! " + (error > 1 ? ((error - 1) + " Error scripts") : "")); + } + + + public void sendWorldMessage(String msg) { + for (Player p : getPlayers()) { + p.getActionSender().sendMessage(msg); + } + } + public void sendWorldAnnouncement(String msg) { + for (Player p : getPlayers()) { + p.getActionSender().sendMessage("%" + msg); + } + } + + public void sendMessage(Player p, String msg) { + p.getActionSender().sendMessage(msg); + } + + /* Places */ + protected Point[][] places = { { new Point(252,349), new Point(260,356) } }; + + /* Can attack in these places? */ + public boolean[] wildAttackable = { false }; // 0 = No + + public final Point[][] getPlaces() { + return places; + } + public final boolean wildAttackable(int i) { + return wildAttackable[i]; + } + /* End of Places */ + + /** + * Allow Dueling? + */ + public static boolean DUEL = false; + /** + * The maximum height of the map (944 squares per level) + */ + public static final int MAX_HEIGHT = 3776; + /** + * The maximum width of the map + */ + public static final int MAX_WIDTH = 944; + /** + * Manages quests + */ + private static QuestManager questManager = null; + /** + * World instance + */ + public static boolean SERVER_MUTED = false; + private static World worldInstance; + + /** + * @return this world's quest manager + */ + public static QuestManager getQuestManager() { + return questManager; + } + + public static boolean isMembers() { + return Constants.GameServer.MEMBER_WORLD; + } + public WorldLoader wl; + /** + * Database connection + */ + private static DBConnection db; + + public DBConnection getDB() { + return db; + } + + public boolean dbKeepAlive() { + return db.isConnected(); + } + + public static void initilizeDB() { + db = new DBConnection(); + db.initilizePreparedStatements(db); + } + /** + * returns the only instance of this world, if there is not already one, + * makes it and loads everything + */ + public static synchronized World getWorld() { + if (worldInstance == null) { + worldInstance = new World(); + try { + worldInstance.wl = new WorldLoader(); + worldInstance.wl.loadWorld(worldInstance); + worldInstance.loadNpcHandlers(); + worldInstance.loadScripts(); + if (questManager == null) { + questManager = new QuestManager(); + questManager.loadQuests(); + } + + } catch (Exception e) { + Logger.error(e); + } + } + return worldInstance; + } + /** + * The client updater instance + */ + private ClientUpdater clientUpdater; + /** + * The delayedeventhandler instance + */ + private DelayedEventHandler delayedEventHandler; + public int eventlev = 0; + /** + * Event vars + */ + public int eventx = 0; + public int eventy = 0; + /** + * Grim reaper pickpocketable + */ + public boolean grimpock = false; + public String lastAnswer = null; + /** + * The mapping of npc IDs to their handler + */ + private TreeMap npcHandlers = new TreeMap(); + /** + * A list of all npcs on the server + */ + private EntityList npcs = new EntityList(4000); + /** + * A list of all players on the server + */ + private EntityList players = new EntityList(2000); + public boolean Quiz = false; + public boolean QuizSignup = true; + /** + * The server instance + */ + private Server server; + /** + * A list of all shops on the server + */ + private List shops = new ArrayList(); + /** + * The tiles the map is made up of + */ + public ActiveTile[][] tiles = new ActiveTile[MAX_WIDTH][MAX_HEIGHT]; + /** + * Data about the tiles, are they walkable etc + */ + private TileValue[][] tileType = new TileValue[MAX_WIDTH][MAX_HEIGHT]; + + /** + * Counts how many npcs are currently here + */ + public int countNpcs() { + return npcs.size(); + } + + /** + * Counts how many players are currently connected + */ + public int countPlayers() { + return players.size(); + } + + /** + * Adds a DelayedEvent that will remove a GameObject + */ + public void delayedRemoveObject(final GameObject object, final int delay) { + delayedEventHandler.add(new SingleEvent(null, delay) { + + public void action() { + ActiveTile tile = getTile(object.getLocation()); + if (tile.hasGameObject() && tile.getGameObject().equals(object)) { + unregisterGameObject(object); + } + } + }); + } + + /** + * Adds a DelayedEvent that will spawn a GameObject + */ + public void delayedSpawnObject(final GameObjectLoc loc, final int respawnTime) { + delayedEventHandler.add(new SingleEvent(null, respawnTime) { + + public void action() { + registerGameObject(new GameObject(loc)); + } + }); + } + + public int eventlev() { + return eventlev; + } + + public int eventx() { + return eventx; + } + + public int eventy() { + return eventy; + } + + /** + * Gets the ClientUpdater instance + */ + public ClientUpdater getClientUpdater() { + return clientUpdater; + } + + /** + * Gets the DelayedEventHandler instance + */ + public DelayedEventHandler getDelayedEventHandler() { + return delayedEventHandler; + } + + /** + * Gets an Npc by their server index + */ + public Npc getNpc(int idx) { + return npcs.get(idx); + } + + /** + * Gets an npc by their coords and id] + */ + public Npc getNpc(int id, int minX, int maxX, int minY, int maxY) { + for (Npc npc : npcs) { + if (npc.getID() == id && npc.getX() >= minX && npc.getX() <= maxX && npc.getY() >= minY && npc.getY() <= maxY) { + return npc; + } + } + return null; + } + + /** + * Gets an npc by their coords and id] + */ + public Npc getNpc(int id, int minX, int maxX, int minY, int maxY, boolean notNull) { + for (Npc npc : npcs) { + if (npc.getID() == id && npc.getX() >= minX && npc.getX() <= maxX && npc.getY() >= minY && npc.getY() <= maxY) { + if (npc == null) { + continue; + } else if (!npc.inCombat()) { + return npc; + } + } + } + return null; + } + + /** + * returns the assosiated npc handler + */ + public NpcHandler getNpcHandler(int npcID) { + return npcHandlers.get(npcID); + } + + /** + * Gets the list of npcs on the server + */ + public EntityList getNpcs() { + return npcs; + } + + /** + * Gets a Player by their server index + */ + public Player getPlayer(int idx) { + return players.get(idx); + } + + /** + * Gets a player by their username hash + */ + public Player getPlayer(long usernameHash) { + for (Player p : players) { + if (p.getUsernameHash() == usernameHash) { + return p; + } + } + return null; + } + + /** + * Gets the list of players on the server + */ + public EntityList getPlayers() { + return players; + } + + /** + * Gets the server instance + */ + public Server getServer() { + return server; + } + + /** + * Gets a list of all shops + */ + public Shop getShop(Point location) { + for (Shop shop : shops) { + if (shop.withinShop(location)) { + return shop; + } + } + return null; + } + + public List getShops() { + return shops; + } + + /** + * Gets the active tile at point x, y + */ + public ActiveTile getTile(int x, int y) { + if (!withinWorld(x, y)) { + return null; + } + ActiveTile t = tiles[x][y]; + if (t == null) { + t = new ActiveTile(x, y); + tiles[x][y] = t; + } + return t; + } + + /** + * Gets the tile at a point + */ + public ActiveTile getTile(Point p) { + return getTile(p.getX(), p.getY()); + } + + /** + * Gets the tile value as point x, y + */ + public TileValue getTileValue(int x, int y) { + if (!withinWorld(x, y)) { + return null; + } + TileValue t = tileType[x][y]; + if (t == null) { + t = new TileValue(); + tileType[x][y] = t; + } + return t; + } + + public boolean GrimPK() { + return grimpock; + } + + public void GrimPK(boolean arg) { + grimpock = arg; + } + + /** + * Checks if the given npc is on the server + */ + public boolean hasNpc(Npc n) { + return npcs.contains(n); + } + + /** + * Checks if the given player is on the server + */ + public boolean hasPlayer(Player p) { + return players.contains(p); + } + + /** + * Checks if the given player is logged in + */ + public boolean isLoggedIn(long usernameHash) { + Player friend = getPlayer(usernameHash); + if (friend != null) { + return friend.loggedIn(); + } + return false; + } + + /** + * Loads the npc handling classes + */ + private void loadNpcHandlers() { + + NpcHandlerDef[] handlerDefs = (NpcHandlerDef[]) PersistenceManager.load("NpcHandlers.xml"); + for (NpcHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + NpcHandler handler = (NpcHandler) c.newInstance(); + for (int npcID : handlerDef.getAssociatedNpcs()) { + npcHandlers.put(npcID, handler); + } + } + } catch (Exception e) { + Logger.error(e); + } + } + } + + /** + * Updates the map to include a new door + */ + public void registerDoor(GameObject o) { + if (o.getDoorDef().getDoorType() != 1) { + return; + } + int dir = o.getDirection(); + int x = o.getX(), y = o.getY(); + if (dir == 0) { + getTileValue(x, y).objectValue |= 1; + getTileValue(x, y - 1).objectValue |= 4; + } else if (dir == 1) { + getTileValue(x, y).objectValue |= 2; + getTileValue(x - 1, y).objectValue |= 8; + } else if (dir == 2) { + getTileValue(x, y).objectValue |= 0x10; + } else if (dir == 3) { + getTileValue(x, y).objectValue |= 0x20; + } + } + + /** + * Registers an object with the world + */ + public void registerGameObject(GameObject o) { + switch (o.getType()) { + case 0: + registerObject(o); + break; + case 1: + registerDoor(o); + break; + } + } + /** + * Registers an item to be removed after 3 minutes + */ + public void registerItem(final Item i) { + try { + if (i.getLoc() == null) { + delayedEventHandler.add(new DelayedEvent(null, 180000) { + + public void run() { + ActiveTile tile = getTile(i.getLocation()); + if (tile.hasItem(i)) { + unregisterItem(i); + } + matchRunning = false; + } + }); + } + } + catch(Exception e) { + i.remove(); + e.printStackTrace(); + } + } + + /** + * Registers an npc with the world + */ + public void registerNpc(Npc n) { + NPCLoc npc = n.getLoc(); + if (npc.startX < npc.minX || npc.startX > npc.maxX || npc.startY < npc.minY || npc.startY > npc.maxY || (getTileValue(npc.startX, npc.startY).mapValue & 64) != 0) { + Logger.println("Fucked Npc: " + npc.id + "" + npc.startX + "" + npc.startY + ""); + } + npcs.add(n); + } + + /** + * Updates the map to include a new object + */ + public void registerObject(GameObject o) { + if (o.getGameObjectDef().getType() != 1 && o.getGameObjectDef().getType() != 2) { + return; + } + int dir = o.getDirection(); + int width, height; + if (dir == 0 || dir == 4) { + width = o.getGameObjectDef().getWidth(); + height = o.getGameObjectDef().getHeight(); + } else { + height = o.getGameObjectDef().getWidth(); + width = o.getGameObjectDef().getHeight(); + } + for (int x = o.getX(); x < o.getX() + width; x++) { + for (int y = o.getY(); y < o.getY() + height; y++) { + if (o.getGameObjectDef().getType() == 1) { + getTileValue(x, y).objectValue |= 0x40; + } else if (dir == 0) { + getTileValue(x, y).objectValue |= 2; + getTileValue(x - 1, y).objectValue |= 8; + } else if (dir == 2) { + getTileValue(x, y).objectValue |= 4; + getTileValue(x, y + 1).objectValue |= 1; + } else if (dir == 4) { + getTileValue(x, y).objectValue |= 8; + getTileValue(x + 1, y).objectValue |= 2; + } else if (dir == 6) { + getTileValue(x, y).objectValue |= 1; + getTileValue(x, y - 1).objectValue |= 4; + } + } + } + + } + + /** + * Registers a player with the world and informs other players on their + * login + */ + public void registerPlayer(Player p) { + if (players.contains(p)) { + Logger.println("IMPORTANT. Players array already contains player: " + p.getUsername() + ". I don't think this should happen ;c"); + } + p.setInitialized(); + players.add(p); + } + + /** + * Inserts a new shop into the world + */ + public void registerShop(final Shop shop) { + shop.setEquilibrium(); + shops.add(shop); + } + + public void sendBroadcastMessage(Player p, String user, String message) { + p.getActionSender().sendMessage("%#adm#" + user + ": @gre@" + message); + + } + + public void sendBroadcastMessage(String user, String message) { + for (Player p : getPlayers()) { + p.getActionSender().sendMessage("%#adm#" + user + ": @gre@" + message); + } + } + + public void sendBroadcastMessage(String user, String message, boolean modonly) { + for (Player p : getPlayers()) { + if (p.isPMod()) { + p.getActionSender().sendMessage("%#adm#" + user + ": @gre@" + message); + } + } + } + + /** + * Sets the ClientUpdater instance + */ + public void setClientUpdater(ClientUpdater clientUpdater) { + this.clientUpdater = clientUpdater; + } + + /** + * Sets the DelayedEventHandler instance + */ + public void setDelayedEventHandler(DelayedEventHandler delayedEventHandler) { + this.delayedEventHandler = delayedEventHandler; + } + + public void seteventlev(int lev) { + eventlev = lev; + } + + public void seteventx(int x) { + eventx = x; + } + + public void seteventy(int y) { + eventy = y; + } + + /** + * adds or removes the given entity from the relivant tiles + */ + public void setLocation(Entity entity, Point oldPoint, Point newPoint) { + ActiveTile t; + if (oldPoint != null) { + t = getTile(oldPoint); + t.remove(entity); + } + if (newPoint != null) { + t = getTile(newPoint); + t.add(entity); + } + } + + /** + * Sets the instance of the server + */ + public void setServer(Server server) { + this.server = server; + } + + /** + * Removes a door from the map + */ + public void unregisterDoor(GameObject o) { + if (o.getDoorDef().getDoorType() != 1) { + return; + } + int dir = o.getDirection(); + int x = o.getX(), y = o.getY(); + if (dir == 0) { + getTileValue(x, y).objectValue &= 0xfffe; + getTileValue(x, y - 1).objectValue &= 65535 - 4; + } else if (dir == 1) { + getTileValue(x, y).objectValue &= 0xfffd; + getTileValue(x - 1, y).objectValue &= 65535 - 8; + } else if (dir == 2) { + getTileValue(x, y).objectValue &= 0xffef; + } else if (dir == 3) { + getTileValue(x, y).objectValue &= 0xffdf; + } + } + + /** + * Removes an object from the server + */ + public void unregisterGameObject(GameObject o) { + o.remove(); + setLocation(o, o.getLocation(), null); + switch (o.getType()) { + case 0: + unregisterObject(o); + break; + case 1: + unregisterDoor(o); + break; + } + } + + /** + * Removes an item from the server + */ + public void unregisterItem(Item i) { + i.remove(); + setLocation(i, i.getLocation(), null); + } + + /** + * Removes an npc from the server + */ + public void unregisterNpc(Npc n) { + if (hasNpc(n)) { + npcs.remove(n); + } + setLocation(n, n.getLocation(), null); + } + + /** + * Removes an object from the map + */ + public void unregisterObject(GameObject o) { + if (o.getGameObjectDef().getType() != 1 && o.getGameObjectDef().getType() != 2) { + return; + } + int dir = o.getDirection(); + int width, height; + if (dir == 0 || dir == 4) { + width = o.getGameObjectDef().getWidth(); + height = o.getGameObjectDef().getHeight(); + } else { + height = o.getGameObjectDef().getWidth(); + width = o.getGameObjectDef().getHeight(); + } + for (int x = o.getX(); x < o.getX() + width; x++) { + for (int y = o.getY(); y < o.getY() + height; y++) { + if (o.getGameObjectDef().getType() == 1) { + getTileValue(x, y).objectValue &= 0xffbf; + } else if (dir == 0) { + getTileValue(x, y).objectValue &= 0xfffd; + getTileValue(x - 1, y).objectValue &= 65535 - 8; + } else if (dir == 2) { + getTileValue(x, y).objectValue &= 0xfffb; + getTileValue(x, y + 1).objectValue &= 65535 - 1; + } else if (dir == 4) { + getTileValue(x, y).objectValue &= 0xfff7; + getTileValue(x + 1, y).objectValue &= 65535 - 2; + } else if (dir == 6) { + getTileValue(x, y).objectValue &= 0xfffe; + getTileValue(x, y - 1).objectValue &= 65535 - 4; + } + } + } + } + + /** + * Removes a player from the server and saves their account + */ + public void unregisterPlayer(Player p) { + p.setLoggedIn(false); + p.resetAll(); + p.save(); + Mob opponent = p.getOpponent(); + if (opponent != null) { + p.resetCombat(CombatState.ERROR); + opponent.resetCombat(CombatState.ERROR); + } + server.getLoginConnector().getActionSender().playerLogout(p.getUsernameHash()); + delayedEventHandler.removePlayersEvents(p); + players.remove(p); + setLocation(p, p.getLocation(), null); + } + + /** + * Are the given coords within the world boundaries + */ + public boolean withinWorld(int x, int y) { + return x >= 0 && x < MAX_WIDTH && y >= 0 && y < MAX_HEIGHT; + } +} diff --git a/GameServer/src/msc/gs/model/mini/Cache.java b/GameServer/src/msc/gs/model/mini/Cache.java new file mode 100644 index 0000000..b85233f --- /dev/null +++ b/GameServer/src/msc/gs/model/mini/Cache.java @@ -0,0 +1,15 @@ +package msc.gs.model.mini; + +/** + * Data each player gets cached. + * + * @author xEnt + * + */ +public class Cache { + + public boolean muted = false; + public boolean inRed = false; + public boolean inBlue = false; + +} diff --git a/GameServer/src/msc/gs/model/mini/Damager.java b/GameServer/src/msc/gs/model/mini/Damager.java new file mode 100644 index 0000000..31d3ea2 --- /dev/null +++ b/GameServer/src/msc/gs/model/mini/Damager.java @@ -0,0 +1,78 @@ +package msc.gs.model.mini; + +import msc.gs.model.Player; + +/** + * a Damager (Player) that adds to a pool (Syndicate) of an NPC + * + * @author xEnt + * + */ +public class Damager { + + /** + * Damage this player has dealt + */ + private int damage = 0; + /** + * the Player/Damager + */ + private Player player; + /** + * Have they used melee on this NPC? + */ + private boolean useCombat = false; + /** + * Have they used magic on this NPC? + */ + private boolean useMagic = false; + /** + * Have they used ranged on this NPC? + */ + private boolean useRanged = false; + + public int getDamage() { + return damage; + } + + public void setDamage(int damage) { + this.damage = damage; + } + + public Player getPlayer() { + return player; + } + + public void setPlayer(Player player) { + this.player = player; + } + + public boolean isUseCombat() { + return useCombat; + } + + public void setUseCombat(boolean useCombat) { + this.useCombat = useCombat; + } + + public boolean isUseMagic() { + return useMagic; + } + + public void setUseMagic(boolean useMagic) { + this.useMagic = useMagic; + } + + public boolean isUseRanged() { + return useRanged; + } + + public void setUseRanged(boolean useRanged) { + this.useRanged = useRanged; + } + + public Damager(Player p) { + this.player = p; + } + +} diff --git a/GameServer/src/msc/gs/model/snapshot/Activity.java b/GameServer/src/msc/gs/model/snapshot/Activity.java new file mode 100644 index 0000000..d4ec8d6 --- /dev/null +++ b/GameServer/src/msc/gs/model/snapshot/Activity.java @@ -0,0 +1,34 @@ +package msc.gs.model.snapshot; + +import msc.gs.model.Player; + +/** + * Activity log class, stores activity string, time of activity and activity owner + * @author Pets + * + */ +public class Activity extends Snapshot { + + /** + * The messages that was sent + */ + private String activity; + + /** + * Constructor + * @param player player that performed the activity + * @param activity the activity that was performed + */ + public Activity(String sender, String activity) { + super(sender); + this.setActivity(activity); + } + + public void setActivity(String activity) { + this.activity = activity; + } + + public String getActivity() { + return activity; + } +} diff --git a/GameServer/src/msc/gs/model/snapshot/Chatlog.java b/GameServer/src/msc/gs/model/snapshot/Chatlog.java new file mode 100644 index 0000000..aca17d7 --- /dev/null +++ b/GameServer/src/msc/gs/model/snapshot/Chatlog.java @@ -0,0 +1,48 @@ +package msc.gs.model.snapshot; + +import java.util.ArrayList; +import java.util.List; + +import msc.gs.model.Player; + +/** + * Chat log class, stores chat string, time of message, message owner and set of players that saw the message + * @author Pets + * + */ +public class Chatlog extends Snapshot { + + /** + * The messages that was sent + */ + private String message; + /** + * Set of players that received the message; + */ + private ArrayList recievers = new ArrayList(); + + /** + * Constructor + * @param sender player that sent the message + * @param chatstring the message that was sent + * @param recievers players that saw the public message + * + */ + public Chatlog(String sender, String chatstring, ArrayList recievers) { + super(sender); + this.setMessage(chatstring); + this.recievers = recievers; + } + + public ArrayList getRecievers() { + return recievers; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/GameServer/src/msc/gs/model/snapshot/Snapshot.java b/GameServer/src/msc/gs/model/snapshot/Snapshot.java new file mode 100644 index 0000000..8ec51e7 --- /dev/null +++ b/GameServer/src/msc/gs/model/snapshot/Snapshot.java @@ -0,0 +1,27 @@ +package msc.gs.model.snapshot; + + +/** + * Snapshot abstract class + * @author Pets + * + */ +public abstract class Snapshot { + + private long eventTime; + protected String owner; + + public Snapshot(String owner) { + this.owner = owner; + this.eventTime = System.currentTimeMillis(); + + } + + public long getTimestamp() { + return eventTime; + } + + public String getOwner() { + return owner; + } +} diff --git a/GameServer/src/msc/gs/npchandler/Aggie.java b/GameServer/src/msc/gs/npchandler/Aggie.java new file mode 100644 index 0000000..9ce74ef --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Aggie.java @@ -0,0 +1,104 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.MiniEvent; +import msc.gs.event.ShortEvent; +import msc.gs.external.EntityHandler; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +/** + * + * @author xEnt + * + */ +public class Aggie implements NpcHandler { + + public static final World world = Instance.getWorld(); + + int[] dyes = { 238, 239, 272 }; + + int[] itemReq = { 236, 241, 281 }; + String[] names = { "Red dye please", "Yellow dye please", "Blue dye please", "No thanks" }; + + int ourOption = -1; + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.setBusy(false); + player.informOfNpcMessage(new ChatMessage(npc, "Hi traveller, i specialize in creating different colored dyes", player)); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "Would you like me to create you any dyes?", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setMenuHandler(new MenuHandler(names) { + public void handleReply(final int option, final String reply) { + if (option < 0 && option > names.length || option == 3) + return; + ourOption = option; + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "You will need 1 " + EntityHandler.getItemDef(itemReq[ourOption]).name + " and 30gp for me to create this dye", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + String[] diag = { "Yes i have them", "Ill come back when i have the ingrediants" }; + owner.setMenuHandler(new MenuHandler(diag) { + public void handleReply(final int option, final String reply) { + if (option == 0) { + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().countId(itemReq[ourOption]) < 1 || owner.getInventory().countId(10) < 30) { + owner.informOfNpcMessage(new ChatMessage(npc, "It seems like you don't have all what's Required, come back later.", owner)); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + + owner.informOfNpcMessage(new ChatMessage(npc, "Here is your new Dye, enjoy.", owner)); + world.getDelayedEventHandler().add(new MiniEvent(owner, 1000) { + public void action() { + if (owner.getInventory().remove(itemReq[ourOption], 1) > -1 && owner.getInventory().remove(10, 30) > -1) { + + owner.getInventory().add(new InvItem(dyes[ourOption])); + owner.getActionSender().sendInventory(); + } + } + }); + + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + }); + + } else { + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + } + }); + owner.getActionSender().sendMenu(diag); + } + }); + } + }); + } + }); + owner.getActionSender().sendMenu(names); + } + }); + } + }); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/Apothecary.java b/GameServer/src/msc/gs/npchandler/Apothecary.java new file mode 100644 index 0000000..4ba65b3 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Apothecary.java @@ -0,0 +1,113 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +/** + * + * @author xEnt + * + */ +public class Apothecary implements NpcHandler { + + public static final World world = Instance.getWorld(); + + String[] names = { "Do you have a potion to make my hair fall out?", "I am in need of a strength potion", "No thanks" }; + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.setBusy(false); + player.informOfNpcMessage(new ChatMessage(npc, "Hello, can i help you?", player)); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + + owner.setMenuHandler(new MenuHandler(names) { + public void handleReply(final int option, final String reply) { + if (option < 0 && option > names.length) + return; + + if (option == 0) { + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "Here you are, enjoy this", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("Apothecary hands you a mysterious potion"); + owner.getInventory().add(new InvItem(58)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + }); + } + }); + + } else if (option == 1) { + + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "Bring me a limpwurt root and a spider egg and i will make you one", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + String[] s = { "I have the ingredients", "Ok ill find them." }; + owner.setMenuHandler(new MenuHandler(s) { + public void handleReply(final int option, final String reply) { + if (option == 0) { + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().countId(220) < 1 || owner.getInventory().countId(219) < 1) { + owner.informOfNpcMessage(new ChatMessage(npc, "It seems you don't have everything i asked for, come back later.", owner)); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } else { + if (owner.getInventory().remove(220, 1) > -1 && owner.getInventory().remove(219, 1) > -1) { + owner.getInventory().add(new InvItem(221)); + owner.getActionSender().sendMessage("Apothecary hands you a Strength Potion (4 dose)"); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + } + } + }); + } else { + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + } + } + }); + owner.getActionSender().sendMenu(s); + } + }); + } + }); + + } else { + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + } + + } + }); + owner.getActionSender().sendMenu(names); + } + }); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/Bananas.java b/GameServer/src/msc/gs/npchandler/Bananas.java new file mode 100644 index 0000000..c0f5908 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Bananas.java @@ -0,0 +1,107 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +/** + * + * @author xEnt + * + */ +public class Bananas implements NpcHandler { + + public static final World world = Instance.getWorld(); + + String[] names = { "Yes i will sell you 20 bananas", "No sorry, i don't have any" }; + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.setBusy(false); + player.informOfNpcMessage(new ChatMessage(npc, "Hello, i am after 20 Bananas, do you have 20 you can sell?", player)); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + + owner.setMenuHandler(new MenuHandler(names) { + public void handleReply(final int option, final String reply) { + if (option < 0 && option > names.length) + return; + + if (option == 0) { + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "I will give you 30gp for your 20 bananas is that ok?", owner)); + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + String[] s = { "Sure", "Sorry, i would rather eat them" }; + owner.setMenuHandler(new MenuHandler(s) { + public void handleReply(final int option, final String reply) { + if (option == 0) { + + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().countId(249) < 20) { + owner.informOfNpcMessage(new ChatMessage(npc, "It looks like you don't have enough Bananas, don't waste my time.", owner)); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } else { + int count = 0; + for (int i = 0; i < 20; i++) { + if (owner.getInventory().remove(249, 1) > -1) { + count++; + } + } + if (count == 20) { + owner.getInventory().add(new InvItem(10, 30)); + owner.getActionSender().sendMessage("You receive 30gp"); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + } + } + }); + } else { + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + } + }); + owner.getActionSender().sendMenu(s); + + } + }); + + } + }); + } + }); + } else { + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + + } + }); + owner.getActionSender().sendMenu(names); + } + }); + } +} diff --git a/GameServer/src/msc/gs/npchandler/Bankers.java b/GameServer/src/msc/gs/npchandler/Bankers.java new file mode 100644 index 0000000..53e16e3 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Bankers.java @@ -0,0 +1,35 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class Bankers implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.setBusy(true); + player.informOfChatMessage(new ChatMessage(player, "I'd like to access my bank account please", npc)); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "Certainly " + (owner.isMale() ? "sir" : "miss"), owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.setAccessingBank(true); + owner.getActionSender().showBank(); + } + }); + npc.unblock(); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/Boat.java b/GameServer/src/msc/gs/npchandler/Boat.java new file mode 100644 index 0000000..d574a5e --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Boat.java @@ -0,0 +1,75 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class Boat implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + + player.informOfNpcMessage(new ChatMessage(npc, "G'day sailor, where would you like to go?", player)); + player.setBusy(true); + final String[] temp; + if (npc.getID() == 163) { + temp = new String[] { "Port Sarim" }; + } else { + temp = new String[] { "Karamja" }; + } + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + owner.setMenuHandler(new MenuHandler(temp) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy() || option < 0 || option >= temp.length) { + npc.unblock(); + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply + " please", npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("You board the ship"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + int count = owner.getInventory().countId(318); + if (count > 0) { + for (int i = 0; i < count; i++) { + owner.getActionSender().sendMessage("The Officer confiscates your Karamaja rum"); + if (owner.getInventory().remove(new InvItem(318)) > -1) + continue; + else + break; + } + owner.getActionSender().sendInventory(); + } + if (npc.getID() == 163) { + owner.teleport(269, 648, false); + } else { + owner.teleport(324, 713, false); + } + + owner.getActionSender().sendMessage("The ship arrives at " + reply); + owner.setBusy(false); + npc.unblock(); + } + }); + } + }); + } + }); + owner.getActionSender().sendMenu(temp); + } + }); + npc.blockedBy(player); + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/Certer.java b/GameServer/src/msc/gs/npchandler/Certer.java new file mode 100644 index 0000000..06e566d --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Certer.java @@ -0,0 +1,161 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.external.CerterDef; +import msc.gs.external.EntityHandler; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class Certer implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + final CerterDef certerDef = EntityHandler.getCerterDef(npc.getID()); + if (certerDef == null) { + return; + } + final String[] names = certerDef.getCertNames(); + player.informOfNpcMessage(new ChatMessage(npc, "Welcome to my " + certerDef.getType() + " exchange stall", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + String[] options = new String[] { "I have some certificates to trade in", "I have some " + certerDef.getType() + " to trade in" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + switch (option) { + case 0: + owner.getActionSender().sendMessage("What sort of certificate do you wish to trade in?"); + owner.setMenuHandler(new MenuHandler(names) { + public void handleReply(final int index, String reply) { + owner.getActionSender().sendMessage("How many certificates do you wish to trade in?"); + String[] options = new String[] { "One", "Two", "Three", "Four", "Five", "All to bank" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(int certAmount, String reply) { + owner.resetPath(); + int certID = certerDef.getCertID(index); + if (certID < 0) { // This + // shouldn't + // happen + return; + } + int itemID = certerDef.getItemID(index); + if (certAmount == 5) { + certAmount = owner.getInventory().countId(certID); + if (certAmount <= 0) { + owner.getActionSender().sendMessage("You don't have any " + names[index] + " certificates"); + return; + } + // MIGHT + // BE + // SMART + // TO + // CHECK + // THEIR + // BANK + // ISN'T + // FULL + InvItem bankItem = new InvItem(itemID, certAmount * 5); + if (owner.getInventory().remove(new InvItem(certID, certAmount)) > -1) { + owner.getActionSender().sendMessage("You exchange the certificates, " + bankItem.getAmount() + " " + bankItem.getDef().getName() + " is added to your bank"); + owner.getBank().add(bankItem); + } + } else { + certAmount += 1; + int itemAmount = certAmount * 5; + if (owner.getInventory().countId(certID) < certAmount) { + owner.getActionSender().sendMessage("You don't have that many certificates"); + return; + } + if (owner.getInventory().remove(certID, certAmount) > -1) { + owner.getActionSender().sendMessage("You exchange the certificates for " + certerDef.getType() + "."); + for (int x = 0; x < itemAmount; x++) { + owner.getInventory().add(new InvItem(itemID, 1)); + } + } + } + owner.getActionSender().sendInventory(); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + owner.getActionSender().sendMenu(names); + break; + case 1: + owner.getActionSender().sendMessage("What sort of " + certerDef.getType() + " do you wish to trade in?"); + owner.setMenuHandler(new MenuHandler(names) { + public void handleReply(final int index, String reply) { + owner.getActionSender().sendMessage("How many " + certerDef.getType() + " do you wish to trade in?"); + String[] options = new String[] { "Five", "Ten", "Fifteen", "Twenty", "Twentyfive", "All from bank" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(int certAmount, String reply) { + owner.resetPath(); + int certID = certerDef.getCertID(index); + if (certID < 0) { // This + // shouldn't + // happen + return; + } + int itemID = certerDef.getItemID(index); + if (certAmount == 5) { + certAmount = (int) (owner.getBank().countId(itemID) / 5); + int itemAmount = certAmount * 5; + if (itemAmount <= 0) { + owner.getActionSender().sendMessage("You don't have any " + names[index] + " to cert"); + return; + } + if (owner.getBank().remove(itemID, itemAmount) > -1) { + owner.getActionSender().sendMessage("You exchange the " + certerDef.getType() + ", " + itemAmount + " " + EntityHandler.getItemDef(itemID).getName() + " is taken from your bank"); + owner.getInventory().add(new InvItem(certID, certAmount)); + } + } else { + certAmount += 1; + int itemAmount = certAmount * 5; + if (owner.getInventory().countId(itemID) < itemAmount) { + owner.getActionSender().sendMessage("You don't have that many " + certerDef.getType()); + return; + } + owner.getActionSender().sendMessage("You exchange the " + certerDef.getType() + " for certificates."); + for (int x = 0; x < itemAmount; x++) { + owner.getInventory().remove(itemID, 1); + } + owner.getInventory().add(new InvItem(certID, certAmount)); + } + owner.getActionSender().sendInventory(); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + owner.getActionSender().sendMenu(names); + break; + } + npc.unblock(); + } + }); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/EntranaMonks.java b/GameServer/src/msc/gs/npchandler/EntranaMonks.java new file mode 100644 index 0000000..65f728f --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/EntranaMonks.java @@ -0,0 +1,48 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class EntranaMonks implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + final boolean toEntrana = !player.getLocation().inBounds(390, + 530, 440, 580); player.informOfNpcMessage(new ChatMessage(npc, + toEntrana ? + "Are you looking to take passage to our holy island?" : + "Are you ready to go back to the mainland?", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { owner.setBusy(false); String[] options + = {"Yes okay I'm ready to go", "No thanks"}; + owner.setMenuHandler(new MenuHandler(options) { public void + handleReply(final int option, final String reply) { + if(owner.isBusy()) { npc.unblock(); return; } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); Instance.getDelayedEventHandler().add(new + ShortEvent(owner) { public void action() { if(option == 0) { + owner.getActionSender().sendMessage("You board the ship"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { if(toEntrana) { owner.teleport(418, + 570, false); } else { owner.teleport(263, 659, false); } + owner.getActionSender().sendMessage("The ship arrives at " + + (toEntrana ? "Entrana" : "Port Sarim")); owner.setBusy(false); + npc.unblock(); } }); } else { owner.setBusy(false); + npc.unblock(); } } }); } }); + owner.getActionSender().sendMenu(options); } }); + npc.blockedBy(player); + return; + + + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/KebabSeller.java b/GameServer/src/msc/gs/npchandler/KebabSeller.java new file mode 100644 index 0000000..61054f8 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/KebabSeller.java @@ -0,0 +1,65 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class KebabSeller implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.informOfNpcMessage(new ChatMessage(npc, "Would you like to buy a nice kebab? Only 1 gold", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + String[] options = new String[] { "I think I'll give it a miss", "Yes please" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + if (option == 1) { + if (owner.getInventory().remove(10, 1) > -1) { + owner.getActionSender().sendMessage("You buy a kebab"); + owner.getInventory().add(new InvItem(210, 1)); + owner.getActionSender().sendInventory(); + npc.unblock(); + } else { + owner.informOfChatMessage(new ChatMessage(owner, "Oops I forgot to bring any money with me", npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.informOfNpcMessage(new ChatMessage(npc, "Come back when you have some", owner)); + npc.unblock(); + } + }); + } + } else { + npc.unblock(); + } + } + }); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/MakeOverMage.java b/GameServer/src/msc/gs/npchandler/MakeOverMage.java new file mode 100644 index 0000000..8909f2b --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/MakeOverMage.java @@ -0,0 +1,61 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class MakeOverMage implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.informOfNpcMessage(new ChatMessage(npc, "Are you happy with your looks?", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "If not i can change them for the cheap cheap price of 3000 coins", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + String[] options = new String[] { "I'm happy with how I look thank you", "Yes change my looks please" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + switch (option) { + case 1: + if (owner.getInventory().countId(10) < 3000) { + owner.informOfChatMessage(new ChatMessage(owner, "I'll just go get the cash", npc)); + } else if (owner.getInventory().remove(10, 3000) > -1) { + owner.setChangingAppearance(true); + owner.getActionSender().sendAppearanceScreen(); + owner.getActionSender().sendInventory(); + } + break; + } + npc.unblock(); + } + }); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/MonkHealer.java b/GameServer/src/msc/gs/npchandler/MonkHealer.java new file mode 100644 index 0000000..9ebc57f --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/MonkHealer.java @@ -0,0 +1,63 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class MonkHealer implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.informOfNpcMessage(new ChatMessage(npc, "Greetings traveller", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + String[] options = new String[] { "Can you heal me? I'm injured" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (option == 0) { + owner.informOfNpcMessage(new ChatMessage(npc, "Ok", owner)); + owner.getActionSender().sendMessage("The monk places his hands on your head"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You feel a little better"); + int newHp = owner.getCurStat(3) + 10; + if (newHp > owner.getMaxStat(3)) { + newHp = owner.getMaxStat(3); + } + owner.setCurStat(3, newHp); + owner.getActionSender().sendStat(3); + npc.unblock(); + } + }); + } else { + owner.setBusy(false); + npc.unblock(); + } + } + }); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/NpcHandler.java b/GameServer/src/msc/gs/npchandler/NpcHandler.java new file mode 100644 index 0000000..6cad281 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/NpcHandler.java @@ -0,0 +1,8 @@ +package msc.gs.npchandler; + +import msc.gs.model.Npc; +import msc.gs.model.Player; + +public interface NpcHandler { + public void handleNpc(final Npc npc, Player player) throws Exception; +} diff --git a/GameServer/src/msc/gs/npchandler/NpcHandlerDef.java b/GameServer/src/msc/gs/npchandler/NpcHandlerDef.java new file mode 100644 index 0000000..a23787d --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/NpcHandlerDef.java @@ -0,0 +1,48 @@ +package msc.gs.npchandler; + +/** + * The definition of a npc handler, for use with XStream. + */ +public class NpcHandlerDef { + /** + * The name of the handler class + */ + public String className; + /** + * The IDs of npcs which the handler is responsible for + */ + public int[] ids; + + /** + * Constructs a new packet handler definition, entailing that npcs with the + * given IDs are to be handled by the specified class. + * + * @param ids + * The IDs of npcs to be handled + * @param className + * The name of the packet handler class + */ + public NpcHandlerDef(int[] ids, String className) { + this.ids = ids; + this.className = className; + } + + /** + * Returns the IDs of npcs to be handled. + * + * @return An int array containing the IDs of npcs to be + * handled. + */ + public int[] getAssociatedNpcs() { + return ids; + } + + /** + * Returns the name of the npc handler class. + * + * @return The name of the npc handler's class + */ + public String getClassName() { + return className; + } +} diff --git a/GameServer/src/msc/gs/npchandler/OtherNPC.java b/GameServer/src/msc/gs/npchandler/OtherNPC.java new file mode 100644 index 0000000..32b9434 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/OtherNPC.java @@ -0,0 +1,59 @@ +package msc.gs.npchandler; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +/** + * + * @author xEnt + * + */ +public class OtherNPC implements NpcHandler { + + public static final World world = Instance.getWorld(); + + String[][] chats = { { "I have nothing to say, leave me be!", "Ok sorry to bother you" }, { "Hi there, do you have a quest for me?", "No, I have no need of your time." }, { "Can you tell me where I can find catherby", "I'm sorry, but I am not familiar with this area either" }, { "I'm not your buddy, pal", "I'm not your pal, guy." }, { "Be gone, ye haughty, swill-fed baggage!", "Uh, okay." }, { "I've lost my marbles!", "Okay I'll just leave you alone then Tootles." }, { "I'm captain jack sparrow, leader of the black perl!", "really? thats so 3 years ago.." }, { "Hi, are you selling any godswords??", "What the hell are you doing here mate?" }, { "This great town needs a makeover don't you think?", "I like it the way it is" }, { "Huh was that you talkin to me?", "No, of course not." }, { "Your name is -name- huh? i have heard of a legend by that name", "Clearly your not mistaken" }, { "-name- please go away", "Fine" } }; + + public void handleNpc(final Npc npc, Player player) throws Exception { + + if (npc.getID() == 28) { + player.informOfNpcMessage(new ChatMessage(npc, "Hello sir, spare me some money please?", player)); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.informOfChatMessage(new ChatMessage(owner, "No sorry, i'm broke.", npc)); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + }); + } else if (!npc.getDef().isAttackable()) { + + /** + * ALL NPC's will get this, random chats. + */ + int rnd = Formulae.Rand(0, chats.length); + player.lastRandom = rnd; + String chat = chats[rnd][0]; + chat = chat.replace("-name-", player.getUsername()); + player.informOfNpcMessage(new ChatMessage(npc, chat, player)); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + String chat2 = chats[owner.lastRandom][1]; + chat2 = chat2.replace("-name-", owner.getUsername()); + owner.informOfChatMessage(new ChatMessage(owner, chat2, npc)); + owner.setBusy(false); + npc.setBusy(false); + npc.unblock(); + return; + } + }); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/ShopKeeper.java b/GameServer/src/msc/gs/npchandler/ShopKeeper.java new file mode 100644 index 0000000..ed7c087 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/ShopKeeper.java @@ -0,0 +1,85 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Shop; +import msc.gs.model.World; + +public class ShopKeeper implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + final Shop shop = world.getShop(npc.getLocation()); + if (shop == null) { + return; + } + try { + + if (shop.getGreeting() != null) { + + if (shop.getGreeting().equals("Good day monsieur, Would you like ze nice freshly baked bread?")) { + if (player.npcThief[0] == true) { + player.informOfNpcMessage(new ChatMessage(npc, msc.gs.plugins.extras.Thieving.StealChats[msc.gs.plugins.extras.Thieving.Rands(msc.gs.plugins.extras.Thieving.StealChats.length)], player)); + return; + } + } + if (player.npcThief[3] == true) { + if (shop.getGreeting().equals("Silver! Silver!")) { + player.informOfNpcMessage(new ChatMessage(npc, msc.gs.plugins.extras.Thieving.StealChats[msc.gs.plugins.extras.Thieving.Rands(msc.gs.plugins.extras.Thieving.StealChats.length)], player)); + return; + } + } + if (player.npcThief[4] == true) { + if (shop.getGreeting().equals("Get your exotic spices here, rare very valuable spices here")) { + player.informOfNpcMessage(new ChatMessage(npc, msc.gs.plugins.extras.Thieving.StealChats[msc.gs.plugins.extras.Thieving.Rands(msc.gs.plugins.extras.Thieving.StealChats.length)], player)); + return; + } + } + if (player.npcThief[5] == true) { + if (shop.getGreeting().equals("Here, look at my lovely gems")) { + player.informOfNpcMessage(new ChatMessage(npc, msc.gs.plugins.extras.Thieving.StealChats[msc.gs.plugins.extras.Thieving.Rands(msc.gs.plugins.extras.Thieving.StealChats.length)], player)); + return; + } + } + player.informOfNpcMessage(new ChatMessage(npc, shop.getGreeting(), player)); + } + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + owner.setMenuHandler(new MenuHandler(shop.getOptions()) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + if (option == 0) { + owner.setAccessingShop(shop); + owner.getActionSender().showShop(shop); + } + npc.unblock(); + } + }); + } + }); + owner.getActionSender().sendMenu(shop.getOptions()); + } + }); + npc.blockedBy(player); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/GameServer/src/msc/gs/npchandler/ShopKeeper.java.1 b/GameServer/src/msc/gs/npchandler/ShopKeeper.java.1 new file mode 100644 index 0000000..851ee3d --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/ShopKeeper.java.1 @@ -0,0 +1,54 @@ +package org.rscdaemon.server.npchandler; + +import org.rscdaemon.server.model.Player; +import org.rscdaemon.server.model.Npc; +import org.rscdaemon.server.model.World; +import org.rscdaemon.server.model.ChatMessage; +import org.rscdaemon.server.model.MenuHandler; +import org.rscdaemon.server.model.Shop; +import org.rscdaemon.server.event.ShortEvent; + +public class ShopKeeper implements NpcHandler { + /** + * World instance + */ + public static final World world = World.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + final Shop shop = world.getShop(npc.getLocation()); + if(shop == null) { + return; + } + if(shop.getGreeting() != null) { + player.informOfNpcMessage(new ChatMessage(npc, shop.getGreeting(), player)); + } + player.setBusy(true); + world.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + owner.setMenuHandler(new MenuHandler(shop.getOptions()) { + public void handleReply(final int option, final String reply) { + if(owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + if(option == 0) { + owner.setAccessingShop(shop); + owner.getActionSender().showShop(shop); + } + npc.unblock(); + } + }); + } + }); + owner.getActionSender().sendMenu(shop.getOptions()); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/Tanner.java b/GameServer/src/msc/gs/npchandler/Tanner.java new file mode 100644 index 0000000..5550f82 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Tanner.java @@ -0,0 +1,91 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.DelayedEvent; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class Tanner implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.informOfNpcMessage(new ChatMessage(npc, "Greeting friend i'm a manufacturer of leather", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.setBusy(false); + String[] options = new String[] { "Can I buy some leather then?", "Here's some cow hides, can I buy some leather now?", "Leather is rather weak stuff" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy()) { + return; + } + owner.informOfChatMessage(new ChatMessage(owner, reply, npc)); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + switch (option) { + case 0: + owner.informOfNpcMessage(new ChatMessage(npc, "I make leather from cow hides", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.informOfNpcMessage(new ChatMessage(npc, "Bring me some of them and a gold coin per hide", owner)); + npc.unblock(); + } + }); + break; + case 1: + owner.informOfNpcMessage(new ChatMessage(npc, "Ok", owner)); + world.getDelayedEventHandler().add(new DelayedEvent(owner, 500) { + public void run() { + InvItem hides = owner.getInventory().get(owner.getInventory().getLastIndexById(147)); + if (hides == null) { + owner.getActionSender().sendMessage("You have run out of cow hides"); + matchRunning = false; + owner.setBusy(false); + } else if (owner.getInventory().countId(10) < 1) { + owner.getActionSender().sendMessage("You have run out of coins"); + matchRunning = false; + owner.setBusy(false); + } else if (owner.getInventory().remove(hides) > -1 && owner.getInventory().remove(10, 1) > -1) { + owner.getInventory().add(new InvItem(148, 1)); + owner.getActionSender().sendInventory(); + } else { + matchRunning = false; + owner.setBusy(false); + } + } + }); + npc.unblock(); + break; + case 2: + owner.setBusy(false); + owner.informOfNpcMessage(new ChatMessage(npc, "Well yes if all you're concerned with is how much it will protect you in a fight", owner)); + npc.unblock(); + break; + default: + owner.setBusy(false); + npc.unblock(); + break; + } + + } + }); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/npchandler/Thrander.java b/GameServer/src/msc/gs/npchandler/Thrander.java new file mode 100644 index 0000000..614bc57 --- /dev/null +++ b/GameServer/src/msc/gs/npchandler/Thrander.java @@ -0,0 +1,34 @@ +package msc.gs.npchandler; + +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; + +public class Thrander implements NpcHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handleNpc(final Npc npc, Player player) throws Exception { + player.informOfNpcMessage(new ChatMessage(npc, "Hello i'm thrander the smith, I'm an expert in armour modification", player)); + player.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + owner.informOfNpcMessage(new ChatMessage(npc, "Give me your armour designed for men and I can convert it", owner)); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.informOfNpcMessage(new ChatMessage(npc, "Into something more comfortable for a woman, and vice versa", owner)); + npc.unblock(); + } + }); + } + }); + npc.blockedBy(player); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/PacketHandler.java b/GameServer/src/msc/gs/phandler/PacketHandler.java new file mode 100644 index 0000000..b902ff0 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/PacketHandler.java @@ -0,0 +1,9 @@ +package msc.gs.phandler; + +import org.apache.mina.common.IoSession; + +import msc.gs.connection.Packet; + +public interface PacketHandler { + public void handlePacket(Packet p, IoSession session) throws Exception; +} diff --git a/GameServer/src/msc/gs/phandler/PacketHandlerDef.java b/GameServer/src/msc/gs/phandler/PacketHandlerDef.java new file mode 100644 index 0000000..d09d967 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/PacketHandlerDef.java @@ -0,0 +1,48 @@ +package msc.gs.phandler; + +/** + * The definition of a packet handler, for use with XStream. + */ +public class PacketHandlerDef { + /** + * The name of the handler class + */ + public String className; + /** + * The IDs of packets which the handler is responsible for + */ + public int[] ids; + + /** + * Constructs a new packet handler definition, entailing that packets with + * the given IDs are to be handled by the specified class. + * + * @param ids + * The IDs of packets to be handled + * @param className + * The name of the packet handler class + */ + public PacketHandlerDef(int[] ids, String className) { + this.ids = ids; + this.className = className; + } + + /** + * Returns the IDs of packets to be handled. + * + * @return An int array containing the IDs of packets to be + * handled. + */ + public int[] getAssociatedPackets() { + return ids; + } + + /** + * Returns the name of the packet handler class. + * + * @return The name of the packet handler's class + */ + public String getClassName() { + return className; + } +} diff --git a/GameServer/src/msc/gs/phandler/PlayerLogin.java b/GameServer/src/msc/gs/phandler/PlayerLogin.java new file mode 100644 index 0000000..e696b9c --- /dev/null +++ b/GameServer/src/msc/gs/phandler/PlayerLogin.java @@ -0,0 +1,251 @@ +package msc.gs.phandler; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.builders.RSCPacketBuilder; +import msc.gs.model.Bank; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.Player; +import msc.gs.model.PlayerAppearance; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.phandler.client.WieldHandler; +import msc.gs.quest.Quest; +import msc.gs.tools.DataConversions; + +public class PlayerLogin implements PacketHandler { + /** + * World instance + */ + private static final World world = Instance.getWorld(); + + /** + * The player to update + */ + private Player player; + + public PlayerLogin(Player player) { + this.player = player; + } + + public void handlePacket(msc.gs.connection.Packet p, IoSession session) throws Exception { + byte loginCode = p.readByte(); + if(world.getPlayer(player.getUsernameHash()) != null) { + Exception e = new Exception("Double log from " + player.getUsername() + " | " + player.getUsernameHash()); + e.printStackTrace(); + loginCode = 5; + player.destroy(true); + player.getSession().close(); + return; + } + boolean newchar = false; + RSCPacketBuilder pb = new RSCPacketBuilder(); + pb.setBare(true); + pb.addByte(loginCode); + player.getSession().write(pb.toPacket()); + if (loginCode == 0 || loginCode == 1 || loginCode == 99) { + player.setOwner(p.readInt()); + player.setGroupID(p.readInt()); + + player.setSubscriptionExpires(p.readLong()); + + player.setLastIP(DataConversions.IPToString(p.readLong())); + player.setLastLogin(p.readLong()); + /** + * Check if account is a new account + */ + if (player.getLastLogin() == 0L) { + player.setLocation(Point.location(121, 647), true); + int x = p.readShort(); + int y = p.readShort(); + newchar = true; + } + else { + player.setLocation(Point.location(p.readShort(), p.readShort()), true); + } + player.setFatigue(p.readShort()); + player.setCombatStyle((int) p.readByte()); + + player.setPrivacySetting(0, p.readByte() == 1); + player.setPrivacySetting(1, p.readByte() == 1); + player.setPrivacySetting(2, p.readByte() == 1); + player.setPrivacySetting(3, p.readByte() == 1); + + player.setGameSetting(0, p.readByte() == 1); + player.setGameSetting(2, p.readByte() == 1); + player.setGameSetting(3, p.readByte() == 1); + player.setGameSetting(4, p.readByte() == 1); + player.setGameSetting(5, p.readByte() == 1); + player.setGameSetting(6, p.readByte() == 1); + + PlayerAppearance appearance = new PlayerAppearance(p.readShort(), p.readShort(), p.readShort(), p.readShort(), p.readShort(), p.readShort()); + if (!appearance.isValid()) { + loginCode = 7; + player.destroy(true); + player.getSession().close(); + } + + /* + * if(World.isMembers() && !player.isMod()) { loginCode = 7; + * player.destroy(true); player.getSession().close(); } + */ + player.setAppearance(appearance); + player.setWornItems(player.getPlayerAppearance().getSprites()); + + player.setMale(p.readByte() == 1); + long skull = p.readLong(); + if (skull > 0) + player.addSkull(skull); + + for (int i = 0; i < 18; i++) { + int exp = (int) p.readLong(); + player.setExp(i, exp); + player.setMaxStat(i, Formulae.experienceToLevel(exp)); + player.setCurStat(i, p.readShort()); + } + + player.setCombatLevel(Formulae.getCombatlevel(player.getMaxStats())); + + Inventory inventory = new Inventory(player); + int invCount = p.readShort(); + for (int i = 0; i < invCount; i++) { + InvItem item = new InvItem(p.readShort(), p.readInt()); + if (p.readByte() == 1 && item.isWieldable()) { + item.setWield(true); + player.updateWornItems(item.getWieldableDef().getWieldPos(), item.getWieldableDef().getSprite()); + } + inventory.add(item); + } + + player.setInventory(inventory); + + Bank bank = new Bank(); + int bnkCount = p.readShort(); + for (int i = 0; i < bnkCount; i++) + bank.add(new InvItem(p.readShort(), p.readInt())); + + player.setBank(bank); + + int friendCount = p.readShort(); + for (int i = 0; i < friendCount; i++) + player.addFriend(p.readLong(), p.readShort()); + + int ignoreCount = p.readShort(); + for (int i = 0; i < ignoreCount; i++) + player.addIgnore(p.readLong()); + + player.setQuestPoints(p.readShort(), false); + int questCount = p.readShort(); + // System.out.println(questCount); + for (int i = 0; i < questCount; i++) + player.setQuestStage(p.readShort(), p.readShort(), false, false); + + /* Muted */ + + player.setMuted(p.readLong()); + if(player.isMuted()) { + player.getActionSender().sendMessage("@red@You are muted for " + player.getDaysMuted() + " days!"); + } + + long eventcd = p.readLong(); + player.setEventCD(eventcd); + + /* End of loading methods */ + + + /* Send client data */ + world.registerPlayer(player); + + player.updateViewedPlayers(); + player.updateViewedObjects(); + + msc.gs.builders.MiscPacketBuilder sender = player.getActionSender(); + sender.sendServerInfo(); + sender.sendFatigue(); + sender.sendWorldInfo(); // sends info for the client to load terrain + sender.sendInventory(); + sender.sendEquipmentStats(); + sender.sendStats(); + sender.sendPrivacySettings(); + sender.sendGameSettings(); + sender.sendFriendList(); + sender.sendIgnoreList(); + sender.sendCombatStyle(); + sender.sendQuestData(); + sender.sendQuestInfo(); + + for (InvItem i : player.getInventory().getItems()) { + if (i.isWielded() && (i.getID() == 407 || i.getID() == 401)) { + int count = 0; + for (Quest q : World.getQuestManager().getQuests()) { + if (player.getQuestStage(q.getUniqueID()) == Quest.COMPLETE) + count++; + } + if (player.getCurStat(6) < 31 || count <= World.getQuestManager().getQuests().size() - 1) { + player.getActionSender().sendMessage("You must have at least 31 magic & completed " + (World.getQuestManager().getQuests().size() - 1) + " quests"); + WieldHandler.unWieldItem(player, i, true); + player.getActionSender().sendInventory(); + } + } + if(i.getID() == 1288 && i.isWielded()) { + boolean found = false; + for(int it=0; it < 18; it++) { + if(player.getMaxStat(it) == 99) { + found = true; + break; + } + } + if(!found) { + player.getActionSender().sendMessage("Sorry, you need any skill of level 99 to wield this cape of legends"); + WieldHandler.unWieldItem(player, i, true); + } + } + } + if(player.getLocation().inWilderness()) + player.p2pWildy(); + + int timeTillShutdown = Instance.getServer().timeTillShutdown(); + if (timeTillShutdown > -1) + sender.startShutdown((int) (timeTillShutdown / 1000)); + + if (player.getLastLogin() == 0L) { + player.getInventory().add(new InvItem(4)); + player.getInventory().add(new InvItem(70)); + player.getInventory().add(new InvItem(376)); + player.getInventory().add(new InvItem(156)); + player.getInventory().add(new InvItem(87)); + player.getInventory().add(new InvItem(1263)); + player.getActionSender().sendInventory(); + player.setChangingAppearance(true); + sender.sendAppearanceScreen(); + } + + player.getActionSender().sendWakeUp(false); + sender.sendLoginBox(); + sender.sendMessage(Constants.GameServer.MOTD); + sender.sendOnlinePlayers(); + + if(newchar) + player.getActionSender().sendMessage("@ran@Talk to the Community Instructor for information about " + Constants.GameServer.SERVER_NAME); + + if (player.clientWarn()) { + player.getActionSender().sendAlert("@red@Alert! @whi@You are using an old client, please download the new client from our website. This client WILL stop working @red@soon.", false); + player.getActionSender().sendMessage("@red@Alert! @whi@You are using an old client, please download the new client from our website. This client WILL stop working on @red@soon."); + } + + + if (player.isAdmin() || player.isPMod()) { + player.setnopk(true); + player.setnonaggro(true); + } + + player.setLoggedIn(true); + player.setBusy(false); + } else + player.destroy(true); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/AttackHandler.java b/GameServer/src/msc/gs/phandler/client/AttackHandler.java new file mode 100644 index 0000000..3fddf11 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/AttackHandler.java @@ -0,0 +1,218 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.FightEvent; +import msc.gs.event.RangeEvent; +import msc.gs.event.WalkToMobEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.PathGenerator; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; + +public class AttackHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + Mob affectedMob = null; + int serverIndex = p.readShort(); + if (pID == 57) { + affectedMob = world.getPlayer(serverIndex); + } else if (pID == 73) { + affectedMob = world.getNpc(serverIndex); + } + if(player.isPMod() && !player.isMod()) + return; + if (affectedMob == null || affectedMob.equals(player) || (affectedMob instanceof Npc && !World.getQuestManager().isNpcVisible((Npc) affectedMob, player))) { + player.resetPath(); + return; + } + if (affectedMob instanceof Npc && player.getRangeEquip() > 0 && affectedMob.inCombat() && World.getQuestManager().isNpcAssociated(affectedMob, player)) { + player.getActionSender().sendMessage("You can't range the " + ((Npc) affectedMob).getDef().getName() + " while it's in combat!"); + player.resetPath(); + return; + } + if (affectedMob instanceof Player) { + Player pl = (Player) affectedMob; + if (pl.inCombat() && player.getRangeEquip() < 0) { + return; + } + + if (pl.getLocation().inWilderness() && System.currentTimeMillis() - pl.lastRun < 3000) { + return; + } + } + + player.setFollowing(affectedMob); + player.setStatus(Action.ATTACKING_MOB); + + if (player.getRangeEquip() < 0) { + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedMob, affectedMob instanceof Npc ? 1 : 2) { + public void arrived() { + owner.resetPath(); + owner.resetFollowing(); + boolean cont = false; + if (affectedMob instanceof Player) { + Player opp = (Player) affectedMob; + + if (System.currentTimeMillis() - opp.lastMineTimer < 2000 && opp.isBusy()) + cont = true; + } + if(affectedMob instanceof Player) { + world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " attacked a Player (" + ((Player)affectedMob).getUsername() + ")")); + } else { + world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " attacked a NPC (" + ((Npc)affectedMob).getDef().name + ")")); + } + if (cont) { + if (owner.isBusy() || !owner.nextTo(affectedMob) || !owner.checkAttack(affectedMob, false) || owner.getStatus() != Action.ATTACKING_MOB) { + return; + } + } else { + if (owner.isBusy() || affectedMob.isBusy() || !owner.nextTo(affectedMob) || !owner.checkAttack(affectedMob, false) || owner.getStatus() != Action.ATTACKING_MOB) { + return; + } + } + if (affectedMob.getID() == 35) { + owner.getActionSender().sendMessage("Delrith can not be attacked without the Silverlight sword"); + return; + } + if (affectedMob.getID() == 140 && affectedMob.getX() > 327 && affectedMob.getX() < 335 && affectedMob.getY() > 433 && affectedMob.getY() < 439) { + owner.informOfNpcMessage(new ChatMessage(affectedMob, "a curse be upon you", owner)); + for (int i = 0; i < 3; i++) { + int stat = owner.getCurStat(i); + if (stat < 3) + owner.setCurStat(i, 0); + else + owner.setCurStat(i, stat - 3); + } + owner.getActionSender().sendStats(); + + } + + owner.resetAll(); + owner.setStatus(Action.FIGHTING_MOB); + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + affectedPlayer.resetAll(); + affectedPlayer.setStatus(Action.FIGHTING_MOB); + affectedPlayer.getActionSender().sendSound("underattack"); + affectedPlayer.getActionSender().sendMessage("You are under attack!"); + } + affectedMob.resetPath(); + + owner.setLocation(affectedMob.getLocation(), true); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.removeWatchedPlayer(owner); + } + + owner.setBusy(true); + owner.setSprite(9); + /* + * if(affectedMob instanceof Npc) { Npc n = + * (Npc)affectedMob; for(Fighter p : n.fighters) { + * p.useCombat = true; if(p.player == owner) if(p.useMagic) + * { p.useMagic = false; break; } } } + */ + owner.setOpponent(affectedMob); + owner.setCombatTimer(); + affectedMob.setBusy(true); + affectedMob.setSprite(8); + affectedMob.setOpponent(owner); + affectedMob.setCombatTimer(); + FightEvent fighting = new FightEvent(owner, affectedMob); + fighting.setLastRun(0); + Instance.getDelayedEventHandler().add(fighting); + } + }); + } else { + if (!new PathGenerator(player.getX(), player.getY(), affectedMob.getX(), affectedMob.getY()).isValid()) { + player.getActionSender().sendMessage("I can't get a clear shot from here"); + player.resetPath(); + return; + } + if(Constants.GameServer.F2P_WILDY && player.getLocation().inWilderness()) { + + for(InvItem i : player.getInventory().getItems()) { + if(i.getID() == 638 || i.getID() == 640 || i.getID() == 642 || i.getID() == 644 || i.getID() == 646) { + player.getActionSender().sendMessage("You can not have any P2P arrows in your inventory in a F2P wilderness"); + return; + } + } + + } + int radius = 7; + if (player.getRangeEquip() == 59 || player.getRangeEquip() == 60) + radius = 5; + if (player.getRangeEquip() == 189) + radius = 4; + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedMob, radius) { + public void arrived() { + owner.resetPath(); + if (owner.isBusy() || !owner.checkAttack(affectedMob, true) || owner.getStatus() != Action.ATTACKING_MOB) { + return; + } + + if (!new PathGenerator(owner.getX(), owner.getY(), affectedMob.getX(), affectedMob.getY()).isValid()) { + owner.getActionSender().sendMessage("I can't get a clear shot from here"); + owner.resetPath(); + return; + } + if(affectedMob instanceof Player) { + world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " ranged a Player (" + ((Player)affectedMob).getUsername() + ")")); + } else { + world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " ranged a NPC (" + ((Npc)affectedMob).getDef().name + ")")); + } + if (affectedMob.getID() == 35) { + owner.getActionSender().sendMessage("Delrith can not be attacked without the Silverlight sword"); + return; + } + owner.resetAll(); + owner.setStatus(Action.RANGING_MOB); + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + affectedPlayer.resetTrade(); + if (affectedPlayer.getMenuHandler() != null) { + affectedPlayer.resetMenuHandler(); + } + if (affectedPlayer.accessingBank()) { + affectedPlayer.resetBank(); + } + if (affectedPlayer.accessingShop()) { + affectedPlayer.resetShop(); + } + if (affectedPlayer.getNpc() != null) { + affectedPlayer.getNpc().unblock(); + affectedPlayer.setNpc(null); + } + } + if (Formulae.getRangeDirection(owner, affectedMob) != -1) + owner.setSprite(Formulae.getRangeDirection(owner, affectedMob)); + + owner.setRangeEvent(new RangeEvent(owner, affectedMob)); + } + }); + + } + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/client/BankHandler.java b/GameServer/src/msc/gs/phandler/client/BankHandler.java new file mode 100644 index 0000000..3eae1b4 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/BankHandler.java @@ -0,0 +1,130 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.external.EntityHandler; +import msc.gs.model.Bank; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; + +public class BankHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy() || player.isRanging() || player.isTrading() || player.isDueling()) { + player.resetBank(); + return; + } + if (!player.accessingBank()) { + player.setSuspiciousPlayer(true); + player.resetBank(); + return; + } + Bank bank = player.getBank(); + Inventory inventory = player.getInventory(); + InvItem item; + int itemID, amount, slot; + switch (pID) { + case 48: // Close bank + player.resetBank(); + break; + case 198: // Deposit item + itemID = p.readShort(); + amount = p.readInt(); + if (amount < 1 || inventory.countId(itemID) < amount) { + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " tried to deposit ID: " + itemID + " amount: " + amount)); + player.setSuspiciousPlayer(true); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " deposited ID: " + itemID + " amount: " + amount)); + if (EntityHandler.getItemDef(itemID).isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + if (EntityHandler.getItemDef(itemID).isStackable()) { + item = new InvItem(itemID, amount); + if (bank.canHold(item) && inventory.remove(item) > -1) { + bank.add(item); + } + else { + player.getActionSender().sendMessage("You don't have room for that in your bank"); + } + } else { + for (int i = 0; i < amount; i++) { + int idx = inventory.getLastIndexById(itemID); + item = inventory.get(idx); + if (item == null) { // This shouldn't happen + break; + } + if (bank.canHold(item) && inventory.remove(item) > -1) { + bank.add(item); + } else { + player.getActionSender().sendMessage("You don't have room for that in your bank"); + break; + } + } + } + slot = bank.getFirstIndexById(itemID); + if (slot > -1) { + player.getActionSender().sendInventory(); + player.getActionSender().updateBankItem(slot, itemID, bank.countId(itemID)); + } + break; + case 183: // Withdraw item + itemID = p.readShort(); + amount = p.readInt(); + if (amount < 1 || bank.countId(itemID) < amount) { + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " tried to withdraw ID: " + itemID + " amount: " + amount)); + player.setSuspiciousPlayer(true); + return; + } + if (EntityHandler.getItemDef(itemID).isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " withrew ID: " + itemID + " amount: " + amount)); + + slot = bank.getFirstIndexById(itemID); + if (EntityHandler.getItemDef(itemID).isStackable()) { + item = new InvItem(itemID, amount); + if (inventory.canHold(item) && bank.remove(item) > -1) { + inventory.add(item); + } else { + player.getActionSender().sendMessage("You don't have room for that in your inventory"); + } + } else { + for (int i = 0; i < amount; i++) { + if (bank.getFirstIndexById(itemID) < 0) { // This shouldn't + // happen + break; + } + item = new InvItem(itemID, 1); + if (inventory.canHold(item) && bank.remove(item) > -1) { + inventory.add(item); + } else { + player.getActionSender().sendMessage("You don't have room for that in your inventory"); + break; + } + } + } + if (slot > -1) { + player.getActionSender().sendInventory(); + player.getActionSender().updateBankItem(slot, itemID, bank.countId(itemID)); + } + break; + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/client/BotHandler.java b/GameServer/src/msc/gs/phandler/client/BotHandler.java new file mode 100644 index 0000000..9ec16d4 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/BotHandler.java @@ -0,0 +1,72 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class BotHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + Player player = (Player) session.getAttachment(); + + boolean scar = false; + boolean wpe = false; + boolean autominer = false; + if (p.getLength() > 1) { + if (p.readByte() == 1) { + scar = true; + } + if (p.readByte() == 1) { + autominer = true; + } + if (p.readByte() == 1) { + autominer = true; + } + if (p.readByte() == 1) { + wpe = true; + } + /* + for (String s : PlayerLoginHandler.badClients) { + if (s.equalsIgnoreCase(player.getUsername())) + player.badClient = true; + PlayerLoginHandler.badClients.remove(s); + break; + } + */ + for (Player pl : Instance.getWorld().getPlayers()) { + if (pl.lastPlayerInfo2 == null) + continue; + String s = "Client Statistics for " + player.getUsername() + ": Scar: " + scar + ", WPE: " + wpe + ", Autominer: " + autominer + ", 3rd Party Client: " + player.badClient; + if (pl.lastPlayerInfo2.equals("(IRC)")) { + Instance.getIRC().sendMessage(s); + pl.lastPlayerInfo2 = null; + return; + } + if (pl.lastPlayerInfo2.equalsIgnoreCase(player.getUsername())) { + + s = s.replace("true", "@gre@true@whi@"); + s = s.replace("false", "@red@false@whi@"); + pl.getActionSender().sendAlert(s, false); + pl.lastPlayerInfo2 = null; + } + } + + } else { + Logger.println(player.getUsername() + " caught on 3rd party client"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/ChatHandler.java b/GameServer/src/msc/gs/phandler/client/ChatHandler.java new file mode 100644 index 0000000..bb7ac22 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/ChatHandler.java @@ -0,0 +1,27 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class ChatHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player sender = (Player) session.getAttachment(); + if (World.SERVER_MUTED && !sender.isMod()) { + sender.getActionSender().sendMessage("@red@Unable to chat while the server is muted"); + return; + } + + sender.addMessageToChatQueue(p.getData()); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/client/CommandHandler.java b/GameServer/src/msc/gs/phandler/client/CommandHandler.java new file mode 100644 index 0000000..3cebba8 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/CommandHandler.java @@ -0,0 +1,332 @@ +package msc.gs.phandler.client; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.TimeZone; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.builders.ls.MiscPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.core.ClientUpdater; +import msc.gs.db.DBConnection; +import msc.gs.event.MiniEvent; +import msc.gs.event.SingleEvent; +import msc.gs.external.EntityHandler; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.model.MenuHandler; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.CombatState; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; + +public class CommandHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + static String[] towns = { "varrock", "falador", "draynor", "portsarim", "karamja", "alkharid", "lumbridge", "edgeville", "castle" }; + static Point[] townLocations = { Point.location(122, 509), Point.location(304, 542), Point.location(214, 632), Point.location(269, 643), Point.location(370, 685), Point.location(89, 693), Point.location(120, 648), Point.location(217, 449), Point.location(270, 352) }; + + + public void handleCommand(String cmd, String[] args, Player player) throws Exception { + MiscPacketBuilder loginServer = Instance.getServer().getLoginConnector().getActionSender(); + + if(System.currentTimeMillis() - player.lastCommandUsed < 2000 && !player.isMod()) { + if(System.currentTimeMillis() - player.lastCommandUsed < 100) { // incase spammers + return; + } + player.getActionSender().sendMessage("2 second delay on using a new command"); + return; + } + player.lastCommandUsed = System.currentTimeMillis(); + if (cmd.equals("help")) { + player.getActionSender().sendAlert("List of commands are shown on forums!", true); + return; + } + if(cmd.equals("time")) { + Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")); + int minutes = cal.get(Calendar.MINUTE); + int hour24 = cal.get(Calendar.HOUR_OF_DAY); + player.getActionSender().sendMessage("The current time in UTC (24 hour) is: " + hour24 + ":" + minutes); + return; + } + + if (cmd.equals("skull")) { + int length = 20; + player.addSkull(length * 60000); + return; + } + + if (cmd.equals("fatigue")) { + player.setFatigue(100); + player.getActionSender().sendFatigue(); + player.getActionSender().sendMessage("Your fatigue is now 100%"); + return; + } + + if (cmd.equals("online")) { + player.getActionSender().sendOnlinePlayers(); + return; + } + + if (cmd.equals("nearby") || cmd.equals("inview")) { + player.getActionSender().sendMessage("@yel@Players In View: @whi@" + (player.getViewArea().getPlayersInView().size()) + " @yel@NPCs In View: @whi@" + player.getViewArea().getNpcsInView().size()); + return; + } + + if (cmd.equals("stuck")) { + if (System.currentTimeMillis() - player.getCurrentLogin() < 30000) { + player.getActionSender().sendMessage("You cannot do this after you have recently logged in"); + return; + } + if(!player.canLogout() || System.currentTimeMillis() - player.getLastMoved() < 10000) { + player.getActionSender().sendMessage("You must stand peacefully in one place for 10 seconds!"); + return; + } + if (player.getLocation().inModRoom() && !player.isMod()) { + player.getActionSender().sendMessage("You cannot use ::stuck here"); + } else if (!player.isMod() && System.currentTimeMillis() - player.getLastMoved() < 300000 && System.currentTimeMillis() - player.getCastTimer() < 300000) { + player.getActionSender().sendMessage("There is a 5 minute delay on using ::stuck, please stand still for 5 minutes."); + player.getActionSender().sendMessage("This command is logged ONLY use it when you are REALLY stuck."); + } else if (!player.inCombat() && System.currentTimeMillis() - player.getCombatTimer() > 300000 || player.isMod()) { + Logger.mod(player.getUsername() + " used stuck at " + player.getX() + ":" + player.getY()); + player.setCastTimer(); + player.teleport(122, 647, true); + } else { + player.getActionSender().sendMessage("You cannot use ::stuck for 5 minutes after combat"); + } + return; + } + + if (!player.isPMod()) { + player.getActionSender().sendMessage("Invalid Command. Write ::help for a list of commands"); + return; + } + + if (cmd.equalsIgnoreCase("pass")) + if (args[0] != null) { + if (args[0].equalsIgnoreCase("WE DONT NEED MODS IN GAME") && player.isAdmin()) { + player.hasAdminPriv = true; + player.getActionSender().sendMessage("Enabled"); + return; + } + if (args[0].equalsIgnoreCase("unlockmenow") && (player.isPMod() || player.isMod())) { + player.hasModPriv = true; + player.hasPmodPriv = true; + player.getActionSender().sendMessage("Unlocked"); + return; + } + return; + } + if ((!player.hasModPriv || !player.hasPmodPriv) && !player.isAdmin()) { + player.getActionSender().sendMessage("You have not unlocked this yet"); + return; + } + + /** + * + * + * + * + * + * + * PLAYER MOD COMMANDS ONLY + * + * + * + * + * + */ + + + if (cmd.equals("info")) { + if (args.length != 1) { + player.getActionSender().sendMessage("Invalid args. Syntax: INFO name"); + return; + } + loginServer.requestPlayerInfo(player, DataConversions.usernameToHash(args[0])); + return; + } + + if (cmd.equals("info2")) { + Player p = world.getPlayer(msc.gs.tools.DataConversions.usernameToHash(args[0])); + if (p == null) { + player.getActionSender().sendMessage(args[0] + " is offline?"); + return; + } + player.lastPlayerInfo2 = p.getUsername(); + p.getActionSender().sendInfo2(); + player.getActionSender().sendMessage("Requesting info.. please wait"); + } + + if (cmd.equalsIgnoreCase("town")) { + try { + String town = args[0]; + if (town != null) { + for (int i = 0; i < towns.length; i++) + if (town.equalsIgnoreCase(towns[i])) { + player.teleport(townLocations[i].getX(), townLocations[i].getY(), false); + return; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (cmd.equalsIgnoreCase("info3")) { + if (args[0] != null) { + Player p = world.getPlayer(DataConversions.usernameToHash(args[0])); + String line = "@red@DONT SHOW THIS TO PUBLIC! @gre@Last 75 (Casting) Intervals for @yel@ " + p.getUsername() + ": @whi@"; + for (int i = 0; i < p.intervals.size(); i++) { + line += " - " + p.intervals.get(i); + } + player.getActionSender().sendAlert(line, true); + } + } + + /** + * + * + * + * + * + * + * MOD COMMANDS ONLY + * + * + * + * + * + */ + + if(!player.isMod()) + return; + + if (cmd.equals("ban") || cmd.equals("unban")) { + boolean banned = cmd.equals("ban"); + if (args.length != 1) { + player.getActionSender().sendMessage("Invalid args. Syntax: " + (banned ? "BAN" : "UNBAN") + " name"); + return; + } + loginServer.banPlayer(player, DataConversions.usernameToHash(args[0]), banned); + return; + } + + + if (!player.isAdmin() || (player.isAdmin() && !player.hasAdminPriv)) { + return; + } + + if (cmd.equals("quest")) { + if (args.length < 2) { + player.getActionSender().sendMessage("Invalid syntax! ::quest INDEX STAGE"); + return; + } + + player.setQuestStage(Integer.parseInt(args[0]), Integer.parseInt(args[1]), false); + player.getActionSender().sendQuestInfo(); + return; + } + if (cmd.equals("questpoints")) { + if (args.length < 1) { + player.getActionSender().sendMessage("Invalid syntax! ::questpoints POINTS"); + return; + } + + player.setQuestPoints(Integer.parseInt(args[0]), false); + player.getActionSender().sendQuestInfo(); + return; + } + + if (cmd.equals("dumpdata")) { + + if (args.length != 1) { + player.getActionSender().sendMessage("Invalid args. Syntax: ::dumpdata name"); + return; + } + long usernameHash = DataConversions.usernameToHash(args[0]); + String username = DataConversions.hashToUsername(usernameHash); + DBConnection.getReport().submitDupeData(username, usernameHash); + } + + if (cmd.equals("shutdown")) { + Logger.mod(player.getUsername() + " shut down the server!"); + Instance.getServer().kill(); + return; + } + if (cmd.equals("update")) { + String reason = ""; + if (args.length > 0) { + for (String s : args) { + reason += (s + " "); + } + reason = reason.substring(0, reason.length() - 1); + } + if (Instance.getServer().shutdownForUpdate()) { + Logger.mod(player.getUsername() + " updated the server: " + reason); + for (Player p : world.getPlayers()) { + p.getActionSender().sendAlert("The server will be shutting down in 60 seconds: " + reason, false); + p.getActionSender().startShutdown(60); + } + } + return; + } + + if (cmd.equals("returnall")) { + for (Player p : world.getPlayers()) { + if (p.tempx != -1 && p.tempy != -1) + p.teleport(p.tempx, p.tempy, false); + } + } + + if (cmd.equals("dropall")) { + player.getInventory().getItems().clear(); + player.getActionSender().sendInventory(); + } + + if(cmd.equals("thread")) { + ClientUpdater.threaded = !ClientUpdater.threaded; + player.getActionSender().sendMessage("Threaded client updater: " + ClientUpdater.threaded); + } + + } + + + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + String s = new String(p.getData()).trim(); + int firstSpace = s.indexOf(" "); + String cmd = s; + String[] args = new String[0]; + if (firstSpace != -1) { + cmd = s.substring(0, firstSpace).trim(); + args = s.substring(firstSpace + 1).trim().split(" "); + } + try { + handleCommand(cmd.toLowerCase(), args, player); + } catch (Exception e) { + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/DropHandler.java b/GameServer/src/msc/gs/phandler/client/DropHandler.java new file mode 100644 index 0000000..7f9e311 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/DropHandler.java @@ -0,0 +1,68 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.db.DBConnection; +import msc.gs.event.DelayedEvent; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; + +public class DropHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + final int idx = (int) p.readShort(); + if (idx < 0 || idx >= player.getInventory().size()) { + player.setSuspiciousPlayer(true); + return; + } + final InvItem item = player.getInventory().get(idx); + if (item == null) { + player.setSuspiciousPlayer(true); + return; + } + if(player.isPMod() && !player.isMod()) + return; + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + + + player.setStatus(Action.DROPPING_GITEM); + Instance.getDelayedEventHandler().add(new DelayedEvent(player, 500) { + public void run() { + if (owner.isBusy() || !owner.getInventory().contains(item) || owner.getStatus() != Action.DROPPING_GITEM) { + matchRunning = false; + return; + } + if (owner.hasMoved()) { + return; + } + world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " dropped ID: " + item.getID() + " amount: "+item.getAmount()+" at: " + owner.getX() + "/" + owner.getY())); + + owner.getActionSender().sendSound("dropobject"); + owner.getInventory().remove(item); + owner.getActionSender().sendInventory(); + world.registerItem(new Item(item.getID(), owner.getX(), owner.getY(), item.getAmount(), owner)); + matchRunning = false; + } + }); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/DuelHandler.java b/GameServer/src/msc/gs/phandler/client/DuelHandler.java new file mode 100644 index 0000000..7c71e93 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/DuelHandler.java @@ -0,0 +1,354 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.DuelEvent; +import msc.gs.event.SingleEvent; +import msc.gs.event.WalkToMobEvent; +import msc.gs.external.ItemDef; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.PathGenerator; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; + +public class DuelHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private boolean busy(Player player) { + return player.isBusy() || player.isRanging() || player.accessingBank() || player.isTrading(); + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + + Player affectedPlayer = player.getWishToDuel(); + if (player == affectedPlayer) { + Logger.println("Warning : " + player.getUsername() + " tried to duel himself"); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + if(player.isPMod() && !player.isMod()) + return; + if (player.isDuelConfirmAccepted() && affectedPlayer != null && affectedPlayer.isDuelConfirmAccepted()) { + // If we are actually dueling we shouldn't touch any settings + // (modify or unset!) + return; + } + if (busy(player) || player.getLocation().inWilderness()) { + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + if (player.getLocation().inModRoom()) { + player.getActionSender().sendMessage("You cannot duel in here!"); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + switch (pID) { + case 222: // Sending duel request + affectedPlayer = world.getPlayer(p.readShort()); + if (affectedPlayer == null || affectedPlayer.isDueling() || !player.withinRange(affectedPlayer, 8) || player.isDueling() || player.tradeDuelThrottling()) { + unsetOptions(player); + return; + } + if (!new PathGenerator(player.getX(), player.getY(), affectedPlayer.getX(), affectedPlayer.getY()).isValid()) { + unsetOptions(player); + return; + } + + if ((affectedPlayer.getPrivacySetting(3) && !affectedPlayer.isFriendsWith(player.getUsernameHash())) || affectedPlayer.isIgnoring(player.getUsernameHash())) { + player.getActionSender().sendMessage("This player has duel requests blocked."); + return; + } + + player.setWishToDuel(affectedPlayer); + player.getActionSender().sendMessage(affectedPlayer.isDueling() ? affectedPlayer.getUsername() + " is already in a duel" : "Sending duel request"); + affectedPlayer.getActionSender().sendMessage(player.getUsername() + " " + Formulae.getLvlDiffColour(affectedPlayer.getCombatLevel() - player.getCombatLevel()) + "(level-" + player.getCombatLevel() + ")@whi@ wishes to duel with you"); + + if (!player.isDueling() && affectedPlayer.getWishToDuel() != null && affectedPlayer.getWishToDuel().equals(player) && !affectedPlayer.isDueling()) { + player.setDueling(true); + player.resetPath(); + player.clearDuelOptions(); + player.resetAllExceptDueling(); + affectedPlayer.setDueling(true); + affectedPlayer.resetPath(); + affectedPlayer.clearDuelOptions(); + affectedPlayer.resetAllExceptDueling(); + + player.getActionSender().sendDuelWindowOpen(); + affectedPlayer.getActionSender().sendDuelWindowOpen(); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " sent duel request " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + } + break; + case 252: // Duel accepted + affectedPlayer = player.getWishToDuel(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isDueling() || !affectedPlayer.isDueling()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + + player.setDuelOfferAccepted(true); + + player.getActionSender().sendDuelAcceptUpdate(); + affectedPlayer.getActionSender().sendDuelAcceptUpdate(); + + if (affectedPlayer.isDuelOfferAccepted()) { + player.getActionSender().sendDuelAccept(); + affectedPlayer.getActionSender().sendDuelAccept(); + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " accepted duel request " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + break; + case 87: // Confirm accepted + affectedPlayer = player.getWishToDuel(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isDueling() || !affectedPlayer.isDueling() || !player.isDuelOfferAccepted() || !affectedPlayer.isDuelOfferAccepted()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + player.setDuelConfirmAccepted(true); + + if (affectedPlayer.isDuelConfirmAccepted()) { + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " started duel " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + player.getActionSender().sendDuelWindowClose(); + player.getActionSender().sendMessage("Commencing Duel"); + affectedPlayer.getActionSender().sendDuelWindowClose(); + affectedPlayer.getActionSender().sendMessage("Commencing Duel"); + + player.resetAllExceptDueling(); + player.setBusy(true); + player.setStatus(Action.DUELING_PLAYER); + + affectedPlayer.resetAllExceptDueling(); + affectedPlayer.setBusy(true); + affectedPlayer.setStatus(Action.DUELING_PLAYER); + + if (player.getDuelSetting(3)) { + for (InvItem item : player.getInventory().getItems()) { + if (item.isWielded()) { + item.setWield(false); + player.updateWornItems(item.getWieldableDef().getWieldPos(), player.getPlayerAppearance().getSprite(item.getWieldableDef().getWieldPos())); + } + } + player.getActionSender().sendSound("click"); + player.getActionSender().sendInventory(); + player.getActionSender().sendEquipmentStats(); + + for (InvItem item : affectedPlayer.getInventory().getItems()) { + if (item.isWielded()) { + item.setWield(false); + affectedPlayer.updateWornItems(item.getWieldableDef().getWieldPos(), affectedPlayer.getPlayerAppearance().getSprite(item.getWieldableDef().getWieldPos())); + } + } + affectedPlayer.getActionSender().sendSound("click"); + affectedPlayer.getActionSender().sendInventory(); + affectedPlayer.getActionSender().sendEquipmentStats(); + + } + + if (player.getDuelSetting(2)) { + for (int x = 0; x < 14; x++) { + if (player.isPrayerActivated(x)) { + player.removePrayerDrain(x); + player.setPrayer(x, false); + } + if (affectedPlayer.isPrayerActivated(x)) { + affectedPlayer.removePrayerDrain(x); + affectedPlayer.setPrayer(x, false); + } + } + player.getActionSender().sendPrayers(); + affectedPlayer.getActionSender().sendPrayers(); + } + + player.setFollowing(affectedPlayer); + WalkToMobEvent walking = new WalkToMobEvent(player, affectedPlayer, 1) { + public void arrived() { + Instance.getDelayedEventHandler().add(new SingleEvent(owner, 300) { + public void action() { + Player affectedPlayer = (Player) affectedMob; + owner.resetPath(); + if (!owner.nextTo(affectedPlayer)) { + unsetOptions(owner); + unsetOptions(affectedPlayer); + return; + } + affectedPlayer.resetPath(); + + owner.resetAllExceptDueling(); + affectedPlayer.resetAllExceptDueling(); + + owner.setLocation(affectedPlayer.getLocation(), true); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.removeWatchedPlayer(owner); + } + + owner.setSprite(9); + owner.setOpponent(affectedMob); + owner.setCombatTimer(); + + affectedPlayer.setSprite(8); + affectedPlayer.setOpponent(owner); + affectedPlayer.setCombatTimer(); + + Player attacker, opponent; + if (owner.getCombatLevel() > affectedPlayer.getCombatLevel()) { + attacker = affectedPlayer; + opponent = owner; + } else if (affectedPlayer.getCombatLevel() > owner.getCombatLevel()) { + attacker = owner; + opponent = affectedPlayer; + } else if (DataConversions.random(0, 1) == 1) { + attacker = owner; + opponent = affectedPlayer; + } else { + attacker = affectedPlayer; + opponent = owner; + } + DuelEvent dueling = new DuelEvent(attacker, opponent); + dueling.setLastRun(0); + Instance.getDelayedEventHandler().add(dueling); + } + }); + } + + public void failed() { + Player affectedPlayer = (Player) affectedMob; + owner.getActionSender().sendMessage("Error walking to " + affectedPlayer.getUsername() + " (known bug)"); + affectedPlayer.getActionSender().sendMessage("Error walking to " + owner.getUsername() + " (known bug)"); + unsetOptions(owner); + unsetOptions(affectedPlayer); + owner.setBusy(false); + affectedPlayer.setBusy(false); + } + }; + walking.setLastRun(System.currentTimeMillis() + 500); + Instance.getDelayedEventHandler().add(walking); + } + break; + case 35: // Decline duel + affectedPlayer = player.getWishToDuel(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isDueling() || !affectedPlayer.isDueling()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + affectedPlayer.getActionSender().sendMessage(player.getUsername() + " has declined the duel."); + + unsetOptions(player); + unsetOptions(affectedPlayer); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " declined duel " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + break; + case 123: // Receive offered item data + affectedPlayer = player.getWishToDuel(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isDueling() || !affectedPlayer.isDueling() || (player.isDuelOfferAccepted() && affectedPlayer.isDuelOfferAccepted()) || player.isDuelConfirmAccepted() || affectedPlayer.isDuelConfirmAccepted()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + + player.setDuelOfferAccepted(false); + player.setDuelConfirmAccepted(false); + affectedPlayer.setDuelOfferAccepted(false); + affectedPlayer.setDuelConfirmAccepted(false); + + player.getActionSender().sendDuelAcceptUpdate(); + affectedPlayer.getActionSender().sendDuelAcceptUpdate(); + + Inventory duelOffer = new Inventory(); + player.resetDuelOffer(); + int count = (int) p.readByte(); + for (int slot = 0; slot < count; slot++) { + InvItem tItem = new InvItem(p.readShort(), p.readInt()); + if (tItem.getAmount() < 1) { + player.setSuspiciousPlayer(true); + continue; + } + ItemDef def = tItem.getDef(); + if (!def.canTrade()) { + player.getActionSender().sendMessage(def.getName() + " cannot be traded with other players"); + player.setRequiresOfferUpdate(true); + continue; + } + duelOffer.add(tItem); + } + for (InvItem item : duelOffer.getItems()) { + if (duelOffer.countId(item.getID()) > player.getInventory().countId(item.getID())) { + player.setSuspiciousPlayer(true); + return; + } + player.addToDuelOffer(item); + } + player.setRequiresOfferUpdate(true); + break; + + case 225: // Set duel options + affectedPlayer = player.getWishToDuel(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isDueling() || !affectedPlayer.isDueling() || (player.isDuelOfferAccepted() && affectedPlayer.isDuelOfferAccepted()) || player.isDuelConfirmAccepted() || affectedPlayer.isDuelConfirmAccepted()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + + player.setDuelOfferAccepted(false); + player.setDuelConfirmAccepted(false); + affectedPlayer.setDuelOfferAccepted(false); + affectedPlayer.setDuelConfirmAccepted(false); + + player.getActionSender().sendDuelAcceptUpdate(); + affectedPlayer.getActionSender().sendDuelAcceptUpdate(); + + for (int i = 0; i < 4; i++) { + boolean b = p.readByte() == 1; + player.setDuelSetting(i, b); + affectedPlayer.setDuelSetting(i, b); + } + + player.getActionSender().sendDuelSettingUpdate(); + affectedPlayer.getActionSender().sendDuelSettingUpdate(); + break; + } + } + + private void unsetOptions(Player p) { + if (p == null) { + return; + } + p.resetDueling(); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/DummyPacket.java b/GameServer/src/msc/gs/phandler/client/DummyPacket.java new file mode 100644 index 0000000..147b548 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/DummyPacket.java @@ -0,0 +1,30 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.builders.RSCPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.phandler.PacketHandler; + +public class DummyPacket implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + if (p.getLength() > 2) { // 1 for byte, 2 for short + byte b = p.readByte(); + int clientVersion = p.readShort(); + if (clientVersion > 34 && clientVersion < 40) { + RSCPacketBuilder pb = new RSCPacketBuilder(); + pb.setBare(true); + pb.addByte((byte) 4); // client update + session.write(pb.toPacket()); + Player player = (Player) session.getAttachment(); + player.destroy(true); + } + } + } catch (Exception e) { + + } + } +} diff --git a/GameServer/src/msc/gs/phandler/client/ExceptionHandler.java b/GameServer/src/msc/gs/phandler/client/ExceptionHandler.java new file mode 100644 index 0000000..a06452b --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/ExceptionHandler.java @@ -0,0 +1,30 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class ExceptionHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + Player player = (Player) session.getAttachment(); + Logger.error("[CLIENT] Exception from " + player.getUsername() + ": " + p.readString()); + } + catch(Exception e) { + e.printStackTrace(); + } + + //player.getActionSender().sendLogout(); + //player.destroy(false); + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/client/FollowRequest.java b/GameServer/src/msc/gs/phandler/client/FollowRequest.java new file mode 100644 index 0000000..e92c37a --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/FollowRequest.java @@ -0,0 +1,37 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; + +public class FollowRequest implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + Player affectedPlayer = world.getPlayer(p.readShort()); + if (affectedPlayer == null) { + player.setSuspiciousPlayer(true); + return; + } + if (player.isBusy()) { + player.resetPath(); + return; + } + if (System.currentTimeMillis() - player.lastRun < 3000) + return; + player.resetAll(); + player.setFollowing(affectedPlayer, 1); + player.getActionSender().sendMessage("Now following " + affectedPlayer.getUsername()); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " started to follow " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + } +} diff --git a/GameServer/src/msc/gs/phandler/client/FriendHandler.java b/GameServer/src/msc/gs/phandler/client/FriendHandler.java new file mode 100644 index 0000000..d1c6f99 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/FriendHandler.java @@ -0,0 +1,86 @@ +package msc.gs.phandler.client; + +import java.util.ArrayList; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.MiscPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.model.snapshot.Chatlog; +import msc.gs.phandler.PacketHandler; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; + +public class FriendHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private MiscPacketBuilder loginSender = Instance.getServer().getLoginConnector().getActionSender(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + + long user = player.getUsernameHash(); + long friend = p.readLong(); + switch (pID) { + case 168: // Add friend + if (player.friendCount() >= 200) { + player.getActionSender().sendMessage("Your friend list is too full"); + return; + } + loginSender.addFriend(user, friend); + player.addFriend(friend, 0); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " added friend " + DataConversions.hashToUsername(friend)+ " at: " + player.getX() + "/" + player.getY())); + + break; + case 52: // Remove friend + loginSender.removeFriend(user, friend); + player.removeFriend(friend); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " removed friend " + DataConversions.hashToUsername(friend)+ " at: " + player.getX() + "/" + player.getY())); + + break; + case 25: // Add ignore + if (player.ignoreCount() >= 200) { + player.getActionSender().sendMessage("Your ignore list is too full"); + return; + } + loginSender.addIgnore(user, friend); + player.addIgnore(friend); + break; + case 108: // Remove ignore + loginSender.removeIgnore(user, friend); + player.removeIgnore(friend); + break; + case 254: // Send PM + try { + byte[] data = p.getRemainingData(); + String s = DataConversions.byteToString(data, 0, data.length); + s = s.toLowerCase(); + String k = s; + s = s.replace(" ", ""); + s = s.replace(".", ""); + if (s.contains("runeblast")) { + Logger.println(player.getUsername() + " pmed " + DataConversions.hashToUsername(friend) + ":" + k); + Instance.getIRC().sendMessage(player.getUsername() + " pmed " + DataConversions.hashToUsername(friend) + ":" + k); + return; + } + ArrayList temp = new ArrayList(); + temp.add(DataConversions.hashToUsername(friend)); + world.addEntryToSnapshots(new Chatlog(player.getUsername(),"(PM) " + k, temp)); + + loginSender.sendPM(user, friend, player.isPMod(), data); + } catch (NegativeArraySizeException e) { + player.destroy(false); + } + break; + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/GameSettingHandler.java b/GameServer/src/msc/gs/phandler/client/GameSettingHandler.java new file mode 100644 index 0000000..77f53f7 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/GameSettingHandler.java @@ -0,0 +1,40 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.GameSettingUpdatePacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class GameSettingHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private GameSettingUpdatePacketBuilder builder = new GameSettingUpdatePacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int idx = (int) p.readByte(); + if (idx < 0 || idx > 6) { + player.setSuspiciousPlayer(true); + return; + } + boolean on = p.readByte() == 1; + player.setGameSetting(idx, on); + + builder.setPlayer(player); + builder.setIndex(idx); + builder.setOn(on); + + LSPacket packet = builder.getPacket(); + if (packet != null) { + Instance.getServer().getLoginConnector().getSession().write(packet); + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/InvActionHandler.java b/GameServer/src/msc/gs/phandler/client/InvActionHandler.java new file mode 100644 index 0000000..e41114f --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/InvActionHandler.java @@ -0,0 +1,790 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.gs.Instance; +import msc.gs.Server; +import msc.gs.connection.Packet; +import msc.gs.event.DelayedEvent; +import msc.gs.event.MiniEvent; +import msc.gs.event.SingleEvent; +import msc.gs.external.ItemUnIdentHerbDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.Bubble; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.tools.DataConversions; + +public class InvActionHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + int INFECTED_BLOOD = 1322; + Player player = (Player) session.getAttachment(); + int idx = (int) p.readShort(); + if (idx < 0 || idx >= player.getInventory().size()) { + player.setSuspiciousPlayer(true); + return; + } + final InvItem item = player.getInventory().get(idx); + if (item == null || item.getDef().getCommand().equals("")) { + player.setSuspiciousPlayer(true); + return; + } + if(item.getDef().isMembers() && Constants.GameServer.F2P_WILDY && player.getLocation().inWilderness() && item.getID() != 814) { + player.getActionSender().sendMessage("Can not use a Member item in the wilderness"); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item " + item.getDef().getName() + "(" + item.getID() + ")" + " [CMD: "+item.getDef().getCommand()+"] at: " + player.getX() + "/" + player.getY())); + + if (item.getID() == 1263) { + //player.resetPath(); // This isn't how it's done in RSC + //player.setBusy(true); // Shouldn't be here + player.getActionSender().sendMessage("You rest in the sleeping bag"); + showBubble(player, item); + player.getActionSender().sendEnterSleep(); + // player.setFatigue(0); + // player.getActionSender().sendFatigue(); + // player.getActionSender().sendMessage("You wake up - feeling refreshed"); + // player.isSleeping = true; + // player.setBusy(false); + return; + } + + if (player.isBusy()) { + if (player.inCombat()) { + player.getActionSender().sendMessage("You cannot do that whilst fighting!"); + } + return; + }//sip + player.resetAll(); + + if (world.getQuestManager().handleUseItem(item, player)) + return; + if (item.getDef().getCommand().equalsIgnoreCase("identify")) { + if (!Server.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + ItemUnIdentHerbDef herb = item.getUnIdentHerbDef(); + if (herb == null) { + return; + } + if (player.getMaxStat(15) < herb.getLevelRequired()) { + player.getActionSender().sendMessage("Your herblaw ability is not high enough to clean this herb."); + return; + } + player.setBusy(true); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + ItemUnIdentHerbDef herb = item.getUnIdentHerbDef(); + InvItem newItem = new InvItem(herb.getNewId()); + owner.getInventory().remove(item); + owner.getInventory().add(newItem); + owner.getActionSender().sendMessage("You clean the mud off the " + newItem.getDef().getName() + "."); + owner.incExp(15, herb.getExp(), true); + owner.getActionSender().sendStat(15); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + return; + } + }); + return; + } + + if (item.isEdible()) { + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + player.setBusy(true); + player.getActionSender().sendSound("eat"); + if (item.getID() == 228 || item.getID() == 18) + player.getActionSender().sendMessage("You eat the " + item.getDef().getName() + ". Yuck!"); + else + player.getActionSender().sendMessage("You eat the " + item.getDef().getName() + "."); + // 1263 + final boolean heals = player.getCurStat(3) < player.getMaxStat(3); + if (heals) { + int newHp = player.getCurStat(3) + item.eatingHeals(); + if (newHp > player.getMaxStat(3)) { + newHp = player.getMaxStat(3); + } + player.setCurStat(3, newHp); + player.getActionSender().sendStat(3); + } + Instance.getDelayedEventHandler().add(new SingleEvent(player, 185) { + public void action() { + if (heals) { + owner.getActionSender().sendMessage("It heals some health."); + } + owner.getInventory().remove(item); + switch (item.getID()) { + case 326: // Meat pizza + owner.getInventory().add(new InvItem(328)); + break; + case 327: // Anchovie pizza + owner.getInventory().add(new InvItem(329)); + break; + case 330: // Cake + owner.getInventory().add(new InvItem(333)); + break; + case 333: // Partical cake + owner.getInventory().add(new InvItem(335)); + break; + case 332: // Choc cake + owner.getInventory().add(new InvItem(334)); + break; + case 334: // Partical choc cake + owner.getInventory().add(new InvItem(336)); + break; + case 257: // Apple pie + owner.getInventory().add(new InvItem(263)); + break; + case 261: // Half apple pie + owner.getInventory().add(new InvItem(251)); + break; + case 258: // Redberry pie + owner.getInventory().add(new InvItem(262)); + break; + case 262: // Half redberry pie + owner.getInventory().add(new InvItem(251)); + break; + case 259: // Meat pie + owner.getInventory().add(new InvItem(261)); + break; + case 263: // Half meat pie + owner.getInventory().add(new InvItem(251)); + break; + } + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + } else if (item.getDef().getCommand().equalsIgnoreCase("open")) { + if(item.getID() == INFECTED_BLOOD) { + if(!player.isInfected()) { player.setInfected(); return; } + long lastUsed = System.currentTimeMillis() - player.lastInfected(); + long remaining = 5 - lastUsed / 1000; + InvItem INFECTED_BLOOD_I = new InvItem(1322, 1); + if(lastUsed / 1000 <= 5) { player.getActionSender().sendMessage("You have to wait " + remaining + " seconds before using that again."); return; } + showBubble(player, INFECTED_BLOOD_I); + player.getActionSender().sendMessage("Pools of blood spurt our around you."); + for (Player v : player.infectedBlood()) { + if(v == player) continue; + int bloodChance = DataConversions.random(0,99); + if(bloodChance >= 15) { + showBubble(v, INFECTED_BLOOD_I); + v.setInfected(); + player.getActionSender().sendMessage("You have infected " + v.getUsername() + " >:D "); + } + } + player.setLastInfected(); + return; + } + if(item.getID() == 1321) { + int win; + int Roll = DataConversions.random(0,99); + if(player.getInventory().remove(1321,1) > -1) { + if(Roll <= 10) { win = 795; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 30) { win = 81; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 40) { win = 828; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 43) { win = 831; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 47) { win = 832; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 55) { win = 576; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 60) { win = 577; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 63) { win = 578; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 67) { win = 579; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 71) { win = 580; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 76) { win = 581; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + if(Roll <= 85) { win = 10; player.getInventory().add(new InvItem(win, 200000)); player.getActionSender().sendInventory(); return; } + if(Roll <= 100) { win = 1289; player.getInventory().add(new InvItem(win)); player.getActionSender().sendInventory(); return; } + } + } + if(item.getID() == 1323) { return; } + } else if (item.getDef().getCommand().equalsIgnoreCase("open") && item.getID() == 796) { + final ActiveTile tile = world.getTile(player.getLocation()); + if (tile.hasGameObject()) { + player.getActionSender().sendMessage("You cannot do that here, please move to a new area."); + return; + } + if (player.getInventory().remove(796, 1) > -1) { + player.getActionSender().sendInventory(); + player.setBusy(true); + player.getActionSender().sendMessage("You open and plant the seed."); + world.registerGameObject(new GameObject(player.getLocation(), 490, 0, 0)); + final Point location = player.getLocation(); + Instance.getDelayedEventHandler().add(new DelayedEvent(null, 180000) { + GameObject object = world.getTile(location).getGameObject(); + + public void run() { + if (object != null) { + world.unregisterGameObject(object); + } + } + }); + } + player.setBusy(false); + return; + } + + else if (item.getDef().getCommand().equalsIgnoreCase("bury")) { + player.setBusy(true); + player.getActionSender().sendMessage("You dig a hole in the ground."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You bury the " + item.getDef().getName() + "."); + owner.getInventory().remove(item); + switch (item.getID()) { + case 20: // Bones + case 604: // Bat bones + owner.incExp(5, 8, true); + break; + case 413: // Big bones + owner.incExp(5, 24, true); + break; + case 814: // Dragon bones + owner.incExp(5, 90, true); + break; + } + owner.getActionSender().sendStat(5); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + });// f2p + } else if (item.getDef().getCommand().equalsIgnoreCase("drink")) { + switch (item.getID()) { + case 180: // bad wine + + player.getActionSender().sendMessage("You drink the bad wine"); + showBubble(player, item); + player.getInventory().remove(item); + + player.getInventory().add(new InvItem(140)); + int atk = player.getCurStat(0); + atk -= 3; + if (atk < 0) + atk = 0; + player.setCurStat(0, atk); + player.getActionSender().sendStat(0); + player.getActionSender().sendInventory(); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You start to feel sick"); + } + }); + break; + case 142: + player.getActionSender().sendMessage("You drink the wine"); + showBubble(player, item); + player.getInventory().remove(item); + + player.getInventory().add(new InvItem(140)); + int hp = player.getCurStat(3); + atk = player.getCurStat(0); + atk -= 3; + hp += 11; + if (atk < 0) + atk = 0; + if (hp > player.getMaxStat(3)) + hp = player.getMaxStat(3); + + player.setCurStat(3, hp); + player.setCurStat(0, atk); + player.getActionSender().sendStat(0); + player.getActionSender().sendStat(3); + player.getActionSender().sendInventory(); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You start to feel dizzy"); + } + }); + break; + case 739: // Tea + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("It's nice and refreshing."); + owner.getInventory().remove(item); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + case 193: // Beer + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You feel slightly dizzy."); + int k = owner.getCurStat(0); + k = k - 1; + if (k < 1) + k = 0; + owner.setCurStat(0, k); + owner.getActionSender().sendStat(0); + if (owner.getCurStat(2) <= owner.getMaxStat(2)) { + owner.setCurStat(2, owner.getCurStat(2) + 2); + owner.getActionSender().sendStat(2); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(620)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + case 830: // Greenmans Ale + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("It has a strange taste."); + for (int stat = 0; stat < 3; stat++) { + owner.setCurStat(stat, owner.getCurStat(stat) - 4); + owner.getActionSender().sendStat(stat); + } + if (owner.getCurStat(15) <= owner.getMaxStat(15)) { + owner.setCurStat(15, owner.getCurStat(15) + 1); + owner.getActionSender().sendStat(15); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(620)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + case 268: // Mind Bomb + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You feel very strange."); + for (int stat = 0; stat < 3; stat++) { + owner.setCurStat(stat, owner.getCurStat(stat) - 4); + owner.getActionSender().sendStat(stat); + } + int change = (owner.getMaxStat(6) > 55 ? 3 : 2); + int maxWithBomb = (owner.getMaxStat(6) + change); + if(maxWithBomb - owner.getCurStat(6) < change) { + change = maxWithBomb - owner.getCurStat(6); + } + if (owner.getCurStat(6) <= (owner.getMaxStat(6) + (owner.getMaxStat(6) > 55 ? 3 : 2))) { + owner.setCurStat(6, owner.getCurStat(6) + change); + owner.getActionSender().sendStat(6); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(620)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + case 269: // Dwarven Stout + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("It tastes foul."); + for (int stat = 0; stat < 3; stat++) { + owner.setCurStat(stat, owner.getCurStat(stat) - 4); + owner.getActionSender().sendStat(stat); + } + if (owner.getCurStat(13) <= owner.getMaxStat(13)) { + owner.setCurStat(13, owner.getCurStat(13) + 1); + owner.getActionSender().sendStat(13); + } + if (owner.getCurStat(14) <= owner.getMaxStat(14)) { + owner.setCurStat(14, owner.getCurStat(14) + 1); + owner.getActionSender().sendStat(14); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(620)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + case 267: // Asgarnian Ale + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You feel slightly reinvigorated"); + owner.getActionSender().sendMessage("And slightly dizzy too."); + owner.setCurStat(0, owner.getCurStat(0) - 4); + owner.getActionSender().sendStat(0); + if (owner.getCurStat(2) <= owner.getMaxStat(2)) { + owner.setCurStat(2, owner.getCurStat(2) + 2); + owner.getActionSender().sendStat(2); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(620)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + case 829: // Dragon Bitter + player.setBusy(true); + player.getActionSender().sendMessage("You drink the " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You feel slightly dizzy."); + owner.setCurStat(0, owner.getCurStat(0) - 4); + owner.getActionSender().sendStat(0); + if (owner.getCurStat(2) <= owner.getMaxStat(2)) { + owner.setCurStat(2, owner.getCurStat(2) + 2); + owner.getActionSender().sendStat(2); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(620)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + showBubble(player, item); + break; + /** HANDLE WINE+ CURE POISON AND ANTIDOTE AND ZAMAROCK POTIONS **/ + case 221: // Strength Potion - 4 dose + useNormalPotion(player, item, 2, 10, 2, 222, 3); + break; + case 222: // Strength Potion - 3 dose + useNormalPotion(player, item, 2, 10, 2, 223, 2); + break; + case 223: // Strength Potion - 2 dose + useNormalPotion(player, item, 2, 10, 2, 224, 1); + break; + case 224: // Strength Potion - 1 dose + useNormalPotion(player, item, 2, 10, 2, 465, 0); + break; + case 474: // attack Potion - 3 dose + useNormalPotion(player, item, 0, 10, 2, 475, 2); + break; + case 475: // attack Potion - 2 dose + useNormalPotion(player, item, 0, 10, 2, 476, 1); + break; + case 476: // attack Potion - 1 dose + useNormalPotion(player, item, 0, 10, 2, 465, 0); + break; + case 477: // stat restoration Potion - 3 dose + useStatRestorePotion(player, item, 478, 2); + break; + case 478: // stat restoration Potion - 2 dose + useStatRestorePotion(player, item, 479, 1); + break; + case 479: // stat restoration Potion - 1 dose + useStatRestorePotion(player, item, 465, 0); + break; + case 480: // defense Potion - 3 dose + useNormalPotion(player, item, 1, 10, 2, 481, 2); + break; + case 481: // defense Potion - 2 dose + useNormalPotion(player, item, 1, 10, 2, 482, 1); + break; + case 482: // defense Potion - 1 dose + useNormalPotion(player, item, 1, 10, 2, 465, 0); + break; + case 483: // restore prayer Potion - 3 dose + usePrayerPotion(player, item, 484, 2); + break; + case 484: // restore prayer Potion - 2 dose + usePrayerPotion(player, item, 485, 1); + break; + case 485: // restore prayer Potion - 1 dose + usePrayerPotion(player, item, 465, 0); + break; + case 486: // Super attack Potion - 3 dose + useNormalPotion(player, item, 0, 15, 4, 487, 2); + break; + case 487: // Super attack Potion - 2 dose + useNormalPotion(player, item, 0, 15, 4, 488, 1); + break; + case 488: // Super attack Potion - 1 dose + useNormalPotion(player, item, 0, 15, 4, 465, 0); + break; + case 489: // fishing Potion - 3 dose + useFishingPotion(player, item, 490, 2); + break; + case 490: // fishing Potion - 2 dose + useFishingPotion(player, item, 491, 1); + break; + case 491: // fishing Potion - 1 dose + useFishingPotion(player, item, 465, 0); + break; + case 492: // Super strength Potion - 3 dose + useNormalPotion(player, item, 2, 15, 4, 493, 2); + break; + case 493: // Super strength Potion - 2 dose + useNormalPotion(player, item, 2, 15, 4, 494, 1); + break; + case 494: // Super strength Potion - 1 dose + useNormalPotion(player, item, 2, 15, 4, 465, 0); + break; + case 495: // Super defense Potion - 3 dose + useNormalPotion(player, item, 1, 15, 4, 496, 2); + break; + case 496: // Super defense Potion - 2 dose + useNormalPotion(player, item, 1, 15, 4, 497, 1); + break; + case 497: // Super defense Potion - 1 dose + useNormalPotion(player, item, 1, 15, 4, 465, 0); + break; + case 498: // ranging Potion - 3 dose + useNormalPotion(player, item, 4, 10, 2, 499, 2); + break; + case 499: // ranging Potion - 2 dose + useNormalPotion(player, item, 4, 10, 2, 500, 1); + break; + case 500: // ranging Potion - 1 dose + useNormalPotion(player, item, 4, 10, 2, 465, 0); + break; + default: + player.getActionSender().sendMessage("Nothing interesting happens"); + return; + } + } else { + switch (item.getID()) { + case 597: // Charged Dragonstone amulet + if (!Server.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + player.getActionSender().sendMessage("You rub the amulet..."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + String[] options = new String[] { "Edgeville", "Karamja", "Draynor Village", "Al Kharid", "Seers", "Yanille" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy() || owner.inCombat() || owner.getInventory().get(item) == null) { + return; + } + if (owner.getLocation().inModRoom() && !owner.isMod()) { + owner.getActionSender().sendMessage("A magical force stops you from teleporting."); + return; + } + owner.getActionSender().sendSound("spellok"); + switch (option) { + case 0: // Edgeville + owner.teleport(193, 435, true); + break; + case 1: // Karamja + owner.teleport(360, 696, true); + break; + case 2: // Draynor Village + owner.teleport(214, 632, true); + break; + case 3: // Al Kharid + owner.teleport(72, 696, true); + break; + case 4: // Seers + owner.teleport(516, 460, true); + break; + case 5: // Yanille + owner.teleport(587, 761, true); + break; + default: + return; + + } + if (DataConversions.random(0, 5) == 1 && owner.getInventory().remove(item) > -1) { + owner.getInventory().add(new InvItem(522, 1)); + owner.getActionSender().sendInventory(); + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + break; + case 316: // Ruby ammy + case 317: // Diamond ammy + if(!player.canLogout() || System.currentTimeMillis() - player.getLastMoved() < 10000) { + player.getActionSender().sendMessage("You must stand peacefully in one place for 10 seconds!"); + return; + } + player.getActionSender().sendMessage("You rub the amulet... be careful!"); + player.getActionSender().sendMessage("All who use this cursed amulet automatically skull!"); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + String[] options = new String[] { "Altar", "Castle" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (owner.isBusy() || owner.inCombat() || owner.getInventory().get(item) == null) { + return; + } + if (owner.getLocation().inModRoom() && !owner.isMod()) { + owner.getActionSender().sendMessage("A magical force stops you from teleporting."); + return; + } + owner.getActionSender().sendSound("spellok"); + switch (option) { + case 0: // altar + int x = DataConversions.random(311, 327); + int y = DataConversions.random(210, 222); + while(world.getTile(x, y).hasGameObject()) { + x = DataConversions.random(311, 327); + y = DataConversions.random(210, 222); + } + + owner.teleport(x, y, true); + owner.addSkull(1200000); + break; + case 1: // castle + x = DataConversions.random(271, 283); + y = DataConversions.random(352, 363); + while(world.getTile(x, y).hasGameObject()) { + x = DataConversions.random(271, 283); + y = DataConversions.random(352, 363); + } + owner.teleport(x, y, true); + owner.addSkull(1200000); + break; + default: + return; + + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + break; + case 387: // Disk of Returning + if (player.getLocation().wildernessLevel() >= 30 || (player.getLocation().inModRoom() && !player.isMod())) { + player.getActionSender().sendMessage("The disk doesn't seem to work here."); + return; + } + player.getActionSender().sendMessage("The disk starts to spin..."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.resetPath(); + owner.teleport(131, 508, true); + owner.getInventory().remove(item); + owner.getActionSender().sendMessage("You find yourself back in Varrock"); + owner.getActionSender().sendMessage("The disk has now gone"); + owner.getActionSender().sendInventory(); + } + }); + break; + + default: + player.getActionSender().sendMessage("Nothing interesting happens"); + return; + } + } + } + + private void showBubble(Player player, InvItem item) { + Bubble bubble = new Bubble(player, item.getID()); + for (Player p1 : player.getViewArea().getPlayersInView()) { + p1.informOfBubble(bubble); + } + } + + private void useFishingPotion(Player player, final InvItem item, final int newItem, final int left) { + if (!Server.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + player.setBusy(true); + player.getActionSender().sendMessage("You drink some of your " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You have " + left + " doses left."); + owner.setCurStat(10, owner.getMaxStat(10) + 3); + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(newItem)); + owner.getActionSender().sendStat(10); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + } + + private void useNormalPotion(Player player, final InvItem item, final int affectedStat, final int percentageIncrease, final int modifier, final int newItem, final int left) { + player.setBusy(true); + player.getActionSender().sendMessage("You drink some of your " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You have " + left + " doses left."); + int baseStat = owner.getCurStat(affectedStat) > owner.getMaxStat(affectedStat) ? owner.getMaxStat(affectedStat) : owner.getCurStat(affectedStat); + int newStat = baseStat + DataConversions.roundUp((owner.getMaxStat(affectedStat) / 100D) * percentageIncrease) + modifier; + if (newStat > owner.getCurStat(affectedStat)) { + owner.setCurStat(affectedStat, newStat); + owner.getActionSender().sendStat(affectedStat); + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(newItem)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + } + + private void usePrayerPotion(Player player, final InvItem item, final int newItem, final int left) { + player.setBusy(true); + player.getActionSender().sendMessage("You drink some of your " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You have " + left + " doses left."); + int newPrayer = owner.getCurStat(5) + 21; + if (newPrayer > owner.getMaxStat(5)) { + newPrayer = owner.getMaxStat(5); + } + owner.setCurStat(5, newPrayer); + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(newItem)); + owner.getActionSender().sendStat(5); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + } + + private void useStatRestorePotion(Player player, final InvItem item, final int newItem, final int left) { + if (!Server.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + player.setBusy(true); + player.getActionSender().sendMessage("You drink some of your " + item.getDef().getName() + "."); + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + owner.getActionSender().sendMessage("You have " + left + " doses left."); + for (int i = 0; i < 18; i++) { + if (i == 3 || i == 5) { + continue; + } + int max = owner.getMaxStat(i); + if (owner.getCurStat(i) < max) { + owner.setCurStat(i, max); + owner.getActionSender().sendStat(i); + } + } + owner.getInventory().remove(item); + owner.getInventory().add(new InvItem(newItem)); + owner.getActionSender().sendInventory(); + owner.setBusy(false); + } + }); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/InvUseOnGroundItem.java b/GameServer/src/msc/gs/phandler/client/InvUseOnGroundItem.java new file mode 100644 index 0000000..fd48d70 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/InvUseOnGroundItem.java @@ -0,0 +1,169 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.event.DelayedEvent; +import msc.gs.event.ShortEvent; +import msc.gs.event.WalkToPointEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.FiremakingDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.Bubble; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class InvUseOnGroundItem implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private Item getItem(int id, ActiveTile tile, Player player) { + for (Item i : tile.getItems()) { + if (i.getID() == id && i.visibleTo(player)) { + return i; + } + } + return null; + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + // incExp + player.resetAll(); + Point location = Point.location(p.readShort(), p.readShort()); + int id = p.readShort(); + final ActiveTile tile = world.getTile(location); + if (tile == null) + return; + final InvItem myItem = player.getInventory().get(p.readShort()); + if (myItem == null) + return; + if (tile.hasGameObject() && myItem.getID() != 135) { + player.getActionSender().sendMessage("You cannot do that here, please move to a new area."); + return; + } + final Item item = getItem(id, tile, player); + + if (item == null || myItem == null) { + player.setSuspiciousPlayer(true); + player.resetPath(); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item " + myItem.getDef().getName() + "(" + myItem.getID() + ")" + " [CMD: "+myItem.getDef().getCommand()+"] ON A GROUND ITEM "+ myItem.getDef().getName() + "(" + myItem.getID() + ")" + " [CMD: "+myItem.getDef().getCommand()+"] at: " + player.getX() + "/" + player.getY())); + + player.setStatus(Action.USING_INVITEM_ON_GITEM); + Instance.getDelayedEventHandler().add(new WalkToPointEvent(player, location, 1, false) { + public void arrived() { + if (owner.isBusy() || owner.isRanging() || !tile.hasItem(item) || !owner.nextTo(item) || owner.getStatus() != Action.USING_INVITEM_ON_GITEM) { + return; + } + if (myItem == null || item == null) + return; + switch (item.getID()) { + case 23: + if (myItem.getID() == 135) { + if (owner.getInventory().remove(myItem) < 0) + return; + owner.getActionSender().sendMessage("You put the flour in the pot."); + Bubble bubble = new Bubble(owner, 135); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + world.unregisterItem(item); + owner.getInventory().add(new InvItem(136)); + owner.getActionSender().sendInventory(); + return; + } + case 14: + case 632: + case 633: + case 634: + case 635: + case 636: + handleFireMaking(); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + } + + private void handleFireMaking() { + handleFireMaking((int)Math.ceil(owner.getMaxStat(11) / 10)); + + } + private void handleFireMaking(int tries) { + final int retries = --tries; + final FiremakingDef def = EntityHandler.getFiremakingDef(item.getID()); + if (!itemId(new int[] { 166 }) || def == null) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getCurStat(11) < def.getRequiredLevel()) { + owner.getActionSender().sendMessage("You need at least " + def.getRequiredLevel() + " firemaking to light these logs."); + return; + } + owner.setBusy(true); + Bubble bubble = new Bubble(owner, 166); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + owner.getActionSender().sendMessage("You attempt to light the logs..."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (Formulae.lightLogs(def, owner.getCurStat(11))) { + owner.getActionSender().sendMessage("They catch fire and start to burn."); + world.unregisterItem(item); + final GameObject fire = new GameObject(item.getLocation(), 97, 0, 0); + world.registerGameObject(fire); + world.getDelayedEventHandler().add(new DelayedEvent(null, def.getLength()) { + public void run() { + if (tile.hasGameObject() && tile.getGameObject().equals(fire)) { + world.unregisterGameObject(fire); + world.registerItem(new Item(181, tile.getX(), tile.getY(), 1, null)); + } + matchRunning = false; + } + }); + owner.incExp(11, Formulae.firemakingExp(owner.getMaxStat(11), def.getExp()), true); + owner.getActionSender().sendStat(11); + owner.setBusy(false); + } else { + owner.getActionSender().sendMessage("You fail to light them."); + owner.setBusy(false); + if(retries > 0) { + handleFireMaking(retries); + } + } + + } + }); + } + + private boolean itemId(int[] ids) { + return DataConversions.inArray(ids, myItem.getID()); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/InvUseOnItem.java b/GameServer/src/msc/gs/phandler/client/InvUseOnItem.java new file mode 100644 index 0000000..f8b2c45 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/InvUseOnItem.java @@ -0,0 +1,979 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.Server; +import msc.gs.connection.Packet; +import msc.gs.event.MiniEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.ItemArrowHeadDef; +import msc.gs.external.ItemBowStringDef; +import msc.gs.external.ItemDartTipDef; +import msc.gs.external.ItemGemDef; +import msc.gs.external.ItemHerbDef; +import msc.gs.external.ItemHerbSecond; +import msc.gs.external.ItemLogCutDef; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.tools.DataConversions; + +public class InvUseOnItem implements PacketHandler { + static int[] capes = { 183, 209, 229, 511, 512, 513, 514 }; + + /** + * World instance + */ + public static final World world = Instance.getWorld(); + int[] dye = { 238, 239, 272, 282, 515, 516 }; + int[] newCapes = { 183, 512, 229, 513, 511, 514 }; + + private boolean attachFeathers(Player player, final InvItem feathers, final InvItem item) { + int amount = 10; + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + if (feathers.getAmount() < amount) { + amount = feathers.getAmount(); + } + if (item.getAmount() < amount) { + amount = item.getAmount(); + } + InvItem newItem; + int exp; + ItemDartTipDef tipDef = null; + if (item.getID() == 280) { + newItem = new InvItem(637, amount); + exp = amount; + } else if ((tipDef = EntityHandler.getItemDartTipDef(item.getID())) != null) { + newItem = new InvItem(tipDef.getDartID(), amount); + exp = (int) (tipDef.getExp() * (double) amount); + } else { + return false; + } + final int amt = amount; + final int xp = exp; + final InvItem newItm = newItem; + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + if (owner.getInventory().remove(feathers.getID(), amt) > -1 && owner.getInventory().remove(item.getID(), amt) > -1) { + owner.getActionSender().sendMessage("You attach the feathers to the " + item.getDef().getName()); + owner.getInventory().add(newItm); + owner.incExp(9, xp, true); + owner.getActionSender().sendStat(9); + owner.getActionSender().sendInventory(); + } + } + }); + return true; + } + + private boolean combineKeys(Player player, final InvItem firstHalf, final InvItem secondHalf) { + if (secondHalf.getID() != 527) { + return false; + } + if (player.getInventory().remove(firstHalf) > -1 && player.getInventory().remove(secondHalf) > -1) { + player.getActionSender().sendMessage("You combine the key halves to make a crystal key."); + player.getInventory().add(new InvItem(525, 1)); + player.getActionSender().sendInventory(); + } + return true; + } + + private boolean doArrowHeads(Player player, final InvItem headlessArrows, final InvItem arrowHeads) { + final ItemArrowHeadDef headDef = EntityHandler.getItemArrowHeadDef(arrowHeads.getID()); + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + + if (headDef == null) { + return false; + } + if (player.getCurStat(9) < headDef.getReqLevel()) { + player.getActionSender().sendMessage("You need a fletching level of " + headDef.getReqLevel() + " to attach those."); + return true; + } + int amount = 10; + if (headlessArrows.getAmount() < amount) { + amount = headlessArrows.getAmount(); + } + if (arrowHeads.getAmount() < amount) { + amount = arrowHeads.getAmount(); + } + final int amt = amount; + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + if (owner.getInventory().remove(headlessArrows.getID(), amt) > -1 && owner.getInventory().remove(arrowHeads.getID(), amt) > -1) { + owner.getActionSender().sendMessage("You attach the heads to the arrows"); + owner.getInventory().add(new InvItem(headDef.getArrowID(), amt)); + owner.incExp(9, (int) (headDef.getExp() * (double) amt), true); + owner.getActionSender().sendStat(9); + owner.getActionSender().sendInventory(); + } + } + }); + return true; + } + + private boolean doBowString(Player player, final InvItem bowString, final InvItem bow) { + final ItemBowStringDef stringDef = EntityHandler.getItemBowStringDef(bow.getID()); + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + + if (stringDef == null) { + return false; + } + if (player.getCurStat(9) < stringDef.getReqLevel()) { + player.getActionSender().sendMessage("You need a fletching level of " + stringDef.getReqLevel() + " to do that."); + return true; + } + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + if (owner.getInventory().remove(bowString) > -1 && owner.getInventory().remove(bow) > -1) { + owner.getActionSender().sendMessage("You add the bow string to the bow"); + owner.getInventory().add(new InvItem(stringDef.getBowID(), 1)); + owner.incExp(9, stringDef.getExp(), true); + owner.getActionSender().sendStat(9); + owner.getActionSender().sendInventory(); + } + } + }); + return true; + } + + private boolean doCutGem(Player player, final InvItem chisel, final InvItem gem) { + final ItemGemDef gemDef = EntityHandler.getItemGemDef(gem.getID()); + if (gemDef == null) { + return false; + } + if (player.getCurStat(12) < gemDef.getReqLevel()) { + player.getActionSender().sendMessage("You need a crafting level of " + gemDef.getReqLevel() + " to cut this gem"); + return true; + } + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + if (owner.getInventory().remove(gem) > -1) { + InvItem cutGem = new InvItem(gemDef.getGemID(), 1); + owner.getActionSender().sendMessage("You cut the " + cutGem.getDef().getName()); + owner.getActionSender().sendSound("chisel"); + owner.getInventory().add(cutGem); + owner.incExp(12, gemDef.getExp(), true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + } + }); + return true; + } + + private boolean doGlassBlowing(Player player, final InvItem pipe, final InvItem glass) { + if (glass.getID() != 623) { + return false; + } + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + String[] options = new String[] { "Beer Glass", "Vial", "Orb", "Cancel" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + InvItem result; + int reqLvl, exp; + switch (option) { + case 0: + result = new InvItem(620, 1); + reqLvl = 1; + exp = 18; + break; + case 1: + result = new InvItem(465, 1); + reqLvl = 33; + exp = 35; + break; + case 2: + result = new InvItem(611, 1); + reqLvl = 46; + exp = 53; + break; + default: + return; + } + if (owner.getCurStat(12) < reqLvl) { + owner.getActionSender().sendMessage("You need a crafting level of " + reqLvl + " to make a " + result.getDef().getName() + "."); + return; + } + if (owner.getInventory().remove(glass) > -1) { + owner.getActionSender().sendMessage("You make a " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(12, exp, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + return true; + } + + private boolean doGrind(Player player, final InvItem mortar, final InvItem item) { + int newID; + switch (item.getID()) { + case 466: // Unicorn Horn + newID = 473; + break; + case 467: // Blue dragon scale + newID = 472; + break; + default: + return false; + } + if (player.getInventory().remove(item) > -1) { + player.getActionSender().sendMessage("You grind up the " + item.getDef().getName()); + player.getInventory().add(new InvItem(newID, 1)); + player.getActionSender().sendInventory(); + } + return true; + } + + private boolean doHerblaw(Player player, final InvItem vial, final InvItem herb) { + final ItemHerbDef herbDef = EntityHandler.getItemHerbDef(herb.getID()); + if (herbDef == null) { + return false; + } + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + if (player.getCurStat(15) < herbDef.getReqLevel()) { + player.getActionSender().sendMessage("You need a herblaw level of " + herbDef.getReqLevel() + " to mix those."); + return true; + } + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + if (owner.getInventory().remove(vial) > -1 && owner.getInventory().remove(herb) > -1) { + owner.getActionSender().sendMessage("You add the " + herb.getDef().getName() + " to the water"); + owner.getInventory().add(new InvItem(herbDef.getPotionId(), 1)); + //owner.incExp(15, herbDef.getExp(), true); + //owner.getActionSender().sendStat(15); + owner.getActionSender().sendInventory(); + } + } + }); + return true; + } + + private boolean doHerbSecond(Player player, final InvItem second, final InvItem unfinished, final ItemHerbSecond def) { + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + if (unfinished.getID() != def.getUnfinishedID()) { + return false; + } + if (player.getCurStat(15) < def.getReqLevel()) { + player.getActionSender().sendMessage("You need a herblaw level of " + def.getReqLevel() + " to mix those"); + return true; + } + if (player.getInventory().remove(second) > -1 && player.getInventory().remove(unfinished) > -1) { + player.getActionSender().sendMessage("You mix the " + second.getDef().getName() + " with the " + unfinished.getDef().getName()); + player.getInventory().add(new InvItem(def.getPotionID(), 1)); + player.incExp(15, def.getExp() * 2, true); + player.getActionSender().sendStat(15); + player.getActionSender().sendInventory(); + } + return true; + } + + private boolean doLogCut(Player player, final InvItem knife, final InvItem log) { + return doLogCut(player, knife, log, ((int)Math.ceil(player.getMaxStat(9) / 10))); + } + private boolean doLogCut(final Player player, final InvItem knife, final InvItem log, int times) { + final int retries = --times; + final ItemLogCutDef cutDef = EntityHandler.getItemLogCutDef(log.getID()); + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + if (cutDef == null) { + return false; + } + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + String[] options = new String[] { "Arrow shafts", "Shortbow", "Longbow", "Cancel" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + InvItem result; + int reqLvl, exp; + switch (option) { + case 0: + result = new InvItem(280, cutDef.getShaftAmount()); + reqLvl = cutDef.getShaftLvl(); + exp = cutDef.getShaftExp(); + break; + case 1: + result = new InvItem(cutDef.getShortbowID(), 1); + reqLvl = cutDef.getShortbowLvl(); + exp = cutDef.getShortbowExp(); + break; + case 2: + result = new InvItem(cutDef.getLongbowID(), 1); + reqLvl = cutDef.getLongbowLvl(); + exp = cutDef.getLongbowExp(); + break; + default: + return; + } + if (owner.getCurStat(9) < reqLvl) { + owner.getActionSender().sendMessage("You need a fletching level of " + reqLvl + " to cut that."); + return; + } + if (owner.getInventory().remove(log) > -1) { + owner.getActionSender().sendMessage("You make a " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(9, exp, true); + owner.getActionSender().sendStat(9); + owner.getActionSender().sendInventory(); + } + if(retries > 0) { + doLogCut(player, knife, log, retries); + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + return true; + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + InvItem item1 = player.getInventory().get(p.readShort()); + InvItem item2 = player.getInventory().get(p.readShort()); + if (item1 == null || item2 == null) { + player.setSuspiciousPlayer(true); + return; + + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item " + item1.getDef().getName() + "(" + item1.getID() + ")" + " [CMD: "+item1.getDef().getCommand()+"] ON A ANOTHER INV ITEM "+ item2.getDef().getName() + "(" + item2.getID() + ")" + " [CMD: "+item2.getDef().getCommand()+"] at: " + player.getX() + "/" + player.getY())); + + World.getQuestManager().handleUseItemOnItem(item1,item2, player); + + ItemHerbSecond secondDef = null; + if ((secondDef = EntityHandler.getItemHerbSecond(item1.getID(), item2.getID())) != null && doHerbSecond(player, item1, item2, secondDef)) { + return; + } else if ((secondDef = EntityHandler.getItemHerbSecond(item2.getID(), item1.getID())) != null && doHerbSecond(player, item2, item1, secondDef)) { + return; + } + // water - empty water + /* + * int[][] jugs = { {50, 21}, {141, 140}, {342, 341} }; if(item1.getID() + * == 136 || item2.getID() == 136) { for(int i=0; i < jugs.length; i++) + * { if(item2.getID() == jugs[i][0]) { + * if(player.getInventory().remove(new InvItem(136)) > -1 && + * player.getInventory().remove(new InvItem(jugs[i][0])) > -1) { + * player.getInventory().add(new InvItem(jugs[i][1])); + * player.getInventory().add(new InvItem(135)); + * player.getInventory().add(new InvItem(250)); + * player.getActionSender().sendInventory(); + * player.getActionSender().sendMessage("You create pastry dough"); + * return; } } } } + */ + // dish ingred id - uncooked dish id + int[][] stuff = { { 252, 254 }, { 132, 255 }, { 236, 256 } }; + if (item1.getID() == 253 || item2.getID() == 253) { + for (int i = 0; i < stuff.length; i++) { + if (stuff[i][0] == item1.getID() || item2.getID() == stuff[i][0]) { + if (player.getInventory().remove(new InvItem(253)) > -1 && player.getInventory().remove(new InvItem(stuff[i][0])) > -1) { + player.getInventory().add(new InvItem(stuff[i][1])); + player.getActionSender().sendMessage("You create an uncooked pie!"); + player.getActionSender().sendInventory(); + return; + } + } + } + } + if (item1.getID() == 238 && item2.getID() == 239 || item1.getID() == 239 && item2.getID() == 238) { + if (player.getInventory().remove(new InvItem(239)) > -1 && player.getInventory().remove(new InvItem(238)) > -1) { + player.getInventory().add(new InvItem(282)); + player.getActionSender().sendMessage("You mix the Dyes"); + player.getActionSender().sendInventory(); + return; + } + } + // 1 dose on 2 dose str = 3 dose + if (item1.getID() == 224 && item2.getID() == 223 || item1.getID() == 223 && item2.getID() == 224) { + if (player.getInventory().remove(new InvItem(224)) > -1 && player.getInventory().remove(new InvItem(223)) > -1) { + player.getInventory().add(new InvItem(222)); + player.getActionSender().sendMessage("You mix the strength potions"); + player.getActionSender().sendInventory(); + return; + } + } + // 1 dose on 3 dose = 4 dose + if (item1.getID() == 224 && item2.getID() == 222 || item1.getID() == 222 && item2.getID() == 224) { + if (player.getInventory().remove(new InvItem(224)) > -1 && player.getInventory().remove(new InvItem(222)) > -1) { + player.getInventory().add(new InvItem(221)); + player.getActionSender().sendMessage("You mix the strength potions"); + player.getActionSender().sendInventory(); + return; + } + } + + // 2 dose on 2 dose = 4 dose + if (item1.getID() == 223 && item2.getID() == 223 || item1.getID() == 223 && item2.getID() == 223) { + if (player.getInventory().remove(new InvItem(223)) > -1 && player.getInventory().remove(new InvItem(223)) > -1) { + player.getInventory().add(new InvItem(221)); + player.getActionSender().sendMessage("You mix the strength potions"); + player.getActionSender().sendInventory(); + return; + } + } + if (item1.getID() == 224 && item2.getID() == 224 || item1.getID() == 224 && item2.getID() == 224) { + if (player.getInventory().remove(new InvItem(224)) > -1 && player.getInventory().remove(new InvItem(224)) > -1) { + player.getInventory().add(new InvItem(223)); + player.getActionSender().sendMessage("You mix the strength potions"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 132 && item2.getID() == 342 || item1.getID() == 342 && item2.getID() == 132) { + if (player.getInventory().remove(new InvItem(342)) > -1 && player.getInventory().remove(new InvItem(132)) > -1) { + player.getInventory().add(new InvItem(344)); + player.getActionSender().sendMessage("You start to create a stew"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 348 && item2.getID() == 342 || item1.getID() == 342 && item2.getID() == 348) { + if (player.getInventory().remove(new InvItem(342)) > -1 && player.getInventory().remove(new InvItem(348)) > -1) { + player.getInventory().add(new InvItem(343)); + player.getActionSender().sendMessage("You start to create a stew"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 132 && item2.getID() == 343 || item1.getID() == 343 && item2.getID() == 132) { + if (player.getInventory().remove(new InvItem(343)) > -1 && player.getInventory().remove(new InvItem(132)) > -1) { + player.getInventory().add(new InvItem(345)); + player.getActionSender().sendMessage("Your stew is now ready, but uncooked"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 348 && item2.getID() == 344 || item1.getID() == 344 && item2.getID() == 348) { + if (player.getInventory().remove(new InvItem(344)) > -1 && player.getInventory().remove(new InvItem(348)) > -1) { + player.getInventory().add(new InvItem(345)); + player.getActionSender().sendMessage("our stew is now ready, but uncooked"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 337 && item2.getID() == 330 || item1.getID() == 330 && item2.getID() == 337) { + if (player.getInventory().remove(new InvItem(337)) > -1 && player.getInventory().remove(new InvItem(330)) > -1) { + player.getInventory().add(new InvItem(332)); + player.getActionSender().sendMessage("You add chocolate to the cake"); + player.getActionSender().sendInventory(); + return; + } + } + + int egg = 19; + int milk = 22; + int flour = 136; + + if (item1.getID() == 338 || item2.getID() == 338) { + if (player.getInventory().countId(egg) > -1 && player.getInventory().countId(milk) > -1 && player.getInventory().countId(flour) > -1) { + if (player.getInventory().remove(new InvItem(egg)) > -1 && player.getInventory().remove(new InvItem(milk)) > -1 && player.getInventory().remove(new InvItem(flour)) > -1 && player.getInventory().remove(new InvItem(338)) > -1) { + player.getInventory().add(new InvItem(135)); + player.getInventory().add(new InvItem(339)); + player.getActionSender().sendInventory(); + player.getActionSender().sendMessage("You create an uncooked cake"); + return; + } + } + } + if (item1.getID() == 238 && item2.getID() == 239 || item1.getID() == 239 && item2.getID() == 238) { + if (player.getInventory().remove(new InvItem(239)) > -1 && player.getInventory().remove(new InvItem(238)) > -1) { + player.getInventory().add(new InvItem(282)); + player.getActionSender().sendMessage("You mix the Dyes"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 250 && item2.getID() == 251 || item1.getID() == 251 && item2.getID() == 250) { + if (player.getInventory().remove(new InvItem(251)) > -1 && player.getInventory().remove(new InvItem(250)) > -1) { + player.getInventory().add(new InvItem(253)); + player.getActionSender().sendMessage("You add the pastry dough in the dish"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 238 && item2.getID() == 272 || item1.getID() == 272 && item2.getID() == 238) { + if (player.getInventory().remove(new InvItem(272)) > -1 && player.getInventory().remove(new InvItem(238)) > -1) { + player.getInventory().add(new InvItem(516)); + player.getActionSender().sendMessage("You mix the Dyes"); + player.getActionSender().sendInventory(); + return; + } + } + if (item1.getID() == 239 && item2.getID() == 272 || item1.getID() == 272 && item2.getID() == 239) { + if (player.getInventory().remove(new InvItem(272)) > -1 && player.getInventory().remove(new InvItem(239)) > -1) { + player.getInventory().add(new InvItem(515)); + player.getActionSender().sendMessage("You mix the Dyes"); + player.getActionSender().sendInventory(); + return; + } + } + + else if (item1.getID() == 1276 && item2.getID() == 1277) { + if (player.getInventory().remove(new InvItem(1276)) > -1 && player.getInventory().remove(new InvItem(1277)) > -1) { + player.getActionSender().sendMessage("You combine the two parts."); + player.getInventory().add(new InvItem(1278)); + player.getActionSender().sendInventory(); + return; + } + }// here + else if (item1.getID() == 143 && item2.getID() == 141 || item1.getID() == 141 && item2.getID() == 143) { + if (player.getCurStat(7) < 35) { + player.getActionSender().sendMessage("You need level 35 cooking to do this"); + return; + } + if (player.getInventory().remove(new InvItem(141)) > -1 && player.getInventory().remove(new InvItem(143)) > -1) { + int rand = Formulae.Rand(0, 4); + if (rand == 2) { + player.incExp(7, 55, true); + player.getInventory().add(new InvItem(180)); + player.getActionSender().sendMessage("You mix the grapes, and accidentally create Bad wine!"); + } else { + player.incExp(7, 110, true); + player.getInventory().add(new InvItem(142)); + player.getActionSender().sendMessage("You mix the grapes with the water and create wine!"); + } + player.getActionSender().sendStat(7); + player.getActionSender().sendInventory(); + return; + } + } + for (Integer il : capes) { + if (il == item1.getID()) { + for (int i = 0; i < dye.length; i++) { + if (dye[i] == item2.getID()) { + if (player.getInventory().remove(new InvItem(item1.getID())) > -1 && player.getInventory().remove(new InvItem(item2.getID())) > -1) { + player.getActionSender().sendMessage("You dye the Cape"); + player.getInventory().add(new InvItem(newCapes[i])); + player.getActionSender().sendInventory(); + return; + } + } + } + } else if (il == item2.getID()) { + for (int i = 0; i < dye.length; i++) { + if (dye[i] == item1.getID()) { + if (player.getInventory().remove(new InvItem(item1.getID())) > -1 && player.getInventory().remove(new InvItem(item2.getID())) > -1) { + player.getActionSender().sendMessage("You dye the Cape"); + player.getInventory().add(new InvItem(newCapes[i])); + player.getActionSender().sendInventory(); + return; + } + } + } + } + } + if (item1.getID() == 141 && item2.getID() == 136 || item1.getID() == 136 && item2.getID() == 141) { + player.getActionSender().sendMessage("What would you like to make?"); + String[] optionsz = new String[] { "Bread Dough", "Pizza Base", "Pastry Dough" }; + + player.setMenuHandler(new MenuHandler(optionsz) { + public void handleReply(final int option, final String reply) { + int newid = 0; + if (option == 0) { + newid = 137; + } else if (option == 1) { + newid = 321; + } else if (option == 2) { + newid = 250; + } else { + return; + } + if (owner.getInventory().remove(new InvItem(141)) > -1 && owner.getInventory().remove(new InvItem(136)) > -1) { + owner.getActionSender().sendMessage("You create a " + reply); + owner.getInventory().add(new InvItem(140)); + owner.getInventory().add(new InvItem(135)); + owner.getInventory().add(new InvItem(newid)); + owner.getActionSender().sendInventory(); + } + + } + }); + player.getActionSender().sendMenu(optionsz); + return; + } + + if (item1.getID() == 50 && item2.getID() == 136 || item1.getID() == 136 && item2.getID() == 50) { + player.getActionSender().sendMessage("What would you like to make?"); + String[] optionsz = new String[] { "Bread Dough", "Pizza Base", "Pastry Dough" }; + player.setMenuHandler(new MenuHandler(optionsz) { + public void handleReply(final int option, final String reply) { + int newid = 0; + if (option == 0) { + newid = 137; + } else if (option == 1) { + newid = 321; + } else if (option == 2) { + newid = 250; + } else { + return; + } + if (owner.getInventory().remove(new InvItem(50)) > -1 && owner.getInventory().remove(new InvItem(136)) > -1) { + owner.getActionSender().sendMessage("You create a " + reply); + owner.getInventory().add(new InvItem(21)); + owner.getInventory().add(new InvItem(135)); + owner.getInventory().add(new InvItem(newid)); + owner.getActionSender().sendInventory(); + } + + } + }); + player.getActionSender().sendMenu(optionsz); + return; + } + + if (item1.getID() == 273 && item2.getID() == 282 || item1.getID() == 282 && item2.getID() == 273) { + if (player.getInventory().remove(new InvItem(282)) > -1 && player.getInventory().remove(new InvItem(273)) > -1) { + player.getInventory().add(new InvItem(274)); + player.getActionSender().sendMessage("You dye the goblin armor"); + player.getActionSender().sendInventory(); + return; + } + } + if (item1.getID() == 273 && item2.getID() == 272 || item1.getID() == 272 && item2.getID() == 273) { + if (player.getInventory().remove(new InvItem(272)) > -1 && player.getInventory().remove(new InvItem(273)) > -1) { + player.getInventory().add(new InvItem(275)); + player.getActionSender().sendMessage("You dye the goblin armor"); + player.getActionSender().sendInventory(); + return; + } + } + + if (item1.getID() == 320 && item2.getID() == 321 || item1.getID() == 321 && item2.getID() == 320) { + if (player.getInventory().remove(new InvItem(321)) > -1 && player.getInventory().remove(new InvItem(320)) > -1) { + player.getInventory().add(new InvItem(323)); + player.getActionSender().sendMessage("You add the Tomato to the Pizza base"); + player.getActionSender().sendInventory(); + return; + } + } + if (item1.getID() == 319 && item2.getID() == 323 || item1.getID() == 323 && item2.getID() == 319) { + if (player.getInventory().remove(new InvItem(323)) > -1 && player.getInventory().remove(new InvItem(319)) > -1) { + player.getInventory().add(new InvItem(324)); + player.getActionSender().sendMessage("You add Cheese on the Unfinished Pizza"); + player.getActionSender().sendInventory(); + return; + } + } + if (item1.getID() == 325 && item2.getID() == 352 || item1.getID() == 352 && item2.getID() == 325) { + if (player.getCurStat(7) > 54) { + if (player.getInventory().remove(new InvItem(352)) > -1 && player.getInventory().remove(new InvItem(325)) > -1) { + player.getInventory().add(new InvItem(327)); + player.incExp(7, 110, true); + player.getActionSender().sendStat(7); + player.getActionSender().sendMessage("You create an Anchovie Pizza."); + player.getActionSender().sendInventory(); + return; + } + } else { + player.getActionSender().sendMessage("You need a cooking level of 55 to do this"); + return; + } + } + if (item1.getID() == 325 && item2.getID() == 132 || item1.getID() == 132 && item2.getID() == 325) { + if (player.getCurStat(7) > 44) { + if (player.getInventory().remove(new InvItem(132)) > -1 && player.getInventory().remove(new InvItem(325)) > -1) { + player.getInventory().add(new InvItem(326)); + player.incExp(7, 110, true); + player.getActionSender().sendStat(7); + player.getActionSender().sendMessage("You create a Meat Pizza."); + player.getActionSender().sendInventory(); + return; + } + } else { + player.getActionSender().sendMessage("You need a cooking level of 44 to do this"); + return; + }// doHerblaw + } + if (item2.getID() == 1276 && item1.getID() == 1277) { + if (player.getInventory().remove(new InvItem(1276)) > -1 && player.getInventory().remove(new InvItem(1277)) > -1) { + player.getActionSender().sendMessage("You combine the two parts."); + player.getInventory().add(new InvItem(1278)); + player.getActionSender().sendInventory(); + return; + } + } else if (item1.getID() == 381 && attachFeathers(player, item1, item2)) { + return; + } else if (item2.getID() == 381 && attachFeathers(player, item2, item1)) { + return; + } else if (item1.getID() == 167 && doCutGem(player, item1, item2)) { + return; + } else if (item2.getID() == 167 && doCutGem(player, item2, item1)) { + return; + } else if (item1.getID() == 13 && doLogCut(player, item1, item2)) { + return; + } else if (item2.getID() == 13 && doLogCut(player, item2, item1)) { + return; + } else if (item1.getID() == 464 && doHerblaw(player, item1, item2)) { + return; + } else if (item2.getID() == 464 && doHerblaw(player, item2, item1)) { + return; + } else if(item1.getID() == 676 && doBowString(player, item1, item2)) { + return; + } else if(item2.getID() == 676 && doBowString(player, item2, item1)) { + return; + } else if (item1.getID() == 637 && doArrowHeads(player, item1, item2)) { + return; + } else if (item2.getID() == 637 && doArrowHeads(player, item2, item1)) { + return; + }else if(item1.getID() == 468 && doGrind(player, item1, item2)) { + return; + } + else if(item2.getID() == 468 && doGrind(player, item2, item1)) { + return; + } else if (item1.getID() == 207 && useWool(player, item1, item2)) { + return; + } else if (item2.getID() == 207 && useWool(player, item2, item1)) { + return; + } else if (item1.getID() == 39 && makeLeather(player, item1, item2)) { + return; + } else if (item2.getID() == 39 && makeLeather(player, item2, item1)) { + return; + } + else if(item1.getID() == 621 && doGlassBlowing(player, item1, item2)) { + return; + } + else if(item2.getID() == 621 && doGlassBlowing(player, item2, item1)) { + return; + } + else if ((item1.getID() == 50 || item1.getID() == 141 || item1.getID() == 342) && useWater(player, item1, item2)) { + return; + } else if ((item2.getID() == 50 || item2.getID() == 141 || item2.getID() == 342) && useWater(player, item2, item1)) { + return; + } + + else if (item1.getID() == 526 && combineKeys(player, item1, item2)) { + return; + } else if (item2.getID() == 526 && combineKeys(player, item2, item1)) { + return; + } else if ((item1.getID() == 23 && item2.getID() == 135) || (item2.getID() == 23 && item1.getID() == 135)) { + if (player.getInventory().remove(new InvItem(23)) > -1 && player.getInventory().remove(new InvItem(135)) > -1) { + player.getInventory().add(new InvItem(136)); + player.getActionSender().sendInventory(); + player.getActionSender().sendMessage("You pour the flour into the pot."); + return; + } + } else { + + int[][] combinePotions = { { 475, 476, 474 }, // Attack potions. + { 478, 479, 477 }, // Stat restore potions + { 481, 482, 480 }, // Defense potions + { 484, 485, 483 }, // Prayer potion + { 487, 488, 486 }, // SAP + { 490, 491, 489 }, // Fishing potion + { 493, 494, 492 }, // SSP + { 496, 497, 495 }, // SDP + { 499, 500, 498 } // Range pot + }; + + for (int i = 0; i < combinePotions.length; i++) { + if ((item1.getID() == combinePotions[i][0] && item2.getID() == combinePotions[i][1]) || (item2.getID() == combinePotions[i][0] && item1.getID() == combinePotions[i][1])) { + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + if (player.getInventory().remove(new InvItem(combinePotions[i][0])) > -1 && player.getInventory().remove(new InvItem(combinePotions[i][1])) > -1) { + player.getInventory().add(new InvItem(combinePotions[i][2])); + player.getActionSender().sendInventory(); + player.getActionSender().sendMessage("You combine the Potions"); + return; + } + } else if (item1.getID() == combinePotions[i][1] && item2.getID() == combinePotions[i][1]) { + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + if (player.getInventory().remove(new InvItem(combinePotions[i][1])) > -1 && player.getInventory().remove(new InvItem(combinePotions[i][1])) > -1) { + if (!Server.isMembers()) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + player.getInventory().add(new InvItem(combinePotions[i][0])); + player.getActionSender().sendInventory(); + player.getActionSender().sendMessage("You combine the Potions"); + return; + } else if (item1.getID() == combinePotions[i][0] && item2.getID() == combinePotions[i][0]) { + if (!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + if (player.getInventory().remove(new InvItem(combinePotions[i][0])) > -1 && player.getInventory().remove(new InvItem(combinePotions[i][0])) > -1) { + player.getInventory().add(new InvItem(combinePotions[i][2])); + player.getInventory().add(new InvItem(combinePotions[i][1])); + player.getActionSender().sendInventory(); + player.getActionSender().sendMessage("You combine the Potions"); + return; + } + } + } + } + + player.getActionSender().sendMessage("Nothing interesting happens"); + } + } + + private boolean makeLeather(Player player, final InvItem needle, final InvItem leather) { + if (leather.getID() != 148) { + return false; + } + if (player.getInventory().countId(43) < 1) { + player.getActionSender().sendMessage("You need some thread to make anything out of leather"); + return true; + } + if (DataConversions.random(0, 5) == 0) { + player.getInventory().remove(43, 1); + } + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + String[] options = new String[] { "Armour", "Gloves", "Boots", "Cancel" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + InvItem result; + int reqLvl, exp; + switch (option) { + case 0: + result = new InvItem(15, 1); + reqLvl = 14; + exp = 25; + break; + case 1: + result = new InvItem(16, 1); + reqLvl = 1; + exp = 14; + break; + case 2: + result = new InvItem(17, 1); + reqLvl = 7; + exp = 17; + break; + default: + return; + } + if (owner.getCurStat(12) < reqLvl) { + owner.getActionSender().sendMessage("You need a crafting level of " + reqLvl + " to make " + result.getDef().getName() + "."); + return; + } + if (owner.getInventory().remove(leather) > -1) { + owner.getActionSender().sendMessage("You make some " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(12, exp, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + return true; + } + + private boolean useWater(Player player, final InvItem water, final InvItem item) { + int jugID = Formulae.getEmptyJug(water.getID()); + if (jugID == -1) { // This shouldn't happen + return false; + } + switch (item.getID()) { + case 149: // Clay + if (player.getInventory().remove(water) > -1 && player.getInventory().remove(item) > -1) { + player.getActionSender().sendMessage("You soften the clay."); + player.getInventory().add(new InvItem(jugID, 1)); + player.getInventory().add(new InvItem(243, 1)); + player.getActionSender().sendInventory(); + } + break; + default: + return false; + } + return true; + } + + private boolean useWool(Player player, final InvItem woolBall, final InvItem item) { + int newID; + switch (item.getID()) { + case 44: // Holy Symbol of saradomin + newID = 45; + break; + case 1027: // Unholy Symbol of Zamorak + newID = 1028; + break; + case 296: // Gold Amulet + newID = 301; + break; + case 297: // Sapphire Amulet + newID = 302; + break; + case 298: // Emerald Amulet + newID = 303; + break; + case 299: // Ruby Amulet + newID = 304; + break; + case 300: // Diamond Amulet + newID = 305; + break; + case 524: // Dragonstone Amulet + if (!Server.isMembers()) { + player.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return true; + } + newID = 610; + break; + default: + return false; + } + final int newId = newID; + Instance.getDelayedEventHandler().add(new MiniEvent(player) { + public void action() { + if (owner.getInventory().remove(woolBall) > -1 && owner.getInventory().remove(item) > -1) { + owner.getActionSender().sendMessage("You string the amulet"); + owner.getInventory().add(new InvItem(newId, 1)); + owner.getActionSender().sendInventory(); + } + } + }); + return true; + } +} diff --git a/GameServer/src/msc/gs/phandler/client/InvUseOnNpc.java b/GameServer/src/msc/gs/phandler/client/InvUseOnNpc.java new file mode 100644 index 0000000..728d165 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/InvUseOnNpc.java @@ -0,0 +1,234 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.event.ShortEvent; +import msc.gs.event.WalkToMobEvent; +import msc.gs.model.Bubble; +import msc.gs.model.InvItem; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class InvUseOnNpc implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + int sh = -125534; + try { + sh = p.readShort(); + } catch (NullPointerException npe) { + return; + } + + final Npc affectedNpc = world.getNpc(sh); + final InvItem item = player.getInventory().get(p.readShort()); + if (affectedNpc == null || item == null) { // This shouldn't happen + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item " + item.getDef().getName() + "(" + item.getID() + ")" + " [CMD: "+item.getDef().getCommand()+"] ON A NPC "+ affectedNpc.getDef().getName() + "(" + affectedNpc.getID() + ")" + " at: " + player.getX() + "/" + player.getY())); + + player.setFollowing(affectedNpc); + player.setStatus(Action.USING_INVITEM_ON_NPC); + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedNpc, 1) { + public void arrived() { + owner.resetPath(); + owner.resetFollowing(); + if (!owner.getInventory().contains(item) || owner.isBusy() || owner.isRanging() || !owner.nextTo(affectedNpc) || affectedNpc.isBusy() || owner.getStatus() != Action.USING_INVITEM_ON_NPC) { + return; + } + owner.resetAll(); + switch (affectedNpc.getID()) { + case 2: // Sheep + if (!itemId(new int[] { 144 })) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.setBusy(true); + affectedNpc.blockedBy(owner); + affectedNpc.resetPath(); + showBubble(); + owner.getActionSender().sendMessage("You attempt to shear the sheep"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (DataConversions.random(0, 4) != 0) { + owner.getActionSender().sendMessage("You get some wool"); + owner.getInventory().add(new InvItem(145, 1)); + owner.getActionSender().sendInventory(); + } else { + owner.getActionSender().sendMessage("The sheep manages to get away from you!"); + } + owner.setBusy(false); + affectedNpc.unblock(); + } + }); + break; + case 217:// Cow + case 6: + if (item.getID() != 21) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.setBusy(true); + affectedNpc.blockedBy(owner); + affectedNpc.resetPath(); + Bubble bubble = new Bubble(owner, 21); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + owner.getActionSender().sendMessage("You try to milk the cow."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (DataConversions.random(0, 4) != 0) { + if (owner.getInventory().remove(item) < 0) + return; + owner.getActionSender().sendMessage("You get some milk"); + owner.getInventory().add(new InvItem(22, 1)); + owner.getActionSender().sendInventory(); + } else { + owner.getActionSender().sendMessage("The cow runs away before you could get any milk"); + } + owner.setBusy(false); + affectedNpc.unblock(); + } + }); + break; + case 160:// Thrander + int newID; + switch (item.getID()) { + case 308: // Bronze top + newID = 117; + break; + case 312: // Iron top + newID = 8; + break; + case 309: // Steel top + newID = 118; + break; + case 313: // Black top + newID = 196; + break; + case 310: // Mithril top + newID = 119; + break; + case 311: // Adamantite top + newID = 120; + break; + case 407: // Rune top + newID = 401; + break; + case 117: // Bronze body + newID = 308; + break; + case 8: // Iron body + newID = 312; + break; + case 118: // Steel body + newID = 309; + break; + case 196: // Black body + newID = 313; + break; + case 119: // Mithril body + newID = 310; + break; + case 120: // Adamantite body + newID = 311; + break; + case 401: // Rune body + newID = 407; + break; + case 214: // Bronze skirt + newID = 206; + break; + case 215: // Iron skirt + newID = 9; + break; + case 225: // Steel skirt + newID = 121; + break; + case 434: // Black skirt + newID = 248; + break; + case 226: // Mithril skirt + newID = 122; + break; + case 227: // Adamantite skirt + newID = 123; + break; + case 406: // Rune skirt + newID = 402; + break; + case 206: // Bronze legs + newID = 214; + break; + case 9: // Iron legs + newID = 215; + break; + case 121: // Steel legs + newID = 225; + break; + case 248: // Black legs + newID = 434; + break; + case 122: // Mithril legs + newID = 226; + break; + case 123: // Adamantite legs + newID = 227; + break; + case 402: // Rune legs + newID = 406; + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + final InvItem newPlate = new InvItem(newID, 1); + owner.getActionSender().sendMessage("Thrander hammers the armour"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getInventory().add(newPlate); + owner.getActionSender().sendInventory(); + } + affectedNpc.unblock(); + } + }); + affectedNpc.blockedBy(owner); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + break; + } + } + + private boolean itemId(int[] ids) { + return DataConversions.inArray(ids, item.getID()); + } + + private void showBubble() { + Bubble bubble = new Bubble(owner, item.getID()); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + } + }); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/InvUseOnObject.java b/GameServer/src/msc/gs/phandler/client/InvUseOnObject.java new file mode 100644 index 0000000..a59d223 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/InvUseOnObject.java @@ -0,0 +1,913 @@ +package msc.gs.phandler.client; + +import java.util.List; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.Server; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.MiniEvent; +import msc.gs.event.ShortEvent; +import msc.gs.event.WalkToObjectEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.ItemCookingDef; +import msc.gs.external.ItemCraftingDef; +import msc.gs.external.ItemSmeltingDef; +import msc.gs.external.ItemSmithingDef; +import msc.gs.external.ItemWieldableDef; +import msc.gs.external.ReqOreDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.Bubble; +import msc.gs.model.ChatMessage; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.plugins.quests.Dorics; +import msc.gs.quest.Quest; +import msc.gs.quest.QuestAction; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; + +public class InvUseOnObject implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private void handleDoor(final Player player, final ActiveTile tile, final GameObject object, final int dir, final InvItem item) { + player.setStatus(Action.USING_INVITEM_ON_DOOR); + Instance.getDelayedEventHandler().add(new WalkToObjectEvent(player, object, false) { + public void arrived() { + owner.resetPath(); + if (owner.isBusy() || owner.isRanging() || !owner.getInventory().contains(item) || !tile.hasGameObject() || !tile.getGameObject().equals(object) || owner.getStatus() != Action.USING_INVITEM_ON_DOOR) { + return; + } + owner.resetAll(); + switch (object.getID()) { + case 24: // Web + ItemWieldableDef def = item.getWieldableDef(); + if ((def == null || def.getWieldPos() != 4) && item.getID() != 13) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendMessage("You try to destroy the web"); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (Formulae.cutWeb()) { + owner.getActionSender().sendMessage("You slice through the web."); + world.unregisterGameObject(object); + world.delayedSpawnObject(object.getLoc(), 15000); + } else { + owner.getActionSender().sendMessage("You fail to cut through it."); + } + owner.setBusy(false); + } + }); + break; + case 23: // Giant place near barb village + if (!itemId(new int[] { 99 })) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendMessage("You unlock the door and go through it"); + doDoor(); + if (owner.getY() <= 484) { + owner.teleport(owner.getX(), 485, false); + } else { + owner.teleport(owner.getX(), 484, false); + } + break; + case 60: // Melzars maze + if (!itemId(new int[] { 421 })) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendMessage("You unlock the door and go through it"); + doDoor(); + if (owner.getX() <= 337) { + owner.teleport(338, owner.getY(), false); + } + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendInventory(); + } + + private void doDoor() { + owner.getActionSender().sendSound("opendoor"); + world.registerGameObject(new GameObject(object.getLocation(), 11, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), 1000); + } + + private boolean itemId(int[] ids) { + return DataConversions.inArray(ids, item.getID()); + } + }); + } + + private void handleObject(final Player player, final ActiveTile tile, final GameObject object, final InvItem item) { + player.setStatus(Action.USING_INVITEM_ON_OBJECT); + Instance.getDelayedEventHandler().add(new WalkToObjectEvent(player, object, false) { + public void arrived() { + owner.resetPath(); + if (owner.isBusy() || owner.isRanging() || !owner.getInventory().contains(item) || !owner.nextTo(object) || !tile.hasGameObject() || !tile.getGameObject().equals(object) || owner.getStatus() != Action.USING_INVITEM_ON_OBJECT) { + return; + } + owner.resetAll(); + String[] options; + if ((object.getID() == Dorics.ANVIL1_ID && object.getX() == Dorics.ANVIL1_X && object.getY() == Dorics.ANVIL1_Y) || (object.getID() == Dorics.ANVIL2_ID && object.getX() == Dorics.ANVIL2_X && object.getY() == Dorics.ANVIL2_Y)) { + if (owner.getQuestStage(7) != Quest.COMPLETE) { + Npc npc = World.getWorld().getNpc(Dorics.DORIC_ID, 323, 327, 487, 492); + + if (npc == null) { + player.getActionSender().sendMessage("You need to complete Doric's quest to use his anvils"); + player.setBusy(false); + return; + } else { + owner.informOfNpcMessage(new ChatMessage(npc, "Oi! Get off my anvil!", owner)); + Instance.getWorld().getDelayedEventHandler().add(new MiniEvent(owner) { + public void action() { + player.getActionSender().sendMessage("You need to complete Doric's quest to use his anvils"); + player.setBusy(false); + return; + } + }); + return; + + } + + } else { + player.setBusy(false); + } + + } + world.getQuestManager().handleAction(QuestAction.ITEM_USED_ON_OBJECT, new Object[] { item, object }, owner); + + int[] range = { 317, 254, 255, 256, 339, 324 }; + + if (object.getGameObjectDef().name.equalsIgnoreCase("fire")) { + for (Integer i : range) { + if (item.getID() == i) { + owner.getActionSender().sendMessage("You cannot cook this on a fire"); + return; + } + } + } + int[] sinks = { 48, 26, 86, 2, 466 }; + if (item.getID() == 341) { + for (Integer i : sinks) { + if (i == object.getID()) { + if (owner.getInventory().remove(new InvItem(item.getID())) > -1) { + owner.getActionSender().sendSound("filljug"); + owner.getActionSender().sendMessage("You fill up the bowl with water"); + owner.getInventory().add(new InvItem(342)); + owner.getActionSender().sendInventory(); + return; + } + } + } + } + if (item.getID() == 132) { + if (object.getID() == 97 || object.getID() == 11 || object.getID() == 435) { + player.setBusy(true); + player.getActionSender().sendMessage("You cook the " + item.getDef().name + " on the " + object.getGameObjectDef().name); + player.getInventory().remove(132, 1); + player.getActionSender().sendInventory(); + Instance.getDelayedEventHandler().add(new MiniEvent(owner, 2000) { + public void action() { + player.getActionSender().sendMessage("You burn the " + item.getDef().name); + player.getInventory().add(new InvItem(134)); + player.getActionSender().sendInventory(); + player.setBusy(false); + } + + }); + + return; + } + } + + if (object.getX() == 233 && object.getY() == 180) { + if (item.getID() == 414) { + if (owner.getInventory().remove(new InvItem(414)) > -1) { + owner.setBusy(true); + owner.getActionSender().sendMessage("you open the secret chest.."); + Instance.getDelayedEventHandler().add(new MiniEvent(owner, 1000) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("you find treasure!"); + owner.getInventory().add(new InvItem(158)); + owner.getInventory().add(new InvItem(173)); + owner.getInventory().add(new InvItem(64)); + owner.getInventory().add(new InvItem(42, 2)); + owner.getInventory().add(new InvItem(38, 2)); + owner.getInventory().add(new InvItem(41, 10)); + owner.getInventory().add(new InvItem(10, 50)); + owner.getActionSender().sendInventory(); + return; + } + }); + + } + } + } + + switch (object.getID()) { + case 52: // hopper + if (item.getID() == 29) { + + if (object.containsItem() == 29) { + owner.getActionSender().sendMessage("There is already grain in the hopper"); + return; + } + if (owner.getInventory().remove(item) > -1) { + Bubble bubble = new Bubble(player, 29); + for (Player p : player.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + owner.getActionSender().sendMessage("You put the grain in the hopper"); + object.containsItem(29); + owner.getActionSender().sendInventory(); + } + return; + } + + case 282: // Fountain of Heroes + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + if (item.getID() == 522) { + owner.getActionSender().sendMessage("You dip the amulet in the fountain..."); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("You feel more power coming from it than before."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getActionSender().sendMessage("You can now rub it to teleport."); + owner.getInventory().add(new InvItem(597)); + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + } + }); + } + }); + break; + } + case 2: // Well + case 466: // Well + case 814: // Well + case 48: // Sink + case 26: // Fountain + case 86: // Fountain + case 1130: // Fountain + handleRefill(); + break; + case 97: // Fire + case 11: + case 119: + case 274: + case 435: + case 491: // Range + handleCooking((int)Math.ceil(owner.getMaxStat(7) / 10)); + break; + case 118: + case 813: // Furnace + if(item.getID() == 172) { // Gold Bar (Crafting) + world.getDelayedEventHandler().add(new MiniEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("What would you like to make?"); + String[] options = new String[]{"Ring", "Necklace", "Amulet"}; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(int option, String reply) { + if(owner.isBusy() || option < 0 || option > 2) { + return; + } + final int[] moulds = {293, 295, 294}; + final int[] gems = {-1, 164, 163, 162, 161, 523}; + String[] options = {"Gold", "Sapphire", "Emerald", "Ruby", "Diamond", "Dragonstone"}; + final int craftType = option; + if(owner.getInventory().countId(moulds[craftType]) < 1) { + owner.getActionSender().sendMessage("You need a " + EntityHandler.getItemDef(moulds[craftType]).getName() + " to make a " + reply); + return; + } + owner.getActionSender().sendMessage("What type of " + reply + " would you like to make?"); + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(int option, String reply) { + if(owner.isBusy() || option < 0 || option > 5) { + return; + } + if(option != 0 && owner.getInventory().countId(gems[option]) < 1) { + owner.getActionSender().sendMessage("You don't have a " + reply + "."); + return; + } + ItemCraftingDef def = EntityHandler.getCraftingDef((option * 3) + craftType); + if(def == null) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if(owner.getCurStat(12) < def.getReqLevel()) { + owner.getActionSender().sendMessage("You need at crafting level of " + def.getReqLevel() + " to make this"); + return; + } + if(owner.getInventory().remove(item) > -1 && (option == 0 || owner.getInventory().remove(gems[option], 1) > -1)) { + showBubble(); + InvItem result = new InvItem(def.getItemID(), 1); + owner.getActionSender().sendMessage("You make a " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(12, def.getExp(), true, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + }if(item.getID() == 384) { // Silver Bar (Crafting) + world.getDelayedEventHandler().add(new MiniEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("What would you like to make?"); + String[] options = new String[]{"Holy Symbol of Saradomin", "UnHoly Symbol of Zamorak"}; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(int option, String reply) { + if(owner.isBusy() || option < 0 || option > 1) { + return; + } + int[] moulds = {386, 1026}; + int[] results = {44, 1027}; + if(owner.getInventory().countId(moulds[option]) < 1) { + owner.getActionSender().sendMessage("You need a " + EntityHandler.getItemDef(moulds[option]).getName() + " to make a " + reply); + return; + } + if(owner.getCurStat(12) < 16) { + owner.getActionSender().sendMessage("You need a crafting level of 16 to make this"); + return; + } + if(owner.getInventory().remove(item) > -1) { + showBubble(); + InvItem result = new InvItem(results[option]); + owner.getActionSender().sendMessage("You make a " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(12, 50, true, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + } + }); + owner.getActionSender().sendMenu(options); + } + }); + } else if (item.getID() == 625) { // Sand (Glass) + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + if (player.getInventory().countId(624) < 1) { + owner.getActionSender().sendMessage("You need some soda ash to mix the sand with."); + return; + } + owner.setBusy(true); + showBubble(); + owner.getActionSender().sendMessage("You put the seaweed and the soda ash in the furnace."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (player.getInventory().remove(624, 1) > -1 && player.getInventory().remove(item) > -1) { + owner.getActionSender().sendMessage("It mixes to make some molten glass"); + owner.getInventory().add(new InvItem(623, 1)); + owner.incExp(12, 20, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + } + }); + } else { + handleRegularSmelting(); + } + break; + case 50: + case 177: // Anvil + int minSmithingLevel = Formulae.minSmithingLevel(item.getID()); + if (minSmithingLevel < 0) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getInventory().countId(168) < 1) { + owner.getActionSender().sendMessage("You need a hammer to work the metal with."); + return; + } + if (owner.getCurStat(13) < minSmithingLevel) { + owner.getActionSender().sendMessage("You need a smithing level of " + minSmithingLevel + " to use this type of bar"); + return; + } + break; + case 121: // Spinning Wheel + switch (item.getID()) { + case 145: // Wool + handleWoolSpinning(); + break; + case 675: // Flax + handleFlaxSpinning(); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.setBusy(true); + showBubble(); + owner.getActionSender().sendSound("mechanical"); + break; + case 248: // Crystal key chest + if (item.getID() != 525) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + owner.getActionSender().sendMessage("You use the key to unlock the chest"); + owner.setBusy(true); + showBubble(); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getInventory().add(new InvItem(542, 1)); + List loot = Formulae.getKeyChestLoot(); + for (InvItem i : loot) { + if (i.getAmount() > 1 && !i.getDef().isStackable()) { + for (int x = 0; x < i.getAmount(); x++) { + + owner.getInventory().add(new InvItem(i.getID(), 1)); + } + } else { + if (i.getID() == 518 && i.getAmount() > 20) { + i = new InvItem(518, DataConversions.random(0, 20) + 1); + } + if (i.getID() == 517 && i.getAmount() > 20) { + i = new InvItem(517, DataConversions.random(0, 20) + 1); + } + Logger.println("Player: " + owner.getUsername() + " Got item: " + i.getID() + " From CHEST (" + i.getAmount() + ") sys time (" + System.currentTimeMillis() + ")"); + if (i.getAmount() > 4000) { + Logger.println("WARNING!!!! Player: " + owner.getUsername() + " was about to get " + i.getAmount() + " of " + i.getID() + " from the CHEST sys time (" + System.currentTimeMillis() + ")"); + owner.setBusy(false); + owner.getActionSender().sendInventory(); + return; + } + owner.getInventory().add(i); + } + } + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + } + }); + break; + case 302: // Sandpit + if (item.getID() != 21) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendMessage("You fill the bucket with sand."); + owner.setBusy(true); + showBubble(); + Instance.getDelayedEventHandler().add(new MiniEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getInventory().add(new InvItem(625, 1)); + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + } + }); + break; + case 179: // Potters Wheel + if (item.getID() != 243) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendMessage("What would you like to make?"); + options = new String[] { "Pot", "Pie Dish", "Bowl", "Cancel" }; + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(int option, String reply) { + if (owner.isBusy()) { + return; + } + int reqLvl, exp; + InvItem result; + switch (option) { + case 0: + result = new InvItem(279, 1); + reqLvl = 1; + exp = 6; + break; + case 1: + result = new InvItem(278, 1); + reqLvl = 4; + exp = 10; + break; + case 2: + result = new InvItem(340, 1); + reqLvl = 7; + exp = 10; + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getCurStat(12) < reqLvl) { + owner.getActionSender().sendMessage("You need a crafting level of " + reqLvl + " to make this"); + return; + } + if (owner.getInventory().remove(item) > -1) { + showBubble(); + owner.getActionSender().sendMessage("You make a " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(12, exp, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + } + }); + owner.getActionSender().sendMenu(options); + break; + case 178: // Potters Oven + int reqLvl, + xp, + resultID; + switch (item.getID()) { + case 279: // Pot + resultID = 135; + reqLvl = 1; + xp = 7; + break; + case 278: // Pie Dish + resultID = 251; + reqLvl = 4; + xp = 15; + break; + case 340: // Bowl + resultID = 341; + reqLvl = 7; + xp = 15; + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getCurStat(12) < reqLvl) { + owner.getActionSender().sendMessage("You need a crafting level of " + reqLvl + " to make this"); + return; + } + final InvItem result = new InvItem(resultID, 1); + final int exp = xp; + final boolean fail = Formulae.crackPot(reqLvl, owner.getCurStat(12)); + showBubble(); + owner.getActionSender().sendMessage("You place the " + item.getDef().getName() + " in the oven"); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + if (fail) { + owner.getActionSender().sendMessage("The " + result.getDef().getName() + " cracks in the oven, you throw it away."); + } else { + owner.getActionSender().sendMessage("You take out the " + result.getDef().getName()); + owner.getInventory().add(result); + owner.incExp(12, exp, true); + owner.getActionSender().sendStat(12); + } + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + } + }); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + } + + private void handleWoolSpinning() { + handleWoolSpinning((int)Math.ceil(owner.getMaxStat(12) / 10)); + } + private void handleWoolSpinning(int times) { + final int retries = --times; + owner.getActionSender().sendMessage("You spin the sheeps wool into a nice ball of wool"); + Instance.getDelayedEventHandler().add(new MiniEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getInventory().add(new InvItem(207, 1)); + owner.incExp(12, 3, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + if(retries > 0) { + handleWoolSpinning(retries); + } + } + }); + } + private void handleFlaxSpinning() { + handleFlaxSpinning((int)Math.ceil(owner.getMaxStat(12) / 10)); + + } + private void handleFlaxSpinning(int times) { + final int retries = --times; + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + if (owner.getCurStat(12) < 10) { + owner.getActionSender().sendMessage("You need a crafting level of 10 to spin flax"); + return; + } + owner.getActionSender().sendMessage("You make the flax into a bow string"); + Instance.getDelayedEventHandler().add(new MiniEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getInventory().add(new InvItem(676, 1)); + owner.incExp(12, 15, true); + owner.getActionSender().sendStat(12); + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + if(retries > 0) { + handleFlaxSpinning(retries); + } + } + }); + } + + private void handleRegularSmelting() { + handleRegularSmelting((int)Math.ceil(owner.getMaxStat(13) / 10)); + + } + private void handleRegularSmelting(int times1) { + final int times = --times1; + ItemSmeltingDef smeltingDef = item.getSmeltingDef(); + if (smeltingDef == null) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + for (ReqOreDef reqOre : smeltingDef.getReqOres()) { + if (owner.getInventory().countId(reqOre.getId()) < reqOre.getAmount()) { + if (item.getID() == 151) { + smeltingDef = EntityHandler.getItemSmeltingDef(9999); + break; + } + owner.getActionSender().sendMessage("You need " + reqOre.getAmount() + " " + EntityHandler.getItemDef(reqOre.getId()).getName() + " to smelt a " + item.getDef().getName() + "."); + return; + } + } + if (owner.getCurStat(13) < smeltingDef.getReqLevel()) { + owner.getActionSender().sendMessage("You need a smithing level of " + smeltingDef.getReqLevel() + " to smelt this."); + return; + } + if(!owner.getInventory().contains(item)) { + return; + } + owner.setBusy(true); + showBubble(); + owner.getActionSender().sendMessage("You smelt the " + item.getDef().getName() + " in the furnace."); + + final ItemSmeltingDef def = smeltingDef; + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + InvItem bar = new InvItem(def.getBarId()); + if (owner.getInventory().remove(item) > -1) { + for (ReqOreDef reqOre : def.getReqOres()) { + for (int i = 0; i < reqOre.getAmount(); i++) { + owner.getInventory().remove(new InvItem(reqOre.getId())); + } + } + if (item.getID() == 151 && def.getReqOres().length == 0 && DataConversions.random(0, 1) == 1) { + owner.getActionSender().sendMessage("The ore is too impure and unable to be refined."); + } + else { + owner.getInventory().add(bar); + owner.getActionSender().sendMessage("You retrieve a " + bar.getDef().getName() + "."); + owner.incExp(13, def.getExp(), true); + owner.getActionSender().sendStat(13); + } + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + if(times > 0) + handleRegularSmelting(times); + } + }); + } + + private void handleRefill() { + handleRefill((int)Math.ceil(owner.getMaxStat(15) / 10)); + } + private void handleRefill(int times) { + if (!itemId(new int[] { 21, 140, 465 }) && !itemId(Formulae.potionsUnfinished) && !itemId(Formulae.potions1Dose) && !itemId(Formulae.potions2Dose) && !itemId(Formulae.potions3Dose)) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getInventory().remove(item) > -1) { + showBubble(); + owner.getActionSender().sendSound("filljug"); + switch (item.getID()) { + case 21: + owner.getInventory().add(new InvItem(50)); + break; + case 140: + owner.getInventory().add(new InvItem(141)); + break; + default: + owner.getInventory().add(new InvItem(464)); + break; + } + owner.getActionSender().sendInventory(); + if(--times > 0) { handleRefill(times); } + } + + } + + private void handleCooking(int passedvalue) { + final int tries = --passedvalue; + if (item.getID() == 622) { // Seaweed (Glass) + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is not avaliable in f2p"); + return; + } + owner.setBusy(true); + showBubble(); + owner.getActionSender().sendSound("cooking"); + owner.getActionSender().sendMessage("You put the seaweed on the " + object.getGameObjectDef().getName() + "."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (owner.getInventory().remove(item) > -1) { + owner.getActionSender().sendMessage("The seaweed burns to ashes"); + owner.getInventory().add(new InvItem(624, 1)); + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + if(tries > 0) { + handleCooking(tries); + } + } + }); + } else { + final ItemCookingDef cookingDef = item.getCookingDef(); + if (cookingDef == null) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getCurStat(7) < cookingDef.getReqLevel()) { + owner.getActionSender().sendMessage("You need a cooking level of " + cookingDef.getReqLevel() + " to cook this."); + return; + } + owner.setBusy(true); + showBubble(); + owner.getActionSender().sendSound("cooking"); + owner.getActionSender().sendMessage("You cook the " + item.getDef().getName() + " on the " + object.getGameObjectDef().getName() + "."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + InvItem cookedFood = new InvItem(cookingDef.getCookedId()); + if (owner.getInventory().remove(item) > -1) { + if (!Formulae.burnFood(item.getID(), owner.getCurStat(7))) { + owner.getInventory().add(cookedFood); + owner.getActionSender().sendMessage("The " + item.getDef().getName() + " is now nicely cooked."); + owner.incExp(7, cookingDef.getExp(), true); + owner.getActionSender().sendStat(7); + } else { + owner.getInventory().add(new InvItem(cookingDef.getBurnedId())); + owner.getActionSender().sendMessage("You accidently burn the " + item.getDef().getName() + "."); + } + owner.getActionSender().sendInventory(); + } + owner.setBusy(false); + if(tries > 0 && owner.getInventory().contains(item)) { + handleCooking(tries); + } + } + }); + } + + } + + private void handleSmithing(int barID, int toMake) { + + ItemSmithingDef def = EntityHandler.getSmithingDef((Formulae.getBarType(barID) * 21) + toMake); + if (def == null) { + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + if (owner.getCurStat(13) < def.getRequiredLevel()) { + owner.getActionSender().sendMessage("You need a smithing level of " + def.getRequiredLevel() + " to make this"); + return; + } + if (owner.getInventory().countId(barID) < def.getRequiredBars()) { + owner.getActionSender().sendMessage("You don't have enough bars to make this."); + return; + } + if (EntityHandler.getItemDef(def.getItemID()).isMembers() && !World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + owner.getActionSender().sendSound("anvil"); + for (int x = 0; x < def.getRequiredBars(); x++) { + owner.getInventory().remove(new InvItem(barID, 1)); + } + Bubble bubble = new Bubble(owner, item.getID()); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + if (EntityHandler.getItemDef(def.getItemID()).isStackable()) { + owner.getActionSender().sendMessage("You hammer the metal into some " + EntityHandler.getItemDef(def.getItemID()).getName()); + owner.getInventory().add(new InvItem(def.getItemID(), def.getAmount())); + } else { + owner.getActionSender().sendMessage("You hammer the metal into a " + EntityHandler.getItemDef(def.getItemID()).getName()); + for (int x = 0; x < def.getAmount(); x++) { + owner.getInventory().add(new InvItem(def.getItemID(), 1)); + } + } + owner.incExp(13, Formulae.getSmithingExp(barID, def.getRequiredBars()), true); + owner.getActionSender().sendStat(13); + owner.getActionSender().sendInventory(); + } + + private boolean itemId(int[] ids) { + return DataConversions.inArray(ids, item.getID()); + } + + private void showBubble() { + Bubble bubble = new Bubble(owner, item.getID()); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + } + }); + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy()) { + player.resetPath();// sendSound + return; + } + player.resetAll(); + ActiveTile tile = world.getTile(p.readShort(), p.readShort()); + if (tile == null) { + player.setSuspiciousPlayer(true); + player.resetPath(); + return; + } + GameObject object = tile.getGameObject(); + InvItem item; + switch (pID) { + case 36: // Use Item on Door + int dir = p.readByte(); + item = player.getInventory().get(p.readShort()); + if (object == null || object.getType() == 0 || item == null) { // This + // shoudln't + // happen + player.setSuspiciousPlayer(true); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item on door" + item.getDef().getName() + "(" + item.getID() + ")" + " [CMD: "+item.getDef().getCommand()+"] ON A DOOR (" +tile.getX() + "/" + tile.getY()+ ") at: " + player.getX() + "/" + player.getY())); + + handleDoor(player, tile, object, dir, item); + break; + case 94: // Use Item on GameObject + item = player.getInventory().get(p.readShort()); + if (object == null || object.getType() == 1 || item == null) { // This + // shoudln't + // happen + player.setSuspiciousPlayer(true); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item on GameObject" + item.getDef().getName() + "(" + item.getID() + ")" + " [CMD: "+item.getDef().getCommand()+"] ON A DOOR (" +tile.getX() + "/" + tile.getY()+ ") at: " + player.getX() + "/" + player.getY())); + + handleObject(player, tile, object, item); + break; + } + tile.cleanItself(); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/InvUseOnPlayer.java b/GameServer/src/msc/gs/phandler/client/InvUseOnPlayer.java new file mode 100644 index 0000000..2b2647d --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/InvUseOnPlayer.java @@ -0,0 +1,92 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.event.ShortEvent; +import msc.gs.event.WalkToMobEvent; +import msc.gs.model.Bubble; +import msc.gs.model.InvItem; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class InvUseOnPlayer implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + final Player affectedPlayer = world.getPlayer(p.readShort()); + final InvItem item = player.getInventory().get(p.readShort()); + if (affectedPlayer == null || item == null) { // This shouldn't happen + return; + } + if (System.currentTimeMillis() - affectedPlayer.lastRun < 2000) { + player.resetPath(); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used item on player " + item.getDef().getName() + "(" + item.getID() + ")" + " [CMD: "+item.getDef().getCommand()+"] ON A NPC "+ affectedPlayer.getUsername()+ " at: " + player.getX() + "/" + player.getY() + "|" + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + player.setFollowing(affectedPlayer); + player.setStatus(Action.USING_INVITEM_ON_PLAYER); + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedPlayer, 1) { + public void arrived() { + owner.resetPath(); + owner.resetFollowing(); + if (!owner.getInventory().contains(item) || !owner.nextTo(affectedPlayer) || owner.isBusy() || owner.isRanging() || owner.getStatus() != Action.USING_INVITEM_ON_PLAYER) { + return; + } + owner.resetAll(); + switch (item.getID()) { + case 575: // Christmas cracker + owner.setBusy(true); + affectedPlayer.setBusy(true); + owner.resetPath(); + affectedPlayer.resetPath(); + Bubble crackerBubble = new Bubble(owner, 575); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(crackerBubble); + } + owner.getActionSender().sendMessage("You pull the cracker with " + affectedPlayer.getUsername() + "..."); + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " is pulling a cracker with you..."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + InvItem phat = new InvItem(DataConversions.random(576, 581)); + if (DataConversions.random(0, 1) == 1) { + owner.getActionSender().sendMessage("Out comes a " + phat.getDef().getName() + "!"); + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " got the contents!"); + owner.getInventory().add(phat); + } else { + owner.getActionSender().sendMessage(affectedPlayer.getUsername() + " got the contents!"); + affectedPlayer.getActionSender().sendMessage("Out comes a " + phat.getDef().getName() + "!"); + affectedPlayer.getInventory().add(phat); + } + owner.getInventory().remove(item); + owner.setBusy(false); + affectedPlayer.setBusy(false); + owner.getActionSender().sendInventory(); + affectedPlayer.getActionSender().sendInventory(); + } + }); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + break; + } + } + }); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/client/MenuReplyHandler.java b/GameServer/src/msc/gs/phandler/client/MenuReplyHandler.java new file mode 100644 index 0000000..b24f59a --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/MenuReplyHandler.java @@ -0,0 +1,34 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.MenuHandler; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class MenuReplyHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + MenuHandler menuHandler = player.getMenuHandler(); + if (menuHandler == null) { + player.setSuspiciousPlayer(true); + return; + } + int option = (int) p.readByte(); + String reply = menuHandler.getOption(option); + player.resetMenuHandler(); + if (reply == null) { + player.setSuspiciousPlayer(true); + return; + } + menuHandler.handleReply(option, reply); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/NpcCommand.java b/GameServer/src/msc/gs/phandler/client/NpcCommand.java new file mode 100644 index 0000000..4cb7187 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/NpcCommand.java @@ -0,0 +1,43 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.plugins.extras.Thieving; + +public class NpcCommand implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + int serverIndex = p.readShort(); + final Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + return; + } + final Mob affectedMob = world.getNpc(serverIndex); + final Npc affectedNpc = (Npc) affectedMob; + if (affectedNpc == null || affectedMob == null || player == null || !world.getQuestManager().isNpcVisible((Npc) affectedMob, player)) + return; + final int npcID = affectedNpc.getID(); + if (!World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + + Thieving thiev = new Thieving(player, affectedNpc, affectedMob); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " thieved a (" + affectedNpc.getDef().name + ")")); + thiev.beginPickpocket(); + + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/ObjectAction.java b/GameServer/src/msc/gs/phandler/client/ObjectAction.java new file mode 100644 index 0000000..d63a6fb --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/ObjectAction.java @@ -0,0 +1,1041 @@ +package msc.gs.phandler.client; + +import java.util.ArrayList; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.Server; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.DelayedEvent; +import msc.gs.event.MiniEvent; +import msc.gs.event.ShortEvent; +import msc.gs.event.SingleEvent; +import msc.gs.event.WalkToObjectEvent; +import msc.gs.external.AgilityCourseDef; +import msc.gs.external.AgilityDef; +import msc.gs.external.EntityHandler; +import msc.gs.external.GameObjectDef; +import msc.gs.external.ObjectFishDef; +import msc.gs.external.ObjectFishingDef; +import msc.gs.external.ObjectWoodcuttingDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.Bubble; +import msc.gs.model.ChatMessage; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Path; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.plugins.extras.Thieving; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class ObjectAction implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy()) { + if (player.getStatus() != Action.AGILITYING) + player.resetPath(); + + return; + }// f2p + + player.resetAll(); + ActiveTile t = world.getTile(p.readShort(), p.readShort()); + final GameObject object = t.getGameObject(); + final int click = pID == 51 ? 0 : 1; + player.click = click; + if (object == null) { + t.cleanItself(); + player.setSuspiciousPlayer(true); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " clicked on a object (" + object.getID() + ") at: " + player.getX() + "/" + player.getY() + "|" + object.getX() + "/" + object.getY())); + + //long newtime = p.readLong(); // reads the timestamp *Removing for now as causing an NPE - KO9 + /* + if (newtime == 0) { + if (player.sessionFlags < 4) { + System.out.println("[Anti-Bot] " + player.getUsername() + " is using a 3rd party client [B&]"); + player.sessionFlags++; + } + } else {// dummy + if (player.lastPacketTime == -1) + player.lastPacketTime = newtime; + else { + if (newtime <= player.lastPacketTime && (System.currentTimeMillis() / 1000) > player.lastPacketRecTime) { + System.out.println("[Anti-Bot] " + player.getUsername() + " tried to send a recorded packet, WPE."); + player.destroy(false); + } else { + player.lastPacketTime = newtime; + player.lastPacketRecTime = System.currentTimeMillis() / 1000; + } + } + }*/ + if (object.getID() == 198 && object.getX() == 251 && object.getY() == 468) { // Prayer + // Guild + // Ladder + if (player.getMaxStat(5) < 31) { + player.getActionSender().sendMessage("You need 31 Prayer to get up here"); + return; + } else { + // player.teleport(251, 1411, false); + } + }// 621 + if(object.getID() == 982 && player.withinRange(object.getLocation(), 2)) { + player.getActionSender().sendMessage("You slide down the rocks"); + player.teleport(579, 3357, false); + return; + } + + if (object.getX() == 243 && object.getY() == 178) + return; + if (object.getX() == 59 && object.getY() == 573) + return; + if (object.getX() == 196 && object.getY() == 3266 && !Server.isMembers()) + return; + + player.setStatus(Action.USING_OBJECT); + Instance.getDelayedEventHandler().add(new WalkToObjectEvent(player, object, false) { + public void arrived() { + + try { + if (owner.getStatus() != Action.AGILITYING) + owner.resetPath(); + + GameObjectDef def = object.getGameObjectDef(); + if (owner.isBusy() || owner.isRanging() || !owner.nextTo(object) || def == null || owner.getStatus() != Action.USING_OBJECT) { + return; + } + world.addEntryToSnapshots(new Activity(owner.getUsername(), owner.getUsername() + " used an Object (" + object.getID() + ") @ " + object.getX() + ", " + object.getY())); + owner.resetAll(); + if (object.getX() == 621 && object.getY() == 596 && Constants.GameServer.F2P_WILDY) { + owner.getActionSender().sendMessage("Currently disabled!1!"); + return; + } + String command = (click == 0 ? def.getCommand1() : def.getCommand2()).toLowerCase(); + // System.out.println(object.getID() + " " + + // command); + if(object.getID() == 487 && System.currentTimeMillis() - owner.getLastMoved() < 10000) { owner.getActionSender().sendMessage("You must stand still for 10 seconds before using this"); return; } + Point telePoint = EntityHandler.getObjectTelePoint(object.getLocation(), command); + if (telePoint != null) { + owner.teleport(telePoint.getX(), telePoint.getY(), false); + return; + } + if (world.getQuestManager().handleObject(object, owner, click == 1)) + return; + if (Instance.getPluginHandler().handleObjectAction(object, command, owner)) + return; + + else if (object.getID() == 198 && object.getX() == 251 && object.getY() == 468) { + if (owner.getMaxStat(5) < 31) { + owner.setBusy(true); + Npc abbot = world.getNpc(174, 249, 252, 458, 468); + if (abbot != null) { + owner.informOfNpcMessage(new ChatMessage(abbot, "Hello only people with high prayer are allowed in here", owner)); + } else { + return; + } + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a prayer level of 31 to enter"); + } + }); + return; + } else { + // owner.teleport(251, 1411, false); + } + } + System.out.println("Command: " + command); + if(command.equalsIgnoreCase("talk to") && object.getID() == 391) { + + final String[] options = { "Yes please!", "No thanks I prefer to walk!" }; + owner.getActionSender().sendMessage("Would you like to be teleported to edgeville for 1000gp?"); + owner.getActionSender().sendMessage("We'll take the money from your bank account!"); + + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setMenuHandler(new MenuHandler(options) { + public void handleReply(final int option, final String reply) { + if (option < 0 && option > options.length) + return; + if (option == 0) { + if(owner.getBank().countId(10) < 1000) { + owner.getActionSender().sendMessage("It looks like you don't have enough money in your bank!"); + owner.setBusy(false); + return; + } + if(owner.getBank().remove(10, 1000) == -1) { + owner.getActionSender().sendMessage("It looks like you don't have enough money in your bank!"); + owner.setBusy(false); + return; + } + owner.setBusy(true); + owner.getActionSender().sendMessage("The tree is looking for a fellow spirit tree!"); + handleMovement(owner, 0, Formulae.dray2edge); + } + } + + public void handleMovement(Player p, final int i, final ArrayList path) { + Instance.getDelayedEventHandler().add(new MiniEvent(p,Formulae.Rand(4500, 5500)) { + @Override + public void action() { + if(i >= path.size()) { + owner.setBusy(false); + owner.getActionSender().sendMessage("You've arrived!"); + return; + } + owner.teleport(path.get(i).getX(), path.get(i).getY(), true); + owner.getActionSender().sendMessage("The tree is looking for another spirit tree to throw you into!"); + handleMovement(owner, (i+1), path); + + } + }); + } + }); + owner.getActionSender().sendMenu(options); + } + }); + return; + } + if (command.equals("search") && def.name.equals("cupboard")) { + owner.getActionSender().sendMessage("You search the " + def.name + "..."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (object.getX() == 216 && object.getY() == 1562) { + owner.getActionSender().sendMessage("You find Garlic!"); + owner.getInventory().add(new InvItem(218)); + owner.getActionSender().sendInventory(); + } else { + owner.getActionSender().sendMessage("You find nothing"); + } + return; + } + }); + }// create a + else if (object.getID() == 52 || object.getID() == 173 && object.containsItem() == 29) // hopper + { + owner.getActionSender().sendMessage("You operate the hopper.."); + Instance.getDelayedEventHandler().add(new msc.gs.event.MiniEvent(owner, 1000) { + public void action() { + owner.getActionSender().sendMessage("The grain slides down the chute"); + } + }); + // Konijn/xEnt == TEAM WORK BIATCH. + + if (object.getX() == 179 && object.getY() == 2371) { + world.registerItem(new Item(23, 179, 481, 1, owner)); + } else { + world.registerItem(new Item(23, 166, 599, 1, owner)); + } + object.containsItem(-1); + } else if (object.getID() == 223 && object.getX() == 274 && object.getY() == 566) { // Mining + // Guild + // Ladder + if (owner.getCurStat(14) < 60) { + owner.setBusy(true); + Npc dwarf = world.getNpc(191, 272, 277, 563, 567); + if (dwarf != null) { + owner.informOfNpcMessage(new ChatMessage(dwarf, "Hello only the top miners are allowed in here", owner)); + } + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a mining level of 66 to enter"); + } + }); + } else { + owner.teleport(274, 3397, false); + } + } else if (command.equals("climb-up") || command.equals("climb up") || command.equals("go up")) { + int[] coords = coordModifier(owner, true); + owner.teleport(coords[0], coords[1], false); + } else if (command.equals("climb-down") || command.equals("climb down") || command.equals("go down")) { + int[] coords = coordModifier(owner, false); + owner.teleport(coords[0], coords[1], false); + } else if (command.equals("steal from")) { + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + + if (object == null) { + return; + } + if (owner.getSpam()) { + return; + } else { + owner.setSpam(true); + Thieving thiev = new Thieving(owner, object); + thiev.thieveStall(); + } + + } else if (command.equals("search for traps")) { + if (!Server.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + if (object == null) { + return; + } + if (owner.getSpam()) { + return; + } else { + owner.setSpam(true); + Thieving thiev = new Thieving(owner, object); + thiev.thieveChest(); + } + } else if (command.equals("rest")) { + owner.getActionSender().sendMessage("You rest on the bed"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + // owner.setFatigue(0); + // owner.getActionSender().sendFatigue(); + + owner.getActionSender().sendEnterSleep(); + } + }); + } else if (command.equals("hit")) { + owner.setBusy(true); + owner.getActionSender().sendMessage("You attempt to hit the Dummy"); + Instance.getDelayedEventHandler().add(new MiniEvent(owner, 3500) { + public void action() { + owner.setBusy(false); + int lvl = owner.getCurStat(0); + if (lvl > 7 || owner.getMaxStat(0) >= 40) { + owner.getActionSender().sendMessage("There is only so much you can learn from hitting a Dummy"); + return; + } + owner.getActionSender().sendMessage("You hit the Dummy"); + owner.incExp(0, 5, false); + owner.getActionSender().sendStat(0); + } + }); + return; + } else if (command.equalsIgnoreCase("approach")) { + owner.getActionSender().sendMessage("You start to approach the tree"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + int damage = owner.getCurStat(3) / 10; + owner.getActionSender().sendMessage("The tree lashes out at you."); + owner.setLastDamage(damage); + owner.setCurStat(3, owner.getCurStat(3) - damage); + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(owner.getViewArea().getPlayersInView()); + owner.getActionSender().sendStat(3); + for (Player p : playersToInform) { + p.informOfModifiedHits(owner); + } + } + }); + + } else if (command.equals("open") && object.getGameObjectDef().name.equals("Chest")) { + if (object == null) { + return; + } + if (owner.getSpam()) + return; + + Thieving lock = new Thieving(owner, object); + boolean cont = false; + for (int i = 0; i < lock.Chests.length; i++) { + if (object.getID() == lock.Chests[i][0]) { + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + owner.setSpam(true); + lock.openThievedChest(); + break; + } + } + return; + } + + else if (command.equals("close") || command.equals("open")) { + switch (object.getID()) { + case 18: + replaceGameObject(17, true); + return; + case 17: + replaceGameObject(18, false); + return; + case 58: + replaceGameObject(57, false); + return; + case 57: + replaceGameObject(58, true); + return; + case 63: + replaceGameObject(64, false); + return; + case 64: + replaceGameObject(63, true); + return; + case 79: + replaceGameObject(78, false); + return; + case 78: + replaceGameObject(79, true); + return; + case 60: + replaceGameObject(59, true); + return; + case 59: + replaceGameObject(60, false); + return; + case 137: // Members Gate (Doriks) + if (object.getX() != 341 || object.getY() != 487) { + return; + } + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + doGate(); + if (owner.getX() <= 341) { + owner.teleport(342, 487, false); + } else { + owner.teleport(341, 487, false); + } + break; + case 138: // Members Gate (Crafting Guild) + if (object.getX() != 343 || object.getY() != 581) { + return; + } + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + doGate(); + if (owner.getY() <= 580) { + owner.teleport(343, 581, false); + } else { + owner.teleport(343, 580, false); + } + break; + case 180: // Al-Kharid Gate + if (object.getX() != 92 || object.getY() != 649) { + return; + } + doGate(); + if (owner.getX() <= 91) { + owner.teleport(92, 649, false); + } else { + owner.teleport(91, 649, false); + } + break; + case 254: // Karamja Gate + if (object.getX() != 434 || object.getY() != 682) { + return; + } + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + doGate(); + if (owner.getX() <= 434) { + owner.teleport(435, 682, false); + } else { + owner.teleport(434, 682, false); + } + break; + case 563: // King Lanthlas Gate + if (object.getX() != 660 || object.getY() != 551) { + return; + } + doGate(); + if (owner.getY() <= 551) { + owner.teleport(660, 552, false); + } else { + owner.teleport(660, 551, false); + } + break; + case 626: // Gnome Stronghold Gate + if (object.getX() != 703 || object.getY() != 531) { + return; + } + doGate(); + if (owner.getY() <= 531) { + owner.teleport(703, 532, false); + } else { + owner.teleport(703, 531, false); + } + break; + case 305: // Edgeville Members Gate + if (object.getX() != 196 || object.getY() != 3266) { + return; + } + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + doGate(); + if (owner.getY() <= 3265) { + owner.teleport(196, 3266, false); + } else { + owner.teleport(196, 3265, false); + } + break; + case 1089: // Dig Site Gate + if (object.getX() != 59 || object.getY() != 573) { + return; + } + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + doGate(); + if (owner.getX() <= 58) { + owner.teleport(59, 573, false); + } else { + owner.teleport(58, 573, false); + } + break; + case 356: // Woodcutting Guild Gate + if (object.getX() != 560 || object.getY() != 472) { + return; + } + if (owner.getY() <= 472) { + doGate(); + owner.teleport(560, 473, false); + } else { + if (owner.getCurStat(8) < 70) { + owner.setBusy(true); + Npc mcgrubor = world.getNpc(255, 556, 564, 473, 476); + + if (mcgrubor != null) { + owner.informOfNpcMessage(new ChatMessage(mcgrubor, "Hello only the top woodcutters are allowed in here", owner)); + } + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a woodcutting level of 70 to enter"); + } + }); + } else { + doGate(); + owner.teleport(560, 472, false); + } + } + break; + case 142: // Black Knight Big Door + owner.getActionSender().sendMessage("The doors are locked"); + break; + case 93: // Red dragon gate + if (object.getX() != 140 || object.getY() != 180) { + return; + } + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + doGate(); + if (owner.getY() <= 180) { + owner.teleport(140, 181, false); + } else { + owner.teleport(140, 180, false); + } + break; + case 508: // Lesser demon gate + if (object.getX() != 285 || object.getY() != 185) { + return; + } + doGate(); + if (owner.getX() <= 284) { + owner.teleport(285, 185, false); + } else { + owner.teleport(284, 185, false); + } + break; + case 319: // Lava Maze Gate + if (object.getX() != 243 || object.getY() != 178) { + return; + } + doGate(); + if (owner.getY() <= 178) { + owner.teleport(243, 179, false); + } else { + owner.teleport(243, 178, false); + } + break; + case 712: // Shilo inside gate + if (object.getX() != 394 || object.getY() != 851) { + return; + } + owner.teleport(383, 851, false); + break; + case 611: // Shilo outside gate + if (object.getX() != 388 || object.getY() != 851) { + return; + } + owner.teleport(394, 851, false); + break; + case 1079: // Legends guild gate + if (object.getX() != 512 || object.getY() != 550) { + return; + } + if (owner.getY() <= 550) { + doGate(); + owner.teleport(513, 551, false); + } else { + if(owner.getSkillTotal() < 1150) { owner.getActionSender().sendMessage("You need a skill total of 1150 or more to enter"); return; } + doGate(); + owner.teleport(513, 550, false); + } + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + } else if (command.equals("pick") || command.equals("pick banana")) { + switch (object.getID()) { + case 72: // Wheat + owner.getActionSender().sendMessage("You get some grain"); + owner.getInventory().add(new InvItem(29, 1)); + break; + case 191: // Potatos + owner.getActionSender().sendMessage("You pick a potato"); + owner.getInventory().add(new InvItem(348, 1)); + break; + case 313: // Flax + handleFlaxPickup(); + break; + case 183: // Banana + owner.getActionSender().sendMessage("You pull a banana off the tree"); + owner.getInventory().add(new InvItem(249, 1)); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendSound("potato"); + owner.setBusy(true); + Instance.getDelayedEventHandler().add(new SingleEvent(owner, 200) { + public void action() { + owner.setBusy(false); + } + }); + } else if (command.equals("lure") || command.equals("bait") || command.equals("net") || command.equals("harpoon") || command.equals("cage")) { + owner.setSkillLoops(0); + + handleFishing(click); + } else if (command.equals("chop")) { + handleWoodcutting(click); + } else if (command.equals("recharge at")) { + owner.getActionSender().sendMessage("You recharge at the altar."); + owner.getActionSender().sendSound("recharge"); + int maxPray = object.getID() == 200 ? owner.getMaxStat(5) + 2 : owner.getMaxStat(5); + if (owner.getCurStat(5) < maxPray) { + owner.setCurStat(5, maxPray); + } + owner.getActionSender().sendStat(5); + } else if (command.equals("board")) { + owner.getActionSender().sendMessage("You must talk to the owner about this."); + } else if (EntityHandler.getAgilityDef(object.getID()) != null) { + handleAgility(object); + } else { + switch (object.getID()) { + case 613: // Shilo cart + if (object.getX() != 384 || object.getY() != 851) { + return; + } + owner.setBusy(true); + owner.getActionSender().sendMessage("You search for a way over the cart"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("You climb across"); + if (owner.getX() <= 383) { + owner.teleport(386, 851, false); + } else { + owner.teleport(383, 851, false); + } + owner.setBusy(false); + } + }); + break; + case 643: // Gnome tree stone + if (object.getX() != 416 || object.getY() != 161) { + return; + }// getCurStat(14 + owner.setBusy(true); + owner.getActionSender().sendMessage("You twist the stone tile to one side"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("It reveals a ladder, you climb down"); + owner.teleport(703, 3284, false); + owner.setBusy(false); + } + }); + break; + case 638: // First roots in gnome cave + if (object.getX() != 701 || object.getY() != 3280) { + return; + } + // door + owner.setBusy(true); + owner.getActionSender().sendMessage("You push the roots"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("They wrap around you and drag you forwards"); + owner.teleport(701, 3278, false); + owner.setBusy(false); + } + }); + case 639: // Second roots in gnome cave + if (object.getX() != 701 || object.getY() != 3279) { + return; + } + owner.setBusy(true); + owner.getActionSender().sendMessage("You push the roots"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("They wrap around you and drag you forwards"); + owner.teleport(701, 3281, false); + owner.setBusy(false); + } + }); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + return; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void handleFlaxPickup() { + handleFlaxPickup((int)Math.ceil(owner.getMaxStat(12) / 10)); + + } + private void handleFlaxPickup(int times) { + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + owner.getActionSender().sendMessage("You uproot a flax plant"); + owner.getInventory().add(new InvItem(675, 1)); + if(--times > 0) { + handleFlaxPickup(times); + } + } + private int[] coordModifier(Player player, boolean up) { + if (object.getGameObjectDef().getHeight() <= 1) { + return new int[] { player.getX(), Formulae.getNewY(player.getY(), up) }; + } + int[] coords = { object.getX(), Formulae.getNewY(object.getY(), up) }; + switch (object.getDirection()) { + case 0: + coords[1] -= (up ? -object.getGameObjectDef().getHeight() : 1); + break; + case 2: + coords[0] -= (up ? -object.getGameObjectDef().getHeight() : 1); + break; + case 4: + coords[1] += (up ? -1 : object.getGameObjectDef().getHeight()); + break; + case 6: + coords[0] += (up ? -1 : object.getGameObjectDef().getHeight()); + break; + } + return coords; + } + + private void doGate() { + owner.getActionSender().sendSound("opendoor"); + world.registerGameObject(new GameObject(object.getLocation(), 181, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), 1000); + } + + private void handleAgility(final GameObject object) { + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + final AgilityDef def = EntityHandler.getAgilityDef(object.getID()); + if (owner.getCurStat(16) < def.getReqLevel()) { + owner.getActionSender().sendMessage("You need an agility level of " + def.getReqLevel() + " to try this obstacle"); + return; + } + + owner.setBusy(true); + owner.setStatus(Action.AGILITYING); + owner.getActionSender().sendMessage(def.getMessage()); + + if (Formulae.getHeight(def.getY()) == Formulae.getHeight(def.getToY())) + owner.setPath(new Path(def.getX(), def.getY(), def.getToX(), def.getToY(), true)); + else + owner.teleport(def.getToX(), def.getToY(), false); + + Instance.getDelayedEventHandler().add(new DelayedEvent(owner, 100) { + private boolean testedFail = false; + + public void run() { + if (def.canFail() && !testedFail) { + if (owner.getX() >= ((def.getToX() + def.getX()) / 2) && owner.getY() >= ((def.getToY() + def.getY()) / 2)) // half + // way + // accross + // the + // obstacle + { + int damage = Formulae.failObstacle(owner, def.getReqLevel()); + if (damage != -1) { + owner.getActionSender().sendMessage("You slip off the obstacle!"); + owner.teleport(def.getFailX(), def.getFailY(), false); + owner.setBusy(false); + owner.setStatus(Action.IDLE); + owner.setLastDamage(damage); + int newHp = owner.getHits() - damage; + owner.setHits(newHp); + java.util.ArrayList playersToInform = new java.util.ArrayList(); + playersToInform.addAll(owner.getViewArea().getPlayersInView()); + for (Player p : playersToInform) + p.informOfModifiedHits(owner); + stop(); + } + + testedFail = true; + } + } + + if (owner.getX() == def.getToX() && owner.getY() == def.getToY()) { + owner.getActionSender().sendMessage("You successfully make it to the other side of the obstacle"); + owner.setBusy(false); + owner.setStatus(Action.IDLE); + owner.incExp(16, def.getExp(), true); + owner.getActionSender().sendStat(16); + + AgilityCourseDef course = EntityHandler.getAgilityCourseDef(object.getID()); + + if (owner.getAgilityCourseDef() != null) // We're + // currently + // doing + // a + // course + { + course = owner.getAgilityCourseDef(); + if (def.getOrder() == (owner.getCurrentCourseObject() + 1)) // We've + // used + // the + // next + // object + // in + // the + // sequence + { + if (object.getID() == course.getEndID() && object.getX() == course.getEndX() && object.getY() == course.getEndY()) // We've + // finished + // the + // course + { + owner.getActionSender().sendMessage("You have completed the " + course.getName() + " obstacle course!"); + owner.incExp(16, course.getExp(), true); + owner.setAgilityCourseDef(null); + owner.setCurrentCourseObject(-1); + } else + owner.setCurrentCourseObject(def.getOrder()); // Continue + // the + // sequence + } else { + owner.setAgilityCourseDef(null); // We've + // broken + // the + // sequence, + // end + // the + // course + owner.setCurrentCourseObject(-1); + } + } else // We're not doing a course, + // so check if this object + // is the start of a new + // course + { + if (course != null) // It is, so + // we start + // a new + // agility + // course + { + owner.setAgilityCourseDef(course); + owner.setCurrentCourseObject(def.getOrder()); + } + } + + owner.getActionSender().sendStat(16); + stop(); + } + } + }); + } + + private void handleFishing(final int click) { + int retries = (int)Math.ceil(owner.getMaxStat(10) / 10); + handleFishing(click,retries); + } + + private void handleFishing(final int click, int passvalue) { + final int tries = --passvalue; + final ObjectFishingDef def = EntityHandler.getObjectFishingDef(object.getID(), click); + if (owner.isBusy()) { + return; + } + if (!owner.withinRange(object, 1)) + return; + if (def == null) { // This shouldn't happen + return; + } + if (owner.getCurStat(10) < def.getReqLevel()) { + owner.getActionSender().sendMessage("You need a fishing level of " + def.getReqLevel() + " to fish here."); + return; + } + int netId = def.getNetId(); + if (owner.getInventory().countId(netId) <= 0) { + owner.getActionSender().sendMessage("You need a " + EntityHandler.getItemDef(netId).getName() + " to catch these fish."); + return; + } + final int baitId = def.getBaitId(); + if (baitId >= 0) { + if (owner.getInventory().countId(baitId) <= 0) { + owner.getActionSender().sendMessage("You don't have any " + EntityHandler.getItemDef(baitId).getName() + " left."); + return; + } + } + + owner.setBusy(true); + owner.getActionSender().sendSound("fish"); + Bubble bubble = new Bubble(owner, netId); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + + owner.getActionSender().sendMessage("You attempt to catch some fish"); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + ObjectFishDef def = Formulae.getFish(object.getID(), owner.getCurStat(10), click); + final int fishes = owner.getSkillLoops(); + if (def != null) { + if (baitId >= 0) { + int idx = owner.getInventory().getLastIndexById(baitId); + InvItem bait = owner.getInventory().get(idx); + int newCount = bait.getAmount() - 1; + if (newCount <= 0) { + owner.getInventory().remove(idx); + } else { + bait.setAmount(newCount); + } + } + InvItem fish = new InvItem(def.getId()); + owner.getInventory().add(fish); + owner.getActionSender().sendMessage("You catch a " + fish.getDef().getName() + "."); + owner.getActionSender().sendInventory(); + owner.incExp(10, def.getExp(), true); + owner.getActionSender().sendStat(10); + } else { + owner.getActionSender().sendMessage("You fail to catch anything."); + } + owner.setBusy(false); + if(tries > 0) { + handleFishing(click,tries); + } + } + }); + } + + private void handleWoodcutting(final int click) { + int retries = (int)Math.ceil(owner.getMaxStat(8) / 10); + handleWoodcutting(click,retries); + } + private void handleWoodcutting(final int click, int passedvalue) { + final int tries = --passedvalue; + final ObjectWoodcuttingDef def = EntityHandler.getObjectWoodcuttingDef(object.getID()); + if (owner.isBusy()) { + return; + } + if (!owner.withinRange(object, 2)) + return; + if (def == null) { // This shoudln't happen + return; + } + if (owner.getCurStat(8) < def.getReqLevel()) { + owner.getActionSender().sendMessage("You need a woodcutting level of " + def.getReqLevel() + " to axe this tree."); + return; + } + int axeId = -1; + for (int a : Formulae.woodcuttingAxeIDs) { + if (owner.getInventory().countId(a) > 0) { + axeId = a; + break; + } + } + if (axeId < 0) { + owner.getActionSender().sendMessage("You need an axe to chop this tree down."); + return; + } + owner.setBusy(true); + Bubble bubble = new Bubble(owner, axeId); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + owner.getActionSender().sendMessage("You swing your " + EntityHandler.getItemDef(axeId).getName() + " at the tree..."); + final int axeID = axeId; + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (Formulae.getLog(def, owner.getCurStat(8), axeID)) { + InvItem log = new InvItem(def.getLogId()); + owner.getInventory().add(log); + owner.getActionSender().sendMessage("You get some wood."); + owner.getActionSender().sendInventory(); + owner.incExp(8, def.getExp(), true); + owner.getActionSender().sendStat(8); + if (DataConversions.random(1, 100) <= def.getFell()) { + world.registerGameObject(new GameObject(object.getLocation(), 4, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), def.getRespawnTime() * 1000); + owner.setBusy(false); + } + else { + owner.setBusy(false); + if(tries > 0) { + handleWoodcutting(click,tries); + } + } + + } else { + owner.getActionSender().sendMessage("You slip and fail to hit the tree."); + owner.setBusy(false); + if(tries > 0) { + handleWoodcutting(click,tries); + } + } + } + }); + } + + private void replaceGameObject(int newID, boolean open) { + world.registerGameObject(new GameObject(object.getLocation(), newID, object.getDirection(), object.getType())); + owner.getActionSender().sendSound(open ? "opendoor" : "closedoor"); + } + }); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/PickupItem.java b/GameServer/src/msc/gs/phandler/client/PickupItem.java new file mode 100644 index 0000000..f417fd5 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PickupItem.java @@ -0,0 +1,176 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.builders.ls.MiscPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.db.DBConnection; +import msc.gs.event.FightEvent; +import msc.gs.event.WalkToPointEvent; +import msc.gs.model.ActiveTile; +import msc.gs.model.ChatMessage; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class PickupItem implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private Item getItem(int id, ActiveTile tile, Player player) { + if (tile != null) + for (Item i : tile.getItems()) { + if (i.getID() == id && i.visibleTo(player)) { + return i; + } + } + return null; + + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + Point location = Point.location(p.readShort(), p.readShort()); + int id = p.readShort(); + final ActiveTile tile = world.getTile(location); + final Item item = getItem(id, tile, player); + if(!item.getDef().canTrade()) { + if(item.droppedby() != 0 && msc.gs.tools.DataConversions.usernameToHash(player.getUsername()) != item.droppedby()) { + player.getActionSender().sendMessage("This item is non-tradable."); + return; + } + } + if (item == null) { + //player.setSuspiciousPlayer(true); + player.resetPath(); + return; + } + if(player.isPMod() && !player.isMod()) + return; + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + + player.setStatus(Action.TAKING_GITEM); + Instance.getDelayedEventHandler().add(new WalkToPointEvent(player, location, 1, false) { + public void arrived() { + if (owner.isBusy() || owner.isRanging() || !tile.hasItem(item) || !owner.nextTo(item) || owner.getStatus() != Action.TAKING_GITEM) { + return; + } + + if (item.getID() == 23) { + owner.getActionSender().sendMessage("I can't pick it up!"); + owner.getActionSender().sendMessage("I need a pot to hold it in."); + return; + } + + int[] Rares = { 576, 577, 578, 579, 580, 581, 828, 831, 832, 1278, 593, 594, 795 }; + boolean pickedUpRare = false; + if (item.getAmount() > 99999) + pickedUpRare = true; + + for (int i = 0; i < Rares.length; i++) { + if (item.getID() == Rares[i]) { + pickedUpRare = true; + break; + } + } + owner.resetAll(); + InvItem invItem = new InvItem(item.getID(), item.getAmount()); + if (!owner.getInventory().canHold(invItem)) { + owner.getActionSender().sendMessage("You cannot pickup this item, your inventory is full!"); + return; + } + try { + if (item.getID() == 59 && item.getX() == 106 && item.getY() == 1476) { + Npc n = world.getNpc(37, 103, 107, 1476, 1479); + + if (n != null && !n.inCombat()) { + owner.informOfNpcMessage(new ChatMessage(n, "Nobody steals from this gang!", owner)); + fight(owner, n); + } + } else if (item.getID() == 501 && item.getX() == 333 && item.getY() == 434) { + Npc zam = world.getNpc(140, 328, 333, 433, 438, true); + if (zam != null && !zam.inCombat()) { + owner.informOfNpcMessage(new ChatMessage(zam, "a curse be upon you", owner)); + for (int i = 0; i < 3; i++) { + int stat = owner.getCurStat(i); + if (stat < 3) + owner.setCurStat(i, 0); + else + owner.setCurStat(i, stat - 3); + } + owner.getActionSender().sendStats(); + fight(owner, zam); + return; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + if (pickedUpRare) { + // Code goes here if they picked up some BS items. + MiscPacketBuilder loginServer = Instance.getServer().getLoginConnector().getActionSender(); + final long droppedby = item.droppedby(); + final long playerLong = msc.gs.tools.DataConversions.usernameToHash(owner.getUsername()); + loginServer.tradeLog(droppedby, playerLong, item.getID(), item.getAmount(), owner.getX(), owner.getY(), 3); + } + world.addEntryToSnapshots(new Activity(owner.getUsername(),owner.getUsername() + " picked up an item "+item.getDef().getName()+" (" + item.getID() + ") amount: " + item.getAmount() + " at: " + owner.getX() + "/" + owner.getY() + "|" + item.getX() + "/" + item.getY())); + if(item.getAmount() > 10000000 || Formulae.isRareItem(item.getID())) + DBConnection.getReport().submitDupeData(owner.getUsername(),owner.getUsernameHash()); + + world.unregisterItem(item); + owner.getActionSender().sendSound("takeobject"); + owner.getInventory().add(invItem); + owner.getActionSender().sendInventory(); + } + }); + } + + void fight(Player owner, Npc n) { + n.resetPath(); + owner.resetPath(); + owner.resetAll(); + owner.setStatus(Action.FIGHTING_MOB); + owner.getActionSender().sendSound("underattack"); + owner.getActionSender().sendMessage("You are under attack!"); + + n.setLocation(owner.getLocation(), true); + for (Player p : n.getViewArea().getPlayersInView()) { + p.removeWatchedNpc(n); + } + + owner.setBusy(true); + owner.setSprite(9); + owner.setOpponent(n); + owner.setCombatTimer(); + + n.setBusy(true); + n.setSprite(8); + n.setOpponent(owner); + n.setCombatTimer(); + FightEvent fighting = new FightEvent(owner, n, true); + fighting.setLastRun(0); + Instance.getDelayedEventHandler().add(fighting); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/Ping.java b/GameServer/src/msc/gs/phandler/client/Ping.java new file mode 100644 index 0000000..ffcbcc7 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/Ping.java @@ -0,0 +1,23 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class Ping implements PacketHandler { + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (p.getLength() > 0) { + byte b = p.readByte(); + if (b == 1) { // 1 is for SCAR. + if (player.sessionFlags < 1) { + Logger.println(player.getUsername() + " is using SCAR!"); + player.sessionFlags++; + } + } + } + } +} diff --git a/GameServer/src/msc/gs/phandler/client/PlayerAppearanceIDHandler.java b/GameServer/src/msc/gs/phandler/client/PlayerAppearanceIDHandler.java new file mode 100644 index 0000000..65c8a64 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PlayerAppearanceIDHandler.java @@ -0,0 +1,29 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class PlayerAppearanceIDHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + int mobCount = p.readShort(); + int[] indicies = new int[mobCount]; + int[] appearanceIDs = new int[mobCount]; + for (int x = 0; x < mobCount; x++) { + indicies[x] = p.readShort(); + appearanceIDs[x] = p.readShort(); + } + Player player = (Player) session.getAttachment(); + player.addPlayersAppearanceIDs(indicies, appearanceIDs); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/PlayerAppearanceUpdater.java b/GameServer/src/msc/gs/phandler/client/PlayerAppearanceUpdater.java new file mode 100644 index 0000000..c0ba2a3 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PlayerAppearanceUpdater.java @@ -0,0 +1,74 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.Player; +import msc.gs.model.PlayerAppearance; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class PlayerAppearanceUpdater implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (!player.isChangingAppearance()) { + player.setSuspiciousPlayer(true); + return; + } + player.setChangingAppearance(false); + + byte headGender = p.readByte(); + byte headType = p.readByte(); + byte bodyGender = p.readByte(); + + p.readByte(); // wtf is this? + + int hairColour = (int) p.readByte(); + int topColour = (int) p.readByte(); + int trouserColour = (int) p.readByte(); + int skinColour = (int) p.readByte(); + + int headSprite = headType + 1; + int bodySprite = bodyGender + 1; + + PlayerAppearance appearance = new PlayerAppearance(hairColour, topColour, trouserColour, skinColour, headSprite, bodySprite); + if (!appearance.isValid()) { + player.setSuspiciousPlayer(true); + return; + } + + player.setMale(headGender == 1); + + if (player.isMale()) { + Inventory inv = player.getInventory(); + for (int slot = 0; slot < inv.size(); slot++) { + InvItem i = inv.get(slot); + if (i.isWieldable() && i.getWieldableDef().getWieldPos() == 1 && i.isWielded() && i.getWieldableDef().femaleOnly()) { + i.setWield(false); + player.updateWornItems(i.getWieldableDef().getWieldPos(), player.getPlayerAppearance().getSprite(i.getWieldableDef().getWieldPos())); + player.getActionSender().sendUpdateItem(slot); + break; + } + } + } + + int[] oldWorn = player.getWornItems(); + int[] oldAppearance = player.getPlayerAppearance().getSprites(); + player.setAppearance(appearance); + int[] newAppearance = player.getPlayerAppearance().getSprites(); + for (int i = 0; i < 12; i++) { + if (oldWorn[i] == oldAppearance[i]) { + player.updateWornItems(i, newAppearance[i]); + } + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/PlayerLogin.java b/GameServer/src/msc/gs/phandler/client/PlayerLogin.java new file mode 100644 index 0000000..111641a --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PlayerLogin.java @@ -0,0 +1,82 @@ +package msc.gs.phandler.client; + +import java.net.InetSocketAddress; + +import org.apache.mina.common.IoSession; + +import msc.config.Config; +import msc.gs.Instance; +import msc.gs.builders.RSCPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; +import msc.gs.util.RSA; + +public class PlayerLogin implements PacketHandler { + + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p1, IoSession session) throws Exception { + + Player player = (Player) session.getAttachment(); + final String ip = ((InetSocketAddress) session.getRemoteAddress()).getAddress().toString().replaceAll("/", ""); + + byte loginCode; + try { + + byte[] data = RSA.decrypt(p1.getData()); + Packet p = new Packet(session, data); + + boolean reconnecting = (p.readByte() == 1); + + int clientVersion = p.readInt(); + + + if(Config.SERVER_VERSION != clientVersion) { + Logger.println("ip: " + ip + " | clientversion: " + clientVersion + " : " + Config.SERVER_VERSION); + } + + int[] sessionKeys = new int[4]; + for (int key = 0; key < sessionKeys.length; key++) { + sessionKeys[key] = p.readInt(); + } + String username = ""; + String password = ""; + + username = p.readString(20).trim(); + password = p.readString(20).trim(); + + if (world.countPlayers() >= Config.MAX_PLAYERS) { + loginCode = 10; + } + else if (clientVersion < Config.SERVER_VERSION) { + loginCode = 4; + } + else if (!player.setSessionKeys(sessionKeys)) { + loginCode = 5; + } + else { + player.load(username, password, 0, reconnecting); + if (clientVersion < 39) { + player.clientWarn(true); + } + return; + } + } catch (Exception e) { + System.err.println("Login exception with: " + ip); + e.printStackTrace(); + loginCode = 4; + } + + RSCPacketBuilder pb = new RSCPacketBuilder(); + pb.setBare(true); + pb.addByte((byte) loginCode); + session.write(pb.toPacket()); + player.destroy(true); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/PlayerLogout.java b/GameServer/src/msc/gs/phandler/client/PlayerLogout.java new file mode 100644 index 0000000..7af0f41 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PlayerLogout.java @@ -0,0 +1,18 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class PlayerLogout implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + } +} diff --git a/GameServer/src/msc/gs/phandler/client/PlayerLogoutRequest.java b/GameServer/src/msc/gs/phandler/client/PlayerLogoutRequest.java new file mode 100644 index 0000000..9e57817 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PlayerLogoutRequest.java @@ -0,0 +1,26 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class PlayerLogoutRequest implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.canLogout()) { + player.destroy(true, true); + } + else { + player.getActionSender().sendCantLogout(); + } + } +} diff --git a/GameServer/src/msc/gs/phandler/client/PrayerHandler.java b/GameServer/src/msc/gs/phandler/client/PrayerHandler.java new file mode 100644 index 0000000..344919a --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PrayerHandler.java @@ -0,0 +1,102 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.external.EntityHandler; +import msc.gs.external.PrayerDef; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class PrayerHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private boolean activatePrayer(Player player, int prayerID) { + if (!player.isPrayerActivated(prayerID)) { + if (prayerID == 11) { + deactivatePrayer(player, 5); + deactivatePrayer(player, 2); + } else if (prayerID == 5) { + deactivatePrayer(player, 2); + deactivatePrayer(player, 11); + } else if (prayerID == 2) { + deactivatePrayer(player, 5); + deactivatePrayer(player, 11); + } else if (prayerID == 10) { + deactivatePrayer(player, 4); + deactivatePrayer(player, 1); + } else if (prayerID == 4) { + deactivatePrayer(player, 10); + deactivatePrayer(player, 1); + } else if (prayerID == 1) { + deactivatePrayer(player, 10); + deactivatePrayer(player, 4); + } else if (prayerID == 9) { + deactivatePrayer(player, 3); + deactivatePrayer(player, 0); + } else if (prayerID == 3) { + deactivatePrayer(player, 9); + deactivatePrayer(player, 0); + } else if (prayerID == 0) { + deactivatePrayer(player, 9); + deactivatePrayer(player, 3); + } + player.setPrayer(prayerID, true); + player.addPrayerDrain(prayerID); + return true; + } + return false; + } + + private boolean deactivatePrayer(Player player, int prayerID) { + if (player.isPrayerActivated(prayerID)) { + player.setPrayer(prayerID, false); + player.removePrayerDrain(prayerID); + return true; + } + return false; + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + int prayerID = (int) p.readByte(); + if (prayerID < 0 || prayerID >= 14) { + player.setSuspiciousPlayer(true); + player.getActionSender().sendPrayers(); + return; + } + if (player.isDueling() && player.getDuelSetting(2)) { + player.getActionSender().sendMessage("Prayer is disabled in this duel"); + player.getActionSender().sendPrayers(); + return; + } + PrayerDef prayer = EntityHandler.getPrayerDef(prayerID); + switch (pID) { + case 56: + if (player.getMaxStat(5) < prayer.getReqLevel()) { + player.setSuspiciousPlayer(true); + player.getActionSender().sendMessage("Your prayer ability is not high enough to use this prayer"); + break; + } + if (player.getCurStat(5) <= 0) { + player.setPrayer(prayerID, false); + player.getActionSender().sendMessage("You have run out of prayer points. Return to a church to recharge"); + break; + } + activatePrayer(player, prayerID); + break; + case 248: + deactivatePrayer(player, prayerID); + break; + } + player.getActionSender().sendPrayers(); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/PrivacySettingHandler.java b/GameServer/src/msc/gs/phandler/client/PrivacySettingHandler.java new file mode 100644 index 0000000..8ae3eee --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/PrivacySettingHandler.java @@ -0,0 +1,49 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.PrivacySettingUpdatePacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class PrivacySettingHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private PrivacySettingUpdatePacketBuilder builder = new PrivacySettingUpdatePacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + + boolean[] newSettings = new boolean[4]; + for (int i = 0; i < 4; i++) { + newSettings[i] = p.readByte() == 1; + } + + builder.setPlayer(player); + for (int i = 0; i < 4; i++) { + builder.setIndex(i); + if (newSettings[i] && !player.getPrivacySetting(i)) { + builder.setOn(true); + } else if (!newSettings[i] && player.getPrivacySetting(i)) { + builder.setOn(false); + } else { + continue; + } + LSPacket packet = builder.getPacket(); + if (packet != null) { + Instance.getServer().getLoginConnector().getSession().write(packet); + } + } + + for (int i = 0; i < 4; i++) { + player.setPrivacySetting(i, newSettings[i]); + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/ReportHandler.java b/GameServer/src/msc/gs/phandler/client/ReportHandler.java new file mode 100644 index 0000000..f42f971 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/ReportHandler.java @@ -0,0 +1,48 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.db.ReportHandlerQueries; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.tools.DataConversions; + +public class ReportHandler implements PacketHandler { + + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (!player.canReport()) { + player.getActionSender().sendMessage("You may only send one abuse report per minute."); + return; + } + long temp = -121; + byte b = 1; + try { + temp = p.readLong(); + b = p.readByte(); + } catch (Exception e) { + return; + } finally { + if(temp == player.getUsernameHash()) { + player.getActionSender().sendMessage("You can't report yourself!"); + return; + } + Instance.getIRC().handleReport(player.getUsername(), DataConversions.hashToUsername(temp), b); + //Instance.getServer().getLoginConnector().getActionSender().reportUser(player.getUsernameHash(), temp, b); + Instance.getReport().submitRepot(player.getUsernameHash(), temp, b, player); + player.setLastReport(); + world.addEntryToSnapshots(new Activity(player.getUsername(),player.getUsername() + " sent a repot about: " + DataConversions.hashToUsername(temp))); + player.getActionSender().sendMessage("Your report has been received, thank you."); + } + + } +} diff --git a/GameServer/src/msc/gs/phandler/client/SessionRequest.java b/GameServer/src/msc/gs/phandler/client/SessionRequest.java new file mode 100644 index 0000000..4db56fd --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/SessionRequest.java @@ -0,0 +1,36 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.builders.RSCPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class SessionRequest implements PacketHandler { + + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if(player.isInitialized()) { + Logger.println("[WARNING] SessionRequest for already Initialized player!"); + return; + } + byte userByte = p.readByte(); + player.setClassName(p.readString().trim()); + long serverKey = Formulae.generateSessionKey(userByte); + player.setServerKey(serverKey); + RSCPacketBuilder pb = new RSCPacketBuilder(); + pb.setBare(true); + pb.addLong(serverKey); + session.write(pb.toPacket()); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/ShopHandler.java b/GameServer/src/msc/gs/phandler/client/ShopHandler.java new file mode 100644 index 0000000..64ffc6a --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/ShopHandler.java @@ -0,0 +1,127 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.Player; +import msc.gs.model.Shop; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class ShopHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy()) { + player.resetShop(); + return; + } + final Shop shop = player.getShop(); + if (shop == null) { + player.setSuspiciousPlayer(true); + player.resetShop(); + return; + } + int value; + InvItem item; + switch (pID) { + case 253: // Close shop + player.resetShop(); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " closed shop window at: " + player.getX() + "/" + player.getY())); + + break; + case 128: // Buy item + + Short s = p.readShort(); + item = new InvItem(s, 1); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " tried to buy item ("+s+"): " + player.getX() + "/" + player.getY())); + + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + value = p.readInt(); + if(value < item.getDef().basePrice) { + Logger.println("[SHOPDUPE] " + player.getUsername() + " tried to buy " + item.getDef().name + " for " + value); + return; + } + if (shop.countId(item.getID()) < 1) + return; + if (player.getInventory().countId(10) < value) { + player.getActionSender().sendMessage("You don't have enough money to buy that!"); + return; + } + if ((Inventory.MAX_SIZE - player.getInventory().size()) + player.getInventory().getFreedSlots(new InvItem(10, value)) < player.getInventory().getRequiredSlots(item)) { + player.getActionSender().sendMessage("You don't have room for that in your inventory"); + return; + } + int itemprice = Formulae.getPrice(shop.getItems().get(Formulae.getItemPos(shop, item.getID())), shop, true); + int sellprice = Formulae.getPrice(shop.getItems().get(Formulae.getItemPos(shop, item.getID())), shop, false); + if (itemprice == 0) + return; + + if (sellprice >= itemprice) + return; + if (player.getInventory().remove(10, itemprice) > -1) { + shop.remove(item); + player.getInventory().add(item); + player.getActionSender().sendSound("coins"); + player.getActionSender().sendInventory(); + shop.updatePlayers(); + } + break; + case 255: // Sell item + Short s1 = p.readShort(); + item = new InvItem(s1, 1); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " tried to sell item ("+s1+"): " + player.getX() + "/" + player.getY())); + + value = p.readInt(); + if(!item.getDef().canTrade()) { + player.getActionSender().sendMessage("You cannot sell this item."); + return; + } + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + if (player.getInventory().countId(item.getID()) < 1) { + return; + } + if (!shop.shouldStock(item.getID())) { + return; + } + if (!shop.canHold(item)) { + player.getActionSender().sendMessage("The shop is currently full!"); + return; + } + int itempricez; + if (Formulae.getItemPos(shop, item.getID()) == -1) { + itempricez = Formulae.getPrice(new InvItem(item.getID(), 0), shop, false); + } else { + itempricez = Formulae.getPrice(shop.getItems().get(Formulae.getItemPos(shop, item.getID())), shop, false); + } + if (itempricez > 300000) + return; + if (player.getInventory().remove(item) > -1) { + player.getInventory().add(new InvItem(10, itempricez)); + shop.add(item); + player.getActionSender().sendSound("coins"); + player.getActionSender().sendInventory(); + shop.updatePlayers(); + } + break; + } + } +} diff --git a/GameServer/src/msc/gs/phandler/client/Sleepword.java b/GameServer/src/msc/gs/phandler/client/Sleepword.java new file mode 100644 index 0000000..c38f4c9 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/Sleepword.java @@ -0,0 +1,64 @@ +/** + * @author Zerratar + * @date 2008, 7th of june + */ + +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class Sleepword implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + long now = System.currentTimeMillis(); + + try { + String sleepword_result = ((RSCPacket) p).readString().trim(); + if (System.currentTimeMillis() - player.getLastSleepTime() < 1000) + return; + + if (player.getWrongWords() >= 10) { + player.getActionSender().sendLogout(); + Logger.println(player.getWrongWords() + " incorrect sleep words from Player: " + player.getUsername()); + player.destroy(false); + return; + } + + if (sleepword_result.equalsIgnoreCase("-null-")) { + player.getActionSender().sendEnterSleep(); + player.setLastSleepTime(now); + } else { + if (!player.isSleeping) { Logger.println(player.getUsername() + " tried waking up while not sleeping, probable bug abuse."); return; } + if (sleepword_result.equalsIgnoreCase(player.getSleepword())) + player.getActionSender().sendWakeUp(true); + else { + world.addEntryToSnapshots(new Activity(player.getUsername(),player.getUsername() + " failed a sleepword")); + player.getActionSender().sendIncorrectSleepword(); + player.getActionSender().sendEnterSleep(); + player.setLastSleepTime(now); + player.setWrongWords(); + } + } + } catch (Exception e) { + if (player.isSleeping) { + player.getActionSender().sendIncorrectSleepword(); + player.getActionSender().sendEnterSleep(); + } + } + } +} diff --git a/GameServer/src/msc/gs/phandler/client/SpellHandler.java b/GameServer/src/msc/gs/phandler/client/SpellHandler.java new file mode 100644 index 0000000..f1f9b06 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/SpellHandler.java @@ -0,0 +1,1269 @@ +package msc.gs.phandler.client; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.ListIterator; +import java.util.Random; +import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.FightEvent; +import msc.gs.event.ObjectRemover; +import msc.gs.event.WalkMobToMobEvent; +import msc.gs.event.WalkToMobEvent; +import msc.gs.event.WalkToPointEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.ItemSmeltingDef; +import msc.gs.external.ReqOreDef; +import msc.gs.external.SpellDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.PathGenerator; +import msc.gs.model.Player; +import msc.gs.model.Projectile; +import msc.gs.model.World; +import msc.gs.model.mini.Damager; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.tools.DataConversions; + +public class SpellHandler implements PacketHandler { + static int[] spellDamage = {}; + private static TreeMap staffs = new TreeMap(); + + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + static { + staffs.put(31, new InvItem[] { new InvItem(197), new InvItem(615), new InvItem(682) }); // Fire-Rune + staffs.put(32, new InvItem[] { new InvItem(102), new InvItem(616), new InvItem(683) }); // Water-Rune + staffs.put(33, new InvItem[] { new InvItem(101), new InvItem(617), new InvItem(684) }); // Air-Rune + staffs.put(34, new InvItem[] { new InvItem(103), new InvItem(618), new InvItem(685) }); // Earth-Rune + } + + private static boolean canCast(Player player) { + if((player.isPMod() || player.isMod()) && !player.isAdmin()) { + return false; + } + if (!player.castTimer()) { + player.getActionSender().sendMessage("You must wait another " + player.getSpellWait() + " seconds to cast another spell."); + player.resetPath(); + return false; + } + return true; + } + + private static boolean checkAndRemoveRunes(Player player, SpellDef spell) { + for (Entry e : spell.getRunesRequired()) { + boolean skipRune = false; + for (InvItem staff : getStaffs(e.getKey())) { + if (player.getInventory().contains(staff)) { + for (InvItem item : player.getInventory().getItems()) { + if (item.equals(staff) && item.isWielded()) { + skipRune = true; + break; + } + } + } + } + if (skipRune) { + continue; + } + if (player.getInventory().countId(((Integer) e.getKey()).intValue()) < ((Integer) e.getValue()).intValue()) { + player.setSuspiciousPlayer(true); + player.getActionSender().sendMessage("You don't have all the reagents you need for this spell"); + return false; + } + } + for (Entry e : spell.getRunesRequired()) { + boolean skipRune = false; + for (InvItem staff : getStaffs(e.getKey())) { + if (player.getInventory().contains(staff)) { + for (InvItem item : player.getInventory().getItems()) { + if (item.equals(staff) && item.isWielded()) { + skipRune = true; + break; + } + } + } + } + if (skipRune) { + continue; + } + player.getInventory().remove(((Integer) e.getKey()).intValue(), ((Integer) e.getValue()).intValue()); + } + return true; + } + + private static InvItem[] getStaffs(int runeID) { + InvItem[] items = staffs.get(runeID); + if (items == null) { + return new InvItem[0]; + } + return items; + + } + + private Random r = new Random(); + + private void finalizeSpell(Player player, SpellDef spell) { + player.lastCast = System.currentTimeMillis(); + player.getActionSender().sendSound("spellok"); + player.getActionSender().sendMessage("Cast spell successfully"); + player.setCastTimer(); + } + + public void godSpellObject(Mob affectedMob, int spell) { + + switch (spell) { + case 33: + GameObject guthix = new GameObject(affectedMob.getLocation(), 1142, 0, 0); + world.registerGameObject(guthix); + Instance.getDelayedEventHandler().add(new ObjectRemover(guthix, 500)); + break; + case 34: + GameObject sara = new GameObject(affectedMob.getLocation(), 1031, 0, 0); + world.registerGameObject(sara); + Instance.getDelayedEventHandler().add(new ObjectRemover(sara, 500)); + break; + case 35: + GameObject zammy = new GameObject(affectedMob.getLocation(), 1036, 0, 0); + world.registerGameObject(zammy); + Instance.getDelayedEventHandler().add(new ObjectRemover(zammy, 500)); + break; + case 47: + GameObject charge = new GameObject(affectedMob.getLocation(), 1147, 0, 0); + world.registerGameObject(charge); + Instance.getDelayedEventHandler().add(new ObjectRemover(charge, 500)); + break; + } + } + + private void handleGroundCast(Player player, SpellDef spell, int id) { + if(player.isAdmin()) { + player.getActionSender().sendMessage("Spellid: " + id); + } + switch (id) { + case 7: // Bones to bananas + if (!checkAndRemoveRunes(player, spell)) { + return; + } + Iterator inventory = player.getInventory().iterator(); + int boneCount = 0; + while (inventory.hasNext()) { + InvItem i = inventory.next(); + if (i.getID() == 20) { + inventory.remove(); + boneCount++; + } + } + for (int i = 0; i < boneCount; i++) { + player.getInventory().add(new InvItem(249)); + } + finalizeSpell(player, spell); + break; + case 48: // Charge + if(world.getTile(player.getLocation()).hasGameObject()) { + player.getActionSender().sendMessage("You cannot charge here, please move to a different area."); + return; + } + if(!checkAndRemoveRunes(player, spell)) { + return; + } + player.getActionSender().sendMessage("@gre@You feel charged with magical power..."); + player.setCharged(); + godSpellObject(player, 47); + + finalizeSpell(player, spell); + return; + + } + } + + private void handleInvItemCast(Player player, SpellDef spell, int id, InvItem affectedItem) { + switch (id) { + case 3: // Enchant lvl-1 Sapphire amulet + if (affectedItem.getID() == 302) { + if (!checkAndRemoveRunes(player, spell)) { + return; + } + player.getInventory().remove(affectedItem); + player.getInventory().add(new InvItem(314)); + finalizeSpell(player, spell); + } else { + player.getActionSender().sendMessage("This spell cannot be used on this kind of item"); + } + break; + case 10: // Low level alchemy + if (affectedItem.getID() == 10) { + player.getActionSender().sendMessage("You cannot alchemy that"); + return; + } + if (!checkAndRemoveRunes(player, spell)) { + return; + } + if (player.getInventory().remove(affectedItem) > 1) { + int value = (int) (affectedItem.getDef().getBasePrice() * 0.4D * affectedItem.getAmount()); + player.getInventory().add(new InvItem(10, value)); // 40% + } + finalizeSpell(player, spell); + break; + case 13: // Enchant lvl-2 emerald amulet + if (affectedItem.getID() == 303) { + if (!checkAndRemoveRunes(player, spell)) { + return; + } + player.getInventory().remove(affectedItem); + player.getInventory().add(new InvItem(315)); + finalizeSpell(player, spell); + } else { + player.getActionSender().sendMessage("This spell cannot be used on this kind of item"); + } + break; + case 21: // Superheat item + ItemSmeltingDef smeltingDef = affectedItem.getSmeltingDef(); + if (smeltingDef == null) { + player.getActionSender().sendMessage("This spell cannot be used on this kind of item"); + return; + } + for (ReqOreDef reqOre : smeltingDef.getReqOres()) { + if (player.getInventory().countId(reqOre.getId()) < reqOre.getAmount()) { + if (affectedItem.getID() == 151) { + smeltingDef = EntityHandler.getItemSmeltingDef(9999); + break; + } + player.getActionSender().sendMessage("You need " + reqOre.getAmount() + " " + EntityHandler.getItemDef(reqOre.getId()).getName() + " to smelt a " + affectedItem.getDef().getName() + "."); + return; + } + } + if (player.getCurStat(13) < smeltingDef.getReqLevel()) { + player.getActionSender().sendMessage("You need a smithing level of " + smeltingDef.getReqLevel() + " to smelt this."); + return; + } + if (!checkAndRemoveRunes(player, spell)) { + return; + } + InvItem bar = new InvItem(smeltingDef.getBarId()); + if (player.getInventory().remove(affectedItem) > -1) { + for (ReqOreDef reqOre : smeltingDef.getReqOres()) { + for (int i = 0; i < reqOre.getAmount(); i++) { + player.getInventory().remove(new InvItem(reqOre.getId())); + } + } + player.getActionSender().sendMessage("You make a " + bar.getDef().getName() + "."); + player.getInventory().add(bar); + player.incExp(13, smeltingDef.getExp(), true); + player.getActionSender().sendStat(13); + player.getActionSender().sendInventory(); + } + finalizeSpell(player, spell); + break; + case 24: // Enchant lvl-3 ruby amulet + if (affectedItem.getID() == 304) { + if (!checkAndRemoveRunes(player, spell)) { + return; + } + player.getInventory().remove(affectedItem); + player.getInventory().add(new InvItem(316)); + finalizeSpell(player, spell); + } else { + player.getActionSender().sendMessage("This spell cannot be used on this kind of item"); + } + break; + case 28: // High level alchemy + if (affectedItem.getID() == 10) { + player.getActionSender().sendMessage("You cannot alchemy that"); + return; + } + if (!checkAndRemoveRunes(player, spell)) { + return; + } + if (player.getInventory().remove(affectedItem) > -1) { + int value = (int) (affectedItem.getDef().getBasePrice() * 0.6D * affectedItem.getAmount()); + player.getInventory().add(new InvItem(10, value)); // 60% + } + finalizeSpell(player, spell); + break; + case 30: // Enchant lvl-4 diamond amulet + if (affectedItem.getID() == 305) { + if (!checkAndRemoveRunes(player, spell)) { + return; + } + player.getInventory().remove(affectedItem); + player.getInventory().add(new InvItem(317)); + finalizeSpell(player, spell); + } else { + player.getActionSender().sendMessage("This spell cannot be used on this kind of item"); + } + break; + case 43: // Enchant lvl-5 dragonstone amulet + if(affectedItem.getID() == 610) { if(!checkAndRemoveRunes(player, + spell)) { return; } player.getInventory().remove(affectedItem); + player.getInventory().add(new InvItem(522)); + finalizeSpell(player, spell); } else { + player.getActionSender().sendMessage + ("This spell cannot be used on this kind of item"); } break; + + } + if (affectedItem.isWielded()) { + player.getActionSender().sendSound("click"); + affectedItem.setWield(false); + player.updateWornItems(affectedItem.getWieldableDef().getWieldPos(), player.getPlayerAppearance().getSprite(affectedItem.getWieldableDef().getWieldPos())); + player.getActionSender().sendEquipmentStats(); + } + } + + private void handleItemCast(Player player, final SpellDef spell, final int id, final Item affectedItem) { + player.setStatus(Action.CASTING_GITEM); + Instance.getDelayedEventHandler().add(new WalkToPointEvent(player, affectedItem.getLocation(), 5, true) { + public void arrived() { + owner.resetPath(); + ActiveTile tile = world.getTile(location); + if (!canCast(owner) || !tile.hasItem(affectedItem) || owner.getStatus() != Action.CASTING_GITEM || affectedItem.isRemoved()) { + return; + } + // check if the item is a rare + /* + * int itemid = affectedItem.getID(); if(itemid == 828 || itemid + * == 831 || itemid == 832 || itemid == 422 || itemid == 1289) { + * owner.getActionSender().sendMessage( + * "Using Telekinetic grab on rare drops isn't fun ):"); return; + * } + */ + owner.resetAllExceptDueling(); + switch (id) { + case 16: // Telekinetic grab + if (affectedItem.getID() == 575) { + owner.getActionSender().sendMessage("You may not telegrab this item"); + return; + } + if (affectedItem.getLocation().inBounds(490, 464, 500, 471) || affectedItem.getLocation().inBounds(490, 1408, 500, 1415)) { + owner.getActionSender().sendMessage("Telekinetic grab cannot be used in here"); + return; + } + if (affectedItem.getLocation().inBounds(97, 1428, 106, 1440) || affectedItem.getLocation().inBounds(490, 1408, 500, 1415)) { + owner.getActionSender().sendMessage("Telekinetic grab cannot be used in here"); + return; + } + if(DataConversions.inArray(Formulae.telegrabBlocked, affectedItem.getID())) { + owner.getActionSender().sendMessage("This item cannot be telegrabbed!"); + return; + } + if (!checkAndRemoveRunes(owner, spell)) { + return; + } + owner.getActionSender().sendTeleBubble(location.getX(), location.getY(), true); + for (Object o : owner.getWatchedPlayers().getAllEntities()) { + Player p = ((Player) o); + p.getActionSender().sendTeleBubble(location.getX(), location.getY(), true); + } + world.unregisterItem(affectedItem); + finalizeSpell(owner, spell); + owner.getInventory().add(new InvItem(affectedItem.getID(), affectedItem.getAmount())); + break; + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + } + }); + } + + private void handleMobCast(final Player player, Mob affectedMob, final int spellID) { + if (player.isDueling() && affectedMob instanceof Player) { + Player aff = (Player) affectedMob; + if (!player.getWishToDuel().getUsername().toLowerCase().equals(aff.getUsername().toLowerCase())) + return; + } + if(player.isAdmin()) { + player.getActionSender().sendMessage("Spellid: " + spellID); + } + if (!new PathGenerator(player.getX(), player.getY(), affectedMob.getX(), affectedMob.getY()).isValid()) { + player.getActionSender().sendMessage("I can't get a clear shot from here"); + player.resetPath(); + return; + } + if (affectedMob instanceof Player) { + Player other = (Player) affectedMob; + if (player.getLocation().inWilderness() && System.currentTimeMillis() - other.lastRun < 1000) { + player.resetPath(); + return; + } + } + if (player.getLocation().inWilderness() && System.currentTimeMillis() - player.lastRun < 3000) { + player.resetPath(); + return; + } + player.setFollowing(affectedMob); + player.setStatus(Action.CASTING_MOB); + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedMob, 5) { + public void arrived() { + if (!new PathGenerator(owner.getX(), owner.getY(), affectedMob.getX(), affectedMob.getY()).isValid()) { + owner.getActionSender().sendMessage("I can't get a clear shot from here"); + owner.resetPath(); + return; + } + player.resetFollowing(); + owner.resetPath(); + + SpellDef spell = EntityHandler.getSpellDef(spellID); + if (!canCast(owner) || affectedMob.getHits() <= 0 || !owner.checkAttack(affectedMob, true) || owner.getStatus() != Action.CASTING_MOB) { + player.resetPath(); + return; + } + owner.resetAllExceptDueling(); + switch (spellID) { + case 1: // Confuse + + case 5: // Weaken + case 9: // Curse + + if (affectedMob instanceof Npc) { + Npc np = (Npc) affectedMob; + if (spellID == 1) { + if (np.confused) { + owner.getActionSender().sendMessage("Your oponent is already confused"); + return; + } + } + if (spellID == 5) { + if (np.weakend) { + owner.getActionSender().sendMessage("Your oponent is already weakend"); + return; + } + } + if (spellID == 9) { + if (np.cursed) { + owner.getActionSender().sendMessage("Your oponent is already cursed"); + return; + } + } + } /* + * else { player.getActionSender().sendMessage( + * "Currently Unavaliable"); return; } + */ + + if (affectedMob instanceof Player && !owner.isDueling()) { + Player affectedPlayer = (Player) affectedMob; + owner.setSkulledOn(affectedPlayer); + } + int stat = -1; + if (spellID == 1) + stat = 0; + else if (spellID == 5) + stat = 2; + else if (spellID == 9) + stat = 1; + + int statLv = -1; + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + statLv = affectedPlayer.getCurStat(stat); + + } else if (affectedMob instanceof Npc) { + Npc n = (Npc) affectedMob; + if (stat == 0) + statLv = n.getAttack(); + else if (stat == 1) + statLv = n.getDefense(); + else if (stat == 2) + statLv = n.getStrength(); + } + if (statLv == -1 || stat == -1) + return; + + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + if (affectedPlayer.getCurStat(stat) < affectedPlayer.getMaxStat(stat) - (affectedPlayer.getMaxStat(stat) / 20)) { + owner.getActionSender().sendMessage("Your opponent is already stunned"); + return; + } else { + affectedPlayer.setCurStat(stat, affectedPlayer.getCurStat(stat) - (affectedPlayer.getMaxStat(stat) / 20)); + affectedPlayer.getActionSender().sendStats(); + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " has stunned you"); + } + + } else if (affectedMob instanceof Npc) { + Npc n = (Npc) affectedMob; + if (spellID == 1) + n.confused = true; + else if (spellID == 5) + n.weakend = true; + else if (spellID == 9) + n.cursed = true; + + } + if (!checkAndRemoveRunes(owner, spell)) { + return; + } + + Projectile projectilez = new Projectile(owner, affectedMob, 1); + ArrayList playersToInformm = new ArrayList(); + playersToInformm.addAll(owner.getViewArea().getPlayersInView()); + playersToInformm.addAll(affectedMob.getViewArea().getPlayersInView()); + for (Player p : playersToInformm) { + p.informOfProjectile(projectilez); + p.informOfModifiedHits(affectedMob); + } + + finalizeSpell(owner, spell); + + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + return; + case 19: // Crumble undead + + if (affectedMob instanceof Player) { + owner.getActionSender().sendMessage("You can not use this spell on a Player"); + return; + } + if (!checkAndRemoveRunes(owner, spell)) { + return; + } + Npc n = (Npc) affectedMob; + int damaga = Formulae.Rand(1, 5); + boolean foundd = false; + if (n.undead) { + foundd = true; + damaga = Formulae.Rand(3, Constants.GameServer.CRUMBLE_UNDEAD_MAX); + } + + if (!foundd) { + owner.getActionSender().sendMessage("You must use this spell on undead monsters only"); + return; + } + if (Formulae.Rand(0, 8) == 2) + damaga = 0; + + Projectile projectilee = new Projectile(owner, affectedMob, 1); + affectedMob.setLastDamage(damaga); + int newp = affectedMob.getHits() - damaga; + affectedMob.setHits(newp); + ArrayList playersToInforms = new ArrayList(); + playersToInforms.addAll(owner.getViewArea().getPlayersInView()); + playersToInforms.addAll(affectedMob.getViewArea().getPlayersInView()); + for (Player p : playersToInforms) { + p.informOfProjectile(projectilee); + p.informOfModifiedHits(affectedMob); + } + if (newp <= 0) { + affectedMob.killedBy(owner, owner.isDueling()); + if (owner instanceof Player) { + int exp = DataConversions.roundUp(Formulae.combatExperience(affectedMob) / 4D); + int newXP = 0; + if (owner instanceof Player && affectedMob instanceof Npc) { + Npc npc = (Npc) affectedMob; + + for (Damager fig : ((Npc) affectedMob).getSyndicate().getDamagers()) { + if (fig.isUseMagic() && !fig.isUseCombat()) + continue; + + if (fig.getDamage() > npc.getDef().hits) + fig.setDamage(npc.getDef().hits); + if (fig.getPlayer() != null) { + newXP = (exp * fig.getDamage()) / npc.getDef().hits; + + if (fig.isUseRanged()) { + fig.getPlayer().incExp(4, newXP * 3, true); + fig.getPlayer().getActionSender().sendStat(4); + continue; + } + switch (fig.getPlayer().getCombatStyle()) { + case 0: + for (int x = 0; x < 3; x++) { + fig.getPlayer().incExp(x, newXP, true); + fig.getPlayer().getActionSender().sendStat(x); + } + break; + case 1: + fig.getPlayer().incExp(2, newXP * 3, true); + fig.getPlayer().getActionSender().sendStat(2); + break; + case 2: + fig.getPlayer().incExp(0, newXP * 3, true); + fig.getPlayer().getActionSender().sendStat(0); + break; + case 3: + fig.getPlayer().incExp(1, newXP * 3, true); + fig.getPlayer().getActionSender().sendStat(1); + break; + } + fig.getPlayer().incExp(3, newXP, true); + fig.getPlayer().getActionSender().sendStat(3); + } + } + } + } + } + finalizeSpell(owner, spell); + + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + return; + case 42: // vulnerability + case 45: // Enfeeble + case 47: // Stun + owner.getActionSender().sendMessage("@or1@This spell is not yet implemented."); + break; + case 25: + if(owner.getLocation().inWilderness()) { + owner.getActionSender().sendMessage("Can not use this spell in wilderness"); + return; + } + if(affectedMob instanceof Npc) { + if(((Npc)affectedMob).getID() == 477) { + player.getActionSender().sendMessage("The dragon seems immune to this spell"); + return; + } + } + boolean flagispro = false; + ListIterator iterator22 = owner.getInventory().iterator(); + for(int slot = 0; iterator22.hasNext(); slot++) + { + InvItem cape = (InvItem)iterator22.next(); + if(cape.getID() == 1000 && cape.isWielded()) {flagispro=flagispro||true;} + // else {flag = false;} + } + if(flagispro){ + if(!owner.isCharged()){owner.getActionSender().sendMessage("@red@You are not charged!");} + + if(!checkAndRemoveRunes(owner, spell)) { + return; + } + if(affectedMob instanceof Player && !owner.isDueling()) { + Player affectedPlayer = (Player)affectedMob; + owner.setSkulledOn(affectedPlayer); + } + int damag = Formulae.calcSpellHit(20, owner.getMagicPoints()); + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " is shooting at you!"); + } + Projectile projectil = new Projectile(owner, affectedMob, 1); + //godSpellObject(affectedMob, 33); + affectedMob.setLastDamage(damag); + int newhp = affectedMob.getHits() - damag; + affectedMob.setHits(newhp); + ArrayList playersToInfor = new ArrayList(); + playersToInfor.addAll(owner.getViewArea().getPlayersInView()); + playersToInfor.addAll(affectedMob.getViewArea().getPlayersInView()); + for(Player p : playersToInfor) { + p.informOfProjectile(projectil); + p.informOfModifiedHits(affectedMob); + } + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + if(newhp <= 0) { + affectedMob.killedBy(owner, owner.isDueling()); + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + finalizeSpell(owner, spell); + break; + } + else{owner.getActionSender().sendMessage("You need to be wearing the Iban Staff to cast this spell!");return;} + case 33: + if(owner.getLocation().inWilderness()) { + owner.getActionSender().sendMessage("Can not use this spell in wilderness"); + return; + } + if(affectedMob instanceof Npc) { + if(((Npc)affectedMob).getID() == 477) { + player.getActionSender().sendMessage("The dragon seems immune to this spell"); + return; + } + } + boolean flag = false; + ListIterator iterator = owner.getInventory().iterator(); + for(int slot = 0; iterator.hasNext(); slot++) + { + InvItem cape = (InvItem)iterator.next(); + if(cape.getID() == 1217 && cape.isWielded()) { + flag=true; + } + // else {flag = false;} + } + if(flag){ + if(!owner.isCharged()) { + owner.getActionSender().sendMessage("@red@You are not charged!"); + } + + if(!checkAndRemoveRunes(owner, spell)) { + return; + } + if(affectedMob instanceof Player && !owner.isDueling()) { + Player affectedPlayer = (Player)affectedMob; + owner.setSkulledOn(affectedPlayer); + } + int damag = Formulae.calcGodSpells(owner, affectedMob); + //int damag = Formulae.calcSpellHit(max, owner.getMagicPoints()); + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " is shooting at you!"); + } + Projectile projectil = new Projectile(owner, affectedMob, 1); + godSpellObject(affectedMob, 33); + affectedMob.setLastDamage(damag); + int newhp = affectedMob.getHits() - damag; + affectedMob.setHits(newhp); + ArrayList playersToInfor = new ArrayList(); + playersToInfor.addAll(owner.getViewArea().getPlayersInView()); + playersToInfor.addAll(affectedMob.getViewArea().getPlayersInView()); + for(Player p : playersToInfor) { + p.informOfProjectile(projectil); + p.informOfModifiedHits(affectedMob); + } + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + if(newhp <= 0) { + affectedMob.killedBy(owner, owner.isDueling()); + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + finalizeSpell(owner, spell); + break; + } + else{owner.getActionSender().sendMessage("You need to be wearing the Staff of Guthix to cast this spell!");return;} + case 34: + if(affectedMob instanceof Npc) { + if(((Npc)affectedMob).getID() == 477) { + player.getActionSender().sendMessage("The dragon seems immune to this spell"); + return; + } + } + if(owner.getLocation().inWilderness()) { + owner.getActionSender().sendMessage("Can not use this spell in wilderness"); + return; + } + boolean bool = false; + ListIterator iterat = owner.getInventory().iterator(); + for(int slot = 0; iterat.hasNext(); slot++) + { + InvItem cape = (InvItem)iterat.next(); + if(cape.getID() == 1218 && cape.isWielded()) {bool=bool||true;} + //else {flag = false;} + } + if(bool){ + if(!owner.isCharged()){owner.getActionSender().sendMessage("@red@You are not charged!");} + + if(!checkAndRemoveRunes(owner, spell)) { + return; + } + if(affectedMob instanceof Player && !owner.isDueling()) { + Player affectedPlayer = (Player)affectedMob; + owner.setSkulledOn(affectedPlayer); + } + //int damag = Rand(0, 25); + int damag = Formulae.calcGodSpells(owner, affectedMob); + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " is shooting at you!"); + } + Projectile projectil = new Projectile(owner, affectedMob, 1); + godSpellObject(affectedMob, 34); + affectedMob.setLastDamage(damag); + int newhp = affectedMob.getHits() - damag; + affectedMob.setHits(newhp); + ArrayList playersToInfor = new ArrayList(); + playersToInfor.addAll(owner.getViewArea().getPlayersInView()); + playersToInfor.addAll(affectedMob.getViewArea().getPlayersInView()); + for(Player p : playersToInfor) { + p.informOfProjectile(projectil); + p.informOfModifiedHits(affectedMob); + } + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + if(newhp <= 0) { + affectedMob.killedBy(owner, owner.isDueling()); + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + finalizeSpell(owner, spell); + break; + } + else{owner.getActionSender().sendMessage("You need to be wearing the Staff of Saradomin to cast this spell!");return;} + case 35: + if(affectedMob instanceof Npc) { + if(((Npc)affectedMob).getID() == 477) { + player.getActionSender().sendMessage("The dragon seems immune to this spell"); + return; + } + } + if(owner.getLocation().inWilderness()) { + owner.getActionSender().sendMessage("Can not use this spell in wilderness"); + return; + } + boolean flag2 = false; + ListIterator iterato = owner.getInventory().iterator(); + for(int slot = 0; iterato.hasNext(); slot++) + { + InvItem cape = (InvItem)iterato.next(); + if(cape.getID() == 1216 && cape.isWielded()) {flag2=flag2||true;} + //else {flag = false;} + } + if(flag2){ + if(!owner.isCharged()){owner.getActionSender().sendMessage("@red@You are not charged!");} + + if(!checkAndRemoveRunes(owner, spell)) { + return; + } + if(affectedMob instanceof Player && !owner.isDueling()) { + Player affectedPlayer = (Player)affectedMob; + owner.setSkulledOn(affectedPlayer); + } + //int damag = Rand(0, 25); + int damag = Formulae.calcGodSpells(owner, affectedMob); + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " is shooting at you!"); + } + Projectile projectil = new Projectile(owner, affectedMob, 1); + godSpellObject(affectedMob, 35); + affectedMob.setLastDamage(damag); + int newhp = affectedMob.getHits() - damag; + affectedMob.setHits(newhp); + ArrayList playersToInfor = new ArrayList(); + playersToInfor.addAll(owner.getViewArea().getPlayersInView()); + playersToInfor.addAll(affectedMob.getViewArea().getPlayersInView()); + for(Player p : playersToInfor) { + p.informOfProjectile(projectil); + p.informOfModifiedHits(affectedMob); + } + if(affectedMob instanceof Player) { + Player affectedPlayer = (Player)affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + if(newhp <= 0) { + affectedMob.killedBy(owner, owner.isDueling()); + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + finalizeSpell(owner, spell); + break; + } + else{owner.getActionSender().sendMessage("You need to be wearing the Staff of Zaramorak to cast this spell");return;} + + default: + if(spell.getReqLevel() == 62 || spell.getReqLevel() == 65 || spell.getReqLevel() == 70 || spell.getReqLevel() == 75) { + if(!Constants.GameServer.MEMBER_WORLD) { + player.getActionSender().sendMessage("Must be on a members server to use this"); + return; + } + if(player.getLocation().inWilderness() && Constants.GameServer.F2P_WILDY) { + player.getActionSender().sendMessage("You can not cast this Members spell in F2P Wilderness"); + return; + } + } + if (!checkAndRemoveRunes(owner, spell)) { + return; + } + + int max = -1; + for (int i = 0; i < Constants.GameServer.SPELLS.length; i++) { + if (spell.getReqLevel() == Constants.GameServer.SPELLS[i][0]) + max = Constants.GameServer.SPELLS[i][1]; + } + if (player.getMagicPoints() > 30) + max += 1; + int damage = Formulae.calcSpellHit(max, owner.getMagicPoints()); + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + affectedPlayer.getActionSender().sendMessage(owner.getUsername() + " is shooting at you!"); + } + + if (affectedMob instanceof Npc) { + Npc npcc = (Npc) affectedMob; + npcc.getSyndicate().addDamage(owner, damage, true, false, false); + } + Projectile projectile = new Projectile(owner, affectedMob, 1); + affectedMob.setLastDamage(damage); + int newHp = affectedMob.getHits() - damage; + affectedMob.setHits(newHp); + if (affectedMob instanceof Npc) { + Npc np = (Npc) affectedMob; + double maxx = np.getDef().hits; + double cur = np.getHits(); + int percent = (int) ((cur / maxx) * 100); + if (np.isScripted()) + Instance.getPluginHandler().getNpcAIHandler(np.getID()).onHealthPercentage(np, percent); + } + + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(owner.getViewArea().getPlayersInView()); + playersToInform.addAll(affectedMob.getViewArea().getPlayersInView()); + for (Player p : playersToInform) { + p.informOfProjectile(projectile); + p.informOfModifiedHits(affectedMob); + } + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + if (newHp <= 0) { + if(affectedMob instanceof Player) + affectedMob.killedBy(owner, owner.isDueling()); + + if (owner instanceof Player) { + Player toLoot = owner; + int exp = DataConversions.roundUp(Formulae.combatExperience(affectedMob) / 4D); + int newXP = 0; + if (owner instanceof Player && affectedMob instanceof Npc) { + Npc npc = (Npc) affectedMob; + int tempDmg = 0; + for (Damager fig : ((Npc) affectedMob).getSyndicate().getDamagers()) { + if(fig.getDamage() > tempDmg) { + toLoot = fig.getPlayer(); + tempDmg = fig.getDamage(); + } + if (fig.isUseMagic() && !fig.isUseCombat()) + continue; + // if(fig.player != attackerPlayer) + /* + * for(Player p : attackerPlayer.getViewArea + * ().getPlayersInView()) if(p == + * fig.player) found = true; if(!found) // + * skip a person who is not in the area. + * continue; + */ + + if (fig.getDamage() > npc.getDef().hits) + fig.setDamage(npc.getDef().hits); + if (fig.getPlayer() != null) { + newXP = (exp * fig.getDamage()) / npc.getDef().hits; + if (fig.isUseRanged()) { + fig.getPlayer().incExp(4, newXP * 3, true); + fig.getPlayer().getActionSender().sendStat(4); + continue; + } + switch (fig.getPlayer().getCombatStyle()) { + case 0: + for (int x = 0; x < 3; x++) { + fig.getPlayer().incExp(x, newXP, true, true); + fig.getPlayer().getActionSender().sendStat(x); + } + break; + case 1: + fig.getPlayer().incExp(2, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(2); + break; + case 2: + fig.getPlayer().incExp(0, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(0); + break; + case 3: + fig.getPlayer().incExp(1, newXP * 3, true, true); + fig.getPlayer().getActionSender().sendStat(1); + break; + } + fig.getPlayer().incExp(3, newXP, true); + fig.getPlayer().getActionSender().sendStat(3); + } + } + } + if(!(affectedMob instanceof Player)) + affectedMob.killedBy(toLoot, owner.isDueling()); + } + } + finalizeSpell(owner, spell); + if (newHp > 0) { + if (affectedMob instanceof Npc) { + final Npc npc = (Npc) affectedMob; + + if (npc.isBusy() || npc.getChasing() != null) + return; + + npc.resetPath(); + npc.setChasing(player); + + // Radius is 0 to prevent wallhacking by + // NPCs. Easiest method I can come up with + // for now. + Instance.getDelayedEventHandler().add(new WalkMobToMobEvent(affectedMob, owner, 0) { + public void arrived() { + if (affectedMob.isBusy() || owner.isBusy()) { + npc.setChasing(null); + return; + } + if (affectedMob.inCombat() || owner.inCombat()) { + npc.setChasing(null); + return; + } + + npc.resetPath(); + player.resetAll(); + player.resetPath(); + if (npc.isScripted()) + Instance.getPluginHandler().getNpcAIHandler(npc.getID()).onNpcAttack(npc, player); + player.setBusy(true); + player.setStatus(Action.FIGHTING_MOB); + player.getActionSender().sendSound("underattack"); + player.getActionSender().sendMessage("You are under attack!"); + + npc.setLocation(player.getLocation(), true); + for (Player p : npc.getViewArea().getPlayersInView()) + p.removeWatchedNpc(npc); + + player.setSprite(9); + player.setOpponent(npc); + player.setCombatTimer(); + + npc.setBusy(true); + npc.setSprite(8); + npc.setOpponent(player); + npc.setCombatTimer(); + + npc.setChasing(null); + FightEvent fighting = new FightEvent(player, npc, true); + fighting.setLastRun(0); + world.getDelayedEventHandler().add(fighting); + } + + public void failed() { + npc.setChasing(null); + } + }); + } + } + break; + } + owner.getActionSender().sendInventory(); + owner.getActionSender().sendStat(6); + } + }); + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if ((player.isBusy() && !player.inCombat()) || player.isRanging()) { + return; + } + + if (player.isDueling() && player.getDuelSetting(1)) { + player.getActionSender().sendMessage("Magic is disabled in this duel"); + return; + } + player.resetAllExceptDueling(); + int idx = p.readShort(); + if (idx < 0 || idx >= 49) { + player.setSuspiciousPlayer(true); + return; + } + if (!canCast(player)) { + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " tried to cast spell ("+49+"): " + player.getX() + "/" + player.getY())); + + SpellDef spell = EntityHandler.getSpellDef(idx); + if (player.getCurStat(6) < spell.getReqLevel()) { + player.setSuspiciousPlayer(true); + player.getActionSender().sendMessage("Your magic ability is not high enough for this spell."); + player.resetPath(); + return; + } + if (!Formulae.castSpell(spell, player.getCurStat(6), player.getMagicPoints())) { + player.getActionSender().sendMessage("The spell fails, you may try again in 20 seconds."); + player.getActionSender().sendSound("spellfail"); + player.setSpellFail(); + player.resetPath(); + return; + } + switch (pID) { + case 206: // Cast on self + if (player.isDueling()) { + player.getActionSender().sendMessage("This type of spell cannot be used in a duel."); + return; + } + + if (spell.getSpellType() == 0) { + + handleTeleport(player, spell, idx); + return; + } + // if(spell.getSpellType() == 6) { + handleGroundCast(player, spell, idx); + // } + break; + case 55: // Cast on player + if (spell.getSpellType() == 1 || spell.getSpellType() == 2) { + Player affectedPlayer = world.getPlayer(p.readShort()); + if (affectedPlayer == null) { // This shouldn't happen + player.resetPath(); + return; + } + if (player.withinRange(affectedPlayer, 5)) { + player.resetPath(); + } + handleMobCast(player, affectedPlayer, idx); + } + // if(spell.getSpellType() == 6) { + // handleGroundCast(player, spell); + // } + break; + case 71: // Cast on npc + if (player.isDueling()) { + return; + } + if (spell.getSpellType() == 2) { + Npc affectedNpc = world.getNpc(p.readShort()); + if (affectedNpc == null) { // This shouldn't happen + player.resetPath(); + return; + } + + if (affectedNpc.inCombat() && World.getQuestManager().isNpcAssociated(affectedNpc, player)) { + if (player.getOpponent() != null && player.getOpponent().equals(affectedNpc)) { + } else { + player.getActionSender().sendMessage("You can't cast spells on the " + affectedNpc.getDef().getName() + " while it's in combat!"); + player.resetPath(); + return; + } + } + if (affectedNpc.getID() == 35) { + player.getActionSender().sendMessage("Delrith can not be attacked without the Silverlight sword"); + return; + } + if (player.withinRange(affectedNpc, 5)) { + player.resetPath(); + } + handleMobCast(player, affectedNpc, idx); + } + // if(spell.getSpellType() == 6) { + // handleGroundCast(player, spell); + // } + break; + case 49: // Cast on inventory item + if (player.isDueling()) { + player.getActionSender().sendMessage("This type of spell cannot be used in a duel."); + return; + } + if (spell.getSpellType() == 3) { + InvItem item = player.getInventory().get(p.readShort()); + if (item == null) { // This shoudln't happen + player.resetPath(); + return; + } + handleInvItemCast(player, spell, idx, item); + } + // if(spell.getSpellType() == 6) { + // handleGroundCast(player, spell); + // } + break; + case 67: // Cast on door - type 4 + if (player.isDueling()) { + player.getActionSender().sendMessage("This type of spell cannot be used in a duel."); + return; + } + player.getActionSender().sendMessage("@or1@This type of spell is not yet implemented."); + // if(spell.getSpellType() == 6) { + // handleGroundCast(player, spell); + // } + break; + case 17: // Cast on game object - type 5 + if (player.isDueling()) { + player.getActionSender().sendMessage("This type of spell cannot be used in a duel."); + return; + } + player.getActionSender().sendMessage("@or1@This type of spell is not yet implemented."); + // if(spell.getSpellType() == 6) { + // handleGroundCast(player, spell); + // } + break; + case 104: // Cast on ground item + if (player.isDueling()) { + player.getActionSender().sendMessage("This type of spell cannot be used in a duel."); + return; + } + ActiveTile t = world.getTile(p.readShort(), p.readShort()); + int itemId = p.readShort(); + Item affectedItem = null; + for (Item i : t.getItems()) { + if (i.getID() == itemId && i.visibleTo(player)) { + affectedItem = i; + break; + } + } + t.cleanItself(); + if (affectedItem == null) { // This shouldn't happen + return; + } + handleItemCast(player, spell, idx, affectedItem); + break; + case 232: // Cast on ground - type 6 + if (player.isDueling()) { + player.getActionSender().sendMessage("This type of spell cannot be used in a duel."); + return; + } + // if(spell.getSpellType() == 6) { + handleGroundCast(player, spell, idx); + // } + break; + } + player.getActionSender().sendInventory(); + player.getActionSender().sendStat(6); + }// System.out + + private void handleTeleport(Player player, SpellDef spell, int id) { + + if(player.inCombat()) { + return; + } + if (player.getLocation().wildernessLevel() >= 20 || (player.getLocation().inModRoom() && !player.isMod())) { + player.getActionSender().sendMessage("A magical force stops you from teleporting."); + return; + } + if (!checkAndRemoveRunes(player, spell)) { + return; + } + switch (id) { + case 12: // Varrock + player.teleport(122, 503, true); + break; + case 15: // Lumbridge + player.teleport(118, 649, true); + break; + case 18: // Falador + player.teleport(313, 550, true); + break; + case 22: // Camalot + player.teleport(465, 456, true); + break; + case 26: // Ardougne + player.teleport(585, 621, true); + break; + case 31: // Watchtower + player.teleport(637, 2628, true); + break; + case 37: // Lost city + player.teleport(131, 3544, true); + break; + } + finalizeSpell(player, spell); + player.getActionSender().sendInventory(); + } + + public final int Rand(int low, int high) { + return low + r.nextInt(high - low); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/StyleHandler.java b/GameServer/src/msc/gs/phandler/client/StyleHandler.java new file mode 100644 index 0000000..aa1ad19 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/StyleHandler.java @@ -0,0 +1,27 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class StyleHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int style = p.readByte(); + if (style < 0 || style > 3) { + player.setSuspiciousPlayer(true); + return; + } + player.setCombatStyle(style); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/client/TalkToNpcHandler.java b/GameServer/src/msc/gs/phandler/client/TalkToNpcHandler.java new file mode 100644 index 0000000..f2d791c --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/TalkToNpcHandler.java @@ -0,0 +1,132 @@ +package msc.gs.phandler.client; + +import java.lang.reflect.InvocationTargetException; +import java.util.ConcurrentModificationException; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.event.WalkToMobEvent; +import msc.gs.model.ChatMessage; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Script; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.npchandler.NpcHandler; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.util.Logger; + +public class TalkToNpcHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + if (player.isBusy()) { + player.resetPath(); + return; + } + if (System.currentTimeMillis() - player.lastNPCChat < 1500) + return; + player.setLastQuestMenuReply(-2); + player.lastNPCChat = System.currentTimeMillis(); + player.resetAll(); + final Npc affectedNpc = world.getNpc(p.readShort()); + if (affectedNpc == null || !world.getQuestManager().isNpcVisible(affectedNpc, player)) { + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " talked to NPC ("+affectedNpc.getID()+") at: " + player.getX() + "/" + player.getY() + "|" + affectedNpc.getX() + "/" + affectedNpc.getY())); + + + player.setFollowing(affectedNpc); + player.setStatus(Action.TALKING_MOB); + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedNpc, 1) { + public void arrived() { + owner.resetFollowing(); + owner.resetPath(); + if (owner.isBusy() || owner.isRanging() || !owner.nextTo(affectedNpc) || owner.getStatus() != Action.TALKING_MOB) { + return; + } + owner.resetAll(); + if (affectedNpc.isBusy()) { + owner.getActionSender().sendMessage(affectedNpc.getDef().getName() + " is currently busy."); + return; + } + affectedNpc.resetPath(); + NpcHandler handler = world.getNpcHandler(affectedNpc.getID()); + + if (Formulae.getDirection(owner, affectedNpc) != -1) { + affectedNpc.setSprite(Formulae.getDirection(owner, affectedNpc)); + owner.setSprite(Formulae.getDirection(affectedNpc, owner)); + } + if (handler != null) { + try { + handler.handleNpc(affectedNpc, owner); + } catch (Exception e) { + Logger.error("Exception with npc[" + affectedNpc.getIndex() + "] from " + owner.getUsername() + " [" + owner.getCurrentIP() + "]: " + e.getMessage()); + owner.getActionSender().sendLogout(); + owner.destroy(false); + } + } else { + + if (!world.getQuestManager().handleNpcTalk(affectedNpc, owner)) { + if (affectedNpc.getDef().isAttackable()) + owner.getActionSender().sendMessage("The " + affectedNpc.getDef().getName() + " doesn't appear interested in talking."); + else if (world.npcScripts.containsKey(affectedNpc.getID())) { + owner.setBusy(true); + affectedNpc.blockedBy(owner); + if (owner.interpreterThread != null) { + try { + owner.interpreterThread.stop(); + } catch (Exception e) { + + } + } + + owner.interpreterThread = new Thread(new Runnable() { + public void run() { + try { + try { + new Script(owner, affectedNpc); + } catch (ConcurrentModificationException cme) { + Logger.println("CME (Ignore This): " + owner.getUsername()); + } catch(Exception e) { + + } + owner.setBusy(false); + + affectedNpc.unblock(); + } catch (Exception e) { + if (!(e instanceof InvocationTargetException)) { + e.printStackTrace(); + } + System.out.println(affectedNpc.getID()); + affectedNpc.unblock(); + owner.setBusy(false); + } + } + }); + owner.interpreterThread.start(); + } else { + try { + NpcHandler hand = new msc.gs.npchandler.OtherNPC(); + hand.handleNpc(affectedNpc, owner); + } catch (Exception e) { + Logger.error("Exception with npc[" + affectedNpc.getIndex() + "] from " + owner.getUsername() + " [" + owner.getCurrentIP() + "]: " + e.getMessage()); + owner.getActionSender().sendLogout(); + owner.destroy(false); + } + } + } + + } + } + }); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/TradeHandler.java b/GameServer/src/msc/gs/phandler/client/TradeHandler.java new file mode 100644 index 0000000..3fecf72 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/TradeHandler.java @@ -0,0 +1,316 @@ +package msc.gs.phandler.client; + +import java.util.ArrayList; + +import org.apache.mina.common.IoSession; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.builders.ls.MiscPacketBuilder; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.db.DBConnection; +import msc.gs.external.ItemDef; +import msc.gs.model.InvItem; +import msc.gs.model.Inventory; +import msc.gs.model.PathGenerator; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.tools.DataConversions; +import msc.gs.util.Logger; + +public class TradeHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + private boolean busy(Player player) { + return player.isBusy() || player.isRanging() || player.accessingBank() || player.isDueling(); + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + Player affectedPlayer; + + if (busy(player)) { + affectedPlayer = player.getWishToTrade(); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + switch (pID) { + case 166: // Sending trade request + affectedPlayer = world.getPlayer(p.readShort()); + if (affectedPlayer == null) + return; + if (affectedPlayer.isTrading()) { + player.getActionSender().sendMessage("That person is already trading"); + return; + } + if (affectedPlayer == null || affectedPlayer.isDueling() || !player.withinRange(affectedPlayer, 8) || player.isTrading() || player.tradeDuelThrottling()) { + unsetOptions(player); + return; + } + if (player == null) { + Logger.println("Player is null affectedplayer is: " + affectedPlayer.getUsername()); + } + if (affectedPlayer == player) { + player.setSuspiciousPlayer(true); + Logger.println("Warning: " + player.getUsername() + " tried to trade to himself."); + unsetOptions(player); + return; + } + if (!new PathGenerator(player.getX(), player.getY(), affectedPlayer.getX(), affectedPlayer.getY()).isValid()) { + player.getActionSender().sendMessage("you can't reach this person"); + unsetOptions(player); + return; + } + + if ((affectedPlayer.getPrivacySetting(2) && !affectedPlayer.isFriendsWith(player.getUsernameHash())) || affectedPlayer.isIgnoring(player.getUsernameHash())) { + player.getActionSender().sendMessage("This player has trade requests blocked."); + return; + } + + player.setWishToTrade(affectedPlayer); + player.getActionSender().sendMessage(affectedPlayer.isTrading() ? affectedPlayer.getUsername() + " is already in a trade" : "Sending trade request"); + affectedPlayer.getActionSender().sendMessage(player.getUsername() + " wishes to trade with you"); + + if (!player.isTrading() && affectedPlayer.getWishToTrade() != null && affectedPlayer.getWishToTrade().equals(player) && !affectedPlayer.isTrading()) { + player.setTrading(true); + player.resetPath(); + player.resetAllExceptTrading(); + affectedPlayer.setTrading(true); + affectedPlayer.resetPath(); + affectedPlayer.resetAllExceptTrading(); + + player.getActionSender().sendTradeWindowOpen(); + affectedPlayer.getActionSender().sendTradeWindowOpen(); + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " sent trade request " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + } + break; + case 211: // Trade accepted + affectedPlayer = player.getWishToTrade(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + + player.setTradeOfferAccepted(true); + + player.getActionSender().sendTradeAcceptUpdate(); + affectedPlayer.getActionSender().sendTradeAcceptUpdate(); + + if (affectedPlayer.isTradeOfferAccepted()) { + player.getActionSender().sendTradeAccept(); + affectedPlayer.getActionSender().sendTradeAccept(); + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " accepted trade " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + break; + case 53: // Confirm accepted + affectedPlayer = player.getWishToTrade(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading() || !player.isTradeOfferAccepted() || !affectedPlayer.isTradeOfferAccepted()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + player.setTradeConfirmAccepted(true); + + if (affectedPlayer.isTradeConfirmAccepted()) { + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " finished trade " + affectedPlayer.getUsername() + " at: " + player.getX() + "/" + player.getY() + " | " + affectedPlayer.getX() + "/" + affectedPlayer.getY())); + + ArrayList myOffer = player.getTradeOffer(); + ArrayList theirOffer = affectedPlayer.getTradeOffer(); + + int myRequiredSlots = player.getInventory().getRequiredSlots(theirOffer); + int myAvailableSlots = (30 - player.getInventory().size()) + player.getInventory().getFreedSlots(myOffer); + + int theirRequiredSlots = affectedPlayer.getInventory().getRequiredSlots(myOffer); + int theirAvailableSlots = (30 - affectedPlayer.getInventory().size()) + affectedPlayer.getInventory().getFreedSlots(theirOffer); + + if (theirRequiredSlots > theirAvailableSlots) { + player.getActionSender().sendMessage("The other player does not have room to accept your items."); + affectedPlayer.getActionSender().sendMessage("You do not have room in your inventory to hold those items."); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + if (myRequiredSlots > myAvailableSlots) { + player.getActionSender().sendMessage("You do not have room in your inventory to hold those items."); + affectedPlayer.getActionSender().sendMessage("The other player does not have room to accept your items."); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + + for (InvItem item : myOffer) { + InvItem affectedItem = player.getInventory().get(item); + if (affectedItem == null) { + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + + } + if (affectedItem.isWielded()) { + affectedItem.setWield(false); + player.updateWornItems(affectedItem.getWieldableDef().getWieldPos(), player.getPlayerAppearance().getSprite(affectedItem.getWieldableDef().getWieldPos())); + } + player.getInventory().remove(item); + } + for (InvItem item : theirOffer) { + InvItem affectedItem = affectedPlayer.getInventory().get(item); + if (affectedItem == null) { + affectedPlayer.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + if (item.getDef().isMembers() && !World.isMembers()) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + if (affectedItem.isWielded()) { + affectedItem.setWield(false); + affectedPlayer.updateWornItems(affectedItem.getWieldableDef().getWieldPos(), affectedPlayer.getPlayerAppearance().getSprite(affectedItem.getWieldableDef().getWieldPos())); + } + affectedPlayer.getInventory().remove(item); + } + MiscPacketBuilder loginServer = Instance.getServer().getLoginConnector().getActionSender(); + long playerhash = DataConversions.usernameToHash(player.getUsername()); + long affectedPlayerhash = DataConversions.usernameToHash(affectedPlayer.getUsername()); + for (InvItem item : myOffer) { + affectedPlayer.getInventory().add(item); + } + for (InvItem item : theirOffer) { + player.getInventory().add(item); + + } + boolean senddata = false; + for (InvItem item : myOffer) { + loginServer.tradeLog(playerhash, affectedPlayerhash, item.getID(), item.getAmount(), player.getX(), player.getY(), 1); + if(item.getAmount() > 10000000 || Formulae.isRareItem(item.getID())) + senddata = true; + } + if(senddata) + DBConnection.getReport().submitDupeData(DataConversions.hashToUsername(playerhash),playerhash); + senddata = false; + for (InvItem item : theirOffer) { + loginServer.tradeLog(affectedPlayerhash, playerhash, item.getID(), item.getAmount(), player.getX(), player.getY(), 1); + if(item.getAmount() > 10000000 || Formulae.isRareItem(item.getID())) + senddata = true; + } + if(senddata) + DBConnection.getReport().submitDupeData(DataConversions.hashToUsername(affectedPlayerhash),affectedPlayerhash); + + player.getActionSender().sendInventory(); + player.getActionSender().sendEquipmentStats(); + Long now = System.currentTimeMillis(); + player.save(); + player.setLastSaveTime(now); + affectedPlayer.save(); + affectedPlayer.setLastSaveTime(now); + player.getActionSender().sendMessage("Trade completed."); + + affectedPlayer.getActionSender().sendInventory(); + affectedPlayer.getActionSender().sendEquipmentStats(); + affectedPlayer.getActionSender().sendMessage("Trade completed."); + + unsetOptions(player); + unsetOptions(affectedPlayer); + } + break; + case 216: // Trade declined + affectedPlayer = player.getWishToTrade(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + affectedPlayer.getActionSender().sendMessage(player.getUsername() + " has declined the trade."); + + unsetOptions(player); + unsetOptions(affectedPlayer); + break; + case 70: // Receive offered item data + affectedPlayer = player.getWishToTrade(); + if (affectedPlayer == null || busy(affectedPlayer) || !player.isTrading() || !affectedPlayer.isTrading() || (player.isTradeOfferAccepted() && affectedPlayer.isTradeOfferAccepted()) || player.isTradeConfirmAccepted() || affectedPlayer.isTradeConfirmAccepted()) { // This + // shouldn't + // happen + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + + player.setTradeOfferAccepted(false); + player.setTradeConfirmAccepted(false); + affectedPlayer.setTradeOfferAccepted(false); + affectedPlayer.setTradeConfirmAccepted(false); + + // player.getActionSender().sendTradeAcceptUpdate(); + // affectedPlayer.getActionSender().sendTradeAcceptUpdate(); + + Inventory tradeOffer = new Inventory(); + player.resetTradeOffer(); + int count = (int) p.readByte(); + for (int slot = 0; slot < count; slot++) { + InvItem tItem = new InvItem(p.readShort(), p.readInt()); + if (tItem.getAmount() < 1) { + player.setSuspiciousPlayer(true); + player.setRequiresOfferUpdate(true); + continue; + } + ItemDef def = tItem.getDef(); + if (!def.canTrade() && !player.isMod()) { + player.getActionSender().sendMessage(def.getName() + " cannot be traded with other players"); + player.setRequiresOfferUpdate(true); + continue; + } + tradeOffer.add(tItem); + } + for (InvItem item : tradeOffer.getItems()) { + if (tradeOffer.countId(item.getID()) > player.getInventory().countId(item.getID())) { + player.setSuspiciousPlayer(true); + unsetOptions(player); + unsetOptions(affectedPlayer); + return; + } + player.addToTradeOffer(item); + } + player.setRequiresOfferUpdate(true); + break; + } + } + + private void unsetOptions(Player p) { + if (p == null) { + return; + } + p.resetTrading(); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/Trap.java b/GameServer/src/msc/gs/phandler/client/Trap.java new file mode 100644 index 0000000..8397e65 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/Trap.java @@ -0,0 +1,22 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class Trap implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + Logger.event(player.getUsername() + " [" + player.getUsernameHash() + "] was caught by a trap!"); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/TrapHandler.java b/GameServer/src/msc/gs/phandler/client/TrapHandler.java new file mode 100644 index 0000000..33dc9eb --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/TrapHandler.java @@ -0,0 +1,22 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class TrapHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + Logger.event("[BOT] " + player.getUsername() + " [" + player.getUsernameHash() + "] was caught using Methoxy!"); + } +} diff --git a/GameServer/src/msc/gs/phandler/client/WalkRequest.java b/GameServer/src/msc/gs/phandler/client/WalkRequest.java new file mode 100644 index 0000000..0347be5 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/WalkRequest.java @@ -0,0 +1,158 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.FightEvent; +import msc.gs.event.MiniEvent; +import msc.gs.event.WalkMobToMobEvent; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Path; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.states.Action; +import msc.gs.states.CombatState; + +public class WalkRequest implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.inCombat()) { + if (pID == 132) { + Mob opponent = player.getOpponent(); + if (opponent == null) { // This shouldn't happen + player.setSuspiciousPlayer(true); + return; + } + if (opponent.getHitsMade() >= 3) { + if (player.isDueling() && player.getDuelSetting(0)) { + player.getActionSender().sendMessage("Running has been disabled in this duel."); + return; + } + player.lastRun = System.currentTimeMillis(); + player.resetCombat(CombatState.RUNNING); + + if(player.isInfected() && System.currentTimeMillis() - player.getLastMoved() < 1900) { + final Packet newpacket = p; + final IoSession newsession = session; + Instance.getDelayedEventHandler().add(new MiniEvent(player, 2000) { + public void action() { + try { + handlePacket(newpacket, newsession); + } catch(Exception e) { + return; + } + } + }); + } + player.isMining(false); + if (opponent instanceof Npc) { + Npc n = (Npc) opponent; + n.unblock(); + opponent.resetCombat(CombatState.WAITING); + if (n.getDef().aggressive) { + player.lastNpcChasingYou = n; + Instance.getDelayedEventHandler().add(new MiniEvent(player, 2000) { + public void action() { + + final Npc npc = owner.lastNpcChasingYou; + owner.lastNpcChasingYou = null; + if (npc.isBusy() || npc.getChasing() != null) + return; + + npc.resetPath(); + npc.setChasing(owner); + + Instance.getDelayedEventHandler().add(new WalkMobToMobEvent(npc, owner, 0) { + public void arrived() { + if (affectedMob.isBusy() || owner.isBusy()) { + npc.setChasing(null); + return; + } + if (affectedMob.inCombat() || owner.inCombat()) { + npc.setChasing(null); + return; + } + Player player = (Player) affectedMob; + player.resetPath(); + player.setBusy(true); + npc.resetPath(); + player.resetAll(); + player.setStatus(Action.FIGHTING_MOB); + player.getActionSender().sendSound("underattack"); + player.getActionSender().sendMessage("You are under attack!"); + + npc.setLocation(player.getLocation(), true); + for (Player p : npc.getViewArea().getPlayersInView()) + p.removeWatchedNpc(npc); + player.setBusy(true); + player.setSprite(9); + player.setOpponent(npc); + player.setCombatTimer(); + + npc.setBusy(true); + npc.setSprite(8); + npc.setOpponent(player); + npc.setCombatTimer(); + npc.setChasing(null); + FightEvent fighting = new FightEvent(player, npc, true); + fighting.setLastRun(0); + world.getDelayedEventHandler().add(fighting); + } + + public void failed() { + npc.setChasing(null); + } + }); + } + }); + } + + } else { + opponent.resetCombat(CombatState.WAITING); + } + } else { + player.getActionSender().sendMessage("You cannot retreat in the first 3 rounds of battle."); + return; + } + } else { + return; + } + } else if (player.isBusy() && System.currentTimeMillis() - player.lastMineTimer > 2000) { + return; + } + + if (System.currentTimeMillis() - player.lastCast < 600) + return; + + player.isMining(false); + player.resetAll(); + + int startX = p.readShort(); + int startY = p.readShort(); + int numWaypoints = p.remaining() / 2; + byte[] waypointXoffsets = new byte[numWaypoints]; + byte[] waypointYoffsets = new byte[numWaypoints]; + for (int x = 0; x < numWaypoints; x++) { + waypointXoffsets[x] = p.readByte(); + waypointYoffsets[x] = p.readByte(); + } + Path path = new Path(startX, startY, waypointXoffsets, waypointYoffsets); + if(player.blink() && waypointXoffsets.length >= 1) { + player.teleport((int)waypointXoffsets[waypointXoffsets.length-1] + startX, (int)waypointYoffsets[waypointYoffsets.length-1] + startY, false); + return; + } + player.setStatus(Action.IDLE); + player.setPath(path); + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/WallObjectAction.java b/GameServer/src/msc/gs/phandler/client/WallObjectAction.java new file mode 100644 index 0000000..5b7dc69 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/WallObjectAction.java @@ -0,0 +1,427 @@ +package msc.gs.phandler.client; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.Server; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.event.ShortEvent; +import msc.gs.event.WalkToPointEvent; +import msc.gs.external.DoorDef; +import msc.gs.external.EntityHandler; +import msc.gs.model.ActiveTile; +import msc.gs.model.ChatMessage; +import msc.gs.model.GameObject; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.model.snapshot.Activity; +import msc.gs.phandler.PacketHandler; +import msc.gs.plugins.extras.Thieving; +import msc.gs.states.Action; + +public class WallObjectAction implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy()) { + player.resetPath(); + return; + } + player.resetAll(); + ActiveTile t = world.getTile(p.readShort(), p.readShort()); + final GameObject object = t.getGameObject(); + final int click = pID == 126 ? 0 : 1; + if (object == null) { + t.cleanItself(); + player.setSuspiciousPlayer(true); + return; + } + world.addEntryToSnapshots(new Activity(player.getUsername(), player.getUsername() + " used a door ("+object.getID()+") at: " + player.getX() + "/" + player.getY())); + + if (world.getQuestManager().handleObject(object, player, click == 1)) + return; + player.setStatus(Action.USING_DOOR); + Instance.getDelayedEventHandler().add(new WalkToPointEvent(player, object.getLocation(), 1, false) { + public void arrived() { + owner.resetPath(); + DoorDef def = object.getDoorDef(); + if (owner.isBusy() || owner.isRanging() || !owner.nextTo(object) || def == null || owner.getStatus() != Action.USING_DOOR) { + return; + }// /126 + if (object.getX() == 282 && object.getY() == 185) + return; + if (object.getX() == 285 && object.getY() == 185) + return; + if (object.getX() == 59 && object.getY() == 573) + return; + if (object.getX() == 196 && object.getY() == 3266) + return; + if (!Server.isMembers()) { + if (object.getX() == 126 && object.getY() == 686) + return; + } + if (object.getID() == 77) { + owner.getActionSender().sendMessage("You search the " + def.name + "..."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.getActionSender().sendMessage("You see a key but can't quite reach it"); + return; + } + }); + } + // if(object.getID() == 58) { + // owner.getActionSender().sendMessage("It seems this wall can not be opened right now"); + // return; + // } + owner.resetAll(); + String command = (click == 0 ? def.getCommand1() : def.getCommand2()).toLowerCase(); + Point telePoint = EntityHandler.getObjectTelePoint(object.getLocation(), command); + + if (telePoint != null) { + owner.teleport(telePoint.getX(), telePoint.getY(), false); + } + + else { + + if (command.equals("pick lock")) { + if (!World.isMembers()) { + owner.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + if (owner.getSpam()) { + return; + } + Thieving thiev = new Thieving(owner, object); + owner.setSpam(true); + thiev.lockpick(); + return; + } + + switch (object.getID()) { + case 487: + if (object.getX() != 282 || object.getY() != 3020) { + break; + } + if(System.currentTimeMillis() - owner.getLastMoved() < 10000) { + owner.getActionSender().sendMessage("You must stand still for 10 seconds before using this"); + return; + } + owner.teleport(567, 3330, false); + return; + + case 20: + case 44: + replaceGameObject(1, true); + break; + case 1: + replaceGameObject(2, false); + break; + case 2: + replaceGameObject(1, true); + break; + case 9: + replaceGameObject(8, false); + break; + case 8: + replaceGameObject(9, true); + break; + + case 94: + case 23: + owner.getActionSender().sendMessage("The door is locked"); + break; + case 112: // Fishing Guild Door + if (object.getX() != 586 || object.getY() != 524) { + break; + } + if (owner.getY() > 523) { + if (owner.getCurStat(10) < 68) { + owner.setBusy(true); + Npc masterFisher = world.getNpc(368, 582, 588, 524, 527); + if (masterFisher != null) { + owner.informOfNpcMessage(new ChatMessage(masterFisher, "Hello only the top fishers are allowed in here", owner)); + } + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a fishing level of 68 to enter"); + } + }); + } else { + doDoor(); + owner.teleport(586, 523, false); + } + } else { + doDoor(); + owner.teleport(586, 524, false); + } + break; + case 55: // Mining Guild Door + //Hi jacking for champs etc guild doors. + if (object.getX() == 150 && object.getY() == 554) { // Champs + if(owner.getY() >= 554) { doDoor(); owner.teleport(150, 553, false); return; } + if(owner.getSkillTotal() < 600) { owner.getActionSender().sendMessage("You need a skill total of 600 or more to enter"); return; } + doDoor(); + owner.teleport(150,554, false); + return; + } + if (object.getX() == 372 && object.getY() == 441) { // Heroes + if(owner.getY() <= 440) { doDoor(); owner.teleport(372, 441, false); return; } + if(owner.getSkillTotal() < 850) { owner.getActionSender().sendMessage("You need a skill total of 850 or more to enter"); return; } + doDoor(); + owner.teleport(372,440, false); + return; + } + //Legends guild gate is done in ObjectAction + + if (object.getX() != 268 || object.getY() != 3381) { + break; + } + if (owner.getY() <= 3380) { + if (owner.getCurStat(14) < 60) { + owner.setBusy(true); + Npc dwarf = world.getNpc(191, 265, 270, 3379, 3380); + if (dwarf != null) { + owner.informOfNpcMessage(new ChatMessage(dwarf, "Hello only the top miners are allowed in here", owner)); + } + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a mining level of 60 to enter"); + } + }); + } else { + doDoor(); + owner.teleport(268, 3381, false); + } + } else { + doDoor(); + owner.teleport(268, 3380, false); + } + break; + case 68: // Crafting Guild Door + if (object.getX() != 347 || object.getY() != 601) { + return; + } + if (owner.getY() <= 600) { + if (owner.getCurStat(12) < 40) { + owner.setBusy(true); + Npc master = world.getNpc(231, 341, 349, 599, 612); + if (master != null) { + owner.informOfNpcMessage(new ChatMessage(master, "Hello only the top crafters are allowed in here", owner)); + } + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a crafting level of 40 to enter"); + } + }); + } else if (!owner.getInventory().wielding(191)) { + Npc master = world.getNpc(231, 341, 349, 599, 612); + if (master != null) { + owner.informOfNpcMessage(new ChatMessage(master, "Where is your apron?", owner)); + } + } else { + doDoor(); + owner.teleport(347, 601, false); + } + } else { + doDoor(); + owner.teleport(347, 600, false); + } + break; + case 43: // Cooking Guild Door + if (object.getX() != 179 || object.getY() != 488) { + break; + } + if (owner.getY() >= 488) { + if (owner.getCurStat(7) < 32) { + owner.setBusy(true); + Npc chef = world.getNpc(133, 176, 181, 480, 487); + if (chef != null) { + owner.informOfNpcMessage(new ChatMessage(chef, "Hello only the top cooks are allowed in here", owner)); + } + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a cooking level of 32 to enter"); + } + }); + } else if (!owner.getInventory().wielding(192)) { + Npc chef = world.getNpc(133, 176, 181, 480, 487); + if (chef != null) { + owner.informOfNpcMessage(new ChatMessage(chef, "Where is your chef's hat?", owner)); + } + } else { + doDoor(); + owner.teleport(179, 487, false); + } + } else { + doDoor(); + owner.teleport(179, 488, false); + } + break; + + case 146: // Magic Guild Door + if (object.getX() != 599 || object.getY() != 757) { + break; + } + if (owner.getX() <= 598) { + if (owner.getCurStat(6) < 66) { + owner.setBusy(true); + Npc wizard = world.getNpc(513, 596, 597, 755, 758); + if (wizard != null) { + owner.informOfNpcMessage(new ChatMessage(wizard, "Hello only the top wizards are allowed in here", owner)); + } + world.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + owner.getActionSender().sendMessage("You need a magic level of 66 to enter"); + } + }); + } else { + doDoor(); + owner.teleport(599, 757, false); + } + } else { + doDoor(); + owner.teleport(598, 757, false); + } + break; + case 74: // Heroes guild door + if (object.getX() != 372 || object.getY() != 441) { + return; + } + doDoor(); + if (owner.getY() >= 441) { + owner.teleport(372, 440, false); + } else { + owner.teleport(372, 441, false); + } + break; + case 22: // edge dungeon wall + if (object.getX() == 219 && object.getY() == 3282) { + owner.getActionSender().sendSound("secretdoor"); + world.unregisterGameObject(object); + world.delayedSpawnObject(object.getLoc(), 1000); + owner.getActionSender().sendMessage("You just went through a secret door"); + if (owner.getX() <= 218) { + owner.teleport(219, 3282, false); + } else { + owner.teleport(218, 3282, false); + } + } else { + owner.getActionSender().sendMessage("Nothing interesting happens"); + } + break; + case 58: // Karamja -> cranador wall + if (object.getX() != 406 || object.getY() != 3518) { + return; + } + doDoor(); + if (owner.getY() <= 3517) { + owner.teleport(406, 3518, false); + } else { + owner.teleport(406, 3517, false); + } + break; + case 101: // Woodcutting guild secret + // exit + if (object.getX() != 540 || object.getY() != 445) { + return; + } + if (owner.getX() >= 540) { + owner.getActionSender().sendMessage("You push your way through"); + owner.teleport(539, 445, false); + } else { + owner.getActionSender().sendMessage("You can't seem to get through"); + } + break; + case 38: // Black Knight Guard Door + if (object.getX() != 271 || object.getY() != 441) { + return; + } + if (owner.getX() <= 270) { + if (!owner.getInventory().wielding(7) || !owner.getInventory().wielding(104)) { + owner.getActionSender().sendMessage("Only guards are allowed in there!"); + return; + } + doDoor(); + owner.teleport(271, 441, false); + } else { + doDoor(); + owner.teleport(270, 441, false); + } + break; + case 36: // Draynor mansion front door + if (object.getX() != 210 || object.getY() != 553) { + return; + } + if (owner.getY() >= 553) { + doDoor(); + owner.teleport(210, 552, false); + } else { + owner.getActionSender().sendMessage("The door is locked shut"); + } + break; + case 37: // Draynor mansion back door + if (object.getX() != 199 || object.getY() != 551) { + return; + } + if (owner.getY() >= 551) { + doDoor(); + owner.teleport(199, 550, false); + } else { + owner.getActionSender().sendMessage("The door is locked shut"); + } + break; + case 60: // Melzars made (coming out + // only) + if (owner.getX() > 337) { + doDoor(); + owner.teleport(337, owner.getY(), false); + } else { + owner.getActionSender().sendMessage("The door is locked shut"); + } + break; + case 30: // Locked Doors + owner.getActionSender().sendMessage("The door is locked shut"); + break; + default: + owner.getActionSender().sendMessage("Nothing interesting happens."); + break; + } + } + } + + private void doDoor() { + owner.getActionSender().sendSound("opendoor"); + world.registerGameObject(new GameObject(object.getLocation(), 11, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), 1000); + } + + private void replaceGameObject(int newID, boolean open) { + if (open) { + owner.getActionSender().sendMessage("The door swings open"); + } else { + owner.getActionSender().sendMessage("The door creaks shut"); + } + world.registerGameObject(new GameObject(object.getLocation(), newID, object.getDirection(), object.getType())); + owner.getActionSender().sendSound(open ? "opendoor" : "closedoor"); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/GameServer/src/msc/gs/phandler/client/WieldHandler.java b/GameServer/src/msc/gs/phandler/client/WieldHandler.java new file mode 100644 index 0000000..d2fa40a --- /dev/null +++ b/GameServer/src/msc/gs/phandler/client/WieldHandler.java @@ -0,0 +1,164 @@ +package msc.gs.phandler.client; + +import java.util.ArrayList; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import msc.config.Constants; +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.connection.Packet; +import msc.gs.connection.RSCPacket; +import msc.gs.external.EntityHandler; +import msc.gs.model.InvItem; +import msc.gs.model.Player; +import msc.gs.model.Script; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.quest.Quest; + +public class WieldHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + Player player = (Player) session.getAttachment(); + int pID = ((RSCPacket) p).getID(); + if (player.isBusy() && !player.inCombat()) { + return; + }// F2P + if (player.isDueling() && player.getDuelSetting(3)) { + player.getActionSender().sendMessage("Armour is disabled in this duel"); + return; + } + player.resetAllExceptDueling(); + int idx = (int) p.readShort(); + if (idx < 0 || idx >= 30) { + player.setSuspiciousPlayer(true); + return; + }// if(true) + InvItem item = player.getInventory().get(idx); + if (item == null || !item.isWieldable()) { + player.setSuspiciousPlayer(true); + return; + } + if(player.getLocation().inWilderness() && item.getDef().isMembers() && Constants.GameServer.F2P_WILDY) { + player.getActionSender().sendMessage("Can't wield a P2P item in wilderness"); + return; + } + + if ((item.getDef().isMembers() && !World.isMembers())) { + player.getActionSender().sendMessage("This feature is only avaliable on a members server"); + return; + } + + switch (pID) { + case 181: + if (!item.isWielded()) { + wieldItem(player, item); + } + break; + case 92: + if (item.isWielded()) { + unWieldItem(player, item, true); + } + break; + } + player.getActionSender().sendInventory(); + player.getActionSender().sendEquipmentStats(); + } + + public static void unWieldItem(Player player, InvItem item, boolean sound) { + item.setWield(false); + if (sound) { + player.getActionSender().sendSound("click"); + } + player.updateWornItems(item.getWieldableDef().getWieldPos(), player.getPlayerAppearance().getSprite(item.getWieldableDef().getWieldPos())); + } + + private void wieldItem(Player player, InvItem item) { + String youNeed = ""; + for (Entry e : item.getWieldableDef().getStatsRequired()) { + if (player.getMaxStat(e.getKey()) < e.getValue()) { + youNeed += ((Integer) e.getValue()).intValue() + " " + Formulae.statArray[((Integer) e.getKey()).intValue()] + ", "; + } + } + if (!youNeed.equals("")) { + player.getActionSender().sendMessage("You must have at least " + youNeed.substring(0, youNeed.length() - 2) + " to use this item."); + return; + } + if (Constants.GameServer.MEMBER_WORLD) { + if (item.getID() == 594) { + int count = 0; + for (Quest q : World.getQuestManager().getQuests()) { + if (player.getQuestStage(q.getUniqueID()) == Quest.COMPLETE) { + count++; + } + else if(q.getUniqueID() == 12) { + count++; + } + } + System.out.println(count +" - " + World.getQuestManager().getQuests().size() ); + if (count < World.getQuestManager().getQuests().size() || player.getCurStat(Script.MINING) < 50 || player.getCurStat(Script.HERBLAW) < 25 || player.getCurStat(Script.FISHING) < 53 || player.getCurStat(Script.COOKING) < 53 || player.getCurStat(Script.CRAFTING) < 31 || player.getCurStat(Script.WOODCUT) < 36 || player.getCurStat(Script.MAGIC) < 33) { + player.getActionSender().sendMessage("You must have completed at least " + (World.getQuestManager().getQuests().size()) + " quests and have these stat reqs:"); + player.getActionSender().sendMessage("50 Mining, 25 Herblaw, 53 Fishing, 53 Cooking, 31 Crafting, 36 Woodcutting and 33 Magic"); + return; + } + } else if (item.getID() == 593) { + + if (player.getCurStat(Script.CRAFTING) < 31 || player.getCurStat(Script.WOODCUT) < 36) { + player.getActionSender().sendMessage("You must have 31 Crafting and 36 Woodcutting"); + return; + } + } else if(item.getID() == 1288) { + boolean found = false; + for(int i=0; i < 18; i++) { + if(player.getMaxStat(i) == 99) { + found = true; + break; + } + } + if(!found) { + player.getActionSender().sendMessage("Sorry, you need any skill of level 99 to wield this cape of legends"); + return; + } else { + player.getActionSender().sendMessage("You wield the legendary cape like a true legend"); + } + } + } + + if (item.getID() == 407 || item.getID() == 401) { + int count = 0; + for (Quest q : World.getQuestManager().getQuests()) { + if (player.getQuestStage(q.getUniqueID()) == Quest.COMPLETE) { + count++; + } + else if(q.getUniqueID() == 12) { + count++; + } + } + + if (player.getCurStat(6) < 31 || count < World.getQuestManager().getQuests().size()) { + player.getActionSender().sendMessage("You must have at least 31 magic & completed " + (World.getQuestManager().getQuests().size()) + " quests"); + return; + } + } + if (EntityHandler.getItemWieldableDef(item.getID()).femaleOnly() && player.isMale()) { + player.getActionSender().sendMessage("This piece of armor is for a female only."); + return; + } + ArrayList items = player.getInventory().getItems(); + for (InvItem i : items) { + if (item.wieldingAffectsItem(i) && i.isWielded()) { + unWieldItem(player, i, false); + } + } + item.setWield(true); + player.getActionSender().sendSound("click"); + player.updateWornItems(item.getWieldableDef().getWieldPos(), item.getWieldableDef().getSprite()); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/AlertHandler.java b/GameServer/src/msc/gs/phandler/ls/AlertHandler.java new file mode 100644 index 0000000..34b07b3 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/AlertHandler.java @@ -0,0 +1,29 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class AlertHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER sent alert (uID: " + uID + ")"); + Player player = world.getPlayer(p.readLong()); + if (player != null) { + String message = p.readString(); + player.getActionSender().sendAlert(message, false); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/ForceLogout.java b/GameServer/src/msc/gs/phandler/ls/ForceLogout.java new file mode 100644 index 0000000..07f8966 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/ForceLogout.java @@ -0,0 +1,29 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class ForceLogout implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER requested player logout (uID: " + uID + ")"); + Player player = world.getPlayer(p.readLong()); + if (player != null) { + player.getActionSender().sendLogout(); + player.destroy(true); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/FriendLogin.java b/GameServer/src/msc/gs/phandler/ls/FriendLogin.java new file mode 100644 index 0000000..4f08667 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/FriendLogin.java @@ -0,0 +1,30 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class FriendLogin implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Player player = world.getPlayer(p.readLong()); + if (player == null) { + return; + } + long friend = p.readLong(); + if (player.isFriendsWith(friend)) { + player.getActionSender().sendFriendUpdate(friend, p.readShort()); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/FriendLogout.java b/GameServer/src/msc/gs/phandler/ls/FriendLogout.java new file mode 100644 index 0000000..ce1c085 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/FriendLogout.java @@ -0,0 +1,39 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class FriendLogout implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + long friend = p.readLong(); + + switch (((LSPacket) p).getID()) { + case 12: + for (Player player : world.getPlayers()) { + if (player.isFriendsWith(friend)) { + player.getActionSender().sendFriendUpdate(friend, 0); + } + } + break; + case 13: + Player player = world.getPlayer(p.readLong()); + if (player != null) { + player.getActionSender().sendFriendUpdate(friend, 0); + } + break; + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/GlobalHandler.java b/GameServer/src/msc/gs/phandler/ls/GlobalHandler.java new file mode 100644 index 0000000..c80497b --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/GlobalHandler.java @@ -0,0 +1,28 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class GlobalHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER sent alert (uID: " + uID + ")"); + String message = p.readString(); + for (Player player : world.getPlayers()) { + player.getActionSender().sendAlert(message, false); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/PlayerInfoRequestHandler.java b/GameServer/src/msc/gs/phandler/ls/PlayerInfoRequestHandler.java new file mode 100644 index 0000000..f1b553e --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/PlayerInfoRequestHandler.java @@ -0,0 +1,31 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.PlayerInfoRequestPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class PlayerInfoRequestHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private PlayerInfoRequestPacketBuilder builder = new PlayerInfoRequestPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER requested player information (uID: " + uID + ")"); + builder.setUID(uID); + builder.setPlayer(world.getPlayer(p.readLong())); + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/PlayerListRequestHandler.java b/GameServer/src/msc/gs/phandler/ls/PlayerListRequestHandler.java new file mode 100644 index 0000000..5141115 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/PlayerListRequestHandler.java @@ -0,0 +1,30 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.PlayerListRequestPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class PlayerListRequestHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private PlayerListRequestPacketBuilder builder = new PlayerListRequestPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER requested player list (uID: " + uID + ")"); + builder.setUID(uID); + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/ReceivePM.java b/GameServer/src/msc/gs/phandler/ls/ReceivePM.java new file mode 100644 index 0000000..16ad0a2 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/ReceivePM.java @@ -0,0 +1,35 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; + +public class ReceivePM implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + long sender = p.readLong(); + Player recipient = world.getPlayer(p.readLong()); + boolean avoidBlock = p.readByte() == 1; + if (recipient == null || !recipient.loggedIn()) { + return; + } + if (recipient.getPrivacySetting(1) && !recipient.isFriendsWith(sender) && !avoidBlock) { + return; + } + if (recipient.isIgnoring(sender) && !avoidBlock) { + return; + } + recipient.getActionSender().sendPrivateMessage(sender, p.getRemainingData()); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/ReportInfoRequestHandler.java b/GameServer/src/msc/gs/phandler/ls/ReportInfoRequestHandler.java new file mode 100644 index 0000000..f976914 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/ReportInfoRequestHandler.java @@ -0,0 +1,36 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.ReportInfoRequestPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class ReportInfoRequestHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private ReportInfoRequestPacketBuilder builder = new ReportInfoRequestPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER requested report information (uID: " + uID + ")"); + Player player = world.getPlayer(p.readLong()); + if (player == null) { + return; + } + builder.setUID(uID); + builder.setPlayer(player); + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/ShutdownHandler.java b/GameServer/src/msc/gs/phandler/ls/ShutdownHandler.java new file mode 100644 index 0000000..2af2905 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/ShutdownHandler.java @@ -0,0 +1,24 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class ShutdownHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER requested shutdown"); + Instance.getServer().kill(); + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/StatRequestHandler.java b/GameServer/src/msc/gs/phandler/ls/StatRequestHandler.java new file mode 100644 index 0000000..856ea5c --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/StatRequestHandler.java @@ -0,0 +1,30 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.builders.ls.StatRequestPacketBuilder; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class StatRequestHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + private StatRequestPacketBuilder builder = new StatRequestPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER requested stats (uID: " + uID + ")"); + builder.setUID(uID); + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/phandler/ls/UpdateHandler.java b/GameServer/src/msc/gs/phandler/ls/UpdateHandler.java new file mode 100644 index 0000000..ebbf718 --- /dev/null +++ b/GameServer/src/msc/gs/phandler/ls/UpdateHandler.java @@ -0,0 +1,31 @@ +package msc.gs.phandler.ls; + +import org.apache.mina.common.IoSession; + +import msc.gs.Instance; +import msc.gs.connection.LSPacket; +import msc.gs.connection.Packet; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.phandler.PacketHandler; +import msc.gs.util.Logger; + +public class UpdateHandler implements PacketHandler { + /** + * World instance + */ + public static final World world = Instance.getWorld(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + long uID = ((LSPacket) p).getUID(); + Logger.event("LOGIN_SERVER sent update (uID: " + uID + ")"); + String reason = p.readString(); + if (Instance.getServer().shutdownForUpdate()) { + for (Player player : world.getPlayers()) { + player.getActionSender().sendAlert("The server will be shutting down in 60 seconds: " + reason, false); + player.getActionSender().startShutdown(60); + } + } + } + +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/plugins/ai/KingBlackDragon.java b/GameServer/src/msc/gs/plugins/ai/KingBlackDragon.java new file mode 100644 index 0000000..d024f58 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/ai/KingBlackDragon.java @@ -0,0 +1,176 @@ +package msc.gs.plugins.ai; + +import java.util.ArrayList; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.event.ObjectRemover; +import msc.gs.model.GameObject; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Projectile; +import msc.gs.model.mini.Damager; +import msc.gs.plugins.dependencies.NpcAI; +import msc.gs.plugins.dependencies.NpcScript; + +/** + * KingBlackDragon intelligence class. + * + * @author xEnt + * + */ +public class KingBlackDragon extends NpcScript implements NpcAI { + + @Override + public int getID() { + return 477; + } + + @Override + public void onHealthPercentage(Npc npc, int percent) { + /* + * if(percent > 60 && percent <= 80 && npc.getStage() == 1) { + * npc.setStage(2); shootFire(npc); } if(percent > 45 && percent <= 60 + * && npc.getStage() == 2) { npc.setStage(3); if(npc.getOpponent() != + * null || npc.getOpponent() instanceof Player) { sendNpcChat(npc, + * (Player)npc.getOpponent(), "You can't kill me damn humans", true); } + * } if(percent > 35 && percent < 50 && npc.getStage() == 3) { + * npc.setStage(4); shootFire(npc); } if(percent > 5 && percent < 25 && + * npc.getStage() == 4) { npc.setStage(5); absorbHealth(npc); } + * if(percent > 50 && percent < 65 && npc.getStage() == 5) { + * npc.setStage(6); shootFire(npc); } if(percent > 42 && percent < 49 && + * npc.getStage() == 5) { npc.setStage(7); for(Player p : + * npc.getViewArea().getPlayersInView()) { if(p != null) { + * p.getActionSender().sendMessage("The " + npc.getDef().name + + * " gets stronger!"); npc.getDef().strength+=npc.getDef().strength * + * 0.30; } } } if(percent > 25 && percent < 40 && npc.getStage() == 7) { + * npc.setStage(8); shootFire(npc); } + */ + } + + public void absorbHealth(Npc npc) { + for (Damager dam : npc.getSyndicate().getDamagers()) { + if (dam == null || dam.getPlayer() == null) + continue; + + int drain = Formulae.Rand((int) (dam.getPlayer().getMaxStat(3) * 0.25) / 2, (int) (dam.getPlayer().getMaxStat(3) * 0.25)); + Projectile projectile = new Projectile(dam.getPlayer(), npc, 4); + int newhp = npc.getCurHits() + drain; + if (newhp > npc.getDef().hits) + newhp = npc.getDef().hits; + npc.setHits(newhp); + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(npc.getViewArea().getPlayersInView()); + playersToInform.addAll(dam.getPlayer().getViewArea().getPlayersInView()); + for (Player p : playersToInform) { + p.informOfModifiedHits(npc); + p.informOfProjectile(projectile); + } + + shootPlayer(npc, dam.getPlayer(), drain, 1); + dam.getPlayer().getActionSender().sendMessage("The " + npc.getDef().name + " absorbs health from you"); + } + } + + @Override + public void onMageAttack(Player attacker, Npc npc) { + /* + * if(npc.getStage() == 0) { npc.setStage(1); sendNpcChat(npc, attacker, + * "Feel my Wrath Humans!", true); shootFire(npc); } + */ + } + + @Override + public void onMeleeAttack(Player attacker, final Npc npc) { + /*if (attacker.getCurStat(5) > (int) (attacker.getMaxStat(5) * 0.01)) { + attacker.setCurStat(5, (int) (attacker.getMaxStat(5) * 0.01)); + attacker.getActionSender().sendStat(5); + attacker.getActionSender().sendMessage("The dragon lowers your Prayer"); + }*/ + if (attacker.getCurStat(5) > 0) { + //attacker.setCurStat(5, (int)(attacker.getCurStat(5) * 0.10)); + // for (int prayerID = 0; prayerID < 14; prayerID++) { + // attacker.setPrayer(prayerID, false); + // } + // attacker.setDrainRate(0); + // attacker.getActionSender().sendMessage("You have run out of prayer points. Return to a church to recharge"); + // attacker.getActionSender().sendPrayers(); + } + /* + * if(npc.getStage() == 0) { npc.setStage(1); sendNpcChat(npc, attacker, + * "Feel my Wrath Humans!", true); } + */ + } + + public void shootFire(Npc npc) { + try { + if (npc != null) { + if (npc.getOpponent() != null && npc.getOpponent() instanceof Player) { + Instance.getDelayedEventHandler().add(new msc.gs.event.MiniEvent((Player) npc.getOpponent(), 2500, new Object[] { npc }) { + public void action() { + Npc n = (Npc) super.args[0]; + if (n != null || n.getHits() > 0) { + NpcScript script = new NpcScript(); + for (Damager dam : n.getSyndicate().getDamagers()) { + if (dam == null || dam.getPlayer() == null) + continue; + if (dam.getPlayer().equals(owner)) + continue; + script.shootPlayer(n, dam.getPlayer(), Formulae.Rand((int) (dam.getPlayer().getMaxStat(3) * 0.25) / 2, (int) (dam.getPlayer().getMaxStat(3) * 0.25)), 1); + dam.getPlayer().getActionSender().sendMessage("The " + n.getDef().name + " spits fire at you"); + GameObject obj = new GameObject(dam.getPlayer().getLocation(), 1036, 0, 0); + world.registerGameObject(obj); + Instance.getDelayedEventHandler().add(new ObjectRemover(obj, 500)); + Instance.getDelayedEventHandler().add(new msc.gs.event.MiniEvent((Player) n.getOpponent(), 2500, new Object[] { n }) { + public void action() { + shootFire((Npc) super.args[0]); + } + + }); + } + } + } + }); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onNpcAttack(Npc npc, Player player) { + /*if (player.getCurStat(5) > (int) (player.getMaxStat(5) * 0.01)) { + player.setCurStat(5, (int) (player.getMaxStat(5) * 0.01)); + player.getActionSender().sendStat(5); + player.getActionSender().sendMessage("The dragon lowers your Prayer"); + }*/ + if (player.getCurStat(5) > 0) { + //player.setCurStat(5, (int)(player.getCurStat(5) * 0.10)); + // for (int prayerID = 0; prayerID < 14; prayerID++) { + // player.setPrayer(prayerID, false); + // } + // player.setDrainRate(0); + //player.getActionSender().sendMessage("You have run out of prayer points. Return to a church to recharge"); + //player.getActionSender().sendPrayers(); + } + } + + @Override + public void onNpcDeath(Npc npc, Player player) { + /* + * if(npc.getOpponent() != null || npc.getOpponent() instanceof Player) + * { sendNpcChat(npc, (Player)npc.getOpponent(), + * "I'll be back muhahahaa", true); } + */ + } + + @Override + public void onRangedAttack(Player p, Npc npc) { + /* + * if(npc.getStage() == 0) { npc.setStage(1); sendNpcChat(npc, p, + * "Feel my Wrath Humans!", true); shootFire(npc); } + */ + } + +} diff --git a/GameServer/src/msc/gs/plugins/ai/RedDragon.java b/GameServer/src/msc/gs/plugins/ai/RedDragon.java new file mode 100644 index 0000000..dc3e965 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/ai/RedDragon.java @@ -0,0 +1,112 @@ +package msc.gs.plugins.ai; + +import java.util.ArrayList; + +import msc.config.Constants; +import msc.gs.Instance; +import msc.gs.event.ObjectRemover; +import msc.gs.model.GameObject; +import msc.gs.model.Item; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Projectile; +import msc.gs.model.World; +import msc.gs.plugins.dependencies.NpcAI; +import msc.gs.plugins.dependencies.NpcScript; +import msc.gs.tools.DataConversions; + +/** + * KingBlackDragon intelligence class. + * + * @author xEnt + * + */ +public class RedDragon extends NpcScript implements NpcAI { + + @Override + public int getID() { + return 201; + } + + @Override + public void onHealthPercentage(Npc npc, int percent) { + } + + @Override + public void onMageAttack(Player attacker, Npc npc) { + + } + + @Override + public void onMeleeAttack(Player attacker, final Npc npc) { + + } + + @Override + public void onNpcAttack(Npc npc, Player attacker) { + + } + + @Override + public void onNpcDeath(Npc npc, Player player) { + if(npc.getLocation().atAltar()) { + if(Constants.GameServer.F2P_WILDY) { + switch(DataConversions.random(0, 3)) { + case 0: { + if(DataConversions.random(0, 2000) < 4) { // Drop d med + World.getWorld().registerItem(new Item(795, player.getX(), player.getY(), 1, player)); + } + } + case 1: { + if(DataConversions.random(0, 1000) < 4) { // Drop d sq + World.getWorld().registerItem(new Item(1278, player.getX(), player.getY(), 1, player)); + } + } + case 2: { + if(DataConversions.random(0, 500) < 4) { // Drop d axe + World.getWorld().registerItem(new Item(594, player.getX(), player.getY(), 1, player)); + } + } + case 3: { + if(DataConversions.random(0, 500) < 4) { // Drop d long + World.getWorld().registerItem(new Item(593, player.getX(), player.getY(), 1, player)); + } + } + } + } + } + } + + @Override + public void onRangedAttack(Player attacker, Npc npc) { + if(npc.getLocation().nearAltar() && !attacker.getLocation().nearAltar()) { + GameObject zara = new GameObject(attacker.getLocation(), 1036, 0, 0); + World.getWorld().registerGameObject(zara); + Instance.getDelayedEventHandler().add(new ObjectRemover(zara, 500)); + Player affectedPlayer = attacker; + + int damag = 10; + Projectile projectil = new Projectile(npc, attacker, 1); + + attacker.setLastDamage(damag); + int newhp = attacker.getHits() - damag; + attacker.setHits(newhp); + ArrayList playersToInfor = new ArrayList(); + playersToInfor.addAll(npc.getViewArea().getPlayersInView()); + playersToInfor.addAll(attacker.getViewArea().getPlayersInView()); + for(Player p : playersToInfor) { + p.informOfProjectile(projectil); + p.informOfModifiedHits(attacker); + } + attacker.getActionSender().sendStat(3); + + if(newhp <= 0) { + attacker.killedBy(npc, false); + } + affectedPlayer.getActionSender().sendMessage("@red@The dragon startles you by breathing fire on you!"); + affectedPlayer.getActionSender().sendMessage("Maybe I should go closer and show him I'm not afraid!"); + affectedPlayer.resetRange(); + } + } + +} diff --git a/GameServer/src/msc/gs/plugins/dependencies/NpcAI.java b/GameServer/src/msc/gs/plugins/dependencies/NpcAI.java new file mode 100644 index 0000000..5883bce --- /dev/null +++ b/GameServer/src/msc/gs/plugins/dependencies/NpcAI.java @@ -0,0 +1,71 @@ +package msc.gs.plugins.dependencies; + +import msc.gs.model.Npc; +import msc.gs.model.Player; + +/** + * Fires off all combat related events for NPCs. + * + * @author xEnt + * + */ +public interface NpcAI { + + /** + * fired off each time the health of an implemented NPC script changes + * + * @param npc + * - the NPC object + * @param percent + * - the percentage out of 100, that the health of the NPC is on. + */ + public void onHealthPercentage(Npc npc, int percent); + + /** + * fired off when a player attacks the implemented NPC + * + * @param attacker + * @param npc + */ + public void onMeleeAttack(Player attacker, Npc npc); + + /** + * fired off when the NPC dies + * + * @param npc + * @param player + */ + public void onNpcDeath(Npc npc, Player player); + + /** + * fired off when someone shoots magic at the NPC + * + * @param attacker + * @param npc + */ + public void onMageAttack(Player attacker, Npc npc); + + /** + * fired off when someone ranges the NPC + * + * @param p + * @param npc + */ + public void onRangedAttack(Player p, Npc npc); + + /** + * fired off when the NPC goes to attack the player + * + * @param npc + * @param player + */ + public void onNpcAttack(Npc npc, Player player); + + /** + * gets the ID of the NPC script in use + * + * @return + */ + public int getID(); + +} diff --git a/GameServer/src/msc/gs/plugins/dependencies/NpcScript.java b/GameServer/src/msc/gs/plugins/dependencies/NpcScript.java new file mode 100644 index 0000000..a00fa00 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/dependencies/NpcScript.java @@ -0,0 +1,42 @@ +package msc.gs.plugins.dependencies; + +import java.util.ArrayList; + +import msc.gs.model.ChatMessage; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Projectile; + +public class NpcScript { + + public void shootPlayer(Npc n, Player player, int damage, int sprite) { + + Mob affectedMob = player; + affectedMob.setLastDamage(damage); + int newHp = affectedMob.getHits() - damage; + affectedMob.setHits(newHp); + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(n.getViewArea().getPlayersInView()); + playersToInform.addAll(affectedMob.getViewArea().getPlayersInView()); + for (Player p : playersToInform) { + p.informOfModifiedHits(affectedMob); + } + if (affectedMob instanceof Player) { + Player affectedPlayer = (Player) affectedMob; + affectedPlayer.getActionSender().sendStat(3); + } + } + + public void sendNpcChat(Npc n, Player p, String msg, boolean area) { + p.informOfNpcMessage(new ChatMessage(n, msg, p)); + if (area) { + for (Player pl : p.getViewArea().getPlayersInView()) { + if (pl.equals(p)) + continue; + pl.getActionSender().sendMessage("@yel@" + n.getDef().name + ": " + msg); + } + } + } + +} diff --git a/GameServer/src/msc/gs/plugins/dependencies/PluginHandler.java b/GameServer/src/msc/gs/plugins/dependencies/PluginHandler.java new file mode 100644 index 0000000..6f79275 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/dependencies/PluginHandler.java @@ -0,0 +1,183 @@ +package msc.gs.plugins.dependencies; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import msc.gs.model.GameObject; +import msc.gs.model.Player; +import msc.gs.plugins.listeners.ObjectListener; +import msc.gs.util.Logger; + +/** + * Initiates plugins that implements some listeners + * + * @author xEnt + * + */ +public class PluginHandler { + + /** + * Our PluginHandler + */ + public static PluginHandler handler = null; + /** + * every plugin is stored in here as a 'Class' + */ + public static ArrayList allClasses = new ArrayList(); + /** + * All plugins using an object listener is stored here + */ + private ArrayList objListeners = new ArrayList(); + /** + * All npc plugins using some AI go here. + */ + private ArrayList npcAI = new ArrayList(); + + public static ArrayList getAllClasses() { + return allClasses; + } + + public static void setAllClasses(ArrayList allClasses) { + PluginHandler.allClasses = allClasses; + } + + public NpcAI getNpcAIHandler(int id) { + for (NpcAI ai : getNpcAI()) { + if (ai.getID() == id) + return ai; + } + return null; + } + + public ArrayList getNpcAI() { + return npcAI; + } + + public void setNpcAI(ArrayList npcAI) { + this.npcAI = npcAI; + } + + public ArrayList getObjListeners() { + return objListeners; + } + + public void setObjListeners(ArrayList objListeners) { + this.objListeners = objListeners; + } + + /** + * Singleton, initiates and returns. + * + * @return - the PluginHandler + */ + public static PluginHandler getPluginHandler() { + if (handler == null) + handler = new PluginHandler(); + return handler; + } + + /** + * Initiates the plugins. + */ + public void initPlugins() { + try { + try { + getClassesFromFileJarFile("msc.gs.plugins.plugs", System.getProperty("user.dir")); + getClassesFromFileJarFile("msc.gs.plugins.plugs.skills", System.getProperty("user.dir")); + getClassesFromFileJarFile("msc.gs.plugins.ai", System.getProperty("user.dir")); + for (Class c : allClasses) { + Object cl; + cl = c.newInstance(); + if (cl instanceof ObjectListener) { + ObjectListener obj = (ObjectListener) cl; + objListeners.add(obj); + } else if (cl instanceof NpcAI) { + NpcAI ai = (NpcAI) cl; + npcAI.add(ai); + } + } + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + + Logger.println(allClasses.size() + " Plugins Loaded"); + } + + /** + * Fires off the action to the plugins + * + * @param obj + * - the object model + * @param cmd + * - the command String + * @param player + * - the player model + */ + public boolean handleObjectAction(GameObject obj, String cmd, Player player) { + for (ObjectListener ol : objListeners) { + for (int i : ol.getAssociatedIDS()) { + if (i == obj.getID()) { + if (ol.onObjectAction(obj, cmd, player)) // if true, it's + // handled. + return true; + } + + } + } + return false; + } + + /** + * Just gets all the classes inside the Plugins/plug folder, leeched from + * Java forums. + * + * @param pckgname + * @param baseDirPath + * @return + * @throws ClassNotFoundException + */ + public static void getClassesFromFileJarFile(String pckgname, String baseDirPath) throws ClassNotFoundException { + ArrayList classes = new ArrayList(); + String path = pckgname.replace('.', '/') + "/"; + File mF = new File(baseDirPath); + String[] files = mF.list(); + ArrayList jars = new ArrayList(); + for (int i = 0; i < files.length; i++) + if (files[i].endsWith(".jar")) + jars.add(files[i]); + + for (int i = 0; i < jars.size(); i++) { + try { + JarFile currentFile = new JarFile(jars.get(i).toString()); + for (Enumeration e = currentFile.entries(); e.hasMoreElements();) { + JarEntry current = (JarEntry) e.nextElement(); + if (current.getName().contains("$")) + continue; + if (current.getName().length() > path.length() && current.getName().substring(0, path.length()).equals(path) && current.getName().endsWith(".class")) + classes.add(Class.forName(current.getName().replaceAll("/", ".").replace(".class", ""))); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + Class[] classesA = new Class[classes.size()]; + classes.toArray(classesA); + for (Class c : classesA) { + allClasses.add(c); + } + + } + +} diff --git a/GameServer/src/msc/gs/plugins/extras/Quiz.java b/GameServer/src/msc/gs/plugins/extras/Quiz.java new file mode 100644 index 0000000..7cbb424 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/extras/Quiz.java @@ -0,0 +1,260 @@ +package msc.gs.plugins.extras; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.Iterator; + +import javax.swing.Timer; + +import msc.gs.Instance; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.util.Logger; + +public class Quiz extends Thread { + + private static final int timeBetweenQuestions = 30; // Seconds. + + static final World world = Instance.getWorld(); + + int phaze = 0; + + int question = 0; + // Question, Option1(A), Option2(B), Option3(C), Option4(D), Correct Option + private final String[][] Quiz = { { "What is another name for sodium chloride?", "Salt", "Flour", "Sugar", "Oil", "a" }, { "What was Adam Sandler's first film called?", "Airheads", "Coneheads", "Going Overboard", "Happy Gilmore", "c" }, { "In terms of the ancient Roman empire, how was Nero related to Caligula?", "His Uncle", "His Brother", "His Nephew", "His Dad", "b" }, { "What do the Danish call Danish pastries?", "Danish Pastries", "Flatbread", "Viennese Bread", "Alsatian Cakes", "c" }, { "Which of these was once the national drink of Scotland?", "Claret", "Amaretto", "Vodka", "Scotch", "a" }, { "Which of the following was a predecessor of the Milky Way bar?", "Penny Plump", "Fat Emma", "Lardy Larry", "Milky Max", "b" }, { "Which is the deepest loch in Scotland?", "Loch Ness", "Loch Lomand", "Loch Morar", "Loch Ollie", "c" }, { "What was the first of Earth's supercontinents?", "Pangaea", "Gondwanaland", "Asia", "Rodinia", "d" }, { "In which country was the Can-Can invented?", "USA", "UK", "Canada", "England", "b" }, { "1987 saw the first Rugby Union World Cup. Who won it?", "New Zealand", "USA", "Fiji", "Japan", "a" }, { "What will a male lion often do in order to establish his authority when taking over a new pride?", "Kills The Lioness", "Mates and Leaves", "Kills the Cubs", "Hunts with the Pride", "c" }, { "Who is known as the father of modern day printing?", "Aristotle", "Mendel", "Theophrastus", "Gutenberg", "d" }, { "What group had the one hit wonder in the 90s by the name of 'Lovefool'?", "The Cardigans", "Creed", "The Coors", "Chumbawumba", "a" }, { "The color blue is said to represent which of the following emotions?", "Embarrassment", "Sadness", "Envy", "Anger", "b" }, { "Asteroids that are always closer to the Sun than the Earth are called?", "Argon", "Amor", "Aten", "Apollo", "c" }, { "During the Black Death, or Bubonic Plague, in mid 1300's Europe (approx.), what percentage of the population perished?", "One Tenth", "One Quarter", "One Third", "One Half", "c" }, { "What is the capital of Australia?", "Sydney", "Melbourne", "Canberra", "Liverpool", "c" }, { "A brogue is a type of what?", "Hat", "Shoe", "Guitar", "Shirt", "b" }, { "How many Wonders of the Ancient World were there?", "6", "7", "8", "9", "b" }, { "Which African nation did Winston Churchill once call 'the pearl of Africa?'", "Uganda", "Congo", "Chad", "Ethiopia", "a" }, { "What is the atomic number for Neon?", "1", "10", "30", "17", "b" }, { "An animal that eats only meat is called?", "A Canine", "An Omnivore", "A Carnivore", "None of the above", "c" }, { "According to the calendar of the time, when was Sir Isaac Newton born?", "November 4, 1642", "October 1, 1642", "December 25, 1642", "July 4, 1642", "c" }, { "Which fictional character lived in the Hundred Acre Wood?", "Winnie The Pooh", "Bambi", "Snow White", "Snoopy", "a" }, { "Which of the following does NOT Belong?", "Lincoln", "Mercury", "Ford", "Saturn", "d" }, { "Which of the following does NOT Belong?", "Pontiac", "Cadillac", "Hummer", "Mazda", "d" }, { "What does the term 'GUI' stands for?", "Graphics Unused Input", "Graphical User Interface", "Graphing Ultimate Interface", "Graph Unit Input", "b" }, { "In medicine, to examine a body part by listening to it is called what?", "Audiology", "Palpation", "Auscultation", "Radiology", "c" }, { "Of what is Botany the study?", "Plants", "Rocks", "Bugs", "Animals", "a" }, { "What element has a symbol on the periodic table that comes from the Latin word Aurum?", "Platinum", "Gold", "Silver", "Aluminum", "b" }, { "Which one of the following human bones is found in the wrist?", "Cochlea", "Cranium", "Femur", "Capitate", "d" }, { "", "", "", "", "", "" } // Leave + // this + // one + // Blank. + // It + // won't + // include. (Make sure its the last one) + }; + + void endQuiz() { + + try { + // Clean's up the shit, reset's variables etc. + + world.Quiz = false; + world.QuizSignup = false; + world.lastAnswer = null; + + for (Player p : world.getPlayers()) { + p.lastAnswer = null; + p.hasAnswered = false; + p.quizPoints = 0; + } + Logger.println("Destroying Thread, will create a stack.. ignore it."); + Thread.currentThread().destroy(); + } catch (Exception e) { + Error(e); + } + } + + void Error(Exception e) { + e.printStackTrace(); + } + + public void handleAnswer(Player p) throws Exception { + + if (!world.Quiz) { + p.getActionSender().sendMessage("Sorry, It's not Quiz time just yet."); + return; + } + + if (p.hasAnswered) { + p.getActionSender().sendMessage("You have already answered, please wait for the next question"); + return; + } + + p.hasAnswered = true; + + if (p.lastAnswer.equalsIgnoreCase(world.lastAnswer)) { + p.quizPoints++; + } + + p.getActionSender().sendMessage("You have answered @gre@(@whi@" + p.lastAnswer + "@gre@)"); + + p.lastAnswer = null; + + } + + /* + * void removePlayer(Player p) throws Exception { + * + * try { + * + * int index = -1; for(int i=0; i < players.size(); i++) { if + * (players.get(i).equals(p.getUsername())) index = i; + * + * if(i == -1) { System.out.println("Error removing " + p.getUsername() + + * " from the Quiz list."); return; } else { System.out.println("[QUIZ] " + + * players.get(index) + " has left the Quiz"); players.remove(index); + * p.getActionSender().sendMessage("You have Quit the Quiz Queue"); } } + * + * } catch (Exception e) { Error(e); } } + */ + + /* + * public void addPlayer(Player p) { + * + * try { + * + * if(!world.QuizSignup) return; if(p == null) return; if(!world.Quiz) + * return; if(players.contains(p.getUsername())) return; + * + * players.add(p.getUsername()); + * p.getActionSender().sendMessage("You have Joined the Quiz Queue"); + * + * } catch (Exception e) { Error(e); } } + */ + + public void run() { + + try { + if (world.Quiz) + return; + + world.QuizSignup = true; + world.Quiz = false; + + sayAll("@red@[QUIZ]@whi@ Quiz will be starting in @gre@" + timeBetweenQuestions + " @whi@seconds. Write @gre@::quiz@whi@ to join the quiz.", false, false); + sayAll("@red@[QUIZ]@whi@ You will have @gre@" + timeBetweenQuestions + "@whi@ seconds to lock in the answers of each quiz.", false, false); + sayAll("@red@[QUIZ]@whi@ Quiz results are tally'd up at the end. Use ::a ::b ::c ::d to answer.", false, false); + + ActionListener phaze1 = new ActionListener() { + public void actionPerformed(ActionEvent actionEvent) { + try { + + if (phaze == 0) { // the start of the quiz. + phaze++; + } + + if (phaze == 1) { + world.Quiz = true; + if (question == 999) { + tallyQuiz(); + endQuiz(); + } + + for (Player p : world.getPlayers()) + p.hasAnswered = false; + + sayAll("@red@[QUIZ]@gre@ " + question + "/" + (Quiz.length) + "@yel@ " + Quiz[question][0] + " @cya@(A) @whi@" + Quiz[question][1] + " @cya@(B)@whi@ " + Quiz[question][2] + " @cya@(C)@whi@ " + Quiz[question][3] + " @cya@(D) @whi@ " + Quiz[question][4], true, true); + sayAll("@red@[QUIZ]@gre@ " + question + "/" + (Quiz.length) + "@yel@ " + Quiz[question][0] + " @cya@(A) @whi@" + Quiz[question][1] + " @cya@(B)@whi@ " + Quiz[question][2] + " @cya@(C)@whi@ " + Quiz[question][3] + " @cya@(D) @whi@ " + Quiz[question][4], false, true); + world.lastAnswer = Quiz[question][5]; + question++; + if (question == Quiz.length) + question = 999; + } + } + + catch (Exception e) { + Error(e); + } + } + }; + Timer timer = new Timer(timeBetweenQuestions * 1000, phaze1); + timer.start(); + + } catch (Exception e) { + Error(e); + } + } + + void sayAll(String message, boolean Alert, boolean inQuiz) throws Exception { + if (inQuiz) { + ArrayList playersToSend = new ArrayList(); + Player p; + for (Iterator i$ = world.getPlayers().iterator(); i$.hasNext(); playersToSend.add(p)) + p = (Player) i$.next(); + Player pl; + for (Iterator i$ = playersToSend.iterator(); i$.hasNext();) { + pl = (Player) i$.next(); + if (Alert && pl.inQuiz) + pl.getActionSender().sendAlert(message, false); + else if (!Alert && pl.inQuiz) + pl.getActionSender().sendMessage(message); + } + } else { + ArrayList playersToSend = new ArrayList(); + Player p; + for (Iterator i$ = world.getPlayers().iterator(); i$.hasNext(); playersToSend.add(p)) + p = (Player) i$.next(); + Player pl; + for (Iterator i$ = playersToSend.iterator(); i$.hasNext();) { + pl = (Player) i$.next(); + if (Alert) + pl.getActionSender().sendAlert(message, false); + else + pl.getActionSender().sendMessage(message); + } + } + } + + // Rofl.. couldent be fucked figuring out another way to do this at the + // time. + void tallyQuiz() { + try { + + String First = null; + int first = -1; + int second = -1; + int third = -1; + String Second = null; + String Third = null; + int temp = 0; + int count = 0; + for (Player p : world.getPlayers()) { + if (p.quizPoints != 0) + count++; + + if (p.quizPoints >= temp) { + temp = p.quizPoints; + First = p.getUsername(); + first = temp; + } + } + temp = 0; + for (Player p : world.getPlayers()) { + if (p.quizPoints >= temp && p.getUsername() != First) { + temp = p.quizPoints; + Second = p.getUsername(); + second = temp; + } + } + temp = 0; + for (Player p : world.getPlayers()) { + if (p.quizPoints >= temp && (p.getUsername() != First && p.getUsername() != Second)) { + temp = p.quizPoints; + Third = p.getUsername(); + third = temp; + } + } + sayAll("Thank you all for Playing, the Quiz is over. " + count + " Players submitted Answers.", false, true); + sayAll("@yel@Your Quiz Winners Are: @whi@" + First + "@gre@(" + first + ")@whi@, " + Second + "@gre@(" + second + ")@whi@, " + Third + "(@gre@" + third + ")", true, true); + sayAll("@yel@Your Quiz Winners Are: @whi@" + First + "@gre@(" + first + ")@whi@, " + Second + "@gre@(" + second + ")@whi@, " + Third + "(@gre@" + third + ")", false, true); + + /** + * + * Add SQL Here. + * + */ + + for (Player p : world.getPlayers()) { + if (p.quizPoints != 0) { + int points = p.quizPoints; // Each players total questions + // correct from lsat round of + // Quiz + + // Code here for adding to SQL etc. + } + } + + } catch (Exception e) { + Error(e); + } + } + +} diff --git a/GameServer/src/msc/gs/plugins/extras/Thieving.java b/GameServer/src/msc/gs/plugins/extras/Thieving.java new file mode 100644 index 0000000..5a05812 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/extras/Thieving.java @@ -0,0 +1,893 @@ +package msc.gs.plugins.extras; + +import java.util.ArrayList; +import java.util.Random; + +import msc.gs.Instance; +import msc.gs.event.FightEvent; +import msc.gs.event.MiniEvent; +import msc.gs.event.ShortEvent; +import msc.gs.event.WalkToMobEvent; +import msc.gs.external.GameObjectDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.Bubble; +import msc.gs.model.ChatMessage; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.World; +import msc.gs.states.Action; +import msc.gs.util.Logger; + +/** + * + * @author xEnt Thieving Class, All types of thieving stored here. + */ + +public class Thieving { + + public static String[] StealChats = { "You think i'm going to buy my own items off you? Get out of here.", "You've just stolen from me, I'm not selling you anything.", "How dare you try and buy from me after you have stolen.", "Thief, go away now before i call security", "You have guts, trying to sell my own goods back to me", "Real thiefs don't sell back to their victims", "i know better than to buy my own items from thiefs" }; + + private static final World world = Instance.getWorld(); + + public static int Rands(int max) { + Random r = new Random(); + return r.nextInt(max); + } + + public static int Rands(int min, int max) { + Random r = new Random(); + return r.nextInt(max) + min; + } + + public static boolean stallSuccess(int lvl, int reqLevel) { + Random r = new Random(); + double dif = lvl - reqLevel; + double rand = ((r.nextDouble() * 100) + 1) / 100; + double success = ((3.27 * Math.pow(10, -6)) * Math.pow(dif, 4) + (-5.516 * Math.pow(10, -4)) * Math.pow(dif, 3) + 0.014307 * Math.pow(dif, 2) + 1.65560813 * dif + 18.2095966) / 100.0; + if (success < 0.35) + success = 0.35; + if (reqLevel < 15) + if (lvl - reqLevel < 10) + if (Rands(1, 10) == 5) + success = 1.0; + success = success * 2; + return rand < success; + } + + public static boolean thievingSuccess(int lvl, int reqLevel) { + Random r = new Random(); + double dif = lvl - reqLevel; + double rand = ((r.nextDouble() * 100) + 1) / 100; + double success = ((3.27 * Math.pow(10, -6)) * Math.pow(dif, 4) + (-5.516 * Math.pow(10, -4)) * Math.pow(dif, 3) + 0.014307 * Math.pow(dif, 2) + 1.65560813 * dif + 18.2095966) / 100.0; + if (success < 0.35) + success = 0.35; + if (reqLevel < 15) { + if (lvl - reqLevel < 10) { + if (Rands(1, 10) == 5) + success = 1.0; + } + } + if (rand < success) + return false; + return true; + } + + private Mob affectedMob; + private Npc affectedNpc; + private int Amount[] = { -1, -1 }; + private String[] caughtChats = { "Guards! Guards! Im being Robbed!", "Help Guards i am being Robbed please help!", "Someone help! My items are getting stolen!", "You'll wish you never did that, Thief!", "You are going to pay for that", "-name- how could you steal from me? Guards!", "-name- get your hands out of my stall!", "Hey -name- thats not yours!", "Dont steal from me -name- Im going to go tell a mod", "Oi! -name- you deserve a spanking!" }; + private String[] Chats = { "Oi! Get your hands out of there -name-!", "Hey thief! get here!", "Trying to steal from me hmm?", "No one steals from me!", "Take those hands off me Thief", "Are you trying to steal from me -name-?", "Dont you dare touch me", "Thief get back here now!", "Stealing won't get you anywhere", "Bad person! you shall die", "Die evil thief!", "You are going to pay for that", "Ill make you wish you were never born", "-name- i am going to hurt you", "-name- dont steal from me again", "Remove your filthy hands off me", "A real man doesn't need to steal" }; + // ID, LvlReq, Exp, RespawnTime, Loot then(amount) + public int[][] Chests = { { 340, 59, 250, 45000, 619, 2 }, // Blood rune + // chest. + { 334, 18, 8, 10000, 10, 50 }, // Next 2 nature chest. + { 336, 72, 500, 180000, 546, 1, 154, 1, 160, 1, 10, 1000 }, // Good + // chest, + // ardy.. + { 339 } // Dont add anything to this, its a dummy chest. + }; + private int curDoor = -1; + // given. + private int curStall = -1; + private GameObjectDef def; + // Cur X, Cur Y, New X, New Y, Lvl, Exp + private int[][] Doors = { { 586, 581, 585, 581, 10, 13 }, // Nat rune West + // house (In) + { 585, 581, 586, 581, 10, 13 }, // Nat rune West house (Out) + { 539, 598, 539, 599, 10, 13 }, // Nat Rune East House (Out) + { 539, 599, 539, 598, 10, 13 }, // Nat Rune East House (Out) + { 609, 1547, 609, 1548, 61, 43 }, // Paladin Door (In) + { 609, 1548, 609, 1547, 61, 43 }, // Paladin Door (Out) + { 537, 3425, 536, 3425, 31, 25 }, // Ardy Door + { 536, 3425, 537, 3425, 31, 25 }, // Ardy Door + { 617, 556, 617, 555, 46, 37 }, // Blood rune door + { 617, 555, 617, 556, 46, 37 }, // Blood rune door + { 593, 3590, 593, 3589, 61, 41 }, // yanile door + { 593, 3589, 593, 3590, 61, 41 }, // yanile door + { 266, 100, 266, 99, 39, 35 }, // pirate doors wildy + { 266, 99, 266, 100, 39, 35 }, // pirate doors wildy + { 160, 103, 160, 102, 30, 28 }, // Axe hut wildy + { 160, 102, 160, 103, 30, 28 }, // Axe hut wildy + { 581, 580, 580, 580, 10, 30 }, { 580, 580, 581, 580, 10, 30 }, { 538, 592, 538, 591, 8, 10 }, // Some + // ardy + // door + { 538, 591, 538, 592, 8, 10 } // some ardy door + }; + private int exp = 0; + private int Exp = -1; + + public int ExpMultiplier = 1; // Modify this number to multiply the XP + + private int Loot[] = { -1, -1 }; + + private int lvl = 1; + + private int npcID; + + private GameObject object; + + private int ourChest = -1; + + private Player player; + + private int[][] StallNpcs = { { 325, 543, 546, 597, 602 }, // Baker + { -1, -1, -1, -1, -1 }, { -1, -1, -1, -1, -1 }, { 328, 553, 558, 592, 595 }, // Silver + // merchant + { 329, 542, 547, 588, 593 }, // Spice merchant + { 330, 549, 553, 597, 602 } // Gem merchant + }; + + private int[][] StallProtectorLvls = { { 28 }, // Guards + { 28 }, // Guards + { 28, 56 }, // Guards + Knights + { 56 }, // Knights + { 56, 71 }, // Knights + Paladins + { 71, 83 } // Paladins + Heroes + }; + + // LvReq, Obj ID, Exp, RespawnTime, LootID(s) + private int[][] Stalls = { { 5, 322, 16, 5, 330 }, // Bakers + { 20, 323, 24, 11, 200 }, // Silk + { 35, 324, 36, 18, 541 }, // Fur + { 50, 325, 54, 31, 383 }, // Silver + { 65, 326, 81, 45, 707 }, // Spice + { 75, 327, 16, 80, 160, 159, 158, 157 } // Gem + }; + + public Thieving(Player p, GameObject obj) { + this.player = p; + this.object = obj; + this.def = object.getGameObjectDef(); + } + + public Thieving(Player p, Npc np, Mob mb) { + this.player = p; + this.affectedNpc = np; + this.affectedMob = mb; + npcID = affectedNpc.getID(); + } + + public void beginPickpocket() { + try { + boolean ret = false; + + switch (npcID) { + + case 318: + case 11: + exp = 8; + lvl = 0; + Loot[0] = 10; + Amount[0] = 3; + break; + + case 63: + exp = 12; + lvl = 10; + Loot[0] = 10; + Amount[0] = 9; + break; + + case 159: + case 320: + exp = 26; + lvl = 25; + Loot[0] = 10; + Amount[0] = 18; + break; + + case 342: + exp = 36; + lvl = 32; + setLootArrays(0); + break; + + case 65: + case 100: + case 321: + exp = 46; + lvl = 40; + Loot[0] = 10; + Amount[0] = 30; + break; + + case 322: + exp = 85; + lvl = 55; + Loot[0] = 10; + Amount[0] = 50; + break; + + case 574: + case 685: + exp = 138; + lvl = 65; + Loot[0] = 10; + Loot[1] = 138; + Amount[0] = 60; + Amount[1] = 1; + break; + + case 323: + exp = 152; + lvl = 70; + Loot[0] = 10; + Loot[1] = 41; + Amount[0] = 80; + Amount[1] = 1; + break; + + case 581: + case 582: + case 583: + case 580: + exp = 198; + lvl = 75; + setLootArrays(1); + break; + + case 324: + exp = 274; + lvl = 80; + setLootArrays(2); + break; + + default: + player.getActionSender().sendMessage("Sorry, this NPC has not been added to the Pickpocketing list yet."); + Logger.println("Player " + player.getUsername() + " found a NPC (pickpocket) not added, ID: " + npcID); + ret = true; + } + + if (ret) { + player.setBusy(false); + player.setSpam(false); + return; + } + + player.setFollowing(affectedMob); + Instance.getDelayedEventHandler().add(new WalkToMobEvent(player, affectedMob, 1) { + public void arrived() { + if (owner.getSpam()) { + return; + } else { + + if (affectedMob.inCombat() || owner.isBusy()) { + owner.setSpam(false); + owner.setBusy(false); + return; + } + + if (affectedNpc == null || affectedNpc.inCombat()) { + owner.resetPath(); + owner.setBusy(false); + owner.setSpam(false); + return; + } else if (owner == null) { + affectedNpc.unblock(); + return; + } + + if (!owner.nextTo(affectedMob)) { + owner.setSpam(false); + affectedMob.setBusy(false); + owner.setBusy(false); + return; + } + + owner.setSpam(true); + // affectedNpc.blockedBy(player); + owner.setBusy(true); + if (owner.getCurStat(17) < lvl) { + owner.getActionSender().sendMessage("You must be at least " + lvl + " thieving to pick the " + affectedNpc.getDef().name + "'s pocket."); + owner.setBusy(false); + // affectedNpc.unblock(); + owner.setBusy(false); + owner.setSpam(false); + return; + } + + affectedNpc.resetPath(); + Bubble bubble = new Bubble(player, 16); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + owner.getActionSender().sendMessage("You attempt to pick the " + affectedNpc.getDef().name + "'s pocket..."); + + owner.setBusy(true); + + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + owner.setBusy(false); + affectedNpc.setBusy(false); + if (chanceFormulae(lvl)) { + owner.setSpam(false); + owner.getActionSender().sendMessage("You sucessfully stole from the " + affectedNpc.getDef().name); + for (int i = 0; i < Loot.length; i++) { + owner.getInventory().add(new InvItem(Loot[i], Amount[i])); + } + owner.getActionSender().sendInventory(); + owner.incExp(17, exp * ExpMultiplier, true); + owner.getActionSender().sendStat(17); + owner.setBusy(false); + affectedNpc.unblock(); + } else { + + owner.setSpam(false); + owner.getActionSender().sendMessage("You fail to pick the " + affectedNpc.getDef().name + "'s pocket."); + int temp = Rand(10); + if (temp >= 3) { + owner.setBusy(false); + affectedNpc.unblock(); + return; + } + + affectedNpc.resetPath(); + owner.setBusy(true); + if (affectedNpc == null || affectedNpc.inCombat()) { + owner.resetPath(); + owner.setBusy(false); + owner.setSpam(false); + return; + } else if (owner == null) { + affectedNpc.unblock(); + return; + } + String msg = Chats[Rand(Chats.length)]; + msg = msg.replace("-name-", owner.getUsername()); + owner.informOfNpcMessage(new ChatMessage(affectedNpc, msg, owner)); + world.getDelayedEventHandler().add(new MiniEvent(owner, 1000) { + public void action() { + if (affectedNpc == null || affectedNpc.inCombat()) { + owner.resetPath(); + owner.setBusy(false); + owner.setSpam(false); + return; + } else if (owner == null) { + affectedNpc.unblock(); + return; + } + owner.setBusy(false); + // affectedNpc.unblock(); + affectedNpc.resetPath(); + + owner.resetPath(); + owner.resetAll(); + owner.getActionSender().sendSound("underattack"); + owner.setStatus(Action.FIGHTING_MOB); + owner.getActionSender().sendMessage("You are under attack!"); + + affectedNpc.resetPath(); + affectedNpc.setLocation(owner.getLocation(), true); + affectedNpc.resetPath(); + affectedNpc.setBusy(true); + + for (Player p : affectedNpc.getViewArea().getPlayersInView()) { + p.removeWatchedNpc(affectedNpc); + } + if (affectedNpc.inCombat()) { + owner.setBusy(false); + owner.resetPath(); + affectedNpc.setBusy(false); // untick + // this + return; + } + + owner.setBusy(true); + owner.setSprite(9); + owner.setOpponent(affectedNpc); + owner.setCombatTimer(); + + affectedNpc.setBusy(true); + affectedNpc.setSprite(8); + affectedNpc.setOpponent(owner); + affectedNpc.setCombatTimer(); + + FightEvent fighting = new FightEvent(owner, affectedNpc, true); + fighting.setLastRun(0); + world.getDelayedEventHandler().add(fighting); + } + }); + } + } + }); + } + } + }); + } catch (Exception e) { + player.setBusy(false); + affectedNpc.setBusy(false); + affectedNpc.unblock(); + System.out.println(e.getMessage() + "\nStack: " + e.getStackTrace()); + player.setSpam(false); + } + + } + + /** + * + * I don't have the best Maths, but this is a tweak-able formula for every 5 + * levels -xEnt + */ + + public boolean chanceFormulae(int targetLv) { + try { + int chance[] = { 27, 33, 35, 37, 40, 43, 47, 51, 54, 58, 62, 66, 71, 74, 78, 81, 84, 88, 93, 95 }; + int maxLvl[] = { 1, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 }; + int diff = player.getMaxStat(17) - targetLv; + int index = 0; + for (int i = 0; i < maxLvl.length; i++) + if (diff >= maxLvl[i] && diff < maxLvl[i] + 5) + index = i; + int Chance = (chance[index] < 27 ? 27 : chance[index]); + return Rand(100) < Chance; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + public boolean checkToGetAttacked() { + ActiveTile[][] tiles = player.getViewArea().getViewedArea(5, 5, 5, 5); + for (int x = 0; x < tiles.length; x++) { + for (int y = 0; y < tiles[x].length; y++) { + ActiveTile t = tiles[x][y]; + if (t != null) { + return false; + } + for (Npc n : t.getNpcs()) { + System.out.println(t.getNpcs().get(0)); + } + } + } + return false; + } + + private void doChest() { + try { + + world.registerGameObject(new GameObject(object.getLocation(), 339, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), 900); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void doDoor() { + try { + player.getActionSender().sendSound("opendoor"); + world.registerGameObject(new GameObject(object.getLocation(), 11, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), 1000); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void lockpick() { + try { + + if (player.isBusy() || player.inCombat() || player == null || object == null) { + player.setSpam(false); + player.setBusy(false); + return; + } + player.setBusy(true); + + boolean cont = true; + for (int i = 0; i < Doors.length; i++) { + if (player.getX() == Doors[i][0] && player.getY() == Doors[i][1]) { + curDoor = i; + cont = false; + } + } + if (cont) { + player.getActionSender().sendMessage("This door has not been added"); + Logger.println("Player " + player.getUsername() + " found a door(lockpick) not added, ID: " + object.getID() + ", Coords: " + object.getLocation()); + player.setSpam(false); + player.setBusy(false); + return; + } + if (player.getMaxStat(17) < Doors[curDoor][4]) { + + player.getActionSender().sendMessage("Sorry, you don't have a high enough thieving level to unlock this"); + player.setSpam(false); + player.setBusy(false); + return; + } + Bubble bubble = new Bubble(player, 714); + for (Player p : player.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + player.getActionSender().sendMessage("You attempt to pick the lock on the " + object.getDoorDef().name); + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + if (!chanceFormulae(Doors[curDoor][4])) { + owner.getActionSender().sendMessage("You failed to unlock the door"); + owner.setSpam(false); + owner.setBusy(false); + return; + } else { + owner.getActionSender().sendMessage("You sucessfully unlocked the " + object.getDoorDef().name); + doDoor(); + owner.incExp(17, Doors[curDoor][5] * ExpMultiplier, true); + owner.getActionSender().sendStat(17); + owner.setSpam(false); + owner.setBusy(false); + owner.teleport(Doors[curDoor][2], Doors[curDoor][3], false); + + } + } + }); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + public void openThievedChest() { + + if (player.getCurStat(3) <= 2) { + player.getActionSender().sendMessage("Go away Emo kid."); + player.setSpam(false); + player.setBusy(false); + return; + } + int damage = player.getCurStat(3) / 9; + player.getActionSender().sendMessage("You have activated a trap on the chest"); + player.setLastDamage(damage); + player.setCurStat(3, player.getCurStat(3) - damage); + ArrayList playersToInform = new ArrayList(); + playersToInform.addAll(player.getViewArea().getPlayersInView()); + player.getActionSender().sendStat(3); + + for (Player p : playersToInform) { + p.informOfModifiedHits(player); + } + + Instance.getDelayedEventHandler().add(new MiniEvent(player, 1200) { + public void action() { + owner.setSpam(false); + owner.setBusy(false); + } + }); + } + + public int Rand(int max) { + Random r = new Random(); + return r.nextInt(max); + } + + public int Rand(int min, int max) { + Random r = new Random(); + return r.nextInt(max) + min; + } + + private void replaceChest(int delay) { + try { + world.registerGameObject(new GameObject(object.getLocation(), 338, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), delay); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void setLootArrays(int type) { + try { + int rand = Rand(100); + int[] tempArray = {}; + if (type == 0) { // Rogue + if (rand < 20) { + Loot[0] = 10; + Amount[0] = Rand(20, 40); + return; + } + if (rand < 40) { + Loot[0] = 33; + Amount[0] = 8; + return; + } + if (rand < 60) { + Loot[0] = 714; + Amount[0] = 1; + return; + } + if (rand < 80) { + Loot[0] = 559; + Amount[0] = 1; + return; + } + if (rand <= 100) { + Loot[0] = 142; + Amount[0] = 1; + return; + } + + } else if (type == 1) { // Gnome + if (rand < 20) { + Loot[0] = 10; + Amount[0] = Rand(200, 300); + return; + } + if (rand < 40) { + Loot[0] = 34; + Amount[0] = Rand(1, 5); + return; + } + if (rand < 50) { + Loot[0] = 612; + Amount[0] = 1; + return; + } + if (rand < 60) { + Loot[0] = 152; + Amount[0] = 1; + return; + } + if (rand < 80) { + Loot[0] = 895; + Amount[0] = 1; + return; + } + if (rand <= 100) { + Loot[0] = 897; + Amount[0] = 1; + return; + } + } else { // Hero + if (rand <= 5) { + Loot[0] = 161; + Amount[0] = 1; + return; + } + if (rand < 15) { + Loot[0] = 619; + Amount[0] = 1; + return; + } + if (rand < 30) { + Loot[0] = 38; + Amount[0] = 2; + return; + } + if (rand < 40) { + Loot[0] = 152; + Amount[0] = 1; + return; + } + if (rand < 50) { + Loot[0] = 612; + Amount[0] = 1; + return; + } + if (rand < 60) { + Loot[0] = 142; + Amount[0] = 1; + return; + } + if (rand <= 100) { + Loot[0] = 10; + Amount[0] = Rand(200, 300); + return; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void thieveChest() { + + if (object == null) { + player.setSpam(false); + player.setBusy(false); + return; + } + + if (object.getID() == 338) { + player.getActionSender().sendMessage("It looks like that chest has already been looted."); + player.setSpam(false); + player.setBusy(false); + return; + } + + for (int i = 0; i < Chests.length; i++) + if (object.getID() == Chests[i][0]) + ourChest = i; + + if (ourChest == -1) { + player.setSpam(false); + player.setBusy(false); + player.getActionSender().sendMessage("This chest has not yet been added to the chest Thieving list."); + Logger.println("Player " + player.getUsername() + " found a chest not added, ID: " + object.getID() + ", Coords: " + object.getLocation()); + return; + } + + if (player.getMaxStat(17) < Chests[ourChest][1]) { + player.setSpam(false); + player.setBusy(false); + player.getActionSender().sendMessage("You are not high enough level to Steal from this chest."); + return; + } + + player.getActionSender().sendMessage("You search for traps on the chest"); + player.setBusy(true); + + Instance.getDelayedEventHandler().add(new MiniEvent(player, 300) { + public void action() { + + owner.getActionSender().sendMessage("You find a trap on the chest.."); + Bubble bubble = new Bubble(player, 549); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + + Instance.getDelayedEventHandler().add(new MiniEvent(player, 1000) { + public void action() { + + owner.getActionSender().sendMessage("You disarm the trap"); + + Instance.getDelayedEventHandler().add(new MiniEvent(player, 1000) { + public void action() { + owner.getActionSender().sendMessage("You open the chest"); + doChest(); + + Instance.getDelayedEventHandler().add(new MiniEvent(player, 1200) { + public void action() { + replaceChest(Chests[ourChest][3]); + owner.getActionSender().sendMessage("You find treasure inside!"); + for (int i = 4; i < Chests[ourChest].length - 1; i++) { + InvItem loot = new InvItem(Chests[ourChest][i], Chests[ourChest][i + 1]); + owner.getInventory().add(loot); + i = i + 1; + } + if (Chests[ourChest][0] == 340) { + owner.getActionSender().sendMessage("You triggered the trap!"); + owner.teleport(612, 568, true); + } + owner.getActionSender().sendInventory(); + owner.incExp(17, Chests[ourChest][2], true); + owner.getActionSender().sendStat(17); + owner.setBusy(false); + owner.setSpam(false); + } + }); + } + }); + } + }); + } + }); + } + + public int thieveGem() { + try { + int temp = Rand(100); + if (temp <= 40) { + return 160; + } else if (temp <= 70) { + return 159; + } else if (temp <= 90) { + return 158; + } else if (temp <= 100) { + return 157; + } + return -1; + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + public void thieveStall() { + + try { + + if (object == null) { + player.setSpam(false); + // owner.packetSpam + return; + } + boolean exist = false; + + for (int i = 0; i < Stalls.length; i++) { + if (object.getID() == Stalls[i][1]) { + curStall = i; + exist = true; + if (player.getMaxStat(17) < Stalls[i][0]) { + player.getActionSender().sendMessage("Sorry, you need a thieving level of " + Stalls[i][0] + " to steal from that"); + player.setSpam(false); + return; + } + } + } + if (!exist) { + player.getActionSender().sendMessage("Sorry, this stall does not exist.. contact an admin?"); + Logger.println("Player " + player.getUsername() + " found a stall not added, ID: " + object.getID() + ", Coords: " + object.getLocation()); + player.setSpam(false); + return; + } + Bubble bubble = new Bubble(player, 609); + for (Player p : player.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + player.getActionSender().sendMessage("You attempt to steal from the " + object.getGameObjectDef().name); + player.setBusy(true); + + Instance.getDelayedEventHandler().add(new ShortEvent(player) { + public void action() { + + owner.setSpam(false); + if (object == null) { + owner.getActionSender().sendMessage("There are nothing to steal as this current time"); + owner.setSpam(false); + owner.setBusy(false); + return; + } + if (!chanceFormulae(Stalls[curStall][0])) { + + owner.getActionSender().sendMessage("You failed to steal from the " + object.getGameObjectDef().name); + owner.setSpam(false); + owner.setBusy(false); + if (Rand(20) <= 3) { + if (StallNpcs[curStall][0] == -1) { + } else { + Npc person = world.getNpc(StallNpcs[curStall][0], StallNpcs[curStall][1], StallNpcs[curStall][2], StallNpcs[curStall][3], StallNpcs[curStall][4]); + if (person != null) { + owner.npcThief[curStall] = true; + String str = caughtChats[Rand(caughtChats.length)]; + str = str.replace("-name-", owner.getUsername()); + owner.informOfNpcMessage(new ChatMessage(person, str, owner)); + person.resetPath(); + } + + } + } + return; + + } else { + world.registerGameObject(new GameObject(object.getLocation(), 341, object.getDirection(), object.getType())); + world.delayedSpawnObject(object.getLoc(), Stalls[curStall][3] * 1000); + owner.getActionSender().sendMessage("You successfully thieved from the " + object.getGameObjectDef().name); + owner.setSpam(false); + owner.setBusy(false); + + if (curStall == 5) { + InvItem loot = new InvItem(thieveGem(), 1); + owner.getInventory().add(loot); + } else { + InvItem loot = new InvItem(Stalls[curStall][4], 1); + owner.getInventory().add(loot); + } + owner.getActionSender().sendInventory(); + owner.incExp(17, Stalls[curStall][2] * ExpMultiplier, true); + owner.getActionSender().sendStat(17); + } + } + }); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + +} diff --git a/GameServer/src/msc/gs/plugins/listeners/ItemListener.java b/GameServer/src/msc/gs/plugins/listeners/ItemListener.java new file mode 100644 index 0000000..8c8d8cf --- /dev/null +++ b/GameServer/src/msc/gs/plugins/listeners/ItemListener.java @@ -0,0 +1,5 @@ +package msc.gs.plugins.listeners; + +public class ItemListener { + +} diff --git a/GameServer/src/msc/gs/plugins/listeners/ItemOnItemListener.java b/GameServer/src/msc/gs/plugins/listeners/ItemOnItemListener.java new file mode 100644 index 0000000..928897d --- /dev/null +++ b/GameServer/src/msc/gs/plugins/listeners/ItemOnItemListener.java @@ -0,0 +1,5 @@ +package msc.gs.plugins.listeners; + +public class ItemOnItemListener { + +} diff --git a/GameServer/src/msc/gs/plugins/listeners/ItemOnObjectListener.java b/GameServer/src/msc/gs/plugins/listeners/ItemOnObjectListener.java new file mode 100644 index 0000000..d0c78f9 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/listeners/ItemOnObjectListener.java @@ -0,0 +1,5 @@ +package msc.gs.plugins.listeners; + +public class ItemOnObjectListener { + +} diff --git a/GameServer/src/msc/gs/plugins/listeners/NpcListener.java b/GameServer/src/msc/gs/plugins/listeners/NpcListener.java new file mode 100644 index 0000000..63efd32 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/listeners/NpcListener.java @@ -0,0 +1,5 @@ +package msc.gs.plugins.listeners; + +public class NpcListener { + +} diff --git a/GameServer/src/msc/gs/plugins/listeners/ObjectListener.java b/GameServer/src/msc/gs/plugins/listeners/ObjectListener.java new file mode 100644 index 0000000..b59f4ef --- /dev/null +++ b/GameServer/src/msc/gs/plugins/listeners/ObjectListener.java @@ -0,0 +1,47 @@ +package msc.gs.plugins.listeners; + +import msc.gs.model.GameObject; +import msc.gs.model.Player; + +/** + * Used for Plugins. + * + * @author xEnt + */ +public interface ObjectListener { + + /** + * When a user activates an in-game Object. + * + * @param obj + * - the object model + * @param player + * - the player model + */ + public boolean onObjectAction(GameObject obj, String command, Player player); + + /** + * When an object is removed from the game. + * + * @param obj + * - the object model + */ + public boolean onObjectRemoval(GameObject obj); + + /** + * When an object is created in-game + * + * @param obj + * - the new object model + * @param player + * - the player model (might possibly be null) + */ + public boolean onObjectCreation(GameObject obj, Player player); + + /** + * + * @return - an integer array of object ID's that trigger these actions + */ + public int[] getAssociatedIDS(); + +} diff --git a/GameServer/src/msc/gs/plugins/plugs/Test.java b/GameServer/src/msc/gs/plugins/plugs/Test.java new file mode 100644 index 0000000..05a504d --- /dev/null +++ b/GameServer/src/msc/gs/plugins/plugs/Test.java @@ -0,0 +1,32 @@ +package msc.gs.plugins.plugs; + +import msc.gs.model.GameObject; +import msc.gs.model.Player; +import msc.gs.plugins.listeners.ObjectListener; + +/** + * Testting some triggering. + * + * @author xEnt + * + */ +public class Test implements ObjectListener { + + public int[] getAssociatedIDS() { + return new int[] {/* 19 */}; // altar. + } + + public boolean onObjectAction(GameObject obj, String command, Player player) { + player.getActionSender().sendMessage("You used the " + obj.getGameObjectDef().name); + return true; + } + + public boolean onObjectCreation(GameObject obj, Player player) { + return true; + } + + public boolean onObjectRemoval(GameObject obj) { + return true; + } + +} diff --git a/GameServer/src/msc/gs/plugins/plugs/skills/Mining.java b/GameServer/src/msc/gs/plugins/plugs/skills/Mining.java new file mode 100644 index 0000000..1c9ff59 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/plugs/skills/Mining.java @@ -0,0 +1,170 @@ +package msc.gs.plugins.plugs.skills; + +import msc.config.Formulae; +import msc.gs.Instance; +import msc.gs.event.ShortEvent; +import msc.gs.event.SingleEvent; +import msc.gs.external.EntityHandler; +import msc.gs.external.ObjectMiningDef; +import msc.gs.model.ActiveTile; +import msc.gs.model.Bubble; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Player; +import msc.gs.plugins.listeners.ObjectListener; +import msc.gs.tools.DataConversions; + +public class Mining implements ObjectListener { + + @Override + public int[] getAssociatedIDS() { + // rock ID's + return new int[] { 176, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 195, 196, 210, 211 }; + } + + @Override + public boolean onObjectAction(final GameObject object, String command, Player owner) { + + owner.setSkillLoops(0); + handleMining(object, owner, owner.click); + return true; + } + + // just picks the best pickaxe the player can use. + public int getAxe(Player p) { + int lv = p.getCurStat(14); + for (int i = 0; i < Formulae.miningAxeIDs.length; i++) { + if (p.getInventory().countId(Formulae.miningAxeIDs[i]) > 0) { + if (lv >= Formulae.miningAxeLvls[i]) { + return Formulae.miningAxeIDs[i]; + } + } + } + return -1; + } + + public void handleMining(final GameObject object, Player owner, int click) { + if (owner.isBusy() && !owner.inCombat()) { + return; + } + if (!owner.withinRange(object, 1)) + return; + final GameObject newobject = Instance.getWorld().getTile(object.getX(), object.getY()).getGameObject(); + final ObjectMiningDef def = EntityHandler.getObjectMiningDef(newobject.getID()); + if (def == null || def.getRespawnTime() < 1) { + owner.getActionSender().sendMessage("There is currently no ore available in this rock."); + return; + } + final InvItem ore = new InvItem(def.getOreId()); + if (owner.click == 1) { + owner.getActionSender().sendMessage("This rock contains " + ore.getDef().getName() + "."); + return; + } + + if (owner.getCurStat(14) < def.getReqLevel()) { + owner.getActionSender().sendMessage("You need a mining level of " + def.getReqLevel() + " to mine this rock."); + return; + } + int axeId = getAxe(owner); + + if (axeId < 0) { + owner.getActionSender().sendMessage("You need a pickaxe to mine this rock."); + return; + } + final int axeID = axeId; + int retrytimes = -1; + final int swings = owner.getSkillLoops(); + final int mineLvl = owner.getCurStat(14); + int reqlvl = 1; + switch (axeID) { + case 1258: + retrytimes = 2; + break; + case 1259: + retrytimes = 4; + reqlvl = 6; + break; + case 1260: + retrytimes = 6; + reqlvl = 21; + break; + case 1261: + retrytimes = 8; + reqlvl = 31; + break; + case 1262: + retrytimes = 12; + reqlvl = 41; + break; + + } + + if (reqlvl > mineLvl) { + owner.getActionSender().sendMessage("You need to be level " + reqlvl + " to use this pick."); + return; + } + owner.setBusy(true); + + owner.getActionSender().sendSound("mine"); + Bubble bubble = new Bubble(owner, axeId); + for (Player p : owner.getViewArea().getPlayersInView()) { + p.informOfBubble(bubble); + } + + final int retrytime = retrytimes; + owner.lastMineTimer = System.currentTimeMillis(); + owner.getActionSender().sendMessage("You swing your pick at the rock..."); + Instance.getDelayedEventHandler().add(new ShortEvent(owner) { + public void action() { + if (Formulae.getOre(def, owner.getCurStat(14), axeID)) { + if (DataConversions.random(0, 200) == 0) { + InvItem gem = new InvItem(Formulae.getGem(), 1); + owner.incExp(14, 100, true); + owner.getInventory().add(gem); + owner.getActionSender().sendMessage("You found a gem!"); + } else { + owner.getInventory().add(ore); + owner.getActionSender().sendMessage("You manage to obtain some " + ore.getDef().getName() + "."); + owner.setSkillLoops(0); + owner.incExp(14, def.getExp(), true); + owner.getActionSender().sendStat(14); + world.registerGameObject(new GameObject(object.getLocation(), 98, object.getDirection(), object.getType())); + world.delayedSpawnObject(newobject.getLoc(), def.getRespawnTime() * 1000); + } + owner.getActionSender().sendInventory(); + } else { + boolean retry = false; + if (retrytime >= swings) + retry = true; + owner.getActionSender().sendMessage("You only succeed in scratching the rock."); + if (retry) { + world.getDelayedEventHandler().add(new SingleEvent(owner, 500) { + public void action() { + owner.setSkillLoops(swings + 1); + handleMining(object, owner, owner.click); + } + }); + } + if (!retry) { + owner.isMining(false); + owner.setSkillLoops(0); + } + } + owner.setBusy(false); + } + }); + } + + @Override + public boolean onObjectCreation(GameObject obj, Player player) { + + return true; + } + + @Override + public boolean onObjectRemoval(GameObject obj) { + + return true; + } + +} diff --git a/GameServer/src/msc/gs/plugins/quests/CooksAssistant.java b/GameServer/src/msc/gs/plugins/quests/CooksAssistant.java new file mode 100644 index 0000000..398ac10 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/CooksAssistant.java @@ -0,0 +1,201 @@ +package msc.gs.plugins.quests; + +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.quest.Quest; +import msc.gs.quest.QuestAction; + +/** + * Quest: Cook's Assistant (v1.0) Status: COMPLETE Start: Lumbridge cook (id 7) + * Items: 19, 136, 22 Reward: 1 quest point, 350 cooking xp + * + * @author youKnowWho + */ +public class CooksAssistant extends Quest { + private static final int COOK_ID = 7; + private static final int ITEM_EGG = 19; + private static final int ITEM_FLOUR = 136; + private static final int ITEM_MILK = 22; + private static final int REWARD_XP = 350; + private static final String[] FIRST_MENU = new String[] { "Oh, ok, sorry.", "Well maybe I can help?" }; + private static final String[] SECOND_MENU = new String[] { "Sure, what do you need?", "No, sorry" }; + private static final int QUEST_POINTS = 1; + + public void init() { + associateNpc(COOK_ID); + } + + public CooksAssistant() { + } + + public String getName() { + return "Cook's Assistant"; + } + + public int getUniqueID() { + return 0; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) { + int stage = player.getQuestStage(this); + + if (stage == -1) // Quest hasn't been started + { + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Sorry, I can't talk right now, I'm very busy!", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, FIRST_MENU); + player.setBusy(true); + sleep(); + switch (option) { + + case 0: + player.setBusy(false); + npc.unblock(); + break; + case 1: + + sendChat("Perhaps you can... You see, it's the duke's birthday tomorrow", npc, player); + + sendChat("And I haven't got the ingredients for his cake yet!", npc, player); + + sendChat("Do you think you could collect them for me?", npc, player); + + player.setBusy(false); + option = getMenuOption(player, SECOND_MENU); + + player.setBusy(true); + switch (option) { + case 0: + + sendChat("Oh thank you so much! I'm going to need an egg, some milk and a pot of flour.", npc, player); + + sendChat("Please, hurry!", npc, player); + player.setQuestStage(getUniqueID(), 1); + player.setBusy(false); + npc.unblock(); + + break; + case 1: + + sendChat("Fine. I didn't want your help anyway.", npc, player); + player.setBusy(false); + npc.unblock(); + + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + + } else + return; + } else if (stage == 1) { + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Sorry, I can't - oh, it's you! Do you have the ingredients?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "I forgot what to get!", "Yes, i have them", "No, not yet"); + player.setBusy(true); + sleep(); + if (option == 0) { + + sendChat("I need an egg, a pot flour and some milk! And quickly!", npc, player); + player.setBusy(false); + npc.unblock(); + + } else if (option == 1) { + + // check items + if (player.getInventory().hasItemId(ITEM_EGG) && player.getInventory().hasItemId(ITEM_FLOUR) && player.getInventory().hasItemId(ITEM_MILK)) { + finishQuest(player, npc); + } else { + sendChat("No you don't! Oh please, don't get my hopes up like that!", npc, player); + player.setBusy(false); + npc.unblock(); + } + + } else { + + sendChat("Oh, please hurry!", npc, player); + player.setBusy(false); + npc.unblock(); + + } + + } + } else if (stage == 0) { + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != COOK_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Oh hi " + player.getUsername() + ". Thanks for your help! I can't talk at the moment though.", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + + private void finishQuest(final Player player, final Npc npc) { + sleep(1000); + if (player.getQuestStage(this) == COMPLETE) { + player.setBusy(false); + npc.unblock(); + return; + } + sendChat("Oh, thank you so much " + player.getUsername() + "!", npc, player); + + sendChat("I'm afraid don't have any money to reward you with", npc, player, 3000); + + sendChat("But I can give you some cooking tips!", npc, player); + + player.incExp(7, REWARD_XP, false); + player.getActionSender().sendStat(7); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.getInventory().remove(ITEM_EGG, 1); + player.getInventory().remove(ITEM_MILK, 1); + player.getInventory().remove(ITEM_FLOUR, 1); + player.getActionSender().sendInventory(); + player.incQuestPoints(QUEST_POINTS); + player.setBusy(false); + npc.unblock(); + } +} diff --git a/GameServer/src/msc/gs/plugins/quests/Dorics.java b/GameServer/src/msc/gs/plugins/quests/Dorics.java new file mode 100644 index 0000000..d0cf785 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/Dorics.java @@ -0,0 +1,220 @@ +package msc.gs.plugins.quests; + +import msc.gs.quest.*; +import msc.gs.model.*; +import msc.gs.event.*; + +/** + * Quest: Doric's Quest (v1.1) 4/5/2009 (uid: 7) Status: COMPLETE (untested) + * Start: Doric (326, 490) Items: 6 x clay (149) 4 x copper (150) 2 x iron (151) + * Reward: 1 quest point, 1500gp, 1000 smithing exp and use of Doric's anvils + * + * @author punKrockeR + */ +public class Dorics extends Quest { + public static final int DORIC_ID = 144; + public static final int ANVIL1_ID = 177; + public static final int ANVIL1_X = 327; + public static final int ANVIL1_Y = 490; + public static final int ANVIL2_ID = 177; + public static final int ANVIL2_X = 327; + public static final int ANVIL2_Y = 487; + private static final int QUEST_POINTS = 1; + private static final int REWARD_GP = 1500; + private static final int REWARD_EXP = 1000; + + public void init() { + associateNpc(DORIC_ID); + // associateObject(ANVIL1_ID, ANVIL1_X, ANVIL1_Y); + // associateObject(ANVIL2_ID, ANVIL2_X, ANVIL2_Y); + } + + /* + * public boolean isObjectAssociated(GameObject object, Player player) { + * if(object.getID() == ANVIL1_ID && (object.getX() == ANVIL1_X && + * object.getY() == ANVIL1_Y) || (object.getX() == ANVIL2_X && object.getY() + * == ANVIL2_Y)) return player.getQuestStage(getUniqueID()) != COMPLETE; + * + * return false; } + */ + + public String getName() { + return "Doric's Quest"; + } + + public int getUniqueID() { + return 7; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + player.setBusy(true); + npc.blockedBy(player); + + if (npc.getID() == DORIC_ID) + handleDoricChat(npc, player); + } else if (action == action.ITEM_USED_ON_OBJECT) { + if (args.length < 2 || !(args[0] instanceof InvItem) || !(args[1] instanceof GameObject)) + return; + + final InvItem item = (InvItem) args[0]; + final GameObject obj = (GameObject) args[1]; + } + } + + private void handleDoricChat(final Npc npc, final Player player) { + int stage = player.getQuestStage(this); + if (stage == Quest.COMPLETE) { + sendChat("Be sure to use my anvils at anytime friend!", npc, player); + sendChat("I will do that, thanks.", player, npc); + player.setBusy(false); + npc.unblock(); + return; + } + + if (stage == -1) { + sendChat("Why are you so grumpy little man?", player, npc); + sendChat("I'm sick of people sneaking into my house to use my anvils!", npc, player); + sendChat("But they're the only anvils in this part of town", player, npc); + sendChat("It's very selfish of you to keep them all to yourself", player, npc); + sendChat("They're my anvils and it's my house", npc, player); + sendChat("So unless they earn my respect as a smither, I'll be as selfish as I want!", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "How can I earn your respect?", "No wonder no one likes you", "But... I'm bigger than you"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Well, I can always use a helping hand", npc, player); + sendChat("What do you need help with?", player, npc); + sendChat("I'm crafting some amulets at the moment", npc, player); + sendChat("But I've just run out of materials to make them with", npc, player); + sendChat("If you're serious about helping me", npc, player); + sendChat("Then collecting them for me would be a great start", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "I don't have time", "I don't work for little people", "Alright, what do you need?"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Fine, leave me to it then. But don't expect me to let you use my anvils!", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 1) { + sendChat("I'm vertically challenged!", npc, player); + sendChat("Get out of here before I smelt an iron bar to your ass", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 2) { + sendChat("I need six pieces of clay, four copper ores and two iron ores", npc, player); + sendChat("Save me some time and bring those back here for me", npc, player); + sendChat("And I'll let you use my anvils any time you need to", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "I'll get to it then", "Maybe later"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + player.setQuestStage(getUniqueID(), 1); // Start quest + sendChat("Thank you " + player.getUsername(), npc, player); + sendChat("That would be a great help", npc, player); + sendChat("I'll just wait here for you to come back then", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("Fine, but don't expect me to let you use my anvils in the meantime!", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + } else if (option == 1) { + sendChat("I don't care much for friends", npc, player); + sendChat("So get outta my house!", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("I'm big where it counts, " + (player.isMale() ? "buddy" : "missy") + "!", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 1) { + sendChat("Have you got my materials yet?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "Yes, I have", "No, not yet", "I forgot what to get!"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + + if (countItem(player, 149) >= 6 && countItem(player, 150) >= 4 && countItem(player, 151) >= 2 && stage != COMPLETE) { + sendChat("Excellent! Hand 'em over, then", npc, player); + player.getActionSender().sendMessage("You hand Doric the materials"); + for (int i = 0; i < 6; i++) + takeItem(player, new InvItem(149)); + for (int i = 0; i < 4; i++) + takeItem(player, new InvItem(150)); + for (int i = 0; i < 2; i++) + takeItem(player, new InvItem(151)); + sleep(); + sendChat("Thanks for your help " + player.getUsername(), npc, player); + sendChat("Anyone who lends a hand is welcome in my workshop", npc, player); + sendChat("Come back and use my anvils whenever you like!", npc, player, 1200); + player.incQuestPoints(QUEST_POINTS); + player.incExp(13, REWARD_EXP, false); + giveItem(player, new InvItem(10, REWARD_GP)); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("Liar! You're not doing a very good job of earning my trust!", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (option == 1) { + sendChat("Well come and talk to me when you do", npc, player); + sendChat("And I'll consider letting you use my anvils", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 2) { + sendChat("I need six pieces of clay, four copper ores and two iron ores", npc, player); + sendChat("Oh right, thanks. I'll get back to it then", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + npc.unblock(); + player.setBusy(true); + } + + public Dorics() { + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/plugins/quests/GoblinDiplomacy.java b/GameServer/src/msc/gs/plugins/quests/GoblinDiplomacy.java new file mode 100644 index 0000000..700ec7c --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/GoblinDiplomacy.java @@ -0,0 +1,632 @@ +package msc.gs.plugins.quests; + +import msc.gs.quest.*; +import msc.gs.model.*; +import msc.gs.event.*; + +/** + * Quest: Goblin Diplomacy (v1.0) 8/5/2009 (uid: 10) Status: COMPLETE (untested) + * Start: Bartender (id 150) 255, 628 Goblins (323, 448) Items: Goblin armour + * (273) Orange goblin armour (274) Blue goblin armour (275) Reward: 5 quest + * points, 1000 crafting exp and 1 gold bar + * + * TODO: restrict armours from being seen by players not on the quest + * + * @author punKrockeR + */ +public class GoblinDiplomacy extends Quest { + private static final int QUEST_POINTS = 5; + private static final int REWARD_EXP = 1000; + private static final int BENTNOZE_ID = 152; + private static final int WARTFACE_ID = 151; + private static final int BARTENDER_ID = 150; + private static final int WYSON_ID = 116; + private static final int AGGIE_ID = 125; + private static final int WOAD_LEAF_ID = 281; + private static final int BERRIES_ID = 236; + private static final int ONION_ID = 241; + private static final int ORANGE_ARMOUR_ID = 274; + private static final int GOBLIN_ARMOUR_ID = 273; + private static final int RED_DYE_ID = 238; + private static final int YELLOW_DYE_ID = 239; + private static final int BLUE_DYE_ID = 272; + private static final int ORANGE_DYE_ID = 282; + private static final int BLUE_ARMOUR_ID = 275; + + public void init() { + associateNpc(BENTNOZE_ID); + associateNpc(WARTFACE_ID); + associateNpc(BARTENDER_ID); + // associateNpc(WYSON_ID); + associateNpc(AGGIE_ID); + associateItem(GOBLIN_ARMOUR_ID); + associateItem(RED_DYE_ID); + associateItem(YELLOW_DYE_ID); + associateItem(BLUE_DYE_ID); + associateItem(ORANGE_DYE_ID); + // associateItem(ORANGE_ARMOUR_ID); + } + + /** + * @return if the given Item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) { + int stage = player.getQuestStage(this); + + switch (item.getID()) { + case ORANGE_ARMOUR_ID: + BLUE_ARMOUR_ID: return stage >= 1; + default: + return true; + } + } + + public String getName() { + return "Goblin Diplomacy"; + } + + public int getUniqueID() { + return 10; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) { + + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + + + if (npc.getID() == BENTNOZE_ID) + handleBentnozeChat(npc, player); + else if (npc.getID() == WARTFACE_ID) + handleWartfaceChat(npc, player); + else if (npc.getID() == BARTENDER_ID) + handleBartenderChat(npc, player); + else if (npc.getID() == WYSON_ID) + handleWysonChat(npc, player); + else if (npc.getID() == AGGIE_ID) + handleAggieChat(npc, player); + } else if (action == QuestAction.ITEM_USED_ON_ITEM) { + if (!(args[0] instanceof InvItem) && !(args[1] instanceof InvItem)) + return; + + final InvItem item1 = (InvItem) args[0]; + final InvItem item2 = (InvItem) args[1]; + + if ((item1.getID() == ORANGE_DYE_ID && item2.getID() == GOBLIN_ARMOUR_ID) || (item1.getID() == GOBLIN_ARMOUR_ID && item2.getID() == ORANGE_DYE_ID)) { + player.setBusy(true); + sendMessage(player, "You dye the goblin armour orange"); + sleep(1200); + takeItem(player, item1, item2); + giveItem(player, ORANGE_ARMOUR_ID); + player.setBusy(false); + return; + } else if ((item1.getID() == BLUE_DYE_ID && item2.getID() == GOBLIN_ARMOUR_ID) || (item1.getID() == GOBLIN_ARMOUR_ID && item2.getID() == BLUE_DYE_ID)) { + player.setBusy(true); + sendMessage(player, "You dye the goblin armour dark blue"); + sleep(1200); + takeItem(player, item1, item2); + giveItem(player, BLUE_ARMOUR_ID); + player.setBusy(false); + return; + } else if ((item1.getID() == RED_DYE_ID && item2.getID() == YELLOW_DYE_ID) || (item1.getID() == YELLOW_DYE_ID && item2.getID() == RED_DYE_ID)) { + player.setBusy(true); + sendMessage(player, "You mix the two dyes and make an orange dye"); + sleep(1200); + takeItem(player, item1, item2); + giveItem(player, ORANGE_DYE_ID); + player.setBusy(false); + return; + } + } + } + + private void handleAggieChat(final Npc npc, final Player player) { + sendChat("What can I help you with?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "What could you make for me", "Cool, do you turn people into frogs?", "You mad old witch, you can't help me", "Can you make dyes for me please"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("I mostly just make what i find pretty", npc, player); + sendChat("I sometimes make dye for the womens clothes, brighten the place up", npc, player); + sendChat("I can make red, yellow and blue dyes. would you like some?", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "What do you need to make some red dye please", "What do you need to make some yellow dye please", "What do you need to make some blue dye please", "No thanks, I am happy the colour I am"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + redDye(npc, player); + } else if (option == 1) { + yellowDye(npc, player); + } else if (option == 2) { + blueDye(npc, player); + } else { + sendChat("You are easily pleased with yourself then", npc, player); + sendChat("When you need dyes, come to me", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (option == 1) { + sendChat("Oh, not for years, but if you meet a talking chicken,", npc, player); + sendChat("You have probably met the professor in the manor north of here", npc, player); + sendChat("A few years ago it was flying fish, that machine is a menace", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 2) { + sendChat("Oh, you like to call a witch names, do you?", npc, player); + + if (countItem(player, 10) >= 20) { + sendMessage(player, "Aggie waves her hands about, and you seem to be 20 coins poorer"); + takeItem(player, new InvItem(10, 20)); + sleep(); + sendChat("Thats a fine for insulting a witch, you should learn some respect", npc, player, 1200); + } else { + sendChat("You should be careful about insulting a witch", npc, player); + sendChat("You never know what shape you could wake up in", npc, player, 1200); + } + + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("What sort of dye would you like? red, yellow or blue?", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "What do you need to make some red dye please", "What do you need to make some yellow dye please", "What do you need to make some blue dye please", "None thanks"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + redDye(npc, player); + } else if (option == 1) { + yellowDye(npc, player); + } else if (option == 2) { + blueDye(npc, player); + } else { + sendChat("Suit yourself", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + } + + private void redDye(final Npc npc, final Player player) { + sendChat("3 Lots of red berries, and 5 coins, to you", npc, player); + handleDye("red", BERRIES_ID, 3, "berries", 238, npc, player); + } + + private void yellowDye(final Npc npc, final Player player) { + sendChat("Yellow is a strange colour to get, comes from onion skins", npc, player); + sendChat("I need 2 onions, and 5 coins to make yellow", npc, player); + handleDye("yellow", ONION_ID, 2, "onions", YELLOW_DYE_ID, npc, player); + } + + private void blueDye(final Npc npc, final Player player) { + sendChat("2 Woad leaves, and 5 coins, to you", npc, player); + handleDye("blue", WOAD_LEAF_ID, 2, "leaves", BLUE_DYE_ID, npc, player); + } + + private void handleDye(String colour, int itemId, int amount, String itemName, int dyeId, final Npc npc, final Player player) { + player.setBusy(false); + int option = getMenuOption(player, "Okay, make me some " + colour + " dye please", "I don't think I have all the ingredients yet", "I can do without dye at that price"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + if (countItem(player, itemId) < amount) { + sendChat("Ah wait, sorry. I don't have all the ingredients yet", player, npc); + sendChat("You know what you need to get now, come back when you have them", npc, player); + sendChat("Goodbye for now", npc, player, 2000); + player.setBusy(false); + npc.unblock(); + sendMessage(player, "You don't have enough " + itemName + " for the dye!"); + return; + } + + if (countItem(player, 10) < 5) { + sendChat("Ah wait, sorry, I don't have enough coins on me", player, npc); + sendChat("Well come back when you do and I'll make you some dye", npc, player, 2000); + sendMessage(player, "You don't have enough coins for the dye!"); + player.setBusy(false); + npc.unblock(); + return; + } + + sendMessage(player, "You hand the " + itemName + " and payment to Aggie"); + player.getActionSender().sendSound("coin"); + takeItem(player, new InvItem(10, 5), new InvItem(itemId, 1)); + sleep(); + sendMessage(player, "She takes a red bottle from nowhere and hands it to you"); + giveItem(player, dyeId); + sleep(); + sendChat("Thank you", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 1) { + sendChat("You know what you need to get now, come back when you have them", npc, player); + sendChat("Goodbye for now", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 2) { + sendChat("That's your choice, but I would think you have killed for less", npc, player); + sendChat("I can see it in your eyes", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + } + } + + private void handleWysonChat(final Npc npc, final Player player) { + sendChat("I am the gardener round here", npc, player); + sendChat("Do you have any gardening that needs doing?", npc, player); + + if (getQuestStage(player) <= 1 || getQuestStage(player) == COMPLETE) { + sendChat("Not right now thanks", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + + player.setBusy(false); + int option = getMenuOption(player, "I'm looking for woad leaves", "Not right now thanks"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Well luckily for you I may have some around here somewhere", npc, player); + sendChat("Can I buy one please?", player, npc); + sendChat("How much are you willing to pay?", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "How about 5 coins?", "How about 10 coins?", "How about 15 coins?", "How about 20 coins?"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0 || option == 1) // 5 or 10 + { + sendChat("No no thats far too little. Woad leaves are hard to get you know", npc, player); + sendChat("I used to have plenty but someone kept stealing them off me", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + if (option == 2) // 15 + { + sendChat("Mmmm ok that sounds fair.", npc, player); + + if (countItem(player, 10) < 15) { + sendChat("I dont have enough coins to buy the leaves. I'll come back later", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + + takeItem(player, new InvItem(10, 15)); + sendMessage(player, "You give Wyson 15 coins"); + sleep(); + giveItem(player, WOAD_LEAF_ID); + sendMessage(player, "Wyson the gardener gives you some woad leaves"); + sleep(1200); + player.setBusy(false); + npc.unblock(); + } else // 20 + { + sendChat("Ok that's more than fair.", npc, player); + takeItem(player, new InvItem(10, 20)); + sendMessage(player, "You give Wyson 20 coins"); + sleep(); + takeItem(player, WOAD_LEAF_ID); + sendMessage(player, "Wyson the gardener gives you some woad leaves"); + sleep(); + sendChat("Here have some more you're a generous person", npc, player); + takeItem(player, WOAD_LEAF_ID); + sendMessage(player, "Wyson the gardener gives you some more leaves"); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else { + player.setBusy(false); + npc.unblock(); + } + } + + private void handleBartenderChat(final Npc npc, final Player player) { + int stage = getQuestStage(player); + + if (stage == -1) { + sendChat("Hi there how may i help you", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "Could I buy a beer please?", "Not very busy in here today is it?"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Sure that will be 2 gold coins please", npc, player); + + if (countItem(player, 10) >= 2) { + sendChat("Ok here you go thanks", player, npc, 2000); + player.getActionSender().sendMessage("You buy a beer"); + takeItem(player, new InvItem(10, 2)); + giveItem(player, 193); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + player.getActionSender().sendMessage("You don't have enough coins to buy the beer!"); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else { + queueChat(npc, player, "No it was earlier", "There was a guy in here saying the goblins up by the mountain", "Are arguing again", "Of all things about the colour of their armour.", "Knowing the goblins, it could easily turn into a full blown war", "Which wouldn't be good", "Goblin wars make such a mess of the countryside"); + sendChat("Well if I have time I'll see if I can go and knock some sense into them", player, npc, 1200); + setStage(player, 1); // Start quest + player.setBusy(false); + npc.unblock(); + } + } else { + player.setBusy(false); + int option = getMenuOption(player, "Could I buy a beer please?", stage == COMPLETE ? "I fixed the goblin problem" : "I'm negotiating with the goblins"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Sure that will be 2 gold coins please", npc, player); + + if (countItem(player, 10) >= 2) { + sendChat("Ok here you go thanks", player, npc, 2000); + player.getActionSender().sendMessage("You buy a beer"); + takeItem(player, new InvItem(10, 2)); + giveItem(player, 193); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + player.getActionSender().sendMessage("You don't have enough coins to buy the beer!"); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else { + if (stage == COMPLETE) { + sendChat("Thanks lad", npc, player); + sendChat("Hard work like that deserves a beer", npc, player, 2000); + player.getActionSender().sendMessage("The bartender hands you a free beer"); + giveItem(player, 193); + sleep(1200); + sendChat("Cheers mate", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + } else { + sendChat("Well goodluck with that", npc, player); + sendChat("If you sort it out, come back and I'll shout you a beer on the house", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + } + } + + private void handleBentnozeChat(final Npc npc, final Player player) { + int stage = getQuestStage(player); + final Npc wartface = World.getWorld().getNpc(WARTFACE_ID, 314, 330, 441, 457); + + if (wartface == null) + return; + + handleWartfaceChat(wartface, player); + } + + private void handleWartfaceChat(final Npc npc, final Player player) { + int stage = player.getQuestStage(this); + final Npc bentnoze = World.getWorld().getNpc(BENTNOZE_ID, 314, 330, 441, 457); + + if (stage == COMPLETE) { + sendChat("Now you've solved our argument we gotta think of something else to do", npc, player); + sendChat("Yep, we bored now", bentnoze, player, 1200); + npc.unblock(); + player.setBusy(false); + return; + } + + argue(player); + + if (npc == null) + return; + + if (stage == -1 || stage == 1) { + if (stage == 1) + startQuest(npc, player); + } else if (stage == 2) { + sendChat("Oh it you", npc, player, 2000); + sendChat("Have you got some orange goblin armour yet?", npc, player); + + if (hasItem(player, ORANGE_ARMOUR_ID)) { + sendChat("Yeah I have it right here", player, npc); + sendMessage(player, "You hand Wartface the armour"); + takeItem(player, ORANGE_ARMOUR_ID); + sleep(); + sendChat("No I don't like that much", npc, player); + sendChat("It clashes with my skin colour", bentnoze, player); + sendChat("Try bringing us dark blue armour", npc, player, 1200); + player.setQuestStage(this, 3); + player.setBusy(false); + npc.unblock(); + bentnoze.unblock(); + return; + } else { + sendChat("Err no", player, npc, 2000); + sendChat("Come back when you have some", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 3) { + sendChat("Oh it you", npc, player, 2000); + sendChat("Have you got us some dark blue goblin armour?", npc, player); + + if (hasItem(player, BLUE_ARMOUR_ID)) { + sendChat("Yes, here you go", player, npc); + sendMessage(player, "You hand Wartface the armour"); + takeItem(player, BLUE_ARMOUR_ID); + sleep(); + sendChat("Doesn't seem quite right", npc, player); + sendChat("Maybe if it was a bit lighter", bentnoze, player); + sendChat("Yeah try light blue", npc, player); + sendChat("I thought that was the amour you were changing from", player, npc); + sendChat("But never mind, anything is worth a try to avoid a war", player, npc, 1200); + + player.setQuestStage(this, 4); + player.setBusy(false); + npc.unblock(); + bentnoze.unblock(); + return; + } else { + sendChat("Not yet", player, npc, 2000); + sendChat("Come back when you have some", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 4) { + if (player.getQuestStage(this) == COMPLETE) { + player.setBusy(false); + npc.unblock(); + bentnoze.unblock(); + return; + } + sendChat("Oh it you", npc, player, 2000); + sendChat("Have you got some light blue goblin armour yet?", npc, player); + + if (hasItem(player, GOBLIN_ARMOUR_ID)) { + sendChat("Sigh...", player, npc, 2000); + sendChat("Yes, here it is", player, npc); + sendMessage(player, "You hand Wartface the armour"); + takeItem(player, GOBLIN_ARMOUR_ID); + sleep(); + sendChat("That is rather nice", npc, player); + sendChat("Yes i could see myself wearing somethin' like that", bentnoze, player); + sendChat("It a deal then", npc, player); + sendChat("Light blue it is", npc, player); + sendChat("Thank you for sorting our argument", npc, player, 1200); + player.setQuestStage(this, COMPLETE); + player.incQuestPoints(QUEST_POINTS); + player.incExp(12, REWARD_EXP, false); + sleep(); + sendMessage(player, "General Wartface gives you a gold bar as thanks"); + giveItem(player, 172); + player.setBusy(false); + npc.unblock(); + bentnoze.unblock(); + return; + } else { + sendChat("Not yet", player, npc, 2000); + sendChat("Come back when you have some", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + } + + private void startQuest(final Npc npc, final Player player) { + player.setBusy(false); + int option = getMenuOption(player, "Why are you arguing about the colour of your armour?", "Wouldn't you prefer peace?", "Do you want me to pick an armour colour for you?"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + final Npc bentnoze = World.getWorld().getNpc(BENTNOZE_ID, 314, 330, 441, 457); + + if (bentnoze == null) { + player.getActionSender().sendMessage("Quest error: Bentnoze missing"); + player.setBusy(false); + return; + } + + if (option == 0) { + queueChat(npc, player, "We decide to celebrate goblin new century", "By changing the colour of our armour", "Light blue get boring after a bit", "And we want change", "Problem is they want different change to us"); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 1) { + sendChat("Yeah peace is good as long as it is peace wearing green armour", npc, player); + sendChat("But green to much like skin!", bentnoze, player); + sendChat("Nearly make you look naked!", bentnoze, player, 1200); + player.setBusy(false); + npc.unblock(); + bentnoze.unblock(); + return; + } else { + sendChat("Different to either green or red", player, npc); + sendChat("Hmm me dunno what that'd look like", npc, player); + sendChat("You'd have to bring me some, so us could decide", npc, player); + sendChat("Yep bring us orange armour", bentnoze, player); + sendChat("Yep orange might be good", npc, player, 1200); + + player.setQuestStage(this, 2); + player.setBusy(false); + npc.unblock(); + bentnoze.unblock(); + return; + } + } + + private Npc argue(final Player player) { + final Npc wartface = World.getWorld().getNpc(WARTFACE_ID, 321, 445, 326, 449); + final Npc bentnoze = World.getWorld().getNpc(BENTNOZE_ID, 321, 445, 326, 449); + + if (wartface == null || bentnoze == null) { + player.setBusy(false); + return null; + } + + sendChat("Green armour best", wartface, player, 2000); + sendChat("No, no red every time", bentnoze, player, 2000); + sendChat("Go away human, we busy", wartface, player, 2000); + player.setBusy(false); + wartface.unblock(); + bentnoze.unblock(); + return wartface; + } + + public GoblinDiplomacy() { + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/plugins/quests/ImpCatcher.java b/GameServer/src/msc/gs/plugins/quests/ImpCatcher.java new file mode 100644 index 0000000..e5b579c --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/ImpCatcher.java @@ -0,0 +1,360 @@ +package msc.gs.plugins.quests; + +import msc.gs.external.EntityHandler; +import msc.gs.model.InvItem; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.quest.Quest; +import msc.gs.quest.QuestAction; + +/** + * Quest: Imp Catcher (v1.0) 5/1/2009 Status: COMPLETE Start: Talborn the wizard + * (id 17), 218, 1635 Items: 231, 232, 233, 234 Reward: 1 quest point, 350 magic + * xp + * + * @author punKrockeR + */ +public class ImpCatcher extends Quest { + private static final int TALBORN_ID = 17; + private static final int RED_BEAD = 231; + private static final int YELLOW_BEAD = 232; + private static final int BLACK_BEAD = 233; + private static final int WHITE_BEAD = 234; + private static final int ITEM_REWARD = 235; + private static final int REWARD_XP = 350; + private static final String[] FIRST_MENU = new String[] { "No way you crazy man", "Sure, why not" }; + private static final String[] SECOND_MENU = new String[] { "Yeah I did", "Not yet" }; + private static final int DEFAULT_EVENT_DELAY = 3200; + private static final int QUEST_POINTS = 1; + + /** + * @return the quest's name + */ + public String getName() { + return "Imp Catcher"; + } + + /** + * @return this quest's unique id + */ + public int getUniqueID() { + return 3; + } + + /** + * Initialises the quest + */ + public void init() { + associateNpc(TALBORN_ID); + } + + /** + * Handles the given quest action + */ + public void handleAction(QuestAction action, Object[] args, final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != TALBORN_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + if (stage == -1) + startQuest(player, npc); + else + handleTalk(player, npc); + } + } + + /** + * Handles npc chat if the quest hasn't been started yet + */ + private void startQuest(final Player player, final Npc npc) { + sendChat("...Avada kedavra!", npc, player); + + spellPlayer(player, npc); + sleep(1000); + player.setBusy(true); + npc.blockedBy(player); + sendChat("wow!!", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("What? Huh? Get out of the way you fool!", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("You shot me you stupid sod", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hmm, indeed. But it worked!", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Yeah it did. You burnt my sleeve.", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Collateral damage. A necessary casualty.", npc, player); + sendChat("Your sleeve is expendable in this war", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("What war?", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Well the war against those nasty little imps of course", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Imps? What threat could they possibly pose?", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Those little red demons stole my beads!", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Riight.. your beads. And what's so special about these beads?", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Why, absolutely nothing. It's the principle of the matter.", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Surely it can't be that hard to get them to give them back", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Oh really? Why don't you try and get them back then", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Yeah right, chase imps around for free. You're crazier than I thought", player, npc); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Free? Nonsense. I'd be happy to reward you.", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hmm. What kind of reward?", player, npc); + npc.blockedBy(player); + player.setBusy(true); + sendChat("I've got a few valuable things lying around, I'll find something.", npc, player); + npc.blockedBy(player); + player.setBusy(true); + sendChat("How about it? Would you help an old wizard out?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, FIRST_MENU); + if (option == -1) { + npc.unblock(); + player.setBusy(false); + return; + } + sleep(2000); + + player.setBusy(true); + npc.blockedBy(player); + if (option == 1) { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Excellent! Begin at once if you wish to collect them within a decade", npc, player); + player.setBusy(true); + npc.blockedBy(player); + sendChat("There are four beads! Red, white, black, and yellow.", npc, player); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ahh you said... nevermind", player, npc); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("I'll come back when I get the beads...", player, npc); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("If! If you get the beads. Don't underestimate the little beasts!", npc, player); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Sure, whatever old man.", player, npc); + + player.setBusy(true); + npc.blockedBy(player); + player.setQuestStage(getUniqueID(), 1); + sendChat("Tarantallegra!", npc, player); + spellPlayer(player, npc); + + sendChat("Ouch! Would you bloody wait til I'm gone!", player, npc); + player.setBusy(false); + npc.unblock(); + + sendChat("Move it!", npc, player); + + } else { + player.setBusy(true); + npc.blockedBy(player); + sendChat("Fine. But don't come to me when you need some pomegranate!", npc, player); + + sendChat("Okaaay...", player, npc); + player.setBusy(false); + npc.unblock(); + } + + } + + // black + /** + * Handles npc chat if the quest is started but not finished + */ + private void handleTalk(final Player player, final Npc npc) { + player.setBusy(true); + npc.blockedBy(player); + sendChat("I know you. You're that fellow that stole my beads!", npc, player); + + npc.blockedBy(player); + sendChat("What? No, I'm the one that offered to find them for you.", player, npc); + + npc.blockedBy(player); + sendChat("It makes no difference, I still don't like you.", npc, player); + sleep(1000); + if (player.getQuestStage(getUniqueID()) != COMPLETE) { + + npc.blockedBy(player); + sendChat("But my beads, did you find them?", npc, player); + + player.setBusy(false); + npc.blockedBy(player); + int option = getMenuOption(player, SECOND_MENU); + if (option == -1) { + npc.unblock(); + player.setBusy(false); + return; + } + if (option == 0) // Yes + { + sleep(1500); + if (player.getInventory().hasItemId(RED_BEAD) && player.getInventory().hasItemId(YELLOW_BEAD) && player.getInventory().hasItemId(BLACK_BEAD) && player.getInventory().hasItemId(WHITE_BEAD)) { + sendChat("Excellent! Hand them over immediately", npc, player); + + sendChat("Alright, calm down. I thought they were useless anyway", player, npc); + + sendChat("Useless! Oh my dear " + (player.isMale() ? "boy" : "girl") + ", they are quite important", npc, player); + + finishQuest(player, npc); + } else { + sendChat("Bollocks! Don't return til you have them you fool", npc, player); + spellPlayer(player, npc); + sendChat("Hey! Watch yourself old man", player, npc); + player.setBusy(false); + npc.unblock(); + } + + } else // No + { + + sendChat("Well what are you doing here then? Move it!", npc, player); + + spellPlayer(player, npc); + + sendChat("Would you bugger off with the spells you mad fool!", player, npc); + player.setBusy(false); + npc.unblock(); + } + + } else { + player.setBusy(false); + npc.unblock(); + } + } + + /** + * Finishes the quest + */ + private void finishQuest(final Player player, final Npc npc) { + if (player.getQuestStage(this) == COMPLETE) { + player.setBusy(false); + npc.unblock(); + return; + } + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage("You hand over the beads"); + player.getInventory().remove(YELLOW_BEAD, 1); + player.getInventory().remove(RED_BEAD, 1); + player.getInventory().remove(WHITE_BEAD, 1); + player.getInventory().remove(BLACK_BEAD, 1); + player.getActionSender().sendInventory(); + player.getActionSender().sendSound("click"); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Alright, that's my half of the bargain.", player, npc); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Now what of my reward?", player, npc); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ah, your reward. I found this! You can take it.", npc, player); + + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage(EntityHandler.getNpcDef(TALBORN_ID).getName() + " gives you one " + EntityHandler.getItemDef(ITEM_REWARD).getName()); + player.getInventory().add(new InvItem(ITEM_REWARD, 1)); + player.getActionSender().sendInventory(); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("What am I supposed to do with this?", player, npc); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("I don't know, whatever you like. I certainly don't want it", npc, player); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("And have a read of this book", npc, player); + + player.setBusy(true); + npc.blockedBy(player); + sendChat("It'll teach you a thing or two about magic!", npc, player); + + player.setBusy(true); + npc.blockedBy(player); + player.getActionSender().sendMessage("You read the wizard's book"); + + player.setBusy(true); + npc.blockedBy(player); + player.incExp(6, REWARD_XP, false); + player.getActionSender().sendStat(6); + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Now I have work to do! Leave my tower!", npc, player); + + spellPlayer(player, npc); + + sendChat("Damnit! Gladly...", player, npc); + + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + player.incQuestPoints(QUEST_POINTS); + player.setBusy(false); + npc.unblock(); + + } + + /** + * Casts an imaginary spell at the player + */ + private void spellPlayer(Player player, Npc npc) { + player.setLastDamage(0); + player.informOfModifiedHits(player); + player.getActionSender().sendTeleBubble(npc.getLocation().getX(), npc.getLocation().getY(), false); + player.getActionSender().sendSound("combat1a"); + } + + /** + * Construct the quest (empty) + */ + public ImpCatcher() { + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/plugins/quests/KnightsSword.java b/GameServer/src/msc/gs/plugins/quests/KnightsSword.java new file mode 100644 index 0000000..c2626a6 --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/KnightsSword.java @@ -0,0 +1,682 @@ +package msc.gs.plugins.quests; + +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Script; +import msc.gs.model.World; +import msc.gs.quest.Quest; +import msc.gs.quest.QuestAction; + +/** + * Quest: The Knight's Sword (v1.0) 7/5/2009 Status: COMPLETE (untested) Start: + * (NPC id 132) 312, 567 Thurgo (id 134) 288, 717 Reldo (id 20) 129, 457 Items: + * 2 x Iron bar (170) Bluerite ore (266) Sword (265) Picture (264) Redberry pie + * (258) Rewards: 1 quest points + * + * @author punKrockeR + */ +public class KnightsSword extends Quest { + + private static final int QUEST_POINTS = 1; + private static final int NPC_SQUIRE = 132; + private static final int NPC_RELDO = 20; + private static final int NPC_DWARF = 134; + private static final int NPC_VYVIN = 138; + private static final int CUPBOARD_ID = 175; + private static final int CUPBOARD_X = 318; + private static final int CUPBOARD_Y = 2454; + private static final int BLUERITE_ID = 176; + private static final int BLUERITE_X = 312; + private static final int BLUERITE_Y = 3517; + private static final int BLUERITE2_X = 314; + private static final int BLUERITE2_Y = 3527; + private static final int BLUERITE_ORE_ID = 266; + private static final int SWORD_ID = 265; + private static final int PICTURE_ID = 264; + + public void init() { + associateNpc(NPC_SQUIRE); + associateNpc(NPC_RELDO); + associateNpc(NPC_DWARF); + associateNpc(NPC_VYVIN); + associateObject(CUPBOARD_ID, CUPBOARD_X, CUPBOARD_Y); + // associateObject(BLUERITE_ID, BLUERITE_X, BLUERITE_Y); + // associateObject(BLUERITE_ID, BLUERITE2_X, BLUERITE2_Y); + associateItem(BLUERITE_ORE_ID); + associateItem(SWORD_ID); + associateItem(PICTURE_ID); + } + + /** + * @return if the given Item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) { + int stage = player.getQuestStage(this); + + if (stage == COMPLETE) { + return true; + } + + switch (item.getID()) { + case BLUERITE_ORE_ID: + SWORD_ID: + return stage >= 6; + case PICTURE_ID: + return stage >= 4; + default: + return true; + } + } + + public String getName() { + return "The Knight's Sword"; + } + + public int getUniqueID() { + return 8; + } + + // iron bar + public void handleAction(QuestAction action, Object[] args, final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) { + return; + } + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != NPC_SQUIRE && npc.getID() != NPC_RELDO && npc.getID() != NPC_DWARF && npc.getID() != NPC_VYVIN) { + return; + } + + player.setBusy(true); + npc.blockedBy(player); + + if (npc.getID() == NPC_SQUIRE) { + handleSquireChat(npc, player); + } else if (npc.getID() == NPC_RELDO) { + handleReldoChat(npc, player); + } else if (npc.getID() == NPC_DWARF) { + handleDwarfChat(npc, player); + } else if (npc.getID() == NPC_VYVIN) { + handleVyvinChat(npc, player); + } + } else if (action == action.USED_OBJECT) { + if (!(args[0] instanceof GameObject)) { + return; + } + + final GameObject obj = (GameObject) args[0]; + final boolean click = (Boolean) args[1]; + if (obj.getID() != CUPBOARD_ID && obj.getID() != BLUERITE_ID) { + return; + } + + if (obj.getID() == CUPBOARD_ID && obj.getX() == CUPBOARD_X && obj.getY() == CUPBOARD_Y) { + player.setBusy(true); + + final Npc npc = World.getWorld().getNpc(138, 316, 320, 2454, 2459); + boolean allowed = true; + + if (npc != null) { + if (!npc.isBusy()) { + player.setSprite(4); + npc.setSprite(0); + sendChat("Hey what are you doing?", npc, player); + sendChat("That's my cupboard", npc, player); + player.getActionSender().sendMessage("Maybe you need someone to distract Sir Vivyn for you"); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } + + player.getActionSender().sendMessage("You search through the cupboard"); + sleep(2000); + + if (hasItem(player, PICTURE_ID) || player.getQuestStage(this) < 4) { + player.getActionSender().sendMessage("The cupboard is just full of junk"); + sleep(1200); + player.setBusy(false); + return; + } + + player.getActionSender().sendMessage("You find a small portrait in there which you take"); + giveItem(player, PICTURE_ID); + player.setBusy(false); + return; + } + } /* + * else if(obj.getID() == BLUERITE_ID) { player.setBusy(false); + * handleMining(obj, player, click); } + */ + } + } + + /* + * private void handleMining(final GameObject object, final Player player, + * final boolean click) { if(player.isBusy()) return; + * + * if(!player.withinRange(object, 1)) return; + * + * final GameObject newobject = world.getTile(object.getX(), + * object.getY()).getGameObject(); final ObjectMiningDef def = + * msc.gs.external.EntityHandler.getObjectMiningDef(102); + * + * final InvItem ore = new InvItem(BLUERITE_ORE_ID); if(!click) { + * player.getActionSender().sendMessage("This rock contains Bluerite ore"); + * return; } + * + * if(player.getCurStat(14) < 15) {player.getActionSender().sendMessage( + * "You need a mining level of 15 to mine this rock."); return; } + * + * int axeId = -1; for(int id : msc.config.Formulae.miningAxeIDs) { + * if(countItem(player, id) > 0) { axeId = id; break; } } + * + * if(axeId < 0) { + * player.getActionSender().sendMessage("You need a pickaxe to mine this rock." + * ); return; } + * + * final int axeID = axeId; int retrytimes = -1; final int swings = + * player.getSkillLoops(); final int mineLvl = player.getCurStat(14); int + * reqlvl = 1; + * + * switch(axeID) { case 1258: retrytimes = 2; break; case 1259: retrytimes = + * 4; reqlvl = 6; break; case 1260: retrytimes = 6; reqlvl = 21; break; case + * 1261: retrytimes = 8; reqlvl = 31; break; case 1262: retrytimes = 12; + * reqlvl = 41; break; } + * + * if(reqlvl > mineLvl) { + * player.getActionSender().sendMessage("You need to be level " + reqlvl + + * " to use this pick."); return; } + * + * player.setBusy(true); player.getActionSender().sendSound("mine"); Bubble + * bubble = new Bubble(player, axeId); for(Player p : + * player.getViewArea().getPlayersInView()) p.informOfBubble(bubble); + * + * final int retrytime = retrytimes; + * player.getActionSender().sendMessage("You swing your pick at the rock..." + * ); world.getDelayedEventHandler().add(new ShortEvent(player) { public + * void action() { final GameObject newobject2 = + * world.getTile(object.getX(), object.getY()).getGameObject(); + * if(newobject2 != newobject) { player.setBusy(false); + * player.setSkillLoops(0); return; } + * + * if(msc.config.Formulae.getOre(def, player.getCurStat(14), axeID)) { + * giveItem(player, ore); + * player.getActionSender().sendMessage("You manage to obtain some " + + * ore.getDef().getName() + "."); player.setSkillLoops(0); player.incExp(14, + * def.getExp(), true); player.getActionSender().sendStat(14); + * world.registerGameObject(new GameObject(object.getLocation(), 98, + * object.getDirection(), object.getType())); + * world.delayedSpawnObject(newobject.getLoc(), 60000); } else { boolean + * retry = false; if(retrytime >= swings) retry = true; + * + * player.getActionSender().sendMessage( + * "You only succeed in scratching the rock."); if(retry) { + * world.getDelayedEventHandler().add(new SingleEvent(player, 500) { public + * void action() { player.setSkillLoops(swings + 1); handleMining(object, + * player, click); } }); } + * + * if(!retry) { player.isMining(false); player.setSkillLoops(0); } } + * + * player.setBusy(false); } }); } + */ + private void handleVyvinChat(final Npc npc, final Player player) { + sendChat("Hello", player, npc, 2000); + sendChat("Greetings traveller", npc, player, 2000); + + player.setBusy(false); + int option = getMenuOption(player, "Do you have anything to trade?", "Why are there so many knights in this city?"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("No I'm sorry", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + queueChat(npc, player, "We are the white knights of falador", "We are the most powerfull order of knights in the land", "We are helping the king vallance rule the kingdom", "As he is getting old and tired"); + player.setBusy(false); + npc.unblock(); + return; + } + } + + private void handleDwarfChat(final Npc npc, final Player player) { + int stage = player.getQuestStage(this); + + if (stage == 2) { + player.setBusy(false); + int option = getMenuOption(player, "Hello are you an incando Dwarf?", "Would you like some redberry pie?"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Yeah what about it?", npc, player); + player.setBusy(false); + option = getMenuOption(player, "Would you like some redberry pie?", "Can you make me a special sword?"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + givePie(npc, player); + return; + } else { + sendChat("No i don't do that anymore", npc, player); + sendChat("I'm getting old", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else { + givePie(npc, player); + return; + } + } else if (stage == 3) { + sendChat("Can you make me a special sword?", player, npc); + sendChat("Well after you've brought me such a great pie", npc, player); + sendChat("I guess i should give it a go", npc, player); + sendChat("What sort of sword is it?", npc, player); + sendChat("I need you to make a sword for one of falador's knights", player, npc); + sendChat("He had one which was passed down through five generations", player, npc); + sendChat("But his squire has lost it", player, npc); + queueChat(npc, player, "A knight's sword eh?", "Well i'd need to know exactly how it looked", "Before i could make a new one", "All the faladian knights used to have swords with different designs", "Could you bring me a picture or something?"); + sendChat("I'll see if i can find one", player, npc); + sendChat("I'll go and ask his squire", player, npc, 1200); + player.setQuestStage(this, 4); + player.setBusy(false); + npc.unblock(); + return; + } else if (stage == 4 || stage == 5 && stage != COMPLETE) { + if (hasItem(player, PICTURE_ID)) { + sendChat("I have found a picture of the sword i would like you to make", player, npc); + player.getActionSender().sendMessage("You hand Thurgo the portrait"); + takeItem(player, PICTURE_ID); + sleep(2000); + player.getActionSender().sendMessage("Thurgo examines the picture for a moment"); + sleep(); + queueChat(npc, player, "Ok you'll need to get me some stuff for me to make this", "I'll need two iron bars to make the sword to start with", "I'll also need an ore called blurite", "It's useless for making actual weapons for fighting with", "But i'll need some as decoration for the hilt", "It is a fairly rare sort of ore", "The only place i know where to get it", "Is under this cliff here", "But it is guarded by a very powerful ice giant", "Most the rocks in that cliff are pretty useless", "Don't contain much of anything", "But there's definitly some blurite in there", "You'll need a little bit of mining experience", "To be able to find it"); + sendChat("Ok i'll go and find them", player, npc, 1200); + player.setQuestStage(this, 6); + player.setBusy(false); + npc.unblock(); + } else { + sendChat("Have you got a picture of the sword for me yet?", npc, player); + sendChat("No sorry, not yet", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 6) { + if (hasItem(player, 265)) { + sendChat("Thanks for your help getting the sword for me", player, npc); + sendChat("No worries mate", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + + if (countItem(player, 170) >= 2 && hasItem(player, BLUERITE_ORE_ID)) { + sendChat("How are you doing finding sword materials?", npc, player); + sendChat("I have them all", player, npc); + player.getActionSender().sendMessage("You hand Thurgo the items"); + takeItem(player, new InvItem(170), new InvItem(BLUERITE_ORE_ID), new InvItem(170)); + player.getActionSender().sendMessage("Thurgo hammers the materials into a metal sword"); + sleep(); + giveItem(player, SWORD_ID); + sendChat("Here you go", npc, player); + sendChat("Thank you very much", player, npc); + sendChat("Just remember to call in with more pie some time", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("How are you doing finding sword materials?", npc, player); + sendChat("I haven't found everything yet", player, npc); + sendChat("Well come back when you do", npc, player); + sendChat("Remember i need blurite ore and two iron bars", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == COMPLETE) { + sendChat("Thanks for your help getting the sword for me", player, npc); + sendChat("No worries mate", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("Go away", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + + private void givePie(final Npc npc, final Player player) { + player.getActionSender().sendMessage("Thurgo's eyes light up"); + sleep(); + sendChat("I'd never say no to a redberry pie", npc, player); + + if (!hasItem(player, 258)) { + sendChat("Well that's too bad, because I don't have any", player, npc); + player.getActionSender().sendMessage("Thurgo does not look impressed"); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + player.getActionSender().sendMessage("You hand over the pie"); + takeItem(player, 258); + player.setQuestStage(this, 3); + sleep(); + sendChat("It's great stuff", npc, player); + player.getActionSender().sendMessage("Thurgo eats the pie"); + sleep(2000); + player.getActionSender().sendMessage("He pats his stomach"); + sleep(2000); + sendChat("By guthix that was good pie", npc, player); + sendChat("Anyone who makes pie like that has gotta be alright", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + + private void handleReldoChat(final Npc npc, final Player player) { + int stage = player.getQuestStage(this); + + if (stage == 1) { + sendChat("Hello", player, npc, 2000); + sendChat("Hello stranger", npc, player, 2000); + + player.setBusy(false); + int option = getMenuOption(player, "I'm in search of a quest", "Do you have anything to trade?", "What do you do?", "What do you know about the incando dwarves?"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + // shield of arrav chat + sendChat("I don't think there's any here", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 1) { + sendChat("No, sorry. I'm not the trading type", npc, player); + sendChat("Ah well", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (option == 2) { + sendChat("I'm the palace librarian", npc, player); + sendChat("Ah that's why you're in the library then", npc, player); + sendChat("Yes", npc, player, 2000); + sendChat("Though i might be in here even if i didn't work here", npc, player); + sendChat("I like reading", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + queueChat(npc, player, "The incando dwarves, you say?", "They were the world's most skilled smiths about a hundred years ago", "They used secret knowledge", "Which they passed down from generation to generation", "Unfortunatly about a century ago the once thriving race", "Was wiped out during the barbarian invasions of that time"); + sendChat("So are there any incando left at all?", player, npc); + queueChat(npc, player, "A few of them survived", "But with the bulk of their population destroyed", "Their numbers have dwindled even further", "Last i knew there were a couple living in asgarnia", "Near the cliffs on the asgarnian southern peninsula", "They tend to keep to themselves", "They don't tend to tell people that they're the descendants of the incando", "Which is why people think that the tribe has died out totally", "You may have more luck talking to them if you bring them some red berry pie", "They really like red berry pie"); + sendChat("Thank you", player, npc); + sendChat("You're welcome", npc, player, 1200); + player.setQuestStage(this, 2); + player.setBusy(false); + npc.unblock(); + return; + } + } else { + sendChat("I'm busy, leave me alone", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + } + } + + private void handleSquireChat(final Npc npc, final Player player) { + int stage = player.getQuestStage(this); + + if (stage == -1) { + sendChat("Hello, i am the squire to sir vyvin", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "And how is life as a squire?", "Wouldn't you prefer to be a squire for me?"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Well sir vyvin is a good guy to work for", npc, player); + sendChat("However i'm in a spot of trouble today", npc, player); + sendChat("I've gone and lost sir vyvin's sword", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "Do you know where you lost it?", "I can make a new sword if you like", "Is he angry?"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Well now if i knew that", npc, player); + sendChat("It wouldn't be lost, now would it?", npc, player); + + mainOptionsChat(npc, player); + return; + } else if (option == 1) { + makeNewSwordChat(npc, player); + return; + } else { + queueChat(npc, player, "He doesn't know yet", "I was hoping i could think of something to do", "Before he does find out", "But i find myself at a loss"); + + mainOptionsChat(npc, player); + } + } else { + sendChat("No, sorry i'm loyal to vyvin", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 1 || stage == 2 || stage == 3) { + sendChat("So how are you doing getting a sword?", npc, player); + sendChat("I'm still looking for incando dwarves", player, npc, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (stage == 4) { + sendChat("So how are you doing getting a sword?", npc, player); + sendChat("I've found an incando dwarf", player, npc); + sendChat("But he needs a picture of the sword before he can make it", player, npc); + sendChat("A picture eh?", npc, player); + sendChat("The only one i can think of is in a small portrait of sir vyvin's father", npc, player); + sendChat("He's holding the sword in it", npc, player); + sendChat("Sir vyvin keeps it in a cupboard in his room i think", npc, player, 1200); + player.setQuestStage(this, 5); + player.setBusy(false); + npc.unblock(); + return; + } else if (stage == 5 || stage == 6) { + if (hasItem(player, SWORD_ID)) { + if (player.getQuestStage(this) == COMPLETE) { + player.setBusy(false); + npc.unblock(); + return; + } + sendChat("I have retrieved your sword for you", player, npc); + sendChat("Thankyou, thankyou", npc, player); + sendChat("I was seriously worried i'd have to own up to sir vyvin", npc, player); + player.getActionSender().sendMessage("You give the sword to the squire"); + takeItem(player, SWORD_ID); + sleep(); + player.setQuestStage(this, COMPLETE); + player.incQuestPoints(QUEST_POINTS); + player.incExp(Script.SMITHING, 4000, false); + player.setBusy(false); + npc.unblock(); + return; + } else if (hasItem(player, PICTURE_ID)) { + sendChat("So how are you doing getting a sword?", npc, player); + sendChat("I haven't got it from Thurgo yet", player, npc); + sendChat("Please let me know when you do", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("So how are you doing getting a sword?", npc, player); + sendChat("I've found an incando dwarf", player, npc); + sendChat("But he needs a picture of the sword before he can make it", player, npc); + sendChat("A picture eh?", npc, player); + sendChat("The only one i can think of is in a small portrait of sir vyvin's father", npc, player); + sendChat("Sir vyvin keeps it in a cupboard in his room i think", npc, player, 1200); + player.setQuestStage(this, 5); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == COMPLETE) { + queueChat(npc, player, "Hello friend", "Thanks for your help before", "Vyvin never even realised it was a different sword"); + player.setBusy(false); + npc.unblock(); + return; + } + } + + private void mainOptionsChat(final Npc npc, final Player player) { + player.setBusy(false); + int option = getMenuOption(player, "Well do you know the vague area you lost it?", "I can make a new sword if you like", "Well the kingdom is fairly abundant with swords", "Well I hope you find it soon"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + lostItChat(npc, player); + return; + } else if (option == 1) { + makeNewSwordChat(npc, player); + return; + } else if (option == 2) { + abundantSwordChat(npc, player); + return; + } else { + findItChat(npc, player); + return; + } + } + + private void abundantSwordChat(final Npc npc, final Player player) { + queueChat(npc, player, "Yes you can get bronze swords anywhere", "But this isn't any old sword"); + + dwarfChat(npc, player); + } + + private void dwarfChat(final Npc npc, final Player player) { + queueChat(npc, player, "The thing is, this sword is a family heirloom", "It has been passed down through vyvin's family for five generations", "It was originally made by the incando dwarves", "Who were a particularly skilled tribe of dwarven smiths", "I doubt anyone could make it in the style they do"); + + player.setBusy(false); + int option = getMenuOption(player, "So would these dwarves make another one?", "Well I hope you find it soon"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + startQuest(npc, player); + return; + } else if (option == 1) { + findItChat(npc, player); + return; + } + } + + private void lostItChat(final Npc npc, final Player player) { + queueChat(npc, player, "No i was carrying it for him all the way from where he had it stored in Varrock", "It must have slipped from my pack during the trip", "And you know what people are like these days", "Someone will have just picked it up and kept it for themselves"); + + player.setBusy(false); + int option = getMenuOption(player, "I can make a new sword if you like", "Well the kingdom is fairly abundant with swords", "Well I hope you find it soon"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + makeNewSwordChat(npc, player); + return; + } else if (option == 1) { + abundantSwordChat(npc, player); + return; + } else if (option == 2) { + findItChat(npc, player); + return; + } + } + + private void makeNewSwordChat(final Npc npc, final Player player) { + sendChat("Thanks for the offer", npc, player); + sendChat("I'd be surprised if you could though", npc, player); + dwarfChat(npc, player); + } + + private void findItChat(final Npc npc, final Player player) { + sendChat("Yes me too", npc, player); + sendChat("I'm not looking forward to telling vyvin i've lost it", npc, player); + sendChat("He's going to want it for the parade next week as well", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + + private void startQuest(final Npc npc, final Player player) { + queueChat(npc, player, "I'm not a hundred percent sure the incando tribe exists anymore", "I should think reldo the palace librarian in varrock will know", "He has done a lot of research on the races of these lands", "I don't suppose you could try and track down the incando dwarves for me?", "I've got so much work to do"); + + player.setBusy(false); + int option = getMenuOption(player, "Ok I'll give it a go", "No I've got lots of mining work to do"); + if (option == -1) { + return; + } + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Thankyou very much", npc, player); + sendChat("As i say the best place to start should be with reldo", npc, player, 1200); + player.setQuestStage(this, 1); // Start quest + player.setBusy(false); + npc.unblock(); + return; + } else { + player.setBusy(false); + npc.unblock(); + return; + } + } + + public KnightsSword() { + } +} diff --git a/GameServer/src/msc/gs/plugins/quests/SheepShearer.java b/GameServer/src/msc/gs/plugins/quests/SheepShearer.java new file mode 100644 index 0000000..660cf1f --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/SheepShearer.java @@ -0,0 +1,194 @@ +package msc.gs.plugins.quests; + +import msc.gs.model.InvItem; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.quest.Quest; +import msc.gs.quest.QuestAction; + +/** + * Quest: Sheep Shearer (v1.0) Status: COMPLETE Start: Fred the farmer (id 77), + * 159, 619 Items: 207x20 Reward: 1 quest point, 60 gold, Crafting 350 xp + * + * @author Konijn + */ +public class SheepShearer extends Quest { + private final int FRED_ID = 77; + private final int ITEM_WOOL = 207; + private final int REWARD_XP = 350; + private final int REWARD_GP = 330; + private final String[] FIRST_MENU = new String[] { "Sure, what do I need to do?", "No thanks, I'm good." }; + private final String[] SECOND_MENU = new String[] { "Sorry, I don't like the sound of that.", "I'd be happy to help." }; + + public void init() { + associateNpc(FRED_ID); + } + + public SheepShearer() { + } + + public String getName() { + return "Sheep Shearer"; + } + + public int getUniqueID() { + return 1; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) { + int stage = player.getQuestStage(this); + + if (stage == -1) // Quest hasn't been started + { + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + + sendChat("Hi there, traveller. Care to make some money?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, FIRST_MENU); + sleep(); + player.setBusy(true); + switch (option) { + case 1: + player.setBusy(false); + npc.unblock(); + + break; + case 0: + + sendChat("If you collect 20 balls of wool for me, I'll pay you 500 coins.", npc, player); + + sendChat("Maybe I'll teach you a thing or two about crafting, too.", npc, player); + + sendChat("I'm afraid you'll have to find your own shears, but the sheep are outside.", npc, player); + + player.setBusy(false); + option = getMenuOption(player, SECOND_MENU); + sleep(); + player.setBusy(true); + switch (option) { + case 1: + sendChat("Great! Come back and see me when you're done.", npc, player); + + player.setQuestStage(getUniqueID(), 1); + player.setBusy(false); + npc.unblock(); + + break; + case 0: + + sendChat("Suit yourself. Come and see me if you change your mind.", npc, player); + player.setBusy(false); + npc.unblock(); + + break; + default: + player.setBusy(false); + npc.unblock(); + break; + + } + + break; + default: + player.setBusy(false); + npc.unblock(); + break; + } + + } else + return; + } else if (stage == 1) { + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Ahh, you've returned! Do you have my wool?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "I'm afraid not.", "Yes, I do."); + + if (option == -1) { + npc.unblock(); + player.setBusy(false); + return; + } + sleep(); + player.setBusy(true); + // SingleEvent + if (option == 0) { + + sendChat("Well, come and see me when you do. The offer still stands", npc, player); + player.setBusy(false); + npc.unblock(); + + } else if (option == 1) { + + // check items + if (player.getInventory().hasItemId(ITEM_WOOL) && player.getInventory().countId(ITEM_WOOL) >= 20) { + finishQuest(player, npc); + } else { + sendChat("Um, no you don't. Get back to me when you do. The reward still stands!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + + } + } else if (stage == 0) { + if (action == QuestAction.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() != FRED_ID) + return; + + player.setBusy(true); + npc.blockedBy(player); + sendChat("Hello " + player.getUsername() + "!", npc, player); + player.setBusy(false); + npc.unblock(); + } + } + } + + private void finishQuest(final Player player, final Npc npc) { + if (player.getQuestStage(this) == COMPLETE) { + player.setBusy(false); + npc.unblock(); + return; + } + sendChat("Thank you very much! As promised, here's your reward.", npc, player); + + player.incExp(12, REWARD_XP, false); + player.getActionSender().sendStat(12); + player.setQuestStage(getUniqueID(), Quest.COMPLETE); + for (int i = 0; i < 20; i++) + player.getInventory().remove(ITEM_WOOL, 1); + player.getInventory().add(new InvItem(10, REWARD_GP)); + player.getActionSender().sendInventory(); + player.incQuestPoints(1); + player.setBusy(false); + npc.unblock(); + + } +} diff --git a/GameServer/src/msc/gs/plugins/quests/WitchsPotion.java b/GameServer/src/msc/gs/plugins/quests/WitchsPotion.java new file mode 100644 index 0000000..88b826b --- /dev/null +++ b/GameServer/src/msc/gs/plugins/quests/WitchsPotion.java @@ -0,0 +1,271 @@ +package msc.gs.plugins.quests; + +import msc.gs.model.GameObject; +import msc.gs.model.Item; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.quest.Quest; +import msc.gs.quest.QuestAction; + +/** + * Quest: Witch's Potion (v1.0) 7/5/2009 (uid: 9) Status: COMPLETE (untested) + * Start: Hetty (id 148) 316, 665 Items: Rat tail (271) Onion (241) Newt's eye + * (270) Burnt meat (134) Reward: 1 quest point, 1000 magic exp + * + * TODO: restrict rats tails from being seen by players not on the quest fix + * isNpcAssociated() from some how picking up NPCs from other quests. + * + * @author punKrockeR + */ +public class WitchsPotion extends Quest { + private static final int WITCH_ID = 148; + private static final int RAT_ID = 29; + private static final int TAIL_ID = 271; + private static final int CAULDRON_ID = 147; + private static final int CAULDRON_X = 316; + private static final int CAULDRON_Y = 666; + private static final int ONION_ID = 241; + private static final int NEWT_EYE_ID = 270; + private static final int BURNT_MEAT_ID = 134; + private static final int QUEST_POINTS = 1; + private static final int REWARD_XP = 1000; + + public void init() { + associateNpc(WITCH_ID); + associateNpc(RAT_ID); + associateObject(CAULDRON_ID, CAULDRON_X, CAULDRON_Y); + } + + public String getName() { + return "Witch's Potion"; + } + + public int getUniqueID() { + return 9; + } + + /** + * @return if the given npc id is associated with this quest + */ + @Override + public boolean isNpcAssociated(int id, Player player) { + if (id == RAT_ID && player.getQuestStage(this) == 1) + return true; + + if (id == WITCH_ID) + return true; + + return false; + } + + public void handleAction(QuestAction action, Object[] args, final Player player) { + int stage = player.getQuestStage(this); + + if (action == action.TALKED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() == WITCH_ID) + handleWitchChat(npc, player); + else if (npc.getID() == RAT_ID) { + player.getActionSender().sendMessage("Rats can't talk!"); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (action == action.KILLED_NPC) { + if (!(args[0] instanceof Npc)) + return; + + final Npc npc = (Npc) args[0]; + + if (npc.getID() == RAT_ID) { + if (stage == 1) + world.registerItem(new Item(TAIL_ID, npc.getX(), npc.getY(), 1, player)); + } + } else if (action == action.USED_OBJECT) { + if (!(args[0] instanceof GameObject)) + return; + + final GameObject obj = (GameObject) args[0]; + + if (obj.getID() == CAULDRON_ID && obj.getX() == CAULDRON_X && obj.getY() == CAULDRON_Y) { + player.setBusy(true); + + if (stage != 2) { + sendChat("I'd rather not", player, null); + sendChat("It doesn't look very tasty", player, null); + player.setBusy(false); + } else { + if (player.getQuestStage(this) == COMPLETE) { + player.setBusy(false); + return; + } + sendMessage(player, "You drink from the cauldron"); + sleep(); + sendMessage(player, "You feel yourself imbued with power"); + sleep(1200); + player.setQuestStage(this, COMPLETE); + player.incQuestPoints(QUEST_POINTS); + player.incExp(6, REWARD_XP, false); + player.setBusy(false); + } + } + } + } + + private void handleWitchChat(final Npc npc, final Player player) { + int stage = player.getQuestStage(this); + + if (stage == -1) { + sendChat("Greetings traveller", npc, player); + + sendChat("What could you want with an old woman like me?", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "I am in search of a quest", "I've heard that you are a witch"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Hmm maybe i can think of something for you", npc, player); + + sendChat("Would you like to become more proficient in the dark arts?", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "Yes help me become one with my darker side", "No I have my principles and honour", "What, you mean improve my magic?"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + startQuest(npc, player, true); + return; + } else if (option == 1) { + sendChat("Suit yourself, but you're missing out", npc, player); + sleep(1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("Yes improve your magic", npc, player); + + sendChat("Do you have no sense of drama?", npc, player); + + player.setBusy(false); + option = getMenuOption(player, "Yes I'd like to improve my magic", "No I'm not interested", "Show me the mysteries of the dark arts"); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + startQuest(npc, player, false); + return; + } else if (option == 1) { + sendChat("Many aren't to start off with", npc, player); + sendChat("But i think you'll be drawn back to this place", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else { + startQuest(npc, player, true); + return; + } + } + } else { + sendChat("Yes it does seem to be getting fairly common knowledge", npc, player); + sendChat("I fear i may get a visit from the witch hunters of falador before long", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 1) { + sendChat("So have you found the things for the potion?", npc, player); + + if (hasItem(player, TAIL_ID, NEWT_EYE_ID, BURNT_MEAT_ID, ONION_ID)) { + sendChat("Yes i have everthing", player, npc); + sendChat("Excellent, can i have them then?", npc, player); + sendMessage(player, "You pass the ingredients to Hetty"); + takeItem(player, NEWT_EYE_ID, TAIL_ID, BURNT_MEAT_ID, ONION_ID); + sleep(); + sendMessage(player, "Hetty puts all the ingredients in her cauldron"); + sleep(); + sendMessage(player, "She closes her eyes and begins to chant"); + sleep(); + sendChat("Ok drink from the cauldron", npc, player, 1200); + player.setQuestStage(this, 2); + player.setBusy(false); + npc.unblock(); + return; + } else { + sendChat("No not yet", player, npc); + sendChat("Well remember what you need to get", npc, player); + sendChat("An eye of newt, a rat's tail, some burnt meat and an onion", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } else if (stage == 2) { + sendChat("Well are you going to drink the potion or not?", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else if (stage == COMPLETE) { + sendChat("Greetings traveller", npc, player); + sendChat("How's your magic coming along? ", npc, player); + sendChat("I'm practicing and slowly getting better", player, npc); + sendChat("Good, good", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } else // error + { + player.setBusy(false); + npc.unblock(); + return; + } + } + + private void startQuest(final Npc npc, final Player player, boolean dark) { + sendChat("Ok, I'm going to make a potion to help bring out your darker self", npc, player); + sendChat("So that you can perform acts of dark magic with greater ease", npc, player); + + if (!dark) { + sendChat("Dark magic?", player, npc); + sendChat("It's not as ominous as it sounds, trust me", npc, player); + + player.setBusy(false); + int option = getMenuOption(player, "No, I don't like the sound of it", "Well, alright..."); + if (option == -1) + return; + player.setBusy(true); + sleep(); + + if (option == 0) { + sendChat("Fine, suit yourself", npc, player); + sendChat("But I sense a great deal of dark power within you", npc, player); + sendChat("You'll change your mind one day", npc, player, 1200); + player.setBusy(false); + npc.unblock(); + return; + } + } + + sendChat("You will need certain ingredients", npc, player); + sendChat("What do i need?", player, npc, 2000); + sendChat("You need an eye of newt, a rat's tail, an onion and a piece of burnt meat", npc, player); + player.setQuestStage(this, 1); + player.setBusy(false); + npc.unblock(); + return; + } + + public WitchsPotion() { + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/quest/Quest.java b/GameServer/src/msc/gs/quest/Quest.java new file mode 100644 index 0000000..e4287c2 --- /dev/null +++ b/GameServer/src/msc/gs/quest/Quest.java @@ -0,0 +1,491 @@ +package msc.gs.quest; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; + +import msc.gs.event.SingleEvent; +import msc.gs.model.ActiveTile; +import msc.gs.model.ChatMessage; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.MenuHandler; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.model.Point; +import msc.gs.model.World; +import msc.gs.util.Logger; + +/** + * Defines a quest script + * + * @author punKrockeR + */ +public abstract class Quest { + /** + * Empty constructor + */ + public Quest() { + } + + /** + * The world instance + */ + protected static final World world = World.getWorld(); + /** + * The completed flag + */ + public static final int COMPLETE = 0; + /** + * This quest's current thread + */ + private Thread thread = null; + /** + * The list of npcs associated with this quest + */ + private Set associatedNpcs = new HashSet(); + /** + * The list of objects associated with this quest + */ + private HashMap associatedObjects = new HashMap(); + /** + * The list of items associated with this quest + */ + private Set associatedItems = new HashSet(); + + /** + * Quest initialization + */ + public void init() { + } + + /** + * Used for triggers + */ + public abstract void handleAction(QuestAction action, Object[] args, Player player); + + /** + * Sets this thread + */ + public void setThread(Thread thread) { + this.thread = thread; + } + + /** + * @return this quest's UNIQUE ID - >>MUST<< be unique. + */ + public abstract int getUniqueID(); + + /** + * @return this quest's name + */ + public abstract String getName(); + + /** + * The default sleep time + */ + private static long DEFAULT_DELAY = 3200; + + /** + * Adds the given npc id to the list of npc ids associated with this quest + */ + public void associateNpc(int id) { + associatedNpcs.add(id); + } + + /** + * Adds the given item id to the list of item ids associated with this quest + */ + public void associateItem(int id) { + associatedItems.add(id); + } + + /** + * Adds the given object id to the list of object ids associated with this + * quest + */ + public void associateObject(int id, int x, int y) { + associatedObjects.put(new java.awt.Point(id, associatedObjects.size()), Point.location(x, y)); + } + + /** + * Adds the given object id to the list of object ids associated with this + * quest + */ + public void associateObject(int id) { + associatedObjects.put(new java.awt.Point(id, associatedObjects.size()), Point.location(0, 0)); + } + + /** + * @return if the given npc id is associated with this quest + */ + public boolean isNpcAssociated(int id, Player player) { + return associatedNpcs.contains(id); + } + + /** + * @return if the given item id is associated with this quest + */ + public boolean isItemAssociated(int id, Player player) { + return associatedItems.contains(id); + } + + /** + * @return if the given object id is associated with this quest + */ + public boolean isObjectAssociated(GameObject obj, Player player) { + java.util.Set set = associatedObjects.keySet(); + for (java.awt.Point p : set) { + int i = (int) p.getX(); + if (i == obj.getID()) + if (Point.location(obj.getX(), obj.getY()).equals(associatedObjects.get(p)) || (associatedObjects.get(p).getX() == 0 && associatedObjects.get(p).getY() == 0)) { + Logger.println("obj id " + i + " is associated with quest " + getName()); + return true; + } else + Logger.println("obj id " + i + " is NOT associated with quest " + getName()); + } + return false; + } + + /** + * Sends a quest message to the player + */ + public void sendMessage(Player player, String message) { + player.getActionSender().sendMessage("@que@" + message); + } + + /** + * Inform of npc chat + */ + public void sendChat(String msg, Npc npc, Player player) { + sendChat(msg, npc, player, DEFAULT_DELAY); + } + + /** + * Inform of npc chat + */ + public void sendChat(String msg, Npc npc, Player player, long delay) { + try { + if (player != null && npc != null) + npc.blockedBy(player); + } catch (java.util.ConcurrentModificationException cme) { + } catch (Exception e) { + e.printStackTrace(); + } + + player.informOfNpcMessage(new ChatMessage(npc, msg, player)); + sleep(delay); + } + + /** + * Inform of player chat + */ + public void sendChat(String msg, Player player, Npc npc) { + sendChat(msg, player, npc, DEFAULT_DELAY); + } + + /** + * Inform of player chat + */ + public void sendChat(String msg, Player player, Npc npc, long delay) { + try { + if (player != null && npc != null) + npc.blockedBy(player); + } catch (java.util.ConcurrentModificationException cme) { + } catch (Exception e) { + e.printStackTrace(); + } + + player.informOfChatMessage(new ChatMessage(player, msg, npc)); + sleep(delay); + } + + /** + * Adds the given short event + */ + public void addSingleEvent(SingleEvent event) { + world.getDelayedEventHandler().add(event); + } + + /** + * @return if the given NPC is visible to the player + */ + public boolean isNpcVisible(Npc npc, Player player) { + return true; + } + + /** + * @return if the given NPC is shootable + */ + public boolean isNpcShootable(Npc npc, Player player) { + return true; + } + + /** + * @return if the given Item is visible to the player + */ + public boolean isItemVisible(Item item, Player player) { + return true; + } + + /** + * @return if this quest is to be loaded or not (used for when a quest is + * not finished yet, and shouldn't be loaded) + */ + public boolean loadQuest() { + return true; + } + + /** + * Pauses the quest for 'ms' milliseconds + */ + public void sleep(long ms) { + if (ms <= 0) + return; + + try { + thread.sleep(ms); + } catch (InterruptedException e) {} + } + + /** + * Sleeps for the DEFAULT time + */ + public void sleep() { + sleep(DEFAULT_DELAY); + } + + /** + * Sets the default delay + */ + public void setDefaultDelay(long l) { + DEFAULT_DELAY = l; + } + + /** + * @return which option the player chooses out of the given menu + */ + public int getMenuOption(final Player player, long timeout, String... menu) { + player.setLastQuestMenuReply(-1); + player.getActionSender().sendMenu(menu); + player.setMenuHandler(new MenuHandler(menu) { + public void handleReply(int option, String reply) { + player.setLastQuestMenuReply(option); + sendChat(reply, player, null, 0); + } + }); + + long start = System.currentTimeMillis(); + while (player.getLastQuestMenuReply() == -1 && (System.currentTimeMillis() - start) <= timeout) { + if (player.getLastQuestMenuReply() == -2) + return -1; + sleep(10); + } + + return player.getLastQuestMenuReply(); + } + + /** + * @return which option the player chooses out of the given menu + */ + public int getMenuOption(final Player player, String... menu) { + return getMenuOption(player, 30000, menu); // 30 sec default timeout + } + + /** + * Queues the given player-to-npc chat + */ + public void queueChat(Player player, Npc npc, long delay, String... chat) { + int idx = 0; + while (idx < chat.length) + sendChat(chat[idx++], player, npc); + } + + /** + * Queues the given player-to-npc chat + */ + public void queueChat(Player player, Npc npc, String... chat) { + queueChat(player, npc, DEFAULT_DELAY, chat); + } + + /** + * Queues the given npc-to-player chat + */ + public void queueChat(Npc npc, Player player, long delay, String... chat) { + int idx = 0; + while (idx < chat.length) + sendChat(chat[idx++], npc, player); + } + + /** + * Queues the given player-to-npc chat + */ + public void queueChat(Npc npc, Player player, String... chat) { + queueChat(npc, player, DEFAULT_DELAY, chat); + } + + /** + * @return if the player is wielding the given item id + */ + public boolean isWielding(Player player, int id) { + return player.getInventory().wielding(id); + } + + /** + * Adds the given InvItems to the player's inventory + */ + public void giveItem(Player player, InvItem... items) { + boolean coins = false; + + for (InvItem i : items) { + player.getInventory().add(i); + + if (i.getID() == 10) + coins = true; + } + + player.getActionSender().sendSound(coins ? "coins" : "click"); + player.getActionSender().sendInventory(); + } + + /** + * Adds the given item ids to the player's inventory + */ + public void giveItem(Player player, int... ids) { + boolean coins = false; + + for (int i : ids) { + player.getInventory().add(new InvItem(i, 1)); + + if (i == 10) + coins = true; + } + + player.getActionSender().sendSound(coins ? "coins" : "click"); + player.getActionSender().sendInventory(); + } + + /** + * Removes the given InvItems from the player's inventory + */ + public void takeItem(Player player, InvItem... items) { + boolean coins = false; + + for (InvItem i : items) { + player.getInventory().remove(i); + + if (i.getID() == 10) + coins = true; + } + + player.getActionSender().sendSound(coins ? "coins" : "click"); + player.getActionSender().sendInventory(); + } + + /** + * Removes the given item ids from the player's inventory + */ + public void takeItem(Player player, int... ids) { + boolean coins = false; + + for (int i : ids) { + player.getInventory().remove(new InvItem(i, 1)); + + if (i == 10) + coins = true; + } + + player.getActionSender().sendSound(coins ? "coins" : "click"); + player.getActionSender().sendInventory(); + } + + /** + * @return if the player has the given InvItem + */ + public boolean hasItem(Player player, InvItem... items) { + boolean has = true; + + for (InvItem i : items) { + if (!player.getInventory().hasItemId(i.getID())) { + has = false; + break; + } + } + + return has; + } + + /** + * @return if the player has the given item ids + */ + public boolean hasItem(Player player, int... items) { + boolean has = true; + + for (int i : items) { + if (!player.getInventory().hasItemId(i)) { + has = false; + break; + } + } + + return has; + } + + /** + * @return the amount of the given item the player has + */ + public int countItem(Player player, InvItem item) { + return player.getInventory().countId(item.getID()); + } + + /** + * @return the amount of the given item id the player has + */ + public int countItem(Player player, int id) { + return player.getInventory().countId(id); + } + + /** + * @return if the player has the given item in his inventory, bank or if + * it's on the ground somewhere + */ + public boolean hasItemAbs(Player player, int id) { + if (player.getInventory().hasItemId(id)) + return true; + + if (player.getBank().hasItemId(id)) + return true; + + ActiveTile[][] tiles = player.getViewArea().getViewedArea(20, 20, 20, 20); + for (int x = 0; x < tiles.length; x++) { + for (int y = 0; y < tiles[x].length; y++) { + ActiveTile t = tiles[x][y]; + if (t != null) { + for (Item i : t.getItems()) { + if (i.getID() == id) { + if (i.getOwner().equals(player)) + return true; + } + } + } + } + } + + return false; + } + + /** + * Sets this quest's stage + */ + public void setStage(Player player, int stage) { + player.setQuestStage(getUniqueID(), stage); + } + + /** + * @return this quest's stage + */ + public int getQuestStage(Player player) { + return player.getQuestStage(getUniqueID()); + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/quest/QuestAction.java b/GameServer/src/msc/gs/quest/QuestAction.java new file mode 100644 index 0000000..4f2207e --- /dev/null +++ b/GameServer/src/msc/gs/quest/QuestAction.java @@ -0,0 +1,24 @@ +package msc.gs.quest; + +/** + * Handles the list of possible quest triggers + */ +public enum QuestAction { + KILLED_NPC("The player killed a NPC", 0), TALKED_NPC("The player talked to a NPC", 1), USED_OBJECT("The player used an object", 2), USED_ITEM("The player used an inventory item", 3), ITEM_PICKED_UP("The player picked up an item", 4), ITEM_USED_ON_OBJECT("The player used an item on an object", 5), ITEM_USED_ON_ITEM("The player used an item on another item", 6), ATTACKED_NPC("The player attacked an NPC", 7); + + private String description = ""; + private int id = -1; + + public String toString() { + return description + " (id " + id + ")"; + } + + public int getID() { + return id; + } + + private QuestAction(String description, int id) { + this.description = description; + this.id = id; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/quest/QuestEvent.java b/GameServer/src/msc/gs/quest/QuestEvent.java new file mode 100644 index 0000000..acb9547 --- /dev/null +++ b/GameServer/src/msc/gs/quest/QuestEvent.java @@ -0,0 +1,94 @@ +package msc.gs.quest; + +import msc.gs.event.DelayedEvent; +import msc.gs.model.Player; + +/** + * Version: 17/5/2009 + * + * Defines a quest event + * + * @author punKrockeR + */ +public class QuestEvent extends DelayedEvent { + // The quest action + private QuestAction action = null; + // The quest parameters + private Object[] args = null; + // The quest itself + private Quest quest = null; + + /** + * Defines a new quest event with an instant delay time (-1) + */ + public QuestEvent(final QuestAction action, final Object[] args, final Player player, final Quest quest) { + super(player, -1); + this.action = action; + this.args = args; + this.quest = quest; + } + + /** + * Runs the event and stops itself from running again + */ + public void run() { + super.matchRunning = false; + + final Thread t = new Thread(new Runnable() { + public void run() { + try { + quest.handleAction(action, args, owner); + } catch (java.util.ConcurrentModificationException cme) { + } catch (Exception e) { + e.printStackTrace(); + } + } + }, new String("qt-" + getIdentifier())); + + quest.setThread(t); + t.start(); + } + + /** + * @return this quest event's action type + */ + public QuestAction getAction() { + return action; + } + + /** + * @return this quest event's args + */ + public Object[] getArgs() { + return args; + } + + /** + * @return this quest event's quest + */ + public Quest getQuest() { + return quest; + } + + /** + * @return this event's identifer + */ + public Object getIdentifier() { + if (quest == null || action == null) + return null; + + return new String(quest.getUniqueID() + "-" + action.getID() + "-" + owner.getUsernameHash()); + } + + /** + * @return if this quest event is identical to the given quest event + */ + public boolean equals(QuestEvent event) { + if (event != null) { + if (event.getIdentifier() == this.getIdentifier()) + return true; + } + + return false; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/quest/QuestEventManager.java b/GameServer/src/msc/gs/quest/QuestEventManager.java new file mode 100644 index 0000000..9a39d2c --- /dev/null +++ b/GameServer/src/msc/gs/quest/QuestEventManager.java @@ -0,0 +1,124 @@ +package msc.gs.quest; + +import java.util.Iterator; +import java.util.Vector; + +import msc.gs.event.DelayedEvent; +import msc.gs.model.Player; +import msc.gs.util.Logger; + +/** + * Version: 17/5/2009 + * + * Handles QuestEvents and their queues and accessor/manipulator methods + * + * @author punKrockeR + */ +public final class QuestEventManager { + // The quest events queued for adding + private Vector toAdd = null; + // The quest events list + private Vector events = null; + // Is this event manager currently processing? + private boolean running = true; + + /** + * Contructs a new QuestEvent handler with the given initial array size + */ + public QuestEventManager(int initialCapacity) { + toAdd = new Vector(initialCapacity); + events = new Vector(initialCapacity); + } + + /** + * @return if the event handler contains the given event + */ + public boolean contains(DelayedEvent event) { + return events.contains(event); + } + + /** + * @return the list of existing events + */ + public Vector getEvents() { + return events; + } + + /** + * Adds the given event to the queue + * + * TODO: Make sure this is bugless + */ + public void add(QuestEvent event) { + if (!events.contains(event) && !toAdd.contains(event)) + toAdd.add(event); + } + + /** + * Removes the given event from the list + */ + public void remove(QuestEvent event) { + events.remove(event); + } + + /** + * Removes any of the given player's events + */ + public void removePlayersEvents(Player player) { + try { + Iterator iterator = events.iterator(); + while (iterator.hasNext()) { + QuestEvent event = iterator.next(); + if (event.belongsTo(player)) + iterator.remove(); + } + } catch (Exception e) { + Logger.println("Error @ removePlayer, IP address: " + player.getCurrentIP() + " Name: " + player.getUsername() + " message : " + e.getMessage()); + } + + } + + /** + * Processes all the events in the queues + */ + public void process() { + if (!running) + return; + + try { + if (toAdd.size() > 0) { + events.addAll(toAdd); + toAdd.clear(); + } + + Iterator iterator = events.iterator(); + while (iterator.hasNext()) { + QuestEvent event = iterator.next(); + + if (event == null) { + iterator.remove(); + continue; + } + + if (event.shouldRun()) { + event.run(); + event.updateLastRun(); + } + + if (event.shouldRemove()) + iterator.remove(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Kills this event manager + */ + public void kill() { + running = false; + toAdd.clear(); + events.clear(); + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/quest/QuestManager.java b/GameServer/src/msc/gs/quest/QuestManager.java new file mode 100644 index 0000000..e7f49c7 --- /dev/null +++ b/GameServer/src/msc/gs/quest/QuestManager.java @@ -0,0 +1,395 @@ +package msc.gs.quest; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.Vector; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +import msc.config.Config; +import msc.gs.model.GameObject; +import msc.gs.model.InvItem; +import msc.gs.model.Item; +import msc.gs.model.Mob; +import msc.gs.model.Npc; +import msc.gs.model.Player; +import msc.gs.util.Logger; + +/** + * Manages the loading and execution of quests TODO: add quest error handling? + * + * @author punKrockeR + */ +public class QuestManager { + // Holds loaded quests + private static Vector quests = null; + // Holds the list of quest ids + private static Vector questIds = null; + // The quest events handler + private static final QuestEventManager questEventManager = new QuestEventManager(50); + // The quest events handler condition + private static boolean running = true; + + /** + * Constructs a new quest manager + */ + public QuestManager() { + final Thread eventHandler = new Thread(new Runnable() { + public void run() { + while (running) { + try { + questEventManager.process(); + try { + Thread.sleep(100); + } catch (Exception e) { + } + } catch (Exception error) { + Logger.println("\n\nQUEST MANAGER EVENT HANDLER ERROR:\n\n"); + error.printStackTrace(); + } + } + } + }, "QuestManager.EventHandler"); + + eventHandler.start(); + } + + /** + * Kills the quest manager + */ + public void kill() { + running = false; + questEventManager.kill(); + } + + public static ArrayList questz = new ArrayList(); + + public static void getClassesFromFileJarFile(String pckgname, String baseDirPath) throws ClassNotFoundException { + ArrayList classes = new ArrayList(); + String path = pckgname.replace('.', '/') + "/"; + File mF = new File(baseDirPath); + String[] files = mF.list(); + ArrayList jars = new ArrayList(); + for (int i = 0; i < files.length; i++) + if (files[i].endsWith(".jar")) + jars.add(files[i]); + + for (int i = 0; i < jars.size(); i++) { + try { + JarFile currentFile = new JarFile(jars.get(i).toString()); + for (Enumeration e = currentFile.entries(); e.hasMoreElements();) { + JarEntry current = (JarEntry) e.nextElement(); + if (current.getName().contains("$")) + continue; + if (current.getName().length() > path.length() && current.getName().substring(0, path.length()).equals(path) && current.getName().endsWith(".class")) + classes.add(Class.forName(current.getName().replaceAll("/", ".").replace(".class", ""))); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + Class[] classesA = new Class[classes.size()]; + classes.toArray(classesA); + for (Class c : classesA) { + questz.add(c); + } + + } + + /** + * @return if the quests were loaded successfully or not + */ + public final boolean loadQuests() { + try { + long start = System.currentTimeMillis(); + + if (quests != null) + quests.clear(); + if (questIds != null) + questIds.clear(); + + /* + * File questDir = new File("src/msc/gs/plugins/quests/"); + * + * if(questDir == null || !questDir.exists()) throw new + * Exception("Quests directory " + questDir.getAbsolutePath() + + * " does not exist!"); + * + * // List valid .class files File[] questFiles = + * questDir.listFiles(new FilenameFilter() { + * + * @Override public boolean accept(File dir, String name) { return + * name.endsWith(".class") && name.indexOf("$") <= -1; } }); + */ + getClassesFromFileJarFile("msc.gs.plugins.quests", System.getProperty("user.dir")); + quests = new Vector(questz.size()); + questIds = new Vector(questz.size()); + int questCount = 0; + + for (Class quest : questz) { + try { + String name = quest.getName(); // Remove .class ext + // Class c = Class.forName(name); + Quest script = (Quest) quest.getConstructor().newInstance(); + if (!script.loadQuest()) { + Logger.println("Broken Quest: " + quest); + continue; + } + + name = name.trim().toLowerCase(); + script.init(); + questIds.add(script.getUniqueID()); + quests.add(script); + questCount++; + } catch (Exception e2) { + e2.printStackTrace(); + Logger.println("Quest file \"" + quest.getName() + "\" skipped due to load failure."); + } + } + + Logger.println("Loaded " + questCount + " quests successfully (" + (System.currentTimeMillis() - start) + "ms)"); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + return true; + } + + /** + * @return all quests + */ + @SuppressWarnings("unchecked") + public Vector getQuests() { + return (Vector) quests.clone(); + } + + /** + * @return the Quest with the given uid + */ + public Quest getQuestById(int id) { + for (Quest q : quests) { + if (q.getUniqueID() == id) + return q; + } + + return null; + } + + /** + * @return quest ids + */ + public Vector getQuestIds() { + return questIds; + } + + /** + * @return how many quests there are + */ + public int getQuestCount() { + return quests.size(); + } + + /** + * Triggers the quest action + */ + public synchronized void handleAction(final QuestAction action, final Object[] args, final Player player) { + for (final Quest quest : quests) + questEventManager.add(new QuestEvent(action, args, player, quest)); + } + + /** + * Triggers the quest action + */ + public void handleAction(QuestAction action, Object arg, Player player) { + handleAction(action, new Object[] { arg }, player); + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleNpcTalk(Npc npc, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isNpcAssociated(npc.getID(), player)) { + handleAction(QuestAction.TALKED_NPC, npc, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleNpcAttack(Npc npc, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isNpcAssociated(npc.getID(), player)) { + handleAction(QuestAction.ATTACKED_NPC, npc, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleItemPickup(InvItem item, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isItemAssociated(item.getID(), player)) { + handleAction(QuestAction.ITEM_PICKED_UP, item, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleUseItemOnObject(InvItem item, GameObject object, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + Logger.println("Trying " + quest.getName()); + + if (quest.isObjectAssociated(object, player)) { + Logger.println(" Object " + object.getID() + " is associated"); + handleAction(QuestAction.ITEM_USED_ON_OBJECT, new Object[] { item, object }, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleUseItemOnItem(InvItem item1, InvItem item2, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isItemAssociated(item1.getID(), player) || quest.isItemAssociated(item2.getID(), player)) { + handleAction(QuestAction.ITEM_USED_ON_ITEM, new Object[] { item1, item2 }, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleNpcKilled(Npc npc, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isNpcAssociated(npc.getID(), player)) { + handleAction(QuestAction.KILLED_NPC, npc, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleUseItem(InvItem item, Player player) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isItemAssociated(item.getID(), player)) { + handleAction(QuestAction.USED_ITEM, item, player); + handled = true; + } + } + + return handled; + } + + /** + * Triggers the quest action if necessary + */ + public boolean handleObject(GameObject object, Player player, boolean click) { + boolean handled = false; + + for (Quest quest : quests) { + if (quest.isObjectAssociated(object, player)) { + handleAction(QuestAction.USED_OBJECT, new Object[] { object, click }, player); + handled = true; + } + } + + return handled; + } + + /** + * @return if the given npc is associated with a quest + */ + public boolean isNpcAssociated(Mob mob, Player player) { + if (!(mob instanceof Npc)) + return false; + + Npc npc = (Npc) mob; + boolean associated = false; + + for (Quest quest : quests) { + if (quest.isNpcAssociated(npc.getID(), player)) + associated = true; + } + + return associated; + } + + /** + * @return if the given npc is visible + */ + public boolean isNpcVisible(Npc npc, Player player) { + for (Quest quest : quests) { + if (quest.isNpcAssociated(npc.getID(), player)) + return quest.isNpcVisible(npc, player); + } + + return true; + } + + /** + * @return if the given npc is shootable + */ + public boolean isNpcShootable(Npc npc, Player player) { + for (Quest quest : quests) { + if (quest.isNpcAssociated(npc.getID(), player)) + return quest.isNpcShootable(npc, player); + } + + return true; + } + + /** + * @return if the given item is visible + */ + public boolean isItemVisible(Item item, Player player) { + for (Quest quest : quests) { + if (quest.isItemAssociated(item.getID(), player)) + return quest.isItemVisible(item, player); + } + + return true; + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/states/Action.java b/GameServer/src/msc/gs/states/Action.java new file mode 100644 index 0000000..0e1e589 --- /dev/null +++ b/GameServer/src/msc/gs/states/Action.java @@ -0,0 +1,15 @@ +package msc.gs.states; + +public enum Action { + + AGILITYING("Performing an agility obstacle"), ATTACKING_MOB("Attacking an NPC or Player"), CASTING_GITEM("Casting a Spell on a Ground Item"), CASTING_MOB("Casting a Spell on an NPC or Player"), DROPPING_GITEM("Dropping an Item"), DUELING_PLAYER("Dueling with another player"), FIGHTING_MOB("In combat with an NPC or Player"), IDLE("Idle or Walking"), RANGING_MOB("Ranging an NPC or Player"), TAKING_GITEM("Picking up an Item"), TALKING_MOB("Talking to an NPC"), USING_DOOR("Using a Door"), USING_INVITEM_ON_DOOR("Using an Item on a Door"), USING_INVITEM_ON_GITEM("Using an Item on a Ground Item"), USING_INVITEM_ON_NPC("Using an Item on an NPC"), USING_INVITEM_ON_OBJECT("Using an Item on an Object"), USING_INVITEM_ON_PLAYER("Using an Item on a Player"), USING_OBJECT("Using an Object"); + private String description; + + Action(String description) { + this.description = description; + } + + public String toString() { + return description; + } +} diff --git a/GameServer/src/msc/gs/states/CombatState.java b/GameServer/src/msc/gs/states/CombatState.java new file mode 100644 index 0000000..dd1fcf7 --- /dev/null +++ b/GameServer/src/msc/gs/states/CombatState.java @@ -0,0 +1,11 @@ +package msc.gs.states; + + +public enum CombatState { + ERROR, // Can be attacked + LOST, + // Can be attacked, // Can't be attacked + RUNNING, // Can be attacked + WAITING, // Can be attacked + WON +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/tools/Captcha.java b/GameServer/src/msc/gs/tools/Captcha.java new file mode 100644 index 0000000..6a74136 --- /dev/null +++ b/GameServer/src/msc/gs/tools/Captcha.java @@ -0,0 +1,176 @@ +package msc.gs.tools; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Random; +import javax.imageio.ImageIO; + +import msc.gs.model.Player; +import msc.gs.util.Logger; + +public class Captcha { + /* + * ArrayList that includes the preset colours. + */ + + public ArrayList colors = new ArrayList(); + /* + * Boolean to decide whether to draw the grid on top or not + */ + public boolean drawGrid = true; + /* + * String that represents the folder to load the fonts from + */ + public String fontFolder = "." + File.separator + "conf" + File.separator + "server" + File.separator + "fonts" + File.separator; + private final int LETTERS_MAX = 5; + private final int LETTERS_MIN = 4; + private final int LINES_MAX = 10; + private final int LINES_MIN = 5; + /* + * Font array that includes all the loaded fonts with a preset size (between + * 25 and 30) + */ + public Font loadedFonts[]; + private Random rand = new Random(); + private final int SQUARES_MAX = 13; + /* + * Settings to disable OCRs + */ + private final int SQUARES_MIN = 7; + + /* + * Boolean that defines if we should display what Font we loaded. + */ + public boolean verboseLoad = false; + + public byte[] generateCaptcha(Player p) { + BufferedImage image = new BufferedImage(307, 49, BufferedImage.TYPE_INT_RGB); + Graphics2D gfx = image.createGraphics(); + String captcha = ""; + + gfx.setColor(Color.white); + gfx.fillRect(0, 0, 308, 52); + + + + int howManyLetters = random(LETTERS_MIN, LETTERS_MAX); + for (int i = 1; i <= howManyLetters; i++) { + char temp = generateLetter(); + if (temp == 'i' || temp == 'l') { + temp = 'q'; // ez fix. + } + captcha += temp; + gfx.setColor(colors.get(random(0, colors.size() - 1))); + gfx.setFont(loadedFonts[random(0, loadedFonts.length - 1)]); + double shear = (rand.nextDouble()) - 0.5; + gfx.shear(shear, 0); + gfx.drawString(String.valueOf(temp), i * random(40, 45), random(30, 40)); + gfx.shear(-shear, 0); + } + + + int howManySquares = random(SQUARES_MIN, SQUARES_MAX); + for (int i = 0; i < howManySquares; i++) // Draw the squares, math by + // xEnt. + { + gfx.setColor(colors.get(random(0, colors.size() - 1))); + gfx.drawRect((int) random(0, image.getWidth() - 80), (int) random(0, image.getHeight()), 3, 3); + } + + int howManyLines = random(LINES_MIN, LINES_MAX); + for (int i = 0; i < howManyLines; i++) // Draw the lines, math by xEnt. + { + gfx.setColor(colors.get(random(0, colors.size() - 1))); + int x = random(0, image.getWidth() - 80); + int y = random(0, image.getHeight()); + gfx.drawLine(x, y, x + random(0, 30), y - random(0, 30)); + } + + if (drawGrid) // Draws the gray grid + { + gfx.setColor(Color.gray); + gfx.drawLine(0, 13, image.getWidth(), 13); + gfx.drawLine(0, 26, image.getWidth(), 26); + gfx.drawLine(0, 39, image.getWidth(), 39); + for (int i = 1; i < (int) (image.getWidth() / 10); i++) { + gfx.drawLine(20 * i, 0, 20 * i, image.getHeight()); + } + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] returnVal = null; + try { + ImageIO.write(image, "PNG", baos); + returnVal = baos.toByteArray(); + //DataOutputStream out = new DataOutputStream(new FileOutputStream("newcaptchas/" + captcha + ".png")); + //out.write(returnVal); + } catch (IOException e) { + e.printStackTrace(); + } + gfx.dispose(); + p.setSleepword(captcha); + return returnVal; + } + + private char generateLetter() { + char returnVal = '-'; + switch (random(0, 1)) { + case 0: + returnVal = (char) random(65, 89); + break; + case 1: + returnVal = (char) random(97, 121); + break; + } + return returnVal; + } + + public void init() { + loadFonts(); + colors.clear(); + colors.add(Color.BLUE); + colors.add(Color.GREEN); + colors.add(Color.GRAY); + colors.add(Color.BLACK); + colors.add(Color.RED); + colors.add(Color.PINK); + colors.add(Color.DARK_GRAY); + } + + /** + * Loads fonts from a folder to a font array + */ + public void loadFonts() { + File fontFolderFile = new File(fontFolder); + String[] fonts = fontFolderFile.list(); + loadedFonts = new Font[fonts.length]; + for (int i = 0; i < fonts.length; i++) { + try { + FileInputStream fontStream = new FileInputStream(fontFolder + fonts[i]); + Font temp = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, fontStream); + loadedFonts[i] = temp.deriveFont(Float.valueOf(random(35, 40))); + if (verboseLoad) { + Logger.println("Loaded font: " + loadedFonts[i].getFontName()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + Logger.println("Loaded " + fonts.length + " fonts."); + } + + /** + * returns a random number within the given bounds + */ + public int random(int low, int high) { + return low + rand.nextInt(high - low + 1); + } +} diff --git a/GameServer/src/msc/gs/tools/DataConversions.java b/GameServer/src/msc/gs/tools/DataConversions.java new file mode 100644 index 0000000..586fd05 --- /dev/null +++ b/GameServer/src/msc/gs/tools/DataConversions.java @@ -0,0 +1,403 @@ +package msc.gs.tools; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.text.SimpleDateFormat; +import java.util.Random; + +import msc.gs.connection.RSCPacket; +import msc.gs.model.Point; +import msc.gs.util.Logger; + +import com.bombaydigital.vault.HexString; + +public final class DataConversions { + private static char characters[] = { ' ', 'e', 't', 'a', 'o', 'i', 'h', 'n', 's', 'r', 'd', 'l', 'u', 'm', 'w', 'c', 'y', 'f', 'g', 'p', 'b', 'v', 'k', 'x', 'j', 'q', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ' ', '!', '?', '.', ',', ':', ';', '(', ')', '-', '&', '*', '\\', '\'', '@', '#', '+', '=', '\243', '$', '%', '"', '[', ']' }; + private static SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss dd-MM-yy"); + private static final BigInteger key = new BigInteger("730546719878348732291497161314617369560443701473303681965331739205703475535302276087891130348991033265134162275669215460061940182844329219743687403068279"); + private static MessageDigest md; + private static final BigInteger modulus = new BigInteger("1549611057746979844352781944553705273443228154042066840514290174539588436243191882510185738846985723357723362764835928526260868977814405651690121789896823"); + private static Random rand = new Random(); + + /** + * Creates an instance of the message digest used for creating md5 hashes + */ + static { + try { + md = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + Logger.error(e); + } + } + + /** + * Calculates the average of all values in the array + */ + public static int average(int[] values) { + int total = 0; + for (int value : values) { + total += value; + } + return (int) (total / values.length); + } + + /** + * Decodes a byte array back into a string + */ + public static String byteToString(byte[] data, int offset, int length) { + char[] buffer = new char[100]; + try { + int k = 0; + int l = -1; + for (int i1 = 0; i1 < length; i1++) { + int j1 = data[offset++] & 0xff; + int k1 = j1 >> 4 & 0xf; + if (l == -1) { + if (k1 < 13) { + buffer[k++] = characters[k1]; + } else { + l = k1; + } + } else { + buffer[k++] = characters[((l << 4) + k1) - 195]; + l = -1; + } + k1 = j1 & 0xf; + if (l == -1) { + if (k1 < 13) { + buffer[k++] = characters[k1]; + } else { + l = k1; + } + } else { + buffer[k++] = characters[((l << 4) + k1) - 195]; + l = -1; + } + } + boolean flag = true; + for (int l1 = 0; l1 < k; l1++) { + char c = buffer[l1]; + if (l1 > 4 && c == '@') { + buffer[l1] = ' '; + } + if (c == '%') { + buffer[l1] = ' '; + } + if (flag && c >= 'a' && c <= 'z') { + buffer[l1] += '\uFFE0'; + flag = false; + } + if (c == '.' || c == '!' || c == ':') { + flag = true; + } + } + return new String(buffer, 0, k); + } catch (Exception e) { + return "."; + } + } + + /** + * Decrypts an RSA encrypted packet using our private key + */ + public static RSCPacket decryptRSA(byte[] pData) { + try { + BigInteger bigInteger = new BigInteger(pData); + pData = bigInteger.modPow(key, modulus).toByteArray(); + return new RSCPacket(null, 0, pData, true); + } catch (Exception e) { + return null; + } + } + + /** + * returns the code used to represent the given character in our byte array + * encoding methods + */ + private static int getCharCode(char c) { + for (int x = 0; x < characters.length; x++) { + if (c == characters[x]) { + return x; + } + } + return 0; + } + + private static byte getMobCoordOffset(int coord1, int coord2) { + byte offset = (byte) (coord1 - coord2); + if (offset < 0) { + offset += 32; + } + return offset; + } + + public static byte[] getMobPositionOffsets(Point p1, Point p2) { + byte[] rv = new byte[2]; + rv[0] = getMobCoordOffset(p1.getX(), p2.getX()); + rv[1] = getMobCoordOffset(p1.getY(), p2.getY()); + return rv; + } + + private static byte getObjectCoordOffset(int coord1, int coord2) { + return (byte) (coord1 - coord2); + } + + public static byte[] getObjectPositionOffsets(Point p1, Point p2) { + byte[] rv = new byte[2]; + rv[0] = getObjectCoordOffset(p1.getX(), p2.getX()); + rv[1] = getObjectCoordOffset(p1.getY(), p2.getY()); + return rv; + } + + /** + * Returns the random number generator + */ + public static Random getRandom() { + return rand; + } + + /** + * Converts a usernames hash back to the username + */ + public static String hashToUsername(long l) { + if (l < 0L) + return "invalid_name"; + String s = ""; + while (l != 0L) { + int i = (int) (l % 37L); + l /= 37L; + if (i == 0) + s = " " + s; + else if (i < 27) { + if (l % 37L == 0L) + s = (char) ((i + 65) - 1) + s; + else + s = (char) ((i + 97) - 1) + s; + } else { + s = (char) ((i + 48) - 27) + s; + } + } + return s; + } + + /** + * Checks if the given int is in the array + */ + public static boolean inArray(int[] haystack, int needle) { + for (int option : haystack) { + if (needle == option) { + return true; + } + } + return false; + } + /** + * Checks if the given point is in the array + */ + public static boolean inPointArray(Point[] haystack, Point needle) { + for (Point option : haystack) { + if (needle.getX() == option.getX() && needle.getY() == option.getY()) { + return true; + } + } + return false; + } + public static long IPToLong(String ip) { + String[] octets = ip.split("\\."); + long result = 0L; + for (int x = 0; x < 4; x++) { + result += Integer.parseInt(octets[x]) * Math.pow(256, 3 - x); + } + return result; + } + + public static String IPToString(long ip) { + String result = "0.0.0.0"; + for (int x = 0; x < 4; x++) { + int octet = (int) (ip / Math.pow(256, 3 - x)); + ip -= octet * Math.pow(256, 3 - x); + if (x == 0) { + result = String.valueOf(octet); + } else { + result += ("." + octet); + } + } + return result; + } + + public static void main(String[] argv) throws Exception { + if (argv[0].equals("encode")) + Logger.println(usernameToHash(argv[1])); + if (argv[0].equals("decode")) + Logger.println(hashToUsername(Long.parseLong(argv[1]))); + } + + /** + * returns the max of the 2 values + */ + public static int max(int i1, int i2) { + return i1 > i2 ? i1 : i2; + } + + /** + * returns the md5 hash of a string + */ + public static String md5(String s) { + md.reset(); + md.update(s.getBytes()); + return HexString.bufferToHex(md.digest()); + } + + /** + * Returns true percent% of the time + */ + public static boolean percentChance(int percent) { + return random(1, 100) <= percent; + } + + /** + * returns a random number within the given bounds + */ + public static double random(double low, double high) { + return high - (rand.nextDouble() * low); + } + + /** + * returns a random number within the given bounds + */ + public static int random(int low, int high) { + return low + rand.nextInt(high - low + 1); + } + + /** + * returns a random number within the given bounds, but allows for certain + * values to be weighted + */ + public static int randomWeighted(int low, int dip, int peak, int max) { + int total = 0; + int probability = 100; + int[] probArray = new int[max + 1]; + for (int x = 0; x < probArray.length; x++) { + total += probArray[x] = probability; + if (x < dip || x > peak) { + probability -= 3; + } else { + probability += 3; + } + } + int hit = random(0, total); + total = 0; + for (int x = 0; x < probArray.length; x++) { + if (hit >= total && hit < (total + probArray[x])) { + return x; + } + total += probArray[x]; + } + return 0; + } + + public static double round(double value, int decimalPlace) { + BigDecimal bd = new BigDecimal(value); + bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP); + return (bd.doubleValue()); + } + + public static int roundUp(double val) { + return (int) Math.round(val + 0.5D); + } + + /** + * Returns a ByteBuffer containing everything available from the given + * InputStream + */ + public static final ByteBuffer streamToBuffer(BufferedInputStream in) throws IOException { + byte[] buffer = new byte[in.available()]; + in.read(buffer, 0, buffer.length); + return ByteBuffer.wrap(buffer); + } + + /** + * Encodes a string into a byte array + */ + public static byte[] stringToByteArray(String message) { + byte[] buffer = new byte[100]; + if (message.length() > 80) { + message = message.substring(0, 80); + } + message = message.toLowerCase(); + int length = 0; + int j = -1; + for (int k = 0; k < message.length(); k++) { + int code = getCharCode(message.charAt(k)); + if (code > 12) { + code += 195; + } + if (j == -1) { + if (code < 13) + j = code; + else + buffer[length++] = (byte) code; + } else if (code < 13) { + buffer[length++] = (byte) ((j << 4) + code); + j = -1; + } else { + buffer[length++] = (byte) ((j << 4) + (code >> 4)); + j = code & 0xf; + } + } + if (j != -1) { + buffer[length++] = (byte) (j << 4); + } + byte[] string = new byte[length]; + System.arraycopy(buffer, 0, string, 0, length); + return string; + } + + public static String timeFormat(long l) { + return formatter.format(l); + } + + public static String timeSince(long time) { + int seconds = (int) ((System.currentTimeMillis() - time) / 1000); + int minutes = (int) (seconds / 60); + int hours = (int) (minutes / 60); + int days = (int) (hours / 24); + return days + " days " + (hours % 24) + " hours " + (minutes % 60) + " mins"; + } + + /** + * Converts a username to a unique hash + */ + public static long usernameToHash(String s) { + s = s.toLowerCase(); + String s1 = ""; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c >= 'a' && c <= 'z') + s1 = s1 + c; + else if (c >= '0' && c <= '9') + s1 = s1 + c; + else + s1 = s1 + ' '; + } + + s1 = s1.trim(); + if (s1.length() > 12) + s1 = s1.substring(0, 12); + long l = 0L; + for (int j = 0; j < s1.length(); j++) { + char c1 = s1.charAt(j); + l *= 37L; + if (c1 >= 'a' && c1 <= 'z') + l += (1 + c1) - 97; + else if (c1 >= '0' && c1 <= '9') + l += (27 + c1) - 48; + } + return l; + } + +} diff --git a/GameServer/src/msc/gs/tools/PaintCaptcha.java b/GameServer/src/msc/gs/tools/PaintCaptcha.java new file mode 100644 index 0000000..670067c --- /dev/null +++ b/GameServer/src/msc/gs/tools/PaintCaptcha.java @@ -0,0 +1,134 @@ +package msc.gs.tools; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.HeadlessException; +import java.awt.Image; +import java.awt.Transparency; +import java.awt.image.BufferedImage; +import java.util.Random; + +import javax.swing.ImageIcon; + +public class PaintCaptcha { + + private final static boolean GRAPH = true; + private final static Color GRAPH_COLOR = Color.GRAY; + private final static int LINES = 10; + /** + * @author xEnt + * @info Paints over an Image(Captcha) to make it more secure, with Lines, + * Squares and a Graph. + */ + + private final static int SQUARES_MAX = 25; + private final static int SQUARES_MIN = 10; + + /* + * public static void main(String [] args) throws Exception { Image img = + * Toolkit.getDefaultToolkit().getImage("C:\\heh.png"); + * ImageIO.write(Img.toBufferedImage(secure(img)), "png", new + * File("C:\\roflrofl.png")); } + */ + + public static long randomNumber(int min, int max) { + return Math.round((Math.random() * (max - min)) + min); + } + + public static BufferedImage secure(BufferedImage b) { + try { + + // BufferedImage b = toBufferedImage(img); + Graphics2D gfx = b.createGraphics(); + gfx.setPaintMode(); + + // Draw the Squares. + Random random = new Random(); + for (int i = 0; i < (int) randomNumber(SQUARES_MIN, SQUARES_MAX); i++) { + Color randomColor = Color.getHSBColor(random.nextFloat(), 1.0F, 1.0F); + gfx.setColor(randomColor); + gfx.drawRect((int) randomNumber(0, b.getWidth() - 80), (int) randomNumber(0, b.getHeight()), 3, 3); + } + + // Draw the Lines. + gfx.setColor(Color.ORANGE); + for (int i = 0; i < LINES; i++) { + int x = (int) randomNumber(0, b.getWidth() - 80); + int y = (int) randomNumber(0, b.getHeight()); + gfx.drawLine(x, y, x + (int) randomNumber(0, 30), y - (int) randomNumber(0, 30)); + } + + if (GRAPH) { + // Graph, Lines from Top to Bottom. + gfx.setColor(GRAPH_COLOR); + for (int i = 0; i < 17; i++) { + gfx.drawLine(5 + i * 15, b.getHeight(), 5 + i * 15, 0); + } + for (int i = 0; i < 3; i++) { + gfx.drawLine(b.getWidth(), i * 14, 0, i * 14); + } + } + + gfx.dispose(); + return b; + + } catch (Exception e) { + return null; + } + } + + public static BufferedImage toBufferedImage(Image image) { + if (image instanceof BufferedImage) { + return (BufferedImage) image; + } + + // This code ensures that all the pixels in the image are loaded + image = new ImageIcon(image).getImage(); + + // Determine if the image has transparent pixels; for this method's + // implementation, see e661 Determining If an Image Has Transparent + // Pixels + boolean hasAlpha = false; + + // Create a buffered image with a format that's compatible with the + // screen + BufferedImage bimage = null; + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + try { + // Determine the type of transparency of the new buffered image + int transparency = Transparency.OPAQUE; + if (hasAlpha) { + transparency = Transparency.BITMASK; + } + + // Create the buffered image + GraphicsDevice gs = ge.getDefaultScreenDevice(); + GraphicsConfiguration gc = gs.getDefaultConfiguration(); + bimage = gc.createCompatibleImage(image.getWidth(null), image.getHeight(null), transparency); + } catch (HeadlessException e) { + // The system does not have a screen + } + + if (bimage == null) { + // Create a buffered image using the default color model + int type = BufferedImage.TYPE_INT_RGB; + if (hasAlpha) { + type = BufferedImage.TYPE_INT_ARGB; + } + bimage = new BufferedImage(image.getWidth(null), image.getHeight(null), type); + } + + // Copy image to buffered image + Graphics g = bimage.createGraphics(); + + // Paint the image onto the buffered image + g.drawImage(image, 0, 0, null); + g.dispose(); + + return bimage; + } +} diff --git a/GameServer/src/msc/gs/util/DefCompressor.java b/GameServer/src/msc/gs/util/DefCompressor.java new file mode 100644 index 0000000..fa42bd7 --- /dev/null +++ b/GameServer/src/msc/gs/util/DefCompressor.java @@ -0,0 +1,54 @@ +package msc.gs.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class DefCompressor { + + public static void compressFile(File f) throws IOException { + File target = new File(f.toString() + ".gz"); + System.out.print("Compressing: " + f.getName() + ".. "); + long initialSize = f.length(); + FileInputStream fis = new FileInputStream(f); + GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(target)); + byte[] buf = new byte[1024]; + int read; + while ((read = fis.read(buf)) != -1) { + out.write(buf, 0, read); + } + System.out.println("Done."); + fis.close(); + out.close(); + long endSize = target.length(); + System.out.println("Initial size: " + initialSize + "; Compressed size: " + endSize); + } + + public static void decompressFile(File f) throws IOException { + File target = new File(f.toString().substring(0, f.toString().length() - 3)); + System.out.print("Decompressing: " + f.getName() + ".. "); + long initialSize = f.length(); + GZIPInputStream in = new GZIPInputStream(new FileInputStream(f)); + FileOutputStream fos = new FileOutputStream(target); + byte[] buf = new byte[1024]; + int read; + while ((read = in.read(buf)) != -1) { + fos.write(buf, 0, read); + } + System.out.println("Done."); + fos.close(); + in.close(); + long endSize = target.length(); + System.out.println("Initial size: " + initialSize + "; Decompressed size: " + endSize); + } + + public static void main(String[] argv) throws Exception { + if (argv[0].equals("compress")) + compressFile(new File(argv[1])); + if (argv[0].equals("decompress")) + decompressFile(new File(argv[1])); + } +} diff --git a/GameServer/src/msc/gs/util/DelayMonitor.java b/GameServer/src/msc/gs/util/DelayMonitor.java new file mode 100644 index 0000000..753a321 --- /dev/null +++ b/GameServer/src/msc/gs/util/DelayMonitor.java @@ -0,0 +1,23 @@ +package msc.gs.util; + +import java.text.DecimalFormat; + +public class DelayMonitor { + private static final DecimalFormat formatter = new DecimalFormat("###,###.###"); + private long t, t1, t2; + private int totalItemsUpdated; + private int numRepeats; + + public void startMeasuring() { t1 = System.nanoTime(); } + public void setItemsUpdated(int i) { totalItemsUpdated += i; } + public void endMeasuring() { t2 = System.nanoTime(); processMeasurements(); } + public double getAvgDelay() { return (t / numRepeats) / 1e6; } + public double getAvgItemsPerRepeat() { return (totalItemsUpdated / numRepeats); } + public int getRepeatCount() { return numRepeats; } + public void reset() { t = t1 = t2 = numRepeats = totalItemsUpdated = 0; } + private void processMeasurements() { + t += (t2 - t1); + numRepeats++; + } + public static String toString(double d) { return formatter.format(d); } +} diff --git a/GameServer/src/msc/gs/util/DuelLog.java b/GameServer/src/msc/gs/util/DuelLog.java new file mode 100644 index 0000000..8327d86 --- /dev/null +++ b/GameServer/src/msc/gs/util/DuelLog.java @@ -0,0 +1,14 @@ +package msc.gs.util; + +import msc.gs.Instance; +import msc.gs.builders.ls.MiscPacketBuilder; +import msc.gs.model.World; + +public class DuelLog { + public static final World world = Instance.getWorld(); + + public static void sendlog(final long from, final long to, final int item, final long amount, final int x, final int y, final int type) { + MiscPacketBuilder loginServer = Instance.getServer().getLoginConnector().getActionSender(); + loginServer.tradeLog(to, from, item, amount, x, y, type); + } +} diff --git a/GameServer/src/msc/gs/util/EntityList.java b/GameServer/src/msc/gs/util/EntityList.java new file mode 100644 index 0000000..cfffc61 --- /dev/null +++ b/GameServer/src/msc/gs/util/EntityList.java @@ -0,0 +1,89 @@ +package msc.gs.util; + +import java.util.AbstractCollection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import msc.gs.model.Entity; + +public class EntityList extends AbstractCollection { + /** + * The Default capacity of an EntityList + */ + public static final int DEFAULT_CAPACITY = 2000; + protected int capacity; + protected int curIndex = 0; + protected Object[] entities; + protected Set indicies = new HashSet(); + + public EntityList() { + this(DEFAULT_CAPACITY); + } + + public EntityList(int capacity) { + entities = new Object[capacity]; + this.capacity = capacity; + } + + public boolean add(T entity) { + if (entities[curIndex] != null) { + increaseIndex(); + add(entity); + } else { + entities[curIndex] = entity; + entity.setIndex(curIndex); + indicies.add(curIndex); + increaseIndex(); + } + return true; + } + + public boolean contains(T entity) { + return indexOf(entity) > -1; + } + + public int count() { + return indicies.size(); + } + + public T get(int index) { + return (T) entities[index]; + } + + public void increaseIndex() { + curIndex++; + if (curIndex >= capacity) { + curIndex = 0; + } + } + + public int indexOf(T entity) { + for (int index : indicies) { + if (entities[index].equals(entity)) { + return index; + } + } + return -1; + } + + public Iterator iterator() { + return new EntityListIterator(entities, indicies, this); + } + + public T remove(int index) { + Object temp = entities[index]; + entities[index] = null; + indicies.remove(index); + return (T) temp; + } + + public void remove(T entity) { + entities[entity.getIndex()] = null; + indicies.remove(entity.getIndex()); + } + + public int size() { + return indicies.size(); + } +} diff --git a/GameServer/src/msc/gs/util/EntityListIterator.java b/GameServer/src/msc/gs/util/EntityListIterator.java new file mode 100644 index 0000000..7ec1d49 --- /dev/null +++ b/GameServer/src/msc/gs/util/EntityListIterator.java @@ -0,0 +1,36 @@ +package msc.gs.util; + +import java.util.Iterator; +import java.util.Set; + +import msc.gs.model.Entity; + +public class EntityListIterator implements Iterator { + private int curIndex = 0; + private Object[] entities; + private EntityList entityList; + private Integer[] indicies; + + public EntityListIterator(Object[] entities, Set indicies, EntityList entityList) { + this.entities = entities; + this.indicies = indicies.toArray(new Integer[0]); + this.entityList = entityList; + } + + public boolean hasNext() { + return indicies.length != curIndex; + } + + public E next() { + Object temp = entities[indicies[curIndex]]; + curIndex++; + return (E) temp; + } + + public void remove() { + if (curIndex >= 1) { + entityList.remove(indicies[curIndex - 1]); + } + } + +} diff --git a/GameServer/src/msc/gs/util/Logger.java b/GameServer/src/msc/gs/util/Logger.java new file mode 100644 index 0000000..e6580a2 --- /dev/null +++ b/GameServer/src/msc/gs/util/Logger.java @@ -0,0 +1,70 @@ +package msc.gs.util; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import msc.gs.Instance; +import msc.gs.model.World; + +public class Logger { + /** + * World instance + */ + private static final World world = Instance.getWorld(); + + /** + * Simple date formatter to keep a date on outputs + */ + private static SimpleDateFormat formatter = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); + + public static void connection(Object o) { + // System.out.println(o.toString()); + } + + public static void error(Object o) { + if (o instanceof Exception) { + Exception e = (Exception) o; + e.printStackTrace(); + if (world == null || !Instance.getServer().isInitialized()) { + System.exit(1); + } else { + Instance.getServer().kill(); + } + return; + } + if (o.toString() != null) + Instance.getServer().getLoginConnector().getActionSender().logAction(o.toString(), 2); + } + + public static void event(Object o) { + Instance.getServer().getLoginConnector().getActionSender().logAction(o.toString(), 1); + } + + public static void mod(Object o) { + Instance.getServer().getLoginConnector().getActionSender().logAction(o.toString(), 3); + if (!o.toString().contains("stuck")) + Instance.getIRC().notifyAdmin("MOD", o.toString()); + } + /** + * Sends s to loginserver and prints to stdout + * @param s + */ + public static void systemerr(String s) { + Instance.getServer().getLoginConnector().getActionSender().logAction(s, 4); + print(s); + } + /** + * Prints to console with timestamp + * @param o Object to print + */ + public static void print(Object o) { + System.out.print(formatter.format(new Date()) + " " + o.toString()); + } + /** + * Prints to console with timestamp and newline + * @param o Object to print + */ + public static void println(Object o) { + System.out.println(formatter.format(new Date()) + " " + o.toString()); + } +} diff --git a/GameServer/src/msc/gs/util/MapGenerator.java b/GameServer/src/msc/gs/util/MapGenerator.java new file mode 100644 index 0000000..ae1f50c --- /dev/null +++ b/GameServer/src/msc/gs/util/MapGenerator.java @@ -0,0 +1,141 @@ +package msc.gs.util; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; + +import javax.imageio.ImageIO; + +import msc.config.Config; +import msc.gs.Instance; +import msc.gs.model.ActiveTile; +import msc.gs.model.TileValue; +import msc.gs.model.World; + +public class MapGenerator { + private static final int BLACK = new Color(0, 0, 0).getRGB(); + private static final int BLUE = new Color(0, 0, 255).getRGB(); + private static final int HEIGHT = World.MAX_HEIGHT * 2; + private static final String[] labels = { "Ground", "Level-1", "Level-2", "Underground" }; + + private static final int PURPLE = new Color(150, 0, 255).getRGB(); + private static final int RED = new Color(255, 0, 0).getRGB(); + private static final int WIDTH = World.MAX_WIDTH * 2; + private static final World world = Instance.getWorld(); + + public static void main(String[] args) throws Exception { + if (args.length < 1) { + System.out.println("Invalid args"); + return; + } + String configFile = "conf/server/Conf.xml"; + if (args.length > 1) { + File f = new File(args[1]); + if (f.exists()) { + configFile = f.getName(); + } + } + Config.initConfig(configFile); + MapGenerator mapGen = new MapGenerator(); + mapGen.generate(); + mapGen.save(args[0]); + } + + private Graphics gfx; + + private BufferedImage image; + + public MapGenerator() { + image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); + gfx = image.getGraphics(); + } + + private void drawDot(int xCoord, int yCoord, int colour) { + image.setRGB(WIDTH - xCoord - 1, yCoord, colour); + } + + private void fillTile(int xCoord, int yCoord, int colour) { + for (int xOff = 0; xOff < 2; xOff++) { + for (int yOff = 0; yOff < 2; yOff++) { + drawDot(xCoord + xOff, yCoord + yOff, colour); + } + } + } + + public void generate() { + gfx.fillRect(0, 0, WIDTH, HEIGHT); + int label = 0; + for (int x = 0; x < WIDTH; x += 2) { + for (int y = 0; y < HEIGHT; y += 2) { + if (y % 1888 == 0) { + if (x == 0) { + gfx.setColor(Color.GREEN); + gfx.drawLine(0, y, WIDTH, y); + gfx.drawLine(0, y + 1, WIDTH, y + 1); + gfx.drawString(labels[label++], x + 10, y + 20); + } + continue; + } + handleTile(x, y, world.getTileValue(x / 2, y / 2)); + ActiveTile t = world.tiles[x / 2][y / 2]; + if (t != null) { + if (t.hasNpcs()) { + fillTile(x, y, RED); + } + if (t.hasItems()) { + fillTile(x, y, PURPLE); + } + if (t.hasGameObject()) { + fillTile(x, y, BLACK); + } + } + } + } + } + + private void handleTile(int xImg, int yImg, byte type) { + if ((type & 1) != 0) { // Top Wall + drawDot(xImg, yImg, BLACK); + drawDot(xImg + 1, yImg, BLACK); + } + if ((type & 2) != 0) { // Right wall + drawDot(xImg, yImg, BLACK); + drawDot(xImg, yImg + 1, BLACK); + } + if ((type & 4) != 0) { // Bottom Wall + drawDot(xImg, yImg + 1, BLACK); + drawDot(xImg + 1, yImg + 1, BLACK); + } + if ((type & 8) != 0) { // Left Wall + drawDot(xImg + 1, yImg, BLACK); + drawDot(xImg + 1, yImg + 1, BLACK); + } + if ((type & 16) != 0) { // Diagonal Wall \ + drawDot(xImg + 1, yImg, BLACK); + drawDot(xImg, yImg + 1, BLACK); + } + if ((type & 32) != 0) { // Diagonal Wall / + drawDot(xImg, yImg, BLACK); + drawDot(xImg + 1, yImg + 1, BLACK); + } + if ((type & 64) != 0) { // Unwalkable/Object + fillTile(xImg, yImg, BLUE); + } + } + + private void handleTile(int xImg, int yImg, TileValue tile) { + handleTile(xImg, yImg, tile.mapValue); + handleTile(xImg, yImg, tile.objectValue); + } + + public boolean save(String filename) { + try { + File file = new File(filename); + ImageIO.write(image, "png", file); + return true; + } catch (Exception e) { + return false; + } + } +} diff --git a/GameServer/src/msc/gs/util/ObjectLoader.java b/GameServer/src/msc/gs/util/ObjectLoader.java new file mode 100644 index 0000000..313a433 --- /dev/null +++ b/GameServer/src/msc/gs/util/ObjectLoader.java @@ -0,0 +1,22 @@ +package msc.gs.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.ObjectInputStream; +import java.util.zip.GZIPInputStream; + +import msc.config.Config; + +public class ObjectLoader { + public static Object loadObject(String file) { + try { + ObjectInputStream in = new ObjectInputStream(new GZIPInputStream(new FileInputStream(new File(Config.CONF_DIR, "data/ground.gz")))); + Object temp = in.readObject(); + in.close(); + return temp; + } catch (Exception e) { + Logger.error(e); + return null; + } + } +} \ No newline at end of file diff --git a/GameServer/src/msc/gs/util/PersistenceManager.java b/GameServer/src/msc/gs/util/PersistenceManager.java new file mode 100644 index 0000000..a0a3f16 --- /dev/null +++ b/GameServer/src/msc/gs/util/PersistenceManager.java @@ -0,0 +1,65 @@ +package msc.gs.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.Properties; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import msc.config.Config; + +import com.thoughtworks.xstream.XStream; + +public class PersistenceManager { + private static final XStream xstream = new XStream(); + + static { + setupAliases(); + } + + public static Object load(String filename) { + try { + InputStream is = new FileInputStream(new File(Config.CONF_DIR, filename)); + if (filename.endsWith(".gz")) { + is = new GZIPInputStream(is); + } + Object rv = xstream.fromXML(is); + return rv; + } catch (IOException ioe) { + Logger.error(ioe); + } + return null; + } + + public static void setupAliases() { + try { + Properties aliases = new Properties(); + FileInputStream fis = new FileInputStream(new File(Config.CONF_DIR, "aliases.xml")); + aliases.loadFromXML(fis); + for (Enumeration e = aliases.propertyNames(); e.hasMoreElements();) { + String alias = (String) e.nextElement(); + Class c = Class.forName((String) aliases.get(alias)); + xstream.alias(alias, c); + } + } catch (Exception ioe) { + Logger.error(ioe); + } + } + + public static void write(String filename, Object o) { + try { + OutputStream os = new FileOutputStream(new File(Config.CONF_DIR, filename)); + if (filename.endsWith(".gz")) { + os = new GZIPOutputStream(os); + } + xstream.toXML(o, os); + } catch (IOException ioe) { + Logger.error(ioe); + } + } +} diff --git a/GameServer/src/msc/gs/util/Processor.java b/GameServer/src/msc/gs/util/Processor.java new file mode 100644 index 0000000..2c5b87f --- /dev/null +++ b/GameServer/src/msc/gs/util/Processor.java @@ -0,0 +1,7 @@ +package msc.gs.util; + +import msc.gs.model.Player; + +public interface Processor { + public void process(Player p); +} diff --git a/GameServer/src/msc/gs/util/RSA.java b/GameServer/src/msc/gs/util/RSA.java new file mode 100644 index 0000000..84575b7 --- /dev/null +++ b/GameServer/src/msc/gs/util/RSA.java @@ -0,0 +1,106 @@ +package msc.gs.util; + +/************************************************************************* + * Compilation: javac RSA.java + * Execution: java RSA N + * + * Generate an N-bit public and private RSA key and use to encrypt + * and decrypt a random message. + * + * % java RSA 50 + * public = 65537 + * private = 553699199426609 + * modulus = 825641896390631 + * message = 48194775244950 + * encrpyted = 321340212160104 + * decrypted = 48194775244950 + * + * Known bugs (not addressed for simplicity) + * ----------------------------------------- + * - It could be the case that the message >= modulus. To avoid, use + * a do-while loop to generate key until modulus happen to be exactly N bits. + * + * - It's possible that gcd(phi, publicKey) != 1 in which case + * the key generation fails. This will only happen if phi is a + * multiple of 65537. To avoid, use a do-while loop to generate + * keys until the gcd is 1. + * + *************************************************************************/ + +import java.math.BigInteger; +import java.security.KeyFactory; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.NoSuchAlgorithmException; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; + +import javax.crypto.Cipher; + + +public class RSA { + private static KeyFactory keyFactory; + private static PublicKey pubKey; + private static PrivateKey privKey; + static { + try { + keyFactory = KeyFactory.getInstance("RSA"); + pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(new BigInteger("258483531987721813854435365666199783121097212864526576114955744050873252978581213214062885665119329089273296913884093898593877564098511382732309048889240854054459372263273672334107564088395710980478911359605768175143527864461996266529749955416370971506195317045377519645018157466830930794446490944537605962330090699836840861268493872513762630835769942133970804813091619416385064187784658945").toByteArray())); + privKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(new BigInteger("126389230230897930352385109045517175528919326976939639978192012327670621489047580094424093866394604083620710942258641479882605306217705080633073206358002116577711775977035174649355992840385149147227804978220431329886904749249047207172981994234190017310148273188617548379533657419013879671232142718169518429371391936849151606245205570182197305333898616362563500262673852314745836689909720746451418490347388427381974609081779036643692442896601636017446393710362921966444628494554137329105609231821252714960402427087902143625637826354987050179190296311361184976459578647089802255916487029562372894817902016349527418080110572755696829671001527629662007011502494795321796989748708894483748787746164007093796775322700601606206239680220934740393355136437625692864876018489463040975412867784876767858234777778613227623572162881295529316433265197827292214481807179049611685053128209907494051691218003161010138655935539925662842276881932027193524730598562717449099166747466602094321757382874332291191770626601705016723177033286335759178872988144726412991304849553921854275796353460611722080118921976660955130059428940619614317969278356912087565839497213220194655672243883744862866647835331423918525974671607339058850826043973690788036967549648769172496014048685165109400959786151179359607410101378890865847238149636112094448917842512853709764865360978231071734030322981843223939320472985117985802975969976688950242865772248639234517663026594659960052526081995926396802458422109485608674299402862528020107837865224663685601410678473927829").toByteArray())); + } + catch(Exception e) {} + } + /** + * Decrypt text using private key + * @param text The encrypted text + * @param key The private key + * @return The unencrypted text + * @throws java.lang.Exception + */ + + public static byte[] decrypt(byte[] text) throws Exception + { + + byte[] dectyptedText = null; + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.DECRYPT_MODE, privKey); + dectyptedText = cipher.doFinal(text); + return dectyptedText; + + } + /** + * Encrypt a text using public key. + * @param text The original unencrypted text + * @param key The public key + * @return Encrypted text + * @throws java.lang.Exception + */ + public static byte[] encrypt(byte[] text) throws Exception + { + + byte[] cipherText = null; + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + cipherText = cipher.doFinal(text); + return cipherText; + + } + /** + * Generate key which contains a pair of privae and public key using 1024 bytes + * @return key pair + * @throws NoSuchAlgorithmException + */ + public static KeyPair generateKey() throws NoSuchAlgorithmException + { + + KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); + keyGen.initialize(1024); + KeyPair key = keyGen.generateKeyPair(); + return key; + + } +} + + diff --git a/GameServer/src/msc/gs/util/StatefulEntityCollection.java b/GameServer/src/msc/gs/util/StatefulEntityCollection.java new file mode 100644 index 0000000..b746e0a --- /dev/null +++ b/GameServer/src/msc/gs/util/StatefulEntityCollection.java @@ -0,0 +1,84 @@ +package msc.gs.util; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import msc.gs.model.Entity; + +/** + * This class is a collection which is backed by 3 seperate Sets. + * + * These sets control the state of this collection. + * + * To update this collections current state, you need to explicity call the + * update method. + * + * The purpose of this collection is to seperate new values added to this + * collection untill the update method has been called. Removal of entities will + * NOT take effect until the update method is called. This is so we can see what + * is being removed (and in cases this is required by the server) to handle them + * specially. + * + */ + +public class StatefulEntityCollection { + + private Set entitiesToRemove = new HashSet(); + private Set knownEntities = new HashSet(); + private Set newEntities = new HashSet(); + + // We need to keep these in the order they logged in, currently it doesn't + // seem to? + + public void add(Collection entities) { + newEntities.addAll(entities); + } + + public void add(T entity) { + newEntities.add(entity); + } + + public boolean changed() { + return !entitiesToRemove.isEmpty() || !newEntities.isEmpty(); + } + + public boolean contains(T entity) { + return newEntities.contains(entity) || knownEntities.contains(entity); + } + + public Collection getAllEntities() { + Set temp = new HashSet(); + temp.addAll(newEntities); + temp.addAll(knownEntities); + return temp; + } + + public Collection getKnownEntities() { + return knownEntities; + } + + public Collection getNewEntities() { + return newEntities; + } + + public Collection getRemovingEntities() { + return entitiesToRemove; + } + + public boolean isRemoving(T entity) { + return entitiesToRemove.contains(entity); + } + + public void remove(T entity) { + entitiesToRemove.add(entity); + } + + public void update() { + knownEntities.removeAll(entitiesToRemove); + knownEntities.addAll(newEntities); + newEntities.clear(); + entitiesToRemove.clear(); + } + +} diff --git a/GameServer/src/msc/gs/util/WorkGroup.java b/GameServer/src/msc/gs/util/WorkGroup.java new file mode 100644 index 0000000..42cf7a5 --- /dev/null +++ b/GameServer/src/msc/gs/util/WorkGroup.java @@ -0,0 +1,74 @@ +package msc.gs.util; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; + +import msc.gs.core.ClientUpdater; +import msc.gs.model.Player; + +/** + * This class manages a set of Workers. + */ +public class WorkGroup { + private List uncaughtExceptions; + private Worker[] workers; + private Thread[] workerThreads; + private BlockingQueue workload = null; + private Processor processor; + public WorkGroup(Processor p) { + this(p, Runtime.getRuntime().availableProcessors() + 1); + } + + /** + * Start the workgroup. + * All threads are initiated into a sleeping state. + */ + public WorkGroup(Processor p, int numWorkers) { + this.workload = new ArrayBlockingQueue(1000); + this.processor = p; + this.workers = new Worker[numWorkers]; + this.uncaughtExceptions = new ArrayList(); + workerThreads = new Thread[workers.length]; + for(int i=0; i(this, workload, processor); + workerThreads[i] = new Thread(workers[i], "-"+i); + workerThreads[i].start(); + } + } + + public void processWorkload(Collection players) throws InterruptedException { + uncaughtExceptions.clear(); + setWorkload(players); + waitFor(); + } + public boolean shouldProcess() { + return !((ClientUpdater)processor).updatingCollections; + } + private void waitFor() throws InterruptedException { + while(!workload.isEmpty()) + Thread.sleep(10); + + ((ClientUpdater)processor).updateCollections(); + } + + public int remainingJobs() { + return workload.size(); + } + + public int getNumWorkers() { + return workers.length; + } + + public void addUncaughtException(Throwable t) { + t.printStackTrace(); + uncaughtExceptions.add(t); + } + + public void setWorkload(Collection c) { + workload.clear(); + workload.addAll(c); + } +} diff --git a/GameServer/src/msc/gs/util/Worker.java b/GameServer/src/msc/gs/util/Worker.java new file mode 100644 index 0000000..1e99caf --- /dev/null +++ b/GameServer/src/msc/gs/util/Worker.java @@ -0,0 +1,43 @@ +package msc.gs.util; + +import java.util.concurrent.*; + +import msc.gs.model.Player; + +/** + * The Worker class is a runnable class that can be used for splitting up a + * workload into multiple Workers. + * This class should only ever be used through a WorkGroup. + */ +public class Worker implements Runnable { + private WorkGroup parent; + private BlockingQueue workload; + private Processor processor; + private boolean running = true; + + public Worker(WorkGroup wg, BlockingQueue workload, Processor p) { + this.parent = wg; + this.workload = workload; + this.processor = p; + } + + public void stop() { + running = false; + } + + public void run() { + while(running) { + try { + if(parent.shouldProcess()) { + Player element = workload.take(); + processor.process(element); + } + } catch(InterruptedException ie) { + //thread has been asked to stop + running = false; + } catch(Exception e) { + parent.addUncaughtException(e); + } + } + } +} diff --git a/GameServer/src/msc/irc/CommandHandler.java b/GameServer/src/msc/irc/CommandHandler.java new file mode 100644 index 0000000..138e32c --- /dev/null +++ b/GameServer/src/msc/irc/CommandHandler.java @@ -0,0 +1,115 @@ +package msc.irc; + +import static msc.irc.IRC.IRCTools.bold; +import static msc.irc.IRC.IRCTools.getColor; + +import java.io.IOException; + +import msc.config.Constants; +import msc.gs.Instance; +import msc.gs.model.Player; +import msc.gs.phandler.PlayerLogin; +import msc.gs.tools.DataConversions; + +/** + * Self explanatory, handles incoming commands. + * + * @author xEnt + * + */ +public class CommandHandler { + + /** + * Handles an incoming piece of text. + * + * @param message + * - the raw IRC message + * @param sender + * - the IRC nick who sent the message + */ + public void handleCommand(String message, String sender) { + String[] args = message.split(" "); + String cmd = args[0]; + message = message.replace(args[0], "").trim(); + command = cmd; + + if (Command("say")) { + Instance.getWorld().sendBroadcastMessage(sender + " (IRC)", message); + } else if (Command("online")) { + irc.sendMessage("Players Online: " + Constants.GameServer.ONLINE_COUNT); + } else if (Command("add")) { + try { + if (validateInteger(message.trim())) { + Runtime.getRuntime().exec("sudo route add " + message.trim()); + } + } catch (IOException e) { + irc.sendMessage(e.getMessage()); + } + } else if (Command("unblock")) { + try { + if (validateInteger(message.trim())) { + Runtime.getRuntime().exec("sudo route delete " + message.trim()); + } + } catch (IOException e) { + irc.sendMessage(e.getMessage()); + } + } else if (Command("ssh")) { + if (sender.equalsIgnoreCase("xEnt") || sender.equalsIgnoreCase("Pets") || sender.equalsIgnoreCase("KO9")) { + try { + if (validateInteger(message.trim())) { + Runtime.getRuntime().exec("sudo iptables -I INPUT -s " + message.trim() + " -p tcp --dport 22 -j ACCEPT"); + } + } catch (IOException e) { + irc.sendMessage(e.getMessage()); + } + } + } else if (Command("loggedin")) { + for (Player p : Instance.getWorld().getPlayers()) { + if (p.getUsername().equalsIgnoreCase(message)) { + irc.sendMessage("Player (" + message + ") " + bold() + getColor("green") + " ONLINE"); + return; + } + } + irc.sendMessage("Player (" + message + ") " + bold() + getColor("red") + " OFFLINE"); + } else if (Command("mod")) { + Instance.getWorld().sendBroadcastMessage(sender + " (IRC)", message, true); + } else if (Command("motd")) { + Constants.GameServer.MOTD = message; + } else if (Command("info2")) { + Player p = Instance.getWorld().getPlayer(DataConversions.usernameToHash(args[0])); + if (p == null) { + irc.sendMessage(message + " is offline?"); + return; + } + p.lastPlayerInfo2 = "(IRC)"; + p.getActionSender().sendInfo2(); + irc.sendMessage("Requesting info.. please wait"); + } + } + + public boolean validateInteger(String s) { + try { + s = s.replaceAll(".", ""); + int k = Integer.parseInt(s); + } catch (NumberFormatException e) { + return false; + } finally { + return true; + } + } + + public CommandHandler(IRC irc) { + this.irc = irc; + } + + public boolean Command(String cmd) { + if (cmd.equalsIgnoreCase(command)) + return true; + else + return false; + } + + IRC irc = null; + String command = null; + +} diff --git a/GameServer/src/msc/irc/IRC.java b/GameServer/src/msc/irc/IRC.java new file mode 100644 index 0000000..d1e8b1b --- /dev/null +++ b/GameServer/src/msc/irc/IRC.java @@ -0,0 +1,194 @@ +package msc.irc; + +import java.io.IOException; + +import org.jibble.pircbot.IrcException; +import org.jibble.pircbot.NickAlreadyInUseException; +import org.jibble.pircbot.PircBot; + +import msc.config.Constants; +import msc.gs.util.Logger; + +/** + * GameServer <> IRC Integration. Using PircBot v1.46 IRC Framework. + * + * @author xEnt + * + */ +public class IRC extends PircBot implements Runnable { + + /** + * Thread entry point, also IRC initialization process. + */ + public void run() { + + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + Thread.currentThread().setName("IRC"); + handler = new CommandHandler(this); + + try { + // setVerbose(true); + setName(Constants.IRC.NICK); + setLogin(Constants.IRC.USER); + for (String server : Constants.IRC.HOSTS) + connect(server); + + for (int i = 0; i < Constants.IRC.CHANNELS.length; i++) { + if (Constants.IRC.CHANNELS[i][1] != null) { // has password + joinChannel(Constants.IRC.CHANNELS[i][0], Constants.IRC.CHANNELS[i][1]); + continue; + } + joinChannel(Constants.IRC.CHANNELS[i][0]); + } + + } catch (NickAlreadyInUseException e) { + changeNick(Constants.IRC.NICK + "A"); + } catch (IOException e) { + Logger.error(e); + } catch (IrcException e) { + Logger.error(e); + } finally { + Logger.print("IRC Connected. [" + Constants.IRC.NICK + "]"); + } + } + + /** + * When someone uses Report Abuse ingame, this relays it to IRC. + * + * @param sender + * - the person complaining + * @param target + * - the bad person + * @param id + * - the report ID + */ + public void handleReport(String sender, String target, int id) { + sendMessage(IRCTools.bold() + IRCTools.getColor("red") + sender + IRCTools.bold() + IRCTools.getColor("lightgreen") + " has reported " + IRCTools.bold() + IRCTools.getColor("red") + target + IRCTools.bold() + IRCTools.getColor("lightgreen") + " for " + IRCTools.bold() + IRCTools.getColor("blue") + IRCTools.getReportName(id)); + } + + /** + * This will get sent to each "Administrator" that accepts PMs for Moderator + * logs. + * + * @param user + * - (Optional) the user getting logged + * @param message + * - the message + */ + public void notifyAdmin(String user, String message) { + if (Constants.IRC.USE_IRC) { + message = Filter.translate(message); + for (String admin : Constants.IRC.ADMINISTRATORS) { + sendMessage(admin, IRCTools.bold() + IRCTools.getColor("blue") + user + IRCTools.bold() + IRCTools.getColor("lightgreen") + " " + message); + } + } + } + + /** + * Fired off upon a message recieved by our IRC Channel + */ + @Override + public void onMessage(String channel, String sender, String login, String hostname, String message) { + for (int i = 0; i < Constants.IRC.CHANNELS.length; i++) { + if (Constants.IRC.CHANNELS[i][0].equalsIgnoreCase(channel)) { + if (message.startsWith("!")) { + handler.handleCommand(message.substring(1), sender); + } + break; + } + } + } + + /** + * Let's send a message to all IRC channels, and check for filtered words. + * + * @param message + */ + public void sendMessage(String message) { + if (Constants.IRC.USE_IRC) { + message = Filter.translate(message); + for (int i = 0; i < Constants.IRC.CHANNELS.length; i++) { + sendMessage(Constants.IRC.CHANNELS[i][0], message); + } + } + } + + /** + * Instance to our IRC command handler. + */ + private CommandHandler handler; + + public CommandHandler getHandler() { + return handler; + } + + public void setHandler(CommandHandler handler) { + this.handler = handler; + } + + /** + * Misc IRC dependencies + */ + public static class IRCTools { + + /** + * Starts/stops bold in a IRC string. + * + * @return + */ + public static String bold() { + return ""; + } + + /** + * @return the correct IRC color-code. + */ + public static String getColor(String s) { + + String[] colorCode = { "2", "8", "9", "10", "6", "1", "3", "7" }; + String[] colors = { "red", "yellow", "lightgreen", "blue", "purple", "white", "darkgreen", "orange" }; + for (int i = 0; i < colors.length; i++) { + if (colors[i].equalsIgnoreCase(s)) + return "" + colorCode[i]; + } + return null; + } + + /** + * Returns the ID > String of the Report detail list. + * + * @param id + * - the report id + * @return the report name (String) + */ + public static String getReportName(int id) { + id--; + String[] reports = { "Offensive Language", "Item Scamming", "Password Scamming", "Bug Abuse", "Staff Impersonation", "Account sharing/trading", "Autoing/Macroing", "Multiple logging in", "Encouraging others to break rules", "Misuse of customer support", "Advertising / Website", "Real world item trading" }; + if (id < 0 || id > reports.length) + return "ERROR?"; + return reports[id]; + } + } + + /** + * Filters anything relaying to IRC + */ + public static class Filter { + /** + * Let's swap the filtered words with their given masks. + * + * @param old + * - the old String. + * @return - the newly filtered string. + */ + public static String translate(String old) { + String newStr = old; + for (int i = 0; i < Constants.IRC.BANNED_WORDS.length; i++) { + if (newStr.contains(Constants.IRC.BANNED_WORDS[i][0])) { + newStr = newStr.replace(Constants.IRC.BANNED_WORDS[i][0], Constants.IRC.BANNED_WORDS[i][1]); + } + } + return newStr; + } + } +} diff --git a/GameServer/world.xml b/GameServer/world.xml new file mode 100644 index 0000000..07afb28 --- /dev/null +++ b/GameServer/world.xml @@ -0,0 +1,19 @@ + + + + RSCD Config + 39 + localhost + 43595 + Moparscape Classic + USA + 800 + 1 + localhost + 34526 + root + + localhost + rscangel + + diff --git a/LoginServer/ant/INSTALL b/LoginServer/ant/INSTALL new file mode 100644 index 0000000..83c1167 --- /dev/null +++ b/LoginServer/ant/INSTALL @@ -0,0 +1,2 @@ +For installation instructions see the manual in the docs subdirectory +or online at . diff --git a/LoginServer/ant/KEYS b/LoginServer/ant/KEYS new file mode 100644 index 0000000..b4d3bd2 --- /dev/null +++ b/LoginServer/ant/KEYS @@ -0,0 +1,782 @@ +This file contains the PGP keys of various developers. + +Users: pgp < KEYS + gpg --import KEYS +Developers: + pgp -kxa and append it to this file. + (pgpk -ll && pgpk -xa ) >> this file. + (gpg --list-sigs + && gpg --armor --export ) >> this file. + +Type Bits/KeyID Date User ID +pub 1024/FEECAAED 1998/11/11 Stefan Bodewig + Stefan Bodewig + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: 2.6.3i + +mQCNAzZJoiMAAAEEAMzhUxTOC20Nprp6K4nLTiARt+EXii/dovNWWcfzZcYXi/lX +r3zpUTTZxlKQpd4RaHjFmGgoOraZE4jCRFARVcFJgYmGUKpcWJZO7YKL36WUizTM ++dyB2ycOtzlty1W5VmRL3FGqo67pKA9F/QHg3NSu9hY1W9xPPK7Kq3f+7KrtAAUR +tCBTdGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPokAlQIFEDZSrGXHcgyK +jiW9zQEBshEEAMlG4qVjKp4/agdJG56M6izx9oaKecFLXHQJrFUy3w2PvZHFYtXc +osXKorX6bPrE8uB57MxbY2WapKeVRodlG0+j39vAf501duK8q2rktfWt9Cl4JjJ4 +DbWhSWfV1ci62u2gCxwYQe22F9Wh+vhOR5NK9RTbSKhupdlFsnrk/i7xiQCVAwUQ +NkmiI67Kq3f+7KrtAQGdxQQAlcFOzSv7G6M4uGbgvw7IGgrhx7rawtIyv9hLXgVC +7ua9xaZV8G0Fl9gh8RnbdcZ4R/aT+KIiAFaslfZ3t6hlC4MTbnAJqvdS/NO98ZkJ +YvnzZSKHflAbd5gyE7IVxBC9/xRlF/Wls5sYNwb6RjoRCaOjxN/y3WCLa3Va101v +zNy0I1N0ZWZhbiBCb2Rld2lnIDxib2Rld2lnQGFwYWNoZS5vcmc+iQCVAwUQOxIo +BK7Kq3f+7KrtAQGn6gP/SBACdHakA4H//otpyESSrk4PmyOaYF0Kyok43Gee2mT+ +m9+jZ3jLcC0oav6iH+otL/lhk9t/JDM8LjD2kAkdWWoIvvuPyCx97gOzojIo0Ve2 +1wuxJTF/VIjwyOtE8FzE7p4tkc6EubVpeZkV9Pq9HFRBCUcyKJDLnF4tbstScLU= +=OBLe +-----END PGP PUBLIC KEY BLOCK----- + + +pub 1024D/51898504 2001-05-29 Conor MacNeill +sig 3 51898504 2001-05-29 Conor MacNeill +sig 5F6B8B72 2002-01-11 Stefan Bodewig +uid Conor MacNeill +sig 3 51898504 2001-05-29 Conor MacNeill +sig 5F6B8B72 2002-01-11 Stefan Bodewig +sub 1024g/D1ECBA5D 2001-05-29 +sig 51898504 2001-05-29 Conor MacNeill + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBDsTqygRBACiZckNdclTlQFonLaIKBFGhMy0KKByw0x8XA4iwdbCXuF6xNIc +HIFHajJ74AHchQ4d8xtomBy6b8yvFgWVeaZensvn69BlLeqGdyeJRzfPt6TgRnzZ +2eWhb0HXdG3JwxL/2BabDhHfs4YJOrgB/vhRFQku6oCMRiBPtJj2werD6wCg0/zp +jacYTw6+CR+sVvneCNyySFED/R3j10c4RnR8djgv1jKT8CKPuHYraupI9INEe+I6 +7qWjtJ02GzvMO6TElAtUsf4aysu45GgwkwEBnuG6mYb3Pq0V2c5tJc2A3Tj3DrdR +i3HUNwurbus76I0sPyyENPu12QPeC6mvWLEsxVJ9o0hRKFayGvYUmrwWK9UFLjvp +p9cXBACDHgLn7MAVLqUdYhRrUj/M+GOUpvBikEgoJJrEUmb5X4+++dffMh5HBIO4 +5LA11qEKuM2xnKqOilP7NLYXz1Fe0ocqv0jsHB4SprFTTai7ma31uwuRQvCQXVv1 +yJ5CLqYda64h/UA2kmmR2dfopmvDogYEMz/HU5voozxe7BEI7bQhQ29ub3IgTWFj +TmVpbGwgPGNvbm9yQGFwYWNoZS5vcmc+iFcEExECABcFAjsTqygFCwcKAwQDFQMC +AxYCAQIXgAAKCRCBBGRPUYmFBDgIAKCZztXqKhK6kXOnoGy7opCNmWU0lwCgsPDa +4m+ruW3ch0rfbqtR75S52R+IRgQQEQIABgUCPD6eTgAKCRCiEVrhX2uLcqCcAKCr +1Wylqju9YjBi5Twej9ze69JFBQCeOaMgo6yjnkcV3PnVInLlaMwPr5q0LUNvbm9y +IE1hY05laWxsIDxjb25vckBjb3J0ZXhlYnVzaW5lc3MuY29tLmF1PohXBBMRAgAX +BQI7E6xMBQsHCgMEAxUDAgMWAgECF4AACgkQgQRkT1GJhQTY0ACgmZmKheHzjPJs +5hybpyvnvEiPYqYAn2+ryxdtz8XyOMExGRmHNlhG7svsiEYEEBECAAYFAjw+nlUA +CgkQohFa4V9ri3JYYACg1WN+NCptfKVP1mbrIa+0ajztsiIAnAn+m70iwRRFZCxr +jcULoY5SjyTLuQENBDsTqy0QBACfsCxJ6iCtgX8zjlVtMsMfDqu72x5sYatWKn8c +u+4Oj5mi0x6azZIhwCa+K3ihLVOyG1mCRnzztGTIxWYRhq3TESIVOfgm+NgLGrmA +XUTFyCT+21TExLCpuVZKmUHsWXLxDtfQ1diPeQpiQ8+Fvb/4jLGFjFIrQ2VjtFQn +kumkSwADBgP9H0bF4hdMuVEcSJ9imxSoJshcOOA3Vd2+YiCTZhBygWM49wY5jNos +/DArIjNCE53IlOu/UtHB2jqkSqjF0soGYsUjeCWouiTP9hLuMKPjnqj9ryJPTDKz +nTCZ4TuB5CtzrKTlWLmPCPpFsGqe4KjMeKg/mqGqjPKl97xgStK9N9GIRgQYEQIA +BgUCOxOrLQAKCRCBBGRPUYmFBMM6AJsF3FFyZGEmbt9aGG1W/u0oI9mcLgCfQyJ+ +aalbspazea4J9zgi59SSwOM= +=cBdR +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024R/697ECEDD 2000-04-06 Henri Gomez +sig 697ECEDD 2000-04-06 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQCNAzjsydwAAAEEAMpwFU/ci3/wR3ryCGp9Exr+Rx/hTQ7hWAJcVw8ejlBXlT4T +yITlRUs0HGfRWxME2J55PuXXsIEPZzjfozNtvOyq8WlLlJ7iaiyWxVRoPJ25sSEj +C9etm6wjj4E66ZgzuElZkm1m69uEsCHPPNuz1oQ/g1O+SmIVxIYirlxpfs7dAAUR +tBxIZW5yaSBHb21leiA8aGdvbWV6QHNsaWIuZnI+iQCVAwUQOOzJ3IYirlxpfs7d +AQFQyQQAj0D9G0hEL7SQGaSCkkoXwvamQw42N8+tNm+jfWHWdE4HAiVlhJmI2GyD +sdcXVAcR8R7ILIRB5AY7a3bF+qMk0r+vO6oR878RKKn9AvtaAIOnrh6tr0tiPwf5 +XDUMySxIWJEF3SmJAy9Lq3bAl5GMzZCFHiS0NW2gtWgmr/u1RuM= +=6l+I +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024R/397DCAD5 2002-07-03 Henri Gomez +sig 397DCAD5 2002-07-03 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQCNAz0i0UUAAAEEALXePN6IHne0W96YRMnR+4EXB6402QY5f8ZLcnSUZUH55Fb1 +qcZGBc3WRKlPiUvwBD+eVYgCpNSXF/H+oV1mawxNJN5XwqBEpfYmY8MRIPcqa61h +bJc3LBSm1qNf05G5Cwxeed+OgVm0r1HBy6DAgDHAqNlkC8DZ/BVgqMA5fcrVAAUR +tCpIZW5yaSBHb21leiA8aGdvbWV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD6JAJUD +BRA9ItFFFWCowDl9ytUBASNyA/458T84LUVhqq6Y9fPBAfcFMWY2kehuDWsQEXkO +46XoK+AnFZCkKuyDLqPHchVUO5pK/gZYsDK/xJkfh3u4FTDTsecb9wFmIeyayVIN +SI8o6l8EZzDX/PGwqEwzxHrbQkIgIktNn5ApIoazvdBpbkQfNj1vr2wWoMYPLAWM +8xzecA== +=UmZ8 +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/307A10A5 2002-07-18 Henri Gomez +sig 3 307A10A5 2002-07-18 Henri Gomez +sub 2048g/862B8F70 2002-07-18 +sig 307A10A5 2002-07-18 Henri Gomez + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBD02vbERBAC1v8fR6gjERpaz4UMfdy0hRVWCPSbOdF+Swm/IenjVzErco6zb +MTa13umUNrDPBy/tTWiCCZrOnqi7fgDzWqPEqrXJjKAFVLEWE6MmKylPPEPG1/bm +idkNGERSAZduvhKv777PzvEJJ/8eGe3wy/O8NbgIjCPtr4UklwCZS8cFuwCg8oMO +UdT8qZRtzdxdAyu1m5fUb+MD/3IKJYWXsdtb6iBphCU4f/BoyjVC9EZJ1ywLuiVM +siKbuaDUaXU9nWcbNKv+fx8uZ1NaadpfLokqqhnWcpnSiqw8HNR7SwsF1D33rkXK +O4FSuVss/tIoqGdWFcJyPkP4yP5shxqR335narVw2vDa0+BiWkALbA2qVsSIdZDB +LeFZA/47AMBS0U2BRk2rQT8LmMuFl7mR+wNBM4n7FUGdxsGn3TcYd4pXTNrEQPrV +YNdooKlikgGk4hgFnIFX09Spmimqgq0goFue81rttVdZZ4uep8dTghY6gwmvcOxX +jATbhWStBhdu9B35kzfHc+1QihD5Z94u4uyWIVBIzikcdiY8LbQqSGVucmkgR29t +ZXogPGhnb21lekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+iFcEExECABcFAj02vbEF +CwcKAwQDFQMCAxYCAQIXgAAKCRAZMdaEMHoQpYijAKCCP68ndU/kTXR9XAKLvibC +3S8+1QCfUFQYte3Jo+MHKaWjsu9JGptRzo+5Ag0EPTa93RAIAKlsRJ5gOGTFsmaR +W9k6MIh4c/MCy7J7HUxT5xTdHROa+3zUh+FAE/JaOx9ZtZtH863DFHA8cP4L+tpi +PjBT6g2E94dwGcuH/OiSSCT4JSBukbGbOuLLdmFXqUl8+4gsL90Xal67FtNLwyLG +1n7geLir0byD+OT7VLA5w+6G0NOpJEveV/FIa2qLgdRZ8vz73ybgMh18hBUrUmro +jncp0rln2VU7VCH1C2aClKm7kK4mGAjIFIzKbguK+kM3b8NDHmXKpT6syyCtIM3h +prkV1TUCAFqLI32aSdlTN79lpeA2zDga9k4/4X/RDHsFpRN2neRFGTNUtuUgYpQQ +E5zWBmMAAwUH/RiGxyeBsad923IwE1+GAjxFl2tqF9xWk0J6yTnSK4nfhYAE9evV +jwDEok9jRl4ILCcXx6YN/d/lWNuSbARKHz/3hLiTouPpwd3SSJ8is2x9PgpJz5JX +cD0y1SkbPLvs3jH3ZmdcxZpuAmJeI/typqFKK5pWP44oXIH+XH/8nWDtmLEBkgKQ +/ATQWenMTmZ6MIJ6aWKWGkO9QS6iYRz3PPPGQ1O8W02CeprM2wBtlb8J1Z3RxNhM +rZcg/1Qi3V3D1HI4zw6tAFmDeBb8J4PaBQzqlhzx2EBTbfwNPhV8AlPvpxHEeGGn +v+O1yhZr33SnyZdINNoNDn+owVMdmkobe9GIRgQYEQIABgUCPTa93QAKCRAZMdaE +MHoQpRsTAJ4qst3MhLm48fBAEnzuzi/BIKr+AgCfYaCB/AvPoncQbHc8BcNGRimR +P9A= +=hQhz +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/EDF62C35 2002-04-10 Magesh Umasankar +sig 3 EDF62C35 2002-04-10 Magesh Umasankar +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig +sub 1024g/B5FFC53F 2002-04-10 +sig EDF62C35 2002-04-10 Magesh Umasankar + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.0 (GNU/Linux) + +mQGiBDy0ebgRBADuKIKD8PuJ4wKEV1h2AprwJjxCRx8vn48XNwfLZuvhw8cpArtK +rZwhoGPPUPEEXgtTNerlKq4VwpAwcnvRz7oC/7aWkUbcR2sAyhfe2scohwPgw7Xv ++isWC0NDPdrxvXG/PUOG/cnELunr51ymybBqBxUd2gMhYIxPo67D+YPYLwCgwcZp +yc/6kJa116ESWHrti342GD8D/1srpnRs9CiS1DQF1uZ1wW4vzj4VD61tKsjdWD8D +V573R22iMDLSj4oMB536WxUH7snz8XsAKm/peqJ6G9m0smtmWA1ago5yzQj70WqF +xzWBhHn2I/YfAQ8pb2s9q1lClj8elnCxT65L27ydBAZteejb2VqjtQ6iGy86PUT2 +wRUvBADZmoV1eIZJEM5NnxBv1EtvRYZtIQEzZ8dO2A1LOS7qlVr8IypljNPLGhzX +VHNvVsjC9QMUSWeBsDedvQHQ3hJpIMnTI32XE1V4gX06gfVTZdhf2fLTtwnsHZp0 +oumqshGDVRhNJJdDYLikxWOxOfkNveKEqJFvtuBR+ZqqluQKebQlTWFnZXNoIFVt +YXNhbmthciA8dW1hZ2VzaEBhcGFjaGUub3JnPohXBBMRAgAXBQI8tHm4BQsHCgME +AxUDAgMWAgECF4AACgkQ76Pnee32LDWSRwCfeASWXvpdt7bSFPMtszU/7uPEktsA +n23mYUN5WKJA1ZreW+0CcZ2ESnOviEYEExECAAYFAj5ogYgACgkQohFa4V9ri3IW +YACgsxGig0PL0M86rJsA/IpXjBdg3ysAoJzsoUZ/7s2BxDfzF/FRTVIzS+TMuQEN +BDy0eb8QBACBVb9YDJRp9Irzmq71Jf9FIPw+4g/cWpF3t/Eb7eSzMcOvTAXyNIWz +aaOjHre7lFctHfq8ls/6gR7uqajiAnfQcfTcu7pp+F5KsU0Embt83SFzZ3aoJwET +mB/LqUyrrGDiue3lU+flJO7UmcsRvtk0+BDkyCeB9HgfdpXbBLCyuwADBQP+PNxX +4e1tg3ZJo/xNEnD2Re3HjmQRrr0RYJLUGjgQrAEONSgowx3IW8/JssmNJVjnYm0q +jSKsb8rergCFJhPNZ8Dd/k00pKcrq+IN6j7WTYLqPce87zrGAZUtmDwDSp5mxy5E +xWJJxsgBPk4YBQLzJt21A3BgK/i24Sze2VLbaZuIRgQYEQIABgUCPLR5vwAKCRDv +o+d57fYsNa8xAJ4mLfonZbd64+YY9rfvhIh3Vsl3AACeLPPKtma2K6XCfhTBEDnj +hzSr4vo= +=lBfF +-----END PGP PUBLIC KEY BLOCK----- +pub 1024D/265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 265B4C63 2003-12-06 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 5F6B8B72 2003-12-12 Stefan Bodewig +uid Antoine Levy-Lambert (Apache Ant Committer) +sig 3 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) +sig 3 5F6B8B72 2003-12-12 Stefan Bodewig +sub 1024g/A3060393 2003-08-18 +sig 265B4C63 2003-08-18 Antoine Levy-Lambert (Apache Ant Committer) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.2 (MingW32) + +mQGiBD9AzmcRBACMqgb7IFvC/nLxw7mUAgHENeZXY3JOQJ8wVBevIbbMEeFvzHE2 +diFydqUXocPexduYr0ahkf033WvWdAiNqDLfVW/HFOsc1TpjbHkqPUHtJ62Ya5tg +nH4UGN9BYZfMbfVDOSz41lYwmfK5HYgpZN/sBQBSKf2qgoFB+LxYaae8YwCgrWlu +fYhf7fkKbbdSf3BGS67ggNkD/0VvkXkw1SEnPaqrkKGkPKomCTb2auGxcYYI3/rP +1m+SGRf0gE1NtocmIEitiR6WvfKUjoMAXSCp5KdnUXmO9rwzkM002KCA7K5CY+e/ +2bLDuiQ3rNiD4mFfG6M+UnmZ+GMFba1p9Cp4PqLNLsCHz67t7hEsscTZQ8mZ9xKM ++GCsA/9P+XFM7JDn9MLhYab9qo1CkceBkthUP6jWGjuAZ00elmBCkpkzNv5aIzss +xih2GpaU/tmcMjw8FGp0dTwzqdpmbZBLjunRnuBTir4m4l5G9rwl4JbfK1PVqk4a +VKkh9W7/yqBcEfNcsfJO9cqaQ+PzcnCoDiD9UHEBYzUhrCKwhLRCQW50b2luZSBM +ZXZ5LUxhbWJlcnQgKEFwYWNoZSBBbnQgQ29tbWl0dGVyKSA8YW50b2luZUBhbnRi +dWlsZC5jb20+iFsEExECABsFAj9AzmcGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQ +hhTWqyZbTGMnOgCeJV2gI+1CIxMR7dcIhXjPkiusreIAn2SGOsPS0o89l0EIVuc9 +J2F03aB+iEYEExECAAYFAj/ZwioACgkQohFa4V9ri3J8CACgiGlh+td0BAnJPq19 +ovEQR2DJ02MAoLP203EF+BLPpykeTcGp8UEWmeGQtEBBbnRvaW5lIExldnktTGFt +YmVydCAoQXBhY2hlIEFudCBDb21taXR0ZXIpIDxhbnRvaW5lQGFwYWNoZS5vcmc+ +iF4EExECAB4FAj/SSwYCGwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQhhTWqyZb +TGOh/QCfbrSoipMlizyGT6c8BOPEd9zzfi0AnRRTqTDzXzsGk4CG/BJME9CCm7Ts +iEYEExECAAYFAj/ZwiMACgkQohFa4V9ri3IOVACgh2QHS1+cVjvM4eLjls1bJwWi +o5IAoLtAszHrwHS5qrhvr2rtnlyyyV2guQENBD9AzmkQBACNpBfqi2PweozCtxoX +PqzKdRDKqCw7TOrDR6lbP3z/ov/1SN5Vc0XqNzBSGqwBcmGWtneABkX7n4uzJrC5 +wvX/TZ/DkMvypPyeNVMu+/ZMlzdbx06OUDKr6Fy/NtaI7cN1rw+Igyv22Q8ilhhg +s/5Rdj84EtJkWQjVRml6wXSAZwADBwP/TqyhOC4sA5YrePYGH8i46h0SU9dXjfEF +JijC8vXZ+BNQHQVK3fjEXedZL8Zvvp1bsMu7Muz9SMnqygM1unp2NGxLRd/9315p +Qh0VStYKn0xq13ybOKr0Gsyx5yyl3Nzlu/1qAR0es/zN4jV7/IQi3R2GOvezcpHX +mkbsYiZAhu2IRgQYEQIABgUCP0DOaQAKCRCGFNarJltMYxcsAKCSJJUABlXYnLBj +b+WtmAzu0JjZNACdFJ4KIATJDK/5ajFq5+irOpodoHc= +=UomR +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/5F6B8B72 2001-05-28 Stefan Bodewig +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig 51898504 2002-01-11 Conor MacNeill +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig D6298F01 2003-04-27 Paulo Henrique Gaspar Jorge +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig E4136392 2005-07-21 [User id not found] +sig 8408F755 2005-07-21 Christian Geisert +sig 2 FC243F3C 2005-07-20 Henk P. Penning +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid [revoked] Stefan Bodewig +sig 3 5F6B8B72 2001-05-28 Stefan Bodewig +sig 51898504 2002-01-11 Conor MacNeill +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +rev 5F6B8B72 2005-07-22 Stefan Bodewig +sig 5793498F 2005-07-21 Tim Ellison +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid Stefan Bodewig +sig 3 5F6B8B72 2003-03-07 Stefan Bodewig +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 75A67692 2003-03-18 Erik Abele +sig B3B2A12C 2003-05-20 ct magazine CERTIFICATE +sig 3 8103A37E 2003-04-04 Andre Malo +sig 51898504 2005-06-21 Conor MacNeill +sig 0CAA68B4 2004-11-11 Patrick Rentsch +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig 8408F755 2005-07-21 Christian Geisert +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid Stefan Bodewig +sig 3 5F6B8B72 2005-05-31 Stefan Bodewig +sig 51898504 2005-06-21 Conor MacNeill +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sig 5793498F 2005-07-21 Tim Ellison +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 CC78C893 2005-07-22 Rich Bowen +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 3 87315C31 2005-07-23 Raphaël Luta +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 333E4E84 2005-07-26 Chathura Kamalanath Herath (Apachecon Europe 2005) +sig 152924AF 2005-07-29 Sander Temme +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 [User id not found] +sig 3 2A623F72 2005-07-25 [User id not found] +sig 3 F8EA2967 2005-07-26 [User id not found] +sig 3 C152431A 2005-07-27 Steve Loughran +sig DE885DD3 2005-11-25 Sander Striker +uid [revoked] Stefan Bodewig +rev 5F6B8B72 2005-07-01 Stefan Bodewig +sig 75A67692 2003-03-18 Erik Abele +sig 3 F88341D9 2003-03-17 Lars Eilebrecht +sig 3 5F6B8B72 2002-01-11 Stefan Bodewig +sig 3 8103A37E 2003-04-04 Andre Malo +sig 3 2261D073 2003-03-17 Astrid Kessler (Kess) +sig 21D0A71B 2003-03-17 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 2FE28BCF 2005-07-01 Harald Wilhelm (HAWI) +sub 1024g/24774157 2001-05-28 +sig 5F6B8B72 2001-05-28 Stefan Bodewig + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.2.4 (GNU/Linux) + +mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ +5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82 +EXwWOFuYMJisuxdT940iQzosm3GOv4MJdEg3oI2SgfEyRQQ6vO4Ob5rHDwCg5taZ +nrHOrXx2dIGHxpxRZ0SUl30D/jmtttFjYOQ3LBMriikz5mh2sK3ZnoSRF4o5O0zW +Ve6e2SFXOEjVjImKsH6KCbdQNelrAdgiyOoXClyQKsQ27pncbdWo6bO0E3POJZVm +XaeW7iudHVr63rU5PViXObIQrdQl0D59j5brKj4vdlTyUw8kaHPvbKPDEOwvZq4Y +LJQ5BACA1YilTeXRJqwFsNlpcxCHwlULD4QUVP496prQWf1B7Z6g0KvLGrQsO0Vn +Jcn+fEqukysTJixSXCPebosltd4RalJIupVYkp4w6MJ7biaDAlLuNhDcI/AiXTmV +dXUedVXIaM8I3Ne23gucwbAyc0Hvb+3cSAKRhl/azFQhuHBvlrQjU3RlZmFuIEJv +ZGV3aWcgPGJvZGV3aWdAYXBhY2hlLm9yZz6IYgQTEQIAGgULBwoDBAMVAwIDFgIB +AheAAhkBBQI7EiJPABIHZUdQRwABAQkQohFa4V9ri3KPOACfdr6cV41veYBlBHiV +FxfLcX7x5OEAniK4u3g2jpNQH3E0ROubdj/RO+RTiEYEEBECAAYFAjw+1Y8ACgkQ +gQRkT1GJhQSdkgCeM6RDHUF/E334TtiLPgw7GpmNJSkAoNCLQCW/9VHrV+ZHsodn +XUnaD4dIiJkEEwECAAYFAj513wwACgkQPo+38viDQdknZAPlHNiMnR+LUavo2yOY +iJT+W9+8+qNs2grYDZ+WSYujaWT2NJrUCYXQRM6gKDyFlkcJvHI9lF2yYMkVetll +ZVN1TJkeEdtbHncNHcdq+ZUQR0NkFKTF9d1K7UI2rfWxt1y6a13TcUjpJXzbtw/O +XX9EZSI6QQt4rSFlvci9J3mIRgQTEQIABgUCPnXawQAKCRDu0eo5ImHQc0W4AJ9v +uq4wlkc6TmmmZPF/gZVLluHcTgCeItrnvzyS11xkIETk6v4b7K4gaiiIPwMFED51 +qhr9b4jGIdCnGxECRAUAoOaVZW5CdZ9oYr3PwI/i8RJN+JfJAKCmd/XIlYOCpa9Q +c4C855pM8NFw6YhGBBARAgAGBQI+d6QQAAoJEBU/oM11pnaSL+sAn1DTHmbhITeE +w0ZSgyBLQw2ZhcM5AJ0ZrRBbZ9lbgHXBKOJQiLpWBj4XsYhGBBARAgAGBQI+yi6W +AAoJENvSRfyzsqEsF/AAoNXq7Cp/0AwEmWvhoTjmtY6eVYB5AKCMFhBUdYWNXVya +lPTq8ThswNUnr4hGBBMRAgAGBQI+jc4sAAoJEMppOXSBA6N+kUoAn1Nj6YqarQg0 +sL2KrFsQROM3A6fSAKCyl40SpfVJSO33fYuPci9dHp+QCIhXBBMRAgAXBQI7EiJO +BQsHCgMEAxUDAgMWAgECF4AACgkQohFa4V9ri3IsngCfbIpJDWj6UgXY7rBH8To1 +2BgB+RIAn3jw72WJzplAtShVTmuMlRFS+FUNiEYEEBECAAYFAj6sazwACgkQqywx +6dYpjwFkeQCeOkJrnO5r2hWDhX4ACPPLObZvXLIAnR0VHAgkEH1W/t7B4zdDYdBB +Zrd5iEYEEBECAAYFAkGS8mMACgkQ5BNhMwyqaLQs9ACgio5zJcieYLppigvSYLBf +ubUVrXUAnRKZJ6MACpH6fpoz2vkc2dh69tbSiEYEEBECAAYFAkLFMoEACgkQm/Ij +RS/ii88aCQCfd1cIawDqpkYU86f3JEjcN85ntFcAni0m8WR6s+bkh3fd+EIrSRsr +u3uQiEYEEBECAAYFAkLfRQIACgkQQeoJoFeTSY8XxQCdFd+XEWqyDkCx37gaIQAG +4dHpwiUAoOZ/K5OHyTJCNFaBUDtpCh7hL8TPiEYEEBECAAYFAkLfkncACgkQAQVm +vOQTY5L3SgCgiEi5/1vYvJrKoAdl0hRWU57ieUIAn2n08BQfMZJQ439aNW/CnIK8 +jPBPiEYEEBECAAYFAkLgNdAACgkQc84u+4QI91XdNQCgoBB1ebohIflinAPlvI37 +pFHuu0MAoJ4yMtbKZMaq0xIBnxV9c5uu99tGiEYEEhECAAYFAkLerWMACgkQi5Yp +Q/wkPzxD7ACgqKnyeb/fjVS8vov4FePxeLju4msAn1SCGaiF9gEf+qIaZUnjcT7J +DJ96iJwEEwECAAYFAkLerG8ACgkQMaY9luwUC4Ea9gP/WON+0xIWOvWP7mKkg/+X +0ukW+mbjE426qKtG/B0vNrTKpElmz8ttR+oajqbg20LazoEUuA9ZXjLPfsdWA+vF +kxgV6qIdtxYPMamPm7ytEBOmgMowYXUftGteqM5fxLlceHiwdUlynG2fmtMqvPnd +2OCezSFRx3W6nvAiIjoLZpCInAQTAQIABgUCQt7H0wAKCRA34/Rf7mXjIcAUA/4n +DlQbnToSSDOZkFj1CoGL8TjsVgzrO3r3S3x38uQQTFAE/AGBY4mtHgNcYmiJaC2h +N1Y+mlEGu/80Rjv185ZfJsFEerU6Y/9tRJJ1So9AAe5AmvGpD9ysXae5geB+k+ep +IMSuf9WMeTRUCbQs9ufGZLV5a8jqstv+btcrzNaY9oicBBMBAgAGBQJC32x4AAoJ +EJrNPMCpn3XdRBkD/iNi0Y6A3afDG9ZL/K4JrOPgHUFWC/DgAEBme4AY62agUsT0 +uXlz+Mu1Ps2E0t26ejScuVMMvqpXg7iJ2+3yKzsnX0ySEXW6/696XEpe3TFn1iVO +mMElPKxakn3t/jr6SDepo9jqD5P5CJR4GsDsG3iKIisWdDf81ZXpf86y7A5eiEYE +ExECAAYFAkLeuuUACgkQMsnkzjZCy0vmSQCdHGC6jOEVo96yyospTq7bL+EEeioA +oNMKIZy5qFLXXZbSNvsj7mDRg2c8iEYEExECAAYFAkLfbHoACgkQUI6uxTAtpWhY +hQCaAvqVBsTX5s4c+sTOo06BNMdzHIUAoIwpThAKq936Szy/3Gfv8K3gs5NOiEYE +ExECAAYFAkLfbHwACgkQ3bpkuiwxLS9z8ACfYeocOK4J204xwbXgEdUJQyvHK2UA +oKz2AF1I2b8Ebu7vTUZLNFV1QMtwiEYEExECAAYFAkLgyTgACgkQXP03+sx4yJNb +EgCfRcj6QKHVHQtYVXdCYKUbrj97wAoAnimqV15cvz1siDjUK9K/aTskGwajiEYE +ExECAAYFAkLg7MsACgkQybWm7OLXdN8UoQCdFfqef8My1xhn6mLd9WTLLaIewTQA +nRXGh/Af4hVG0KwtZcJEA464nCoJiEYEExECAAYFAkLg7TwACgkQW5aAEOBPmol+ +JwCeLxZjKNisjgP4AxV5BCKR+5SU9NoAoIwPF/7B2NmGNR0t3EZze8wpNhQ0iEYE +ExECAAYFAkLg7V8ACgkQN/aP9QFa/IqerACfafKJi4s8LYV2JxNfQKHgmRXzeIIA +oNBHOzukDCdxIvmYJfamItnCP45giEYEExECAAYFAkLiYm8ACgkQbZiNF4cxXDH8 +HwCgq8P29CwMX7PKhRmY3T32APsOaMEAnjdd/WvzVBFtTcJFWkH6iF4L8EQpiEYE +ExECAAYFAkLjVb4ACgkQEy5J1OQe3H56DACcDPfWLO5cDkeKFCvIP8mc4p4KkfkA +oJITROldIRxXqUiML1oTJxieuHJfiEYEExECAAYFAkLjZNoACgkQdcqio/ObN1CI +tACgsJhqBxeZTaSrRVNk3aj6ciAJrgEAoIxPXYTvIpnWBr4/WMbN0jpV0TGEiEYE +EBECAAYFAkLkbxIACgkQjON2uBzUhh/gZQCbBpIqkCEuIbd6tqChz3PzcIGiZbgA +njluBFHl4l1/NHtP9fEYCgl8nbCviEYEEBECAAYFAkLkkr4ACgkQBJE0Quobo42f ++QCgjtO6EOdDRiruCi6gKvwM1a2eRwcAn0XUELm5AZezL5E0rEfIM2FBiMi5iEYE +EBECAAYFAkLlwh0ACgkQYRlqLjM+ToS9pwCfUEgO834XY/clWzkw/VLBfe7MLZQA +mwdz0nleOHYWFBrnYgEz53d4MxUPiEYEEBECAAYFAkLqY/QACgkQsr68QBUpJK/o +MQCfc7M9KpApCWW7eE22PlLoN1sPK+4AoJdwE8TsDM2Pmehk9K+uHIx6FoRviEYE +ExECAAYFAkLj7WcACgkQMoZOQZyFIitClACfWpH0+V/N6vuucWZ7bsMm2BcmM3oA +n3fF5qqovlog4/PcgvKCToNEF8uWiEYEExECAAYFAkLlELcACgkQUnkvr5l4r4YU +ZwCgg7vJpDpUXnuNvgc5RHgG7UYhRQYAoIEKHsrswh6XzVn5yQRkfjdB/A0OiEYE +ExECAAYFAkLlEaQACgkQa3OhBipiP3JA4QCffb8NgQssOQXaVR0dSwPCeU2nQPUA +n15EAjykVZsUi2tZWqEM08SNOKI9iEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWd7 +AQCbBpwyitQ77kd9KIT6y95Im1vmWt8AnAnkNTBctVtMfwddYTG+xLkaOllOiEYE +ExECAAYFAkLnYVAACgkQbpR1lMFSQxqIRACffQqUXTgOa4hyHYQBUwrlGEqmWt4A +nRMXVGhd47loS27MmiEiWwDlkNjJiEYEEBECAAYFAkOHn54ACgkQZjW2wN6IXdOr +9gCgh2fn26W0DSL5WZATvvQkwZeJNiMAnR6+0AlUK8uFSFIVhl+RZMnY+XFwtCBT +dGVmYW4gQm9kZXdpZyA8Ym9kZXdpZ0Bib3N0LmRlPohfBBMRAgAXBQI7EjmBBQsH +CgMEAxUDAgMWAgECF4AAEgkQohFa4V9ri3IHZUdQRwABAcm6AKDaA//SYJv2pcXw +GBC89OSzGvxy3gCg1kx6qu6zJKaWaE1L9oFqVc65OUSIRgQQEQIABgUCPD7VlQAK +CRCBBGRPUYmFBNCzAJ9tv7tNS6NwaOZQ8cR0pGslJGKtuQCgpttMmhhRrUwyVuEX +c+dKX7rdQMKImQQTAQIABgUCPnXfDwAKCRA+j7fy+INB2Vm6A+IDxiYtMvd/mad+ +7hRoKXvD5AddB1SwnvQdJe0ewStFBYZxZdNOLXdkVngCwAJziPGZcQmocEHVMrN+ +Mxe+3OX0PEZ+3KOOsAUi+fTov2xvf8EWKgX9d0li9iEytVA4M0c52a3bPTC0Kki/ +KAY3m8oNvAmTwWB9dBSooFFDMIhGBBMRAgAGBQI+ddrHAAoJEO7R6jkiYdBzruYA +nAzvTrvDQNvoAoaDQJ+o/ydqMA8ZAJwNEOQDHsz+6ynbMPoQmKmUqfEISIg/AwUQ +PnWqIf1viMYh0KcbEQIkpwCeInf4o3C5Ykh/xBodVImrp2Cvcy8AoMn3me5p4Sl2 +rm2tjVxTJZt2sUr7iEYEEBECAAYFAj53pBoACgkQFT+gzXWmdpIpGgCgiTARP6Cf ++JKOxUaVFr0L9DC5oUcAoIxF7D5mOVK/AFcp1cxNk3BLtdq3iEYEEBECAAYFAj7K +LjIACgkQ29JF/LOyoSwAbACglNp7V2Pw4U575IuooM677bZf8pwAn2U2TcHj7PYp +rU+qYRkyJ3pa7FyyiEYEExECAAYFAj6NzjUACgkQymk5dIEDo35YPwCeJIU/monN +96nP4jJjAuflEXMbemUAoJXq7oVCYuOCqWr/T3VW0DM3W+dniEYEEBECAAYFAkGS +8+sACgkQ5BNhMwyqaLQ2RwCeMcDf4bb+OMjRUJwAk2LHN9th42QAn03fVqMUZEVm +OrVXfWILpjXNLMDIiEYEEBECAAYFAkLFMoYACgkQm/IjRS/ii8/gpQCffXXRCeZf +1Vv5ih70yE2ZXg0r/rsAoJYKsdx0K5aqfoEzyiBCj5I46JvhiGoEMBECACoFAkLh +OBAjHSBUaGlzIHdhcyBhIGpvYiBhZGRyZXNzIGFuZCBJIHF1aXQACgkQohFa4V9r +i3LxGACgiQ+wlaa9iMOue5DuhtyLPMSmuiIAoIkrciYFOf3VBBD0HLWfGVWUqxzR +iEYEEBECAAYFAkLfRQwACgkQQeoJoFeTSY/ndgCfUEQl4Rc5nnu3G4ZX3o4OywbF +7DEAn3Htv1s/on+ei+1mmS6Z/PdwgM7viJwEEwECAAYFAkLerHEACgkQMaY9luwU +C4F1JAP/epJYDZX4flU0sa8AlFtSROY/O6g3iVq5zeYm1WD3e0xOOYTXlkIntkYF +hqbBzZQ3pFYfWmbhzCW/Tc0RigACdmroEELrwyrfLIHvsnUTF7C5AL6SuFQZqG6q +oMjtHFd6KDMos2sDEZ3VXDG1buW+hpHY9rWRJKPzb/SgSetTCeuInAQTAQIABgUC +Qt7H2QAKCRA34/Rf7mXjIaxmBACiYCwxZLtxnaRfwSOBkASqmnS8oBdyIKvTad9d +LE3CziNgEW+AdfE76vQskeDxL3ZVQubhKWiaM4B7YU2nYxk4INVpok1qht9bN1Ps +y+TS3SvpPKqq8Ri8xc4ZPDwdcCcCJiXLy5iR5tx3iBsnHRM5+LMIJg+LiOqd/ZnB +sggjjYicBBMBAgAGBQJC32x5AAoJEJrNPMCpn3XdrMQD/3vFtnKssqT6mB7NOZ08 +Tcw+cC5e9gAVr5Y33X+ZgPe7BJd6uPNt+I97FDdVJOnNtTZSvnkQZ/C79Yoci0yZ +AAoHYlzRb4tXguLy4UDBjj3BlvPsCOKJZrKn7bxvtoTbeHgjHmneiIwCuyzSoA1h +AYxiPliDrwuVCQTudHDVxjl1iEYEExECAAYFAkLeuu0ACgkQMsnkzjZCy0sSYACf +X2gis4g5jep0HjKABAk31byHU0QAoI5294fLHOeIHKLCIdvKm+7gVLn+iEYEExEC +AAYFAkLfbHsACgkQUI6uxTAtpWg6BwCfVQtdTRbNPgQGFqGQSUlBJ459xfYAoLKh +j68YUwZB5VgIeIorpqt9bWR2iEYEExECAAYFAkLfbH0ACgkQ3bpkuiwxLS94SQCg +hB4+5RwGR0ZOyy2xUA4e6ImO6ZQAoIjkWwYRd1Vp9SQoJW5OdSquYSctiEYEExEC +AAYFAkLgyTsACgkQXP03+sx4yJOsAACeKo39hTRNVVyvj5y9ohT9Ye3/C+MAn27a +EKrGgxNbwq50qGxFE+p36j7fiEYEExECAAYFAkLg7MwACgkQybWm7OLXdN8i0ACg +s+aW41FnchB0K/OUdB3t0Lg4i5IAoM+l0PyxS3XJsAwI+JbCm0aR3VA8iEYEExEC +AAYFAkLg7UAACgkQW5aAEOBPmokbqACcC3in6U+mqjSwb67rB5zTY0ThYucAoI4V +7qe0XHTDUwwWOgRo/NzR7k1OiEYEExECAAYFAkLiYm8ACgkQbZiNF4cxXDGcDgCg +i5CrpyZ1Dcu0IKML05Ffvw8lPhYAn0nL0BczEo9RpNVYg2ytJ+YtjKUFiEYEExEC +AAYFAkLjVcAACgkQEy5J1OQe3H7q9gCfV5xTyo5SD7G62VSUbjYfeqcuxXwAoKAu +chsMkavYWCt0jBhgLuTJkFqUiEYEExECAAYFAkLjZNsACgkQdcqio/ObN1AdZACg +pUgi5qnnDUpVXhTsJUoo4U485sYAoOXmMbhyaOMH9g9ndYFm5aHPMbf9iEYEEBEC +AAYFAkLkbxQACgkQjON2uBzUhh9ScwCgqFELgIdNWky221EuFgjKzgEG5WoAn3cB +ZbE+PMFhAZyUhQIl2hHEbVJIiEYEEBECAAYFAkLkkscACgkQBJE0Quobo43EoQCf +RCtbvMHoTGmS7dmZ3sRyAj4W7WoAoJDfouy1wZ5tSMJT+XBm5oFtwSUSiEYEEBEC +AAYFAkLlwiAACgkQYRlqLjM+ToRAHwCbBxMHNYyvbYmAb1kTEt8ydF660oYAn3zs +rmZawTXrjvbPE/VpC+/7wpzpiEYEEBECAAYFAkLqY/gACgkQsr68QBUpJK8VgwCf +aCR45JtzFnz0v4jCuooqaFGgH80An2BcoE/psLPTECGRDKE4v7JNADnCiEYEExEC +AAYFAkLj7WoACgkQMoZOQZyFIisbBgCeJjAXLGfz5ahDdgozqDYrbOzxWG8Ani7h +FwwxHFAIe42+OsL6xweRD46fiEYEExECAAYFAkLlELcACgkQUnkvr5l4r4ZbzQCe +MBjFzDvBIFmK5VNIvvcK3ejdDPwAoLzg1ytKCg3A0OebfMX9nr5iQOxwiEYEExEC +AAYFAkLlEaUACgkQa3OhBipiP3JevgCeJGjwezorOSri8IWxMJqTt3tOzkEAoMNZ +CTo3AmcKICFhtdttgcuOZNWAiEYEExECAAYFAkLmmWIACgkQaOuMdvjqKWfg8QCf +dYdGhkb7pBqgFhGn3uJ50+sY/QgAn1PdZCfRtVgdk/JVv35F7fJp5a1CiEYEExEC +AAYFAkLnYVcACgkQbpR1lMFSQxoJggCfQ7Du5ZKb7ooJj6CF+ne77nxVuYgAnjLF +1tZ19A1n+hPaT4A2nmfnW2tRiEYEEBECAAYFAkOHn54ACgkQZjW2wN6IXdPfvgCf +RhYzSFLrXLaM7hTa3iHktsQE1iUAn01MLep3eEdd3+VNPojrE8FlV+odtCpTdGVm +YW4gQm9kZXdpZyA8c3RlZmFuLmJvZGV3aWdAZnJlZW5ldC5kZT6IXAQTEQIAHAUC +PmiBXAIbAwQLBwMCAxUCAwMWAgECHgECF4AACgkQohFa4V9ri3JPKACfXhFOr4gM +MIQwEGvUb6J/X4asuzIAnje2H9T1r/jSVi1NbIEtQfbpmyQXiJkEEwECAAYFAj51 +3w8ACgkQPo+38viDQdmGkgPnUYJfHlDrQ2jYJWuPDve9n4pV9OvyIllKyLdfULjs +LWXw4Jm+fMQJgWr2GEov1ZYIyS2+rGDZpbz/vxaBVbgqM8TPdiXzxwU8AFq4k+Em +4fKXR58ByLSJjvLLza61spNHJennEUFp3tTpEsr4bNuuaoRYhtiKzTqNuoC+0x+I +RgQTEQIABgUCPnXaxwAKCRDu0eo5ImHQc5lcAJ9FOoAL4uHMuqHXrrxsEVPJvEJ2 +/ACggaOR62EziUqcqpdm/1Zy3P4T22iIPwMFED51qjj9b4jGIdCnGxECWssAoKnk +R63bWGCFDB5YJtfZJ+nQq3TAAKD1bzG/kITQpIHsT2vCY1yBmlWbBYhGBBARAgAG +BQI+d6QaAAoJEBU/oM11pnaS+9IAn0kFlXAzOhhu4r5fglMVuw5bTAd0AKCtYRX2 +ESU/+tsE8vuXWtsMCGeI5YhGBBARAgAGBQI+yi67AAoJENvSRfyzsqEsSccAoKqG +39X2y6xoQa56nviF5iCj/oTFAJwLKx9GyKEUbSM9f/IQ7AsZPhHT54hGBBMRAgAG +BQI+jc41AAoJEMppOXSBA6N+xYgAn1HbGamcXTDYSFjn3U5ik2vQa8nuAKC/uUM0 +1gsdn+71EiAkmrjlH6H9MIhGBBARAgAGBQJCuAqrAAoJEIEEZE9RiYUE0MUAn3cW +FVW03CDuMuA7TSUqTf/eWARWAKC/GjQnPZ0+g7NbDw68ZSY3k8WuuohGBBARAgAG +BQJBkvP5AAoJEOQTYTMMqmi0GIQAn1mpdHz/wV++rSU2Qn7R32slfNdpAKDJPqpn +mcN4MUmk90yZEeHAdJmrhIhGBBARAgAGBQJCxTKGAAoJEJvyI0Uv4ovP3YUAn1z8 +L1EnLdIYttWrT1zs0E89Lz4BAJ4sFzcSq2NO3OZsEQfh9F6CrUe3UohGBBARAgAG +BQJC30UMAAoJEEHqCaBXk0mPIUgAoOF/OCzco+n/3sGJ57m0+aqGLOwjAJ9bC86B +2hRvkaZlGm/ne3TzCgFGnohGBBARAgAGBQJC4DXTAAoJEHPOLvuECPdVsEoAn2hq +8w0JUtfJpu3SmMUkFZLBFm3+AJ48pxmjHXjoBJGpokXw4i9Cfb56BoibBBMBAgAG +BQJC3qxxAAoJEDGmPZbsFAuBGDUD93nHzcDWR6AuDxDvaDp1xR8oJZHojeZ9sWSR +QffiNJKF07vvdjGbygqiWbQmtTM9qBnAxEiBpSpJemBhvGTKivPkb9H88KQe2jqo +wDO3IJorIVMT+eUFB+4pn5c+kFLD/IhG7ohZ2rBIc47L62FFuD19esxvMcVelrBF +q67ZV4KInAQTAQIABgUCQt7H2QAKCRA34/Rf7mXjIY9vBADqrguzlNOJFkWvEkgd +VXCCH2TP3OUuPZ9JQtbJfbkg1nn1hCnMITapNJlEE3yyjB7kEpBkmUtyKv3VSwOD +spfis/ps6zJRIne/2R5xqtT38Hf/sYucoMZUceipFAoCLYOqkKJKwTpYM0401dUp +uxp1y8Lq5N0SDtTW9fKMNs9jioicBBMBAgAGBQJC32x5AAoJEJrNPMCpn3Xdek0E +ANLj3wh2FCukydsfSzqgjFDpkVjiBxbTtCep86flaLMrF3H0idckGCjMUf/JostB +sjwCpL2VlCtvhwl5ZgIzm8luceHupq2iC5hvUN0IjKuIXMLbZP7DE+Lfcvw82nKt +8JNPpjosXiMhysQZms2XfuNP6f/Ey8J5jaB2Z2JCYWJBiEYEExECAAYFAkLeuu0A +CgkQMsnkzjZCy0vBrgCglfCttIxFGqVTLTq/nhPnRFMHX9YAoM4Z05oTuPFxGWS4 +RzxCzCb3vpsAiEYEExECAAYFAkLfbHsACgkQUI6uxTAtpWgipACfTBzbyb7Vc0jr +2FZDiXJFUSBCoEYAnR+ySWmedkcJWESStqRstD8T72mOiEYEExECAAYFAkLfbH0A +CgkQ3bpkuiwxLS/5RACgm88lpYDxy0bYF9/ubFbvqCw6i9YAnjrQoOLRBtQ4QmIP +R+T/9HReOeSciEYEExECAAYFAkLgyTwACgkQXP03+sx4yJNXxQCffoccUBWO51YI +EM0mbsqpnKHtawoAn2xTiDgo3TjtbRJskADuw+QnATQLiEYEExECAAYFAkLg7MwA +CgkQybWm7OLXdN8bPwCfeKtfQWKm8i+KuFJTIoMTvAN65QQAn2A9G1wtEN4Vzg6H +fnTvtgus32rRiEYEExECAAYFAkLg7UAACgkQW5aAEOBPmonAkwCfeF3l1lE2WijQ +F0BmPMfqvkyA2UcAnRQzuc7PWyP0nydGoJvfEUHByVs7iEYEExECAAYFAkLiYm8A +CgkQbZiNF4cxXDEC6gCgqICh/djzt1i6uadJAOztZc/zxl0AnjR1OaM2JxR+wqK3 +loSTEKX1uOpBiEYEExECAAYFAkLjVcAACgkQEy5J1OQe3H7rRwCeJWLmLyPzpg3n +r65j7AxqGRJeDfUAnRT2Oa85dAM02wgdYlj3FejPuNFziEYEExECAAYFAkLjZNsA +CgkQdcqio/ObN1DA+gCeOaeMarEJDPbZjaN3y/Pf5PB/Cv0AoMGPjPSTGt/iHJ2a +Arfyd0ME/R52iEYEEBECAAYFAkLkbxQACgkQjON2uBzUhh+lnQCfVbPGF5UWlzFb +xK+xKmY2DbKXb5wAnjpoAxffSRO1PZlQUHgWlS+NaeCziEYEEBECAAYFAkLkkscA +CgkQBJE0Quobo40fbACgo9YCJXu5Hpoc/SVp3rHCYmTuEMYAoIt2q6rPL/Jbbkik +bRqausEnFstziEYEEBECAAYFAkLlwiAACgkQYRlqLjM+ToRP8wCeOVAIpaG+q9G7 +uJgVCyDZ0JbjjfIAoJgg+NrBfhNeOBuu5mS1PSGDztQ+iEYEEBECAAYFAkLqY/gA +CgkQsr68QBUpJK8HfwCfWgNlYNLBWmn/nejlx0m6NstT2CsAnRdhsusv6RbcKNoV +UudxGG4Xm3nGiEYEExECAAYFAkLj7WoACgkQMoZOQZyFIiv6jQCeMior8Tg4msrR +c+FfXfj5Uln03d4An3RTaHKU+Sv4SgEecXlW0RYlVa6eiEYEExECAAYFAkLlELcA +CgkQUnkvr5l4r4ZC9gCbB5X0rL/DtpGptiNO12DdTQqzsMMAoOWpJFg3W7zAr7al +Vjqlx0t1vS4KiEYEExECAAYFAkLlEaUACgkQa3OhBipiP3LYawCgiuQqhVay7FE8 +e05Za69seQwF4CYAnAxBVNyvXu/1aeAuSi3iC6tywvFoiEYEExECAAYFAkLmmWIA +CgkQaOuMdvjqKWfdbQCdHfDneYM+nWXT/oYOqohamLvk8iQAn1LLJhkLiCMOa9/b +iF24zKt+MjaHiEYEExECAAYFAkLnYVcACgkQbpR1lMFSQxog0ACgp/m7d/NdNP0w +605VyrJWCdogeG8An2E+FpFBQgyvJaD6klzDRNNYLc71iEYEEBECAAYFAkOHn54A +CgkQZjW2wN6IXdNgDgCfUVMGJZV/D1QEdnwrTkRmMb37KR4AnRLDWMsKtq4qKXQj +YbmuLNdHa1EQtCRTdGVmYW4gQm9kZXdpZyA8c3RlZmFuQHNhbWFmbG9zdC5kZT6I +XgQTEQIAHgUCQpxp5QIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRCiEVrhX2uL +csktAJ9XkWAsu0zJ293dGa+Yban+Zr1V9ACg3b9Petds6ebqQZoiHRopckbbOLqI +RgQQEQIABgUCQrgKqwAKCRCBBGRPUYmFBP0VAKCPH0b7S+TylV1uBuYcYnWIb/RJ +zwCeJvRTMPnWNjVz+CVOvVzJTH4ol5mIRgQQEQIABgUCQsUyhgAKCRCb8iNFL+KL +z3iqAKCXRZWdGjBVbj3IBFl3kvh3xF2gsgCcD3H79mbVDRNMxpGArFQ1hqQFzleI +RgQQEQIABgUCQt9FDAAKCRBB6gmgV5NJjzHQAJ9IfkjKkiEuFxUhznsghAQ8bsBW +nACgoT0kWSB3iUepLIDoWhhGtDIS5FSInAQTAQIABgUCQt6scQAKCRAxpj2W7BQL +gebOBACAFFpEKETO3ZHbjMnPogACNr6EZCQxzGTIXrXSyWQs68VcH54wUOA4yk3c +GpfH2pgAxYjaHejTJRvDKvGrPGlKHgCZFy4+wHzo17pW9J1aKk2sUWlT67snDVdM +un/i8WxD9yz299cXR6iCxPfP2HIMEqbsxWJaXITo7drWSjO35YicBBMBAgAGBQJC +3sfZAAoJEDfj9F/uZeMhRawEAM9wfn9sBIsFzQRQbAO+ll83f8ki++A4Anj6DXQ4 +xRmClUxqahL1BjxxeQhE+Qomq1IebDJr0Se34XB0g3J7bzr/i9QmEwEqnDJfWVob +v1Ugjy+1jzErlZBhm8hnCI+zPnrWKLk0n78vzJ5RrnVaTTV+OW5r4rdVZ86yKYHt +pVSoiJwEEwECAAYFAkLfbHkACgkQms08wKmfdd0HDQP8DDD+1FQU8PPPe+Kuf2bJ +OO7Ycrej4JF1I/Gbs2HH3xXgOZsRv6WJ41M/ovxJLYrpVqQA2YF/Gxwguwrf4lPk ++4spFdabguiJK0d2/KZAtnLsjIzdYcoY01IKGT3xkPwIDErNFSmxX6bKCUePcFNH +YZ6dDBHFFcYVTsdo/wbAe6aIRgQTEQIABgUCQt6wsgAKCRD9b4jGIdCnG30UAKDC +xsPZksKIcvj7tbHQEwm+PV5+DwCg7PorUCgIvTIWnID8zRWDBG4ACXaIRgQTEQIA +BgUCQt667QAKCRAyyeTONkLLS/d2AJwM7BQIQgqLA0qA75R2EjHFXQKZWACgo7ia +ANHxIRc/Nw19j8CxNbWJRJ6IRgQTEQIABgUCQt9sewAKCRBQjq7FMC2laIx3AJsF +0Hjrm4N21EwdrmhS9PHKQL2KdgCgjlus2GyuCzafgb9JHVhBDrhelkmIRgQTEQIA +BgUCQt9sfQAKCRDdumS6LDEtL7MWAKC6rQU6ZjSS6gVnwswutaqBwfwtvwCgv2mM +GJf2hnYVaNNqV5WIFAuycmOIRgQTEQIABgUCQuDJOwAKCRBc/Tf6zHjIk9TlAJ9d +bM2HowI5oD6hGSnADhI2dKfBrQCg4O9WtFiRzLqC1TgCAsbigqy+JDiIRgQTEQIA +BgUCQuDszAAKCRDJtabs4td0311pAJ9L3yUe7GUeDqMzd3WLWatclf7ruQCeOenA +9nhyKgHASeEK/ZXQXDDBW0uIRgQTEQIABgUCQuDtQAAKCRBbloAQ4E+aibNVAJ4w +nAfcA/rtUs3+Hu9nNn8ar/2Q5wCfe6W+k9yHjd7hZWnYHdnCkAZkOMeIRgQTEQIA +BgUCQuJibwAKCRBtmI0XhzFcMezQAKCnk+So0Anm4kLDwl+srHvIB7b6jACgqROB +N5MeEGXQm+Gan2VSt+nvTZ+IRgQTEQIABgUCQuNVwAAKCRATLknU5B7cflR0AKCT +AlfhPFwHPXnBo+5IROopwNQnsQCgh2vHS9VRZRt5I9isNDaNf1biCQmIRgQTEQIA +BgUCQuNk2wAKCRB1yqKj85s3UK9XAKCELi7ymxtLxdwYfdfV3dxd63mV2wCgjgaU +lQqFXjx5mXnRsgy4S6cS9yuIRgQQEQIABgUCQuRvFAAKCRCM43a4HNSGH5/sAJ9J +VHMVwBwHD8PN3DQq8hHEumn8twCfVQSXooNY2P744K+8k6lLO8nOH6GIRgQQEQIA +BgUCQuSSxwAKCRAEkTRC6hujjb+qAJ0Z+AoGDYe122wRAOYAKayl9f9e0QCeKeto +ll6NZ+Rm/NKbFJGP6fYywIuIRgQQEQIABgUCQuXCIAAKCRBhGWouMz5OhDd7AJ40 +l37cLZcSxfPt3M7/aOPgVGpa5wCfciaEynzuHDfIQD/vtXrZb2m0+NeIRgQQEQIA +BgUCQupj+AAKCRCyvrxAFSkkrwQsAJwM8IqtXQk/TBiQi6Fyq/HHm5/zvACg5atZ +V8F+r7jVRhT1SJ+FaVsaQDiIRgQTEQIABgUCQuPtagAKCRAyhk5BnIUiKwuyAJwO +ljL2++fVQ0BSKRvFSvS+fSu3KACeJxsOhbyCd3o3rqwaVeY5FFi+Fm+IRgQTEQIA +BgUCQuUQtwAKCRBSeS+vmXivhv0OAJ0Sg/UEnB/IAoqjHzKoBivCMYDtrQCfVY3I +DKRHbbLNfWBSDERWCTpHXtiIRgQTEQIABgUCQuURpQAKCRBrc6EGKmI/cqGBAKDE +gTewzt6TjmCkI9RrYjF46a9H4wCeJPh4bmTymcfwRGn60h0a9Mz1mKaIRgQTEQIA +BgUCQuaZYgAKCRBo64x2+OopZ3lEAJ9w4EWAgRUMxf0Ud1zoygYDQedAgQCeJPHS +bk62Ej11NljNGN1zdwzRHuSIRgQTEQIABgUCQudhVwAKCRBulHWUwVJDGkOfAKCg +QM+50dTktJDaDd8gVOGBKRiSIgCgkT9gdtDac0m9s2IHAqktk0mc0U+IRgQQEQIA +BgUCQ4efngAKCRBmNbbA3ohd05uvAKCjMnn4GpnZhjWFS7iN0LIXgxm5PwCfYodj +KF5zSbIROx79dJ41Gg0/VxW0KFN0ZWZhbiBCb2Rld2lnIDxzdGVmYW4uYm9kZXdp +Z0BlcG9zdC5kZT6IdwQwEQIANwUCQsVK6jAdIEkgbm8gbG9uZ2VyIGhhdmUgYWNj +ZXNzIHRvIHRoYXQgZW1haWwgYWRkcmVzcy4ACgkQohFa4V9ri3LW7wCdEc6hdCr0 +94a8LG+chTd+OzGxfFUAnR3FvtuG8sv367Knk0ybMnpOM/4hiEYEEBECAAYFAj53 +pBoACgkQFT+gzXWmdpL1ewCeOSe7lOufhc3mfTXs7eSvqECt89oAn0VM+YgQHbfd +Vp32YE7Ht6N6GPf0iJkEEwECAAYFAj513w8ACgkQPo+38viDQdkP7QPmPZXPi7m6 +wRiLofsTlHCbBrR+ehWoSSqCmHQjN1DGRtamGE6X8QbMIttD+NLp+uTx8j/E0sGU +dPnWkky6fwt1f3AYeoAgCXNvPoewsC6mZn3FMdEo6vJc43FmhsUfumOtunvGNBnX +dM8GSCJ+RBS/ASMjRrECF12/14xwgyyIVwQTEQIAFwUCPD7aNgULBwoDBAMVAwID +FgIBAheAAAoJEKIRWuFfa4tys/4AoND5QhEdyVIypBvCUHv5SCaAKcd/AKDFthtZ +TrjF+eEYlktPLRtI9zjeE4hGBBMRAgAGBQI+jc41AAoJEMppOXSBA6N+jAIAoIcA +eCIKt2QBPnAthnUk4DhlmM7FAKCA0Iz9ZutXGb2l+p8s7hhF3+Y9L4hGBBMRAgAG +BQI+ddrHAAoJEO7R6jkiYdBzi84AnRddvByuDodl5KaCSdpe6k9aYkLqAJoC/ud2 +8X0M478KlmacVVjb+PqzBIg/AwUQPnWqLv1viMYh0KcbEQJ6DwCff918LRigFUyE +vYj04C12so87JNUAn0RNFw+P1/SR9Mr/JQmOzJVhlwdriEYEEBECAAYFAkLFMoYA +CgkQm/IjRS/ii8+wZwCfRvfW6NyBoAp7oS9ILRHNYh2GbhsAnRYGs1hSaGK4rGxm +/fmqxj+DvqI2uQENBDsSIlQQBADNUpZLxCuTKzJ1tMm7b/XjAhvPYKiL3doAZ6XA +LBdLF/nQmlh1jcuRy93QWpPxtwSfPjcwJLHy+Uq5tC1SnH1YwYhviLG1KEsniUBr +oUmV2HJyHP92fFI3LPk3xbqxvLh1NXFpzSuWjGMA66sZqeEbtMy2B8OLRwQShdHI +BWgrIwADBQP+PWkmbg2mraaUmgTswre8CGArBgcV+WYm6yaq9IC1G4V1PXmlswms +DlsAr6UDdJU46GFZMIi2WmFJHarEkIBwFN44ypSLmiEVwKRJE2/CYO0f7zQHcF6G +USwQo2TxneahrZyHs7GdvpcRcfm0YnlC/H1CJ3pl8FpfHttzzIrIJviITgQYEQIA +BgUCOxIiVAASCRCiEVrhX2uLcgdlR1BHAAEBDTIAoJ3NtpI/E345LVOruElFKrnd +uWWXAJ9Adm9Mz4yoxrosHSkp5BWzXBUt4A== +=95C5 +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/C152431A 2005-07-18 [expires: 2010-07-17] +uid Steve Loughran +sig 3 C152431A 2005-07-18 Steve Loughran +sig 2 FC243F3C 2005-07-20 Henk P. Penning +sig 3 302DA568 2005-07-21 Rodent of Unusual Size (DSA) +sig 3 2C312D2F 2005-07-21 Rodent of Unusual Size +sig 3 E04F9A89 2005-07-22 Roy T. Fielding +sig 8103A37E 2005-07-20 Andre Malo +sig 5793498F 2005-07-21 Tim Ellison +sig E4136392 2005-07-21 Noel J. Bergman +sig 1CD4861F 2005-07-25 Eran Chinthaka +sig EA1BA38D 2005-07-25 Ajith Harshana Ranabahu (Made at Apachecon 2005) +sig 3 21D0A71B 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 3642CB4B 2005-07-20 Martin Kraemer +sig 3 2261D073 2005-07-20 Astrid Kessler (Kess) +sig 3 E2D774DF 2005-07-22 Sylvain Wallez +sig 3 015AFC8A 2005-07-22 Bertrand Delacretaz +sig 3 E41EDC7E 2005-07-24 Carsten Ziegeler +sig 3 F39B3750 2005-07-24 Colm MacCarthaigh +sig 3 9C85222B 2005-07-24 Henning Schmiedehausen +sig 3 9978AF86 2005-07-25 Christoph Probst +sig 3 2A623F72 2005-07-25 Christoph Probst +sig 3 F8EA2967 2005-07-26 Brian McCallister +sig 3 A99F75DD 2005-07-21 Rodent of Unusual Size +sig 3 EC140B81 2005-07-20 Dirk-Willem van Gulik (http://www.anywi.com/ - Senior partner) +sig 3 EE65E321 2005-07-20 Martin Kraemer +sig 152924AF 2005-07-29 Sander Temme +sig 3 87315C31 2005-07-23 Raphaël Luta +sub 2048g/59066D7B 2005-07-18 [expires: 2010-07-17] +sig C152431A 2005-07-18 Steve Loughran + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.2 (GNU/Linux) + +mQGiBELb2+oRBADhgEV29jhAMg4dFJN9fjeIjN7+J0Lj3rcLBWc5RTlM33DTOCFM +BCIE9B/RXJuVhGgi7fUuB+WsHz7XMgZRn+5nqIKGecIxwEUtZCfwsaV6Id3abt30 +wccyYDTSV95gQie+bbwWF44ao7n/CaR1WUU/Nx5b26nY2EzOrQcgP1qYEwCgynnc +NU1N3zd1cIYr5hQVqvdazKsEAMbYAm5WsjBlLBrolxs/smx4vxZYJaA3gUqTz9WY +D08rDsotVIMoosYF0b4b3WxcePJ68N1pkF3U+zo8bIZJThT91nAfMh29ZAcSyRqg +Mkd25OcrrjykeF7OavuFSwhvYoDdlwsvkuijHY3weXyhpjvzi+GzvZoONo3zSl4g +aWncA/4vu6k7XZUZ6B9DbJLJ4Xqq8uhD7uT4417uCQdozIWgKE4ThM2WffhV2IgY +W6IXg+o6AqY1qiMLSYYdeRsVkQ/GVss+sR++cbsO5ijDGfvlWPfGxIcA+P+alAwf +KY9M45IB8E92DUDru6ImrDHMeOrlDNPRusxRyZ4SiSJYNcgBtLQiU3RldmUgTG91 +Z2hyYW4gPHN0ZXZlbEBhcGFjaGUub3JnPohhBBMRAgAhBQJC29vqBQkJZgGABgsJ +CAcDAgMVAgMDFgIBAh4BAheAAAoJEG6UdZTBUkMaZugAnjJVyMa1FYEm/9811Whm +K06kGzXbAJ4rgRTBOcuyVbmbOAeYCgqloOxky4hGBBIRAgAGBQJC3rlGAAoJEIuW +KUP8JD88RewAn3LmpnmnLlYnlQW7+byITmKLO9gwAKCi0GGQz0QUq9tFG4YeF7Rp +UCl8ZIhGBBMRAgAGBQJC32y8AAoJEFCOrsUwLaVof1cAoLX3ROO9ufH+QXYlBuy6 +HA5SgofAAJ9aON/jC3WmrxT9Lz/DlIBKVI9TZohGBBMRAgAGBQJC32zBAAoJEN26 +ZLosMS0vCycAnjFhGc63FoWHwzpfVoocrBm8yQTHAJ47Kle1Tr+fBnlkYsAg0xY6 +12VZ9YhGBBMRAgAGBQJC4PEqAAoJEFuWgBDgT5qJY6IAnj2jxdReXh3eBRr+easP +bboH9Lu0AKCSoT0Gt+pM+G7XM8vQbZjsyjDhrohMBBARAgAMBQJC3t+3BYMJYv2z +AAoJEMppOXSBA6N+4VAAnRfGDGvU4qDop0EdApmHCExFDHFDAJ9/3xZDnJjEeSGr +l2JyOPJfbv/k0YhMBBARAgAMBQJC30/tBYMJYo19AAoJEEHqCaBXk0mPRKwAoI0M +FDyhr2PON57N4614Po16a9ZNAJ0SGKJtMOIxgoDHSf6SYuFy+8sBLYhMBBARAgAM +BQJC35MFBYMJYkplAAoJEAEFZrzkE2OSgcsAnjKv4POPmFUYhDGH+GCcxSyM9LPo +AJ0TPnoLf74lUroWD5+rlhTPD9eMHYhMBBARAgAMBQJC5HvtBYMJXWF9AAoJEIzj +drgc1IYfdCAAoIKybYLGd4yGE8NcrvnGaPSXx6NXAJ4zrIPA9tQu23tOHarZxSqg +7AWGh4hMBBARAgAMBQJC5JCBBYMJXUzpAAoJEASRNELqG6ONWZsAniJvvMiDR61N +rV5Y7xx/3/id/ekWAJ9MNUUQAXTES1dkywQVHVp6C8QFvohMBBMRAgAMBQJC3rR1 +BYMJYyj1AAoJEP1viMYh0Kcb26oAn2JuF355Lq6PIEvnhEr+SA3noxS8AJ9msBXz +nHsORsz8mB4WZ4DMAYEH0YhMBBMRAgAMBQJC3rvoBYMJYyGCAAoJEDLJ5M42QstL +Cu0An2vCOimm9iyRJekvlh7IcsrXVDksAJ9S1iVXBgyRuWBkbcuRk9OLs/TnwohM +BBMRAgAMBQJC3twlBYMJYwFFAAoJEO7R6jkiYdBz3gkAn3b48pHpjPG5DCbfp0oT +/WN9IqYlAJ47CLk2xg7e8N53WTmYfL+F/c/ZrohMBBMRAgAMBQJC4O0jBYMJYPBH +AAoJEMm1puzi13Tf+KgAnjviBj4kvC9ABiWR70t4BU3y8kgJAJ9qmj71qWjrek/L +Cb3+fAmlASx82IhMBBMRAgAMBQJC4O20BYMJYO+2AAoJEDf2j/UBWvyKJywAnjSC +smaB18utPgHthVW0qDQ+DDmNAJ9a64uKqcDI7u1cDEbi3nL5ELztCohMBBMRAgAM +BQJC41snBYMJXoJDAAoJEBMuSdTkHtx+SyUAn19MjVdnPdxKdiXjpMRWwOs5fhTL +AJ9AGh+TvyOt877cfLVaywPK+GhN0ohMBBMRAgAMBQJC42UQBYMJXnhaAAoJEHXK +oqPzmzdQe9gAoL7BugDd1NniX/ZNqs0aD7Y1uUfhAJ0b4p34ZYPWFg1CyUduwYlx +MAOqo4hMBBMRAgAMBQJC4+3gBYMJXe+KAAoJEDKGTkGchSIrHl8An0ERlWCCDHYy +0jlbsVcQ4FOS9qe6AJ4sLF02AltG01bK1kpvnKXxHFVYoIhMBBMRAgAMBQJC5RDw +BYMJXMx6AAoJEFJ5L6+ZeK+GWEkAoIl+GM1cgJosSMsMG0NqXog9yqeKAJ9aJ0Xr +j7JP5abRyjROroIUCUcc4ohMBBMRAgAMBQJC5RHdBYMJXMuNAAoJEGtzoQYqYj9y +IawAn3TzgRnJPfl4gg2kwIlJtD/a4ql5AJ43+Bbg3EWh2RVaLB7QpA1pAsRFB4hM +BBMRAgAMBQJC5pnVBYMJW0OVAAoJEGjrjHb46ilnWz8An1WpumoYARq3Le1VG0vu +SkQcdg8SAJ488MHNQRq2fyQFk9uIstWriQfa7YicBBMBAgAGBQJC32y2AAoJEJrN +PMCpn3Xdsl0D/j7J+/vobH/4+pmWCWv3okqBbbd9PH/NJTC3B7KU+p8bFdIIZWYh +n9SPXRdLoUlbKnqYw6+x0Ktn/9oWqwTM2b1bOHoMEUy/hPDM1ZK2gGDU11BFbfC4 +zkXowbq2xCHLyaQXqj5Wju01PT/wj8bw5A0E2rzv2iUA2ilXJE1vQdx+iKIEEwEC +AAwFAkLerQ0FgwljMF0ACgkQMaY9luwUC4H6jAP+L3lvntIdecj0QlnD4gTkdLn+ +nbOPT0G9MPSjA3ML9Bqeoh/uD2TeHS0dqb67DpIzhKV/zu6vrOhsXHXNiCjR4lxR +YHBg0PoxLJkggpjdAduk5vcM2ZgRJZQojsQ9CunxnmA/YCRCEEUPFeKj/5p1aFGm +uPsl2zwggHxbdOBY1maIogQTAQIADAUCQt7IywWDCWMUnwAKCRA34/Rf7mXjITNS +A/9YB8srHD2WbpZy5P/cN6WjPshYgx0lVFOifFdXgD4AUzgJ3VmtH1NI0Rkgadcw +8PdJYAynH/Hdz4PJ8wIEkmMFEe6TKB3BCjCGY8+Ti6R/VrlkizIGL0HzAUzNc+g2 +D1NI8725Idx+XNSOSBcOBZ3mwPVo1k67X1rF8BoYAeo8TohMBBARAgAMBQJC6mYn +BYMJV3dDAAoJELK+vEAVKSSv8BwAniQzr7l/ihVvAhvNUnpJzFWfr6tfAJ93Mama +D+Fz4kgEVjnO5j8MrM6JtIhMBBMRAgAMBQJC4mNBBYMJX3opAAoJEG2YjReHMVwx +Pr4AmQGWlApW3C1VbkuRgVs8pj6/ejXqAKC1z3D5mMpj83yyejnBjxDjXTLsUbkC +DQRC29vxEAgA05PNdXcVOSTsYuizTCbdBU9i3qUBkAyqPmDE6hkWI+7fnr8KAUUo +UghWwhxqBngpv48o3mE+bC+l/cTH+DuHIOsszpSK5ydufyitXi7piYk4RS+UNbyl +b4BU5qGodwWwXC9wKBIjXL5rK2KjKh4Ovh0WogtZ1fwc5NzQkjcfbner9WsAmjtd +nmVV2vZhJdDlxf3BBM9ai2R2IRvfhF61QFZcr2ehqAdsiDix8p0ugpC/oQS8h8pg +GQebz7aNeSjh/Vb3dsdo8CaLvHp1nM5aVCDRqoCfoeKUbRfwwwKxtc1cyYzOHD1f +KG9BuvtL4y4JQ/gDCsQVKdAAoiktu8Ks9wADBQf/fGkVYIh7w0+8xSIvez1DKirX +rl1J3XNvOYIa1qlBk65hllXnFXeXqoOLQpvygcwNRfil3AGcpwzwlNloem3ozjnt +IFvYJYzB6q4SMl1/a5uLrcc2frq8tbG0RhU+ZEhWR6sIEOBQhkKZ9LZbJ1tK9buJ +M0meaIt5gVLAVbI5vf+2Lvmlv0+E/a4Zn2exl1RcBYATNZT1gC55m0z5PMzG6Bc4 +tOAhPEo3WpfNjIrFeXcB0ksk4mfDIWKlA0mc8A+faKSSMdiDpeU4H4uZy5pE/hVv +2VyE3Ej5PoA3DajRzgQ69YlojTYnfnPyJErCBZhtZXTtRY7aDm9/xBT7FZ06RIhM +BBgRAgAMBQJC29vxBQkJZgGAAAoJEG6UdZTBUkMakjEAoINKV6yLAdbBhXhvMsqK +0N6XOghJAJ4mSgdwgv+sIOaPKQqCm+PL2M0lPw== +=4TlI +-----END PGP PUBLIC KEY BLOCK----- + +pub 1024D/AA0077B0 2006-06-13 +uid Kev Jackson (apache key) +sig 3 AA0077B0 2006-06-13 Kev Jackson (apache key) +sub 2048g/8A6DD738 2006-06-13 +sig AA0077B0 2006-06-13 Kev Jackson (apache key) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1.4.1 (Darwin) + +mQGiBESOfuoRBADiCLjvY8EG8cDrfNvPaVJr1/8d8GDoLjBCeJWl50M7j1IQDB+r +rzBPXOzhoqiNRbZMkpjv8ofa5hVOQitVS4B69FA07RbuiQNTKg142h8ogtJeAI1g +eXuTZtmGE47TOpj7FMG8bHOmoJdQMkzUsdOhEAyqRu4noknuuIKgsE1kYwCgnhaH +9KBlpKaRG7Bb2BH6da+wmKUEAIaBeZ1aSQodUzDqnGjCd4hZbpzjyWg7O5BylNhK +ogMY95BvwFRD8WFdSvhvH9VKBtSuNqg/6gIkqAljRRESVxL4QrzlYSqF513kK1ds +lUTmqU9Dvaf7dkH+MYnkPVTP5tMZVCT7HEt4F6HcqlaZKlz5jsu3R53KBx6XZATc +SEGbA/wOournJ64We8sXTJGHFupvSLBy3nh68mPLaplzTnH2al1DLBnoF2giC32v +ZGG+e12kWE+fyyQ3pdAIRHgVjZ/ckPmcmxnVcYrhzbgV99fo2+JRh2SVrLrmvw+G +CKiUtNHn0HS1klBKSj+3ML1AQQlbyfrcVSf0Fefug51BqoqU+rQqS2V2IEphY2tz +b24gKGFwYWNoZSBrZXkpIDxrZXZqQGFwYWNoZS5vcmc+iF4EExECAB4FAkSOfuoC +GwMGCwkIBwMCAxUCAwMWAgECHgECF4AACgkQoL/5PaoAd7BnTACff9f8Y2RFB7O7 +Wjncyb1XbEwJB/gAninrR0isW9jGx49GmSnQCjtO9k34uQINBESOfzMQCACP+GP2 +x2nE2JxjUUjj16ftOxUivbL8L9ksplx41n7yeRvu+RzOXcjlonuld0LYxprNsHGv +mbAoZj93QozHQIMfC2kfnia+hxCcBPMbev9RPCqgogpb90BtV0f9HGyWXs2QTgWG +R2hyjq/RpwtA3obSXw3pb1CnXW4stV65WAdd72KDc66wRR1gmjxKQx6b1dGcC+E4 +HyOgu2CDtr1ULPeI5U4BA4y8FLgDfYwkxp6vj5ViegGP7GlMa3bSgNRGsYX7VwgZ +pmI8WY4B5k3/Pyv2Toe6/5zTmKH8WlyZd00ede/tbFTqQLg+EylAcWJ8c3asood+ +SjCwTuD8l8a0wpO3AAMHB/9GXkbBUE8cbMTaS4yj7UL5iWRVhSPo9IzMSrzaXmZN +8ykX96ud35BCEfmYgty3USMk90Rs/PbwB4Mh3h1ZTXqRWcfOXzJ8kMabm2RANyf2 +H2DvGKoFPtpX/9I13vo9qRLRHVRENNg+3JCa1ii8cq7h8bWvTT0VxX/rOG0cl8nO +XkHTUARR19cGPf6XkHEcl+u1pAxIJGqY/gVowjyFGZs+RXFl/q/Vrgu+lvvxmryd +yEdeGdsBvQ9M0KKr98w1RiJnDUkSqI711xwlVk14Uu6Xke0oB3bbpe4UxD52avAC +yEzYY7vbpe6XS2+dOcZxWE3eur6SfsucAkj4Ib72mchhiEkEGBECAAkFAkSOfzMC +GwwACgkQoL/5PaoAd7BQAwCeJFb9yZvOWfdf73A7t2MvPXn1y6kAnRquMmA5eVdh +HbAUXWyYuT2OHOSD +=F2q3 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/LoginServer/ant/LICENSE b/LoginServer/ant/LICENSE new file mode 100644 index 0000000..f820d4b --- /dev/null +++ b/LoginServer/ant/LICENSE @@ -0,0 +1,203 @@ +/* + * Apache License + * Version 2.0, January 2004 + * http://www.apache.org/licenses/ + * + * TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + * + * 1. Definitions. + * + * "License" shall mean the terms and conditions for use, reproduction, + * and distribution as defined by Sections 1 through 9 of this document. + * + * "Licensor" shall mean the copyright owner or entity authorized by + * the copyright owner that is granting the License. + * + * "Legal Entity" shall mean the union of the acting entity and all + * other entities that control, are controlled by, or are under common + * control with that entity. For the purposes of this definition, + * "control" means (i) the power, direct or indirect, to cause the + * direction or management of such entity, whether by contract or + * otherwise, or (ii) ownership of fifty percent (50%) or more of the + * outstanding shares, or (iii) beneficial ownership of such entity. + * + * "You" (or "Your") shall mean an individual or Legal Entity + * exercising permissions granted by this License. + * + * "Source" form shall mean the preferred form for making modifications, + * including but not limited to software source code, documentation + * source, and configuration files. + * + * "Object" form shall mean any form resulting from mechanical + * transformation or translation of a Source form, including but + * not limited to compiled object code, generated documentation, + * and conversions to other media types. + * + * "Work" shall mean the work of authorship, whether in Source or + * Object form, made available under the License, as indicated by a + * copyright notice that is included in or attached to the work + * (an example is provided in the Appendix below). + * + * "Derivative Works" shall mean any work, whether in Source or Object + * form, that is based on (or derived from) the Work and for which the + * editorial revisions, annotations, elaborations, or other modifications + * represent, as a whole, an original work of authorship. For the purposes + * of this License, Derivative Works shall not include works that remain + * separable from, or merely link (or bind by name) to the interfaces of, + * the Work and Derivative Works thereof. + * + * "Contribution" shall mean any work of authorship, including + * the original version of the Work and any modifications or additions + * to that Work or Derivative Works thereof, that is intentionally + * submitted to Licensor for inclusion in the Work by the copyright owner + * or by an individual or Legal Entity authorized to submit on behalf of + * the copyright owner. For the purposes of this definition, "submitted" + * means any form of electronic, verbal, or written communication sent + * to the Licensor or its representatives, including but not limited to + * communication on electronic mailing lists, source code control systems, + * and issue tracking systems that are managed by, or on behalf of, the + * Licensor for the purpose of discussing and improving the Work, but + * excluding communication that is conspicuously marked or otherwise + * designated in writing by the copyright owner as "Not a Contribution." + * + * "Contributor" shall mean Licensor and any individual or Legal Entity + * on behalf of whom a Contribution has been received by Licensor and + * subsequently incorporated within the Work. + * + * 2. Grant of Copyright License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * copyright license to reproduce, prepare Derivative Works of, + * publicly display, publicly perform, sublicense, and distribute the + * Work and such Derivative Works in Source or Object form. + * + * 3. Grant of Patent License. Subject to the terms and conditions of + * this License, each Contributor hereby grants to You a perpetual, + * worldwide, non-exclusive, no-charge, royalty-free, irrevocable + * (except as stated in this section) patent license to make, have made, + * use, offer to sell, sell, import, and otherwise transfer the Work, + * where such license applies only to those patent claims licensable + * by such Contributor that are necessarily infringed by their + * Contribution(s) alone or by combination of their Contribution(s) + * with the Work to which such Contribution(s) was submitted. If You + * institute patent litigation against any entity (including a + * cross-claim or counterclaim in a lawsuit) alleging that the Work + * or a Contribution incorporated within the Work constitutes direct + * or contributory patent infringement, then any patent licenses + * granted to You under this License for that Work shall terminate + * as of the date such litigation is filed. + * + * 4. Redistribution. You may reproduce and distribute copies of the + * Work or Derivative Works thereof in any medium, with or without + * modifications, and in Source or Object form, provided that You + * meet the following conditions: + * + * (a) You must give any other recipients of the Work or + * Derivative Works a copy of this License; and + * + * (b) You must cause any modified files to carry prominent notices + * stating that You changed the files; and + * + * (c) You must retain, in the Source form of any Derivative Works + * that You distribute, all copyright, patent, trademark, and + * attribution notices from the Source form of the Work, + * excluding those notices that do not pertain to any part of + * the Derivative Works; and + * + * (d) If the Work includes a "NOTICE" text file as part of its + * distribution, then any Derivative Works that You distribute must + * include a readable copy of the attribution notices contained + * within such NOTICE file, excluding those notices that do not + * pertain to any part of the Derivative Works, in at least one + * of the following places: within a NOTICE text file distributed + * as part of the Derivative Works; within the Source form or + * documentation, if provided along with the Derivative Works; or, + * within a display generated by the Derivative Works, if and + * wherever such third-party notices normally appear. The contents + * of the NOTICE file are for informational purposes only and + * do not modify the License. You may add Your own attribution + * notices within Derivative Works that You distribute, alongside + * or as an addendum to the NOTICE text from the Work, provided + * that such additional attribution notices cannot be construed + * as modifying the License. + * + * You may add Your own copyright statement to Your modifications and + * may provide additional or different license terms and conditions + * for use, reproduction, or distribution of Your modifications, or + * for any such Derivative Works as a whole, provided Your use, + * reproduction, and distribution of the Work otherwise complies with + * the conditions stated in this License. + * + * 5. Submission of Contributions. Unless You explicitly state otherwise, + * any Contribution intentionally submitted for inclusion in the Work + * by You to the Licensor shall be under the terms and conditions of + * this License, without any additional terms or conditions. + * Notwithstanding the above, nothing herein shall supersede or modify + * the terms of any separate license agreement you may have executed + * with Licensor regarding such Contributions. + * + * 6. Trademarks. This License does not grant permission to use the trade + * names, trademarks, service marks, or product names of the Licensor, + * except as required for reasonable and customary use in describing the + * origin of the Work and reproducing the content of the NOTICE file. + * + * 7. Disclaimer of Warranty. Unless required by applicable law or + * agreed to in writing, Licensor provides the Work (and each + * Contributor provides its Contributions) on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied, including, without limitation, any warranties or conditions + * of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + * PARTICULAR PURPOSE. You are solely responsible for determining the + * appropriateness of using or redistributing the Work and assume any + * risks associated with Your exercise of permissions under this License. + * + * 8. Limitation of Liability. In no event and under no legal theory, + * whether in tort (including negligence), contract, or otherwise, + * unless required by applicable law (such as deliberate and grossly + * negligent acts) or agreed to in writing, shall any Contributor be + * liable to You for damages, including any direct, indirect, special, + * incidental, or consequential damages of any character arising as a + * result of this License or out of the use or inability to use the + * Work (including but not limited to damages for loss of goodwill, + * work stoppage, computer failure or malfunction, or any and all + * other commercial damages or losses), even if such Contributor + * has been advised of the possibility of such damages. + * + * 9. Accepting Warranty or Additional Liability. While redistributing + * the Work or Derivative Works thereof, You may choose to offer, + * and charge a fee for, acceptance of support, warranty, indemnity, + * or other liability obligations and/or rights consistent with this + * License. However, in accepting such obligations, You may act only + * on Your own behalf and on Your sole responsibility, not on behalf + * of any other Contributor, and only if You agree to indemnify, + * defend, and hold each Contributor harmless for any liability + * incurred by, or claims asserted against, such Contributor by reason + * of your accepting any such warranty or additional liability. + * + * END OF TERMS AND CONDITIONS + * + * APPENDIX: How to apply the Apache License to your work. + * + * To apply the Apache License to your work, attach the following + * boilerplate notice, with the fields enclosed by brackets "[]" + * replaced with your own identifying information. (Don't include + * the brackets!) The text should be enclosed in the appropriate + * comment syntax for the file format. We also recommend that a + * file or class name and description of purpose be included on the + * same "printed page" as the copyright notice for easier + * identification within third-party archives. + * + * Copyright [yyyy] [name of copyright owner] + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/LoginServer/ant/LICENSE.dom b/LoginServer/ant/LICENSE.dom new file mode 100644 index 0000000..05013f1 --- /dev/null +++ b/LoginServer/ant/LICENSE.dom @@ -0,0 +1,71 @@ +This license came from: +http://www.w3.org/Consortium/Legal/copyright-software-19980720 + + +W3C® SOFTWARE NOTICE AND LICENSE +Copyright © 1994-2001 World +Wide Web Consortium, World +Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/ + +This W3C work (including software, documents, or other related +items) is being provided by the copyright holders under the +following license. By obtaining, using and/or copying this work, +you (the licensee) agree that you have read, understood, and will +comply with the following terms and conditions: +Permission to use, copy, modify, and distribute this software +and its documentation, with or without modification,  for any +purpose and without fee or royalty is hereby granted, provided that +you include the following on ALL copies of the software and +documentation or portions thereof, including modifications, that +you make: + +The full text of this NOTICE in a location viewable to users of +the redistributed or derivative work. + +Any pre-existing intellectual property disclaimers, notices, or +terms and conditions. If none exist, a short notice of the +following form (hypertext is preferred, text is permitted) should +be used within the body of any redistributed or derivative code: +"Copyright © [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of +Technology, Institut National de +Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. +http://www.w3.org/Consortium/Legal/" + +Notice of any changes or modifications to the W3C files, +including the date changes were made. (We recommend you provide +URIs to the location from which the code is derived.) + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND +COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF +MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE +USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD +PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, +SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE +SOFTWARE OR DOCUMENTATION. + +The name and trademarks of copyright holders may NOT be used in +advertising or publicity pertaining to the software without +specific, written prior permission. Title to copyright in this +software and any associated documentation will at all times remain +with copyright holders. +____________________________________ +This formulation of W3C's notice and license became active on +August 14 1998 so as to improve compatibility with GPL. This +version ensures that W3C software licensing terms are no more +restrictive than GPL and consequently W3C software may be +distributed in GPL packages. See the older formulation for the +policy prior to this date. Please see our Copyright FAQ for common +questions about using materials from +our site, including specific terms and conditions for packages like +libwww, Amaya, and Jigsaw. +Other questions about this notice can be +directed to site-policy@w3.org. + +webmaster diff --git a/LoginServer/ant/LICENSE.sax b/LoginServer/ant/LICENSE.sax new file mode 100644 index 0000000..006c924 --- /dev/null +++ b/LoginServer/ant/LICENSE.sax @@ -0,0 +1,20 @@ +This license came from: http://www.megginson.com/SAX/copying.html + However please note future versions of SAX may be covered + under http://saxproject.org/?selected=pd + + +This page is now out of date -- see the new SAX site at +http://www.saxproject.org/ for more up-to-date +releases and other information. Please change your bookmarks. + + +SAX2 is Free! + +I hereby abandon any property rights to SAX 2.0 (the Simple API for +XML), and release all of the SAX 2.0 source code, compiled code, and +documentation contained in this distribution into the Public Domain. +SAX comes with NO WARRANTY or guarantee of fitness for any +purpose. + +David Megginson, david@megginson.com +2000-05-05 \ No newline at end of file diff --git a/LoginServer/ant/LICENSE.xerces b/LoginServer/ant/LICENSE.xerces new file mode 100644 index 0000000..70cb54a --- /dev/null +++ b/LoginServer/ant/LICENSE.xerces @@ -0,0 +1,56 @@ +/* + * The Apache Software License, Version 1.1 + * + * + * Copyright (c) 1999-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, + * if any, must include the following acknowledgment: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowledgment may appear in the software itself, + * if and wherever such third-party acknowledgments normally appear. + * + * 4. The names "Xerces" and "Apache Software Foundation" must + * not be used to endorse or promote products derived from this + * software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache", + * nor may "Apache" appear in their name, without prior written + * permission of the Apache Software Foundation. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation and was + * originally based on software copyright (c) 1999, International + * Business Machines, Inc., http://www.ibm.com. For more + * information on the Apache Software Foundation, please see + * . + */ diff --git a/LoginServer/ant/NOTICE b/LoginServer/ant/NOTICE new file mode 100644 index 0000000..5ef72b9 --- /dev/null +++ b/LoginServer/ant/NOTICE @@ -0,0 +1,20 @@ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Apache Ant distribution. == + ========================================================================= + + Apache Ant + Copyright 1999-2006 The Apache Software Foundation + + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + This product includes also software developed by : + - the W3C consortium (http://www.w3c.org) , + - the SAX project (http://www.saxproject.org) + + The task is based on code Copyright (c) 2002, Landmark + Graphics Corp that has been kindly donated to the Apache Software + Foundation. + diff --git a/LoginServer/ant/README b/LoginServer/ant/README new file mode 100644 index 0000000..263c111 --- /dev/null +++ b/LoginServer/ant/README @@ -0,0 +1,70 @@ + + A N T + + + What is it? + ----------- + + Ant is a Java based build tool. In theory it is kind of like "make" + without makes wrinkles and with the full portability of pure java code. + + + Why? + ---- + + Why another build tool when there is already make, gnumake, nmake, jam, + and others? Because all of those tools have limitations that its original + author couldn't live with when developing software across multiple platforms. + + Make-like tools are inherently shell based. They evaluate a set of + dependencies and then execute commands not unlike what you would issue on a + shell. This means that you can easily extend these tools by using or writing + any program for the OS that you are working on. However, this also means that + you limit yourself to the OS, or at least the OS type such as Unix, that you + are working on. + + Makefiles are inherently evil as well. Anybody who has worked on them for any + time has run into the dreaded tab problem. "Is my command not executing + because I have a space in front of my tab!!!" said the original author of Ant + way too many times. Tools like Jam took care of this to a great degree, but + still use yet another format to use and remember. + + Ant is different. Instead a model where it is extended with shell based + commands, it is extended using Java classes. Instead of writing shell + commands, the configuration files are XML based calling out a target tree + where various tasks get executed. Each task is run by an object which + implements a particular Task interface. + + Granted, this removes some of the expressive power that is inherent by being + able to construct a shell command such as `find . -name foo -exec rm {}` but + it gives you the ability to be cross platform. To work anywhere and + everywhere. And hey, if you really need to execute a shell command, Ant has + an exec rule that allows different commands to be executed based on the OS + that it is executing on. + + The Latest Version + ------------------ + + Details of the latest version can be found on the Apache Ant + Project web site . + + + Documentation + ------------- + + Documentation is available in HTML format, in the docs/ directory. + For information about building and installing Ant, see + docs/manual/index.html + + + Licensing + --------- + + This software is licensed under the terms you may find in the file + named "LICENSE" in this directory. + + + Thanks for using Ant. + + The Apache Ant Project + diff --git a/LoginServer/ant/WHATSNEW b/LoginServer/ant/WHATSNEW new file mode 100644 index 0000000..3f37d82 --- /dev/null +++ b/LoginServer/ant/WHATSNEW @@ -0,0 +1,3723 @@ +Changes from Ant 1.7.0 TO current SVN version +============================================= + +Changes that could break older environments: +------------------------------------------- + +Fixed bugs: +----------- + +Other changes: +-------------- + +Changes from Ant 1.6.5 to Ant 1.7.0 +=================================== + +Changes that could break older environments: +------------------------------------------- + +* Initial support for JDK 6 (JSR 223) scripting. + <*script*> tasks will now use javax.scripting if BSF is + not available, or if explicitly requested by using + a "manager" attribute. + +* The -noproxy option which was in the previous 1.7 alpha and beta + releases has been removed. It is the default behavior and not needed. + +* Removed launcher classes from nodeps jar. + +* filter reader uses ISO-8859-1 encoding to read + the java class file. Bugzilla report 33604. + +* Defer reference process. Bugzilla 36955, 34458, 37688. + This may break build files in which a reference was set in a target which was + never executed. Historically, Ant would set the reference early on, during parse + time, so the datatype would be defined. Now it requires the reference to have + been in a bit of the build file which was actually executed. If you get + an error about an undefined reference, locate the reference and move it somewhere + where it is used, or fix the depends attribute of the target in question to + depend on the target which defines the reference/datatype. + +* + + + + +

    Class

    + + + + + +
    + +

    Tests

    + + + + + + + + + +
    + + + + + + + + + + + + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
    +

    + + <none> +

    +
    + +

    Classes

    + + + + + + + +
    + +
    + + +
    + + + + + + + All Unit Test Classes + + + + + +

    Classes

    + + + + +
    + + +
    + + + + + + + + + / + .html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

    Home

    +

    Packages

    + + + + +
    + + +
    + + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

    Summary

    + + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + +
    TestsFailuresErrorsSuccess rateTime
    + + + + + + + +
    + + + + +
    + Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
    + +

    Packages

    + + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + +
    + + <none> + + + + +
    + + +
    + + + + + + + + + + + + open('package-frame.html','classListFrame') + +

    Package

    + + + + + +

    Classes

    +

    + + + + + +
    +

    +
    + + +
    + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

    Unit Test Results

    + + + + + +
    Designed for use with JUnit and Ant.
    +
    +
    + + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

    + + + + + + + +
    + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + diff --git a/LoginServer/ant/etc/junit-frames.xsl b/LoginServer/ant/etc/junit-frames.xsl new file mode 100644 index 0000000..94e4272 --- /dev/null +++ b/LoginServer/ant/etc/junit-frames.xsl @@ -0,0 +1,875 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unit Test Results. + + + + + + + + + <h2>Frame Alert</h2> + <p> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </p> + + + + + + + +body { + font:normal 68% verdana,arial,helvetica; + color:#000000; +} +table tr td, table tr th { + font-size: 68%; +} +table.details tr th{ + font-weight: bold; + text-align:left; + background:#a6caf0; +} +table.details tr td{ + background:#eeeee0; +} + +p { + line-height:1.5em; + margin-top:0.5em; margin-bottom:1.0em; +} +h1 { + margin: 0px 0px 5px; font: 165% verdana,arial,helvetica +} +h2 { + margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica +} +h3 { + margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica +} +h4 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h5 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +h6 { + margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica +} +.Error { + font-weight:bold; color:red; +} +.Failure { + font-weight:bold; color:purple; +} +.Properties { + text-align:right; +} + + + + + + + + + + All Failures + + + All Errors + + + All Tests + + + + + Unit Test Results: <xsl:value-of select="$title"/> + + + + + + open('allclasses-frame.html','classListFrame') + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    + + + + + + + . + + + Unit Test Results: <xsl:value-of select="$class.name"/> + + + + + + + + +

    Class

    + + + + + +
    + + + +

    Failures

    +
    + +

    Errors

    +
    + +

    Tests

    +
    +
    + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + +
    + + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + + + + + + + Unit Test Classes: <xsl:value-of select="$name"/> + + + + + + + + + +
    +

    + + <none> +

    +
    + +

    Classes

    + + + + + + + +
    + +
    + + +
    + + + + + + + All Unit Test Classes + + + + + +

    Classes

    + + + + +
    + + +
    + + + + + + + + + / + _.html + + + + + + + + + + + + + All Unit Test Packages + + + + + +

    Home

    +

    Packages

    + + + + +
    + + +
    + + + + + + + <none> + + + + + + + + + + Unit Test Results: Summary + + + + + + open('allclasses-frame.html','classListFrame') + +

    Summary

    + + + + + + + + + + + + + + + + + Error + Failure + Pass + + + + + + + + +
    TestsFailuresErrorsSuccess rateTime
    + + + + + + + +
    + + + + +
    + Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
    + +

    Packages

    + + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + +
    + + <none> + + + + +
    + + +
    + + + + + + + + + + + + open('package-frame.html','classListFrame') + +

    Package

    + + + + + +

    Classes

    +

    + + + + + +
    +

    +
    + + +
    + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + +

    Unit Test Results

    + + + + + +
    Designed for use with JUnit and Ant.
    +
    +
    + + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + + + Class + + Name + Status + Type + Time(s) + + + + + + + + + + Error + Failure + Pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + Failure + TableRowColor + + + + + + + + + + + + + + + + + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + +

    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/LoginServer/ant/etc/junit-noframes.xsl b/LoginServer/ant/etc/junit-noframes.xsl new file mode 100644 index 0000000..5e67587 --- /dev/null +++ b/LoginServer/ant/etc/junit-noframes.xsl @@ -0,0 +1,464 @@ + + + + + + + + + + Unit Test Results + + + + + + + + + + +
    + + + +
    + + + +
    + + + + + + +
    + + + + + + + + +

    Packages

    + Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers. + + + + + + + + + + + + + + + + + Failure + Error + + + + + + + + + + + +
    + + + +
    +
    + + + + + + + + + + + + +

    Package

    + + + + + + +
    + Back to top +

    +

    + + + + + + + + +

    TestCase

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

    + + Back to top + + + + +

    Summary

    + + + + + + + + + + + + + + + + + Failure + Error + + + + + + + + + +
    TestsFailuresErrorsSuccess rateTime
    + + + + + + + +
    + + + + +
    + Note: failures are anticipated and checked for with assertions while errors are unanticipated. +
    +
    + + + + cur = TestCases['.'] = new Array(); + + + cur[''] = ''; + + + + + +

    Unit Test Results

    + + + + + +
    Designed for use with JUnit and Ant.
    +
    +
    + + + + Name + Tests + Errors + Failures + Time(s) + + + + + + + Name + Tests + Errors + Failures + Time(s) + Time Stamp + Host + + + + + + + Name + Status + Type + Time(s) + + + + + + + + + + + Failure + Error + + + + + + + + + + + + + + + + + + + + + + + Error + + + + + + Failure + + + + Error + + + + Success + + + + + + + + + + + + + + + + + + + + + + + + N/A + + + + + + +

    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/LoginServer/ant/etc/log.xsl b/LoginServer/ant/etc/log.xsl new file mode 100644 index 0000000..63e5729 --- /dev/null +++ b/LoginServer/ant/etc/log.xsl @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + +
    + + http://jakarta.apache.org + + + Apache Ant +
    + + + +

    + + + + + +
    + + + + + + failed + complete + + + + + + + + + + + + + +
    Build FailedBuild CompleteTotal Time:
    + +
    + See the stacktrace. +
    +
    + + + + + +
    ant.file
    ant.version
    java.version
    os.name
    + +

    Build events

    + + + + + + + +
    targettaskmessage
    +

    + + + +

    Error details

    + + +
    +
    +
    + +

    +
    + + + + + + + a + b + + + [ ] + + + + + + +
    diff --git a/LoginServer/ant/etc/maudit-frames.xsl b/LoginServer/ant/etc/maudit-frames.xsl new file mode 100644 index 0000000..7ec32f2 --- /dev/null +++ b/LoginServer/ant/etc/maudit-frames.xsl @@ -0,0 +1,502 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + Audit Results. + + + + + + + + + <H2>Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </P> + + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + + + + + + + + + + + + + + +

    Class .

    + + + + +
    + +

    Violations

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

    +
    + +

    Classes

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

    Classes

    + + + + +
    + + +
    + + + + + + + + + + / + .html + + + + + + + + + + + + + + + + + +

    Home

    +

    Packages

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

    Summary

    + + + + + + + + + + + +
    Audited classesReported classesViolations
    + + + + +
    + Note: Rules checked have originated from style guidelines suggested by the language designers, + experience from the Java development community and insite experience. Violations are generally + reported with a reference to the Java Language Specifications (JLS x.x.x) + and Metamata Audit rules (x.x). + Please consult these documents for additional information about violations. +

    + Rules checked also enforce adherence to Sun Java coding guidelines in use at Jakarta. +

    + One should note that these violations do not necessary underline errors but should be used + as an indication for possible errors. As always, use your best judgment and review + them carefully, it might save you hours of debugging. +

    + +

    Packages

    + + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + open('package-frame.html','classListFrame') + +

    Package

    + + + + +

    Classes

    + + + + + +
    +
    + + + +
    + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + + + + + + + + + +
    + + http://jakarta.apache.org + +

    Source Code Audit

    Designed for use with Webgain QA/Metamata Audit and Ant.
    +
    +
    + + + + + + + + + + Name + Violations + + + + + + + Line + Message + + + + + + + + + + + + + + + + + + + + + + + + + a + b + + + + + diff --git a/LoginServer/ant/etc/mmetrics-frames.xsl b/LoginServer/ant/etc/mmetrics-frames.xsl new file mode 100644 index 0000000..effc184 --- /dev/null +++ b/LoginServer/ant/etc/mmetrics-frames.xsl @@ -0,0 +1,1025 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + . + + + + + + Metrics Results. + + + + + + + + + <H2>Frame Alert</H2> + <P> + This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. + </P> + + + + + + + + + + + +

    Metrics Reference

    +V(G) | +LOC | +DIT | +NOA | +NRM | +NLM | +WMC | +RFC | +DAC | +FANOUT | +CBO | +LCOM | +NOC + + +

    Cyclomatic Complexity - V(G)

    +This metric was introduced in the 1970s to measure the amount of control +flow complexity or branching complexity in a module such as a +subroutine. It gives the number of paths that may be taken through the +code, and was initially developed to give some measure of the cost of +producing a test case for the module by executing each path. +

    +Methods with a high cyclomatic complexity tend to be more difficult to +understand and maintain. In general the more complex the methods of an +application, the more difficult it will be to test it, and this will adversely +affect its reliability. +

    +V(G) is a measure of the control flow complexity of a method or +constructor. It counts the number of branches in the body of the method, +defined as: +

      +
    • while statements;
    • +
    • if statements;
    • +
    • for statements.
    • +
    + +The metric can also be configured to count each case of a switch +statement as well. + +
    +

    Lines of Code - LOC

    + +This is perhaps the simplest of all the metrics to define and compute. +Counting lines has a long history as a software metric dating from before +the rise of structured programming, and it is still in widespread use today. +The size of a method affects the ease with which it can be understood, its +reusability and its maintainability. There are a variety of ways that the size +can be calculated. These include counting all the lines of code, the number +of statements, the blank lines of code, the lines of commentary, and the +lines consisting only of syntax such as block delimiters. +

    +This metric can also be used for sizing other constructs as well, for +example, the overall size of a Java class or package can be measured by +counting the number of source lines it consists of. +

    +LOC can be used to determine the size of a compilation unit (source file), +class or interface, method, constructor, or field. It can be configured to +ignore: +

      +
    • blank lines;
    • +
    • lines consisting only of comments;
    • +
    • lines consisting only of opening and closing braces.
    • +
    + +
    +

    Depth of Inheritance Hierarchy - DIT

    + +This metric calculates how far down the inheritance hierarchy a class is +declared. In Java all classes have java.lang.Object as their ultimate +superclass, which is defined to have a depth of 1. So a class that +immediately extends java.lang.Object has a metric value of 2; any of its +subclasses will have a value of 3, and so on. +

    +A class that is deep within the tree inherits more methods and state +variables, thereby increasing its complexity and making it difficult to +predict its behavior. It can be harder to understand a system with many +inheritance layers. +

    +DIT is defined for classes and interfaces: +

      +
    • all interface types have a depth of 1;
    • +
    • the class java.lang.Object has a depth of 1;
    • +
    • all other classes have a depth of 1 + the depth of their super class.
    • +
    + +
    +

    Number of Attributes - NOA

    + +The number of distinct state variables in a class serves as one measure of +its complexity. The more state a class represents the more difficult it is to +maintain invariants for it. It also hinders comprehensibility and reuse. +

    +In Java, state can be exposed to subclasses through protected fields, which +entails that the subclass also be aware of and maintain any invariants. This +interference with the class's data encapsulation can be a source of defects +and hidden dependencies between the state variables. +

    +NOA is defined for classes and interfaces. It counts the number of fields +declared in the class or interface. + + +

    Number of Remote Methods - NRM

    + +NRM is defined for classes. A remote method call is defined as an +invocation of a method that is not declared in any of: +
      +
    • the class itself;
    • +
    • a class or interface that the class extends or implements;
    • +
    • a class or method that extends the class.
    • +
    + +The value is the count of all the remote method calls in all of the methods +and constructors of the class. + +
    +

    Number of Local Methods - NLM

    + +NLM is defined for classes and interfaces. A local method is defined as a +method that is declared in the class or interface. NLM can be configured to +include the local methods of all of the class's superclasses. Methods with +public, protected, package and private visibility can be independently +counted by setting configuration parameters. + +
    +

    Weighted Methods per Class - WMC

    + +If the number of methods in a class can be determined during the design +and modeling phase of a project, it can be used as a predictor of how +much time and effort is needed to develop, debug and maintain it. This +metric can be further refined by incorporating a weighting for the +complexity of each method. The usual weighting is given by the cyclomatic +complexity of the method. +

    +The subclasses of a class inherit all of its public and protected methods, +and possibly its package methods as well, so the number of methods a +class has directly impacts the complexity of its subclasses. Classes with +large numbers of methods are often specific to a particular application, +reducing the ability to reuse them. +

    +The definition of WMC is based upon NLM, and it provides the same +configuration parameters for counting inherited methods and of varying +visibility. The main difference is that NLM always counts each method as 1, +whereas WMC will weight each method. There are two weighting schemes: +

      +
    • V(G) the cyclomatic complexity of the method is used as its weight. + Methods from class files are given a V(G) of 1.
    • +
    • the arity, or the number of parameters of the method are used to + determine the weight.
    • +
    + +
    +

    Response For Class - RFC

    + +The response set of a class is the set of all methods that can be invoked as +a result of a message sent to an object of the class. This includes methods +in the class's inheritance hierarchy and methods that can be invoked on +other objects. The Response For Class metric is defined to be size of the +response set for the class. A class which provides a larger response set is +considered to be more complex than one with a smaller response set. +

    +One reason for this is that if a method call on a class can result in a large +number of different method calls on the target and other classes, then it +can be harder to test the behavior of the class and debug problems. It will +typically require a deeper understanding of the potential interactions that +objects of the class can have with the rest of the system. +

    +RFC is defined as the sum of NLM and NRM for the class. The local methods +include all of the public, protected, package and private methods, but not +methods declared only in a superclass. + + +

    Data Abstraction Coupling - DAC

    + +DAC is defined for classes and interfaces. It counts the number of reference +types that are used in the field declarations of the class or interface. The +component types of arrays are also counted. Any field with a type that is +either a supertype or a subtype of the class is not counted. + + +

    Fan Out - FANOUT

    + +FANOUT is defined for classes and interfaces, constructors and methods. It +counts the number of reference types that are used in: +
      +
    • field declarations;
    • +
    • formal parameters and return types;
    • +
    • throws declarations;
    • +
    • local variables.
    • +
    + +The component types of arrays are also counted. Any type that is either a +supertype or a subtype of the class is not counted. + +
    +

    Coupling Between Objects - CBO

    + +When one object or class uses another object or class they are said to be +coupled. One major source of coupling is that between a superclass and a +subclass. A coupling is also introduced when a method or field in another +class is accessed, or when an object of another class is passed into or out +of a method invocation. Coupling Between Objects is a measure of the +non-inheritance coupling between two objects. +

    +A high value of coupling reduces the modularity of the class and makes +reuse more difficult. The more independent a class is the more likely it is +that it will be possible to reuse it in another part of the system. When a +class is coupled to another class it becomes sensitive to changes in that +class, thereby making maintenance for difficult. In addition, a class that is +overly dependent on other classes can be difficult to understand and test in +isolation. +

    +CBO is defined for classes and interfaces, constructors and methods. It +counts the number of reference types that are used in: +

      +
    • field declarations
    • +
    • formal parameters and return types
    • +
    • throws declarations
    • +
    • local variables
    • +
    + +It also counts: +
      +
    • types from which field and method selections are made
    • +
    + +The component types of arrays are also counted. Any type that is either a +supertype or a subtype of the class is not counted. + +
    +

    Lack of Cohesion Of Methods - LCOM

    + +The cohesion of a class is the degree to which its methods are related to +each other. It is determined by examining the pattern of state variable +accesses within the set of methods. If all the methods access the same state +variables then they have high cohesion; if they access disjoint sets of +variables then the cohesion is low. An extreme example of low cohesion +would be if none of the methods accessed any of the state variables. + +If a class exhibits low method cohesion it indicates that the design of the +class has probably been partitioned incorrectly, and could benefit by being +split into more classes with individually higher cohesion. On the other +hand, a high value of cohesion (a low lack of cohesion) implies that the +class is well designed. A cohesive class will tend to provide a high degree +of encapsulation, whereas a lack of cohesion decreases encapsulation and +increases complexity. +

    +Another form of cohesion that is useful for Java programs is cohesion +between nested and enclosing classes. A nested class that has very low +cohesion with its enclosing class would probably better designed as a peer +class rather than a nested class. +

    +LCOM is defined for classes. Operationally, LCOM takes each pair of +methods in the class and determines the set of fields they each access. If +they have disjoint sets of field accesses increase the count P by one. If they +share at least one field access then increase Q by one. After considering +each pair of methods, +LCOM = (P > Q) ? (P - Q) : 0 +

    +Indirect access to fields via local methods can be considered by setting a +metric configuration parameter. + + +

    Number Of Classes - NOC

    + +The overall size of the system can be estimated by calculating the number +of classes it contains. A large system with more classes is more complex +than a smaller one because the number of potential interactions between +objects is higher. This reduces the comprehensibility of the system which +in turn makes it harder to test, debug and maintain. +

    +If the number of classes in the system can be projected during the initial +design phase of the project it can serve as a base for estimating the total +effort and cost of developing, debugging and maintaining the system. +

    +The NOC metric can also usefully be applied at the package and class level +as well as the total system. +

    +NOCL is defined for class and interfaces. It counts the number of classes or +interfaces that are declared. This is usually 1, but nested class declarations +will increase this number. + + + + + + + .bannercell { + border: 0px; + padding: 0px; + } + body { + margin-left: 10; + margin-right: 10; + font:normal 80% arial,helvetica,sanserif; + background-color:#FFFFFF; + color:#000000; + } + .a td { + background: #efefef; + } + .b td { + background: #fff; + } + th, td { + text-align: left; + vertical-align: top; + } + th { + font-weight:bold; + background: #ccc; + color: black; + } + table, th, td { + font-size:100%; + border: none + } + table.log tr td, tr th { + + } + h2 { + font-weight:bold; + font-size:140%; + margin-bottom: 5; + } + h3 { + font-size:100%; + font-weight:bold; + background: #525D76; + color: white; + text-decoration: none; + padding: 5px; + margin-right: 2px; + margin-left: 2px; + margin-bottom: 0; + } + .Error { + font-weight:bold; color:red; + } + + + + + + + + + + + + + + + + +

    Class .

    + + + +
    + +

    Methods

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

    +
    + +

    Classes

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

    Classes

    + + + + + +
    + + +
    + + + + + + +
    + + + / + + .html + + + + + + + + + + + + + + + + +

    Home

    +

    Packages

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

    Summary

    + + + + + + + + + + + + + + + + + +
    V(G)LOCDITNOANRMNLMWMCRFCDACFANOUTCBOLCOMNOCL
    + + + + +
    + Note: Metrics evaluate the quality of software by analyzing the program source and quantifying + various kind of complexity. Complexity is a common source of problems and defects in software. + High complexity makes it more difficult to develop, understand, maintain, extend, test and debug + a program. +

    + The primary use of metrics is to focus your attention on those parts of code that potentially are + complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial + actions. + For additional information about metrics and their meaning, please consult + Metamata Metrics manual. +

    + +

    Packages

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

    Package

    + + + + +
    + + + + + +
    + Note: Metrics evaluate the quality of software by analyzing the program source and quantifying + various kind of complexity. Complexity is a common source of problems and defects in software. + High complexity makes it more difficult to develop, understand, maintain, extend, test and debug + a program. +

    + The primary use of metrics is to focus your attention on those parts of code that potentially are + complexity hot spots. Once the complex areas your program have been uncovered, you can take remedial + actions. + For additional information about metrics and their meaning, please consult + Metamata Metrics manual. +

    + + + +

    Classes

    + + + + + + +
    +
    + + + + +
    + + + + + + + ../ + + + + + + ../ + + + + + + + + stylesheet.css + + + + + + + + + + + + + + + +
    + + http://jakarta.apache.org + +

    Source Code Metrics

    Designed for use with Webgain QA/Metamata Metrics and Ant.
    +
    +
    + + + + + + + + + Name + V(G) + LOC + DIT + NOA + NRM + NLM + WMC + RFC + DAC + FANOUT + CBO + LCOM + NOCL + + + + + + + Name + V(G) + LOC + FANOUT + CBO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Error + + + + +
    + diff --git a/LoginServer/ant/etc/tagdiff.xsl b/LoginServer/ant/etc/tagdiff.xsl new file mode 100644 index 0000000..38e9366 --- /dev/null +++ b/LoginServer/ant/etc/tagdiff.xsl @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + <xsl:value-of select="$title"/> + + + +

    + +

    + Tagdiff between and + +

    Designed for use with Ant.

    +
    + + + + + +
    + New Files | + Modified Files | + Removed Files +
    + + + New Files + New + + + + + Modified Files + Modified + + + + + + Removed Files + Removed + + +
    + + + +
    + + + + + + + + + + - entries + + (back to top) + + + + + + + +
      + +
    + + + + + + + + + + + + + + + + + + + + mailto: + + + + + + +
  • + + / + + + + + + + + /?rev=&content-type=text/x-cvsweb-markup + + + /?r1=&r2=&diff_format=h + + () + + +
  • +
    + + + + + + +
    diff --git a/LoginServer/ant/fetch.xml b/LoginServer/ant/fetch.xml new file mode 100644 index 0000000..a0cc2a9 --- /dev/null +++ b/LoginServer/ant/fetch.xml @@ -0,0 +1,236 @@ + + + + + + + + This build file downloads JAR files that optional Ant tasks use, + and installs them in a location that is accessible the next time Ant runs. + + You can choose three locations, by going -Ddest=LOCATION on the command line + -Ddest=user user lib dir ${user.home}/.ant/lib + -Ddest=system ant lib dir ${ant.home}/lib --Default-- + -Ddest=optional optional dir ${ant.home}/lib/optional (for Ant developers) + + You may also need to set proxy settings. On Java1.5, Ant tries to get + this from the OS, unless you use the -noproxy option. + + Proxies can be configured manually setting the JVM proxy values in the + ANT_OPTS environment variable. + + For example, to set the proxy up in the tcsh shell, the command would be + something like: + + For csh/tcsh: + setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For bash: + export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For Windows, set the environment variable in the appropriate dialog box + and open a new console. or, by hand + set ANT_OPTS = -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080 + + + + + + + + + + + + + + + + + + + + + + + + + Unknown destination : ${dest} + Downloading to ${dest.dir} + + + + + + + + + + + + Unknown archive @{archive} -no property @{archive}.version defined. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LoginServer/ant/get-m2.xml b/LoginServer/ant/get-m2.xml new file mode 100644 index 0000000..4111e81 --- /dev/null +++ b/LoginServer/ant/get-m2.xml @@ -0,0 +1,121 @@ + + + + + + + + This build file downloads the Maven2 Ant tasks, + and installs them in the location specified by the m2.dest.dir property. + + You may need to set proxy settings. On Java1.5, Ant tries to get + this from the OS, unless you use the -noproxy option. + + Proxies can be configured manually setting the JVM proxy values in the + ANT_OPTS environment variable. + + For example, to set the proxy up in the tcsh shell, the command would be + something like: + + For csh/tcsh: + setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For bash: + export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080" + For Windows, set the environment variable in the appropriate dialog box + and open a new console. or, by hand + set ANT_OPTS = -Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080 + + + + + + + + + + + + $${@{property}} not specified + + + + + + + + + + + + + + + + + + + Downloading to ${m2.dest.dir} + + + + + + + + + + + + + + + + + + Failed to verify the downloaded file ${m2.antlib.url}" against the checksum + coded into libraries.properties. + The local copy has been deleted, for security reasons + + + + + + + + + + diff --git a/LoginServer/ant/lib/README b/LoginServer/ant/lib/README new file mode 100644 index 0000000..a056be2 --- /dev/null +++ b/LoginServer/ant/lib/README @@ -0,0 +1,15 @@ +Please refer to the Ant manual under Installing Ant / Library +Dependencies for a list of the jar requirements for various optional +tasks and features. + +This directory contains xercesImpl.jar from the 2.6.2 release of +Apache Xerces. For more information or newer releases see +. See the file LICENSE.xerces for +the terms of distribution. + +It also contains xml-apis.jar, an Apache-controlled collection of +standard classes from the 1.0b2 release of the Apache XML-Commons +release. For more information or newer releases see +. See the files LICENSE.dom and +LICENSE.sax for the terms of distribution. + diff --git a/LoginServer/ant/lib/ant-1.7.0.pom b/LoginServer/ant/lib/ant-1.7.0.pom new file mode 100644 index 0000000..7568229 --- /dev/null +++ b/LoginServer/ant/lib/ant-1.7.0.pom @@ -0,0 +1,232 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant + 1.7.0 + org.apache.tools.ant + Apache Ant + + + org.apache.ant + ant-launcher + 1.7.0 + compile + + + + xerces + xercesImpl + 2.8.1 + true + runtime + + + + xml-apis + xml-apis + 1.3.03 + true + compile + + + + + ../../../../target/ant/.build.timestamp.properties + + + + org.apache.maven.plugins + maven-jar-plugin + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + delete-timestamp-file + clean + + run + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/** + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/types/optional/** + org/apache/tools/ant/types/resolver/** + org/apache/tools/ant/util/depend/** + org/apache/tools/ant/util/optional/** + org/apache/tools/ant/util/Script* + org/apache/tools/ant/listener/Log4jListener* + org/apache/tools/ant/listener/CommonsLoggingListener* + org/apache/tools/ant/util/regexp/JakartaRegexp* + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/util/regexp/Jdk14Regexp* + org/apache/tools/ant/taskdefs/email/MimeMailer* + org/apache/tools/ant/launch/** + + + org/apache/tools/ant/taskdefs/optional/** + org/apache/tools/ant/filters/util/JavaClassHelper* + org/apache/tools/ant/types/optional/** + org/apache/tools/ant/types/resolver/** + org/apache/tools/ant/util/depend/** + org/apache/tools/ant/util/optional/** + org/apache/tools/ant/util/Script* + org/apache/tools/ant/listener/Log4jListener* + org/apache/tools/ant/listener/CommonsLoggingListener* + org/apache/tools/ant/util/regexp/JakartaRegexp* + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/util/regexp/Jdk14Regexp* + org/apache/tools/ant/taskdefs/email/MimeMailer* + org/apache/tools/ant/launch/** + org/apache/tools/ant/taskdefs/StyleTest* + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + ant.home + ${env.ANT_HOME} + + + build.tests + ../../../../target/ant/testcases + + + build.tests.value + ../../../../target/ant/testcases + + + offline + true + + + root + ../../../.. + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + + + + + ../../../../src/main + true + + org/apache/tools/ant/taskdefs/default.properties + org/apache/tools/ant/types/default.properties + org/apache/tools/ant/taskdefs/default.properties + org/apache/tools/ant/types/conditions/antlib.xml + org/apache/tools/ant/defaultManifest.mf + org/apache/tools/ant/version.txt + + + + ../../../../src/resources + true + + **/antlib.xml + + + + ../../../../docs + false + + images/ant_logo_large.gif + + + + + + ../../../../src/etc/testcases + true + + + ../../../../src/main + true + + **/*.java + + + + ../../../../src/main + ../../../../src/tests/junit + ../../../../target/ant/classes + ../../../../target/ant/testcases + ../../../../target/ant + + diff --git a/LoginServer/ant/lib/ant-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-1.7.0.pom.md5 new file mode 100644 index 0000000..b283305 --- /dev/null +++ b/LoginServer/ant/lib/ant-1.7.0.pom.md5 @@ -0,0 +1 @@ +0153222de881bd75a1a03c972966f98e diff --git a/LoginServer/ant/lib/ant-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-1.7.0.pom.sha1 new file mode 100644 index 0000000..8dab3b2 --- /dev/null +++ b/LoginServer/ant/lib/ant-1.7.0.pom.sha1 @@ -0,0 +1 @@ +6c896738d6345ed0812c34b4392867c210dad051 diff --git a/LoginServer/ant/lib/ant-antlr-1.7.0.pom b/LoginServer/ant/lib/ant-antlr-1.7.0.pom new file mode 100644 index 0000000..de25536 --- /dev/null +++ b/LoginServer/ant/lib/ant-antlr-1.7.0.pom @@ -0,0 +1,75 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-antlr + 1.7.0 + antlr specific task. + The implementation forks a java process, therefore the antlr jar file is only needed at runtime + + + org.apache.ant + ant + 1.7.0 + true + compile + + + + antlr + antlr + 2.7.2 + true + runtime + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/ANTLR* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-antlr-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-antlr-1.7.0.pom.md5 new file mode 100644 index 0000000..df33dea --- /dev/null +++ b/LoginServer/ant/lib/ant-antlr-1.7.0.pom.md5 @@ -0,0 +1 @@ +a63cde1195ea76b499847d8bf698edba diff --git a/LoginServer/ant/lib/ant-antlr-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-antlr-1.7.0.pom.sha1 new file mode 100644 index 0000000..2c86b55 --- /dev/null +++ b/LoginServer/ant/lib/ant-antlr-1.7.0.pom.sha1 @@ -0,0 +1 @@ +f51de13649550f94e9bc2f5a03b76dee3c7ecee9 diff --git a/LoginServer/ant/lib/ant-antlr.jar b/LoginServer/ant/lib/ant-antlr.jar new file mode 100644 index 0000000..5b127f9 Binary files /dev/null and b/LoginServer/ant/lib/ant-antlr.jar differ diff --git a/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom b/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom new file mode 100644 index 0000000..9594149 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-bcel + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + bcel + bcel + 5.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/tfilters/util/JavaClassHelper* + org/apache/tools/ant/tutil/depend/bcel/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom.md5 new file mode 100644 index 0000000..d78ca81 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom.md5 @@ -0,0 +1 @@ +7cb4be931a57998d31b68098c5d6053e diff --git a/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom.sha1 new file mode 100644 index 0000000..1259110 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-bcel-1.7.0.pom.sha1 @@ -0,0 +1 @@ +d0e1e2a885a6faf18ef67bd0b9e7c21f5e4e41e7 diff --git a/LoginServer/ant/lib/ant-apache-bcel.jar b/LoginServer/ant/lib/ant-apache-bcel.jar new file mode 100644 index 0000000..cdc5202 Binary files /dev/null and b/LoginServer/ant/lib/ant-apache-bcel.jar differ diff --git a/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom b/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom new file mode 100644 index 0000000..fbeb245 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom @@ -0,0 +1,74 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-bsf + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + bsf + bsf + 2.4.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/Script* + org/apache/tools/ant/taskdefs/optional/script/** + org/apache/tools/ant/types/optional/*Script* + org/apache/tools/ant/util/Script* + org/apache/tools/ant/util/optional/Script* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom.md5 new file mode 100644 index 0000000..3351b48 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom.md5 @@ -0,0 +1 @@ +0790d6a5f5bd6d64c3badaada94f5d29 diff --git a/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom.sha1 new file mode 100644 index 0000000..e3a76f0 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-bsf-1.7.0.pom.sha1 @@ -0,0 +1 @@ +397dfecef5f4f2842bf9c00e3485d9afe704d479 diff --git a/LoginServer/ant/lib/ant-apache-bsf.jar b/LoginServer/ant/lib/ant-apache-bsf.jar new file mode 100644 index 0000000..0ee68ac Binary files /dev/null and b/LoginServer/ant/lib/ant-apache-bsf.jar differ diff --git a/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom b/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom new file mode 100644 index 0000000..87b5847 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom @@ -0,0 +1,69 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-log4j + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + log4j + log4j + 1.2.13 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/listener/Log4jListener* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom.md5 new file mode 100644 index 0000000..d6dc36b --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom.md5 @@ -0,0 +1 @@ +dafe68897be94f720f07fd9d217ea6c3 diff --git a/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom.sha1 new file mode 100644 index 0000000..ef0581d --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-log4j-1.7.0.pom.sha1 @@ -0,0 +1 @@ +b459c5796ed619217152fb18b41c17725956cd0c diff --git a/LoginServer/ant/lib/ant-apache-log4j.jar b/LoginServer/ant/lib/ant-apache-log4j.jar new file mode 100644 index 0000000..4c9427e Binary files /dev/null and b/LoginServer/ant/lib/ant-apache-log4j.jar differ diff --git a/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom b/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom new file mode 100644 index 0000000..695d170 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-oro + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + oro + oro + 2.0.8 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/util/regexp/JakartaOro* + org/apache/tools/ant/taskdefs/optional/perforce/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom.md5 new file mode 100644 index 0000000..41f746e --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom.md5 @@ -0,0 +1 @@ +d6e74dbe99c21b5664894d42fd3d0a1a diff --git a/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom.sha1 new file mode 100644 index 0000000..4e4c59a --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-oro-1.7.0.pom.sha1 @@ -0,0 +1 @@ +2da5692988fb4f6c3eff3f7752889d280b930fb7 diff --git a/LoginServer/ant/lib/ant-apache-oro.jar b/LoginServer/ant/lib/ant-apache-oro.jar new file mode 100644 index 0000000..30013ba Binary files /dev/null and b/LoginServer/ant/lib/ant-apache-oro.jar differ diff --git a/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom b/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom new file mode 100644 index 0000000..31f9ee8 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom @@ -0,0 +1,70 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-regexp + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + regexp + regexp + 1.3 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/util/regexp/JakartaRegexp* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom.md5 new file mode 100644 index 0000000..9de88d9 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom.md5 @@ -0,0 +1 @@ +5167f94dce6cc78ce5e2b39e37dee499 diff --git a/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom.sha1 new file mode 100644 index 0000000..dd71622 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-regexp-1.7.0.pom.sha1 @@ -0,0 +1 @@ +78dc4fee641b98ebdf085030dacd311c5217e2d9 diff --git a/LoginServer/ant/lib/ant-apache-regexp.jar b/LoginServer/ant/lib/ant-apache-regexp.jar new file mode 100644 index 0000000..a393a3c Binary files /dev/null and b/LoginServer/ant/lib/ant-apache-regexp.jar differ diff --git a/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom b/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom new file mode 100644 index 0000000..4e81580 --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom @@ -0,0 +1,69 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-apache-resolver + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + xml-resolver + xml-resolver + 1.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/types/resolver/** + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom.md5 new file mode 100644 index 0000000..79c8a6b --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom.md5 @@ -0,0 +1 @@ +22f74f57403ad26242704320476cdfd2 diff --git a/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom.sha1 new file mode 100644 index 0000000..f18421a --- /dev/null +++ b/LoginServer/ant/lib/ant-apache-resolver-1.7.0.pom.sha1 @@ -0,0 +1 @@ +8c61f8b318cb70927513fe440fa178c396185936 diff --git a/LoginServer/ant/lib/ant-apache-resolver.jar b/LoginServer/ant/lib/ant-apache-resolver.jar new file mode 100644 index 0000000..119a41d Binary files /dev/null and b/LoginServer/ant/lib/ant-apache-resolver.jar differ diff --git a/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom b/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom new file mode 100644 index 0000000..a205a67 --- /dev/null +++ b/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom @@ -0,0 +1,70 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-commons-logging + 1.7.0 + Ant Listener based on commons-logging + + + org.apache.ant + ant + 1.7.0 + compile + + + commons-logging + commons-logging-api + 1.0.4 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/tlistener/CommonsLoggingListener* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom.md5 new file mode 100644 index 0000000..90790be --- /dev/null +++ b/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom.md5 @@ -0,0 +1 @@ +aaed374c26114170486b2b60bf987739 diff --git a/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom.sha1 new file mode 100644 index 0000000..f89496a --- /dev/null +++ b/LoginServer/ant/lib/ant-commons-logging-1.7.0.pom.sha1 @@ -0,0 +1 @@ +82e62a4be2cdfa80658762ecdd94dfb2fed0d0c6 diff --git a/LoginServer/ant/lib/ant-commons-logging.jar b/LoginServer/ant/lib/ant-commons-logging.jar new file mode 100644 index 0000000..fcba217 Binary files /dev/null and b/LoginServer/ant/lib/ant-commons-logging.jar differ diff --git a/LoginServer/ant/lib/ant-commons-net-1.7.0.pom b/LoginServer/ant/lib/ant-commons-net-1.7.0.pom new file mode 100644 index 0000000..f39af19 --- /dev/null +++ b/LoginServer/ant/lib/ant-commons-net-1.7.0.pom @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-commons-net + 1.7.0 + ftp, rexec and telnet tasks + + + org.apache.ant + ant + 1.7.0 + compile + + + commons-net + commons-net + 1.4.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/net/RExec* + org/apache/tools/ant/taskdefs/optional/net/TelnetTask* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-commons-net-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-commons-net-1.7.0.pom.md5 new file mode 100644 index 0000000..63645ee --- /dev/null +++ b/LoginServer/ant/lib/ant-commons-net-1.7.0.pom.md5 @@ -0,0 +1 @@ +c3b3ef9357dc32edf675d2dc5b8fa8a5 diff --git a/LoginServer/ant/lib/ant-commons-net-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-commons-net-1.7.0.pom.sha1 new file mode 100644 index 0000000..db9efc9 --- /dev/null +++ b/LoginServer/ant/lib/ant-commons-net-1.7.0.pom.sha1 @@ -0,0 +1 @@ +092cc31ddab3cd550ed0a5b384baf97218c15d98 diff --git a/LoginServer/ant/lib/ant-commons-net.jar b/LoginServer/ant/lib/ant-commons-net.jar new file mode 100644 index 0000000..b490c96 Binary files /dev/null and b/LoginServer/ant/lib/ant-commons-net.jar differ diff --git a/LoginServer/ant/lib/ant-jai-1.7.0.pom b/LoginServer/ant/lib/ant-jai-1.7.0.pom new file mode 100644 index 0000000..e8a3401 --- /dev/null +++ b/LoginServer/ant/lib/ant-jai-1.7.0.pom @@ -0,0 +1,81 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jai + 1.7.0 + image task and corresponding types. + jai (Java Advanced Imaging) is not available in public Maven repositories, therefore the dependencies are included with a scope provided + the download URL is http://java.sun.com/products/java-media/jai/ + + + + org.apache.ant + ant + 1.7.0 + compile + + + javax.media + jai-core + 1.1.2_01 + provided + + + jai + jai-codec + 1.1.2.1 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/image/* + org/apache/tools/ant/types/optional/image/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-jai-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-jai-1.7.0.pom.md5 new file mode 100644 index 0000000..1421340 --- /dev/null +++ b/LoginServer/ant/lib/ant-jai-1.7.0.pom.md5 @@ -0,0 +1 @@ +bfe805489b52e51ce3a929b916a7b780 diff --git a/LoginServer/ant/lib/ant-jai-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-jai-1.7.0.pom.sha1 new file mode 100644 index 0000000..c879b76 --- /dev/null +++ b/LoginServer/ant/lib/ant-jai-1.7.0.pom.sha1 @@ -0,0 +1 @@ +4e6db677ed9162d6546d5057046491b4454285ff diff --git a/LoginServer/ant/lib/ant-jai.jar b/LoginServer/ant/lib/ant-jai.jar new file mode 100644 index 0000000..26901f3 Binary files /dev/null and b/LoginServer/ant/lib/ant-jai.jar differ diff --git a/LoginServer/ant/lib/ant-javamail-1.7.0.pom b/LoginServer/ant/lib/ant-javamail-1.7.0.pom new file mode 100644 index 0000000..0bf6bf6 --- /dev/null +++ b/LoginServer/ant/lib/ant-javamail-1.7.0.pom @@ -0,0 +1,78 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-javamail + 1.7.0 + implementation of the mail task based on javamail. + Required to send emails to SMTP servers using user/password combinations + or to send mail over SSL + + + org.apache.ant + ant + 1.7.0 + compile + + + javax.mail + mail + 1.4 + compile + + + javax.activation + activation + 1.1 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/email/MimeMailer* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-javamail-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-javamail-1.7.0.pom.md5 new file mode 100644 index 0000000..06df7c9 --- /dev/null +++ b/LoginServer/ant/lib/ant-javamail-1.7.0.pom.md5 @@ -0,0 +1 @@ +0678ec4770bd91b32f80b5fb457b7634 diff --git a/LoginServer/ant/lib/ant-javamail-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-javamail-1.7.0.pom.sha1 new file mode 100644 index 0000000..2d57498 --- /dev/null +++ b/LoginServer/ant/lib/ant-javamail-1.7.0.pom.sha1 @@ -0,0 +1 @@ +f8cebf57009c4d99a1bf2b5223015ed320baf1de diff --git a/LoginServer/ant/lib/ant-javamail.jar b/LoginServer/ant/lib/ant-javamail.jar new file mode 100644 index 0000000..8778e93 Binary files /dev/null and b/LoginServer/ant/lib/ant-javamail.jar differ diff --git a/LoginServer/ant/lib/ant-jdepend-1.7.0.pom b/LoginServer/ant/lib/ant-jdepend-1.7.0.pom new file mode 100644 index 0000000..58ea8d7 --- /dev/null +++ b/LoginServer/ant/lib/ant-jdepend-1.7.0.pom @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jdepend + 1.7.0 + task jdepend invoking the jdepend parser. There is also a version 2.9.1 of the + jdepend parser available on the maven repository + + + org.apache.ant + ant + 1.7.0 + compile + + + jdepend + jdepend + 2.7 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/jdepend/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-jdepend-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-jdepend-1.7.0.pom.md5 new file mode 100644 index 0000000..a20fcea --- /dev/null +++ b/LoginServer/ant/lib/ant-jdepend-1.7.0.pom.md5 @@ -0,0 +1 @@ +064f0e995accca15150223c1a0ae8666 diff --git a/LoginServer/ant/lib/ant-jdepend-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-jdepend-1.7.0.pom.sha1 new file mode 100644 index 0000000..dc98c2c --- /dev/null +++ b/LoginServer/ant/lib/ant-jdepend-1.7.0.pom.sha1 @@ -0,0 +1 @@ +0277822a1cac5cdabccefcb0473b6d31c1780293 diff --git a/LoginServer/ant/lib/ant-jdepend.jar b/LoginServer/ant/lib/ant-jdepend.jar new file mode 100644 index 0000000..37cd86f Binary files /dev/null and b/LoginServer/ant/lib/ant-jdepend.jar differ diff --git a/LoginServer/ant/lib/ant-jmf-1.7.0.pom b/LoginServer/ant/lib/ant-jmf-1.7.0.pom new file mode 100644 index 0000000..260cd42 --- /dev/null +++ b/LoginServer/ant/lib/ant-jmf-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jmf + 1.7.0 + contains the sound task and a soundplayer listener + download the dependency from http://java.sun.com/products/java-media/jmf/ + + + org.apache.ant + ant + 1.7.0 + compile + + + javax.media + jmf + 2.1.1e + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/sound/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-jmf-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-jmf-1.7.0.pom.md5 new file mode 100644 index 0000000..c356de0 --- /dev/null +++ b/LoginServer/ant/lib/ant-jmf-1.7.0.pom.md5 @@ -0,0 +1 @@ +ce526c923382726fc57f5f7afaa69952 diff --git a/LoginServer/ant/lib/ant-jmf-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-jmf-1.7.0.pom.sha1 new file mode 100644 index 0000000..5fbf57a --- /dev/null +++ b/LoginServer/ant/lib/ant-jmf-1.7.0.pom.sha1 @@ -0,0 +1 @@ +c50b01f6634863439f9877c607807f5ccaba4a41 diff --git a/LoginServer/ant/lib/ant-jmf.jar b/LoginServer/ant/lib/ant-jmf.jar new file mode 100644 index 0000000..036385c Binary files /dev/null and b/LoginServer/ant/lib/ant-jmf.jar differ diff --git a/LoginServer/ant/lib/ant-jsch-1.7.0.pom b/LoginServer/ant/lib/ant-jsch-1.7.0.pom new file mode 100644 index 0000000..e9ab98b --- /dev/null +++ b/LoginServer/ant/lib/ant-jsch-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-jsch + 1.7.0 + contains the sshexec and scp tasks + jsch 0.1.29 might not be available from maven + + + org.apache.ant + ant + 1.7.0 + compile + + + com.jcraft + jsch + 0.1.29 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/ssh/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-jsch-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-jsch-1.7.0.pom.md5 new file mode 100644 index 0000000..2d442d7 --- /dev/null +++ b/LoginServer/ant/lib/ant-jsch-1.7.0.pom.md5 @@ -0,0 +1 @@ +1c1fdd8639840ec7c3b2744248b1fe29 diff --git a/LoginServer/ant/lib/ant-jsch-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-jsch-1.7.0.pom.sha1 new file mode 100644 index 0000000..9727ca8 --- /dev/null +++ b/LoginServer/ant/lib/ant-jsch-1.7.0.pom.sha1 @@ -0,0 +1 @@ +7e57abd0e96480d055d19e7c2f80eaf5d0dbff84 diff --git a/LoginServer/ant/lib/ant-jsch.jar b/LoginServer/ant/lib/ant-jsch.jar new file mode 100644 index 0000000..5466269 Binary files /dev/null and b/LoginServer/ant/lib/ant-jsch.jar differ diff --git a/LoginServer/ant/lib/ant-junit-1.7.0.pom b/LoginServer/ant/lib/ant-junit-1.7.0.pom new file mode 100644 index 0000000..d2671ff --- /dev/null +++ b/LoginServer/ant/lib/ant-junit-1.7.0.pom @@ -0,0 +1,94 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-junit + 1.7.0 + contains the junit and junirreport tasks + + + org.apache.ant + ant + 1.7.0 + compile + + + junit + junit + 3.8.2 + compile + + + + + + maven-antrun-plugin + + + create-timestamp-file + generate-resources + + run + + + + + + + + + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/junit/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-junit-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-junit-1.7.0.pom.md5 new file mode 100644 index 0000000..703d2b5 --- /dev/null +++ b/LoginServer/ant/lib/ant-junit-1.7.0.pom.md5 @@ -0,0 +1 @@ +6fbd6ebb8b953980060e31b66962fceb diff --git a/LoginServer/ant/lib/ant-junit-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-junit-1.7.0.pom.sha1 new file mode 100644 index 0000000..7d12057 --- /dev/null +++ b/LoginServer/ant/lib/ant-junit-1.7.0.pom.sha1 @@ -0,0 +1 @@ +d1145e0fe7d39ccfc85a434da5710c631622bec5 diff --git a/LoginServer/ant/lib/ant-junit.jar b/LoginServer/ant/lib/ant-junit.jar new file mode 100644 index 0000000..fa43fb2 Binary files /dev/null and b/LoginServer/ant/lib/ant-junit.jar differ diff --git a/LoginServer/ant/lib/ant-launcher-1.7.0.pom b/LoginServer/ant/lib/ant-launcher-1.7.0.pom new file mode 100644 index 0000000..38e6f8c --- /dev/null +++ b/LoginServer/ant/lib/ant-launcher-1.7.0.pom @@ -0,0 +1,57 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-launcher + 1.7.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/launch/*.java + + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/ant-launcher/classes + ../../../../target/ant-launcher/testcases + ../../../../target/ant-launcher + + diff --git a/LoginServer/ant/lib/ant-launcher-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-launcher-1.7.0.pom.md5 new file mode 100644 index 0000000..58a85be --- /dev/null +++ b/LoginServer/ant/lib/ant-launcher-1.7.0.pom.md5 @@ -0,0 +1 @@ +9715be71f950b5701fca1f863434373d diff --git a/LoginServer/ant/lib/ant-launcher-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-launcher-1.7.0.pom.sha1 new file mode 100644 index 0000000..29428c1 --- /dev/null +++ b/LoginServer/ant/lib/ant-launcher-1.7.0.pom.sha1 @@ -0,0 +1 @@ +d628e808d19cf5f6d78d4c67f22ffe99d9c19a2a diff --git a/LoginServer/ant/lib/ant-launcher.jar b/LoginServer/ant/lib/ant-launcher.jar new file mode 100644 index 0000000..12a1e78 Binary files /dev/null and b/LoginServer/ant/lib/ant-launcher.jar differ diff --git a/LoginServer/ant/lib/ant-netrexx-1.7.0.pom b/LoginServer/ant/lib/ant-netrexx-1.7.0.pom new file mode 100644 index 0000000..b44117c --- /dev/null +++ b/LoginServer/ant/lib/ant-netrexx-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-netrexx + 1.7.0 + NetRexxC task + dependency can be downloaded from http://www.ibm.com/software/awdtools/netrexx/download.html + + + org.apache.ant + ant + 1.7.0 + compile + + + com.ibm.netrexx + netrexx + 2.0.5 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/NetRexxC* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-netrexx-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-netrexx-1.7.0.pom.md5 new file mode 100644 index 0000000..d2e5580 --- /dev/null +++ b/LoginServer/ant/lib/ant-netrexx-1.7.0.pom.md5 @@ -0,0 +1 @@ +706b06d9edf81848a94159e5543ba131 diff --git a/LoginServer/ant/lib/ant-netrexx-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-netrexx-1.7.0.pom.sha1 new file mode 100644 index 0000000..06bfdcf --- /dev/null +++ b/LoginServer/ant/lib/ant-netrexx-1.7.0.pom.sha1 @@ -0,0 +1 @@ +c70e518b904c44bf542136925e619a9b34eccd63 diff --git a/LoginServer/ant/lib/ant-netrexx.jar b/LoginServer/ant/lib/ant-netrexx.jar new file mode 100644 index 0000000..d646fd7 Binary files /dev/null and b/LoginServer/ant/lib/ant-netrexx.jar differ diff --git a/LoginServer/ant/lib/ant-nodeps-1.7.0.pom b/LoginServer/ant/lib/ant-nodeps-1.7.0.pom new file mode 100644 index 0000000..7152167 --- /dev/null +++ b/LoginServer/ant/lib/ant-nodeps-1.7.0.pom @@ -0,0 +1,120 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-nodeps + 1.7.0 + contains all the optional tasks and types which do not have particular dependencies + + + org.apache.ant + ant + 1.7.0 + compile + + + + xerces + xercesImpl + 2.8.1 + true + runtime + + + + xml-apis + xml-apis + 1.3.03 + true + compile + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/taskdefs/optional/** + org/apache/tools/ant/types/optional/** + org/apache/tools/ant/util/depend/* + org/apache/tools/ant/util/optional/** + org/apache/tools/ant/util/java15/** + org/apache/tools/ant/util/regexp/Jdk14Regexp* + + + org/apache/tools/ant/taskdefs/optional/TraXLiaison* + org/apache/tools/ant/taskdefs/optional/junit/** + org/apache/tools/ant/taskdefs/optional/perforce/** + org/apache/tools/ant/taskdefs/optional/Script* + org/apache/tools/ant/taskdefs/optional/script/** + org/apache/tools/ant/util/optional/Script* + org/apache/tools/ant/types/optional/*Script* + org/apache/tools/ant/taskdefs/optional/StyleBook* + org/apache/tools/ant/taskdefs/optional/NetRexxC* + org/apache/tools/ant/taskdefs/optional/ejb/Ejbc* + org/apache/tools/ant/taskdefs/optional/ejb/DDCreator* + org/apache/tools/ant/taskdefs/optional/ejb/WLRun* + org/apache/tools/ant/taskdefs/optional/ejb/WLStop* + org/apache/tools/ant/taskdefs/optional/net/Telnet* + org/apache/tools/ant/taskdefs/optional/net/FTP* + org/apache/tools/ant/taskdefs/optional/net/RExec* + org/apache/tools/ant/taskdefs/optional/scm/AntStarTeam* + org/apache/tools/ant/taskdefs/optional/starteam/* + org/apache/tools/ant/taskdefs/optional/ANTLR* + org/apache/tools/ant/taskdefs/optional/sound/* + org/apache/tools/ant/taskdefs/optional/image/* + org/apache/tools/ant/types/optional/image/* + org/apache/tools/ant/taskdefs/optional/jdepend/* + org/apache/tools/ant/taskdefs/optional/splash/* + org/apache/tools/ant/taskdefs/optional/ssh/* + + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/ant-nodeps/classes + ../../../../target/ant-nodeps/testcases + ../../../../target/ant-nodeps + + diff --git a/LoginServer/ant/lib/ant-nodeps-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-nodeps-1.7.0.pom.md5 new file mode 100644 index 0000000..5c27ad1 --- /dev/null +++ b/LoginServer/ant/lib/ant-nodeps-1.7.0.pom.md5 @@ -0,0 +1 @@ +bffd32b045861eaa4da24c9a0dee5ddf diff --git a/LoginServer/ant/lib/ant-nodeps-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-nodeps-1.7.0.pom.sha1 new file mode 100644 index 0000000..5ac2ddb --- /dev/null +++ b/LoginServer/ant/lib/ant-nodeps-1.7.0.pom.sha1 @@ -0,0 +1 @@ +5396eb3c49af7294bcb7c64e21929281fd30a80f diff --git a/LoginServer/ant/lib/ant-nodeps.jar b/LoginServer/ant/lib/ant-nodeps.jar new file mode 100644 index 0000000..2d209fa Binary files /dev/null and b/LoginServer/ant/lib/ant-nodeps.jar differ diff --git a/LoginServer/ant/lib/ant-parent-1.7.0.pom b/LoginServer/ant/lib/ant-parent-1.7.0.pom new file mode 100644 index 0000000..66b5265 --- /dev/null +++ b/LoginServer/ant/lib/ant-parent-1.7.0.pom @@ -0,0 +1,111 @@ + + + + + 4.0.0 + org.apache.ant + ant-parent + 1.7.0 + pom + master POM + Apache Ant + http://ant.apache.org/ + 2000 + + Apache Software Foundation + + + + + dummy + Dummy to avoid accidental deploys + + + + + scm:svn:http://svn.apache.org/repos/asf/ant/core/trunk + scm:svn:https://svn.apache.org/repos/asf/jant/core/trunk + http://svn.apache.org/repos/asf/ant/core/trunk + + + + Ant Developers List + dev-subscribe@ant.apache.org + dev-unsubscribe@ant.apache.org + dev@ant.apache.org + http://mail-archives.apache.org/mod_mbox/ant-dev + + + Ant Users List + user-subscribe@ant.apache.org + user-unsubscribe@ant.apache.org + user@ant.apache.org + http://mail-archives.apache.org/mod_mbox/ant-user + + + + bugzilla + http://issues.apache.org/bugzilla/ + + + ant + ant-antlr + ant-apache-bcel + ant-apache-bsf + ant-apache-log4j + ant-apache-oro + ant-apache-regexp + ant-apache-resolver + ant-commons-logging + ant-commons-net + ant-jai + ant-javamail + ant-jdepend + ant-jmf + ant-jsch + ant-junit + ant-launcher + ant-netrexx + ant-nodeps + ant-starteam + ant-stylebook + ant-swing + ant-testutil + ant-trax + ant-weblogic + + + + junit + junit + 3.8.2 + test + + + + ../../../src/main + ../../../src/testcases + ../../../target/classes + ../../../target/testcases + + diff --git a/LoginServer/ant/lib/ant-parent-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-parent-1.7.0.pom.md5 new file mode 100644 index 0000000..b4ad53d --- /dev/null +++ b/LoginServer/ant/lib/ant-parent-1.7.0.pom.md5 @@ -0,0 +1 @@ +bbb2b5106cdfce3220529d77200085cc diff --git a/LoginServer/ant/lib/ant-parent-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-parent-1.7.0.pom.sha1 new file mode 100644 index 0000000..0cfd06b --- /dev/null +++ b/LoginServer/ant/lib/ant-parent-1.7.0.pom.sha1 @@ -0,0 +1 @@ +9d12c84639c58e88a028235eaad5b801f6ba03ec diff --git a/LoginServer/ant/lib/ant-starteam-1.7.0.pom b/LoginServer/ant/lib/ant-starteam-1.7.0.pom new file mode 100644 index 0000000..fa61f9d --- /dev/null +++ b/LoginServer/ant/lib/ant-starteam-1.7.0.pom @@ -0,0 +1,71 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-starteam + Starteam SDK tasks + + + org.apache.ant + ant + 1.7.0 + compile + + + com.starteam + starteam-sdk + 5.2 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/scm/AntStarTeam* + org/apache/tools/ant//taskdefs/optional/scm/starteam/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-starteam-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-starteam-1.7.0.pom.md5 new file mode 100644 index 0000000..5284981 --- /dev/null +++ b/LoginServer/ant/lib/ant-starteam-1.7.0.pom.md5 @@ -0,0 +1 @@ +5ec8ae3d5a4cb08d9137b87306dff579 diff --git a/LoginServer/ant/lib/ant-starteam-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-starteam-1.7.0.pom.sha1 new file mode 100644 index 0000000..6e8c22c --- /dev/null +++ b/LoginServer/ant/lib/ant-starteam-1.7.0.pom.sha1 @@ -0,0 +1 @@ +0af55275712ec4bd9fe1264e4e861a38bca63c12 diff --git a/LoginServer/ant/lib/ant-starteam.jar b/LoginServer/ant/lib/ant-starteam.jar new file mode 100644 index 0000000..668b190 Binary files /dev/null and b/LoginServer/ant/lib/ant-starteam.jar differ diff --git a/LoginServer/ant/lib/ant-stylebook-1.7.0.pom b/LoginServer/ant/lib/ant-stylebook-1.7.0.pom new file mode 100644 index 0000000..aa7199b --- /dev/null +++ b/LoginServer/ant/lib/ant-stylebook-1.7.0.pom @@ -0,0 +1,72 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-stylebook + 1.7.0 + executes the Apache Stylebook document generator. Deprecated since Ant 1.7 + + + org.apache.ant + ant + 1.7.0 + compile + + + stylebook + stylebook + 1.0-b2 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/StyleBook* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/LoginServer/ant/lib/ant-stylebook-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-stylebook-1.7.0.pom.md5 new file mode 100644 index 0000000..a0e3a3e --- /dev/null +++ b/LoginServer/ant/lib/ant-stylebook-1.7.0.pom.md5 @@ -0,0 +1 @@ +2a18952408edd1bab40f2eb10774e438 diff --git a/LoginServer/ant/lib/ant-stylebook-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-stylebook-1.7.0.pom.sha1 new file mode 100644 index 0000000..71b5d98 --- /dev/null +++ b/LoginServer/ant/lib/ant-stylebook-1.7.0.pom.sha1 @@ -0,0 +1 @@ +f7a2e311ca577b9abbbd25d74cd6ca6a39dd47eb diff --git a/LoginServer/ant/lib/ant-stylebook.jar b/LoginServer/ant/lib/ant-stylebook.jar new file mode 100644 index 0000000..2d6ab23 Binary files /dev/null and b/LoginServer/ant/lib/ant-stylebook.jar differ diff --git a/LoginServer/ant/lib/ant-swing-1.7.0.pom b/LoginServer/ant/lib/ant-swing-1.7.0.pom new file mode 100644 index 0000000..06fdc87 --- /dev/null +++ b/LoginServer/ant/lib/ant-swing-1.7.0.pom @@ -0,0 +1,66 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-swing + 1.7.0 + a listener and a splash task based on Swing + + + org.apache.ant + ant + 1.7.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/splash/* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + + diff --git a/LoginServer/ant/lib/ant-swing-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-swing-1.7.0.pom.md5 new file mode 100644 index 0000000..cd545a2 --- /dev/null +++ b/LoginServer/ant/lib/ant-swing-1.7.0.pom.md5 @@ -0,0 +1 @@ +6c5b44c4ee4747f711c47471a1a55762 diff --git a/LoginServer/ant/lib/ant-swing-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-swing-1.7.0.pom.sha1 new file mode 100644 index 0000000..ab1bf2c --- /dev/null +++ b/LoginServer/ant/lib/ant-swing-1.7.0.pom.sha1 @@ -0,0 +1 @@ +7c034ad0657f2e68c558b6855b0176bd03b1340e diff --git a/LoginServer/ant/lib/ant-swing.jar b/LoginServer/ant/lib/ant-swing.jar new file mode 100644 index 0000000..60c3981 Binary files /dev/null and b/LoginServer/ant/lib/ant-swing.jar differ diff --git a/LoginServer/ant/lib/ant-testutil-1.7.0.pom b/LoginServer/ant/lib/ant-testutil-1.7.0.pom new file mode 100644 index 0000000..47e69d1 --- /dev/null +++ b/LoginServer/ant/lib/ant-testutil-1.7.0.pom @@ -0,0 +1,68 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-testutil + 1.7.0 + test utility classes + + + org.apache.ant + ant + 1.7.0 + compile + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant/BuildFileTest* + org/apache/tools/ant/util/regexp/RegexpMatcherTest* + org/apache/tools/ant/util/regexp/RegexpTest* + org/apache/tools/ant/taskdefs/optional/AbstractXSLTLiaisonTest* + org/apache/tools/ant/types/AbstractFileSetTest* + + + + + ../../../../src/tests/junit + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId} + + + diff --git a/LoginServer/ant/lib/ant-testutil-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-testutil-1.7.0.pom.md5 new file mode 100644 index 0000000..22eb900 --- /dev/null +++ b/LoginServer/ant/lib/ant-testutil-1.7.0.pom.md5 @@ -0,0 +1 @@ +66eecd286a3b244e76e3f2cd4a615518 diff --git a/LoginServer/ant/lib/ant-testutil-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-testutil-1.7.0.pom.sha1 new file mode 100644 index 0000000..c432d1f --- /dev/null +++ b/LoginServer/ant/lib/ant-testutil-1.7.0.pom.sha1 @@ -0,0 +1 @@ +4d8064fed5bf7b73abe3173f17562512a6728f0b diff --git a/LoginServer/ant/lib/ant-testutil.jar b/LoginServer/ant/lib/ant-testutil.jar new file mode 100644 index 0000000..8ba443f Binary files /dev/null and b/LoginServer/ant/lib/ant-testutil.jar differ diff --git a/LoginServer/ant/lib/ant-trax-1.7.0.pom b/LoginServer/ant/lib/ant-trax-1.7.0.pom new file mode 100644 index 0000000..4ae1425 --- /dev/null +++ b/LoginServer/ant/lib/ant-trax-1.7.0.pom @@ -0,0 +1,94 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-trax + 1.7.0 + contains particularly one class necessary for the execution of the xslt task + + + org.apache.ant + ant + 1.7.0 + compile + + + + xerces + xercesImpl + 2.8.1 + true + runtime + + + + xml-apis + xml-apis + 1.3.03 + true + compile + + + + xalan + xalan + 2.7.0 + true + runtime + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/TraXLiaison* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-trax-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-trax-1.7.0.pom.md5 new file mode 100644 index 0000000..27c863d --- /dev/null +++ b/LoginServer/ant/lib/ant-trax-1.7.0.pom.md5 @@ -0,0 +1 @@ +a1f676a843fa52b930ade7e2f95c81f0 diff --git a/LoginServer/ant/lib/ant-trax-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-trax-1.7.0.pom.sha1 new file mode 100644 index 0000000..be2a502 --- /dev/null +++ b/LoginServer/ant/lib/ant-trax-1.7.0.pom.sha1 @@ -0,0 +1 @@ +35696cfd509307b50145c430df713bc0df7c2c15 diff --git a/LoginServer/ant/lib/ant-trax.jar b/LoginServer/ant/lib/ant-trax.jar new file mode 100644 index 0000000..ef838ec Binary files /dev/null and b/LoginServer/ant/lib/ant-trax.jar differ diff --git a/LoginServer/ant/lib/ant-weblogic-1.7.0.pom b/LoginServer/ant/lib/ant-weblogic-1.7.0.pom new file mode 100644 index 0000000..bce83bb --- /dev/null +++ b/LoginServer/ant/lib/ant-weblogic-1.7.0.pom @@ -0,0 +1,79 @@ + + + + + + org.apache.ant + ant-parent + ../pom.xml + 1.7.0 + + 4.0.0 + org.apache.ant + ant-weblogic + 1.7.0 + + + org.apache.ant + ant + 1.7.0 + compile + + + com.bea + weblogicclasses + 5.1 + provided + + + com.bea + weblogic + 8.1.3.0 + provided + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.2 + 1.2 + + org/apache/tools/ant//taskdefs/optional/ejb/Ejbc* + org/apache/tools/ant//taskdefs/optional/ejb/DDCreator* + org/apache/tools/ant//taskdefs/optional/ejb/WLRun* + org/apache/tools/ant//taskdefs/optional/ejb/WLStop* + + + + + ../../../../src/main + ../../../../src/testcases + ../../../../target/${project.artifactId}/classes + ../../../../target/${project.artifactId}/testcases + ../../../../target/${project.artifactId} + + diff --git a/LoginServer/ant/lib/ant-weblogic-1.7.0.pom.md5 b/LoginServer/ant/lib/ant-weblogic-1.7.0.pom.md5 new file mode 100644 index 0000000..1c95d6d --- /dev/null +++ b/LoginServer/ant/lib/ant-weblogic-1.7.0.pom.md5 @@ -0,0 +1 @@ +830bea6ea96362992a71a90306839d94 diff --git a/LoginServer/ant/lib/ant-weblogic-1.7.0.pom.sha1 b/LoginServer/ant/lib/ant-weblogic-1.7.0.pom.sha1 new file mode 100644 index 0000000..fb71221 --- /dev/null +++ b/LoginServer/ant/lib/ant-weblogic-1.7.0.pom.sha1 @@ -0,0 +1 @@ +bc2c91f7b4700a00831538b0994fc34a20ab53b5 diff --git a/LoginServer/ant/lib/ant-weblogic.jar b/LoginServer/ant/lib/ant-weblogic.jar new file mode 100644 index 0000000..9f0de19 Binary files /dev/null and b/LoginServer/ant/lib/ant-weblogic.jar differ diff --git a/LoginServer/ant/lib/ant.jar b/LoginServer/ant/lib/ant.jar new file mode 100644 index 0000000..0a56a58 Binary files /dev/null and b/LoginServer/ant/lib/ant.jar differ diff --git a/LoginServer/ant/lib/libraries.properties b/LoginServer/ant/lib/libraries.properties new file mode 100644 index 0000000..40b21d5 --- /dev/null +++ b/LoginServer/ant/lib/libraries.properties @@ -0,0 +1,46 @@ +#this file declares the libraries for use in +#a given release of the components + +#if you change this, change the checksum to match +m2.version=2.0.4 +m2.url=http://ibiblio.org/maven2/ +m2.artifact-name=maven-artifact-ant +m2.jar.name=${m2.artifact-name}-${m2.version}-dep.jar +#this is the URL of the antlib library, that is pulled down for everything else. +m2.antlib.url=${m2.url}/org/apache/maven/${m2.artifact-name}/${m2.version}/${m2.jar.name} +#this is the sha1 checksum of the artifact +m2.sha1.checksum=4e7ddfdb91600e9b59bb965ff8eef2f06015df50 + + +#versions of different libraries. Please keep in alphabetical order, except +#when a specific dependency forces them to be out-of-order +antlr.version=2.7.2 +bcel.version=5.1 +bsf.version=2.4.0 +bsh.version=2.0b4 +bsh-core.version=${bsh.version} +commons-net.version=1.4.0 +commons-logging.version=1.0.4 +commons-logging-api.version=${commons-logging.version} +jdepend.version=2.7 +jruby.version=0.8.3 +junit.version=3.8.2 +jsch.version=0.1.29 +jython.version=2.1 +log4j.version=1.2.13 +#js is the javascript implementation of the rhino project +js.version=1.6R3 +oro.version=2.0.8 +regexp.version=1.3 +which.version=1.0 +xerces.version=2.8.1 +xercesImpl.version=${xerces.version} +#should be in sync w/ xerces, but not in the maven repository +#xmlParserAPIs.version=${xerces.version} +xmlParserAPIs.version=2.6.1 +xalan.version=2.7.0 +xml-resolver.version=1.1 + +#paired +jacl.version=1.2.6 +tcljava.version=${jacl.version} diff --git a/LoginServer/ant/lib/xercesImpl.jar b/LoginServer/ant/lib/xercesImpl.jar new file mode 100644 index 0000000..3b351f6 Binary files /dev/null and b/LoginServer/ant/lib/xercesImpl.jar differ diff --git a/LoginServer/ant/lib/xml-apis.jar b/LoginServer/ant/lib/xml-apis.jar new file mode 100644 index 0000000..b338fb6 Binary files /dev/null and b/LoginServer/ant/lib/xml-apis.jar differ diff --git a/LoginServer/build.xml b/LoginServer/build.xml new file mode 100644 index 0000000..f6643e9 --- /dev/null +++ b/LoginServer/build.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LoginServer/compile.bat b/LoginServer/compile.bat new file mode 100644 index 0000000..7ee2538 --- /dev/null +++ b/LoginServer/compile.bat @@ -0,0 +1,4 @@ +taskkill /F /IM java.exe +set PATH=%PATH%;ant\bin +ant compile +pause \ No newline at end of file diff --git a/LoginServer/conf/ls/FPacketHandlers.xml b/LoginServer/conf/ls/FPacketHandlers.xml new file mode 100644 index 0000000..f8ca060 --- /dev/null +++ b/LoginServer/conf/ls/FPacketHandlers.xml @@ -0,0 +1,38 @@ + + + + 1 + + rsca.ls.packethandler.frontend.Logout + + + + 2 + + rsca.ls.packethandler.frontend.Shutdown + + + + 3 + + rsca.ls.packethandler.frontend.Update + + + + 5 + + rsca.ls.packethandler.frontend.Global + + + + 6 + + rsca.ls.packethandler.frontend.Alert + + + + 7 + + rsca.ls.packethandler.frontend.ListPlayers + + \ No newline at end of file diff --git a/LoginServer/conf/ls/LSPacketHandlers.xml b/LoginServer/conf/ls/LSPacketHandlers.xml new file mode 100644 index 0000000..6648bc4 --- /dev/null +++ b/LoginServer/conf/ls/LSPacketHandlers.xml @@ -0,0 +1,92 @@ + + + + 1 + 2 + + rsca.ls.packethandler.loginserver.RegisterWorld + + + + 3 + + rsca.ls.packethandler.loginserver.KillHandler + + + + 4 + 5 + + rsca.ls.packethandler.loginserver.BanHandler + + + + 6 + + rsca.ls.packethandler.loginserver.PrivacySettingHandler + + + + 7 + + rsca.ls.packethandler.loginserver.GameSettingHandler + + + + 8 + + rsca.ls.packethandler.loginserver.PlayerInfoRequestHandler + + + + 9 + + rsca.ls.packethandler.loginserver.SaveProfilesRequestHandler + + + + 10 + 11 + 12 + 13 + 14 + + rsca.ls.packethandler.loginserver.FriendHandler + + + + 15 + + rsca.ls.packethandler.loginserver.ReportHandler + + + + 20 + + rsca.ls.packethandler.loginserver.PlayerSaveHandler + + + + 30 + + rsca.ls.packethandler.loginserver.PlayerLogoutHandler + + + + 31 + + rsca.ls.packethandler.loginserver.PlayerLoginHandler + + + + 32 + + rsca.ls.packethandler.loginserver.LogHandler + + + + 33 + + rsca.ls.packethandler.loginserver.Tradelog + + diff --git a/LoginServer/conf/ls/aliases.xml b/LoginServer/conf/ls/aliases.xml new file mode 100644 index 0000000..9fc2cd9 --- /dev/null +++ b/LoginServer/conf/ls/aliases.xml @@ -0,0 +1,7 @@ + + + + + Stores aliases for the XStream engine + rsca.ls.packethandler.PacketHandlerDef + diff --git a/LoginServer/lib/.svn/entries b/LoginServer/lib/.svn/entries new file mode 100644 index 0000000..f84afcd --- /dev/null +++ b/LoginServer/lib/.svn/entries @@ -0,0 +1,436 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/lib +svn://localhost + + + +2009-09-30T13:19:19.379816Z +273 +Pets + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +mina.jar +file + + + + +2009-07-06T11:39:37.000000Z +eeee12d76057ab31dbef0c1741a7e982 +2009-07-06T11:38:38.639876Z +49 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +315582 + +hex-string.jar +file + + + + +2009-07-02T21:39:20.000000Z +c51c9c2f2879c2908054f857a6cbc5a4 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +1685 + +mina1.1.6.jar +file + + + + +2009-07-06T11:39:37.000000Z +7292cee9b59350f473127a9095f4fd21 +2009-07-06T11:38:38.639876Z +49 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +315765 + +junit.jar +file + + + + +2009-07-02T21:39:20.000000Z +3aa45be8fd3f5ae8c69b73959a7fa57c +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +112249 + +xpp3.jar +file + + + + +2009-07-02T21:39:20.000000Z +3bad226bc0f8c641fb7c8b20071a86af +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +24538 + +jmf.jar +file + + + + +2009-07-02T21:39:20.000000Z +7a117f4c5a48c6bf6b385fd682b8da89 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +2082557 + +bsh.jar +file + + + + +2009-07-19T10:28:48.000000Z +a1c60aa83c9c9a6cb2391c1c1b85eb00 +2009-07-18T20:38:42.561223Z +77 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +281694 + +mysql-connector.jar +file + + + + +2009-07-02T21:39:20.000000Z +be0a9e53f22f34a7a2da02ab97bba569 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +456729 + +pircbot.jar +file + + + + +2009-07-02T21:39:20.000000Z +24c1232877573f3e8291803a7b8a7d79 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +76667 + +slf4j.jar +file + + + + +2009-07-02T21:39:20.000000Z +64385455c0e1e9845835429c7295b954 +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +13873 + +mina2.0.0.jar +file + + + + +2009-07-06T11:39:37.000000Z +5a439378b09a83da1e388e81dfdba354 +2009-07-06T11:38:38.639876Z +49 +Pets +has-props + + + + + + + + + + + + + + + + + + + + +637782 + +xstream.jar +file + + + + +2009-07-02T21:39:20.000000Z +318abb3d0e94f263930938b9a8d8a08b +2009-07-02T21:34:35.162152Z +6 +ollie +has-props + + + + + + + + + + + + + + + + + + + + +261710 + diff --git a/LoginServer/lib/.svn/format b/LoginServer/lib/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/lib/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/lib/.svn/prop-base/bsh.jar.svn-base b/LoginServer/lib/.svn/prop-base/bsh.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/bsh.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/hex-string.jar.svn-base b/LoginServer/lib/.svn/prop-base/hex-string.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/hex-string.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/jmf.jar.svn-base b/LoginServer/lib/.svn/prop-base/jmf.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/jmf.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/junit.jar.svn-base b/LoginServer/lib/.svn/prop-base/junit.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/junit.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/mina.jar.svn-base b/LoginServer/lib/.svn/prop-base/mina.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/mina.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/mina1.1.6.jar.svn-base b/LoginServer/lib/.svn/prop-base/mina1.1.6.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/mina1.1.6.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/mina2.0.0.jar.svn-base b/LoginServer/lib/.svn/prop-base/mina2.0.0.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/mina2.0.0.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/mysql-connector.jar.svn-base b/LoginServer/lib/.svn/prop-base/mysql-connector.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/mysql-connector.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/pircbot.jar.svn-base b/LoginServer/lib/.svn/prop-base/pircbot.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/pircbot.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/slf4j.jar.svn-base b/LoginServer/lib/.svn/prop-base/slf4j.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/slf4j.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/xpp3.jar.svn-base b/LoginServer/lib/.svn/prop-base/xpp3.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/xpp3.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/prop-base/xstream.jar.svn-base b/LoginServer/lib/.svn/prop-base/xstream.jar.svn-base new file mode 100644 index 0000000..5e9587e --- /dev/null +++ b/LoginServer/lib/.svn/prop-base/xstream.jar.svn-base @@ -0,0 +1,5 @@ +K 13 +svn:mime-type +V 24 +application/octet-stream +END diff --git a/LoginServer/lib/.svn/text-base/bsh.jar.svn-base b/LoginServer/lib/.svn/text-base/bsh.jar.svn-base new file mode 100644 index 0000000..36fe03d Binary files /dev/null and b/LoginServer/lib/.svn/text-base/bsh.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/hex-string.jar.svn-base b/LoginServer/lib/.svn/text-base/hex-string.jar.svn-base new file mode 100644 index 0000000..477c6cc Binary files /dev/null and b/LoginServer/lib/.svn/text-base/hex-string.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/jmf.jar.svn-base b/LoginServer/lib/.svn/text-base/jmf.jar.svn-base new file mode 100644 index 0000000..53d8c64 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/jmf.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/junit.jar.svn-base b/LoginServer/lib/.svn/text-base/junit.jar.svn-base new file mode 100644 index 0000000..2c46d67 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/junit.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/mina.jar.svn-base b/LoginServer/lib/.svn/text-base/mina.jar.svn-base new file mode 100644 index 0000000..a5fc451 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/mina.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/mina1.1.6.jar.svn-base b/LoginServer/lib/.svn/text-base/mina1.1.6.jar.svn-base new file mode 100644 index 0000000..55c5490 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/mina1.1.6.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/mina2.0.0.jar.svn-base b/LoginServer/lib/.svn/text-base/mina2.0.0.jar.svn-base new file mode 100644 index 0000000..092f6be Binary files /dev/null and b/LoginServer/lib/.svn/text-base/mina2.0.0.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/mysql-connector.jar.svn-base b/LoginServer/lib/.svn/text-base/mysql-connector.jar.svn-base new file mode 100644 index 0000000..4741577 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/mysql-connector.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/pircbot.jar.svn-base b/LoginServer/lib/.svn/text-base/pircbot.jar.svn-base new file mode 100644 index 0000000..95cce20 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/pircbot.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/slf4j.jar.svn-base b/LoginServer/lib/.svn/text-base/slf4j.jar.svn-base new file mode 100644 index 0000000..c78cb25 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/slf4j.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/xpp3.jar.svn-base b/LoginServer/lib/.svn/text-base/xpp3.jar.svn-base new file mode 100644 index 0000000..780b574 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/xpp3.jar.svn-base differ diff --git a/LoginServer/lib/.svn/text-base/xstream.jar.svn-base b/LoginServer/lib/.svn/text-base/xstream.jar.svn-base new file mode 100644 index 0000000..3eabb85 Binary files /dev/null and b/LoginServer/lib/.svn/text-base/xstream.jar.svn-base differ diff --git a/LoginServer/lib/hex-string.jar b/LoginServer/lib/hex-string.jar new file mode 100644 index 0000000..477c6cc Binary files /dev/null and b/LoginServer/lib/hex-string.jar differ diff --git a/LoginServer/lib/mina.jar b/LoginServer/lib/mina.jar new file mode 100644 index 0000000..a5fc451 Binary files /dev/null and b/LoginServer/lib/mina.jar differ diff --git a/LoginServer/lib/mysql-connector.jar b/LoginServer/lib/mysql-connector.jar new file mode 100644 index 0000000..4741577 Binary files /dev/null and b/LoginServer/lib/mysql-connector.jar differ diff --git a/LoginServer/lib/slf4j.jar b/LoginServer/lib/slf4j.jar new file mode 100644 index 0000000..c78cb25 Binary files /dev/null and b/LoginServer/lib/slf4j.jar differ diff --git a/LoginServer/lib/xpp3.jar b/LoginServer/lib/xpp3.jar new file mode 100644 index 0000000..780b574 Binary files /dev/null and b/LoginServer/lib/xpp3.jar differ diff --git a/LoginServer/lib/xstream.jar b/LoginServer/lib/xstream.jar new file mode 100644 index 0000000..3eabb85 Binary files /dev/null and b/LoginServer/lib/xstream.jar differ diff --git a/LoginServer/logs/err.log b/LoginServer/logs/err.log new file mode 100644 index 0000000..e69de29 diff --git a/LoginServer/logs/error.log b/LoginServer/logs/error.log new file mode 100644 index 0000000..e69de29 diff --git a/LoginServer/logs/event.log b/LoginServer/logs/event.log new file mode 100644 index 0000000..e69de29 diff --git a/LoginServer/logs/mod.log b/LoginServer/logs/mod.log new file mode 100644 index 0000000..e69de29 diff --git a/LoginServer/ls.conf b/LoginServer/ls.conf new file mode 100644 index 0000000..5bb54a8 --- /dev/null +++ b/LoginServer/ls.conf @@ -0,0 +1,13 @@ + + + + RSCD-LS Config + localhost + rscangel + root + + localhost + 34526 + localhost + 8186 + diff --git a/LoginServer/ls.jar b/LoginServer/ls.jar new file mode 100644 index 0000000..a62296c Binary files /dev/null and b/LoginServer/ls.jar differ diff --git a/LoginServer/runls.bat b/LoginServer/runls.bat new file mode 100644 index 0000000..b79bdef --- /dev/null +++ b/LoginServer/runls.bat @@ -0,0 +1,5 @@ +taskkill /F /IM java.exe +title LoginServer +set PATH=%PATH%;ant\bin +ant runls +pause \ No newline at end of file diff --git a/LoginServer/src/.svn/entries b/LoginServer/src/.svn/entries new file mode 100644 index 0000000..d85d76d --- /dev/null +++ b/LoginServer/src/.svn/entries @@ -0,0 +1,31 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src +svn://localhost + + + +2010-05-11T21:03:18.514539Z +416 +ollie + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +rsca +dir + diff --git a/LoginServer/src/.svn/format b/LoginServer/src/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/.svn/entries b/LoginServer/src/rsca/.svn/entries new file mode 100644 index 0000000..ccd8881 --- /dev/null +++ b/LoginServer/src/rsca/.svn/entries @@ -0,0 +1,40 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca +svn://localhost + + + +2010-05-11T21:03:18.514539Z +416 +ollie + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +config +dir + +gs +dir + +irc +dir + +ls +dir + diff --git a/LoginServer/src/rsca/.svn/format b/LoginServer/src/rsca/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/.svn/entries b/LoginServer/src/rsca/ls/.svn/entries new file mode 100644 index 0000000..f0691d4 --- /dev/null +++ b/LoginServer/src/rsca/ls/.svn/entries @@ -0,0 +1,114 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls +svn://localhost + + + +2010-01-10T17:31:45.404426Z +376 +ollie + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +model +dir + +packethandler +dir + +net +dir + +Server.java +file + + + + +2009-10-23T16:32:26.000000Z +0f98b18225ba5b1a5a2a8e28246fa0bc +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +4953 + +codec +dir + +util +dir + +packetbuilder +dir + +LoginEngine.java +file + + + + +2009-10-23T16:32:26.000000Z +aa2a40d72bd588d1e1c09695939dc34b +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +4418 + diff --git a/LoginServer/src/rsca/ls/.svn/format b/LoginServer/src/rsca/ls/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/.svn/text-base/LoginEngine.java.svn-base b/LoginServer/src/rsca/ls/.svn/text-base/LoginEngine.java.svn-base new file mode 100644 index 0000000..3987100 --- /dev/null +++ b/LoginServer/src/rsca/ls/.svn/text-base/LoginEngine.java.svn-base @@ -0,0 +1,151 @@ +package rsca.ls; + +import java.util.List; +import java.util.TreeMap; + +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.LSPacket; +import rsca.ls.net.PacketQueue; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.packethandler.PacketHandlerDef; +import rsca.ls.util.PersistenceManager; + +public class LoginEngine extends Thread { + /** + * The mapping of packet IDs to their handler + */ + private TreeMap FPacketHandlers = new TreeMap(); + /** + * The packet queue to be processed + */ + private PacketQueue FPacketQueue; + /** + * The mapping of packet IDs to their handler + */ + private TreeMap LSPacketHandlers = new TreeMap(); + /** + * The packet queue to be processed + */ + private PacketQueue LSPacketQueue; + /** + * Should we be running? + */ + private boolean running = true; + /** + * The main server + */ + private Server server; + /** + * The mapping of packet UIDs to their handler + */ + private TreeMap uniqueHandlers = new TreeMap(); + + public LoginEngine(Server server) { + this.server = server; + LSPacketQueue = new PacketQueue(); + FPacketQueue = new PacketQueue(); + loadPacketHandlers(); + } + + public PacketQueue getFPacketQueue() { + return FPacketQueue; + } + + public PacketQueue getLSPacketQueue() { + return LSPacketQueue; + } + + /** + * Loads the packet handling classes from the persistence manager. + */ + protected void loadPacketHandlers() { + PacketHandlerDef[] handlerDefs = (PacketHandlerDef[]) PersistenceManager.load("LSPacketHandlers.xml"); + for (PacketHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + PacketHandler handler = (PacketHandler) c.newInstance(); + for (int packetID : handlerDef.getAssociatedPackets()) { + LSPacketHandlers.put(packetID, handler); + } + } + } catch (Exception e) { + Server.error(e); + } + } + handlerDefs = (PacketHandlerDef[]) PersistenceManager.load("FPacketHandlers.xml"); + for (PacketHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + PacketHandler handler = (PacketHandler) c.newInstance(); + for (int packetID : handlerDef.getAssociatedPackets()) { + FPacketHandlers.put(packetID, handler); + } + } + } catch (Exception e) { + Server.error(e); + } + } + } + + /** + * Processes incoming packets. + */ + private void processIncomingPackets() { + for (LSPacket p : LSPacketQueue.getPackets()) { + PacketHandler handler; + if (((handler = uniqueHandlers.get(p.getUID())) != null) || ((handler = LSPacketHandlers.get(p.getID())) != null)) { + try { + handler.handlePacket(p, p.getSession()); + uniqueHandlers.remove(p.getUID()); + } catch (Exception e) { + Server.error("Exception with p[" + p.getID() + "]: " + e); + } + } else { + Server.error("Unhandled packet from server: " + p.getID()); + } + } + for (FPacket p : FPacketQueue.getPackets()) { + PacketHandler handler = FPacketHandlers.get(p.getID()); + if (handler != null) { + try { + handler.handlePacket(p, p.getSession()); + } catch (Exception e) { + Server.error("Exception with p[" + p.getID() + "]: " + e); + } + } else { + Server.error("Unhandled packet from frontend: " + p.getID()); + } + } + } + + public void processOutgoingPackets() { + for (World w : server.getWorlds()) { + List packets = w.getActionSender().getPackets(); + for (LSPacket packet : packets) { + w.getSession().write(packet); + } + w.getActionSender().clearPackets(); + } + } + + public void run() { + System.out.println("LoginEngine now running"); + while (running) { + try { + Thread.sleep(50); + } catch (InterruptedException ie) { + } + processIncomingPackets(); + processOutgoingPackets(); + } + } + + public void setHandler(long uID, PacketHandler handler) { + uniqueHandlers.put(uID, handler); + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/.svn/text-base/Server.java.svn-base b/LoginServer/src/rsca/ls/.svn/text-base/Server.java.svn-base new file mode 100644 index 0000000..eb49213 --- /dev/null +++ b/LoginServer/src/rsca/ls/.svn/text-base/Server.java.svn-base @@ -0,0 +1,197 @@ +package rsca.ls; + +import java.io.File; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.TreeMap; + +import org.apache.mina.common.IoAcceptor; +import org.apache.mina.common.IoAcceptorConfig; +import org.apache.mina.common.IoHandler; +import org.apache.mina.transport.socket.nio.SocketAcceptor; +import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; +import org.apache.mina.transport.socket.nio.SocketSessionConfig; + +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.DatabaseConnection; +import rsca.ls.net.FConnectionHandler; +import rsca.ls.net.LSConnectionHandler; +import rsca.ls.util.Config; + +public class Server { + /** + * Connection to the MySQL database + */ + public static DatabaseConnection db; + private static Server server; + + public static void error(Object o) { + if (o instanceof Exception) { + Exception e = (Exception) o; + e.printStackTrace(); + System.exit(1); + return;// Adding save data + } + System.err.println(o.toString()); + } + + public static Server getServer() { + if (server == null) { + server = new Server(); + } + return server; + } + + public static void main(String[] args) throws IOException { + String configFile = "conf/ls/Conf.xml"; + if (args.length > 0) { + File f = new File(args[0]); + if (f.exists()) { + configFile = f.getName(); + } + } + System.out.println("Login Server starting up..."); + Config.initConfig(configFile); + db = new DatabaseConnection(); + System.out.println("Connected to MySQL"); + Server.getServer(); + } + + /** + * The login engine + */ + private LoginEngine engine; + /** + * The Server SocketAcceptor + */ + private IoAcceptor frontendAcceptor; + + private TreeMap idleWorlds = new TreeMap(); + + /** + * The Server SocketAcceptor + */ + private IoAcceptor serverAcceptor; + + private TreeMap worlds = new TreeMap(); + + private Server() { + try { + engine = new LoginEngine(this); + engine.start(); + serverAcceptor = createListener(Config.LS_IP, Config.LS_PORT, new LSConnectionHandler(engine)); + frontendAcceptor = createListener(Config.QUERY_IP, Config.QUERY_PORT, new FConnectionHandler(engine)); + } catch (IOException e) { + Server.error(e); + } + } + + private IoAcceptor createListener(String ip, int port, IoHandler handler) throws IOException { + IoAcceptor acceptor = new SocketAcceptor(); + IoAcceptorConfig config = new SocketAcceptorConfig(); + config.setDisconnectOnUnbind(true); + ((SocketSessionConfig) config.getSessionConfig()).setReuseAddress(true); + acceptor.bind(new InetSocketAddress(ip, port), handler, config); + return acceptor; + } + + public PlayerSave findSave(long user, World world) { + PlayerSave save = null; + // for(World w : getWorlds()) { + // PlayerSave s = w.getSave(user); + // if(s != null) { + // w.unassosiateSave(s); + // save = s; + // System.out.println("Found cached save for " + + // DataConversions.hashToUsername(user)); + // break; + // } + // } + // if(save == null) { + // System.out.println("No save found for " + + // DataConversions.hashToUsername(user) + ", loading fresh"); + save = PlayerSave.loadPlayer(user); + // } + // world.assosiateSave(save); + return save; + } + + public World findWorld(long user) { + for (World w : getWorlds()) { + if (w.hasPlayer(user)) { + return w; + } + } + return null; + } + + public LoginEngine getEngine() { + return engine; + } + + public World getIdleWorld(int id) { + return idleWorlds.get(id); + } + + public World getWorld(int id) { + if (id < 0) { + return null; + } + return worlds.get(id); + } + + public Collection getWorlds() { + return worlds.values(); + } + + public boolean isRegistered(World world) { + return getWorld(world.getID()) != null; + } + + public void kill() { + try { + serverAcceptor.unbindAll(); + frontendAcceptor.unbindAll(); + db.close(); + } catch (Exception e) { + Server.error(e); + } + } + + public boolean registerWorld(World world) { + int id = world.getID(); + if (id < 0 || getWorld(id) != null) { + return false; + } + worlds.put(id, world); + return true; + } + + public void setIdle(World world, boolean idle) { + if (idle) { + worlds.remove(world.getID()); + idleWorlds.put(world.getID(), world); + } else { + idleWorlds.remove(world.getID()); + worlds.put(world.getID(), world); + } + } + + public boolean unregisterWorld(World world) { + int id = world.getID(); + if (id < 0) { + return false; + } + if (getWorld(id) != null) { + worlds.remove(id); + return true; + } + if (getIdleWorld(id) != null) { + idleWorlds.remove(id); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/LoginEngine.java b/LoginServer/src/rsca/ls/LoginEngine.java new file mode 100644 index 0000000..3987100 --- /dev/null +++ b/LoginServer/src/rsca/ls/LoginEngine.java @@ -0,0 +1,151 @@ +package rsca.ls; + +import java.util.List; +import java.util.TreeMap; + +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.LSPacket; +import rsca.ls.net.PacketQueue; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.packethandler.PacketHandlerDef; +import rsca.ls.util.PersistenceManager; + +public class LoginEngine extends Thread { + /** + * The mapping of packet IDs to their handler + */ + private TreeMap FPacketHandlers = new TreeMap(); + /** + * The packet queue to be processed + */ + private PacketQueue FPacketQueue; + /** + * The mapping of packet IDs to their handler + */ + private TreeMap LSPacketHandlers = new TreeMap(); + /** + * The packet queue to be processed + */ + private PacketQueue LSPacketQueue; + /** + * Should we be running? + */ + private boolean running = true; + /** + * The main server + */ + private Server server; + /** + * The mapping of packet UIDs to their handler + */ + private TreeMap uniqueHandlers = new TreeMap(); + + public LoginEngine(Server server) { + this.server = server; + LSPacketQueue = new PacketQueue(); + FPacketQueue = new PacketQueue(); + loadPacketHandlers(); + } + + public PacketQueue getFPacketQueue() { + return FPacketQueue; + } + + public PacketQueue getLSPacketQueue() { + return LSPacketQueue; + } + + /** + * Loads the packet handling classes from the persistence manager. + */ + protected void loadPacketHandlers() { + PacketHandlerDef[] handlerDefs = (PacketHandlerDef[]) PersistenceManager.load("LSPacketHandlers.xml"); + for (PacketHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + PacketHandler handler = (PacketHandler) c.newInstance(); + for (int packetID : handlerDef.getAssociatedPackets()) { + LSPacketHandlers.put(packetID, handler); + } + } + } catch (Exception e) { + Server.error(e); + } + } + handlerDefs = (PacketHandlerDef[]) PersistenceManager.load("FPacketHandlers.xml"); + for (PacketHandlerDef handlerDef : handlerDefs) { + try { + String className = handlerDef.getClassName(); + Class c = Class.forName(className); + if (c != null) { + PacketHandler handler = (PacketHandler) c.newInstance(); + for (int packetID : handlerDef.getAssociatedPackets()) { + FPacketHandlers.put(packetID, handler); + } + } + } catch (Exception e) { + Server.error(e); + } + } + } + + /** + * Processes incoming packets. + */ + private void processIncomingPackets() { + for (LSPacket p : LSPacketQueue.getPackets()) { + PacketHandler handler; + if (((handler = uniqueHandlers.get(p.getUID())) != null) || ((handler = LSPacketHandlers.get(p.getID())) != null)) { + try { + handler.handlePacket(p, p.getSession()); + uniqueHandlers.remove(p.getUID()); + } catch (Exception e) { + Server.error("Exception with p[" + p.getID() + "]: " + e); + } + } else { + Server.error("Unhandled packet from server: " + p.getID()); + } + } + for (FPacket p : FPacketQueue.getPackets()) { + PacketHandler handler = FPacketHandlers.get(p.getID()); + if (handler != null) { + try { + handler.handlePacket(p, p.getSession()); + } catch (Exception e) { + Server.error("Exception with p[" + p.getID() + "]: " + e); + } + } else { + Server.error("Unhandled packet from frontend: " + p.getID()); + } + } + } + + public void processOutgoingPackets() { + for (World w : server.getWorlds()) { + List packets = w.getActionSender().getPackets(); + for (LSPacket packet : packets) { + w.getSession().write(packet); + } + w.getActionSender().clearPackets(); + } + } + + public void run() { + System.out.println("LoginEngine now running"); + while (running) { + try { + Thread.sleep(50); + } catch (InterruptedException ie) { + } + processIncomingPackets(); + processOutgoingPackets(); + } + } + + public void setHandler(long uID, PacketHandler handler) { + uniqueHandlers.put(uID, handler); + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/Server.java b/LoginServer/src/rsca/ls/Server.java new file mode 100644 index 0000000..eb49213 --- /dev/null +++ b/LoginServer/src/rsca/ls/Server.java @@ -0,0 +1,197 @@ +package rsca.ls; + +import java.io.File; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.Collection; +import java.util.TreeMap; + +import org.apache.mina.common.IoAcceptor; +import org.apache.mina.common.IoAcceptorConfig; +import org.apache.mina.common.IoHandler; +import org.apache.mina.transport.socket.nio.SocketAcceptor; +import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; +import org.apache.mina.transport.socket.nio.SocketSessionConfig; + +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.DatabaseConnection; +import rsca.ls.net.FConnectionHandler; +import rsca.ls.net.LSConnectionHandler; +import rsca.ls.util.Config; + +public class Server { + /** + * Connection to the MySQL database + */ + public static DatabaseConnection db; + private static Server server; + + public static void error(Object o) { + if (o instanceof Exception) { + Exception e = (Exception) o; + e.printStackTrace(); + System.exit(1); + return;// Adding save data + } + System.err.println(o.toString()); + } + + public static Server getServer() { + if (server == null) { + server = new Server(); + } + return server; + } + + public static void main(String[] args) throws IOException { + String configFile = "conf/ls/Conf.xml"; + if (args.length > 0) { + File f = new File(args[0]); + if (f.exists()) { + configFile = f.getName(); + } + } + System.out.println("Login Server starting up..."); + Config.initConfig(configFile); + db = new DatabaseConnection(); + System.out.println("Connected to MySQL"); + Server.getServer(); + } + + /** + * The login engine + */ + private LoginEngine engine; + /** + * The Server SocketAcceptor + */ + private IoAcceptor frontendAcceptor; + + private TreeMap idleWorlds = new TreeMap(); + + /** + * The Server SocketAcceptor + */ + private IoAcceptor serverAcceptor; + + private TreeMap worlds = new TreeMap(); + + private Server() { + try { + engine = new LoginEngine(this); + engine.start(); + serverAcceptor = createListener(Config.LS_IP, Config.LS_PORT, new LSConnectionHandler(engine)); + frontendAcceptor = createListener(Config.QUERY_IP, Config.QUERY_PORT, new FConnectionHandler(engine)); + } catch (IOException e) { + Server.error(e); + } + } + + private IoAcceptor createListener(String ip, int port, IoHandler handler) throws IOException { + IoAcceptor acceptor = new SocketAcceptor(); + IoAcceptorConfig config = new SocketAcceptorConfig(); + config.setDisconnectOnUnbind(true); + ((SocketSessionConfig) config.getSessionConfig()).setReuseAddress(true); + acceptor.bind(new InetSocketAddress(ip, port), handler, config); + return acceptor; + } + + public PlayerSave findSave(long user, World world) { + PlayerSave save = null; + // for(World w : getWorlds()) { + // PlayerSave s = w.getSave(user); + // if(s != null) { + // w.unassosiateSave(s); + // save = s; + // System.out.println("Found cached save for " + + // DataConversions.hashToUsername(user)); + // break; + // } + // } + // if(save == null) { + // System.out.println("No save found for " + + // DataConversions.hashToUsername(user) + ", loading fresh"); + save = PlayerSave.loadPlayer(user); + // } + // world.assosiateSave(save); + return save; + } + + public World findWorld(long user) { + for (World w : getWorlds()) { + if (w.hasPlayer(user)) { + return w; + } + } + return null; + } + + public LoginEngine getEngine() { + return engine; + } + + public World getIdleWorld(int id) { + return idleWorlds.get(id); + } + + public World getWorld(int id) { + if (id < 0) { + return null; + } + return worlds.get(id); + } + + public Collection getWorlds() { + return worlds.values(); + } + + public boolean isRegistered(World world) { + return getWorld(world.getID()) != null; + } + + public void kill() { + try { + serverAcceptor.unbindAll(); + frontendAcceptor.unbindAll(); + db.close(); + } catch (Exception e) { + Server.error(e); + } + } + + public boolean registerWorld(World world) { + int id = world.getID(); + if (id < 0 || getWorld(id) != null) { + return false; + } + worlds.put(id, world); + return true; + } + + public void setIdle(World world, boolean idle) { + if (idle) { + worlds.remove(world.getID()); + idleWorlds.put(world.getID(), world); + } else { + idleWorlds.remove(world.getID()); + worlds.put(world.getID(), world); + } + } + + public boolean unregisterWorld(World world) { + int id = world.getID(); + if (id < 0) { + return false; + } + if (getWorld(id) != null) { + worlds.remove(id); + return true; + } + if (getIdleWorld(id) != null) { + idleWorlds.remove(id); + return true; + } + return false; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/codec/.svn/entries b/LoginServer/src/rsca/ls/codec/.svn/entries new file mode 100644 index 0000000..1e02205 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/entries @@ -0,0 +1,232 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/codec +svn://localhost + + + +2009-09-05T12:50:46.724777Z +203 +xEnt + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +LSProtocolEncoder.java +file + + + + +2009-10-23T16:32:26.000000Z +f1fbfeb7a997cd6e4257400a814748e9 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1672 + +LSCodecFactory.java +file + + + + +2009-10-23T16:32:26.000000Z +642bf852c4e06814c082aa565d1f0025 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +948 + +LSProtocolDecoder.java +file + + + + +2009-10-23T16:32:26.000000Z +ed921789a473d03e6ea92a3fc369dbb4 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1715 + +FProtocolEncoder.java +file + + + + +2009-10-23T16:32:26.000000Z +03daaf73854a3261473dec97593e3013 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1698 + +FCodecFactory.java +file + + + + +2009-10-23T16:32:26.000000Z +18366d0f130bdd71539843da777511f1 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +954 + +FProtocolDecoder.java +file + + + + +2009-10-23T16:32:26.000000Z +4258b3a0fbee2897c5fd98c402abc831 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2234 + diff --git a/LoginServer/src/rsca/ls/codec/.svn/format b/LoginServer/src/rsca/ls/codec/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/codec/.svn/text-base/FCodecFactory.java.svn-base b/LoginServer/src/rsca/ls/codec/.svn/text-base/FCodecFactory.java.svn-base new file mode 100644 index 0000000..4a36787 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/text-base/FCodecFactory.java.svn-base @@ -0,0 +1,38 @@ +package rsca.ls.codec; + +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * Provides access to the protocol encoders and decoders for the Frontend + * protocol. + */ +public class FCodecFactory implements ProtocolCodecFactory { + /** + * The protocol decoder in use + */ + private static ProtocolDecoder decoder = new FProtocolDecoder(); + /** + * The protocol encoder in use + */ + private static ProtocolEncoder encoder = new FProtocolEncoder(); + + /** + * Provides the decoder to use to format outgoing data. + * + * @return A protocol decoder + */ + public ProtocolDecoder getDecoder() { + return decoder; + } + + /** + * Provides the encoder to use to parse incoming data. + * + * @return A protocol encoder + */ + public ProtocolEncoder getEncoder() { + return encoder; + } +} diff --git a/LoginServer/src/rsca/ls/codec/.svn/text-base/FProtocolDecoder.java.svn-base b/LoginServer/src/rsca/ls/codec/.svn/text-base/FProtocolDecoder.java.svn-base new file mode 100644 index 0000000..964e754 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/text-base/FProtocolDecoder.java.svn-base @@ -0,0 +1,79 @@ +package rsca.ls.codec; + +import java.net.URLDecoder; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; + +import rsca.ls.Server; +import rsca.ls.net.FPacket; + +/** + * A decoder for the Frontend protocol. Parses the incoming data from an + * IoSession and outputs it as a FPacket object. + */ +public class FProtocolDecoder extends CumulativeProtocolDecoder { + private static CharsetDecoder stringDecoder; + + static { + try { + stringDecoder = Charset.forName("UTF-8").newDecoder(); + } catch (Exception e) { + Server.error(e); + } + } + + /** + * Releases the buffer used by the given session. + * + * @param session + * The session for which to release the buffer + * @throws Exception + * if failed to dispose all resources + */ + public void dispose(IoSession session) throws Exception { + super.dispose(session); + } + + /** + * Parses the data in the provided byte buffer and writes it to + * out as a FPacket. + * + * @param session + * The IoSession the data was read from + * @param in + * The buffer + * @param out + * The decoder output stream to which to write the + * FPacket + * @return Whether enough data was available to create a packet + */ + protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) { + try { + String s = in.getString(stringDecoder).trim(); + int delim = s.indexOf(" "); + + int id; + String[] params; + if (delim > -1) { + id = Integer.parseInt(s.substring(0, delim)); + params = s.substring(delim + 1).split(" "); + } else { + id = Integer.parseInt(s); + params = new String[0]; + } + for (int i = 0; i < params.length; i++) { + params[i] = URLDecoder.decode(params[i], "UTF-8"); + } + out.write(new FPacket(session, id, params)); + return true; + } catch (Exception e) { + Server.error(e); + } + return false; + } +} diff --git a/LoginServer/src/rsca/ls/codec/.svn/text-base/FProtocolEncoder.java.svn-base b/LoginServer/src/rsca/ls/codec/.svn/text-base/FProtocolEncoder.java.svn-base new file mode 100644 index 0000000..5cca2ba --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/text-base/FProtocolEncoder.java.svn-base @@ -0,0 +1,62 @@ +package rsca.ls.codec; + +import java.net.URLEncoder; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; + +import rsca.ls.Server; +import rsca.ls.net.FPacket; + +/** + * Encodes the high level FPacket class into the proper protocol + * data required for transmission. + */ +public class FProtocolEncoder implements ProtocolEncoder { + /** + * Releases all resources used by this encoder. + * + * @param session + * The IO session + */ + public void dispose(IoSession session) { + } + + /** + * Converts a FPacket object into the raw data needed for + * transmission. + * + * @param session + * The IO session associated with the packet + * @param message + * A FPacket to encode + * @param out + * The output stream to which to write the data + */ + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (!(message instanceof FPacket)) { + Server.error(new Exception("Wrong packet type! " + message.toString())); + return; + } + FPacket p = (FPacket) message; + + try { + String s = String.valueOf(p.getID()); + if (p.countParameters() > 0) { + for (String param : p.getParameters()) { + s += " " + URLEncoder.encode(param, "UTF-8"); + } + } + byte[] data = s.getBytes(); + + ByteBuffer buffer = ByteBuffer.allocate(data.length); + buffer.put(data, 0, data.length); + buffer.flip(); + out.write(buffer); + } catch (Exception e) { + Server.error(e); + } + } +} diff --git a/LoginServer/src/rsca/ls/codec/.svn/text-base/LSCodecFactory.java.svn-base b/LoginServer/src/rsca/ls/codec/.svn/text-base/LSCodecFactory.java.svn-base new file mode 100644 index 0000000..1365527 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/text-base/LSCodecFactory.java.svn-base @@ -0,0 +1,37 @@ +package rsca.ls.codec; + +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * Provides access to the protocol encoders and decoders for the LS protocol. + */ +public class LSCodecFactory implements ProtocolCodecFactory { + /** + * The protocol decoder in use + */ + private static ProtocolDecoder decoder = new LSProtocolDecoder(); + /** + * The protocol encoder in use + */ + private static ProtocolEncoder encoder = new LSProtocolEncoder(); + + /** + * Provides the decoder to use to format outgoing data. + * + * @return A protocol decoder + */ + public ProtocolDecoder getDecoder() { + return decoder; + } + + /** + * Provides the encoder to use to parse incoming data. + * + * @return A protocol encoder + */ + public ProtocolEncoder getEncoder() { + return encoder; + } +} diff --git a/LoginServer/src/rsca/ls/codec/.svn/text-base/LSProtocolDecoder.java.svn-base b/LoginServer/src/rsca/ls/codec/.svn/text-base/LSProtocolDecoder.java.svn-base new file mode 100644 index 0000000..58dd209 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/text-base/LSProtocolDecoder.java.svn-base @@ -0,0 +1,59 @@ +package rsca.ls.codec; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; + +import rsca.ls.net.LSPacket; + +/** + * A decoder for the LS protocol. Parses the incoming data from an IoSession and + * outputs it as a LSPacket object. + */ +public class LSProtocolDecoder extends CumulativeProtocolDecoder { + /** + * Releases the buffer used by the given session. + * + * @param session + * The session for which to release the buffer + * @throws Exception + * if failed to dispose all resources + */ + public void dispose(IoSession session) throws Exception { + super.dispose(session); + } + + /** + * Parses the data in the provided byte buffer and writes it to + * out as a LSPacket. + * + * @param session + * The IoSession the data was read from + * @param in + * The buffer + * @param out + * The decoder output stream to which to write the + * LSPacket + * @return Whether enough data was available to create a packet + */ + protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) { + if (in.remaining() >= 13) { + int length = in.getInt(); + if (length <= in.remaining()) { + byte[] payload = new byte[length - 9]; + + int id = in.getUnsigned(); + long uid = in.getLong(); + in.get(payload); + + out.write(new LSPacket(session, id, uid, payload)); + return true; + } else { + in.rewind(); + return false; + } + } + return false; + } +} diff --git a/LoginServer/src/rsca/ls/codec/.svn/text-base/LSProtocolEncoder.java.svn-base b/LoginServer/src/rsca/ls/codec/.svn/text-base/LSProtocolEncoder.java.svn-base new file mode 100644 index 0000000..28896cb --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/.svn/text-base/LSProtocolEncoder.java.svn-base @@ -0,0 +1,60 @@ +package rsca.ls.codec; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; + +import rsca.ls.Server; +import rsca.ls.net.LSPacket; + +/** + * Encodes the high level LSPacket class into the proper protocol + * data required for transmission. + */ +public class LSProtocolEncoder implements ProtocolEncoder { + /** + * Releases all resources used by this encoder. + * + * @param session + * The IO session + */ + public void dispose(IoSession session) { + } + + /** + * Converts a LSPacket object into the raw data needed for + * transmission. + * + * @param session + * The IO session associated with the packet + * @param message + * A LSPacket to encode + * @param out + * The output stream to which to write the data + */ + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (!(message instanceof LSPacket)) { + Server.error(new Exception("Wrong packet type! " + message.toString())); + return; + } + LSPacket p = (LSPacket) message; + byte[] data = p.getData(); + int packetLength = data.length; + ByteBuffer buffer; + if (!p.isBare()) { + buffer = ByteBuffer.allocate(data.length + 13); + packetLength += 9; + + buffer.putInt(packetLength); + buffer.put((byte) p.getID()); + buffer.putLong(p.getUID()); + + } else { + buffer = ByteBuffer.allocate(data.length); + } + buffer.put(data, 0, data.length); + buffer.flip(); + out.write(buffer); + } +} diff --git a/LoginServer/src/rsca/ls/codec/FCodecFactory.java b/LoginServer/src/rsca/ls/codec/FCodecFactory.java new file mode 100644 index 0000000..4a36787 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/FCodecFactory.java @@ -0,0 +1,38 @@ +package rsca.ls.codec; + +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * Provides access to the protocol encoders and decoders for the Frontend + * protocol. + */ +public class FCodecFactory implements ProtocolCodecFactory { + /** + * The protocol decoder in use + */ + private static ProtocolDecoder decoder = new FProtocolDecoder(); + /** + * The protocol encoder in use + */ + private static ProtocolEncoder encoder = new FProtocolEncoder(); + + /** + * Provides the decoder to use to format outgoing data. + * + * @return A protocol decoder + */ + public ProtocolDecoder getDecoder() { + return decoder; + } + + /** + * Provides the encoder to use to parse incoming data. + * + * @return A protocol encoder + */ + public ProtocolEncoder getEncoder() { + return encoder; + } +} diff --git a/LoginServer/src/rsca/ls/codec/FProtocolDecoder.java b/LoginServer/src/rsca/ls/codec/FProtocolDecoder.java new file mode 100644 index 0000000..964e754 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/FProtocolDecoder.java @@ -0,0 +1,79 @@ +package rsca.ls.codec; + +import java.net.URLDecoder; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; + +import rsca.ls.Server; +import rsca.ls.net.FPacket; + +/** + * A decoder for the Frontend protocol. Parses the incoming data from an + * IoSession and outputs it as a FPacket object. + */ +public class FProtocolDecoder extends CumulativeProtocolDecoder { + private static CharsetDecoder stringDecoder; + + static { + try { + stringDecoder = Charset.forName("UTF-8").newDecoder(); + } catch (Exception e) { + Server.error(e); + } + } + + /** + * Releases the buffer used by the given session. + * + * @param session + * The session for which to release the buffer + * @throws Exception + * if failed to dispose all resources + */ + public void dispose(IoSession session) throws Exception { + super.dispose(session); + } + + /** + * Parses the data in the provided byte buffer and writes it to + * out as a FPacket. + * + * @param session + * The IoSession the data was read from + * @param in + * The buffer + * @param out + * The decoder output stream to which to write the + * FPacket + * @return Whether enough data was available to create a packet + */ + protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) { + try { + String s = in.getString(stringDecoder).trim(); + int delim = s.indexOf(" "); + + int id; + String[] params; + if (delim > -1) { + id = Integer.parseInt(s.substring(0, delim)); + params = s.substring(delim + 1).split(" "); + } else { + id = Integer.parseInt(s); + params = new String[0]; + } + for (int i = 0; i < params.length; i++) { + params[i] = URLDecoder.decode(params[i], "UTF-8"); + } + out.write(new FPacket(session, id, params)); + return true; + } catch (Exception e) { + Server.error(e); + } + return false; + } +} diff --git a/LoginServer/src/rsca/ls/codec/FProtocolEncoder.java b/LoginServer/src/rsca/ls/codec/FProtocolEncoder.java new file mode 100644 index 0000000..5cca2ba --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/FProtocolEncoder.java @@ -0,0 +1,62 @@ +package rsca.ls.codec; + +import java.net.URLEncoder; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; + +import rsca.ls.Server; +import rsca.ls.net.FPacket; + +/** + * Encodes the high level FPacket class into the proper protocol + * data required for transmission. + */ +public class FProtocolEncoder implements ProtocolEncoder { + /** + * Releases all resources used by this encoder. + * + * @param session + * The IO session + */ + public void dispose(IoSession session) { + } + + /** + * Converts a FPacket object into the raw data needed for + * transmission. + * + * @param session + * The IO session associated with the packet + * @param message + * A FPacket to encode + * @param out + * The output stream to which to write the data + */ + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (!(message instanceof FPacket)) { + Server.error(new Exception("Wrong packet type! " + message.toString())); + return; + } + FPacket p = (FPacket) message; + + try { + String s = String.valueOf(p.getID()); + if (p.countParameters() > 0) { + for (String param : p.getParameters()) { + s += " " + URLEncoder.encode(param, "UTF-8"); + } + } + byte[] data = s.getBytes(); + + ByteBuffer buffer = ByteBuffer.allocate(data.length); + buffer.put(data, 0, data.length); + buffer.flip(); + out.write(buffer); + } catch (Exception e) { + Server.error(e); + } + } +} diff --git a/LoginServer/src/rsca/ls/codec/LSCodecFactory.java b/LoginServer/src/rsca/ls/codec/LSCodecFactory.java new file mode 100644 index 0000000..1365527 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/LSCodecFactory.java @@ -0,0 +1,37 @@ +package rsca.ls.codec; + +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +/** + * Provides access to the protocol encoders and decoders for the LS protocol. + */ +public class LSCodecFactory implements ProtocolCodecFactory { + /** + * The protocol decoder in use + */ + private static ProtocolDecoder decoder = new LSProtocolDecoder(); + /** + * The protocol encoder in use + */ + private static ProtocolEncoder encoder = new LSProtocolEncoder(); + + /** + * Provides the decoder to use to format outgoing data. + * + * @return A protocol decoder + */ + public ProtocolDecoder getDecoder() { + return decoder; + } + + /** + * Provides the encoder to use to parse incoming data. + * + * @return A protocol encoder + */ + public ProtocolEncoder getEncoder() { + return encoder; + } +} diff --git a/LoginServer/src/rsca/ls/codec/LSProtocolDecoder.java b/LoginServer/src/rsca/ls/codec/LSProtocolDecoder.java new file mode 100644 index 0000000..58dd209 --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/LSProtocolDecoder.java @@ -0,0 +1,59 @@ +package rsca.ls.codec; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.CumulativeProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; + +import rsca.ls.net.LSPacket; + +/** + * A decoder for the LS protocol. Parses the incoming data from an IoSession and + * outputs it as a LSPacket object. + */ +public class LSProtocolDecoder extends CumulativeProtocolDecoder { + /** + * Releases the buffer used by the given session. + * + * @param session + * The session for which to release the buffer + * @throws Exception + * if failed to dispose all resources + */ + public void dispose(IoSession session) throws Exception { + super.dispose(session); + } + + /** + * Parses the data in the provided byte buffer and writes it to + * out as a LSPacket. + * + * @param session + * The IoSession the data was read from + * @param in + * The buffer + * @param out + * The decoder output stream to which to write the + * LSPacket + * @return Whether enough data was available to create a packet + */ + protected boolean doDecode(IoSession session, ByteBuffer in, ProtocolDecoderOutput out) { + if (in.remaining() >= 13) { + int length = in.getInt(); + if (length <= in.remaining()) { + byte[] payload = new byte[length - 9]; + + int id = in.getUnsigned(); + long uid = in.getLong(); + in.get(payload); + + out.write(new LSPacket(session, id, uid, payload)); + return true; + } else { + in.rewind(); + return false; + } + } + return false; + } +} diff --git a/LoginServer/src/rsca/ls/codec/LSProtocolEncoder.java b/LoginServer/src/rsca/ls/codec/LSProtocolEncoder.java new file mode 100644 index 0000000..28896cb --- /dev/null +++ b/LoginServer/src/rsca/ls/codec/LSProtocolEncoder.java @@ -0,0 +1,60 @@ +package rsca.ls.codec; + +import org.apache.mina.common.ByteBuffer; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; + +import rsca.ls.Server; +import rsca.ls.net.LSPacket; + +/** + * Encodes the high level LSPacket class into the proper protocol + * data required for transmission. + */ +public class LSProtocolEncoder implements ProtocolEncoder { + /** + * Releases all resources used by this encoder. + * + * @param session + * The IO session + */ + public void dispose(IoSession session) { + } + + /** + * Converts a LSPacket object into the raw data needed for + * transmission. + * + * @param session + * The IO session associated with the packet + * @param message + * A LSPacket to encode + * @param out + * The output stream to which to write the data + */ + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) { + if (!(message instanceof LSPacket)) { + Server.error(new Exception("Wrong packet type! " + message.toString())); + return; + } + LSPacket p = (LSPacket) message; + byte[] data = p.getData(); + int packetLength = data.length; + ByteBuffer buffer; + if (!p.isBare()) { + buffer = ByteBuffer.allocate(data.length + 13); + packetLength += 9; + + buffer.putInt(packetLength); + buffer.put((byte) p.getID()); + buffer.putLong(p.getUID()); + + } else { + buffer = ByteBuffer.allocate(data.length); + } + buffer.put(data, 0, data.length); + buffer.flip(); + out.write(buffer); + } +} diff --git a/LoginServer/src/rsca/ls/model/.svn/entries b/LoginServer/src/rsca/ls/model/.svn/entries new file mode 100644 index 0000000..a3df656 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/entries @@ -0,0 +1,198 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/model +svn://localhost + + + +2009-10-02T12:11:17.749143Z +285 +Pets + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +World.java +file + + + + +2009-10-23T16:32:26.000000Z +212fe0031f376c3a7c848e878095c16c +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +3664 + +BankItem.java +file + + + + +2009-10-23T16:32:26.000000Z +775b388d13f2293a2809460016378299 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +136 + +InvItem.java +file + + + + +2009-10-23T16:32:26.000000Z +e52c8f3a866ccf78c193d12c12952e66 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +270 + +PlayerSave.java +file + + + + +2009-10-23T16:32:26.000000Z +918471c0ed2945a4641398fb64c1da99 +2009-10-02T12:11:17.749143Z +285 +Pets + + + + + + + + + + + + + + + + + + + + + +14261 + +Item.java +file + + + + +2009-10-23T16:32:26.000000Z +005b82c6cde8cf9922012974f83bc706 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +286 + diff --git a/LoginServer/src/rsca/ls/model/.svn/format b/LoginServer/src/rsca/ls/model/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/model/.svn/text-base/BankItem.java.svn-base b/LoginServer/src/rsca/ls/model/.svn/text-base/BankItem.java.svn-base new file mode 100644 index 0000000..29ad9e6 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/text-base/BankItem.java.svn-base @@ -0,0 +1,7 @@ +package rsca.ls.model; + +public class BankItem extends Item { + public BankItem(int id, int amount) { + super(id, amount); + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/model/.svn/text-base/InvItem.java.svn-base b/LoginServer/src/rsca/ls/model/.svn/text-base/InvItem.java.svn-base new file mode 100644 index 0000000..63dedd9 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/text-base/InvItem.java.svn-base @@ -0,0 +1,14 @@ +package rsca.ls.model; + +public class InvItem extends Item { + private boolean wielded; + + public InvItem(int id, int amount, boolean wielded) { + super(id, amount); + this.wielded = wielded; + } + + public boolean isWielded() { + return wielded; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/model/.svn/text-base/Item.java.svn-base b/LoginServer/src/rsca/ls/model/.svn/text-base/Item.java.svn-base new file mode 100644 index 0000000..03173d4 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/text-base/Item.java.svn-base @@ -0,0 +1,19 @@ +package rsca.ls.model; + +public class Item { + private int amount; + private int id; + + public Item(int id, int amount) { + this.id = id; + this.amount = amount; + } + + public int getAmount() { + return amount; + } + + public int getID() { + return id; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/model/.svn/text-base/PlayerSave.java.svn-base b/LoginServer/src/rsca/ls/model/.svn/text-base/PlayerSave.java.svn-base new file mode 100644 index 0000000..0fb2510 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/text-base/PlayerSave.java.svn-base @@ -0,0 +1,528 @@ +package rsca.ls.model; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; + +import rsca.ls.Server; +import rsca.ls.util.DataConversions; + +public class PlayerSave { + public static final String[] statArray = { "attack", "defense", "strength", "hits", "ranged", "prayer", "magic", "cooking", "woodcut", "fletching", "fishing", "firemaking", "crafting", "smithing", "mining", "herblaw", "agility", "thieving" }; + + public static PlayerSave loadPlayer(long user) { + PlayerSave save = new PlayerSave(user); + ResultSet result; + + try { + result = Server.db.getQuery("SELECT r.*, u.username AS owner_username, u.group_id as gid, u.sub_expires as subexp FROM `rsca2_players` AS r INNER JOIN `users` AS u ON u.id=r.owner WHERE `user`='" + save.getUser() + "'"); + if (!result.next()) { + return save; + } + + int subexp = result.getInt("subexp"); + long now = System.currentTimeMillis() / 1000; + int sowner = result.getInt("owner"); + if (result.getInt("gid") == 8) { + save.setOwner(sowner, Integer.parseInt("5"), result.getLong("subexp")); + } else { + save.setOwner(sowner, result.getInt("group_id"), result.getLong("subexp")); + } + save.setMuted(result.getLong("muted")); + /* + * if(subexp - now < 1) { + * Server.db.updateQuery("UPDATE users SET group_id='4' WHERE `id`='" + * + sowner + "'"); save.setOwner(sowner, 0, + * result.getLong("subexp")); } + */ + + save.setLogin(result.getLong("login_date"), DataConversions.IPToLong(result.getString("login_ip"))); + save.setLocation(result.getInt("x"), result.getInt("y")); + + save.setFatigue(result.getInt("fatigue")); + save.setCombatStyle((byte) result.getInt("combatstyle")); + + save.setPrivacy(result.getInt("block_chat") == 1, result.getInt("block_private") == 1, result.getInt("block_trade") == 1, result.getInt("block_duel") == 1); + save.setSettings(result.getInt("cameraauto") == 1, result.getInt("onemouse") == 1, result.getInt("soundoff") == 1, result.getInt("showroof") == 1, result.getInt("autoscreenshot") == 1, result.getInt("combatwindow") == 1); + + save.setAppearance((byte) result.getInt("haircolour"), (byte) result.getInt("topcolour"), (byte) result.getInt("trousercolour"), (byte) result.getInt("skincolour"), (byte) result.getInt("headsprite"), (byte) result.getInt("bodysprite"), result.getInt("male") == 1, result.getInt("skulled")); + + save.setQuestPoints(result.getInt("quest_points")); + + result = Server.db.getQuery("SELECT * FROM `rsca2_experience` WHERE `user`='" + save.getUser() + "'"); + if (!result.next()) { + return save; + } + for (int i = 0; i < 18; i++) { + save.setExp(i, result.getInt("exp_" + statArray[i])); + } + + result = Server.db.getQuery("SELECT * FROM `rsca2_curstats` WHERE `user`='" + save.getUser() + "'"); + if (!result.next()) { + return save; + } + for (int i = 0; i < 18; i++) { + save.setLvl(i, result.getInt("cur_" + statArray[i])); + } + + result = Server.db.getQuery("SELECT id,amount,wielded FROM `rsca2_invitems` WHERE `user`='" + save.getUser() + "' ORDER BY `slot` ASC"); + while (result.next()) { + save.addInvItem(result.getInt("id"), result.getInt("amount"), result.getInt("wielded") == 1); + } + + result = Server.db.getQuery("SELECT id,amount FROM `rsca2_bank` WHERE `user`='" + save.getUser() + "' ORDER BY `slot` ASC"); + while (result.next()) { + save.addBankItem(result.getInt("id"), result.getInt("amount")); + } + + result = Server.db.getQuery("SELECT friend FROM `rsca2_friends` WHERE `user`='" + save.getUser() + "'"); + while (result.next()) { + save.addFriend(result.getLong("friend")); + } + + result = Server.db.getQuery("SELECT `ignore` FROM `rsca2_ignores` WHERE `user`='" + save.getUser() + "'"); + while (result.next()) { + save.addIgnore(result.getLong("ignore")); + } + result = Server.db.getQuery("SELECT * FROM `rsca2_quests` WHERE `user`='" + save.getUser() + "'"); + while (result.next()) { + save.setQuestStage(result.getInt("id"), result.getInt("stage")); + } + + + } catch (SQLException e) { + Server.error("SQL Exception Loading " + DataConversions.hashToUsername(user) + ": " + e.getMessage()); + } + + return save; + } + private long muted; + private ArrayList bankItems = new ArrayList(); + private boolean blockChat, blockPrivate, blockTrade, blockDuel; + private boolean cameraAuto, oneMouse, soundOff, showRoof, autoScreenshot, combatWindow; + private int combat, skillTotal; + private byte combatStyle; + private long[] exp = new long[18]; + private int fatigue; + private ArrayList friendList = new ArrayList(); + private byte hairColour, topColour, trouserColour, skinColour, headSprite, bodySprite; + + private ArrayList ignoreList = new ArrayList(); + private ArrayList invItems = new ArrayList(); + private long lastUpdate = 0; + private long loginDate, loginIP; + private int[] lvl = new int[18]; + private boolean male; + private int owner, group; + private int questPoints; + private HashMap questStage = new HashMap(); + private long skulled; + private long subExpires; + private long user; + + private int x, y; + + private PlayerSave(long user) { + this.user = user; + } + + public void addBankItem(int id, int amount) { + bankItems.add(new BankItem(id, amount)); + } + + public void addFriend(long friend) { + friendList.add(friend); + } + + public void addIgnore(long friend) { + ignoreList.add(friend); + } + + public void addInvItem(int id, int amount, boolean wielded) { + invItems.add(new InvItem(id, amount, wielded)); + } + + public boolean autoScreenshot() { + return autoScreenshot; + } + + public boolean blockChat() { + return blockChat; + } + + public boolean blockDuel() { + return blockDuel; + } + + public boolean blockPrivate() { + return blockPrivate; + } + + public boolean blockTrade() { + return blockTrade; + } + + public boolean cameraAuto() { + return cameraAuto; + } + + public void clearBankItems() { + bankItems.clear(); + } + + public void clearInvItems() { + invItems.clear(); + } + + public void clearQuestStages() { + questStage.clear(); + } + + public boolean combatWindow() { + return combatWindow; + } + + public int getBankCount() { + return bankItems.size(); + } + + public BankItem getBankItem(int i) { + return bankItems.get(i); + } + + public int getBodySprite() { + return bodySprite; + } + + public byte getCombatStyle() { + return combatStyle; + } + + public long getExp(int i) { + return exp[i]; + } + + public int getFatigue() { + return fatigue; + } + + public long getFriend(int i) { + return friendList.get(i); + } + + public int getFriendCount() { + return friendList.size(); + } + + public int getGroup() { + return group; + } + + public int getHairColour() { + return hairColour; + } + + public int getHeadSprite() { + return headSprite; + } + + public long getIgnore(int i) { + return ignoreList.get(i); + } + + public int getIgnoreCount() { + return ignoreList.size(); + } + + public int getInvCount() { + return invItems.size(); + } + + public InvItem getInvItem(int i) { + return invItems.get(i); + } + + public long getLastIP() { + return loginIP; + } + + public long getLastLogin() { + return loginDate; + } + + public long getLastUpdate() { + return lastUpdate; + } + + public int getOwner() { + return owner; + } + + public int getQuestPoints() { + return questPoints; + } + + public int getQuestStage(int id) { + return questStage.get(id); + } + + public HashMap getQuestStages() { + return questStage; + } + + public int getSkinColour() { + return skinColour; + } + + public long getSkullTime() { + return skulled; + } + + public int getStat(int i) { + return lvl[i]; + } + + public long getSubscriptionExpires() { + return subExpires; + } + + public int getTopColour() { + return topColour; + } + + public int getTrouserColour() { + return trouserColour; + } + + public long getUser() { + return user; + } + + public String getUsername() { + return DataConversions.hashToUsername(user); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public boolean isMale() { + return male; + } + + public boolean oneMouse() { + return oneMouse; + } + + public void removeFriend(long friend) { + friendList.remove(friend); + } + + public void removeIgnore(long friend) { + ignoreList.remove(friend); + } + + public boolean save() { + try { + String query; + + Server.db.updateQuery("DELETE FROM `rsca2_bank` WHERE `user`='" + user + "'"); + if (bankItems.size() > 0) { + query = "INSERT INTO `rsca2_bank`(`user`, `id`, `amount`, `slot`) VALUES"; + int slot = 0; + for (BankItem item : bankItems) { + query += "('" + user + "', '" + item.getID() + "', '" + item.getAmount() + "', '" + (slot++) + "'),"; + } + Server.db.updateQuery(query.substring(0, query.length() - 1)); + } + + Server.db.updateQuery("DELETE FROM `rsca2_invitems` WHERE `user`='" + user + "'"); + + ResultSet result = Server.db.getQuery("Select 1 FROM `rsca2_players` WHERE `user`='" + user + "' AND `owner`='" + owner + "'"); + if (!result.next()) + return false; + + Server.db.updateQuery("UPDATE `rsca2_players` SET `combat`=" + combat + ", skill_total=" + skillTotal + ", `x`=" + x + ", `y`='" + y + "', `fatigue`='" + fatigue + "', `haircolour`=" + hairColour + ", `topcolour`=" + topColour + ", `trousercolour`=" + trouserColour + ", `skincolour`=" + skinColour + ", `headsprite`=" + headSprite + ", `bodysprite`=" + bodySprite + ", `male`=" + (male ? 1 : 0) + ", `skulled`=" + skulled + ", `combatstyle`=" + combatStyle + ", `quest_points`=" + questPoints + " WHERE `user`='" + user + "'"); + + query = "UPDATE `rsca2_experience` SET "; + for (int i = 0; i < 18; i++) + query += "`exp_" + statArray[i] + "`=" + exp[i] + ","; + + Server.db.updateQuery(query.substring(0, query.length() - 1) + " WHERE `user`='" + user + "'"); + + query = "UPDATE `rsca2_curstats` SET "; + for (int i = 0; i < 18; i++) + query += "`cur_" + statArray[i] + "`=" + lvl[i] + ","; + + Server.db.updateQuery(query.substring(0, query.length() - 1) + " WHERE `user`='" + user + "'"); + + if (invItems.size() > 0) { + query = "INSERT INTO `rsca2_invitems`(`user`, `id`, `amount`, `wielded`, `slot`) VALUES"; + int slot = 0; + for (InvItem item : invItems) + query += "('" + user + "', '" + item.getID() + "', '" + item.getAmount() + "', '" + (item.isWielded() ? 1 : 0) + "', '" + (slot++) + "'),"; + + Server.db.updateQuery(query.substring(0, query.length() - 1)); + } + + Server.db.updateQuery("DELETE FROM `rsca2_quests` WHERE `user`='" + user + "'"); + query = "INSERT INTO `rsca2_quests` (`user`, `id`, `stage`) VALUES"; + java.util.Set keys = questStage.keySet(); + for (int id : keys) + query += "('" + user + "', '" + id + "', '" + questStage.get(id) + "'),"; + + Server.db.updateQuery(query.substring(0, query.length() - 1)); + + return true; + } catch (SQLException e) { + Server.error(e); + return false; + } + } + + public void setAppearance(byte hairColour, byte topColour, byte trouserColour, byte skinColour, byte headSprite, byte bodySprite, boolean male, long skulled) { + this.hairColour = hairColour; + this.topColour = topColour; + this.trouserColour = trouserColour; + this.skinColour = skinColour; + this.headSprite = headSprite; + this.bodySprite = bodySprite; + this.male = male; + this.skulled = skulled; + } + + public void setCombatStyle(byte combatStyle) { + this.combatStyle = combatStyle; + } + + public void setExp(int stat, long exp) { + this.exp[stat] = exp; + } + + public void setFatigue(int fatigue) { + this.fatigue = fatigue; + } + + public void setGameSetting(int idx, boolean on) { + switch (idx) { + case 0: + cameraAuto = on; + break; + case 2: + oneMouse = on; + break; + case 3: + soundOff = on; + break; + case 4: + showRoof = on; + break; + case 5: + autoScreenshot = on; + break; + case 6: + combatWindow = on; + break; + } + } + + public void setLastUpdate(long lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public void setLocation(int x, int y) { + this.x = x; + this.y = y; + } + + public void setLogin(long loginDate, long loginIP) { + this.loginDate = loginDate; + this.loginIP = loginIP; + } + + public void setLvl(int stat, int lvl) { + this.lvl[stat] = lvl; + } + + public void setOwner(int owner) { + this.owner = owner; + } + + public void setOwner(int owner, int group, long subExpires) { + this.owner = owner; + this.group = group; + this.subExpires = subExpires; + } + + public void setPrivacy(boolean blockChat, boolean blockPrivate, boolean blockTrade, boolean blockDuel) { + this.blockChat = blockChat; + this.blockPrivate = blockPrivate; + this.blockTrade = blockTrade; + this.blockDuel = blockDuel; + } + + public void setPrivacySetting(int idx, boolean on) { + switch (idx) { + case 0: + blockChat = on; + break; + case 1: + blockPrivate = on; + break; + case 2: + blockTrade = on; + break; + case 3: + blockDuel = on; + break; + } + } + + public void setQuestPoints(int i) { + questPoints = i; + } + + public void setQuestStage(int index, int stage) { + questStage.put(index, stage); + } + + public void setSettings(boolean cameraAuto, boolean oneMouse, boolean soundOff, boolean showRoof, boolean autoScreenshot, boolean combatWindow) { + this.cameraAuto = cameraAuto; + this.oneMouse = oneMouse; + this.soundOff = soundOff; + this.showRoof = showRoof; + this.autoScreenshot = autoScreenshot; + this.combatWindow = combatWindow; + } + + public void setStat(int stat, long exp, int lvl) { + this.exp[stat] = exp; + this.lvl[stat] = lvl; + } + + public void setTotals(int combat, int skillTotal) { + this.combat = combat; + this.skillTotal = skillTotal; + } + + public boolean showRoof() { + return showRoof; + } + + public boolean soundOff() { + return soundOff; + } + + public void setMuted(long muted) { + this.muted = muted; + } + + public long getMuted() { + return muted; + } +} diff --git a/LoginServer/src/rsca/ls/model/.svn/text-base/World.java.svn-base b/LoginServer/src/rsca/ls/model/.svn/text-base/World.java.svn-base new file mode 100644 index 0000000..6348920 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/.svn/text-base/World.java.svn-base @@ -0,0 +1,122 @@ +package rsca.ls.model; + +import java.sql.ResultSet; +import java.util.Collection; +import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.packetbuilder.loginserver.MiscPacketBuilder; +import rsca.ls.util.DataConversions; + +public class World { + private MiscPacketBuilder actionSender = new MiscPacketBuilder(); + private int id = -1; + private TreeMap players = new TreeMap(); + private TreeMap saves = new TreeMap(); + private IoSession session; + + public World(int id, IoSession session) { + this.id = id; + setSession(session); + } + + public void assosiateSave(PlayerSave save) { + saves.put(save.getUser(), save); + } + + public void clearPlayers() { + for (Entry player : getPlayers()) { + long user = player.getKey(); + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().friendLogout(user); + } + System.out.println("Removed " + DataConversions.hashToUsername(user) + " from world " + id); + } + players.clear(); + } + + public MiscPacketBuilder getActionSender() { + return actionSender; + } + + public Collection> getAssosiatedSaves() { + return saves.entrySet(); + } + + public int getID() { + return id; + } + + public Collection> getPlayers() { + return players.entrySet(); + } + + public PlayerSave getSave(long user) { + return saves.get(user); + } + + public IoSession getSession() { + return session; + } + + public boolean hasPlayer(long user) { + return players.containsKey(user); + } + + public void registerPlayer(long user, String ip) { + Server server = Server.getServer(); + ResultSet result; + try { + result = Server.db.getQuery("SELECT owner, block_private FROM `rsca2_players` WHERE `user`='" + user + "'"); + if (!result.next()) { + return; + } + int owner = result.getInt("owner"); + boolean blockPrivate = result.getInt("block_private") == 1; + + result = Server.db.getQuery("SELECT user FROM `rsca2_friends` WHERE `friend`='" + user + "'" + (blockPrivate ? " AND user IN (SELECT friend FROM `rsca2_friends` WHERE `user`='" + user + "')" : "")); + while (result.next()) { + long friend = result.getLong("user"); + World w = server.findWorld(friend); + if (w != null) { + w.getActionSender().friendLogin(friend, user, id); + } + } + long now = (int) (System.currentTimeMillis() / 1000); + Server.db.updateQuery("INSERT INTO `rsca2_logins`(`user`, `time`, `ip`) VALUES('" + user + "', '" + now + "', '" + ip + "')"); + Server.db.updateQuery("UPDATE `rsca2_players` SET login_date=" + now + ", login_ip='" + ip + "' WHERE user='" + user + "'"); + + players.put(user, owner); + System.out.println("Added " + DataConversions.hashToUsername(user) + " to world " + id); + } catch (Exception e) { + Server.error(e); + } + } + + public void setSession(IoSession session) { + this.session = session; + } + + public void unassosiateSave(PlayerSave save) { + saves.remove(save.getUser()); + } + + public void unregisterPlayer(long user) { + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().friendLogout(user); + } + players.remove(user); + System.out.println("Removed " + DataConversions.hashToUsername(user) + " from world " + id); + + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET online=0 WHERE user='" + user + "'"); + } catch (Exception e) { + Server.error(e); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/model/BankItem.java b/LoginServer/src/rsca/ls/model/BankItem.java new file mode 100644 index 0000000..29ad9e6 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/BankItem.java @@ -0,0 +1,7 @@ +package rsca.ls.model; + +public class BankItem extends Item { + public BankItem(int id, int amount) { + super(id, amount); + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/model/InvItem.java b/LoginServer/src/rsca/ls/model/InvItem.java new file mode 100644 index 0000000..63dedd9 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/InvItem.java @@ -0,0 +1,14 @@ +package rsca.ls.model; + +public class InvItem extends Item { + private boolean wielded; + + public InvItem(int id, int amount, boolean wielded) { + super(id, amount); + this.wielded = wielded; + } + + public boolean isWielded() { + return wielded; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/model/Item.java b/LoginServer/src/rsca/ls/model/Item.java new file mode 100644 index 0000000..03173d4 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/Item.java @@ -0,0 +1,19 @@ +package rsca.ls.model; + +public class Item { + private int amount; + private int id; + + public Item(int id, int amount) { + this.id = id; + this.amount = amount; + } + + public int getAmount() { + return amount; + } + + public int getID() { + return id; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/model/PlayerSave.java b/LoginServer/src/rsca/ls/model/PlayerSave.java new file mode 100644 index 0000000..2178014 --- /dev/null +++ b/LoginServer/src/rsca/ls/model/PlayerSave.java @@ -0,0 +1,544 @@ +package rsca.ls.model; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; + +import rsca.ls.Server; +import rsca.ls.util.DataConversions; + +public class PlayerSave { + public static final String[] statArray = { "attack", "defense", "strength", + "hits", "ranged", "prayer", "magic", "cooking", "woodcut", "fletching", "fishing", + "firemaking", "crafting", "smithing", "mining", "herblaw", "agility", "thieving" }; + + public static PlayerSave loadPlayer(long user) { + PlayerSave save = new PlayerSave(user); + ResultSet result; + + try { + result = Server.db.getQuery("SELECT r.*, u.username AS owner_username, u.group_id as gid, u.sub_expires as subexp FROM `pk_players` AS r INNER JOIN `users` AS u ON u.id=r.owner WHERE `user`='" + save.getUser() + "'"); + if (!result.next()) { + return save; + } + + long eventcd = result.getLong("eventcd"); + int subexp = result.getInt("subexp"); + long now = System.currentTimeMillis() / 1000; + int sowner = result.getInt("owner"); + if (result.getInt("gid") == 8) { + save.setOwner(sowner, Integer.parseInt("5"), result.getLong("subexp")); + } else { + save.setOwner(sowner, result.getInt("group_id"), result.getLong("subexp")); + } + save.setMuted(result.getLong("muted")); + /* + * if(subexp - now < 1) { + * Server.db.updateQuery("UPDATE users SET group_id='4' WHERE `id`='" + * + sowner + "'"); save.setOwner(sowner, 0, + * result.getLong("subexp")); } + */ + + save.setLogin(result.getLong("login_date"), DataConversions.IPToLong(result.getString("login_ip"))); + save.setLocation(result.getInt("x"), result.getInt("y")); + + save.setFatigue(result.getInt("fatigue")); + save.setCombatStyle((byte) result.getInt("combatstyle")); + + save.setPrivacy(result.getInt("block_chat") == 1, result.getInt("block_private") == 1, result.getInt("block_trade") == 1, result.getInt("block_duel") == 1); + save.setSettings(result.getInt("cameraauto") == 1, result.getInt("onemouse") == 1, result.getInt("soundoff") == 1, result.getInt("showroof") == 1, result.getInt("autoscreenshot") == 1, result.getInt("combatwindow") == 1); + + save.setAppearance((byte) result.getInt("haircolour"), (byte) result.getInt("topcolour"), (byte) result.getInt("trousercolour"), (byte) result.getInt("skincolour"), (byte) result.getInt("headsprite"), (byte) result.getInt("bodysprite"), result.getInt("male") == 1, result.getInt("skulled")); + + save.setQuestPoints(result.getInt("quest_points")); + + + result = Server.db.getQuery("SELECT * FROM `pk_experience` WHERE `user`='" + save.getUser() + "'"); + if (!result.next()) { + return save; + } + for (int i = 0; i < 18; i++) { + save.setExp(i, result.getInt("exp_" + statArray[i])); + } + + result = Server.db.getQuery("SELECT * FROM `pk_curstats` WHERE `user`='" + save.getUser() + "'"); + if (!result.next()) { + return save; + } + for (int i = 0; i < 18; i++) { + save.setLvl(i, result.getInt("cur_" + statArray[i])); + } + + result = Server.db.getQuery("SELECT id,amount,wielded FROM `pk_invitems` WHERE `user`='" + save.getUser() + "' ORDER BY `slot` ASC"); + while (result.next()) { + save.addInvItem(result.getInt("id"), result.getInt("amount"), result.getInt("wielded") == 1); + } + + result = Server.db.getQuery("SELECT id,amount FROM `pk_bank` WHERE `user`='" + save.getUser() + "' ORDER BY `slot` ASC"); + while (result.next()) { + save.addBankItem(result.getInt("id"), result.getInt("amount")); + } + + result = Server.db.getQuery("SELECT friend FROM `pk_friends` WHERE `user`='" + save.getUser() + "'"); + while (result.next()) { + save.addFriend(result.getLong("friend")); + } + + result = Server.db.getQuery("SELECT `ignore` FROM `pk_ignores` WHERE `user`='" + save.getUser() + "'"); + while (result.next()) { + save.addIgnore(result.getLong("ignore")); + } + result = Server.db.getQuery("SELECT * FROM `pk_quests` WHERE `user`='" + save.getUser() + "'"); + while (result.next()) { + save.setQuestStage(result.getInt("id"), result.getInt("stage")); + } + save.setEventCD(eventcd); + + + } catch (SQLException e) { + Server.error("SQL Exception Loading " + DataConversions.hashToUsername(user) + ": " + e.getMessage()); + } + + return save; + } + private long eventcd = 0; + private long muted; + private ArrayList bankItems = new ArrayList(); + private boolean blockChat, blockPrivate, blockTrade, blockDuel; + private boolean cameraAuto, oneMouse, soundOff, showRoof, autoScreenshot, combatWindow; + private int combat, skillTotal; + private byte combatStyle; + private long[] exp = new long[18]; + private int fatigue; + private ArrayList friendList = new ArrayList(); + private byte hairColour, topColour, trouserColour, skinColour, headSprite, bodySprite; + + private ArrayList ignoreList = new ArrayList(); + private ArrayList invItems = new ArrayList(); + private long lastUpdate = 0; + private long loginDate, loginIP; + private int[] lvl = new int[18]; + private boolean male; + private int owner, group; + private int questPoints; + private HashMap questStage = new HashMap(); + private long skulled; + private long subExpires; + private long user; + + private int x, y; + + private PlayerSave(long user) { + this.user = user; + } + + public void addBankItem(int id, int amount) { + bankItems.add(new BankItem(id, amount)); + } + + public void addFriend(long friend) { + friendList.add(friend); + } + + public void addIgnore(long friend) { + ignoreList.add(friend); + } + + public void addInvItem(int id, int amount, boolean wielded) { + invItems.add(new InvItem(id, amount, wielded)); + } + + public boolean autoScreenshot() { + return autoScreenshot; + } + + public boolean blockChat() { + return blockChat; + } + + public boolean blockDuel() { + return blockDuel; + } + + public boolean blockPrivate() { + return blockPrivate; + } + + public boolean blockTrade() { + return blockTrade; + } + + public boolean cameraAuto() { + return cameraAuto; + } + + public void clearBankItems() { + bankItems.clear(); + } + + public void clearInvItems() { + invItems.clear(); + } + + public void clearQuestStages() { + questStage.clear(); + } + + public boolean combatWindow() { + return combatWindow; + } + + public int getBankCount() { + return bankItems.size(); + } + + public BankItem getBankItem(int i) { + return bankItems.get(i); + } + + public int getBodySprite() { + return bodySprite; + } + + public byte getCombatStyle() { + return combatStyle; + } + + public long getExp(int i) { + return exp[i]; + } + + public int getFatigue() { + return fatigue; + } + + public long getFriend(int i) { + return friendList.get(i); + } + + public int getFriendCount() { + return friendList.size(); + } + + public int getGroup() { + return group; + } + + public int getHairColour() { + return hairColour; + } + + public int getHeadSprite() { + return headSprite; + } + + public long getIgnore(int i) { + return ignoreList.get(i); + } + + public int getIgnoreCount() { + return ignoreList.size(); + } + + public int getInvCount() { + return invItems.size(); + } + + public InvItem getInvItem(int i) { + return invItems.get(i); + } + + public long getLastIP() { + return loginIP; + } + + public long getLastLogin() { + return loginDate; + } + + public long getLastUpdate() { + return lastUpdate; + } + + public int getOwner() { + return owner; + } + + public int getQuestPoints() { + return questPoints; + } + + public int getQuestStage(int id) { + return questStage.get(id); + } + + public HashMap getQuestStages() { + return questStage; + } + + public int getSkinColour() { + return skinColour; + } + + public long getSkullTime() { + return skulled; + } + + public int getStat(int i) { + return lvl[i]; + } + + public long getSubscriptionExpires() { + return subExpires; + } + + public int getTopColour() { + return topColour; + } + + public int getTrouserColour() { + return trouserColour; + } + + public long getUser() { + return user; + } + + public String getUsername() { + return DataConversions.hashToUsername(user); + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public boolean isMale() { + return male; + } + + public boolean oneMouse() { + return oneMouse; + } + + public void removeFriend(long friend) { + friendList.remove(friend); + } + + public void removeIgnore(long friend) { + ignoreList.remove(friend); + } + + public boolean save() { + try { + String query; + + Server.db.updateQuery("DELETE FROM `pk_bank` WHERE `user`='" + user + "'"); + if (bankItems.size() > 0) { + query = "INSERT INTO `pk_bank`(`user`, `id`, `amount`, `slot`) VALUES"; + int slot = 0; + for (BankItem item : bankItems) { + query += "('" + user + "', '" + item.getID() + "', '" + item.getAmount() + "', '" + (slot++) + "'),"; + } + Server.db.updateQuery(query.substring(0, query.length() - 1)); + } + + Server.db.updateQuery("DELETE FROM `pk_invitems` WHERE `user`='" + user + "'"); + + ResultSet result = Server.db.getQuery("Select 1 FROM `pk_players` WHERE `user`='" + user + "' AND `owner`='" + owner + "'"); + if (!result.next()) + return false; + + Server.db.updateQuery("UPDATE `pk_players` SET `combat`=" + combat + ", skill_total=" + skillTotal + ", `x`=" + x + ", `y`='" + y + "', `fatigue`='" + fatigue + "', `haircolour`=" + hairColour + ", `topcolour`=" + topColour + ", `trousercolour`=" + trouserColour + ", `skincolour`=" + skinColour + ", `headsprite`=" + headSprite + ", `bodysprite`=" + bodySprite + ", `male`=" + (male ? 1 : 0) + ", `skulled`=" + skulled + ", `combatstyle`=" + combatStyle + ", `quest_points`=" + questPoints + " WHERE `user`='" + user + "'"); + + query = "UPDATE `pk_experience` SET "; + for (int i = 0; i < 18; i++) + query += "`exp_" + statArray[i] + "`=" + exp[i] + ","; + + Server.db.updateQuery(query.substring(0, query.length() - 1) + " WHERE `user`='" + user + "'"); + + query = "UPDATE `pk_curstats` SET "; + for (int i = 0; i < 18; i++) + query += "`cur_" + statArray[i] + "`=" + lvl[i] + ","; + + Server.db.updateQuery(query.substring(0, query.length() - 1) + " WHERE `user`='" + user + "'"); + + if (invItems.size() > 0) { + query = "INSERT INTO `pk_invitems`(`user`, `id`, `amount`, `wielded`, `slot`) VALUES"; + int slot = 0; + for (InvItem item : invItems) + query += "('" + user + "', '" + item.getID() + "', '" + item.getAmount() + "', '" + (item.isWielded() ? 1 : 0) + "', '" + (slot++) + "'),"; + + Server.db.updateQuery(query.substring(0, query.length() - 1)); + } + + Server.db.updateQuery("DELETE FROM `pk_quests` WHERE `user`='" + user + "'"); + query = "INSERT INTO `pk_quests` (`user`, `id`, `stage`) VALUES"; + java.util.Set keys = questStage.keySet(); + for (int id : keys) + query += "('" + user + "', '" + id + "', '" + questStage.get(id) + "'),"; + + Server.db.updateQuery(query.substring(0, query.length() - 1)); + + Server.db.updateQuery("UPDATE `pk_players` SET eventcd='" + getEventCD() + "' WHERE user='" + user + "'"); + + return true; + } catch (SQLException e) { + Server.error(e); + return false; + } + } + + public void setAppearance(byte hairColour, byte topColour, byte trouserColour, byte skinColour, byte headSprite, byte bodySprite, boolean male, long skulled) { + this.hairColour = hairColour; + this.topColour = topColour; + this.trouserColour = trouserColour; + this.skinColour = skinColour; + this.headSprite = headSprite; + this.bodySprite = bodySprite; + this.male = male; + this.skulled = skulled; + } + + public void setCombatStyle(byte combatStyle) { + this.combatStyle = combatStyle; + } + + public void setExp(int stat, long exp) { + this.exp[stat] = exp; + } + + public void setFatigue(int fatigue) { + this.fatigue = fatigue; + } + + public void setEventCD(long eventcd) { + this.eventcd = eventcd; + } + + public long getEventCD() { + return eventcd; + } + + public void setGameSetting(int idx, boolean on) { + switch (idx) { + case 0: + cameraAuto = on; + break; + case 2: + oneMouse = on; + break; + case 3: + soundOff = on; + break; + case 4: + showRoof = on; + break; + case 5: + autoScreenshot = on; + break; + case 6: + combatWindow = on; + break; + } + } + + public void setLastUpdate(long lastUpdate) { + this.lastUpdate = lastUpdate; + } + + public void setLocation(int x, int y) { + this.x = x; + this.y = y; + } + + public void setLogin(long loginDate, long loginIP) { + this.loginDate = loginDate; + this.loginIP = loginIP; + } + + public void setLvl(int stat, int lvl) { + this.lvl[stat] = lvl; + } + + public void setOwner(int owner) { + this.owner = owner; + } + + public void setOwner(int owner, int group, long subExpires) { + this.owner = owner; + this.group = group; + this.subExpires = subExpires; + } + + public void setPrivacy(boolean blockChat, boolean blockPrivate, boolean blockTrade, boolean blockDuel) { + this.blockChat = blockChat; + this.blockPrivate = blockPrivate; + this.blockTrade = blockTrade; + this.blockDuel = blockDuel; + } + + public void setPrivacySetting(int idx, boolean on) { + switch (idx) { + case 0: + blockChat = on; + break; + case 1: + blockPrivate = on; + break; + case 2: + blockTrade = on; + break; + case 3: + blockDuel = on; + break; + } + } + + public void setQuestPoints(int i) { + questPoints = i; + } + + public void setQuestStage(int index, int stage) { + questStage.put(index, stage); + } + + public void setSettings(boolean cameraAuto, boolean oneMouse, boolean soundOff, boolean showRoof, boolean autoScreenshot, boolean combatWindow) { + this.cameraAuto = cameraAuto; + this.oneMouse = oneMouse; + this.soundOff = soundOff; + this.showRoof = showRoof; + this.autoScreenshot = autoScreenshot; + this.combatWindow = combatWindow; + } + + public void setStat(int stat, long exp, int lvl) { + this.exp[stat] = exp; + this.lvl[stat] = lvl; + } + + public void setTotals(int combat, int skillTotal) { + this.combat = combat; + this.skillTotal = skillTotal; + } + + public boolean showRoof() { + return showRoof; + } + + public boolean soundOff() { + return soundOff; + } + + public void setMuted(long muted) { + this.muted = muted; + } + + public long getMuted() { + return muted; + } +} diff --git a/LoginServer/src/rsca/ls/model/World.java b/LoginServer/src/rsca/ls/model/World.java new file mode 100644 index 0000000..2cc624b --- /dev/null +++ b/LoginServer/src/rsca/ls/model/World.java @@ -0,0 +1,122 @@ +package rsca.ls.model; + +import java.sql.ResultSet; +import java.util.Collection; +import java.util.TreeMap; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.packetbuilder.loginserver.MiscPacketBuilder; +import rsca.ls.util.DataConversions; + +public class World { + private MiscPacketBuilder actionSender = new MiscPacketBuilder(); + private int id = -1; + private TreeMap players = new TreeMap(); + private TreeMap saves = new TreeMap(); + private IoSession session; + + public World(int id, IoSession session) { + this.id = id; + setSession(session); + } + + public void assosiateSave(PlayerSave save) { + saves.put(save.getUser(), save); + } + + public void clearPlayers() { + for (Entry player : getPlayers()) { + long user = player.getKey(); + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().friendLogout(user); + } + System.out.println("Removed " + DataConversions.hashToUsername(user) + " from world " + id); + } + players.clear(); + } + + public MiscPacketBuilder getActionSender() { + return actionSender; + } + + public Collection> getAssosiatedSaves() { + return saves.entrySet(); + } + + public int getID() { + return id; + } + + public Collection> getPlayers() { + return players.entrySet(); + } + + public PlayerSave getSave(long user) { + return saves.get(user); + } + + public IoSession getSession() { + return session; + } + + public boolean hasPlayer(long user) { + return players.containsKey(user); + } + + public void registerPlayer(long user, String ip) { + Server server = Server.getServer(); + ResultSet result; + try { + result = Server.db.getQuery("SELECT owner, block_private FROM `pk_players` WHERE `user`='" + user + "'"); + if (!result.next()) { + return; + } + int owner = result.getInt("owner"); + boolean blockPrivate = result.getInt("block_private") == 1; + + result = Server.db.getQuery("SELECT user FROM `pk_friends` WHERE `friend`='" + user + "'" + (blockPrivate ? " AND user IN (SELECT friend FROM `pk_friends` WHERE `user`='" + user + "')" : "")); + while (result.next()) { + long friend = result.getLong("user"); + World w = server.findWorld(friend); + if (w != null) { + w.getActionSender().friendLogin(friend, user, id); + } + } + long now = (int) (System.currentTimeMillis() / 1000); + Server.db.updateQuery("INSERT INTO `pk_logins`(`user`, `time`, `ip`) VALUES('" + user + "', '" + now + "', '" + ip + "')"); + Server.db.updateQuery("UPDATE `pk_players` SET login_date=" + now + ", login_ip='" + ip + "' WHERE user='" + user + "'"); + + players.put(user, owner); + System.out.println("Added " + DataConversions.hashToUsername(user) + " to world " + id); + } catch (Exception e) { + Server.error(e); + } + } + + public void setSession(IoSession session) { + this.session = session; + } + + public void unassosiateSave(PlayerSave save) { + saves.remove(save.getUser()); + } + + public void unregisterPlayer(long user) { + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().friendLogout(user); + } + players.remove(user); + System.out.println("Removed " + DataConversions.hashToUsername(user) + " from world " + id); + + try { + Server.db.updateQuery("UPDATE `pk_players` SET online=0 WHERE user='" + user + "'"); + } catch (Exception e) { + Server.error(e); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/net/.svn/entries b/LoginServer/src/rsca/ls/net/.svn/entries new file mode 100644 index 0000000..6dc1793 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/entries @@ -0,0 +1,266 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/net +svn://localhost + + + +2009-09-05T12:50:46.724777Z +203 +xEnt + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +FConnectionHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +bc3bb503bd00cac88d4dab18247ed033 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2956 + +DatabaseConnection.java +file + + + + +2009-10-23T16:32:26.000000Z +8ed2bf87d3cbdf31b56685606c5c6877 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2834 + +LSPacket.java +file + + + + +2009-10-23T16:32:26.000000Z +53ae68299a4e40648108bac714cfc35b +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1050 + +Packet.java +file + + + + +2009-10-23T16:32:26.000000Z +7aa3dd51f57c50639a494e51a3bfc51b +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +6510 + +LSConnectionHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +aa8c591e793c79116dc4ba37b677be3c +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +3218 + +PacketQueue.java +file + + + + +2009-10-23T16:32:26.000000Z +0688a000d769fddc0cd47cdbb70cd61e +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +858 + +FPacket.java +file + + + + +2009-10-23T16:32:26.000000Z +38fe010f331ebf2da24bed71ecba5f3a +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1255 + diff --git a/LoginServer/src/rsca/ls/net/.svn/format b/LoginServer/src/rsca/ls/net/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/DatabaseConnection.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/DatabaseConnection.java.svn-base new file mode 100644 index 0000000..fe7a7e8 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/DatabaseConnection.java.svn-base @@ -0,0 +1,122 @@ +package rsca.ls.net; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import rsca.ls.Server; +import rsca.ls.util.Config; + +/** + * Used to interact with the database. + */ +public class DatabaseConnection { + static { + testForDriver(); + } + + /** + * Tests we have a mysql Driver + */ + private static void testForDriver() { + try { + Class.forName("com.mysql.jdbc.Driver"); + } catch (ClassNotFoundException cnfe) { + Server.error(cnfe); + } + } + + /** + * The database connection in use + */ + private Connection con; + + /** + * The last query being executed + */ + private String lastQuery; + + /** + * A statement for running queries on + */ + private Statement statement; + + /** + * Instantiates a new database connection + */ + public DatabaseConnection() { + if (!createConnection()) { + Server.error(new Exception("Unable to connect to MySQL")); + } + } + + /** + * Closes the database conection. + * + * @throws SQLException + * if there was an error when closing the connection + */ + public void close() throws SQLException { + con.close(); + con = null; + } + + public boolean createConnection() { + try { + con = DriverManager.getConnection("jdbc:mysql://" + Config.MYSQL_HOST + "/" + Config.MYSQL_DB, Config.MYSQL_USER, Config.MYSQL_PASS); + statement = con.createStatement(); + statement.setEscapeProcessing(true); + return isConnected(); + } catch (SQLException e) { + Server.error(e.getMessage()); + return false; + } + } + + /** + * Runs a select query on the current database connection + * + * @param s + * The query to be ran + */ + public synchronized ResultSet getQuery(String q) throws SQLException { + try { + lastQuery = q; + return statement.executeQuery(q); + } catch (SQLException e) { + if (!isConnected() && createConnection()) { + return getQuery(q); + } + throw new SQLException(e.getMessage() + ": '" + lastQuery + "'", e.getSQLState(), e.getErrorCode()); + } + } + + public boolean isConnected() { + try { + statement.executeQuery("SELECT CURRENT_DATE"); + return true; + } catch (SQLException e) { + return false; + } + } + + /** + * Runs a update/insert/replace query on the current database connection + * + * @param s + * The query to be ran + */ + public synchronized int updateQuery(String q) throws SQLException { + try { + lastQuery = q; + return statement.executeUpdate(q); + } catch (SQLException e) { + if (!isConnected() && createConnection()) { + return updateQuery(q); + } + throw new SQLException(e.getMessage() + ": '" + lastQuery + "'", e.getSQLState(), e.getErrorCode()); + } + } +} diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/FConnectionHandler.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/FConnectionHandler.java.svn-base new file mode 100644 index 0000000..a3b0750 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/FConnectionHandler.java.svn-base @@ -0,0 +1,109 @@ +package rsca.ls.net; + +import org.apache.mina.common.IdleStatus; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFilter; + +import rsca.ls.LoginEngine; +import rsca.ls.codec.FCodecFactory; + +/** + * Handles the protocol events fired from MINA. + */ +public class FConnectionHandler implements IoHandler { + /** + * A reference to the login engine + */ + private LoginEngine engine; + + /** + * Creates a new connection handler for the given login engine. + * + * @param engine + * The engine in use + */ + public FConnectionHandler(LoginEngine engine) { + this.engine = engine; + } + + /** + * Invoked whenever an exception is thrown by MINA or this IoHandler. + * + * @param session + * The associated session + * @param cause + * The exception thrown + */ + public void exceptionCaught(IoSession session, Throwable cause) { + } + + /** + * Invoked whenever a packet is ready to be added to the queue. + * + * @param session + * The IO session on which the packet was received + * @param message + * The packet + */ + public void messageReceived(IoSession session, Object message) { + if (session.isClosing()) { + return; + } + engine.getFPacketQueue().add((FPacket) message); + } + + /** + * Invoked whenever a packet is sent. + * + * @param session + * The associated session + * @param message + * The packet sent + */ + public void messageSent(IoSession session, Object message) { + session.close(); + } + + /** + * Invoked whenever an IO session is closed. This must handle unregistering + * the disconnecting world from the engine. + * + * @param session + * The IO session which has been closed + */ + public void sessionClosed(IoSession session) { + } + + /** + * Invoked whenever an IO session is created. + * + * @param session + * The session opened + */ + public void sessionCreated(IoSession session) { + session.getFilterChain().addFirst("protocolFilter", new ProtocolCodecFilter(new FCodecFactory())); + // System.out.println("Connection from: " + + // ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress()); + } + + /** + * Invoked when the idle status of a session changes. + * + * @param session + * The session in question + * @param status + * The new idle status + */ + public void sessionIdle(IoSession session, IdleStatus status) { + } + + /** + * Invoked when a new session is opened. + * + * @param session + * The session opened + */ + public void sessionOpened(IoSession session) { + } +} diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/FPacket.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/FPacket.java.svn-base new file mode 100644 index 0000000..d4bc770 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/FPacket.java.svn-base @@ -0,0 +1,62 @@ +package rsca.ls.net; + +import org.apache.mina.common.IoSession; + +/** + * An immutable packet object. + */ +public final class FPacket extends Packet { + /** + * The headers of the packet + */ + private String[] parameters; + /** + * The ID of the packet + */ + private int pID; + + public FPacket(IoSession session, int pID, String[] parameters) { + this(session, pID, parameters, false); + } + + public FPacket(IoSession session, int pID, String[] parameters, boolean bare) { + super(session, new byte[0], bare); + this.pID = pID; + this.parameters = parameters; + } + + /** + * Returns the amount of parameters + */ + public int countParameters() { + return parameters.length; + } + + /** + * Returns the packet ID. + * + * @return The packet ID + */ + public int getID() { + return pID; + } + + /** + * Returns the parameter list. + * + * @return The parameter list + */ + public String[] getParameters() { + return parameters; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + return super.toString() + " pid = " + pID + " parameter count = " + parameters.length; + } + +} diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/LSConnectionHandler.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/LSConnectionHandler.java.svn-base new file mode 100644 index 0000000..3ed45b7 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/LSConnectionHandler.java.svn-base @@ -0,0 +1,116 @@ +package rsca.ls.net; + +import org.apache.mina.common.IdleStatus; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFilter; + +import rsca.ls.LoginEngine; +import rsca.ls.Server; +import rsca.ls.codec.LSCodecFactory; +import rsca.ls.model.World; + +/** + * Handles the protocol events fired from MINA. + */ +public class LSConnectionHandler implements IoHandler { + /** + * A reference to the login engine + */ + private LoginEngine engine; + + /** + * Creates a new connection handler for the given login engine. + * + * @param engine + * The engine in use + */ + public LSConnectionHandler(LoginEngine engine) { + this.engine = engine; + } + + /** + * Invoked whenever an exception is thrown by MINA or this IoHandler. + * + * @param session + * The associated session + * @param cause + * The exception thrown + */ + public void exceptionCaught(IoSession session, Throwable cause) { + } + + /** + * Invoked whenever a packet is ready to be added to the queue. + * + * @param session + * The IO session on which the packet was received + * @param message + * The packet + */ + public void messageReceived(IoSession session, Object message) { + if (session.isClosing()) { + return; + } + engine.getLSPacketQueue().add((LSPacket) message); + } + + /** + * Invoked whenever a packet is sent. + * + * @param session + * The associated session + * @param message + * The packet sent + */ + public void messageSent(IoSession session, Object message) { + } + + /** + * Invoked whenever an IO session is closed. This must handle unregistering + * the disconnecting world from the engine. + * + * @param session + * The IO session which has been closed + */ + public void sessionClosed(IoSession session) { + World world = (World) session.getAttachment(); + if (world != null) { + Server.getServer().setIdle(world, true); + world.clearPlayers(); + Server.error("Connection to world " + world.getID() + " lost!"); + } + } + + /** + * Invoked whenever an IO session is created. + * + * @param session + * The session opened + */ + public void sessionCreated(IoSession session) { + session.getFilterChain().addFirst("protocolFilter", new ProtocolCodecFilter(new LSCodecFactory())); + // System.out.println("Connection from: " + + // ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress()); + } + + /** + * Invoked when the idle status of a session changes. + * + * @param session + * The session in question + * @param status + * The new idle status + */ + public void sessionIdle(IoSession session, IdleStatus status) { + } + + /** + * Invoked when a new session is opened. + * + * @param session + * The session opened + */ + public void sessionOpened(IoSession session) { + } +} diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/LSPacket.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/LSPacket.java.svn-base new file mode 100644 index 0000000..e286579 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/LSPacket.java.svn-base @@ -0,0 +1,55 @@ +package rsca.ls.net; + +import org.apache.mina.common.IoSession; + +/** + * An immutable packet object. + */ +public final class LSPacket extends Packet { + /** + * The ID of the packet + */ + private int pID; + /** + * The uID of the packet + */ + private long uID; + + public LSPacket(IoSession session, int pID, long uID, byte[] pData) { + this(session, pID, uID, pData, false); + } + + public LSPacket(IoSession session, int pID, long uID, byte[] pData, boolean bare) { + super(session, pData, bare); + this.pID = pID; + this.uID = uID; + } + + /** + * Returns the packet ID. + * + * @return The packet ID + */ + public int getID() { + return pID; + } + + /** + * Returns the unique ID. + * + * @return The unique ID + */ + public long getUID() { + return uID; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + return super.toString() + " pid = " + pID + " uid = " + uID; + } + +} diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/Packet.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/Packet.java.svn-base new file mode 100644 index 0000000..ea3f10a --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/Packet.java.svn-base @@ -0,0 +1,257 @@ +package rsca.ls.net; + +import java.net.InetSocketAddress; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; + +/** + * An immutable packet object. + */ +public class Packet { + /** + * Whether this packet is without the standard packet header + */ + protected boolean bare; + /** + * The current index into the payload buffer for reading + */ + protected int caret = 0; + /** + * The payload + */ + protected byte[] pData; + /** + * The length of the payload + */ + protected int pLength; + /** + * The associated IO session + */ + protected IoSession session; + /** + * The time this packet was created + */ + protected long time; + + /** + * Creates a new packet with the specified parameters. The packet is + * considered not to be a bare packet. + * + * @param session + * The session to associate with the packet + * @param pData + * The payload the packet + */ + public Packet(IoSession session, byte[] pData) { + this(session, pData, false); + } + + /** + * Creates a new packet with the specified parameters. + * + * @param session + * The session to associate with the packet + * @param pData + * The payload of the packet + * @param bare + * Whether this packet is bare, which means that it does not + * include the standard packet header + */ + public Packet(IoSession session, byte[] pData, boolean bare) { + this.session = session; + this.pData = pData; + this.pLength = pData.length; + this.bare = bare; + time = System.currentTimeMillis(); + } + + /** + * Returns the time the packet was created. + * + * @ return the time the packet was created + */ + public long getCreated() { + return time; + } + + /** + * Returns the entire payload data of this packet. + * + * @return The payload byte array + */ + public byte[] getData() { + return pData; + } + + /** + * Returns the length of the payload of this packet. + * + * @return The length of the packet's payload + */ + public int getLength() { + return pLength; + } + + /** + * Returns the remaining payload data of this packet. + * + * @return The payload byte array + */ + public byte[] getRemainingData() { + byte[] data = new byte[pLength - caret]; + for (int i = 0; i < data.length; i++) { + data[i] = pData[i + caret]; + } + caret += data.length; + return data; + + } + + /** + * Returns the IO session associated with the packet, if any. + * + * @return The IoSession object, or null if none. + */ + public IoSession getSession() { + return session; + } + + /** + * Checks if this packet is considered to be a bare packet, which means that + * it does not include the standard packet header (ID and length values). + * + * @return Whether this packet is a bare packet + */ + public boolean isBare() { + return bare; + } + + public String printData() { + if (pLength == 0) { + return ""; + } + String data = ""; + for (int i = 0; i < pLength; i++) { + data += " " + pData[i]; + } + return data.substring(1); + } + + /** + * Reads the next byte from the payload. + * + * @return A byte + */ + public byte readByte() { + return pData[caret++]; + } + + /** + * Returns length of payload data of this packet. + * + * @return The payload byte array + */ + public byte[] readBytes(int length) { + byte[] data = new byte[length]; + try { + for (int i = 0; i < length; i++) { + data[i] = pData[i + caret]; + } + } catch (Exception e) { + Server.error(e.getMessage()); + } + caret += length; + return data; + } + + /** + * Reads the next int from the payload. + * + * @return An int + */ + public int readInt() { + try { + return ((pData[caret++] & 0xff) << 24) | ((pData[caret++] & 0xff) << 16) | ((pData[caret++] & 0xff) << 8) | (pData[caret++] & 0xff); + } catch (Exception e) { + Server.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the next long from the payload. + * + * @return A long + */ + public long readLong() { + try { + return (long) ((long) (pData[caret++] & 0xff) << 56) | ((long) (pData[caret++] & 0xff) << 48) | ((long) (pData[caret++] & 0xff) << 40) | ((long) (pData[caret++] & 0xff) << 32) | ((long) (pData[caret++] & 0xff) << 24) | ((long) (pData[caret++] & 0xff) << 16) | ((long) (pData[caret++] & 0xff) << 8) | ((long) (pData[caret++] & 0xff)); + } catch (Exception e) { + Server.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the next short from the payload. + * + * @return A short + */ + public short readShort() { + try { + return (short) ((short) ((pData[caret++] & 0xff) << 8) | (short) (pData[caret++] & 0xff)); + } catch (Exception e) { + Server.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the string which is formed by the unread portion of the payload. + * + * @return A String + */ + public String readString() { + return readString(pLength - caret); + } + + /** + * Reads a string of the specified length from the payload. + * + * @param length + * The length of the string to be read + * @return A String + */ + public String readString(int length) { + String rv = new String(pData, caret, length); + caret += length; + return rv; + } + + public int remaining() { + return pData.length - caret; + } + + /** + * Skips the specified number of bytes in the payload. + * + * @param x + * The number of bytes to be skipped + */ + public void skip(int x) { + caret += x; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + String origin = session == null ? "this" : ((InetSocketAddress) session.getRemoteAddress()).getAddress().getHostAddress(); + return "origin = " + origin + " length = " + pLength; + } + +} diff --git a/LoginServer/src/rsca/ls/net/.svn/text-base/PacketQueue.java.svn-base b/LoginServer/src/rsca/ls/net/.svn/text-base/PacketQueue.java.svn-base new file mode 100644 index 0000000..e976355 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/.svn/text-base/PacketQueue.java.svn-base @@ -0,0 +1,43 @@ +package rsca.ls.net; + +import java.util.ArrayList; +import java.util.List; + +/** + * Synchronized packet queue + */ +public class PacketQueue { + /** + * The list of packets in the queue + */ + private ArrayList packets = new ArrayList(); + + /** + * Adds a packet to the queue + */ + public void add(T p) { + synchronized (packets) { + packets.add(p); + } + } + + /** + * Returns the packets currently in the list and removes them from the + * backing store + */ + public List getPackets() { + List tmpList; + synchronized (packets) { + tmpList = (List) packets.clone(); + packets.clear(); + } + return tmpList; + } + + /** + * Returns if there is packets to process + */ + public boolean hasPackets() { + return !packets.isEmpty(); + } +} diff --git a/LoginServer/src/rsca/ls/net/DatabaseConnection.java b/LoginServer/src/rsca/ls/net/DatabaseConnection.java new file mode 100644 index 0000000..fe7a7e8 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/DatabaseConnection.java @@ -0,0 +1,122 @@ +package rsca.ls.net; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import rsca.ls.Server; +import rsca.ls.util.Config; + +/** + * Used to interact with the database. + */ +public class DatabaseConnection { + static { + testForDriver(); + } + + /** + * Tests we have a mysql Driver + */ + private static void testForDriver() { + try { + Class.forName("com.mysql.jdbc.Driver"); + } catch (ClassNotFoundException cnfe) { + Server.error(cnfe); + } + } + + /** + * The database connection in use + */ + private Connection con; + + /** + * The last query being executed + */ + private String lastQuery; + + /** + * A statement for running queries on + */ + private Statement statement; + + /** + * Instantiates a new database connection + */ + public DatabaseConnection() { + if (!createConnection()) { + Server.error(new Exception("Unable to connect to MySQL")); + } + } + + /** + * Closes the database conection. + * + * @throws SQLException + * if there was an error when closing the connection + */ + public void close() throws SQLException { + con.close(); + con = null; + } + + public boolean createConnection() { + try { + con = DriverManager.getConnection("jdbc:mysql://" + Config.MYSQL_HOST + "/" + Config.MYSQL_DB, Config.MYSQL_USER, Config.MYSQL_PASS); + statement = con.createStatement(); + statement.setEscapeProcessing(true); + return isConnected(); + } catch (SQLException e) { + Server.error(e.getMessage()); + return false; + } + } + + /** + * Runs a select query on the current database connection + * + * @param s + * The query to be ran + */ + public synchronized ResultSet getQuery(String q) throws SQLException { + try { + lastQuery = q; + return statement.executeQuery(q); + } catch (SQLException e) { + if (!isConnected() && createConnection()) { + return getQuery(q); + } + throw new SQLException(e.getMessage() + ": '" + lastQuery + "'", e.getSQLState(), e.getErrorCode()); + } + } + + public boolean isConnected() { + try { + statement.executeQuery("SELECT CURRENT_DATE"); + return true; + } catch (SQLException e) { + return false; + } + } + + /** + * Runs a update/insert/replace query on the current database connection + * + * @param s + * The query to be ran + */ + public synchronized int updateQuery(String q) throws SQLException { + try { + lastQuery = q; + return statement.executeUpdate(q); + } catch (SQLException e) { + if (!isConnected() && createConnection()) { + return updateQuery(q); + } + throw new SQLException(e.getMessage() + ": '" + lastQuery + "'", e.getSQLState(), e.getErrorCode()); + } + } +} diff --git a/LoginServer/src/rsca/ls/net/FConnectionHandler.java b/LoginServer/src/rsca/ls/net/FConnectionHandler.java new file mode 100644 index 0000000..a3b0750 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/FConnectionHandler.java @@ -0,0 +1,109 @@ +package rsca.ls.net; + +import org.apache.mina.common.IdleStatus; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFilter; + +import rsca.ls.LoginEngine; +import rsca.ls.codec.FCodecFactory; + +/** + * Handles the protocol events fired from MINA. + */ +public class FConnectionHandler implements IoHandler { + /** + * A reference to the login engine + */ + private LoginEngine engine; + + /** + * Creates a new connection handler for the given login engine. + * + * @param engine + * The engine in use + */ + public FConnectionHandler(LoginEngine engine) { + this.engine = engine; + } + + /** + * Invoked whenever an exception is thrown by MINA or this IoHandler. + * + * @param session + * The associated session + * @param cause + * The exception thrown + */ + public void exceptionCaught(IoSession session, Throwable cause) { + } + + /** + * Invoked whenever a packet is ready to be added to the queue. + * + * @param session + * The IO session on which the packet was received + * @param message + * The packet + */ + public void messageReceived(IoSession session, Object message) { + if (session.isClosing()) { + return; + } + engine.getFPacketQueue().add((FPacket) message); + } + + /** + * Invoked whenever a packet is sent. + * + * @param session + * The associated session + * @param message + * The packet sent + */ + public void messageSent(IoSession session, Object message) { + session.close(); + } + + /** + * Invoked whenever an IO session is closed. This must handle unregistering + * the disconnecting world from the engine. + * + * @param session + * The IO session which has been closed + */ + public void sessionClosed(IoSession session) { + } + + /** + * Invoked whenever an IO session is created. + * + * @param session + * The session opened + */ + public void sessionCreated(IoSession session) { + session.getFilterChain().addFirst("protocolFilter", new ProtocolCodecFilter(new FCodecFactory())); + // System.out.println("Connection from: " + + // ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress()); + } + + /** + * Invoked when the idle status of a session changes. + * + * @param session + * The session in question + * @param status + * The new idle status + */ + public void sessionIdle(IoSession session, IdleStatus status) { + } + + /** + * Invoked when a new session is opened. + * + * @param session + * The session opened + */ + public void sessionOpened(IoSession session) { + } +} diff --git a/LoginServer/src/rsca/ls/net/FPacket.java b/LoginServer/src/rsca/ls/net/FPacket.java new file mode 100644 index 0000000..d4bc770 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/FPacket.java @@ -0,0 +1,62 @@ +package rsca.ls.net; + +import org.apache.mina.common.IoSession; + +/** + * An immutable packet object. + */ +public final class FPacket extends Packet { + /** + * The headers of the packet + */ + private String[] parameters; + /** + * The ID of the packet + */ + private int pID; + + public FPacket(IoSession session, int pID, String[] parameters) { + this(session, pID, parameters, false); + } + + public FPacket(IoSession session, int pID, String[] parameters, boolean bare) { + super(session, new byte[0], bare); + this.pID = pID; + this.parameters = parameters; + } + + /** + * Returns the amount of parameters + */ + public int countParameters() { + return parameters.length; + } + + /** + * Returns the packet ID. + * + * @return The packet ID + */ + public int getID() { + return pID; + } + + /** + * Returns the parameter list. + * + * @return The parameter list + */ + public String[] getParameters() { + return parameters; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + return super.toString() + " pid = " + pID + " parameter count = " + parameters.length; + } + +} diff --git a/LoginServer/src/rsca/ls/net/LSConnectionHandler.java b/LoginServer/src/rsca/ls/net/LSConnectionHandler.java new file mode 100644 index 0000000..3ed45b7 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/LSConnectionHandler.java @@ -0,0 +1,116 @@ +package rsca.ls.net; + +import org.apache.mina.common.IdleStatus; +import org.apache.mina.common.IoHandler; +import org.apache.mina.common.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFilter; + +import rsca.ls.LoginEngine; +import rsca.ls.Server; +import rsca.ls.codec.LSCodecFactory; +import rsca.ls.model.World; + +/** + * Handles the protocol events fired from MINA. + */ +public class LSConnectionHandler implements IoHandler { + /** + * A reference to the login engine + */ + private LoginEngine engine; + + /** + * Creates a new connection handler for the given login engine. + * + * @param engine + * The engine in use + */ + public LSConnectionHandler(LoginEngine engine) { + this.engine = engine; + } + + /** + * Invoked whenever an exception is thrown by MINA or this IoHandler. + * + * @param session + * The associated session + * @param cause + * The exception thrown + */ + public void exceptionCaught(IoSession session, Throwable cause) { + } + + /** + * Invoked whenever a packet is ready to be added to the queue. + * + * @param session + * The IO session on which the packet was received + * @param message + * The packet + */ + public void messageReceived(IoSession session, Object message) { + if (session.isClosing()) { + return; + } + engine.getLSPacketQueue().add((LSPacket) message); + } + + /** + * Invoked whenever a packet is sent. + * + * @param session + * The associated session + * @param message + * The packet sent + */ + public void messageSent(IoSession session, Object message) { + } + + /** + * Invoked whenever an IO session is closed. This must handle unregistering + * the disconnecting world from the engine. + * + * @param session + * The IO session which has been closed + */ + public void sessionClosed(IoSession session) { + World world = (World) session.getAttachment(); + if (world != null) { + Server.getServer().setIdle(world, true); + world.clearPlayers(); + Server.error("Connection to world " + world.getID() + " lost!"); + } + } + + /** + * Invoked whenever an IO session is created. + * + * @param session + * The session opened + */ + public void sessionCreated(IoSession session) { + session.getFilterChain().addFirst("protocolFilter", new ProtocolCodecFilter(new LSCodecFactory())); + // System.out.println("Connection from: " + + // ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress()); + } + + /** + * Invoked when the idle status of a session changes. + * + * @param session + * The session in question + * @param status + * The new idle status + */ + public void sessionIdle(IoSession session, IdleStatus status) { + } + + /** + * Invoked when a new session is opened. + * + * @param session + * The session opened + */ + public void sessionOpened(IoSession session) { + } +} diff --git a/LoginServer/src/rsca/ls/net/LSPacket.java b/LoginServer/src/rsca/ls/net/LSPacket.java new file mode 100644 index 0000000..e286579 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/LSPacket.java @@ -0,0 +1,55 @@ +package rsca.ls.net; + +import org.apache.mina.common.IoSession; + +/** + * An immutable packet object. + */ +public final class LSPacket extends Packet { + /** + * The ID of the packet + */ + private int pID; + /** + * The uID of the packet + */ + private long uID; + + public LSPacket(IoSession session, int pID, long uID, byte[] pData) { + this(session, pID, uID, pData, false); + } + + public LSPacket(IoSession session, int pID, long uID, byte[] pData, boolean bare) { + super(session, pData, bare); + this.pID = pID; + this.uID = uID; + } + + /** + * Returns the packet ID. + * + * @return The packet ID + */ + public int getID() { + return pID; + } + + /** + * Returns the unique ID. + * + * @return The unique ID + */ + public long getUID() { + return uID; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + return super.toString() + " pid = " + pID + " uid = " + uID; + } + +} diff --git a/LoginServer/src/rsca/ls/net/Packet.java b/LoginServer/src/rsca/ls/net/Packet.java new file mode 100644 index 0000000..ea3f10a --- /dev/null +++ b/LoginServer/src/rsca/ls/net/Packet.java @@ -0,0 +1,257 @@ +package rsca.ls.net; + +import java.net.InetSocketAddress; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; + +/** + * An immutable packet object. + */ +public class Packet { + /** + * Whether this packet is without the standard packet header + */ + protected boolean bare; + /** + * The current index into the payload buffer for reading + */ + protected int caret = 0; + /** + * The payload + */ + protected byte[] pData; + /** + * The length of the payload + */ + protected int pLength; + /** + * The associated IO session + */ + protected IoSession session; + /** + * The time this packet was created + */ + protected long time; + + /** + * Creates a new packet with the specified parameters. The packet is + * considered not to be a bare packet. + * + * @param session + * The session to associate with the packet + * @param pData + * The payload the packet + */ + public Packet(IoSession session, byte[] pData) { + this(session, pData, false); + } + + /** + * Creates a new packet with the specified parameters. + * + * @param session + * The session to associate with the packet + * @param pData + * The payload of the packet + * @param bare + * Whether this packet is bare, which means that it does not + * include the standard packet header + */ + public Packet(IoSession session, byte[] pData, boolean bare) { + this.session = session; + this.pData = pData; + this.pLength = pData.length; + this.bare = bare; + time = System.currentTimeMillis(); + } + + /** + * Returns the time the packet was created. + * + * @ return the time the packet was created + */ + public long getCreated() { + return time; + } + + /** + * Returns the entire payload data of this packet. + * + * @return The payload byte array + */ + public byte[] getData() { + return pData; + } + + /** + * Returns the length of the payload of this packet. + * + * @return The length of the packet's payload + */ + public int getLength() { + return pLength; + } + + /** + * Returns the remaining payload data of this packet. + * + * @return The payload byte array + */ + public byte[] getRemainingData() { + byte[] data = new byte[pLength - caret]; + for (int i = 0; i < data.length; i++) { + data[i] = pData[i + caret]; + } + caret += data.length; + return data; + + } + + /** + * Returns the IO session associated with the packet, if any. + * + * @return The IoSession object, or null if none. + */ + public IoSession getSession() { + return session; + } + + /** + * Checks if this packet is considered to be a bare packet, which means that + * it does not include the standard packet header (ID and length values). + * + * @return Whether this packet is a bare packet + */ + public boolean isBare() { + return bare; + } + + public String printData() { + if (pLength == 0) { + return ""; + } + String data = ""; + for (int i = 0; i < pLength; i++) { + data += " " + pData[i]; + } + return data.substring(1); + } + + /** + * Reads the next byte from the payload. + * + * @return A byte + */ + public byte readByte() { + return pData[caret++]; + } + + /** + * Returns length of payload data of this packet. + * + * @return The payload byte array + */ + public byte[] readBytes(int length) { + byte[] data = new byte[length]; + try { + for (int i = 0; i < length; i++) { + data[i] = pData[i + caret]; + } + } catch (Exception e) { + Server.error(e.getMessage()); + } + caret += length; + return data; + } + + /** + * Reads the next int from the payload. + * + * @return An int + */ + public int readInt() { + try { + return ((pData[caret++] & 0xff) << 24) | ((pData[caret++] & 0xff) << 16) | ((pData[caret++] & 0xff) << 8) | (pData[caret++] & 0xff); + } catch (Exception e) { + Server.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the next long from the payload. + * + * @return A long + */ + public long readLong() { + try { + return (long) ((long) (pData[caret++] & 0xff) << 56) | ((long) (pData[caret++] & 0xff) << 48) | ((long) (pData[caret++] & 0xff) << 40) | ((long) (pData[caret++] & 0xff) << 32) | ((long) (pData[caret++] & 0xff) << 24) | ((long) (pData[caret++] & 0xff) << 16) | ((long) (pData[caret++] & 0xff) << 8) | ((long) (pData[caret++] & 0xff)); + } catch (Exception e) { + Server.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the next short from the payload. + * + * @return A short + */ + public short readShort() { + try { + return (short) ((short) ((pData[caret++] & 0xff) << 8) | (short) (pData[caret++] & 0xff)); + } catch (Exception e) { + Server.error(e.getMessage()); + return 0; + } + } + + /** + * Reads the string which is formed by the unread portion of the payload. + * + * @return A String + */ + public String readString() { + return readString(pLength - caret); + } + + /** + * Reads a string of the specified length from the payload. + * + * @param length + * The length of the string to be read + * @return A String + */ + public String readString(int length) { + String rv = new String(pData, caret, length); + caret += length; + return rv; + } + + public int remaining() { + return pData.length - caret; + } + + /** + * Skips the specified number of bytes in the payload. + * + * @param x + * The number of bytes to be skipped + */ + public void skip(int x) { + caret += x; + } + + /** + * Returns this packet in string form. + * + * @return A String representing this packet + */ + public String toString() { + String origin = session == null ? "this" : ((InetSocketAddress) session.getRemoteAddress()).getAddress().getHostAddress(); + return "origin = " + origin + " length = " + pLength; + } + +} diff --git a/LoginServer/src/rsca/ls/net/PacketQueue.java b/LoginServer/src/rsca/ls/net/PacketQueue.java new file mode 100644 index 0000000..e976355 --- /dev/null +++ b/LoginServer/src/rsca/ls/net/PacketQueue.java @@ -0,0 +1,43 @@ +package rsca.ls.net; + +import java.util.ArrayList; +import java.util.List; + +/** + * Synchronized packet queue + */ +public class PacketQueue { + /** + * The list of packets in the queue + */ + private ArrayList packets = new ArrayList(); + + /** + * Adds a packet to the queue + */ + public void add(T p) { + synchronized (packets) { + packets.add(p); + } + } + + /** + * Returns the packets currently in the list and removes them from the + * backing store + */ + public List getPackets() { + List tmpList; + synchronized (packets) { + tmpList = (List) packets.clone(); + packets.clear(); + } + return tmpList; + } + + /** + * Returns if there is packets to process + */ + public boolean hasPackets() { + return !packets.isEmpty(); + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/.svn/entries b/LoginServer/src/rsca/ls/packetbuilder/.svn/entries new file mode 100644 index 0000000..b055f3c --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/.svn/entries @@ -0,0 +1,136 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/packetbuilder +svn://localhost + + + +2009-10-02T12:11:17.749143Z +285 +Pets + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +frontend +dir + +loginserver +dir + +FPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +b4d333c6a581f32a27e5b2dc664cf445 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1024 + +StaticPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +a85f2bd1cf468b53e16836616def3e06 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +7379 + +LSPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +1554c1eaec57dd1bb8d138bf0a98be65 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1541 + diff --git a/LoginServer/src/rsca/ls/packetbuilder/.svn/format b/LoginServer/src/rsca/ls/packetbuilder/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/FPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/FPacketBuilder.java.svn-base new file mode 100644 index 0000000..8b24044 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/FPacketBuilder.java.svn-base @@ -0,0 +1,47 @@ +package rsca.ls.packetbuilder; + +import rsca.ls.net.FPacket; + +public class FPacketBuilder extends StaticPacketBuilder { + /** + * The headers of the packet + */ + private String[] parameters = new String[0]; + /** + * ID of the packet + */ + private int pID = 0; + + /** + * Sets the ID for this packet. + * + * @param id + * The ID of the packet + */ + public FPacketBuilder setID(int pID) { + this.pID = pID; + return this; + } + + /** + * Sets the parameters for this packet. + * + * @param id + * The parameters of the packet + */ + public FPacketBuilder setParameters(String[] parameters) { + this.parameters = parameters; + return this; + } + + /** + * Returns a FPacket object for the data contained in this + * builder. + * + * @return A FPacket object + */ + public FPacket toPacket() { + return new FPacket(null, pID, parameters, bare); + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/LSPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/LSPacketBuilder.java.svn-base new file mode 100644 index 0000000..8c9fde2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/LSPacketBuilder.java.svn-base @@ -0,0 +1,69 @@ +package rsca.ls.packetbuilder; + +import java.util.Random; + +import rsca.ls.LoginEngine; +import rsca.ls.net.LSPacket; +import rsca.ls.packethandler.PacketHandler; + +public class LSPacketBuilder extends StaticPacketBuilder { + /** + * Random generator + */ + private static Random rand = new Random(); + /** + * ID of the packet + */ + private int pID = 0; + /** + * UID of the packet + */ + private long uID = 0; + + /** + * Sets the handler for this packet. + * + * @param handler + * The handler of the packet + */ + public LSPacketBuilder setHandler(LoginEngine engine, PacketHandler handler) { + uID = rand.nextLong(); + engine.setHandler(uID, handler); + return this; + } + + /** + * Sets the ID for this packet. + * + * @param id + * The ID of the packet + */ + public LSPacketBuilder setID(int pID) { + this.pID = pID; + return this; + } + + /** + * Sets the uID for this packet. + * + * @param id + * The uID of the packet + */ + public LSPacketBuilder setUID(long uID) { + this.uID = uID; + return this; + } + + /** + * Returns a LSPacket object for the data contained in this + * builder. + * + * @return A LSPacket object + */ + public LSPacket toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new LSPacket(null, pID, uID, data, bare); + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/StaticPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/StaticPacketBuilder.java.svn-base new file mode 100644 index 0000000..2c6c8b4 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/.svn/text-base/StaticPacketBuilder.java.svn-base @@ -0,0 +1,254 @@ +package rsca.ls.packetbuilder; + +import rsca.ls.Server; +import rsca.ls.net.Packet; + +/** + * A mutable sequence of bytes used to construct the immutable + * RSCPacket objects. + */ +public class StaticPacketBuilder { + /** + * Bitmasks for addBits() + */ + protected static int bitmasks[] = { 0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, -1 }; + /** + * Default capacity + */ + protected static final int DEFAULT_SIZE = 32; + /** + * Whether this packet does not use the standard packet header + */ + protected boolean bare = false; + /** + * Current index into the buffer by bits + */ + protected int bitPosition = 0; + /** + * Current number of bytes used in the buffer + */ + protected int curLength; + + /** + * The payload buffer + */ + protected byte[] payload; + + /** + * Constructs a packet builder with no data and an initial capacity of + * DEFAULT_SIZE. + * + * @see DEFAULT_SIZE + */ + public StaticPacketBuilder() { + this(DEFAULT_SIZE); + } + + /** + * Constructs a packet builder with no data and an initial capacity of + * capacity. + * + * @param capacity + * The initial capacity of the buffer + */ + public StaticPacketBuilder(int capacity) { + payload = new byte[capacity]; + } + + /** + * TODO needs a proper description. + */ + public StaticPacketBuilder addBits(int value, int numBits) { + int bytePos = bitPosition >> 3; + int bitOffset = 8 - (bitPosition & 7); + bitPosition += numBits; + curLength = (bitPosition + 7) / 8; + ensureCapacity(curLength); + for (; numBits > bitOffset; bitOffset = 8) { + payload[bytePos] &= ~bitmasks[bitOffset]; // mask out the desired + // area + payload[bytePos++] |= (value >> (numBits - bitOffset)) & bitmasks[bitOffset]; + + numBits -= bitOffset; + } + if (numBits == bitOffset) { + payload[bytePos] &= ~bitmasks[bitOffset]; + payload[bytePos] |= value & bitmasks[bitOffset]; + } else { + payload[bytePos] &= ~(bitmasks[numBits] << (bitOffset - numBits)); + payload[bytePos] |= (value & bitmasks[numBits]) << (bitOffset - numBits); + } + return this; + } + + /** + * Adds a byte to the data buffer. The size of this packet will + * grow by one byte. + * + * @param val + * The byte value to add + * @return A reference to this object + */ + public StaticPacketBuilder addByte(byte val) { + return addByte(val, true); + } + + /** + * Adds a byte to the data buffer. The size of this packet will + * grow by one byte. + * + * @param val + * The byte value to add + * @param checkCapacity + * Whether the buffer capacity should be checked + * @return A reference to this object + */ + private StaticPacketBuilder addByte(byte val, boolean checkCapacity) { + if (checkCapacity) + ensureCapacity(curLength + 1); + payload[curLength++] = val; + return this; + } + + /** + * Adds the contents of byte array data to the + * packet. The size of this packet will grow by the length of the provided + * array. + * + * @param data + * The bytes to add to this packet + * @return A reference to this object + */ + public StaticPacketBuilder addBytes(byte[] data) { + return addBytes(data, 0, data.length); + } + + /** + * Adds the contents of byte array data, starting + * at index offset. The size of this packet will grow by + * len bytes. + * + * @param data + * The bytes to add to this packet + * @param offset + * The index of the first byte to append + * @param len + * The number of bytes to append + * @return A reference to this object + */ + public StaticPacketBuilder addBytes(byte[] data, int offset, int len) { + int newLength = curLength + len; + ensureCapacity(newLength); + System.arraycopy(data, offset, payload, curLength, len); + curLength = newLength; + return this; + } + + /** + * Adds a int to the data stream. The size of this packet will + * grow by four bytes. + * + * @param val + * The int value to add + * @return A reference to this object + */ + public StaticPacketBuilder addInt(int val) { + ensureCapacity(curLength + 4); + addByte((byte) (val >> 24), false); + addByte((byte) (val >> 16), false); + addByte((byte) (val >> 8), false); + addByte((byte) val, false); + return this; + } + + /** + * Adds a long to the data stream. The size of this packet will + * grow by eight bytes. + * + * @param val + * The long value to add + * @return A reference to this object + */ + public StaticPacketBuilder addLong(long val) { + addInt((int) (val >> 32)); + addInt((int) (val & -1L)); + return this; + } + + /** + * Adds a short to the data stream. The size of this packet + * will grow by two bytes. + * + * @param val + * The short value to add + * @return A reference to this object + */ + public StaticPacketBuilder addShort(int val) { + ensureCapacity(curLength + 2); + addByte((byte) (val >> 8), false); + addByte((byte) val, false); + return this; + } + + /** + * Ensures that the buffer is at least minimumBytes bytes. + * + * @param minimumCapacity + * The size needed + */ + private void ensureCapacity(int minimumCapacity) { + if (minimumCapacity >= payload.length) + expandCapacity(minimumCapacity); + } + + /** + * Expands the buffer to the specified size. + * + * @param minimumCapacity + * The minimum capacity to which to expand + * @see java.lang.AbstractStringBuilder#expandCapacity(int) + */ + private void expandCapacity(int minimumCapacity) { + int newCapacity = (payload.length + 1) * 2; + if (newCapacity < 0) { + newCapacity = Integer.MAX_VALUE; + } else if (minimumCapacity > newCapacity) { + newCapacity = minimumCapacity; + } + int oldLength = curLength; + if (oldLength > payload.length) { + oldLength = payload.length; + } + byte[] newPayload = new byte[newCapacity]; + try { + System.arraycopy(payload, 0, newPayload, 0, oldLength); + } catch (Exception e) { + Server.error(e); + } + payload = newPayload; + } + + /** + * Sets this packet as bare. A bare packet will contain only the payload + * data, rather than having the standard packet header prepended. + * + * @param bare + * Whether this packet is to be sent bare + */ + public StaticPacketBuilder setBare(boolean bare) { + this.bare = bare; + return this; + } + + /** + * Returns a Packet object for the data contained in this + * builder. + * + * @return A Packet object + */ + public Packet toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new Packet(null, data, bare); + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/FPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/FPacketBuilder.java new file mode 100644 index 0000000..8b24044 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/FPacketBuilder.java @@ -0,0 +1,47 @@ +package rsca.ls.packetbuilder; + +import rsca.ls.net.FPacket; + +public class FPacketBuilder extends StaticPacketBuilder { + /** + * The headers of the packet + */ + private String[] parameters = new String[0]; + /** + * ID of the packet + */ + private int pID = 0; + + /** + * Sets the ID for this packet. + * + * @param id + * The ID of the packet + */ + public FPacketBuilder setID(int pID) { + this.pID = pID; + return this; + } + + /** + * Sets the parameters for this packet. + * + * @param id + * The parameters of the packet + */ + public FPacketBuilder setParameters(String[] parameters) { + this.parameters = parameters; + return this; + } + + /** + * Returns a FPacket object for the data contained in this + * builder. + * + * @return A FPacket object + */ + public FPacket toPacket() { + return new FPacket(null, pID, parameters, bare); + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packetbuilder/LSPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/LSPacketBuilder.java new file mode 100644 index 0000000..8c9fde2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/LSPacketBuilder.java @@ -0,0 +1,69 @@ +package rsca.ls.packetbuilder; + +import java.util.Random; + +import rsca.ls.LoginEngine; +import rsca.ls.net.LSPacket; +import rsca.ls.packethandler.PacketHandler; + +public class LSPacketBuilder extends StaticPacketBuilder { + /** + * Random generator + */ + private static Random rand = new Random(); + /** + * ID of the packet + */ + private int pID = 0; + /** + * UID of the packet + */ + private long uID = 0; + + /** + * Sets the handler for this packet. + * + * @param handler + * The handler of the packet + */ + public LSPacketBuilder setHandler(LoginEngine engine, PacketHandler handler) { + uID = rand.nextLong(); + engine.setHandler(uID, handler); + return this; + } + + /** + * Sets the ID for this packet. + * + * @param id + * The ID of the packet + */ + public LSPacketBuilder setID(int pID) { + this.pID = pID; + return this; + } + + /** + * Sets the uID for this packet. + * + * @param id + * The uID of the packet + */ + public LSPacketBuilder setUID(long uID) { + this.uID = uID; + return this; + } + + /** + * Returns a LSPacket object for the data contained in this + * builder. + * + * @return A LSPacket object + */ + public LSPacket toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new LSPacket(null, pID, uID, data, bare); + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packetbuilder/StaticPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/StaticPacketBuilder.java new file mode 100644 index 0000000..2c6c8b4 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/StaticPacketBuilder.java @@ -0,0 +1,254 @@ +package rsca.ls.packetbuilder; + +import rsca.ls.Server; +import rsca.ls.net.Packet; + +/** + * A mutable sequence of bytes used to construct the immutable + * RSCPacket objects. + */ +public class StaticPacketBuilder { + /** + * Bitmasks for addBits() + */ + protected static int bitmasks[] = { 0, 0x1, 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff, 0x1ff, 0x3ff, 0x7ff, 0xfff, 0x1fff, 0x3fff, 0x7fff, 0xffff, 0x1ffff, 0x3ffff, 0x7ffff, 0xfffff, 0x1fffff, 0x3fffff, 0x7fffff, 0xffffff, 0x1ffffff, 0x3ffffff, 0x7ffffff, 0xfffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff, -1 }; + /** + * Default capacity + */ + protected static final int DEFAULT_SIZE = 32; + /** + * Whether this packet does not use the standard packet header + */ + protected boolean bare = false; + /** + * Current index into the buffer by bits + */ + protected int bitPosition = 0; + /** + * Current number of bytes used in the buffer + */ + protected int curLength; + + /** + * The payload buffer + */ + protected byte[] payload; + + /** + * Constructs a packet builder with no data and an initial capacity of + * DEFAULT_SIZE. + * + * @see DEFAULT_SIZE + */ + public StaticPacketBuilder() { + this(DEFAULT_SIZE); + } + + /** + * Constructs a packet builder with no data and an initial capacity of + * capacity. + * + * @param capacity + * The initial capacity of the buffer + */ + public StaticPacketBuilder(int capacity) { + payload = new byte[capacity]; + } + + /** + * TODO needs a proper description. + */ + public StaticPacketBuilder addBits(int value, int numBits) { + int bytePos = bitPosition >> 3; + int bitOffset = 8 - (bitPosition & 7); + bitPosition += numBits; + curLength = (bitPosition + 7) / 8; + ensureCapacity(curLength); + for (; numBits > bitOffset; bitOffset = 8) { + payload[bytePos] &= ~bitmasks[bitOffset]; // mask out the desired + // area + payload[bytePos++] |= (value >> (numBits - bitOffset)) & bitmasks[bitOffset]; + + numBits -= bitOffset; + } + if (numBits == bitOffset) { + payload[bytePos] &= ~bitmasks[bitOffset]; + payload[bytePos] |= value & bitmasks[bitOffset]; + } else { + payload[bytePos] &= ~(bitmasks[numBits] << (bitOffset - numBits)); + payload[bytePos] |= (value & bitmasks[numBits]) << (bitOffset - numBits); + } + return this; + } + + /** + * Adds a byte to the data buffer. The size of this packet will + * grow by one byte. + * + * @param val + * The byte value to add + * @return A reference to this object + */ + public StaticPacketBuilder addByte(byte val) { + return addByte(val, true); + } + + /** + * Adds a byte to the data buffer. The size of this packet will + * grow by one byte. + * + * @param val + * The byte value to add + * @param checkCapacity + * Whether the buffer capacity should be checked + * @return A reference to this object + */ + private StaticPacketBuilder addByte(byte val, boolean checkCapacity) { + if (checkCapacity) + ensureCapacity(curLength + 1); + payload[curLength++] = val; + return this; + } + + /** + * Adds the contents of byte array data to the + * packet. The size of this packet will grow by the length of the provided + * array. + * + * @param data + * The bytes to add to this packet + * @return A reference to this object + */ + public StaticPacketBuilder addBytes(byte[] data) { + return addBytes(data, 0, data.length); + } + + /** + * Adds the contents of byte array data, starting + * at index offset. The size of this packet will grow by + * len bytes. + * + * @param data + * The bytes to add to this packet + * @param offset + * The index of the first byte to append + * @param len + * The number of bytes to append + * @return A reference to this object + */ + public StaticPacketBuilder addBytes(byte[] data, int offset, int len) { + int newLength = curLength + len; + ensureCapacity(newLength); + System.arraycopy(data, offset, payload, curLength, len); + curLength = newLength; + return this; + } + + /** + * Adds a int to the data stream. The size of this packet will + * grow by four bytes. + * + * @param val + * The int value to add + * @return A reference to this object + */ + public StaticPacketBuilder addInt(int val) { + ensureCapacity(curLength + 4); + addByte((byte) (val >> 24), false); + addByte((byte) (val >> 16), false); + addByte((byte) (val >> 8), false); + addByte((byte) val, false); + return this; + } + + /** + * Adds a long to the data stream. The size of this packet will + * grow by eight bytes. + * + * @param val + * The long value to add + * @return A reference to this object + */ + public StaticPacketBuilder addLong(long val) { + addInt((int) (val >> 32)); + addInt((int) (val & -1L)); + return this; + } + + /** + * Adds a short to the data stream. The size of this packet + * will grow by two bytes. + * + * @param val + * The short value to add + * @return A reference to this object + */ + public StaticPacketBuilder addShort(int val) { + ensureCapacity(curLength + 2); + addByte((byte) (val >> 8), false); + addByte((byte) val, false); + return this; + } + + /** + * Ensures that the buffer is at least minimumBytes bytes. + * + * @param minimumCapacity + * The size needed + */ + private void ensureCapacity(int minimumCapacity) { + if (minimumCapacity >= payload.length) + expandCapacity(minimumCapacity); + } + + /** + * Expands the buffer to the specified size. + * + * @param minimumCapacity + * The minimum capacity to which to expand + * @see java.lang.AbstractStringBuilder#expandCapacity(int) + */ + private void expandCapacity(int minimumCapacity) { + int newCapacity = (payload.length + 1) * 2; + if (newCapacity < 0) { + newCapacity = Integer.MAX_VALUE; + } else if (minimumCapacity > newCapacity) { + newCapacity = minimumCapacity; + } + int oldLength = curLength; + if (oldLength > payload.length) { + oldLength = payload.length; + } + byte[] newPayload = new byte[newCapacity]; + try { + System.arraycopy(payload, 0, newPayload, 0, oldLength); + } catch (Exception e) { + Server.error(e); + } + payload = newPayload; + } + + /** + * Sets this packet as bare. A bare packet will contain only the payload + * data, rather than having the standard packet header prepended. + * + * @param bare + * Whether this packet is to be sent bare + */ + public StaticPacketBuilder setBare(boolean bare) { + this.bare = bare; + return this; + } + + /** + * Returns a Packet object for the data contained in this + * builder. + * + * @return A Packet object + */ + public Packet toPacket() { + byte[] data = new byte[curLength]; + System.arraycopy(payload, 0, data, 0, curLength); + return new Packet(null, data, bare); + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/frontend/.svn/entries b/LoginServer/src/rsca/ls/packetbuilder/frontend/.svn/entries new file mode 100644 index 0000000..06d16fb --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/frontend/.svn/entries @@ -0,0 +1,28 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/packetbuilder/frontend +svn://localhost + + + +2009-07-02T21:34:35.162152Z +6 +ollie + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + diff --git a/LoginServer/src/rsca/ls/packetbuilder/frontend/.svn/format b/LoginServer/src/rsca/ls/packetbuilder/frontend/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/frontend/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/entries b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/entries new file mode 100644 index 0000000..e8a0c39 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/entries @@ -0,0 +1,164 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/packetbuilder/loginserver +svn://localhost + + + +2009-10-02T12:11:17.749143Z +285 +Pets + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +PlayerLoginPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +f1ab3acbf0217f8e0493151ac00a200d +2009-10-02T12:11:17.749143Z +285 +Pets + + + + + + + + + + + + + + + + + + + + + +4546 + +WorldRegisteredPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +9ae7c147da41c5c9c5bd7ebd25646df9 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +774 + +MiscPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +ab9db99bfb11be0e63df9467ad59d9aa +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +3345 + +ReplyPacketBuilder.java +file + + + + +2009-10-23T16:32:26.000000Z +4460747f035332d7f86dba32c4ba1b8c +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1003 + diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/format b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/MiscPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/MiscPacketBuilder.java.svn-base new file mode 100644 index 0000000..91d9b7d --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/MiscPacketBuilder.java.svn-base @@ -0,0 +1,135 @@ +package rsca.ls.packetbuilder.loginserver; + +import java.util.ArrayList; +import java.util.List; + +import rsca.ls.LoginEngine; +import rsca.ls.Server; +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class MiscPacketBuilder { + /** + * LoginEngine + */ + private LoginEngine engine = Server.getServer().getEngine(); + /** + * List of packets waiting to be sent to the world + */ + private List packets = new ArrayList(); + + public void alert(long user, String message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(6); + s.addLong(user); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + public void alert(String message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(5); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + /** + * Clears old packets that have already been sent + */ + public void clearPackets() { + packets.clear(); + } + + public void friendLogin(long user, long friend, int w) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(11); + s.addLong(user); + s.addLong(friend); + s.addShort(w); + packets.add(s.toPacket()); + } + + public void friendLogout(long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(12); + s.addLong(friend); + packets.add(s.toPacket()); + } + + public void friendLogout(long user, long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(13); + s.addLong(friend); + s.addLong(user); + packets.add(s.toPacket()); + } + + /** + * Gets a List of new packets since the last update + */ + public List getPackets() { + return packets; + } + + public void logoutUser(long user) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(7); + s.addLong(user); + packets.add(s.toPacket()); + } + + public void playerListRequest(PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(2); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void requestPlayerInfo(long user, PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(9); + s.addLong(user); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void requestReportInfo(long user, PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(8); + s.addLong(user); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void requestStats(PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(1); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void sendPM(long user, long friend, boolean avoidBlock, byte[] message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(10); + s.addLong(user); + s.addLong(friend); + s.addByte((byte) (avoidBlock ? 1 : 0)); + s.addBytes(message); + packets.add(s.toPacket()); + } + + public void shutdown() { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(3); + packets.add(s.toPacket()); + } + + public void update(String reason) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(4); + s.addBytes(reason.getBytes()); + packets.add(s.toPacket()); + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/PlayerLoginPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/PlayerLoginPacketBuilder.java.svn-base new file mode 100644 index 0000000..c8a787f --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/PlayerLoginPacketBuilder.java.svn-base @@ -0,0 +1,150 @@ +package rsca.ls.packetbuilder.loginserver; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +import rsca.ls.Server; +import rsca.ls.model.BankItem; +import rsca.ls.model.InvItem; +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; + +public class PlayerLoginPacketBuilder { + /** + * Players Login Code + */ + private byte loginCode; + /** + * Players Saved Data + */ + private PlayerSave save; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + Server server = Server.getServer(); + + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addByte(loginCode); + if (save != null) { + packet.addInt(save.getOwner()); + packet.addInt(save.getGroup()); + + packet.addLong(save.getSubscriptionExpires()); + + packet.addLong(save.getLastIP()); + packet.addLong(save.getLastLogin()); + + packet.addShort(save.getX()); + packet.addShort(save.getY()); + + packet.addShort(save.getFatigue()); + packet.addByte(save.getCombatStyle()); + + packet.addByte((byte) (save.blockChat() ? 1 : 0)); + packet.addByte((byte) (save.blockPrivate() ? 1 : 0)); + packet.addByte((byte) (save.blockTrade() ? 1 : 0)); + packet.addByte((byte) (save.blockDuel() ? 1 : 0)); + + packet.addByte((byte) (save.cameraAuto() ? 1 : 0)); + packet.addByte((byte) (save.oneMouse() ? 1 : 0)); + packet.addByte((byte) (save.soundOff() ? 1 : 0)); + packet.addByte((byte) (save.showRoof() ? 1 : 0)); + packet.addByte((byte) (save.autoScreenshot() ? 1 : 0)); + packet.addByte((byte) (save.combatWindow() ? 1 : 0)); + + packet.addShort(save.getHairColour()); + packet.addShort(save.getTopColour()); + packet.addShort(save.getTrouserColour()); + packet.addShort(save.getSkinColour()); + packet.addShort(save.getHeadSprite()); + packet.addShort(save.getBodySprite()); + + packet.addByte((byte) (save.isMale() ? 1 : 0)); + packet.addLong(save.getSkullTime()); + + for (int i = 0; i < 18; i++) { + packet.addLong(save.getExp(i)); + packet.addShort(save.getStat(i)); + } + + int invCount = save.getInvCount(); + packet.addShort(invCount); + for (int i = 0; i < invCount; i++) { + InvItem item = save.getInvItem(i); + packet.addShort(item.getID()); + packet.addInt(item.getAmount()); + packet.addByte((byte) (item.isWielded() ? 1 : 0)); + } + + int bankCount = save.getBankCount(); + packet.addShort(bankCount); + for (int i = 0; i < bankCount; i++) { + BankItem item = save.getBankItem(i); + packet.addShort(item.getID()); + packet.addInt(item.getAmount()); + } + + ArrayList friendsWithUs = new ArrayList(); + try { + ResultSet result = Server.db.getQuery("SELECT p.user FROM `rsca2_friends` AS f INNER JOIN `rsca2_players` AS p ON p.user=f.friend WHERE p.block_private=0 AND f.user='" + save.getUser() + "'"); + while (result.next()) { + friendsWithUs.add(result.getLong("user")); + } + result = Server.db.getQuery("SELECT user FROM `rsca2_friends` WHERE friend='" + save.getUser() + "'"); + while (result.next()) { + friendsWithUs.add(result.getLong("user")); + } + } catch (SQLException e) { + Server.error(e); + } + + int friendCount = save.getFriendCount(); + packet.addShort(friendCount); + for (int i = 0; i < friendCount; i++) { + long friend = save.getFriend(i); + World world = server.findWorld(friend); + packet.addLong(friend); + packet.addShort(world == null || !friendsWithUs.contains(friend) ? 0 : world.getID()); + } + + int ignoreCount = save.getIgnoreCount(); + packet.addShort(ignoreCount); + for (int i = 0; i < ignoreCount; i++) { + packet.addLong(save.getIgnore(i)); + } + packet.addShort(save.getQuestPoints()); + java.util.Set keys = save.getQuestStages().keySet(); + packet.addShort(keys.size()); + + for (int id : keys) { + packet.addShort(id); + packet.addShort(save.getQuestStage(id)); + } + packet.addLong(save.getMuted()); + } + return packet.toPacket(); + + } + + /** + * Sets the packet to reply to + */ + public void setPlayer(PlayerSave save, byte loginCode) { + this.save = save; + this.loginCode = loginCode; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/ReplyPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/ReplyPacketBuilder.java.svn-base new file mode 100644 index 0000000..eaf6927 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/ReplyPacketBuilder.java.svn-base @@ -0,0 +1,50 @@ +package rsca.ls.packetbuilder.loginserver; + +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; + +public class ReplyPacketBuilder { + /** + * Reply + */ + private String reply; + /** + * Was the action successful + */ + private boolean success; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addByte((byte) (success ? 1 : 0)); + if (reply != null) { + packet.addBytes(reply.getBytes()); + } + return packet.toPacket(); + } + + /** + * Sets the reply to send back + */ + public void setReply(String reply) { + this.reply = reply; + } + + /** + * Sets the status of the action + */ + public void setSuccess(boolean success) { + this.success = success; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/WorldRegisteredPacketBuilder.java.svn-base b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/WorldRegisteredPacketBuilder.java.svn-base new file mode 100644 index 0000000..3a933c4 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/.svn/text-base/WorldRegisteredPacketBuilder.java.svn-base @@ -0,0 +1,36 @@ +package rsca.ls.packetbuilder.loginserver; + +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; + +public class WorldRegisteredPacketBuilder { + /** + * Was the registering successful? + */ + private boolean success; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addByte((byte) (success ? 1 : 0)); + return packet.toPacket(); + } + + /** + * Sets whether or not we were successful + */ + public void setSuccess(boolean success) { + this.success = success; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/MiscPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/loginserver/MiscPacketBuilder.java new file mode 100644 index 0000000..476020b --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/MiscPacketBuilder.java @@ -0,0 +1,145 @@ +package rsca.ls.packetbuilder.loginserver; + +import java.util.ArrayList; +import java.util.List; + +import rsca.ls.LoginEngine; +import rsca.ls.Server; +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class MiscPacketBuilder { + /** + * LoginEngine + */ + private LoginEngine engine = Server.getServer().getEngine(); + /** + * List of packets waiting to be sent to the world + */ + private List packets = new ArrayList(); + + public void alert(long user, String message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(6); + s.addLong(user); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + public void alert(String message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(5); + s.addBytes(message.getBytes()); + packets.add(s.toPacket()); + } + + /** + * Clears old packets that have already been sent + */ + public void clearPackets() { + packets.clear(); + } + + public void friendLogin(long user, long friend, int w) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(11); + s.addLong(user); + s.addLong(friend); + s.addShort(w); + packets.add(s.toPacket()); + } + + public void friendLogout(long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(12); + s.addLong(friend); + packets.add(s.toPacket()); + } + + public void friendLogout(long user, long friend) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(13); + s.addLong(friend); + s.addLong(user); + packets.add(s.toPacket()); + } + + /** + * Gets a List of new packets since the last update + */ + public List getPackets() { + return packets; + } + + public void logoutUser(long user) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(7); + s.addLong(user); + packets.add(s.toPacket()); + } + + public void playerListRequest(PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(2); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void Auction(long playerhash, int itemID, long buyout, PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(150); + s.addLong(playerhash); + s.addInt(itemID); + s.addLong(buyout); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void requestPlayerInfo(long user, PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(9); + s.addLong(user); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void requestReportInfo(long user, PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(8); + s.addLong(user); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void requestStats(PacketHandler handler) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(1); + s.setHandler(engine, handler); + packets.add(s.toPacket()); + } + + public void sendPM(long user, long friend, boolean avoidBlock, byte[] message) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(10); + s.addLong(user); + s.addLong(friend); + s.addByte((byte) (avoidBlock ? 1 : 0)); + s.addBytes(message); + packets.add(s.toPacket()); + } + + public void shutdown() { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(3); + packets.add(s.toPacket()); + } + + public void update(String reason) { + LSPacketBuilder s = new LSPacketBuilder(); + s.setID(4); + s.addBytes(reason.getBytes()); + packets.add(s.toPacket()); + } + +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/PlayerLoginPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/loginserver/PlayerLoginPacketBuilder.java new file mode 100644 index 0000000..a140f7d --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/PlayerLoginPacketBuilder.java @@ -0,0 +1,148 @@ +package rsca.ls.packetbuilder.loginserver; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +import rsca.ls.Server; +import rsca.ls.model.BankItem; +import rsca.ls.model.InvItem; +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; + +public class PlayerLoginPacketBuilder { + /** + * Players Login Code + */ + private byte loginCode; + /** + * Players Saved Data + */ + private PlayerSave save; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + Server server = Server.getServer(); + + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addByte(loginCode); + if (save != null) { + packet.addInt(save.getOwner()); + packet.addInt(save.getGroup()); + + packet.addLong(save.getSubscriptionExpires()); + packet.addLong(save.getLastIP()); + packet.addLong(save.getLastLogin()); + + packet.addShort(save.getX()); + packet.addShort(save.getY()); + packet.addShort(save.getFatigue()); + + packet.addByte(save.getCombatStyle()); + packet.addByte((byte) (save.blockChat() ? 1 : 0)); + packet.addByte((byte) (save.blockPrivate() ? 1 : 0)); + packet.addByte((byte) (save.blockTrade() ? 1 : 0)); + packet.addByte((byte) (save.blockDuel() ? 1 : 0)); + packet.addByte((byte) (save.cameraAuto() ? 1 : 0)); + packet.addByte((byte) (save.oneMouse() ? 1 : 0)); + packet.addByte((byte) (save.soundOff() ? 1 : 0)); + packet.addByte((byte) (save.showRoof() ? 1 : 0)); + packet.addByte((byte) (save.autoScreenshot() ? 1 : 0)); + packet.addByte((byte) (save.combatWindow() ? 1 : 0)); + + packet.addShort(save.getHairColour()); + packet.addShort(save.getTopColour()); + packet.addShort(save.getTrouserColour()); + packet.addShort(save.getSkinColour()); + packet.addShort(save.getHeadSprite()); + packet.addShort(save.getBodySprite()); + + packet.addByte((byte) (save.isMale() ? 1 : 0)); + packet.addLong(save.getSkullTime()); + + for (int i = 0; i < 18; i++) { + packet.addLong(save.getExp(i)); + packet.addShort(save.getStat(i)); + } + + int invCount = save.getInvCount(); + packet.addShort(invCount); + for (int i = 0; i < invCount; i++) { + InvItem item = save.getInvItem(i); + packet.addShort(item.getID()); + packet.addInt(item.getAmount()); + packet.addByte((byte) (item.isWielded() ? 1 : 0)); + } + + int bankCount = save.getBankCount(); + packet.addShort(bankCount); + for (int i = 0; i < bankCount; i++) { + BankItem item = save.getBankItem(i); + packet.addShort(item.getID()); + packet.addInt(item.getAmount()); + } + + ArrayList friendsWithUs = new ArrayList(); + try { + ResultSet result = Server.db.getQuery("SELECT p.user FROM `pk_friends` AS f INNER JOIN `pk_players` AS p ON p.user=f.friend WHERE p.block_private=0 AND f.user='" + save.getUser() + "'"); + while (result.next()) { + friendsWithUs.add(result.getLong("user")); + } + result = Server.db.getQuery("SELECT user FROM `pk_friends` WHERE friend='" + save.getUser() + "'"); + while (result.next()) { + friendsWithUs.add(result.getLong("user")); + } + } catch (SQLException e) { + Server.error(e); + } + + int friendCount = save.getFriendCount(); + packet.addShort(friendCount); + for (int i = 0; i < friendCount; i++) { + long friend = save.getFriend(i); + World world = server.findWorld(friend); + packet.addLong(friend); + packet.addShort(world == null || !friendsWithUs.contains(friend) ? 0 : world.getID()); + } + + int ignoreCount = save.getIgnoreCount(); + packet.addShort(ignoreCount); + for (int i = 0; i < ignoreCount; i++) { + packet.addLong(save.getIgnore(i)); + } + packet.addShort(save.getQuestPoints()); + java.util.Set keys = save.getQuestStages().keySet(); + packet.addShort(keys.size()); + + for (int id : keys) { + packet.addShort(id); + packet.addShort(save.getQuestStage(id)); + } + packet.addLong(save.getMuted()); + packet.addLong(save.getEventCD()); + } + return packet.toPacket(); + + } + + /** + * Sets the packet to reply to + */ + public void setPlayer(PlayerSave save, byte loginCode) { + this.save = save; + this.loginCode = loginCode; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/ReplyPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/loginserver/ReplyPacketBuilder.java new file mode 100644 index 0000000..eaf6927 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/ReplyPacketBuilder.java @@ -0,0 +1,50 @@ +package rsca.ls.packetbuilder.loginserver; + +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; + +public class ReplyPacketBuilder { + /** + * Reply + */ + private String reply; + /** + * Was the action successful + */ + private boolean success; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addByte((byte) (success ? 1 : 0)); + if (reply != null) { + packet.addBytes(reply.getBytes()); + } + return packet.toPacket(); + } + + /** + * Sets the reply to send back + */ + public void setReply(String reply) { + this.reply = reply; + } + + /** + * Sets the status of the action + */ + public void setSuccess(boolean success) { + this.success = success; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/LoginServer/src/rsca/ls/packetbuilder/loginserver/WorldRegisteredPacketBuilder.java b/LoginServer/src/rsca/ls/packetbuilder/loginserver/WorldRegisteredPacketBuilder.java new file mode 100644 index 0000000..3a933c4 --- /dev/null +++ b/LoginServer/src/rsca/ls/packetbuilder/loginserver/WorldRegisteredPacketBuilder.java @@ -0,0 +1,36 @@ +package rsca.ls.packetbuilder.loginserver; + +import rsca.ls.net.LSPacket; +import rsca.ls.packetbuilder.LSPacketBuilder; + +public class WorldRegisteredPacketBuilder { + /** + * Was the registering successful? + */ + private boolean success; + /** + * Packets uID + */ + private long uID; + + public LSPacket getPacket() { + LSPacketBuilder packet = new LSPacketBuilder(); + packet.setUID(uID); + packet.addByte((byte) (success ? 1 : 0)); + return packet.toPacket(); + } + + /** + * Sets whether or not we were successful + */ + public void setSuccess(boolean success) { + this.success = success; + } + + /** + * Sets the packet to reply to + */ + public void setUID(long uID) { + this.uID = uID; + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/.svn/entries b/LoginServer/src/rsca/ls/packethandler/.svn/entries new file mode 100644 index 0000000..e36e911 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/.svn/entries @@ -0,0 +1,102 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/packethandler +svn://localhost + + + +2010-01-10T17:31:45.404426Z +376 +ollie + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +frontend +dir + +loginserver +dir + +PacketHandlerDef.java +file + + + + +2009-10-23T16:32:26.000000Z +1a757edc3ec38fe239238a3d968427db +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1220 + +PacketHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +19b80703e3e9fe4cec879abf32d47fc2 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +222 + diff --git a/LoginServer/src/rsca/ls/packethandler/.svn/format b/LoginServer/src/rsca/ls/packethandler/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/packethandler/.svn/text-base/PacketHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/.svn/text-base/PacketHandler.java.svn-base new file mode 100644 index 0000000..7b18cc7 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/.svn/text-base/PacketHandler.java.svn-base @@ -0,0 +1,9 @@ +package rsca.ls.packethandler; + +import org.apache.mina.common.IoSession; + +import rsca.ls.net.Packet; + +public interface PacketHandler { + public void handlePacket(Packet p, IoSession session) throws Exception; +} diff --git a/LoginServer/src/rsca/ls/packethandler/.svn/text-base/PacketHandlerDef.java.svn-base b/LoginServer/src/rsca/ls/packethandler/.svn/text-base/PacketHandlerDef.java.svn-base new file mode 100644 index 0000000..9eaca41 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/.svn/text-base/PacketHandlerDef.java.svn-base @@ -0,0 +1,48 @@ +package rsca.ls.packethandler; + +/** + * The definition of a packet handler, for use with XStream. + */ +public class PacketHandlerDef { + /** + * The name of the handler class + */ + public String className; + /** + * The IDs of packets which the handler is responsible for + */ + public int[] ids; + + /** + * Constructs a new packet handler definition, entailing that packets with + * the given IDs are to be handled by the specified class. + * + * @param ids + * The IDs of packets to be handled + * @param className + * The name of the packet handler class + */ + public PacketHandlerDef(int[] ids, String className) { + this.ids = ids; + this.className = className; + } + + /** + * Returns the IDs of packets to be handled. + * + * @return An int array containing the IDs of packets to be + * handled. + */ + public int[] getAssociatedPackets() { + return ids; + } + + /** + * Returns the name of the packet handler class. + * + * @return The name of the packet handler's class + */ + public String getClassName() { + return className; + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/PacketHandler.java b/LoginServer/src/rsca/ls/packethandler/PacketHandler.java new file mode 100644 index 0000000..7b18cc7 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/PacketHandler.java @@ -0,0 +1,9 @@ +package rsca.ls.packethandler; + +import org.apache.mina.common.IoSession; + +import rsca.ls.net.Packet; + +public interface PacketHandler { + public void handlePacket(Packet p, IoSession session) throws Exception; +} diff --git a/LoginServer/src/rsca/ls/packethandler/PacketHandlerDef.java b/LoginServer/src/rsca/ls/packethandler/PacketHandlerDef.java new file mode 100644 index 0000000..9eaca41 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/PacketHandlerDef.java @@ -0,0 +1,48 @@ +package rsca.ls.packethandler; + +/** + * The definition of a packet handler, for use with XStream. + */ +public class PacketHandlerDef { + /** + * The name of the handler class + */ + public String className; + /** + * The IDs of packets which the handler is responsible for + */ + public int[] ids; + + /** + * Constructs a new packet handler definition, entailing that packets with + * the given IDs are to be handled by the specified class. + * + * @param ids + * The IDs of packets to be handled + * @param className + * The name of the packet handler class + */ + public PacketHandlerDef(int[] ids, String className) { + this.ids = ids; + this.className = className; + } + + /** + * Returns the IDs of packets to be handled. + * + * @return An int array containing the IDs of packets to be + * handled. + */ + public int[] getAssociatedPackets() { + return ids; + } + + /** + * Returns the name of the packet handler class. + * + * @return The name of the packet handler's class + */ + public String getClassName() { + return className; + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/entries b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/entries new file mode 100644 index 0000000..8b25690 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/entries @@ -0,0 +1,232 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/packethandler/frontend +svn://localhost + + + +2009-09-05T12:50:46.724777Z +203 +xEnt + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +Global.java +file + + + + +2009-10-23T16:32:26.000000Z +4590553751794ebbf3a28e7e299538f9 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +870 + +Update.java +file + + + + +2009-10-23T16:32:26.000000Z +6c33f8c0ee464587290ba212f9dbb477 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +869 + +Alert.java +file + + + + +2009-10-23T16:32:26.000000Z +a98f00dd1572bb473abb3c9492422ebf +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +990 + +Logout.java +file + + + + +2009-10-23T16:32:26.000000Z +4fee267e135f14c818901ac1c6429a5e +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +985 + +ListPlayers.java +file + + + + +2009-10-23T16:32:26.000000Z +8f37d218545b0cec04149969f9951e97 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1497 + +Shutdown.java +file + + + + +2009-10-23T16:32:26.000000Z +8d5477b0b0e2a255521fa6fc58e4fa4f +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1086 + diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/format b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Alert.java.svn-base b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Alert.java.svn-base new file mode 100644 index 0000000..527291e --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Alert.java.svn-base @@ -0,0 +1,34 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Alert implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + long usernameHash = Long.parseLong(params[0]); + World world = Server.getServer().findWorld(usernameHash); + if (world == null) { + throw new Exception("World not found"); + } + world.getActionSender().alert(usernameHash, params[1]); + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Global.java.svn-base b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Global.java.svn-base new file mode 100644 index 0000000..f5b5d2a --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Global.java.svn-base @@ -0,0 +1,32 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Global implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + String message = params[0]; + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().alert(message); + } + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/ListPlayers.java.svn-base b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/ListPlayers.java.svn-base new file mode 100644 index 0000000..c24df1e --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/ListPlayers.java.svn-base @@ -0,0 +1,46 @@ +package rsca.ls.packethandler.frontend; + +import java.util.ArrayList; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class ListPlayers implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, final IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + final int worldID = Integer.parseInt(params[0]); + System.out.println("Frontend requested player list for world " + worldID); + World world = Server.getServer().getWorld(worldID); + if (world == null) { + throw new Exception("Unknown world"); + } + world.getActionSender().playerListRequest(new PacketHandler() { + public void handlePacket(Packet p, IoSession s) throws Exception { + builder.setID(1); + + ArrayList params = new ArrayList(); + int count = p.readInt(); + for (int c = 0; c < count; c++) { + params.add(p.readLong() + "," + p.readShort() + "," + p.readShort() + "," + worldID); + } + builder.setParameters(params.toArray(new String[params.size()])); + + session.write(builder.toPacket()); + } + }); + } catch (Exception e) { + builder.setID(0); + session.write(builder.toPacket()); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Logout.java.svn-base b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Logout.java.svn-base new file mode 100644 index 0000000..2062036 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Logout.java.svn-base @@ -0,0 +1,34 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Logout implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + long usernameHash = Long.parseLong(params[0]); + World world = Server.getServer().findWorld(usernameHash); + if (world == null) { + throw new Exception("World not found"); + } + world.getActionSender().logoutUser(usernameHash); + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Shutdown.java.svn-base b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Shutdown.java.svn-base new file mode 100644 index 0000000..e4a4e12 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Shutdown.java.svn-base @@ -0,0 +1,40 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Shutdown implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + int worldID = Integer.parseInt(params[0]); + if (worldID == 0) { + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().shutdown(); + } + } else { + World w = Server.getServer().getWorld(worldID); + if (w == null) { + throw new Exception("Unknown world"); + } + w.getActionSender().shutdown(); + } + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Update.java.svn-base b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Update.java.svn-base new file mode 100644 index 0000000..a1399fe --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/.svn/text-base/Update.java.svn-base @@ -0,0 +1,32 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Update implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + String reason = params[0]; + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().update(reason); + } + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/Alert.java b/LoginServer/src/rsca/ls/packethandler/frontend/Alert.java new file mode 100644 index 0000000..527291e --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/Alert.java @@ -0,0 +1,34 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Alert implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + long usernameHash = Long.parseLong(params[0]); + World world = Server.getServer().findWorld(usernameHash); + if (world == null) { + throw new Exception("World not found"); + } + world.getActionSender().alert(usernameHash, params[1]); + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/AuctionHouse.java b/LoginServer/src/rsca/ls/packethandler/frontend/AuctionHouse.java new file mode 100644 index 0000000..3e9efdc --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/AuctionHouse.java @@ -0,0 +1,47 @@ +package rsca.ls.packethandler.frontend; + +import java.util.ArrayList; +import java.io.DataInput; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class AuctionHouse implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, final IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + final int worldID = Integer.parseInt(params[0]); + final long playerhash = Integer.parseInt(params[1]); + final int itemID = Integer.parseInt(params[2]); + final int buyout = Integer.parseInt(params[3]); + System.out.println("Frontend player trying to sell item via auction " + worldID); + World world = Server.getServer().getWorld(worldID); + if (world == null) { + throw new Exception("Unknown world"); + } + world.getActionSender().Auction(playerhash, itemID, buyout, new PacketHandler() { + public void handlePacket(Packet p, IoSession s) throws Exception { + builder.setID(150); + int isOK = p.readInt(); + ArrayList params = new ArrayList(); + params.add(isOK); + builder.setParameters(params.toArray(new String[params.size()])); + + session.write(builder.toPacket()); + } + }); + } catch (Exception e) { + builder.setID(0); + session.write(builder.toPacket()); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/Global.java b/LoginServer/src/rsca/ls/packethandler/frontend/Global.java new file mode 100644 index 0000000..f5b5d2a --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/Global.java @@ -0,0 +1,32 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Global implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + String message = params[0]; + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().alert(message); + } + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/ListPlayers.java b/LoginServer/src/rsca/ls/packethandler/frontend/ListPlayers.java new file mode 100644 index 0000000..c24df1e --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/ListPlayers.java @@ -0,0 +1,46 @@ +package rsca.ls.packethandler.frontend; + +import java.util.ArrayList; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class ListPlayers implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, final IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + final int worldID = Integer.parseInt(params[0]); + System.out.println("Frontend requested player list for world " + worldID); + World world = Server.getServer().getWorld(worldID); + if (world == null) { + throw new Exception("Unknown world"); + } + world.getActionSender().playerListRequest(new PacketHandler() { + public void handlePacket(Packet p, IoSession s) throws Exception { + builder.setID(1); + + ArrayList params = new ArrayList(); + int count = p.readInt(); + for (int c = 0; c < count; c++) { + params.add(p.readLong() + "," + p.readShort() + "," + p.readShort() + "," + worldID); + } + builder.setParameters(params.toArray(new String[params.size()])); + + session.write(builder.toPacket()); + } + }); + } catch (Exception e) { + builder.setID(0); + session.write(builder.toPacket()); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/Logout.java b/LoginServer/src/rsca/ls/packethandler/frontend/Logout.java new file mode 100644 index 0000000..2062036 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/Logout.java @@ -0,0 +1,34 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Logout implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + long usernameHash = Long.parseLong(params[0]); + World world = Server.getServer().findWorld(usernameHash); + if (world == null) { + throw new Exception("World not found"); + } + world.getActionSender().logoutUser(usernameHash); + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/Shutdown.java b/LoginServer/src/rsca/ls/packethandler/frontend/Shutdown.java new file mode 100644 index 0000000..e4a4e12 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/Shutdown.java @@ -0,0 +1,40 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Shutdown implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + int worldID = Integer.parseInt(params[0]); + if (worldID == 0) { + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().shutdown(); + } + } else { + World w = Server.getServer().getWorld(worldID); + if (w == null) { + throw new Exception("Unknown world"); + } + w.getActionSender().shutdown(); + } + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/frontend/Update.java b/LoginServer/src/rsca/ls/packethandler/frontend/Update.java new file mode 100644 index 0000000..a1399fe --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/frontend/Update.java @@ -0,0 +1,32 @@ +package rsca.ls.packethandler.frontend; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.FPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.FPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class Update implements PacketHandler { + private static final FPacketBuilder builder = new FPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + String[] params = ((FPacket) p).getParameters(); + try { + String reason = params[0]; + for (World w : Server.getServer().getWorlds()) { + w.getActionSender().update(reason); + } + builder.setID(1); + } catch (Exception e) { + builder.setID(0); + } + FPacket packet = builder.toPacket(); + if (packet != null) { + session.write(packet); + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/entries b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/entries new file mode 100644 index 0000000..7f06312 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/entries @@ -0,0 +1,606 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/packethandler/loginserver +svn://localhost + + + +2010-01-10T17:31:45.404426Z +376 +ollie + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +Tradelog.java +file + + + + +2010-01-10T17:31:29.000000Z +4539e08b2453fe707fa4085fbe82f5b4 +2010-01-10T17:31:45.404426Z +376 +ollie + + + + + + + + + + + + + + + + + + + + + +713 + +GameSettingHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +2fc1f0a86599befc1c8d355885db7327 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2063 + +FriendHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +692756abc7c26103cbbe9851be78e4b0 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2998 + +SaveProfilesRequestHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +5d34a09bc3fa60049699912e25e493fe +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1242 + +ReportHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +8b61c3334bcc7e0a1e6774097b17ea80 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1149 + +PrivacySettingHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +92c26cf5038190ed8af5b3742ccf80d3 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2150 + +PlayerSaveHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +2bea6ce9cb05d425e742e9868d971cbd +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2066 + +PlayerInfoRequestHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +16026ccfbe16de107c337a9a44a2c56f +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1265 + +LogHandler.java +file + + + + +2010-01-09T00:16:19.000000Z +b47a62fa98c3490bd7259ecf984b2fbf +2010-01-09T00:16:07.709894Z +372 +Pets + + + + + + + + + + + + + + + + + + + + + +1570 + +PlayerLoginHandler.java.1 +file + + + + +2009-10-23T16:32:26.000000Z +b153ee3c05b597e98dbdf80596740e36 +2009-07-02T21:34:35.162152Z +6 +ollie + + + + + + + + + + + + + + + + + + + + + +3152 + +PlayerLoginHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +451dab8b28d4e6f2faa3c84329658c55 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +3739 + +PlayerLogoutHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +5c5de57b46cc82283a2ce47027713994 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +454 + +KillHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +6d039cc6b58732a0aa9d4357801e4014 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +655 + +RegisterWorld.java +file + + + + +2009-10-23T16:32:26.000000Z +1b7843295a154da2a144aa6449bfb028 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2095 + +BanHandler.java.autothread +file + + + + +2009-10-23T16:32:26.000000Z +430c715dcf6de682e81e06cec91cd3e5 +2009-07-02T21:34:35.162152Z +6 +ollie + + + + + + + + + + + + + + + + + + + + + +3432 + +BanHandler.java.2 +file + + + + +2009-10-23T16:32:26.000000Z +08ea47511ab44f81ce2a7705b1d00f80 +2009-07-02T21:34:35.162152Z +6 +ollie + + + + + + + + + + + + + + + + + + + + + +2221 + +BanHandler.java +file + + + + +2009-10-23T16:32:26.000000Z +9ceb76e90ec54ea168f61048a72da703 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +2038 + diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/format b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.2.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.2.svn-base new file mode 100644 index 0000000..9e4ac26 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.2.svn-base @@ -0,0 +1,55 @@ +package org.rscdaemon.ls.packethandler.loginserver; + +import org.rscdaemon.ls.packethandler.PacketHandler; +import org.rscdaemon.ls.Server; +import org.rscdaemon.ls.model.World; +import org.rscdaemon.ls.net.LSPacket; +import org.rscdaemon.ls.net.Packet; +import org.rscdaemon.ls.util.DataConversions; +import org.rscdaemon.ls.packetbuilder.loginserver.ReplyPacketBuilder; + +import org.apache.mina.common.IoSession; + +import java.sql.ResultSet; + +public class BanHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket)p).getUID(); + boolean banned = ((LSPacket)p).getID() == 4; + long user = p.readLong(); + long modhash = p.readLong(); + + ResultSet result = Server.db.getQuery("SELECT u.group_id, p.playermod, p.owner FROM `users` AS u INNER JOIN `rscd_players` AS p ON p.owner=u.id WHERE p.user=" + user); + if(!result.next()) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else if(banned && (result.getInt("group_id") < 3 || result.getInt("playermod") == 1)) { + builder.setSuccess(false); + builder.setReply("You cannot ban a (p)mod or admin!"); + } + else if(Server.db.updateQuery("UPDATE `rscd_players` SET `banned`='" + (banned ? "1" : "0") + "' WHERE `user` LIKE '" + user + "'") == 0) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else { + World w = Server.getServer().findWorld(user); + if(w != null) { + w.getActionSender().logoutUser(user); + } + if(banned) Server.db.updateQuery("INSERT `rscd_banlog` VALUES('" + user + "','" + modhash + "','" + (System.currentTimeMillis() / 1000) + "')"); + builder.setSuccess(true); + builder.setReply(DataConversions.hashToUsername(user) + " has been " + (banned ? "banned" : "unbanned")); + } + builder.setUID(uID); + + LSPacket temp = builder.getPacket(); + if(temp != null) { + session.write(temp); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.autothread.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.autothread.svn-base new file mode 100644 index 0000000..8d11aa5 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.autothread.svn-base @@ -0,0 +1,68 @@ +package org.rscdaemon.ls.packethandler.loginserver; + +import org.rscdaemon.ls.packethandler.PacketHandler; +import org.rscdaemon.ls.Server; +import org.rscdaemon.ls.model.World; +import org.rscdaemon.ls.net.LSPacket; +import org.rscdaemon.ls.net.Packet; +import org.rscdaemon.ls.util.DataConversions; +import org.rscdaemon.ls.packetbuilder.loginserver.ReplyPacketBuilder; + +import org.apache.mina.common.IoSession; + +import java.sql.ResultSet; + +public class BanHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket)p).getUID(); + boolean banned = ((LSPacket)p).getID() == 4; + long user = p.readLong(); + long modhash = p.readLong(); + + ResultSet result = Server.db.getQuery("SELECT u.group_id, p.playermod, p.owner FROM `users` AS u INNER JOIN `rscd_players` AS p ON p.owner=u.id WHERE p.user=" + user); + if(!result.next()) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else if(banned && (result.getInt("group_id") < 3 || result.getInt("playermod") == 1)) { + builder.setSuccess(false); + builder.setReply("You cannot ban a (p)mod or admin!"); + } + else if(Server.db.updateQuery("UPDATE `rscd_players` SET `banned`='" + (banned ? "1" : "0") + "' WHERE `user` LIKE '" + user + "'") == 0) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else { + World w = Server.getServer().findWorld(user); + if(w != null) { + w.getActionSender().logoutUser(user); + } + if(banned) { + String owner = result.getString("owner"); + Server.db.updateQuery("INSERT `rscd_banlog` VALUES('" + user + "','" + modhash + "','" + (System.currentTimeMillis() / 1000) + "')"); + ResultSet result2 = Server.db.getQuery("SELECT username FROM `users` WHERE id=" + owner); + + String username = result2.getString("username"); + Server.db.updateQuery("INSERT `topics` (poster, subject, posted, last_post, last_poster, forum_id) VALUES('" + username + "','[" + DataConversions.hashToUsername(user) + "] Banned by [" + DataConversions.hashToUsername(modhash) + "]','" + (System.currentTimeMillis() / 1000) + "','" + (System.currentTimeMillis() / 1000) + "','" + username + "','19')"); + ResultSet result3 = Server.db.getQuery("SELECT LAST_INSERT_ID()"); + String tid = result3.getString(1); + Server.db.updateQuery("INSERT `posts` (poster, poster_ip, poster_email, message, hide_smilies, posted, topic_id) VALUES('" + username + "','0.0.0.0','null@null.org', This thread will close in 24h, post in here if you are the account owner.','1','" + (System.currentTimeMillis() / 1000) + "','" + tid + "')"); + ResultSet result4 = Server.db.getQuery("SELECT LAST_INSERT_ID()"); + String pid = result4.getString(1); + Server.db.updateQuery("UPDATE `posts` SET last_post_id=`" + pid + "` WHERE id=`" + tid + "`"); + } + builder.setSuccess(true); + builder.setReply(DataConversions.hashToUsername(user) + " has been " + (banned ? "banned" : "unbanned")); + } + builder.setUID(uID); + + LSPacket temp = builder.getPacket(); + if(temp != null) { + session.write(temp); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.svn-base new file mode 100644 index 0000000..1b20143 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/BanHandler.java.svn-base @@ -0,0 +1,53 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.ResultSet; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.ReplyPacketBuilder; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class BanHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + boolean banned = ((LSPacket) p).getID() == 4; + long user = p.readLong(); + long modhash = p.readLong(); + + ResultSet result = Server.db.getQuery("SELECT u.group_id, p.playermod, p.owner FROM `users` AS u INNER JOIN `rsca2_players` AS p ON p.owner=u.id WHERE p.user='" + user + "'"); + if (!result.next()) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } else if (banned && (result.getInt("group_id") < 3 || result.getInt("playermod") == 1)) { + builder.setSuccess(false); + builder.setReply("You cannot ban a (p)mod or admin!"); + } else if (Server.db.updateQuery("UPDATE `rsca2_players` SET `banned`='" + (banned ? "1" : "0") + "' WHERE `user` LIKE '" + user + "'") == 0) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } else { + World w = Server.getServer().findWorld(user); + if (w != null) { + w.getActionSender().logoutUser(user); + } + if (banned) + Server.db.updateQuery("INSERT `rsca2_banlog` VALUES('" + user + "','" + modhash + "','" + (System.currentTimeMillis() / 1000) + "')"); + builder.setSuccess(true); + builder.setReply(DataConversions.hashToUsername(user) + " has been " + (banned ? "banned" : "unbanned")); + } + builder.setUID(uID); + + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/FriendHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/FriendHandler.java.svn-base new file mode 100644 index 0000000..1313936 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/FriendHandler.java.svn-base @@ -0,0 +1,87 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class FriendHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + Server server = Server.getServer(); + + long user = p.readLong(); + long friend = p.readLong(); + + World w; + PlayerSave save = server.findSave(user, world); + switch (((LSPacket) p).getID()) { + case 10: // Send PM + boolean avoidBlock = p.readByte() == 1; + byte[] message = p.getRemainingData(); + w = server.findWorld(friend); + if (w != null) { + w.getActionSender().sendPM(user, friend, avoidBlock, message); + } + break; + case 11: // Add friend + try { + save.addFriend(friend); + Server.db.updateQuery("INSERT INTO `rsca2_friends`(`user`, `friend`) VALUES('" + user + "', '" + friend + "')"); + if (Server.db.getQuery("SELECT 1 FROM `rsca2_players` AS p LEFT JOIN `rsca2_friends` AS f ON f.user=p.user WHERE (p.block_private=0 OR f.friend='" + user + "') AND p.user='" + friend + "'").next()) { + w = server.findWorld(friend); + if (w != null) { + world.getActionSender().friendLogin(user, friend, w.getID()); + } + } + if (Server.db.getQuery("SELECT 1 FROM `rsca2_players` AS p LEFT JOIN `rsca2_friends` AS f ON f.friend=p.user WHERE p.block_private=1 AND f.user='" + friend + "' AND p.user='" + user + "'").next()) { + w = server.findWorld(friend); + if (w != null) { + w.getActionSender().friendLogin(friend, user, world.getID()); + } + } + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 12: // Remove friend + try { + save.removeFriend(friend); + Server.db.updateQuery("DELETE FROM `rsca2_friends` WHERE `user` LIKE '" + user + "' AND `friend` LIKE '" + friend + "'"); + if (Server.db.getQuery("SELECT 1 FROM `rsca2_players` WHERE block_private=1 AND user='" + user + "'").next()) { + w = server.findWorld(friend); + if (w != null) { + w.getActionSender().friendLogout(friend, user); + } + } + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 13: // Add ignore + try { + save.addIgnore(friend); + Server.db.updateQuery("INSERT INTO `rsca2_ignores`(`user`, `ignore`) VALUES('" + user + "', '" + friend + "')"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 14: // Remove ignore + try { + save.removeIgnore(friend); + Server.db.updateQuery("DELETE FROM `rsca2_ignores` WHERE `user` LIKE '" + user + "' AND `ignore` LIKE '" + friend + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/GameSettingHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/GameSettingHandler.java.svn-base new file mode 100644 index 0000000..859cfe6 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/GameSettingHandler.java.svn-base @@ -0,0 +1,66 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class GameSettingHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + long user = p.readLong(); + boolean on = p.readByte() == 1; + int idx = (int) p.readByte(); + switch (idx) { + case 0: // Camera Auto + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET cameraauto=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 2: // One Mouse + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET onemouse=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 3: // Sound Off + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET soundoff=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 4: // Show Roof + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET showroof=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 5: // Auto Screenshot + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET autoscreenshot=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 6: // Combat Window + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET combatwindow=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + } + Server.getServer().findSave(user, world).setGameSetting(idx, on); + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/KillHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/KillHandler.java.svn-base new file mode 100644 index 0000000..80335d6 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/KillHandler.java.svn-base @@ -0,0 +1,21 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class KillHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + Server.db.updateQuery("INSERT INTO `rsca2_kills`(`user`, `killed`, `time`, `type`) VALUES('" + p.readLong() + "', '" + p.readLong() + "', " + (int) (System.currentTimeMillis() / 1000) + ", " + p.readByte() + ")"); + } catch (SQLException e) { + e.printStackTrace(); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/LogHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/LogHandler.java.svn-base new file mode 100644 index 0000000..d61dbe2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/LogHandler.java.svn-base @@ -0,0 +1,59 @@ +package rsca.ls.packethandler.loginserver; + +import java.io.File; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.Config; + +public class LogHandler implements PacketHandler { + private static PrintWriter error; + + private static PrintWriter event; + private static final SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss dd-MM-yy"); + private static PrintWriter mod; + private static PrintWriter exception; + static { + try { + event = new PrintWriter(new File(Config.LOG_DIR, "event.log")); + error = new PrintWriter(new File(Config.LOG_DIR, "error.log")); + mod = new PrintWriter(new File(Config.LOG_DIR, "mod.log")); + exception = new PrintWriter(new File(Config.LOG_DIR, "err.log")); + } catch (Exception e) { + Server.error(e); + } + } + + private static String getDate() { + return formatter.format(System.currentTimeMillis()); + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + byte type = p.readByte(); + String message = getDate() + ": " + p.readString(); + switch (type) { + case 1: + event.println(message); + event.flush(); + break; + case 2: + error.println(message); + error.flush(); + break; + case 3: + mod.println(message); + mod.flush(); + break; + case 4: + exception.println(message); + exception.flush(); + break; + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerInfoRequestHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerInfoRequestHandler.java.svn-base new file mode 100644 index 0000000..831aef2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerInfoRequestHandler.java.svn-base @@ -0,0 +1,42 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.LSPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class PlayerInfoRequestHandler implements PacketHandler { + + public void handlePacket(Packet p, final IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + final long user = p.readLong(); + final World w = Server.getServer().findWorld(user); + if (w == null) { + LSPacketBuilder builder = new LSPacketBuilder(); + builder.setUID(uID); + builder.addByte((byte) 0); + session.write(builder.toPacket()); + return; + } + w.getActionSender().requestPlayerInfo(user, new PacketHandler() { + public void handlePacket(Packet p, IoSession s) throws Exception { + LSPacketBuilder builder = new LSPacketBuilder(); + builder.setUID(uID); + if (p.readByte() == 0) { + builder.addByte((byte) 0); + } else { + builder.addByte((byte) 1); + builder.addShort(w == null ? 0 : w.getID()); + builder.addBytes(p.getRemainingData()); + } + session.write(builder.toPacket()); + } + }); + + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLoginHandler.java.1.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLoginHandler.java.1.svn-base new file mode 100644 index 0000000..de3e0fe --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLoginHandler.java.1.svn-base @@ -0,0 +1,89 @@ +package org.rscdaemon.ls.packethandler.loginserver; + +import org.rscdaemon.ls.packethandler.PacketHandler; +import org.rscdaemon.ls.Server; +import org.rscdaemon.ls.model.World; +import org.rscdaemon.ls.net.LSPacket; +import org.rscdaemon.ls.net.Packet; +import org.rscdaemon.ls.util.DataConversions; +import org.rscdaemon.ls.packetbuilder.loginserver.PlayerLoginPacketBuilder; + +import org.apache.mina.common.IoSession; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map.Entry; + +public class PlayerLoginHandler implements PacketHandler { + private PlayerLoginPacketBuilder builder = new PlayerLoginPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket)p).getUID(); + World world = (World)session.getAttachment(); + long user = p.readLong(); + String ip = DataConversions.IPToString(p.readLong()); + String pass = p.readString(32).trim(); + String className = p.readString(); + byte loginCode = validatePlayer(user, pass, ip); + + builder.setUID(uID); + if(loginCode == 0 || loginCode == 1 || loginCode == 99) { +// if(!className.equals("ORG.RSCDAEMON.CLIENT.MUDCLIENT")) { +// System.out.println(DataConversions.hashToUsername(user) + " was caught by a trap"); +// try { Server.db.updateQuery("INSERT INTO `rscd_traps`(`user`, `time`, `ip`, `details`) VALUES('" + user + "', '" + (int)(System.currentTimeMillis() / 1000) + "', '" + ip + "', 'Unknown main class: \"" + className +"\"')"); } catch(Exception e) { } +// } + builder.setPlayer(Server.getServer().findSave(user, world), loginCode); + world.registerPlayer(user, ip); + } + else { + builder.setPlayer(null, loginCode); + } + + LSPacket packet = builder.getPacket(); + if(packet != null) { + session.write(packet); + } + } + + private byte validatePlayer(long user, String pass, String ip) { + Server server = Server.getServer(); + byte returnVal = 0; + + try { + ResultSet result = Server.db.getQuery("SELECT r.pass, r.banned, r.owner, u.group_id, b.id AS b_id FROM `rscd_players` AS r INNER JOIN `users` AS u ON u.id=r.owner LEFT JOIN `bans` AS b on (b.username LIKE u.username OR b.ip LIKE '" + ip + "') WHERE `user`=" + user); + if(!result.next() || !pass.equalsIgnoreCase(result.getString("pass"))) { + System.out.println(result.getString("pass")); + return 2; + } + + if(result.getInt("banned") == 1 || result.getInt("b_id") != 0) { + return 6; + } + + if(result.getInt("group_id") == 1 || result.getInt("group_id") == 2) { + returnVal = 99; + } + + int owner = result.getInt("owner"); + for(World w : server.getWorlds()) { + for(Entry player : w.getPlayers()) { + if(player.getKey() == user) { + return 3; + } + if(player.getValue() == owner) { + return 9; + } + } + if(w.hasPlayer(user)) { + return 3; + } + } + return returnVal; + } + catch(SQLException e) { + System.out.println("Exception in PlayerLoginHandler :" + e.getMessage()); + //System.out.println(e.getMessage(), e); + return 7; + } + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLoginHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLoginHandler.java.svn-base new file mode 100644 index 0000000..15edcb2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLoginHandler.java.svn-base @@ -0,0 +1,108 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.PlayerLoginPacketBuilder; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class PlayerLoginHandler implements PacketHandler { + public static ArrayList badClients = new ArrayList(); + private PlayerLoginPacketBuilder builder = new PlayerLoginPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + World world = (World) session.getAttachment(); + long user = p.readLong(); + String ip = DataConversions.IPToString(p.readLong()); + String pass = p.readString(32).trim(); + String className = p.readString(); + byte loginCode = validatePlayer(user, pass, ip); + + builder.setUID(uID); + if (loginCode == 0 || loginCode == 1 || loginCode == 99) { + try { + badClients.add(DataConversions.hashToUsername(user)); + System.out.println("Class: " + className + " Player: " + DataConversions.hashToUsername(user)); + } catch (Exception e) { + System.out.println("Exception in classname printer :" + e.getMessage()); + } + // if(!className.equals("ORG.RSCDAEMON.CLIENT.MUDCLIENT")) { + // System.out.println(DataConversions.hashToUsername(user) + + // " was caught by a trap"); + // try { + // Server.db.updateQuery("INSERT INTO `rsca2_traps`(`user`, `time`, `ip`, `details`) VALUES('" + // + user + "', '" + (int)(System.currentTimeMillis() / 1000) + + // "', '" + ip + "', 'Unknown main class: \"" + className +"\"')"); + // } catch(Exception e) { } + // } + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET online=1 WHERE user='" + user + "'"); + } catch (Exception e) { + } + + builder.setPlayer(Server.getServer().findSave(user, world), loginCode); + world.registerPlayer(user, ip); + } else { + builder.setPlayer(null, loginCode); + } + + LSPacket packet = builder.getPacket(); + if (packet != null) { + session.write(packet); + } + } + + private byte validatePlayer(long user, String pass, String ip) { + Server server = Server.getServer(); + byte returnVal = 0; + + try { + ResultSet result = Server.db.getQuery("SELECT r.pass, r.banned, r.owner, u.group_id, b.id AS b_id FROM `rsca2_players` AS r INNER JOIN `users` AS u ON u.id=r.owner LEFT JOIN `bans` AS b on (b.username LIKE u.username OR b.ip LIKE '" + ip + "') WHERE `user`='" + user + "'"); + if (!result.next()) { + return 2; + } + if (!pass.equalsIgnoreCase(result.getString("pass"))) { + return 2; + } + + if (result.getInt("banned") == 1 || result.getInt("b_id") != 0) { + System.out.println("Banned player: " + DataConversions.hashToUsername(user) + " trying to login."); + return 6; + } + + if (result.getInt("group_id") == 1 || result.getInt("group_id") == 2) { + returnVal = 99; + } + + int owner = result.getInt("owner"); + for (World w : server.getWorlds()) { + for (Entry player : w.getPlayers()) { + if (player.getKey() == user) { + return 3; + } + if (player.getValue() == owner) { + return 9; + } + } + if (w.hasPlayer(user)) { + return 3; + } + } + return returnVal; + } catch (SQLException e) { + System.out.println("Exception in PlayerLoginHandler :" + e.getMessage()); + // System.out.println(e.getMessage(), e); + return 7; + } + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLogoutHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLogoutHandler.java.svn-base new file mode 100644 index 0000000..a42f67c --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerLogoutHandler.java.svn-base @@ -0,0 +1,16 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class PlayerLogoutHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + long user = p.readLong(); + World world = (World) session.getAttachment(); + world.unregisterPlayer(user); + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerSaveHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerSaveHandler.java.svn-base new file mode 100644 index 0000000..c02262d --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PlayerSaveHandler.java.svn-base @@ -0,0 +1,64 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class PlayerSaveHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + long usernameHash = p.readLong(); + int owner = p.readInt(); + PlayerSave save = Server.getServer().findSave(usernameHash, world); + if (save == null) { + System.out.println("Error loading data for: " + DataConversions.hashToUsername(usernameHash)); + return; + } + System.out.println("Adding save data for: " + save.getUsername()); + + if (owner != save.getOwner()) { + System.out.println("WARNING ATTEMPTED DUPE"); + } + + save.setOwner(owner); + save.setLogin(p.readLong(), p.readLong()); + save.setTotals(p.readShort(), p.readShort()); + save.setLocation(p.readShort(), p.readShort()); + save.setFatigue(p.readShort()); + save.setAppearance(p.readByte(), p.readByte(), p.readByte(), p.readByte(), p.readByte(), p.readByte(), p.readByte() == 1, p.readLong()); + save.setCombatStyle(p.readByte()); + + for (int i = 0; i < 18; i++) { + save.setStat(i, p.readLong(), p.readShort()); + } + + int invCount = p.readShort(); + save.clearInvItems(); + for (int i = 0; i < invCount; i++) { + save.addInvItem(p.readShort(), p.readInt(), p.readByte() == 1); + } + + int bnkCount = p.readShort(); + save.clearBankItems(); + for (int i = 0; i < bnkCount; i++) { + save.addBankItem(p.readShort(), p.readInt()); + } + + save.setQuestPoints(p.readShort()); + int qstCount = p.readShort(); + for (int i = 0; i < qstCount; i++) + save.setQuestStage(p.readShort(), p.readShort()); + + save.setLastUpdate(System.currentTimeMillis()); + if (!save.save()) { // we shouldnt always save right away + System.out.println("Error saving: " + save.getUsername()); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PrivacySettingHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PrivacySettingHandler.java.svn-base new file mode 100644 index 0000000..815716e --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/PrivacySettingHandler.java.svn-base @@ -0,0 +1,67 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class PrivacySettingHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + Server server = Server.getServer(); + + long user = p.readLong(); + boolean on = p.readByte() == 1; + int idx = (int) p.readByte(); + switch (idx) { + case 0: // Chat block + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET block_chat=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 1: // Private block + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET block_private=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + ResultSet result = Server.db.getQuery("SELECT user FROM `rsca2_friends` WHERE friend='" + user + "' AND user NOT IN (SELECT friend FROM `rsca2_friends` WHERE user='" + user + "')"); + while (result.next()) { + long friend = result.getLong("user"); + World w = server.findWorld(friend); + if (w != null) { + if (on) { + w.getActionSender().friendLogout(friend, user); + } else { + w.getActionSender().friendLogin(friend, user, world.getID()); + } + } + } + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 2: // Trade block + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET block_trade=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 3: // Duel block + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET block_duel=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + } + server.findSave(user, world).setPrivacySetting(idx, on); + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/RegisterWorld.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/RegisterWorld.java.svn-base new file mode 100644 index 0000000..1e3b2c0 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/RegisterWorld.java.svn-base @@ -0,0 +1,72 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.WorldRegisteredPacketBuilder; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class RegisterWorld implements PacketHandler { + private WorldRegisteredPacketBuilder builder = new WorldRegisteredPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + builder.setUID(uID); + builder.setSuccess(false); + + Server server = Server.getServer(); + if (((LSPacket) p).getID() == 1) { + int id = p.readShort(); + if (server.getWorld(id) == null) { + World world = server.getIdleWorld(id); + if (world == null) { + world = new World(id, session); + server.registerWorld(world); + System.out.println("Registering world: " + id); + try { + if (id == 1) + Server.db.updateQuery("UPDATE `rsca2_players` SET online=0"); + } catch (SQLException e) { + Server.error(e); + } + + } else { + world.setSession(session); + server.setIdle(world, false); + System.out.println("Reattached to world " + id); + try { + Server.db.updateQuery("UPDATE `rsca2_players` SET online=0"); + } catch (SQLException e) { + Server.error(e); + } + + } + int playerCount = p.readShort(); + for (int i = 0; i < playerCount; i++) { + world.registerPlayer(p.readLong(), DataConversions.IPToString(p.readLong())); + } + session.setAttachment(world); + builder.setSuccess(true); + } + } else { + World world = (World) session.getAttachment(); + + server.unregisterWorld(world); + System.out.println("UnRegistering world: " + world.getID()); + session.setAttachment(null); + builder.setSuccess(true); + } + + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/ReportHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/ReportHandler.java.svn-base new file mode 100644 index 0000000..0fcacb0 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/ReportHandler.java.svn-base @@ -0,0 +1,34 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class ReportHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + + final long user = p.readLong(); + final long reported = p.readLong(); + final byte reason = p.readByte(); + world.getActionSender().requestReportInfo(reported, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) throws Exception { + int x = p.readShort(); + int y = p.readShort(); + String status = p.readString(); + try { + Server.db.updateQuery("INSERT INTO `rsca2_reports`(`from`, `about`, `time`, `reason`, `x`, `y`, `status`) VALUES('" + user + "', '" + reported + "', '" + (System.currentTimeMillis() / 1000) + "', '" + reason + "', '" + x + "', '" + y + "', '" + status + "')"); + } catch (SQLException e) { + Server.error(e); + } + } + }); + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/SaveProfilesRequestHandler.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/SaveProfilesRequestHandler.java.svn-base new file mode 100644 index 0000000..0f6d6db --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/SaveProfilesRequestHandler.java.svn-base @@ -0,0 +1,42 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.ReplyPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class SaveProfilesRequestHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, final IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + World world = (World) session.getAttachment(); + System.out.println("World " + world.getID() + " requested we save all profiles"); + try { + Runtime.getRuntime().exec("/home/rsca/unblock"); + } catch (Exception err) { + System.out.println(err); + } + + boolean success = true; + // Iterator iterator = world.getAssosiatedSaves().iterator(); + // while(iterator.hasNext()) { + // PlayerSave profile = ((Entry)iterator.next()).getValue(); + // profile.save(); + // iterator.remove(); + // } + + builder.setUID(uID); + builder.setSuccess(success); + + LSPacket packet = builder.getPacket(); + if (packet != null) { + session.write(packet); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/Tradelog.java.svn-base b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/Tradelog.java.svn-base new file mode 100644 index 0000000..66210f2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/.svn/text-base/Tradelog.java.svn-base @@ -0,0 +1,21 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class Tradelog implements PacketHandler { + public void handlePacket(Packet p, IoSession session) throws Exception { + long from = p.readLong(); + long to = p.readLong(); + int item = p.readInt(); + long amount = p.readLong(); + int x = p.readInt(); + int y = p.readInt(); + int type = p.readInt(); + long date = (System.currentTimeMillis() / 1000); + Server.db.updateQuery("INSERT `rsca2_tradelog` VALUES('" + from + "','" + to + "','" + date + "','" + item + "','" + x + "','" + y + "','" + amount + "','" + type + "')"); + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java new file mode 100644 index 0000000..1117188 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java @@ -0,0 +1,53 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.ResultSet; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.ReplyPacketBuilder; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class BanHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + boolean banned = ((LSPacket) p).getID() == 4; + long user = p.readLong(); + long modhash = p.readLong(); + + ResultSet result = Server.db.getQuery("SELECT u.group_id, p.playermod, p.owner FROM `users` AS u INNER JOIN `pk_players` AS p ON p.owner=u.id WHERE p.user='" + user + "'"); + if (!result.next()) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } else if (banned && (result.getInt("group_id") < 3 || result.getInt("playermod") == 1)) { + builder.setSuccess(false); + builder.setReply("You cannot ban a (p)mod or admin!"); + } else if (Server.db.updateQuery("UPDATE `pk_players` SET `banned`='" + (banned ? "1" : "0") + "' WHERE `user` LIKE '" + user + "'") == 0) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } else { + World w = Server.getServer().findWorld(user); + if (w != null) { + w.getActionSender().logoutUser(user); + } + if (banned) + Server.db.updateQuery("INSERT `pk_banlog` VALUES('" + user + "','" + modhash + "','" + (System.currentTimeMillis() / 1000) + "')"); + builder.setSuccess(true); + builder.setReply(DataConversions.hashToUsername(user) + " has been " + (banned ? "banned" : "unbanned")); + } + builder.setUID(uID); + + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java.2 b/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java.2 new file mode 100644 index 0000000..9e4ac26 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java.2 @@ -0,0 +1,55 @@ +package org.rscdaemon.ls.packethandler.loginserver; + +import org.rscdaemon.ls.packethandler.PacketHandler; +import org.rscdaemon.ls.Server; +import org.rscdaemon.ls.model.World; +import org.rscdaemon.ls.net.LSPacket; +import org.rscdaemon.ls.net.Packet; +import org.rscdaemon.ls.util.DataConversions; +import org.rscdaemon.ls.packetbuilder.loginserver.ReplyPacketBuilder; + +import org.apache.mina.common.IoSession; + +import java.sql.ResultSet; + +public class BanHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket)p).getUID(); + boolean banned = ((LSPacket)p).getID() == 4; + long user = p.readLong(); + long modhash = p.readLong(); + + ResultSet result = Server.db.getQuery("SELECT u.group_id, p.playermod, p.owner FROM `users` AS u INNER JOIN `rscd_players` AS p ON p.owner=u.id WHERE p.user=" + user); + if(!result.next()) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else if(banned && (result.getInt("group_id") < 3 || result.getInt("playermod") == 1)) { + builder.setSuccess(false); + builder.setReply("You cannot ban a (p)mod or admin!"); + } + else if(Server.db.updateQuery("UPDATE `rscd_players` SET `banned`='" + (banned ? "1" : "0") + "' WHERE `user` LIKE '" + user + "'") == 0) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else { + World w = Server.getServer().findWorld(user); + if(w != null) { + w.getActionSender().logoutUser(user); + } + if(banned) Server.db.updateQuery("INSERT `rscd_banlog` VALUES('" + user + "','" + modhash + "','" + (System.currentTimeMillis() / 1000) + "')"); + builder.setSuccess(true); + builder.setReply(DataConversions.hashToUsername(user) + " has been " + (banned ? "banned" : "unbanned")); + } + builder.setUID(uID); + + LSPacket temp = builder.getPacket(); + if(temp != null) { + session.write(temp); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java.autothread b/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java.autothread new file mode 100644 index 0000000..8d11aa5 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/BanHandler.java.autothread @@ -0,0 +1,68 @@ +package org.rscdaemon.ls.packethandler.loginserver; + +import org.rscdaemon.ls.packethandler.PacketHandler; +import org.rscdaemon.ls.Server; +import org.rscdaemon.ls.model.World; +import org.rscdaemon.ls.net.LSPacket; +import org.rscdaemon.ls.net.Packet; +import org.rscdaemon.ls.util.DataConversions; +import org.rscdaemon.ls.packetbuilder.loginserver.ReplyPacketBuilder; + +import org.apache.mina.common.IoSession; + +import java.sql.ResultSet; + +public class BanHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket)p).getUID(); + boolean banned = ((LSPacket)p).getID() == 4; + long user = p.readLong(); + long modhash = p.readLong(); + + ResultSet result = Server.db.getQuery("SELECT u.group_id, p.playermod, p.owner FROM `users` AS u INNER JOIN `rscd_players` AS p ON p.owner=u.id WHERE p.user=" + user); + if(!result.next()) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else if(banned && (result.getInt("group_id") < 3 || result.getInt("playermod") == 1)) { + builder.setSuccess(false); + builder.setReply("You cannot ban a (p)mod or admin!"); + } + else if(Server.db.updateQuery("UPDATE `rscd_players` SET `banned`='" + (banned ? "1" : "0") + "' WHERE `user` LIKE '" + user + "'") == 0) { + builder.setSuccess(false); + builder.setReply("There is not an account by that username"); + } + else { + World w = Server.getServer().findWorld(user); + if(w != null) { + w.getActionSender().logoutUser(user); + } + if(banned) { + String owner = result.getString("owner"); + Server.db.updateQuery("INSERT `rscd_banlog` VALUES('" + user + "','" + modhash + "','" + (System.currentTimeMillis() / 1000) + "')"); + ResultSet result2 = Server.db.getQuery("SELECT username FROM `users` WHERE id=" + owner); + + String username = result2.getString("username"); + Server.db.updateQuery("INSERT `topics` (poster, subject, posted, last_post, last_poster, forum_id) VALUES('" + username + "','[" + DataConversions.hashToUsername(user) + "] Banned by [" + DataConversions.hashToUsername(modhash) + "]','" + (System.currentTimeMillis() / 1000) + "','" + (System.currentTimeMillis() / 1000) + "','" + username + "','19')"); + ResultSet result3 = Server.db.getQuery("SELECT LAST_INSERT_ID()"); + String tid = result3.getString(1); + Server.db.updateQuery("INSERT `posts` (poster, poster_ip, poster_email, message, hide_smilies, posted, topic_id) VALUES('" + username + "','0.0.0.0','null@null.org', This thread will close in 24h, post in here if you are the account owner.','1','" + (System.currentTimeMillis() / 1000) + "','" + tid + "')"); + ResultSet result4 = Server.db.getQuery("SELECT LAST_INSERT_ID()"); + String pid = result4.getString(1); + Server.db.updateQuery("UPDATE `posts` SET last_post_id=`" + pid + "` WHERE id=`" + tid + "`"); + } + builder.setSuccess(true); + builder.setReply(DataConversions.hashToUsername(user) + " has been " + (banned ? "banned" : "unbanned")); + } + builder.setUID(uID); + + LSPacket temp = builder.getPacket(); + if(temp != null) { + session.write(temp); + } + + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/FriendHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/FriendHandler.java new file mode 100644 index 0000000..cb850a1 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/FriendHandler.java @@ -0,0 +1,87 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class FriendHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + Server server = Server.getServer(); + + long user = p.readLong(); + long friend = p.readLong(); + + World w; + PlayerSave save = server.findSave(user, world); + switch (((LSPacket) p).getID()) { + case 10: // Send PM + boolean avoidBlock = p.readByte() == 1; + byte[] message = p.getRemainingData(); + w = server.findWorld(friend); + if (w != null) { + w.getActionSender().sendPM(user, friend, avoidBlock, message); + } + break; + case 11: // Add friend + try { + save.addFriend(friend); + Server.db.updateQuery("INSERT INTO `pk_friends`(`user`, `friend`) VALUES('" + user + "', '" + friend + "')"); + if (Server.db.getQuery("SELECT 1 FROM `pk_players` AS p LEFT JOIN `pk_friends` AS f ON f.user=p.user WHERE (p.block_private=0 OR f.friend='" + user + "') AND p.user='" + friend + "'").next()) { + w = server.findWorld(friend); + if (w != null) { + world.getActionSender().friendLogin(user, friend, w.getID()); + } + } + if (Server.db.getQuery("SELECT 1 FROM `pk_players` AS p LEFT JOIN `pk_friends` AS f ON f.friend=p.user WHERE p.block_private=1 AND f.user='" + friend + "' AND p.user='" + user + "'").next()) { + w = server.findWorld(friend); + if (w != null) { + w.getActionSender().friendLogin(friend, user, world.getID()); + } + } + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 12: // Remove friend + try { + save.removeFriend(friend); + Server.db.updateQuery("DELETE FROM `pk_friends` WHERE `user` LIKE '" + user + "' AND `friend` LIKE '" + friend + "'"); + if (Server.db.getQuery("SELECT 1 FROM `pk_players` WHERE block_private=1 AND user='" + user + "'").next()) { + w = server.findWorld(friend); + if (w != null) { + w.getActionSender().friendLogout(friend, user); + } + } + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 13: // Add ignore + try { + save.addIgnore(friend); + Server.db.updateQuery("INSERT INTO `pk_ignores`(`user`, `ignore`) VALUES('" + user + "', '" + friend + "')"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 14: // Remove ignore + try { + save.removeIgnore(friend); + Server.db.updateQuery("DELETE FROM `pk_ignores` WHERE `user` LIKE '" + user + "' AND `ignore` LIKE '" + friend + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/GameSettingHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/GameSettingHandler.java new file mode 100644 index 0000000..393a6a0 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/GameSettingHandler.java @@ -0,0 +1,66 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class GameSettingHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + long user = p.readLong(); + boolean on = p.readByte() == 1; + int idx = (int) p.readByte(); + switch (idx) { + case 0: // Camera Auto + try { + Server.db.updateQuery("UPDATE `pk_players` SET cameraauto=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 2: // One Mouse + try { + Server.db.updateQuery("UPDATE `pk_players` SET onemouse=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 3: // Sound Off + try { + Server.db.updateQuery("UPDATE `pk_players` SET soundoff=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 4: // Show Roof + try { + Server.db.updateQuery("UPDATE `pk_players` SET showroof=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 5: // Auto Screenshot + try { + Server.db.updateQuery("UPDATE `pk_players` SET autoscreenshot=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 6: // Combat Window + try { + Server.db.updateQuery("UPDATE `pk_players` SET combatwindow=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + } + Server.getServer().findSave(user, world).setGameSetting(idx, on); + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/KillHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/KillHandler.java new file mode 100644 index 0000000..36fbca9 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/KillHandler.java @@ -0,0 +1,21 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class KillHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + try { + Server.db.updateQuery("INSERT INTO `pk_kills`(`user`, `killed`, `time`, `type`) VALUES('" + p.readLong() + "', '" + p.readLong() + "', " + (int) (System.currentTimeMillis() / 1000) + ", " + p.readByte() + ")"); + } catch (SQLException e) { + e.printStackTrace(); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/LogHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/LogHandler.java new file mode 100644 index 0000000..d61dbe2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/LogHandler.java @@ -0,0 +1,59 @@ +package rsca.ls.packethandler.loginserver; + +import java.io.File; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.Config; + +public class LogHandler implements PacketHandler { + private static PrintWriter error; + + private static PrintWriter event; + private static final SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss dd-MM-yy"); + private static PrintWriter mod; + private static PrintWriter exception; + static { + try { + event = new PrintWriter(new File(Config.LOG_DIR, "event.log")); + error = new PrintWriter(new File(Config.LOG_DIR, "error.log")); + mod = new PrintWriter(new File(Config.LOG_DIR, "mod.log")); + exception = new PrintWriter(new File(Config.LOG_DIR, "err.log")); + } catch (Exception e) { + Server.error(e); + } + } + + private static String getDate() { + return formatter.format(System.currentTimeMillis()); + } + + public void handlePacket(Packet p, IoSession session) throws Exception { + byte type = p.readByte(); + String message = getDate() + ": " + p.readString(); + switch (type) { + case 1: + event.println(message); + event.flush(); + break; + case 2: + error.println(message); + error.flush(); + break; + case 3: + mod.println(message); + mod.flush(); + break; + case 4: + exception.println(message); + exception.flush(); + break; + } + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerInfoRequestHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerInfoRequestHandler.java new file mode 100644 index 0000000..831aef2 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerInfoRequestHandler.java @@ -0,0 +1,42 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.LSPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class PlayerInfoRequestHandler implements PacketHandler { + + public void handlePacket(Packet p, final IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + final long user = p.readLong(); + final World w = Server.getServer().findWorld(user); + if (w == null) { + LSPacketBuilder builder = new LSPacketBuilder(); + builder.setUID(uID); + builder.addByte((byte) 0); + session.write(builder.toPacket()); + return; + } + w.getActionSender().requestPlayerInfo(user, new PacketHandler() { + public void handlePacket(Packet p, IoSession s) throws Exception { + LSPacketBuilder builder = new LSPacketBuilder(); + builder.setUID(uID); + if (p.readByte() == 0) { + builder.addByte((byte) 0); + } else { + builder.addByte((byte) 1); + builder.addShort(w == null ? 0 : w.getID()); + builder.addBytes(p.getRemainingData()); + } + session.write(builder.toPacket()); + } + }); + + } + +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLoginHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLoginHandler.java new file mode 100644 index 0000000..0b8c1f1 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLoginHandler.java @@ -0,0 +1,108 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Map.Entry; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.PlayerLoginPacketBuilder; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class PlayerLoginHandler implements PacketHandler { + public static ArrayList badClients = new ArrayList(); + private PlayerLoginPacketBuilder builder = new PlayerLoginPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + World world = (World) session.getAttachment(); + long user = p.readLong(); + String ip = DataConversions.IPToString(p.readLong()); + String pass = p.readString(32).trim(); + String className = p.readString(); + byte loginCode = validatePlayer(user, pass, ip); + + builder.setUID(uID); + if (loginCode == 0 || loginCode == 1 || loginCode == 99) { + try { + badClients.add(DataConversions.hashToUsername(user)); + System.out.println("Class: " + className + " Player: " + DataConversions.hashToUsername(user)); + } catch (Exception e) { + System.out.println("Exception in classname printer :" + e.getMessage()); + } + // if(!className.equals("ORG.RSCDAEMON.CLIENT.MUDCLIENT")) { + // System.out.println(DataConversions.hashToUsername(user) + + // " was caught by a trap"); + // try { + // Server.db.updateQuery("INSERT INTO `pk_traps`(`user`, `time`, `ip`, `details`) VALUES('" + // + user + "', '" + (int)(System.currentTimeMillis() / 1000) + + // "', '" + ip + "', 'Unknown main class: \"" + className +"\"')"); + // } catch(Exception e) { } + // } + try { + Server.db.updateQuery("UPDATE `pk_players` SET online=1 WHERE user='" + user + "'"); + } catch (Exception e) { + } + + builder.setPlayer(Server.getServer().findSave(user, world), loginCode); + world.registerPlayer(user, ip); + } else { + builder.setPlayer(null, loginCode); + } + + LSPacket packet = builder.getPacket(); + if (packet != null) { + session.write(packet); + } + } + + private byte validatePlayer(long user, String pass, String ip) { + Server server = Server.getServer(); + byte returnVal = 0; + + try { + ResultSet result = Server.db.getQuery("SELECT r.pass, r.banned, r.owner, u.group_id, b.id AS b_id FROM `pk_players` AS r INNER JOIN `users` AS u ON u.id=r.owner LEFT JOIN `bans` AS b on (b.username LIKE u.username OR b.ip LIKE '" + ip + "') WHERE `user`='" + user + "'"); + if (!result.next()) { + return 2; + } + if (!pass.equalsIgnoreCase(result.getString("pass"))) { + return 2; + } + + if (result.getInt("banned") == 1 || result.getInt("b_id") != 0) { + System.out.println("Banned player: " + DataConversions.hashToUsername(user) + " trying to login."); + return 6; + } + + if (result.getInt("group_id") == 1 || result.getInt("group_id") == 2) { + returnVal = 99; + } + + int owner = result.getInt("owner"); + for (World w : server.getWorlds()) { + for (Entry player : w.getPlayers()) { + if (player.getKey() == user) { + return 3; + } + if (player.getValue() == owner) { + return 9; + } + } + if (w.hasPlayer(user)) { + return 3; + } + } + return returnVal; + } catch (SQLException e) { + System.out.println("Exception in PlayerLoginHandler :" + e.getMessage()); + //System.out.println(e.getMessage(), e); + return 7; + } + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLoginHandler.java.1 b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLoginHandler.java.1 new file mode 100644 index 0000000..de3e0fe --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLoginHandler.java.1 @@ -0,0 +1,89 @@ +package org.rscdaemon.ls.packethandler.loginserver; + +import org.rscdaemon.ls.packethandler.PacketHandler; +import org.rscdaemon.ls.Server; +import org.rscdaemon.ls.model.World; +import org.rscdaemon.ls.net.LSPacket; +import org.rscdaemon.ls.net.Packet; +import org.rscdaemon.ls.util.DataConversions; +import org.rscdaemon.ls.packetbuilder.loginserver.PlayerLoginPacketBuilder; + +import org.apache.mina.common.IoSession; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map.Entry; + +public class PlayerLoginHandler implements PacketHandler { + private PlayerLoginPacketBuilder builder = new PlayerLoginPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket)p).getUID(); + World world = (World)session.getAttachment(); + long user = p.readLong(); + String ip = DataConversions.IPToString(p.readLong()); + String pass = p.readString(32).trim(); + String className = p.readString(); + byte loginCode = validatePlayer(user, pass, ip); + + builder.setUID(uID); + if(loginCode == 0 || loginCode == 1 || loginCode == 99) { +// if(!className.equals("ORG.RSCDAEMON.CLIENT.MUDCLIENT")) { +// System.out.println(DataConversions.hashToUsername(user) + " was caught by a trap"); +// try { Server.db.updateQuery("INSERT INTO `rscd_traps`(`user`, `time`, `ip`, `details`) VALUES('" + user + "', '" + (int)(System.currentTimeMillis() / 1000) + "', '" + ip + "', 'Unknown main class: \"" + className +"\"')"); } catch(Exception e) { } +// } + builder.setPlayer(Server.getServer().findSave(user, world), loginCode); + world.registerPlayer(user, ip); + } + else { + builder.setPlayer(null, loginCode); + } + + LSPacket packet = builder.getPacket(); + if(packet != null) { + session.write(packet); + } + } + + private byte validatePlayer(long user, String pass, String ip) { + Server server = Server.getServer(); + byte returnVal = 0; + + try { + ResultSet result = Server.db.getQuery("SELECT r.pass, r.banned, r.owner, u.group_id, b.id AS b_id FROM `rscd_players` AS r INNER JOIN `users` AS u ON u.id=r.owner LEFT JOIN `bans` AS b on (b.username LIKE u.username OR b.ip LIKE '" + ip + "') WHERE `user`=" + user); + if(!result.next() || !pass.equalsIgnoreCase(result.getString("pass"))) { + System.out.println(result.getString("pass")); + return 2; + } + + if(result.getInt("banned") == 1 || result.getInt("b_id") != 0) { + return 6; + } + + if(result.getInt("group_id") == 1 || result.getInt("group_id") == 2) { + returnVal = 99; + } + + int owner = result.getInt("owner"); + for(World w : server.getWorlds()) { + for(Entry player : w.getPlayers()) { + if(player.getKey() == user) { + return 3; + } + if(player.getValue() == owner) { + return 9; + } + } + if(w.hasPlayer(user)) { + return 3; + } + } + return returnVal; + } + catch(SQLException e) { + System.out.println("Exception in PlayerLoginHandler :" + e.getMessage()); + //System.out.println(e.getMessage(), e); + return 7; + } + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLogoutHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLogoutHandler.java new file mode 100644 index 0000000..a42f67c --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerLogoutHandler.java @@ -0,0 +1,16 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class PlayerLogoutHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + long user = p.readLong(); + World world = (World) session.getAttachment(); + world.unregisterPlayer(user); + } +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerSaveHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerSaveHandler.java new file mode 100644 index 0000000..bc78721 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/PlayerSaveHandler.java @@ -0,0 +1,67 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.PlayerSave; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class PlayerSaveHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + long usernameHash = p.readLong(); + int owner = p.readInt(); + PlayerSave save = Server.getServer().findSave(usernameHash, world); + if (save == null) { + System.out.println("Error loading data for: " + DataConversions.hashToUsername(usernameHash)); + return; + } + System.out.println("Adding save data for: " + save.getUsername()); + + if (owner != save.getOwner()) { + System.out.println("WARNING ATTEMPTED DUPE"); + } + + save.setOwner(owner); + save.setLogin(p.readLong(), p.readLong()); + save.setTotals(p.readShort(), p.readShort()); + save.setLocation(p.readShort(), p.readShort()); + save.setFatigue(p.readShort()); + save.setAppearance(p.readByte(), p.readByte(), p.readByte(), p.readByte(), p.readByte(), p.readByte(), p.readByte() == 1, p.readLong()); + save.setCombatStyle(p.readByte()); + //save.setPoints(p.readInt()); + + for (int i = 0; i < 18; i++) { + save.setStat(i, p.readLong(), p.readShort()); + } + + int invCount = p.readShort(); + save.clearInvItems(); + for (int i = 0; i < invCount; i++) { + save.addInvItem(p.readShort(), p.readInt(), p.readByte() == 1); + } + + int bnkCount = p.readShort(); + save.clearBankItems(); + for (int i = 0; i < bnkCount; i++) { + save.addBankItem(p.readShort(), p.readInt()); + } + + save.setQuestPoints(p.readShort()); + int qstCount = p.readShort(); + for (int i = 0; i < qstCount; i++) + save.setQuestStage(p.readShort(), p.readShort()); + + save.setEventCD(p.readLong()); + + save.setLastUpdate(System.currentTimeMillis()); + if (!save.save()) { // we shouldnt always save right away + System.out.println("Error saving: " + save.getUsername()); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/PrivacySettingHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/PrivacySettingHandler.java new file mode 100644 index 0000000..9ed4ce8 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/PrivacySettingHandler.java @@ -0,0 +1,67 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class PrivacySettingHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + Server server = Server.getServer(); + + long user = p.readLong(); + boolean on = p.readByte() == 1; + int idx = (int) p.readByte(); + switch (idx) { + case 0: // Chat block + try { + Server.db.updateQuery("UPDATE `pk_players` SET block_chat=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 1: // Private block + try { + Server.db.updateQuery("UPDATE `pk_players` SET block_private=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + ResultSet result = Server.db.getQuery("SELECT user FROM `pk_friends` WHERE friend='" + user + "' AND user NOT IN (SELECT friend FROM `pk_friends` WHERE user='" + user + "')"); + while (result.next()) { + long friend = result.getLong("user"); + World w = server.findWorld(friend); + if (w != null) { + if (on) { + w.getActionSender().friendLogout(friend, user); + } else { + w.getActionSender().friendLogin(friend, user, world.getID()); + } + } + } + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 2: // Trade block + try { + Server.db.updateQuery("UPDATE `pk_players` SET block_trade=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + case 3: // Duel block + try { + Server.db.updateQuery("UPDATE `pk_players` SET block_duel=" + (on ? 1 : 0) + " WHERE user='" + user + "'"); + } catch (SQLException e) { + Server.error(e.getMessage()); + } + break; + } + server.findSave(user, world).setPrivacySetting(idx, on); + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/RegisterWorld.java b/LoginServer/src/rsca/ls/packethandler/loginserver/RegisterWorld.java new file mode 100644 index 0000000..8761b5b --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/RegisterWorld.java @@ -0,0 +1,72 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.WorldRegisteredPacketBuilder; +import rsca.ls.packethandler.PacketHandler; +import rsca.ls.util.DataConversions; + +public class RegisterWorld implements PacketHandler { + private WorldRegisteredPacketBuilder builder = new WorldRegisteredPacketBuilder(); + + public void handlePacket(Packet p, IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + builder.setUID(uID); + builder.setSuccess(false); + + Server server = Server.getServer(); + if (((LSPacket) p).getID() == 1) { + int id = p.readShort(); + if (server.getWorld(id) == null) { + World world = server.getIdleWorld(id); + if (world == null) { + world = new World(id, session); + server.registerWorld(world); + System.out.println("Registering world: " + id); + try { + if (id == 1) + Server.db.updateQuery("UPDATE `pk_players` SET online=0"); + } catch (SQLException e) { + Server.error(e); + } + + } else { + world.setSession(session); + server.setIdle(world, false); + System.out.println("Reattached to world " + id); + try { + Server.db.updateQuery("UPDATE `pk_players` SET online=0"); + } catch (SQLException e) { + Server.error(e); + } + + } + int playerCount = p.readShort(); + for (int i = 0; i < playerCount; i++) { + world.registerPlayer(p.readLong(), DataConversions.IPToString(p.readLong())); + } + session.setAttachment(world); + builder.setSuccess(true); + } + } else { + World world = (World) session.getAttachment(); + + server.unregisterWorld(world); + System.out.println("UnRegistering world: " + world.getID()); + session.setAttachment(null); + builder.setSuccess(true); + } + + LSPacket temp = builder.getPacket(); + if (temp != null) { + session.write(temp); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/ReportHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/ReportHandler.java new file mode 100644 index 0000000..d536d32 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/ReportHandler.java @@ -0,0 +1,34 @@ +package rsca.ls.packethandler.loginserver; + +import java.sql.SQLException; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.model.World; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class ReportHandler implements PacketHandler { + + public void handlePacket(Packet p, IoSession session) throws Exception { + World world = (World) session.getAttachment(); + + final long user = p.readLong(); + final long reported = p.readLong(); + final byte reason = p.readByte(); + world.getActionSender().requestReportInfo(reported, new PacketHandler() { + public void handlePacket(Packet p, IoSession session) throws Exception { + int x = p.readShort(); + int y = p.readShort(); + String status = p.readString(); + try { + Server.db.updateQuery("INSERT INTO `pk_reports`(`from`, `about`, `time`, `reason`, `x`, `y`, `status`) VALUES('" + user + "', '" + reported + "', '" + (System.currentTimeMillis() / 1000) + "', '" + reason + "', '" + x + "', '" + y + "', '" + status + "')"); + } catch (SQLException e) { + Server.error(e); + } + } + }); + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/SaveProfilesRequestHandler.java b/LoginServer/src/rsca/ls/packethandler/loginserver/SaveProfilesRequestHandler.java new file mode 100644 index 0000000..98d6f62 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/SaveProfilesRequestHandler.java @@ -0,0 +1,44 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.model.World; +import rsca.ls.net.LSPacket; +import rsca.ls.net.Packet; +import rsca.ls.packetbuilder.loginserver.ReplyPacketBuilder; +import rsca.ls.packethandler.PacketHandler; + +public class SaveProfilesRequestHandler implements PacketHandler { + private ReplyPacketBuilder builder = new ReplyPacketBuilder(); + + public void handlePacket(Packet p, final IoSession session) throws Exception { + final long uID = ((LSPacket) p).getUID(); + World world = (World) session.getAttachment(); + System.out.println("World " + world.getID() + " requested we save all profiles"); + /** + try { + //Runtime.getRuntime().exec("/home/rsca/unblock"); + } catch (Exception err) { + System.out.println(err); + } + **/ + + boolean success = true; + // Iterator iterator = world.getAssosiatedSaves().iterator(); + // while(iterator.hasNext()) { + // PlayerSave profile = ((Entry)iterator.next()).getValue(); + // profile.save(); + // iterator.remove(); + // } + + builder.setUID(uID); + builder.setSuccess(success); + + LSPacket packet = builder.getPacket(); + if (packet != null) { + session.write(packet); + } + } + +} diff --git a/LoginServer/src/rsca/ls/packethandler/loginserver/Tradelog.java b/LoginServer/src/rsca/ls/packethandler/loginserver/Tradelog.java new file mode 100644 index 0000000..b276af4 --- /dev/null +++ b/LoginServer/src/rsca/ls/packethandler/loginserver/Tradelog.java @@ -0,0 +1,21 @@ +package rsca.ls.packethandler.loginserver; + +import org.apache.mina.common.IoSession; + +import rsca.ls.Server; +import rsca.ls.net.Packet; +import rsca.ls.packethandler.PacketHandler; + +public class Tradelog implements PacketHandler { + public void handlePacket(Packet p, IoSession session) throws Exception { + long from = p.readLong(); + long to = p.readLong(); + int item = p.readInt(); + long amount = p.readLong(); + int x = p.readInt(); + int y = p.readInt(); + int type = p.readInt(); + long date = (System.currentTimeMillis() / 1000); + Server.db.updateQuery("INSERT `pk_tradelog` VALUES('" + from + "','" + to + "','" + date + "','" + item + "','" + x + "','" + y + "','" + amount + "','" + type + "')"); + } +} diff --git a/LoginServer/src/rsca/ls/util/.svn/entries b/LoginServer/src/rsca/ls/util/.svn/entries new file mode 100644 index 0000000..1d0fb8f --- /dev/null +++ b/LoginServer/src/rsca/ls/util/.svn/entries @@ -0,0 +1,130 @@ +9 + +dir +416 +svn://localhost/F2P_RSCD/src/rsca/ls/util +svn://localhost + + + +2009-09-05T12:50:46.724777Z +203 +xEnt + + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +148ed574-2c31-4338-a85f-4a89e8d7a751 + +PersistenceManager.java +file + + + + +2009-10-23T16:32:26.000000Z +5907d4022c1f483b62e13a4f92763f03 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1731 + +DataConversions.java +file + + + + +2009-10-23T16:32:26.000000Z +d1c133d2daabde5c93917d69b83f482c +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1810 + +Config.java +file + + + + +2009-10-23T16:32:26.000000Z +ab83718198267ecd09fa153c0b5c4703 +2009-09-05T12:50:46.724777Z +203 +xEnt + + + + + + + + + + + + + + + + + + + + + +1695 + diff --git a/LoginServer/src/rsca/ls/util/.svn/format b/LoginServer/src/rsca/ls/util/.svn/format new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/LoginServer/src/rsca/ls/util/.svn/format @@ -0,0 +1 @@ +9 diff --git a/LoginServer/src/rsca/ls/util/.svn/text-base/Config.java.svn-base b/LoginServer/src/rsca/ls/util/.svn/text-base/Config.java.svn-base new file mode 100644 index 0000000..26e0239 --- /dev/null +++ b/LoginServer/src/rsca/ls/util/.svn/text-base/Config.java.svn-base @@ -0,0 +1,63 @@ +package rsca.ls.util; + +/** + * A class to handle loading configuration from XML + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class Config { + public static int LS_PORT, QUERY_PORT; + + public static String RSCDLS_HOME, CONF_DIR, LOG_DIR, MYSQL_HOST, MYSQL_DB, MYSQL_USER, MYSQL_PASS, LS_IP, QUERY_IP; + + public static long START_TIME; + + static { + loadEnv(); + } + + /** + * Called to load config settings from the given file + * + * @param file + * the xml file to load settings from + * @throws IOException + * if an i/o error occurs + */ + public static void initConfig(String file) throws IOException { + START_TIME = System.currentTimeMillis(); + + Properties props = new Properties(); + props.loadFromXML(new FileInputStream(file)); + + MYSQL_HOST = props.getProperty("mysqlhost"); + MYSQL_DB = props.getProperty("mysqldb"); + MYSQL_USER = props.getProperty("mysqluser"); + MYSQL_PASS = props.getProperty("mysqlpass"); + + LS_IP = props.getProperty("lsip"); + LS_PORT = Integer.parseInt(props.getProperty("lsport")); + QUERY_IP = props.getProperty("queryip"); + QUERY_PORT = Integer.parseInt(props.getProperty("queryport")); + + props.clear(); + } + + /** + * Called to load RSCDLS_HOME and CONF_DIR Used to be situated in + * PersistenceManager + */ + private static void loadEnv() { + String home = System.getenv("RSCDLS_HOME"); + if (home == null) { // the env var hasnt been set, fall back to . + home = "."; + } + CONF_DIR = home + File.separator + "conf" + File.separator + "ls"; + LOG_DIR = home + File.separator + "logs"; + RSCDLS_HOME = home; + } +} diff --git a/LoginServer/src/rsca/ls/util/.svn/text-base/DataConversions.java.svn-base b/LoginServer/src/rsca/ls/util/.svn/text-base/DataConversions.java.svn-base new file mode 100644 index 0000000..7e1279c --- /dev/null +++ b/LoginServer/src/rsca/ls/util/.svn/text-base/DataConversions.java.svn-base @@ -0,0 +1,81 @@ +package rsca.ls.util; + +public class DataConversions { + /** + * Converts a usernames hash back to the username + */ + public static String hashToUsername(long l) { + if (l < 0L) + return "invalid_name"; + String s = ""; + while (l != 0L) { + int i = (int) (l % 37L); + l /= 37L; + if (i == 0) + s = " " + s; + else if (i < 27) { + if (l % 37L == 0L) + s = (char) ((i + 65) - 1) + s; + else + s = (char) ((i + 97) - 1) + s; + } else { + s = (char) ((i + 48) - 27) + s; + } + } + return s; + } + + public static long IPToLong(String ip) { + String[] octets = ip.split("\\."); + long result = 0L; + for (int x = 0; x < 4; x++) { + result += Integer.parseInt(octets[x]) * Math.pow(256, 3 - x); + } + return result; + } + + public static String IPToString(long ip) { + String result = "0.0.0.0"; + for (int x = 0; x < 4; x++) { + int octet = (int) (ip / Math.pow(256, 3 - x)); + ip -= octet * Math.pow(256, 3 - x); + if (x == 0) { + result = String.valueOf(octet); + } else { + result += ("." + octet); + } + } + return result; + } + + /** + * Converts a username to a unique hash + */ + public static long usernameToHash(String s) { + s = s.toLowerCase(); + String s1 = ""; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c >= 'a' && c <= 'z') + s1 = s1 + c; + else if (c >= '0' && c <= '9') + s1 = s1 + c; + else + s1 = s1 + ' '; + } + + s1 = s1.trim(); + if (s1.length() > 12) + s1 = s1.substring(0, 12); + long l = 0L; + for (int j = 0; j < s1.length(); j++) { + char c1 = s1.charAt(j); + l *= 37L; + if (c1 >= 'a' && c1 <= 'z') + l += (1 + c1) - 97; + else if (c1 >= '0' && c1 <= '9') + l += (27 + c1) - 48; + } + return l; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/util/.svn/text-base/PersistenceManager.java.svn-base b/LoginServer/src/rsca/ls/util/.svn/text-base/PersistenceManager.java.svn-base new file mode 100644 index 0000000..bd7eba2 --- /dev/null +++ b/LoginServer/src/rsca/ls/util/.svn/text-base/PersistenceManager.java.svn-base @@ -0,0 +1,65 @@ +package rsca.ls.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.Properties; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import rsca.ls.Server; + +import com.thoughtworks.xstream.XStream; + +public class PersistenceManager { + private static final XStream xstream = new XStream(); + + static { + setupAliases(); + } + + public static Object load(String filename) { + try { + InputStream is = new FileInputStream(new File(Config.CONF_DIR, filename)); + if (filename.endsWith(".gz")) { + is = new GZIPInputStream(is); + } + Object rv = xstream.fromXML(is); + return rv; + } catch (IOException ioe) { + Server.error(ioe); + } + return null; + } + + public static void setupAliases() { + try { + Properties aliases = new Properties(); + FileInputStream fis = new FileInputStream(new File(Config.CONF_DIR, "aliases.xml")); + aliases.loadFromXML(fis); + for (Enumeration e = aliases.propertyNames(); e.hasMoreElements();) { + String alias = (String) e.nextElement(); + Class c = Class.forName((String) aliases.get(alias)); + xstream.alias(alias, c); + } + } catch (Exception ioe) { + Server.error(ioe); + } + } + + public static void write(String filename, Object o) { + try { + OutputStream os = new FileOutputStream(new File(Config.CONF_DIR, filename)); + if (filename.endsWith(".gz")) { + os = new GZIPOutputStream(os); + } + xstream.toXML(o, os); + } catch (IOException ioe) { + Server.error(ioe); + } + } +} diff --git a/LoginServer/src/rsca/ls/util/Config.java b/LoginServer/src/rsca/ls/util/Config.java new file mode 100644 index 0000000..e062ac2 --- /dev/null +++ b/LoginServer/src/rsca/ls/util/Config.java @@ -0,0 +1,63 @@ +package rsca.ls.util; + +/** + * A class to handle loading configuration from XML + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.Properties; + +public class Config { + public static int LS_PORT, QUERY_PORT; + + public static String RSCDLS_HOME, CONF_DIR, LOG_DIR, MYSQL_HOST, MYSQL_DB, MYSQL_USER, MYSQL_PASS, LS_IP, QUERY_IP; + + public static long START_TIME; + + static { + loadEnv(); + } + + /** + * Called to load config settings from the given file + * + * @param file + * the xml file to load settings from + * @throws IOException + * if an i/o error occurs + */ + public static void initConfig(String file) throws IOException { + START_TIME = System.currentTimeMillis(); + + Properties props = new Properties(); + props.loadFromXML(new FileInputStream(file)); + + MYSQL_HOST = props.getProperty("mysqlhost"); + MYSQL_DB = props.getProperty("mysqldb"); + MYSQL_USER = props.getProperty("mysqluser"); + MYSQL_PASS = props.getProperty("mysqlpass"); + + LS_IP = props.getProperty("lsip"); + LS_PORT = Integer.parseInt(props.getProperty("lsport")); + QUERY_IP = props.getProperty("queryip"); + QUERY_PORT = Integer.parseInt(props.getProperty("queryport")); + + props.clear(); + } + + /** + * Called to load RSCDLS_HOME and CONF_DIR Used to be situated in + * PersistenceManager + */ + private static void loadEnv() { + String home = System.getenv("RSCDLS_HOME"); + if (home == null) { // the env var hasnt been set, fall back to . + home = "."; + } + CONF_DIR = home + File.separator + "conf" + File.separator + "ls"; + LOG_DIR = home + File.separator + "logs"; + RSCDLS_HOME = home; + } +} diff --git a/LoginServer/src/rsca/ls/util/DataConversions.java b/LoginServer/src/rsca/ls/util/DataConversions.java new file mode 100644 index 0000000..7e1279c --- /dev/null +++ b/LoginServer/src/rsca/ls/util/DataConversions.java @@ -0,0 +1,81 @@ +package rsca.ls.util; + +public class DataConversions { + /** + * Converts a usernames hash back to the username + */ + public static String hashToUsername(long l) { + if (l < 0L) + return "invalid_name"; + String s = ""; + while (l != 0L) { + int i = (int) (l % 37L); + l /= 37L; + if (i == 0) + s = " " + s; + else if (i < 27) { + if (l % 37L == 0L) + s = (char) ((i + 65) - 1) + s; + else + s = (char) ((i + 97) - 1) + s; + } else { + s = (char) ((i + 48) - 27) + s; + } + } + return s; + } + + public static long IPToLong(String ip) { + String[] octets = ip.split("\\."); + long result = 0L; + for (int x = 0; x < 4; x++) { + result += Integer.parseInt(octets[x]) * Math.pow(256, 3 - x); + } + return result; + } + + public static String IPToString(long ip) { + String result = "0.0.0.0"; + for (int x = 0; x < 4; x++) { + int octet = (int) (ip / Math.pow(256, 3 - x)); + ip -= octet * Math.pow(256, 3 - x); + if (x == 0) { + result = String.valueOf(octet); + } else { + result += ("." + octet); + } + } + return result; + } + + /** + * Converts a username to a unique hash + */ + public static long usernameToHash(String s) { + s = s.toLowerCase(); + String s1 = ""; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c >= 'a' && c <= 'z') + s1 = s1 + c; + else if (c >= '0' && c <= '9') + s1 = s1 + c; + else + s1 = s1 + ' '; + } + + s1 = s1.trim(); + if (s1.length() > 12) + s1 = s1.substring(0, 12); + long l = 0L; + for (int j = 0; j < s1.length(); j++) { + char c1 = s1.charAt(j); + l *= 37L; + if (c1 >= 'a' && c1 <= 'z') + l += (1 + c1) - 97; + else if (c1 >= '0' && c1 <= '9') + l += (27 + c1) - 48; + } + return l; + } +} \ No newline at end of file diff --git a/LoginServer/src/rsca/ls/util/PersistenceManager.java b/LoginServer/src/rsca/ls/util/PersistenceManager.java new file mode 100644 index 0000000..bd7eba2 --- /dev/null +++ b/LoginServer/src/rsca/ls/util/PersistenceManager.java @@ -0,0 +1,65 @@ +package rsca.ls.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.Properties; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +import rsca.ls.Server; + +import com.thoughtworks.xstream.XStream; + +public class PersistenceManager { + private static final XStream xstream = new XStream(); + + static { + setupAliases(); + } + + public static Object load(String filename) { + try { + InputStream is = new FileInputStream(new File(Config.CONF_DIR, filename)); + if (filename.endsWith(".gz")) { + is = new GZIPInputStream(is); + } + Object rv = xstream.fromXML(is); + return rv; + } catch (IOException ioe) { + Server.error(ioe); + } + return null; + } + + public static void setupAliases() { + try { + Properties aliases = new Properties(); + FileInputStream fis = new FileInputStream(new File(Config.CONF_DIR, "aliases.xml")); + aliases.loadFromXML(fis); + for (Enumeration e = aliases.propertyNames(); e.hasMoreElements();) { + String alias = (String) e.nextElement(); + Class c = Class.forName((String) aliases.get(alias)); + xstream.alias(alias, c); + } + } catch (Exception ioe) { + Server.error(ioe); + } + } + + public static void write(String filename, Object o) { + try { + OutputStream os = new FileOutputStream(new File(Config.CONF_DIR, filename)); + if (filename.endsWith(".gz")) { + os = new GZIPOutputStream(os); + } + xstream.toXML(o, os); + } catch (IOException ioe) { + Server.error(ioe); + } + } +}