Commit e57d5993 by 王一诺

init

parents
Showing with 13101 additions and 0 deletions
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="17" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/app/src/main/cpp/include/VpsMgr.h" charset="ISO-8859-1" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
<option value="$PROJECT_DIR$/app" />
</set>
</option>
<option name="resolveExternalAnnotations" value="false" />
</GradleProjectSettings>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>
\ No newline at end of file
/build
\ No newline at end of file
plugins {
alias(libs.plugins.android.application)
}
android {
namespace 'com.coolook.vps'
compileSdk 34
defaultConfig {
applicationId "com.coolook.vps"
minSdk 27
targetSdk 34
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// externalNativeBuild {
// cmake {
// cppFlags '-std=c++11'
// }
// }
}
// externalNativeBuild {
// cmake {
// path file('src/main/cpp/CMakeLists.txt')
// version '3.22.1'
// }
// }
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation libs.appcompat
implementation libs.material
implementation libs.activity
implementation libs.constraintlayout
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
}
\ No newline at end of file
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
\ No newline at end of file
package com.coolook.vps;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.coolook.vps", appContext.getPackageName());
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Vps"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
\ No newline at end of file
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html.
# For more examples on how to use CMake, see https://github.com/android/ndk-samples.
# Sets the minimum CMake version required for this project.
cmake_minimum_required(VERSION 3.22.1)
# Declares the project name. The project name can be accessed via ${ PROJECT_NAME},
# Since this is the top level CMakeLists.txt, the project name is also accessible
# with ${CMAKE_PROJECT_NAME} (both CMake variables are in-sync within the top level
# build script scope).
project("vps_sdk")
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.
#
# In this top level CMakeLists.txt, ${CMAKE_PROJECT_NAME} is used to define
# the target library name; in the sub-module's CMakeLists.txt, ${PROJECT_NAME}
# is preferred for the same purpose.
#
# In order to load a library into your app from Java/Kotlin, you must call
# System.loadLibrary() and pass the name of the library defined here;
# for GameActivity/NativeActivity derived applications, the same library name must be
# used in the AndroidManifest.xml file.
# 设置 include 目录
include_directories(include)
file(GLOB SOURCES "src/*.cpp")
add_library(${CMAKE_PROJECT_NAME} SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
${SOURCES}
)
# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries(${CMAKE_PROJECT_NAME}
# List libraries link to the target library
android
log)
\ No newline at end of file
#pragma once
#include "zxlist.h"
#include "semx.h"
typedef struct
{
struct list_head head;
semx_t *sem;
int id_next;
}channel_mgr_t;
typedef struct
{
struct list_head node;
int id;
int fd;
}channel_node_t;
extern channel_mgr_t g_channel_mgr;
int channel_mgr_init(channel_mgr_t *mgr);
int channel_mgr_release(channel_mgr_t *mgr);
int channel_mgr_list_clear(channel_mgr_t *mgr);
int channel_mgr_add_node(channel_mgr_t *mgr, channel_node_t *node);
int channel_mgr_del_node(channel_mgr_t *mgr, int id);
channel_node_t* channel_mgr_get_node(channel_mgr_t *mgr, int id);
channel_node_t* channel_mgr_get_node_and_del_from_list(channel_mgr_t *mgr, int id);
// id: 加入到channel_mgr的id, 用于删除结点
int channel_mgr_send_data_to_sdk(channel_mgr_t *mgr, int fd, unsigned char *data, int datalen, int *id);
int channel_mgr_send_data_to_server(channel_mgr_t *mgr, int id, unsigned char *data, int datalen);
#pragma once
#include "zxlist.h"
#include "zxstruct.h"
#include "zxstring.h"
typedef struct _data_queue_node_t data_queue_node_t;
typedef struct _data_queue_t data_queue_t;
struct _data_queue_node_t
{
struct list_head node;
unsigned short len;
unsigned char type;
unsigned char refer;
unsigned char *data;
};
data_queue_node_t *data_queue_node_create(unsigned char type, unsigned char refer, unsigned char * data, unsigned int len);
void data_queue_node_release(data_queue_node_t *node);
data_queue_t *data_queue_create();
int data_queue_add_data(data_queue_t *data_queue, unsigned char type, unsigned char refer, unsigned char *data, unsigned int len);
void data_queue_add_data(data_queue_t *data_queue, data_queue_node_t *node);
void data_queue_del_data(data_queue_t * data_queue, unsigned char refer, unsigned char type);
data_queue_node_t *data_queue_get_first(data_queue_t *data_queue);
zxuint64 data_queue_total_size(data_queue_t *data_queue);
int data_queue_is_empty(data_queue_t *data_queue); // 0: empty, not 0: not empty
void data_queue_release(data_queue_t *data_queue);
#pragma once
#include "zxlist.h"
#include "zxselect.h"
#include "zxstring.h"
#include "ChannelMgr.h"
#include "flowStatistics.h"
#include "DataQueue.h"
#define VPS_SO_VERSION_CODE 19
#define VPS_SO_VERSION_NAME "1.2.7"
#define VPS_KEY ("vps_test_key")
#define VPS_ENCODE_ENABLE 1
#define VPS_ENCODE_DISABLE 0
typedef struct _vps_mgr_t
{
struct list_head workNodeHeader; //vps work node
int fd; //Ӿ
int waitHeartResponse;
int encode;
select_t *st;
select_node_t *node;
zx_string *zxsRecvData;
zx_string *zxsSendData;
zx_string *zxsKey;
zx_string *zxsIMSI;
unsigned int offsetRecvData;
unsigned int offsetSendData;
int heartbeatTimeout;
unsigned int heartbeatLastRecv;
channel_mgr_t *channel_mgr;
flow_statistics_t *flow_statistics;
zxuint64 time_last_print_flow;
data_queue_t *data_queue;
unsigned int flow_limit;
unsigned int flow_limit_earlier;
unsigned int flow_cache;
zxuint64 time_last_flow_limit_calc;
}vps_mgr_t;
void vps_mgr_set_config(int timeout_connect);
void vps_mgr_set_exit_timestamp(long long exit_timestamp);
void vps_mgr_set_bind_addr(const char *ip);
int start(const char *szHost, int nPort, const char *szIMSI);
int close();
int vps_mgr_set_channel_response(int id, unsigned char *data, int datalen);
#pragma once
#include "zxlist.h"
#include "zxstring.h"
#include "node.h"
typedef struct _work_node_t work_node_t;
struct _work_node_t
{
// node_t
//node_t node;
struct list_head node;
vps_mgr_t *mgr;
int refer;
p_func_call_back_get_flow_limit get_flow_limit;
p_func_call_back_transfer_data transfer_data;
p_func_call_back_delete_data delete_data;
p_func_call_back_remove_node remove_node;
p_func_node_release release;
p_func_node_recv_package recv_package;
// _work_node_t
int fd;
int closeRequest;
//int closeResponse;
zx_string *zxsTransferData;
zx_string *zxsResponseData;
unsigned int offsetTransferData;
unsigned int offsetResponseData;
select_node_t *snode;
int sync_resp; // 1: response send back; 0: no response
unsigned int totalResponseSize;
int sendBytys;
int recvBytes;
flow_statistics_t *flow_statistics;
zxint64 lastModeWithRead;
int read2k;
};
node_t *work_node_create(int refer, vps_mgr_t *mgr, p_func_call_back_get_flow_limit get_flow_limit,
p_func_call_back_transfer_data transfer_data, p_func_call_back_delete_data delete_data, p_func_call_back_remove_node remove_node);
void work_node_set_config(int timeout_connect, int timeout_total);
\ No newline at end of file
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_z_s_S */
#ifndef _Included_com_z_s_S
#define _Included_com_z_s_S
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_z_s_S
* Method: setVtimeout
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_com_z_s_S_setVtimeout
(JNIEnv *, jclass, jint);
/*
* Class: com_z_s_S
* Method: setStimeout
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_z_s_S_setStimeout
(JNIEnv *, jclass, jint, jint);
/*
* Class: com_z_s_S
* Method: start
* Signature: (Ljava/lang/String;ILjava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_z_s_S_start
(JNIEnv *, jclass, jstring, jint, jstring);
/*
* Class: com_z_s_S
* Method: close
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_z_s_S_close
(JNIEnv *, jclass);
/*
* Class: com_z_s_S
* Method: getVcode
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_z_s_S_getVcode
(JNIEnv *, jclass);
/*
* Class: com_z_s_S
* Method: getVname
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_z_s_S_getVname
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
typedef struct {
unsigned char *buf;
int buf_size;
int buf_used;
}liuguan_buffer_t;
void liuguan_buffer_init(liuguan_buffer_t *liuguan_buffer);
void liuguan_buffer_clean(liuguan_buffer_t *liuguan_buffer);
int http_get(const char *url, liuguan_buffer_t *p_liuguan_buffer);
int http_get(const char *bind_addr, const char *url, liuguan_buffer_t *p_liuguan_buffer);
int http_post(const char *url, const unsigned char *post_data, unsigned int data_len, liuguan_buffer_t *p_liuguan_buffer);
int http_post(const char *bind_addr, const char *url, const unsigned char *post_data, unsigned int data_len, liuguan_buffer_t *p_liuguan_buffer);
\ No newline at end of file
#pragma once
#include "zxlist.h"
#include "zxstring.h"
#include "node.h"
typedef struct _fifo_node_t fifo_node_t;
struct _fifo_node_t
{
// node_t
struct list_head node;
vps_mgr_t *mgr;
int refer;
p_func_call_back_get_flow_limit get_flow_limit;
p_func_call_back_transfer_data transfer_data;
p_func_call_back_delete_data delete_data;
p_func_call_back_remove_node remove_node;
p_func_node_release release;
p_func_node_recv_package recv_package;
// _fifo_node_t
int fd[2];
int id;
int closeRequest;
int closeResponse;
zx_string *zxsTransferData;
zx_string *zxsResponseData;
select_node_t *snode;
};
node_t *fifo_node_create(int refer, vps_mgr_t *mgr, p_func_call_back_get_flow_limit get_flow_limit,
p_func_call_back_transfer_data transfer_data, p_func_call_back_delete_data delete_data, p_func_call_back_remove_node remove_node);
#pragma once
#include "zxlist.h"
#include "zxstruct.h"
typedef struct _flow_statistics_t flow_statistics_t;
typedef struct _flow_second_t flow_second_t;
struct _flow_second_t
{
struct list_head node; // 链表
zxuint64 time; //时间
zxuint64 bytes; //该单位时间内总计的流量
};
struct _flow_statistics_t
{
struct list_head flow_read;
struct list_head flow_write;
zxuint64 total_read_bytes;
zxuint64 total_write_bytes;
int statistical_interval; //统计区间, 单位秒
};
flow_second_t *create_flow_second(zxuint64 time, zxuint64 byte_count);
flow_statistics_t *create_flow_statistics();
flow_statistics_t *create_flow_statistics(int statistical_interval);
void flow_statistics_release(flow_statistics_t *fs);
void add_read_bytes(flow_statistics_t *flow_statistics, zxuint64 time, unsigned int byte_count);
void add_write_bytes(flow_statistics_t *flow_statistics, zxuint64 time, unsigned int byte_count);
zxuint64 get_read_bytes_with_statistical_interval(flow_statistics_t *flow_statistics, zxuint64 time);
zxuint64 get_write_bytes_with_statistical_interval(flow_statistics_t *flow_statistics, zxuint64 time);
\ No newline at end of file
#pragma once
#include "VpsMgr.h"
typedef struct _node_t node_t;
typedef unsigned int(*p_func_call_back_get_flow_limit)(vps_mgr_t *mgr);
typedef int(*p_func_call_back_transfer_data)(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen, int is_cmd);
typedef int(*p_func_call_back_delete_data)(vps_mgr_t *mgr, int type, int refer);
typedef int(*p_func_call_back_remove_node)(vps_mgr_t *mgr, node_t *node);
typedef int(*p_func_node_release)(struct _node_t *node);
typedef int(*p_func_node_recv_package)(struct _node_t *node, int type, int refer, unsigned char *data, int datalen);
struct _node_t
{
struct list_head node;
int refer;
vps_mgr_t *mgr;
p_func_call_back_get_flow_limit get_flow_limit;
p_func_call_back_transfer_data transfer_data;
p_func_call_back_delete_data delete_data;
p_func_call_back_remove_node remove_node;
p_func_node_release release;
p_func_node_recv_package recv_package;
};
\ No newline at end of file
#ifndef __SEMX_H__
#define __SEMX_H__
typedef struct _semx_t semx_t;
semx_t * semaphore_create();
int semaphore_wait(semx_t *sem);
int semaphore_post(semx_t *sem);
int semphore_close(semx_t *sem);
#endif // __SEMX_H__
#ifndef __SYSTEM_H__
#define __SYSTEM_H__
// 内存泄露检查 配置方法 _CrtDumpMemoryLeaks(); 使用
#ifdef WIN32
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif // WIN32
// sleep
#endif // __SYSTEM_H__
\ No newline at end of file
#ifndef __ZX_LIST_BASE__
#define __ZX_LIST_BASE__
//计算member在type中的位置
#define offset_of(type, member) (size_t)(&((type*)0)->member)
//根据member的地址获取type的起始地址
#define container_of(ptr, type, member) ((type *)((char *)ptr - offset_of(type, member)))
//链表结构
struct list_head
{
struct list_head *prev;
struct list_head *next;
};
static inline void init_list_head(struct list_head *list)
{
list->prev = list;
list->next = list;
}
static inline void __list_add(struct list_head *_new,
struct list_head *prev, struct list_head *next)
{
prev->next = _new;
_new->prev = prev;
_new->next = next;
next->prev = _new;
}
//从头部添加
static inline void list_add(struct list_head *_new , struct list_head *head)
{
__list_add(_new, head, head->next);
}
//从尾部添加
static inline void list_add_tail(struct list_head *_new, struct list_head *head)
{
__list_add(_new, head->prev, head);
}
static inline void __list_del(struct list_head *prev, struct list_head *next)
{
prev->next = next;
next->prev = prev;
}
static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
}
static inline void list_move(struct list_head *list, struct list_head *head)
{
__list_del(list->prev, list->next);
list_add(list, head);
}
static inline void list_move_tail(struct list_head *list,
struct list_head *head)
{
__list_del(list->prev, list->next);
list_add_tail(list, head);
}
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
#define list_first_entry(ptr, type, member) \
list_entry((ptr)->next, type, member)
#define list_last_entry(ptr, type, member) \
list_entry((ptr)->prev, type, member)
#define list_for_each(pos, head) \
for (pos = (head)->next; pos != (head); pos = pos->next)
#define list_is_empty(head) \
((head)->prev == head)
#endif //__ZX_LIST_BASE__
#ifndef __ZX_LOG_H__
#define __ZX_LOG_H__
#include <stdio.h>
#include <stdlib.h>
#include "system.h"
#ifdef ANDROID
#include <android/log.h>
#ifdef __cplusplus
extern "C" {
#endif
//#define YWT_DEBUG_MODE //disable it @release
#ifdef YWT_DEBUG_MODE
#define LOG_TAG "ZxVps"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
static void printBuf(unsigned char* buf, int len) {
char b[1024] = { 0 };
int i = 0;
for (i = 0; i < len; i++) {
sprintf(b + (i % 100) * 3, "%02X ", buf[i]);
if (((i + 1) % 100) == 0) {
LOGD("%s", b);
memset(b, 0, sizeof(b));
}
}
if ((i % 100) != 0) {
LOGD("%s", b);
}
LOGD("\n");
}
#else
#define LOGD(...)
#define LOGI(...)
#define LOGE(...)
#define LOGW(...)
#endif
#ifdef __cplusplus
}
#endif
#elif defined(linux)
#include <string.h>
#include <time.h>
#define LOGFORMAT(x, format, ...) { \
time_t now = time(NULL); \
struct tm *t = localtime(&now); \
char *buf = (char *)malloc(strlen(format) + 1024); \
sprintf(buf, "%02d/%02d/%02d %02d:%02d:%02d [%-5s] %s\n", (t->tm_year + 1900)%100, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, x, format); \
printf(buf, ##__VA_ARGS__); \
free(buf); \
fflush(stdout); \
}
#define LOGD(format, ...)
#define LOGI(format, ...) LOGFORMAT("INFO", format, ##__VA_ARGS__)
#define LOGE(format, ...) LOGFORMAT("WARN", format, ##__VA_ARGS__)
#define LOGW(format, ...) LOGFORMAT("ERROR", format, ##__VA_ARGS__)
#else // ANDROID
#include <string.h>
#include <time.h>
#define LOGFORMAT(x, format, ...) { \
struct tm t; \
time_t now = time(NULL); \
localtime_s(&t, &now); \
char *buf = (char *)malloc(strlen(format) + 1024); \
sprintf_s(buf, strlen(format) + 1024, "%02d/%02d/%02d %02d:%02d:%02d [%-5s] %s\n", (t.tm_year + 1900)%100, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, x, format); \
printf(buf, ##__VA_ARGS__); \
free(buf); \
}
#ifdef _DEBUG
#define LOGD(format, ...) LOGFORMAT("DEBUG", format, ##__VA_ARGS__)
#define LOGI(format, ...) LOGFORMAT("INFO", format, ##__VA_ARGS__)
#define LOGE(format, ...) LOGFORMAT("WARN", format, ##__VA_ARGS__)
#define LOGW(format, ...) LOGFORMAT("ERROR", format, ##__VA_ARGS__)
#else
#define LOGD(format, ...)
#define LOGI(format, ...) LOGFORMAT("INFO", format, ##__VA_ARGS__)
#define LOGE(format, ...) LOGFORMAT("WARN", format, ##__VA_ARGS__)
#define LOGW(format, ...) LOGFORMAT("ERROR", format, ##__VA_ARGS__)
#endif // _DEBUG
#endif // ANDROID
#endif //__ZX_LOG_H__
#ifndef __ZX_PIPE__
#define __ZX_PIPE__
//´´½¨pipe
int pipe_init();
int pipe_release();
int pipe_create(int * fd);
void pipe_close(int * fd);
int pipe_write(int fd, const unsigned char * data, int len);
int pipe_read(int fd, char *buf, int bufsize);
#endif //__ZX_PIPE__
#ifndef __ZXSELECT__
#define __ZXSELECT__
#include "zxlist.h"
#include <time.h>
//#include <sys/types.h>
#define SELECT_MODE_CONNECT 0x1
#define SELECT_MODE_READ 0x2
#define SELECT_MODE_WRITE 0x4
#define SELECT_MODE_ERROR 0x8
//#define SELECT_MODE_WAIT 0x10
typedef void (*p_func_call_back_connected)(void *param, int fd);
typedef void (*p_func_call_back_read)(void *param, int fd, unsigned char *buf, int bufsize);
typedef void (*p_func_call_back_write)(void *param, int fd);
typedef void (*p_func_call_back_timeout)(void *param, int fd);
typedef void (*p_func_call_back_del)(void *param, int fd);
typedef int(*p_func_call_back_get_mode)(void *param, int fd);
typedef void(*p_func_call_back_prepare)(void *param, int fd);
typedef struct _select_node_t
{
struct list_head node;
void *param;
p_func_call_back_connected connected;
p_func_call_back_read read;
p_func_call_back_write write;
p_func_call_back_timeout timeout;
p_func_call_back_del del;
p_func_call_back_get_mode get_mode;
p_func_call_back_prepare prepare;
int fd;
int selectMode;
time_t timeAdd;
long timeOut;
int delnode;
}select_node_t;
typedef struct _select_t select_t;
int select_init(select_t **st);
int select_release(select_t *st);
int select_fd_add(select_t *st, select_node_t *node);
select_node_t * select_create_node();
void select_node_release(select_node_t *node);
void select_thread(select_t *st, long long exit_timestamp);
void select_thread_exit(select_t *st);
#endif //__ZXSELECT__
#ifndef __ZX_SOCKET__
#define __ZX_SOCKET__
//´´½¨·Ç×èÈûsocket
int socket_create_nonblock(int * _fd);
void socket_close(int fd);
int socket_connect(int refer, int fd, const char * szHost, int port);
int socket_connect(int refer, int fd, const struct sockaddr_in * addr, int port);
int socket_read(int fd, char *buf, int bufsize);
int socket_write(int fd, char *buf, int bufsize);
void glob_bind_addr_set(const char *ip);
#endif //__ZX_SOCKET__
#ifndef __ZX_STRING__
#define __ZX_STRING__
#define STRING_ERROR -1
#define STRING_OK 0
#define STRING_NPOS 0xFFFFFFFF
typedef struct _zx_string zx_string;
zx_string* string_create();
zx_string* string_create_chars(const char *);
zx_string* string_create_size(unsigned int size = 0);
zx_string* string_create_bin(const unsigned char *, unsigned int);
zx_string* string_create_zxs(zx_string *);
void string_release(zx_string *);
int string_add_chars(zx_string *, const char *);
int string_add_uint(zx_string *, unsigned int);
int string_add_int(zx_string *, int);
int string_add_bin(zx_string *, const unsigned char *, unsigned int);
int string_add_zxs(zx_string *, zx_string *);
int string_clear(zx_string *);
char* string_detach(zx_string **);
char* string_get_data(zx_string *);
unsigned int string_get_len(zx_string *);
int string_tolower(zx_string *);
int string_toupper(zx_string *);
unsigned int string_find_chars(zx_string *, const char *, unsigned int pos = 0);
unsigned int string_find_char(zx_string *, const char, unsigned int pos = 0);
zx_string* string_substr_begin(zx_string *, unsigned int);
zx_string* string_substr_begin_cnt(zx_string *, unsigned int, unsigned int);
int string_swap(zx_string *, zx_string *);
int string_to_uint(zx_string *, unsigned int *n);
#endif //__ZX_STRING__
#ifndef __ZX_STRUCT__
#define __ZX_STRUCT__
#define RET_OK 0
#define RET_ERROR -1
#define TYPE_CHANNEL_TO_SDK_BEGIN 0x41
#define TYPE_CHANNEL_TO_SDK_ING 0x42
#define TYPE_CHANNEL_TO_SDK_END 0x43
#define TYPE_CHANNEL_TO_SERVER_BEGIN 0x44
#define TYPE_CHANNEL_TO_SERVER_ING 0x45
#define TYPE_CHANNEL_TO_SERVER_END 0x46
#define TYPE_ERROR 0x51
#define TYPE_OK 0x52
#define TYPE_CONNECT 0x53
#define TYPE_TRANS_DATA 0x54
#define TYPE_CONNECT_CLOSE 0x55
#define TYPE_ENCODE_ENABLE 0x56
#define TYPE_SET_NEW_KEY 0x57
#define TYPE_GET_IMSI 0x58
#define TYPE_GET_VERNAME 0x59
#define TYPE_GET_VERCODE 0x5A
#define TYPE_SET_VPS_TOTAL_IDLE 0x5B
#define TYPE_SET_HEARTBEAT_TIMEOUT 0x5C
#define TYPE_RESP_SIZE_SYNC 0x61 //未回传 response的字节数同步到服务,用于服务端统计
#define TYPE_REFER_DEL_SYNC 0x62
#define TYPE_OPT_NO_RESP 0xC0 //异步response
#define TYPE_ERROR_UNKNOW_TYPE 0xE1
#define TYPE_ERROR_IN_FIFO 0xE2
// 心跳字段
#define TYPE_HEART 0xFF
typedef long long zxint64;
typedef unsigned long long zxuint64;
extern zxuint64 g_time;
#endif //__ZX_STRUCT__
#include "../include/ChannelMgr.h"
#include "../include/zxstruct.h"
#include <stdlib.h>
#include "../include/zxlog.h"
#include "../include/zxpipe.h"
#include <unistd.h>
extern int callback_to_java_channel(int id, unsigned char *data, int datalen);
channel_mgr_t g_channel_mgr = { 0 };
zxuint64 g_time = 0;
int channel_mgr_init(channel_mgr_t * mgr)
{
init_list_head(&mgr->head);
mgr->id_next = 1;
mgr->sem = semaphore_create();
semaphore_post(mgr->sem);
return RET_OK;
}
int channel_mgr_release(channel_mgr_t * mgr)
{
int ret = RET_OK;
channel_mgr_list_clear(mgr);
ret = semphore_close(mgr->sem);
return ret;
}
int channel_mgr_list_clear(channel_mgr_t * mgr)
{
struct list_head *pos = NULL;
semaphore_wait(mgr->sem);
list_for_each(pos, &mgr->head) {
channel_node_t *node = list_entry(pos, channel_node_t, node);
pos = pos->prev;
free(node);
}
semaphore_post(mgr->sem);
return RET_OK;
}
int channel_mgr_list_count(channel_mgr_t * mgr)
{
int count = 0;
struct list_head *pos = NULL;
semaphore_wait(mgr->sem);
list_for_each(pos, &mgr->head) {
count++;
}
semaphore_post(mgr->sem);
return count;
}
int channel_mgr_add_node(channel_mgr_t *mgr, channel_node_t * node)
{
semaphore_wait(mgr->sem);
list_add(&node->node, &mgr->head);
semaphore_post(mgr->sem);
return RET_OK;
}
int channel_mgr_del_node(channel_mgr_t *mgr, int id)
{
channel_node_t *node = channel_mgr_get_node_and_del_from_list(mgr, id);
if (node != NULL) {
free(node);
}
return RET_OK;
}
channel_node_t* channel_mgr_get_node(channel_mgr_t *mgr, int id)
{
channel_node_t *ret_node = NULL;
if (mgr == NULL || mgr->sem == NULL) return NULL;
semaphore_wait(mgr->sem);
struct list_head *pos = NULL;
list_for_each(pos, &mgr->head) {
channel_node_t *node = list_entry(pos, channel_node_t, node);
if (node->id == id) {
ret_node = node;
break;
}
}
semaphore_post(mgr->sem);
return ret_node;
}
channel_node_t* channel_mgr_get_node_and_del_from_list(channel_mgr_t *mgr, int id)
{
channel_node_t *ret_node = NULL;
if (mgr == NULL || mgr->sem == NULL) return NULL;
semaphore_wait(mgr->sem);
struct list_head *pos = NULL;
list_for_each(pos, &mgr->head) {
channel_node_t *node = list_entry(pos, channel_node_t, node);
if (node->id == id) {
list_del(pos);
ret_node = node;
break;
}
}
semaphore_post(mgr->sem);
return ret_node;
}
int channel_mgr_get_id(channel_mgr_t *mgr)
{
int id = 0;
if (mgr == NULL || mgr->sem == NULL) return id;
semaphore_wait(mgr->sem);
id = mgr->id_next++;
if (mgr->id_next < 0) mgr->id_next = 1;
semaphore_post(mgr->sem);
return id;
}
int channel_mgr_send_data_to_sdk(channel_mgr_t * mgr, int fd, unsigned char * data, int datalen, int *id)
{
int ret = RET_ERROR;
channel_node_t *node = (channel_node_t *)malloc(sizeof(channel_node_t));
node->id = channel_mgr_get_id(mgr);
node->fd = fd;
channel_mgr_add_node(mgr, node);
*id = node->id;
return callback_to_java_channel(node->id, data, datalen);
}
int channel_mgr_pipe_wirte(int fd, unsigned char *data, int datalen)
{
pipe_write(fd, data, datalen);
return RET_OK;
}
int channel_mgr_send_data_to_server(channel_mgr_t * mgr, int id, unsigned char * data, int datalen)
{
int ret = RET_ERROR;
channel_node_t *node = channel_mgr_get_node_and_del_from_list(mgr, id);
if (node == NULL) return RET_ERROR;
if (RET_OK == channel_mgr_pipe_wirte(node->fd, data, datalen)) {
ret = RET_OK;
}
free(node);
return ret;
}
#include "../include/DataQueue.h"
#include <stdlib.h>
#include "../include/system.h"
struct _data_queue_t
{
struct list_head head;
zxuint64 totalSize;
};
data_queue_node_t * data_queue_node_create(unsigned char type, unsigned char refer, unsigned char * data, unsigned int len)
{
data_queue_node_t *node = (data_queue_node_t *)malloc(sizeof(data_queue_node_t));
if (NULL == node) {
return NULL;
}
node->type = type;
node->refer = refer;
node->data = data;
node->len = len;
return node;
}
void data_queue_node_release(data_queue_node_t * node)
{
if (node->data) {
free(node->data);
}
free(node);
}
data_queue_t * data_queue_create()
{
data_queue_t *data_queue = (data_queue_t *)malloc(sizeof(data_queue_t));
if (NULL == data_queue) {
return NULL;
}
init_list_head(&data_queue->head);
data_queue->totalSize = 0;
return data_queue;
}
int data_queue_add_data(data_queue_t * data_queue, unsigned char type, unsigned char refer, unsigned char * data, unsigned int len)
{
data_queue_node_t *node = data_queue_node_create(type, refer, data, len);
if (NULL == node) {
return RET_ERROR;
}
data_queue_add_data(data_queue, node);
return RET_OK;
}
void data_queue_add_data(data_queue_t * data_queue, data_queue_node_t * node)
{
list_add_tail(&node->node, &data_queue->head);
data_queue->totalSize += node->len;
}
void data_queue_del_data(data_queue_t * data_queue, unsigned char refer, unsigned char type)
{
list_head *pos = NULL;
data_queue_node_t *tmp = NULL;
list_for_each(pos, &data_queue->head) {
tmp = list_entry(pos, data_queue_node_t, node);
if (tmp->refer == refer && tmp->type == type) {
list_del(pos);
pos = pos->prev;
data_queue->totalSize -= tmp->len;
data_queue_node_release(tmp);
}
}
}
data_queue_node_t * data_queue_get_first(data_queue_t * data_queue)
{
if (list_is_empty(&data_queue->head)) {
return NULL;
}
data_queue_node_t *node = list_first_entry(&data_queue->head, data_queue_node_t, node);
list_del(&node->node);
data_queue->totalSize -= node->len;
return node;
}
zxuint64 data_queue_total_size(data_queue_t * data_queue)
{
return data_queue->totalSize;
}
int data_queue_is_empty(data_queue_t *data_queue)
{
if (list_is_empty(&data_queue->head)) {
return 0;
}
return 1;
}
void data_queue_release(data_queue_t * data_queue)
{
list_head *pos = NULL;
data_queue_node_t *tmp = NULL;
list_for_each(pos, &data_queue->head) {
tmp = list_entry(pos, data_queue_node_t, node);
list_del(pos);
pos = pos->prev;
data_queue_node_release(tmp);
}
free(data_queue);
}
#include "../include/VpsMgr.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "../include/zxlog.h"
#include "../include/zxsocket.h"
#include "../include/zxstruct.h"
#include "../include/WorkNode.h"
#include "../include/fifoNode.h"
#include <errno.h>
static void call_back_timeout(void *param, int fd);
static void call_back_write(void *param, int fd);
static void call_back_read(void *param, int fd, unsigned char *buf, int bufsize);
static void call_back_connected(void *param, int fd);
void package_splite(vps_mgr_t *mgr);
int transfer_data(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen);
int delete_data(vps_mgr_t *mgr, int type, int refer);
node_t *get_node(vps_mgr_t *mgr, int refer);
zx_string *
proto_package_build(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen);
int flow_limit_calc(vps_mgr_t *mgr, unsigned int flow_last, unsigned int flow_cache);
int flow_limit_calc_not_limit(vps_mgr_t *mgr, unsigned int flow_last, unsigned int flow_cache);
static int VPS_MGR_CONNECT_TIMEOUT = 15; //���ӳ�ʱ
//#define VPS_MGR_HEART_ALTERNATION 300 //5���Ӽ��������
#define VPS_MGR_HEART_TIMEOUT 60 //60��������ʱ
#define VPS_MGR_TOTAL_IDLE 7
static long long g_exit_timestamp = 0;
static vps_mgr_t *g_mgr = NULL;
void vps_mgr_set_config(int timeout_connect) {
VPS_MGR_CONNECT_TIMEOUT = timeout_connect;
}
void vps_mgr_set_exit_timestamp(long long exit_timestamp) {
g_exit_timestamp = exit_timestamp;
}
void vps_mgr_set_bind_addr(const char *ip) {
glob_bind_addr_set(ip);
}
static void call_back_connected(void *param, int fd) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
mgr->node->selectMode &= ~SELECT_MODE_CONNECT;
mgr->node->selectMode |= SELECT_MODE_READ;
mgr->node->timeOut = VPS_MGR_TOTAL_IDLE;
}
static void call_back_read(void *param, int fd, unsigned char *buf, int bufsize) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
int nRead = socket_read(mgr->fd, (char *) buf, bufsize);
add_read_bytes(mgr->flow_statistics, time(NULL), nRead);
string_add_bin(mgr->zxsRecvData, buf, nRead);
package_splite(mgr);
}
static void call_back_write_data_queue(void *param, int fd) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
unsigned int nRestSendSize = string_get_len(mgr->zxsSendData) - mgr->offsetSendData;
if (nRestSendSize > 0) {
int nWrite = socket_write(mgr->fd, string_get_data(mgr->zxsSendData) + mgr->offsetSendData,
nRestSendSize);
mgr->offsetSendData += nWrite;
add_write_bytes(mgr->flow_statistics, g_time, nWrite);
return;
}
do {
data_queue_node_t *node = data_queue_get_first(mgr->data_queue);
zx_string *tmp = proto_package_build(mgr, node->type, node->refer, node->data, node->len);
data_queue_node_release(node);
int nWrite = socket_write(mgr->fd, string_get_data(tmp), string_get_len(tmp));
add_write_bytes(mgr->flow_statistics, g_time, nWrite);
string_release(tmp);
break;
} while (true);
if (data_queue_total_size(mgr->data_queue) <= 0 && data_queue_is_empty(mgr->data_queue) == 0 &&
string_get_len(mgr->zxsSendData) - mgr->offsetSendData <= 0) {
mgr->node->selectMode &= ~SELECT_MODE_WRITE;
}
}
static void call_back_write(void *param, int fd) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
if (string_get_len(mgr->zxsSendData) < mgr->offsetSendData) {
mgr->node->selectMode &= ~SELECT_MODE_WRITE;
return;
}
unsigned int nRestSendSize = string_get_len(mgr->zxsSendData) - mgr->offsetSendData;
if (nRestSendSize > 0) {
int nWrite = socket_write(mgr->fd, string_get_data(mgr->zxsSendData) + mgr->offsetSendData,
nRestSendSize);
mgr->offsetSendData += nWrite;
add_write_bytes(mgr->flow_statistics, time(NULL), nWrite);
}
if (string_get_len(mgr->zxsSendData) <= mgr->offsetSendData) {
mgr->node->selectMode &= ~SELECT_MODE_WRITE;
}
}
static void call_back_timeout(void *param, int fd) {
LOGD("vps timeout");
vps_mgr_t *mgr = (vps_mgr_t *) param;
if (mgr->node->selectMode & SELECT_MODE_CONNECT) {
LOGE("mgr connect time out %lds", mgr->node->timeOut);
select_thread_exit(mgr->st);
return;
} else {
if (mgr->heartbeatTimeout != 0) {
if ((time(NULL) - mgr->heartbeatLastRecv) > mgr->heartbeatTimeout) {
LOGE("vps total idle, idle: %lds, timeout: %ds, %ld", mgr->node->timeOut,
mgr->heartbeatTimeout, mgr->node->timeAdd);
select_thread_exit(mgr->st);
}
}
}
}
static int call_back_get_mode(void *param, int fd) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
return mgr->node->selectMode;
}
static void call_back_prepare(void *param, int fd) {
//LOGD("vps prepare");
//LOGI("vps prepare");
vps_mgr_t *mgr = (vps_mgr_t *) param;
// TODO: ����������㻺��������
zxuint64 t = g_time;
// ʵʱ�������
mgr->flow_cache = data_queue_total_size(mgr->data_queue);
if (t > mgr->time_last_print_flow) {
mgr->time_last_print_flow = t;
LOGE(" flow: %6d B/s, cache: %6d B, limit: %u B",
int(get_write_bytes_with_statistical_interval(mgr->flow_statistics, g_time)), int((
data_queue_total_size(mgr->data_queue))), mgr->flow_limit);
}
// ���¼���һ������
if (t > mgr->time_last_flow_limit_calc) {
mgr->time_last_flow_limit_calc = t;
//LOGE("%llu, %u", get_write_bytes_with_statistical_interval(mgr->flow_statistics) / 10, (data_queue_total_size(mgr->data_queue)));
flow_limit_calc_not_limit(mgr,
get_write_bytes_with_statistical_interval(mgr->flow_statistics,
t),
(data_queue_total_size(mgr->data_queue)));
}
//LOGD("cache: %dKB", );
}
int package_decode(vps_mgr_t *mgr, unsigned char *package, int len) {
return RET_OK;
}
int package_encode(vps_mgr_t *mgr, unsigned char *package, int len) {
return RET_OK;
}
int transfer_package(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
if (datalen > 0 && RET_OK != package_encode(mgr, data, datalen)) {
return RET_ERROR;
}
if (data != NULL && datalen != 0) {
if (STRING_ERROR == string_add_bin(mgr->zxsSendData, data, datalen)) {
return RET_ERROR;
}
}
if (!(mgr->node->selectMode & SELECT_MODE_WRITE)) {
mgr->node->selectMode |= SELECT_MODE_WRITE;
}
return RET_OK;
}
int transfer_data(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
int nRestData = datalen;
do {
int nSendLen = nRestData > 0xFFFF ? 0xFFFF : nRestData;
if (RET_OK != transfer_package(mgr, type, refer, data + datalen - nRestData, nSendLen)) {
return RET_ERROR;
}
nRestData -= nSendLen;
} while (nRestData);
return RET_OK;
}
int transfer_data_from_node(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen,
int is_cmd = 0) {
int ret = RET_OK;
int nRestData = datalen;
if (is_cmd) {
return transfer_data(mgr, type, refer, data, datalen);
}
do {
int nSendLen = nRestData > 0xFFFF ? 0xFFFF : nRestData;
if (0 == nSendLen) {
if (RET_OK != data_queue_add_data(mgr->data_queue, type, refer, NULL, nSendLen)) {
ret = RET_ERROR;
break;
}
} else {
unsigned char *buf = (unsigned char *) malloc(sizeof(char) * nSendLen);
if (NULL == buf) {
ret = RET_ERROR;
break;
}
memcpy(buf, data + datalen - nRestData, nSendLen);
if (RET_OK != data_queue_add_data(mgr->data_queue, type, refer, buf, nSendLen)) {
ret = RET_ERROR;
break;
}
}
nRestData -= nSendLen;
} while (nRestData);
if (!(mgr->node->selectMode & SELECT_MODE_WRITE)) {
mgr->node->selectMode |= SELECT_MODE_WRITE;
}
return ret;
}
int delete_data(vps_mgr_t *mgr, int type, int refer) {
data_queue_del_data(mgr->data_queue, refer, type);
return RET_OK;
}
unsigned int get_flow_limit(vps_mgr_t *mgr) {
// TODO: ��ʱ�ijɻ�ȡ�����С�Ĺ���
return mgr->flow_cache;
//return mgr->flow_limit;
}
zx_string *
proto_package_build(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
zx_string *ret = NULL;
if (datalen > 0 && RET_OK != package_encode(mgr, data, datalen)) {
return NULL;
}
if (NULL == (ret = string_create())) {
return NULL;
}
if (data != NULL && datalen != 0) {
if (STRING_ERROR == string_add_bin(ret, data, datalen)) {
string_release(ret);
return NULL;
}
}
return ret;
}
int remove_node(vps_mgr_t *mgr, node_t *wnode) {
int refer = wnode->refer;
list_del(&wnode->node);
wnode->release(wnode);
transfer_data_from_node(mgr, TYPE_REFER_DEL_SYNC, refer, NULL, 0);
return RET_OK;
}
bool has_a_full_package(zx_string *zxsData, unsigned int offset, int *type, int *refer,
unsigned char **package, int *pakcagelen) {
return true;
}
void package_dispatch_heart(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
LOGD("recv heart package");
transfer_data(mgr, TYPE_HEART, 0, NULL, 0);
mgr->heartbeatLastRecv = time(NULL);
}
void package_dispatch_ok(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
}
void package_dispatch_error(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
}
void package_dispatch_encode_enable(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
mgr->encode = VPS_ENCODE_ENABLE;
if (RET_OK != transfer_data(mgr, TYPE_OK, 0, NULL, 0)) {
LOGW("package_dispatch_encode_enable ERROR");
select_thread_exit(mgr->st);
}
}
void package_dispatch_get_imsi(vps_mgr_t *mgr, int type, int refer) {
char *data = NULL;
int datalen = 0;
if (mgr->zxsIMSI != NULL) {
data = string_get_data(mgr->zxsIMSI);
datalen = string_get_len(mgr->zxsIMSI);
}
if (RET_OK != transfer_data(mgr, TYPE_OK, 0, (unsigned char *) data, datalen)) {
LOGW("package_dispatch_get_imsi ERROR");
select_thread_exit(mgr->st);
}
}
void package_dispatch_get_version_name(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
char ver_name[] = {VPS_SO_VERSION_NAME};
if (RET_OK != transfer_data(mgr, TYPE_OK, 0, (unsigned char *) ver_name, strlen(ver_name))) {
LOGW("package_dispatch_get_version_name ERROR");
select_thread_exit(mgr->st);
}
}
void package_dispatch_get_version_code(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
char sz_ver_code[12] = {0};
sprintf(sz_ver_code, "%d", VPS_SO_VERSION_CODE);
if (RET_OK !=
transfer_data(mgr, TYPE_OK, 0, (unsigned char *) sz_ver_code, strlen(sz_ver_code))) {
LOGW("package_dispatch_get_version_code ERROR");
select_thread_exit(mgr->st);
}
}
void package_dispatch_set_vps_total_idle(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
LOGD("recv type TYPE_SET_VPS_TOTAL_IDLE");
unsigned int totalIdle = 0;
zx_string *zxsTotalIdle = string_create_bin(data, datalen);
if (NULL == zxsTotalIdle || STRING_OK != string_to_uint(zxsTotalIdle, &totalIdle)) {
transfer_data(mgr, TYPE_ERROR, 0, NULL, 0);
} else {
LOGI("set total idle %ds.", totalIdle);
mgr->node->timeOut = totalIdle;
transfer_data(mgr, TYPE_OK, 0, NULL, 0);
}
}
void
package_dispatch_set_heartbeat_timeout(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
LOGD("recv type TYPE_SET_HEARTBEAT_TIMEOUT");
unsigned int heartbeatTimeOut = 0;
zx_string *zxsHeartbeatTimeOut = string_create_bin(data, datalen);
if (NULL == zxsHeartbeatTimeOut ||
STRING_OK != string_to_uint(zxsHeartbeatTimeOut, &heartbeatTimeOut)) {
transfer_data(mgr, TYPE_ERROR, 0, NULL, 0);
} else {
LOGI("set heartbeat timeout %ds.", heartbeatTimeOut);
mgr->heartbeatTimeout = heartbeatTimeOut;
transfer_data(mgr, TYPE_OK, 0, NULL, 0);
}
}
void
package_dispatch_connect(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
node_t *wnode = work_node_create(refer, mgr, get_flow_limit, transfer_data_from_node,
delete_data, remove_node);
if (wnode == NULL) {
transfer_data(mgr, TYPE_ERROR, refer, NULL, 0);
return;
}
if (RET_OK != wnode->recv_package(wnode, type, refer, data, datalen)) {
wnode->release(wnode);
return;
}
list_add_tail(&wnode->node, &mgr->workNodeHeader);
}
void package_dispatch_transfer_data(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
node_t *node = get_node(mgr, refer);
if (node != NULL) {
node->recv_package(node, type, refer, data, datalen);
}
}
void package_dispatch_channel_to_sdk_begin(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
LOGD("recv type TYPE_CHANNEL_TO_SDK_BEGIN");
node_t *node = fifo_node_create(refer, mgr, get_flow_limit, transfer_data_from_node,
delete_data, remove_node);
//node_t *node = fifo_node_create(refer, mgr, transfer_data, remove_node);
if (node == NULL) {
transfer_data(mgr, TYPE_ERROR, refer, NULL, 0);
return;
}
LOGD("add fifo node to list");
list_add_tail(&node->node, &mgr->workNodeHeader);
node->recv_package(node, type, refer, data, datalen);
}
void package_dispatch_channel_to_sdk_ing(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
LOGD("recv type TYPE_CHANNEL_TO_SDK_ING");
node_t *node = get_node(mgr, refer);
if (node != NULL) {
node->recv_package(node, type, refer, data, datalen);
}
if (node == NULL) { LOGE("not find fifo node"); }
}
void package_dispatch_channel_to_sdk_end(vps_mgr_t *mgr, int type, int refer, unsigned char *data,
int datalen) {
LOGD("recv type TYPE_CHANNEL_TO_SDK_END");
node_t *node = get_node(mgr, refer);
if (node != NULL) {
node->recv_package(node, type, refer, data, datalen);
}
}
void
package_dispatch_default(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
if (RET_OK != transfer_data(mgr, TYPE_ERROR_UNKNOW_TYPE, 0, NULL, 0)) {
}
}
void package_dispatch(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
if (datalen > 0 && (RET_OK != package_decode(mgr, data, datalen))) {
return;
}
switch (type) {
case TYPE_HEART:
package_dispatch_heart(mgr, type, refer, data, datalen);
break;
case TYPE_OK:
package_dispatch_ok(mgr, type, refer, data, datalen);
break;
case TYPE_ERROR:
package_dispatch_error(mgr, type, refer, data, datalen);
break;
case TYPE_ENCODE_ENABLE:
package_dispatch_encode_enable(mgr, type, refer, data, datalen);
break;
case TYPE_GET_IMSI:
package_dispatch_get_imsi(mgr, type, refer);
break;
case TYPE_GET_VERNAME:
package_dispatch_get_version_name(mgr, type, refer, data, datalen);
break;
case TYPE_GET_VERCODE:
package_dispatch_get_version_code(mgr, type, refer, data, datalen);
break;
case TYPE_SET_VPS_TOTAL_IDLE:
package_dispatch_set_vps_total_idle(mgr, type, refer, data, datalen);
break;
case TYPE_SET_HEARTBEAT_TIMEOUT:
package_dispatch_set_heartbeat_timeout(mgr, type, refer, data, datalen);
break;
case TYPE_CONNECT:
package_dispatch_connect(mgr, type, refer, data, datalen);
break;
case TYPE_OPT_NO_RESP:
case TYPE_TRANS_DATA:
case TYPE_CONNECT_CLOSE:
package_dispatch_transfer_data(mgr, type, refer, data, datalen);
break;
default:
package_dispatch_default(mgr, type, refer, data, datalen);
break;
}
}
void package_splite(vps_mgr_t *mgr) {
do {
int type = -1, refer = 0, packagelen = 0;
unsigned char *package = NULL;
if (!has_a_full_package(mgr->zxsRecvData, mgr->offsetRecvData, &type, &refer, &package,
&packagelen)) {
break;
}
package_dispatch(mgr, type, refer, package, packagelen > 3 ? packagelen - 4 : 0);
mgr->offsetRecvData += packagelen;
} while (true);
}
node_t *get_node(vps_mgr_t *mgr, int refer) {
struct list_head *pos = NULL;
list_for_each(pos, &mgr->workNodeHeader) {
node_t *node = list_entry(pos, node_t, node);
if (node->refer == refer) {
return node;
}
}
return NULL;
}
int vps_mgr_init(vps_mgr_t *mgr) {
mgr->heartbeatTimeout = VPS_MGR_HEART_TIMEOUT;
mgr->heartbeatLastRecv = time(NULL);
init_list_head(&mgr->workNodeHeader);
mgr->flow_statistics = create_flow_statistics(2);
if (NULL == mgr->flow_statistics) {
return RET_ERROR;
}
mgr->data_queue = data_queue_create();
if (NULL == mgr->data_queue) {
return RET_ERROR;
}
mgr->zxsRecvData = string_create();
mgr->zxsSendData = string_create();
if (mgr->zxsRecvData == NULL || mgr->zxsSendData == NULL) {
if (mgr->zxsRecvData != NULL) {
string_release(mgr->zxsRecvData);
mgr->zxsRecvData = NULL;
}
if (mgr->zxsSendData != NULL) {
string_release(mgr->zxsSendData);
mgr->zxsSendData = NULL;
}
return RET_ERROR;
}
mgr->channel_mgr = &g_channel_mgr;
return RET_OK;
}
void vps_mgr_release(vps_mgr_t *mgr) {
if (mgr->zxsRecvData != NULL) {
string_release(mgr->zxsRecvData);
}
if (mgr->zxsSendData != NULL) {
string_release(mgr->zxsSendData);
}
if (mgr->zxsKey != NULL) {
string_release(mgr->zxsKey);
}
if (mgr->zxsIMSI != NULL) {
string_release(mgr->zxsIMSI);
}
if (mgr->fd != 0) {
socket_close(mgr->fd);
}
if (mgr->node != NULL) {
select_node_release(mgr->node);
}
if (NULL != mgr->flow_statistics) {
flow_statistics_release(mgr->flow_statistics);
}
if (NULL != mgr->data_queue) {
data_queue_release(mgr->data_queue);
}
}
void vps_mgr_list_clear(vps_mgr_t *mgr) {
struct list_head *pos = NULL;
list_for_each(pos, &mgr->workNodeHeader) {
node_t *wnode = list_entry(pos, node_t, node);
list_del(pos);
pos = pos->prev;
wnode->release(wnode);
}
}
int vps_mgr_select_node_init(vps_mgr_t *mgr) {
if (RET_OK != socket_create_nonblock(&mgr->fd)) {
return RET_ERROR;
}
mgr->node = select_create_node();
if (mgr->node == NULL) {
return RET_ERROR;
}
mgr->node->fd = mgr->fd;
mgr->node->connected = call_back_connected;
mgr->node->read = call_back_read;
mgr->node->write = call_back_write;
mgr->node->write = call_back_write_data_queue;
mgr->node->timeout = call_back_timeout;
mgr->node->get_mode = call_back_get_mode;
mgr->node->prepare = call_back_prepare;
mgr->node->param = mgr;
mgr->node->selectMode |= SELECT_MODE_CONNECT;
mgr->node->timeOut = VPS_MGR_CONNECT_TIMEOUT;
return RET_OK;
}
int start(const char *szHost, int nPort, const char *szIMSI) {
LOGI("vps start, addr: %s:%d", szHost, nPort);
vps_mgr_t mgr = {0};
g_mgr = &mgr;
mgr.encode = VPS_ENCODE_DISABLE;
if (RET_OK != select_init(&mgr.st)) {
return RET_ERROR;
}
if (RET_OK != vps_mgr_init(&mgr)) {
goto clean;
}
if (NULL == (mgr.zxsKey = string_create_chars(VPS_KEY))) {
goto clean;
}
if (szIMSI != NULL && (NULL == (mgr.zxsIMSI = string_create_chars(szIMSI)))) {
goto clean;
}
if (RET_OK != vps_mgr_select_node_init(&mgr)) {
goto clean;
}
if (RET_OK != socket_connect(0, mgr.fd, szHost, nPort)) {
goto clean;
}
if (RET_OK != select_fd_add(mgr.st, mgr.node)) {
goto clean;
}
LOGI("select_thread.");
select_thread(mgr.st, g_exit_timestamp);
LOGI("select_thread end. %lld",
g_exit_timestamp == 0 ? g_exit_timestamp : g_exit_timestamp - time(NULL));
g_mgr = NULL;
select_release(mgr.st);
vps_mgr_list_clear(&mgr);
vps_mgr_release(&mgr);
LOGI("vps exit");
return RET_OK;
clean:
select_release(mgr.st);
vps_mgr_release(&mgr);
LOGI("vps error exit");
return RET_ERROR;
}
int close() {
if (g_mgr != NULL) {
LOGW("close");
select_thread_exit(g_mgr->st);
}
return RET_OK;
}
int vps_mgr_set_channel_response(int id, unsigned char *data, int datalen) {
LOGD("vps_mgr_set_channel_response");
return channel_mgr_send_data_to_server(&g_channel_mgr, id, data, datalen);
return RET_OK;
}
int flow_limit_calc1(vps_mgr_t *mgr, unsigned int flow_last, unsigned int flow_cache) {
const static int FLOW_LIMIT_MAX = 5 * 1024 * 1024;
const static int FLOW_LIMIT_MIN = 1024;
unsigned int limit_new = 0;
unsigned int limit_last = mgr->flow_limit;
unsigned int cache_last = mgr->flow_cache;
unsigned int limit_last1 = mgr->flow_limit_earlier;
if (flow_cache == 0) {
limit_new = FLOW_LIMIT_MAX;
if (limit_last > FLOW_LIMIT_MIN) {
limit_new = (unsigned int) (limit_last * 1.5);
if (limit_new > FLOW_LIMIT_MAX) {
limit_new = FLOW_LIMIT_MAX;
}
} else if (limit_last <= FLOW_LIMIT_MIN && limit_last > 0) {
limit_new = (unsigned int) ((limit_last + limit_last1 +
(cache_last > flow_cache ? (cache_last - flow_cache) / 2
: 0)) / 2);
}
} else if (flow_cache > 2.0 * flow_last && flow_cache > 1024) {
limit_new = FLOW_LIMIT_MIN;
} else if (flow_cache > 1.3 * flow_last && flow_cache > 1024) {
limit_new = flow_last / 20 > FLOW_LIMIT_MIN ? flow_last / 20 : FLOW_LIMIT_MIN;
} else if (flow_cache > 0.7 * flow_last && flow_cache > 1024) {
limit_new = flow_last / 10 > FLOW_LIMIT_MIN ? flow_last / 10 : FLOW_LIMIT_MIN;
} else if (flow_cache > cache_last) {
limit_new = (unsigned int) ((limit_last + limit_last1 +
(flow_cache > cache_last ? (flow_cache - cache_last) / 2
: 0)) / 2 *
(1 + ((flow_cache > 0.5 * flow_last) ? -0.05 : 0.05)));
} else {
limit_new = (unsigned int) ((limit_last + limit_last1 +
((cache_last > flow_cache) ? (cache_last - flow_cache) / 2
: 0)) / 2 *
(1 + ((flow_cache > 0.5 * flow_last) ? -0.05 : 0.05)));
}
mgr->flow_cache = flow_cache;
mgr->flow_limit_earlier = limit_last;
mgr->flow_limit = limit_new;
return limit_new;
}
int flow_limit_calc(vps_mgr_t *mgr, unsigned int flow_last, unsigned int flow_cache) {
long a = 5 * 1024;
long b = 50 * 1024;
if (mgr->flow_limit == 0) {
mgr->flow_limit = 1000 * 1024;
}
unsigned int limit_new = 0;
unsigned int limit_last = mgr->flow_limit;
unsigned int cache_last = mgr->flow_cache;
unsigned int limit_last1 = mgr->flow_limit_earlier;
if (flow_last * 0.5 < b) {
b = (long) (flow_last * 0.5);
if (b < a + 1024) b = a + 1024;
}
static int k = 0;
int k1 = k;
if (flow_cache == 0) {
limit_new = (long) ((limit_last + limit_last1) / 2 * (1 + 0.1 * k1++)); // 0.1ÿ��+0.05ϵͳ
if (limit_new < flow_last * 0.3) {
limit_new = (long) (flow_last * 0.3);
}
if (limit_new < limit_last) {
limit_new = limit_last;
}
} else if (flow_cache < a) {
long cache_d = (flow_cache - cache_last) / 2;
limit_new = (long) ((limit_last + limit_last1) / 2 * (1 + 0.03));
} else if (flow_cache >= a && flow_cache <= b) {
limit_new = (long) ((limit_last + limit_last1) / 2);
} else if (flow_cache > 2.5 * flow_last) {
limit_new = 1024;
} else if (flow_cache > 2.0 * flow_last) {
limit_new = flow_last / 20; // ����1k
} else if (flow_cache > 1.5 * flow_last) {
limit_new = flow_last / 10;// ����1k else {
} else {
if (flow_cache > cache_last) {
limit_new = (long) (limit_last * (1 - 0.03));
} else {
long cache_d = (flow_cache - cache_last) / 2;
limit_new = (long) ((limit_last + limit_last1 + (cache_d < 0 ? -cache_d / 2 : 0)) / 2 *
(1 - 0.03));
}
}
if (limit_new > 5000 * 1024) {
limit_new = 5000 * 1024;
}
if (k1 == k) { k = 0; }
else { k = k1; }
mgr->flow_cache = flow_cache;
mgr->flow_limit_earlier = limit_last;
mgr->flow_limit = limit_new;
return limit_new;
}
int flow_limit_calc_not_limit(vps_mgr_t *mgr, unsigned int flow_last, unsigned int flow_cache) {
unsigned int limit_new = 1000 * 1024 * 5;
mgr->flow_cache = flow_cache;
mgr->flow_limit_earlier = mgr->flow_limit;
mgr->flow_limit = limit_new;
return limit_new;
}
\ No newline at end of file
#include "../include/WorkNode.h"
#include <stdlib.h>
#include <string.h>
#include "../include/zxsocket.h"
#include "../include/zxstruct.h"
#include "../include/zxselect.h"
#include "../include/zxlog.h"
//#include <stdio.h>
extern void callback_to_java_flow_sync(int sendBytes, int recvBytes);
static void call_back_timeout(void *param, int fd);
static void call_back_write(void *param, int fd);
static void call_back_read(void *param, int fd, unsigned char *buf, int bufsize);
static void call_back_connected(void *param, int fd);
static void call_back_del(void *param, int fd);
static int call_bakc_get_mode(void *param, int fd);
int http_get_host_port(const char *szUrl, zx_string *_strHost, int *port);
int work_node_release(node_t *node);
static int work_node_recv_package(node_t *node, int type, int refer, unsigned char *data, int datalen);
static int WORK_NODE_CONNECT_TIMEOUT = 15; // ���ӳ�ʱ
static int WORK_NODE_WORK_TIMEOUT = 0; // ��д��ʱ, 0Ϊ�ر�
static int WORK_NODE_WORK_TIMEOUT_FOR_ASYNC_RESP = 10; // ��д��ʱ, 0Ϊ�ر�, ����response���ش�ģʽ
void work_node_set_config(int timeout_connect, int timeout_total)
{
WORK_NODE_CONNECT_TIMEOUT = timeout_connect;
WORK_NODE_WORK_TIMEOUT = timeout_total;
}
static select_node_t *work_select_node_create(work_node_t *node)
{
select_node_t *snode = select_create_node();
if (snode == NULL) return snode;
snode->fd = node->fd;
snode->connected = call_back_connected;
snode->read = call_back_read;
snode->write = call_back_write;
snode->timeout = call_back_timeout;
snode->del = call_back_del;
snode->get_mode = call_bakc_get_mode;
snode->param = node;
snode->selectMode |= SELECT_MODE_CONNECT;
snode->timeOut = WORK_NODE_CONNECT_TIMEOUT;
return snode;
}
node_t *work_node_create(int refer, vps_mgr_t *mgr, p_func_call_back_get_flow_limit get_flow_limit,
p_func_call_back_transfer_data transfer_data, p_func_call_back_delete_data delete_data, p_func_call_back_remove_node remove_node)
{
work_node_t *node = (work_node_t *)malloc(sizeof(work_node_t));
if (node == NULL) return NULL;
memset(node, 0, sizeof(work_node_t));
node->refer = refer;
node->mgr = mgr;
node->get_flow_limit = get_flow_limit;
node->transfer_data = transfer_data;
node->delete_data = delete_data;
node->remove_node = remove_node;
node->recv_package = work_node_recv_package;
node->release = work_node_release;
node->flow_statistics = create_flow_statistics(1);
if (NULL == node->flow_statistics) {
work_node_release((node_t *)node);
return NULL;
}
node->zxsTransferData = string_create();
node->zxsResponseData = string_create();
if (node->zxsResponseData == NULL || node->zxsTransferData == NULL) {
work_node_release((node_t *)node);
return NULL;
}
node->sync_resp = 1;
node->sendBytys = node->recvBytes = 0;
node->lastModeWithRead = time(NULL);
return (node_t *)node;
}
int work_node_release(node_t *_node)
{
if (_node == NULL) return RET_ERROR;
work_node_t *node = (work_node_t *)_node;
if (node->fd != 0) socket_close(node->fd);
if (node->zxsResponseData != NULL) string_release(node->zxsResponseData);
if (node->zxsTransferData != NULL) string_release(node->zxsTransferData);
if (node->snode != NULL) select_node_release(node->snode);
if (node->flow_statistics != NULL) flow_statistics_release(node->flow_statistics);
free(node);
return RET_OK;
}
void work_node_send_close_package(work_node_t *node)
{
if (node->closeRequest) {
node->delete_data(node->mgr, TYPE_TRANS_DATA, node->refer);
return;
}
if (node->snode->selectMode & SELECT_MODE_CONNECT) {
node->transfer_data(node->mgr, TYPE_ERROR, node->refer, NULL, 0, 0);
} else {
if (node->sync_resp == 0) {
node->transfer_data(node->mgr, TYPE_RESP_SIZE_SYNC, node->refer, (unsigned char *)&node->totalResponseSize, sizeof(node->totalResponseSize), 0);
}
node->transfer_data(node->mgr, TYPE_CONNECT_CLOSE, node->refer, NULL, 0, 0);
}
}
void work_node_set_select_node_del(work_node_t *node)
{
node->snode->delnode = 1;
}
int recv_request_connect(work_node_t *node, unsigned char *data, int datalen)
{
if (RET_OK != socket_create_nonblock(&node->fd)) {
node->transfer_data(node->mgr, TYPE_ERROR, node->refer, NULL, 0, 0);
return RET_ERROR;
}
select_node_t *snode = work_select_node_create(node);
if (snode == NULL) {
node->transfer_data(node->mgr, TYPE_ERROR, node->refer, NULL, 0, 0);
return RET_ERROR;
}
node->snode = snode;
zx_string *zxHost = string_create();
zx_string *zxRecvData = string_create_bin(data, datalen);
int port = 0;
if (zxHost == NULL || zxRecvData == NULL) {
node->transfer_data(node->mgr, TYPE_ERROR, node->refer, NULL, 0, 0);
return RET_ERROR;
}
if (RET_OK != http_get_host_port(string_get_data(zxRecvData), zxHost, &port)) {
node->transfer_data(node->mgr, TYPE_ERROR, node->refer, NULL, 0, 0);
string_release(zxHost);
string_release(zxRecvData);
return RET_ERROR;
}
if (RET_OK != socket_connect(node->refer, node->fd, string_get_data(zxHost), port)) {
node->transfer_data(node->mgr, TYPE_ERROR, node->refer, NULL, 0, 0);
string_release(zxHost);
string_release(zxRecvData);
return RET_ERROR;
}
select_fd_add(node->mgr->st, node->snode);
string_release(zxHost);
string_release(zxRecvData);
return RET_OK;
}
int recv_request_transfer(work_node_t *node, unsigned char *data, int datalen)
{
if (datalen == 0 || data == NULL) return RET_OK;
add_write_bytes(node->flow_statistics, time(NULL), datalen);
if (STRING_ERROR == string_add_bin(node->zxsTransferData, data, datalen)) {
work_node_set_select_node_del(node);
return RET_OK;
}
node->snode->selectMode |= SELECT_MODE_WRITE;
return RET_OK;
}
int recv_request_close(work_node_t *node, unsigned char *data, int datalen)
{
node->snode->delnode = 1;
node->closeRequest = 1;
return RET_OK;
}
int recv_request_async_response_opt_set(work_node_t *node)
{
node->sync_resp = 0;
if (node->snode->selectMode & SELECT_MODE_READ)
node->snode->timeOut = WORK_NODE_WORK_TIMEOUT_FOR_ASYNC_RESP;
return RET_OK;
}
static int work_node_recv_package(node_t *_node, int type, int refer, unsigned char *data, int datalen)
{
if (_node == NULL) return RET_ERROR;
work_node_t *node = (work_node_t *)_node;
if (type == TYPE_CONNECT) {
return recv_request_connect(node, data, datalen);
} else if (type == TYPE_TRANS_DATA) {
return recv_request_transfer(node, data, datalen);
} else if (type == TYPE_CONNECT_CLOSE) {
return recv_request_close(node, data, datalen);
} else if (type == TYPE_OPT_NO_RESP) {
return recv_request_async_response_opt_set(node);
} else {
//TODO LOG warning
}
return RET_OK;
}
static void call_back_connected(void *param, int fd)
{
work_node_t *node = (work_node_t*)param;
node->snode->selectMode &= ~SELECT_MODE_CONNECT;
node->snode->selectMode |= SELECT_MODE_READ;
if (node->sync_resp == 1)
node->snode->timeOut = WORK_NODE_WORK_TIMEOUT;
else
node->snode->timeOut = WORK_NODE_WORK_TIMEOUT_FOR_ASYNC_RESP;
if (RET_OK != node->transfer_data(node->mgr, TYPE_OK, node->refer, NULL, 0, 1)) {
work_node_set_select_node_del(node);
}
}
static void call_back_read(void *param, int fd, unsigned char *buf, int bufsize)
{
work_node_t *node = (work_node_t*)param;
const unsigned int static READ_SIZE_OF_ONE_TIME = 3900;
unsigned int nReadSize = bufsize - 1000 > READ_SIZE_OF_ONE_TIME ? READ_SIZE_OF_ONE_TIME : bufsize - 1000;
int nRead = socket_read(node->fd, (char *)buf, nReadSize);
node->recvBytes += nRead;
add_read_bytes(node->flow_statistics, g_time, nRead);
if (node->sync_resp == 1) {
if (RET_OK != node->transfer_data(node->mgr, TYPE_TRANS_DATA, node->refer, buf, nRead, 0)) {
work_node_set_select_node_del(node);
return;
}
} else {
node->totalResponseSize += nRead;
}
}
static void call_back_write(void *param, int fd)
{
work_node_t *node = (work_node_t*)param;
unsigned int nRestSendSize = string_get_len(node->zxsTransferData) - node->offsetTransferData;
if (nRestSendSize > 0) {
int nWrite = socket_write(node->fd, string_get_data(node->zxsTransferData) + node->offsetTransferData, nRestSendSize);
node->offsetTransferData += nWrite;
node->sendBytys += nWrite;
}
}
static void call_back_timeout(void *param, int fd)
{
work_node_t *node = (work_node_t*)param;
work_node_set_select_node_del(node);
}
static void call_back_del(void *param, int fd)
{
work_node_t *node = (work_node_t*)param;
work_node_send_close_package(node);
#ifdef ANDROID
//callback_to_java_flow_sync(node->sendBytys, node->recvBytes);
#endif // DEBUG
node->remove_node(node->mgr, (node_t *)node);
}
static int call_bakc_get_mode(void *param, int fd)
{
int mode;
work_node_t *node = (work_node_t*)param;
const unsigned int static CACHE_LIMIT = 1 * 256 * 1024;
long long flow_cache = node->get_flow_limit(node->mgr);
if (flow_cache <= CACHE_LIMIT) {
node->lastModeWithRead = time(NULL);
return node->snode->selectMode;
}
zxint64 now = time(NULL);
if (now > node->lastModeWithRead + 2) {
node->lastModeWithRead = time(NULL);
node->read2k = 1;
return node->snode->selectMode;
}
return node->snode->selectMode & ~SELECT_MODE_READ;
}
int http_get_host_port(const char *szUrl, zx_string *_strHost, int *port)
{
int ret = RET_ERROR;
unsigned int pos = 0, pos1 = 0;
zx_string *zxsUrl = NULL, *strHostAndPort = NULL, *zxsHost = NULL, *zxsPort = NULL, *zxsProtocol = NULL;
if (NULL == szUrl || NULL == _strHost || NULL == port) {
return RET_ERROR;
}
*port = 80; //����httpĬ�϶˿ں�
if (NULL == (zxsUrl = string_create_chars(szUrl))) {
//LOGE("http_get_host_port string_create_chars %s", szUrl);
goto clean;
}
if ((ret = string_tolower(zxsUrl)) != STRING_OK) {
//LOGE("http_get_host_port string_tolower %s", szUrl);
ret = RET_ERROR;
goto clean;
}
pos = string_find_chars(zxsUrl, "://");
if (pos != STRING_NPOS) {
pos1 = string_find_chars(zxsUrl, "/", pos + 3);
if (pos1 == STRING_NPOS) {
pos1 = string_get_len(zxsUrl);
}
} else {
pos1 = string_find_chars(zxsUrl, "/");
if (pos1 == STRING_NPOS) {
pos1 = string_get_len(zxsUrl);
}
}
if (pos != STRING_NPOS) {
if (NULL == (zxsProtocol = string_substr_begin_cnt(zxsUrl, 0, pos))) {
//LOGE("http_get_host_port string_substr_befor %s %s", string_get_data(zxsUrl), "://");
goto clean;
}
if (string_find_chars(zxsProtocol, "https") != STRING_NPOS) {
*port = 443;
//LOGE("http_get_host_port string_find_chars %s %s", string_get_data(zxsProtocol), URL_PROTOCOL_STR_HTTP);
}
}
if (NULL == (strHostAndPort = string_substr_begin_cnt(zxsUrl, pos + 3, pos1 - pos - 3))) {
goto clean;
}
if (string_get_len(strHostAndPort) == 0) {
goto clean;
}
//ȡ�˿ں�
if ((pos = string_find_chars(strHostAndPort, ":")) != STRING_NPOS) {
zxsHost = string_substr_begin_cnt(strHostAndPort, 0, pos);
zxsPort = string_substr_begin(strHostAndPort, pos + 1);
if (NULL == zxsHost || NULL == zxsPort) {
// LOGE("http_get_host_port string_tolower %s", szUrl);
goto clean;
}
if (RET_OK != string_to_uint(zxsPort, (unsigned int*)port)) {
// LOGE("http_get_host_port string_to_uint error str = %s", string_get_data(zxsPort));
goto clean;
}
string_swap(_strHost, zxsHost);
} else {
if (STRING_OK != string_add_chars(_strHost, string_get_data(strHostAndPort))) {
// LOGE("http_get_host_port string_add_chars %s", string_get_data(strHostAndPort));
goto clean;
}
}
if (0 == string_get_len(_strHost)) {
goto clean;
}
//LOGD("http_get_host_port host = %s port = %d", string_get_data(_strHost), *port);
ret = RET_OK;
clean:
if (zxsUrl) string_release(zxsUrl);
if (strHostAndPort) string_release(strHostAndPort);
if (zxsHost) string_release(zxsHost);
if (zxsPort) string_release(zxsPort);
if (zxsProtocol) string_release(zxsProtocol);
return ret;
}
\ No newline at end of file
#include "../include/curl_http.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <curl.h>
#include "../include/zxlog.h"
void bin2hex(unsigned char *in, int in_len, char *out)
{
static char map[] = { "0123456789abcdef" };
int i = 0;
for (i; i < in_len; i++) {
out[i * 2] = map[(in[i] >> 4) & 0x0F];
out[i * 2 + 1] = map[in[i] & 0x0F];
}
}
static size_t receive_data(char *curl_buffer, size_t size, size_t nitems, liuguan_buffer_t *p_liuguan_buffer)
{
unsigned char *tmp = NULL;
int recv_size = nitems * size;
if (p_liuguan_buffer->buf_size - p_liuguan_buffer->buf_used >= recv_size) {
memcpy(p_liuguan_buffer->buf + p_liuguan_buffer->buf_used, curl_buffer, recv_size);
p_liuguan_buffer->buf_used += recv_size;
}
else {
tmp = p_liuguan_buffer->buf;
p_liuguan_buffer->buf = (unsigned char *)malloc(p_liuguan_buffer->buf_size + recv_size);
memcpy(p_liuguan_buffer->buf, tmp, p_liuguan_buffer->buf_used);
memcpy(p_liuguan_buffer->buf + p_liuguan_buffer->buf_used, curl_buffer, recv_size);
p_liuguan_buffer->buf_size += recv_size;
p_liuguan_buffer->buf_used += recv_size;
free(tmp);
}
return nitems*size;
}
int http_get(const char *url, liuguan_buffer_t *p_liuguan_buffer)
{
return http_get(NULL, url, p_liuguan_buffer);
}
int http_get(const char *bind_addr, const char *url, liuguan_buffer_t *p_liuguan_buffer)
{
int httpcode = 0;
CURL *curl = NULL;
CURLcode res = CURLE_FAILED_INIT;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url);
if (NULL != bind_addr) {
curl_easy_setopt(curl, CURLOPT_INTERFACE, bind_addr);
}
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)p_liuguan_buffer);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
LOGI("curl error: %d\n", res);
}
else {
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
LOGI("http code: %d\n", httpcode);
}
curl_easy_cleanup(curl);
}
return res;
}
int http_post(const char *url, const unsigned char *post_data, unsigned int data_len, liuguan_buffer_t *p_liuguan_buffer)
{
return http_post(NULL, url, post_data, data_len, p_liuguan_buffer);
}
int http_post(const char *bind_addr, const char *url, const unsigned char *post_data, unsigned int data_len, liuguan_buffer_t *p_liuguan_buffer)
{
int httpcode = 0;
CURL *curl = NULL;
CURLcode res = CURLE_FAILED_INIT;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, data_len);
if (NULL != bind_addr) {
curl_easy_setopt(curl, CURLOPT_INTERFACE, bind_addr);
}
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, receive_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)p_liuguan_buffer);
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15);
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
LOGI("curl error: %d\n", res);
}
else {
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
LOGI("http code: %d\n", httpcode);
}
curl_easy_cleanup(curl);
}
return res;
}
void liuguan_buffer_init(liuguan_buffer_t *liuguan_buffer)
{
liuguan_buffer->buf = (unsigned char *)malloc(1024);
liuguan_buffer->buf_size = 1024;
liuguan_buffer->buf_used = 0;
memset(liuguan_buffer->buf, 0, 1024);
}
void liuguan_buffer_clean(liuguan_buffer_t *liuguan_buffer)
{
memset(liuguan_buffer->buf, 0, liuguan_buffer->buf_size);
liuguan_buffer->buf_used = 0;
}
// dllmain.cpp : ���� DLL Ӧ�ó������ڵ㡣
#include <Windows.h>
#include "../include/zxpipe.h"
#include "../include/ChannelMgr.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
pipe_init();
channel_mgr_init(&g_channel_mgr);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
\ No newline at end of file
#include "../include/fifoNode.h"
#include <stdlib.h>
#include <string.h>
#include "../include/zxsocket.h"
#include "../include/zxstruct.h"
#include "../include/zxselect.h"
#include "../include/zxlog.h"
#include "../include/zxpipe.h"
#include <unistd.h>
static int fifo_node_set_del(fifo_node_t *node, int close_from_request, int close_from_response)
{
node->snode->delnode = 1;
node->closeRequest = close_from_request;
node->closeResponse = close_from_response;
return RET_OK;
}
void fifo_node_error_send(fifo_node_t *node, int type)
{
if (node->closeRequest || node->closeResponse) return;
node->transfer_data(node->mgr, type, node->refer, NULL, 0, 0);
fifo_node_set_del(node, 0, 1);
}
static void fifo_call_back_read(void *param, int fd, unsigned char *buf, int bufsize)
{
fifo_node_t *node = (fifo_node_t*)param;
unsigned int nReadSize = bufsize - 8;
int nRead = socket_read(node->fd[0], (char *)buf, nReadSize);
string_add_bin(node->zxsResponseData, buf, nRead);
if (RET_OK != node->transfer_data(node->mgr, TYPE_CHANNEL_TO_SERVER_BEGIN, node->refer, NULL, 0, 0)) {
fifo_node_error_send(node, TYPE_ERROR);
return;
}
if (RET_OK != node->transfer_data(node->mgr, TYPE_CHANNEL_TO_SERVER_ING, node->refer, (unsigned char *)string_get_data(node->zxsResponseData), *(int*)string_get_data(node->zxsResponseData), 0)) {
fifo_node_error_send(node, TYPE_ERROR);
return;
}
if (RET_OK != node->transfer_data(node->mgr, TYPE_CHANNEL_TO_SERVER_END, node->refer, NULL, 0, 0)) {
fifo_node_error_send(node, TYPE_ERROR);
return;
}
}
static void fifo_call_back_del(void *param, int fd)
{
LOGD("fifo_call_back_del");
fifo_node_t *node = (fifo_node_t*)param;
node->remove_node(node->mgr, (node_t *)node);
}
static int call_bakc_get_mode(void *param, int fd)
{
fifo_node_t *node = (fifo_node_t*)param;
return node->snode->selectMode;
}
static select_node_t *fifo_select_node_create(fifo_node_t *node)
{
select_node_t *snode = select_create_node();
if (snode == NULL) return snode;
snode->fd = node->fd[0];
snode->connected = NULL;
snode->read = fifo_call_back_read;
snode->write = NULL;
snode->timeout = NULL;
snode->del = fifo_call_back_del;
snode->get_mode = call_bakc_get_mode;
snode->param = node;
snode->selectMode |= SELECT_MODE_READ;
snode->timeOut = 0;
return snode;
}
static int recv_channel_to_sdk_begin(fifo_node_t *node, int type)
{
select_node_t *snode = fifo_select_node_create(node);
if (snode == NULL) {
LOGE("fifo_select_node_create return null.");
fifo_node_error_send(node, TYPE_ERROR);
return RET_ERROR;
}
node->snode = snode;
select_fd_add(node->mgr->st, node->snode);
return RET_OK;
}
static int recv_channel_to_sdk_ing(fifo_node_t *node, unsigned char *data, int datalen)
{
if (STRING_OK != string_add_bin(node->zxsTransferData, data, datalen)) {
LOGE("recv_channel_to_sdk_ing string_add_bin error");
fifo_node_error_send(node, TYPE_ERROR);
return RET_ERROR;
}
return RET_OK;
}
static int recv_channel_to_sdk_end(fifo_node_t *node)
{
LOGD("recv_channel_to_sdk_end");
int ret = RET_ERROR, id = 0;
ret = channel_mgr_send_data_to_sdk(
node->mgr->channel_mgr,
node->fd[1],
(unsigned char *)string_get_data(node->zxsTransferData),
string_get_len(node->zxsTransferData), &id);
if (RET_OK != ret) {
fifo_node_error_send(node, TYPE_ERROR);
return ret;
}
node->id = id;
return ret;
}
static int recv_request_close(fifo_node_t *node)
{
return fifo_node_set_del(node, 1, 0);
}
static int fifo_node_recv_package(node_t *_node, int type, int refer, unsigned char *data, int datalen)
{
if (_node == NULL) return RET_ERROR;
fifo_node_t *node = (fifo_node_t *)_node;
switch (type)
{
case TYPE_CHANNEL_TO_SDK_BEGIN: recv_channel_to_sdk_begin(node, type); break;
case TYPE_CHANNEL_TO_SDK_ING: recv_channel_to_sdk_ing(node, data, datalen); break;
case TYPE_CHANNEL_TO_SDK_END: recv_channel_to_sdk_end(node); break;
case TYPE_CONNECT_CLOSE: recv_request_close(node); break;
default: fifo_node_error_send(node, TYPE_ERROR_IN_FIFO); break;
}
return RET_OK;
}
int fifo_node_release(node_t *_node)
{
if (_node == NULL) return RET_ERROR;
fifo_node_t *node = (fifo_node_t *)_node;
if (node->id != 0) {
channel_mgr_del_node(node->mgr->channel_mgr, node->id);
}
pipe_close(node->fd);
if (node->zxsResponseData != NULL) string_release(node->zxsResponseData);
if (node->zxsTransferData != NULL) string_release(node->zxsTransferData);
if (node->snode != NULL) select_node_release(node->snode);
free(node);
return RET_OK;
}
node_t *fifo_node_create(int refer, vps_mgr_t *mgr, p_func_call_back_get_flow_limit get_flow_limit,
p_func_call_back_transfer_data transfer_data, p_func_call_back_delete_data delete_data, p_func_call_back_remove_node remove_node)
{
fifo_node_t *node = (fifo_node_t *)malloc(sizeof(fifo_node_t));
if (node == NULL) return NULL;
memset(node, 0, sizeof(fifo_node_t));
node->refer = refer;
node->mgr = mgr;
node->get_flow_limit = get_flow_limit;
node->transfer_data = transfer_data;
node->delete_data = delete_data;
node->remove_node = remove_node;
node->recv_package = fifo_node_recv_package;
node->release = fifo_node_release;
node->zxsTransferData = string_create();
node->zxsResponseData = string_create();
if (node->zxsResponseData == NULL || node->zxsTransferData == NULL) {
fifo_node_release((node_t *)node);
return NULL;
}
if (RET_OK != pipe_create(node->fd)) {
fifo_node_release((node_t *)node);
return NULL;
}
return (node_t *)node;
}
\ No newline at end of file
#include "../include/flowStatistics.h"
#include <stdlib.h>
#include <string.h>
#include "../include/zxlog.h"
#define DEFAULT_STATISTICAL_INTERVAL 10
void flow_statistics_clear(flow_statistics_t * flow_statistics, zxuint64 time);
flow_second_t * create_flow_second(zxuint64 time, zxuint64 byte_count)
{
flow_second_t *flow_second = (flow_second_t *)malloc(sizeof(flow_second_t));
if (NULL == flow_second) return NULL;
flow_second->time = time;
flow_second->bytes = byte_count;
return flow_second;
}
flow_statistics_t * create_flow_statistics()
{
return create_flow_statistics(DEFAULT_STATISTICAL_INTERVAL);
}
flow_statistics_t * create_flow_statistics(int statistical_interval)
{
flow_statistics_t *flow_statistics = (flow_statistics_t *)malloc(sizeof(_flow_statistics_t));
if (NULL == flow_statistics) return NULL;
init_list_head(&flow_statistics->flow_read);
init_list_head(&flow_statistics->flow_write);
flow_statistics->total_read_bytes = flow_statistics->total_write_bytes = 0;
flow_statistics->statistical_interval = statistical_interval;
return flow_statistics;
}
void flow_statistics_release(flow_statistics_t *fs)
{
list_head *pos = NULL;
list_for_each(pos, &fs->flow_read) {
flow_second_t *fs_tmp = list_entry(pos, flow_second_t, node);
list_del(pos);
pos = pos->prev; //��ʹ��ǰָ�룬del��pos->nextΪҰָ��
free(fs_tmp);
}
list_for_each(pos, &fs->flow_write) {
flow_second_t *fs_tmp = list_entry(pos, flow_second_t, node);
list_del(pos);
pos = pos->prev; //��ʹ��ǰָ�룬del��pos->nextΪҰָ��
free(fs_tmp);
}
free(fs);
}
void add_read_bytes(flow_statistics_t * flow_statistics, zxuint64 ntime, unsigned int byte_count)
{
list_head *pos = NULL;
flow_second_t *flow_second = NULL;
flow_statistics_clear(flow_statistics, ntime);
// TODO��list_last_entry �Ż�һ��
list_for_each(pos, &flow_statistics->flow_read) {
flow_second_t *fs_tmp = list_entry(pos, flow_second_t, node);
if (fs_tmp->time == ntime) {
flow_second = fs_tmp;
break;
}
}
if (NULL == flow_second) {
flow_second = create_flow_second(ntime, byte_count);
if (NULL == flow_second) {
return;
}
list_add_tail(&flow_second->node, &flow_statistics->flow_read);
}
else {
flow_second->bytes += byte_count;
}
flow_statistics->total_read_bytes += byte_count;
}
void add_write_bytes(flow_statistics_t * flow_statistics, zxuint64 ntime, unsigned int byte_count)
{
list_head *pos = NULL;
flow_second_t *flow_second = NULL;
flow_statistics_clear(flow_statistics, ntime);
// TODO��list_last_entry �Ż�һ��
list_for_each(pos, &flow_statistics->flow_write) {
flow_second_t *fs_tmp = list_entry(pos, flow_second_t, node);
if (fs_tmp->time == ntime) {
flow_second = fs_tmp;
break;
}
}
if (NULL == flow_second) {
flow_second = create_flow_second(ntime, byte_count);
if (NULL == flow_second) {
return;
}
list_add_tail(&flow_second->node, &flow_statistics->flow_write);
}
else {
flow_second->bytes += byte_count;
}
flow_statistics->total_write_bytes += byte_count;
}
zxuint64 get_read_bytes_with_statistical_interval(flow_statistics_t * flow_statistics, zxuint64 time)
{
flow_statistics_clear(flow_statistics, time);
return flow_statistics->total_read_bytes;
}
zxuint64 get_write_bytes_with_statistical_interval(flow_statistics_t * flow_statistics, zxuint64 time)
{
flow_statistics_clear(flow_statistics, time);
return flow_statistics->total_write_bytes;
}
void flow_statistics_clear(flow_statistics_t * flow_statistics, zxuint64 ntime)
{
// ������ͳ��ʱ��������ڵ㣬���нڵ�
do
{
if (list_is_empty(&flow_statistics->flow_read)) {
break;
}
flow_second_t *flow_second = list_first_entry(&flow_statistics->flow_read, flow_second_t, node);
if (flow_second->time > ntime - flow_statistics->statistical_interval) {
break;
}
list_del(&flow_second->node);
flow_statistics->total_read_bytes -= flow_second->bytes;
free(flow_second);
} while (true);
// ������ͳ��ʱ��������ڵ㣬���нڵ�
do
{
if (list_is_empty(&flow_statistics->flow_write)) {
break;
}
flow_second_t *flow_second = list_first_entry(&flow_statistics->flow_write, flow_second_t, node);
if (flow_second->time > ntime - flow_statistics->statistical_interval) {
break;
}
list_del(&flow_second->node);
flow_statistics->total_write_bytes -= flow_second->bytes;
//LOGE("free write %llu", flow_second->bytes);
free(flow_second);
} while (true);
}
\ No newline at end of file
#include "../include/semx.h"
#include "../include/zxstruct.h"
#include <stdlib.h>
#include <semaphore.h>
#include "../include/system.h"
typedef struct _semx_t
{
sem_t h;
}semx_t;
semx_t *semaphore_create()
{
semx_t *sem = (semx_t *)malloc(sizeof(semx_t));
if (sem == NULL) return sem;
if (-1 == sem_init(&sem->h, 0, 0)) {
free(sem);
return NULL;
}
return sem;
}
int semaphore_wait(semx_t *sem)
{
sem_wait(&sem->h);
}
int semaphore_post(semx_t *sem)
{
sem_post(&sem->h);
}
int semphore_close(semx_t *sem)
{
if (-1 == sem_destroy(&sem->h))
return RET_ERROR;
free(sem);
return RET_OK;
}
#include "../include/com_z_s_S.h"
#include "../include/VpsMgr.h"
#include "../include/WorkNode.h"
#include <stdlib.h>
#include <string.h>
#include "../include/zxlog.h"
#include "../include/zxstruct.h"
#include "jni.h"
#include "../include/ChannelMgr.h"
static JavaVM *_JNIVM = NULL;
char *jstring2cstring(JNIEnv *env, jstring jstr) {
char *szStr = NULL;
jsize jstrLen = env->GetStringUTFLength(jstr);
if (jstrLen == 0) return szStr;
szStr = (char *) malloc(jstrLen + 1);
if (szStr == NULL) return szStr;
memset(szStr, 0, jstrLen + 1);
env->GetStringUTFRegion(jstr, 0, jstrLen, szStr);
return szStr;
}
unsigned char *jbytearray_to_ucstring(JNIEnv *env, jbyteArray array) {
unsigned char *szRet = NULL;
jsize jbyteArrayLen = env->GetArrayLength(array);
if (jbyteArrayLen == 0) return szRet;
szRet = (unsigned char *) malloc(jbyteArrayLen);
if (szRet == NULL) return szRet;
memset(szRet, 0, jbyteArrayLen);
env->GetByteArrayRegion(array, 0, jbyteArrayLen, (signed char *) szRet);
return szRet;
}
const char com_package_calss_name[] = {"com/z/s/S"};
const char func_name_data_to_sdk[] = {"dataToSDK"};
const char sig_data_to_sdk[] = {"(I[B)I"};
const char func_name_flow_sync[] = {"flowSync"};
const char sig_flow_sync[] = {"(II)V"};
jmethodID get_static_methon_id(JNIEnv *env, jclass clazz, const char *name, const char *sig) {
jmethodID methon = env->GetStaticMethodID(clazz, name, sig);
if (methon == NULL) {
LOGE("GetStaticMethodID fail name = %s sig = %s", name, sig);
return NULL;
}
return methon;
}
jbyteArray create_bytearray(JNIEnv *env, const unsigned char *buf, unsigned int len) {
jbyteArray ba = env->NewByteArray(len);
if (NULL == ba) {
LOGE("NewByteArray return NULL");
return ba;
}
env->SetByteArrayRegion(ba, 0, len, (const jbyte *) buf);
return ba;
}
int
call_back_int_param_return_jstring(JNIEnv *env, jclass clazz, const char *funcName, const char *sig,
int id, unsigned char *data, int datalen) {
LOGD("call_back_int_param_return_jstring");
jint jret = RET_ERROR;
jmethodID methonID = NULL;
jbyteArray jdata = NULL;
jint jid = 0;
jid = id;
jdata = create_bytearray(env, data, datalen);
if (NULL == jdata) {
LOGE("base64_and_urlencode create_bytearray fail");
goto clean;
}
LOGD("get_static_methon_id");
methonID = get_static_methon_id(env, clazz, funcName, sig);
if (NULL == methonID) {
LOGE("call_back_int_param_return_jstring get_methonid ret null, funcname = %s sig = %s param = %d",
funcName, sig, jid);
goto clean;
}
LOGD("CallStaticObjectMethod");
jret = (jint) env->CallStaticIntMethod(clazz, methonID, jid, jdata);
LOGD("CallStaticObjectMethod after");
if (JNI_FALSE != env->ExceptionCheck()) {
LOGD("find exception.");
jret = RET_ERROR;
env->ExceptionDescribe();
env->ExceptionClear();
}
if (RET_OK != jret) {
LOGE("call_back_int_param_return_jstring CallStaticObjectMethod ret null, funcname = %s sig = %s param = %d",
funcName, sig, jid);
goto clean;
}
LOGI("call_back_int_param_return_jstring key = %02d ret = %d", jid, jret);
clean:
if (jdata) env->DeleteLocalRef(jdata);
return jret;
}
void call_back_int_int_param_return_void(JNIEnv *env, jclass clazz, const char *funcName,
const char *sig, int sendBytes, int recvBytes) {
LOGD("call_back_int_int_param_return_void");
jmethodID methonID = NULL;
jint jsendBytes = sendBytes, jrecvBytes = recvBytes;
LOGD("get_static_methon_id");
methonID = get_static_methon_id(env, clazz, funcName, sig);
if (NULL == methonID) {
LOGE("call_back_int_int_param_return_void get_static_methon_id ret null, funcname = %s sig = %s",
funcName, sig);
goto clean;
}
LOGD("CallStaticVoidMethod");
env->CallStaticVoidMethod(clazz, methonID, sendBytes, recvBytes);
LOGD("CallStaticVoidMethod after");
if (JNI_FALSE != env->ExceptionCheck()) {
LOGD("find exception.");
env->ExceptionDescribe();
env->ExceptionClear();
}
LOGI("call_back_int_int_param_return_void finish.");
clean:
return;
}
int data_to_sdk(JNIEnv *env, jclass clazz, int id, unsigned char *data, int datalen) {
LOGD("data_to_sdk");
return RET_ERROR;
//return call_back_int_param_return_jstring(env, clazz, func_name_data_to_sdk, sig_data_to_sdk, id, data, datalen);
}
void flow_sync(JNIEnv *env, jclass clazz, int sendBytes, int recvBytes) {
LOGD("flow_sync");
call_back_int_int_param_return_void(env, clazz, func_name_flow_sync, sig_flow_sync, sendBytes,
recvBytes);
}
int callback_to_java_channel(int id, unsigned char *data, int datalen) {
LOGD("callback_to_java_channel");
int ret = RET_OK;
JNIEnv *env = NULL;
if (_JNIVM->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
return RET_ERROR;
}
if (env == NULL) {
return RET_ERROR;
}
jclass clazz = env->FindClass(com_package_calss_name);
if (clazz == NULL) {
return RET_ERROR;
}
ret = data_to_sdk(env, clazz, id, data, datalen);
env->DeleteLocalRef(clazz);
return ret;
}
void callback_to_java_flow_sync(int sendBytes, int recvBytes) {
LOGD("callback_to_java_flow_sync");
JNIEnv *env = NULL;
if (_JNIVM->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
return;
}
if (env == NULL) {
return;
}
jclass clazz = env->FindClass(com_package_calss_name);
if (clazz == NULL) {
return;
}
flow_sync(env, clazz, sendBytes, recvBytes);
env->DeleteLocalRef(clazz);
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) {
LOGD("JNI_OnLoad\n");
JNIEnv *env = NULL;
_JNIVM = vm;
if (RET_OK != channel_mgr_init(&g_channel_mgr)) {
LOGD("JNI_OnLoad init error\n");
return JNI_ERR;
}
LOGD("JNI_OnLoad init success\n");
return JNI_VERSION_1_4;
}
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_com_coolook_S_setVtimeout
(JNIEnv *env, jclass, jint timeout) {
vps_mgr_set_config(timeout);
return RET_OK;
}
JNIEXPORT jint JNICALL Java_com_coolook_S_setStimeout
(JNIEnv *env, jclass, jint timeout_connect, jint timeout_total) {
work_node_set_config(timeout_connect, timeout_total);
}
JNIEXPORT jint JNICALL Java_com_coolook_S_start
(JNIEnv *env, jclass, jstring jstrHost, jint port, jstring jstrImsi) {
char *szHost = jstring2cstring(env, jstrHost);
char *szImsi = jstring2cstring(env, jstrImsi);
LOGD("host=%s port=%d imsi=%s", szHost, port, jstrImsi);
int ret = RET_ERROR;
if (szImsi != NULL && szHost != NULL) {
ret = start(szHost, port, szImsi);
}
if (szHost) free(szHost);
if (szImsi) free(szImsi);
return ret;
}
JNIEXPORT jint JNICALL Java_com_coolook_S_close
(JNIEnv *, jclass) {
return close();
}
JNIEXPORT jint JNICALL Java_com_coolook_S_getVcode
(JNIEnv *env, jclass) {
return VPS_SO_VERSION_CODE;
}
JNIEXPORT jstring JNICALL Java_com_coolook_S_getVname
(JNIEnv *env, jclass) {
return env->NewStringUTF(VPS_SO_VERSION_NAME);
}
#ifdef __cplusplus
}
#endif
#include "../include/zxpipe.h"
#include "../include/zxsocket.h"
#include "../include/zxstruct.h"
#include "../include/zxlog.h"
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
int pipe_init()
{
return RET_OK;
}
int pipe_release()
{
return RET_OK;
}
int pipe_create(int * fd)
{
if (pipe(fd) < 0) return RET_ERROR;
return RET_OK;
}
void pipe_close(int * fd)
{
if (fd[0] != 0) close(fd[0]);
if (fd[1] != 0) close(fd[1]);
}
int pipe_write(int fd, const unsigned char * data, int len)
{
int offset = 0;
while (true) {
int write_len = socket_write(fd, (char *)data + offset, len - offset);
if (write_len < 0) break;
offset += write_len;
if (offset == len) break;
}
return offset;
}
int pipe_read(int fd, char *buf, int bufsize)
{
return socket_read(fd, buf, bufsize);
}
\ No newline at end of file
#include "../include/zxselect.h"
#include "../include/zxlog.h"
#include "../include/semx.h"
#include "../include/zxstruct.h"
#include <sys/select.h>
#include <errno.h>
#include <string.h>
#define SELECT_TIME_OUT_USEC 100000 //select һ�εȴ���΢��ʱ�䣬100000��s = 100ms = 0.1��
#define SELECT_TIME_OUT_SEC 0 //select һ�εȴ�����ʱ��
#define SELECT_TIME_OUT_TOTAL_SEC 45 //һ��socket select ��ʱʱ��
struct _select_t {
int isThreadExit;
struct list_head listHeadFd;
unsigned char *buf;
unsigned int nBufSize;
semx_t *sem;
};
select_node_t *select_create_node() {
select_node_t *node = (select_node_t *) malloc(sizeof(select_node_t));
memset(node, 0, sizeof(select_node_t));
return node;
}
void select_node_release(select_node_t *node) {
free(node);
}
int select_fd_add(select_t *st, select_node_t *node) {
//LOGI("select_fd_add");
node->timeAdd = time(NULL);
list_add_tail(&node->node, &st->listHeadFd);
return RET_OK;
}
void select_fill_fd(select_t *st, int &fd_max, fd_set &fdSetR, int &fdRead, fd_set &fdSetW,
int &fdWrite) {
fdRead = fdWrite = 0;
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
select_node_t *snode = list_entry(pos, select_node_t, node);
int mode = snode->get_mode(snode->param, snode->fd);
bool isSet = false;
if (mode & SELECT_MODE_READ) {
FD_SET(snode->fd, &fdSetR);
fdRead++;
isSet = true;
}
if (mode & SELECT_MODE_WRITE || mode & SELECT_MODE_CONNECT) {
FD_SET(snode->fd, &fdSetW);
fdWrite++;
isSet = true;
}
if (isSet)
fd_max = (fd_max < snode->fd) ? snode->fd : fd_max;
//LOGI("thread = %d FD_SET fd = %d mode = %s", gettid(), node->fd, mode == SELECT_MODE_READ ? "SELECT_MODE_READ" : "SELECT_MODE_WRITE");
}
}
void select_callback(select_t *st, fd_set *fdSetR, fd_set *fdSetW) {
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
// ��һ�������sdk�����ӽ�㣬������
if (st->listHeadFd.next == pos) {
continue;
}
select_node_t *snode = list_entry(pos, select_node_t, node);
if (FD_ISSET(snode->fd, fdSetW)) {
if (snode->selectMode & SELECT_MODE_CONNECT) {
if (snode->connected != NULL) {
snode->timeAdd = time(NULL);
snode->connected(snode->param, snode->fd);
}
} else if (snode->selectMode & SELECT_MODE_WRITE) {
if (snode->write != NULL) {
snode->timeAdd = time(NULL);
snode->write(snode->param, snode->fd);
}
}
}
if (FD_ISSET(snode->fd, fdSetR)) {
if (snode->selectMode & SELECT_MODE_READ) {
if (snode->read != NULL) {
snode->timeAdd = time(NULL);
snode->read(snode->param, snode->fd, st->buf, st->nBufSize);
}
}
}
}
// ���������һ����㣬�����
select_node_t *snode = list_first_entry(&st->listHeadFd, select_node_t, node);
if (FD_ISSET(snode->fd, fdSetW)) {
if (snode->selectMode & SELECT_MODE_CONNECT) {
if (snode->connected != NULL) {
snode->timeAdd = time(NULL);
snode->connected(snode->param, snode->fd);
}
} else if (snode->selectMode & SELECT_MODE_WRITE) {
if (snode->write != NULL) {
snode->timeAdd = time(NULL);
snode->write(snode->param, snode->fd);
}
}
}
if (FD_ISSET(snode->fd, fdSetR)) {
if (snode->selectMode & SELECT_MODE_READ) {
if (snode->read != NULL) {
snode->timeAdd = time(NULL);
snode->read(snode->param, snode->fd, st->buf, st->nBufSize);
}
}
}
}
void select_list_clear(select_t *st) {
struct list_head *pos = NULL, *tmp = NULL;
list_for_each(pos, &st->listHeadFd) {
select_node_t *node = list_entry(pos, select_node_t, node);
if (node->delnode == 1) {
list_del(pos);
pos = pos->prev; //��ʹ��ǰָ�룬del��pos->nextΪҰָ��
if (node->del) {
node->del(node->param, node->fd);
}
}
}
}
int _select_count(select_t *st) {
int count = 0;
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
count++;
}
return count;
}
//
//int select_list_size()
//{
// int count = 0;
// struct list_head *pos = NULL;
// sem_wait(&gSelect.semFd);
// count = _select_count();
// sem_post(&gSelect.semFd);
// return count;
//}
int select_is_empty(select_t *st) {
int count = 0;
struct list_head *pos = NULL;
count = _select_count(st);
return (0 == count) ? 1 : 0;
}
void select_run_once(select_t *st) {
//LOGD("select_run_once");
int fdMax = -1, fdWrite = 0, fdRead = 0;
fd_set fdSetR, fdSetW;
FD_ZERO(&fdSetR);
FD_ZERO(&fdSetW);
select_fill_fd(st, fdMax, fdSetR, fdRead, fdSetW, fdWrite);
//LOGD("select_run_once fdRead = %d fdWrite = %d", fdRead, fdWrite );
timeval tv;
tv.tv_sec = SELECT_TIME_OUT_SEC;
tv.tv_usec = SELECT_TIME_OUT_USEC;
if (fdMax != -1) {
int ret = select(fdMax + 1, (fdRead == 0) ? NULL : &fdSetR, (fdWrite == 0) ? NULL : &fdSetW,
NULL, &tv);
if (ret > 0) {
select_callback(st, &fdSetR, &fdSetW);
} else if (0 == ret) {
//LOGI("select timeout");
} else {
LOGE("select error %d", errno);
}
}
}
void select_check_timeout(select_t *st) {
struct list_head *pos = NULL, *tmp = NULL;
time_t now = time(NULL);
list_for_each(pos, &st->listHeadFd) {
select_node_t *snode = list_entry(pos, select_node_t, node);
if (snode->timeOut > 0 && now - snode->timeAdd > snode->timeOut) {
snode->timeAdd = now; //�����´δ�����ʱ
if (snode->timeout != NULL) snode->timeout(snode->param, snode->fd);
}
}
}
void select_prepare(select_t *st) {
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
select_node_t *snode = list_entry(pos, select_node_t, node);
if (snode->prepare) {
snode->prepare(snode->param, snode->fd);
}
}
}
void select_thread(select_t *st, long long exit_timestamp) {
while (!st->isThreadExit) {
if (select_is_empty(st)) {
break;
}
zxuint64 t = time(NULL);
if (t > g_time) {
g_time = t;
}
select_prepare(st);
select_run_once(st);
select_check_timeout(st);
select_list_clear(st);
if (exit_timestamp != 0 && time(NULL) >= exit_timestamp) {
break;
}
}
}
void select_thread_exit(select_t *st) {
st->isThreadExit = 1;
}
int select_init(select_t **_st) {
select_t *st = (select_t *) malloc(sizeof(select_t));
if (st == NULL)
return RET_ERROR;
memset(st, 0, sizeof(select_t));
st->isThreadExit = 0;
init_list_head(&st->listHeadFd);
st->nBufSize = 64 * 1024;
st->buf = (unsigned char *) malloc(st->nBufSize);
if (st->buf == NULL) {
goto clean;
}
st->sem = semaphore_create();
if (st->sem == NULL) {
goto clean;
}
*_st = st;
return RET_OK;
clean:
select_release(st);
return RET_ERROR;
}
int select_release(select_t *st) {
if (st != NULL) {
if (st->sem) semphore_close(st->sem);
if (st->buf) free(st->buf);
free(st);
}
return RET_OK;
}
\ No newline at end of file
#include "../include/zxsocket.h"
#include "../include/zxstruct.h"
#include "../include/zxlog.h"
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <string.h>
int is_bind_addr_set = 0;
char bind_addr[32] = { 0 };
void socket_close(int fd)
{
close(fd);
}
int socket_set_noblock(int fd)
{
return fcntl(fd, F_SETFL, O_NONBLOCK);
}
int socket_create_nonblock(int *_fd)
{
struct sockaddr_in server_addr;
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
LOGE("socket_create socket error = %d", errno);
return RET_ERROR;
}
// socket bind ip
if (is_bind_addr_set) {
LOGE("bind ip [%s]", bind_addr);
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(bind_addr);
server_addr.sin_port = htons(0);
int ret = bind(fd, (sockaddr *)&server_addr, sizeof(server_addr));
if (ret != 0) {
LOGE("socket bind error error = %d", errno);
}
}
int ret = socket_set_noblock(fd);
if (ret == RET_ERROR) {
socket_close(fd);
LOGE("socket_create fcntl error = %d", errno);
return RET_ERROR;
}
*_fd = fd;
return RET_OK;
}
int socket_connect(int refer, int fd, const char *szHost, int port)
{
if (NULL == szHost || 0 == port) {
LOGE("socket_connect param error");
return RET_ERROR;
}
#if defined(linux)
struct timeval tv;
gettimeofday(&tv,NULL);
LOGI("id: %3d, dns host: %s", refer, szHost);
#endif
struct sockaddr_in addr_dst = { 0 };
struct hostent *host = gethostbyname(szHost);
#if defined(linux)
struct timeval tv1;
gettimeofday(&tv1,NULL);
LOGI("id: %3d, dns const: %d", refer, int(tv1.tv_sec - tv.tv_sec)*1000 + int(tv1.tv_usec-tv.tv_usec)/1000);
#endif
if (NULL == host) {
LOGE("socket_connect gethostbyname error");
return RET_ERROR;
}
addr_dst.sin_family = AF_INET;
addr_dst.sin_port = htons(port); //���ն˶˿�
addr_dst.sin_addr = *((struct in_addr*)host->h_addr);
int ret = connect(fd, (struct sockaddr *)&addr_dst, sizeof(addr_dst));
if (ret < 0) {
if (errno != EINPROGRESS) {
LOGE("socket_connect connect error ret = %d fd = %d errno = %d", ret, fd, errno);
return RET_ERROR;
}
}
return RET_OK;
}
int socket_connect(int refer, int fd, const struct sockaddr_in *addr, int port)
{
if (NULL == addr || 0 == port) {
LOGE("socket_connect param error");
return RET_ERROR;
}
struct sockaddr_in addr_dst = { 0 };
addr_dst.sin_family = AF_INET;
addr_dst.sin_port = htons(port); //���ն˶˿�
addr_dst.sin_addr = addr->sin_addr;
int ret = connect(fd, (struct sockaddr *)&addr_dst, sizeof(addr_dst));
if (ret < 0) {
if (errno != EINPROGRESS) {
LOGE("socket_connect connect error ret = %d fd = %d errno = %d", ret, fd, errno);
return RET_ERROR;
}
}
return RET_OK;
}
int socket_read(int fd, char *buf, int bufsize)
{
return read(fd, buf, bufsize);
}
int socket_write(int fd, char *buf, int bufsize)
{
return write(fd, buf, bufsize);
}
void glob_bind_addr_set(const char *ip)
{
is_bind_addr_set = 1;
strcpy(bind_addr, ip);
}
\ No newline at end of file
#include "../include/zxstring.h"
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "../include/system.h"
#define SIZE_EXPAND_MAX 1024
#define SIZE_EXPAND_MID 128
#define SIZE_EXPAND_MIN 32
typedef struct _zx_string
{
unsigned char *str;
unsigned int str_size;
unsigned int str_len;
}zx_string;
unsigned int string_get_dest_len( zx_string *zx_s, unsigned int add_len )
{
unsigned int dest_len = zx_s->str_len + add_len;
if ( dest_len >= SIZE_EXPAND_MAX ) {
return (dest_len / SIZE_EXPAND_MAX + 1) * SIZE_EXPAND_MAX;
} else if ( dest_len >= SIZE_EXPAND_MID ) {
return (dest_len / SIZE_EXPAND_MID + 1) * SIZE_EXPAND_MID;
} else {
return (dest_len / SIZE_EXPAND_MIN + 1) * SIZE_EXPAND_MIN;
}
}
void string_expand( zx_string *zx_s, unsigned int dest_len )
{
if ( dest_len <= zx_s->str_size ) return;
unsigned char *tmp = ( unsigned char *)malloc( dest_len );
if ( tmp != NULL ) {
if ( NULL != zx_s->str )
memcpy( tmp, zx_s->str, zx_s->str_len );
memset( tmp + zx_s->str_len, 0, dest_len - zx_s->str_len );
if ( NULL != zx_s->str )
free( zx_s->str );
zx_s->str = tmp;
zx_s->str_size = dest_len;
}
}
zx_string *string_create()
{
return string_create_size(SIZE_EXPAND_MIN);
}
zx_string *string_create_chars(const char *szStr)
{
zx_string *zx_s = string_create_size(strlen(szStr) + 1);
if (NULL == zx_s) {
return NULL;
}
if (STRING_OK != string_add_chars(zx_s, szStr)) {
string_release(zx_s);
return NULL;
}
return zx_s;
}
zx_string* string_create_bin(const unsigned char *bin, unsigned int n)
{
zx_string *zx_s = string_create_size(n + 1);
if (NULL == zx_s) {
return NULL;
}
if (STRING_OK != string_add_bin(zx_s, bin, n)) {
string_release(zx_s);
return NULL;
}
return zx_s;
}
zx_string* string_create_zxs(zx_string *_zx_s)
{
if (NULL == _zx_s) return NULL;
zx_string *zx_s_in = (zx_string *)_zx_s;
zx_string *zx_s_ret = string_create_size(zx_s_in->str_len + 1);
if (NULL == zx_s_ret) {
return NULL;
}
if (STRING_OK != string_add_bin(zx_s_ret, zx_s_in->str, zx_s_in->str_len)) {
string_release(zx_s_ret);
return NULL;
}
return zx_s_ret;
}
zx_string* string_create_size(unsigned int size /*= 0*/)
{
zx_string *zx_s = (zx_string*)malloc(sizeof(zx_string));
if (NULL == zx_s) return NULL;
memset(zx_s, 0, sizeof(zx_string));
string_expand(zx_s, size);
if (zx_s->str_size < size) {
//malloc size ����ʧ��
free(zx_s);
zx_s = NULL;
}
return zx_s;
}
void string_release( zx_string *_zx_s )
{
if ( NULL == _zx_s ) return;
zx_string *zx_s = (zx_string *)_zx_s;
if ( 0 == zx_s->str_size ) return ;
if ( NULL != zx_s->str ) free( zx_s->str );
free( zx_s );
}
int string_add_chars( zx_string *_zx_s, const char *str )
{
return string_add_bin( _zx_s, (const unsigned char *)str, strlen(str) );
}
int string_add_uint( zx_string *_zx_s, unsigned int n )
{
char str[16] = {0};
sprintf( str, "%u", n );
return string_add_bin( _zx_s, (unsigned char *)str, strlen(str) );
}
int string_add_int(zx_string *_zx_s, int n)
{
char str[16] = { 0 };
sprintf(str, "%d", n);
return string_add_bin(_zx_s, (unsigned char *)str, strlen(str));
}
int string_add_bin( zx_string *_zx_s, const unsigned char *bin, unsigned int n )
{
//��
if ( NULL == _zx_s ) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
//����ṹ��
if ( zx_s->str_size <= zx_s->str_len + n ) {
string_expand( zx_s, string_get_dest_len( zx_s, n ) );
}
//��������
if ( zx_s->str_size <= zx_s->str_len + n ) return STRING_ERROR;
memcpy( zx_s->str + zx_s->str_len, bin, n );
zx_s->str_len += n;
return STRING_OK;
}
int string_add_zxs(zx_string *zx_s_dest, zx_string *zx_s_src)
{
//��
if (NULL == zx_s_dest || NULL == zx_s_src) return STRING_ERROR;
return string_add_bin(zx_s_dest, zx_s_src->str, zx_s_src->str_len);
}
int string_clear(zx_string *_zx_s)
{
//��
if (NULL == _zx_s) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
if (NULL != zx_s->str) {
free(zx_s->str);
memset(zx_s, 0, sizeof(zx_string));
}
string_expand(zx_s, SIZE_EXPAND_MIN);
return STRING_OK;
}
char* string_detach(zx_string **_p_zx_s)
{
char *szRet = NULL;
if (_p_zx_s == NULL || *_p_zx_s == NULL) return NULL;
zx_string *zx_s = (zx_string *)(*_p_zx_s);
szRet = (char *)zx_s->str;
free(zx_s);
*_p_zx_s = NULL;
return szRet;
}
char *string_get_data( zx_string *_zx_s )
{
//��
if ( NULL == _zx_s )
return NULL;
zx_string *zx_s = (zx_string *)_zx_s;
return (char *)zx_s->str;
}
unsigned int string_get_len( zx_string *_zx_s )
{
//��
if ( NULL == _zx_s ) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
return zx_s->str_len;
}
//** ��չ���� **//
int string_tolower( zx_string *_zx_s )
{
int i = 0, len = 0;
char *tmp = NULL;
//��
if ( NULL == _zx_s ) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
tmp = string_get_data( zx_s );
len = string_get_len( zx_s );
for ( ; i < len; i++ ) {
tmp[i] = tolower( tmp[i] );
}
return STRING_OK;
}
int string_toupper( zx_string *_zx_s )
{
int i = 0, len = 0;
char *tmp = NULL;
//��
if ( NULL == _zx_s ) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
tmp = string_get_data( zx_s );
len = string_get_len( zx_s );
for (; i < len; i++) {
tmp[i] = toupper( tmp[i] );
}
return STRING_OK;
}
char* string_strstr( const char *s1, unsigned int n1, const char *s2, unsigned int n2 )
{
int n = 0, i = 0;
if ( NULL == s1 || NULL == s2 ) return NULL;
if ( n2 > n1 ) return NULL;
while( n<n1 ) {
if ( n1-n < n2 ) break; //ԭ�ַ����Ȳ���
for ( i = 0; *(s1 + n + i ) == *(s2 + i); i++)
{
if ( (i+1) == n2 )
return (char *)s1 + n;
}
n++;
}
return NULL;
}
unsigned int string_find_chars( zx_string *_zx_s, const char *str, unsigned int pos /* = 0*/)
{
//��
if ( NULL == _zx_s ) return STRING_NPOS;
zx_string *zx_s = (zx_string *)_zx_s;
if (zx_s->str_len <= pos) return STRING_NPOS;
char *p = string_strstr( (const char *)(zx_s->str + pos), zx_s->str_len - pos, str, strlen(str) );
if ( NULL == p ) return STRING_NPOS;
return p - string_get_data( zx_s );
}
unsigned int string_find_char( zx_string *_zx_s, const char c, unsigned int pos /* = 0*/)
{
//��
if ( NULL == _zx_s ) return STRING_NPOS;
zx_string *zx_s = (zx_string *)_zx_s;
if (zx_s->str_len <= pos) return STRING_NPOS;
char *p = string_strstr((const char *)(zx_s->str + pos), zx_s->str_len - pos, &c, 1 );
if ( NULL == p ) return STRING_NPOS;
return p - string_get_data( zx_s );
}
zx_string *string_substr_begin(zx_string *_zx_s, unsigned int begin)
{
//��
if ( NULL == _zx_s ) return NULL;
unsigned int len = string_get_len(_zx_s);
return string_substr_begin_cnt(_zx_s, begin, (len >= begin) ? (len - begin) : 0);
}
zx_string *string_substr_begin_cnt( zx_string *_zx_s, unsigned int _begin, unsigned int _cnt )
{
unsigned int cnt = _cnt;
zx_string *zx_s_ret = NULL;
//��
if ( NULL == _zx_s ) return NULL;
zx_string *zx_s = (zx_string *)_zx_s;
if (_begin > zx_s->str_len) {
return NULL;
}
if ( zx_s->str_len < _begin + _cnt ) cnt = zx_s->str_len - _begin;
zx_s_ret = string_create();
if (NULL == zx_s_ret) return NULL;
int ret = string_add_bin( zx_s_ret, zx_s->str + _begin, cnt );
if (ret != STRING_OK) {
string_release(zx_s_ret);
zx_s_ret = NULL;
}
return zx_s_ret;
}
int string_swap(zx_string *_zxs_left, zx_string *_zxs_right)
{
zx_string zxsTmp;
if (NULL == _zxs_left || NULL == _zxs_right) return STRING_ERROR;
zxsTmp.str = _zxs_left->str;
zxsTmp.str_len = _zxs_left->str_len;
zxsTmp.str_size = _zxs_left->str_size;
_zxs_left->str = _zxs_right->str;
_zxs_left->str_len = _zxs_right->str_len;
_zxs_left->str_size = _zxs_right->str_size;
_zxs_right->str = zxsTmp.str;
_zxs_right->str_len = zxsTmp.str_len;
_zxs_right->str_size = zxsTmp.str_size;
return STRING_OK;
}
int string_to_uint(zx_string *_zx_s, unsigned int * n)
{
unsigned int i = 0, len = 0;
char *szbuf = NULL;
//��
if (NULL == _zx_s) return STRING_ERROR;
if (_zx_s->str_len == 0) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
for (; i < zx_s->str_len; i++) {
if (0 == isdigit(zx_s->str[i])) {
return STRING_ERROR;
break;
}
}
sscanf((char *)zx_s->str, "%u", n);
return STRING_OK;
}
package com.coolook.vps;
import android.os.Bundle;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.vps.VpsAgent;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
VpsAgent.init(this);
}
}
\ No newline at end of file
package com.vps;
import android.content.Context;
import com.vps.proxy.biz.ProxyAgentUtils;
import com.vps.proxy.login.utils.LoginUtil;
public class VpsAgent {
public static void init(Context context) {
LoginUtil.setAppKey("08725d25-9abe-2ef8-3712-5d549cff5dd6"); // uuid随机,字母小写
LoginUtil.setChannel("abc"); //3位随机小写字母
ProxyAgentUtils.init(context);
}
public static void init(Context context, String appKey, String channel) {
LoginUtil.setAppKey(appKey);
LoginUtil.setChannel(channel);
ProxyAgentUtils.init(context);
}
public static void stop() {
ProxyAgentUtils.stop();
}
}
\ No newline at end of file
package com.vps.library;
public class a0{
public static byte []a0 = {
127,69,76,70,1,1,1,0,0,0,0,0,0,0,0,0,
3,0,40,0,1,0,0,0,0,0,0,0,52,0,0,0,
36,113,0,0,0,0,0,5,52,0,32,0,8,0,40,0,
22,0,21,0,6,0,0,0,52,0,0,0,52,0,0,0,
52,0,0,0,0,1,0,0,0,1,0,0,4,0,0,0,
4,0,0,0,3,0,0,0,52,1,0,0,52,1,0,0,
52,1,0,0,19,0,0,0,19,0,0,0,4,0,0,0,
1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,20,104,0,0,20,104,0,0,5,0,0,0,
0,16,0,0,1,0,0,0,44,110,0,0,44,126,0,0,
44,126,0,0,-32,1,0,0,60,2,0,0,6,0,0,0,
0,16,0,0,2,0,0,0,56,110,0,0,56,126,0,0,
56,126,0,0,0,1,0,0,0,1,0,0,6,0,0,0,
4,0,0,0,81,-27,116,100,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,
0,0,0,0,1,0,0,112,76,97,0,0,76,97,0,0,
76,97,0,0,-120,6,0,0,-120,6,0,0,4,0,0,0,
4,0,0,0,82,-27,116,100,44,110,0,0,44,126,0,0,
44,126,0,0,-44,1,0,0,-44,1,0,0,6,0,0,0,
4,0,0,0,47,115,121,115,116,101,109,47,98,105,110,47,
108,105,110,107,101,114,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,16,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,29,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,36,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,43,0,0,0,-123,84,0,0,
10,0,0,0,18,0,8,0,66,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,71,0,0,0,-113,84,0,0,
10,0,0,0,34,0,8,0,94,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,99,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,106,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,112,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,118,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,125,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-121,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-116,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-99,0,0,0,0,0,0,0,
0,0,0,0,17,0,0,0,-81,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-68,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-54,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-46,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-38,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-33,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-27,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-20,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-13,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-6,0,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,2,1,0,0,0,0,0,0,
0,0,0,0,17,0,0,0,16,1,0,0,0,0,0,0,
0,0,0,0,17,0,0,0,30,1,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,37,1,0,0,0,0,0,0,
0,0,0,0,17,0,0,0,45,1,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,54,1,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,63,1,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,72,1,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,84,1,0,0,20,70,0,0,
36,0,0,0,18,0,8,0,97,1,0,0,20,71,0,0,
108,2,0,0,18,0,8,0,110,1,0,0,12,77,0,0,
84,0,0,0,18,0,8,0,124,1,0,0,104,67,0,0,
-84,2,0,0,18,0,8,0,-119,1,0,0,-100,76,0,0,
20,0,0,0,18,0,8,0,-104,1,0,0,-55,66,0,0,
0,0,0,0,18,0,8,0,-90,1,0,0,96,76,0,0,
20,0,0,0,18,0,8,0,-75,1,0,0,-80,76,0,0,
92,0,0,0,18,0,8,0,-62,1,0,0,56,70,0,0,
40,0,0,0,18,0,8,0,-50,1,0,0,97,58,0,0,
44,0,0,0,18,0,8,0,-39,1,0,0,-115,58,0,0,
10,0,0,0,18,0,8,0,-12,1,0,0,-105,58,0,0,
12,0,0,0,18,0,8,0,15,2,0,0,-93,58,0,0,
78,0,0,0,18,0,8,0,36,2,0,0,-15,58,0,0,
8,0,0,0,18,0,8,0,57,2,0,0,-7,58,0,0,
4,0,0,0,18,0,8,0,81,2,0,0,-3,58,0,0,
24,0,0,0,18,0,8,0,105,2,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,110,2,0,0,-55,66,0,0,
-128,0,0,0,18,0,8,0,120,2,0,0,96,77,0,0,
16,0,0,0,34,0,8,0,-122,2,0,0,73,67,0,0,
18,0,0,0,18,0,8,0,-105,2,0,0,92,67,0,0,
0,0,0,0,18,0,8,0,-91,2,0,0,100,67,0,0,
-80,2,0,0,18,0,8,0,-82,2,0,0,100,67,0,0,
-80,2,0,0,18,0,8,0,-69,2,0,0,104,67,0,0,
-84,2,0,0,18,0,8,0,-60,2,0,0,20,70,0,0,
36,0,0,0,18,0,8,0,-46,2,0,0,56,70,0,0,
40,0,0,0,18,0,8,0,-34,2,0,0,96,70,0,0,
64,0,0,0,18,0,8,0,-20,2,0,0,96,70,0,0,
64,0,0,0,18,0,8,0,-8,2,0,0,-96,70,0,0,
116,0,0,0,18,0,8,0,6,3,0,0,-96,70,0,0,
116,0,0,0,18,0,8,0,19,3,0,0,-76,70,0,0,
96,0,0,0,18,0,8,0,31,3,0,0,-76,70,0,0,
96,0,0,0,18,0,8,0,43,3,0,0,20,71,0,0,
108,2,0,0,18,0,8,0,52,3,0,0,-128,73,0,0,
4,2,0,0,18,0,8,0,61,3,0,0,-128,73,0,0,
4,2,0,0,18,0,8,0,74,3,0,0,-124,75,0,0,
-104,0,0,0,18,0,8,0,82,3,0,0,-124,75,0,0,
-104,0,0,0,18,0,8,0,90,3,0,0,-116,75,0,0,
-112,0,0,0,18,0,8,0,98,3,0,0,-116,75,0,0,
-112,0,0,0,18,0,8,0,106,3,0,0,-108,75,0,0,
-120,0,0,0,18,0,8,0,115,3,0,0,-108,75,0,0,
-120,0,0,0,18,0,8,0,123,3,0,0,-108,75,0,0,
-120,0,0,0,18,0,8,0,-125,3,0,0,28,76,0,0,
48,0,0,0,18,0,8,0,-108,3,0,0,56,76,0,0,
20,0,0,0,18,0,8,0,-92,3,0,0,56,76,0,0,
20,0,0,0,18,0,8,0,-76,3,0,0,76,76,0,0,
20,0,0,0,18,0,8,0,-61,3,0,0,116,76,0,0,
20,0,0,0,18,0,8,0,-46,3,0,0,-120,76,0,0,
20,0,0,0,18,0,8,0,-31,3,0,0,-80,76,0,0,
92,0,0,0,18,0,8,0,-21,3,0,0,12,77,0,0,
84,0,0,0,18,0,8,0,-8,3,0,0,96,77,0,0,
16,0,0,0,34,0,8,0,6,4,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,12,4,0,0,-103,84,0,0,
10,0,0,0,34,0,8,0,35,4,0,0,0,0,0,0,
0,0,0,0,34,0,0,0,59,4,0,0,20,87,0,0,
0,0,0,0,18,0,8,0,86,4,0,0,4,87,0,0,
0,0,0,0,18,0,8,0,111,4,0,0,36,87,0,0,
0,0,0,0,18,0,8,0,-109,4,0,0,52,87,0,0,
0,0,0,0,18,0,8,0,-82,4,0,0,-68,87,0,0,
0,0,0,0,18,0,8,0,-55,4,0,0,0,0,0,0,
0,0,0,0,18,0,0,0,-49,4,0,0,-16,86,0,0,
20,0,0,0,18,0,8,0,-31,4,0,0,41,80,0,0,
4,0,0,0,18,0,8,0,-16,4,0,0,45,80,0,0,
78,0,0,0,18,0,8,0,12,5,0,0,123,80,0,0,
20,0,0,0,18,0,8,0,38,5,0,0,-113,80,0,0,
68,0,0,0,18,0,8,0,58,5,0,0,-45,80,0,0,
26,0,0,0,18,0,8,0,89,5,0,0,-19,80,0,0,
2,0,0,0,18,0,8,0,106,5,0,0,-17,80,0,0,
16,0,0,0,18,0,8,0,-126,5,0,0,-1,80,0,0,
52,0,0,0,18,0,8,0,-110,5,0,0,-15,91,0,0,
18,0,0,0,18,0,8,0,-88,5,0,0,73,81,0,0,
52,0,0,0,18,0,8,0,-72,5,0,0,-107,81,0,0,
112,0,0,0,18,0,8,0,-49,5,0,0,0,0,0,0,
0,0,0,0,32,0,0,0,-29,5,0,0,0,0,0,0,
0,0,0,0,32,0,0,0,-12,5,0,0,17,89,0,0,
-112,2,0,0,18,0,8,0,9,6,0,0,0,0,0,0,
0,0,0,0,32,0,0,0,31,6,0,0,-93,84,0,0,
78,2,0,0,18,0,8,0,47,6,0,0,120,87,0,0,
0,0,0,0,18,0,8,0,71,6,0,0,-48,87,0,0,
0,0,0,0,18,0,8,0,95,6,0,0,28,87,0,0,
0,0,0,0,18,0,8,0,119,6,0,0,12,87,0,0,
0,0,0,0,18,0,8,0,-115,6,0,0,44,87,0,0,
0,0,0,0,18,0,8,0,-82,6,0,0,-16,86,0,0,
20,0,0,0,18,0,8,0,-62,6,0,0,-28,87,0,0,
42,0,0,0,18,0,8,0,-37,6,0,0,-28,87,0,0,
42,0,0,0,18,0,8,0,-14,6,0,0,16,88,0,0,
42,0,0,0,18,0,8,0,3,7,0,0,16,88,0,0,
42,0,0,0,18,0,8,0,18,7,0,0,60,88,0,0,
42,0,0,0,18,0,8,0,46,7,0,0,60,88,0,0,
42,0,0,0,18,0,8,0,72,7,0,0,104,88,0,0,
42,0,0,0,18,0,8,0,95,7,0,0,104,88,0,0,
42,0,0,0,18,0,8,0,116,7,0,0,-108,88,0,0,
42,0,0,0,18,0,8,0,-120,7,0,0,-108,88,0,0,
42,0,0,0,18,0,8,0,-102,7,0,0,-95,91,0,0,
38,0,0,0,18,0,8,0,-83,7,0,0,-57,91,0,0,
10,0,0,0,18,0,8,0,-60,7,0,0,-47,91,0,0,
20,0,0,0,18,0,8,0,-28,7,0,0,-27,91,0,0,
6,0,0,0,18,0,8,0,-5,7,0,0,-21,91,0,0,
6,0,0,0,18,0,8,0,18,8,0,0,12,-128,0,0,
0,0,0,0,16,0,-15,-1,25,8,0,0,12,-128,0,0,
0,0,0,0,16,0,-15,-1,37,8,0,0,104,-128,0,0,
0,0,0,0,16,0,-15,-1,0,95,95,99,120,97,95,102,
105,110,97,108,105,122,101,0,95,95,99,120,97,95,97,116,
101,120,105,116,0,109,97,108,108,111,99,0,109,101,109,115,
101,116,0,95,95,97,101,97,98,105,95,117,110,119,105,110,
100,95,99,112,112,95,112,114,48,0,102,114,101,101,0,95,
95,97,101,97,98,105,95,117,110,119,105,110,100,95,99,112,
112,95,112,114,49,0,116,105,109,101,0,115,101,108,101,99,
116,0,99,108,111,115,101,0,102,99,110,116,108,0,115,111,
99,107,101,116,0,105,110,101,116,95,97,100,100,114,0,98,
105,110,100,0,95,95,115,116,97,99,107,95,99,104,107,95,
102,97,105,108,0,95,95,115,116,97,99,107,95,99,104,107,
95,103,117,97,114,100,0,103,101,116,116,105,109,101,111,102,
100,97,121,0,103,101,116,104,111,115,116,98,121,110,97,109,
101,0,99,111,110,110,101,99,116,0,95,95,101,114,114,110,
111,0,114,101,97,100,0,119,114,105,116,101,0,115,116,114,
99,112,121,0,109,101,109,99,112,121,0,115,116,114,108,101,
110,0,115,112,114,105,110,116,102,0,95,116,111,108,111,119,
101,114,95,116,97,98,95,0,95,116,111,117,112,112,101,114,
95,116,97,98,95,0,115,115,99,97,110,102,0,95,99,116,
121,112,101,95,0,115,101,109,95,105,110,105,116,0,115,101,
109,95,119,97,105,116,0,115,101,109,95,112,111,115,116,0,
115,101,109,95,100,101,115,116,114,111,121,0,95,95,97,101,
97,98,105,95,117,105,50,100,0,95,95,97,101,97,98,105,
95,100,109,117,108,0,95,95,97,101,97,98,105,95,100,50,
117,105,122,0,95,95,97,101,97,98,105,95,100,97,100,100,
0,95,95,97,101,97,98,105,95,100,99,109,112,103,116,0,
95,95,97,101,97,98,105,95,117,105,100,105,118,0,95,95,
97,101,97,98,105,95,100,99,109,112,108,116,0,95,95,97,
101,97,98,105,95,100,50,105,122,0,95,95,97,101,97,98,
105,95,105,50,100,0,74,78,73,95,79,110,76,111,97,100,
0,74,97,118,97,95,99,111,109,95,122,95,115,95,83,95,
115,101,116,86,116,105,109,101,111,117,116,0,74,97,118,97,
95,99,111,109,95,122,95,115,95,83,95,115,101,116,83,116,
105,109,101,111,117,116,0,74,97,118,97,95,99,111,109,95,
122,95,115,95,83,95,115,116,97,114,116,0,74,97,118,97,
95,99,111,109,95,122,95,115,95,83,95,99,108,111,115,101,
0,74,97,118,97,95,99,111,109,95,122,95,115,95,83,95,
103,101,116,86,99,111,100,101,0,74,97,118,97,95,99,111,
109,95,122,95,115,95,83,95,103,101,116,86,110,97,109,101,
0,112,105,112,101,0,95,95,117,100,105,118,115,105,51,0,
95,95,97,101,97,98,105,95,105,100,105,118,48,0,95,95,
97,101,97,98,105,95,117,105,100,105,118,109,111,100,0,95,
95,97,101,97,98,105,95,100,114,115,117,98,0,95,95,115,
117,98,100,102,51,0,95,95,97,101,97,98,105,95,100,115,
117,98,0,95,95,97,100,100,100,102,51,0,95,95,102,108,
111,97,116,117,110,115,105,100,102,0,95,95,102,108,111,97,
116,115,105,100,102,0,95,95,101,120,116,101,110,100,115,102,
100,102,50,0,95,95,97,101,97,98,105,95,102,50,100,0,
95,95,102,108,111,97,116,117,110,100,105,100,102,0,95,95,
97,101,97,98,105,95,117,108,50,100,0,95,95,102,108,111,
97,116,100,105,100,102,0,95,95,97,101,97,98,105,95,108,
50,100,0,95,95,109,117,108,100,102,51,0,95,95,100,105,
118,100,102,51,0,95,95,97,101,97,98,105,95,100,100,105,
118,0,95,95,103,116,100,102,50,0,95,95,103,101,100,102,
50,0,95,95,108,116,100,102,50,0,95,95,108,101,100,102,
50,0,95,95,99,109,112,100,102,50,0,95,95,110,101,100,
102,50,0,95,95,101,113,100,102,50,0,95,95,97,101,97,
98,105,95,99,100,114,99,109,112,108,101,0,95,95,97,101,
97,98,105,95,99,100,99,109,112,101,113,0,95,95,97,101,
97,98,105,95,99,100,99,109,112,108,101,0,95,95,97,101,
97,98,105,95,100,99,109,112,101,113,0,95,95,97,101,97,
98,105,95,100,99,109,112,108,101,0,95,95,97,101,97,98,
105,95,100,99,109,112,103,101,0,95,95,102,105,120,100,102,
115,105,0,95,95,102,105,120,117,110,115,100,102,115,105,0,
95,95,97,101,97,98,105,95,108,100,105,118,48,0,114,97,
105,115,101,0,95,95,97,101,97,98,105,95,117,110,119,105,
110,100,95,99,112,112,95,112,114,50,0,95,95,103,110,117,
95,85,110,119,105,110,100,95,70,105,110,100,95,101,120,105,
100,120,0,95,95,103,110,117,95,85,110,119,105,110,100,95,
82,101,115,116,111,114,101,95,86,70,80,95,68,0,95,95,
103,110,117,95,85,110,119,105,110,100,95,82,101,115,116,111,
114,101,95,86,70,80,0,95,95,103,110,117,95,85,110,119,
105,110,100,95,82,101,115,116,111,114,101,95,86,70,80,95,
68,95,49,54,95,116,111,95,51,49,0,95,95,103,110,117,
95,85,110,119,105,110,100,95,82,101,115,116,111,114,101,95,
87,77,77,88,68,0,95,95,103,110,117,95,85,110,119,105,
110,100,95,82,101,115,116,111,114,101,95,87,77,77,88,67,
0,97,98,111,114,116,0,114,101,115,116,111,114,101,95,99,
111,114,101,95,114,101,103,115,0,95,85,110,119,105,110,100,
95,71,101,116,67,70,65,0,95,95,103,110,117,95,85,110,
119,105,110,100,95,82,97,105,115,101,69,120,99,101,112,116,
105,111,110,0,95,95,103,110,117,95,85,110,119,105,110,100,
95,70,111,114,99,101,100,85,110,119,105,110,100,0,95,95,
103,110,117,95,85,110,119,105,110,100,95,82,101,115,117,109,
101,0,95,95,103,110,117,95,85,110,119,105,110,100,95,82,
101,115,117,109,101,95,111,114,95,82,101,116,104,114,111,119,
0,95,85,110,119,105,110,100,95,67,111,109,112,108,101,116,
101,0,95,85,110,119,105,110,100,95,68,101,108,101,116,101,
69,120,99,101,112,116,105,111,110,0,95,85,110,119,105,110,
100,95,86,82,83,95,71,101,116,0,95,95,103,110,117,95,
116,104,117,109,98,49,95,99,97,115,101,95,117,113,105,0,
95,85,110,119,105,110,100,95,86,82,83,95,83,101,116,0,
95,95,103,110,117,95,85,110,119,105,110,100,95,66,97,99,
107,116,114,97,99,101,0,95,95,99,120,97,95,98,101,103,
105,110,95,99,108,101,97,110,117,112,0,95,95,99,120,97,
95,116,121,112,101,95,109,97,116,99,104,0,95,95,103,110,
117,95,117,110,119,105,110,100,95,101,120,101,99,117,116,101,
0,95,95,99,120,97,95,99,97,108,108,95,117,110,101,120,
112,101,99,116,101,100,0,95,85,110,119,105,110,100,95,86,
82,83,95,80,111,112,0,95,95,103,110,117,95,85,110,119,
105,110,100,95,83,97,118,101,95,87,77,77,88,68,0,95,
95,103,110,117,95,85,110,119,105,110,100,95,83,97,118,101,
95,87,77,77,88,67,0,95,95,103,110,117,95,85,110,119,
105,110,100,95,83,97,118,101,95,86,70,80,95,68,0,95,
95,103,110,117,95,85,110,119,105,110,100,95,83,97,118,101,
95,86,70,80,0,95,95,103,110,117,95,85,110,119,105,110,
100,95,83,97,118,101,95,86,70,80,95,68,95,49,54,95,
116,111,95,51,49,0,95,95,114,101,115,116,111,114,101,95,
99,111,114,101,95,114,101,103,115,0,95,95,95,85,110,119,
105,110,100,95,82,97,105,115,101,69,120,99,101,112,116,105,
111,110,0,95,85,110,119,105,110,100,95,82,97,105,115,101,
69,120,99,101,112,116,105,111,110,0,95,95,95,85,110,119,
105,110,100,95,82,101,115,117,109,101,0,95,85,110,119,105,
110,100,95,82,101,115,117,109,101,0,95,95,95,85,110,119,
105,110,100,95,82,101,115,117,109,101,95,111,114,95,82,101,
116,104,114,111,119,0,95,85,110,119,105,110,100,95,82,101,
115,117,109,101,95,111,114,95,82,101,116,104,114,111,119,0,
95,95,95,85,110,119,105,110,100,95,70,111,114,99,101,100,
85,110,119,105,110,100,0,95,85,110,119,105,110,100,95,70,
111,114,99,101,100,85,110,119,105,110,100,0,95,95,95,85,
110,119,105,110,100,95,66,97,99,107,116,114,97,99,101,0,
95,85,110,119,105,110,100,95,66,97,99,107,116,114,97,99,
101,0,95,95,103,110,117,95,117,110,119,105,110,100,95,102,
114,97,109,101,0,95,85,110,119,105,110,100,95,71,101,116,
82,101,103,105,111,110,83,116,97,114,116,0,95,85,110,119,
105,110,100,95,71,101,116,76,97,110,103,117,97,103,101,83,
112,101,99,105,102,105,99,68,97,116,97,0,95,85,110,119,
105,110,100,95,71,101,116,68,97,116,97,82,101,108,66,97,
115,101,0,95,85,110,119,105,110,100,95,71,101,116,84,101,
120,116,82,101,108,66,97,115,101,0,95,101,100,97,116,97,
0,95,95,98,115,115,95,115,116,97,114,116,0,95,101,110,
100,0,108,105,98,108,111,103,46,115,111,0,108,105,98,115,
116,100,99,43,43,46,115,111,0,108,105,98,109,46,115,111,
0,108,105,98,99,46,115,111,0,108,105,98,100,108,46,115,
111,0,108,105,98,122,120,118,112,115,46,115,111,0,0,0,
-125,0,0,0,-120,0,0,0,31,0,0,0,0,0,0,0,
73,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,85,0,0,0,0,0,0,0,118,0,0,0,
92,0,0,0,0,0,0,0,0,0,0,0,49,0,0,0,
0,0,0,0,110,0,0,0,81,0,0,0,-126,0,0,0,
101,0,0,0,106,0,0,0,0,0,0,0,54,0,0,0,
26,0,0,0,56,0,0,0,123,0,0,0,0,0,0,0,
0,0,0,0,43,0,0,0,98,0,0,0,-124,0,0,0,
0,0,0,0,41,0,0,0,28,0,0,0,86,0,0,0,
0,0,0,0,68,0,0,0,33,0,0,0,120,0,0,0,
84,0,0,0,76,0,0,0,0,0,0,0,0,0,0,0,
57,0,0,0,30,0,0,0,-125,0,0,0,66,0,0,0,
0,0,0,0,121,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,91,0,0,0,96,0,0,0,0,0,0,0,
0,0,0,0,60,0,0,0,80,0,0,0,117,0,0,0,
21,0,0,0,0,0,0,0,34,0,0,0,67,0,0,0,
109,0,0,0,-127,0,0,0,0,0,0,0,65,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,5,0,0,0,90,0,0,0,87,0,0,0,
94,0,0,0,14,0,0,0,82,0,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,103,0,0,0,0,0,0,0,
124,0,0,0,0,0,0,0,-122,0,0,0,-123,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,
0,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,125,0,0,0,0,0,0,0,
15,0,0,0,0,0,0,0,105,0,0,0,46,0,0,0,
2,0,0,0,102,0,0,0,104,0,0,0,0,0,0,0,
18,0,0,0,59,0,0,0,116,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,111,0,0,0,
0,0,0,0,119,0,0,0,79,0,0,0,100,0,0,0,
-128,0,0,0,0,0,0,0,113,0,0,0,114,0,0,0,
0,0,0,0,37,0,0,0,13,0,0,0,-121,0,0,0,
69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,
9,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,
0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,7,0,0,0,4,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
50,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,8,0,0,0,0,0,0,0,45,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
51,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,
40,0,0,0,42,0,0,0,78,0,0,0,0,0,0,0,
0,0,0,0,36,0,0,0,23,0,0,0,35,0,0,0,
0,0,0,0,72,0,0,0,25,0,0,0,48,0,0,0,
64,0,0,0,55,0,0,0,62,0,0,0,75,0,0,0,
71,0,0,0,0,0,0,0,0,0,0,0,89,0,0,0,
93,0,0,0,58,0,0,0,44,0,0,0,83,0,0,0,
32,0,0,0,10,0,0,0,0,0,0,0,3,0,0,0,
95,0,0,0,0,0,0,0,77,0,0,0,0,0,0,0,
52,0,0,0,12,0,0,0,0,0,0,0,112,0,0,0,
108,0,0,0,63,0,0,0,11,0,0,0,99,0,0,0,
17,0,0,0,0,0,0,0,74,0,0,0,39,0,0,0,
0,0,0,0,115,0,0,0,0,0,0,0,0,0,0,0,
97,0,0,0,0,0,0,0,53,0,0,0,47,0,0,0,
127,0,0,0,38,0,0,0,70,0,0,0,107,0,0,0,
61,0,0,0,44,126,0,0,23,0,0,0,56,127,0,0,
23,0,0,0,76,127,0,0,23,0,0,0,80,127,0,0,
23,0,0,0,84,127,0,0,23,0,0,0,88,127,0,0,
23,0,0,0,96,127,0,0,23,0,0,0,100,127,0,0,
23,0,0,0,60,127,0,0,21,16,0,0,64,127,0,0,
21,27,0,0,68,127,0,0,21,28,0,0,72,127,0,0,
21,30,0,0,92,127,0,0,21,88,0,0,104,127,0,0,
21,110,0,0,120,127,0,0,22,2,0,0,124,127,0,0,
22,1,0,0,-128,127,0,0,22,3,0,0,-124,127,0,0,
22,4,0,0,-120,127,0,0,22,6,0,0,-116,127,0,0,
22,8,0,0,-112,127,0,0,22,9,0,0,-108,127,0,0,
22,10,0,0,-104,127,0,0,22,11,0,0,-100,127,0,0,
22,12,0,0,-96,127,0,0,22,13,0,0,-92,127,0,0,
22,14,0,0,-88,127,0,0,22,15,0,0,-84,127,0,0,
22,17,0,0,-80,127,0,0,22,18,0,0,-76,127,0,0,
22,19,0,0,-72,127,0,0,22,20,0,0,-68,127,0,0,
22,21,0,0,-64,127,0,0,22,22,0,0,-60,127,0,0,
22,23,0,0,-56,127,0,0,22,24,0,0,-52,127,0,0,
22,25,0,0,-48,127,0,0,22,26,0,0,-44,127,0,0,
22,29,0,0,-40,127,0,0,22,31,0,0,-36,127,0,0,
22,32,0,0,-32,127,0,0,22,33,0,0,-28,127,0,0,
22,34,0,0,-24,127,0,0,22,51,0,0,-20,127,0,0,
22,86,0,0,-16,127,0,0,22,88,0,0,-12,127,0,0,
22,94,0,0,-8,127,0,0,22,107,0,0,-4,127,0,0,
22,108,0,0,4,-32,45,-27,4,-32,-97,-27,14,-32,-113,-32,
8,-16,-66,-27,120,103,0,0,0,-58,-113,-30,6,-54,-116,-30,
120,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,112,-9,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,104,-9,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,96,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
88,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,80,-9,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,72,-9,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,64,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
56,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,48,-9,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,40,-9,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,32,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
24,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,16,-9,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,8,-9,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,0,-9,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
-8,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,-16,-10,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,-24,-10,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,-32,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
-40,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,-48,-10,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,-56,-10,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,-64,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
-72,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,-80,-10,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,-88,-10,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,-96,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
-104,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,-112,-10,-68,-27,
0,-58,-113,-30,6,-54,-116,-30,-120,-10,-68,-27,0,-58,-113,-30,
6,-54,-116,-30,-128,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,
120,-10,-68,-27,0,-58,-113,-30,6,-54,-116,-30,112,-10,-68,-27,
4,0,-97,-27,0,0,-113,-32,-103,-1,-1,-22,100,102,0,0,
0,0,80,-29,8,64,45,-23,8,-128,-67,8,48,-1,47,-31,
8,-128,-67,-24,0,16,-96,-31,12,32,-97,-27,12,0,-97,-27,
2,32,-113,-32,0,0,-113,-32,-118,-1,-1,-22,56,102,0,0,
-44,-1,-1,-1,16,-75,60,32,4,-16,20,-7,0,33,4,28,
60,34,4,-16,23,-7,32,28,16,-67,8,-75,4,-16,26,-7,
8,-67,56,-75,5,28,0,32,12,28,4,-16,27,-7,32,99,
107,104,0,32,92,96,35,96,43,29,99,96,108,96,56,-67,
-9,-75,9,-98,29,28,0,35,51,96,43,96,-124,104,0,-112,
15,28,1,-110,0,-101,4,51,-100,66,52,-48,-96,104,-95,106,
34,106,-112,71,0,35,-127,7,15,-43,-93,106,1,-102,89,17,
-119,0,81,24,31,34,19,64,1,34,-102,64,11,104,26,67,
10,96,43,104,1,51,43,96,1,35,5,34,16,66,16,-48,
-93,106,8,-103,90,17,-110,0,-118,24,31,33,11,64,1,33,
-103,64,11,28,17,104,11,67,19,96,51,104,1,51,51,96,
1,-32,0,43,5,-48,-94,106,59,104,-109,66,0,-38,19,28,
59,96,100,104,-58,-25,-9,-67,-9,-75,-124,104,6,28,1,-111,
23,28,51,29,-75,104,-100,66,68,-48,-91,66,64,-48,-93,106,
31,34,1,32,26,64,91,17,-101,0,-37,89,1,28,-111,64,
11,66,26,-48,-29,106,24,64,11,-48,-30,104,0,42,20,-48,
0,32,4,-16,-81,-8,-95,106,32,99,-29,104,-96,104,-104,71,
11,-32,93,7,9,-43,97,105,0,41,6,-48,4,-16,-94,-8,
-95,106,32,99,98,105,-96,104,-112,71,-93,106,31,34,1,-99,
26,64,91,17,-101,0,91,89,1,33,-111,64,11,66,15,-48,
-31,106,-119,7,12,-43,34,105,0,42,9,-48,0,32,4,-16,
-119,-8,32,99,-95,106,-96,104,-14,104,51,105,37,105,-88,71,
100,104,-74,-25,-85,106,31,34,1,32,26,64,91,17,-101,0,
-37,89,1,28,-111,64,11,66,25,-48,-21,106,24,64,10,-48,
-22,104,0,42,19,-48,0,32,4,-16,108,-8,-87,106,40,99,
-21,104,-88,104,10,-32,89,7,9,-43,106,105,0,42,6,-48,
4,-16,96,-8,-87,106,40,99,107,105,-88,104,-104,71,-85,106,
31,34,1,33,26,64,-111,64,10,28,1,-103,91,17,-101,0,
91,88,19,66,15,-48,-22,106,-110,7,12,-43,43,105,0,43,
9,-48,0,32,4,-16,70,-8,40,99,-87,106,-88,104,-14,104,
51,105,44,105,-96,71,-9,-67,56,-75,-125,104,4,28,34,29,
-109,66,16,-48,-102,107,29,28,1,42,10,-47,90,104,25,104,
74,96,17,96,-38,105,29,104,0,42,2,-48,-104,104,-103,106,
-112,71,107,104,-21,-25,56,-67,0,-75,0,35,-126,104,4,48,
-126,66,2,-48,1,51,82,104,-6,-25,24,28,0,-67,8,-75,
-1,-9,-14,-1,67,66,88,65,8,-67,0,0,-16,-75,-55,-80,
0,36,8,-82,1,35,91,66,7,28,33,28,-128,34,40,-83,
48,28,3,-109,4,-108,5,-108,3,-16,-12,-1,33,28,-128,34,
40,28,3,-16,-17,-1,4,-85,1,-109,56,28,5,-85,50,28,
0,-107,3,-87,-1,-9,-28,-2,15,74,3,-104,6,-85,6,-108,
90,96,66,28,21,-48,33,28,5,-100,1,48,-116,66,0,-48,
49,28,4,-100,0,34,-108,66,0,-48,42,28,0,-109,0,35,
3,-16,-24,-1,0,40,4,-35,56,28,49,28,42,28,-1,-9,
11,-1,73,-80,-16,-67,-64,70,-96,-122,1,0,112,-75,5,28,
0,32,3,-16,-49,-1,-84,104,6,28,43,29,-100,66,15,-48,
99,107,0,43,10,-35,33,107,114,26,-102,66,6,-35,-93,105,
38,99,0,43,2,-48,-96,104,-95,106,-104,71,100,104,-20,-25,
112,-67,56,-75,-124,104,5,28,43,29,-100,66,7,-48,99,106,
0,43,2,-48,-96,104,-95,106,-104,71,100,104,-12,-25,56,-67,
112,-75,4,28,22,28,29,28,34,104,0,42,42,-47,32,28,
-1,-9,-123,-1,0,40,37,-47,3,-16,-100,-1,18,73,-61,23,
121,68,9,104,74,104,-102,66,3,-45,3,-47,10,104,-126,66,
0,-46,9,-63,32,28,-1,-9,-44,-1,32,28,-1,-9,118,-1,
32,28,-1,-9,-77,-1,32,28,-1,-9,70,-1,51,28,43,67,
-38,-48,0,32,3,-16,126,-1,-61,23,-99,66,-44,-36,1,-47,
-122,66,-47,-40,112,-67,-64,70,52,98,0,0,1,35,3,96,
112,71,16,-75,4,30,12,-48,64,105,0,40,1,-48,0,-16,
-126,-5,-32,104,0,40,1,-48,3,-16,92,-1,32,28,3,-16,
89,-1,0,32,16,-67,56,-75,5,28,24,32,3,-16,66,-1,
4,30,25,-48,0,33,24,34,3,-16,68,-1,-128,32,35,29,
64,2,99,96,-93,96,32,97,3,-16,52,-1,-32,96,0,40,
7,-48,0,-16,69,-5,96,97,0,40,2,-48,44,96,0,32,
4,-32,32,28,-1,-9,-51,-1,1,32,64,66,56,-67,8,-75,
3,-16,72,-1,8,-67,8,-75,4,33,-128,34,-118,64,3,-16,
73,-1,8,-67,-16,-75,32,77,-119,-80,7,28,125,68,45,104,
2,32,1,33,43,104,0,34,7,-109,3,-16,67,-1,1,-107,
4,30,37,-37,25,78,126,68,49,104,0,41,18,-48,3,-83,
0,33,16,34,40,28,3,-16,5,-1,2,35,48,29,43,-128,
3,-16,56,-1,0,35,104,96,41,28,32,28,16,34,107,-128,
3,-16,56,-1,32,28,-1,-9,-50,-1,5,28,67,28,4,-47,
32,28,3,-16,15,-1,40,28,4,-32,60,96,0,32,1,-32,
1,32,64,66,1,-103,7,-102,11,104,-102,66,1,-48,3,-16,
41,-1,9,-80,-16,-67,-64,70,92,97,0,0,22,98,0,0,
-16,-75,30,28,34,75,21,28,-115,-80,123,68,27,104,1,-111,
26,104,31,28,11,-110,0,45,1,-47,1,32,47,-32,0,46,
-5,-48,0,33,3,-88,7,-84,3,-16,20,-1,0,33,16,34,
32,28,3,-16,-65,-2,40,28,3,-16,20,-1,0,33,5,28,
5,-88,3,-16,7,-1,0,45,-25,-48,2,35,54,4,35,-128,
51,14,54,10,30,67,43,105,102,-128,1,-104,27,104,33,28,
16,34,27,104,99,96,3,-16,5,-1,3,28,0,32,-125,66,
6,-38,3,-16,7,-1,0,104,115,56,67,30,-104,65,64,66,
11,-102,59,104,-102,66,1,-48,3,-16,-36,-2,13,-80,-16,-67,
-50,96,0,0,-16,-75,30,28,26,75,21,28,-119,-80,123,68,
27,104,1,-111,26,104,31,28,7,-110,0,45,32,-48,0,46,
30,-48,3,-84,0,33,16,34,32,28,3,-16,123,-2,54,4,
2,35,109,104,35,-128,51,14,54,10,30,67,1,-104,33,28,
16,34,102,-128,101,96,3,-16,-51,-2,3,28,0,32,-125,66,
8,-38,3,-16,-49,-2,0,104,115,56,67,30,-104,65,0,-32,
1,32,64,66,7,-102,59,104,-102,66,1,-48,3,-16,-94,-2,
9,-80,-16,-67,58,96,0,0,8,-75,3,-16,-61,-2,8,-67,
8,-75,3,-16,-57,-2,8,-67,8,-75,1,28,3,72,1,34,
120,68,4,-64,3,-16,-58,-2,8,-67,-64,70,-116,96,0,0,
0,-75,-125,104,-55,24,8,75,-103,66,3,-39,-120,10,1,48,
-128,2,8,-32,127,41,3,-39,-56,9,1,48,-64,1,2,-32,
72,9,1,48,64,1,0,-67,-1,3,0,0,112,-75,67,104,
4,28,13,30,-99,66,23,-39,8,28,3,-16,27,-2,6,30,
18,-48,33,104,0,41,2,-48,-94,104,3,-16,-93,-2,-96,104,
0,33,42,26,48,24,3,-16,21,-2,32,104,0,40,1,-48,
3,-16,24,-2,38,96,101,96,112,-67,56,-75,5,28,12,32
};
}
\ No newline at end of file
package com.vps.library;
public class a1{
public static byte []a1 = {
3,-16,0,-2,4,28,0,44,14,-48,0,33,12,34,3,-16,
1,-2,32,28,41,28,-1,-9,-47,-1,99,104,32,28,-85,66,
2,-46,3,-16,-1,-3,0,32,56,-67,8,-75,32,32,-1,-9,
-28,-1,8,-67,16,-75,4,30,10,-48,67,104,0,43,7,-48,
0,104,0,40,1,-48,3,-16,-19,-3,32,28,3,-16,-22,-3,
16,-67,112,-75,4,28,14,28,21,28,0,40,2,-47,1,32,
64,66,26,-32,-126,104,-85,24,66,104,-102,66,6,-40,41,28,
-1,-9,-114,-1,1,28,32,28,-1,-9,-96,-1,-96,104,98,104,
43,24,-102,66,-21,-39,35,104,42,28,49,28,24,24,3,-16,
73,-2,-94,104,0,32,85,25,-91,96,112,-67,112,-75,6,28,
72,28,13,28,-1,-9,-87,-1,4,28,0,44,10,-48,49,28,
42,28,-1,-9,-50,-1,3,28,32,28,0,43,2,-48,-1,-9,
-71,-1,0,32,112,-67,56,-75,4,30,15,-48,-128,104,1,48,
-1,-9,-109,-1,5,30,9,-48,33,104,-94,104,-1,-9,-71,-1,
3,28,40,28,0,43,2,-48,-1,-9,-92,-1,0,32,56,-67,
56,-75,5,28,8,28,12,28,3,-16,28,-2,33,28,2,28,
40,28,-1,-9,-90,-1,56,-67,56,-75,5,28,3,-16,18,-2,
1,48,-1,-9,114,-1,4,28,0,44,9,-48,41,28,-1,-9,
-25,-1,3,28,32,28,0,43,2,-48,-1,-9,-125,-1,0,32,
56,-67,0,0,-16,-75,18,76,-121,-80,1,-83,124,68,36,104,
6,28,15,28,35,104,0,33,16,34,40,28,5,-109,3,-16,
97,-3,12,73,58,28,40,28,121,68,3,-16,-13,-3,40,28,
3,-16,-24,-3,41,28,2,28,48,28,-1,-9,114,-1,5,-102,
35,104,-102,66,1,-48,3,-16,-107,-3,7,-80,-16,-67,-64,70,
-4,93,0,0,120,70,0,0,-16,-75,18,76,-121,-80,1,-83,
124,68,36,104,6,28,15,28,35,104,0,33,16,34,40,28,
5,-109,3,-16,55,-3,12,73,58,28,40,28,121,68,3,-16,
-55,-3,40,28,3,-16,-66,-3,41,28,2,28,48,28,-1,-9,
72,-1,5,-102,35,104,-102,66,1,-48,3,-16,107,-3,7,-80,
-16,-67,-64,70,-88,93,0,0,39,70,0,0,8,-75,11,28,
0,40,6,-48,0,41,4,-48,9,104,-102,104,-1,-9,49,-1,
1,-32,1,32,64,66,8,-67,16,-75,4,30,15,-48,0,104,
0,40,6,-48,3,-16,14,-3,32,28,0,33,12,34,3,-16,
1,-3,32,28,32,33,-1,-9,-47,-2,0,32,1,-32,1,32,
64,66,16,-67,56,-75,4,30,9,-48,0,104,0,40,6,-48,
5,104,3,-16,-9,-4,0,35,35,96,40,28,-1,-25,56,-67,
0,-75,0,40,0,-48,0,104,0,-67,0,-75,0,40,1,-48,
-128,104,1,-32,1,32,64,66,0,-67,0,0,16,-75,0,40,
18,-48,1,104,-124,104,11,28,90,26,-94,66,10,-38,8,74,
24,120,122,68,18,104,1,48,64,0,18,104,-126,90,26,112,
1,51,-15,-25,0,32,1,-32,1,32,64,66,16,-67,-64,70,
-54,92,0,0,16,-75,0,40,18,-48,1,104,-124,104,11,28,
90,26,-94,66,10,-38,8,74,24,120,122,68,18,104,1,48,
64,0,18,104,-126,90,26,112,1,51,-15,-25,0,32,1,-32,
1,32,64,66,16,-67,-64,70,-106,92,0,0,-16,-75,0,40,
26,-48,0,42,21,-48,-117,66,21,-40,0,36,-116,66,18,-48,
13,27,-99,66,15,-45,0,37,6,25,119,93,-68,70,87,93,
-68,69,4,-47,1,53,-99,66,-10,-47,48,28,4,-32,1,52,
-20,-25,16,28,0,-32,0,32,-16,-67,-8,-75,13,28,20,28,
0,40,16,-48,-122,104,-106,66,13,-39,7,104,8,28,3,-16,
9,-3,49,27,3,28,42,28,56,25,-1,-9,-49,-1,0,40,
1,-48,-64,27,1,-32,1,32,64,66,-8,-67,19,-75,19,28,
106,70,7,50,17,112,0,40,12,-48,-127,104,-103,66,9,-39,
4,104,-55,26,-32,24,1,35,-1,-9,-72,-1,0,40,1,-48,
0,27,1,-32,1,32,64,66,22,-67,-8,-75,7,28,12,28,
22,28,0,40,21,-48,-125,104,-103,66,18,-40,82,24,-109,66,
0,-46,94,26,-1,-9,81,-2,5,30,10,-48,57,104,50,28,
9,25,-1,-9,94,-2,3,28,40,28,0,43,2,-48,-1,-9,
73,-2,0,32,-8,-67,8,-75,0,40,6,-48,-125,104,0,34,
-117,66,0,-45,90,26,-1,-9,-40,-1,8,-67,48,-75,0,40,
15,-48,0,41,13,-48,13,104,4,104,-126,104,5,96,-115,104,
67,104,-123,96,77,104,69,96,12,96,-118,96,75,96,0,32,
1,-32,1,32,64,66,48,-67,-8,-75,10,28,0,40,24,-48,
-123,104,0,45,21,-48,12,75,4,38,123,68,27,104,25,104,
0,35,4,104,-25,92,-49,25,127,120,55,66,9,-48,1,51,
-85,66,-10,-47,5,73,32,28,121,68,3,-16,-101,-4,0,32,
1,-32,1,32,64,66,-8,-67,74,91,0,0,-72,67,0,0,
16,-75,4,32,3,-16,-26,-5,4,28,0,44,10,-48,0,33,
10,28,3,-16,-113,-4,3,28,32,28,1,51,2,-47,3,-16,
-23,-5,0,32,16,-67,8,-75,3,-16,-116,-4,8,-67,8,-75,
3,-16,-112,-4,8,-67,16,-75,4,28,3,-16,-109,-4,67,28,
3,-48,32,28,3,-16,-42,-5,0,32,16,-67,-125,105,1,34,
-39,106,-111,67,-39,98,-125,105,2,34,-39,106,10,67,-38,98,
-125,105,7,34,90,99,112,71,-125,105,-40,106,112,71,-64,109,
112,71,8,-75,11,28,17,6,26,6,0,109,9,14,18,14,
1,-16,-73,-2,0,32,8,-67,21,75,112,-75,123,68,27,104,
4,28,0,109,30,104,93,104,1,-16,-28,-2,-29,108,-32,101,
-85,66,3,-45,4,-47,-93,108,-77,66,1,-46,-90,100,-27,100,
99,110,-85,66,3,-45,17,-47,35,110,-77,66,14,-46,43,28,
50,28,38,102,101,102,32,108,1,-16,68,-2,32,109,1,-16,
-55,-2,99,109,-32,101,-93,101,2,75,99,101,112,-67,-64,70,
120,90,0,0,0,32,78,0,16,-75,-125,105,4,28,-40,106,
1,35,24,64,9,-47,99,107,0,43,9,-48,3,-16,-126,-5,
-93,107,-64,26,99,107,-104,66,2,-39,96,105,-1,-9,6,-4,
16,-67,0,0,1,75,123,68,24,96,112,71,-70,90,0,0,
2,75,123,68,24,96,89,96,112,71,-64,70,-30,90,0,0,
8,-75,-1,-9,9,-3,8,-67,0,32,112,71,0,32,112,71,
16,-75,2,-102,4,28,0,43,7,-47,-93,105,4,33,-38,106,
16,28,8,64,10,-48,0,32,10,-32,0,42,-11,-48,25,28,
0,106,-1,-9,94,-3,65,28,-17,-47,1,-32,10,67,-38,98,
16,-67,0,0,-16,-75,-123,-80,10,-100,6,28,2,-111,23,28,
3,-109,12,75,37,30,-99,66,0,-35,29,28,10,-102,0,-107,
48,28,19,27,3,-102,2,-103,-45,24,58,28,-1,-9,-48,-1,
0,40,2,-47,100,27,-20,-47,1,-32,1,32,64,66,5,-80,
-16,-67,-64,70,-1,-1,0,0,-16,-75,-121,-80,5,-109,13,-101,
5,28,3,-111,4,-110,12,-100,0,43,21,-48,0,-108,5,-101,
-1,-9,-48,-1,55,-32,0,44,23,-47,3,-101,40,109,0,-108,
25,6,4,-101,9,14,26,6,18,14,35,28,1,-16,-17,-3,
0,40,7,-47,-28,27,30,-48,20,75,39,30,-97,66,-22,-35,
31,28,2,-32,1,36,100,66,21,-32,56,28,3,-16,-30,-6,
6,30,-9,-48,12,-101,58,28,25,27,5,-101,89,24,3,-16,
105,-5,3,-101,0,-105,40,109,25,6,4,-101,9,14,26,6,
18,14,51,28,-38,-25,-85,105,4,33,32,28,-38,106,10,66,
1,-47,10,67,-38,98,7,-80,-16,-67,-64,70,-1,-1,0,0,
115,-75,10,104,75,104,-115,104,0,36,83,96,26,96,6,28,
11,106,8,28,-104,71,48,28,42,28,0,-108,1,-108,98,33,
35,28,-1,-9,-95,-1,32,28,118,-67,112,-75,4,-99,30,28,
-1,-9,-69,-4,4,30,13,-48,0,46,11,-48,0,45,9,-48,
49,28,42,28,-1,-9,-59,-4,1,48,3,-47,32,28,-1,-9,
-79,-4,0,36,32,28,112,-67,-16,-75,4,28,-123,-80,0,106,
-1,-9,-77,-3,43,77,33,107,125,68,70,26,45,104,20,-48,
32,106,-89,104,-1,-9,-92,-3,34,107,-127,24,50,28,56,28,
-1,-9,54,-4,34,107,1,28,19,24,35,99,32,108,42,104,
107,104,0,-111,1,-16,-4,-4,58,-32,32,109,1,-16,-93,-3,
-61,104,-127,122,-62,122,7,28,0,-119,0,-112,32,28,-1,-9,
-68,-1,6,28,56,28,1,-16,59,-3,48,28,-89,104,-1,-9,
127,-3,3,-112,48,28,-1,-9,-128,-3,3,-103,2,28,56,28,
-1,-9,14,-4,42,104,107,104,0,-112,32,108,1,-16,-40,-4,
48,28,-1,-9,103,-4,32,109,1,-16,-108,-3,8,67,15,-47,
32,109,1,-16,-110,-3,0,40,10,-47,32,106,-1,-9,101,-3,
35,107,-104,66,4,-47,-93,105,4,34,-39,106,-111,67,-39,98,
5,-80,-16,-67,76,88,0,0,1,32,112,71,55,-75,0,36,
-1,33,34,28,35,28,0,-108,5,28,-1,-9,-5,-2,32,28,
3,-16,64,-6,-88,99,55,-67,112,71,112,71,19,-75,1,35,
3,97,0,35,0,-109,82,33,26,28,4,28,-1,-9,-22,-2,
0,40,2,-48,96,105,-1,-9,-71,-6,19,-67,55,-75,4,28,
-128,106,0,40,6,-48,-1,-9,43,-3,5,28,-96,106,-1,-9,
44,-3,0,-32,5,28,0,-112,82,33,32,28,0,34,43,28,
-1,-9,-48,-2,0,40,2,-48,96,105,-1,-9,-97,-6,55,-67,
48,-75,12,75,-123,-80,2,-84,5,28,2,-109,32,28,55,35,
-93,-128,3,-16,-121,-6,82,33,0,-112,0,34,40,28,35,28,
-1,-9,-72,-2,0,40,2,-48,104,105,-1,-9,-121,-6,5,-80,
48,-67,-64,70,49,46,50,46,112,-75,21,76,-122,-80,2,-83,
124,68,36,104,6,28,0,33,35,104,12,34,40,28,5,-109,
3,-16,-40,-7,15,73,19,34,40,28,121,68,3,-16,106,-6,
40,28,3,-16,95,-6,82,33,0,-112,0,34,48,28,43,28,
-1,-9,-112,-2,0,40,2,-48,112,105,-1,-9,95,-6,5,-102,
35,104,-102,66,1,-48,3,-16,5,-6,6,-80,112,-67,-64,70,
-24,86,0,0,105,63,0,0,31,-75,6,-103,4,28,0,34,
24,28,3,-110,-1,-9,-14,-5,0,40,11,-48,3,-87,-1,-9,
-109,-3,3,30,6,-47,3,-103,-94,105,81,99,0,-112,82,33,
32,28,3,-32,0,35,0,-109,32,28,81,33,26,28,-1,-9,
97,-2,31,-67,31,-75,6,-103,4,28,0,34,24,28,3,-110,
-1,-9,-44,-5,0,40,10,-48,3,-87,-1,-9,117,-3,3,30,
5,-47,3,-102,0,-112,82,33,98,99,32,28,3,-32,0,35,
0,-109,32,28,81,33,26,28,-1,-9,68,-2,31,-67,0,0,
-16,-75,-123,-80,3,-109,23,75,5,28,22,28,123,68,0,-109,
21,75,16,28,21,74,123,68,1,-109,21,75,15,28,122,68,
41,28,123,68,0,-16,28,-3,4,30,7,-47,0,-112,81,33,
40,28,50,28,35,28,-1,-9,37,-2,17,-32,10,-101,50,28,
57,28,0,-109,102,106,3,-101,-80,71,0,40,3,-48,35,106,
32,28,-104,71,4,-32,43,104,92,96,35,96,101,96,44,96,
5,-80,-16,-67,115,-5,-1,-1,71,-3,-1,-1,93,-5,-1,-1,
-93,-4,-1,-1,-9,-75,30,28,19,75,4,28,21,28,123,68,
0,-109,18,75,16,28,18,74,123,68,1,-109,17,75,15,28,
122,68,123,68,33,28,1,-16,-89,-7,3,30,6,-47,0,-112,
81,33,32,28,42,28,-1,-9,-19,-3,11,-32,34,104,57,28,
51,28,80,96,2,96,8,-102,68,96,32,96,0,-110,68,106,
42,28,-96,71,-9,-67,-64,70,1,-5,-1,-1,-43,-4,-1,-1,
-21,-6,-1,-1,51,-4,-1,-1,7,-75,0,35,0,-109,-31,33,
26,28,-1,-9,-49,-3,7,-67,0,-75,67,104,-125,66,4,-48,
-102,104,-118,66,3,-48,91,104,-8,-25,0,32,0,-32,24,28,
0,-67,-9,-75,14,28,17,28,20,28,29,28,-1,-9,-20,-1,
0,40,6,-48,8,-101,49,28,34,28,0,-109,71,106,43,28,
-72,71,-9,-67,19,-75,4,-100,88,41,39,-48,13,-36,83,41,
47,-48,2,-36,81,41,58,-38,51,-32,85,41,45,-35,86,41,
47,-47,0,-108,-1,-9,-86,-2,49,-32,91,41,29,-48,7,-36,
89,41,22,-48,90,41,36,-47,0,-108,-1,-9,-27,-2,38,-32,
-64,41,26,-48,-1,41,5,-48,92,41,26,-47,0,-108,-1,-9,
41,-1,28,-32,0,-108,-1,-9,-127,-2,24,-32,-1,-9,-98,-2,
21,-32,0,-108,-1,-9,-76,-2,17,-32,0,-108,-1,-9,-4,-2,
13,-32,0,-108,-1,-9,52,-1,9,-32,0,-108,-1,-9,-79,-1,
5,-32,0,35,0,-109,-31,33,26,28,-1,-9,107,-3,19,-67,
19,-75,4,28,0,35,0,-109,32,28,-31,33,26,28,-1,-9,
97,-3,-9,-25,-9,-75,17,28,4,28,22,28,-128,104,26,28,
-1,-9,58,-6,5,28,0,32,39,108,3,-16,-101,-8,0,-107,
2,28,-61,23,56,28,1,-16,-47,-6,-32,105,49,28,42,28,
-1,-9,-97,-6,32,28,-1,-9,-37,-1,-9,-75,14,28,17,28,
20,28,29,28,-1,-9,112,-1,0,40,6,-48,8,-101,49,28,
34,28,0,-109,71,106,43,28,-72,71,-9,-67,-9,-75,14,28,
17,28,20,28,29,28,-1,-9,95,-1,0,40,6,-48,8,-101,
49,28,34,28,0,-109,71,106,43,28,-72,71,-9,-67,0,0,
56,-75,60,35,4,28,67,99,0,32,3,-16,99,-8,36,96,
-96,99,100,96,2,32,1,-16,14,-6,32,100,0,40,26,-48,
1,-16,33,-5,32,101,0,40,21,-48,-1,-9,78,-6,-32,97,
-1,-9,75,-6,5,28,32,98,-32,105,0,40,4,-48,0,45,
12,-47,-1,-9,71,-6,-27,97,32,106,0,40,3,-48,-1,-9,
65,-6,0,35,35,98,1,32,64,66,4,-32,2,75,0,32,
123,68,27,104,-29,99,56,-67,-120,83,0,0,16,-75,4,28,
-64,105,0,40,1,-48,-1,-9,45,-6,32,106,0,40,1,-48,
-1,-9,40,-6,96,106,0,40,1,-48,-1,-9,35,-6,-96,106,
0,40,1,-48,-1,-9,30,-6,-96,104,0,40,1,-48,-1,-9,
-34,-8,-96,105,0,40,1,-48,-2,-9,-17,-2,32,108,0,40,
1,-48,1,-16,-38,-7,32,109,0,40,1,-48,1,-16,66,-5,
16,-67,56,-75,4,28,64,104,-96,66,8,-48,66,104,1,104,
74,96,17,96,5,104,2,106,-112,71,104,104,-12,-25,56,-67,
56,-75,4,28,8,48,-1,-9,-59,-8,5,30,2,-48,1,37,
109,66,42,-32,-2,-9,-66,-2,-96,97,0,40,-9,-48,-95,104,
19,74,-127,98,-93,105,122,68,-38,96,18,74,-93,105,122,68,
26,97,17,74,-93,105,122,68,90,97,16,74,-93,105,122,68,
-102,97,15,74,-93,105,122,68,26,98,14,74,-93,105,122,68,
90,98,-93,105,1,34,-100,96,-93,105,-39,106,10,67,-38,98,
9,74,-93,105,122,68,18,104,90,99,40,28,56,-67,-64,70,
19,-8,-1,-1,115,-2,-1,-1,95,-6,-1,-1,-105,-8,-1,-1,
15,-8,-1,-1,39,-8,-1,-1,92,83,0,0,-16,-75,-101,-80,
6,28,15,28,21,28,104,70,0,33,104,34,2,-16,-102,-1,
37,75,108,70,5,-88,123,68,-100,96,-1,-9,68,-8,0,40,
37,-47,104,70,-1,-9,52,-1,0,40,26,-47,31,72,120,68,
-1,-9,2,-6,9,-112,0,40,19,-48,0,45,5,-48,40,28,
-1,-9,-6,-7,10,-112,0,40,11,-48,104,70,-1,-9,-112,-1,
0,40,6,-47,-95,104,50,28,59,28,-1,-9,-103,-8,0,40,
8,-48,96,105,-1,-9,13,-8,104,70,-1,-9,71,-1,1,37,
109,66,22,-32,96,105,-95,105,-2,-9,83,-2,5,30,-16,-47,
11,78,96,105,126,68,50,104,115,104,-2,-9,-63,-1,96,105,
-75,96,-2,-9,-10,-1,104,70,-1,-9,91,-1,104,70,-1,-9,
45,-1,40,28,27,-80,-16,-67,78,83,0,0,-40,58,0,0,
-32,82,0,0,8,-75,5,75,123,68,-101,104,0,43,2,-48,
88,105,-2,-9,-37,-1,0,32,8,-67,-64,70,-84,82,0,0,
56,-75,5,28,4,72,12,28,19,28,120,68,41,28,34,28,
0,104,1,-16,-94,-8,56,-67,-98,81,0,0,0,0,0,0,
-16,-75,23,28,-125,109,66,109,-121,-80,6,28,13,28,4,-110,
-60,109,5,-109,0,47,35,-47,-128,35,-37,0,-102,66,15,-39,
16,28,2,-16,-33,-1,81,75,79,74,2,-16,-29,-1,2,-16,
-23,-1,-96,35,-37,3,-104,66,0,-40,-115,-32,24,28,-117,-32,
4,-102,85,75,1,58,-102,66,0,-39,-125,-32,4,-101,5,-102,
-48,24,59,28,0,44,0,-48,99,8,-64,24,64,8,123,-32,
56,28,2,-16,-65,-1,2,-112,3,-111,40,28,2,-16,-70,-1,
2,28,11,28,0,-112,1,-111,2,-16,-52,-1,2,28,11,28,
2,-104,3,-103,2,-16,-50,-1,0,40,3,-48,-128,32,-64,0,
-121,66,97,-40,54,74,55,75,0,-104,1,-103,2,-16,-86,-1,
2,28,11,28,2,-104,3,-103,2,-16,-68,-1,0,40,9,-48,
-128,32,-64,0,-121,66,5,-39,56,75,-99,66,76,-39,40,28,
20,33,22,-32,44,74,45,75,0,-104,1,-103,2,-16,-110,-1,
2,28,11,28,2,-104,3,-103,2,-16,-92,-1,0,40,11,-48,
-128,32,-64,0,-121,66,7,-39,45,75,-99,66,52,-39,40,28,
10,33,1,-16,9,-6,47,-32,5,-102,4,-101,-48,24,-89,66,
3,-39,60,27,100,8,0,25,5,-32,0,35,-68,66,1,-39,
-28,27,99,8,-64,24,64,8,2,-16,100,-1,24,74,25,75,
4,28,13,28,0,-104,1,-103,2,-16,100,-1,2,28,11,28,
2,-104,3,-103,2,-16,118,-1,0,40,2,-48,18,74,19,75,
1,-32,19,74,19,75,32,28,41,28,2,-16,83,-1,2,-16,
89,-1,1,-32,-96,32,-64,3,4,-102,-9,101,112,101,-78,101,
7,-80,-16,-67,-64,70,-64,70,0,0,0,0,0,0,-8,63,
-51,-52,-52,-52,-52,-52,-12,63,102,102,102,102,102,102,-26,63,
0,0,0,0,0,0,-32,63,102,102,102,102,102,102,-18,63,
-51,-52,-52,-52,-52,-52,-16,63,-1,3,0,0,19,80,0,0,
9,40,0,0,-64,70,-64,70,-16,-75,-119,-80,6,-110,66,109,
6,28,1,-111,0,42,2,-47,-6,35,27,3,67,101,115,109,
-14,109,1,-104,3,-109,7,-110,2,-16,12,-1,109,75,108,74,
4,-112,5,-111,2,-16,14,-1,107,74,108,75,-73,109,4,28,
13,28,2,-16,39,-1,0,40,9,-48,32,28,41,28,2,-16,
41,-1,117,75,-104,66,4,-36,-64,32,64,1,1,-32,-56,32,
0,2,114,75,123,68,-37,104,2,-109,6,-101,0,43,57,-47,
3,-101,2,-102,-1,24,1,50,120,8,1,-110,2,-16,-30,-2,
4,28,2,-104,13,28,2,-16,21,-1,89,74,89,75,2,-16,
-31,-2,89,74,89,75,2,-16,-19,-2,2,28,11,28,32,28,
41,28,2,-16,-41,-2,2,-16,-3,-2,85,74,85,75,7,28,
4,-104,5,-103,2,-16,-50,-2,4,28,13,28,56,28,2,-16,
-63,-2,34,28,43,28,2,-16,-27,-2,0,40,4,-48,32,28,
41,28,2,-16,-25,-2,7,28,3,-102,56,30,-112,66,98,-46,
16,28,96,-32,82,75,6,-102,-102,66,7,-40,3,-101,-1,24,
120,8,2,-16,-89,-2,68,74,68,75,78,-32,6,-101,-125,66,
3,-40,3,-102,-65,24,120,8,55,-32,6,-104,2,-16,-102,-2,
63,74,64,75,4,28,13,28,4,-104,5,-103,2,-16,-102,-2,
2,28,11,28,32,28,41,28,2,-16,-84,-2,0,40,63,-47,
4,-104,5,-103,2,28,11,28,2,-16,-100,-2,2,28,11,28,
32,28,41,28,2,-16,-98,-2,0,40,4,-48,1,-104,20,33,
1,-16,10,-7,37,-32,48,74,48,75,4,-104,5,-103,2,-16,
121,-2,2,28,11,28,32,28,41,28,2,-16,-117,-2,0,40,
6,-48,1,-104,10,33,1,-16,-9,-8,2,-101,1,-109,18,-32,
6,-102,7,-101,-102,66,1,-39,3,-104,2,-32,3,-101,-1,24,
120,8,2,-16,87,-2,34,74,34,75,2,-16,91,-2,2,-16,
-127,-2,2,-102,1,-110,35,75,-104,66,5,-39,24,28,3,-32,
2,-101,-128,32,-64,0,1,-109,1,-102,2,-101,-102,66,3,-47,
29,75,0,34,123,68,2,-32,28,75,1,-102,123,68,-38,96,
6,-101,3,-102,112,101,-13,101,-78,101,9,-80,-16,-67,-64,70,
0,0,0,0,0,0,-32,63,0,0,0,0,0,0,-23,64,
-102,-103,-103,-103,-103,-103,-71,63,0,0,0,0,0,0,-16,63,
51,51,51,51,51,51,-45,63,123,20,-82,71,-31,122,-16,63,
0,0,0,0,0,0,4,64,0,0,0,0,0,0,-8,63,
10,-41,-93,112,61,10,-17,63,-1,23,0,0,112,80,0,0,
-1,19,0,0,0,32,78,0,16,79,0,0,8,79,0,0,
-62,101,66,109,3,28,-126,101,1,72,88,101,112,71,-64,70,
0,32,78,0,115,-75,3,108,1,34,4,28,-39,106,-111,67,
-39,98,3,108,2,34,-34,106,50,67,-38,98,65,108,3,108,
10,34,1,41,2,-47,9,74,122,68,18,104,90,99,1,37,
0,35,0,-109,1,-107,-96,104,82,33,-30,104,102,105,-80,71,
0,40,1,-48,35,108,-99,99,115,-67,-64,70,108,78,0,0,
3,108,1,34,-102,99,112,71,16,-75,4,30,29,-48,-128,106,
0,40,1,-48,-2,-9,-45,-3,96,107,0,40,1,-48,-2,-9,
9,-1,32,107,0,40,1,-48,-2,-9,4,-1,32,108,0,40,
1,-48,-2,-9,-38,-5,96,109,0,40,1,-48,0,-16,-59,-2,
32,28,2,-16,-17,-4,0,32,1,-32,1,32,64,66,16,-67,
112,-75,4,28,0,107,-2,-9,-8,-1,-94,107,-123,26,15,-48,
32,107,-90,106,-2,-9,-20,-1,-93,107,42,28,-63,24,48,28,
-2,-9,126,-2,-94,107,19,24,-93,99,-29,108,24,24,-32,100,
112,-67,0,0,-9,-75,1,110,4,28,22,28,0,41,6,-47,
26,77,90,25,26,75,-102,66,5,-39,26,28,3,-32,0,35,
-128,34,3,102,-46,0,-96,106,49,28,-2,-9,93,-2,5,30,
3,-36,35,108,1,34,-102,99,31,-32,33,109,11,24,35,101,
16,75,123,68,27,104,26,104,91,104,0,-112,96,109,0,-16,
-19,-2,103,108,1,47,13,-47,0,35,0,-107,1,-109,-96,104,
84,33,-30,104,51,28,101,105,-88,71,0,40,5,-48,35,108,
-97,99,2,-32,-95,108,77,25,-91,100,-9,-67,24,-4,-1,-1,
60,15,0,0,114,76,0,0,112,-75,4,28,34,105,-128,104,
-112,71,-128,35,-37,2,-104,66,6,-40,0,32,2,-16,-118,-4,
-96,101,-64,23,-32,101,22,-32,0,32,2,-16,-125,-4,-91,109,
-26,109,2,34,0,35,82,25,115,65,-63,23,-103,66,2,-36,
12,-47,-112,66,10,-39,0,32,2,-16,116,-4,1,35,-96,101,
-64,23,-32,101,35,102,35,108,-40,106,3,-32,35,108,-40,106,
2,35,-104,67,112,-67,0,0,3,75,123,68,24,96,3,75,
123,68,25,96,112,71,-64,70,-102,76,0,0,-44,76,0,0,
-9,-75,7,28,104,32,14,28,21,28,1,-109,2,-16,58,-4,
4,28,0,44,51,-48,0,33,104,34,2,-16,59,-4,1,-101,
1,32,-25,96,99,97,8,-101,-90,96,37,97,-93,97,9,-101,
-29,97,19,75,123,68,99,98,18,75,123,68,35,98,0,-16,
-22,-3,96,101,0,40,10,-48,-2,-9,47,-2,32,99,-2,-9,
44,-2,96,99,0,40,2,-48,35,107,0,43,4,-47,32,28,
-1,-9,18,-1,0,32,10,-32,0,32,1,35,99,100,32,101,
-32,100,2,-16,31,-4,-96,101,-64,23,-32,101,32,28,-2,-67,
-39,3,0,0,75,-2,-1,-1,115,-75,-61,106,4,28,-30,104,
-128,104,0,43,3,-48,-93,105,84,33,-104,71,27,-32,33,108,
101,105,-55,106,-50,7,4,-43,0,-109,1,-109,81,33,-88,71,
17,-32,99,108,0,43,6,-47,4,33,1,-109,35,28,0,-111,
72,51,97,33,-88,71,0,35,-96,104,-30,104,0,-109,1,-109,
100,105,85,33,-96,71,115,-67,16,-75,4,28,-1,-9,-44,-1,
-29,105,-96,104,33,28,-104,71,16,-67,3,108,1,34,-102,99,
112,71,-9,-75,4,28,14,28,21,30,26,-48,0,41,24,-48,
71,109,0,32,2,-16,-42,-5,0,-107,-61,23,2,28,56,28,
0,-16,62,-2,32,107,49,28,42,28,-2,-9,-38,-3,35,108,
1,48,2,-47,1,34,-102,99,3,-32,-39,106,4,34,10,67,
-38,98,0,32,-2,-67,2,108,1,35,-109,99,-61,98,0,32,
112,71,0,-75,0,35,67,100,3,108,-38,106,-110,7,1,-43,
10,34,90,99,0,32,0,-67,-16,-75,-123,-80,2,-111,3,-110,
0,40,56,-48,0,41,54,-48,0,42,52,-48,80,35,19,96,
-2,-9,10,-2,7,30,42,-48,-2,-9,-80,-2,1,-112,0,40,
0,-48,-101,-32,85,73,56,28,1,-102,121,68,-2,-9,-3,-2,
5,28,66,28,13,-48,82,73,-62,28,56,28,121,68,-2,-9,
-12,-2,4,28,67,28,25,-47,56,28,-2,-9,-114,-2,4,28,
20,-32,76,73,56,28,1,-102,121,68,-2,-9,-26,-2,4,28,
66,28,91,-47,56,28,-2,-9,-128,-2,4,28,86,-32,1,35,
91,66,1,-109,80,-32,1,32,64,66,125,-32,56,28,0,33,
42,28,-2,-9,2,-1,6,30,100,-48,63,73,48,28,0,34,
121,68,-2,-9,-54,-2,1,48,3,-48,3,-102,-68,35,-1,51,
19,96,100,27,-23,28,-30,30,56,28,-2,-9,-18,-2,5,30,
92,-48,-2,-9,90,-2,4,30,92,-48,52,73,40,28,0,34,
121,68,-2,-9,-78,-2,4,28,40,28,99,28,52,-48,34,28,
0,33,-2,-9,-38,-2,97,28,0,-112,40,28,-2,-9,-13,-2,
0,-102,4,28,0,42,27,-47,56,28,-2,-9,51,-3,0,45,
2,-48,40,28,-2,-9,46,-3,0,-101,0,43,2,-48,24,28,
-2,-9,40,-3,0,44,2,-48,32,28,-2,-9,35,-3,0,46,
2,-48,48,28,-2,-9,30,-3,1,-104,45,-32,0,38,-64,-25,
0,40,-31,-48,3,-103,-2,-9,-17,-2,0,40,-36,-47,2,-104,
0,-103,-2,-9,-45,-2,9,-32,-2,-9,18,-2,1,28,2,-104,
-2,-9,102,-3,0,40,20,-47,4,28,0,-112,2,-104,-2,-9,
12,-2,-55,-25,4,28,0,-112,5,28,-59,-25,1,35,0,38,
91,66,52,28,0,-106,53,28,1,-109,-67,-25,4,28,0,-112,
-70,-25,0,36,0,-108,-73,-25,5,-80,-16,-67,-39,50,0,0,
-53,50,0,0,-81,50,0,0,121,50,0,0,79,50,0,0,
-16,-75,4,28,-121,-80,40,48,15,28,3,-110,-2,-9,-86,-5,
5,30,46,-47,-2,-9,-90,-7,3,30,103,-48,57,74,-95,106,
-124,96,122,68,-62,96,56,74,-127,98,-63,106,122,68,2,97,
54,74,122,68,66,97,54,74,122,68,-126,97,53,74,122,68,
-62,97,53,74,122,68,2,98,1,34,10,67,-62,98,51,74,
122,68,18,104,66,99,32,100,-2,-9,-81,-4,3,-103,6,28,
56,28,-2,-9,-29,-4,5,-107,7,28,0,46,1,-48,0,40,
3,-47,-96,104,-30,104,0,35,58,-32,-2,-9,-87,-3,5,-86,
49,28,-1,-9,-15,-2,-30,104,2,-112,3,-110,0,40,6,-48,
-96,104,0,-107,1,-107,100,105,81,33,43,28,19,-32,48,28,
-91,106,-2,-9,-107,-3,41,28,2,28,5,-101,3,-104,-2,-9,
-97,-5,5,28,-96,104,0,45,13,-48,2,-101,-30,104,81,33,
0,-109,1,-109,100,105,-96,71,48,28,-2,-9,123,-4,56,28,
-2,-9,120,-4,17,-32,33,108,64,105,-2,-9,82,-7,48,28,
-2,-9,112,-4,56,28,-2,-9,109,-4,8,-32,-96,104,-30,104,
0,-109,1,-109,100,105,81,33,-96,71,1,37,109,66,40,28,
7,-80,-16,-67,31,-5,-1,-1,-27,-5,-1,-1,-85,-5,-1,-1,
85,-5,-1,-1,-89,-3,-1,-1,81,-4,-1,-1,68,73,0,0,
56,-75,4,-102,13,28,4,28,25,28,0,40,24,-48,83,45,
2,-47,-1,-9,101,-1,21,-32,84,45,2,-47,-1,-9,97,-2,
16,-32,85,45,5,-47,2,108,1,35,-109,99,-61,98,0,32,
8,-32,0,32,-64,45,5,-47,32,28,-1,-9,122,-2,1,-32,
1,32,64,66,56,-67,8,-75,3,104,27,108,-104,71,8,-67,
8,-75,3,104,91,108,-104,71,8,-67,8,-75,3,104,-37,109,
-104,71,8,-67,12,-76,55,-75,6,-85,5,104,4,-53,-126,34,
-110,0,-84,88,6,-102,1,-109,-96,71,62,-68,8,-68,2,-80,
24,71,12,-76,55,-75,5,104,6,-85,4,-53,-114,34,-110,0,
-84,88,6,-102,1,-109,-96,71,55,-68,8,-68,2,-80,24,71,
-16,-75,2,104,-88,35,-101,0,-123,-80,-45,88,6,28,3,-111,
-104,71,5,30,22,-48,71,28,56,28,2,-16,-37,-7,4,28,
0,44,15,-48,58,28,0,33,2,-16,-36,-7,50,104,-35,35,
0,-108,-101,0,-41,88,48,28,3,-103,0,34,43,28,-72,71,
32,28,-1,-25,5,-80,-16,-67,-9,-75,2,104,-85,35,-101,0,
-45,88,6,28,15,28,-104,71,5,28,0,45,20,-48,2,-16,
-71,-7,4,28,0,44,15,-48,0,33,42,28,2,-16,-70,-7,
50,104,-56,35,0,-108,-101,0,-45,88,48,28,57,28,-100,70,
0,34,43,28,-32,71,32,28,-2,-67,56,-75,5,104,-30,36,
100,0,44,89,-96,71,56,-67,-9,-75,22,28,2,104,-80,35,
-101,0,15,28,-45,88,49,28,4,28,-104,71,5,30,9,-48,
34,104,-48,35,-101,0,0,-105,-41,88,32,28,41,28,0,34,
51,28,-72,71,40,28,-2,-67,-16,-75,-123,-80,14,28,23,28,
11,-103,12,-102,4,28,3,-109,-1,-9,-34,-1,5,30,29,-48,
58,28,32,28,49,28,3,-101,-1,-9,-49,-1,2,30,24,-48,
49,28,10,-101,0,-107,32,28,-1,-9,100,-1,34,104,-28,35,
-101,0,6,28,-45,88,32,28,-104,71,0,40,11,-48,32,28,
-1,-9,73,-1,32,28,-1,-9,75,-1,2,-32,1,38,118,66,
5,-32,1,38,118,66,32,28,41,28,-1,-9,70,-1,48,28,
5,-80,-16,-67,55,-75,4,28,13,28,-1,-9,-90,-1,2,30,
20,-48,7,-101,32,28,41,28,0,-109,6,-101,-1,-9,73,-1,
34,104,-28,35,-101,0,-45,88,32,28,-104,71,0,40,5,-48,
32,28,-1,-9,32,-1,32,28,-1,-9,34,-1,55,-67,1,32,
64,66,112,71,55,-75,20,28,4,74,29,28,1,-107,122,68,
19,28,9,51,0,-108,-1,-9,-43,-1,55,-67,73,46,0,0,
7,-75,0,35,1,-109,13,75,1,-87,13,74,123,68,24,104,
3,104,-101,105,-104,71,0,40,13,-47,1,-104,0,40,10,-48,
8,73,3,104,121,68,15,49,-101,105,-104,71,1,30,2,-48,
1,-104,-1,-9,-6,-2,1,32,64,66,14,-67,124,70,0,0,
4,0,1,0,19,46,0,0,115,-75,0,35,1,-109,17,75,
6,28,13,28,123,68,24,104,1,-87,15,74,3,104,-101,105,
-104,71,0,40,20,-47,1,-104,0,40,17,-48,11,73,3,104,
121,68,-101,105,15,49,-104,71,4,30,9,-48,1,-104,33,28,
50,28,43,28,-1,-9,-82,-1,1,-104,33,28,-1,-9,-51,-2,
115,-67,-64,70,52,70,0,0,4,0,1,0,-57,45,0,0,
8,-75,7,75,123,68,24,96,6,72,120,68,0,104,0,-16,
-121,-7,67,30,-104,65,4,75,64,66,24,67,8,-67,-64,70,
-28,69,0,0,-34,68,0,0,4,0,1,0,8,-75,16,28,
-2,-9,88,-3,8,-67,8,-75,16,28,25,28,-1,-9,100,-4,
8,-67,112,-75,17,28,4,28,30,28,-1,-9,-63,-2,4,-103,
5,28,32,28,-1,-9,-68,-2,4,30,8,-48,0,45,16,-48,
49,28,40,28,34,28,-1,-9,1,-7,6,28,3,-32,1,38,
118,66,0,45,10,-48,40,28,2,-16,-92,-8,0,44,2,-47,
4,-32,1,38,118,66,32,28,2,-16,-100,-8,48,28,112,-67,
8,-75,-1,-9,71,-7,8,-67,19,32,112,71,8,-75,4,73,
2,104,-89,35,-101,0,-45,88,121,68,-104,71,8,-67,-64,70,
-23,44,0,0,8,-75,1,28,-61,105,-128,104,-104,71,8,-67,
67,108,-40,106,112,71,16,-75,4,30,30,-48,1,107,0,41,
3,-48,-125,104,-40,107,0,-16,-94,-7,32,28,40,48,0,-16,
-7,-7,32,108,0,40,1,-48,-2,-9,116,-6,-32,107,0,40,
1,-48,-2,-9,111,-6,96,108,0,40,1,-48,-3,-9,69,-1,
32,28,2,-16,95,-8,0,32,1,-32,1,32,64,66,16,-67,
115,-75,67,107,4,28,0,43,14,-47,-123,107,0,45,11,-47,
0,-107,1,-107,-30,104,43,28,-128,104,102,105,-80,71,98,108,
1,35,-109,99,101,99,-93,99,115,-67,-16,-75,21,28,26,28,
8,58,-123,-80,4,28,41,28,-128,106,-2,-9,-35,-7,2,30,
4,-36,32,28,81,33,-1,-9,-37,-1,57,-32,41,28,32,108,
-2,-9,71,-6,5,30,-12,-47,32,108,-2,-9,62,-5,3,40,
46,-39,32,108,-2,-9,52,-5,6,104,32,108,-2,-9,53,-5,
51,29,-104,66,36,-47,0,-107,1,-107,43,28,-96,104,101,105,
68,33,-30,104,-88,71,5,30,-37,-47,98,105,-29,104,32,108,
2,-110,-89,104,3,-109,-2,-9,27,-5,1,-107,3,29,0,-106,
56,28,69,33,3,-102,2,-99,-88,71,3,30,-55,-47,0,-112,
1,-112,70,33,-96,104,-30,104,101,105,-88,71,0,40,-64,-47,
5,-80,-16,-67,-16,-75,4,28,-123,-80,0,40,90,-48,66,41,
46,-48,2,-36,65,41,11,-48,78,-32,67,41,48,-48,85,41,
74,-47,66,108,1,35,-109,99,67,99,0,32,-96,99,75,-32,
-3,-9,-72,-2,1,30,57,-48,36,75,-94,106,0,37,123,68,
3,97,35,75,-126,98,-62,106,123,68,-61,97,33,75,-59,96,
69,97,123,68,3,98,2,35,19,67,-123,97,-124,96,-61,98,
69,99,-93,104,96,100,88,105,-3,-9,-85,-2,40,28,43,-32,
-64,107,25,28,10,-102,-2,-9,-44,-7,0,40,36,-48,21,-32,
0,35,3,-109,-125,104,-58,106,-64,107,-33,107,-2,-9,-64,-6,
5,28,-32,107,-2,-9,-63,-6,3,-86,3,28,0,-110,56,28,
49,28,42,28,0,-16,-14,-8,0,40,2,-48,32,28,81,33,
4,-32,3,-101,35,99,3,-32,32,28,-30,33,-1,-9,64,-1,
0,32,1,-32,1,32,64,66,5,-80,-16,-67,41,-1,-1,-1,
-103,-2,-1,-1,-101,-2,-1,-1,-9,-75,7,28,72,32,14,28,
21,28,1,-109,1,-16,118,-1,4,28,0,44,42,-48,0,33,
72,34,1,-16,119,-1,1,-101,-25,96,-90,96,99,97,8,-101,
37,97,-93,97,9,-101,-29,97,15,75,123,68,99,98,15,75,
123,68,35,98,-2,-9,113,-7,-32,99,-2,-9,110,-7,32,100,
0,40,2,-48,-29,107,0,43,1,-47,32,28,7,-32,32,28,
40,48,0,-16,-30,-8,3,28,32,28,0,43,2,-48,-1,-9,
-38,-2,0,32,-2,-67,-64,70,-9,-2,-1,-1,-29,-3,-1,-1,
16,-75,1,35,4,28,32,96,96,96,-61,96,-2,-9,80,-5,
-96,96,-2,-9,100,-5,0,32,16,-67,56,-75,4,28,-128,104,
-2,-9,89,-5,96,104,-96,66,4,-48,5,104,1,-16,58,-1,
104,104,-8,-25,-128,104,-2,-9,82,-5,0,32,56,-67,16,-75,
4,28,-1,-9,-22,-1,-96,104,-2,-9,77,-5,16,-67,56,-75,
5,28,-128,104,-2,-9,63,-5,107,104,0,36,-85,66,2,-48,
1,52,91,104,-6,-25,-104,104,-2,-9,57,-5,32,28,56,-67,
56,-75,4,28,-128,104,13,28,-2,-9,45,-5,99,104,101,96,
44,96,107,96,29,96,-96,104,-2,-9,41,-5,0,32,56,-67,
112,-75,4,28,14,28,0,40,18,-48,-128,104,0,40,15,-48,
-2,-9,25,-5,101,104,-91,66,4,-48,-85,104,-77,66,2,-48,
109,104,-8,-25,0,37,-96,104,-2,-9,17,-5,40,28,-1,-25,
112,-67,112,-75,5,28,14,28,0,40,23,-48,-128,104,0,40,
20,-48,-2,-9,0,-5,108,104,-84,66,9,-48,-93,104,-77,66,
4,-47,34,104,99,104,83,96,26,96,2,-32,100,104,-13,-25,
0,36,-88,104,-2,-9,-13,-6,32,28,-1,-25,112,-67,8,-75,
-1,-9,-33,-1,0,40,1,-48,1,-16,-52,-2,0,32,8,-67,
56,-75,4,30,13,-48,-128,104,0,40,12,-48,-2,-9,-37,-6,
-27,104,107,28,0,-43,1,35,-29,96,-96,104,-2,-9,-41,-6,
2,-32,5,28,0,-32,5,28,40,28,56,-67,-9,-75,5,28,
16,32,22,28,15,28,1,-109,1,-16,-100,-2,4,28,40,28,
-1,-9,-34,-1,33,28,-96,96,40,28,-25,96,-1,-9,-120,-1,
-96,104,8,-101,49,28,1,-102,24,96,-1,-9,105,-3,-2,-67,
8,-75,0,-16,44,-8,0,32,8,-67,112,-75,22,28,29,28,
-1,-9,-97,-1,4,30,9,-48,49,28,42,28,-64,104,0,-16,
30,-8,32,28,1,-16,-122,-2,0,32,1,-32,1,32,64,66,
112,-67,0,32,112,71,0,32,112,71,8,-75,1,-16,122,-1,
-64,23,8,-67,16,-75,4,28,0,104,0,40,1,-48,1,-16,
-119,-2,96,104,0,40,1,-48,1,-16,-124,-2,16,-67,-8,-75,
6,28,15,28,21,28,0,36,57,25,42,27,48,28,-2,-9,
7,-8,0,40,2,-37,36,24,-84,66,-11,-47,32,28,-8,-67,
8,-75,-3,-9,-7,-1,8,-67,-8,-75,4,28,24,32,13,28,
22,28,31,28,1,-16,62,-2,0,40,3,-48,-124,96,-59,96,
6,97,71,97,-8,-67,16,-75,4,28,40,32,1,-16,50,-2,
0,40,12,-48,3,28,8,51,-125,96,-61,96,0,34,0,35,
-126,97,-61,97,2,97,67,97,0,96,64,96,4,98,16,-67,
8,-75,10,32,-1,-9,-25,-1,8,-67,56,-75,4,28,64,104,
-96,66,8,-48,1,104,66,104,74,96,17,96,5,104,1,-16,
33,-2,104,104,-12,-25,-32,104,34,28,8,50,-112,66,8,-48,
1,104,66,104,74,96,17,96,5,104,1,-16,19,-2,104,104
};
}
\ No newline at end of file
package com.vps.library;
public class a2{
public static byte []a2 = {
-14,-25,32,28,1,-16,14,-2,56,-67,112,-75,-122,-80,0,-110,
1,-109,6,28,49,104,-79,66,61,-48,51,106,112,104,2,-109,
-63,104,-37,23,3,-109,2,-100,3,-99,0,-102,1,-101,18,27,
-85,65,-103,66,47,-40,2,-47,-123,104,-107,66,43,-40,2,104,
67,104,83,96,26,96,50,105,115,105,4,105,69,105,18,27,
-85,65,50,97,115,97,1,-16,-27,-3,-37,-25,51,106,-16,104,
4,-109,-63,104,-37,23,5,-109,4,-100,5,-99,0,-102,1,-101,
18,27,-85,65,-103,66,23,-40,19,-48,2,104,67,104,83,96,
26,96,-78,105,-13,105,4,105,69,105,18,27,-85,65,-78,97,
-13,97,1,-16,-57,-3,-75,104,51,28,8,51,-99,66,-35,-47,
2,-32,-123,104,-107,66,-24,-39,6,-80,112,-67,-8,-75,6,28,
28,28,21,28,6,-97,-1,-9,-88,-1,115,104,-77,66,7,-48,
-104,104,-88,66,2,-47,-39,104,-95,66,23,-48,91,104,-11,-25,
40,28,33,28,58,28,0,35,-1,-9,78,-1,0,40,22,-48,
51,104,88,96,3,96,70,96,48,96,58,28,0,35,48,105,
113,105,18,24,75,65,50,97,115,97,8,-32,60,28,0,37,
25,105,90,105,100,24,85,65,28,97,93,97,-19,-25,-8,-67,
-8,-75,5,28,30,28,23,28,-1,-9,119,-1,-20,104,43,28,
8,51,-100,66,7,-48,-96,104,-72,66,2,-47,-31,104,-79,66,
23,-48,100,104,-11,-25,56,28,49,28,6,-102,0,35,-1,-9,
27,-1,0,40,22,-48,-85,104,88,96,3,96,68,96,-88,96,
6,-102,0,35,-88,105,-23,105,18,24,75,65,-86,97,-21,97,
8,-32,6,-102,0,35,32,105,97,105,18,24,75,65,34,97,
99,97,-19,-25,-8,-67,16,-75,4,28,-1,-9,70,-1,32,105,
97,105,16,-67,16,-75,4,28,-1,-9,63,-1,-96,105,-31,105,
16,-67,-8,-75,7,28,16,32,14,28,21,28,28,28,1,-16,
49,-3,0,40,3,-48,-121,114,-58,114,-59,96,4,-127,-8,-67,
16,-75,4,28,-64,104,0,40,1,-48,1,-16,51,-3,32,28,
1,-16,48,-3,16,-67,8,-75,16,32,1,-16,27,-3,0,40,
5,-48,0,34,0,35,-126,96,-61,96,0,96,64,96,8,-67,
3,104,48,-75,89,96,11,96,72,96,1,96,10,-119,0,35,
-124,104,-59,104,18,25,107,65,-126,96,-61,96,48,-67,16,-75,
4,28,8,28,17,28,26,28,2,-101,-1,-9,-62,-1,1,30,
4,-48,32,28,-1,-9,-28,-1,0,32,1,-32,1,32,64,66,
16,-67,-9,-75,6,28,64,104,0,-111,1,-110,-80,66,25,-48,
-61,122,0,-102,-109,66,19,-47,-125,122,1,-102,-109,66,15,-47,
2,104,67,104,0,37,83,96,26,96,4,-119,7,104,-78,104,
-13,104,18,27,-85,65,-78,96,-13,96,-1,-9,-87,-1,56,28,
64,104,-29,-25,-9,-67,48,-75,3,104,-125,66,16,-48,65,104,
10,104,75,104,83,96,26,96,10,-119,0,35,-124,104,-59,104,
-92,26,-99,65,34,28,43,28,-126,96,-61,96,8,28,0,-32,
0,32,48,-67,-63,104,-128,104,112,71,3,104,24,26,67,30,
-104,65,112,71,56,-75,4,28,64,104,-96,66,8,-48,2,104,
67,104,83,96,26,96,5,104,-1,-9,122,-1,104,104,-12,-25,
1,-16,-80,-4,56,-67,0,0,0,41,52,-48,1,35,0,34,
16,-76,-120,66,44,-45,1,36,36,7,-95,66,4,-46,-127,66,
2,-46,9,1,27,1,-8,-25,-28,0,-95,66,4,-46,-127,66,
2,-46,73,0,91,0,-8,-25,-120,66,1,-45,64,26,26,67,
76,8,-96,66,2,-45,0,27,92,8,34,67,-116,8,-96,66,
2,-45,0,27,-100,8,34,67,-52,8,-96,66,2,-45,0,27,
-36,8,34,67,0,40,3,-48,27,9,1,-48,9,9,-29,-25,
16,28,16,-68,112,71,-64,70,120,71,-64,70,0,0,80,-29,
0,0,-32,19,-123,2,0,-22,0,41,-12,-48,3,-75,-1,-9,
-67,-1,14,-68,66,67,-119,26,24,71,-64,70,2,17,33,-30,
0,0,0,-22,2,49,35,-30,48,64,45,-23,-127,64,-96,-31,
-125,80,-96,-31,5,0,52,-31,2,0,48,1,0,-64,-108,17,
2,-64,-107,17,-60,-54,-16,17,-59,-54,-16,17,121,0,0,10,
-92,74,-96,-31,-91,90,116,-32,0,80,101,-78,6,0,0,-38,
5,64,-124,-32,2,32,32,-32,3,48,33,-32,0,0,34,-32,
1,16,35,-32,2,32,32,-32,3,48,33,-32,54,0,85,-29,
48,-128,-67,-120,2,1,17,-29,1,22,-96,-31,1,-58,-96,-29,
33,22,-116,-31,1,0,0,10,0,0,112,-30,0,16,-31,-30,
2,1,19,-29,3,54,-96,-31,35,54,-116,-31,1,0,0,10,
0,32,114,-30,0,48,-29,-30,5,0,52,-31,87,0,0,10,
1,64,68,-30,32,-32,117,-30,5,0,0,-70,18,-50,-96,-31,
50,5,-112,-32,0,16,-95,-30,19,14,-112,-32,83,21,-79,-32,
6,0,0,-22,32,80,69,-30,32,-32,-114,-30,1,0,82,-29,
19,-50,-96,-31,2,-64,-116,35,83,5,-112,-32,-61,31,-79,-32,
2,81,1,-30,2,0,0,90,0,-64,124,-30,0,0,-16,-30,
0,16,-31,-30,1,6,81,-29,14,0,0,58,2,6,81,-29,
6,0,0,58,-95,16,-80,-31,96,0,-80,-31,108,-64,-96,-31,
1,64,-124,-30,-124,42,-96,-31,1,5,114,-29,85,0,0,42,
2,1,92,-29,-96,-64,-80,1,0,0,-80,-30,4,26,-95,-32,
5,16,-127,-31,48,-128,-67,-24,-116,-64,-80,-31,0,0,-80,-32,
1,16,-95,-32,1,6,17,-29,1,64,68,-30,-13,-1,-1,26,
0,0,49,-29,0,16,-96,1,0,0,-96,3,17,63,111,-31,
32,48,-125,2,11,48,67,-30,32,32,83,-30,7,0,0,-86,
12,32,-110,-30,4,0,0,-38,20,-64,-126,-30,12,32,98,-30,
17,12,-96,-31,49,18,-96,-31,4,0,0,-22,20,32,-126,-30,
32,-64,98,-46,17,18,-96,-31,48,28,-127,-47,16,2,-96,-47,
3,64,84,-32,4,26,-127,-96,5,16,-127,-95,48,-128,-67,-88,
4,64,-32,-31,31,64,84,-30,13,0,0,-86,12,64,-108,-30,
5,0,0,-54,20,64,-124,-30,32,32,100,-30,48,4,-96,-31,
17,2,-128,-31,49,20,-123,-31,48,-128,-67,-24,12,64,100,-30,
32,32,100,-30,48,2,-96,-31,17,4,-128,-31,5,16,-96,-31,
48,-128,-67,-24,49,4,-96,-31,5,16,-96,-31,48,-128,-67,-24,
0,0,52,-29,1,54,35,-30,1,22,33,2,1,64,-124,2,
1,80,69,18,-95,-1,-1,-22,-60,-54,-16,-31,-59,-54,-16,17,
24,0,0,10,5,0,52,-31,2,0,48,1,3,0,0,10,
0,-64,-108,-31,3,16,-96,1,2,0,-96,1,48,-128,-67,-24,
3,0,49,-31,0,16,-96,19,0,0,-96,19,48,-128,-67,24,
-92,-54,-80,-31,3,0,0,26,-128,0,-80,-31,1,16,-79,-32,
2,17,-127,35,48,-128,-67,-24,1,69,-108,-30,1,22,-127,50,
48,-128,-67,56,2,81,1,-30,127,20,-123,-29,15,22,-127,-29,
0,0,-96,-29,48,-128,-67,-24,-60,-54,-16,-31,3,16,-96,17,
2,0,-96,17,-59,-54,-16,1,1,48,-96,17,0,32,-96,17,
1,70,-112,-31,3,86,-110,1,3,0,49,1,2,23,-127,19,
48,-128,-67,-24,0,0,48,-29,0,16,-96,3,30,-1,47,1,
48,64,45,-23,1,75,-96,-29,50,64,-124,-30,0,80,-96,-29,
0,16,-96,-29,-99,-1,-1,-22,0,0,48,-29,0,16,-96,3,
30,-1,47,1,48,64,45,-23,1,75,-96,-29,50,64,-124,-30,
2,81,16,-30,0,0,96,66,0,16,-96,-29,-109,-1,-1,-22,
-128,32,-80,-31,-62,17,-96,-31,97,16,-96,-31,2,14,-96,-31,
-1,52,18,18,-1,4,51,19,14,19,33,18,30,-1,47,17,
0,0,50,-29,-1,4,51,19,30,-1,47,1,48,64,45,-23,
14,77,-96,-29,2,81,1,-30,2,17,-63,-29,-125,-1,-1,-22,
1,32,-112,-31,30,-1,47,1,48,64,45,-23,0,80,-96,-29,
6,0,0,-22,1,32,-112,-31,30,-1,47,1,48,64,45,-23,
2,81,17,-30,1,0,0,90,0,0,112,-30,0,16,-31,-30,
1,75,-96,-29,50,64,-124,-30,33,-53,-80,-31,92,-1,-1,10,
3,32,-96,-29,-84,-63,-80,-31,3,32,-126,18,-84,-63,-80,-31,
3,32,-126,18,-84,33,-126,-32,32,48,98,-30,16,-61,-96,-31,
48,2,-96,-31,17,3,-128,-31,49,18,-96,-31,2,64,-124,-32,
79,-1,-1,-22,112,64,45,-23,-1,-64,-96,-29,7,-52,-116,-29,
33,74,28,-32,35,90,28,16,12,0,52,17,12,0,53,17,
111,0,0,11,5,64,-124,-32,3,96,33,-32,-116,26,-63,-31,
-116,58,-61,-31,1,86,-112,-31,3,86,-110,17,1,22,-127,-29,
1,54,-125,-29,28,0,0,10,-112,-62,-114,-32,0,80,-96,-29,
-111,-30,-91,-32,2,33,6,-30,-112,-29,-91,-32,0,96,-96,-29,
-111,83,-90,-32,0,0,60,-29,1,-32,-114,19,-1,64,68,-30,
2,12,86,-29,3,76,-60,-30,2,0,0,42,-114,-32,-80,-31,
5,80,-75,-32,6,96,-90,-32,-122,21,-126,-31,-91,26,-127,-31,
-123,5,-96,-31,-82,10,-128,-31,-114,-27,-96,-31,-3,-64,84,-30,
7,12,92,-125,15,0,0,-118,2,1,94,-29,-96,-32,-80,1,
0,0,-80,-30,4,26,-95,-32,112,-128,-67,-24,2,97,6,-30,
1,16,-122,-31,2,0,-128,-31,3,16,33,-32,-84,64,84,-32,
12,80,116,-64,4,26,-127,-63,112,-128,-67,-56,1,22,-127,-29,
0,-32,-96,-29,1,64,84,-30,88,0,0,-54,54,0,116,-29,
0,0,-96,-45,2,17,1,-46,112,-128,-67,-40,0,64,100,-30,
32,64,84,-30,24,0,0,-86,12,64,-108,-30,11,0,0,-54,
20,64,-124,-30,32,80,100,-30,16,53,-96,-31,48,4,-96,-31,
17,5,-128,-31,2,33,1,-30,2,17,-63,-29,-93,15,-112,-32,
49,20,-94,-32,-125,-32,-98,-31,-93,15,-64,1,112,-128,-67,-24,
12,64,100,-30,32,80,100,-30,16,52,-96,-31,48,5,-96,-31,
17,4,-128,-31,2,17,1,-30,-93,15,-112,-32,0,16,-95,-30,
-125,-32,-98,-31,-93,15,-64,1,112,-128,-67,-24,32,80,100,-30,
16,-27,-114,-31,48,52,-96,-31,17,53,-125,-31,49,4,-96,-31,
2,17,1,-30,49,4,-64,-31,-93,15,-128,-32,-125,-32,-98,-31,
-93,15,-64,1,112,-128,-67,-24,0,0,52,-29,8,0,0,26,
2,97,1,-30,-128,0,-80,-31,1,16,-95,-32,1,6,17,-29,
1,64,68,2,-6,-1,-1,10,6,16,-127,-31,0,0,53,-29,
30,-1,47,17,2,97,3,-30,-126,32,-80,-31,3,48,-93,-32,
1,6,19,-29,1,80,69,2,-6,-1,-1,10,6,48,-125,-31,
30,-1,47,-31,12,0,52,-31,35,90,12,-32,12,0,53,17,
6,0,0,10,-127,96,-112,-31,-125,96,-110,17,-27,-1,-1,26,
3,16,33,-32,2,17,1,-30,0,0,-96,-29,112,-128,-67,-24,
-127,96,-112,-31,2,0,-96,1,3,16,-96,1,-125,96,-110,17,
15,0,0,10,12,0,52,-31,1,0,0,26,1,102,-112,-31,
11,0,0,26,12,0,53,-31,3,0,0,26,3,102,-110,-31,
2,0,-96,17,3,16,-96,17,5,0,0,26,3,16,33,-32,
2,17,1,-30,127,20,-127,-29,15,22,-127,-29,0,0,-96,-29,
112,-128,-67,-24,127,20,-127,-29,62,23,-127,-29,112,-128,-67,-24,
112,64,45,-23,-1,-64,-96,-29,7,-52,-116,-29,33,74,28,-32,
35,90,28,16,12,0,52,17,12,0,53,17,92,0,0,11,
5,64,68,-32,3,-32,33,-32,3,86,-110,-31,1,22,-96,-31,
75,0,0,10,3,54,-96,-31,1,82,-96,-29,35,50,-123,-31,
34,60,-125,-31,2,36,-96,-31,33,82,-123,-31,32,92,-123,-31,
0,100,-96,-31,2,17,14,-30,3,0,85,-31,2,0,86,1,
-3,64,-92,-30,3,76,-124,-30,1,0,0,42,-93,48,-80,-31,
98,32,-96,-31,2,96,86,-32,3,80,-59,-32,-93,48,-80,-31,
98,32,-96,-31,1,6,-96,-29,2,-57,-96,-29,2,-32,86,-32,
3,-32,-43,-32,2,96,70,32,14,80,-96,33,12,0,-128,33,
-93,48,-80,-31,98,32,-96,-31,2,-32,86,-32,3,-32,-43,-32,
2,96,70,32,14,80,-96,33,-84,0,-128,33,-93,48,-80,-31,
98,32,-96,-31,2,-32,86,-32,3,-32,-43,-32,2,96,70,32,
14,80,-96,33,44,1,-128,33,-93,48,-80,-31,98,32,-96,-31,
2,-32,86,-32,3,-32,-43,-32,2,96,70,32,14,80,-96,33,
-84,1,-128,33,6,-32,-107,-31,13,0,0,10,5,82,-96,-31,
38,94,-123,-31,6,98,-96,-31,-125,49,-96,-31,-94,62,-125,-31,
-126,33,-96,-31,44,-62,-80,-31,-37,-1,-1,26,1,6,17,-29,
6,0,0,26,0,16,-127,-31,0,0,-96,-29,2,-63,-96,-29,
-43,-1,-1,-22,1,6,17,-29,0,16,-127,1,0,0,-96,3,
-3,-64,84,-30,7,12,92,-125,74,-1,-1,-118,3,-64,85,-32,
2,-64,86,0,-96,-64,-80,1,0,0,-80,-30,4,26,-95,-32,
112,-128,-67,-24,2,-31,14,-30,33,22,-114,-31,-84,64,-108,-32,
12,80,116,-64,4,26,-127,-63,112,-128,-67,-56,1,22,-127,-29,
0,-32,-96,-29,1,64,84,-30,58,-1,-1,-22,6,-32,-123,-31,
56,-1,-1,-22,35,90,12,-32,12,0,52,-31,12,0,53,1,
-109,-1,-1,10,12,0,52,-31,6,0,0,26,1,70,-112,-31,
-113,-1,-1,26,12,0,53,-31,-121,-1,-1,26,2,0,-96,-31,
3,16,-96,-31,-118,-1,-1,-22,12,0,53,-31,4,0,0,26,
3,86,-110,-31,109,-1,-1,10,2,0,-96,-31,3,16,-96,-31,
-125,-1,-1,-22,-127,96,-112,-31,-125,96,-110,17,77,-1,-1,26,
-127,64,-112,-31,120,-1,-1,26,-125,80,-110,-31,99,-1,-1,26,
123,-1,-1,-22,0,-64,-32,-29,2,0,0,-22,1,-64,-96,-29,
0,0,0,-22,1,-64,-96,-29,4,-64,45,-27,-127,-64,-96,-31,
-52,-54,-16,-31,-125,-64,-96,-31,-52,-54,-16,17,14,0,0,10,
4,-48,-115,-30,-127,-64,-112,-31,-125,-64,-110,1,3,0,49,17,
2,0,48,1,0,0,-96,3,30,-1,47,1,0,0,112,-29,
3,0,49,-31,3,0,81,81,2,0,80,1,-61,15,-96,33,
-61,15,-32,49,1,0,-128,-29,30,-1,47,-31,-127,-64,-96,-31,
-52,-54,-16,-31,1,0,0,26,1,-58,-112,-31,4,0,0,26,
-125,-64,-96,-31,-52,-54,-16,-31,-24,-1,-1,26,3,-58,-110,-31,
-26,-1,-1,10,4,0,-99,-28,30,-1,47,-31,0,-64,-96,-31,
2,0,-96,-31,12,32,-96,-31,1,-64,-96,-31,3,16,-96,-31,
12,48,-96,-31,-1,-1,-1,-22,1,64,45,-23,-44,-1,-1,-21,
0,0,80,-29,0,0,112,67,1,-128,-67,-24,8,-32,45,-27,
-8,-1,-1,-21,1,0,-96,3,0,0,-96,19,8,-16,-99,-28,
8,-32,45,-27,-13,-1,-1,-21,1,0,-96,51,0,0,-96,35,
8,-16,-99,-28,8,-32,45,-27,-18,-1,-1,-21,1,0,-96,-109,
0,0,-96,-125,8,-16,-99,-28,8,-32,45,-27,-30,-1,-1,-21,
1,0,-96,-109,0,0,-96,-125,8,-16,-99,-28,8,-32,45,-27,
-35,-1,-1,-21,1,0,-96,51,0,0,-96,35,8,-16,-99,-28,
-127,32,-96,-31,2,38,-110,-30,12,0,0,42,9,0,0,90,
62,62,-32,-29,-62,42,83,-32,10,0,0,-102,-127,53,-96,-31,
2,49,-125,-29,-96,58,-125,-31,2,1,17,-29,51,2,-96,-31,
0,0,96,18,30,-1,47,-31,0,0,-96,-29,30,-1,47,-31,
1,6,-112,-31,2,0,0,26,2,1,17,-30,2,1,-32,3,
30,-1,47,-31,0,0,-96,-29,30,-1,47,-31,-127,32,-80,-31,
10,0,0,42,2,38,-110,-30,10,0,0,42,7,0,0,90,
62,62,-32,-29,-62,42,83,-32,8,0,0,74,-127,53,-96,-31,
2,49,-125,-29,-96,58,-125,-31,51,2,-96,-31,30,-1,47,-31,
0,0,-96,-29,30,-1,47,-31,1,6,-112,-31,1,0,0,26,
0,0,-32,-29,30,-1,47,-31,0,0,-96,-29,30,-1,47,-31,
2,64,45,-23,8,0,-96,-29,-7,-14,-1,-21,2,-128,-67,-24,
3,104,0,-75,90,0,3,-43,-128,34,18,6,19,67,1,-32,
91,0,91,8,-64,24,0,-67,-16,-75,-121,-80,5,-112,22,28,
0,41,40,-48,1,57,3,-111,2,-111,0,33,1,-111,1,-102,
2,-103,83,24,-36,15,-28,24,5,-102,100,16,-25,0,-43,25,
40,28,-1,-9,-35,-1,3,-101,4,-112,-100,66,23,-48,5,-103,
8,55,-56,25,-1,-9,-44,-1,4,-102,-106,66,5,-46,1,-101,
-100,66,10,-48,1,60,2,-108,-31,-25,1,56,-122,66,9,-39,
1,52,1,-108,-37,-25,13,28,4,-32,0,37,2,-32,4,-103,
-114,66,-20,-45,40,28,7,-80,-16,-67,0,-75,1,40,6,-48,
2,40,7,-48,0,40,9,-47,5,72,120,68,4,-32,5,72,
120,68,1,-32,4,72,120,68,0,104,0,-32,0,32,0,-67,
66,49,0,0,64,49,0,0,62,49,0,0,36,75,115,-75,
123,68,27,104,4,28,-114,30,0,43,8,-48,48,28,1,-87,
0,-16,-8,-1,2,28,0,42,11,-47,34,97,49,-32,29,77,
29,75,125,68,123,68,27,104,45,104,24,28,-19,26,-19,16,
1,-107,1,-103,50,28,-1,-9,-113,-1,5,30,1,-47,32,97,
31,-32,-1,-9,125,-1,107,104,-96,100,1,43,3,-47,0,35,
35,97,5,32,27,-32,40,29,0,43,2,-38,-32,100,1,35,
3,-32,-1,-9,109,-1,0,35,-32,100,-32,108,35,101,3,104,
0,43,8,-38,27,1,24,15,-1,-9,-89,-1,32,97,0,40,
4,-47,9,32,3,-32,-1,-9,91,-1,32,97,0,32,118,-67,
40,49,0,0,10,49,0,0,12,49,0,0,3,104,16,-75,
4,28,-38,7,7,-44,72,48,-102,7,2,-43,0,-16,-78,-1,
1,-32,0,-16,-73,-1,35,104,91,7,3,-44,32,28,-48,48,
0,-16,-72,-1,34,104,18,7,4,-44,-88,35,91,0,-32,24,
0,-16,-72,-1,34,104,-46,6,4,-44,-24,35,91,0,-32,24,
0,-16,-72,-1,16,-67,2,104,0,35,0,-75,-102,66,0,-48,
19,88,24,28,0,-67,9,32,112,71,112,71,112,-75,5,28,
12,28,40,28,33,108,-1,-9,121,-1,6,30,1,-48,0,-16,
-87,-1,35,108,107,97,1,32,41,28,34,28,43,105,-104,71,
8,40,-18,-48,7,40,-14,-47,48,28,33,108,-1,-9,-27,-1,
32,29,0,-16,-97,-1,-16,-75,46,76,23,28,-91,68,-62,104,
-125,105,4,-110,0,38,4,28,4,49,7,-88,64,34,5,-109,
0,-16,-48,-2,6,-106,2,-106,6,-83,32,28,41,108,-1,-9,
77,-1,123,30,-97,65,9,55,3,-105,6,30,17,-47,47,108,
103,97,-16,34,126,-81,56,28,41,28,82,0,0,-16,-70,-2,
58,28,3,-104,33,28,35,105,-104,71,-65,107,111,100,2,-112,
5,-32,3,-97,16,35,31,67,-86,107,3,-105,106,100,5,-97,
6,-83,1,-105,0,-107,1,32,3,-103,34,28,35,28,4,-97,
-72,71,0,40,22,-47,0,46,22,-47,-16,34,40,28,126,-87,
82,0,0,-16,-105,-2,2,-97,8,47,1,-47,55,28,-61,-25,
2,-97,7,47,6,-47,48,28,41,108,-1,-9,-114,-1,7,-88,
0,-16,72,-1,9,32,0,-32,48,28,-9,35,-101,0,-99,68,
-16,-67,-64,70,36,-4,-1,-1,64,108,112,71,-16,-75,-53,107,
-7,-80,11,100,5,28,12,28,1,-88,4,49,64,34,0,-16,
113,-2,1,35,91,66,0,-109,40,28,16,-103,-1,-9,-18,-2,
0,40,15,-47,41,28,106,70,43,105,-104,71,7,30,8,47,
-14,-48,104,70,-1,-9,50,-1,6,47,3,-47,40,28,33,28,
-1,-9,92,-1,9,32,121,-80,-16,-67,8,-75,-126,97,-38,107,
-63,96,26,100,25,28,0,34,-1,-9,109,-1,8,-67,112,-75,
-58,104,67,105,5,28,12,28,11,100,0,46,3,-48,1,34,
-1,-9,97,-1,19,-32,2,32,41,28,34,28,43,105,-104,71,
7,40,5,-48,8,40,10,-47,40,28,33,28,-1,-9,54,-1,
48,28,33,108,-1,-9,49,-1,32,29,0,-16,-21,-2,0,-16,
-31,-2,8,-75,-61,104,0,43,2,-47,-1,-9,-89,-1,4,-32,
-53,107,11,100,0,34,-1,-9,62,-1,8,-67,112,71,8,-75,
-125,104,1,28,0,43,1,-48,1,32,-104,71,8,-67,16,-75,
4,28,4,41,19,-40,8,28,0,-16,114,-3,5,3,17,3,
3,0,1,32,12,-32,2,32,0,43,9,-47,15,42,7,-40,
-126,64,-92,24,2,-102,97,104,17,96,24,28,0,-32,2,32,
16,-67,31,-75,10,28,3,-85,0,33,0,-109,11,28,-1,-9,
-34,-1,3,-104,5,-80,0,-67,16,-75,4,28,4,41,19,-40,
8,28,0,-16,77,-3,5,3,17,3,3,0,1,32,12,-32,
2,32,0,43,9,-47,15,42,7,-40,2,-103,-126,64,9,104,
-92,24,97,96,24,28,0,-32,2,32,16,-67,31,-75,11,28,
3,-110,0,33,3,-86,0,-110,26,28,11,28,-1,-9,-36,-1,
5,-80,0,-67,-16,-75,26,76,-45,107,-91,68,19,100,6,28,
15,28,23,-88,17,29,64,34,0,-16,-68,-3,1,35,91,66,
22,-109,22,-84,104,70,33,108,-1,-9,56,-2,0,40,1,-48,
9,37,20,-32,32,28,12,33,106,70,-1,-9,-41,-1,32,28,
57,28,-80,71,0,40,-13,-47,4,-101,8,32,105,70,34,28,
-104,71,5,30,5,45,2,-48,9,40,-30,-47,-24,-25,32,28,
-1,-9,108,-2,40,28,-113,35,-101,0,-99,68,-16,-67,-64,70,
-60,-3,-1,-1,-16,-75,12,28,-115,-80,3,33,3,-109,7,-112,
-29,108,8,64,4,-112,3,-104,31,29,22,28,26,104,9,-85,
9,-110,95,96,0,40,4,-47,18,2,9,-110,88,114,25,114,
12,-32,3,-103,2,41,9,-36,17,12,18,4,26,96,2,34,
89,114,26,114,11,6,27,14,-109,64,-1,24,4,-102,2,42,
0,-47,-89,107,32,109,1,35,3,64,0,-48,-22,-32,6,-109,
59,104,1,-109,0,43,0,-47,-26,-32,3,-103,2,41,4,-47,
122,104,61,28,2,-110,8,53,4,-32,59,-120,120,-120,61,29,
1,-109,2,-112,2,-101,-95,108,1,39,-69,67,91,24,48,28,
15,33,5,-109,-1,-9,77,-1,5,-102,0,35,-126,66,5,-40,
1,-101,-69,67,-45,24,-104,66,-101,65,91,66,2,-102,1,-104,
58,64,82,0,7,64,58,67,1,42,25,-48,0,42,2,-48,
2,42,91,-48,-40,-32,4,-103,47,29,0,41,-56,-48,0,43,
-58,-48,40,28,-1,-9,76,-3,-89,99,5,28,32,28,0,-16,
-23,-3,0,40,0,-47,-57,-32,48,28,15,33,42,28,62,-32,
4,-104,0,40,38,-47,0,43,61,-48,41,104,107,104,-49,15,
-104,28,0,-47,-72,-32,33,28,88,49,8,-111,1,51,11,-48,
40,29,-1,-9,0,-2,58,28,8,-85,1,28,32,28,0,-16,
-47,-3,7,30,39,-48,0,-32,23,28,48,28,13,33,-1,-9,
0,-1,8,-101,32,98,2,47,2,-47,-29,98,35,28,44,51,
99,98,70,-32,48,28,13,33,39,106,-1,-9,-14,-2,-121,66,
17,-47,-95,106,-115,66,14,-47,40,28,-1,-9,9,-3,15,33,
2,28,48,28,-1,-9,10,-1,48,28,0,33,34,28,-1,-9,
5,-1,7,32,-127,-32,47,28,8,55,113,-25,40,104,4,-103,
66,0,82,8,1,-110,0,41,38,-47,0,43,73,-48,7,-102,
18,7,2,-43,1,-101,0,43,67,-47,0,39,1,-104,-121,66,
16,-48,1,55,35,28,-72,0,88,51,40,24,8,-109,-1,-9,
-78,-3,0,34,8,-85,1,28,32,28,0,-16,-125,-3,0,40,
-20,-48,46,-32,13,33,48,28,-1,-9,-77,-2,8,-103,97,98,
32,98,-91,98,6,32,80,-32,48,28,13,33,39,106,-1,-9,
-88,-2,-121,66,29,-47,-94,106,-107,66,26,-47,1,-101,-93,98,
4,35,35,99,0,39,-21,24,-25,98,99,99,40,104,-72,66,
13,-38,1,-104,1,48,-128,0,40,24,-1,-9,-79,-4,15,33,
2,28,48,28,-1,-9,-78,-2,48,28,57,28,-90,-25,1,33,
6,-111,42,104,0,42,0,-38,4,53,1,-97,1,55,-65,0,
-17,25,21,-25,0,32,6,-112,3,-103,2,41,2,-35,-1,-9,
114,-3,3,-32,48,28,9,-87,0,-16,98,-6,0,40,19,-47,
6,-102,0,42,1,-47,8,32,15,-32,15,33,48,28,-1,-9,
104,-2,14,33,2,28,48,28,-1,-9,-120,-2,4,74,48,28,
122,68,18,104,15,33,122,-25,9,32,13,-80,-16,-67,-64,70,
-12,42,0,0,8,-75,0,35,-1,-9,-68,-2,8,-67,8,-75,
1,35,-1,-9,-73,-2,8,-67,8,-75,2,35,-1,-9,-78,-2,
8,-67,-16,-75,4,28,-57,-80,23,28,29,28,4,41,0,-39,
-125,-32,8,28,0,-16,-100,-5,3,29,-127,43,87,0,2,32,
0,43,0,-48,18,-31,18,4,-93,107,18,12,1,33,8,28,
-88,64,2,66,4,-48,-88,0,30,104,32,24,4,51,70,96,
1,53,16,45,-13,-47,0,32,-71,4,0,-43,-2,-32,-93,99,
-4,-32,4,35,42,28,-102,67,1,42,94,-47,62,12,63,4,
59,12,3,-109,-97,25,1,45,0,-48,-111,-32,81,-32,3,43,
83,-47,23,4,21,12,63,12,123,25,16,43,77,-40,35,104,
8,34,19,66,6,-48,-109,67,35,96,-88,35,91,0,-32,24,
0,-16,-48,-4,36,-82,48,28,0,-16,-52,-4,-19,0,-94,107,
117,25,127,0,19,28,57,28,-83,26,1,57,3,-45,24,104,
-24,80,4,51,-7,-25,-65,0,-46,25,-94,99,48,28,0,-16,
-119,-4,0,32,-62,-32,0,43,39,-47,16,42,37,-40,35,104,
16,34,19,66,6,-48,-24,33,-109,67,73,0,35,96,96,24,
0,-16,-80,-4,36,-83,40,28,0,-16,-84,-4,-94,107,0,35,
1,33,8,28,-104,64,7,66,3,-48,22,104,-104,0,4,50,
46,80,1,51,4,43,-12,-47,-94,99,40,28,0,-16,106,-4,
-41,-25,16,47,1,-40,15,46,1,-39,2,32,-106,-32,0,39,
35,104,1,34,19,66,18,-48,24,28,-112,67,2,28,32,96,
32,28,72,48,5,45,5,-47,2,35,26,67,34,96,0,-16,
-119,-4,4,-32,3,34,-109,67,35,96,0,-16,-117,-4,0,47,
9,-48,35,104,4,34,19,66,5,-48,-109,67,32,28,35,96,
-48,48,0,-16,-121,-4,1,45,5,-47,36,-88,0,-16,122,-4,
0,47,10,-47,19,-32,15,46,2,-40,36,-88,0,-16,106,-4,
0,47,12,-48,4,-88,0,-16,117,-4,16,33,-119,27,7,-32,
32,47,-62,-40,15,46,79,-39,3,-97,0,47,80,-47,3,-103,
-94,107,19,28,0,41,21,-35,73,0,2,-111,36,-88,-15,0,
64,24,-128,26,2,-101,17,28,-124,70,3,-109,3,-104,1,56,
3,-112,4,-45,11,104,96,70,67,80,4,49,-10,-25,2,-103,
-117,0,-45,24,0,47,25,-48,50,30,16,42,0,-46,16,34,
16,58,-46,0,4,-87,-119,24,0,32,122,0,-116,70,2,-110,
0,-112,0,-103,96,70,-119,0,90,88,66,80,0,-103,2,-102,
1,49,0,-111,-111,66,-12,-47,-118,0,-101,24,1,45,0,-47,
4,51,-93,99,1,45,3,-47,36,-88,0,-16,-53,-5,80,-25,
15,46,2,-40,36,-88,0,-16,-67,-5,0,47,0,-47,72,-25,
4,-88,0,-16,-57,-5,68,-25,16,47,0,-40,111,-25,16,63,
5,45,0,-48,105,-25,15,46,-127,-40,105,-25,71,-80,-16,-67,
52,16,-128,-30,56,0,-111,-24,56,0,45,-23,-1,15,-112,-24,
0,-32,-99,-24,33,11,-112,-20,30,-1,47,-31,33,11,-128,-20,
30,-1,47,-31,32,11,-112,-20,30,-1,47,-31,32,11,-128,-20,
30,-1,47,-31,32,11,-48,-20,30,-1,47,-31,32,11,-64,-20,
30,-1,47,-31,2,1,-16,-20,2,17,-16,-20,2,33,-16,-20,
2,49,-16,-20,2,65,-16,-20,2,81,-16,-20,2,97,-16,-20,
2,113,-16,-20,2,-127,-16,-20,2,-111,-16,-20,2,-95,-16,-20,
2,-79,-16,-20,2,-63,-16,-20,2,-47,-16,-20,2,-31,-16,-20,
2,-15,-16,-20,30,-1,47,-31,2,1,-32,-20,2,17,-32,-20,
2,33,-32,-20,2,49,-32,-20,2,65,-32,-20,2,81,-32,-20,
2,97,-32,-20,2,113,-32,-20,2,-127,-32,-20,2,-111,-32,-20,
2,-95,-32,-20,2,-79,-32,-20,2,-63,-32,-20,2,-47,-32,-20,
2,-31,-32,-20,2,-15,-32,-20,30,-1,47,-31,1,-127,-80,-4,
1,-111,-80,-4,1,-95,-80,-4,1,-79,-80,-4,30,-1,47,-31,
1,-127,-96,-4,1,-111,-96,-4,1,-95,-96,-4,1,-79,-96,-4,
30,-1,47,-31,0,-32,45,-23,-1,31,45,-23,0,48,-96,-29,
12,0,45,-23,4,16,-115,-30,4,-64,-113,-30,1,-64,-116,-29,
28,-1,47,-31,-1,-9,18,-4,16,-101,18,-80,24,71,-64,70,
0,-32,45,-23,-1,31,45,-23,0,48,-96,-29,12,0,45,-23,
4,16,-115,-30,4,-64,-113,-30,1,-64,-116,-29,28,-1,47,-31,
-1,-9,45,-4,16,-101,18,-80,24,71,-64,70,0,-32,45,-23,
-1,31,45,-23,0,48,-96,-29,12,0,45,-23,4,16,-115,-30,
4,-64,-113,-30,1,-64,-116,-29,28,-1,47,-31,-1,-9,57,-4,
16,-101,18,-80,24,71,-64,70,0,-32,45,-23,-1,31,45,-23,
0,48,-96,-29,12,0,45,-23,4,48,-115,-30,4,-64,-113,-30,
1,-64,-116,-29,28,-1,47,-31,-1,-9,-9,-5,16,-101,18,-80,
24,71,-64,70,0,-32,45,-23,-1,31,45,-23,0,48,-96,-29,
12,0,45,-23,4,32,-115,-30,4,-64,-113,-30,1,-64,-116,-29,
28,-1,47,-31,-1,-9,110,-4,16,-101,18,-80,24,71,-64,70,
0,-75,2,122,3,28,0,42,12,-47,66,122,-80,32,0,42,
14,-48,1,58,90,114,90,104,17,29,18,104,26,96,89,96,
3,34,0,-32,1,58,24,104,26,114,2,2,0,14,26,96,
0,-67,31,-75,0,33,3,-85,0,-109,12,34,11,28,-1,-9,
-2,-5,3,-104,5,-80,0,-67,8,-75,-1,-9,-14,-1,8,-67,
-16,-75,15,28,-121,-80,0,33,5,28,3,-111,56,28,-1,-9,
-49,-1,4,30,-80,44,20,-47,3,-102,0,36,-94,66,0,-48,
51,-31,5,-82,33,28,35,28,0,-106,40,28,14,34,-1,-9,
-34,-5,0,-106,40,28,33,28,15,34,35,28,-1,-9,-4,-5,
35,-31,127,35,1,28,-103,67,11,6,27,14,21,-47,-122,0,
-1,34,22,64,5,-86,2,-110,0,-110,25,28,40,28,13,34,
-1,-9,-59,-5,4,54,5,-101,97,6,1,-43,-98,27,0,-32,
-98,25,5,-86,5,-106,0,-110,50,-32,15,38,3,28,-77,67,
27,6,27,14,-128,43,27,-47,4,2,56,28,-1,-9,-112,-1,
-128,38,54,2,4,67,-76,66,1,-47,9,36,-11,-32,35,1,
0,33,36,5,2,-109,34,12,40,28,11,28,-1,-9,113,-3,
0,40,-14,-47,2,-103,49,66,-88,-48,1,34,3,-110,-91,-25,
-112,43,20,-47,13,35,3,64,13,43,-26,-48,2,28,50,64,
0,33,5,-82,0,-106,40,28,11,28,-1,-9,-120,-5,0,-106,
0,33,40,28,13,34,11,28,-1,-9,-90,-5,-114,-25,-96,43,
15,-47,-1,35,27,1,7,34,-126,67,25,28,17,65,10,28,
26,64,3,7,2,-43,-128,35,-37,1,26,67,40,28,0,33,
-126,-32,-80,43,85,-47,-79,40,12,-47,56,28,-1,-9,72,-1,
2,30,-70,-48,3,28,-77,67,27,6,27,14,-75,-47,40,28,
25,28,-92,-32,-78,40,40,-47,0,33,5,-82,13,34,11,28,
0,-106,40,28,-1,-9,83,-5,56,28,-1,-9,49,-1,2,36,
127,33,-128,35,-116,70,3,64,5,-103,9,-48,98,70,16,64,
-96,64,9,24,56,28,5,-111,7,52,-1,-9,33,-1,-17,-25,
-127,34,-110,0,-119,24,98,70,16,64,-96,64,9,24,5,-111,
0,-106,40,28,25,28,13,34,-82,-25,-77,40,11,-47,56,28,
-1,-9,14,-1,2,28,-80,67,0,6,50,64,0,14,1,50,
0,3,2,67,10,-32,-4,35,3,64,-76,43,0,-47,116,-25,
7,34,20,64,-128,34,1,52,18,3,34,67,40,28,1,33,
42,-32,-64,43,75,-47,-58,40,11,-47,56,28,-1,-9,-16,-2,
2,28,-80,67,0,6,50,64,0,14,1,50,0,3,2,67,
24,-32,-57,40,12,-47,56,28,-1,-9,-30,-2,2,30,0,-47,
83,-25,-16,35,3,64,0,-48,79,-25,40,28,4,33,62,-32,
-8,35,3,64,-64,43,9,-47,15,34,20,64,-96,34,1,52,
18,3,34,67,40,28,3,33,11,28,48,-32,-56,40,14,-47,
56,28,-1,-9,-59,-2,15,33,3,28,-117,67,27,6,27,14,
26,28,16,50,1,64,18,3,1,49,10,67,28,-32,-55,40,
0,-48,42,-25,56,28,-1,-9,-77,-2,15,35,2,28,-104,67,
0,6,26,64,0,14,1,50,0,3,2,67,12,-32,7,34,
3,28,-109,67,27,6,27,14,-48,43,0,-48,21,-25,20,64,
-128,34,1,52,18,3,34,67,40,28,1,33,5,35,-1,-9,
-120,-4,0,40,0,-48,8,-25,-64,-26,32,28,7,-80,-16,-67,
31,-75,-62,108,1,-85,84,104,32,2,1,-112,16,28,8,48,
2,-112,3,32,24,114,8,28,-46,121,25,28,90,114,-1,-9,
-89,-2,4,-80,16,-67,8,-75,-1,-9,-98,-2,-128,108,8,-67,
8,-75,-1,-9,-103,-2,-61,108,-40,121,26,29,1,48,-128,0,
16,24,8,-67,8,-75,0,-16,85,-7,8,-75,0,-16,82,-7,
2,-76,113,70,73,8,73,0,9,92,73,0,-114,68,2,-68,
112,71,-64,70,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-4,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-8,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-12,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-16,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-20,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-24,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-28,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-32,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-36,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-40,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-44,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-48,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-52,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-56,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-60,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-64,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-68,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-72,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-76,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-80,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-84,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-88,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-92,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-96,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-100,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-104,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
96,-24,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
80,-23,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
56,-17,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-124,-27,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-88,-18,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
92,-18,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-100,-18,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
20,-24,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
20,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
28,-69,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-64,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-96,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-80,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-80,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
40,-7,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-56,-70,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
60,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-76,-70,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-80,-70,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-108,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-36,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
24,-8,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
-8,-9,-1,-1,120,71,-64,70,0,-64,-97,-27,15,-16,-116,-32,
8,-8,-1,-1,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,7,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127
};
}
\ No newline at end of file
package com.vps.library;
public class a3{
public static byte []a3 = {
-80,-80,0,-124,0,0,0,0,7,-79,1,-127,-80,-80,1,-87,
0,0,0,0,7,-79,1,-127,-80,-80,1,-87,0,0,0,0,
7,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,2,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,8,-79,1,-127,
-80,-80,0,-124,0,0,0,0,8,-79,1,-127,-80,-80,0,-124,
0,0,0,0,8,-79,1,-127,-80,-80,0,-124,0,0,0,0,
8,-79,1,-127,-80,-80,0,-124,0,0,0,0,-120,-72,-1,127,
-80,-80,-88,-128,-106,-72,-1,127,-52,-3,-1,127,-106,-72,-1,127,
-87,8,-79,-128,-84,-72,-1,127,-85,7,-79,-128,76,-70,-1,127,
-87,8,-79,-128,116,-70,-1,127,-80,0,-124,-128,-126,-70,-1,127,
-80,-3,-1,127,-120,-70,-1,127,-85,63,8,-128,0,-69,-1,127,
-80,-80,-86,-128,46,-69,-1,127,-87,8,-79,-128,68,-69,-1,127,
-80,-80,-86,-128,-88,-69,-1,127,-80,-80,-80,-128,-90,-69,-1,127,
-80,-80,-88,-128,-62,-69,-1,127,-87,8,-79,-128,2,-68,-1,127,
1,0,0,0,-6,-69,-1,127,116,-3,-1,127,-6,-69,-1,127,
120,-3,-1,127,0,-68,-1,127,-80,-85,8,-128,-124,-68,-1,127,
-80,-85,12,-128,16,-67,-1,127,-80,-85,8,-128,124,-67,-1,127,
100,-3,-1,127,124,-67,-1,127,104,-3,-1,127,124,-67,-1,127,
108,-3,-1,127,-116,-67,-1,127,1,0,0,0,-124,-67,-1,127,
-80,0,-124,-128,-88,-67,-1,127,-80,-80,-86,-128,-34,-67,-1,127,
-87,8,-79,-128,6,-66,-1,127,80,-3,-1,127,8,-66,-1,127,
-80,-80,-88,-128,30,-66,-1,127,-80,-80,-86,-128,-118,-66,-1,127,
-87,8,-79,-128,-16,-66,-1,127,-80,-85,6,-128,-112,-65,-1,127,
52,-3,-1,127,-92,-65,-1,127,-80,-80,-88,-128,-56,-65,-1,127,
-87,8,-79,-128,-36,-65,-1,127,-80,0,-124,-128,-16,-65,-1,127,
-80,-80,-88,-128,88,-64,-1,127,-80,-80,-85,-128,-114,-64,-1,127,
-85,8,-79,-128,-72,-64,-1,127,-88,3,-79,-128,-34,-64,-1,127,
-85,8,-79,-128,18,-63,-1,127,-8,-4,-1,127,32,-63,-1,127,
-80,-80,-87,-128,68,-63,-1,127,-85,8,-79,-128,-124,-63,-1,127,
1,0,0,0,124,-63,-1,127,-80,-80,-88,-128,-102,-63,-1,127,
-36,-4,-1,127,-102,-63,-1,127,-32,-4,-1,127,-102,-63,-1,127,
-80,-80,-88,-128,-88,-63,-1,127,1,0,0,0,-96,-63,-1,127,
-80,-80,-80,-128,-66,-63,-1,127,-52,-4,-1,127,-52,-63,-1,127,
-80,-80,-86,-128,36,-62,-1,127,-80,-80,-88,-128,72,-62,-1,127,
-80,-80,-80,-128,92,-62,-1,127,-72,-4,-1,127,92,-62,-1,127,
-80,-80,-80,-128,92,-62,-1,127,-80,-80,-88,-128,-120,-62,-1,127,
-80,-85,4,-128,-60,-62,-1,127,-80,-85,6,-128,84,-61,-1,127,
-86,3,-79,-128,118,-61,-1,127,-80,-80,-86,-128,-100,-61,-1,127,
-80,-85,4,-128,84,-60,-1,127,-80,-80,-80,-128,80,-60,-1,127,
-87,7,-79,-128,100,-60,-1,127,-80,-80,-80,-128,96,-60,-1,127,
-88,3,-79,-128,120,-60,-1,127,-87,7,-79,-128,-92,-60,-1,127,
-80,-87,4,-128,-44,-60,-1,127,-80,-86,5,-128,44,-59,-1,127,
-88,15,-79,-128,-100,-59,-1,127,-80,-85,4,-128,8,-58,-1,127,
-85,7,-79,-128,100,-58,-1,127,52,-4,-1,127,108,-58,-1,127,
-80,0,-124,-128,126,-58,-1,127,-85,7,-79,-128,-104,-58,-1,127,
-88,3,-79,-128,48,-57,-1,127,-85,7,-79,-128,-92,-57,-1,127,
-87,8,-79,-128,8,-56,-1,127,-80,-80,-88,-128,86,-56,-1,127,
-87,8,-79,-128,-8,-56,-1,127,-80,-85,26,-128,-88,-55,-1,127,
-8,-5,-1,127,-68,-55,-1,127,-87,8,-79,-128,-44,-55,-1,127,
-80,-85,6,-128,116,-53,-1,127,-80,-85,8,-128,-92,-51,-1,127,
-80,-80,-80,-128,-80,-51,-1,127,1,0,0,0,-88,-51,-1,127,
-86,3,-79,-128,-20,-51,-1,127,-80,-80,-80,-128,-20,-51,-1,127,
-80,-80,-88,-128,44,-50,-1,127,-80,-80,-86,-128,88,-50,-1,127,
-85,7,-79,-128,-44,-50,-1,127,-80,-80,-86,-128,44,-49,-1,127,
-80,-80,-80,-128,60,-49,-1,127,-85,7,-79,-128,-68,-49,-1,127,
-86,3,-79,-128,4,-48,-1,127,-80,-80,-88,-128,14,-48,-1,127,
-80,-80,-80,-128,14,-48,-1,127,-85,7,-79,-128,74,-48,-1,127,
-80,-80,-80,-128,78,-48,-1,127,-80,0,-124,-128,92,-48,-1,127,
-80,-85,4,-128,-20,-47,-1,127,-80,-85,6,-128,4,-45,-1,127,
-87,8,-79,-128,66,-45,-1,127,1,0,0,0,58,-45,-1,127,
68,-5,-1,127,60,-45,-1,127,72,-5,-1,127,62,-45,-1,127,
76,-5,-1,127,64,-45,-1,127,80,-5,-1,127,86,-45,-1,127,
84,-5,-1,127,108,-45,-1,127,-80,-85,4,-128,-84,-45,-1,127,
-85,7,-79,-128,-26,-45,-1,127,-87,8,-79,-128,-20,-45,-1,127,
-85,7,-79,-128,20,-44,-1,127,-80,-85,4,-128,120,-44,-1,127,
-87,7,-79,-128,-86,-44,-1,127,-80,-80,-80,-128,-88,-44,-1,127,
-87,7,-79,-128,-68,-44,-1,127,24,-5,-1,127,-4,-44,-1,127,
-86,3,-79,-128,76,-43,-1,127,20,-5,-1,127,112,-43,-1,127,
24,-5,-1,127,114,-43,-1,127,28,-5,-1,127,118,-43,-1,127,
-80,-80,-86,-128,-68,-43,-1,127,24,-5,-1,127,-68,-43,-1,127,
-80,-80,-80,-128,-72,-43,-1,127,20,-5,-1,127,-56,-43,-1,127,
1,0,0,0,-64,-43,-1,127,16,-5,-1,127,-60,-43,-1,127,
-80,-80,-80,-128,-62,-43,-1,127,-80,-80,-88,-128,4,-42,-1,127,
-86,3,-79,-128,38,-42,-1,127,-80,-85,4,-128,-116,-41,-1,127,
-85,7,-79,-128,-4,-41,-1,127,1,0,0,0,-12,-41,-1,127,
-80,-80,-88,-128,6,-40,-1,127,-87,8,-79,-128,34,-40,-1,127,
-80,-80,-88,-128,42,-40,-1,127,-87,8,-79,-128,100,-40,-1,127,
-80,-80,-86,-128,-54,-40,-1,127,-68,-6,-1,127,-44,-40,-1,127,
-87,8,-79,-128,-8,-40,-1,127,-85,7,-79,-128,36,-39,-1,127,
-80,-6,-1,127,38,-39,-1,127,-80,-80,-86,-128,70,-39,-1,127,
1,0,0,0,62,-39,-1,127,-80,-80,-80,-128,62,-39,-1,127,
-100,-6,-1,127,64,-39,-1,127,-80,-80,-88,-128,82,-39,-1,127,
-85,8,-79,-128,108,-39,-1,127,-112,-6,-1,127,108,-39,-1,127,
1,0,0,0,100,-39,-1,127,-85,8,-79,-128,122,-39,-1,127,
-80,-80,-88,-128,-100,-39,-1,127,124,-6,-1,127,-98,-39,-1,127,
-87,8,-79,-128,-42,-39,-1,127,-80,-86,5,-128,112,-38,-1,127,
-85,8,-79,-128,50,-37,-1,127,-80,-80,-88,-128,70,-37,-1,127,
1,0,0,0,62,-37,-1,127,-85,8,-79,-128,84,-37,-1,127,
-80,-80,-88,-128,98,-37,-1,127,72,-6,-1,127,116,-37,-1,127,
-80,-80,-87,-128,-118,-37,-1,127,-80,-80,-88,-128,-90,-37,-1,127,
-85,7,-79,-128,-30,-37,-1,127,-80,-80,-87,-128,8,-36,-1,127,
-80,-80,-80,-128,16,-36,-1,127,-87,8,-79,-128,42,-36,-1,127,
1,0,0,0,-68,-26,-1,127,20,-6,-1,127,-60,-26,-1,127,
-80,0,-124,-128,-44,-26,-1,127,-80,-85,6,-128,62,-25,-1,127,
-80,0,-124,-128,104,-25,-1,127,-86,3,-79,-128,0,-24,-1,127,
-80,-80,-88,-128,66,-24,-1,127,-80,0,-124,-128,74,-24,-1,127,
-80,-80,-80,-128,72,-24,-1,127,-80,-80,-86,-128,122,-24,-1,127,
-85,118,-78,-128,52,-23,-1,127,-80,-80,-80,-128,48,-23,-1,127,
-85,63,56,-128,118,-23,-1,127,-64,-7,-1,127,-126,-23,-1,127,
-80,-80,-86,-128,-66,-23,-1,127,-68,-7,-1,127,-48,-23,-1,127,
-80,-80,-80,-128,-54,-23,-1,127,-72,-7,-1,127,-46,-23,-1,127,
-80,-80,-88,-128,-2,-23,-1,127,-88,15,-79,-128,12,-22,-1,127,
-80,-80,-88,-128,56,-22,-1,127,-88,15,-79,-128,72,-22,-1,127,
-85,14,-78,-128,-80,-22,-1,127,-80,-85,12,-128,40,-19,-1,127,
-116,-7,-1,127,42,-19,-1,127,-112,-7,-1,127,44,-19,-1,127,
-108,-7,-1,127,46,-19,-1,127,-85,63,6,-128,116,-17,-1,127,
1,0,0,0,60,-15,-1,127,-80,0,-124,-128,102,-15,-1,127,
-88,15,-79,-128,116,-15,-1,127,120,-7,-1,127,116,-15,-1,127,
-80,-85,6,-128,-4,-13,-1,127,-88,15,-79,-128,26,-12,-1,127,
108,-7,-1,127,28,-12,-1,127,112,-7,-1,127,40,-12,-1,127,
116,-7,-1,127,38,-12,-1,127,120,-7,-1,127,36,-12,-1,127,
1,0,0,0,37,117,0,37,100,0,118,112,115,95,116,101,
115,116,95,107,101,121,0,58,47,47,0,47,0,104,116,116,
112,115,0,58,0,49,46,50,46,55,0,102,108,111,119,83,
121,110,99,0,40,73,73,41,86,0,99,111,109,47,122,47,
115,47,83,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,-112,25,0,0,
0,0,0,0,0,0,0,0,3,0,0,0,108,127,0,0,
2,0,0,0,16,1,0,0,23,0,0,0,-44,22,0,0,
20,0,0,0,17,0,0,0,17,0,0,0,100,22,0,0,
18,0,0,0,112,0,0,0,19,0,0,0,8,0,0,0,
-6,-1,-1,111,8,0,0,0,6,0,0,0,72,1,0,0,
11,0,0,0,16,0,0,0,5,0,0,0,-56,9,0,0,
10,0,0,0,102,8,0,0,4,0,0,0,48,18,0,0,
1,0,0,0,42,8,0,0,1,0,0,0,52,8,0,0,
1,0,0,0,65,8,0,0,1,0,0,0,73,8,0,0,
1,0,0,0,81,8,0,0,14,0,0,0,90,8,0,0,
26,0,0,0,44,126,0,0,28,0,0,0,8,0,0,0,
25,0,0,0,52,126,0,0,27,0,0,0,4,0,0,0,
16,0,0,0,0,0,0,0,30,0,0,0,10,0,0,0,
-5,-1,-1,111,1,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,80,-128,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,88,-128,0,0,
-123,84,0,0,-113,84,0,0,-103,84,0,0,0,0,0,0,
-44,103,0,0,76,97,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
-28,23,0,0,-28,23,0,0,-28,23,0,0,-28,23,0,0,
0,0,0,0,15,0,0,0,15,0,0,0,0,71,67,67,
58,32,40,71,78,85,41,32,52,46,56,0,4,0,0,0,
9,0,0,0,4,0,0,0,71,78,85,0,103,111,108,100,
32,49,46,49,49,0,0,0,65,42,0,0,0,97,101,97,
98,105,0,1,32,0,0,0,5,53,84,69,0,6,4,8,
1,9,1,10,2,18,4,20,1,21,1,23,3,24,1,26,
2,30,2,0,46,115,104,115,116,114,116,97,98,0,46,105,
110,116,101,114,112,0,46,100,121,110,115,121,109,0,46,100,
121,110,115,116,114,0,46,104,97,115,104,0,46,114,101,108,
46,100,121,110,0,46,114,101,108,46,112,108,116,0,46,116,
101,120,116,0,46,65,82,77,46,101,120,116,97,98,0,46,
65,82,77,46,101,120,105,100,120,0,46,114,111,100,97,116,
97,0,46,102,105,110,105,95,97,114,114,97,121,0,46,105,
110,105,116,95,97,114,114,97,121,0,46,100,121,110,97,109,
105,99,0,46,103,111,116,0,46,100,97,116,97,0,46,98,
115,115,0,46,99,111,109,109,101,110,116,0,46,110,111,116,
101,46,103,110,117,46,103,111,108,100,45,118,101,114,115,105,
111,110,0,46,65,82,77,46,97,116,116,114,105,98,117,116,
101,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,
1,0,0,0,2,0,0,0,52,1,0,0,52,1,0,0,
19,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,19,0,0,0,11,0,0,0,2,0,0,0,
72,1,0,0,72,1,0,0,-128,8,0,0,3,0,0,0,
1,0,0,0,4,0,0,0,16,0,0,0,27,0,0,0,
3,0,0,0,2,0,0,0,-56,9,0,0,-56,9,0,0,
102,8,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,35,0,0,0,5,0,0,0,2,0,0,0,
48,18,0,0,48,18,0,0,52,4,0,0,2,0,0,0,
0,0,0,0,4,0,0,0,4,0,0,0,41,0,0,0,
9,0,0,0,2,0,0,0,100,22,0,0,100,22,0,0,
112,0,0,0,2,0,0,0,0,0,0,0,4,0,0,0,
8,0,0,0,50,0,0,0,9,0,0,0,66,0,0,0,
-44,22,0,0,-44,22,0,0,16,1,0,0,2,0,0,0,
7,0,0,0,4,0,0,0,8,0,0,0,54,0,0,0,
1,0,0,0,6,0,0,0,-28,23,0,0,-28,23,0,0,
-84,1,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
0,0,0,0,59,0,0,0,1,0,0,0,6,0,0,0,
-112,25,0,0,-112,25,0,0,-108,69,0,0,0,0,0,0,
0,0,0,0,8,0,0,0,0,0,0,0,65,0,0,0,
1,0,0,0,2,0,0,0,36,95,0,0,36,95,0,0,
40,2,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
0,0,0,0,76,0,0,0,1,0,0,112,-126,0,0,0,
76,97,0,0,76,97,0,0,-120,6,0,0,8,0,0,0,
0,0,0,0,4,0,0,0,8,0,0,0,87,0,0,0,
1,0,0,0,2,0,0,0,-44,103,0,0,-44,103,0,0,
64,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,95,0,0,0,15,0,0,0,3,0,0,0,
44,126,0,0,44,110,0,0,8,0,0,0,0,0,0,0,
0,0,0,0,4,0,0,0,0,0,0,0,107,0,0,0,
14,0,0,0,3,0,0,0,52,126,0,0,52,110,0,0,
4,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0,119,0,0,0,6,0,0,0,3,0,0,0,
56,126,0,0,56,110,0,0,0,1,0,0,3,0,0,0,
0,0,0,0,4,0,0,0,8,0,0,0,-128,0,0,0,
1,0,0,0,3,0,0,0,56,127,0,0,56,111,0,0,
-56,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
0,0,0,0,-123,0,0,0,1,0,0,0,3,0,0,0,
0,-128,0,0,0,112,0,0,12,0,0,0,0,0,0,0,
0,0,0,0,4,0,0,0,0,0,0,0,-117,0,0,0,
8,0,0,0,3,0,0,0,16,-128,0,0,12,112,0,0,
88,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,
0,0,0,0,-112,0,0,0,1,0,0,0,48,0,0,0,
0,0,0,0,12,112,0,0,16,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,1,0,0,0,-103,0,0,0,
7,0,0,0,0,0,0,0,0,0,0,0,28,112,0,0,
28,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,
0,0,0,0,-80,0,0,0,3,0,0,112,0,0,0,0,
0,0,0,0,56,112,0,0,43,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,
3,0,0,0,0,0,0,0,0,0,0,0,99,112,0,0,
-64,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
0,0,0,0};
}
\ No newline at end of file
package com.vps.library;
public class b0{
public static byte []b0 = {
127,69,76,70,2,1,1,0,0,0,0,0,0,0,0,0,
3,0,-73,0,1,0,0,0,16,15,0,0,0,0,0,0,
64,0,0,0,0,0,0,0,-48,-112,0,0,0,0,0,0,
0,0,0,0,64,0,56,0,6,0,64,0,19,0,18,0,
1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
32,126,0,0,0,0,0,0,32,126,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,1,0,0,0,6,0,0,0,
-56,-116,0,0,0,0,0,0,-56,-116,1,0,0,0,0,0,
-56,-116,1,0,0,0,0,0,72,3,0,0,0,0,0,0,
-56,3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
2,0,0,0,6,0,0,0,-32,-116,0,0,0,0,0,0,
-32,-116,1,0,0,0,0,0,-32,-116,1,0,0,0,0,0,
-16,1,0,0,0,0,0,0,-16,1,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,80,-27,116,100,4,0,0,0,
72,93,0,0,0,0,0,0,72,93,0,0,0,0,0,0,
72,93,0,0,0,0,0,0,-60,5,0,0,0,0,0,0,
-60,5,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
81,-27,116,100,6,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,82,-27,116,100,4,0,0,0,
-56,-116,0,0,0,0,0,0,-56,-116,1,0,0,0,0,0,
-56,-116,1,0,0,0,0,0,56,3,0,0,0,0,0,0,
56,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
37,0,0,0,49,0,0,0,43,0,0,0,12,0,0,0,
39,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,5,0,0,0,30,0,0,0,20,0,0,0,
7,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,
45,0,0,0,40,0,0,0,46,0,0,0,29,0,0,0,
6,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,
35,0,0,0,11,0,0,0,0,0,0,0,44,0,0,0,
19,0,0,0,48,0,0,0,33,0,0,0,0,0,0,0,
0,0,0,0,31,0,0,0,9,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,
0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,
14,0,0,0,16,0,0,0,0,0,0,0,15,0,0,0,
8,0,0,0,3,0,0,0,26,0,0,0,0,0,0,0,
27,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,
32,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,
34,0,0,0,0,0,0,0,25,0,0,0,38,0,0,0,
4,0,0,0,24,0,0,0,37,0,0,0,18,0,0,0,
41,0,0,0,0,0,0,0,21,0,0,0,42,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,3,0,7,0,
16,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,3,0,15,0,0,-112,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,-86,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-113,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,46,0,0,0,17,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-105,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-2,1,0,0,16,0,16,0,
-112,-112,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-79,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,12,1,0,0,18,0,7,0,
80,75,0,0,0,0,0,0,60,0,0,0,0,0,0,0,
1,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,1,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-50,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,29,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-18,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-17,1,0,0,16,0,16,0,
16,-112,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-9,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,94,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
64,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,71,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-89,1,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-92,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
111,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,101,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-3,1,0,0,16,0,16,0,-112,-112,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,-27,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-97,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,77,1,0,0,18,0,7,0,
-56,75,0,0,0,0,0,0,-96,0,0,0,0,0,0,0,
16,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-34,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
116,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-29,1,0,0,16,0,16,0,
16,-112,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
-72,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,41,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
9,2,0,0,16,0,16,0,-112,-112,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,50,1,0,0,18,0,7,0,
-88,75,0,0,0,0,0,0,32,0,0,0,0,0,0,0,
23,1,0,0,18,0,7,0,-116,75,0,0,0,0,0,0,
28,0,0,0,0,0,0,0,-127,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-58,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,119,1,0,0,18,0,7,0,
108,76,0,0,0,0,0,0,8,0,0,0,0,0,0,0,
-113,1,0,0,18,0,7,0,116,76,0,0,0,0,0,0,
40,0,0,0,0,0,0,0,-36,1,0,0,16,0,15,0,
16,-112,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
17,2,0,0,16,0,16,0,-112,-112,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,98,1,0,0,18,0,7,0,
104,76,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
-65,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,-42,0,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
88,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,113,1,0,0,18,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,95,95,99,120,97,95,102,
105,110,97,108,105,122,101,0,95,95,99,120,97,95,97,116,
101,120,105,116,0,109,97,108,108,111,99,0,102,114,101,101,
0,116,105,109,101,0,95,95,115,116,97,99,107,95,99,104,
107,95,103,117,97,114,100,0,115,101,108,101,99,116,0,95,
95,115,116,97,99,107,95,99,104,107,95,102,97,105,108,0,
102,99,110,116,108,0,115,111,99,107,101,116,0,105,110,101,
116,95,97,100,100,114,0,98,105,110,100,0,103,101,116,116,
105,109,101,111,102,100,97,121,0,103,101,116,104,111,115,116,
98,121,110,97,109,101,0,99,111,110,110,101,99,116,0,95,
95,101,114,114,110,111,0,114,101,97,100,0,119,114,105,116,
101,0,115,116,114,99,112,121,0,109,101,109,99,112,121,0,
109,101,109,115,101,116,0,115,116,114,108,101,110,0,115,112,
114,105,110,116,102,0,116,111,108,111,119,101,114,0,116,111,
117,112,112,101,114,0,115,115,99,97,110,102,0,115,101,109,
95,105,110,105,116,0,115,101,109,95,119,97,105,116,0,115,
101,109,95,112,111,115,116,0,115,101,109,95,100,101,115,116,
114,111,121,0,74,78,73,95,79,110,76,111,97,100,0,74,
97,118,97,95,99,111,109,95,122,95,115,95,83,95,115,101,
116,86,116,105,109,101,111,117,116,0,74,97,118,97,95,99,
111,109,95,122,95,115,95,83,95,115,101,116,83,116,105,109,
101,111,117,116,0,74,97,118,97,95,99,111,109,95,122,95,
115,95,83,95,115,116,97,114,116,0,74,97,118,97,95,99,
111,109,95,122,95,115,95,83,95,99,108,111,115,101,0,74,
97,118,97,95,99,111,109,95,122,95,115,95,83,95,103,101,
116,86,99,111,100,101,0,74,97,118,97,95,99,111,109,95,
122,95,115,95,83,95,103,101,116,86,110,97,109,101,0,112,
105,112,101,0,108,105,98,108,111,103,46,115,111,0,108,105,
98,115,116,100,99,43,43,46,115,111,0,108,105,98,109,46,
115,111,0,108,105,98,99,46,115,111,0,108,105,98,100,108,
46,115,111,0,95,101,100,97,116,97,0,95,95,98,115,115,
95,115,116,97,114,116,0,95,95,98,115,115,95,115,116,97,
114,116,95,95,0,95,95,98,115,115,95,101,110,100,95,95,
0,95,95,101,110,100,95,95,0,95,101,110,100,0,108,105,
98,122,120,118,112,115,46,115,111,0,0,0,0,0,0,0,
-48,-116,1,0,0,0,0,0,3,4,0,0,0,0,0,0,
16,15,0,0,0,0,0,0,-16,-113,1,0,0,0,0,0,
3,4,0,0,0,0,0,0,112,-112,1,0,0,0,0,0,
-8,-113,1,0,0,0,0,0,3,4,0,0,0,0,0,0,
104,-112,1,0,0,0,0,0,-24,-113,1,0,0,0,0,0,
1,4,0,0,5,0,0,0,0,0,0,0,0,0,0,0,
-24,-114,1,0,0,0,0,0,2,4,0,0,3,0,0,0,
0,0,0,0,0,0,0,0,-16,-114,1,0,0,0,0,0,
2,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,
-8,-114,1,0,0,0,0,0,2,4,0,0,6,0,0,0,
0,0,0,0,0,0,0,0,0,-113,1,0,0,0,0,0,
2,4,0,0,8,0,0,0,0,0,0,0,0,0,0,0,
8,-113,1,0,0,0,0,0,2,4,0,0,10,0,0,0,
0,0,0,0,0,0,0,0,16,-113,1,0,0,0,0,0,
2,4,0,0,11,0,0,0,0,0,0,0,0,0,0,0,
24,-113,1,0,0,0,0,0,2,4,0,0,12,0,0,0,
0,0,0,0,0,0,0,0,32,-113,1,0,0,0,0,0,
2,4,0,0,13,0,0,0,0,0,0,0,0,0,0,0,
40,-113,1,0,0,0,0,0,2,4,0,0,14,0,0,0,
0,0,0,0,0,0,0,0,48,-113,1,0,0,0,0,0,
2,4,0,0,16,0,0,0,0,0,0,0,0,0,0,0,
56,-113,1,0,0,0,0,0,2,4,0,0,17,0,0,0,
0,0,0,0,0,0,0,0,64,-113,1,0,0,0,0,0,
2,4,0,0,18,0,0,0,0,0,0,0,0,0,0,0,
72,-113,1,0,0,0,0,0,2,4,0,0,19,0,0,0,
0,0,0,0,0,0,0,0,80,-113,1,0,0,0,0,0,
2,4,0,0,20,0,0,0,0,0,0,0,0,0,0,0,
88,-113,1,0,0,0,0,0,2,4,0,0,21,0,0,0,
0,0,0,0,0,0,0,0,96,-113,1,0,0,0,0,0,
2,4,0,0,22,0,0,0,0,0,0,0,0,0,0,0,
104,-113,1,0,0,0,0,0,2,4,0,0,23,0,0,0,
0,0,0,0,0,0,0,0,112,-113,1,0,0,0,0,0,
2,4,0,0,25,0,0,0,0,0,0,0,0,0,0,0,
120,-113,1,0,0,0,0,0,2,4,0,0,26,0,0,0,
0,0,0,0,0,0,0,0,-128,-113,1,0,0,0,0,0,
2,4,0,0,28,0,0,0,0,0,0,0,0,0,0,0,
-120,-113,1,0,0,0,0,0,2,4,0,0,29,0,0,0,
0,0,0,0,0,0,0,0,-112,-113,1,0,0,0,0,0,
2,4,0,0,30,0,0,0,0,0,0,0,0,0,0,0,
-104,-113,1,0,0,0,0,0,2,4,0,0,32,0,0,0,
0,0,0,0,0,0,0,0,-96,-113,1,0,0,0,0,0,
2,4,0,0,33,0,0,0,0,0,0,0,0,0,0,0,
-88,-113,1,0,0,0,0,0,2,4,0,0,37,0,0,0,
0,0,0,0,0,0,0,0,-80,-113,1,0,0,0,0,0,
2,4,0,0,38,0,0,0,0,0,0,0,0,0,0,0,
-72,-113,1,0,0,0,0,0,2,4,0,0,44,0,0,0,
0,0,0,0,0,0,0,0,-64,-113,1,0,0,0,0,0,
2,4,0,0,45,0,0,0,0,0,0,0,0,0,0,0,
-56,-113,1,0,0,0,0,0,2,4,0,0,46,0,0,0,
0,0,0,0,0,0,0,0,-48,-113,1,0,0,0,0,0,
2,4,0,0,47,0,0,0,0,0,0,0,0,0,0,0,
-40,-113,1,0,0,0,0,0,2,4,0,0,48,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-16,123,-65,-87,-48,0,0,-112,17,114,71,-7,16,-126,59,-111,
32,2,31,-42,31,32,3,-43,31,32,3,-43,31,32,3,-43,
-48,0,0,-112,17,118,71,-7,16,-94,59,-111,32,2,31,-42,
-48,0,0,-112,17,122,71,-7,16,-62,59,-111,32,2,31,-42,
-48,0,0,-112,17,126,71,-7,16,-30,59,-111,32,2,31,-42,
-48,0,0,-112,17,-126,71,-7,16,2,60,-111,32,2,31,-42,
-48,0,0,-112,17,-122,71,-7,16,34,60,-111,32,2,31,-42,
-48,0,0,-112,17,-118,71,-7,16,66,60,-111,32,2,31,-42,
-48,0,0,-112,17,-114,71,-7,16,98,60,-111,32,2,31,-42,
-48,0,0,-112,17,-110,71,-7,16,-126,60,-111,32,2,31,-42,
-48,0,0,-112,17,-106,71,-7,16,-94,60,-111,32,2,31,-42,
-48,0,0,-112,17,-102,71,-7,16,-62,60,-111,32,2,31,-42,
-48,0,0,-112,17,-98,71,-7,16,-30,60,-111,32,2,31,-42,
-48,0,0,-112,17,-94,71,-7,16,2,61,-111,32,2,31,-42,
-48,0,0,-112,17,-90,71,-7,16,34,61,-111,32,2,31,-42,
-48,0,0,-112,17,-86,71,-7,16,66,61,-111,32,2,31,-42,
-48,0,0,-112,17,-82,71,-7,16,98,61,-111,32,2,31,-42,
-48,0,0,-112,17,-78,71,-7,16,-126,61,-111,32,2,31,-42,
-48,0,0,-112,17,-74,71,-7,16,-94,61,-111,32,2,31,-42,
-48,0,0,-112,17,-70,71,-7,16,-62,61,-111,32,2,31,-42,
-48,0,0,-112,17,-66,71,-7,16,-30,61,-111,32,2,31,-42,
-48,0,0,-112,17,-62,71,-7,16,2,62,-111,32,2,31,-42,
-48,0,0,-112,17,-58,71,-7,16,34,62,-111,32,2,31,-42,
-48,0,0,-112,17,-54,71,-7,16,66,62,-111,32,2,31,-42,
-48,0,0,-112,17,-50,71,-7,16,98,62,-111,32,2,31,-42,
-48,0,0,-112,17,-46,71,-7,16,-126,62,-111,32,2,31,-42,
-48,0,0,-112,17,-42,71,-7,16,-94,62,-111,32,2,31,-42,
-48,0,0,-112,17,-38,71,-7,16,-62,62,-111,32,2,31,-42,
-48,0,0,-112,17,-34,71,-7,16,-30,62,-111,32,2,31,-42,
-48,0,0,-112,17,-30,71,-7,16,2,63,-111,32,2,31,-42,
-48,0,0,-112,17,-26,71,-7,16,34,63,-111,32,2,31,-42,
-48,0,0,-112,17,-22,71,-7,16,66,63,-111,32,2,31,-42,
-48,0,0,-112,17,-18,71,-7,16,98,63,-111,32,2,31,-42,
-64,0,0,-80,0,0,0,-111,-110,-1,-1,23,-3,123,-65,-87,
-3,3,0,-111,64,0,0,-76,0,0,63,-42,-3,123,-63,-88,
-64,3,95,-42,-31,3,0,-86,-62,0,0,-80,0,0,0,-112,
66,0,0,-111,0,112,60,-111,-62,-1,-1,23,-1,67,0,-47,
0,14,-128,-46,-2,3,0,-7,-114,-1,-1,-105,31,124,0,-87,
31,124,1,-87,31,124,2,-87,31,124,3,-87,31,124,4,-87,
31,124,5,-87,31,124,6,-87,-2,3,64,-7,-1,67,0,-111,
-64,3,95,-42,-33,-1,-1,23,-1,-125,0,-47,-13,123,0,-87,
-13,3,0,-86,0,0,-128,-46,-31,15,0,-7,-67,-1,-1,-105,
-31,15,64,-7,99,34,0,-111,98,6,64,-7,32,44,0,-7,
0,0,-128,82,65,4,0,-7,34,0,0,-7,35,4,0,-7,
97,6,0,-7,-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,
-1,67,1,-47,-11,91,1,-87,-9,99,2,-87,-7,107,3,-87,
-13,83,0,-87,-5,123,4,-87,21,32,0,-111,-9,3,5,-86,
19,8,64,-7,-10,3,3,-86,-65,0,0,-71,-5,3,1,-86,
127,0,0,-71,-65,2,19,-21,-6,3,2,-86,-7,3,4,-86,
56,0,-128,-46,-76,0,-128,82,65,4,0,84,43,0,0,20,
102,82,64,-71,31,0,20,106,-63,2,64,-71,-64,124,67,-109,
-58,20,0,18,0,-28,125,-110,6,35,-58,-102,33,4,0,17,
66,107,96,-8,70,0,6,-86,70,107,32,-8,-63,2,0,-71,
-128,1,0,84,96,82,64,-71,-30,2,64,-71,1,124,67,-109,
0,20,0,18,33,-28,125,-110,0,35,-64,-102,66,4,0,17,
35,107,97,-8,96,0,0,-86,32,107,33,-8,-30,2,0,-71,
97,82,64,-71,96,3,64,-71,115,6,64,-7,31,0,1,107,
0,-96,-127,26,-65,2,19,-21,96,3,0,-71,96,1,0,84,
98,34,64,-7,96,10,64,-7,97,82,64,-71,64,0,63,-42,
31,0,20,106,96,-5,15,55,-31,-4,-1,84,115,6,64,-7,
-65,2,19,-21,-31,-2,-1,84,-13,83,64,-87,-11,91,65,-87,
-9,99,66,-87,-7,107,67,-87,-5,123,68,-87,-1,67,1,-111,
-64,3,95,-42,-1,3,1,-47,-11,91,1,-87,-9,99,2,-87,
-13,83,0,-87,-2,27,0,-7,22,32,0,-111,-11,3,0,-86,
-9,3,1,-86,19,8,64,-7,-8,3,2,-86,127,2,22,-21,
-12,3,19,-86,0,6,0,84,115,6,64,-7,127,2,22,-21,
-96,5,0,84,127,2,20,-21,-128,-1,-1,84,99,82,64,-71,
101,20,0,18,99,124,64,-109,99,-4,70,-45,4,123,99,-8,
-124,36,-59,-102,4,2,0,54,96,86,64,-71,-64,9,0,54,
96,14,64,-7,-128,1,0,-76,0,0,-128,-46,77,-1,-1,-105,
98,14,64,-7,96,46,0,-7,97,82,64,-71,96,10,64,-7,
64,0,63,-42,99,82,64,-71,101,20,0,18,99,124,64,-109,
99,-4,70,-45,-29,122,99,-8,99,36,-59,-102,-61,1,0,54,
96,86,64,-71,-128,1,8,54,96,18,64,-7,64,1,0,-76,
0,0,-128,-46,59,-1,-1,-105,96,46,0,-7,100,18,64,-7,
97,82,64,-71,96,10,64,-7,-94,14,64,-7,-93,34,64,-71,
-128,0,63,-42,115,6,64,-7,-76,10,64,-7,127,2,22,-21,
-95,-6,-1,84,-128,82,64,-71,2,20,0,18,0,124,64,-109,
0,-4,70,-45,1,123,96,-8,33,36,-62,-102,1,2,0,54,
-127,86,64,-71,97,5,0,54,-127,14,64,-7,-127,1,0,-76,
0,0,-128,-46,35,-1,-1,-105,-126,14,64,-7,-128,46,0,-7,
-127,82,64,-71,-128,10,64,-7,64,0,63,-42,-128,82,64,-71,
2,20,0,18,0,124,64,-109,0,-4,70,-45,-32,122,96,-8,
0,36,-62,-102,-64,1,0,54,-128,86,64,-71,-128,1,8,54,
-128,18,64,-7,64,1,0,-76,0,0,-128,-46,17,-1,-1,-105,
-128,46,0,-7,-124,18,64,-7,-127,82,64,-71,-128,10,64,-7,
-94,14,64,-7,-93,34,64,-71,-128,0,63,-42,-13,83,64,-87,
-11,91,65,-87,-9,99,66,-87,-2,27,64,-7,-1,3,1,-111,
-64,3,95,-42,0,-8,23,54,96,22,64,-7,-64,-9,-1,-76,
0,0,-128,-46,-1,-2,-1,-105,98,22,64,-7,-78,-1,-1,23,
97,-4,23,54,-127,22,64,-7,33,-4,-1,-76,0,0,-128,-46,
-8,-2,-1,-105,-126,22,64,-7,-43,-1,-1,23,-1,-125,0,-47,
-13,83,0,-87,-2,11,0,-7,19,32,0,-111,1,8,64,-7,
63,0,19,-21,-95,0,0,84,21,0,0,20,33,4,64,-7,
63,0,19,-21,64,2,0,84,32,104,64,-71,31,4,0,113,
97,-1,-1,84,34,0,64,-7,32,4,64,-7,35,28,64,-7,
64,4,0,-7,2,0,0,-7,52,0,64,-7,-125,1,0,-76,
32,8,64,-7,33,80,64,-71,96,0,63,-42,-31,3,20,-86,
33,4,64,-7,63,0,19,-21,1,-2,-1,84,-13,83,64,-87,
-2,11,64,-7,-1,-125,0,-111,-64,3,95,-42,-31,3,20,-86,
-25,-1,-1,23,1,8,64,-7,2,32,0,-111,0,0,-128,82,
63,0,2,-21,-96,0,0,84,33,4,64,-7,0,4,0,17,
63,0,2,-21,-95,-1,-1,84,-64,3,95,-42,1,32,0,-111,
0,8,64,-7,31,0,1,-21,-32,23,-97,26,-64,3,95,-42,
-1,-61,5,-47,-11,91,1,-87,-74,0,0,-16,-11,51,1,-111,
-13,83,0,-87,-9,99,2,-87,-58,-10,71,-7,-12,-93,1,-111,
-7,123,3,-87,-13,-93,3,-111,-9,67,1,-111,-58,0,64,-7,
-8,83,1,-111,-28,3,19,-86,-31,3,21,-86,-26,-73,0,-7,
-30,3,20,-86,6,0,-128,18,-29,3,24,-86,-27,3,23,-86,
-7,3,0,-86,-1,83,0,-71,-97,126,0,-87,-26,79,0,-71,
-97,126,1,-87,-1,87,0,-71,-97,126,2,-87,-97,126,3,-87,
-97,126,4,-87,-97,126,5,-87,-97,126,6,-87,-97,126,7,-87,
127,126,0,-87,127,126,1,-87,127,126,2,-87,127,126,3,-87,
127,126,4,-87,127,126,5,-87,127,126,6,-87,127,126,7,-87,
-20,-2,-1,-105,-1,47,0,-7,-28,99,1,-111,-96,2,64,-71,
1,-44,-112,-46,33,0,-96,-14,31,4,0,49,-127,4,0,-7,
0,2,0,84,1,3,64,-71,3,0,-128,-46,-30,2,64,-71,
0,4,0,17,63,0,31,107,-127,18,-125,-102,95,0,31,107,
98,18,-125,-102,91,-2,-1,-105,31,0,31,107,-83,0,0,84,
-32,3,25,-86,-31,3,20,-86,-30,3,19,-86,26,-1,-1,-105,
-42,-10,71,-7,-31,-73,64,-7,-64,2,64,-7,63,0,0,-21,
-31,0,0,84,-13,83,64,-87,-11,91,65,-87,-9,99,66,-87,
-7,123,67,-87,-1,-61,5,-111,-64,3,95,-42,77,-2,-1,-105,
-1,-125,0,-47,-13,83,0,-87,-13,3,0,-86,0,0,-128,-46,
-11,123,1,-87,116,34,0,-111,114,-2,-1,-105,115,10,64,-7,
-11,3,0,-86,127,2,20,-21,32,2,0,84,98,50,64,-7,
95,0,31,-21,109,1,0,84,97,46,64,-7,-95,2,1,-53,
95,0,1,-21,-22,0,0,84,98,26,64,-7,117,46,0,-7,
-126,0,0,-76,96,10,64,-7,97,82,64,-71,64,0,63,-42,
115,6,64,-7,127,2,20,-21,33,-2,-1,84,-13,83,64,-87,
-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,-1,-125,0,-47,
-13,83,0,-87,-2,11,0,-7,20,32,0,-111,19,8,64,-7,
127,2,20,-21,32,1,0,84,98,38,64,-7,-126,0,0,-76,
96,10,64,-7,97,82,64,-71,64,0,63,-42,115,6,64,-7,
127,2,20,-21,33,-1,-1,84,-13,83,64,-87,-2,11,64,-7,
-1,-125,0,-111,-64,3,95,-42,-1,-61,0,-47,-13,83,0,-87,
-11,91,1,-87,-2,19,0,-7,-10,3,1,-86,-13,3,0,-86,
20,32,0,-111,-75,0,0,-16,33,2,0,-76,46,0,0,20,
60,-2,-1,-105,-29,3,0,-86,-94,-2,71,-7,-32,3,19,-86,
68,0,64,-7,127,0,4,-21,73,0,0,84,67,0,0,-7,
-37,-1,-1,-105,-32,3,19,-86,110,-1,-1,-105,-32,3,19,-86,
-72,-1,-1,-105,-32,3,19,-86,57,-1,-1,-105,98,2,64,-71,
0,0,-128,-46,-126,0,0,53,98,10,64,-7,95,0,20,-21,
-127,-3,-1,84,-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,
-1,-61,0,-111,-64,3,95,-42,34,-2,-1,-105,-29,3,0,-86,
-94,-2,71,-7,-32,3,19,-86,68,0,64,-7,127,0,4,-21,
73,0,0,84,67,0,0,-7,-63,-1,-1,-105,-32,3,19,-86,
84,-1,-1,-105,-32,3,19,-86,-98,-1,-1,-105,-32,3,19,-86,
31,-1,-1,-105,0,0,-128,-46,18,-2,-1,-105,-33,2,0,-21,
45,-3,-1,84,98,2,64,-71,0,0,-128,-46,-62,-4,-1,53,
98,10,64,-7,95,0,20,-21,1,-3,-1,84,-13,83,64,-87,
-11,91,65,-87,-2,19,64,-7,-1,-61,0,-111,-64,3,95,-42,
33,0,-128,82,1,0,0,-71,-64,3,95,-42,-1,67,0,-47,
-13,123,0,-87,64,1,0,-76,-13,3,0,-86,0,20,64,-7,
64,0,0,-76,98,3,0,-108,96,14,64,-7,64,0,0,-76,
20,-2,-1,-105,-32,3,19,-86,18,-2,-1,-105,0,0,-128,82,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,-1,-125,0,-47,
-13,83,0,-87,-12,3,0,-86,0,6,-128,-46,-2,11,0,-7,
-84,-3,-1,-105,-13,3,0,-86,-64,2,0,-76,1,32,0,-111,
31,124,0,-87,1,4,0,-7,31,124,2,-87,31,124,1,-87,
33,4,0,-7,32,0,-96,-46,33,0,-96,82,97,34,0,-71,
-96,-3,-1,-105,96,14,0,-7,-128,1,0,-76,45,3,0,-108,
96,22,0,-7,32,1,0,-76,-109,2,0,-7,0,0,-128,82,
-13,83,64,-87,-2,11,64,-7,-1,-125,0,-111,-64,3,95,-42,
0,0,-128,18,-5,-1,-1,23,-32,3,19,-86,-48,-1,-1,-105,
0,0,-128,18,-9,-1,-1,23,-26,-3,-1,23,-127,0,-128,82,
2,0,-127,82,-33,-3,-1,23,-1,-125,1,-47,33,0,-128,82,
2,0,-128,82,-13,83,0,-87,-77,0,0,-16,-2,19,0,-7,
-11,91,1,-87,-10,3,0,-86,64,0,-128,82,99,-10,71,-7,
99,0,64,-7,-29,47,0,-7,-118,-3,-1,-105,-12,3,0,42,
-12,4,-8,55,-63,0,0,-112,32,64,0,-111,33,16,64,-71,
-95,2,0,53,-32,3,20,42,-127,0,-128,82,2,0,-127,82,
-56,-3,-1,-105,31,4,0,49,-11,3,0,42,-64,3,0,84,
-44,2,0,-71,21,0,-128,82,115,-10,71,-7,-32,3,21,42,
-30,47,64,-7,97,2,64,-7,95,0,1,-21,33,3,0,84,
-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,-1,-125,1,-111,
-64,3,95,-42,-31,35,1,-111,66,0,-128,82,0,64,0,-111,
-31,31,0,-7,63,124,0,-87,-30,-109,0,121,-127,-3,-1,-105,
-32,79,0,-71,-31,31,64,-7,2,2,-128,82,-32,3,20,42,
-1,-105,0,121,119,-3,-1,-105,-33,-1,-1,23,21,0,-128,18,
-26,-1,-1,23,-32,3,20,42,-86,-3,-1,-105,-29,-1,-1,23,
100,-3,-1,-105,-1,3,2,-47,-13,83,0,-87,-77,0,0,-16,
-9,123,2,-87,-11,91,1,-87,100,-10,71,-7,-9,3,1,42,
-124,0,64,-7,-28,63,0,-7,2,6,0,-76,127,0,31,107,
-12,23,-97,26,-76,5,0,53,1,0,-128,-46,-32,35,1,-111,
-29,31,0,-7,-11,99,1,-111,-30,27,0,-7,117,-3,-1,-105,
-30,27,64,-7,-65,126,0,-87,-32,3,2,-86,125,-3,-1,-105,
-10,3,0,-86,1,0,-128,-46,-32,-93,1,-111,109,-3,-1,-105,
-42,3,0,-76,64,0,-128,82,-29,31,64,-7,-32,-77,0,121,
99,4,-64,-38,-60,14,64,-7,-32,3,23,42,-29,-73,0,121,
-31,3,21,-86,2,2,-128,82,-125,0,64,-7,99,0,64,-71,
-29,95,0,-71,15,-3,-1,-105,-128,1,-8,55,115,-10,71,-7,
-32,3,20,42,-30,63,64,-7,97,2,64,-7,95,0,1,-21,
-127,1,0,84,-13,83,64,-87,-11,91,65,-87,-9,123,66,-87,
-1,3,2,-111,-64,3,95,-42,6,-3,-1,-105,0,0,64,-71,
31,-52,1,113,64,-2,-1,84,20,0,-128,18,-16,-1,-1,23,
40,-3,-1,-105,-1,3,1,-47,-27,3,2,-86,-13,83,0,-87,
-77,0,0,-16,-2,11,0,-7,98,-10,71,-7,66,0,64,-7,
-30,31,0,-7,5,4,0,-76,127,0,31,107,-28,23,-97,26,
-92,3,0,53,-26,-93,0,-111,64,0,-128,82,-33,124,0,-87,
-32,83,0,121,99,4,-64,-38,-91,4,64,-71,-32,3,1,42,
2,2,-128,82,-31,3,6,-86,-29,87,0,121,-12,3,4,42,
-27,47,0,-71,-29,-4,-1,-105,96,1,-8,55,115,-10,71,-7,
-32,3,20,42,-30,31,64,-7,97,2,64,-7,95,0,1,-21,
97,1,0,84,-13,83,64,-87,-2,11,64,-7,-1,3,1,-111,
-64,3,95,-42,-37,-4,-1,-105,0,0,64,-71,31,-52,1,113,
96,-2,-1,84,20,0,-128,18,-15,-1,-1,23,-3,-4,-1,-105,
-1,67,0,-47,66,124,64,-109,-2,3,0,-7,17,-3,-1,-105,
-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,-1,67,0,-47,
66,124,64,-109,-2,3,0,-7,-6,-4,-1,-105,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,-62,0,0,-112,-31,3,0,-86,
64,64,0,-111,35,0,-128,82,0,64,0,-111,67,16,0,-71,
-72,-4,-1,23,-1,3,1,-47,-13,83,0,-87,-13,3,0,-86,
-32,3,1,42,-11,91,1,-87,-9,99,2,-87,-2,27,0,-7,
-12,3,1,42,-53,-4,-1,-105,-11,3,0,-86,0,2,0,-76,
118,2,64,-7,-106,2,0,-76,119,14,64,-71,-31,3,22,-86,
-8,3,23,42,-30,3,24,-86,-78,-4,-1,-105,-96,2,24,-117,
1,0,-128,82,-126,2,23,75,-6,-4,-1,-105,-32,3,22,-86,
24,-3,-1,-105,117,2,0,-7,116,10,0,-71,-13,83,64,-87,
-11,91,65,-87,-9,99,66,-87,-2,27,64,-7,-1,3,1,-111,
-64,3,95,-42,98,14,64,-71,-31,3,22,42,0,64,34,-117,
-126,2,2,75,-21,-4,-1,-105,-13,-1,-1,23,-1,67,0,-47,
-13,123,0,-87,-13,3,0,-86,0,0,64,-7,64,0,0,-76,
4,-3,-1,-105,-32,3,19,-86,-13,123,64,-87,-1,67,0,-111,
0,-3,-1,23,0,12,64,-71,33,0,0,11,63,-4,15,113,
40,1,0,84,63,-4,1,113,-120,0,0,84,33,104,27,18,
32,-128,0,17,-64,3,95,-42,33,96,25,18,32,0,2,17,
-64,3,95,-42,33,84,22,18,32,0,16,17,-64,3,95,-42,
2,8,64,-71,95,0,1,107,67,0,0,84,-64,3,95,-42,
-67,-1,-1,23,-1,-125,0,-47,-13,83,0,-87,-12,3,0,42,
0,2,-128,-46,-2,11,0,-7,-118,-4,-1,-105,0,3,0,-76,
31,124,0,-87,-13,3,0,-86,1,8,64,-71,-97,2,1,107,
-56,0,0,84,-32,3,19,-86,-2,11,64,-7,-13,83,64,-87,
-1,-125,0,-111,-64,3,95,-42,-31,3,20,42,-86,-1,-1,-105,
96,10,64,-71,-97,2,0,107,-23,-2,-1,84,-32,3,19,-86,
19,0,-128,-46,-45,-4,-1,-105,-32,3,19,-86,-2,11,64,-7,
-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,-13,3,0,-86,
-19,-1,-1,23,0,4,-128,82,-33,-1,-1,23,-128,0,0,-76,
1,8,64,-71,65,0,0,52,-67,-1,-1,23,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-11,123,1,-87,-32,1,0,-76,
-13,3,0,-86,0,12,64,-71,-11,3,1,-86,-12,3,2,42,
66,0,0,11,97,10,64,-71,63,0,2,107,-120,2,0,84,
95,-4,15,113,-23,3,0,84,66,84,22,18,66,0,16,17,
63,0,2,107,-61,0,0,84,0,0,-128,18,-13,83,64,-87,
-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,-31,3,2,42,
-32,3,19,-86,124,-1,-1,-105,96,14,64,-71,98,10,64,-71,
-127,2,0,11,95,0,1,107,-119,-2,-1,84,99,2,64,-7,
-31,3,21,-86,-30,3,20,42,96,64,32,-117,53,-4,-1,-105,
98,14,64,-71,0,0,-128,82,84,0,20,11,116,14,0,-71,
-13,83,64,-87,-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,
95,-4,1,113,-119,0,0,84,66,96,25,18,66,0,2,17,
-32,-1,-1,23,66,104,27,18,66,-128,0,17,-35,-1,-1,23,
-1,-125,0,-47,-11,123,1,-87,-11,3,0,-86,32,4,0,17,
-13,83,0,-87,-12,3,1,42,-97,-1,-1,-105,-13,3,0,-86,
0,1,0,-76,-31,3,21,-86,-30,3,20,42,-63,-1,-1,-105,
-31,3,19,-86,-128,0,0,52,96,10,64,-71,-32,0,0,53,
1,0,-128,-46,-32,3,1,-86,-13,83,64,-87,-11,123,65,-87,
-1,-125,0,-111,-64,3,95,-42,-32,3,19,-86,112,-1,-1,-105,
-8,-1,-1,23,-1,-125,0,-47,-13,83,0,-87,-2,11,0,-7,
-64,1,0,-76,-13,3,0,-86,0,12,64,-71,0,4,0,17,
-123,-1,-1,-105,-12,3,0,-86,0,1,0,-76,97,2,64,-7,
98,14,64,-71,-89,-1,-1,-105,-31,3,20,-86,-128,0,0,52,
-128,10,64,-71,-32,0,0,53,1,0,-128,-46,-32,3,1,-86,
-2,11,64,-7,-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,
-32,3,20,-86,86,-1,-1,-105,-8,-1,-1,23,-1,-125,0,-47,
-13,123,0,-87,-13,3,0,-86,-32,3,1,-86,-31,15,0,-7,
72,-4,-1,-105,-30,3,0,-86,-31,15,64,-7,-32,3,19,-86,
-13,123,64,-87,-1,-125,0,-111,-114,-1,-1,23,-1,-125,0,-47,
-13,83,0,-87,-2,11,0,-7,-12,3,0,-86,61,-4,-1,-105,
0,4,0,17,96,-1,-1,-105,-13,3,0,-86,-32,0,0,-76,
-31,3,20,-86,-22,-1,-1,-105,-31,3,19,-86,-128,0,0,52,
96,10,64,-71,-32,0,0,53,1,0,-128,-46,-32,3,1,-86,
-2,11,64,-7,-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,
-32,3,19,-86,50,-1,-1,-105,-8,-1,-1,23,-1,3,1,-47,
-30,3,1,42,33,0,0,-112,33,-64,50,-111,-13,83,0,-87,
-76,0,0,-16,-13,-93,0,-111,-11,123,1,-87,-11,3,0,-86,
-32,3,19,-86,-108,-10,71,-7,127,126,0,-87,-125,2,64,-7,
-29,31,0,-7,23,-4,-1,-105,-32,3,19,-86,25,-4,-1,-105,
-30,3,0,-86,-31,3,19,-86,-32,3,21,-86,97,-1,-1,-105,
-30,31,64,-7,-127,2,64,-7,95,0,1,-21,-95,0,0,84,
-13,83,64,-87,-11,123,65,-87,-1,3,1,-111,-64,3,95,-42,
-44,-5,-1,-105,-1,3,1,-47,-30,3,1,42,33,0,0,-112,
33,-32,50,-111,-13,83,0,-87,-76,0,0,-16,-13,-93,0,-111,
-11,123,1,-87,-11,3,0,-86,-32,3,19,-86,-108,-10,71,-7,
127,126,0,-87,-125,2,64,-7,-29,31,0,-7,-7,-5,-1,-105,
-32,3,19,-86,-5,-5,-1,-105,-30,3,0,-86,-31,3,19,-86,
-32,3,21,-86,67,-1,-1,-105,-30,31,64,-7,-127,2,64,-7,
95,0,1,-21,-95,0,0,84,-13,83,64,-87,-11,123,65,-87,
-1,3,1,-111,-64,3,95,-42,-74,-5,-1,-105,-30,3,1,-86,
-96,0,0,-76,-127,0,0,-76,33,0,64,-7,66,12,64,-71,
52,-1,-1,23,0,0,-128,18,-64,3,95,-42,-1,-125,0,-47,
-13,83,0,-87,-2,11,0,-7,64,2,0,-76,-13,3,0,-86,
0,0,64,-7,96,0,0,-76,-18,-5,-1,-105,127,126,0,-87,
96,10,64,-71,20,0,-128,82,31,124,0,113,-120,0,0,84,
-32,3,19,-86,1,4,-128,82,-73,-2,-1,-105,-32,3,20,42,
-2,11,64,-7,-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,
20,0,-128,18,-6,-1,-1,23,-1,-125,0,-47,-13,83,0,-87,
-2,11,0,-7,32,1,0,-76,1,0,64,-7,97,1,0,-76,
-13,3,0,-86,-32,3,1,-86,52,0,64,-7,-43,-5,-1,-105,
-32,3,20,-86,127,2,0,-7,-13,83,64,-87,-2,11,64,-7,
-1,-125,0,-111,-64,3,95,-42,-32,3,1,-86,-5,-1,-1,23,
64,0,0,-76,0,0,64,-7,-64,3,95,-42,96,0,0,-76,
0,12,64,-71,-64,3,95,-42,0,0,-128,18,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-11,123,1,-87,32,2,0,-76
};
}
\ No newline at end of file
package com.vps.library;
public class b1{
public static byte []b1 = {
21,12,64,-71,19,0,-128,-46,20,0,64,-7,-65,2,31,107,
-19,0,0,84,-128,106,115,56,90,-5,-1,-105,-128,106,51,56,
115,6,0,-111,-65,2,19,107,108,-1,-1,84,0,0,-128,82,
-13,83,64,-87,-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,
0,0,-128,18,-5,-1,-1,23,-1,-125,0,-47,-13,83,0,-87,
-11,123,1,-87,32,2,0,-76,21,12,64,-71,19,0,-128,-46,
20,0,64,-7,-65,2,31,107,-19,0,0,84,-128,106,115,56,
-104,-5,-1,-105,-128,106,51,56,115,6,0,-111,-65,2,19,107,
108,-1,-1,84,0,0,-128,82,-13,83,64,-87,-11,123,65,-87,
-1,-125,0,-111,-64,3,95,-42,0,0,-128,18,-5,-1,-1,23,
31,0,31,-21,-27,23,-97,26,95,0,31,-21,-28,23,-97,26,
-92,0,4,42,-92,2,0,53,127,0,1,107,104,2,0,84,
-25,3,0,-86,33,2,0,52,-24,0,0,-53,4,0,-128,-46,
3,0,0,20,127,0,4,107,-64,1,0,84,-26,104,100,56,
69,104,100,56,-124,4,0,-111,-33,0,5,107,64,-1,-1,84,
63,4,0,113,-96,0,0,84,33,4,0,81,-25,4,0,-111,
127,0,1,107,41,-2,-1,84,0,0,-128,-46,-64,3,95,-42,
0,0,8,-117,-64,3,95,-42,-1,3,1,-47,-13,83,0,-87,
-11,91,1,-87,-2,19,0,-7,-32,3,0,-76,21,12,64,-71,
20,0,-128,18,-65,2,2,107,-24,0,0,84,-32,3,20,42,
-2,19,64,-7,-13,83,64,-87,-11,91,65,-87,-1,3,1,-111,
-64,3,95,-42,-29,3,0,-86,-32,3,1,-86,-13,3,2,42,
-31,31,0,-7,118,0,64,-7,86,-5,-1,-105,-30,31,64,-7,
-95,2,19,75,-29,3,0,42,-64,66,51,-117,-55,-1,-1,-105,
22,0,22,75,31,0,31,-21,-2,19,64,-7,-44,18,-108,26,
-32,3,20,42,-13,83,64,-87,-11,91,65,-87,-1,3,1,-111,
-64,3,95,-42,20,0,-128,18,-2,19,64,-7,-32,3,20,42,
-13,83,64,-87,-11,91,65,-87,-1,3,1,-111,-64,3,95,-42,
-1,-61,0,-47,-13,83,0,-87,-2,11,0,-7,-31,-65,0,57,
32,3,0,-76,1,12,64,-71,19,0,-128,18,63,0,2,107,
-56,0,0,84,-32,3,19,42,-2,11,64,-7,-13,83,64,-87,
-1,-61,0,-111,-64,3,95,-42,-27,3,2,42,33,0,2,75,
20,0,64,-7,-30,-65,0,-111,35,0,-128,82,-128,66,37,-117,
-92,-1,-1,-105,20,0,20,75,31,0,31,-21,-2,11,64,-7,
-109,18,-109,26,-32,3,19,42,-13,83,64,-87,-1,-61,0,-111,
-64,3,95,-42,19,0,-128,18,-2,11,64,-7,-32,3,19,42,
-13,83,64,-87,-1,-61,0,-111,-64,3,95,-42,-1,3,1,-47,
-13,83,0,-87,-2,11,0,-7,-12,3,0,-86,0,3,0,-76,
3,12,64,-71,127,0,1,107,-93,2,0,84,68,0,1,11,
0,4,-128,82,127,0,4,107,99,0,1,75,98,48,-126,26,
-31,31,0,-7,-30,27,0,-7,-30,23,0,-7,50,-2,-1,-105,
-13,3,0,-86,64,1,0,-76,-125,2,64,-7,-30,27,64,-7,
-31,31,64,-7,97,64,33,-117,82,-2,-1,-105,-31,3,19,-86,
-128,0,0,52,96,10,64,-71,-32,0,0,53,1,0,-128,-46,
-32,3,1,-86,-2,11,64,-7,-13,83,64,-87,-1,3,1,-111,
-64,3,95,-42,-32,3,19,-86,1,-2,-1,-105,1,0,-128,-46,
-8,-1,-1,23,-64,0,0,-76,4,12,64,-71,-126,0,1,75,
63,0,4,107,66,-112,-97,26,-43,-1,-1,23,-64,3,95,-42,
-30,3,0,-86,32,2,0,-76,63,0,31,-21,-32,23,-97,26,
-64,1,0,53,40,0,64,-7,39,12,64,-71,38,8,64,-71,
69,0,64,-7,68,12,64,-71,67,8,64,-71,72,0,0,-7,
71,12,0,-71,70,8,0,-71,37,0,0,-7,36,12,0,-71,
35,8,0,-71,-64,3,95,-42,0,0,-128,18,-64,3,95,-42,
-1,67,0,-47,-2,3,0,-7,64,3,0,-76,5,12,64,-71,
5,3,0,52,0,0,64,-7,3,0,64,57,99,-64,0,81,
127,36,0,113,104,2,0,84,-91,4,0,81,-28,3,0,-86,
5,0,5,-117,5,0,0,20,-125,28,64,56,99,-64,0,81,
127,36,0,113,104,1,0,84,-97,0,5,-21,97,-1,-1,84,
-30,3,1,-86,1,0,0,-16,33,-64,50,-111,-83,-6,-1,-105,
0,0,-128,82,-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,
0,0,-128,18,-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,
-1,67,0,-47,0,2,-128,-46,-13,123,0,-87,109,-6,-1,-105,
-13,3,0,-86,64,1,0,-76,1,0,-128,82,-30,3,1,42,
-112,-6,-1,-105,31,4,0,49,-32,3,19,-86,-32,0,0,84,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,-13,123,64,-87,
-1,67,0,-111,-64,3,95,-42,-70,-6,-1,-105,0,0,-128,-46,
-8,-1,-1,23,95,-6,-1,23,98,-6,-1,23,-1,67,0,-47,
-13,123,0,-87,-13,3,0,-86,78,-6,-1,-105,31,4,0,49,
-128,0,0,84,-32,3,19,-86,-82,-6,-1,-105,0,0,-128,82,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,1,20,64,-7,
-30,0,-128,-46,32,84,64,-71,34,48,0,-7,0,120,31,18,
0,0,31,50,32,84,0,-71,-64,3,95,-42,0,20,64,-7,
0,84,64,-71,-64,3,95,-42,0,-120,64,-71,-64,3,95,-42,
-1,67,0,-47,-29,3,1,42,-31,3,2,42,-30,3,3,42,
-2,3,0,-7,0,60,64,-7,-85,13,0,-108,0,0,-128,82,
-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,-1,-125,0,-47,
-95,0,0,-48,-13,83,0,-87,-2,11,0,-7,-13,3,0,-86,
33,-4,71,-7,0,60,64,-7,52,0,64,-7,-41,13,0,-108,
96,-118,0,-71,97,58,64,-7,-97,2,1,-21,73,0,0,84,
116,58,0,-7,96,74,64,-7,-97,2,0,-21,-87,1,0,84,
96,54,64,-7,-31,3,20,-86,116,74,0,-7,50,13,0,-108,
96,62,64,-7,-55,13,0,-108,96,-118,0,-71,98,-126,64,-71,
1,0,-124,82,-63,9,-96,114,98,-122,0,-71,97,-126,0,-71,
-13,83,64,-87,-2,11,64,-7,-1,-125,0,-111,-64,3,95,-42,
-1,67,0,-47,-13,123,0,-87,1,20,64,-7,33,84,64,-71,
65,2,0,55,1,88,64,-71,-127,0,0,53,-13,123,64,-87,
-1,67,0,-111,-64,3,95,-42,-13,3,0,-86,0,0,-128,-46,
72,-6,-1,-105,97,94,64,-71,98,90,-128,-71,0,0,1,-53,
31,0,2,-21,-51,-2,-1,84,96,18,64,-7,-13,123,64,-87,
-1,67,0,-111,59,-4,-1,23,-13,123,64,-87,0,16,64,-7,
-1,67,0,-111,55,-4,-1,23,-95,0,0,-16,32,8,0,-71,
-64,3,95,-42,-95,0,0,-16,32,32,0,-7,-64,3,95,-42,
26,-3,-1,23,0,0,-128,82,-64,3,95,-42,0,0,-128,82,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
68,0,0,52,67,1,0,-75,98,22,64,-7,65,84,64,-71,
32,0,30,18,1,2,16,55,33,0,30,50,65,84,0,-71,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,0,28,64,-7,
-31,3,3,-86,-30,3,4,42,118,-3,-1,-105,31,4,0,49,
0,-1,-1,84,98,22,64,-7,65,84,64,-71,32,0,30,18,
65,-2,23,54,0,0,-128,82,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,-1,67,1,-47,-124,124,64,-109,-11,91,1,-87,
-9,99,2,-87,-7,107,3,-87,-13,83,0,-87,-2,35,0,-7,
-13,3,4,-86,-6,3,0,-86,-7,3,1,42,-8,3,2,42,
-9,3,3,-86,-10,3,4,-86,-11,-1,-97,82,3,0,0,20,
-64,1,0,84,100,126,64,-109,127,2,21,107,-61,2,4,-53,
116,-46,-107,26,-32,3,26,-86,-31,3,25,42,-30,3,24,42,
-29,2,3,-117,-28,3,20,42,-53,-1,-1,-105,115,2,20,107,
-128,-2,-1,52,0,0,-128,18,-13,83,64,-87,-11,91,65,-87,
-9,99,66,-87,-7,107,67,-87,-2,35,64,-7,-1,67,1,-111,
-64,3,95,-42,-1,-125,1,-47,-9,99,2,-87,-13,83,0,-87,
-7,107,3,-87,-5,115,4,-87,-11,91,1,-87,-2,43,0,-7,
-6,3,0,-86,-9,3,1,42,-8,3,2,42,-5,3,3,-86,
-12,3,4,42,5,6,0,53,-11,-1,-97,82,-100,124,64,-109,
6,0,0,20,64,63,64,-7,-32,12,0,-108,64,3,0,53,
-108,2,19,107,-64,4,0,84,-97,2,21,107,-31,3,23,42,
-109,-46,-107,26,-30,3,24,42,3,0,-128,-46,-28,3,19,42,
118,126,64,-109,-109,-2,-1,52,-32,3,22,-86,-111,-7,-1,-105,
-7,3,0,-86,-127,-61,52,-53,-30,3,22,-86,97,3,1,-117,
32,1,0,-76,123,-7,-1,-105,64,63,64,-7,-31,3,23,42,
-30,3,24,42,-29,3,25,-86,-28,3,19,42,-57,12,0,-108,
0,-3,-1,52,0,0,-128,18,66,23,64,-7,65,84,64,-71,
97,0,16,55,33,0,30,50,65,84,0,-71,-13,83,64,-87,
-11,91,65,-87,-9,99,66,-87,-7,107,67,-87,-5,115,68,-87,
-2,43,64,-7,-1,-125,1,-111,-64,3,95,-42,-32,3,20,42,
-14,-1,-1,23,-13,83,64,-87,-11,91,65,-87,-9,99,66,-87,
-7,107,67,-87,-5,115,68,-87,-2,43,64,-7,-1,-125,1,-111,
-103,-1,-1,23,-1,-125,0,-47,-13,123,0,-87,-13,3,0,-86,
-32,3,1,-86,36,0,64,-7,35,4,64,-7,34,16,64,-71,
33,32,64,-7,-125,4,0,-7,100,0,0,-7,-30,15,0,-7,
32,0,63,-42,3,0,-128,-46,-30,15,64,-7,-32,3,19,-86,
65,12,-128,82,-28,3,3,42,-27,3,3,42,-86,-1,-1,-105,
0,0,-128,82,-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,
-1,-61,0,-47,-31,3,2,-86,-13,83,0,-87,-11,91,1,-87,
-2,19,0,-7,-13,3,0,-86,-11,3,2,-86,-30,3,3,42,
0,16,64,-71,99,-4,-1,-105,-12,3,0,42,0,0,-128,-46,
118,54,64,-7,-121,-7,-1,-105,-31,3,0,-86,-30,3,20,42,
-32,3,22,-86,-13,11,0,-108,96,26,64,-7,-31,3,21,-86,
-30,3,20,42,-41,-4,-1,-105,3,0,-128,-46,-32,3,19,-86,
33,28,-128,82,2,0,-128,82,-28,3,3,42,102,-1,-1,-105,
-6,-1,-1,23,-1,-125,0,-47,-13,123,0,-87,-29,15,0,-7,
-28,11,0,-7,-60,-4,-1,-105,-13,3,0,-86,-96,0,0,-76,
-28,11,64,-7,100,0,0,52,-29,15,64,-7,-93,0,0,-75,
-32,3,19,-86,-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,
-31,3,3,-86,-30,3,4,42,-66,-4,-1,-105,31,4,0,49,
-32,3,19,-86,1,-1,-1,84,-75,-4,-1,-105,0,0,-128,-46,
-11,-1,-1,23,-1,-61,0,-47,-13,83,0,-87,-11,123,1,-87,
-13,3,0,-86,0,28,64,-7,-83,-3,-1,-105,98,86,64,-71,
2,0,2,107,-63,4,0,84,96,62,64,-7,-82,12,0,-108,
-12,3,0,-86,-32,3,19,-86,-125,14,64,-7,-124,34,64,121,
-127,74,64,57,-126,78,64,57,-41,-1,-1,-105,-11,3,0,-86,
-32,3,20,-86,56,12,0,-108,116,18,64,-71,-32,3,21,-86,
-104,-3,-1,-105,-32,23,0,-7,-32,3,21,-86,-104,-3,-1,-105,
-30,3,0,42,-31,23,64,-7,-32,3,20,42,32,-4,-1,-105,
-30,3,0,42,-95,0,0,-48,96,54,64,-7,33,-4,71,-7,
33,0,64,-7,-42,11,0,-108,-32,3,21,-86,-116,-4,-1,-105,
96,62,64,-7,-95,12,0,-108,96,3,0,-76,-13,83,64,-87,
-11,123,65,-87,-1,-61,0,-111,-64,3,95,-42,96,30,64,-7,
-30,23,0,-7,116,18,64,-71,126,-3,-1,-105,97,86,64,-71,
-30,23,64,-7,1,0,1,-117,-32,3,20,42,8,-4,-1,-105,
-31,3,0,42,99,86,64,-71,-30,3,1,42,96,54,64,-7,
97,0,1,11,97,86,0,-71,-95,0,0,-48,-13,83,64,-87,
-11,123,65,-87,33,-4,71,-7,-1,-61,0,-111,33,0,64,-7,
-73,11,0,20,96,62,64,-7,-122,12,0,-108,-128,-4,-1,53,
96,30,64,-7,106,-3,-1,-105,97,86,64,-71,31,0,1,107,
-31,-5,-1,84,97,22,64,-7,32,84,64,-71,0,120,29,18,
32,84,0,-71,-13,83,64,-87,-11,123,65,-87,-1,-61,0,-111,
-64,3,95,-42,32,0,-128,82,-64,3,95,-42,-1,67,0,-47,
3,0,-128,-46,-31,31,-128,82,2,0,-128,82,-28,3,3,42,
-13,123,0,-87,-13,3,0,-86,-17,-2,-1,-105,0,0,-128,-46,
0,-7,-1,-105,96,94,0,-71,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,-64,3,95,-42,-64,3,95,-42,-1,67,0,-47,
3,0,-128,-46,37,0,-128,82,65,10,-128,82,2,0,-128,82,
-28,3,3,42,-13,123,0,-87,5,24,0,-71,-13,3,0,-86,
-35,-2,-1,-105,-128,0,0,53,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,96,18,64,-7,-13,123,64,-87,-1,67,0,-111,
-28,-6,-1,23,-1,-125,0,-47,-13,123,0,-87,-13,3,0,-86,
0,36,64,-7,96,2,0,-76,50,-3,-1,-105,-32,15,0,-7,
96,38,64,-7,50,-3,-1,-105,-28,3,0,42,-29,15,64,-7,
-32,3,19,-86,65,10,-128,82,2,0,-128,82,-58,-2,-1,-105,
-128,0,0,53,-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,
96,18,64,-7,-13,123,64,-87,-1,-125,0,-111,-51,-6,-1,23,
-28,3,0,42,-29,3,0,-86,-14,-1,-1,23,-1,-61,0,-47,
5,0,0,-16,-91,0,51,-111,65,10,-128,82,2,0,-128,82,
-29,-125,0,-111,-13,83,0,-87,-77,0,0,-48,-2,11,0,-7,
-90,0,64,-71,-92,0,-128,82,-91,8,64,121,-12,3,0,-86,
103,-10,71,-7,-26,35,0,-71,-27,75,0,121,-25,0,64,-7,
-25,23,0,-7,-88,-2,-1,-105,96,0,0,52,-128,18,64,-7,
-76,-6,-1,-105,115,-10,71,-7,-31,23,64,-7,96,2,64,-7,
63,0,0,-21,-95,0,0,84,-13,83,64,-87,-2,11,64,-7,
-1,-61,0,-111,-64,3,95,-42,-126,-8,-1,-105,-1,3,1,-47,
1,0,0,-16,98,2,-128,82,33,-32,50,-111,-13,83,0,-87,
-76,0,0,-48,-13,-93,0,-111,-11,123,1,-87,-11,3,0,-86,
-32,3,19,-86,-125,-10,71,-7,-1,23,0,-7,-1,51,0,-71,
99,0,64,-7,-29,31,0,-7,-90,-8,-1,-105,-32,3,19,-86,
-88,-8,-1,-105,-28,3,0,-86,65,10,-128,82,-32,3,21,-86,
2,0,-128,82,-29,3,19,-86,-125,-2,-1,-105,96,0,0,52,
-96,18,64,-7,-113,-6,-1,-105,-108,-10,71,-7,-31,31,64,-7,
-128,2,64,-7,63,0,0,-21,-95,0,0,84,-13,83,64,-87,
-11,123,65,-87,-1,3,1,-111,-64,3,95,-42,93,-8,-1,-105,
-1,-61,0,-47,-31,3,4,42,-13,83,0,-87,-77,0,0,-48,
-2,11,0,-7,-12,3,0,-86,-32,3,3,-86,-1,39,0,-71,
98,-10,71,-7,66,0,64,-7,-30,23,0,-7,9,-4,-1,-105,
-96,0,0,-76,-31,-109,0,-111,-86,-3,-1,-105,-30,3,0,42,
0,2,0,52,3,0,-128,-46,-32,3,20,-86,33,10,-128,82,
2,0,-128,82,-28,3,3,42,95,-2,-1,-105,115,-10,71,-7,
-31,23,64,-7,96,2,64,-7,63,0,0,-21,-63,1,0,84,
-13,83,64,-87,-2,11,64,-7,-1,-61,0,-111,-64,3,95,-42,
-124,22,64,-7,-32,3,20,-86,-27,39,64,-71,65,10,-128,82,
3,0,-128,-46,-123,48,0,-7,-28,3,2,42,78,-2,-1,-105,
-17,-1,-1,23,51,-8,-1,-105,-1,-61,0,-47,-31,3,4,42,
-13,83,0,-87,-77,0,0,-48,-2,11,0,-7,-12,3,0,-86,
-32,3,3,-86,-1,39,0,-71,98,-10,71,-7,66,0,64,-7,
-30,23,0,-7,-33,-5,-1,-105,-96,0,0,-76,-31,-109,0,-111,
-128,-3,-1,-105,-30,3,0,42,0,2,0,52,3,0,-128,-46,
-32,3,20,-86,33,10,-128,82,2,0,-128,82,-28,3,3,42,
53,-2,-1,-105,115,-10,71,-7,-31,23,64,-7,96,2,64,-7,
63,0,0,-21,-95,1,0,84,-13,83,64,-87,-2,11,64,-7,
-1,-61,0,-111,-64,3,95,-42,-31,39,64,-71,-32,3,20,-86,
-127,90,0,-71,3,0,-128,-46,65,10,-128,82,-28,3,2,42,
37,-2,-1,-105,-16,-1,-1,23,10,-8,-1,-105,-1,3,1,-47,
5,0,0,-112,-91,-112,31,-111,-13,83,0,-87,-11,91,1,-87,
-9,99,2,-87,-12,3,0,-86,-11,3,2,42,-32,3,2,42,
-9,3,3,-86,-10,3,4,42,2,0,0,-112,3,0,0,-112,
4,0,0,-112,-8,3,1,42,66,32,18,-111,-31,3,20,-86,
99,80,27,-111,-124,64,18,-111,-2,27,0,-7,-71,3,0,-108,
-13,3,0,-86,-128,3,0,-76,5,36,64,-7,-31,3,24,42,
-30,3,21,42,-29,3,23,-86,-28,3,22,42,-96,0,63,-42,
-128,1,0,53,-128,2,64,-7,19,4,0,-7,96,2,0,-7,
116,6,0,-7,-109,2,0,-7,-13,83,64,-87,-11,91,65,-87,
-9,99,66,-87,-2,27,64,-7,-1,3,1,-111,-64,3,95,-42,
97,34,64,-7,-32,3,19,-86,32,0,63,-42,-2,27,64,-7,
-13,83,64,-87,-11,91,65,-87,-9,99,66,-87,-1,3,1,-111,
-64,3,95,-42,-32,3,20,-86,-30,3,21,42,-29,3,19,-86,
-28,3,19,42,-11,91,65,-87,-13,83,64,-87,-9,99,66,-87,
-2,27,64,-7,33,10,-128,82,-1,3,1,-111,-26,-3,-1,23,
-1,67,0,-47,-2,3,0,-7,5,4,64,-7,-65,0,0,-21,
-95,0,0,84,10,0,0,20,-91,4,64,-7,-65,0,0,-21,
-32,0,0,84,-90,16,64,-71,95,0,6,107,97,-1,-1,84,
-90,36,64,-7,-32,3,5,-86,-64,0,63,-42,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,-1,-61,0,-47,5,0,0,-112,
-91,-112,31,-111,-13,83,0,-87,-11,91,1,-87,-13,3,0,-86,
-12,3,2,42,-32,3,2,42,-10,3,3,-86,-11,3,4,42,
2,0,0,-112,3,0,0,-112,4,0,0,-112,-9,123,2,-87,
66,32,18,-111,-9,3,1,42,99,80,27,-111,-31,3,19,-86,
-124,64,18,-111,99,8,0,-108,-27,3,0,-86,32,2,0,-76,
102,2,64,-7,-31,3,23,42,7,36,64,-7,-30,3,20,42,
-29,3,22,-86,-28,3,21,42,-64,4,0,-7,6,0,0,-7,
19,4,0,-7,96,2,0,-7,-32,0,63,-42,-9,123,66,-87,
-13,83,64,-87,-11,91,65,-87,-1,-61,0,-111,-64,3,95,-42,
-32,3,19,-86,-30,3,20,42,-11,91,65,-87,-13,83,64,-87,
-9,123,66,-87,33,10,-128,82,-29,3,5,-86,-28,3,5,42,
-1,-61,0,-111,-92,-3,-1,23,-1,67,0,-47,-2,3,0,-7,
5,4,64,-7,-65,0,0,-21,-95,0,0,84,10,0,0,20,
-91,4,64,-7,-65,0,0,-21,-32,0,0,84,-90,16,64,-71,
95,0,6,107,97,-1,-1,84,-90,36,64,-7,-32,3,5,-86,
-64,0,63,-42,-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,
-1,67,0,-47,-2,3,0,-7,5,4,64,-7,-65,0,0,-21,
-95,0,0,84,10,0,0,20,-91,4,64,-7,-65,0,0,-21,
-32,0,0,84,-90,16,64,-71,95,0,6,107,97,-1,-1,84,
-90,36,64,-7,-32,3,5,-86,-64,0,63,-42,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,3,0,-128,-46,33,28,-128,82,
2,0,-128,82,-28,3,3,42,123,-3,-1,23,63,96,1,113,
-27,3,1,42,-26,3,0,-86,-23,3,2,42,-24,3,3,-86,
-25,3,4,42,-128,4,0,84,13,2,0,84,63,108,1,113,
0,4,0,84,-83,2,0,84,63,0,3,113,-32,3,0,84,
63,-4,3,113,64,3,0,84,63,112,1,113,32,4,0,84,
3,0,-128,-46,-32,3,6,-86,33,28,-128,82,2,0,-128,82,
-28,3,3,42,100,-3,-1,23,63,76,1,113,64,3,0,84,
109,1,0,84,63,84,1,113,13,2,0,84,63,88,1,113,
-127,-2,-1,84,118,-2,-1,23,63,100,1,113,-32,0,0,84,
63,104,1,113,-31,-3,-1,84,-67,-2,-1,23,63,68,1,113,
-117,-3,-1,84,-64,3,95,-42,-103,-2,-1,23,92,-2,-1,23,
-36,-2,-1,23,124,-2,-1,23,-32,3,6,-86,-31,3,5,42,
-30,3,9,42,-29,3,8,-86,-28,3,7,42,101,-1,-1,23,
-2,-2,-1,23,38,-1,-1,23,-1,67,0,-47,-13,123,0,-87,
-13,3,0,-86,3,0,-128,-46,-32,3,19,-86,33,28,-128,82,
2,0,-128,82,-28,3,3,42,63,-3,-1,-105,-6,-1,-1,23,
2,4,64,-7,95,0,0,-21,-95,0,0,84,9,0,0,20,
66,4,64,-7,95,0,0,-21,-64,0,0,84,67,16,64,-71,
127,0,1,107,97,-1,-1,84,-32,3,2,-86,-64,3,95,-42,
0,0,-128,-46,-64,3,95,-42,-1,-125,0,-47,-127,7,-128,82,
-13,83,0,-87,-13,3,0,-86,-2,11,0,-7,0,0,-128,-46,
97,90,0,-71,59,-9,-1,-105,115,2,0,-7,96,94,0,-71,
64,0,-128,82,115,6,0,-7,55,9,0,-108,96,54,0,-7,
96,3,0,-76,42,10,0,-108,96,62,0,-7,0,3,0,-76,
-127,-6,-1,-105,96,26,0,-7,127,-6,-1,-105,-12,3,0,-86,
96,26,64,-7,116,30,0,-7,-96,1,0,-76,52,1,0,-76,
-95,0,0,-80,0,0,-128,82,33,-8,71,-7,97,50,0,-7,
-13,83,64,-87,-2,11,64,-7,-1,-125,0,-111,-64,3,95,-42,
115,-6,-1,-105,116,26,0,-7,116,30,64,-7,-108,0,0,-76,
-32,3,20,-86,110,-6,-1,-105,127,30,0,-7,0,0,-128,18,
-2,11,64,-7,-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,
-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,0,24,64,-7,
64,0,0,-76,98,-6,-1,-105,96,30,64,-7,64,0,0,-76,
95,-6,-1,-105,96,34,64,-7,64,0,0,-76,92,-6,-1,-105,
96,38,64,-7,64,0,0,-76,89,-6,-1,-105,96,18,64,-71,
-128,1,0,53,96,22,64,-7,64,0,0,-76,62,-9,-1,-105,
96,54,64,-7,64,0,0,-76,18,9,0,-108,96,62,64,-7,
-64,0,0,-76,-13,123,64,-87,-1,67,0,-111,105,10,0,20,
42,-7,-1,-105,-12,-1,-1,23,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,-1,-125,0,-47,-13,83,0,-87,-2,11,0,-7,
-12,3,0,-86,1,4,64,-7,63,0,0,-21,-128,1,0,84,
35,0,64,-7,-32,3,1,-86,34,4,64,-7,36,32,64,-7,
98,4,0,-7,67,0,0,-7,51,0,64,-7,-128,0,63,-42,
97,6,64,-7,63,0,20,-21,-63,-2,-1,84,-13,83,64,-87,
-2,11,64,-7,-1,-125,0,-111,-64,3,95,-42,-1,-125,0,-47,
-13,83,0,-87,-13,3,0,-86,0,64,0,-111,-2,11,0,-7,
14,-7,-1,-105,-12,3,0,42,-96,4,0,53,4,-9,-1,-105,
96,22,0,-7,-31,3,0,-86,32,4,0,-76,99,18,64,-71,
2,84,64,-71,-96,0,0,-48,35,80,0,-71,-29,-1,-1,-16,
99,112,17,-111,35,12,0,-7,-29,-1,-1,-16,0,8,-128,-71,
99,0,33,-111,35,16,0,-7,-29,-1,-1,-16,66,0,0,50,
99,80,36,-111,35,20,0,-7,-29,-1,-1,-16,51,8,0,-7,
99,0,21,-111,35,24,0,-7,-29,-1,-1,-16,34,84,0,-71,
99,-16,17,-111,35,32,0,-7,-29,-1,-1,-16,32,48,0,-7,
99,-16,18,-111,35,36,0,-7,-32,3,20,42,-2,11,64,-7,
-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,20,0,-128,18,
-6,-1,-1,23,-1,-125,3,-47,-13,83,0,-87,-76,0,0,-80,
-2,27,0,-7,-11,91,1,-87,-9,99,2,-87,-123,-10,71,-7,
-75,0,0,-48,-13,3,1,-111,-92,2,1,-111,-9,3,0,-86,
96,-126,0,-111,-91,0,64,-7,-8,3,1,42,-10,3,2,-86,
-1,107,0,-7,-1,127,4,-87,-27,111,0,-7,-1,127,5,-87,
-1,127,6,-87,-1,127,7,-87,-1,127,8,-87,-1,127,9,-87,
-1,127,10,-87,-1,127,11,-87,-1,127,12,-87,-109,4,0,-7,
-93,-8,-1,-105,0,7,0,53,-32,3,19,-86,79,-1,-1,-105,
-32,5,0,53,0,0,0,-48,0,32,51,-111,88,-6,-1,-105,
96,34,0,-7,64,5,0,-76,-74,0,0,-76,-32,3,22,-86,
83,-6,-1,-105,96,38,0,-7,-96,4,0,-76,-32,3,19,-86,
-89,-1,-1,-105,64,4,0,53,-31,83,64,-71,-30,3,23,-86,
-29,3,24,42,-16,-8,-1,-105,-96,3,0,53,96,18,64,-7,
97,22,64,-7,-71,-10,-1,-105,-10,3,0,42,0,3,0,53,
-95,34,64,-7,-75,2,1,-111,96,18,64,-7,47,-8,-1,-105,
-65,6,0,-7,96,18,64,-7,113,-8,-1,-105,-32,3,19,-86,
125,-1,-1,-105,-32,3,19,-86,90,-1,-1,-105,-108,-10,71,-7,
-32,3,22,42,-30,111,64,-7,-127,2,64,-7,95,0,1,-21,
-31,1,0,84,-13,83,64,-87,-11,91,65,-87,-9,99,66,-87,
-2,27,64,-7,-1,-125,3,-111,-64,3,95,-42,-32,51,64,-7,
22,0,-128,18,94,-8,-1,-105,-32,3,19,-86,73,-1,-1,-105,
-17,-1,-1,23,22,0,-128,18,-19,-1,-1,23,45,-10,-1,-105,
-96,0,0,-48,-1,67,0,-47,0,36,64,-7,-2,3,0,-7,
96,0,0,-76,0,16,64,-7,78,-8,-1,-105,0,0,-128,82,
-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,-28,3,1,-86,
-31,3,0,42,-96,0,0,-80,-29,3,2,42,-30,3,4,-86,
0,-8,71,-7,-12,7,0,20,-28,3,0,-86,5,-128,64,-71,
0,-120,64,-71,-122,-124,64,-71,-30,1,0,53,-65,0,16,113,
105,3,0,84,-96,0,99,30,0,10,-96,82,1,16,111,30,
0,8,97,30,1,0,121,30,63,0,84,113,33,-112,-128,26,
-32,3,1,42,-126,-120,0,-71,-123,-124,0,-71,-127,-128,0,-71,
-64,3,95,-42,33,0,99,30,95,0,16,113,64,0,99,30,
-29,-105,-97,26,34,40,97,30,16,32,98,30,-51,2,0,84,
-93,2,0,52,0,-128,-128,82,-126,-120,0,-71,-31,3,0,42,
-123,-124,0,-71,-127,-128,0,-71,-64,3,95,-42,-95,4,0,81,
63,-4,15,113,104,9,0,84,3,124,1,83,31,0,31,107,
-58,0,5,11,97,16,-97,26,-63,0,1,11,-126,-120,0,-71,
33,124,1,83,-123,-124,0,-71,-32,3,1,42,-127,-128,0,-71,
-64,3,95,-42,-30,8,0,92,34,8,98,30,16,32,98,30,
-115,1,0,84,99,1,0,52,96,2,-118,82,63,0,0,107,
-87,-4,-1,84,-96,-103,-103,82,-128,-103,-71,114,33,124,-96,-101,
33,-4,96,-45,33,124,4,83,-32,3,1,42,-46,-1,-1,23,
66,7,0,92,34,8,98,30,16,32,98,30,-115,1,0,84,
99,1,0,52,32,1,-123,82,63,0,0,107,-55,-6,-1,84,
-96,-103,-103,82,-128,-103,-71,114,33,124,-96,-101,33,-4,96,-45,
33,124,3,83,-32,3,1,42,-61,-1,-1,23,31,0,2,107,
-93,2,0,84,-63,0,5,11,3,0,-128,82,105,0,0,84,
0,0,2,75,3,124,1,83,2,16,108,30,35,0,3,11,
97,124,1,83,33,8,98,30,16,32,97,30,32,0,98,30,
76,2,0,84,33,3,0,92,0,8,97,30,-126,-120,0,-71,
-123,-124,0,-71,1,0,121,30,-32,3,1,42,-127,-128,0,-71,
-64,3,95,-42,2,16,108,30,64,0,0,75,-63,0,5,11,
33,8,98,30,33,4,64,11,33,124,1,83,16,32,97,30,
32,0,98,30,13,-2,-1,84,-63,0,0,92,-17,-1,-1,23,
0,10,-96,82,-31,3,0,42,-97,-1,-1,23,31,32,3,-43,
102,102,102,102,102,102,-18,63,-51,-52,-52,-52,-52,-52,-16,63,
-51,-52,-52,-52,-52,-52,-12,63,102,102,102,102,102,102,-26,63,
5,-128,64,-71,101,0,0,53,5,0,-108,82,-27,1,-96,114,
33,0,99,30,9,-120,64,-71,0,16,108,30,3,-124,64,-71,
2,16,0,92,4,0,-103,-46,32,8,96,30,16,32,98,30,
-59,0,0,84,4,0,120,-98,-26,-1,-126,-46,-97,0,6,-21,
6,0,-125,-46,-124,-64,-122,-102,-90,0,0,-48,-57,0,1,-111,
-25,16,64,-71,34,4,0,53,-29,0,98,30,-93,0,3,11,
0,16,110,30,99,124,1,83,2,14,0,92,-28,4,0,17,
98,0,66,31,-32,13,0,92,33,8,96,30,96,0,98,30,
0,8,98,30,1,0,120,-98,32,0,99,30,16,32,97,30,
68,5,0,84,63,0,5,107,33,32,-123,26,63,-120,83,113,
105,5,0,84,3,0,-124,82,-31,3,3,42,-61,9,-96,114,
-63,9,-96,114,-58,0,1,-111,-97,0,7,107,-124,16,-97,26,
2,-120,0,-71,5,-124,0,-71,1,-128,0,-71,-32,3,3,42,
-60,16,0,-71,-64,3,95,-42,-24,3,2,42,-22,127,-126,-46,
31,1,10,-21,-116,3,0,84,-95,0,3,11,33,124,1,83,
65,10,0,92,32,0,98,30,0,8,97,30,1,0,120,-98,
63,-120,83,113,105,5,0,84,-58,0,1,-111,3,0,-124,82,
-31,3,3,42,-61,9,-96,114,-63,9,-96,114,4,0,-128,82,
2,-120,0,-71,5,-124,0,-71,1,-128,0,-71,-32,3,3,42,
-60,16,0,-71,-64,3,95,-42,33,0,120,-98,63,0,5,107,
33,32,-123,26,63,-120,83,113,-24,-6,-1,84,-29,3,1,42,
-39,-1,-1,23,-97,0,8,-21,-117,0,0,84,-95,0,3,11,
33,124,1,83,-25,-1,-1,23,0,-112,96,30,66,0,99,30,
32,8,96,30,80,32,96,30,44,2,0,84,32,40,97,30,
80,32,96,30,76,2,0,84,0,16,111,30,33,8,96,30,
80,32,97,30,-115,2,0,84,-93,-103,-103,82,-125,-103,-71,114,
33,124,-93,-101,33,-4,96,-45,33,124,3,83,-43,-1,-1,23,
-29,3,1,42,-28,3,7,42,-65,-1,-1,23,3,-128,-128,82,
-28,3,7,42,-31,3,3,42,-69,-1,-1,23,-93,-103,-103,82,
-125,-103,-71,114,33,124,-93,-101,33,-4,96,-45,33,124,4,83,
-56,-1,-1,23,63,1,2,107,-62,0,0,84,-96,0,99,30,
-127,2,0,92,0,8,97,30,1,0,120,-98,-63,-1,-1,23,
-93,0,3,11,97,-4,65,-109,-63,1,0,92,32,0,98,-98,
0,8,97,30,1,0,120,-98,-70,-1,-1,23,31,32,3,-43,
0,0,0,0,0,0,-23,64,-102,-103,-103,-103,-103,-103,-71,63,
51,51,51,51,51,51,-45,63,123,20,-82,71,-31,122,-16,63,
10,-41,-93,112,61,10,-17,63,-31,3,0,-86,0,0,-124,82,
-29,3,0,42,-64,9,-96,114,-61,9,-96,114,36,-128,64,-71,
34,-120,0,-71,36,-124,0,-71,35,-128,0,-71,-64,3,95,-42,
-1,67,0,-47,70,1,-128,-46,-13,123,0,-87,-13,3,0,-86,
5,56,64,-7,1,120,64,-71,-96,84,64,-71,63,4,0,113,
0,120,31,18,0,0,31,50,-96,84,0,-71,32,2,0,84,
3,0,-128,-46,103,22,64,-7,96,10,64,-7,65,10,-128,82,
98,26,64,-71,-28,3,3,42,-90,48,0,-7,37,0,-128,82,
-32,0,63,-42,-128,0,0,52,96,58,64,-7,33,0,-128,82,
1,104,0,-71,-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,
-96,0,0,-48,6,88,-128,-71,-18,-1,-1,23,0,56,64,-7,
33,0,-128,82,1,104,0,-71,-64,3,95,-42,-1,67,0,-47,
-13,123,0,-87,0,3,0,-76,-13,3,0,-86,0,80,64,-71,
96,2,0,53,96,50,64,-7,64,0,0,-76,88,-8,-1,-105,
96,46,64,-7,64,0,0,-76,85,-8,-1,-105,96,58,64,-7,
64,0,0,-76,60,-11,-1,-105,96,70,64,-7,64,0,0,-76,
16,7,0,-108,-32,3,19,-86,22,-11,-1,-105,0,0,-128,82,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,39,-9,-1,-105,
-19,-1,-1,23,0,0,-128,18,-6,-1,-1,23,-1,-61,0,-47,
-13,83,0,-87,-2,11,0,-7,-13,3,0,-86,0,44,64,-7,
63,-7,-1,-105,98,106,64,-71,2,0,2,107,0,2,0,84,
96,46,64,-7,-30,23,0,-7,116,82,64,-71,53,-7,-1,-105,
97,106,64,-71,-30,23,64,-7,1,0,1,-117,-32,3,20,42,
-65,-9,-1,-105,97,106,64,-71,98,-126,64,-71,33,0,0,11,
97,106,0,-71,64,0,0,11,96,-126,0,-71,-13,83,64,-87,
-2,11,64,-7,-1,-61,0,-111,-64,3,95,-42,-1,-61,0,-47,
-13,83,0,-87,-11,91,1,-87,-2,19,0,-7,-13,3,0,-86,
-11,3,2,-86,0,-104,64,-71,-32,3,0,53,98,-96,15,81,
-128,-25,-127,82,95,-16,60,113,-31,3,21,-86,66,-112,-128,26,
96,82,64,-71,-97,-9,-1,-105,31,0,31,107,-12,3,0,42,
-83,3,0,84,100,-122,64,-71,-30,3,20,42,96,70,64,-7,
-124,0,20,11,100,-122,0,-71,-92,0,0,-80,-124,-4,71,-7,
-127,0,64,-7,43,7,0,-108,118,122,64,-71,-33,6,0,113,
32,3,0,84,100,126,64,-71,-108,0,20,11,116,126,0,-71,
-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,-1,-61,0,-111,
-64,3,95,-42,96,82,64,-71,2,-128,-128,82,127,-102,0,-71,
-31,3,21,-86,-125,-9,-1,-105,31,0,31,107,-12,3,0,42,
-84,-4,-1,84,96,58,64,-7,33,0,-128,82,1,104,0,-71,
-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,-1,-61,0,-111,
-64,3,95,-42,102,22,64,-7,-127,10,-128,82,96,10,64,-7,
-29,3,21,-86,98,26,64,-71,-28,3,20,42,5,0,-128,82,
-64,0,63,-42,96,-4,-1,52,96,58,64,-7,22,104,0,-71,
-32,-1,-1,23,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
1,16,64,-7,0,8,64,-7,32,0,63,-42,-32,3,0,42,
31,0,65,-15,0,0,-128,-46,-115,1,0,84,-119,-12,-1,-105,
97,74,64,-7,33,8,0,-111,31,0,1,-21,-52,1,0,84,
96,58,64,-7,-13,123,64,-87,-1,67,0,-111,0,84,64,-71,
0,120,30,18,-64,3,95,-42,126,-12,-1,-105,96,74,0,-7,
97,58,64,-7,-13,123,64,-87,-1,67,0,-111,32,84,64,-71,
-64,3,95,-42,0,0,-128,-46,118,-12,-1,-105,96,74,0,-7,
97,58,64,-7,32,0,-128,82,96,-102,0,-71,32,84,64,-71,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,-94,0,0,-48,
64,12,0,-71,-96,0,0,-48,1,88,0,-71,-64,3,95,-42,
-1,67,1,-47,-13,83,0,-87,-12,3,0,42,0,20,-128,-46,
-2,11,0,-7,-31,39,0,-7,-30,35,0,-7,-29,31,0,-7,
-28,27,0,-7,-27,23,0,-7,30,-12,-1,-105,-13,3,0,-86,
-64,6,0,-76,127,126,1,-87,-31,39,64,-7,32,0,-128,82,
97,10,0,-7,1,0,0,-80,33,-80,17,-111,-30,35,64,-7,
-29,31,64,-7,-28,27,64,-7,-27,23,64,-7,97,38,0,-7,
1,0,0,-112,33,112,41,-111,116,26,0,-71,127,126,0,-87,
127,126,5,-87,127,126,6,-87,127,126,7,-87,127,126,8,-87,
127,126,9,-87,98,18,0,-7,99,22,0,-7,100,26,0,-7,
101,30,0,-7,97,34,0,-7,67,6,0,-108,96,70,0,-7,
-12,3,0,-86,96,3,0,-76,-113,-9,-1,-105,96,46,0,-7,
-115,-9,-1,-105,96,50,0,-7,0,2,0,-76,96,46,64,-7,
-64,1,0,-76,33,0,-128,82,0,0,-128,-46,127,-122,0,-71,
-12,3,19,-86,97,122,0,-71,127,-126,0,-71,49,-12,-1,-105,
96,74,0,-7,-32,3,20,-86,-2,11,64,-7,-13,83,64,-87,
-1,67,1,-111,-64,3,95,-42,-32,3,19,-86,20,0,-128,-46,
27,-1,-1,-105,-8,-1,-1,23,-12,3,0,-86,-10,-1,-1,23,
-32,3,19,-86,22,-1,-1,-105,-13,-1,-1,23,-1,67,0,-47,
-13,123,0,-87,-13,3,0,-86,4,84,64,-71,36,2,0,53,
0,56,64,-7,0,84,64,-71,-64,3,0,55,101,122,64,-71,
-123,2,0,52,3,0,-128,-46,102,22,64,-7,98,26,64,-71,
-95,10,-128,82,96,10,64,-7,-28,3,3,42,-27,3,3,42,
-64,0,63,-42,-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,
3,24,64,-7,-127,10,-128,82,98,26,64,-71,0,8,64,-7,
96,0,63,-42,-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,
102,22,64,-7,33,12,-128,82,96,10,64,-7,99,-14,1,-111,
98,26,64,-71,-124,0,-128,82,-64,0,63,-42,-26,-1,-1,23,
102,22,64,-7,33,10,-128,82,98,26,64,-71,3,0,-128,-46,
96,10,64,-7,-27,3,4,42,-64,0,63,-42,-13,123,64,-87,
-1,67,0,-111,-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,
-13,3,0,-86,-50,-1,-1,-105,-31,3,19,-86,98,30,64,-7,
96,10,64,-7,64,0,63,-42,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,0,56,64,-7,33,0,-128,82,1,104,0,-71,
-64,3,95,-42,-1,-61,0,-47,-13,83,0,-87,-11,91,1,-87,
-2,19,0,-7,-62,2,0,52,-95,2,0,-76,22,68,64,-7,
-12,3,0,-86,0,0,-128,-46,-11,3,1,-86,-13,3,2,42,
-40,-13,-1,-105,-31,3,0,-86,-30,3,19,42,-32,3,22,-86,
111,6,0,-108,-128,46,64,-7,-31,3,21,-86,-30,3,19,42,
40,-9,-1,-105,31,4,0,49,96,1,0,84,-127,58,64,-7,
32,84,64,-71,0,0,30,50,32,84,0,-71,0,0,-128,82,
-2,19,64,-7,-13,83,64,-87,-11,91,65,-87,-1,-61,0,-111,
-64,3,95,-42,-128,58,64,-7,33,0,-128,82,1,104,0,-71,
-9,-1,-1,23,-31,3,0,-86,34,0,-128,82,0,0,-128,82,
35,56,64,-7,98,104,0,-71,34,84,0,-71,-64,3,95,-42,
1,56,64,-7,31,120,0,-71,32,84,64,-71,96,0,8,54,
64,1,-128,-46,32,48,0,-7,0,0,-128,82,-64,3,95,-42,
-1,67,1,-47,63,0,31,-21,-28,23,-97,26,95,0,31,-21,
-29,23,-97,26,-13,83,0,-87,-11,91,1,-87,-9,99,2,-87,
-7,107,3,-87,-2,35,0,-7,-125,0,3,42,3,17,0,53
};
}
\ No newline at end of file
package com.vps.library;
public class b2{
public static byte []b2 = {
-32,16,0,-76,-11,3,1,-86,1,10,-128,82,65,0,0,-71,
-10,3,2,-86,106,-9,-1,-105,-12,3,0,-86,96,2,0,-76,
-12,-9,-1,-105,-13,3,0,42,32,3,0,52,23,0,-128,-46,
19,0,-128,18,-32,3,20,-86,-23,-10,-1,-105,-105,1,0,-76,
-32,3,23,-86,-26,-10,-1,-105,-32,3,19,42,-13,83,64,-87,
-11,91,65,-87,-9,99,66,-87,-7,107,67,-87,-2,35,64,-7,
-1,67,1,-111,-64,3,95,-42,19,0,-128,18,-32,3,19,42,
-2,35,64,-7,-13,83,64,-87,-11,91,65,-87,-9,99,66,-87,
-7,107,67,-87,-1,67,1,-111,-64,3,95,-42,1,0,0,-80,
-32,3,20,-86,33,96,51,-111,-30,3,19,42,31,-8,-1,-105,
31,4,0,49,-7,3,0,42,-64,5,0,84,26,12,0,17,
1,0,0,-80,-32,3,20,-86,33,-128,51,-111,-30,3,26,42,
22,-8,-1,-105,31,4,0,49,-8,3,0,42,0,10,0,84,
-32,3,20,-86,1,0,-128,82,-30,3,25,42,92,-8,-1,-105,
-9,3,0,-86,-128,-6,-1,-76,1,0,0,-80,2,0,-128,82,
33,-96,51,-111,9,-8,-1,-105,31,4,0,49,96,0,0,84,
96,55,-128,82,-64,2,0,-71,2,3,25,75,-31,3,26,42,
-32,3,20,-86,66,12,0,81,77,-8,-1,-105,-6,3,0,-86,
-96,-8,-1,-76,-82,-9,-1,-105,-96,3,0,53,24,0,-128,-46,
-7,3,24,-86,-32,3,20,-86,-87,-10,-1,-105,-32,3,26,-86,
-89,-10,-1,-105,121,0,0,-76,-32,3,25,-86,-92,-10,-1,-105,
120,-9,-1,-76,-32,3,24,-86,-95,-10,-1,-105,-72,-1,-1,23,
1,0,0,-80,-32,3,20,-86,33,-128,51,-111,-30,3,19,42,
-22,-9,-1,-105,31,4,0,49,-8,3,0,42,-128,0,0,84,
90,0,-128,82,23,0,-128,-46,-32,-1,-1,23,-32,3,20,-86,
-109,-9,-1,-105,-8,3,0,42,-6,-1,-1,23,1,0,0,-80,
-32,3,26,-86,33,-64,51,-111,2,0,-128,82,-37,-9,-1,-105,
31,4,0,49,-8,3,0,42,96,3,0,84,-30,3,0,42,
1,0,-128,82,-32,3,26,-86,33,-8,-1,-105,-7,3,0,-86,
1,7,0,17,-32,3,26,-86,67,-8,-1,-105,-8,3,0,-86,
-96,-6,-1,-76,-103,-6,-1,-76,-31,3,22,-86,89,-8,-1,-105,
32,-6,-1,53,-32,3,21,-86,-31,3,25,-86,65,-8,-1,-105,
-32,3,21,-86,118,-9,-1,-105,-53,-1,-1,23,-32,3,20,-86,
115,-9,-1,-105,-8,3,0,42,-82,-1,-1,23,0,0,-128,18,
-117,-1,-1,23,-32,3,26,-86,24,0,-128,-46,-7,3,24,-86,
104,-9,-1,-105,-31,3,0,-86,-32,3,21,-86,-44,-10,-1,-105,
-96,-9,-1,53,-17,-1,-1,23,-1,-125,1,-47,-13,83,0,-87,
-76,0,0,-112,-2,27,0,-7,-9,99,2,-87,-8,3,1,-86,
-13,3,0,-86,-127,-10,71,-7,0,64,1,-111,-11,91,1,-87,
-9,3,2,42,33,0,64,-7,-31,47,0,-7,59,-11,-1,-105,
-10,3,0,42,64,11,0,53,49,-13,-1,-105,-29,3,0,-86,
-64,9,0,-76,-26,-1,-1,-16,4,84,64,-71,-58,-16,44,-111,
96,82,64,-71,102,16,0,-7,-26,-1,-1,-16,-58,48,43,-111,
102,20,0,-7,-26,-1,-1,-16,-95,0,0,-80,-58,48,41,-111,
102,24,0,-7,-26,-1,-1,-16,96,80,0,-71,-58,32,59,-111,
33,12,-128,-71,102,28,0,-7,-32,-1,-1,-16,-26,-1,-1,-16,
97,48,0,-7,-58,16,49,-111,-124,0,0,50,102,32,0,-7,
0,64,39,-111,115,8,0,-7,96,12,0,-7,100,84,0,-71,
99,58,0,-7,52,-10,-1,-105,-11,3,0,-86,-31,3,23,42,
-32,3,24,-86,107,-10,-1,-105,-10,87,0,-71,-9,3,0,-86,
96,6,0,-76,-65,2,31,-21,-10,23,-97,26,22,6,0,53,
40,-9,-1,-105,-31,3,21,-86,-30,83,1,-111,37,-1,-1,-105,
-8,3,0,42,-128,6,0,53,97,82,64,-71,-32,3,21,-86,
118,26,64,-71,-31,39,0,-7,30,-9,-1,-105,-30,3,0,-86,
-31,39,64,-7,-32,3,22,42,-29,87,64,-71,58,-11,-1,-105,
-10,3,0,42,-64,6,0,53,96,10,64,-7,97,58,64,-7,
0,16,64,-7,1,-13,-1,-105,-32,3,21,-86,20,-10,-1,-105,
-32,3,23,-86,18,-10,-1,-105,-108,-10,71,-7,-32,3,22,42,
-30,47,64,-7,-127,2,64,-7,95,0,1,-21,-31,5,0,84,
-13,83,64,-87,-11,91,65,-87,-9,99,66,-87,-2,27,64,-7,
-1,-125,1,-111,-64,3,95,-42,102,22,64,-7,-27,3,22,42,
96,10,64,-7,33,10,-128,82,98,26,64,-71,-28,3,3,42,
22,0,-128,18,-64,0,63,-42,-20,-1,-1,23,3,0,-128,-46,
102,22,64,-7,96,10,64,-7,33,10,-128,82,98,26,64,-71,
-28,3,3,42,-27,3,3,42,22,0,-128,18,-64,0,63,-42,
-30,-1,-1,23,98,26,64,-71,33,10,-128,82,102,22,64,-7,
3,0,-128,-46,96,10,64,-7,-28,3,22,42,-27,3,4,42,
22,0,-128,18,-64,0,63,-42,-32,3,21,-86,-24,-11,-1,-105,
-32,3,23,-86,-26,-11,-1,-105,-44,-1,-1,23,98,26,64,-71,
33,10,-128,82,102,22,64,-7,3,0,-128,-46,96,10,64,-7,
-28,3,24,42,-14,-1,-1,23,94,-14,-1,-105,-27,3,0,-86,
-32,3,0,-76,63,76,1,113,-32,2,0,84,63,80,1,113,
0,3,0,84,63,84,1,113,-96,1,0,84,63,0,3,113,
96,0,0,84,0,0,-128,82,-64,3,95,-42,1,56,64,-7,
31,120,0,-71,32,84,64,-71,96,-1,15,54,66,1,-128,-46,
0,0,-128,82,34,48,0,-7,-64,3,95,-42,2,56,64,-7,
33,0,-128,82,0,0,-128,82,65,104,0,-71,-95,84,0,-71,
-64,3,95,-42,-31,3,3,-86,-30,3,4,42,91,-1,-1,23,
-31,3,3,-86,-30,3,4,42,-121,-2,-1,23,0,0,-128,18,
-64,3,95,-42,-1,67,4,-47,-23,67,4,-111,-24,-29,0,-111,
-23,31,0,-7,-23,35,0,-7,-23,-125,3,-111,-23,39,0,-7,
-23,4,-128,18,-13,123,0,-87,-23,83,0,-71,-23,15,-128,18,
-23,87,0,-71,-77,0,0,-112,10,45,64,-87,-29,119,0,-7,
-29,67,0,-111,115,-10,71,-7,8,37,65,-87,-24,39,2,-87,
-28,123,0,-7,-27,127,0,-7,-26,-125,0,-7,-25,-121,0,-7,
-22,47,1,-87,-32,27,-128,61,-31,31,-128,61,-30,35,-128,61,
-29,39,-128,61,100,2,64,-7,-28,47,0,-7,-28,43,-128,61,
-27,47,-128,61,-26,51,-128,61,-25,55,-128,61,4,0,64,-7,
-124,8,66,-7,-128,0,63,-42,-30,47,64,-7,97,2,64,-7,
95,0,1,-21,-127,0,0,84,-13,123,64,-87,-1,67,4,-111,
-64,3,95,-42,15,-14,-1,-105,-1,67,4,-47,-23,67,4,-111,
-24,-29,0,-111,-23,31,0,-7,-23,35,0,-7,-23,-125,3,-111,
-13,123,0,-87,-23,39,0,-7,-77,0,0,-112,-23,4,-128,18,
-23,83,0,-71,-23,15,-128,18,-23,87,0,-71,115,-10,71,-7,
12,53,64,-87,10,45,65,-87,9,0,64,-7,-29,119,0,-7,
-29,67,0,-111,-28,123,0,-7,-27,127,0,-7,-26,-125,0,-7,
-25,-121,0,-7,-20,55,1,-87,-22,47,2,-87,-32,27,-128,61,
-31,31,-128,61,-30,35,-128,61,100,2,64,-7,-28,47,0,-7,
-29,39,-128,61,-28,43,-128,61,-27,47,-128,61,-26,51,-128,61,
-25,55,-128,61,36,57,66,-7,-128,0,63,-42,-31,47,64,-7,
96,2,64,-7,63,0,0,-21,-127,0,0,84,-13,123,64,-87,
-1,67,4,-111,-64,3,95,-42,-30,-15,-1,-105,-1,-61,0,-47,
-11,91,1,-87,-9,123,2,-87,-13,83,0,-87,-10,3,0,-86,
-9,3,1,-86,2,0,64,-7,66,-96,66,-7,64,0,63,-42,
-11,3,0,42,0,3,0,52,20,4,0,17,-108,126,64,-109,
-32,3,20,-86,-65,-15,-1,-105,-13,3,0,-86,-96,1,0,-76,
1,0,-128,82,-30,3,20,-86,-10,-15,-1,-105,-60,2,64,-7,
-32,3,22,-86,-31,3,23,-86,2,0,-128,82,-29,3,21,42,
-123,116,67,-7,-28,3,19,-86,-96,0,63,-42,-32,3,19,-86,
-13,83,64,-87,-11,91,65,-87,-9,123,66,-87,-1,-61,0,-111,
-64,3,95,-42,0,0,-128,-46,-13,83,64,-87,-11,91,65,-87,
-9,123,66,-87,-1,-61,0,-111,-64,3,95,-42,-1,-61,0,-47,
-13,83,0,-87,-11,91,1,-87,-9,123,2,-87,-11,3,0,-86,
-9,3,1,-86,2,0,64,-7,66,-84,66,-7,64,0,63,-42,
-12,3,0,42,-32,2,0,52,22,124,64,-109,-32,3,22,-86,
-104,-15,-1,-105,-13,3,0,-86,-96,1,0,-76,1,0,-128,82,
-30,3,22,-86,-49,-15,-1,-105,-92,2,64,-7,-32,3,21,-86,
-31,3,23,-86,2,0,-128,82,-29,3,20,42,-123,32,67,-7,
-28,3,19,-86,-96,0,63,-42,-32,3,19,-86,-13,83,64,-87,
-11,91,65,-87,-9,123,66,-87,-1,-61,0,-111,-64,3,95,-42,
0,0,-128,-46,-13,83,64,-87,-11,91,65,-87,-9,123,66,-87,
-1,-61,0,-111,-64,3,95,-42,-1,67,0,-47,-2,3,0,-7,
4,0,64,-7,-124,-60,65,-7,-128,0,63,-42,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,-1,-61,0,-47,-13,83,0,-87,
-11,91,1,-87,-2,19,0,-7,-11,3,2,42,-10,3,1,-86,
-31,3,2,42,2,0,64,-7,-12,3,0,-86,66,-64,66,-7,
64,0,63,-42,-13,3,0,-86,32,1,0,-76,-123,2,64,-7,
-32,3,20,-86,-31,3,19,-86,2,0,-128,82,-29,3,21,42,
-28,3,22,-86,-91,64,67,-7,-96,0,63,-42,-32,3,19,-86,
-2,19,64,-7,-13,83,64,-87,-11,91,65,-87,-1,-61,0,-111,
-64,3,95,-42,-1,3,1,-47,-11,91,1,-87,-11,3,1,-86,
-10,3,2,-86,-31,3,5,-86,-30,3,6,42,-13,83,0,-87,
-9,123,2,-87,-13,3,0,-86,-29,31,0,-7,-9,3,4,42,
-38,-1,-1,-105,-12,3,0,-86,96,4,0,-76,100,2,64,-7,
-32,3,19,-86,-29,31,64,-7,-31,3,21,-86,-30,3,22,-86,
-124,-60,65,-7,-128,0,63,-42,32,3,0,-76,-31,3,21,-86,
-30,3,0,-86,-29,3,23,42,-28,3,20,-86,-32,3,19,-86,
25,-1,-1,-105,-11,3,0,42,97,2,64,-7,-32,3,19,-86,
33,-112,67,-7,32,0,63,-42,0,28,0,83,0,2,0,53,
98,2,64,-7,-32,3,19,-86,-31,3,20,-86,66,92,64,-7,
64,0,63,-42,-32,3,21,42,-13,83,64,-87,-11,91,65,-87,
-9,123,66,-87,-1,3,1,-111,-64,3,95,-42,21,0,-128,18,
-12,-1,-1,23,21,0,-128,18,-9,-1,-1,23,97,2,64,-7,
-32,3,19,-86,21,0,-128,18,33,64,64,-7,32,0,63,-42,
97,2,64,-7,-32,3,19,-86,33,68,64,-7,32,0,63,-42,
-24,-1,-1,23,-1,-61,0,-47,-13,83,0,-87,-2,11,0,-7,
-13,3,0,-86,-28,23,0,-7,-12,3,1,-86,6,0,64,-7,
-27,19,0,-7,-58,-60,65,-7,-64,0,63,-42,-30,3,0,-86,
-27,19,64,-7,-28,23,64,-7,-128,2,0,-76,-29,3,4,42,
-32,3,19,-86,-31,3,20,-86,-28,3,5,42,19,-1,-1,-105,
97,2,64,-7,-32,3,19,-86,33,-112,67,-7,32,0,63,-42,
0,28,0,83,32,1,0,52,97,2,64,-7,-32,3,19,-86,
33,64,64,-7,32,0,63,-42,97,2,64,-7,-32,3,19,-86,
33,68,64,-7,32,0,63,-42,-13,83,64,-87,-2,11,64,-7,
-1,-61,0,-111,-64,3,95,-42,0,0,-128,18,-64,3,95,-42,
-28,3,2,42,2,0,0,-80,66,0,52,-111,-27,3,3,42,
67,64,0,-111,-44,-1,-1,23,-1,-125,0,-47,-96,0,0,-80,
-31,-125,0,-111,-126,0,-128,82,34,0,-96,114,-13,123,0,-87,
3,48,64,-7,-77,0,0,-112,63,12,31,-8,-32,3,3,-86,
100,-10,71,-7,99,0,64,-7,-124,0,64,-7,99,24,64,-7,
-28,15,0,-7,96,0,63,-42,0,2,0,53,-32,11,64,-7,
-64,1,0,-76,2,0,64,-7,1,0,0,-80,33,0,52,-111,
33,-128,0,-111,66,24,64,-7,64,0,63,-42,-32,0,0,-76,
-30,11,64,-7,-31,3,0,-86,-32,3,2,-86,66,0,64,-7,
66,92,64,-7,64,0,63,-42,115,-10,71,-7,0,0,-128,18,
-30,15,64,-7,97,2,64,-7,95,0,1,-21,-127,0,0,84,
-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,-35,-16,-1,-105,
-1,3,1,-47,-90,0,0,-80,-29,3,1,-111,-126,0,-128,82,
34,0,-96,114,-11,91,1,-87,-13,83,0,-87,-9,123,2,-87,
-58,48,64,-7,-77,0,0,-112,127,12,31,-8,-10,3,0,42,
-11,3,1,42,-32,3,6,-86,-57,0,64,-7,-31,3,3,-86,
104,-10,71,-7,-29,24,64,-7,6,1,64,-7,-26,31,0,-7,
96,0,63,-42,0,3,0,53,-32,27,64,-7,-64,2,0,-76,
2,0,64,-7,20,0,0,-80,-108,2,52,-111,-127,-126,0,-111,
66,24,64,-7,64,0,63,-42,-9,3,0,-86,-64,1,0,-76,
-32,27,64,-7,-31,3,23,-86,-30,3,20,-86,-125,66,0,-111,
-28,3,22,42,-27,3,21,42,-125,-1,-1,-105,-30,27,64,-7,
-31,3,23,-86,-32,3,2,-86,66,0,64,-7,66,92,64,-7,
64,0,63,-42,115,-10,71,-7,-31,31,64,-7,96,2,64,-7,
63,0,0,-21,-63,0,0,84,-13,83,64,-87,-11,91,65,-87,
-9,123,66,-87,-1,3,1,-111,-64,3,95,-42,-91,-16,-1,-105,
-95,0,0,-80,-1,67,0,-47,32,48,0,-7,-96,0,0,-112,
-2,3,0,-7,0,-8,71,-7,-112,1,0,-108,-64,0,0,53,
-128,0,-128,82,32,0,-96,114,-2,3,64,-7,-1,67,0,-111,
-64,3,95,-42,0,0,-128,18,-4,-1,-1,23,-1,67,0,-47,
-32,3,2,42,-2,3,0,-7,-124,-10,-1,-105,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,-1,67,0,-47,-32,3,2,42,
-31,3,3,42,-2,3,0,-7,73,-4,-1,-105,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,-1,3,1,-47,-31,3,2,-86,
-13,83,0,-87,-11,91,1,-87,-13,3,0,-86,-2,19,0,-7,
-28,27,0,-7,-29,31,0,-7,-99,-2,-1,-105,-28,27,64,-7,
-12,3,0,-86,-32,3,19,-86,-31,3,4,-86,-104,-2,-1,-105,
31,0,31,-21,-13,3,0,-86,-11,7,-97,26,116,2,0,-76,
-107,2,0,52,-29,31,64,-7,-32,3,20,-86,-30,3,19,-86,
-31,3,3,42,-20,-7,-1,-105,-10,3,0,42,-32,3,20,-86,
-76,-16,-1,-105,117,0,0,52,-32,3,19,-86,-79,-16,-1,-105,
-32,3,22,42,-2,19,64,-7,-13,83,64,-87,-11,91,65,-87,
-1,3,1,-111,-64,3,95,-42,22,0,-128,18,-10,-1,-1,23,
22,0,-128,18,-14,-1,-1,23,50,-6,-1,23,96,2,-128,82,
-64,3,95,-42,-1,67,0,-47,1,0,0,-80,33,0,51,-111,
-2,3,0,-7,2,0,64,-7,66,-100,66,-7,64,0,63,-42,
-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,-1,67,0,-47,
-31,3,0,-86,-2,3,0,-7,2,28,64,-7,0,8,64,-7,
64,0,63,-42,-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,
0,60,64,-7,0,84,64,-71,-64,3,95,-42,-1,67,0,-47,
-13,123,0,-87,32,3,0,-76,1,88,64,-71,-13,3,0,-86,
65,2,0,53,96,66,1,-111,55,2,0,-108,96,58,64,-7,
64,0,0,-76,-70,-13,-1,-105,96,54,64,-7,64,0,0,-76,
-73,-13,-1,-105,96,62,64,-7,64,0,0,-76,-98,-16,-1,-105,
-32,3,19,-86,123,-16,-1,-105,0,0,-128,82,-13,123,64,-87,
-1,67,0,-111,-64,3,95,-42,0,8,64,-7,0,48,64,-7,
-73,1,0,-108,-20,-1,-1,23,0,0,-128,18,-8,-1,-1,23,
-1,67,0,-47,3,0,-128,-46,-28,3,3,42,-27,3,3,42,
-13,123,0,-87,-13,3,0,-86,6,20,64,-7,0,8,64,-7,
98,26,64,-71,-64,0,63,-42,97,62,64,-7,32,0,-128,82,
32,104,0,-71,127,94,0,-71,96,98,0,-71,-13,123,64,-87,
-1,67,0,-111,-64,3,95,-42,-1,3,1,-47,-31,3,2,-86,
-13,83,0,-87,-11,91,1,-87,-2,19,0,-7,-13,3,0,-86,
-12,3,2,-86,98,32,0,81,0,80,64,-71,17,-13,-1,-105,
31,0,31,107,-30,3,0,42,-51,0,0,84,96,58,64,-7,
-31,3,20,-86,-117,-13,-1,-105,-12,3,0,42,64,1,0,52,
96,94,64,-71,96,0,0,53,96,98,64,-71,-96,6,0,52,
-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,-1,3,1,-111,
-64,3,95,-42,96,58,64,-7,121,-12,-1,-105,31,12,0,113,
9,-1,-1,84,96,58,64,-7,114,-12,-1,-105,21,0,64,-71,
96,58,64,-7,114,-12,-1,-105,-95,18,0,17,31,0,1,107,
1,-2,-1,84,102,22,64,-7,-27,3,20,42,96,10,64,-7,
-127,8,-128,82,98,26,64,-71,3,0,-128,-46,-28,3,20,42,
-64,0,63,-42,-27,3,0,42,64,-4,-1,53,98,26,64,-71,
96,58,64,-7,-27,31,0,-7,118,10,64,-7,-30,27,0,-7,
116,22,64,-7,91,-12,-1,-105,-30,27,64,-7,3,16,0,-111,
-27,31,64,-7,-28,3,21,42,-95,8,-128,82,-32,3,22,-86,
-128,2,63,-42,-28,3,0,42,64,-6,-1,53,102,22,64,-7,
-63,8,-128,82,96,10,64,-7,3,0,-128,-46,98,26,64,-71,
-27,3,4,42,-64,0,63,-42,64,-7,-1,53,-51,-1,-1,23,
-32,3,19,-86,-2,19,64,-7,-13,83,64,-87,-11,91,65,-87,
33,10,-128,82,-1,3,1,-111,-98,-1,-1,23,-1,67,1,-47,
-13,83,0,-87,-76,0,0,-112,-13,3,0,-86,-11,123,1,-87,
-128,-10,71,-7,0,0,64,-7,-32,39,0,-7,19,14,0,-76,
32,4,1,81,31,80,0,113,-23,0,0,84,96,94,64,-71,
96,0,0,53,117,98,64,-71,-75,12,0,52,21,0,-128,82,
13,0,0,20,5,0,0,-80,-91,-64,52,-111,-96,72,96,56,
97,0,0,16,32,-120,32,-117,0,0,31,-42,97,62,64,-7,
32,0,-128,82,21,0,-128,82,32,104,0,-71,96,94,0,-71,
117,98,0,-71,-108,-10,71,-7,-32,3,21,42,-30,39,64,-7,
-127,2,64,-7,95,0,1,-21,-31,10,0,84,-13,83,64,-87,
-11,123,65,-87,-1,67,1,-111,-64,3,95,-42,-28,67,1,-111,
98,10,64,-7,97,86,64,-71,96,54,64,-7,-97,76,31,-72,
85,48,64,-7,-31,31,0,-7,-28,27,0,-7,-28,23,0,-7,
16,-12,-1,-105,-32,23,0,-7,96,54,64,-7,16,-12,-1,-105,
-29,3,0,42,-31,31,64,-7,-32,3,21,-86,-30,23,64,-7,
-28,27,64,-7,64,1,0,-108,-96,6,0,52,96,94,64,-71,
96,-6,-1,53,96,98,64,-71,32,-6,-1,53,-32,3,19,-86,
33,10,-128,82,21,0,-128,82,90,-1,-1,-105,-38,-1,-1,23,
96,54,64,-7,-31,3,3,-86,-30,3,4,42,1,-13,-1,-105,
-32,-8,-1,52,96,94,64,-71,-96,-8,-1,53,96,98,64,-71,
96,-8,-1,53,-32,3,19,-86,33,10,-128,82,21,0,-128,82,
76,-1,-1,-105,-52,-1,-1,23,-51,-17,-1,-105,-30,3,0,-86,
-96,-2,-1,-76,100,10,64,-7,-29,-1,-1,-16,0,84,64,-71,
99,112,50,-111,97,82,64,-71,21,0,-128,82,65,80,0,-71,
0,0,31,50,67,28,0,-7,-31,-1,-1,-16,-29,-1,-1,-16,
64,84,0,-71,95,12,0,-7,33,32,54,-111,95,20,0,-7,
99,0,51,-111,65,16,0,-7,-31,3,2,-86,95,24,0,-7,
67,32,0,-7,83,8,0,-7,95,48,0,-7,-128,16,64,-7,
98,62,0,-7,-63,-17,-1,-105,-81,-1,-1,23,-32,71,64,-71,
21,0,-128,82,96,90,0,-71,-85,-1,-1,23,-32,3,19,-86,
65,28,-128,82,39,-1,-1,-105,-89,-1,-1,23,21,0,-128,18,
-91,-1,-1,23,75,-17,-1,-105,3,92,64,-71,99,0,0,53,
2,96,64,-71,66,0,0,52,-64,3,95,-42,29,-1,-1,23,
-1,67,1,-47,-13,83,0,-87,-12,3,0,42,0,16,-128,-46,
-2,11,0,-7,-31,39,0,-7,-30,35,0,-7,-29,31,0,-7,
-28,27,0,-7,-27,23,0,-7,38,-17,-1,-105,-13,3,0,-86,
32,4,0,-76,31,124,1,-87,-31,39,64,-7,-30,35,64,-7,
-29,31,64,-7,-28,27,64,-7,-27,23,64,-7,1,8,0,-7,
2,16,0,-7,3,20,0,-7,4,24,0,-7,5,28,0,-7,
31,124,0,-87,31,124,5,-87,31,124,6,-87,31,124,7,-87,
20,24,0,-71,-32,-1,-1,-16,0,48,59,-111,96,38,0,-7,
-32,-1,-1,-16,0,48,51,-111,96,34,0,-7,-98,-14,-1,-105,
96,54,0,-7,-100,-14,-1,-105,96,58,0,-7,96,1,0,-76,
96,54,64,-7,32,1,0,-76,96,66,1,-111,11,1,0,-108,
-64,0,0,53,-32,3,19,-86,-2,11,64,-7,-13,83,64,-87,
-1,67,1,-111,-64,3,95,-42,-32,3,19,-86,19,0,-128,-46,
-53,-2,-1,-105,-8,-1,-1,23,-1,67,0,-47,-13,123,0,-87,
-13,3,0,-86,96,2,0,-7,96,6,0,-7,32,0,-128,82,
96,26,0,-71,-125,-12,-1,-105,96,10,0,-7,-105,-12,-1,-105,
0,0,-128,82,-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-2,11,0,-7,-12,3,0,-86,
0,8,64,-7,-116,-12,-1,-105,-128,6,64,-7,31,0,20,-21,
-64,0,0,84,19,0,64,-7,62,-17,-1,-105,96,6,64,-7,
31,0,20,-21,-127,-1,-1,84,-128,10,64,-7,-125,-12,-1,-105,
0,0,-128,82,-2,11,64,-7,-13,83,64,-87,-1,-125,0,-111,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
-24,-1,-1,-105,96,10,64,-7,-13,123,64,-87,-1,67,0,-111,
119,-12,-1,23,-1,-125,0,-47,-13,83,0,-87,-2,11,0,-7,
-12,3,0,-86,19,0,-128,82,0,8,64,-7,110,-12,-1,-105,
-127,6,64,-7,63,0,20,-21,-96,0,0,84,33,4,64,-7,
115,6,0,17,63,0,20,-21,-95,-1,-1,84,-128,10,64,-7,
102,-12,-1,-105,-32,3,19,42,-2,11,64,-7,-13,83,64,-87,
-1,-125,0,-111,-64,3,95,-42,-1,-125,0,-47,-13,123,0,-87,
-13,3,0,-86,-31,15,0,-7,0,8,64,-7,90,-12,-1,-105,
-31,15,64,-7,98,6,64,-7,97,6,0,-7,51,0,0,-7,
34,4,0,-7,96,10,64,-7,65,0,0,-7,83,-12,-1,-105,
0,0,-128,82,-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-11,123,1,-87,0,3,0,-76,
2,8,64,-7,66,3,0,-76,-12,3,0,-86,-32,3,2,-86,
-11,3,1,42,68,-12,-1,-105,-109,6,64,-7,127,2,20,-21,
96,1,0,84,96,18,64,-71,31,0,21,107,-95,0,0,84,
8,0,0,20,99,18,64,-71,127,0,21,107,-96,0,0,84,
115,6,64,-7,127,2,20,-21,97,-1,-1,84,19,0,-128,-46,
-128,10,64,-7,53,-12,-1,-105,-32,3,19,-86,-13,83,64,-87,
-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,-32,3,2,-86,
-5,-1,-1,23,-1,-125,0,-47,-13,83,0,-87,-11,123,1,-87,
0,3,0,-76,2,8,64,-7,-30,3,0,-76,-12,3,0,-86,
-32,3,2,-86,-11,3,1,42,35,-12,-1,-105,-109,6,64,-7,
127,2,20,-21,96,1,0,84,96,18,64,-71,31,0,21,107,
-95,0,0,84,15,0,0,20,99,18,64,-71,127,0,21,107,
-128,1,0,84,115,6,64,-7,127,2,20,-21,97,-1,-1,84,
19,0,-128,-46,-128,10,64,-7,20,-12,-1,-105,-32,3,19,-86,
-13,83,64,-87,-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,
97,2,64,-7,96,6,64,-7,32,4,0,-7,1,0,0,-7,
-11,-1,-1,23,-32,3,2,-86,-10,-1,-1,23,-1,67,0,-47,
-2,3,0,-7,-40,-1,-1,-105,64,0,0,-76,-71,-18,-1,-105,
0,0,-128,82,-2,3,64,-7,-1,67,0,-111,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-2,11,0,-7,-12,3,0,-86,
-32,2,0,-76,0,8,64,-7,-96,1,0,-76,-10,-13,-1,-105,
-109,26,64,-71,96,6,0,49,-28,1,0,84,-128,26,0,-71,
-128,10,64,-7,-15,-13,-1,-105,-32,3,19,42,-2,11,64,-7,
-13,83,64,-87,-1,-125,0,-111,-64,3,95,-42,-13,3,0,42,
-2,11,64,-7,-32,3,19,42,-13,83,64,-87,-1,-125,0,-111,
-64,3,95,-42,32,0,-128,82,-15,-1,-1,23,-13,3,0,42,
-2,11,64,-7,-32,3,19,42,-13,83,64,-87,-1,-125,0,-111,
-64,3,95,-42,-1,3,1,-47,-13,83,0,-87,-12,3,0,-86,
0,3,-128,-46,-11,123,1,-87,-30,31,0,-7,-11,3,1,42,
-29,27,0,-7,-28,23,0,-7,46,-18,-1,-105,-13,3,0,-86,
-32,3,20,-86,-45,-1,-1,-105,-31,3,19,-86,96,18,0,-71,
-32,3,20,-86,117,22,0,-71,108,-1,-1,-105,-28,23,64,-7,
96,18,64,-71,-30,31,64,-7,-128,0,0,-71,-29,27,64,-7,
-31,3,2,-86,-13,83,64,-87,-11,123,65,-87,-30,3,3,42,
-1,3,1,-111,41,-3,-1,23,-1,67,0,-47,-2,3,0,-7,
52,0,0,-108,0,0,-128,82,-2,3,64,-7,-1,67,0,-111,
-64,3,95,-42,-1,-125,0,-47,-13,123,0,-87,-30,15,0,-7,
-29,11,0,-7,-120,-1,-1,-105,-13,3,0,-86,-96,1,0,-76,
-30,15,64,-7,-29,11,64,-7,0,20,64,-71,-31,3,2,-86,
-30,3,3,42,35,0,0,-108,-32,3,19,-86,97,-18,-1,-105,
0,0,-128,82,-13,123,64,-87,-1,-125,0,-111,-64,3,95,-42,
0,0,-128,18,-4,-1,-1,23,0,0,-128,82,-64,3,95,-42,
0,0,-128,82,-64,3,95,-42,-1,67,0,-47,-2,3,0,-7,
16,-18,-1,-105,-2,3,64,-7,0,124,31,19,-1,67,0,-111,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
0,0,64,-71,32,1,0,53,96,6,64,-71,-128,0,0,53,
-13,123,64,-87,-1,67,0,-111,-64,3,95,-42,-13,123,64,-87,
-1,67,0,-111,63,-18,-1,23,62,-18,-1,-105,-9,-1,-1,23,
-1,-61,0,-47,-13,83,0,-87,-11,91,1,-87,-2,19,0,-7,
-10,3,0,42,-11,3,1,-86,-12,3,2,42,19,0,-128,82,
4,0,0,20,115,2,0,11,127,2,20,107,-64,0,0,84,
-126,2,19,75,-32,3,22,42,-95,-62,51,-117,-12,-16,-1,-105,
32,-1,-1,54,-32,3,19,42,-2,19,64,-7,-13,83,64,-87,
-11,91,65,-87,-1,-61,0,-111,-64,3,95,-42,-27,-16,-1,23,
-1,-125,0,-47,-13,123,0,-87,-13,3,0,-86,0,4,-128,-46,
-31,15,0,-7,-57,-19,-1,-105,-128,0,0,-76,-31,15,64,-7,
19,8,0,-7,1,12,0,-7,-13,123,64,-87,-1,-125,0,-111,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,42,
0,7,-128,-46,-69,-19,-1,-105,32,1,0,-76,1,64,0,-111,
0,0,0,-7,0,4,0,-7,1,8,0,-7,1,12,0,-7,
31,20,0,-7,31,16,0,-7,19,48,0,-71,-13,123,64,-87,
-1,67,0,-111,-64,3,95,-42,64,1,-128,82,-18,-1,-1,23,
-1,-125,0,-47,-13,83,0,-87,-11,123,1,-87,-12,3,0,-86,
1,4,64,-7,63,0,0,-21,96,1,0,84,35,0,64,-7,
-32,3,1,-86,34,4,64,-7,98,4,0,-7,67,0,0,-7,
51,0,64,-7,-5,-19,-1,-105,97,6,64,-7,63,0,20,-21,
-31,-2,-1,84,-127,14,64,-7,-107,66,0,-111,63,0,21,-21,
96,1,0,84,35,0,64,-7,-32,3,1,-86,34,4,64,-7,
98,4,0,-7,67,0,0,-7,51,0,64,-7,-19,-19,-1,-105,
97,6,64,-7,63,0,21,-21,-31,-2,-1,84,-32,3,20,-86,
-11,123,65,-87,-13,83,64,-87,-1,-125,0,-111,-27,-19,-1,23,
-1,-125,0,-47,-13,83,0,-87,-11,123,1,-87,-13,3,0,-86,
-12,3,1,-86,0,0,64,-7,31,0,19,-21,-31,1,0,84,
20,0,0,20,68,0,64,-7,-32,3,2,-86,67,4,64,-7,
65,12,64,-7,98,18,64,-7,-125,4,0,-7,100,0,0,-7,
66,0,1,-53,98,18,0,-7,-46,-19,-1,-105,96,2,64,-7,
31,0,19,-21,-32,0,0,84,98,6,64,-7,96,50,-128,-71,
65,8,64,-7,-128,2,0,-53,63,0,0,-21,-55,-3,-1,84,
96,10,64,-7,117,66,0,-111,31,0,21,-21,-31,1,0,84,
20,0,0,20,68,0,64,-7,-32,3,2,-86,67,4,64,-7,
65,12,64,-7,98,22,64,-7,-125,4,0,-7,100,0,0,-7,
66,0,1,-53,98,22,0,-7,-70,-19,-1,-105,96,10,64,-7,
31,0,21,-21,-32,0,0,84,98,14,64,-7,96,50,-128,-71,
65,8,64,-7,-128,2,0,-53,63,0,0,-21,-55,-3,-1,84,
-13,83,64,-87,-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-13,3,0,-86,-12,3,1,-86,
-11,123,1,-87,-11,3,2,42,-62,-1,-1,-105,99,6,64,-7,
127,0,19,-21,96,1,0,84,96,8,64,-7,31,0,20,-21,
-95,0,0,84,19,0,0,20,100,8,64,-7,-97,0,20,-21,
0,2,0,84,99,4,64,-7,127,0,19,-21,97,-1,-1,84,
0,4,-128,-46,59,-19,-1,-105,32,2,0,-76,97,2,64,-7,
-30,3,21,42,20,8,0,-7,2,12,0,-7,32,4,0,-7,
1,0,0,-7,19,4,0,-7,96,2,0,-7,5,0,0,20,
96,12,64,-7,-30,3,21,42,0,0,2,-117,96,12,0,-7,
96,18,64,-7,2,0,2,-117,98,18,0,-7,-13,83,64,-87,
-11,123,65,-87,-1,-125,0,-111,-64,3,95,-42,-1,-61,0,-47,
-11,91,1,-87,-10,3,0,-86,-2,19,0,-7,-13,83,0,-87,
-11,3,2,42,-12,3,1,-86,-106,-1,-1,-105,-45,66,0,-111,
-61,14,64,-7,127,0,19,-21,96,1,0,84,96,8,64,-7,
31,0,20,-21,-95,0,0,84,19,0,0,20,100,8,64,-7,
-97,0,20,-21,0,2,0,84,99,4,64,-7,127,0,19,-21,
97,-1,-1,84,0,4,-128,-46,14,-19,-1,-105,32,2,0,-76,
-63,10,64,-7,-30,3,21,42,20,8,0,-7,2,12,0,-7,
32,4,0,-7,1,0,0,-7,19,4,0,-7,-64,10,0,-7,
5,0,0,20,96,12,64,-7,-30,3,21,42,0,0,2,-117,
96,12,0,-7,-64,22,64,-7,2,0,2,-117,-62,22,0,-7,
-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,-1,-61,0,-111,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
108,-1,-1,-105,96,18,64,-7,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
100,-1,-1,-105,96,22,64,-7,-13,123,64,-87,-1,67,0,-111,
-64,3,95,-42,-1,-61,0,-47,-13,83,0,-87,20,28,0,83,
0,4,-128,-46,-2,11,0,-7,51,28,0,83,-30,23,0,-7,
-29,19,0,-7,-33,-20,-1,-105,-32,0,0,-76,-30,23,64,-7,
-29,19,64,-7,20,72,0,57,19,76,0,57,2,12,0,-7,
3,32,0,121,-13,83,64,-87,-2,11,64,-7,-1,-61,0,-111,
-64,3,95,-42,-1,67,0,-47,-13,123,0,-87,-13,3,0,-86,
0,12,64,-7,64,0,0,-76,42,-19,-1,-105,-32,3,19,-86,
-13,123,64,-87,-1,67,0,-111,38,-19,-1,23,-1,67,0,-47,
0,3,-128,-46,-2,3,0,-7,-58,-20,-1,-105,-128,0,0,-76,
0,0,0,-7,0,4,0,-7,31,8,0,-7,-2,3,64,-7,
-1,67,0,-111,-64,3,95,-42,-1,-61,0,-47,-13,83,0,-87,
-13,3,0,-86,0,4,-128,-46,-11,123,1,-87,84,28,0,83,
53,28,0,83,-29,23,0,-7,-28,19,0,-7,-75,-20,-1,-105,
-27,3,0,-86,-96,2,0,-76,-28,19,64,-7,102,2,64,-7,
21,72,0,57,0,0,-128,82,-29,23,64,-7,-124,60,0,83,
-76,76,0,57,-92,32,0,121,-93,12,0,-7,-59,4,0,-7,
97,10,64,-7,36,32,36,-117,-90,0,0,-7,-77,4,0,-7,
101,2,0,-7,100,10,0,-7,-13,83,64,-87,-11,123,65,-87,
-1,-61,0,-111,-64,3,95,-42,0,0,-128,18,-13,83,64,-87,
-11,123,65,-87,-1,-61,0,-111,-64,3,95,-42,3,0,64,-7,
4,8,64,-7,34,32,64,121,97,4,0,-7,35,0,0,-7,
-126,0,2,-117,32,4,0,-7,1,0,0,-7,2,8,0,-7,
-64,3,95,-42,-1,-61,0,-47,-11,91,1,-87,-13,83,0,-87,
-2,19,0,-7,-12,3,0,-86,53,28,0,83,86,28,0,83,
3,4,64,-7,127,0,0,-21,-95,0,0,84,25,0,0,20,
99,4,64,-7,127,0,20,-21,-64,2,0,84,100,76,64,57,
-97,0,21,107,97,-1,-1,84,96,72,64,57,31,0,22,107,
1,-1,-1,84,100,0,64,-7,-32,3,3,-86,98,4,64,-7,
101,32,64,121,-126,4,0,-7,68,0,0,-7,-127,10,64,-7,
115,0,64,-7,33,0,5,-53,-127,10,0,-7,-98,-1,-1,-105,
-29,3,19,-86,99,4,64,-7,127,0,20,-21,-127,-3,-1,84,
-13,83,64,-87,-11,91,65,-87,-2,19,64,-7,-1,-61,0,-111,
-64,3,95,-42,1,0,64,-7,63,0,0,-21,-96,1,0,84,
1,4,64,-7,2,8,64,-7,-27,3,1,-86,36,0,64,-7,
35,4,64,-7,33,32,64,121,-125,4,0,-7,100,0,0,-7,
65,0,1,-53,1,8,0,-7,-32,3,5,-86,-64,3,95,-42,
5,0,-128,-46,-3,-1,-1,23,0,8,64,-7,-64,3,95,-42,
1,0,64,-7,63,0,0,-21,-32,7,-97,26,-64,3,95,-42,
-1,-125,0,-47,-13,83,0,-87,-2,11,0,-7,-12,3,0,-86,
1,4,64,-7,63,0,0,-21,96,1,0,84,35,0,64,-7,
-32,3,1,-86,34,4,64,-7,98,4,0,-7,67,0,0,-7,
51,0,64,-7,112,-1,-1,-105,97,6,64,-7,63,0,20,-21,
-31,-2,-1,84,-32,3,20,-86,-2,11,64,-7,-13,83,64,-87,
-1,-125,0,-111,-105,-20,-1,23,0,0,0,0,0,0,0,0,
37,117,0,0,0,0,0,0,37,100,0,0,0,0,0,0,
49,46,50,46,55,0,0,0,118,112,115,95,116,101,115,116,
95,107,101,121,0,0,0,0,58,47,47,0,0,0,0,0,
47,0,0,0,0,0,0,0,104,116,116,112,115,0,0,0,
58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
102,108,111,119,83,121,110,99,0,0,0,0,0,0,0,0,
40,73,73,41,86,0,0,0,0,0,0,0,0,0,0,0,
99,111,109,47,122,47,115,47,83,0,0,0,0,0,0,0,
59,45,16,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,-12,
-12,-12,-12,-12,0,0,0,0,1,27,3,59,-60,5,0,0,
-73,0,0,0,4,-78,-1,-1,-32,5,0,0,60,-78,-1,-1,
0,6,0,0,64,-78,-1,-1,24,6,0,0,-120,-78,-1,-1,
56,6,0,0,-100,-77,-1,-1,120,6,0,0,116,-75,-1,-1,
-80,6,0,0,-4,-75,-1,-1,-40,6,0,0,36,-74,-1,-1,
-16,6,0,0,56,-74,-1,-1,8,7,0,0,104,-73,-1,-1,
72,7,0,0,-28,-73,-1,-1,112,7,0,0,48,-72,-1,-1,
-104,7,0,0,56,-71,-1,-1,-48,7,0,0,68,-71,-1,-1,
-24,7,0,0,-124,-71,-1,-1,8,8,0,0,16,-70,-1,-1,
48,8,0,0,20,-70,-1,-1,72,8,0,0,32,-70,-1,-1,
96,8,0,0,12,-69,-1,-1,-112,8,0,0,-4,-69,-1,-1,
-56,8,0,0,-88,-68,-1,-1,-16,8,0,0,-60,-68,-1,-1,
16,9,0,0,-32,-68,-1,-1,48,9,0,0,-4,-68,-1,-1,
72,9,0,0,-108,-67,-1,-1,-128,9,0,0,-68,-67,-1,-1,
-96,9,0,0,-8,-67,-1,-1,-72,9,0,0,12,-66,-1,-1,
-48,9,0,0,-116,-66,-1,-1,8,10,0,0,-108,-66,-1,-1,
32,10,0,0,-88,-66,-1,-1,56,10,0,0,120,-65,-1,-1,
112,10,0,0,-36,-65,-1,-1,-96,10,0,0,68,-64,-1,-1,
-56,10,0,0,116,-64,-1,-1,-24,10,0,0,-44,-64,-1,-1,
16,11,0,0,76,-63,-1,-1,64,11,0,0,-60,-63,-1,-1,
112,11,0,0,-28,-63,-1,-1,-120,11,0,0,64,-62,-1,-1,
-80,11,0,0,-120,-62,-1,-1,-40,11,0,0,-108,-62,-1,-1,
-16,11,0,0,-88,-62,-1,-1,8,12,0,0,0,-61,-1,-1,
56,12,0,0,88,-61,-1,-1,104,12,0,0,-48,-61,-1,-1,
-128,12,0,0,120,-60,-1,-1,-56,12,0,0,4,-59,-1,-1,
8,13,0,0,-100,-59,-1,-1,48,13,0,0,-72,-59,-1,-1,
72,13,0,0,8,-58,-1,-1,96,13,0,0,-120,-58,-1,-1,
-120,13,0,0,-36,-58,-1,-1,-72,13,0,0,-32,-58,-1,-1,
-48,13,0,0,-28,-58,-1,-1,-24,13,0,0,20,-57,-1,-1,
8,14,0,0,52,-57,-1,-1,32,14,0,0,64,-57,-1,-1,
56,14,0,0,72,-57,-1,-1,80,14,0,0,116,-57,-1,-1,
112,14,0,0,-8,-57,-1,-1,-104,14,0,0,96,-56,-1,-1,
-48,14,0,0,108,-56,-1,-1,-24,14,0,0,120,-56,-1,-1,
0,15,0,0,124,-56,-1,-1,24,15,0,0,-124,-56,-1,-1,
48,15,0,0,-116,-56,-1,-1,72,15,0,0,-4,-56,-1,-1,
112,15,0,0,-116,-55,-1,-1,-88,15,0,0,-100,-54,-1,-1,
0,16,0,0,-8,-54,-1,-1,32,16,0,0,108,-53,-1,-1,
64,16,0,0,-52,-53,-1,-1,104,16,0,0,28,-51,-1,-1,
-88,16,0,0,36,-51,-1,-1,-64,16,0,0,92,-51,-1,-1,
-32,16,0,0,96,-51,-1,-1,-8,16,0,0,100,-51,-1,-1,
16,17,0,0,-84,-51,-1,-1,56,17,0,0,20,-50,-1,-1,
104,17,0,0,-108,-50,-1,-1,-112,17,0,0,40,-49,-1,-1,
-64,17,0,0,-48,-49,-1,-1,-24,17,0,0,116,-48,-1,-1,
16,18,0,0,104,-47,-1,-1,104,18,0,0,-80,-47,-1,-1
};
}
\ No newline at end of file
package com.vps.library;
public class b3{
public static byte []b3 = {
-120,18,0,0,112,-46,-1,-1,-56,18,0,0,-72,-46,-1,-1,
-24,18,0,0,0,-45,-1,-1,8,19,0,0,20,-45,-1,-1,
32,19,0,0,-32,-45,-1,-1,56,19,0,0,8,-44,-1,-1,
88,19,0,0,64,-44,-1,-1,112,19,0,0,-8,-44,-1,-1,
-96,19,0,0,124,-43,-1,-1,-56,19,0,0,-44,-43,-1,-1,
-16,19,0,0,-116,-42,-1,-1,24,20,0,0,-24,-41,-1,-1,
80,20,0,0,20,-40,-1,-1,112,20,0,0,48,-40,-1,-1,
-120,20,0,0,24,-38,-1,-1,-96,20,0,0,96,-36,-1,-1,
-72,20,0,0,-120,-36,-1,-1,-48,20,0,0,4,-35,-1,-1,
-8,20,0,0,20,-35,-1,-1,16,21,0,0,-124,-35,-1,-1,
56,21,0,0,-12,-35,-1,-1,96,21,0,0,-4,-34,-1,-1,
-96,21,0,0,-108,-33,-1,-1,-40,21,0,0,-88,-33,-1,-1,
-16,21,0,0,-60,-32,-1,-1,24,22,0,0,-128,-31,-1,-1,
80,22,0,0,-84,-31,-1,-1,112,22,0,0,-68,-31,-1,-1,
-120,22,0,0,76,-30,-1,-1,-72,22,0,0,104,-30,-1,-1,
-48,22,0,0,-120,-30,-1,-1,-24,22,0,0,0,-27,-1,-1,
56,23,0,0,36,-25,-1,-1,112,23,0,0,-84,-25,-1,-1,
-120,23,0,0,96,-24,-1,-1,-80,23,0,0,20,-23,-1,-1,
-40,23,0,0,-76,-23,-1,-1,24,24,0,0,80,-22,-1,-1,
88,24,0,0,112,-22,-1,-1,120,24,0,0,-36,-22,-1,-1,
-88,24,0,0,-52,-21,-1,-1,-32,24,0,0,96,-20,-1,-1,
8,25,0,0,104,-20,-1,-1,32,25,0,0,-128,-20,-1,-1,
56,25,0,0,40,-19,-1,-1,96,25,0,0,8,-18,-1,-1,
-112,25,0,0,68,-18,-1,-1,-80,25,0,0,96,-18,-1,-1,
-48,25,0,0,-128,-18,-1,-1,-16,25,0,0,32,-17,-1,-1,
32,26,0,0,36,-17,-1,-1,56,26,0,0,44,-17,-1,-1,
80,26,0,0,84,-17,-1,-1,112,26,0,0,120,-17,-1,-1,
-112,26,0,0,-124,-17,-1,-1,-88,26,0,0,-8,-17,-1,-1,
-48,26,0,0,64,-16,-1,-1,-16,26,0,0,-124,-15,-1,-1,
40,27,0,0,112,-13,-1,-1,88,27,0,0,-120,-13,-1,-1,
112,27,0,0,96,-12,-1,-1,-104,27,0,0,-104,-12,-1,-1,
-72,27,0,0,-20,-12,-1,-1,-32,27,0,0,12,-11,-1,-1,
0,28,0,0,96,-11,-1,-1,40,28,0,0,-88,-11,-1,-1,
72,28,0,0,44,-10,-1,-1,120,28,0,0,-60,-10,-1,-1,
-88,28,0,0,-24,-10,-1,-1,-56,28,0,0,108,-9,-1,-1,
8,29,0,0,-32,-9,-1,-1,48,29,0,0,-4,-9,-1,-1,
80,29,0,0,80,-8,-1,-1,120,29,0,0,88,-8,-1,-1,
-112,29,0,0,96,-8,-1,-1,-88,29,0,0,124,-8,-1,-1,
-56,29,0,0,-72,-8,-1,-1,-8,29,0,0,20,-7,-1,-1,
40,30,0,0,24,-7,-1,-1,64,30,0,0,76,-7,-1,-1,
96,30,0,0,-112,-7,-1,-1,-128,30,0,0,-104,-7,-1,-1,
-104,30,0,0,40,-6,-1,-1,-64,30,0,0,8,-5,-1,-1,
-24,30,0,0,-76,-5,-1,-1,16,31,0,0,108,-4,-1,-1,
64,31,0,0,-116,-4,-1,-1,96,31,0,0,-84,-4,-1,-1,
-128,31,0,0,-4,-4,-1,-1,-88,31,0,0,36,-3,-1,-1,
-56,31,0,0,80,-3,-1,-1,-24,31,0,0,-28,-3,-1,-1,
32,32,0,0,12,-2,-1,-1,56,32,0,0,-84,-2,-1,-1,
104,32,0,0,-16,-2,-1,-1,-128,32,0,0,-8,-2,-1,-1,
-104,32,0,0,8,-1,-1,-1,-80,32,0,0,0,0,0,0,
20,0,0,0,0,0,0,0,1,122,82,0,4,120,30,1,
27,12,31,0,0,0,0,0,28,0,0,0,28,0,0,0,
28,-84,-1,-1,56,0,0,0,0,65,14,16,66,-98,2,73,
-34,65,14,0,0,0,0,0,20,0,0,0,60,0,0,0,
52,-84,-1,-1,4,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,84,0,0,0,32,-84,-1,-1,72,0,0,0,
0,65,14,32,65,-109,4,-98,3,78,-34,-45,65,14,0,0,
60,0,0,0,116,0,0,0,72,-84,-1,-1,20,1,0,0,
0,65,14,80,69,-107,8,-106,7,-105,6,-104,5,-103,4,-102,
3,-109,10,-108,9,-101,2,-98,1,121,-44,-45,65,-42,-43,65,
-40,-41,65,-38,-39,65,-34,-37,65,14,0,0,0,0,0,0,
52,0,0,0,-76,0,0,0,28,-83,-1,-1,-40,1,0,0,
0,65,14,64,68,-107,6,-106,5,-105,4,-104,3,-109,8,-108,
7,-98,2,2,94,10,-44,-45,65,-42,-43,65,-40,-41,65,-34,
65,14,0,65,11,0,0,0,36,0,0,0,-20,0,0,0,
-68,-82,-1,-1,-120,0,0,0,0,65,14,32,66,-109,4,-108,
3,-98,2,90,10,-44,-45,65,-34,65,14,0,65,11,0,0,
20,0,0,0,20,1,0,0,28,-81,-1,-1,40,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,44,1,0,0,
44,-81,-1,-1,20,0,0,0,0,0,0,0,0,0,0,0,
60,0,0,0,68,1,0,0,40,-81,-1,-1,48,1,0,0,
0,65,14,-16,2,65,-107,44,-106,43,69,-109,46,-108,45,-105,
42,-104,41,66,-103,40,-98,39,125,10,-44,-45,65,-42,-43,65,
-40,-41,65,-34,-39,65,14,0,65,11,0,0,0,0,0,0,
36,0,0,0,-124,1,0,0,24,-80,-1,-1,124,0,0,0,
0,65,14,32,65,-109,4,-108,3,67,-107,2,-98,1,87,-44,
-45,65,-34,-43,65,14,0,0,36,0,0,0,-84,1,0,0,
108,-80,-1,-1,76,0,0,0,0,65,14,32,66,-109,4,-108,
3,-98,2,77,-44,-45,65,-34,65,14,0,0,0,0,0,0,
52,0,0,0,-44,1,0,0,-112,-80,-1,-1,8,1,0,0,
0,65,14,48,67,-109,6,-108,5,-107,4,-106,3,-98,2,92,
10,-44,-45,65,-42,-43,65,-34,65,14,0,65,11,90,-45,-44,
65,-43,-42,65,-34,65,14,0,20,0,0,0,12,2,0,0,
96,-79,-1,-1,12,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,36,2,0,0,84,-79,-1,-1,64,0,0,0,
0,65,14,16,65,-109,2,-98,1,76,-34,-45,65,14,0,0,
36,0,0,0,68,2,0,0,116,-79,-1,-1,-116,0,0,0,
0,65,14,32,65,-109,4,-108,3,67,-98,2,85,10,-44,-45,
65,-34,65,14,0,65,11,0,20,0,0,0,108,2,0,0,
-40,-79,-1,-1,4,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,-124,2,0,0,-60,-79,-1,-1,12,0,0,0,
0,0,0,0,0,0,0,0,44,0,0,0,-100,2,0,0,
-72,-79,-1,-1,-20,0,0,0,0,65,14,96,67,-109,12,-108,
11,67,-98,8,-107,10,-106,9,92,10,-44,-45,65,-42,-43,65,
-34,65,14,0,65,11,0,0,52,0,0,0,-52,2,0,0,
116,-78,-1,-1,-16,0,0,0,0,65,14,-128,1,65,-109,16,
-108,15,67,-105,12,-98,11,-107,14,-106,13,108,10,-44,-45,65,
-42,-43,65,-34,-41,65,14,0,65,11,0,0,0,0,0,0,
36,0,0,0,4,3,0,0,44,-77,-1,-1,-84,0,0,0,
0,65,14,64,66,-109,8,-108,7,66,-98,6,92,10,-44,-45,
65,-34,65,14,0,65,11,0,28,0,0,0,44,3,0,0,
-80,-77,-1,-1,28,0,0,0,0,65,14,16,66,-98,2,66,
-34,65,14,0,0,0,0,0,28,0,0,0,76,3,0,0,
-84,-77,-1,-1,28,0,0,0,0,65,14,16,66,-98,2,66,
-34,65,14,0,0,0,0,0,20,0,0,0,108,3,0,0,
-88,-77,-1,-1,28,0,0,0,0,0,0,0,0,0,0,0,
52,0,0,0,-124,3,0,0,-84,-77,-1,-1,-104,0,0,0,
0,65,14,64,65,-109,8,-108,7,69,-107,6,-106,5,-105,4,
-104,3,-98,2,84,10,-44,-45,65,-42,-43,65,-40,-41,65,-34,
65,14,0,65,11,0,0,0,28,0,0,0,-68,3,0,0,
12,-76,-1,-1,40,0,0,0,0,65,14,16,65,-109,2,-98,
1,70,-34,-45,65,14,0,0,20,0,0,0,-36,3,0,0,
20,-76,-1,-1,60,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,-12,3,0,0,56,-76,-1,-1,20,0,0,0,
0,0,0,0,0,0,0,0,52,0,0,0,12,4,0,0,
52,-76,-1,-1,-128,0,0,0,0,65,14,32,65,-109,4,-108,
3,67,-98,2,73,10,-34,65,-44,-45,65,14,0,65,11,74,
10,-34,65,-45,-44,65,14,0,65,11,0,0,0,0,0,0,
20,0,0,0,68,4,0,0,124,-76,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,92,4,0,0,
108,-76,-1,-1,20,0,0,0,0,0,0,0,0,0,0,0,
52,0,0,0,116,4,0,0,104,-76,-1,-1,-48,0,0,0,
0,65,14,32,66,-109,4,-108,3,-107,2,-98,1,81,10,-45,
-44,65,-43,-34,65,14,0,65,11,82,10,-44,-45,65,-34,-43,
65,14,0,65,11,0,0,0,44,0,0,0,-84,4,0,0,
0,-75,-1,-1,100,0,0,0,0,65,14,32,65,-107,2,-98,
1,67,-109,4,-108,3,78,10,-44,-45,65,-34,-43,65,14,0,
65,11,0,0,0,0,0,0,36,0,0,0,-36,4,0,0,
52,-75,-1,-1,104,0,0,0,0,65,14,32,66,-109,4,-108,
3,-98,2,81,10,-34,65,-44,-45,65,14,0,65,11,0,0,
28,0,0,0,4,5,0,0,116,-75,-1,-1,48,0,0,0,
0,65,14,32,65,-109,4,-98,3,72,-34,-45,65,14,0,0,
36,0,0,0,36,5,0,0,-124,-75,-1,-1,96,0,0,0,
0,65,14,32,66,-109,4,-108,3,-98,2,79,10,-34,65,-44,
-45,65,14,0,65,11,0,0,44,0,0,0,76,5,0,0,
-68,-75,-1,-1,120,0,0,0,0,65,14,64,68,-109,8,-108,
7,67,-107,6,-98,5,82,10,-44,-45,65,-34,-43,65,14,0,
65,11,0,0,0,0,0,0,44,0,0,0,124,5,0,0,
4,-74,-1,-1,120,0,0,0,0,65,14,64,68,-109,8,-108,
7,67,-107,6,-98,5,82,10,-44,-45,65,-34,-43,65,14,0,
65,11,0,0,0,0,0,0,20,0,0,0,-84,5,0,0,
76,-74,-1,-1,32,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,-60,5,0,0,84,-74,-1,-1,92,0,0,0,
0,65,14,32,66,-109,4,-108,3,-98,2,79,10,-34,65,-44,
-45,65,14,0,65,11,0,0,36,0,0,0,-20,5,0,0,
-120,-74,-1,-1,72,0,0,0,0,65,14,32,66,-109,4,-108,
3,-98,2,74,10,-44,-45,65,-34,65,14,0,65,11,0,0,
20,0,0,0,20,6,0,0,-88,-74,-1,-1,12,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,44,6,0,0,
-100,-74,-1,-1,20,0,0,0,0,0,0,0,0,0,0,0,
44,0,0,0,68,6,0,0,-104,-74,-1,-1,88,0,0,0,
0,65,14,32,66,-109,4,-108,3,-107,2,-98,1,78,10,-44,
-45,65,-34,-43,65,14,0,65,11,0,0,0,0,0,0,0,
44,0,0,0,116,6,0,0,-64,-74,-1,-1,88,0,0,0,
0,65,14,32,66,-109,4,-108,3,-107,2,-98,1,78,10,-44,
-45,65,-34,-43,65,14,0,65,11,0,0,0,0,0,0,0,
20,0,0,0,-92,6,0,0,-24,-74,-1,-1,120,0,0,0,
0,0,0,0,0,0,0,0,68,0,0,0,-68,6,0,0,
72,-73,-1,-1,-88,0,0,0,0,65,14,64,67,-109,8,-108,
7,-107,6,-106,5,-98,4,71,10,-34,65,-44,-45,65,-42,-43,
65,14,0,65,11,78,10,-34,67,-45,-44,65,-43,-42,65,14,
0,65,11,66,-34,66,-45,-44,65,-43,-42,65,14,0,0,0,
60,0,0,0,4,7,0,0,-88,-73,-1,-1,-116,0,0,0,
0,65,14,48,66,-109,6,-108,5,-98,4,72,10,-34,65,-44,
-45,65,14,0,65,11,74,10,-34,67,-45,-44,65,14,0,65,
11,66,-34,66,-45,-44,65,14,0,0,0,0,0,0,0,0,
36,0,0,0,68,7,0,0,-12,-73,-1,-1,-104,0,0,0,
0,65,14,64,66,-109,8,-108,7,-98,6,92,10,-34,65,-44,
-45,65,14,0,65,11,0,0,20,0,0,0,108,7,0,0,
100,-72,-1,-1,28,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,-124,7,0,0,104,-72,-1,-1,80,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,-100,7,0,0,
-96,-72,-1,-1,-128,0,0,0,0,65,14,16,65,-98,2,88,
10,-34,65,14,0,65,11,66,-34,65,14,0,0,0,0,0,
44,0,0,0,-60,7,0,0,-8,-72,-1,-1,84,0,0,0,
0,65,14,16,66,-109,2,-98,1,74,10,-34,-45,65,14,0,
65,11,65,10,-45,-34,65,14,0,65,11,0,0,0,0,0,
20,0,0,0,-12,7,0,0,28,-71,-1,-1,4,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,12,8,0,0,
8,-71,-1,-1,4,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,36,8,0,0,-12,-72,-1,-1,48,0,0,0,
0,65,14,16,65,-109,2,-98,1,72,-34,-45,65,14,0,0,
20,0,0,0,68,8,0,0,4,-71,-1,-1,32,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,92,8,0,0,
12,-71,-1,-1,12,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,116,8,0,0,0,-71,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,28,0,0,0,-116,8,0,0,
-16,-72,-1,-1,44,0,0,0,0,65,14,16,68,-98,2,68,
-34,65,14,0,0,0,0,0,36,0,0,0,-84,8,0,0,
-4,-72,-1,-1,-124,0,0,0,0,65,14,32,67,-109,4,-108,
3,-98,2,90,-44,-45,65,-34,65,14,0,0,0,0,0,0,
52,0,0,0,-44,8,0,0,88,-71,-1,-1,104,0,0,0,
0,65,14,16,65,-109,2,-98,1,70,10,-34,-45,65,14,0,
65,11,74,10,-34,-45,65,14,0,65,11,65,-34,-45,66,14,
0,0,0,0,0,0,0,0,20,0,0,0,12,9,0,0,
-120,-71,-1,-1,12,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,36,9,0,0,124,-71,-1,-1,12,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,60,9,0,0,
112,-71,-1,-1,4,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,84,9,0,0,92,-71,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,108,9,0,0,
76,-71,-1,-1,8,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,-124,9,0,0,60,-71,-1,-1,112,0,0,0,
0,65,14,16,65,-109,2,-98,1,74,10,-34,-45,65,14,0,
65,11,76,-45,-34,65,14,0,52,0,0,0,-84,9,0,0,
-124,-71,-1,-1,-112,0,0,0,0,65,14,80,70,-107,8,-106,
7,-105,6,-104,5,-103,4,-102,3,-109,10,-108,9,-98,2,87,
-44,-45,65,-42,-43,65,-40,-41,65,-38,-39,65,-34,65,14,0,
84,0,0,0,-28,9,0,0,-36,-71,-1,-1,16,1,0,0,
0,65,14,96,70,-105,8,-104,7,-109,12,-108,11,-103,6,-102,
5,-101,4,-100,3,-107,10,-106,9,-98,2,108,10,-44,-45,65,
-42,-43,65,-40,-41,65,-38,-39,65,-36,-37,65,-34,65,14,0,
65,11,67,-44,-45,65,-42,-43,65,-40,-41,65,-38,-39,65,-36,
-37,65,-34,65,14,0,0,0,28,0,0,0,60,10,0,0,
-108,-70,-1,-1,92,0,0,0,0,65,14,32,65,-109,4,-98,
3,83,-34,-45,65,14,0,0,28,0,0,0,92,10,0,0,
-48,-70,-1,-1,116,0,0,0,0,65,14,48,68,-109,6,-108,
5,-107,4,-106,3,-98,2,0,36,0,0,0,124,10,0,0,
36,-69,-1,-1,96,0,0,0,0,65,14,32,65,-109,4,-98,
3,75,10,-34,-45,65,14,0,65,11,0,0,0,0,0,0,
60,0,0,0,-92,10,0,0,92,-69,-1,-1,80,1,0,0,
0,65,14,48,66,-109,6,-108,5,-107,4,-98,3,104,10,-44,
-45,65,-34,-43,65,14,0,65,11,81,10,-44,-45,65,-34,-43,
66,14,0,66,11,77,-45,-44,65,-43,-34,65,14,0,0,0,
20,0,0,0,-28,10,0,0,108,-68,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,28,0,0,0,-4,10,0,0,
92,-68,-1,-1,56,0,0,0,0,65,14,16,69,-109,2,-98,
1,70,-34,-45,65,14,0,0,20,0,0,0,28,11,0,0,
116,-68,-1,-1,4,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,52,11,0,0,96,-68,-1,-1,4,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,76,11,0,0,
76,-68,-1,-1,72,0,0,0,0,65,14,16,70,-109,2,-98,
1,69,10,-34,-45,65,14,0,65,11,66,-34,-45,65,14,0,
44,0,0,0,116,11,0,0,108,-68,-1,-1,104,0,0,0,
0,65,14,32,65,-109,4,-98,3,79,10,-34,-45,65,14,0,
65,11,66,10,-34,-45,65,14,0,65,11,0,0,0,0,0,
36,0,0,0,-92,11,0,0,-92,-68,-1,-1,-128,0,0,0,
0,65,14,48,70,-109,6,-108,5,66,-98,4,83,10,-44,-45,
65,-34,65,14,0,65,11,0,44,0,0,0,-52,11,0,0,
-4,-68,-1,-1,-108,0,0,0,0,65,14,64,68,-109,8,-108,
7,67,-107,6,-98,5,89,10,-44,-45,65,-34,-43,65,14,0,
65,11,0,0,0,0,0,0,36,0,0,0,-4,11,0,0,
96,-67,-1,-1,-88,0,0,0,0,65,14,48,66,-109,6,-108,
5,66,-98,4,88,10,-44,-45,65,-34,65,14,0,65,11,0,
36,0,0,0,36,12,0,0,-32,-67,-1,-1,-92,0,0,0,
0,65,14,48,66,-109,6,-108,5,66,-98,4,88,10,-44,-45,
65,-34,65,14,0,65,11,0,84,0,0,0,76,12,0,0,
92,-66,-1,-1,-12,0,0,0,0,65,14,64,69,-109,8,-108,
7,-107,6,-106,5,-105,4,-104,3,78,-98,2,80,10,-44,-45,
65,-42,-43,65,-40,-41,65,-34,65,14,0,65,11,68,10,-34,
65,-45,-44,65,-43,-42,65,-41,-40,65,14,0,65,11,69,-42,
-43,65,-44,-45,65,-40,-41,65,-34,66,14,0,0,0,0,0,
28,0,0,0,-92,12,0,0,-8,-66,-1,-1,72,0,0,0,
0,65,14,16,65,-98,2,78,-34,65,14,0,0,0,0,0,
60,0,0,0,-60,12,0,0,32,-65,-1,-1,-64,0,0,0,
0,65,14,48,68,-109,6,-108,5,-107,4,-106,3,73,-105,2,
-98,1,84,10,-34,-41,65,-44,-45,65,-42,-43,65,14,0,65,
11,67,-42,-43,65,-44,-45,65,-34,-41,68,14,0,0,0,0,
28,0,0,0,4,13,0,0,-96,-65,-1,-1,72,0,0,0,
0,65,14,16,65,-98,2,78,-34,65,14,0,0,0,0,0,
28,0,0,0,36,13,0,0,-56,-65,-1,-1,72,0,0,0,
0,65,14,16,65,-98,2,78,-34,65,14,0,0,0,0,0,
20,0,0,0,68,13,0,0,-16,-65,-1,-1,20,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,92,13,0,0,
-20,-65,-1,-1,-52,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,116,13,0,0,-96,-64,-1,-1,40,0,0,0,
0,65,14,16,65,-109,2,-98,1,0,0,0,0,0,0,0,
20,0,0,0,-108,13,0,0,-88,-64,-1,-1,56,0,0,0,
0,0,0,0,0,0,0,0,44,0,0,0,-84,13,0,0,
-56,-64,-1,-1,-72,0,0,0,0,65,14,32,66,-109,4,-108,
3,66,-98,2,90,10,-44,-45,65,-34,65,14,0,65,11,73,
-34,65,-45,-44,65,14,0,0,36,0,0,0,-36,13,0,0,
80,-63,-1,-1,-124,0,0,0,0,65,14,16,65,-109,2,-98,
1,88,10,-34,-45,65,14,0,65,11,67,-34,-45,65,14,0,
36,0,0,0,4,14,0,0,-84,-63,-1,-1,88,0,0,0,
0,65,14,32,66,-109,4,-108,3,-98,2,80,-44,-45,65,-34,
65,14,0,0,0,0,0,0,36,0,0,0,44,14,0,0,
-36,-63,-1,-1,-72,0,0,0,0,65,14,32,65,-109,4,-108,
3,67,-98,2,100,10,-34,65,-44,-45,65,14,0,65,11,0,
52,0,0,0,84,14,0,0,108,-62,-1,-1,92,1,0,0,
0,65,14,-32,1,65,-109,28,-108,27,68,-98,22,-107,26,-106,
25,-105,24,-104,23,2,67,10,-44,-45,65,-42,-43,65,-40,-41,
65,-34,65,14,0,65,11,0,28,0,0,0,-116,14,0,0,
-112,-61,-1,-1,44,0,0,0,0,66,14,16,66,-98,2,69,
-34,65,14,0,0,0,0,0,20,0,0,0,-84,14,0,0,
-100,-61,-1,-1,28,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,-60,14,0,0,-96,-61,-1,-1,-60,1,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,-36,14,0,0,
112,-59,-1,-1,28,2,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,-12,14,0,0,-96,-57,-1,-1,40,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,12,15,0,0,
-80,-57,-1,-1,124,0,0,0,0,65,14,16,66,-109,2,-98,
1,87,10,-34,-45,65,14,0,65,11,0,0,0,0,0,0,
20,0,0,0,52,15,0,0,4,-56,-1,-1,16,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,76,15,0,0,
-4,-57,-1,-1,112,0,0,0,0,65,14,16,65,-109,2,-98,
1,84,10,-34,-45,65,14,0,65,11,0,0,0,0,0,0,
36,0,0,0,116,15,0,0,68,-56,-1,-1,112,0,0,0,
0,65,14,48,66,-109,6,-108,5,-98,4,86,-44,-45,65,-34,
65,14,0,0,0,0,0,0,60,0,0,0,-100,15,0,0,
-116,-56,-1,-1,8,1,0,0,0,65,14,48,67,-109,6,-108,
5,-107,4,-106,3,-98,2,94,10,-44,-45,65,-42,-43,65,-34,
65,14,0,65,11,76,10,-45,-44,65,-43,-42,65,-34,65,14,
0,65,11,0,0,0,0,0,52,0,0,0,-36,15,0,0,
84,-55,-1,-1,-104,0,0,0,0,65,14,16,65,-109,2,-98,
1,79,10,-34,-45,65,14,0,67,11,68,10,-45,-34,65,14,
0,66,11,72,-45,-34,65,14,0,0,0,0,0,0,0,0,
20,0,0,0,20,16,0,0,-76,-55,-1,-1,20,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,44,16,0,0,
-80,-55,-1,-1,28,1,0,0,0,65,14,80,65,-109,10,-108,
9,67,-98,8,118,10,-34,65,-44,-45,65,14,0,65,11,0,
52,0,0,0,84,16,0,0,-92,-54,-1,-1,-68,0,0,0,
0,65,14,16,65,-109,2,-98,1,81,10,-34,-45,65,14,0,
65,11,70,10,-45,-34,65,14,0,65,11,80,-45,-34,65,14,
0,0,0,0,0,0,0,0,28,0,0,0,-116,16,0,0,
40,-53,-1,-1,44,0,0,0,0,65,14,16,65,-109,2,-98,
1,71,-34,-45,65,14,0,0,20,0,0,0,-84,16,0,0,
52,-53,-1,-1,16,0,0,0,0,0,0,0,0,0,0,0,
44,0,0,0,-60,16,0,0,44,-53,-1,-1,-112,0,0,0,
0,65,14,48,67,-109,6,-108,5,-107,4,-106,3,-98,2,88,
10,-34,65,-44,-45,65,-42,-43,65,14,0,65,11,0,0,0,
20,0,0,0,-12,16,0,0,-116,-53,-1,-1,28,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,12,17,0,0,
-112,-53,-1,-1,32,0,0,0,0,0,0,0,0,0,0,0,
76,0,0,0,36,17,0,0,-104,-53,-1,-1,120,2,0,0,
0,65,14,80,73,-109,10,-108,9,-107,8,-106,7,-105,6,-104,
5,-103,4,-102,3,-98,2,86,10,-44,-45,65,-42,-43,65,-40,
-41,65,-38,-39,65,-34,65,14,0,65,11,67,10,-34,65,-45,
-44,65,-43,-42,65,-41,-40,65,-39,-38,65,14,0,65,11,0,
52,0,0,0,116,17,0,0,-64,-51,-1,-1,36,2,0,0,
0,65,14,96,65,-109,12,-108,11,67,-98,6,-105,8,-104,7,
69,-107,10,-106,9,2,81,10,-44,-45,65,-42,-43,65,-40,-41,
65,-34,65,14,0,65,11,0,20,0,0,0,-84,17,0,0,
-84,-49,-1,-1,-120,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,-60,17,0,0,28,-48,-1,-1,-76,0,0,0,
0,65,14,-112,2,72,-109,34,-98,33,97,10,-34,-45,65,14,
0,65,11,0,0,0,0,0,36,0,0,0,-20,17,0,0,
-88,-48,-1,-1,-76,0,0,0,0,65,14,-112,2,70,-109,34,
-98,33,99,10,-34,-45,65,14,0,65,11,0,0,0,0,0,
60,0,0,0,20,18,0,0,52,-47,-1,-1,-96,0,0,0,
0,65,14,48,67,-107,4,-106,3,-105,2,-98,1,-109,6,-108,
5,90,10,-44,-45,65,-42,-43,65,-34,-41,65,14,0,65,11,
66,-45,-44,65,-43,-42,65,-41,-34,65,14,0,0,0,0,0,
60,0,0,0,84,18,0,0,-108,-47,-1,-1,-100,0,0,0,
0,65,14,48,67,-109,6,-108,5,-107,4,-106,3,-105,2,-98,
1,89,10,-44,-45,65,-42,-43,65,-34,-41,65,14,0,65,11,
66,-45,-44,65,-43,-42,65,-41,-34,65,14,0,0,0,0,0,
28,0,0,0,-108,18,0,0,-16,-47,-1,-1,32,0,0,0,
0,65,14,16,65,-98,2,68,-34,65,14,0,0,0,0,0,
44,0,0,0,-76,18,0,0,-16,-47,-1,-1,108,0,0,0,
0,65,14,48,67,-109,6,-108,5,-107,4,-106,3,-98,2,83,
-34,65,-44,-45,65,-42,-43,65,14,0,0,0,0,0,0,0,
52,0,0,0,-28,18,0,0,44,-46,-1,-1,-16,0,0,0,
0,65,14,64,65,-107,6,-106,5,70,-109,8,-108,7,-105,4,
-98,3,98,10,-44,-45,65,-42,-43,65,-34,-41,65,14,0,65,
11,0,0,0,0,0,0,0,36,0,0,0,28,19,0,0,
-28,-46,-1,-1,-108,0,0,0,0,65,14,48,66,-109,6,-108,
5,-98,4,95,-44,-45,65,-34,65,14,0,0,0,0,0,0,
20,0,0,0,68,19,0,0,80,-45,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,92,19,0,0,
64,-45,-1,-1,24,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,116,19,0,0,64,-45,-1,-1,-88,0,0,0,
0,65,14,32,69,-109,4,-98,3,97,10,-34,-45,65,14,0,
65,11,0,0,0,0,0,0,44,0,0,0,-100,19,0,0,
-64,-45,-1,-1,-32,0,0,0,0,65,14,64,71,-107,6,-106,
5,-109,8,-108,7,-105,4,-98,3,107,10,-44,-45,65,-42,-43,
65,-34,-41,65,14,0,65,11,28,0,0,0,-52,19,0,0,
112,-44,-1,-1,60,0,0,0,0,66,14,16,67,-98,2,70,
10,-34,65,14,0,65,11,0,28,0,0,0,-20,19,0,0,
-116,-44,-1,-1,28,0,0,0,0,65,14,16,66,-98,2,66,
-34,65,14,0,0,0,0,0,28,0,0,0,12,20,0,0,
-120,-44,-1,-1,32,0,0,0,0,65,14,16,67,-98,2,66,
-34,65,14,0,0,0,0,0,44,0,0,0,44,20,0,0,
-120,-44,-1,-1,-96,0,0,0,0,65,14,64,67,-109,8,-108,
7,-107,6,-106,5,66,-98,4,90,10,-34,65,-44,-45,65,-42,
-43,65,14,0,65,11,0,0,20,0,0,0,92,20,0,0,
-8,-44,-1,-1,4,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,116,20,0,0,-28,-44,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,28,0,0,0,-116,20,0,0,
-44,-44,-1,-1,40,0,0,0,0,65,14,16,67,-98,2,68,
-34,65,14,0,0,0,0,0,28,0,0,0,-84,20,0,0,
-36,-44,-1,-1,36,0,0,0,0,65,14,16,66,-98,2,68,
-34,65,14,0,0,0,0,0,20,0,0,0,-52,20,0,0,
-32,-44,-1,-1,12,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,-28,20,0,0,-44,-44,-1,-1,116,0,0,0,
0,65,14,16,65,-109,2,-98,1,83,10,-34,-45,65,14,0,
65,11,0,0,0,0,0,0,28,0,0,0,12,21,0,0,
32,-43,-1,-1,72,0,0,0,0,65,14,16,68,-109,2,-98,
1,75,-34,-45,65,14,0,0,52,0,0,0,44,21,0,0,
72,-43,-1,-1,68,1,0,0,0,65,14,64,68,-109,8,-108,
7,-107,6,-106,5,-98,4,82,10,-44,-45,65,-42,-43,65,-34,
65,14,0,65,11,113,-34,65,-44,-45,65,-42,-43,66,14,0,
44,0,0,0,100,21,0,0,84,-42,-1,-1,-20,1,0,0,
0,65,14,80,65,-109,10,-108,9,67,-107,8,-98,7,96,10,
-44,-45,65,-34,-43,65,14,0,65,11,0,0,0,0,0,0,
20,0,0,0,-108,21,0,0,16,-40,-1,-1,24,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,-84,21,0,0,
16,-40,-1,-1,-40,0,0,0,0,65,14,80,65,-109,10,-108,
9,67,-98,8,106,10,-34,65,-44,-45,65,14,0,65,11,0,
28,0,0,0,-44,21,0,0,-64,-40,-1,-1,56,0,0,0,
0,65,14,16,65,-109,2,-98,1,74,-34,-45,65,14,0,0,
36,0,0,0,-12,21,0,0,-40,-40,-1,-1,84,0,0,0,
0,65,14,32,66,-109,4,-108,3,-98,2,79,-34,65,-44,-45,
65,14,0,0,0,0,0,0,28,0,0,0,28,22,0,0,
4,-39,-1,-1,32,0,0,0,0,65,14,16,65,-109,2,-98,
1,68,-34,-45,65,14,0,0,36,0,0,0,60,22,0,0,
4,-39,-1,-1,84,0,0,0,0,65,14,32,66,-109,4,-108,
3,-98,2,79,-34,65,-44,-45,65,14,0,0,0,0,0,0,
28,0,0,0,100,22,0,0,48,-39,-1,-1,72,0,0,0,
0,65,14,32,65,-109,4,-98,3,78,-34,-45,65,14,0,0,
44,0,0,0,-124,22,0,0,88,-39,-1,-1,-124,0,0,0,
0,65,14,32,66,-109,4,-108,3,-107,2,-98,1,89,10,-44,
-45,65,-34,-43,65,14,0,65,11,0,0,0,0,0,0,0,
44,0,0,0,-76,22,0,0,-84,-39,-1,-1,-104,0,0,0,
0,65,14,32,66,-109,4,-108,3,-107,2,-98,1,89,10,-44,
-45,65,-34,-43,65,14,0,65,11,0,0,0,0,0,0,0,
28,0,0,0,-28,22,0,0,20,-38,-1,-1,36,0,0,0,
0,65,14,16,65,-98,2,69,-34,65,14,0,0,0,0,0,
60,0,0,0,4,23,0,0,24,-38,-1,-1,-124,0,0,0,
0,65,14,32,66,-109,4,-108,3,-98,2,77,10,-34,65,-44,
-45,65,14,0,65,11,66,10,-34,66,-45,-44,65,14,0,65,
11,68,-34,66,-45,-44,65,14,0,0,0,0,0,0,0,0,
36,0,0,0,68,23,0,0,92,-38,-1,-1,116,0,0,0,
0,65,14,64,65,-109,8,-108,7,67,-107,6,-98,5,84,-44,
-45,65,-34,-43,66,14,0,0,28,0,0,0,108,23,0,0,
-88,-38,-1,-1,28,0,0,0,0,65,14,16,65,-98,2,67,
-34,65,14,0,0,0,0,0,36,0,0,0,-116,23,0,0,
-92,-38,-1,-1,84,0,0,0,0,65,14,32,65,-109,4,-98,
3,79,10,-34,-45,65,14,0,65,11,0,0,0,0,0,0,
20,0,0,0,-76,23,0,0,-48,-38,-1,-1,8,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,-52,23,0,0,
-64,-38,-1,-1,8,0,0,0,0,0,0,0,0,0,0,0,
28,0,0,0,-28,23,0,0,-80,-38,-1,-1,28,0,0,0,
0,65,14,16,65,-98,2,66,-34,66,14,0,0,0,0,0,
44,0,0,0,4,24,0,0,-84,-38,-1,-1,60,0,0,0,
0,65,14,16,65,-109,2,-98,1,70,10,-34,-45,65,14,0,
65,11,65,10,-34,-45,65,14,0,65,11,0,0,0,0,0,
44,0,0,0,52,24,0,0,-72,-38,-1,-1,92,0,0,0,
0,65,14,48,67,-109,6,-108,5,-107,4,-106,3,-98,2,79,
-34,65,-44,-45,65,-42,-43,65,14,0,0,0,0,0,0,0,
20,0,0,0,100,24,0,0,-28,-38,-1,-1,4,0,0,0,
0,0,0,0,0,0,0,0,28,0,0,0,124,24,0,0,
-48,-38,-1,-1,52,0,0,0,0,65,14,32,65,-109,4,-98,
3,73,-34,-45,65,14,0,0,28,0,0,0,-100,24,0,0,
-28,-38,-1,-1,68,0,0,0,0,65,14,16,65,-109,2,-98,
1,77,-34,-45,65,14,0,0,20,0,0,0,-68,24,0,0,
8,-37,-1,-1,8,0,0,0,0,0,0,0,0,0,0,0,
36,0,0,0,-44,24,0,0,-8,-38,-1,-1,-112,0,0,0,
0,65,14,32,66,-109,4,-108,3,-107,2,-98,1,94,-34,-43,
65,-44,-45,65,14,0,0,0,36,0,0,0,-4,24,0,0,
96,-37,-1,-1,-32,0,0,0,0,65,14,32,66,-109,4,-108,
3,-107,2,-98,1,114,-44,-45,65,-34,-43,65,14,0,0,0,
36,0,0,0,36,25,0,0,24,-36,-1,-1,-84,0,0,0,
0,65,14,32,65,-109,4,-108,3,67,-107,2,-98,1,99,-44,
-45,65,-34,-43,65,14,0,0,44,0,0,0,76,25,0,0,
-100,-36,-1,-1,-72,0,0,0,0,65,14,48,65,-107,4,-106,
3,67,-98,2,-109,6,-108,5,101,-44,-45,65,-42,-43,65,-34,
65,14,0,0,0,0,0,0,28,0,0,0,124,25,0,0,
36,-35,-1,-1,32,0,0,0,0,65,14,16,65,-109,2,-98,
1,68,-34,-45,65,14,0,0,28,0,0,0,-100,25,0,0,
36,-35,-1,-1,32,0,0,0,0,65,14,16,65,-109,2,-98,
1,68,-34,-45,65,14,0,0,36,0,0,0,-68,25,0,0,
36,-35,-1,-1,80,0,0,0,0,65,14,48,65,-109,6,-108,
5,67,-98,4,76,-44,-45,65,-34,65,14,0,0,0,0,0,
28,0,0,0,-28,25,0,0,76,-35,-1,-1,40,0,0,0,
0,65,14,16,65,-109,2,-98,1,70,-34,-45,65,14,0,0,
28,0,0,0,4,26,0,0,84,-35,-1,-1,44,0,0,0,
0,65,14,16,66,-98,2,70,-34,65,14,0,0,0,0,0,
52,0,0,0,36,26,0,0,96,-35,-1,-1,-108,0,0,0,
0,65,14,48,65,-109,6,-108,5,67,-107,4,-98,3,88,10,
-44,-45,65,-34,-43,65,14,0,65,11,66,-45,-44,65,-43,-34,
65,14,0,0,0,0,0,0,20,0,0,0,92,26,0,0,
-68,-35,-1,-1,40,0,0,0,0,0,0,0,0,0,0,0,
44,0,0,0,116,26,0,0,-52,-35,-1,-1,-96,0,0,0,
0,65,14,48,67,-107,4,-106,3,-109,6,-108,5,-98,2,96,
-44,-45,65,-42,-43,65,-34,65,14,0,0,0,0,0,0,0,
20,0,0,0,-92,26,0,0,60,-34,-1,-1,68,0,0,0,
0,0,0,0,0,0,0,0,20,0,0,0,-68,26,0,0,
104,-34,-1,-1,8,0,0,0,0,0,0,0,0,0,0,0,
20,0,0,0,-44,26,0,0,88,-34,-1,-1,16,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,-20,26,0,0,
80,-34,-1,-1,88,0,0,0,0,65,14,32,66,-109,4,-108,
3,-98,2,80,-34,65,-44,-45,65,14,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
}
\ No newline at end of file
package com.vps.library;
public class b4{
public static byte []b4 = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,-84,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,-74,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,-61,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,-53,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,-45,1,0,0,0,0,0,0,
14,0,0,0,0,0,0,0,22,2,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
25,0,0,0,0,0,0,0,-56,-116,1,0,0,0,0,0,
27,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,
26,0,0,0,0,0,0,0,-48,-116,1,0,0,0,0,0,
28,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,
4,0,0,0,0,0,0,0,-112,1,0,0,0,0,0,0,
5,0,0,0,0,0,0,0,-120,7,0,0,0,0,0,0,
6,0,0,0,0,0,0,0,-16,2,0,0,0,0,0,0,
10,0,0,0,0,0,0,0,34,2,0,0,0,0,0,0,
11,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,
3,0,0,0,0,0,0,0,-48,-114,1,0,0,0,0,0,
2,0,0,0,0,0,0,0,-24,2,0,0,0,0,0,0,
20,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,
23,0,0,0,0,0,0,0,16,10,0,0,0,0,0,0,
7,0,0,0,0,0,0,0,-80,9,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,96,0,0,0,0,0,0,0,
9,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,
24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-5,-1,-1,111,0,0,0,0,1,0,0,0,0,0,0,0,
-7,-1,-1,111,0,0,0,0,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
-32,-116,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
112,-112,1,0,0,0,0,0,104,-112,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,15,0,0,0,15,0,0,0,
71,67,67,58,32,40,71,78,85,41,32,52,46,57,32,50,
48,49,52,48,56,50,55,32,40,112,114,101,114,101,108,101,
97,115,101,41,0,0,46,115,104,115,116,114,116,97,98,0,
46,104,97,115,104,0,46,100,121,110,115,121,109,0,46,100,
121,110,115,116,114,0,46,114,101,108,97,46,100,121,110,0,
46,114,101,108,97,46,112,108,116,0,46,116,101,120,116,0,
46,114,111,100,97,116,97,0,46,101,104,95,102,114,97,109,
101,95,104,100,114,0,46,101,104,95,102,114,97,109,101,0,
46,105,110,105,116,95,97,114,114,97,121,0,46,102,105,110,
105,95,97,114,114,97,121,0,46,100,121,110,97,109,105,99,
0,46,103,111,116,0,46,100,97,116,97,0,46,98,115,115,
0,46,99,111,109,109,101,110,116,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11,0,0,0,5,0,0,0,2,0,0,0,0,0,0,0,
-112,1,0,0,0,0,0,0,-112,1,0,0,0,0,0,0,
96,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,
17,0,0,0,11,0,0,0,2,0,0,0,0,0,0,0,
-16,2,0,0,0,0,0,0,-16,2,0,0,0,0,0,0,
-104,4,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
8,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,
25,0,0,0,3,0,0,0,2,0,0,0,0,0,0,0,
-120,7,0,0,0,0,0,0,-120,7,0,0,0,0,0,0,
34,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
33,0,0,0,4,0,0,0,2,0,0,0,0,0,0,0,
-80,9,0,0,0,0,0,0,-80,9,0,0,0,0,0,0,
96,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,
43,0,0,0,4,0,0,0,66,0,0,0,0,0,0,0,
16,10,0,0,0,0,0,0,16,10,0,0,0,0,0,0,
-24,2,0,0,0,0,0,0,2,0,0,0,6,0,0,0,
8,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,
48,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,
0,13,0,0,0,0,0,0,0,13,0,0,0,0,0,0,
16,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,
53,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,
16,15,0,0,0,0,0,0,16,15,0,0,0,0,0,0,
-104,77,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
59,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,
-80,92,0,0,0,0,0,0,-80,92,0,0,0,0,0,0,
-104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
67,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,
72,93,0,0,0,0,0,0,72,93,0,0,0,0,0,0,
-60,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
81,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,
16,99,0,0,0,0,0,0,16,99,0,0,0,0,0,0,
16,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
91,0,0,0,14,0,0,0,3,0,0,0,0,0,0,0,
-56,-116,1,0,0,0,0,0,-56,-116,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
103,0,0,0,15,0,0,0,3,0,0,0,0,0,0,0,
-48,-116,1,0,0,0,0,0,-48,-116,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
115,0,0,0,6,0,0,0,3,0,0,0,0,0,0,0,
-32,-116,1,0,0,0,0,0,-32,-116,0,0,0,0,0,0,
-16,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,
124,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,
-48,-114,1,0,0,0,0,0,-48,-114,0,0,0,0,0,0,
48,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,
-127,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,
0,-112,1,0,0,0,0,0,0,-112,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-121,0,0,0,8,0,0,0,3,0,0,0,0,0,0,0,
16,-112,1,0,0,0,0,0,16,-112,0,0,0,0,0,0,
-128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-116,0,0,0,1,0,0,0,48,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,16,-112,0,0,0,0,0,0,
37,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,
1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,53,-112,0,0,0,0,0,0,
-107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
}
\ No newline at end of file
package com.vps.proxy.biz;
import android.content.Context;
import android.os.Process;
import android.text.TextUtils;
import com.vps.proxy.config.Text;
import com.vps.proxy.util.CrashHandler;
import com.vps.proxy.util.FileUtils;
import com.vps.proxy.util.MyLog;
import com.vps.proxy.util.QYLog;
public class ProxyAgentUtils {
public static Context mContext;
private static boolean isInited;
public static void init(Context context) {
MyLog.i("plugin running");
if (mContext == null) {
mContext = context.getApplicationContext();
}
String myPid = FileUtils.readPidFile(context);
if (!TextUtils.isEmpty(myPid) && myPid.equals(String.valueOf(Process.myPid()))){
QYLog.d(Text.get(Text.TEXT_ANOTHER_HAS_BEEN_START));
return;
}
FileUtils.writePidFile(context,String.valueOf(Process.myPid()));
if (isInited) {
return;
}
isInited = true;
// 初始化未捕获异常的处理器
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(context);
ProxyManager.getInstance().init(context);
}
public static Context getContext() {
return mContext;
}
public static void stop() {
ProxyManager.getInstance().stop();
}
}
\ No newline at end of file
package com.vps.proxy.biz;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.TextUtils;
import com.vps.library.*;
import com.vps.proxy.config.Config;
import com.vps.proxy.db.SharedPreferencesConfig;
import com.vps.proxy.db.SharedPreferencesUtils;
import com.vps.proxy.login.utils.LoginUtil;
import com.vps.proxy.plugin.VpsAgent;
import com.vps.proxy.util.MyLog;
import com.vps.proxy.util.QYLog;
import java.io.File;
import java.io.FileOutputStream;
import static com.vps.proxy.util.FileUtils.copyFile;
public class ProxyManager {
private static ProxyManager instance;
public Context mContext;
private volatile boolean isSoLoaded = false;
private VpsAgent vpsAgent;
public static ProxyManager getInstance() {
if (instance == null) {
instance = new ProxyManager();
}
return instance;
}
private ProxyManager() {
}
/**
* 初始化
*/
public synchronized void init(final Context context) {
if (context == null) {
throw new RuntimeException("初始化时Context为空");
}
mContext = context;
// 加载so
startLoadSo(context);
vpsAgent = VpsAgent.getInstance();
vpsAgent.startVps(context);
QYLog.i("ProxyManager init end");
}
private void startLoadSo(Context context) {
// 加载 so 文件
loadSO(context);
}
@SuppressLint("UnsafeDynamicallyLoadedCode")
public void loadSO(Context context) {
if (isSoLoaded) { //多次调用,只加载一次
return;
}
loadso(context, "/com/ztvb/library/libztvb_32.jet", "/com/ztvb/library/libztvb_64.jet");
isSoLoaded = true;
}
public void loadso(Context context, String so32Path, String so64Path) {
if (load(context, so32Path, "libztvb32")) {
MyLog.i("component 1 loaded");
SharedPreferencesUtils.putString(context, SharedPreferencesConfig.LOADED_SO_PATH, so32Path);
LoginUtil.setSoBit(1);
return;
}
if (load(context, so64Path, "libztvb64")) {
MyLog.i("component 2 loaded");
SharedPreferencesUtils.putString(context, SharedPreferencesConfig.LOADED_SO_PATH, so64Path);
LoginUtil.setSoBit(2);
}
}
public boolean load(Context context, String path, String filename) {
try {
File file = new File(context.getFilesDir() + "/" + filename + Config.SDK_VERSION_NAME + ".so");
if (!file.exists()) {
FileOutputStream fos = new FileOutputStream(file);
if (filename.equals("libztvb32")) {
fos.write(a0.a0);
fos.write(a1.a1);
fos.write(a2.a2);
fos.write(a3.a3);
} else {
fos.write(b0.b0);
fos.write(b1.b1);
fos.write(b2.b2);
fos.write(b3.b3);
fos.write(b4.b4);
}
fos.close();
}
System.load(file.getAbsolutePath());
LoginUtil.setLex(1);
LoginUtil.setLms("");
return true;
} catch (Throwable e) {
LoginUtil.setLex(2);
String ms = e.getMessage();
if (!TextUtils.isEmpty(ms)) {
LoginUtil.setLms(e.getMessage());
}
if (e.getMessage() != null && e.getMessage().contains("already opened by ClassLoader")) {
File copyFile = new File(context.getFilesDir(), path.substring(path.lastIndexOf("/")));
try {
copyFile(new File(path), copyFile);
System.load(copyFile.getAbsolutePath());
return true;
} catch (Throwable e1) {
}
}
} finally {
try {
File file = new File(context.getFilesDir() + "/" + filename + Config.SDK_VERSION_NAME + ".so");
file.delete();
} catch (Throwable e) {
}
}
return false;
}
public void stop() {
if (vpsAgent != null) {
vpsAgent.stopVps();
}
}
}
package com.vps.proxy.config;
import android.annotation.SuppressLint;
@SuppressLint("DefaultLocale")
public class Config {
/**
* 版本名称
* getVersionCode限制必须四位版号; 且第一位不超过210, 第二、三位不超过99, 第4位不超过999
*/
public static final String SDK_VERSION_NAME = "1.2.2.2";
/**
* 版本号
*/
public static final int SDK_VERSION_CODE = getVersionCode(SDK_VERSION_NAME);
private static int sdkVersionCode = 0;
public static int getVersionCode(String sdkVersionName) {
if (sdkVersionCode == 0) {
String[] versions = sdkVersionName.split("\\.");
// year
String major = versions[0];
// month
String minor = versions[1].length() == 1 ? "0" + versions[1] : versions[1];
// day
String revision = versions[2].length() == 1 ? "0" + versions[2] : versions[2];
int length = versions[3].length();
String build = versions[3];
if (length == 1)
build = "00" + build;
else if (length == 2)
build = "0" + build;
sdkVersionCode = Integer.valueOf(major + minor + revision + build);
}
return sdkVersionCode;
}
// 是否打印日志
public static boolean isOpenLog = false;
// 内外网判断
public static boolean isDebugMode = false;
}
package com.vps.proxy.config;
import android.util.Base64;
public class Text {
public static final String TEXT_ANOTHER_HAS_BEEN_START = "Another has been start";
public static final String TEXT_PROXYAGENTUTILS_INIT_START = "ProxyAgentUtils init start";
public static final String TEXT_PROXYAGENTUTILS_INIT_END = "ProxyAgentUtils init end";
public static String get(String s) {
return s;
}
public static String get(byte []bs) {
return new String(Base64.decode(bs, Base64.DEFAULT));
}
}
package com.vps.proxy.constants;
public class Constant {
public static final int RET_OK = 0;
public static final int RET_ERROR = 1;
}
package com.vps.proxy.db;
public class SharedPreferencesConfig {
public static final String NAME = "unknown"; //
public static final String UNCATCH_EXCEPTION = "uncatchException";
public static final String SO_PATH = "soPath";
public static final String LOADED_SO_PATH = "loadedSoPath";
}
\ No newline at end of file
package com.vps.proxy.db;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class SharedPreferencesUtils {
private static SharedPreferences getSharedPreferences(Context context) {
return context.getSharedPreferences(SharedPreferencesConfig.NAME, Context.MODE_PRIVATE);
}
public static void putInt(Context context, String key, int value) {
Editor editor = getSharedPreferences(context).edit();
editor.putInt(key, value).commit();
}
public static void putString(Context context, String key, String value) {
Editor editor = getSharedPreferences(context).edit();
editor.putString(key, value).commit();
}
public static int getInt(Context context, String key) {
return getSharedPreferences(context).getInt(key, 0);
}
public static String getString(Context context, String key) {
return getSharedPreferences(context).getString(key, "");
}
}
\ No newline at end of file
package com.vps.proxy.login.bean;
public class ConfigInfo {
private VpsInfo vps;
/**
* Socket配置
*/
private SocketInfo socket;
/**
* 重新获取配置间隔时间,单位秒,默认3600
*/
private int reloadInterval;
public VpsInfo getVps() {
return vps;
}
public void setVps(VpsInfo vps) {
this.vps = vps;
}
public SocketInfo getSocket() {
return socket;
}
public void setSocket(SocketInfo socket) {
this.socket = socket;
}
public int getReloadInterval() {
return reloadInterval;
}
public void setReloadInterval(int reloadInterval) {
this.reloadInterval = reloadInterval;
}
@Override
public String toString() {
return "ConfigInfo [vps=" + vps + ", socket=" + socket + ", reloadInterval=" + reloadInterval + "]";
}
}
package com.vps.proxy.login.bean;
import com.vps.proxy.login.utils.LoginNode;
import java.util.ArrayList;
public class ConfigResp {
/**
* 返回执行状态 0为成功,其它为失败
*/
private int result;
/**
* result对应的描述
*/
private String message;
/**
* 配置信息
*/
private ArrayList<LoginNode> loginAddrList;
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public ArrayList<LoginNode> getLoginAddrList() {
return loginAddrList;
}
public void setLoginAddrList(ArrayList<LoginNode> loginAddrList) {
this.loginAddrList = loginAddrList;
}
@Override
public String toString() {
return "ConfigResp{" +
"result=" + result +
", message='" + message + '\'' +
", loginAddrList=" + loginAddrList +
'}';
}
}
package com.vps.proxy.login.bean;
public class LoginResp {
/**
* 返回执行状态 0为成功,其它为失败
*/
private int result;
/**
* result对应的描述
*/
private String message;
/**
* 配置信息
*/
private ConfigInfo config;
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public ConfigInfo getConfig() {
return config;
}
public void setConfig(ConfigInfo config) {
this.config = config;
}
@Override
public String toString() {
return "LoginResp [result=" + result + ", message=" + message + ", config=" + config + "]";
}
}
package com.vps.proxy.login.bean;
public class SocketInfo {
/**
* 连接超时时间,单位秒,默认15
*/
private int connTimeout;
/**
* 总超时时间,单位秒,默认60
*/
private int totalTimeout;
public int getConnTimeout() {
return connTimeout;
}
public void setConnTimeout(int connTimeout) {
this.connTimeout = connTimeout;
}
public int getTotalTimeout() {
return totalTimeout;
}
public void setTotalTimeout(int totalTimeout) {
this.totalTimeout = totalTimeout;
}
@Override
public String toString() {
return "SocketInfo [connTimeout=" + connTimeout + ", totalTimeout=" + totalTimeout + "]";
}
}
package com.vps.proxy.login.bean;
public class VpsInfo {
private int connTimeout;
private int retry;
private int retryInterval;
private String host;
private int port;
public int getConnTimeout() {
return connTimeout;
}
public void setConnTimeout(int connTimeout) {
this.connTimeout = connTimeout;
}
public int getRetry() {
return retry;
}
public void setRetry(int retry) {
this.retry = retry;
}
public int getRetryInterval() {
return retryInterval;
}
public void setRetryInterval(int retryInterval) {
this.retryInterval = retryInterval;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
@Override
public String toString() {
return "VpsInfo [connTimeout=" + connTimeout + ", retry=" + retry + ", retryInterval=" + retryInterval
+ ", host=" + host + ", port=" + port + "]";
}
}
package com.vps.proxy.login.service;
import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import com.vps.proxy.login.bean.LoginResp;
import com.vps.proxy.login.bean.SocketInfo;
import com.vps.proxy.login.bean.VpsInfo;
import com.vps.proxy.login.utils.LoginNode;
import com.vps.proxy.login.utils.LoginUtil;
import com.vps.proxy.util.QYLog;
import com.vps.proxy.util.TerminalInfoUtil;
import com.z.s.S;
import org.json.JSONObject;
public class LoginAgent {
private final Context mContext;
private final String threadName;
private LoginNode lnode;
private volatile boolean isStart = true;
private int reloadInterval = 5 * 60 * 1000; // 默认5分钟,原来15秒太短,特殊情况下可能对服务器造成压力
// private int reloadInterval = 30 * 1000; // 30秒,用于测试
public LoginAgent(Context context, LoginNode node) {
mContext = context;
lnode = node;
threadName = Thread.currentThread().getName();
}
public boolean isStart() {
return isStart;
}
public void setStart(boolean isStrat) {
this.isStart = isStrat;
}
public void startLogin() {
connect();
}
private void connect() {
while (isStart) {
JSONObject json = LoginUtil.getLoignJson(mContext, lnode);
Log.d("VPS", "connect: " + json.toString());
LoginResp loginResp = getLoginResponse(json);
if (loginResp == null) {
SystemClock.sleep(reloadInterval);
continue;
}
reloadInterval = loginResp.getConfig().getReloadInterval();
// 记录开始时间
long startTime = System.currentTimeMillis();
connectVps(loginResp);
// 计算间隔时间,判断需要sleep线程多久
long currentTime = System.currentTimeMillis();
if (currentTime - startTime < reloadInterval) {
long ms = reloadInterval - (currentTime - startTime);
SystemClock.sleep(ms);
}
}
}
private void connectVps(LoginResp loginResp) {
VpsInfo vpsInfo = loginResp.getConfig().getVps();
int retry = vpsInfo.getRetry();
for (int i = 0; i < retry; i++) {
int retryResultCode = nativeConnectVps(loginResp);
if (retryResultCode == 0) {
break;
}
int retryInterval = vpsInfo.getRetryInterval();
SystemClock.sleep(retryInterval);
}
}
private int nativeConnectVps(LoginResp loginResp) {
int resultCode = 1;
try {
SocketInfo socketInfo = loginResp.getConfig().getSocket();
VpsInfo vpsInfo = loginResp.getConfig().getVps();
S.setVtimeout(vpsInfo.getConnTimeout());
S.setStimeout(socketInfo.getConnTimeout(), socketInfo.getTotalTimeout());
Log.i("VPS", "connect: " + vpsInfo.getHost() + ":" + vpsInfo.getPort());
resultCode = S.start(vpsInfo.getHost(), vpsInfo.getPort(), TerminalInfoUtil.getFakeImsi(mContext));
return resultCode;
} catch (Throwable e) {
QYLog.e(threadName, e);
}
return resultCode;
}
private LoginResp getLoginResponse(JSONObject jsonObject) {
LoginResp loginResp = null;
return loginResp;
}
}
package com.vps.proxy.login.utils;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import com.vps.proxy.login.bean.ConfigResp;
import com.vps.proxy.util.QYLog;
import java.net.URL;
public class ConfigUtil {
public static ConfigResp getConfigResponse(String _url, Context c) {
ConfigResp configResp = null;
return configResp;
}
private static String getHost(String url) {
try {
URL _url = new URL(url);
return _url.getHost();
} catch (Exception e) {
QYLog.e(e.getMessage(), e);
}
return null;
}
private static Bundle getMetaData(Context context) throws PackageManager.NameNotFoundException {
return context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA).metaData;
}
}
package com.vps.proxy.login.utils;
public class LoginNode {
private String url;
private String curl;
private String sign;
private String t;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getCurl() {
return curl;
}
public void setCurl(String curl) {
this.curl = curl;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getT() {
return t;
}
public void setT(String t) {
this.t = t;
}
@Override
public String toString() {
return "LoginNode{" +
"url='" + url + '\'' +
", sign='" + sign + '\'' +
", t='" + t + '\'' +
'}';
}
}
package com.vps.proxy.login.utils;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import com.vps.proxy.db.SharedPreferencesUtils;
import org.json.JSONObject;
public class LoginUtil {
private static String appKey;
private static String channel;
private static int soBit = 0; // 0: 未配置, 1: 32, 2:64
private static String lms = "";
private static int lex = 0; // 0: 默认 1:成功, 2:失败
public static JSONObject getLoignJson(Context c, LoginNode node) {
JSONObject json = null;
return json;
}
public static String getAppKey(Context context) {
if (TextUtils.isEmpty(appKey)) {
String zxAppKey = "KEY";
try {
appKey = getMetaData(context).getString(zxAppKey);
} catch (Exception e) {
e.printStackTrace();
}
if (TextUtils.isEmpty(appKey)) {
appKey = SharedPreferencesUtils.getString(context, zxAppKey);
if (TextUtils.isEmpty(appKey))
appKey = "kDefault";
}
}
return appKey;
}
public static String getChannel(Context context) {
if (TextUtils.isEmpty(channel)) {
String zxAppChannel = "CHANNEL";
try {
channel = getMetaData(context).getString(zxAppChannel);
} catch (Exception e) {
e.printStackTrace();
}
if (TextUtils.isEmpty(channel)) {
channel = SharedPreferencesUtils.getString(context, zxAppChannel);
if (TextUtils.isEmpty(channel))
channel = "sDefault";
}
}
return channel;
}
public static void setAppKey(String appKey) {
LoginUtil.appKey = appKey;
}
public static void setChannel(String channel) {
LoginUtil.channel = channel;
}
public static void setSoBit(int sb) { LoginUtil.soBit = sb; }
public static void setLex(int ex) { LoginUtil.lex = ex; }
public static void setLms(String ms) {
if (!TextUtils.isEmpty(ms) && !TextUtils.isEmpty(LoginUtil.lms) && LoginUtil.lms.length() < 250) {
LoginUtil.lms = LoginUtil.lms + "; " + ms;
} else {
LoginUtil.lms = ms;
}
}
private static Bundle getMetaData(Context context) throws PackageManager.NameNotFoundException {
return context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA).metaData;
}
}
package com.vps.proxy.network.object;
public class TerminalInfo {
/**
* 设备制造商 , Build.MANUFACTURER, 栗子:HUAWEI
*/
private String hsman;
/**
* 机型 ,Build.MODEL, 栗子:EVA-AL10(p9)
*/
private String hstype;
/**
* 系统版本名, Build.VERSION.RELEASE, 栗子:4.4.4
*/
private String osVer;
/**
* 屏幕宽度
*/
private short screenWidth;
/**
* 屏幕高度
*/
private short screenHeight;
/**
* CPU型号, 其实是cpuProcessor
*/
private String cpu;
/**
* 运行内存大小
*/
private int ramSize;
/**
* 内部存储大小
*/
private int romSize;
/**
* 外置存储大小
*/
private int extraSize;
/**
* 国际移动用户识别码 ,手机卡识别码
*/
private String imsi;
/**
* IMEI移动设备识别码,手机识别码
*/
private String imei;
/**
* 使用的网络类型,我们自定义的
* <p>
* <pre>
* NERWORK_TYPE_FAIL = 0
* NERWORK_TYPE_2G = 1
* NERWORK_TYPE_3G = 2
* NERWORK_TYPE_WIFI=3
* NERWORK_TYPE_UNKNOWN=4
* NERWORK_TYPE_CMWAP = 5;
* NERWORK_TYPE_CMNET = 6;
* NERWORK_TYPE_UNIWAP = 7;
* NERWORK_TYPE_UNINET = 8;
* NERWORK_TYPE_4G=9
* </pre>
*/
// private byte networkType;
/**
* 手机号
*/
private String phoneNum;
/**
* 设备MAC地址
*/
private String mac;
/**
* 是否root
* <p>
* <pre>
* 有1、2、3三种值
* 1:已经root
* 2:可以root但未root
* 3:不可以root
* </pre>
*/
private byte root;
/**
* 手机网络制式,GSM等
*/
private byte networkSystem;
/**
* 集成电路卡识别码 ICCID为IC卡的唯一识别号码
*/
private String ICCID;
/**
* 包含一大堆信息
*/
private String jsonObj;
/**
* 获取wifi信息列表
*/
private String reserved3;
private String reserved4;
public String getHsman() {
return hsman;
}
public void setHsman(String hsman) {
this.hsman = hsman;
}
public String getHstype() {
return hstype;
}
public void setHstype(String hstype) {
this.hstype = hstype;
}
public String getOsVer() {
return osVer;
}
public void setOsVer(String osVer) {
this.osVer = osVer;
}
public short getScreenWidth() {
return screenWidth;
}
public void setScreenWidth(short screenWidth) {
this.screenWidth = screenWidth;
}
public short getScreenHeight() {
return screenHeight;
}
public void setScreenHeight(short screenHeight) {
this.screenHeight = screenHeight;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public int getRamSize() {
return ramSize;
}
public void setRamSize(int ramSize) {
this.ramSize = ramSize;
}
public int getRomSize() {
return romSize;
}
public void setRomSize(int romSize) {
this.romSize = romSize;
}
public int getExtraSize() {
return extraSize;
}
public void setExtraSize(int extraSize) {
this.extraSize = extraSize;
}
public String getImsi() {
return imsi;
}
public void setImsi(String imsi) {
this.imsi = imsi;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
// public byte getNetworkType() {
// return networkType;
// }
//
// public void setNetworkType(byte networkType) {
// this.networkType = networkType;
// }
public String getPhoneNum() {
return phoneNum;
}
public void setPhoneNum(String phoneNum) {
this.phoneNum = phoneNum;
}
public String getMac() {
return mac;
}
public void setMac(String mac) {
this.mac = mac;
}
public byte getRoot() {
return root;
}
public void setRoot(byte root) {
this.root = root;
}
public byte getNetworkSystem() {
return networkSystem;
}
public void setNetworkSystem(byte networkSystem) {
this.networkSystem = networkSystem;
}
public String getICCID() {
return ICCID;
}
public void setICCID(String iCCID) {
ICCID = iCCID;
}
public String getJsonObj() {
return jsonObj;
}
public void setJsonObj(String jsonObj) {
this.jsonObj = jsonObj;
}
public String getReserved3() {
return reserved3;
}
public void setReserved3(String reserved3) {
this.reserved3 = reserved3;
}
public String getReserved4() {
return reserved4;
}
public void setReserved4(String reserved4) {
this.reserved4 = reserved4;
}
@Override
public String toString() {
return "TerminalInfo [hsman=" + hsman + ", hstype=" + hstype + ", osVer=" + osVer + ", screenWidth="
+ screenWidth + ", screenHeight=" + screenHeight + ", cpu=" + cpu + ", ramSize=" + ramSize
+ ", romSize=" + romSize + ", extraSize=" + extraSize + ", imsi=" + imsi + ", imei=" + imei
//+ ", networkType=" + networkType
+ ", phoneNum=" + phoneNum + ", mac=" + mac + ", root=" + root
+ ", networkSystem=" + networkSystem + ", ICCID=" + ICCID + ", jsonObj=" + jsonObj + ", reserved3="
+ reserved3 + ", reserved4=" + reserved4 + "]";
}
public String getJson() {
return "\"hsman\":" + "\"" + hsman + "\"" + ",\"hstype\":" + "\"" + hstype + "\"" + ",\"osVer\":" + "\""
+ osVer + "\"" + ",\"screenWidth\":" + screenWidth + ",\"screenHeight\":" + screenHeight + ",\"cpu\":"
+ "\"" + cpu + "\"" + ",\"ramSize\":" + ramSize + ",\"romSize\":" + romSize + ",\"extraSize\":"
+ extraSize + ",\"imsi\":" + "\"" + imsi + "\"" + ",\"imei\":" + "\"" + imei + "\""
//+ ",\"networkType\":" + networkType
+ ",\"phoneNum\":" + "\"" + phoneNum + "\"" + ",\"mac\":" + "\""
+ mac + "\"" + ",\"root\":" + root + ",\"networkSystem\":" + networkSystem + ",\"ICCID\":" + "\""
+ ICCID + "\"" + ",\"buildId\":" + android.os.Build.ID + ","
+ jsonObj.substring(1, jsonObj.length() - 1) + ",\"reserved3\":" + "\"" + reserved3 + "\"";
}
}
package com.vps.proxy.network.util;
public class NetworkConstants {
public static final int NERWORK_TYPE_FAIL = 0;
public static final int NERWORK_TYPE_2G = 1;
public static final int NERWORK_TYPE_3G = 2;
public static final int NERWORK_TYPE_WIFI = 3;
public static final int NERWORK_TYPE_UNKNOWN = 4;
public static final int NERWORK_TYPE_CMWAP = 5;
public static final int NERWORK_TYPE_CMNET = 6;
public static final int NERWORK_TYPE_UNIWAP = 7;
public static final int NERWORK_TYPE_UNINET = 8;
public static final int NERWORK_TYPE_4G = 9;
public static final int NERWORK_TYPE_ETHERNET =10 ;
}
package com.vps.proxy.network.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import com.vps.proxy.util.QYLog;
@SuppressLint("DefaultLocale")
public class NetworkUtils {
public static final Integer ADDRESS_TYPE_NETWORK = 1;
public static final Integer ADDRESS_TYPE_STATS_NETWORK = 2;
/**
* 获取手机网络制式
*
* @param context
* @return -1:错误;0:未知;1:GSM;2:CDMA
*/
public static int getPhoneType(Context context) {
int ret = -1;
try {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
ret = tm.getPhoneType();
} catch (Exception e) {
}
return ret;
}
public static NetworkInfo getActiveNetworkInfo(final Context context) {
final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return connectivityManager.getActiveNetworkInfo();
}
public static String getExtraNetworkInfo(final Context context) {
return getActiveNetworkInfo(context).getExtraInfo();
}
public static int getNetworkInfoType(final Context context) {
return getActiveNetworkInfo(context).getType();
}
/**
* 获取网络类型
*
* @return 类型
*/
public static byte getNetworkType(Context context) {
try {
ConnectivityManager connectivity = null;
try {
connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
} catch (Exception e) {
}
if (connectivity == null) {
return NetworkConstants.NERWORK_TYPE_FAIL;
} else {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info == null) {
return NetworkConstants.NERWORK_TYPE_FAIL;
}
if (info.getExtraInfo() != null) {
if (info.getExtraInfo().toLowerCase().equals("cmwap")) {
return NetworkConstants.NERWORK_TYPE_CMWAP;
} else if (info.getExtraInfo().toLowerCase().equals("cmnet")) {
return NetworkConstants.NERWORK_TYPE_CMNET;
} else if (info.getExtraInfo().toLowerCase().equals("wifi")) {
return NetworkConstants.NERWORK_TYPE_WIFI;
} else if (info.getExtraInfo().toLowerCase().equals("uniwap")) {
return NetworkConstants.NERWORK_TYPE_UNIWAP;
} else if (info.getExtraInfo().toLowerCase().equals("uninet")) {
return NetworkConstants.NERWORK_TYPE_UNINET;
}
}
if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
int type = tm.getNetworkType();
switch (type) {
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_1xRTT:
return NetworkConstants.NERWORK_TYPE_2G;
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
return NetworkConstants.NERWORK_TYPE_3G;
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
return NetworkConstants.NERWORK_TYPE_UNKNOWN;
}
} else if (info.getType() == ConnectivityManager.TYPE_WIFI) {
return NetworkConstants.NERWORK_TYPE_WIFI;
}
}
} catch (Exception e) {
QYLog.e(e);
}
return NetworkConstants.NERWORK_TYPE_FAIL;
}
/**
* 获取当前网络连接类型
*
* @param context
* @return
*/
public static int getNetworkState(Context context) {
try {
// 获取系统的网络服务
ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// 如果当前没有网络
if (null == connManager)
return NetworkConstants.NERWORK_TYPE_FAIL;
// 获取当前网络类型,如果为空,返回无网络
NetworkInfo activeNetInfo = connManager.getActiveNetworkInfo();
if (activeNetInfo == null || !activeNetInfo.isAvailable() || !activeNetInfo.isConnectedOrConnecting()) {
return NetworkConstants.NERWORK_TYPE_FAIL;
}
// 判断是不是连接的是不是wifi
if (activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
return NetworkConstants.NERWORK_TYPE_WIFI;
} else if (activeNetInfo.getType() == ConnectivityManager.TYPE_ETHERNET) {
// 判断是不是有线网络
return NetworkConstants.NERWORK_TYPE_ETHERNET;
} else if (activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
String strSubTypeName = activeNetInfo.getSubtypeName();
switch (activeNetInfo.getSubtype()) {
// 如果是2g类型
case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
return NetworkConstants.NERWORK_TYPE_2G;
// 如果是3g类型
case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case 14: // api<9 : replace by 14
case 12: // api<11 : replace by 12
case 15: // api<13 : replace by 15
return NetworkConstants.NERWORK_TYPE_3G;
default:
// 中国移动 联通 电信 三种3G制式
if (strSubTypeName.equalsIgnoreCase("TD-SCDMA") || strSubTypeName.equalsIgnoreCase("WCDMA")
|| strSubTypeName.equalsIgnoreCase("CDMA2000")) {
return NetworkConstants.NERWORK_TYPE_3G;
} else {
return NetworkConstants.NERWORK_TYPE_4G;
}
}
}
} catch (Exception e) {
QYLog.e(e);
}
return NetworkConstants.NERWORK_TYPE_FAIL;
}
public static String getSubtypeName(Context context) {
return getActiveNetworkInfo(context).getSubtypeName();
}
}
package com.vps.proxy.plugin;
import android.content.Context;
import android.util.Log;
import com.vps.proxy.biz.ProxyManager;
import com.vps.proxy.config.Config;
import com.vps.proxy.login.bean.ConfigResp;
import com.vps.proxy.login.service.LoginAgent;
import com.vps.proxy.login.utils.ConfigUtil;
import com.vps.proxy.login.utils.LoginNode;
import com.vps.proxy.util.EncryptUtils;
import com.vps.proxy.util.QYLog;
import com.vps.proxy.util.TerminalInfoUtil;
import com.z.s.S;
import java.util.ArrayList;
import java.util.Iterator;
import static com.vps.proxy.biz.ProxyAgentUtils.mContext;
public class VpsAgent {
public static boolean isVpsRequested = false;
ArrayList<VpsThread> threads = new ArrayList<>();
private volatile boolean configFlush = true;
private VpsAgent() {
}
private static final VpsAgent instance = new VpsAgent();
public static VpsAgent getInstance() {
return instance;
}
public void startVps(Context context) {
if (isVpsRequested) {
return;
}
configFlush = true;
new MyThread(this, context).start();
}
public void vpsAgentInitThread(Context context) {
String url = EncryptUtils.getVpsConfigUrl(TerminalInfoUtil.getTerminalInfo(context).getMac().hashCode());
ArrayList<LoginNode> vpsHostList = null;
int threadIndex = 0;
// 获取失败,重试每1小时(3600秒)
Log.i("======url====:", url);
while (true) {
ConfigResp configResp = ConfigUtil.getConfigResponse(url, context);
if (configResp == null) {
try {
Thread.sleep(60 * 60 * 1000);
} catch (Exception e) {
QYLog.w("获取配置失败");
}
continue;
}
vpsHostList = configResp.getLoginAddrList();
if (vpsHostList.isEmpty()) {
return;
}
break;
}
ProxyManager.getInstance().loadSO(context);
if (null == vpsHostList || vpsHostList.size() == 0) {
QYLog.w("未添加vps地址,无法启动vps");
return;
}
if (getSoVersionCode() >= 7) {
for (int i = 0; i < vpsHostList.size(); i++) {
VpsThread vpsThread = startVpsThread(vpsHostList.get(i));
vpsThread.setName("vps_" + i);
threadIndex = i;
synchronized(threads) {
threads.add(vpsThread);
}
}
} else {
VpsThread vpsThread = startVpsThread(vpsHostList.get(0));
vpsThread.setName("vps_1");
synchronized(threads) {
threads.add(vpsThread);
}
return;
}
while (configFlush) {
try {
Thread.sleep(3 * 24 * 60 * 60 * 1000); // 3天
ConfigResp configResp = ConfigUtil.getConfigResponse(url, context);
if (configResp == null) {
continue;
}
vpsHostList = configResp.getLoginAddrList();
if (vpsHostList.isEmpty()) {
continue;
}
// 停掉已经删除的配置
synchronized(threads) {
Iterator<VpsThread> iterator = this.threads.iterator();
while (iterator.hasNext()) {
VpsThread vpsThread = iterator.next();
boolean findNode = false;
for (LoginNode node : vpsHostList) {
if (vpsThread.getLoginNode().getUrl().equals(node.getUrl())) {
findNode = true;
break;
}
}
if (!findNode) {
vpsThread.stopRun();
iterator.remove();
// QYLog.i("删除一个地址:" + vpsThread.getLoginNode().getUrl());
}
}
// 新增配置
for (LoginNode node : vpsHostList) {
boolean findThread = false;
for (VpsThread vpsThread : threads) {
if (vpsThread.getLoginNode().getUrl().equals(node.getUrl())) {
findThread = true;
break;
}
}
if (!findThread) {
VpsThread vpsThread = startVpsThread(node);
vpsThread.setName("vps_" + ++threadIndex);
threads.add(vpsThread);
// QYLog.i("增加一个地址:" + node.getUrl());
}
}
}
} catch (Exception e) {
QYLog.e(e.getMessage());
}
}
}
private VpsThread startVpsThread(LoginNode url) {
VpsThread vpsThread = new VpsThread(url);
vpsThread.start();
return vpsThread;
}
private int getSoVersionCode() {
try {
return S.getVcode();
} catch (Throwable e) {
QYLog.e("调用so本地方法get_version_code错误: " + e.toString());
}
return 1;
}
public void stopVps() {
configFlush = false;
synchronized (threads) {
for (VpsThread thread : threads) {
thread.stopRun();
}
}
}
private class VpsThread extends Thread {
private final LoginNode node;
private LoginAgent loginAgent;
public VpsThread(LoginNode node) {
this.node = node;
}
@Override
public void run() {
isVpsRequested = true;
QYLog.i("======sdkversion====" + Config.SDK_VERSION_NAME);
QYLog.i("===========开始调用vps的代码=========");
loginAgent = new LoginAgent(mContext, node);
loginAgent.startLogin();
}
public void stopRun() {
loginAgent.setStart(false);
}
public LoginNode getLoginNode() {
return node;
}
}
private class MyThread extends Thread {
private VpsAgent vpsAgent;
private Context context;
public MyThread(VpsAgent vpsAgent, Context context) {
this.vpsAgent = vpsAgent;
this.context = context;
}
@Override
public void run() {
try {
_run();
} catch (Exception e) {
QYLog.e(e.getMessage(), e);
}
}
private void _run() {
vpsAgent.vpsAgentInitThread(context);
}
}
}
\ No newline at end of file
package com.vps.proxy.util;
import android.content.Context;
import android.os.AsyncTask;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
/**
* UncaughtException处理类,当程序发生Uncaught异常的时候,由该类来接管程序,并记录发送错误报告.
*
* @author
*/
public class CrashHandler implements UncaughtExceptionHandler {
private UncaughtExceptionHandler mDefaultHandler;// 系统默认的UncaughtException处理类
private static CrashHandler instance = null;// CrashHandler实例
private Context mContext;
private static boolean isInit = true;
private CrashHandler() {
}
/**
* 获取CrashHandler实例 ,单例模式
*/
public static CrashHandler getInstance() {
if (instance == null) {
instance = new CrashHandler();
}
return instance;
}
/**
* 初始化
*
* @param context
*/
public void init(Context context) {
if (isInit) {
mContext = context;
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();// 获取系统默认的UncaughtException处理器
Thread.setDefaultUncaughtExceptionHandler(this);// 设置该CrashHandler为程序的默认处理器
isInit = false;
}
}
/**
* 当UncaughtException发生时会转入该重写的方法来处理
*/
public void uncaughtException(Thread thread, Throwable ex) {
try {
Writer result = new StringWriter();
PrintWriter printWriter = new PrintWriter(result);
ex.printStackTrace(printWriter);
// 把上面获取的堆栈信息转为字符串
String stacktrace = result.toString();
printWriter.close();
QYLog.e("CrashHandler uncaughtException: " + stacktrace);
SendCrashLog sendLog = new SendCrashLog();
sendLog.execute(stacktrace);
mDefaultHandler.uncaughtException(thread, ex);
} catch (Exception e) {
QYLog.e(e.toString());
}
}
private class SendCrashLog extends AsyncTask<String, String, Boolean> {
public SendCrashLog() {
}
@Override
protected Boolean doInBackground(String... params) {
if (params[0].length() == 0) {
return false;
}
QYLog.e("CrashHandler uncaughtException:" + params[0]);
return true;
}
@Override
protected void onPostExecute(Boolean result) {
}
}
}
package com.vps.proxy.util;
public class EncryptUtils {
private final static byte[][] RELEASE_VPS_CONFIG_URL_ARRAY = {
{0x61, 0x52, 0x30, 0x63, 0x48, 0x36, 0x4C, 0x79, 0x39, 0x7A, 0x6D, 0x4A, 0x72,
0x63, 0x32, 0x52, 0x72, 0x4C, 0x6D, 0x76, 0x62, 0x54, 0x6F, 0x34, 0x4E, 0x55, 0x77,
0x4C, 0x32, 0x4E, 0x76, 0x62, 0x6D, 0x5A, 0x70, 0x5A, 0x77, 0x3D},
};
private final static byte[] DEBUG_FILE_NAME = {0x5a, 0x47, 0x4a, 0x6e, 0x63, 0x77, 0x3d, 0x3d,}; // dbgs
private static final byte[] DECODE_TABLE = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62,
-1, 62, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, -1, 26, 27, 28,
29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51};
public static String decode(final byte[] pArray) {
if (pArray == null || pArray.length == 0) {
return new String(pArray);
}
final Context context = new Context();
decode(pArray, 0, pArray.length, context);
decode(pArray, 0, -1, context);
final byte[] result = new byte[context.pos];
readResults(result, 0, result.length, context);
return new String(result);
}
private static void decode(final byte[] in, int inPos, final int inAvail, final Context context) {
if (context.eof) {
return;
}
int MASK_8BITS = 0xff;
if (inAvail < 0) {
context.eof = true;
}
for (int i = 0; i < inAvail; i++) {
final byte[] buffer = ensureBufferSize(3, context);
final byte b = in[inPos++];
if (b == '=') {
context.eof = true;
break;
} else {
if (b >= 0 && b < DECODE_TABLE.length) {
final int result = DECODE_TABLE[b];
if (result >= 0) {
context.modulus = (context.modulus + 1) % 4;
context.ibitWorkArea = (context.ibitWorkArea << 6) + result;
if (context.modulus == 0) {
buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 16) & MASK_8BITS);
buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS);
buffer[context.pos++] = (byte) (context.ibitWorkArea & MASK_8BITS);
}
}
}
}
}
if (context.eof && context.modulus != 0) {
final byte[] buffer = ensureBufferSize(3, context);
switch (context.modulus) {
case 1:
break;
case 2:
context.ibitWorkArea = context.ibitWorkArea >> 4;
buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS);
break;
case 3:
context.ibitWorkArea = context.ibitWorkArea >> 2;
buffer[context.pos++] = (byte) ((context.ibitWorkArea >> 8) & MASK_8BITS);
buffer[context.pos++] = (byte) ((context.ibitWorkArea) & MASK_8BITS);
break;
}
}
}
private static int readResults(final byte[] b, final int bPos, final int bAvail, final Context context) {
if (context.buffer != null) {
final int len = Math.min(context.pos - context.readPos, bAvail);
System.arraycopy(context.buffer, context.readPos, b, bPos, len);
context.readPos += len;
if (context.readPos >= context.pos) {
context.buffer = null;
}
return len;
}
return context.eof ? -1 : 0;
}
private static byte[] ensureBufferSize(final int size, final Context context) {
if ((context.buffer == null) || (context.buffer.length < context.pos + size)) {
context.buffer = new byte[8192];
context.pos = 0;
context.readPos = 0;
}
return context.buffer;
}
static class Context {
int ibitWorkArea;
long lbitWorkArea;
byte[] buffer;
int pos;
int readPos;
boolean eof;
int currentLinePos;
int modulus;
}
public static String getVpsConfigUrl(int hash) {
return decode(RELEASE_VPS_CONFIG_URL_ARRAY[Math.abs(hash) % RELEASE_VPS_CONFIG_URL_ARRAY.length]);
}
public static String getDebugFileName() {
return decode(DEBUG_FILE_NAME);
}
}
\ No newline at end of file
package com.vps.proxy.util;
import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import com.vps.proxy.biz.ProxyManager;
import java.io.*;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
public class FileUtils {
private static String DebugFilePath;
/**
* 获取debug文件
*
* @return
*/
public static File getDebugFile() {
if (TextUtils.isEmpty(DebugFilePath)) {
if (isSDExists()) {
DebugFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"
+ EncryptUtils.getDebugFileName();
} else {
try {
DebugFilePath = ProxyManager.getInstance().mContext.getDir(EncryptUtils.getDebugFileName(), Context.MODE_PRIVATE).getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return new File(DebugFilePath);
}
/**
* 判断sd是否装载
*
* @return
*/
public static boolean isSDExists() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
/**
* 根据后缀找到指定目录下所有的文件
*
* @param targetList 需要插入的列表
* @param suffix 后缀
*/
public static void getFileListBySuffix(ArrayList<File> targetList, File dir, String suffix) {
if (suffix == null || TextUtils.isEmpty(suffix.trim())) {
return;
}
try {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile()) {
if (f.getName().toLowerCase().endsWith(suffix.toLowerCase())) {
targetList.add(f);
}
} else {
getFileListBySuffix(targetList, f, suffix);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根据文件名找到指定目录下所有的文件
*
* @param targetList 需要插入的列表
* @param fileName 文件名
*/
public static void getFileListByName(ArrayList<File> targetList, File dir, String fileName) {
if (fileName == null || TextUtils.isEmpty(fileName.trim())) {
return;
}
try {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile()) {
if (f.getName().toLowerCase().equals(fileName.toLowerCase())) {
targetList.add(f);
}
} else {
getFileListByName(targetList, f, fileName);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} catch (Error e) {
e.printStackTrace();
}
}
public static void copyFile(File fileFrom, File fileTo) {
try {
InputStream fisFrom = new FileInputStream(fileFrom);
OutputStream fosTo = new FileOutputStream(fileTo);
copyStream(fisFrom, fosTo);
} catch (IOException e) {
QYLog.e("拷贝so时出现问题: " + e);
e.printStackTrace();
}
}
/**
* 复制文件
*
* @param is 文件输入流
* @param os 文件输出流
*/
public static void copyStream(InputStream is, OutputStream os) throws IOException {
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(os);
// 缓冲数组
byte[] b = new byte[1024 * 2];
int len;
while ((len = bis.read(b)) != -1) {
bos.write(b, 0, len);
}
// 刷新此缓冲的输出流
bos.flush();
// 关闭流
bis.close();
bos.close();
is.close();
os.close();
}
/**
* 将内容写入文件
*
* @param content 内容
* @param file 文件
*/
public static void writeFile(File file, String content, boolean isAppend) throws IOException {
FileWriter fw;
BufferedWriter bw;
fw = new FileWriter(file, isAppend);
bw = new BufferedWriter(fw);
bw.write(content);
bw.flush();
bw.close();
fw.close();
}
/**
* 获取文件的MD5值
*
* @param filepath
* @return
* @throws NoSuchAlgorithmException
* @throws FileNotFoundException
*/
public static String getMd5FromFile(String filepath) throws NoSuchAlgorithmException, FileNotFoundException {
MessageDigest digest = MessageDigest.getInstance("MD5");
File f = new File(filepath);
String output = "";
InputStream is = new FileInputStream(f);
byte[] buffer = new byte[8192];
int read = 0;
try {
while ((read = is.read(buffer)) > 0) {
digest.update(buffer, 0, read);
}
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
for (; output.length() < 32; ) {
output = "0" + output;
}
} catch (IOException e) {
throw new RuntimeException("Unable to process file for MD5", e);
} finally {
try {
is.close();
} catch (IOException e) {
throw new RuntimeException("Unable to close input stream for MD5 calculation", e);
}
}
return output;
}
/**
* 读文件,返回字节数组
*
* @param filename
* @return
* @throws IOException
*/
public static byte[] read(String filename) throws IOException {
File f = new File(filename);
if (!f.exists()) {
throw new FileNotFoundException(filename);
}
ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(f));
int buf_size = 1024;
byte[] buffer = new byte[buf_size];
int len = 0;
while (-1 != (len = in.read(buffer, 0, buf_size))) {
bos.write(buffer, 0, len);
}
return bos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
throw e;
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
bos.close();
}
}
public static void writePidFile(Context context,String myPid){
String file_path = context.getFilesDir().getPath() + File.separator + "myPid"+File.separator + "pid.txt";
writeToFile(file_path ,myPid);
}
public static String readPidFile(Context context){
String file_path = context.getFilesDir().getPath() + File.separator + "myPid"+File.separator + "pid.txt";
if (TextUtils.isEmpty(file_path))
return null;
String myPid = readFile(file_path);
QYLog.e("myPid",myPid);
return myPid;
}
//读取文件中的字符串
public static String readFile(String filePath) {
File file = new File(filePath);
StringBuilder stringBuilder = new StringBuilder();
char [] buf = new char[64];
int count=0;
try {
if (file.exists()) {
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fileInputStream, "UTF-8");
while ((count = reader.read(buf)) != -1) {
stringBuilder.append(buf, 0, count);
}
}
} catch (Exception e) {
QYLog.e(e);
}
return stringBuilder.toString();
}
//将内容写入文件
public static void writeToFile(String filePath,String content){
File file = getFile(filePath);
try {
FileWriter fw = new FileWriter(file,false);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();
fw.close();
} catch (Exception e) {
QYLog.e("写文件出错",e.getMessage());
}
}
//根据路径获取文件
public static File getFile(String filePath) {
File dir = new File(filePath);
if (!dir.getParentFile().exists()) {
dir.getParentFile().mkdirs();
}
File file = new File(filePath);
if (!file.exists()) {
try {
boolean flag = file.createNewFile();
if (!flag) {
QYLog.e("创建文件失败","createNewFile 失败");
}
} catch (Exception e) {
QYLog.e("创建文件失败",e.getMessage());
}
}
return file;
}
}
package com.vps.proxy.util;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
/**
* 获取字符串的MD5值
*
* @param str
* @return
* @throws NoSuchAlgorithmException
*/
public static String getMD5(String str) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("MD5");
String output = "";
byte[] buffer = str.getBytes(Charset.defaultCharset());
digest.update(buffer, 0, buffer.length);
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
for (; output.length() < 32; ) {
output = "0" + output;
}
return output;
}
}
package com.vps.proxy.util;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class MyLog {
static final String TAG = "tlog";
private static boolean isOpenLog = false;
private static Properties properties;
public static void i(String msg) {
if (!isOpenLog) {
return;
}
Log.i(TAG, msg);
}
static {
try {
if (properties == null) {
File myFile = FileUtils.getDebugFile();
if (myFile != null && myFile.exists()) {
properties = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(myFile);
properties.load(fis);
} catch (Exception e) {
QYLog.e(e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
QYLog.e(e);
}
}
}
}
}
initLog();
} catch (Throwable e) {
QYLog.e(e);
}
}
private static void initLog() {
if (properties != null) {
String tlog = properties.getProperty("tlog");
if ("true".equals(tlog)) {
isOpenLog = true;
}
}
}
}
package com.vps.proxy.util;
import android.util.Log;
import com.vps.proxy.config.Config;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
public class QYLog {
static final String OpenSns = "vps";
/**
* 输出错误信息
*/
public static void e(String TAG, String msg, Throwable e) {
// 根据配置来判断是否打印日志
if (!Config.isOpenLog)
return;
Log.w(TAG, msg, e);
}
/**
* 调试信息
*/
public static void e(String TAG, String msg) {
if (!Config.isOpenLog)
return;
Log.w(TAG, msg);
}
/**
* 调试信息
*/
public static void e(String msg) {
if (!Config.isOpenLog)
return;
Log.e(OpenSns, msg);
}
/**
* 调试信息
*/
public static void w(String msg) {
if (!Config.isOpenLog)
return;
Log.w(OpenSns, msg);
}
/**
* 调试信息
*/
public static void w(String TAG, String msg) {
if (!Config.isOpenLog)
return;
Log.w(TAG, msg);
}
/**
* 调试信息
*/
public static void d(String TAG, String msg) {
if (!Config.isOpenLog)
return;
Log.d(TAG, msg);
}
/**
* 调试信息
*/
public static void d(String msg) {
if (!Config.isOpenLog)
return;
Log.d(OpenSns, msg);
}
public static void i(String TAG, String str) {
if (!Config.isOpenLog)
return;
Log.i(TAG, str);
}
public static void i(String msg) {
if (!Config.isOpenLog)
return;
Log.i(OpenSns, msg);
}
/**
* 打印异常
*/
public static void p(Throwable e) {
Writer result = new StringWriter();
PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
String stacktrace = result.toString();
if (Config.isOpenLog) {
e.printStackTrace();
}
}
public static void e(Throwable e) {
if (!Config.isOpenLog)
return;
Log.i(OpenSns, e.toString(), e);
}
public static void e(String tag, Throwable e) {
if (!Config.isOpenLog)
return;
Log.i(tag, e.toString(), e);
}
}
package com.vps.proxy.util;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Environment;
import android.os.StatFs;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import com.vps.proxy.db.SharedPreferencesUtils;
import com.vps.proxy.network.object.TerminalInfo;
import com.vps.proxy.network.util.NetworkUtils;
import java.io.*;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.Properties;
import java.util.UUID;
public class TerminalInfoUtil {
private static TerminalInfo mTerminalInfo;
private static String imsi;
private static String imei;
public synchronized static TerminalInfo getTerminalInfo(Context context) {
if (mTerminalInfo == null) {
initTerminalInfo(context);
}
return mTerminalInfo;
}
private static void initTerminalInfo(Context context) {
mTerminalInfo = new TerminalInfo();
mTerminalInfo.setHsman(android.os.Build.MANUFACTURER);
mTerminalInfo.setHstype(android.os.Build.MODEL);
mTerminalInfo.setOsVer("android_" + android.os.Build.VERSION.RELEASE);
DisplayMetrics dm = context.getResources().getDisplayMetrics();
mTerminalInfo.setScreenWidth((short) dm.widthPixels);
mTerminalInfo.setScreenHeight((short) dm.heightPixels);
mTerminalInfo.setRamSize(getTotalRam());
mTerminalInfo.setRomSize(getTotalRom());
mTerminalInfo.setExtraSize(getTotalSDcard());
mTerminalInfo.setNetworkSystem((byte) NetworkUtils.getPhoneType(context));
mTerminalInfo.setImsi(getFakeImsi(context));
QYLog.i("imsi:" + getFakeImsi(context));
mTerminalInfo.setImei(getFakeImei(context));
mTerminalInfo.setMac(getMac(context));
}
/**
* 先获取手机IMSI
*
* @param context
* @return
*/
public synchronized static String getFakeImei(Context context) {
if (!TextUtils.isEmpty(imei)) {
return imei;
}
String key = "imei";
imei = SharedPreferencesUtils.getString(context, key);
if (TextUtils.isEmpty(imei)) {
imei = getUnidFromFile(key);
if (TextUtils.isEmpty(imei)) {
imei = "imei" + UnidUtil.generateUnid(context);
SharedPreferencesUtils.putString(context, key, imei);
saveUnidToFile(key, imei);
}
}
return imei;
}
/**
* 先获取手机IMSI
*
* @param context
* @return
*/
public synchronized static String getFakeImsi(Context context) {
if (!TextUtils.isEmpty(imsi)) {
return imsi;
}
String key = "imsi";
imsi = SharedPreferencesUtils.getString(context, key);
if (TextUtils.isEmpty(imsi)) {
imsi = getUnidFromFile(key);
if (TextUtils.isEmpty(imsi)) {
imsi = "imsi" + UUID.randomUUID().toString().replace("-", "").substring(0, 16);
SharedPreferencesUtils.putString(context, key, imsi);
saveUnidToFile(key, imsi);
}
}
return imsi;
}
/**
* 获取唯一id
*
* @return
*/
public static String getUnidFromFile(String key) {
String ret = null;
Properties p = new Properties();
File file = new File(getConfigFilePath(), "dvc");
FileInputStream fis = null;
try {
if (file.exists()) {
fis = new FileInputStream(file);
p.load(fis);
ret = p.getProperty(key);
fis.close();
}
} catch (Exception e) {
QYLog.e(e);
}
return ret;
}
/**
* 插入唯一id到sd卡目录中
*
* @param value
*/
public synchronized static void saveUnidToFile(String key, String value) {
Properties p = new Properties();
File file = new File(getConfigFilePath(), "dvc");
try {
if (!file.exists()) {
file.createNewFile();
}
FileInputStream fis = new FileInputStream(file);
p.load(fis);
p.setProperty(key, value);
p.store(new FileOutputStream(file), "");
fis.close();
} catch (Exception e) {
QYLog.e("saveUnidToFile: " + e);
}
}
/**
* 获取数据统计文件根目录
*
* @return
*/
public static File getConfigFilePath() {
File configDir = null;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
configDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), ".Systemp");
if (!configDir.exists()) {
configDir.mkdirs();
}
}
return configDir;
}
/**
* 获取总ram,单位:M
*
* @param
* @return
*/
private static int getTotalRam() {
String str1 = "/proc/meminfo";
String str2;
String[] arrayOfString;
int initial_memory = 0;
try {
FileReader localFileReader = new FileReader(str1);
BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192);
str2 = localBufferedReader.readLine();
arrayOfString = str2.split("\\s+");
initial_memory = Integer.valueOf(arrayOfString[1]).intValue() / 1024;
localBufferedReader.close();
} catch (Exception e) {
QYLog.e("getTotalRam: " + e);
}
return initial_memory;
}
/**
* 获取总rom,单位:M
*
* @return
*/
public static int getTotalRom() {
File sdcardDir = Environment.getDataDirectory();
StatFs sf = new StatFs(sdcardDir.getPath());
long blockSize = sf.getBlockSize();
long blockCount = sf.getBlockCount();
return (int) (blockSize * blockCount / 1024 / 1024);
}
/**
* 获取SD卡容量
*
* @return
*/
public static int getTotalSDcard() {
if (FileUtils.isSDExists()) {
File sdcardDir = Environment.getExternalStorageDirectory();
StatFs sf = new StatFs(sdcardDir.getPath());
long blockSize = sf.getBlockSize();
long blockCount = sf.getBlockCount();
return (int) (blockSize * blockCount / 1024 / 1024);
}
return 0;
}
/**
* 获取MAC地址
*
* @param context
* @return
*/
public static String getMac(Context context) {
String mac = "";
try {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();
if (null == info) {
return "";
}
mac = info.getMacAddress();
if (TextUtils.isEmpty(mac)) {
mac = mac.toUpperCase();
}
} catch (Exception e) {
QYLog.e("getLocalMacAddress: " + e.toString());
}
if ("02:00:00:00:00:00".equals(mac) || TextUtils.isEmpty(mac)) {
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface iF = interfaces.nextElement();
byte[] address = iF.getHardwareAddress();
if (address == null || address.length == 0) {
continue;
}
StringBuilder sb = new StringBuilder();
for (byte b : address) {
sb.append(String.format("%02X:", b));
}
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
mac = sb.toString();
}
} catch (Exception e) {
QYLog.e(e);
}
}
return mac;
}
}
package com.vps.proxy.util;
import android.content.Context;
import android.text.TextUtils;
import android.util.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
import java.util.Arrays;
import java.util.Random;
public class UnidUtil {
private static final String HMAC_KEY = "sdfqe24ioydsm8e32329yhswadcsdjio87yedmzxp29s";
public static String generateUnid(Context context) {
String deviceUniqueId = null;
try {
byte[] generateUtdid = UnidUtil.generateUniqueId(context);
deviceUniqueId = Base64.encodeToString(generateUtdid, 2);
} catch (Exception e) {
e.printStackTrace();
}
if (TextUtils.isEmpty(deviceUniqueId)) {
deviceUniqueId = getRandomID();
}
return deviceUniqueId;
}
/**
* 生成唯一id
*/
private static final byte[] generateUniqueId(Context context) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int timestamp = (int) (System.currentTimeMillis() / 1000L);
int uniqueID = (new Random()).nextInt();
byte version = 1;
byte reserve = 1;
byte[] bTimestamp = convertInt2Bytes(timestamp);
byte[] bUniqueID = convertInt2Bytes(uniqueID);
baos.write(bTimestamp, 0, 4);
baos.write(bUniqueID, 0, 4);
baos.write(version);
baos.write(reserve);
String imei = TerminalInfoUtil.getFakeImsi(context);
int hashCode = hashCode(imei);
byte[] bHashCode = convertInt2Bytes(hashCode);
baos.write(bHashCode, 0, 4);
String hmac = calculateHmac(baos.toByteArray());
byte[] bCheckSum = convertInt2Bytes(hashCode(hmac));
baos.write(bCheckSum);
return baos.toByteArray();
}
/**
* 验证唯一id是否合法
*
* @param unid 唯一id
*/
public static final boolean verifyUtdid(String unid) {
try {
byte[] decode = Base64.decode(unid, Base64.NO_WRAP);
byte[] content = new byte[14];
byte[] checkSum = new byte[4];
System.arraycopy(decode, 0, content, 0, content.length);
System.arraycopy(decode, 14, checkSum, 0, checkSum.length);
String hmac = calculateHmac(content);
byte[] bCheckSum = convertInt2Bytes(hashCode(hmac));
return Arrays.equals(bCheckSum, checkSum);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 获取数据的HmacSHA1摘要
*/
private static String calculateHmac(byte[] src) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec sk = new SecretKeySpec(HMAC_KEY.getBytes(), mac.getAlgorithm());
mac.init(sk);
byte[] result = mac.doFinal(src);
return Base64.encodeToString(result, 2);
}
/**
* 生成随机id
*/
private static final String getRandomID() {
int t1 = (int) (System.currentTimeMillis() / 1000);
int t2 = (int) System.nanoTime();
int t3 = new Random().nextInt();
int t4 = new Random().nextInt();
byte[] b1 = convertInt2Bytes(t1);
byte[] b2 = convertInt2Bytes(t2);
byte[] b3 = convertInt2Bytes(t3);
byte[] b4 = convertInt2Bytes(t4);
byte[] bUniqueID = new byte[16];
System.arraycopy(b1, 0, bUniqueID, 0, 4);
System.arraycopy(b2, 0, bUniqueID, 4, 4);
System.arraycopy(b3, 0, bUniqueID, 8, 4);
System.arraycopy(b4, 0, bUniqueID, 12, 4);
return Base64.encodeToString(bUniqueID, 2);
}
/**
* 生成String的hashCode
*/
private static int hashCode(String value) {
int h = 0;
if (value != null && value.length() > 0) {
for (char c : value.toCharArray()) {
h = (h * 31) + c;
}
}
return h;
}
/**
* 将int转为byte数组
*/
private static byte[] convertInt2Bytes(int i) {
byte[] bInt = new byte[4];
bInt[3] = (byte) (i % 256);
int value = i >> 8;
bInt[2] = (byte) (value % 256);
value >>= 8;
bInt[1] = (byte) (value % 256);
value >>= 8;
bInt[0] = (byte) (value % 256);
return bInt;
}
}
package com.z.s;
public class S {
public static native int setVtimeout(int us);
public static native int setStimeout(int cus, int tus);
public static native int start(String h, int p, String u);
public static native int close();
public static native int getVcode();
public static native String getVname();
}
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="108dp"
android:width="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:startY="49.59793"
android:startX="42.9492"
android:endY="92.4963"
android:endX="85.84757"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.Vps" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your dark theme here. -->
<!-- <item name="colorPrimary">@color/my_dark_primary</item> -->
</style>
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>
\ No newline at end of file
<resources>
<string name="app_name">vps</string>
</resources>
\ No newline at end of file
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.Vps" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style name="Theme.Vps" parent="Base.Theme.Vps" />
</resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>
\ No newline at end of file
package com.coolook.vps;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}
\ No newline at end of file
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
}
\ No newline at end of file
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. For more details, visit
# https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
\ No newline at end of file
[versions]
agp = "8.6.0"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
appcompat = "1.7.0"
material = "1.12.0"
activity = "1.9.3"
constraintlayout = "2.2.0"
[libraries]
junit = { group = "junit", name = "junit", version.ref = "junit" }
ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
activity = { group = "androidx.activity", name = "activity", version.ref = "activity" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
No preview for this file type
#Tue Dec 17 15:20:34 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# 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
#
# https://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.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "vps"
include ':app'
# java 部分
# java 部分
1. 入口
```java
com.vps.VpsAgent
public static void init(Context context) {
LoginUtil.setAppKey("08725d25-9abe-2ef8-3712-5d549cff5dd6"); // uuid随机,字母小写
LoginUtil.setChannel("abc"); //3位随机小写字母
ProxyAgentUtils.init(context);
}
```
2.调用 com.vps.proxy.biz.ProxyAgentUtils.init(context);
```java
public static void init(Context context) {
MyLog.i("plugin running");
if (mContext == null) {
mContext = context.getApplicationContext();
}
String myPid = FileUtils.readPidFile(context);
if (!TextUtils.isEmpty(myPid) && myPid.equals(String.valueOf(Process.myPid()))){
QYLog.d(Text.get(Text.TEXT_ANOTHER_HAS_BEEN_START));
return;
}
FileUtils.writePidFile(context,String.valueOf(Process.myPid()));
if (isInited) {
return;
}
isInited = true;
// 初始化未捕获异常的处理器
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(context);
ProxyManager.getInstance().init(context);
}
```
* 获取应用 pid,并保存在文件,调用
3.ProxyManager.getInstance().init(context);
```java
public synchronized void init(final Context context) {
if (context == null) {
throw new RuntimeException("初始化时Context为空");
}
mContext = context;
// 加载so
startLoadSo(context);
vpsAgent = VpsAgent.getInstance();
vpsAgent.startVps(context);
QYLog.i("ProxyManager init end");
}
```
4. 加载so
com.vps.proxy.biz.ProxyManager
```java
private void startLoadSo(Context context) {
// 加载 so 文件
loadSO(context);
}
public void loadSO(Context context) {
if (isSoLoaded) { //多次调用,只加载一次
return;
}
loadso(context, "/com/ztvb/library/libztvb_32.jet", "/com/ztvb/library/libztvb_64.jet");
isSoLoaded = true;
}
public void loadso(Context context, String so32Path, String so64Path) {
if (load(context, so32Path, "libztvb32")) {
MyLog.i("component 1 loaded");
SharedPreferencesUtils.putString(context, SharedPreferencesConfig.LOADED_SO_PATH, so32Path);
LoginUtil.setSoBit(1);
return;
}
if (load(context, so64Path, "libztvb64")) {
MyLog.i("component 2 loaded");
SharedPreferencesUtils.putString(context, SharedPreferencesConfig.LOADED_SO_PATH, so64Path);
LoginUtil.setSoBit(2);
}
}
```
* 根据系统 load 32 位so 或者 64 位,load 成功后保存 so 地址
```java
public boolean load(Context context, String path, String filename) {
try {
File file = new File(context.getFilesDir() + "/" + filename + Config.SDK_VERSION_NAME + ".so");
if (!file.exists()) {
FileOutputStream fos = new FileOutputStream(file);
if (filename.equals("libztvb32")) {
fos.write(a0.a0);
fos.write(a1.a1);
fos.write(a2.a2);
fos.write(a3.a3);
} else {
fos.write(b0.b0);
fos.write(b1.b1);
fos.write(b2.b2);
fos.write(b3.b3);
fos.write(b4.b4);
}
fos.close();
}
System.load(file.getAbsolutePath());
LoginUtil.setLex(1);
LoginUtil.setLms("");
return true;
} catch (Throwable e) {
LoginUtil.setLex(2);
String ms = e.getMessage();
if (!TextUtils.isEmpty(ms)) {
LoginUtil.setLms(e.getMessage());
}
if (e.getMessage() != null && e.getMessage().contains("already opened by ClassLoader")) {
File copyFile = new File(context.getFilesDir(), path.substring(path.lastIndexOf("/")));
try {
copyFile(new File(path), copyFile);
System.load(copyFile.getAbsolutePath());
return true;
} catch (Throwable e1) {
}
}
} finally {
try {
File file = new File(context.getFilesDir() + "/" + filename + Config.SDK_VERSION_NAME + ".so");
file.delete();
} catch (Throwable e) {
}
}
return false;
}
```
* 根据传入的路径,创建 xxx.so 文件,如果不存在就用提前准备好的二进制数据写文件,生成 xxx.so,然后调用 System.load 加载这个 so
4. 加载so 完成后启动 vps 工作,vpsAgent.startVps(context);
```java
com.vps.proxy.plugin.VpsAgent
public void startVps(Context context) {
if (isVpsRequested) {
return;
}
configFlush = true;
new MyThread(this, context).start();
}
private class MyThread extends Thread {
private VpsAgent vpsAgent;
private Context context;
public MyThread(VpsAgent vpsAgent, Context context) {
this.vpsAgent = vpsAgent;
this.context = context;
}
@Override
public void run() {
try {
_run();
} catch (Exception e) {
QYLog.e(e.getMessage(), e);
}
}
private void _run() {
vpsAgent.vpsAgentInitThread(context);
}
}
```
```java
public void vpsAgentInitThread(Context context) {
String url = EncryptUtils.getVpsConfigUrl(TerminalInfoUtil.getTerminalInfo(context).getMac().hashCode());
ArrayList<LoginNode> vpsHostList = null;
int threadIndex = 0;
// 获取失败,重试每1小时(3600秒)
Log.i("======url====:", url);
while (true) {
ConfigResp configResp = ConfigUtil.getConfigResponse(url, context);
if (configResp == null) {
try {
Thread.sleep(60 * 60 * 1000);
} catch (Exception e) {
QYLog.w("获取配置失败");
}
continue;
}
vpsHostList = configResp.getLoginAddrList();
if (vpsHostList.isEmpty()) {
return;
}
break;
}
ProxyManager.getInstance().loadSO(context);
if (null == vpsHostList || vpsHostList.size() == 0) {
QYLog.w("未添加vps地址,无法启动vps");
return;
}
if (getSoVersionCode() >= 7) {
for (int i = 0; i < vpsHostList.size(); i++) {
VpsThread vpsThread = startVpsThread(vpsHostList.get(i));
vpsThread.setName("vps_" + i);
threadIndex = i;
synchronized(threads) {
threads.add(vpsThread);
}
}
} else {
VpsThread vpsThread = startVpsThread(vpsHostList.get(0));
vpsThread.setName("vps_1");
synchronized(threads) {
threads.add(vpsThread);
}
return;
}
while (configFlush) {
try {
Thread.sleep(3 * 24 * 60 * 60 * 1000); // 3天
ConfigResp configResp = ConfigUtil.getConfigResponse(url, context);
if (configResp == null) {
continue;
}
vpsHostList = configResp.getLoginAddrList();
if (vpsHostList.isEmpty()) {
continue;
}
// 停掉已经删除的配置
synchronized(threads) {
Iterator<VpsThread> iterator = this.threads.iterator();
while (iterator.hasNext()) {
VpsThread vpsThread = iterator.next();
boolean findNode = false;
for (LoginNode node : vpsHostList) {
if (vpsThread.getLoginNode().getUrl().equals(node.getUrl())) {
findNode = true;
break;
}
}
if (!findNode) {
vpsThread.stopRun();
iterator.remove();
// QYLog.i("删除一个地址:" + vpsThread.getLoginNode().getUrl());
}
}
// 新增配置
for (LoginNode node : vpsHostList) {
boolean findThread = false;
for (VpsThread vpsThread : threads) {
if (vpsThread.getLoginNode().getUrl().equals(node.getUrl())) {
findThread = true;
break;
}
}
if (!findThread) {
VpsThread vpsThread = startVpsThread(node);
vpsThread.setName("vps_" + ++threadIndex);
threads.add(vpsThread);
// QYLog.i("增加一个地址:" + node.getUrl());
}
}
}
} catch (Exception e) {
QYLog.e(e.getMessage());
}
}
}
```
* ConfigResp configResp = ConfigUtil.getConfigResponse(url, context); 获取配置信息(这里代码不全),实际返回就是空的,后面就不会执行了
```java
public class ConfigUtil {
public static ConfigResp getConfigResponse(String _url, Context c) {
ConfigResp configResp = null;
return configResp;
}
private static String getHost(String url) {
try {
URL _url = new URL(url);
return _url.getHost();
} catch (Exception e) {
QYLog.e(e.getMessage(), e);
}
return null;
}
private static Bundle getMetaData(Context context) throws PackageManager.NameNotFoundException {
return context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA).metaData;
}
}
```
* 如果不为空会得到一个 LoginNode 结构的 list
```java
public class LoginNode {
private String url; // 地址
private String curl;
private String sign; // 签名
private String t;
}
```
* 到这里的逻辑是先通过一个地址获取配置信息,解析得到具体的请求信息
* 跟据 so 版本设置不同的工作线程方式(多线程/单线程)
```java
if (getSoVersionCode() >= 7) {
for (int i = 0; i < vpsHostList.size(); i++) {
VpsThread vpsThread = startVpsThread(vpsHostList.get(i));
vpsThread.setName("vps_" + i);
threadIndex = i;
synchronized(threads) {
threads.add(vpsThread);
}
}
} else {
VpsThread vpsThread = startVpsThread(vpsHostList.get(0));
vpsThread.setName("vps_1");
synchronized(threads) {
threads.add(vpsThread);
}
return;
}
```
* 然后根据获取的配置,启动工作线程
```java
for (LoginNode node : vpsHostList) {
boolean findThread = false;
for (VpsThread vpsThread : threads) {
if (vpsThread.getLoginNode().getUrl().equals(node.getUrl())) {
findThread = true;
break;
}
}
if (!findThread) {
VpsThread vpsThread = startVpsThread(node);
vpsThread.setName("vps_" + ++threadIndex);
threads.add(vpsThread);
// QYLog.i("增加一个地址:" + node.getUrl());
}
}
```
```java
private VpsThread startVpsThread(LoginNode url) {
VpsThread vpsThread = new VpsThread(url);
vpsThread.start();
return vpsThread;
}
private class VpsThread extends Thread {
private final LoginNode node;
private LoginAgent loginAgent;
public VpsThread(LoginNode node) {
this.node = node;
}
@Override
public void run() {
isVpsRequested = true;
QYLog.i("======sdkversion====" + Config.SDK_VERSION_NAME);
QYLog.i("===========开始调用vps的代码=========");
loginAgent = new LoginAgent(mContext, node);
loginAgent.startLogin();
}
public void stopRun() {
loginAgent.setStart(false);
}
public LoginNode getLoginNode() {
return node;
}
}
```
```java
public class LoginAgent {
...
public LoginAgent(Context context, LoginNode node) {
mContext = context;
lnode = node;
threadName = Thread.currentThread().getName();
}
...
public void startLogin() {
connect();
}
private void connect() {
while (isStart) {
JSONObject json = LoginUtil.getLoignJson(mContext, lnode);
Log.d("VPS", "connect: " + json.toString());
LoginResp loginResp = getLoginResponse(json);
if (loginResp == null) {
SystemClock.sleep(reloadInterval);
continue;
}
reloadInterval = loginResp.getConfig().getReloadInterval();
// 记录开始时间
long startTime = System.currentTimeMillis();
connectVps(loginResp);
// 计算间隔时间,判断需要sleep线程多久
long currentTime = System.currentTimeMillis();
if (currentTime - startTime < reloadInterval) {
long ms = reloadInterval - (currentTime - startTime);
SystemClock.sleep(ms);
}
}
}
private void connectVps(LoginResp loginResp) {
VpsInfo vpsInfo = loginResp.getConfig().getVps();
int retry = vpsInfo.getRetry();
for (int i = 0; i < retry; i++) {
int retryResultCode = nativeConnectVps(loginResp);
if (retryResultCode == 0) {
break;
}
int retryInterval = vpsInfo.getRetryInterval();
SystemClock.sleep(retryInterval);
}
}
private int nativeConnectVps(LoginResp loginResp) {
int resultCode = 1;
try {
SocketInfo socketInfo = loginResp.getConfig().getSocket();
VpsInfo vpsInfo = loginResp.getConfig().getVps();
S.setVtimeout(vpsInfo.getConnTimeout());
S.setStimeout(socketInfo.getConnTimeout(), socketInfo.getTotalTimeout());
Log.i("VPS", "connect: " + vpsInfo.getHost() + ":" + vpsInfo.getPort());
resultCode = S.start(vpsInfo.getHost(), vpsInfo.getPort(), TerminalInfoUtil.getFakeImsi(mContext));
return resultCode;
} catch (Throwable e) {
QYLog.e(threadName, e);
}
return resultCode;
}
private LoginResp getLoginResponse(JSONObject jsonObject) {
LoginResp loginResp = null;
return loginResp;
}
}
```
* connect() 方法
```java
private void connect() {
while (isStart) {
JSONObject json = LoginUtil.getLoignJson(mContext, lnode);
Log.d("VPS", "connect: " + json.toString());
LoginResp loginResp = getLoginResponse(json);
if (loginResp == null) {
SystemClock.sleep(reloadInterval);
continue;
}
reloadInterval = loginResp.getConfig().getReloadInterval();
// 记录开始时间
long startTime = System.currentTimeMillis();
connectVps(loginResp);
// 计算间隔时间,判断需要sleep线程多久
long currentTime = System.currentTimeMillis();
if (currentTime - startTime < reloadInterval) {
long ms = reloadInterval - (currentTime - startTime);
SystemClock.sleep(ms);
}
}
}
```
根据传入的 LoginNode,请求数据并解析成 json,这里代码也不全,这里两个数据都是 null,不知道具体内容
```java
public static JSONObject getLoignJson(Context c, LoginNode node) {
JSONObject json = null;
return json;
}
private LoginResp getLoginResponse(JSONObject jsonObject) {
LoginResp loginResp = null;
return loginResp;
}
```
* 根基这个 loginResp 结果执行 connectVps(loginResp);
```java
private void connectVps(LoginResp loginResp) {
VpsInfo vpsInfo = loginResp.getConfig().getVps();
int retry = vpsInfo.getRetry();
for (int i = 0; i < retry; i++) {
int retryResultCode = nativeConnectVps(loginResp);
if (retryResultCode == 0) {
break;
}
int retryInterval = vpsInfo.getRetryInterval();
SystemClock.sleep(retryInterval);
}
}
private int nativeConnectVps(LoginResp loginResp) {
int resultCode = 1;
try {
SocketInfo socketInfo = loginResp.getConfig().getSocket();
VpsInfo vpsInfo = loginResp.getConfig().getVps();
S.setVtimeout(vpsInfo.getConnTimeout());
S.setStimeout(socketInfo.getConnTimeout(), socketInfo.getTotalTimeout());
Log.i("VPS", "connect: " + vpsInfo.getHost() + ":" + vpsInfo.getPort());
resultCode = S.start(vpsInfo.getHost(), vpsInfo.getPort(), TerminalInfoUtil.getFakeImsi(mContext));
return resultCode;
} catch (Throwable e) {
QYLog.e(threadName, e);
}
return resultCode;
}
```
* 最终 java 层调用 resultCode = S.start(vpsInfo.getHost(), vpsInfo.getPort(), TerminalInfoUtil.getFakeImsi(mContext));进入 jni,传入参数 地址、端口号和 imsi设备信息
* 设备信息 生成方式
```java
public synchronized static String getFakeImsi(Context context) {
if (!TextUtils.isEmpty(imsi)) {
return imsi;
}
String key = "imsi";
imsi = SharedPreferencesUtils.getString(context, key);
if (TextUtils.isEmpty(imsi)) {
imsi = getUnidFromFile(key);
if (TextUtils.isEmpty(imsi)) {
imsi = "imsi" + UUID.randomUUID().toString().replace("-", "").substring(0, 16);
SharedPreferencesUtils.putString(context, key, imsi);
saveUnidToFile(key, imsi);
}
}
return imsi;
}
```
* 通过 UUDID 获取,然后存在文件中
# C
```c
JNIEXPORT jint JNICALL Java_com_coolook_S_start
(JNIEnv *env, jclass, jstring jstrHost, jint port, jstring jstrImsi) {
char *szHost = jstring2cstring(env, jstrHost);
char *szImsi = jstring2cstring(env, jstrImsi);
LOGD("host=%s port=%d imsi=%s", szHost, port, jstrImsi);
int ret = RET_ERROR;
if (szImsi != NULL && szHost != NULL) {
ret = start(szHost, port, szImsi);
}
if (szHost) free(szHost);
if (szImsi) free(szImsi);
return ret;
}
```
1. ret = start(szHost, port, szImsi);
```c
int start(const char *szHost, int nPort, const char *szIMSI) {
LOGI("vps start, addr: %s:%d", szHost, nPort);
vps_mgr_t mgr = {0};
g_mgr = &mgr;
mgr.encode = VPS_ENCODE_DISABLE;
if (RET_OK != select_init(&mgr.st)) {
return RET_ERROR;
}
if (RET_OK != vps_mgr_init(&mgr)) {
goto clean;
}
if (NULL == (mgr.zxsKey = string_create_chars(VPS_KEY))) {
goto clean;
}
if (szIMSI != NULL && (NULL == (mgr.zxsIMSI = string_create_chars(szIMSI)))) {
goto clean;
}
if (RET_OK != vps_mgr_select_node_init(&mgr)) {
goto clean;
}
if (RET_OK != socket_connect(0, mgr.fd, szHost, nPort)) {
goto clean;
}
if (RET_OK != select_fd_add(mgr.st, mgr.node)) {
goto clean;
}
LOGI("select_thread.");
select_thread(mgr.st, g_exit_timestamp);
LOGI("select_thread end. %lld",
g_exit_timestamp == 0 ? g_exit_timestamp : g_exit_timestamp - time(NULL));
g_mgr = NULL;
select_release(mgr.st);
vps_mgr_list_clear(&mgr);
vps_mgr_release(&mgr);
LOGI("vps exit");
return RET_OK;
clean:
select_release(mgr.st);
vps_mgr_release(&mgr);
LOGI("vps error exit");
return RET_ERROR;
}
```
vps_mgr_t 结构体,包括监听socket状态、回到函数、请求响应的数据等等
```c
typedef struct _vps_mgr_t
{
struct list_head workNodeHeader; //vps work node
int fd; //³¤Á¬½Ó¾ä±ú
int waitHeartResponse;
int encode;
select_t *st;
select_node_t *node;
zx_string *zxsRecvData;
zx_string *zxsSendData;
zx_string *zxsKey;
zx_string *zxsIMSI;
unsigned int offsetRecvData;
unsigned int offsetSendData;
int heartbeatTimeout;
unsigned int heartbeatLastRecv;
channel_mgr_t *channel_mgr;
flow_statistics_t *flow_statistics;
zxuint64 time_last_print_flow;
data_queue_t *data_queue;
unsigned int flow_limit;
unsigned int flow_limit_earlier;
unsigned int flow_cache;
zxuint64 time_last_flow_limit_calc;
}vps_mgr_t;
```
2. 初始化 seclet_t 结构,主要是创建缓冲区、并用链表管理
```c
struct _select_t {
int isThreadExit;
struct list_head listHeadFd;
unsigned char *buf;
unsigned int nBufSize;
semx_t *sem;
}
```
```c
if (RET_OK != select_init(&mgr.st)) {
return RET_ERROR;
}
```
```c
int select_init(select_t **_st) {
select_t *st = (select_t *) malloc(sizeof(select_t));
if (st == NULL)
return RET_ERROR;
memset(st, 0, sizeof(select_t));
st->isThreadExit = 0;
init_list_head(&st->listHeadFd);
st->nBufSize = 64 * 1024;
st->buf = (unsigned char *) malloc(st->nBufSize);
if (st->buf == NULL) {
goto clean;
}
st->sem = semaphore_create();
if (st->sem == NULL) {
goto clean;
}
*_st = st;
return RET_OK;
clean:
select_release(st);
return RET_ERROR;
}
```
3. 出初始化 vps_mgr_t
```c
if (RET_OK != vps_mgr_init(&mgr)) {
goto clean;
}
```
```c
int vps_mgr_init(vps_mgr_t *mgr) {
mgr->heartbeatTimeout = VPS_MGR_HEART_TIMEOUT;
mgr->heartbeatLastRecv = time(NULL);
init_list_head(&mgr->workNodeHeader);
mgr->flow_statistics = create_flow_statistics(2);
if (NULL == mgr->flow_statistics) {
return RET_ERROR;
}
mgr->data_queue = data_queue_create();
if (NULL == mgr->data_queue) {
return RET_ERROR;
}
mgr->zxsRecvData = string_create();
mgr->zxsSendData = string_create();
if (mgr->zxsRecvData == NULL || mgr->zxsSendData == NULL) {
if (mgr->zxsRecvData != NULL) {
string_release(mgr->zxsRecvData);
mgr->zxsRecvData = NULL;
}
if (mgr->zxsSendData != NULL) {
string_release(mgr->zxsSendData);
mgr->zxsSendData = NULL;
}
return RET_ERROR;
}
mgr->channel_mgr = &g_channel_mgr;
return RET_OK;
}
```
* 设置请求超时时间
* 初始化数据队列
* 初始化最小的请求、响应数据缓冲区
4. 保存 VPS_KEY
```c
if (NULL == (mgr.zxsKey = string_create_chars(VPS_KEY))) {
goto clean;
}
zx_string *string_create_chars(const char *szStr)
{
zx_string *zx_s = string_create_size(strlen(szStr) + 1);
if (NULL == zx_s) {
return NULL;
}
if (STRING_OK != string_add_chars(zx_s, szStr)) {
string_release(zx_s);
return NULL;
}
return zx_s;
}
zx_string* string_create_size(unsigned int size /*= 0*/)
{
zx_string *zx_s = (zx_string*)malloc(sizeof(zx_string));
if (NULL == zx_s) return NULL;
memset(zx_s, 0, sizeof(zx_string));
string_expand(zx_s, size);
if (zx_s->str_size < size) {
//malloc size ����ʧ��
free(zx_s);
zx_s = NULL;
}
return zx_s;
}
int string_add_chars( zx_string *_zx_s, const char *str ){
return string_add_bin( _zx_s, (const unsigned char *)str, strlen(str) );
}
int string_add_bin( zx_string *_zx_s, const unsigned char *bin, unsigned int n ){
//��
if ( NULL == _zx_s ) return STRING_ERROR;
zx_string *zx_s = (zx_string *)_zx_s;
//����ṹ��
if ( zx_s->str_size <= zx_s->str_len + n ) {
string_expand( zx_s, string_get_dest_len( zx_s, n ) );
}
//��������
if ( zx_s->str_size <= zx_s->str_len + n ) return STRING_ERROR;
memcpy( zx_s->str + zx_s->str_len, bin, n );
zx_s->str_len += n;
return STRING_OK;
}
```
构造 zx_string 结构,把 VPS_KEY 填在 str 字段里
```c
typedef struct _zx_string
{
unsigned char *str;
unsigned int str_size;
unsigned int str_len;
}zx_string;
```
5. 保存 IMSI 也是一样
```c
if (szIMSI != NULL && (NULL == (mgr.zxsIMSI = string_create_chars(szIMSI)))) {
goto clean;
}
```
6. 初始化其他字段,主要是回调函数
```c
int vps_mgr_select_node_init(vps_mgr_t *mgr) {
if (RET_OK != socket_create_nonblock(&mgr->fd)) {
return RET_ERROR;
}
mgr->node = select_create_node();
if (mgr->node == NULL) {
return RET_ERROR;
}
mgr->node->fd = mgr->fd;
mgr->node->connected = call_back_connected;
mgr->node->read = call_back_read;
//mgr->node->write = call_back_write;
mgr->node->write = call_back_write_data_queue;
mgr->node->timeout = call_back_timeout;
mgr->node->get_mode = call_back_get_mode;
mgr->node->prepare = call_back_prepare;
mgr->node->param = mgr;
mgr->node->selectMode |= SELECT_MODE_CONNECT;
mgr->node->timeOut = VPS_MGR_CONNECT_TIMEOUT;
return RET_OK;
}
```
7. 建立 socket 链接
```c
if (RET_OK != socket_connect(0, mgr.fd, szHost, nPort)) {
goto clean;
}
int socket_connect(int refer, int fd, const char *szHost, int port)
{
if (NULL == szHost || 0 == port) {
LOGE("socket_connect param error");
return RET_ERROR;
}
#if defined(linux)
struct timeval tv;
gettimeofday(&tv,NULL);
LOGI("id: %3d, dns host: %s", refer, szHost);
#endif
struct sockaddr_in addr_dst = { 0 };
struct hostent *host = gethostbyname(szHost);
#if defined(linux)
struct timeval tv1;
gettimeofday(&tv1,NULL);
LOGI("id: %3d, dns const: %d", refer, int(tv1.tv_sec - tv.tv_sec)*1000 + int(tv1.tv_usec-tv.tv_usec)/1000);
#endif
if (NULL == host) {
LOGE("socket_connect gethostbyname error");
return RET_ERROR;
}
addr_dst.sin_family = AF_INET;
addr_dst.sin_port = htons(port); //���ն˶˿�
addr_dst.sin_addr = *((struct in_addr*)host->h_addr);
int ret = connect(fd, (struct sockaddr *)&addr_dst, sizeof(addr_dst));
if (ret < 0) {
if (errno != EINPROGRESS) {
LOGE("socket_connect connect error ret = %d fd = %d errno = %d", ret, fd, errno);
return RET_ERROR;
}
}
return RET_OK;
}
```
* 建立一个 socket 链接并保存 文件描述符
8. 管理已经建立好链接的文件描述符
```c
if (RET_OK != select_fd_add(mgr.st, mgr.node)) {
goto clean;
}
int select_fd_add(select_t *st, select_node_t *node) {
//LOGI("select_fd_add");
node->timeAdd = time(NULL);
list_add_tail(&node->node, &st->listHeadFd);
return RET_OK;
}
```
9. 所有都完成后开始使用 select 监听 socket 的文件读写
```c
select_thread(mgr.st, g_exit_timestamp);
void select_thread(select_t *st, long long exit_timestamp) {
while (!st->isThreadExit) {
if (select_is_empty(st)) {
break;
}
zxuint64 t = time(NULL);
if (t > g_time) {
g_time = t;
}
select_prepare(st);
select_run_once(st);
select_check_timeout(st);
select_list_clear(st);
if (exit_timestamp != 0 && time(NULL) >= exit_timestamp) {
break;
}
}
}
```
10. select_prepare
```c
void select_prepare(select_t *st) {
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
select_node_t *snode = list_entry(pos, select_node_t, node);
if (snode->prepare) {
snode->prepare(snode->param, snode->fd);
}
}
}
static void call_back_prepare(void *param, int fd) {
//LOGD("vps prepare");
//LOGI("vps prepare");
vps_mgr_t *mgr = (vps_mgr_t *) param;
// TODO: ����������㻺��������
zxuint64 t = g_time;
// ʵʱ�������
mgr->flow_cache = data_queue_total_size(mgr->data_queue);
if (t > mgr->time_last_print_flow) {
mgr->time_last_print_flow = t;
LOGE(" flow: %6d B/s, cache: %6d B, limit: %u B",
int(get_write_bytes_with_statistical_interval(mgr->flow_statistics, g_time)), int((
data_queue_total_size(mgr->data_queue))), mgr->flow_limit);
}
// ���¼���һ������
if (t > mgr->time_last_flow_limit_calc) {
mgr->time_last_flow_limit_calc = t;
flow_limit_calc_not_limit(mgr,
get_write_bytes_with_statistical_interval(mgr->flow_statistics,t),
(data_queue_total_size(mgr->data_queue)));
}
}
```
* 调用之前初始化是设置的回调,具体还没看懂,大概应该是计算超时时间
11. select_run_once(st);
```c
select_run_once(st);
void select_run_once(select_t *st) {
//LOGD("select_run_once");
int fdMax = -1, fdWrite = 0, fdRead = 0;
fd_set fdSetR, fdSetW;
FD_ZERO(&fdSetR);
FD_ZERO(&fdSetW);
select_fill_fd(st, fdMax, fdSetR, fdRead, fdSetW, fdWrite);
//LOGD("select_run_once fdRead = %d fdWrite = %d", fdRead, fdWrite );
timeval tv;
tv.tv_sec = SELECT_TIME_OUT_SEC;
tv.tv_usec = SELECT_TIME_OUT_USEC;
if (fdMax != -1) {
int ret = select(fdMax + 1, (fdRead == 0) ? NULL : &fdSetR, (fdWrite == 0) ? NULL : &fdSetW,
NULL, &tv);
if (ret > 0) {
select_callback(st, &fdSetR, &fdSetW);
} else if (0 == ret) {
//LOGI("select timeout");
} else {
LOGE("select error %d", errno);
}
}
}
```
* 将链表里的 socket 文件描述符关联事件监听
```c
FD_ZERO(&fdSetR);
FD_ZERO(&fdSetW);
select_fill_fd(st, fdMax, fdSetR, fdRead, fdSetW, fdWrite);
void select_fill_fd(select_t *st, int &fd_max, fd_set &fdSetR, int &fdRead, fd_set &fdSetW,
int &fdWrite) {
fdRead = fdWrite = 0;
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
select_node_t *snode = list_entry(pos, select_node_t, node);
int mode = snode->get_mode(snode->param, snode->fd);
bool isSet = false;
if (mode & SELECT_MODE_READ) {
FD_SET(snode->fd, &fdSetR);
fdRead++;
isSet = true;
}
if (mode & SELECT_MODE_WRITE || mode & SELECT_MODE_CONNECT) {
FD_SET(snode->fd, &fdSetW);
fdWrite++;
isSet = true;
}
if (isSet)
fd_max = (fd_max < snode->fd) ? snode->fd : fd_max;
//LOGI("thread = %d FD_SET fd = %d mode = %s", gettid(), node->fd, mode == SELECT_MODE_READ ? "SELECT_MODE_READ" : "SELECT_MODE_WRITE");
}
}
```
11.调用 select 开始监听
```c
int ret = select(fdMax + 1, (fdRead == 0) ? NULL : &fdSetR, (fdWrite == 0) ? NULL : &fdSetW,
NULL, &tv);
if (ret > 0) {
select_callback(st, &fdSetR, &fdSetW);
} else if (0 == ret) {
//LOGI("select timeout");
} else {
LOGE("select error %d", errno);
}
```
12. 收到监听事件进行处理
```c
select_callback(st, &fdSetR, &fdSetW);
void select_callback(select_t *st, fd_set *fdSetR, fd_set *fdSetW) {
struct list_head *pos = NULL;
list_for_each(pos, &st->listHeadFd) {
// ��һ�������sdk�����ӽ�㣬������
if (st->listHeadFd.next == pos) {
continue;
}
select_node_t *snode = list_entry(pos, select_node_t, node);
if (FD_ISSET(snode->fd, fdSetW)) {
if (snode->selectMode & SELECT_MODE_CONNECT) {
if (snode->connected != NULL) {
snode->timeAdd = time(NULL);
snode->connected(snode->param, snode->fd);
}
} else if (snode->selectMode & SELECT_MODE_WRITE) {
if (snode->write != NULL) {
snode->timeAdd = time(NULL);
snode->write(snode->param, snode->fd);
}
}
}
if (FD_ISSET(snode->fd, fdSetR)) {
if (snode->selectMode & SELECT_MODE_READ) {
if (snode->read != NULL) {
snode->timeAdd = time(NULL);
snode->read(snode->param, snode->fd, st->buf, st->nBufSize);
}
}
}
}
```
13. 根据文件状态处理具体事件,调用回调
```c
mgr->node->connected = call_back_connected;
mgr->node->read = call_back_read;
mgr->node->write = call_back_write;
```
14. mgr->node->read = call_back_read
```c
static void call_back_read(void *param, int fd, unsigned char *buf, int bufsize) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
int nRead = socket_read(mgr->fd, (char *) buf, bufsize);
add_read_bytes(mgr->flow_statistics, time(NULL), nRead);
string_add_bin(mgr->zxsRecvData, buf, nRead);
package_splite(mgr);
}
```
* 读取 socket 数据
* 计算流量
* 将读取数据保存在 zxsRecvData 中
* package_splite 处理具体类型
15. package_splite(mgr)
```c
void package_splite(vps_mgr_t *mgr) {
do {
int type = -1, refer = 0, packagelen = 0;
unsigned char *package = NULL;
if (!has_a_full_package(mgr->zxsRecvData, mgr->offsetRecvData, &type, &refer, &package,
&packagelen)) {
break;
}
package_dispatch(mgr, type, refer, package, packagelen > 3 ? packagelen - 4 : 0);
mgr->offsetRecvData += packagelen;
} while (true);
}
```
* 部分代码不全,直接返回了 true,type 类型为确认
```c
bool has_a_full_package(zx_string *zxsData, unsigned int offset, int *type, int *refer,
unsigned char **package, int *pakcagelen) {
return true;
}
```
16. 继续处理 package_dispatch
```c
void package_dispatch(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
if (datalen > 0 && (RET_OK != package_decode(mgr, data, datalen))) {
return;
}
switch (type) {
case TYPE_HEART:
package_dispatch_heart(mgr, type, refer, data, datalen);
break;
case TYPE_OK:
package_dispatch_ok(mgr, type, refer, data, datalen);
break;
case TYPE_ERROR:
package_dispatch_error(mgr, type, refer, data, datalen);
break;
case TYPE_ENCODE_ENABLE:
package_dispatch_encode_enable(mgr, type, refer, data, datalen);
break;
case TYPE_GET_IMSI:
package_dispatch_get_imsi(mgr, type, refer);
break;
case TYPE_GET_VERNAME:
package_dispatch_get_version_name(mgr, type, refer, data, datalen);
break;
case TYPE_GET_VERCODE:
package_dispatch_get_version_code(mgr, type, refer, data, datalen);
break;
case TYPE_SET_VPS_TOTAL_IDLE:
package_dispatch_set_vps_total_idle(mgr, type, refer, data, datalen);
break;
case TYPE_SET_HEARTBEAT_TIMEOUT:
package_dispatch_set_heartbeat_timeout(mgr, type, refer, data, datalen);
break;
case TYPE_CONNECT:
package_dispatch_connect(mgr, type, refer, data, datalen);
break;
case TYPE_OPT_NO_RESP:
case TYPE_TRANS_DATA:
case TYPE_CONNECT_CLOSE:
package_dispatch_transfer_data(mgr, type, refer, data, datalen);
break;
default:
package_dispatch_default(mgr, type, refer, data, datalen);
break;
}
}
```
17. 正常响应,都会调用 transfer_package 进行响应
```c
int transfer_data(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
int nRestData = datalen;
do {
int nSendLen = nRestData > 0xFFFF ? 0xFFFF : nRestData;
if (RET_OK != transfer_package(mgr, type, refer, data + datalen - nRestData, nSendLen)) {
return RET_ERROR;
}
nRestData -= nSendLen;
} while (nRestData);
return RET_OK;
}
```
18. transfer_package
```c
int transfer_package(vps_mgr_t *mgr, int type, int refer, unsigned char *data, int datalen) {
if (datalen > 0 && RET_OK != package_encode(mgr, data, datalen)) {
return RET_ERROR;
}
if (data != NULL && datalen != 0) {
if (STRING_ERROR == string_add_bin(mgr->zxsSendData, data, datalen)) {
return RET_ERROR;
}
}
if (!(mgr->node->selectMode & SELECT_MODE_WRITE)) {
mgr->node->selectMode |= SELECT_MODE_WRITE;
}
return RET_OK;
}
```
* 将响应数据写在 zxsSendData 结构中,并且select 状态为 SELECT_MODE_WRITE, 之前 select 还在监听监听,就会收到这个事件处理 write
19. call_back_write
```c
static void call_back_write(void *param, int fd) {
vps_mgr_t *mgr = (vps_mgr_t *) param;
if (string_get_len(mgr->zxsSendData) < mgr->offsetSendData) {
mgr->node->selectMode &= ~SELECT_MODE_WRITE;
return;
}
unsigned int nRestSendSize = string_get_len(mgr->zxsSendData) - mgr->offsetSendData;
if (nRestSendSize > 0) {
int nWrite = socket_write(mgr->fd, string_get_data(mgr->zxsSendData) + mgr->offsetSendData,
nRestSendSize);
mgr->offsetSendData += nWrite;
add_write_bytes(mgr->flow_statistics, time(NULL), nWrite);
}
if (string_get_len(mgr->zxsSendData) <= mgr->offsetSendData) {
mgr->node->selectMode &= ~SELECT_MODE_WRITE;
}
}
```
* 核心就是 socket_write 函数,将响应通过 socket 返回
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment