#define UNITY_5_3_OR_NEWER
#define USE_LOT_EQUALLY
#define USE_TAPDEF_BIN
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System;
namespace com.Company {
	public static partial class Library {
		private class ST_FsmObj_In_ActObj : ST_FsmObj {
			public ST_ActObj	pActObj;
		}
		private class ST_DirSeq_In_ActObj : ST_DirSeq {
			public ST_ActObj	pActObj;
		}
		public class ST_ActObj {
			public GNode		node;
			public ST_FsmObj	stFsmObj;
			public ST_DirSeq	stDirSeq;
			public ST_PrpHdr	stPrpHdr;
			public object		aData;
		}
		public struct ST_ActObj_Iter {
			public ST_ActObj	pNext;
		}
		public class ST_ActObj_New_Param : ICloneable{
			public ST_ActObj	pParent;
			public VoidPtr		pFsmKey;
			public int		iFsmMap;
			public object		pFsmInitParam;
			public VoidPtr		pPrpKey;
			public int		iPrpTbl;
			public Action<ST_DirSeq,int,int,bool>	fnAct;
			public int		nDirSeqCh;
			public Type		pDataType;
			public object Clone() {
				return this.MemberwiseClone();
			}
		}
		public static ST_ActObj ActObj_New(ST_ActObj_New_Param pParam) {
			ST_ActObj pActObj;
			ST_ActObj_New_Param stParam;
			if(pParam != null) {
				stParam = (ST_ActObj_New_Param)pParam.Clone();
			} else {
				stParam = new ST_ActObj_New_Param();
			}
			if(!stParam.pFsmKey) {
				byte[] TBL_FsmMap_dummy = unchecked(new byte[] {
				0x80,
				0x00,0x00,
				(byte)((           0x0000)>>8),(byte)(           0x0000),0x00,0x00,0x00,
				0x80,
				0x00,0x01,
				(byte)((           0x8000)>>8),(byte)(           0x8000),0x00,0x00,0x05,
				(byte)((         Fsm_Init)>>8),(byte)(         Fsm_Init),0x00,0x00,0x08,
				0x80,
				0x00,0x00,
				(byte)((Fsm_Trans_default)>>8),(byte)(Fsm_Trans_default),0x00,0x00,0x00,
				0x40,
				0x00,0x00,
				(byte)((    Fsm_InitState)>>8),(byte)(    Fsm_InitState),0x00,0x00,0x00,
				});
				stParam.pFsmKey = TBL_FsmMap_dummy;
				stParam.iFsmMap = 0;
			}
			if(!stParam.pPrpKey) {
				byte[] TBL_PrpTbl_dummy = unchecked(new byte[] {
				0x80,
				0x00,0x00,
				(byte)((           0x0000)>>8),(byte)(           0x0000), 0x00,0x00,0x00,
				0x40,
				0x00,0x00,
				(byte)((          Prp_len)>>8),(byte)(          Prp_len), 0x00,0x00,0x00,
				});
				stParam.pPrpKey = TBL_PrpTbl_dummy;
				stParam.iPrpTbl = 0;
			}
			pActObj = new ST_ActObj();
			if(stParam.pParent != null) {
				pActObj.node = g_node_append_data(stParam.pParent.node, pActObj);
			} else {
				pActObj.node = g_node_new(pActObj);
			}
			if(stParam.pDataType != null) {
				pActObj.aData = stParam.pDataType.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
			}
			pActObj.stDirSeq = new ST_DirSeq_In_ActObj() { pActObj = pActObj };
			DirSeq_Init(pActObj.stDirSeq, stParam.fnAct, stParam.nDirSeqCh);
			pActObj.stPrpHdr = PrpHdr_new(stParam.pPrpKey, stParam.iPrpTbl);
			pActObj.stFsmObj = new ST_FsmObj_In_ActObj() { pActObj = pActObj };
			FsmObj_Init(pActObj.stFsmObj, stParam.pFsmKey, stParam.iFsmMap, stParam.pFsmInitParam);
			return pActObj;
		}
		public static void ActObj_Free(ST_ActObj pActObj) {
			ActObj_FreeChildren(pActObj);
			g_node_destroy(pActObj.node);
		}
		private static void ActObj_Free_func(GNode node, object data) {
			ST_ActObj pActObj = (ST_ActObj)node.data;
			ActObj_Free(pActObj);
		}
		public static void ActObj_FreeChildren(ST_ActObj pActObj) {
			g_node_children_foreach(pActObj.node, G_TRAVERSE_ALL, ActObj_Free_func, null);
		}
		public static ST_ActObj ActObj_GetParent(ST_ActObj pActObj) {
			GNode parent = pActObj.node.parent;
			return (ST_ActObj)parent?.data;
		}
		public static ST_ActObj ActObj_FirstChild(ST_ActObj pActObj, out ST_ActObj_Iter pIter) {
			GNode node = g_node_first_child(pActObj.node);
			pIter.pNext = (ST_ActObj)(node?.data);
			return ActObj_NextSibling(ref pIter);
		}
		public static ST_ActObj ActObj_NextSibling(ref ST_ActObj_Iter pIter) {
			ST_ActObj pActObj = pIter.pNext;
			if(pActObj != null) {
				GNode node = g_node_next_sibling(pActObj.node);
				pIter.pNext = (ST_ActObj)(node?.data);
			}
			return pActObj;
		}
		public static ST_FsmObj ActObj_GetFsmObj(ST_ActObj pActObj) {
			return pActObj.stFsmObj;
		}
		public static ST_ActObj ActObj_FromFsmObj(ST_FsmObj pFsmObj) {
			return ((ST_FsmObj_In_ActObj)pFsmObj).pActObj;
		}
		public static ST_DirSeq ActObj_GetDirSeq(ST_ActObj pActObj) {
			return pActObj.stDirSeq;
		}
		public static ST_ActObj ActObj_FromDirSeq(ST_DirSeq pDirSeq) {
			return ((ST_DirSeq_In_ActObj)pDirSeq).pActObj;
		}
		public static ST_PrpHdr ActObj_GetPrpHdr(ST_ActObj pActObj) {
			return pActObj.stPrpHdr;
		}
		public static object ActObj_GetData(ST_ActObj pActObj) {
			return pActObj.aData;
		}
		private class ST_ActObj_ApplyTrans_func_Param {
			public int	iFsmTrans;
			public object	pParam;
		}
		private static bool ActObj_ApplyTrans_func(GNode node, object data) {
			ST_ActObj pActObj = (ST_ActObj)node.data;
			ST_ActObj_ApplyTrans_func_Param p = (ST_ActObj_ApplyTrans_func_Param)data;
			ActObj_ApplyTrans(pActObj, p.iFsmTrans, p.pParam);
			return false;
		}
		public static void ActObj_ApplyTrans(ST_ActObj pActObj, int iFsmTrans, object pParam) {
			FsmObj_ApplyTrans(ActObj_GetFsmObj(pActObj), iFsmTrans, pParam);
		}
		public static void ActObj_ApplyTransToChildren(ST_ActObj pActObj, int iFsmTrans, object pParam) {
			ST_ActObj_ApplyTrans_func_Param p = new ST_ActObj_ApplyTrans_func_Param() { iFsmTrans = iFsmTrans, pParam = pParam };
			g_node_children_foreach(pActObj.node, G_TRAVERSE_ALL, delegate(GNode node, object data) { ActObj_ApplyTrans_func(node, data); }, p);
		}
		public static void ActObj_ApplyTransToTree(ST_ActObj pActObj, int iFsmTrans, object pParam) {
			ST_ActObj_ApplyTrans_func_Param p = new ST_ActObj_ApplyTrans_func_Param() { iFsmTrans = iFsmTrans, pParam = pParam };
			g_node_traverse(pActObj.node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, ActObj_ApplyTrans_func, p);
		}
		private static bool ActObj_ExecDirSeq_func(GNode node, object data) {
			ST_ActObj pActObj = (ST_ActObj)node.data;
			ActObj_ExecDirSeq(pActObj);
			return false;
		}
		public static void ActObj_ExecDirSeq(ST_ActObj pActObj) {
			DirSeq_Exec(ActObj_GetDirSeq(pActObj));
		}
		public static void ActObj_ExecDirSeqToChildren(ST_ActObj pActObj) {
			g_node_children_foreach(pActObj.node, G_TRAVERSE_ALL, delegate(GNode node, object data) { ActObj_ExecDirSeq_func(node, data); }, null);
		}
		public static void ActObj_ExecDirSeqToTree(ST_ActObj pActObj) {
			g_node_traverse(pActObj.node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, ActObj_ExecDirSeq_func, null);
		}
		public static void ActObj_ApplyTrans_l(ST_ActObj pActObj, int iFsmTrans, params object[] args) {
			ActObj_ApplyTrans_v(pActObj, iFsmTrans, args);
		}
		public static void ActObj_ApplyTrans_v(ST_ActObj pActObj, int iFsmTrans, object[] args) {
			ActObj_ApplyTrans(pActObj, iFsmTrans, args);
		}
		public static void ActObj_ApplyTransToChildren_l(ST_ActObj pActObj, int iFsmTrans, params object[] args) {
			ActObj_ApplyTransToChildren_v(pActObj, iFsmTrans, args);
		}
		public static void ActObj_ApplyTransToChildren_v(ST_ActObj pActObj, int iFsmTrans, object[] args) {
			ActObj_ApplyTransToChildren(pActObj, iFsmTrans, args);
		}
		public static void ActObj_ApplyTransToTree_l(ST_ActObj pActObj, int iFsmTrans, params object[] args) {
			ActObj_ApplyTransToTree_v(pActObj, iFsmTrans, args);
		}
		public static void ActObj_ApplyTransToTree_v(ST_ActObj pActObj, int iFsmTrans, object[] args) {
			ActObj_ApplyTransToTree(pActObj, iFsmTrans, args);
		}
		static bool ActObj_InitAttr_func(GNode node, object data) {
			ST_ActObj pActObj = (ST_ActObj)node.data;
			IEnumerable<int>[] aAttr = (IEnumerable<int>[])data;
			IEnumerable<int> aIncl = aAttr[0];
			IEnumerable<int> aExcl = aAttr[1];
			PrpHdr_init_attr_v(ActObj_GetPrpHdr(pActObj), aIncl, aExcl);
			return false;
		}
		public static void ActObj_InitAttr_v(ST_ActObj pActObj, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			ActObj_InitAttr_func(pActObj.node, new IEnumerable<int>[] { aIncl, aExcl });
		}
		public static void ActObj_InitAttrToChildren_v(ST_ActObj pActObj, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			g_node_children_foreach(pActObj.node, G_TRAVERSE_ALL, delegate(GNode node, object data) { ActObj_InitAttr_func(node, data); }, new IEnumerable<int>[] { aIncl, aExcl });
		}
		public static void ActObj_InitAttrToTree_v(ST_ActObj pActObj, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			g_node_traverse(pActObj.node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, ActObj_InitAttr_func, new IEnumerable<int>[] { aIncl, aExcl });
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public enum AudioPlayerStatus {
			Stop,
			Prep,
			Playing,
			PlayEnd,
			Error,
		}
		public interface IAudioPlayer : IDisposable {
			AudioPlayerStatus GetStatus();
			void Prepare(int iPhrNo);
			void Start();
			void Stop();
			void SetVolume(double volume);
			void SetPan(double pan);
		}
		public class ST_AudioHelper {
			public int				nCh;
			public ST_AudioLogCh[]		TBL_AudioLogCh;
			public ST_AudioDevCh[]		TBL_AudioDevCh;
		}
		public class ST_AudioDevCh {
			public IAudioPlayer			pAudioPlayer;
			public int				iPhrNo;
			public int				iPrepAge;
			public bool				bInUse;
		}
		public class ST_AudioLogCh {
			public ST_AudioDevCh			pAudioDevCh;
		}
		public static ST_AudioHelper AudioHelper_New(int nCh, Func<object,IAudioPlayer> fnCreateAudioPlayer, object arg) {
			ST_AudioHelper pAudioHelper = new ST_AudioHelper();
			AudioHelper_Init(pAudioHelper, nCh, fnCreateAudioPlayer, arg);
			return pAudioHelper;
		}
		public static void AudioHelper_Init(ST_AudioHelper pAudioHelper, int nCh, Func<object,IAudioPlayer> fnCreateAudioPlayer, object arg) {
			pAudioHelper.nCh = nCh;
			pAudioHelper.TBL_AudioDevCh = new ST_AudioDevCh[nCh];
			for(int iCh = 0; iCh < nCh; iCh++) {
				ST_AudioDevCh pAudioDevCh = new ST_AudioDevCh();
				pAudioHelper.TBL_AudioDevCh[iCh] = pAudioDevCh;
				pAudioDevCh.pAudioPlayer = fnCreateAudioPlayer.Invoke(arg);
			}
			pAudioHelper.TBL_AudioLogCh = new ST_AudioLogCh[nCh];
			for(int iCh = 0; iCh < nCh; iCh++) {
				ST_AudioLogCh pAudioLogCh = new ST_AudioLogCh();
				pAudioHelper.TBL_AudioLogCh[iCh] = pAudioLogCh;
			}
		}
		public static void AudioHelper_Exit(ST_AudioHelper pAudioHelper) {
			foreach(ST_AudioDevCh pAudioDevCh in pAudioHelper.TBL_AudioDevCh) {
				pAudioDevCh.pAudioPlayer.Dispose();
			}
		}
		public static void AudioHelper_Exec(ST_AudioHelper pAudioHelper) {
			foreach(ST_AudioLogCh pAudioLogCh in pAudioHelper.TBL_AudioLogCh) {
				ST_AudioDevCh pAudioDevCh = pAudioLogCh.pAudioDevCh;
				if(pAudioDevCh != null) {
					if((pAudioDevCh.iPhrNo == 0) || !pAudioDevCh.bInUse) { throw new ApplicationException(); }
					switch(pAudioDevCh.pAudioPlayer.GetStatus()) {
					default:throw new ApplicationException();
					case AudioPlayerStatus.Prep:
					case AudioPlayerStatus.Playing:
						break;
					case AudioPlayerStatus.Stop:
					case AudioPlayerStatus.PlayEnd:
						pAudioLogCh.pAudioDevCh = null;
						pAudioDevCh.iPhrNo = 0;
						pAudioDevCh.bInUse = false;
						break;
					}
				}
			}
		}
		public static bool AudioHelper_Prepare(ST_AudioHelper pAudioHelper, int iPhrNo) {
			if((iPhrNo < 1) || (iPhrNo > int.MaxValue)) { throw new ApplicationException(); }
			ST_AudioDevCh pAudioDevCh = AudioHelper_Prepare_subr1(pAudioHelper, iPhrNo);
			if(pAudioDevCh == null) { return false; }
			switch(pAudioDevCh.pAudioPlayer.GetStatus()) {
			default:throw new ApplicationException();
			case AudioPlayerStatus.Prep:
				return false;
			case AudioPlayerStatus.Playing:
				return true;
			}
		}
		private static ST_AudioDevCh AudioHelper_Prepare_subr1(ST_AudioHelper pAudioHelper, int iPhrNo) {
			if((iPhrNo < 1) || (iPhrNo > int.MaxValue)) { throw new ApplicationException(); }
			foreach(ST_AudioDevCh pAudioDevCh in pAudioHelper.TBL_AudioDevCh) {
				if(!pAudioDevCh.bInUse && (pAudioDevCh.iPhrNo == iPhrNo)) {
					AudioHelper_Prepare_subr3(pAudioHelper, pAudioDevCh);
					return pAudioDevCh;
				}
			}
			int           oldestPrepAge    = int.MinValue;
			ST_AudioDevCh oldestAudioDevCh = null;
			foreach(ST_AudioDevCh pAudioDevCh in pAudioHelper.TBL_AudioDevCh) {
				if(!pAudioDevCh.bInUse) {
					if(pAudioDevCh.iPhrNo == 0) {
						AudioHelper_Prepare_subr2(pAudioDevCh, iPhrNo);
						AudioHelper_Prepare_subr3(pAudioHelper, pAudioDevCh);
						return pAudioDevCh;
					}
					if(pAudioDevCh.iPrepAge > oldestPrepAge) {
						oldestPrepAge    = pAudioDevCh.iPrepAge;
						oldestAudioDevCh = pAudioDevCh;
					}
				}
			}
			if(oldestAudioDevCh != null) {
				AudioHelper_Stop_subr(oldestAudioDevCh);
				AudioHelper_Prepare_subr2(oldestAudioDevCh, iPhrNo);
				AudioHelper_Prepare_subr3(pAudioHelper, oldestAudioDevCh);
				return oldestAudioDevCh;
			}
			return null;
		}
		private static void AudioHelper_Prepare_subr2(ST_AudioDevCh pAudioDevCh, int iPhrNo) {
			if((pAudioDevCh.iPhrNo != 0) || pAudioDevCh.bInUse) { throw new ApplicationException(); }
			if((iPhrNo < 1) || (iPhrNo > int.MaxValue)) { throw new ApplicationException(); }
			pAudioDevCh.iPhrNo = iPhrNo;
			pAudioDevCh.pAudioPlayer.Prepare(iPhrNo);
		}
		private static void AudioHelper_Prepare_subr3(ST_AudioHelper pAudioHelper, ST_AudioDevCh pAudioDevCh) {
			pAudioDevCh.iPrepAge = 0;
			bool bFound = false;
			foreach(ST_AudioDevCh otherAudioDevCh in pAudioHelper.TBL_AudioDevCh) {
				if((otherAudioDevCh != pAudioDevCh) &&
				   !otherAudioDevCh.bInUse &&
				   (otherAudioDevCh.iPhrNo != 0) &&
				   (otherAudioDevCh.iPrepAge == 0)) {
					bFound = true;
					break;
				}
			}
			if(!bFound) { return; }
			foreach(ST_AudioDevCh otherAudioDevCh in pAudioHelper.TBL_AudioDevCh) {
				if((otherAudioDevCh != pAudioDevCh) &&
				   !otherAudioDevCh.bInUse &&
				   (otherAudioDevCh.iPhrNo != 0)) {
					otherAudioDevCh.iPrepAge++;
				}
			}
		}
		public static void AudioHelper_Play(ST_AudioHelper pAudioHelper, int iCh, int iPhrNo) {
			if((uint)iCh >= pAudioHelper.nCh) { throw new ApplicationException(); }
			if((iPhrNo < 1) || (iPhrNo > int.MaxValue)) { throw new ApplicationException(); }
			ST_AudioLogCh pAudioLogCh = pAudioHelper.TBL_AudioLogCh[iCh];
			AudioHelper_Stop(pAudioHelper, iCh);
			ST_AudioDevCh pAudioDevCh = AudioHelper_Prepare_subr1(pAudioHelper, iPhrNo);
			if(pAudioDevCh == null) { throw new ApplicationException(); }
			pAudioDevCh.bInUse = true;
			pAudioLogCh.pAudioDevCh = pAudioDevCh;
			pAudioDevCh.pAudioPlayer.Start();
		}
		public static void AudioHelper_Stop(ST_AudioHelper pAudioHelper, int iCh) {
			if((uint)iCh >= pAudioHelper.nCh) { throw new ApplicationException(); }
			ST_AudioLogCh pAudioLogCh = pAudioHelper.TBL_AudioLogCh[iCh];
			ST_AudioDevCh pAudioDevCh = pAudioLogCh.pAudioDevCh;
			if(pAudioDevCh != null) {
				if((pAudioDevCh.iPhrNo == 0) || !pAudioDevCh.bInUse) { throw new ApplicationException(); }
				pAudioLogCh.pAudioDevCh = null;
				AudioHelper_Stop_subr(pAudioDevCh);
			}
		}
		private static void AudioHelper_Stop_subr(ST_AudioDevCh pAudioDevCh) {
			if(pAudioDevCh.iPhrNo == 0) { throw new ApplicationException(); }
			switch(pAudioDevCh.pAudioPlayer.GetStatus()) {
			default:throw new ApplicationException();
			case AudioPlayerStatus.Stop:
			case AudioPlayerStatus.PlayEnd:
				break;
			case AudioPlayerStatus.Prep:
			case AudioPlayerStatus.Playing:
				pAudioDevCh.pAudioPlayer.Stop();
				break;
			}
			pAudioDevCh.iPhrNo = 0;
			pAudioDevCh.bInUse = false;
		}
		public static void AudioHelper_SetVolume(ST_AudioHelper pAudioHelper, int iCh, double volume) {
			if((uint)iCh >= pAudioHelper.nCh) { throw new ApplicationException(); }
			ST_AudioLogCh pAudioLogCh = pAudioHelper.TBL_AudioLogCh[iCh];
			ST_AudioDevCh pAudioDevCh = pAudioLogCh.pAudioDevCh;
			if(pAudioDevCh != null) {
				if((pAudioDevCh.iPhrNo == 0) || !pAudioDevCh.bInUse) { throw new ApplicationException(); }
				pAudioDevCh.pAudioPlayer.SetVolume(volume);
			}
		}
		public static void AudioHelper_SetPan(ST_AudioHelper pAudioHelper, int iCh, double pan) {
			if((uint)iCh >= pAudioHelper.nCh) { throw new ApplicationException(); }
			ST_AudioLogCh pAudioLogCh = pAudioHelper.TBL_AudioLogCh[iCh];
			ST_AudioDevCh pAudioDevCh = pAudioLogCh.pAudioDevCh;
			if(pAudioDevCh != null) {
				if((pAudioDevCh.iPhrNo == 0) || !pAudioDevCh.bInUse) { throw new ApplicationException(); }
				pAudioDevCh.pAudioPlayer.SetPan(pan);
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public static VoidPtr bitarray_alloc(int bit_len) {
			return new byte[(((bit_len) + 31) >> 5) * 4];
		}
		public static int bitarray_lsb1st_get(VoidPtr ptr, int pos, int bits) {
			int value;
			int s1;
			int s2;
			Int32Ptr p;
			if((uint)bits > 32) { throw new ApplicationException(); }
			if(bits == 0) { return 0; }
			p = (Int32Ptr)ptr + (pos >> 5);
			s1 = pos & 31;
			s2 = 32 - s1;
			value = (int)((uint)p[0] >> s1);
			if(bits > s2) {
				value |= (int)((uint)p[1] << s2);
			}
			value &= (int)(uint.MaxValue >> (32 - bits));
			return value;
		}
		public static int bitarray_msb1st_get(VoidPtr ptr, int pos, int bits) {
			int value;
			int s1;
			int s2;
			Int32Ptr p;
			if((uint)bits > 32) { throw new ApplicationException(); }
			if(bits == 0) { return 0; }
			p = (Int32Ptr)ptr + (pos >> 5);
			s1 = pos & 31;
			s2 = 32 - s1;
			value = (int)((uint)p[0] << s1);
			if(bits > s2) {
				value |= (int)((uint)p[1] >> s2);
			}
			value = (int)((uint)value >> (32 - bits));
			return value;
		}
		public static void bitarray_lsb1st_set(VoidPtr ptr, int pos, int bits, int value) {
			int s1;
			int s2;
			int mask;
			Int32Ptr p;
			if((uint)bits > 32) { throw new ApplicationException(); }
			if(bits == 0) { return; }
			p = (Int32Ptr)ptr + (pos >> 5);
			s1 = pos & 31;
			s2 = 32 - s1;
			mask  = (int)(uint.MaxValue >> (32 - bits));
			value &= mask;
			p[0] &= (int)(~((uint)mask  << s1));
			p[0] |= (int)(  (uint)value << s1 );
			if(bits > s2) {
				p[1] &= (int)(~((uint)mask  >> s2));
				p[1] |= (int)(  (uint)value >> s2 );
			}
		}
		public static void bitarray_msb1st_set(VoidPtr ptr, int pos, int bits, int value) {
			int s1;
			int s2;
			int mask;
			Int32Ptr p;
			if((uint)bits > 32) { throw new ApplicationException(); }
			if(bits == 0) { return; }
			p = (Int32Ptr)ptr + (pos >> 5);
			s1 = pos & 31;
			s2 = 32 - s1;
			mask  = (int)(uint.MaxValue << (32 - bits));
			value = (int)((uint)value   << (32 - bits));
			p[0] &= (int)(~((uint)mask  >> s1));
			p[0] |= (int)(  (uint)value >> s1 );
			if(bits > s2) {
				p[1] &= (int)(~((uint)mask  << s2));
				p[1] |= (int)(  (uint)value << s2 );
			}
		}
		private static bool bitarray_test(Int32Ptr ptr, int pos, int bits, Func<VoidPtr,int,int,int> fnGet) {
			int m, n, v;
			ptr += pos >> 5;
			pos &= 31;
			if(pos != 0) {
				m = 32 - pos;
				n = bits;
				if(m < n) { n = m; }
				v = fnGet.Invoke(ptr, pos, n);
				if(v != 0) { return true; }
				bits -= n;
				ptr++;
			}
			while((bits -= 32) >= 0) {
				v = ptr.Read();
				if(v != 0) { return true; }
			}
			bits += 32;
			v = fnGet.Invoke(ptr, 0, bits);
			return v != 0;
		}
		public static bool bitarray_lsb1st_test(VoidPtr ptr, int pos, int bits) {
			return bitarray_test(ptr, pos, bits, bitarray_lsb1st_get);
		}
		public static bool bitarray_msb1st_test(VoidPtr ptr, int pos, int bits) {
			return bitarray_test(ptr, pos, bits, bitarray_msb1st_get);
		}
		private static void bitarray_copy_subr(VoidPtr dst_ptr, int dst_pos, VoidPtr src_ptr, int src_pos, int bits, Func<VoidPtr,int,int,int> get, Action<VoidPtr,int,int,int> set) {
			int n, value;
			if(bits < 0) { throw new ApplicationException(); }
			while(bits != 0) {
				n = (bits < 32) ? bits : 32;
				value = get.Invoke(src_ptr, src_pos, n);
				        set.Invoke(dst_ptr, dst_pos, n, value);
				src_pos += n;
				dst_pos += n;
				bits    -= n;
			}
		}
		public static void bitarray_lsb1st_copy(VoidPtr dst_ptr, int dst_pos, VoidPtr src_ptr, int src_pos, int bits) {
			bitarray_copy_subr(dst_ptr, dst_pos, src_ptr, src_pos, bits, bitarray_lsb1st_get, bitarray_lsb1st_set);
		}
		public static void bitarray_msb1st_copy(VoidPtr dst_ptr, int dst_pos, VoidPtr src_ptr, int src_pos, int bits) {
			bitarray_copy_subr(dst_ptr, dst_pos, src_ptr, src_pos, bits, bitarray_msb1st_get, bitarray_msb1st_set);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_CbkQue {
			public List<ST_CbkQueNode>	nodeArray;
		}
		public struct ST_CbkQueNode {
			public int			priOrd;
			public Action<ST_CbkQue,int,object>	fn;
			public object			param;
		}
		public static ST_CbkQue CbkQue_New() {
			ST_CbkQue pCbkQue;
			pCbkQue = new ST_CbkQue();
			pCbkQue.nodeArray = new List<ST_CbkQueNode>();
			return pCbkQue;
		}
		public static void CbkQue_Clear(ST_CbkQue pCbkQue) {
			pCbkQue.nodeArray.Clear();
		}
		public static void CbkQue_Add(ST_CbkQue pCbkQue, int pri, Action<ST_CbkQue,int,object> fn, object param) {
			int priOrd;
			ST_CbkQueNode pNode;
			if(((pri < short.MinValue) || (pri > short.MaxValue)) ||
			   (pCbkQue.nodeArray.Count > ushort.MaxValue)) { throw new ApplicationException(); }
			priOrd = (pri << 16) | pCbkQue.nodeArray.Count;
			pNode.priOrd	= priOrd;
			pNode.fn	= fn;
			pNode.param	= param;
			pCbkQue.nodeArray.Add(pNode);
		}
		public static void CbkQue_Invoke(ST_CbkQue pCbkQue) {
			CbkQue_InvokePri(pCbkQue, short.MinValue, short.MaxValue);
		}
		public static void CbkQue_InvokePri(ST_CbkQue pCbkQue, int priMin, int priMax) {
			int priOrdMin, priOrdMax;
			if(((priMin < short.MinValue) || (priMin > short.MaxValue)) ||
			   ((priMax < short.MinValue) || (priMax > short.MaxValue))) { throw new ApplicationException(); }
			priOrdMin = (priMin << 16) |               0;
			priOrdMax = (priMax << 16) | ushort.MaxValue;
			pCbkQue.nodeArray.Sort(delegate(ST_CbkQueNode _x, ST_CbkQueNode _y) {
					uint x = (uint)(_x.priOrd - priOrdMin);
					uint y = (uint)(_y.priOrd - priOrdMin);
					if(x < y) { return -1; }
					if(x > y) { return  1; }
					return 0;
				});
			foreach(ST_CbkQueNode pNode in pCbkQue.nodeArray) {
				if((pNode.priOrd < priOrdMin) || (pNode.priOrd > priOrdMax)) { break; }
				pNode.fn.Invoke(pCbkQue, (pNode.priOrd >> 16), pNode.param);
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_CntMgrCh {
			public int	ValNow;
			public int	ValTo;
			public int	Rate;
			public int	Scale;
			public int	ErrTerm;
		}
		public class ST_CntMgr {
			public int		nCntMgrCh { get { return TBL_CntMgrCh.Length; } }
			public ST_CntMgrCh[]	TBL_CntMgrCh;
		}
		private static ST_CntMgrCh CntMgr_GetCntMgrCh(ST_CntMgr pCntMgr, int iCntMgrCh) {
			if((uint)iCntMgrCh >= (uint)pCntMgr.nCntMgrCh) { throw new ApplicationException(); }
			return pCntMgr.TBL_CntMgrCh[iCntMgrCh];
		}
		public static ST_CntMgr CntMgr_New(int nCntMgrCh) {
			ST_CntMgr pCntMgr;
			pCntMgr = new ST_CntMgr();
			CntMgr_Init(pCntMgr, nCntMgrCh);
			return pCntMgr;
		}
		public static void CntMgr_Init(ST_CntMgr pCntMgr, int nCntMgrCh) {
			pCntMgr.TBL_CntMgrCh = new ST_CntMgrCh[nCntMgrCh];
			for(int iCntMgrCh = 0; iCntMgrCh < nCntMgrCh; iCntMgrCh++) {
				pCntMgr.TBL_CntMgrCh[iCntMgrCh] = new ST_CntMgrCh();
			}
		}
		public static void CntMgr_Exec(ST_CntMgr pCntMgr) {
			int iCntMgrCh;
			for(iCntMgrCh = 0; iCntMgrCh < pCntMgr.nCntMgrCh; iCntMgrCh++) {
				ST_CntMgrCh pCntMgrCh = CntMgr_GetCntMgrCh(pCntMgr, iCntMgrCh);
				int ValNow = pCntMgrCh.ValNow;
				int ValTo  = pCntMgrCh.ValTo;
				if(ValNow != ValTo) {
					uint ErrTerm = (uint)(pCntMgrCh.ErrTerm + pCntMgrCh.Rate);
					uint quot    = ErrTerm / (uint)pCntMgrCh.Scale;
					uint rem     = ErrTerm % (uint)pCntMgrCh.Scale;
					pCntMgrCh.ErrTerm = (int)rem;
					if(ValNow < ValTo) {
						uint diff = (uint)(ValTo - ValNow);
						ValNow += (int)((quot < diff) ? quot : diff);
					} else {
						uint diff = (uint)(ValNow - ValTo);
						ValNow -= (int)((quot < diff) ? quot : diff);
					}
					pCntMgrCh.ValNow = ValNow;
				}
			}
		}
		public static void CntMgr_SetVal(ST_CntMgr pCntMgr, int iCntMgrCh, int ValTo, int Rate, int Scale) {
			ST_CntMgrCh pCntMgrCh;
			if((Rate < 0) || (Scale < 0)) { throw new ApplicationException(); }
			pCntMgrCh = CntMgr_GetCntMgrCh(pCntMgr, iCntMgrCh);
			pCntMgrCh.ValNow  = pCntMgrCh.ValTo;
			pCntMgrCh.ValTo   = ValTo;
			pCntMgrCh.Rate    = Rate;
			pCntMgrCh.Scale   = Scale;
			pCntMgrCh.ErrTerm = 0;
			if((Rate == 0) || (Scale == 0)) { pCntMgrCh.ValNow = ValTo; }
		}
		public static int CntMgr_GetVal(ST_CntMgr pCntMgr, int iCntMgrCh) {
			ST_CntMgrCh pCntMgrCh;
			pCntMgrCh = CntMgr_GetCntMgrCh(pCntMgr, iCntMgrCh);
			return pCntMgrCh.ValNow;
		}
		public static int[] CntMgr_GetValAll(ST_CntMgr pCntMgr) {
			int[] ValNow = new int[pCntMgr.nCntMgrCh];
			int iCntMgrCh;
			for(iCntMgrCh = 0; iCntMgrCh < pCntMgr.nCntMgrCh; iCntMgrCh++) {
				ST_CntMgrCh pCntMgrCh = CntMgr_GetCntMgrCh(pCntMgr, iCntMgrCh);
				ValNow[iCntMgrCh] = pCntMgrCh.ValNow;
			}
			return ValNow;
		}
		public static double CntMgr_GetErrTerm(ST_CntMgr pCntMgr, int iCntMgrCh) {
			double dErrTerm = 0.0;
			ST_CntMgrCh pCntMgrCh = CntMgr_GetCntMgrCh(pCntMgr, iCntMgrCh);
			if(pCntMgrCh.ValNow != pCntMgrCh.ValTo) {
				dErrTerm = (double)pCntMgrCh.ErrTerm / (double)pCntMgrCh.Scale;
				if(pCntMgrCh.ValNow > pCntMgrCh.ValTo) {
					dErrTerm = -dErrTerm;
				}
			}
			return dErrTerm;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public const int DirSeq_ActBufSize		= 256;
		public const int DirTrg_set			=   0;
		public const int DirTrg_clr			= 255;
		public class ST_DirSeqCh {
			public BytePtr				pDirTbl;
			public BytePtr				pDirSeq;
			public ushort				WaitCnt;
			public ushort				LockCnt;
			public Queue<BytePtr>			TBL_LockBuf	= new Queue<BytePtr>();
			public struct ST_RepRet {
				public byte			Rep;
				public BytePtr			Ret;
			}
			public Stack<ST_RepRet>			TBL_Stack	= new Stack<ST_RepRet>();
		}
		public class ST_DirSeq {
			public Action<ST_DirSeq,int,int,bool>	fnAct;
			public uint[]	pActBuf;
			public ushort				ActBufCnt;
			public ushort				ActBufPos;
			public int				nCh { get { return TBL_DirSeqCh.Length; } }
			public ST_DirSeqCh[]		TBL_DirSeqCh;
		}
		public static ST_DirSeq DirSeq_New(Action<ST_DirSeq,int,int,bool> fnAct, int nCh) {
			ST_DirSeq pDirSeq;
			pDirSeq = new ST_DirSeq();
			DirSeq_Init(pDirSeq, fnAct, nCh);
			return pDirSeq;
		}
		public static void DirSeq_Init(ST_DirSeq pDirSeq, Action<ST_DirSeq,int,int,bool> fnAct, int nCh) {
			pDirSeq.pActBuf   = null;
			pDirSeq.ActBufCnt = 0;
			pDirSeq.ActBufPos = 0;
			pDirSeq.fnAct = fnAct;
			pDirSeq.fnAct = fnAct;
			pDirSeq.TBL_DirSeqCh = new ST_DirSeqCh[nCh];
			for(int iCh = 0; iCh < nCh; iCh++) {
				pDirSeq.TBL_DirSeqCh[iCh] = new ST_DirSeqCh();
			}
		}
		private static void _DirSeq_SetActBuf(ST_DirSeq pDirSeq, Action<ST_DirSeq,object[]> fn, params object[] args) {
			uint[] ActBuf = new uint[DirSeq_ActBufSize];
			if(pDirSeq.pActBuf != null) { throw new ApplicationException(); }
			pDirSeq.pActBuf = ActBuf;
			fn.Invoke(pDirSeq, args);
			while(pDirSeq.ActBufCnt != 0) {
				_DirSeq_GetActBuf(pDirSeq, false);
			}
			pDirSeq.pActBuf = null;
		}
		private static void _DirSeq_AddActBuf(ST_DirSeq pDirSeq, int iCh, int ActNo) {
			int i;
			if(pDirSeq.pActBuf == null) { throw new ApplicationException(); }
			if(pDirSeq.ActBufCnt >= DirSeq_ActBufSize) {
				_DirSeq_GetActBuf(pDirSeq, true);
				if(pDirSeq.ActBufCnt >= DirSeq_ActBufSize) { throw new ApplicationException(); }
			}
			i = pDirSeq.ActBufCnt + pDirSeq.ActBufPos;
			if(i >= DirSeq_ActBufSize) { i -= DirSeq_ActBufSize; }
			pDirSeq.pActBuf[i] = (uint)(ActNo | (iCh << 24));
			pDirSeq.ActBufCnt++;
		}
		private static void _DirSeq_GetActBuf(ST_DirSeq pDirSeq, bool bOverFlow) {
			int iCh, ActNo;
			if((pDirSeq.pActBuf == null) ||
			   (pDirSeq.ActBufCnt == 0)) { throw new ApplicationException(); }
			ActNo = (int)pDirSeq.pActBuf[pDirSeq.ActBufPos];
			iCh   =      (byte)(ActNo >> 24);
			ActNo = (int)(uint)(ActNo <<  8) >> 8;
			pDirSeq.ActBufCnt--;
			if(++pDirSeq.ActBufPos >= DirSeq_ActBufSize) { pDirSeq.ActBufPos = 0; }
			pDirSeq.fnAct.Invoke(pDirSeq, iCh, ActNo, bOverFlow);
		}
		private static void _DirSeqCh_Start(ST_DirSeq pDirSeq, int iCh, BytePtr p) {
			ST_DirSeqCh pDirSeqCh;
			int c1, c2;
			if((uint)iCh >= (uint)pDirSeq.nCh) { throw new ApplicationException(); }
			pDirSeqCh = pDirSeq.TBL_DirSeqCh[iCh];
			_DirSeqCh_Stop(pDirSeq, iCh);
			c1  =        p.Read();
			c1 |=        p.Read() <<  8;
			c1 |= (sbyte)p.Read() << 16;
			c2  =        p.Read();
			c2 |=        p.Read() <<  8;
			pDirSeqCh.pDirSeq =     p + c1;
			pDirSeqCh.LockCnt = (ushort)c2;
			_DirSeqCh_Exec1(pDirSeq, iCh, false);
		}
		public static void DirSeq_Exec(ST_DirSeq pDirSeq) {
			if(pDirSeq.pActBuf != null) {
				_DirSeq_Exec(pDirSeq);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeq_Exec);
			}
		}
		private static void _DirSeq_Exec(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 0) { throw new ApplicationException(); }
			int iCh;
			for(iCh = 0; iCh < pDirSeq.nCh; iCh++) {
				_DirSeqCh_Exec1(pDirSeq, iCh, false);
				_DirSeqCh_Exec2(pDirSeq, iCh, false);
			}
		}
		private static void _DirSeqCh_Exec1(ST_DirSeq pDirSeq, int iCh, bool bStop) {
			ST_DirSeqCh pDirSeqCh;
			int c1, c2;
			ST_DirSeqCh.ST_RepRet RepRet;
			if((uint)iCh >= (uint)pDirSeq.nCh) { throw new ApplicationException(); }
			pDirSeqCh = pDirSeq.TBL_DirSeqCh[iCh];
			while(pDirSeqCh.pDirSeq) {
				if(!bStop) {
					if(pDirSeqCh.WaitCnt != 0) { break; }
				} else {
					pDirSeqCh.WaitCnt = 0;
				}
				c1 = pDirSeqCh.pDirSeq.Read();
				switch(c1) {
				case 0x00:
					if(pDirSeqCh.TBL_Stack.Count != 0) {
						RepRet = pDirSeqCh.TBL_Stack.Pop();
						if(RepRet.Rep != 0) {
							if(!bStop) {
								if((  RepRet.Rep == 255) ||
								   (--RepRet.Rep != 0)) {
									pDirSeqCh.pDirSeq = RepRet.Ret;
									pDirSeqCh.TBL_Stack.Push(RepRet);
								}
							}
						} else {
							pDirSeqCh.pDirSeq = RepRet.Ret;
						}
					} else {
						pDirSeqCh.pDirSeq = null;
					}
					break;
				case 0x01:
					c2 = pDirSeqCh.pDirSeq.Read();
					if(c2 == 0) { throw new ApplicationException(); }
					RepRet.Rep = (byte)c2;
					RepRet.Ret = pDirSeqCh.pDirSeq;
					pDirSeqCh.TBL_Stack.Push(RepRet);
					break;
				case 0x02:
					c2  = pDirSeqCh.pDirSeq.Read();
					c2 |= pDirSeqCh.pDirSeq.Read() << 8;
					if(c2 == 0) { throw new ApplicationException(); }
					pDirSeqCh.WaitCnt = (ushort)c2;
					break;
				case 0x03:
					c2  =        pDirSeqCh.pDirSeq.Read();
					c2 |=        pDirSeqCh.pDirSeq.Read() <<  8;
					c2 |= (sbyte)pDirSeqCh.pDirSeq.Read() << 16;
					RepRet.Rep = 0;
					RepRet.Ret = pDirSeqCh.pDirSeq;
					pDirSeqCh.TBL_Stack.Push(RepRet);
					pDirSeqCh.pDirSeq += c2;
					break;
				case 0x04:
				case 0x05:
					c2 =  pDirSeqCh.pDirSeq.Read();
					c2 |= pDirSeqCh.pDirSeq.Read() <<  8;
					c2 |= pDirSeqCh.pDirSeq.Read() << 16;
					if(!bStop || (c1 == 0x05)) {
						_DirSeq_AddActBuf(pDirSeq, iCh, c2);
					}
					break;
				default:throw new ApplicationException();
				}
			}
			if(!bStop) {
				if(pDirSeqCh.WaitCnt != 0) { pDirSeqCh.WaitCnt--; }
			} else {
				pDirSeqCh.WaitCnt = 0;
			}
		}
		private static void _DirSeqCh_Exec2(ST_DirSeq pDirSeq, int iCh, bool bUnlock) {
			ST_DirSeqCh pDirSeqCh;
			BytePtr p;
			if((uint)iCh >= (uint)pDirSeq.nCh) { throw new ApplicationException(); }
			pDirSeqCh = pDirSeq.TBL_DirSeqCh[iCh];
			while(pDirSeqCh.TBL_LockBuf.Count != 0) {
				if(!bUnlock) {
					if(pDirSeqCh.LockCnt != 0) { break; }
				} else {
					pDirSeqCh.LockCnt = 0;
				}
				p = pDirSeqCh.TBL_LockBuf.Dequeue();
				_DirSeqCh_Start(pDirSeq, iCh, p);
			}
			if(!bUnlock) {
				if(pDirSeqCh.LockCnt != 0) { pDirSeqCh.LockCnt--; }
			} else {
				pDirSeqCh.LockCnt = 0;
			}
		}
		public static void DirSeq_ClrTbl(ST_DirSeq pDirSeq) {
			if(pDirSeq.pActBuf != null) {
				_DirSeq_ClrTbl(pDirSeq);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeq_ClrTbl);
			}
		}
		private static void _DirSeq_ClrTbl(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 0) { throw new ApplicationException(); }
			int iCh;
			for(iCh = 0; iCh < pDirSeq.nCh; iCh++) {
				DirSeqCh_SetTbl(pDirSeq, iCh, null);
			}
		}
		public static void DirSeqCh_SetTbl(ST_DirSeq pDirSeq, int iCh, BytePtr pDirTbl) {
			if(pDirSeq.pActBuf != null) {
				_DirSeqCh_SetTbl(pDirSeq, iCh, pDirTbl);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_SetTbl, iCh, pDirTbl);
			}
		}
		private static void _DirSeqCh_SetTbl(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 2) { throw new ApplicationException(); }
			int iCh         =     (int)args[0];
			BytePtr pDirTbl = (BytePtr)args[1];
			ST_DirSeqCh pDirSeqCh;
			if((uint)iCh >= (uint)pDirSeq.nCh) { throw new ApplicationException(); }
			pDirSeqCh = pDirSeq.TBL_DirSeqCh[iCh];
			DirSeqCh_SendTrig(pDirSeq, iCh, DirTrg_clr);
			pDirSeqCh.pDirTbl = pDirTbl;
			DirSeqCh_SendTrig(pDirSeq, iCh, DirTrg_set);
		}
		public static void DirSeq_SendTrig(ST_DirSeq pDirSeq, int iTrig) {
			if(pDirSeq.pActBuf != null) {
				_DirSeq_SendTrig(pDirSeq, iTrig);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeq_SendTrig, iTrig);
			}
		}
		private static void _DirSeq_SendTrig(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 1) { throw new ApplicationException(); }
			int iTrig = (int)args[0];
			int iCh;
			for(iCh = 0; iCh < pDirSeq.nCh; iCh++) {
				DirSeqCh_SendTrig(pDirSeq, iCh, iTrig);
			}
		}
		public static void DirSeqCh_SendTrig(ST_DirSeq pDirSeq, int iCh, int iTrig) {
			if(pDirSeq.pActBuf != null) {
				_DirSeqCh_SendTrig(pDirSeq, iCh, iTrig);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_SendTrig, iCh, iTrig);
			}
		}
		private static void _DirSeqCh_SendTrig(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 2) { throw new ApplicationException(); }
			int iCh   = (int)args[0];
			int iTrig = (int)args[1];
			ST_DirSeqCh pDirSeqCh;
			BytePtr p;
			int c1, c2;
			if((uint)iCh >= (uint)pDirSeq.nCh) { throw new ApplicationException(); }
			pDirSeqCh = pDirSeq.TBL_DirSeqCh[iCh];
			p = pDirSeqCh.pDirTbl;
			while(p) {
				c1 = p.Read();
				switch(c1) {
				case 0x00:
					p = null;
					break;
				case 0x06:
				case 0x07:
					c2 = p.Read();
					if(c2 == iTrig) {
						if(c1 == 0x07) {
							DirSeqCh_Unlock(pDirSeq, iCh);
						}
						if(pDirSeqCh.LockCnt != 0) {
							pDirSeqCh.TBL_LockBuf.Enqueue(p);
						} else {
							_DirSeqCh_Start(pDirSeq, iCh, p);
						}
					}
					p += (3 + 2);
					break;
				default:throw new ApplicationException();
				}
			}
		}
		public static void DirSeq_Unlock(ST_DirSeq pDirSeq) {
			if(pDirSeq.pActBuf != null) {
				_DirSeq_Unlock(pDirSeq);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeq_Unlock);
			}
		}
		private static void _DirSeq_Unlock(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 0) { throw new ApplicationException(); }
			int iCh;
			for(iCh = 0; iCh < pDirSeq.nCh; iCh++) {
				DirSeqCh_Unlock(pDirSeq, iCh);
			}
		}
		public static void DirSeqCh_Unlock(ST_DirSeq pDirSeq, int iCh) {
			if(pDirSeq.pActBuf != null) {
				_DirSeqCh_Unlock(pDirSeq, iCh);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_Unlock, iCh);
			}
		}
		private static void _DirSeqCh_Unlock(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 1) { throw new ApplicationException(); }
			int iCh = (int)args[0];
			_DirSeqCh_Exec2(pDirSeq, iCh, true);
		}
		public static void DirSeq_Stop(ST_DirSeq pDirSeq) {
			if(pDirSeq.pActBuf != null) {
				_DirSeq_Stop(pDirSeq);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeq_Stop);
			}
		}
		private static void _DirSeq_Stop(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 0) { throw new ApplicationException(); }
			int iCh;
			for(iCh = 0; iCh < pDirSeq.nCh; iCh++) {
				DirSeqCh_Stop(pDirSeq, iCh);
			}
		}
		public static void DirSeqCh_Stop(ST_DirSeq pDirSeq, int iCh) {
			if(pDirSeq.pActBuf != null) {
				_DirSeqCh_Stop(pDirSeq, iCh);
			} else {
				_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_Stop, iCh);
			}
		}
		private static void _DirSeqCh_Stop(ST_DirSeq pDirSeq, params object[] args) {
			if(args.Length != 1) { throw new ApplicationException(); }
			int iCh = (int)args[0];
			_DirSeqCh_Exec1(pDirSeq, iCh, true);
		}
		public static int DirSeq_GetStat(ST_DirSeq pDirSeq) {
			int iCh, nActive = 0;
			for(iCh = 0; iCh < pDirSeq.nCh; iCh++) {
				if(DirSeqCh_GetStat(pDirSeq, iCh)) { nActive++; }
			}
			return nActive;
		}
		public static bool DirSeqCh_GetStat(ST_DirSeq pDirSeq, int iCh) {
			ST_DirSeqCh pDirSeqCh;
			if((uint)iCh >= (uint)pDirSeq.nCh) { throw new ApplicationException(); }
			pDirSeqCh = pDirSeq.TBL_DirSeqCh[iCh];
			return pDirSeqCh.pDirSeq;
		}
		public static void DirSeqCh_SetTblNo(ST_DirSeq pDirSeq, int iCh, VoidPtr pDirSeqBin, int iDirTblNo) {
			Int32Ptr TBL_DirTblNo = pDirSeqBin;
			int nDirTblNo = TBL_DirTblNo[0];
			BytePtr TBL_DirSeq = (BytePtr)(TBL_DirTblNo + nDirTblNo);
			if((iDirTblNo <= 0) || (iDirTblNo >= nDirTblNo)) { throw new ApplicationException(); }
			DirSeqCh_SetTbl(pDirSeq, iCh, TBL_DirSeq + TBL_DirTblNo[iDirTblNo]);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class LIST_ENTRY {
			public LIST_ENTRY		Flink;
			public LIST_ENTRY		Blink;
			public readonly object		Value;
			public LIST_ENTRY() {  }
			public LIST_ENTRY(object Value) { this.Value = Value; }
		}
		public static T CONTAINING_RECORD<T>(LIST_ENTRY e) where T : class { return (T)e.Value; }
		public static void InitializeListHead(LIST_ENTRY ListHead) {
			ListHead.Flink = ListHead.Blink = ListHead;
		}
		public static bool IsListEmpty(LIST_ENTRY ListHead) {
			return ListHead.Flink == ListHead;
		}
		public static LIST_ENTRY RemoveHeadList(LIST_ENTRY ListHead) {
			LIST_ENTRY Head = ListHead.Flink;
			RemoveEntryList(Head);
			return Head;
		}
		public static LIST_ENTRY RemoveTailList(LIST_ENTRY ListHead) {
			LIST_ENTRY Tail = ListHead.Blink;
			RemoveEntryList(Tail);
			return Tail;
		}
		public static void RemoveEntryList(LIST_ENTRY Entry) {
			LIST_ENTRY Flink = Entry.Flink;
			LIST_ENTRY Blink = Entry.Blink;
			Blink.Flink = Flink;
			Flink.Blink = Blink;
		}
		public static void InsertHeadList(LIST_ENTRY ListHead, LIST_ENTRY Entry) {
			LIST_ENTRY Head = ListHead.Flink;
			Entry.Flink = Head;
			Entry.Blink = ListHead;
			ListHead.Flink = Head.Blink = Entry;
		}
		public static void InsertTailList(LIST_ENTRY ListHead, LIST_ENTRY Entry) {
			LIST_ENTRY Tail = ListHead.Blink;
			Entry.Flink = ListHead;
			Entry.Blink = Tail;
			Tail.Flink = ListHead.Blink = Entry;
		}
		public static void SortList(LIST_ENTRY ListHead, Func<LIST_ENTRY,LIST_ENTRY,int> Compare) {
			SortList_r(ListHead, delegate(LIST_ENTRY a, LIST_ENTRY b, object Param) { return Compare.Invoke(a, b); }, null);
		}
		public static void SortList_r(LIST_ENTRY ListHead, Func<LIST_ENTRY,LIST_ENTRY,object,int> Compare, object Param) {
			LIST_ENTRY List1 = new LIST_ENTRY(), List2 = new LIST_ENTRY(), Entry1, Entry2;
			InitializeListHead(List1);
			InitializeListHead(List2);
			for(;;) {
				if(IsListEmpty(ListHead)) { break; }
				Entry1 = RemoveHeadList(ListHead);
				InsertTailList(List1, Entry1);
				if(IsListEmpty(ListHead)) { break; }
				Entry2 = RemoveHeadList(ListHead);
				InsertTailList(List2, Entry2);
			}
			if(!IsListEmpty(List2)) {
				SortList_r(List1, Compare, Param);
				SortList_r(List2, Compare, Param);
			}
			for(;;) {
				Entry1 = IsListEmpty(List1) ? null : RemoveHeadList(List1);
				Entry2 = IsListEmpty(List2) ? null : RemoveHeadList(List2);
				if(Entry1 != null) {
					if(Entry2 != null) {
						if(Compare.Invoke(Entry1, Entry2, Param) <= 0) {
							InsertTailList(ListHead, Entry1);
							InsertHeadList(List2, Entry2);
						} else {
							InsertTailList(ListHead, Entry2);
							InsertHeadList(List1, Entry1);
						}
					} else {
						InsertTailList(ListHead, Entry1);
					}
				} else {
					if(Entry2 != null) {
						InsertTailList(ListHead, Entry2);
					} else {
						break;
					}
				}
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public const int Enm_name	= 1;
		public const int Enm_desc	= 2;
		public static string EnmDef_GetName(VoidPtr pEnmKey, int iEnmDef, int iVal) {
			VoidPtr pEnmDef;
			string pName;
			pEnmDef = REG_open_key_l(pEnmKey, iEnmDef, iVal);
			if(!pEnmDef) { throw new ApplicationException(); }
			pName = REG_get_string(pEnmDef, Enm_name);
			if(pName == null) { throw new ApplicationException(); }
			return pName;
		}
		public static string EnmDef_GetDesc(VoidPtr pEnmKey, int iEnmDef, int iVal) {
			VoidPtr pEnmDef;
			string pDesc;
			pEnmDef = REG_open_key_l(pEnmKey, iEnmDef, iVal);
			if(!pEnmDef) { throw new ApplicationException(); }
			pDesc = REG_get_string(pEnmDef, Enm_desc);
			return pDesc;
		}
		public static string EnmDef_ToStr(VoidPtr pEnmKey, int iEnmDef, int iVal) {
			VoidPtr pEnmDef;
			string pStr;
			pEnmDef = REG_open_key_l(pEnmKey, iEnmDef, iVal);
			if(!pEnmDef) { throw new ApplicationException(); }
			pStr = REG_get_string(pEnmDef, Enm_desc);
			if(pStr == null) {
				pStr = REG_get_string(pEnmDef, Enm_name);
				if(pStr == null) { throw new ApplicationException(); }
			}
			return pStr;
		}
		public static int EnmDef_GetNum(VoidPtr pEnmKey, int iEnmDef) {
			int n = REG_num_key_l(pEnmKey, iEnmDef);
			if(n == 0) { throw new ApplicationException(); }
			return n;
		}
		public static int EnmDef_GetMin(VoidPtr pEnmKey, int iEnmDef) {
			return EnmDef_GetNth(pEnmKey, iEnmDef, 0);
		}
		public static int EnmDef_GetMax(VoidPtr pEnmKey, int iEnmDef) {
			return EnmDef_GetNth(pEnmKey, iEnmDef,
			       EnmDef_GetNum(pEnmKey, iEnmDef) - 1);
		}
		public static int EnmDef_GetNth(VoidPtr pEnmKey, int iEnmDef, int index) {
			int iVal;
			if(!REG_open_nth_key_l(pEnmKey, index, out iVal, iEnmDef)) {
				throw new ApplicationException();
			}
			return iVal;
		}
		public static int EnmDef_GetIdx(VoidPtr pEnmKey, int iEnmDef, int iVal) {
			int index, n = EnmDef_GetNum(pEnmKey, iEnmDef);
			for(index = 0; index < n; index++) {
				if(EnmDef_GetNth(pEnmKey, iEnmDef, index) == iVal) { return index; }
			}
			return -1;
		}
		public static int EnmDef_GetVal(VoidPtr pEnmKey, int iEnmDef, string pName) {
			int index, n = EnmDef_GetNum(pEnmKey, iEnmDef);
			for(index = 0; index < n; index++) {
				int iVal = EnmDef_GetNth(pEnmKey, iEnmDef, index);
				if(EnmDef_GetName(pEnmKey, iEnmDef, iVal) == pName) { return iVal; }
			}
			return -1;
		}
		public static int EnmDef_IncVal(VoidPtr pEnmKey, int iEnmDef, int iVal) {
			int index = EnmDef_GetIdx(pEnmKey, iEnmDef, iVal);
			if(index == -1) { throw new ApplicationException(); }
			if(index < EnmDef_GetNum(pEnmKey, iEnmDef) - 1) {
				iVal = EnmDef_GetNth(pEnmKey, iEnmDef, index + 1);
			}
			return iVal;
		}
		public static int EnmDef_DecVal(VoidPtr pEnmKey, int iEnmDef, int iVal) {
			int index = EnmDef_GetIdx(pEnmKey, iEnmDef, iVal);
			if(index == -1) { throw new ApplicationException(); }
			if(index > 0) {
				iVal = EnmDef_GetNth(pEnmKey, iEnmDef, index - 1);
			}
			return iVal;
		}
		public static int EnmDef_GetVal_UseCompar(VoidPtr pEnmKey, int iEnmDef, string pName, StringComparer compar) {
			throw new NotImplementedException();
		}
		public static StringComparer EnmDef_GetCanonicalNameCompar(VoidPtr pEnmKey, int iEnmDef) {
			throw new NotImplementedException();
		}
		public static int EnmDef_IsSuitableNameCompar(VoidPtr pEnmKey, int iEnmDef, StringComparer compar) {
			throw new NotImplementedException();
		}
	}
}
namespace com.Company {
	public static partial class Library {
		private static object[]		_TBL_FsmFunc;
		public static object[]		TBL_FsmFunc {
			private get {
				if(_TBL_FsmFunc == null) { throw new ApplicationException(); }
				return _TBL_FsmFunc;
			}
			set {
				_TBL_FsmFunc = value;
			}
		}
		public const int Fsm_Trans_default	= 0;
		public const int Fsm_Init		= 0xFFFF;
		public const int Fsm_InitAct		= 1;
		public const int Fsm_InitState		= 2;
		public const int Fsm_Entry		= 1;
		public const int Fsm_Exit		= 2;
		public const int Fsm_Suspend		= 3;
		public const int Fsm_Resume		= 4;
		public const int FsmObj_StackSize	= 3;
		public class ST_FsmObj {
			public VoidPtr		pMapKey;
			public ushort		iStack;
			public ushort[]		TBL_Stack	= new ushort[FsmObj_StackSize];
		}
		private static bool FsmObj_CallFunc(ST_FsmObj pFsmObj, int iFunc, int iTrans, object pParam) {
			if(iFunc == -1) { return true; }
			if((iFunc <= 0) || (iFunc >= (int)TBL_FsmFunc[0])) { throw new ApplicationException(); }
			object pFunc = TBL_FsmFunc[iFunc];
			var pFunc1 = pFunc as Action<ST_FsmObj,int>;
			if(pFunc1 != null) { pFunc1.Invoke(pFsmObj, iTrans); return true; }
			var pFunc2 = pFunc as Func<ST_FsmObj,int,object,bool>;
			if(pFunc2 != null) { return pFunc2.Invoke(pFsmObj, iTrans, pParam); }
			var pFunc3 = pFunc as Action<ST_FsmObj,int,object>;
			if(pFunc3 != null) { pFunc3.Invoke(pFsmObj, iTrans, pParam); return true; }
			throw new ApplicationException();
		}
		private static VoidPtr FsmObj_GetMapKey(ST_FsmObj pFsmObj) {
			return pFsmObj.pMapKey;
		}
		private static VoidPtr FsmObj_GetStateKey(ST_FsmObj pFsmObj) {
			return REG_open_key_l(
				FsmObj_GetMapKey(pFsmObj),
				FsmObj_GetState(pFsmObj) | 0x8000);
		}
		private static void FsmObj_CallStateFunc(ST_FsmObj pFsmObj, int iFuncName, int iAltState) {
			int iFunc = REG_get_value_l(
				FsmObj_GetStateKey(pFsmObj),
				iFuncName);
			if(iFunc == -1) {
				iFunc = REG_get_value_l(
					FsmObj_GetMapKey(pFsmObj),
					iFuncName);
			}
			FsmObj_CallFunc(pFsmObj, iFunc, iAltState, null);
		}
		private static VoidPtr FsmObj_GetTransKey(ST_FsmObj pFsmObj, int iState, int iTrans) {
			if(iState != -1) {
				return REG_open_key_l(
					FsmObj_GetMapKey(pFsmObj),
					iState | 0x8000,
					iTrans);
			} else {
				return REG_open_key_l(
					FsmObj_GetMapKey(pFsmObj),
					iTrans);
			}
		}
		public static void FsmObj_Init(ST_FsmObj pFsmObj, VoidPtr pFsmKey, int iMap, object pParam) {
			int iFnAct, iState;
			pFsmObj.iStack    = 0;
			pFsmObj.pMapKey = REG_open_key_l(pFsmKey, iMap);
			if(!pFsmObj.pMapKey) { throw new ApplicationException(); }
			iFnAct = REG_get_value_l(FsmObj_GetMapKey(pFsmObj), Fsm_Init, Fsm_InitAct);
			iState = REG_get_value_l(FsmObj_GetMapKey(pFsmObj), Fsm_Init, Fsm_InitState);
			if(iState == -1) { throw new ApplicationException(); }
			pFsmObj.TBL_Stack[0] = (ushort)iState;
			if(!FsmObj_GetStateKey(pFsmObj)) { throw new ApplicationException(); }
			if(iFnAct != -1) { FsmObj_CallFunc(pFsmObj, iFnAct, -1, pParam); }
			FsmObj_CallStateFunc(pFsmObj, Fsm_Entry, -1);
		}
		public static int FsmObj_GetState(ST_FsmObj pFsmObj) {
			if((uint)pFsmObj.iStack >= FsmObj_StackSize) { throw new ApplicationException(); }
			return pFsmObj.TBL_Stack[pFsmObj.iStack];
		}
		public static void FsmObj_SetState(ST_FsmObj pFsmObj, int iState) {
			int iPrevState = FsmObj_GetState(pFsmObj);
			FsmObj_CallStateFunc(pFsmObj, Fsm_Exit, iState);
			if((uint)pFsmObj.iStack >= FsmObj_StackSize) { throw new ApplicationException(); }
			pFsmObj.TBL_Stack[pFsmObj.iStack] = (ushort)iState;
			if(!FsmObj_GetStateKey(pFsmObj)) { throw new ApplicationException(); }
			FsmObj_CallStateFunc(pFsmObj, Fsm_Entry, iPrevState);
		}
		public static void FsmObj_PushState(ST_FsmObj pFsmObj, int iState) {
			int iPrevState = FsmObj_GetState(pFsmObj);
			FsmObj_CallStateFunc(pFsmObj, Fsm_Suspend, iState);
			if((uint)(++pFsmObj.iStack) >= FsmObj_StackSize) { throw new ApplicationException(); }
			pFsmObj.TBL_Stack[pFsmObj.iStack] = (ushort)iState;
			if(!FsmObj_GetStateKey(pFsmObj)) { throw new ApplicationException(); }
			FsmObj_CallStateFunc(pFsmObj, Fsm_Entry, iPrevState);
		}
		public static void FsmObj_PopState(ST_FsmObj pFsmObj) {
			int iPrevState = FsmObj_GetState(pFsmObj);
			if((uint)(pFsmObj.iStack - 1) >= FsmObj_StackSize) { throw new ApplicationException(); }
			FsmObj_CallStateFunc(pFsmObj, Fsm_Exit, pFsmObj.TBL_Stack[pFsmObj.iStack - 1]);
			if((uint)(--pFsmObj.iStack) >= FsmObj_StackSize) { throw new ApplicationException(); }
			FsmObj_CallStateFunc(pFsmObj, Fsm_Resume, iPrevState);
		}
		public const int Fsm_Trans_noreq = 0x8000;
		public static void FsmObj_ApplyTrans(ST_FsmObj pFsmObj, int iTrans, object pParam) {
			int iTrDef, bNoReq;
			if((uint)iTrans > ushort.MaxValue) { throw new ApplicationException(); }
			bNoReq = iTrans &   Fsm_Trans_noreq;
			         iTrans &= ~Fsm_Trans_noreq;
			iTrDef = iTrans;
			for(;;) {
				int iStMap = FsmObj_GetState(pFsmObj);
				for(;;) {
					VoidPtr pKey = FsmObj_GetTransKey(pFsmObj, iStMap, iTrDef);
					int i = 0;
					for(;;) {
						int iFnGrd = REG_get_value_l(pKey, i++);
						int iFnAct = REG_get_value_l(pKey, i++);
						int iStNex = REG_get_value_l(pKey, i++);
						if((iFnAct != -1) || (iStNex != -1)) {
							if(FsmObj_CallFunc(pFsmObj, iFnGrd, iTrans, pParam)) {
								FsmObj_CallFunc(pFsmObj, iFnAct, iTrans, pParam);
								if(iStNex == -1) { return; }
								else if(iStNex == 0xFFFF) { FsmObj_PopState(pFsmObj); return; }
								else if((iStNex & 0x8000) != 0) { FsmObj_PushState(pFsmObj, iStNex & 0x7FFF); return; }
								else { FsmObj_SetState(pFsmObj, iStNex); return; }
							}
						}
						if(iFnGrd == -1) { break; }
					}
					if(iStMap == -1) { break; }
					   iStMap  = -1;
				}
				if(iTrDef == Fsm_Trans_default) { break; }
				   iTrDef  = Fsm_Trans_default;
			}
			if(bNoReq == 0) { throw new ApplicationException(); }
		}
		public static void FsmObj_Init_l(ST_FsmObj pFsmObj, VoidPtr pFsmKey, int iMap, params object[] args) {
			FsmObj_Init_v(pFsmObj, pFsmKey, iMap, args);
		}
		public static void FsmObj_Init_v(ST_FsmObj pFsmObj, VoidPtr pFsmKey, int iMap, object[] args) {
			FsmObj_Init(pFsmObj, pFsmKey, iMap, args);
		}
		public static void FsmObj_ApplyTrans_l(ST_FsmObj pFsmObj, int iTrans, params object[] args) {
			FsmObj_ApplyTrans_v(pFsmObj, iTrans, args);
		}
		public static void FsmObj_ApplyTrans_v(ST_FsmObj pFsmObj, int iTrans, object[] args) {
			FsmObj_ApplyTrans(pFsmObj, iTrans, args);
		}
		public static bool FsmObj_IsState(ST_FsmObj pFsmObj, int iState) {
			return FsmObj_IsState_l(pFsmObj, iState);
		}
		public static bool FsmObj_IsState_l(ST_FsmObj pFsmObj, params int[] aState) {
			return FsmObj_IsState_v(pFsmObj, aState);
		}
		public static bool FsmObj_IsState_v(ST_FsmObj pFsmObj, IEnumerable<int> aState) {
			return FsmObj_StateIn_v(FsmObj_GetState(pFsmObj), aState);
		}
		public static bool FsmObj_StateIn_l(int iState, params int[] aState) {
			return FsmObj_StateIn_v(iState, aState);
		}
		public static bool FsmObj_StateIn_v(int iState, IEnumerable<int> aState) {
			return aState.Contains(iState);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_LcdSeqCh {
			public ushort			Cnt;
			public ushort			SprNo;
			public ushort			Mode;
			public short			Pri;
			public short			PosX;
			public short			PosY;
			public int			Color;
		}
		public class ST_LcdSeq {
			public ST_LcdSeqInfo			pLcdSeqInfo;
			public ST_LcdSeqCh[]	TBL_LcdSeqCh;
		}
		public class ST_LcdSeqChInfo {
			public ushort			Mode;
			public short			Pri;
			public short			PosX;
			public short			PosY;
			public int			Color;
		}
		public class ST_LcdSeqInfo {
			public Action<int,ST_LcdSeqCh>	fnDraw;
			public ushort		_SprNo_Max;
			public int		nLcdSeqCh { get { return TBL_LcdSeqChInfo.Length; } }
			public ST_LcdSeqChInfo[]	TBL_LcdSeqChInfo;
		}
		private static void LcdSeqCh_Draw(ST_LcdSeq pLcdSeq, int iLcdSeqCh) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
			if(pLcdSeqCh.SprNo == 0) { return; }
			pLcdSeq.pLcdSeqInfo.fnDraw.Invoke(iLcdSeqCh, pLcdSeqCh);
			if(pLcdSeqCh.Cnt < ushort.MaxValue) { pLcdSeqCh.Cnt++; }
		}
		public static ST_LcdSeq LcdSeq_New(ST_LcdSeqInfo pLcdSeqInfo) {
			ST_LcdSeq pLcdSeq;
			pLcdSeq = new ST_LcdSeq();
			LcdSeq_Init(pLcdSeq, pLcdSeqInfo);
			return pLcdSeq;
		}
		public static void LcdSeq_Init(ST_LcdSeq pLcdSeq, ST_LcdSeqInfo pLcdSeqInfo) {
			int iLcdSeqCh;
#if     __DXLIB
			for(iLcdSeqCh = 0; iLcdSeqCh < pLcdSeq.pLcdSeqInfo.nLcdSeqCh; iLcdSeqCh++) {
				ST_LcdSeqChInfo pLcdSeqChInfo = LcdSeq_GetLcdSeqChInfo(pLcdSeq, iLcdSeqCh);
				if((uint)pLcdSeqChInfo.Mode >= (uint)DX_BLENDMODE_NUM) { throw new ApplicationException(); }
			}
#endif
			pLcdSeq.pLcdSeqInfo = pLcdSeqInfo;
			pLcdSeq.TBL_LcdSeqCh = new ST_LcdSeqCh[pLcdSeqInfo.nLcdSeqCh];
			for(iLcdSeqCh = 0; iLcdSeqCh < pLcdSeqInfo.nLcdSeqCh; iLcdSeqCh++) {
				pLcdSeq.TBL_LcdSeqCh[iLcdSeqCh] = new ST_LcdSeqCh();
			}
		}
		public static void LcdSeq_Draw(ST_LcdSeq pLcdSeq) {
			int iLcdSeqCh;
			for(iLcdSeqCh = 0; iLcdSeqCh < pLcdSeq.pLcdSeqInfo.nLcdSeqCh; iLcdSeqCh++) {
				LcdSeqCh_Draw(pLcdSeq, iLcdSeqCh);
			}
		}
		public static void LcdSeqCh_Play(ST_LcdSeq pLcdSeq, int iLcdSeqCh, int SprNo) {
			if(SprNo != 0) {
				ST_LcdSeqChInfo pLcdSeqChInfo = LcdSeq_GetLcdSeqChInfo(pLcdSeq, iLcdSeqCh);
				ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
				pLcdSeqCh.Cnt		= 0;
				if((SprNo < 1) || (SprNo > pLcdSeq.pLcdSeqInfo._SprNo_Max)) { throw new ApplicationException(); }
				pLcdSeqCh.SprNo = (ushort)SprNo;
				pLcdSeqCh.Mode  = pLcdSeqChInfo.Mode;
				pLcdSeqCh.Pri   = pLcdSeqChInfo.Pri;
				pLcdSeqCh.PosX  = pLcdSeqChInfo.PosX;
				pLcdSeqCh.PosY  = pLcdSeqChInfo.PosY;
				pLcdSeqCh.Color = pLcdSeqChInfo.Color;
			} else {
				LcdSeqCh_Stop(pLcdSeq, iLcdSeqCh);
			}
		}
		public static void LcdSeqCh_SetMode(ST_LcdSeq pLcdSeq, int iLcdSeqCh, int Mode) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
#if     __DXLIB
			if((uint)Mode >= (uint)DX_BLENDMODE_NUM) { throw new ApplicationException(); }
#endif
			if(pLcdSeqCh.SprNo == 0) { return; }
			pLcdSeqCh.Mode = (ushort)Mode;
		}
		public static void LcdSeqCh_SetPri(ST_LcdSeq pLcdSeq, int iLcdSeqCh, int Pri) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
			if((Pri < short.MinValue) || (Pri > short.MaxValue)) { throw new ApplicationException(); }
			if(pLcdSeqCh.SprNo == 0) { return; }
			pLcdSeqCh.Pri = (short)Pri;
		}
		public static void LcdSeqCh_SetPos(ST_LcdSeq pLcdSeq, int iLcdSeqCh, int PosX, int PosY) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
			if(((PosX < short.MinValue) || (PosX > short.MaxValue)) ||
			   ((PosY < short.MinValue) || (PosY > short.MaxValue))) { throw new ApplicationException(); }
			if(pLcdSeqCh.SprNo == 0) { return; }
			pLcdSeqCh.PosX = (short)PosX;
			pLcdSeqCh.PosY = (short)PosY;
		}
		public static void LcdSeqCh_SetColor(ST_LcdSeq pLcdSeq, int iLcdSeqCh, int Color) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
			if(pLcdSeqCh.SprNo == 0) { return; }
			pLcdSeqCh.Color = Color;
		}
		public static void LcdSeqCh_SetSprNo(ST_LcdSeq pLcdSeq, int iLcdSeqCh, int SprNo) {
			if(SprNo != 0) {
				ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
				if((SprNo < 1) || (SprNo > pLcdSeq.pLcdSeqInfo._SprNo_Max)) { throw new ApplicationException(); }
				if(pLcdSeqCh.SprNo == 0) { return; }
				pLcdSeqCh.SprNo = (ushort)SprNo;
			} else {
				LcdSeqCh_Stop(pLcdSeq, iLcdSeqCh);
			}
		}
		public static int LcdSeqCh_GetCnt(ST_LcdSeq pLcdSeq, int iLcdSeqCh) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
			return (pLcdSeqCh.SprNo != 0) ? pLcdSeqCh.Cnt : -1;
		}
		public static void LcdSeq_Stop(ST_LcdSeq pLcdSeq) {
			int iLcdSeqCh;
			for(iLcdSeqCh = 0; iLcdSeqCh < pLcdSeq.pLcdSeqInfo.nLcdSeqCh; iLcdSeqCh++) {
				LcdSeqCh_Stop(pLcdSeq, iLcdSeqCh);
			}
		}
		public static void LcdSeqCh_Stop(ST_LcdSeq pLcdSeq, int iLcdSeqCh) {
			ST_LcdSeqCh pLcdSeqCh = LcdSeq_GetLcdSeqCh(pLcdSeq, iLcdSeqCh);
			pLcdSeqCh.Cnt		= 0;
			pLcdSeqCh.SprNo		= 0;
			pLcdSeqCh.Mode		= 0;
			pLcdSeqCh.Pri		= 0;
			pLcdSeqCh.PosX		= 0;
			pLcdSeqCh.PosY		= 0;
			pLcdSeqCh.Color		= 0;
		}
		public static ST_LcdSeqChInfo LcdSeq_GetLcdSeqChInfo(ST_LcdSeq pLcdSeq, int iLcdSeqCh) {
			if((uint)iLcdSeqCh >= (uint)pLcdSeq.pLcdSeqInfo.nLcdSeqCh) { throw new ApplicationException(); }
			return pLcdSeq.pLcdSeqInfo.TBL_LcdSeqChInfo[iLcdSeqCh];
		}
		public static ST_LcdSeqCh LcdSeq_GetLcdSeqCh(ST_LcdSeq pLcdSeq, int iLcdSeqCh) {
			if((uint)iLcdSeqCh >= (uint)pLcdSeq.pLcdSeqInfo.nLcdSeqCh) { throw new ApplicationException(); }
			return pLcdSeq.TBL_LcdSeqCh[iLcdSeqCh];
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public static int strcmp(StringPtr s1, StringPtr s2) {
			return strncmp(s1, s2, -1);
		}
		public static int strncmp(StringPtr s1, StringPtr s2, int n) {
			int t = 0;
			for(;;) {
				int c1, c2;
				if(--n == -1) {
					break;
				}
				c1 = s1.Read();
				c2 = s2.Read();
				if((t = c1 - c2) != 0) {
					break;
				}
				if(c2 == 0) {
					break;
				}
			}
			return t;
		}
		public static int  strspn(StringPtr s1, StringPtr s2) {
			int result = -1;
			int c1, c2, c;
			StringPtr p;
			c2 = 0;
			for(;;) {
				c1 = s1.Read();
				result++;
				if(c1 == c2) { return result; }
				p = s2;
				for(;;) {
					c = p.Read();
					if(c == c1) { break; }
					if(c == c2) { return result; }
				}
			}
		}
		public static int strcspn(StringPtr s1, StringPtr s2) {
			int result = -1;
			int c1, c2, c;
			StringPtr p;
			c1 = 0;
			for(;;) {
				c2 = s1.Read();
				result++;
				if(c1 == c2) { return result; }
				p = s2;
				for(;;) {
					c = p.Read();
					if(c == c1) { break; }
					if(c == c2) { return result; }
				}
			}
		}
		public static int strtol(StringPtr nptr, int _base) {
			StringPtr endptr;
			return strtol(nptr, out endptr, _base);
		}
		public static int strtol(StringPtr nptr, out StringPtr endptr, int _base) {
			return (int)strtoul(nptr, out endptr, _base);
		}
		public static uint strtoul(StringPtr nptr, int _base) {
			StringPtr endptr;
			return strtoul(nptr, out endptr, _base);
		}
		public static uint strtoul(StringPtr nptr, out StringPtr endptr, int _base) {
			StringPtr eptr = nptr;
			int c, sign, sum;
			if((_base == 1) || ((uint)_base > 36)) { throw new ApplicationException(); }
			do { c = nptr.Read(); } while(isspace(c));
			sign = -1;
			if(c != '-') {
				sign = 1;
				if(c != '+') {
					nptr--;
				}
			}
			if((_base & ~16) == 0) {
				c = nptr[0];
				if((c == '0') && (toupper(nptr[1]) == 'X')) {
					_base = 16;
					nptr += 2;
				} else if(_base == 0) {
					_base = 10;
					if(c == '0') {
						_base = 8;
					}
				}
			}
			sum = 0;
			for(;;) {
				c = nptr.Read();
				if(isdigit(c)) {
					c -= '0';
				} else if(isalpha(c)) {
					c = toupper(c) - ('A' - 10);
				} else {
					break;
				}
				if(c >= _base) { break; }
				sum = (sum * _base) + c;
				eptr = nptr;
			}
			endptr = eptr;
			return (uint)(sum * sign);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public static int LOT_draw_column(UInt16Ptr column, int column_size, int rndval) {
			int hitval, weight;
			for(;;) {
				if(--column_size < 0) { return -1; }
				hitval = column.Read();
				weight = column.Read();
				if((rndval -= (weight + 1)) < 0) { return hitval; }
			}
		}
#if     USE_LOT_EQUALLY
		public static int LOT_draw_column_equally(UInt16Ptr column, int column_size, int rndval) {
			if(column_size <= 0) { throw new ApplicationException(); }
			rndval = (int)((uint)rndval % (uint)column_size);
			return column[(rndval * 2) + 0];
		}
#endif
		public static int LOT_get_column_weight(UInt16Ptr column, int column_size, int hitval_sel) {
			UInt16Ptr mid;
			int hitval, weight;
			if((uint)hitval_sel <= short.MaxValue) {
				while(column_size != 0) {
					mid = column + ((column_size >> 1) * 2);
					hitval = mid.Read();
					weight = mid.Read();
					hitval -= hitval_sel;
					if(hitval == 0) { return weight + 1; }
					if(hitval <  0) {
						column = mid;
						column_size--;
					}
					column_size >>= 1;
				}
			}
			return 0;
		}
		private static int LOT_seek_and_call(UInt16Ptr table, int param, IEnumerable<int> pid, Func<UInt16Ptr,int,int,int> fn) {
			int table_size, id_size, column_size, n_id, diff;
			IEnumerator<int> e = pid.GetEnumerator();
			table_size = table.Read();
			id_size    = table.Read();
			for(;;) {
				if(--table_size < 0) { throw new ApplicationException(); }
				n_id = id_size;
				diff = 0;
				while(--n_id >= 0) { diff |= table.Read() - (e.MoveNext() ? e.Current : -1); }
				column_size = table.Read();
				if(diff == 0) { break; }
				e.Reset();
				table += column_size * 2;
			}
			if(e.MoveNext()) { throw new ApplicationException(); }
			return fn.Invoke(table, column_size, param);
		}
		public static int LOT_draw_table_l(UInt16Ptr table, int rndval, params int[] pid) {
			return LOT_draw_table_v(table, rndval, pid);
		}
		public static int LOT_draw_table_v(UInt16Ptr table, int rndval, IEnumerable<int> pid) {
			return LOT_seek_and_call(table, rndval, pid, LOT_draw_column);
		}
#if     USE_LOT_EQUALLY
		public static int LOT_draw_table_equally_l(UInt16Ptr table, int rndval, params int[] pid) {
			return LOT_draw_table_equally_v(table, rndval, pid);
		}
		public static int LOT_draw_table_equally_v(UInt16Ptr table, int rndval, IEnumerable<int> pid) {
			return LOT_seek_and_call(table, rndval, pid, LOT_draw_column_equally);
		}
#endif
		public static int LOT_get_table_weight_l(UInt16Ptr table, int hitval_sel, params int[] pid) {
			return LOT_get_table_weight_v(table, hitval_sel, pid);
		}
		public static int LOT_get_table_weight_v(UInt16Ptr table, int hitval_sel, IEnumerable<int> pid) {
			return LOT_seek_and_call(table, hitval_sel, pid, LOT_get_column_weight);
		}
		public static int LOT_get_table_size(UInt16Ptr table) {
			return table[0];
		}
		public static int LOT_get_table_id_size(UInt16Ptr table) {
			return table[1];
		}
		public static int[] LOT_get_table_column_id(UInt16Ptr table, int i_column) {
			int table_size, id_size, column_size;
			table_size = table.Read();
			id_size    = table.Read();
			if(table_size <= i_column) { throw new ApplicationException(); }
			while(--i_column >= 0) {
				table += id_size;
				column_size = table.Read();
				table += column_size * 2;
			}
			int[] pid = new int[id_size];
			for(int i = 0; i < id_size; i++) { pid[i] = table[i]; }
			return pid;
		}
		public static int LotSym_ConvTo(ushort[,] pTBL, int x) {
			for(int i = 0; ; i++) {
				int xValue = pTBL[i, 0];
				int yValue = pTBL[i, 1];
				if(xValue == ushort.MaxValue) { throw new ApplicationException(); }
				if(xValue == x) { return yValue; }
			}
		}
		public static int LotSym_ConvFrom(ushort[,] pTBL, int y) {
			for(int i = 0; ; i++) {
				int xValue = pTBL[i, 0];
				int yValue = pTBL[i, 1];
				if(xValue == ushort.MaxValue) { throw new ApplicationException(); }
				if(yValue == y) { return xValue; }
			}
		}
		public static int Exp10_Decode(int _x) {
			uint x = (uint)_x, e;
			if(x > ushort.MaxValue) { throw new ApplicationException(); }
			e = x % 6;
			x = x / 6;
			while(e-- != 0) { x *= 10; }
			return (int)x;
		}
		public static int Exp10_Encode(int _x) {
			uint x = (uint)_x, e = 0;
			while((x != 0) && ((x % 10) == 0) && (e < 5)) {
				x /= 10;
				e++;
			}
			if(x > ushort.MaxValue) { return -1; }
			x = (x * 6) + e;
			if(x > ushort.MaxValue) { return -1; }
			return (int)x;
		}
	}
}
#if     USE_LOTROM_LOG
#endif
namespace com.Company {
	public static partial class Library {
		private struct ST_LotRom {
			public Int32Ptr				m_TBL_LotTblNo;
			public Func<object,int>	m_fnRnd;
			public object				m_fnRndArg;
#if     USE_LOTROM_LOG
			public ST_Worksheet			m_wsLog;
#endif
		}
		private static ST_LotRom stLotRom;
		private static UInt16Ptr LotRom_GetLotTbl(int LotTblNo) {
			int nLotTblNo = stLotRom.m_TBL_LotTblNo[0];
			UInt16Ptr pLotTbl;
			if((LotTblNo < 1) || (LotTblNo >= nLotTblNo)) { throw new ApplicationException(); }
			pLotTbl = (UInt16Ptr)(stLotRom.m_TBL_LotTblNo + nLotTblNo);
			return pLotTbl + stLotRom.m_TBL_LotTblNo[LotTblNo];
		}
		public static void LotRom_Init(Int32Ptr _TBL_LotTblNo, Func<object,int> _fnRnd, object _fnRndArg) {
			LotRom_Free();
			stLotRom.m_TBL_LotTblNo	= _TBL_LotTblNo;
			stLotRom.m_fnRnd	= _fnRnd;
			stLotRom.m_fnRndArg	= _fnRndArg;
		}
		public static void LotRom_Free() {
#if     USE_LOTROM_LOG
			LotRom_EndLog();
#endif
			stLotRom = default(ST_LotRom);
		}
		public static int LotRom_draw_l(int LotTblNo, params int[] pid) {
			return LotRom_draw_v(LotTblNo, pid);
		}
		public static int LotRom_draw_v(int LotTblNo, IEnumerable<int> pid) {
			int retval = LOT_draw_table_v(LotRom_GetLotTbl(LotTblNo), (ushort)stLotRom.m_fnRnd.Invoke(stLotRom.m_fnRndArg), pid);
#if     USE_LOTROM_LOG
			LotRom_AddLog(LotTblNo, pid, retval);
#endif
			return retval;
		}
#if     USE_LOT_EQUALLY
		public static int LotRom_draw_equally_l(int LotTblNo, params int[] pid) {
			return LotRom_draw_equally_v(LotTblNo, pid);
		}
		public static int LotRom_draw_equally_v(int LotTblNo, IEnumerable<int> pid) {
			int retval = LOT_draw_table_equally_v(LotRom_GetLotTbl(LotTblNo), (ushort)stLotRom.m_fnRnd.Invoke(stLotRom.m_fnRndArg), pid);
#if     USE_LOTROM_LOG
			LotRom_AddLog(LotTblNo, pid, retval);
#endif
			return retval;
		}
#endif
		public static int LotRom_get_weight_l(int LotTblNo, int hitval_sel, params int[] pid) {
			return LotRom_get_weight_v(LotTblNo, hitval_sel, pid);
		}
		public static int LotRom_get_weight_v(int LotTblNo, int hitval_sel, IEnumerable<int> pid) {
			return LOT_get_table_weight_v(LotRom_GetLotTbl(LotTblNo), hitval_sel, pid);
		}
		public static int LotRom_get_size(int LotTblNo) {
			return LOT_get_table_size(LotRom_GetLotTbl(LotTblNo));
		}
		public static int LotRom_get_id_size(int LotTblNo) {
			return LOT_get_table_id_size(LotRom_GetLotTbl(LotTblNo));
		}
		public static int[] LotRom_get_column_id(int LotTblNo, int i_column) {
			return LOT_get_table_column_id(LotRom_GetLotTbl(LotTblNo), i_column);
		}
#if     USE_LOTROM_LOG
		public static void LotRom_BeginLog() {
			throw new NotImplementedException();
		}
		public static void LotRom_DumpLog(TextWriter fp) {
			throw new NotImplementedException();
		}
		public static void LotRom_EndLog() {
			throw new NotImplementedException();
		}
		private static void LotRom_AddLog(int LotTblNo, IEnumerable<int> pid, int hitval) {
			throw new NotImplementedException();
		}
#endif
	}
}
namespace com.Company {
	public static partial class Library {
		private static object __cs__ = new object();
		public static void ENTER_CS() { Monitor.Enter(__cs__); }
		public static void LEAVE_CS() { Monitor.Exit( __cs__); }
		public static bool BTST(VoidPtr p, int i) { BytePtr q = p; return (q[i / 8] &         (1 << (i & 7))) != 0; }
		public static void BCLR(VoidPtr p, int i) { BytePtr q = p;         q[i / 8] &= (byte)~(1 << (i & 7))      ; }
		public static void BSET(VoidPtr p, int i) { BytePtr q = p;         q[i / 8] |= (byte) (1 << (i & 7))      ; }
		public static void BNOT(VoidPtr p, int i) { BytePtr q = p;         q[i / 8] ^= (byte) (1 << (i & 7))      ; }
		public static int SWAPH(int x) { return (((byte)(x >>  0)) <<  8) |
		                                        (((byte)(x >>  8)) <<  0); }
		public static int SWAPW(int x) { return (((byte)(x >>  0)) << 24) |
		                                        (((byte)(x >>  8)) << 16) |
		                                        (((byte)(x >> 16)) <<  8) |
		                                        (((byte)(x >> 24)) <<  0); }
		public static void XCHG<T>(ref T x, ref T y) { T __x__ = x; x = y; y = __x__; }
		public static int LEBYTE(VoidPtr p) { return GET_LEBYTE(p); }
		public static int LEHALF(VoidPtr p) { return GET_LEHALF(p); }
		public static int LEWORD(VoidPtr p) { return GET_LEWORD(p); }
		public static int BEBYTE(VoidPtr p) { return GET_BEBYTE(p); }
		public static int BEHALF(VoidPtr p) { return GET_BEHALF(p); }
		public static int BEWORD(VoidPtr p) { return GET_BEWORD(p); }
		public static int GET_LEBYTE(VoidPtr p) { return      ((BytePtr  )p)[0]; }
		public static int GET_LEHALF(VoidPtr p) { return      ((UInt16Ptr)p)[0]; }
		public static int GET_LEWORD(VoidPtr p) { return (int)((UInt32Ptr)p)[0]; }
		public static int GET_BEBYTE(VoidPtr p) { return            GET_LEBYTE(p) ; }
		public static int GET_BEHALF(VoidPtr p) { return SWAPH(     GET_LEHALF(p)); }
		public static int GET_BEWORD(VoidPtr p) { return SWAPW((int)GET_LEWORD(p)); }
		public static void PUT_LEBYTE(VoidPtr p, int x) { BytePtr   q = p; q[0] = (byte  )x; }
		public static void PUT_LEHALF(VoidPtr p, int x) { UInt16Ptr q = p; q[0] = (ushort)x; }
		public static void PUT_LEWORD(VoidPtr p, int x) { UInt32Ptr q = p; q[0] = (uint  )x; }
		public static void PUT_BEBYTE(VoidPtr p, int x) { PUT_LEBYTE(p,       x ); }
		public static void PUT_BEHALF(VoidPtr p, int x) { PUT_LEHALF(p, SWAPH(x)); }
		public static void PUT_BEWORD(VoidPtr p, int x) { PUT_LEWORD(p, SWAPW(x)); }
		public static int HIBYTE(int x) { return (byte  )(x >>  8); }
		public static int LOBYTE(int x) { return (byte  )(x >>  0); }
		public static int HIHALF(int x) { return (ushort)(x >> 16); }
		public static int LOHALF(int x) { return (ushort)(x >>  0); }
		public static int UPDOWN_MOTION(int i, int n) { return Math.Abs(((i + (n - 2)) % ((n - 1) * 2)) - (n - 2)); }
		public static double FastCurv(int x, int y) { return       Math.Sin(((Math.PI / 2) / y) * x); }
		public static double SlowCurv(int x, int y) { return 1.0 - Math.Cos(((Math.PI / 2) / y) * x); }
		public static T min<T>(T x, T y) where T : IComparable { return x.CompareTo(y) <= 0 ? x : y; }
		public static T max<T>(T x, T y) where T : IComparable { return x.CompareTo(y) >= 0 ? x : y; }
		public static T clamp<T>(T val, T lo, T hi) where T : IComparable { return min(max(val, lo), hi); }
		public static int  BIT1_LOWEST_POSITION(  int x) { return x & -x; }
		public static int  BIT1_SHIFT_TO_LSB(     int x) { return (x != 0) ? (int)((uint)x / (uint)BIT1_LOWEST_POSITION(x)) : x; }
		public static bool BIT1_CONTINUATION_TEST(int x) { return (BIT1_SHIFT_TO_LSB(x) & (BIT1_SHIFT_TO_LSB(x) + 1)) == 0; }
		public static int  BIT0_LOWEST_POSITION(  int x) { return  BIT1_LOWEST_POSITION(  ~x); }
		public static int  BIT0_SHIFT_TO_LSB(     int x) { return ~BIT1_SHIFT_TO_LSB(     ~x); }
		public static bool BIT0_CONTINUATION_TEST(int x) { return  BIT1_CONTINUATION_TEST(~x); }
		public static void  VAR_ADD(ref   byte x, uint y) { x = ((uint)( sbyte.MaxValue - x) >= y) ? (  byte)(x + y) : unchecked((  byte) sbyte.MaxValue); }
		public static void  VAR_ADD(ref  sbyte x, uint y) { x = ((uint)( sbyte.MaxValue - x) >= y) ? ( sbyte)(x + y) : unchecked(( sbyte) sbyte.MaxValue); }
		public static void  VAR_ADD(ref  short x, uint y) { x = ((uint)( short.MaxValue - x) >= y) ? ( short)(x + y) : unchecked(( short) short.MaxValue); }
		public static void  VAR_ADD(ref ushort x, uint y) { x = ((uint)( short.MaxValue - x) >= y) ? (ushort)(x + y) : unchecked((ushort) short.MaxValue); }
		public static void  VAR_ADD(ref    int x, uint y) { x = ((uint)(   int.MaxValue - x) >= y) ? (   int)(x + y) : unchecked((   int)   int.MaxValue); }
		public static void  VAR_ADD(ref   uint x, uint y) { x = ((uint)(   int.MaxValue - x) >= y) ? (  uint)(x + y) : unchecked((  uint)   int.MaxValue); }
		public static void  VAR_ADD(ref   byte x,  int y) {  VAR_ADD(ref x, (uint)y); }
		public static void  VAR_ADD(ref  sbyte x,  int y) {  VAR_ADD(ref x, (uint)y); }
		public static void  VAR_ADD(ref  short x,  int y) {  VAR_ADD(ref x, (uint)y); }
		public static void  VAR_ADD(ref ushort x,  int y) {  VAR_ADD(ref x, (uint)y); }
		public static void  VAR_ADD(ref    int x,  int y) {  VAR_ADD(ref x, (uint)y); }
		public static void  VAR_ADD(ref   uint x,  int y) {  VAR_ADD(ref x, (uint)y); }
		public static void UVAR_ADD(ref   byte x, uint y) { x = ((uint)(  byte.MaxValue - x) >= y) ? (  byte)(x + y) : unchecked((  byte)  byte.MaxValue); }
		public static void UVAR_ADD(ref  sbyte x, uint y) { x = ((uint)(  byte.MaxValue - x) >= y) ? ( sbyte)(x + y) : unchecked(( sbyte)  byte.MaxValue); }
		public static void UVAR_ADD(ref  short x, uint y) { x = ((uint)(ushort.MaxValue - x) >= y) ? ( short)(x + y) : unchecked(( short)ushort.MaxValue); }
		public static void UVAR_ADD(ref ushort x, uint y) { x = ((uint)(ushort.MaxValue - x) >= y) ? (ushort)(x + y) : unchecked((ushort)ushort.MaxValue); }
		public static void UVAR_ADD(ref    int x, uint y) { x = ((uint)(  uint.MaxValue - x) >= y) ? (   int)(x + y) : unchecked((   int)  uint.MaxValue); }
		public static void UVAR_ADD(ref   uint x, uint y) { x = ((uint)(  uint.MaxValue - x) >= y) ? (  uint)(x + y) : unchecked((  uint)  uint.MaxValue); }
		public static void UVAR_ADD(ref   byte x,  int y) { UVAR_ADD(ref x, (uint)y); }
		public static void UVAR_ADD(ref  sbyte x,  int y) { UVAR_ADD(ref x, (uint)y); }
		public static void UVAR_ADD(ref  short x,  int y) { UVAR_ADD(ref x, (uint)y); }
		public static void UVAR_ADD(ref ushort x,  int y) { UVAR_ADD(ref x, (uint)y); }
		public static void UVAR_ADD(ref    int x,  int y) { UVAR_ADD(ref x, (uint)y); }
		public static void UVAR_ADD(ref   uint x,  int y) { UVAR_ADD(ref x, (uint)y); }
		public static void GVAR_ADD(ref   byte x, uint y) { UVAR_ADD(ref x, y); }
		public static void GVAR_ADD(ref  sbyte x, uint y) {  VAR_ADD(ref x, y); }
		public static void GVAR_ADD(ref  short x, uint y) {  VAR_ADD(ref x, y); }
		public static void GVAR_ADD(ref ushort x, uint y) { UVAR_ADD(ref x, y); }
		public static void GVAR_ADD(ref    int x, uint y) {  VAR_ADD(ref x, y); }
		public static void GVAR_ADD(ref   uint x, uint y) { UVAR_ADD(ref x, y); }
		public static void GVAR_ADD(ref   byte x,  int y) { GVAR_ADD(ref x, (uint)y); }
		public static void GVAR_ADD(ref  sbyte x,  int y) { GVAR_ADD(ref x, (uint)y); }
		public static void GVAR_ADD(ref  short x,  int y) { GVAR_ADD(ref x, (uint)y); }
		public static void GVAR_ADD(ref ushort x,  int y) { GVAR_ADD(ref x, (uint)y); }
		public static void GVAR_ADD(ref    int x,  int y) { GVAR_ADD(ref x, (uint)y); }
		public static void GVAR_ADD(ref   uint x,  int y) { GVAR_ADD(ref x, (uint)y); }
		public static void  VAR_SUB(ref   byte x, uint y) { x = ((uint)(x -  sbyte.MinValue) >= y) ? (  byte)(x - y) : unchecked((  byte) sbyte.MinValue); }
		public static void  VAR_SUB(ref  sbyte x, uint y) { x = ((uint)(x -  sbyte.MinValue) >= y) ? ( sbyte)(x - y) : unchecked(( sbyte) sbyte.MinValue); }
		public static void  VAR_SUB(ref  short x, uint y) { x = ((uint)(x -  short.MinValue) >= y) ? ( short)(x - y) : unchecked(( short) short.MinValue); }
		public static void  VAR_SUB(ref ushort x, uint y) { x = ((uint)(x -  short.MinValue) >= y) ? (ushort)(x - y) : unchecked((ushort) short.MinValue); }
		public static void  VAR_SUB(ref    int x, uint y) { x = ((uint)(x -    int.MinValue) >= y) ? (   int)(x - y) : unchecked((   int)   int.MinValue); }
		public static void  VAR_SUB(ref   uint x, uint y) { x = ((uint)(x -    int.MinValue) >= y) ? (  uint)(x - y) : unchecked((  uint)   int.MinValue); }
		public static void  VAR_SUB(ref   byte x,  int y) {  VAR_SUB(ref x, (uint)y); }
		public static void  VAR_SUB(ref  sbyte x,  int y) {  VAR_SUB(ref x, (uint)y); }
		public static void  VAR_SUB(ref  short x,  int y) {  VAR_SUB(ref x, (uint)y); }
		public static void  VAR_SUB(ref ushort x,  int y) {  VAR_SUB(ref x, (uint)y); }
		public static void  VAR_SUB(ref    int x,  int y) {  VAR_SUB(ref x, (uint)y); }
		public static void  VAR_SUB(ref   uint x,  int y) {  VAR_SUB(ref x, (uint)y); }
		public static void UVAR_SUB(ref   byte x, uint y) { x = ((uint)(x -   byte.MinValue) >= y) ? (  byte)(x - y) : unchecked((  byte) sbyte.MinValue); }
		public static void UVAR_SUB(ref  sbyte x, uint y) { x = ((uint)(x -   byte.MinValue) >= y) ? ( sbyte)(x - y) : unchecked(( sbyte) sbyte.MinValue); }
		public static void UVAR_SUB(ref  short x, uint y) { x = ((uint)(x - ushort.MinValue) >= y) ? ( short)(x - y) : unchecked(( short) short.MinValue); }
		public static void UVAR_SUB(ref ushort x, uint y) { x = ((uint)(x - ushort.MinValue) >= y) ? (ushort)(x - y) : unchecked((ushort) short.MinValue); }
		public static void UVAR_SUB(ref    int x, uint y) { x = ((uint)(x -   uint.MinValue) >= y) ? (   int)(x - y) : unchecked((   int)   int.MinValue); }
		public static void UVAR_SUB(ref   uint x, uint y) { x = ((uint)(x -   uint.MinValue) >= y) ? (  uint)(x - y) : unchecked((  uint)   int.MinValue); }
		public static void UVAR_SUB(ref   byte x,  int y) { UVAR_SUB(ref x, (uint)y); }
		public static void UVAR_SUB(ref  sbyte x,  int y) { UVAR_SUB(ref x, (uint)y); }
		public static void UVAR_SUB(ref  short x,  int y) { UVAR_SUB(ref x, (uint)y); }
		public static void UVAR_SUB(ref ushort x,  int y) { UVAR_SUB(ref x, (uint)y); }
		public static void UVAR_SUB(ref    int x,  int y) { UVAR_SUB(ref x, (uint)y); }
		public static void UVAR_SUB(ref   uint x,  int y) { UVAR_SUB(ref x, (uint)y); }
		public static void GVAR_SUB(ref   byte x, uint y) { UVAR_SUB(ref x, y); }
		public static void GVAR_SUB(ref  sbyte x, uint y) {  VAR_SUB(ref x, y); }
		public static void GVAR_SUB(ref  short x, uint y) {  VAR_SUB(ref x, y); }
		public static void GVAR_SUB(ref ushort x, uint y) { UVAR_SUB(ref x, y); }
		public static void GVAR_SUB(ref    int x, uint y) {  VAR_SUB(ref x, y); }
		public static void GVAR_SUB(ref   uint x, uint y) { UVAR_SUB(ref x, y); }
		public static void GVAR_SUB(ref   byte x,  int y) { GVAR_SUB(ref x, (uint)y); }
		public static void GVAR_SUB(ref  sbyte x,  int y) { GVAR_SUB(ref x, (uint)y); }
		public static void GVAR_SUB(ref  short x,  int y) { GVAR_SUB(ref x, (uint)y); }
		public static void GVAR_SUB(ref ushort x,  int y) { GVAR_SUB(ref x, (uint)y); }
		public static void GVAR_SUB(ref    int x,  int y) { GVAR_SUB(ref x, (uint)y); }
		public static void GVAR_SUB(ref   uint x,  int y) { GVAR_SUB(ref x, (uint)y); }
		public static void UVAR_INC(ref   byte x) { UVAR_ADD(ref x, 1); }
		public static void UVAR_INC(ref  sbyte x) { UVAR_ADD(ref x, 1); }
		public static void UVAR_INC(ref  short x) { UVAR_ADD(ref x, 1); }
		public static void UVAR_INC(ref ushort x) { UVAR_ADD(ref x, 1); }
		public static void UVAR_INC(ref    int x) { UVAR_ADD(ref x, 1); }
		public static void UVAR_INC(ref   uint x) { UVAR_ADD(ref x, 1); }
		public static void  VAR_INC(ref   byte x) {  VAR_ADD(ref x, 1); }
		public static void  VAR_INC(ref  sbyte x) {  VAR_ADD(ref x, 1); }
		public static void  VAR_INC(ref  short x) {  VAR_ADD(ref x, 1); }
		public static void  VAR_INC(ref ushort x) {  VAR_ADD(ref x, 1); }
		public static void  VAR_INC(ref    int x) {  VAR_ADD(ref x, 1); }
		public static void  VAR_INC(ref   uint x) {  VAR_ADD(ref x, 1); }
		public static void GVAR_INC(ref   byte x) { GVAR_ADD(ref x, 1); }
		public static void GVAR_INC(ref  sbyte x) { GVAR_ADD(ref x, 1); }
		public static void GVAR_INC(ref  short x) { GVAR_ADD(ref x, 1); }
		public static void GVAR_INC(ref ushort x) { GVAR_ADD(ref x, 1); }
		public static void GVAR_INC(ref    int x) { GVAR_ADD(ref x, 1); }
		public static void GVAR_INC(ref   uint x) { GVAR_ADD(ref x, 1); }
		public static void UVAR_DEC(ref   byte x) { UVAR_SUB(ref x, 1); }
		public static void UVAR_DEC(ref  sbyte x) { UVAR_SUB(ref x, 1); }
		public static void UVAR_DEC(ref  short x) { UVAR_SUB(ref x, 1); }
		public static void UVAR_DEC(ref ushort x) { UVAR_SUB(ref x, 1); }
		public static void UVAR_DEC(ref    int x) { UVAR_SUB(ref x, 1); }
		public static void UVAR_DEC(ref   uint x) { UVAR_SUB(ref x, 1); }
		public static void  VAR_DEC(ref   byte x) {  VAR_SUB(ref x, 1); }
		public static void  VAR_DEC(ref  sbyte x) {  VAR_SUB(ref x, 1); }
		public static void  VAR_DEC(ref  short x) {  VAR_SUB(ref x, 1); }
		public static void  VAR_DEC(ref ushort x) {  VAR_SUB(ref x, 1); }
		public static void  VAR_DEC(ref    int x) {  VAR_SUB(ref x, 1); }
		public static void  VAR_DEC(ref   uint x) {  VAR_SUB(ref x, 1); }
		public static void GVAR_DEC(ref   byte x) { GVAR_SUB(ref x, 1); }
		public static void GVAR_DEC(ref  sbyte x) { GVAR_SUB(ref x, 1); }
		public static void GVAR_DEC(ref  short x) { GVAR_SUB(ref x, 1); }
		public static void GVAR_DEC(ref ushort x) { GVAR_SUB(ref x, 1); }
		public static void GVAR_DEC(ref    int x) { GVAR_SUB(ref x, 1); }
		public static void GVAR_DEC(ref   uint x) { GVAR_SUB(ref x, 1); }
		public static int D3DRGBA(double r, double g, double b, double a)	{ return RGBA_MAKE((int)(r*255),(int)(g*255),(int)(b*255),(int)(a*255)); }
		public static int RGBA_MAKE(int r, int g, int b, int a)			{ return (((byte)a)<<24)|(((byte)r)<<16)|(((byte)g)<<8)|((byte)b); }
		public static int RGBA_GETBLUE(int rgba)				{ return (byte)(rgba    ); }
		public static int RGBA_GETGREEN(int rgba)				{ return (byte)(rgba>> 8); }
		public static int RGBA_GETRED(int rgba)					{ return (byte)(rgba>>16); }
		public static int RGBA_GETALPHA(int rgba)				{ return (byte)(rgba>>24); }
		public static int RGBA_SETALPHA(int rgba, int a)			{ return (a<<24)|(rgba&0xFFFFFF); }
		public static int RGBA_TORGB(int rgba)					{ return RGBA_SETALPHA(rgba,0); }
		public static int D3DRGB(int r, int g, int b)				{ return D3DRGBA(r,g,b,1); }
		public static int RGB_MAKE(int r, int g, int b)				{ return RGBA_MAKE(r,g,b,0); }
		public static int RGB_GETBLUE(int rgb)					{ return RGBA_GETBLUE(rgb); }
		public static int RGB_GETGREEN(int rgb)					{ return RGBA_GETGREEN(rgb); }
		public static int RGB_GETRED(int rgb)					{ return RGBA_GETRED(rgb); }
		public static int RGB_TORGBA(int rgb)					{ return RGBA_SETALPHA(rgb,255); }
		public static int RGBA_MAKE(UnityEngine.Color32 color) {
			return com.Company.Library.RGBA_MAKE(
				color.r,
				color.g,
				color.b,
				color.a);
		}
		public static UnityEngine.Color32 RGBA_TOCOLOR(int rgba) {
			return new UnityEngine.Color32(
				(byte)RGBA_GETRED(  rgba),
				(byte)RGBA_GETGREEN(rgba),
				(byte)RGBA_GETBLUE( rgba),
				(byte)RGBA_GETALPHA(rgba));
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public static void InitInstance(object o) {
			foreach(FieldInfo fi in o.GetType().GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance)) {
				Type ft = fi.FieldType;
				if(ft.IsArray) {
					Array a = (Array)fi.GetValue(o);
					if(a != null) {
						Type et = ft.GetElementType();
						int[] indices = new int[a.Rank];
						for(;;) {
							if(et.IsClass) {
								object e = a.GetValue(indices);
								if(e == null) {
									e = et.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
									a.SetValue(e, indices);
								}
								InitInstance(e);
							}
							int iRank;
							for(iRank = a.Rank - 1; iRank >= 0; iRank--) {
								if(++indices[iRank] < a.GetLength(iRank)) { break; }
								indices[iRank] = 0;
							}
							if(iRank < 0) { break; }
						}
					}
				}
			}
		}
		public static object CreateInstance(Type t) {
			object o = t.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);
			InitInstance(o);
			return o;
		}
		public static T CreateInstance<T>() where T : new() {
			T o = new T();
			InitInstance(o);
			return o;
		}
	}
}
namespace System {
	public delegate void Action<in T1, in T2, in T3, in T4, in T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
	public delegate void Action<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15);
	public delegate TResult Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
}
namespace com.Company {
	public static partial class Library {
		public enum MoviePlayerStatus {
			Stop,
			Dechead,
			WaitPrep,
			Prep,
			Ready,
			Playing,
			PlayEnd,
			Error,
			StopProcessing,
		}
		public interface IMoviePlayer : IDisposable {
			MoviePlayerStatus GetStatus();
			void Prepare(int iTexNo);
			void Start();
			void Stop();
		}
		public class ST_MovieHelper {
			public int				nCh;
			public ST_MovieDevCh[]		TBL_MovieDevCh;
		}
		public class ST_MovieDevCh {
			public IMoviePlayer			pMoviePlayer;
			public int				iTexNo;
			public int				iPrepAge;
			public bool				bInUse;
		}
		public static ST_MovieHelper MovieHelper_New(int nCh, Func<object,IMoviePlayer> fnCreateMoviePlayer, object arg) {
			ST_MovieHelper pMovieHelper = new ST_MovieHelper();
			MovieHelper_Init(pMovieHelper, nCh, fnCreateMoviePlayer, arg);
			return pMovieHelper;
		}
		public static void MovieHelper_Init(ST_MovieHelper pMovieHelper, int nCh, Func<object,IMoviePlayer> fnCreateMoviePlayer, object arg) {
			pMovieHelper.nCh = nCh;
			pMovieHelper.TBL_MovieDevCh = new ST_MovieDevCh[nCh];
			for(int iCh = 0; iCh < nCh; iCh++) {
				ST_MovieDevCh pMovieDevCh = new ST_MovieDevCh();
				pMovieHelper.TBL_MovieDevCh[iCh] = pMovieDevCh;
				pMovieDevCh.pMoviePlayer = fnCreateMoviePlayer.Invoke(arg);
			}
		}
		public static void MovieHelper_Exit(ST_MovieHelper pMovieHelper) {
			foreach(ST_MovieDevCh pMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				pMovieDevCh.pMoviePlayer.Dispose();
			}
		}
		public static void MovieHelper_Exec(ST_MovieHelper pMovieHelper) {
			foreach(ST_MovieDevCh pMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				switch(pMovieDevCh.pMoviePlayer.GetStatus()) {
				default:throw new ApplicationException();
				case MoviePlayerStatus.Stop:
					if((pMovieDevCh.iTexNo != 0) || pMovieDevCh.bInUse) { throw new ApplicationException(); }
					break;
				case MoviePlayerStatus.Dechead:
				case MoviePlayerStatus.WaitPrep:
				case MoviePlayerStatus.Prep:
				case MoviePlayerStatus.Ready:
					if((pMovieDevCh.iTexNo == 0) || pMovieDevCh.bInUse) { throw new ApplicationException(); }
					break;
				case MoviePlayerStatus.Playing:
				case MoviePlayerStatus.PlayEnd:
					if(pMovieDevCh.iTexNo == 0) { throw new ApplicationException(); }
					if(pMovieDevCh.bInUse) {
						pMovieDevCh.bInUse = false;
					} else {
						pMovieDevCh.pMoviePlayer.Stop();
						pMovieDevCh.iTexNo = 0;
					}
					break;
				}
			}
		}
		public static bool MovieHelper_Prepare(ST_MovieHelper pMovieHelper, int iTexNo) {
			if((iTexNo < 1) || (iTexNo > int.MaxValue)) { throw new ApplicationException(); }
			ST_MovieDevCh pMovieDevCh = MovieHelper_Prepare_subr1(pMovieHelper, iTexNo);
			if(pMovieDevCh == null) { return false; }
			switch(pMovieDevCh.pMoviePlayer.GetStatus()) {
			default:throw new ApplicationException();
			case MoviePlayerStatus.Dechead:
			case MoviePlayerStatus.WaitPrep:
			case MoviePlayerStatus.Prep:
				return false;
			case MoviePlayerStatus.Ready:
			case MoviePlayerStatus.Playing:
			case MoviePlayerStatus.PlayEnd:
				return true;
			}
		}
		private static ST_MovieDevCh MovieHelper_Prepare_subr1(ST_MovieHelper pMovieHelper, int iTexNo) {
			if((iTexNo < 1) || (iTexNo > int.MaxValue)) { throw new ApplicationException(); }
			foreach(ST_MovieDevCh pMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				if(pMovieDevCh.iTexNo == iTexNo) {
					switch(pMovieDevCh.pMoviePlayer.GetStatus()) {
					default:throw new ApplicationException();
					case MoviePlayerStatus.Dechead:
					case MoviePlayerStatus.WaitPrep:
					case MoviePlayerStatus.Prep:
					case MoviePlayerStatus.Ready:
						MovieHelper_Prepare_subr3(pMovieHelper, pMovieDevCh);
						return pMovieDevCh;
					case MoviePlayerStatus.Playing:
					case MoviePlayerStatus.PlayEnd:
						return pMovieDevCh;
					}
				}
			}
			int           oldestPrepAge    = int.MinValue;
			ST_MovieDevCh oldestMovieDevCh = null;
			foreach(ST_MovieDevCh pMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				switch(pMovieDevCh.pMoviePlayer.GetStatus()) {
				default:throw new ApplicationException();
				case MoviePlayerStatus.Stop:
					MovieHelper_Prepare_subr2(pMovieDevCh, iTexNo);
					MovieHelper_Prepare_subr3(pMovieHelper, pMovieDevCh);
					return pMovieDevCh;
				case MoviePlayerStatus.Dechead:
				case MoviePlayerStatus.WaitPrep:
				case MoviePlayerStatus.Prep:
				case MoviePlayerStatus.Ready:
					if(pMovieDevCh.iPrepAge > oldestPrepAge) {
						oldestPrepAge    = pMovieDevCh.iPrepAge;
						oldestMovieDevCh = pMovieDevCh;
					}
					break;
				case MoviePlayerStatus.Playing:
				case MoviePlayerStatus.PlayEnd:
					break;
				}
			}
			if(oldestMovieDevCh != null) {
				MovieHelper_Stop_subr(oldestMovieDevCh);
				MovieHelper_Prepare_subr2(oldestMovieDevCh, iTexNo);
				MovieHelper_Prepare_subr3(pMovieHelper, oldestMovieDevCh);
				return oldestMovieDevCh;
			}
			return null;
		}
		private static void MovieHelper_Prepare_subr2(ST_MovieDevCh pMovieDevCh, int iTexNo) {
			if((pMovieDevCh.iTexNo != 0) || pMovieDevCh.bInUse) { throw new ApplicationException(); }
			if((iTexNo < 1) || (iTexNo > int.MaxValue)) { throw new ApplicationException(); }
			pMovieDevCh.iTexNo = iTexNo;
			pMovieDevCh.pMoviePlayer.Prepare(iTexNo);
		}
		private static void MovieHelper_Prepare_subr3(ST_MovieHelper pMovieHelper, ST_MovieDevCh pMovieDevCh) {
			pMovieDevCh.iPrepAge = 0;
			bool bFound = false;
			foreach(ST_MovieDevCh otherMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				if((otherMovieDevCh != pMovieDevCh) &&
				   (otherMovieDevCh.iTexNo != 0) &&
				   (otherMovieDevCh.iPrepAge == 0)) {
					switch(otherMovieDevCh.pMoviePlayer.GetStatus()) {
					default:throw new ApplicationException();
					case MoviePlayerStatus.Dechead:
					case MoviePlayerStatus.WaitPrep:
					case MoviePlayerStatus.Prep:
					case MoviePlayerStatus.Ready:
						bFound = true;
						break;
					case MoviePlayerStatus.Playing:
					case MoviePlayerStatus.PlayEnd:
						break;
					}
					if(bFound) { break; }
				}
			}
			if(!bFound) { return; }
			foreach(ST_MovieDevCh otherMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				if((otherMovieDevCh != pMovieDevCh) &&
				   (otherMovieDevCh.iTexNo != 0)) {
					switch(otherMovieDevCh.pMoviePlayer.GetStatus()) {
					default:throw new ApplicationException();
					case MoviePlayerStatus.Dechead:
					case MoviePlayerStatus.WaitPrep:
					case MoviePlayerStatus.Prep:
					case MoviePlayerStatus.Ready:
						otherMovieDevCh.iPrepAge++;
						break;
					case MoviePlayerStatus.Playing:
					case MoviePlayerStatus.PlayEnd:
						break;
					}
				}
			}
		}
		public static IMoviePlayer MovieHelper_Draw(ST_MovieHelper pMovieHelper, int iTexNo) {
			if((iTexNo < 1) || (iTexNo > int.MaxValue)) { throw new ApplicationException(); }
			ST_MovieDevCh pMovieDevCh = MovieHelper_Prepare_subr1(pMovieHelper, iTexNo);
			if(pMovieDevCh == null) { throw new ApplicationException(); }
			switch(pMovieDevCh.pMoviePlayer.GetStatus()) {
			default:throw new ApplicationException();
			case MoviePlayerStatus.Dechead:
			case MoviePlayerStatus.WaitPrep:
			case MoviePlayerStatus.Prep:
			case MoviePlayerStatus.Ready:
				pMovieDevCh.pMoviePlayer.Start();
				break;
			case MoviePlayerStatus.Playing:
			case MoviePlayerStatus.PlayEnd:
				break;
			}
			pMovieDevCh.bInUse = true;
			return pMovieDevCh.pMoviePlayer;
		}
		public static void MovieHelper_Stop(ST_MovieHelper pMovieHelper, int iTexNo) {
			if((iTexNo < 1) || (iTexNo > int.MaxValue)) { throw new ApplicationException(); }
			foreach(ST_MovieDevCh pMovieDevCh in pMovieHelper.TBL_MovieDevCh) {
				if(pMovieDevCh.iTexNo == iTexNo) {
					switch(pMovieDevCh.pMoviePlayer.GetStatus()) {
					default:throw new ApplicationException();
					case MoviePlayerStatus.Dechead:
					case MoviePlayerStatus.WaitPrep:
					case MoviePlayerStatus.Prep:
					case MoviePlayerStatus.Ready:
						return;
					case MoviePlayerStatus.Playing:
					case MoviePlayerStatus.PlayEnd:
						MovieHelper_Stop_subr(pMovieDevCh);
						return;
					}
				}
			}
		}
		private static void MovieHelper_Stop_subr(ST_MovieDevCh pMovieDevCh) {
			if(pMovieDevCh.iTexNo == 0) { throw new ApplicationException(); }
			pMovieDevCh.pMoviePlayer.Stop();
			pMovieDevCh.iTexNo = 0;
			pMovieDevCh.bInUse = false;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_MsgHsk {
			public ST_RRS		pRRS;
			public short		iJobSend;
			public short		iJobRecv;
			public int		iMsgType;
			public object		pMsgData;
		}
		public static void MsgHsk_Init(ST_MsgHsk pMsgHsk, ST_RRS pRRS) {
			pMsgHsk.pRRS     = pRRS;
			pMsgHsk.iJobRecv = -1;
			pMsgHsk.iJobSend = -1;
		}
		public static void MsgHsk_Send(ST_MsgHsk pMsgHsk, int iMsgType, object pMsgData) {
			MsgHsk_SendIdle(pMsgHsk, iMsgType, pMsgData, null, null);
		}
		public static void MsgHsk_SendIdle(ST_MsgHsk pMsgHsk, int iMsgType, object pMsgData, Action<object> idle, object arg) {
			int iJob = RRS_i_job(pMsgHsk.pRRS);
#if     DEBUG
			UnityEngine.Debug.LogFormat(       "MsgHsk_Send: Job#{0} is sending Msg#{1}.", iJob, iMsgType);
#endif
			if(iMsgType == -1) { throw new ApplicationException(); }
			if(pMsgHsk.iJobSend != -1) { throw new ApplicationException(); }
			pMsgHsk.iJobSend = (short)iJob;
			pMsgHsk.iMsgType = iMsgType;
			pMsgHsk.pMsgData = pMsgData;
			for(;;) {
				RRS_yield(pMsgHsk.pRRS);
				if(pMsgHsk.iJobSend != iJob) { break; }
				idle?.Invoke(arg);
			}
#if     DEBUG
			UnityEngine.Debug.LogFormat(       "MsgHsk_Send: Job#{0} has sent Msg#{1}.", iJob, iMsgType);
#endif
		}
		public static int MsgHsk_Recv(ST_MsgHsk pMsgHsk) {
			object ppMsgData;
			return MsgHsk_Recv(pMsgHsk, out ppMsgData);
		}
		public static int MsgHsk_Recv(ST_MsgHsk pMsgHsk, out object ppMsgData) {
			return MsgHsk_RecvIdle(pMsgHsk, out ppMsgData, null, null);
		}
		public static int MsgHsk_RecvIdle(ST_MsgHsk pMsgHsk, Action<object> idle, object arg) {
			object ppMsgData;
			return MsgHsk_RecvIdle(pMsgHsk, out ppMsgData, idle, arg);
		}
		public static int MsgHsk_RecvIdle(ST_MsgHsk pMsgHsk, out object ppMsgData, Action<object> idle, object arg) {
			int iJob = RRS_i_job(pMsgHsk.pRRS);
			if(pMsgHsk.iJobSend == -1) {
#if     DEBUG
				UnityEngine.Debug.LogFormat(       "MsgHsk_Recv: Job#{0} is receiving Msg.", iJob);
#endif
				if(pMsgHsk.iJobRecv != -1) { throw new ApplicationException(); }
				pMsgHsk.iJobRecv = (short)iJob;
				do {
					idle?.Invoke(arg);
					RRS_yield(pMsgHsk.pRRS);
				} while(pMsgHsk.iJobSend == -1);
				pMsgHsk.iJobRecv = -1;
			}
#if     DEBUG
			UnityEngine.Debug.LogFormat(       "MsgHsk_Recv: Job#{0} has received Msg#{1}.", iJob, pMsgHsk.iMsgType);
#endif
			pMsgHsk.iJobSend = -1;
			ppMsgData = pMsgHsk.pMsgData;
			if(pMsgHsk.iMsgType == -1) { throw new ApplicationException(); }
			return pMsgHsk.iMsgType;
		}
		public static int MsgHsk_TryRecv(ST_MsgHsk pMsgHsk) {
			object ppMsgData;
			return MsgHsk_TryRecv(pMsgHsk, out ppMsgData);
		}
		public static int MsgHsk_TryRecv(ST_MsgHsk pMsgHsk, out object ppMsgData) {
			ppMsgData = null;
			if(pMsgHsk.iJobSend == -1) { return -1; }
			return MsgHsk_Recv(pMsgHsk, out ppMsgData);
		}
		public static void MsgHsk_Wait(ST_MsgHsk pMsgHsk, int iMsgType) {
			object ppMsgData;
			MsgHsk_Wait(pMsgHsk, iMsgType, out ppMsgData);
		}
		public static void MsgHsk_Wait(ST_MsgHsk pMsgHsk, int iMsgType, out object ppMsgData) {
			MsgHsk_WaitIdle(pMsgHsk, iMsgType, out ppMsgData, null, null);
		}
		public static void MsgHsk_WaitIdle(ST_MsgHsk pMsgHsk, int iMsgType, Action<object> idle, object arg) {
			object ppMsgData;
			MsgHsk_WaitIdle(pMsgHsk, iMsgType, out ppMsgData, idle, arg);
		}
		public static void MsgHsk_WaitIdle(ST_MsgHsk pMsgHsk, int iMsgType, out object ppMsgData, Action<object> idle, object arg) {
#if     DEBUG
			int iJob = RRS_i_job(pMsgHsk.pRRS);
			UnityEngine.Debug.LogFormat(       "MsgHsk_Recv: Job#{0} is waiting for Msg#{1}.", iJob, iMsgType);
#endif
			if(iMsgType == -1) { throw new ApplicationException(); }
			if(MsgHsk_RecvIdle(pMsgHsk, out ppMsgData, idle, arg) != iMsgType) { throw new ApplicationException(); }
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public const int Prp_name	=  1;
		public const int Prp_desc	=  2;
		public const int Prp_fmt	=  3;
		public const int Prp_len	=  4;
		public const int Prp_pos	=  5;
		public const int Prp_type	=  6;
		public const int Prp_dim	=  7;
		public const int Prp_attr	=  8;
		public const int Prp_init	=  9;
		public const int Prp_range	= 10;
		public const int Prp_enum	= 11;
		public const int PrpTbl_Double	= 0x7FFF;
		private static int PrpTbl_op_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, object _iVal, IEnumerable<int> _aName, int iOp) {
			int iVal = (_iVal is int) ? (int)_iVal : 0;
			IEnumerator<int> aName = _aName.GetEnumerator();
			VoidPtr pTblKey;
			pTblKey = REG_open_key(pPrpKey, iTbl);
			if(!pTblKey) { throw new ApplicationException(); }
			int iName = aName.MoveNext() ? aName.Current : -1;
			for(;;) {
				int iBitPos2, iArraySize, iOffset, nIndex, iType, iBitLen;
				VoidPtr pVarKey;
				UInt16Ptr pDim;
				if(iName == -1) { throw new ApplicationException(); }
				pVarKey = REG_open_key(pTblKey, iName);
				if(!pVarKey) { throw new ApplicationException(); }
				iBitPos2 = REG_get_value(pVarKey, Prp_pos);
				if(iBitPos2 == -1) { throw new ApplicationException(); }
				iBitPos += iBitPos2;
				iArraySize = 1;
				iOffset = 0;
				nIndex = 0;
				pDim = REG_get_blob(pVarKey, Prp_dim);
				if(pDim) {
					int nDim, iBound, iIndex;
					nDim = REG_get_blob_size(pDim);
					if((nDim & 1) != 0) { throw new ApplicationException(); }
					nDim >>= 1;
					do {
						iBound = pDim.Read();
						iBound++;
						iArraySize *= iBound;
						if((iName = aName.MoveNext() ? aName.Current : -1) != -1) {
							iIndex = aName.Current;
							if((uint)iIndex >= (uint)iBound) { throw new ApplicationException(); }
							iOffset *= iBound;
							iOffset += iIndex;
							nIndex++;
						} else {
							if(nIndex != 0) { throw new ApplicationException(); }
						}
					} while(--nDim != 0);
					if((nIndex == 0) && (iOp > 2)) { throw new ApplicationException(); }
				}
				iType = REG_get_value(pVarKey, Prp_type);
				if(iType == -1) {
					if((iName = aName.MoveNext() ? aName.Current : -1) != -1) { throw new ApplicationException(); }
					iOffset *= 32;
					iBitPos += iOffset;
					switch(iOp) {
					default:throw new ApplicationException();
					case 0:
						{
							ST_PrpInf pInf = (ST_PrpInf)_iVal;
							pInf.iType	= iType;
							pInf.iBitPos	= iBitPos;
							pInf.pDim	= (nIndex != 0) ? null : REG_get_blob(pVarKey, Prp_dim);
							pInf.nDim	= REG_get_blob_size(pInf.pDim) >> 1;
							pInf.pName	= REG_get_string(pVarKey, Prp_name);
							pInf.pDesc	= REG_get_string(pVarKey, Prp_desc);
							pInf.pFmt	= REG_get_string(pVarKey, Prp_fmt);
							pInf.iFmt	= REG_get_value( pVarKey, Prp_fmt);
						}
						break;
					case 1:
						iVal = 0;
						goto case 2;
					case 2:
						do {
							bitarray_lsb1st_set(pPrpTbl, iBitPos, 32, iVal);
							iBitPos += 32;
							if(nIndex != 0) { break; }
						} while(--iArraySize != 0);
						break;
					case 3:
						{
							int iAcc = iVal;
							iVal = bitarray_lsb1st_get(pPrpTbl, iBitPos, 32);
							if(iAcc != 0) {
								iVal += iAcc;
								bitarray_lsb1st_set(pPrpTbl, iBitPos, 32, iVal);
							}
						}
						break;
					}
					break;
				} else if(iType >= 0x8000) {
					VoidPtr pTypKey;
					Int16Ptr pRng, pEnm;
					if((iName = aName.MoveNext() ? aName.Current : -1) != -1) { throw new ApplicationException(); }
					pTypKey = REG_open_key(pPrpKey, iType);
					if(!pTypKey) { throw new ApplicationException(); }
					iBitLen = REG_get_value(pTypKey, Prp_len);
					iBitLen++;
					if((iBitLen < 1) || (iBitLen > 16)) { throw new ApplicationException(); }
					iOffset *= iBitLen;
					iBitPos += iOffset;
					pRng = REG_get_blob(pTypKey, Prp_range);
					pEnm = REG_get_blob(pTypKey, Prp_enum);
					if(pRng && !pEnm) {
						int iMin = pRng.Read();
						int iMax = iMin + (ushort)pRng.Read();
						switch(iOp) {
						default:throw new ApplicationException();
						case 0:
							{
								ST_PrpInf pInf = (ST_PrpInf)_iVal;
								pInf.iType	= iType;
								pInf.iBitPos	= iBitPos;
								pInf.pDim	= (nIndex != 0) ? null : REG_get_blob(pVarKey, Prp_dim);
								pInf.nDim	= REG_get_blob_size(pInf.pDim) >> 1;
								pInf.pName	= REG_get_string(pVarKey, Prp_name);
								pInf.pDesc	= REG_get_string(pVarKey, Prp_desc);
								pInf.pFmt	= REG_get_string(pVarKey, Prp_fmt);
								pInf.iFmt	= REG_get_value( pVarKey, Prp_fmt);
								if((pInf.pFmt == null) && (pInf.iFmt == -1)) {
									pInf.pFmt	= REG_get_string(pTypKey, Prp_fmt);
									pInf.iFmt	= REG_get_value( pTypKey, Prp_fmt);
								}
							}
							break;
						case 1:
							iVal = REG_get_value(pTypKey, Prp_init);
							iVal += iMin;
							goto case 2;
						case 2:
							if((iVal < iMin) || (iVal > iMax)) { throw new ApplicationException(); }
							iVal -= iMin;
							do {
								bitarray_lsb1st_set(pPrpTbl, iBitPos, iBitLen, iVal);
								iBitPos += iBitLen;
								if(nIndex != 0) { break; }
							} while(--iArraySize != 0);
							break;
						case 3:
							{
								int iAcc = iVal;
								iVal = bitarray_lsb1st_get(pPrpTbl, iBitPos, iBitLen);
								iVal += iMin;
								if((iVal < iMin) || (iVal > iMax)) { throw new ApplicationException(); }
								if(iAcc != 0) {
									iVal += iAcc;
									if(iVal < iMin) { iVal = iMin; }
									if(iVal > iMax) { iVal = iMax; }
									bitarray_lsb1st_set(pPrpTbl, iBitPos, iBitLen, iVal - iMin);
								}
							}
							break;
						}
					} else if(pEnm && !pRng) {
						int nEnm, iIdx = -1;
						nEnm = REG_get_blob_size(pEnm);
						if((nEnm & 1) != 0) { throw new ApplicationException(); }
						nEnm >>= 1;
						switch(iOp) {
						default:throw new ApplicationException();
						case 0:
							{
								ST_PrpInf pInf = (ST_PrpInf)_iVal;
								pInf.iType	= iType;
								pInf.iBitPos	= iBitPos;
								pInf.pDim	= (nIndex != 0) ? null : REG_get_blob(pVarKey, Prp_dim);
								pInf.nDim	= REG_get_blob_size(pInf.pDim) >> 1;
								pInf.pName	= REG_get_string(pVarKey, Prp_name);
								pInf.pDesc	= REG_get_string(pVarKey, Prp_desc);
								pInf.pFmt	= REG_get_string(pVarKey, Prp_fmt);
								pInf.iFmt	= REG_get_value( pVarKey, Prp_fmt);
								if((pInf.pFmt == null) && (pInf.iFmt == -1)) {
									pInf.pFmt	= REG_get_string(pTypKey, Prp_fmt);
									pInf.iFmt	= REG_get_value( pTypKey, Prp_fmt);
								}
							}
							break;
						case 1:
							iIdx = REG_get_value(pTypKey, Prp_init);
							if((uint)iIdx >= (uint)nEnm) { throw new ApplicationException(); }
							goto case 2;
						case 2:
							if(iIdx == -1) {
								for(;;) {
									if( ++iIdx >= nEnm) { throw new ApplicationException(); }
									if(pEnm.Read() == iVal) { break; }
								}
							}
							do {
								bitarray_lsb1st_set(pPrpTbl, iBitPos, iBitLen, iIdx);
								iBitPos += iBitLen;
								if(nIndex != 0) { break; }
							} while(--iArraySize != 0);
							break;
						case 3:
							{
								int iAcc = iVal;
								iIdx = bitarray_lsb1st_get(pPrpTbl, iBitPos, iBitLen);
								if((uint)iIdx >= (uint)nEnm) { throw new ApplicationException(); }
								if(iAcc != 0) {
									iIdx += iAcc;
									if(iIdx <        0) { iIdx =        0; }
									if(iIdx > nEnm - 1) { iIdx = nEnm - 1; }
									bitarray_lsb1st_set(pPrpTbl, iBitPos, iBitLen, iIdx);
								}
								iVal = pEnm[iIdx];
							}
							break;
						}
					} else {
						throw new ApplicationException();
					}
					break;
				} else {
					pTblKey = REG_open_key(pPrpKey, iType);
					if(!pTblKey) { throw new ApplicationException(); }
					iBitLen = REG_get_value(pTblKey, Prp_len);
					if(iBitLen == -1) { throw new ApplicationException(); }
					iBitLen++;
					iOffset *= iBitLen;
					iBitPos += iOffset;
					if((iName = aName.MoveNext() ? aName.Current : -1) == -1) {
						if(iType == PrpTbl_Double) {
							if( iOp == 2                           ) {             PrpTbl_fset_v(pPrpKey, iType, pPrpTbl, iBitPos, (int)iVal, Enumerable.Empty<int>()); return 0; }
							if((iOp == 3) && (iVal == 0)) { return (int)PrpTbl_fget_v(pPrpKey, iType, pPrpTbl, iBitPos,            Enumerable.Empty<int>());                    }
						}
						switch(iOp) {
						default:throw new ApplicationException();
						case 0:
							{
								ST_PrpInf pInf = (ST_PrpInf)_iVal;
								pInf.iType	= iType;
								pInf.iBitPos	= iBitPos;
								pInf.pDim	= (nIndex != 0) ? null : REG_get_blob(pVarKey, Prp_dim);
								pInf.nDim	= REG_get_blob_size(pInf.pDim) >> 1;
								pInf.pName	= REG_get_string(pVarKey, Prp_name);
								pInf.pDesc	= REG_get_string(pVarKey, Prp_desc);
								pInf.pFmt	= REG_get_string(pVarKey, Prp_fmt);
								pInf.iFmt	= REG_get_value( pVarKey, Prp_fmt);
								if((pInf.pFmt == null) && (pInf.iFmt == -1)) {
									pInf.pFmt	= REG_get_string(pTblKey, Prp_fmt);
									pInf.iFmt	= REG_get_value( pTblKey, Prp_fmt);
								}
							}
							break;
						case 1:
							do {
								PrpTbl_init(pPrpKey, iType, pPrpTbl, iBitPos);
								iBitPos += iBitLen;
								if(nIndex != 0) { break; }
							} while(--iArraySize != 0);
							break;
						}
						break;
					}
				}
			}
			return iVal;
		}
		private static void PrpTbl_make_attr_mask(out VoidPtr fIncl, out VoidPtr fExcl, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			fIncl = bitarray_alloc(256);
			foreach(int iAttr in aIncl) {
				if((uint)iAttr > 255) { throw new ApplicationException(); }
				if(bitarray_lsb1st_get(fIncl, iAttr, 1) != 0) { throw new ApplicationException(); }
				bitarray_lsb1st_set(fIncl, iAttr, 1, 1);
			}
			fExcl = bitarray_alloc(256);
			foreach(int iAttr in aExcl) {
				if((uint)iAttr > 255) { throw new ApplicationException(); }
				if(bitarray_lsb1st_get(fExcl, iAttr, 1) != 0) { throw new ApplicationException(); }
				if(bitarray_lsb1st_get(fIncl, iAttr, 1) != 0) { throw new ApplicationException(); }
				bitarray_lsb1st_set(fExcl, iAttr, 1, 1);
			}
		}
		private static int PrpTbl_test_attr_mask(Int32Ptr fAttr, Int32Ptr fIncl, Int32Ptr fExcl) {
			int iAttr, iTest = 2;
			for(iAttr = 0; iAttr < (256/32); iAttr++) {
				if(( fAttr[iAttr] & fExcl[iAttr]) != 0) { return 0; }
				if((~fAttr[iAttr] & fIncl[iAttr]) != 0) { iTest = 1; }
			}
			return iTest;
		}
		private static VoidPtr PrpTbl_merge_attr_mask(VoidPtr pVarKey, VoidPtr fInhe) {
			VoidPtr fAttr = bitarray_alloc(256);
			bitarray_lsb1st_copy(fAttr, 0, fInhe, 0, 256);
			BytePtr pAttr = REG_get_blob(pVarKey, Prp_attr);
			if(pAttr) {
				int nAttr = REG_get_blob_size(pAttr);
				while(--nAttr >= 0) {
					int iAttr = pAttr.Read();
					bitarray_lsb1st_set(fAttr, iAttr, 1, 1);
				}
			}
			return fAttr;
		}
		private static void PrpTbl_init_copy_attr_subr(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTblDst, int iBitPosDst, VoidPtr pPrpTblSrc, int iBitPosSrc, VoidPtr fInhe, VoidPtr fIncl, VoidPtr fExcl) {
			VoidPtr pTblKey, pVarKey;
			int i;
			int[] aName = new int[1];
			pTblKey = REG_open_key(pPrpKey, iTbl);
			if(!pTblKey) { throw new ApplicationException(); }
			for(i = 0;
			   (pVarKey = REG_open_nth_key(pTblKey, i, out aName[0])) != null;
			    i++) {
				int iType, iBitLen, iBitPos, iArraySize, iTest;
				UInt16Ptr pDim;
				VoidPtr fAttr;
				iType = REG_get_value(pVarKey, Prp_type);
				if(iType != -1) {
					VoidPtr pTblOrTypKey = REG_open_key(pPrpKey, iType);
					if(!pTblOrTypKey) { throw new ApplicationException(); }
					iBitLen = REG_get_value(pTblOrTypKey, Prp_len);
					if(iBitLen == -1) { throw new ApplicationException(); }
					iBitLen++;
				} else {
					iBitLen = 32;
				}
				iBitPos = REG_get_value(pVarKey, Prp_pos);
				if(iBitPos == -1) { throw new ApplicationException(); }
				iArraySize = 1;
				pDim = REG_get_blob(pVarKey, Prp_dim);
				if(pDim) {
					int nDim = REG_get_blob_size(pDim);
					if((nDim & 1) != 0) { throw new ApplicationException(); }
					nDim >>= 1;
					do {
						int iBound = pDim.Read();
						iBound++;
						iArraySize *= iBound;
					} while(--nDim != 0);
				}
				fAttr = PrpTbl_merge_attr_mask(pVarKey, fInhe);
				iTest = PrpTbl_test_attr_mask(fAttr, fIncl, fExcl);
				if((uint)iType <= 0x7FFF) {
					if(iTest >= 1) {
						do {
							PrpTbl_init_copy_attr_subr(pPrpKey, iType, pPrpTblDst, iBitPosDst + iBitPos,
												   pPrpTblSrc, iBitPosSrc + iBitPos, fAttr, fIncl, fExcl);
							iBitPos += iBitLen;
						} while(--iArraySize != 0);
					}
				} else {
					if(iTest == 2) {
						if(pPrpTblSrc) {
							bitarray_lsb1st_copy(pPrpTblDst, iBitPosDst + iBitPos,
									     pPrpTblSrc, iBitPosSrc + iBitPos, iBitLen * iArraySize);
						} else {
							PrpTbl_op_v(pPrpKey, iTbl, pPrpTblDst, iBitPosDst, 0, aName, 1);
						}
					}
				}
			}
		}
		private static bool PrpTbl_list_subr(VoidPtr pPrpKey, int iTbl, Func<int,IEnumerable<int>,string,object,bool> callback, List<int> aName, StringBuilder sPath, object arg) {
			int i, iNameLen, iPathLen1, iName;
			VoidPtr pTblKey, pVarKey;
			iNameLen = aName.Count;
			iPathLen1 = sPath.Length;
			pTblKey = REG_open_key(pPrpKey, iTbl);
			if(!pTblKey) { throw new ApplicationException(); }
			for(i = 0;
			   (pVarKey = REG_open_nth_key(pTblKey, i, out iName)) != null;
			    i++) {
				int iType;
				string pName;
				UInt16Ptr pDim;
				aName.Add(iName);
				pName = REG_get_string(pVarKey, Prp_name);
				pName = pName ?? iName.ToString();
				sPath.Append(pName);
				iType = REG_get_value(pVarKey, Prp_type);
				pDim = REG_get_blob(pVarKey, Prp_dim);
				if(pDim) {
					int nDim, iDim, iPathLen2;
					iPathLen2 = sPath.Length;
					nDim = REG_get_blob_size(pDim);
					if((nDim & 1) != 0) { throw new ApplicationException(); }
					nDim >>= 1;
					pDim--;
					for(iDim = 1; iDim <= nDim; iDim++) { aName.Add(0); }
					do {
						sPath.Append('[');
						for(iDim = 1; iDim <= nDim; iDim++) {
							if(iDim != 1) { sPath.Append(','); }
							sPath.Append(aName[iNameLen + iDim]);
						}
						sPath.Append(']');
						if((uint)iType <= 0x7FFF) {
							if(iType == PrpTbl_Double) {
								if(callback.Invoke(iType, aName, sPath.ToString(), arg)) { return true; }
							} else {
								if(callback.Invoke(iType, aName, sPath.ToString(), arg)) { return true; }
								sPath.Append('.');
								if(PrpTbl_list_subr(pPrpKey, iType, callback, aName, sPath, arg)) { return true; }
							}
						} else {
							if(callback.Invoke(iType, aName, sPath.ToString(), arg)) { return true; }
						}
						sPath.Length = iPathLen2;
						for(iDim = nDim; iDim >= 1; iDim--) {
							int iBound = pDim[iDim];
							    iBound++;
							if(++aName[iNameLen + iDim] < iBound) { break; }
							     aName[iNameLen + iDim] = 0;
						}
					} while(iDim != 0);
				} else {
					if((uint)iType <= 0x7FFF) {
						if(iType == PrpTbl_Double) {
							if(callback.Invoke(iType, aName, sPath.ToString(), arg)) { return true; }
						} else {
							if(callback.Invoke(iType, aName, sPath.ToString(), arg)) { return true; }
							sPath.Append('.');
							if(PrpTbl_list_subr(pPrpKey, iType, callback, aName, sPath, arg)) { return true; }
						}
					} else {
						if(callback.Invoke(iType, aName, sPath.ToString(), arg)) { return true; }
					}
				}
				sPath.Length = iPathLen1;
				aName.RemoveRange(iNameLen, aName.Count - iNameLen);
			}
			return false;
		}
		private class ST_PrpDmp {
			public TextWriter	fp;
			public VoidPtr		pPrpKey;
			public int		iTbl;
			public VoidPtr		pPrpTbl;
			public int		iBitPos;
			public Func<int,int,string> fnVarFmt;
			public int		fOpt;
			public int		maxDepth;
		}
		private static bool PrpTbl_dump_maxDepth(int iType, IEnumerable<int> aName, string sPath, object arg) {
			ST_PrpDmp pDmp = (ST_PrpDmp)arg;
			int depth = sPath.Where(c => (c == '.')).Count();
			if(depth > pDmp.maxDepth) { pDmp.maxDepth = depth; }
			return false;
		}
		private static bool PrpTbl_dump_callback(int iType, IEnumerable<int> aName, string sPath, object arg) {
			ST_PrpDmp pDmp = (ST_PrpDmp)arg;
			string pName;
			ST_PrpInf stPrpInf;
			int p1 = 0, p2;
			int depth = 0;
			stPrpInf = PrpTbl_inf_v(pDmp.pPrpKey, pDmp.iTbl, aName);
			if(stPrpInf.iType != iType) { throw new ApplicationException(); }
			if((pDmp.fOpt & PrpDmp_Vbs) != 0) {
				if(iType == -1) {
					pName = "var";
				} else if(iType == PrpTbl_Double) {
					pName = "Double";
				} else if((pName = REG_get_string_l(pDmp.pPrpKey, iType, Prp_name)) == null) {
					pName = iType.ToString();
				}
				pDmp.fp.Write("{0}\t{1}\t", stPrpInf.iBitPos, pName);
			}
			while((p2 = sPath.IndexOf('.', p1)) != -1) {
				pDmp.fp.Write('\t');
				depth++;
				p1 = p2 + 1;
			}
			pDmp.fp.Write(sPath.Substring(p1));
			if((uint)iType <= 0x7FFF) {
				if(iType == PrpTbl_Double) {
					while(depth < pDmp.maxDepth) {
						pDmp.fp.Write('\t');
						depth++;
					}
					pDmp.fp.Write("\t= ");
					pDmp.fp.Write(PrpTbl_ffmt_v(pDmp.pPrpKey, pDmp.iTbl, pDmp.pPrpTbl, pDmp.iBitPos, aName));
					depth++;
				}
			} else {
				while(depth < pDmp.maxDepth) {
					pDmp.fp.Write('\t');
					depth++;
				}
				pDmp.fp.Write("\t= ");
				pDmp.fp.Write(PrpTbl_fmt_v(pDmp.pPrpKey, pDmp.iTbl, pDmp.pPrpTbl, pDmp.iBitPos, pDmp.fnVarFmt, aName));
				depth++;
			}
			if(stPrpInf.pDesc != null) {
				while(depth < (pDmp.maxDepth + 1)) {
					pDmp.fp.Write('\t');
					depth++;
				}
				pDmp.fp.Write("\t#//{0}", stPrpInf.pDesc);
			}
			pDmp.fp.Write('\n');
			return false;
		}
		private static bool PrpTbl_dump_abs_callback(int iType, IEnumerable<int> aName, string sPath, object arg) {
			ST_PrpDmp pDmp = (ST_PrpDmp)arg;
			string pName;
			ST_PrpInf stPrpInf;
			stPrpInf = PrpTbl_inf_v(pDmp.pPrpKey, pDmp.iTbl, aName);
			if(stPrpInf.iType != iType) { throw new ApplicationException(); }
			if((uint)iType <= 0x7FFF) {
				if(iType == PrpTbl_Double) {
					if((pDmp.fOpt & PrpDmp_Vbs) != 0) {
						pName = "Double";
						pDmp.fp.Write("{0}\t{1}\t", stPrpInf.iBitPos, pName);
					}
					pDmp.fp.Write(sPath);
					pDmp.fp.Write("\t= ");
					pDmp.fp.Write(PrpTbl_ffmt_v(pDmp.pPrpKey, pDmp.iTbl, pDmp.pPrpTbl, pDmp.iBitPos, aName));
					if(stPrpInf.pDesc != null) { pDmp.fp.Write("\t#//{0}", stPrpInf.pDesc); }
					pDmp.fp.Write('\n');
				}
			} else {
				if((pDmp.fOpt & PrpDmp_Vbs) != 0) {
					if(iType == -1) {
						pName = "var";
					} else if((pName = REG_get_string_l(pDmp.pPrpKey, iType, Prp_name)) == null) {
						pName = iType.ToString();
					}
					pDmp.fp.Write("{0}\t{1}\t", stPrpInf.iBitPos, pName);
				}
				pDmp.fp.Write(sPath);
				pDmp.fp.Write("\t= ");
				pDmp.fp.Write(PrpTbl_fmt_v(pDmp.pPrpKey, pDmp.iTbl, pDmp.pPrpTbl, pDmp.iBitPos, pDmp.fnVarFmt, aName));
				if(stPrpInf.pDesc != null) { pDmp.fp.Write("\t#//{0}", stPrpInf.pDesc); }
				pDmp.fp.Write('\n');
			}
			return false;
		}
		public static VoidPtr PrpTbl_new(VoidPtr pPrpKey, int iTbl) {
			VoidPtr pPrpTbl, pTblKey;
			int iBitLen;
			pTblKey = REG_open_key(pPrpKey, iTbl);
			if(!pTblKey) { throw new ApplicationException(); }
			iBitLen = REG_get_value(pTblKey, Prp_len);
			if(iBitLen == -1) { throw new ApplicationException(); }
			iBitLen++;
			pPrpTbl = bitarray_alloc(iBitLen);
			if(!pPrpTbl) { throw new ApplicationException(); }
			PrpTbl_init(pPrpKey, iTbl, pPrpTbl, 0);
			return pPrpTbl;
		}
		public static void PrpTbl_init(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos) {
			VoidPtr pTblKey;
			int i;
			int[] aName = new int[1];
			pTblKey = REG_open_key(pPrpKey, iTbl);
			if(!pTblKey) { throw new ApplicationException(); }
			for(i = 0;
			    REG_open_nth_key(pTblKey, i, out aName[0]);
			    i++) {
				PrpTbl_op_v(pPrpKey, iTbl, pPrpTbl, iBitPos, 0, aName, 1);
			}
		}
		public static void PrpTbl_init_attr(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iAttr) {
			PrpTbl_init_attr_v(pPrpKey, iTbl, pPrpTbl, iBitPos, new int[] { iAttr }, new int[] { });
		}
		public static void PrpTbl_init_attr_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			VoidPtr fIncl, fExcl;
			PrpTbl_make_attr_mask(out fIncl, out fExcl, aIncl, aExcl);
			PrpTbl_init_copy_attr_subr(pPrpKey, iTbl, pPrpTbl, iBitPos, null, 0, bitarray_alloc(256), fIncl, fExcl);
		}
		public static void PrpTbl_copy_attr(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTblDst, int iBitPosDst, VoidPtr pPrpTblSrc,int iBitPosSrc, int iAttr) {
			PrpTbl_copy_attr_v(pPrpKey, iTbl, pPrpTblDst, iBitPosDst, pPrpTblSrc, iBitPosSrc, new int[] { iAttr }, new int[] { });
		}
		public static void PrpTbl_copy_attr_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTblDst, int iBitPosDst, VoidPtr pPrpTblSrc, int iBitPosSrc, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			VoidPtr fIncl, fExcl;
			PrpTbl_make_attr_mask(out fIncl, out fExcl, aIncl, aExcl);
			PrpTbl_init_copy_attr_subr(pPrpKey, iTbl, pPrpTblDst, iBitPosDst, pPrpTblSrc, iBitPosSrc, bitarray_alloc(256), fIncl, fExcl);
		}
		public static void PrpTbl_init_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, params int[] aName) {
			PrpTbl_init_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName);
		}
		public static void PrpTbl_init_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, IEnumerable<int> aName) {
			if(!aName.GetEnumerator().MoveNext()) { PrpTbl_init(pPrpKey, iTbl, pPrpTbl, iBitPos); return; }
			PrpTbl_op_v(pPrpKey, iTbl, pPrpTbl, iBitPos, 0, aName, 1);
		}
		public static void PrpTbl_init_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sFmt, params object[] args) {
			PrpTbl_init_p(pPrpKey, iTbl, pPrpTbl, iBitPos, string.Format(sFmt, args));
		}
		public static void PrpTbl_init_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sPath) {
			PrpTbl_init_v(pPrpKey, iTbl, pPrpTbl, iBitPos, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static void PrpTbl_set_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iNewVal, params int[] aName) {
			PrpTbl_set_v(pPrpKey, iTbl, pPrpTbl, iBitPos, iNewVal, aName);
		}
		public static void PrpTbl_set_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iNewVal, IEnumerable<int> aName) {
			PrpTbl_op_v(pPrpKey, iTbl, pPrpTbl, iBitPos, iNewVal, aName, 2);
		}
		public static void PrpTbl_set_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iNewVal, string sFmt, params object[] args) {
			PrpTbl_set_p(pPrpKey, iTbl, pPrpTbl, iBitPos, iNewVal, string.Format(sFmt, args));
		}
		public static void PrpTbl_set_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iNewVal, string sPath) {
			PrpTbl_set_v(pPrpKey, iTbl, pPrpTbl, iBitPos, iNewVal, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static int PrpTbl_get_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, params int[] aName) {
			return PrpTbl_get_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName);
		}
		public static int PrpTbl_get_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, IEnumerable<int> aName) {
			return PrpTbl_op_v(pPrpKey, iTbl, pPrpTbl, iBitPos, 0, aName, 3);
		}
		public static int PrpTbl_get_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sFmt, params object[] args) {
			return PrpTbl_get_p(pPrpKey, iTbl, pPrpTbl, iBitPos, string.Format(sFmt, args));
		}
		public static int PrpTbl_get_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sPath) {
			return PrpTbl_get_v(pPrpKey, iTbl, pPrpTbl, iBitPos, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static int PrpTbl_acc_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iAcc, params int[] aName) {
			return PrpTbl_acc_v(pPrpKey, iTbl, pPrpTbl, iBitPos, iAcc, aName);
		}
		public static int PrpTbl_acc_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iAcc, IEnumerable<int> aName) {
			return PrpTbl_op_v(pPrpKey, iTbl, pPrpTbl, iBitPos, iAcc, aName, 3);
		}
		public static int PrpTbl_acc_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iAcc, string sFmt, params object[] args) {
			return PrpTbl_acc_p(pPrpKey, iTbl, pPrpTbl, iBitPos, iAcc, string.Format(sFmt, args));
		}
		public static int PrpTbl_acc_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, int iAcc, string sPath) {
			return PrpTbl_acc_v(pPrpKey, iTbl, pPrpTbl, iBitPos, iAcc, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public class ST_PrpInf {
			public int		iType;
			public int		iBitPos;
			public int		nDim;
			public UInt16Ptr	pDim;
			public string		pName;
			public string		pDesc;
			public string		pFmt;
			public int		iFmt;
		}
		public static ST_PrpInf PrpTbl_inf_l(VoidPtr pPrpKey, int iTbl, params int[] aName) {
			return PrpTbl_inf_v(pPrpKey, iTbl, aName);
		}
		public static ST_PrpInf PrpTbl_inf_v(VoidPtr pPrpKey, int iTbl, IEnumerable<int> aName) {
			ST_PrpInf pInf = new ST_PrpInf();
			PrpTbl_op_v(pPrpKey, iTbl, null, 0, pInf, aName, 0);
			return pInf;
		}
		public static ST_PrpInf PrpTbl_inf_f(VoidPtr pPrpKey, int iTbl, string sFmt, params object[] args) {
			return PrpTbl_inf_p(pPrpKey, iTbl, string.Format(sFmt, args));
		}
		public static ST_PrpInf PrpTbl_inf_p(VoidPtr pPrpKey, int iTbl, string sPath) {
			return PrpTbl_inf_v(pPrpKey, iTbl, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static string PrpTbl_fmt_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, Func<int,int,string> fnVarFmt, params int[] aName) {
			return PrpTbl_fmt_v(pPrpKey, iTbl, pPrpTbl, iBitPos, fnVarFmt, aName);
		}
		public static string PrpTbl_fmt_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, Func<int,int,string> fnVarFmt, IEnumerable<int> aName) {
			int iVal = PrpTbl_get_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName);
			ST_PrpInf stPrpInf = PrpTbl_inf_v(pPrpKey, iTbl, aName);
			if((stPrpInf.pFmt != null) && (stPrpInf.iFmt != -1)) { throw new ApplicationException(); }
			if(stPrpInf.pFmt != null) {
				return iVal.ToString(stPrpInf.pFmt);
			} else if((stPrpInf.iFmt != -1) && (fnVarFmt != null)) {
				return fnVarFmt.Invoke(stPrpInf.iFmt, iVal);
			} else {
				return iVal.ToString();
			}
		}
		public static string PrpTbl_fmt_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, Func<int,int,string> fnVarFmt, string sFmt, params object[] args) {
			return PrpTbl_fmt_p(pPrpKey, iTbl, pPrpTbl, iBitPos, fnVarFmt, string.Format(sFmt, args));
		}
		public static string PrpTbl_fmt_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, Func<int,int,string> fnVarFmt, string sPath) {
			return PrpTbl_fmt_v(pPrpKey, iTbl, pPrpTbl, iBitPos, fnVarFmt, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static void PrpTbl_fset_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, double dNewVal, params int[] aName) {
			PrpTbl_fset_v(pPrpKey, iTbl, pPrpTbl, iBitPos, dNewVal, aName);
		}
		public static void PrpTbl_fset_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, double dNewVal, IEnumerable<int> aName) {
			List<int> aName2 = new List<int>(aName);
			long lNewVal = BitConverter.DoubleToInt64Bits(dNewVal);
			aName2.Add(1);
			PrpTbl_set_v(pPrpKey, iTbl, pPrpTbl, iBitPos, (int)lNewVal, aName2);
			aName2[aName2.Count - 1] = 2;
			PrpTbl_set_v(pPrpKey, iTbl, pPrpTbl, iBitPos, (int)(lNewVal >> 32), aName2);
		}
		public static void PrpTbl_fset_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, double dNewVal, string sFmt, params object[] args) {
			PrpTbl_fset_p(pPrpKey, iTbl, pPrpTbl, iBitPos, dNewVal, string.Format(sFmt, args));
		}
		public static void PrpTbl_fset_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, double dNewVal, string sPath) {
			PrpTbl_fset_v(pPrpKey, iTbl, pPrpTbl, iBitPos, dNewVal, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static double PrpTbl_fget_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, params int[] aName) {
			return PrpTbl_fget_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName);
		}
		public static double PrpTbl_fget_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, IEnumerable<int> aName) {
			List<int> aName2 = new List<int>(aName);
			aName2.Add(1);
			long lo = (uint)PrpTbl_get_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName2);
			aName2[aName2.Count - 1] = 2;
			long hi = (uint)PrpTbl_get_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName2);
			return BitConverter.Int64BitsToDouble(lo | (hi << 32));
		}
		public static double PrpTbl_fget_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sFmt, params object[] args) {
			return PrpTbl_fget_p(pPrpKey, iTbl, pPrpTbl, iBitPos, string.Format(sFmt, args));
		}
		public static double PrpTbl_fget_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sPath) {
			return PrpTbl_fget_v(pPrpKey, iTbl, pPrpTbl, iBitPos, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static string PrpTbl_ffmt_l(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, params int[] aName) {
			return PrpTbl_ffmt_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName);
		}
		public static string PrpTbl_ffmt_v(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, IEnumerable<int> aName) {
			double dVal = PrpTbl_fget_v(pPrpKey, iTbl, pPrpTbl, iBitPos, aName);
			ST_PrpInf stPrpInf = PrpTbl_inf_v(pPrpKey, iTbl, aName);
			if(stPrpInf.iFmt != -1) { throw new ApplicationException(); }
			if(stPrpInf.pFmt != null) {
				return dVal.ToString(stPrpInf.pFmt);
			} else {
				return dVal.ToString();
			}
		}
		public static string PrpTbl_ffmt_f(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sFmt, params object[] args) {
			return PrpTbl_ffmt_p(pPrpKey, iTbl, pPrpTbl, iBitPos, string.Format(sFmt, args));
		}
		public static string PrpTbl_ffmt_p(VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, string sPath) {
			return PrpTbl_ffmt_v(pPrpKey, iTbl, pPrpTbl, iBitPos, PrpTbl_path_p(pPrpKey, iTbl, sPath));
		}
		public static IEnumerable<int> PrpTbl_path_f(VoidPtr pPrpKey, int iTbl, string sFmt, params object[] args) {
			return PrpTbl_path_p(pPrpKey, iTbl, string.Format(sFmt, args));
		}
		public static IEnumerable<int> PrpTbl_path_p(VoidPtr pPrpKey, int iTbl, string sPath) {
			return PrpTbl_path_p_subr(pPrpKey, iTbl, sPath);
		}
		private static List<int> PrpTbl_path_p_subr(VoidPtr pPrpKey, int iTbl, StringPtr sPath) {
			List<int> aName = new List<int>();
			int iType = iTbl;
			if(sPath[0] != '\0') {
				for(;;) {
					VoidPtr pTblKey, pVarKey;
					int len, i, c, iName;
#if     DEBUG
					UInt16Ptr pDim;
					int nDim;
#endif
					pTblKey = REG_open_key(pPrpKey, iType);
					if(!pTblKey) { throw new ApplicationException(); }
					len = strcspn(sPath, ".[");
					if(len == 0) { throw new ApplicationException(); }
					for(i = 0;
					   (pVarKey = REG_open_nth_key(pTblKey, i, out iName)) != null;
					    i++) {
						string pName = REG_get_string(pVarKey, Prp_name);
						pName = pName ?? iName.ToString();
						if((pName.Length == len) && (strncmp(sPath, pName, len) == 0)) { break; }
					}
					if(!pVarKey) { throw new ApplicationException(); }
					iType = REG_get_value(pVarKey, Prp_type);
					aName.Add(iName);
#if     DEBUG
					pDim = REG_get_blob(pVarKey, Prp_dim);
					nDim = REG_get_blob_size(pDim);
					if((nDim & 1) != 0) { throw new ApplicationException(); }
					nDim >>= 1;
#endif
					sPath += len;
					c = sPath.Read();
					if(c == '[') {
						for(;;) {
							StringPtr endptr;
							if(!isdigit(sPath[0])) { throw new ApplicationException(); }
							i = (int)strtoul(sPath, out endptr, 0);
#if     DEBUG
							if(--nDim < 0) { throw new ApplicationException(); }
							if(i > pDim.Read()) { throw new ApplicationException(); }
#endif
							aName.Add(i);
							sPath = endptr;
							c = sPath.Read();
							if(c == ']') { break; }
							if(c != ',') { throw new ApplicationException(); }
						}
#if     DEBUG
						if(nDim != 0) { throw new ApplicationException(); }
#endif
						c = sPath.Read();
					}
					if(c == 0) { break; }
					if(c != '.') { throw new ApplicationException(); }
					if((uint)iType > 0x7FFF) { throw new ApplicationException(); }
#if     DEBUG
					if(nDim != 0) { throw new ApplicationException(); }
#endif
				}
			}
			return aName;
		}
		public static bool PrpTbl_list(VoidPtr pPrpKey, int iTbl, Func<int,IEnumerable<int>,string,object,bool> callback, object arg) {
			IEnumerable<int> aName;
			string sPath;
			return PrpTbl_list(pPrpKey, iTbl, callback, out aName, out sPath, arg);
		}
		public static bool PrpTbl_list(VoidPtr pPrpKey, int iTbl, Func<int,IEnumerable<int>,string,object,bool> callback, out IEnumerable<int> aName, object arg) {
			string sPath;
			return PrpTbl_list(pPrpKey, iTbl, callback, out aName, out sPath, arg);
		}
		public static bool PrpTbl_list(VoidPtr pPrpKey, int iTbl, Func<int,IEnumerable<int>,string,object,bool> callback, out string sPath, object arg) {
			IEnumerable<int> aName;
			return PrpTbl_list(pPrpKey, iTbl, callback, out aName, out sPath, arg);
		}
		public static bool PrpTbl_list(VoidPtr pPrpKey, int iTbl, Func<int,IEnumerable<int>,string,object,bool> callback, out IEnumerable<int> aName, out string sPath, object arg) {
			List<int> _aName = new List<int>();
			StringBuilder _sPath = new StringBuilder();
			bool retVal = PrpTbl_list_subr(pPrpKey, iTbl, callback, _aName, _sPath, arg);
			aName = _aName;
			sPath = _sPath.ToString();
			return retVal;
		}
		public const int PrpDmp_Abs	= (1<<0);
		public const int PrpDmp_Vbs	= (1<<1);
		public static void PrpTbl_dump(TextWriter fp, VoidPtr pPrpKey, int iTbl, VoidPtr pPrpTbl, int iBitPos, Func<int,int,string> fnVarFmt, int fOpt) {
			ST_PrpDmp stPrpDmp = new ST_PrpDmp();
			stPrpDmp.fp		= fp;
			stPrpDmp.pPrpKey	= pPrpKey;
			stPrpDmp.iTbl		= iTbl;
			stPrpDmp.pPrpTbl	= pPrpTbl;
			stPrpDmp.iBitPos	= iBitPos;
			stPrpDmp.fnVarFmt	= fnVarFmt;
			stPrpDmp.fOpt		= fOpt;
			if((fOpt & PrpDmp_Abs) != 0) {
				PrpTbl_list(pPrpKey, iTbl, PrpTbl_dump_abs_callback, stPrpDmp);
			} else {
				PrpTbl_list(pPrpKey, iTbl, PrpTbl_dump_maxDepth, stPrpDmp);
				PrpTbl_list(pPrpKey, iTbl, PrpTbl_dump_callback, stPrpDmp);
			}
		}
		public class ST_PrpHdr {
			public VoidPtr		pPrpKey;
			public int		iTbl;
			public VoidPtr		pPrpTbl;
		}
		public static ST_PrpHdr PrpHdr_new(VoidPtr pPrpKey, int iTbl) {
			ST_PrpHdr pPrpHdr;
			VoidPtr pTblKey;
			int iBitLen;
			pTblKey = REG_open_key(pPrpKey, iTbl);
			if(!pTblKey) { throw new ApplicationException(); }
			iBitLen = REG_get_value(pTblKey, Prp_len);
			if(iBitLen == -1) { throw new ApplicationException(); }
			iBitLen++;
			pPrpHdr = new ST_PrpHdr();
			pPrpHdr.pPrpTbl = bitarray_alloc(iBitLen);
			PrpHdr_init(pPrpHdr, pPrpKey, iTbl);
			return pPrpHdr;
		}
		public static void PrpHdr_init(ST_PrpHdr pPrpHdr, VoidPtr pPrpKey, int iTbl) {
			pPrpHdr.pPrpKey	= pPrpKey;
			pPrpHdr.iTbl	= iTbl;
			PrpTbl_init(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0);
		}
		public static void PrpHdr_init_attr(ST_PrpHdr pPrpHdr, int iAttr) {
			PrpHdr_init_attr_v(pPrpHdr, new int[] { iAttr }, new int[] { });
		}
		public static void PrpHdr_init_attr_v(ST_PrpHdr pPrpHdr, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			PrpTbl_init_attr_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, aIncl, aExcl);
		}
		public static void PrpHdr_copy_attr(ST_PrpHdr pPrpHdrDst, ST_PrpHdr pPrpHdrSrc, int iAttr) {
			PrpHdr_copy_attr_v(pPrpHdrDst, pPrpHdrSrc, new int[] { iAttr }, new int[] { });
		}
		public static void PrpHdr_copy_attr_v(ST_PrpHdr pPrpHdrDst, ST_PrpHdr pPrpHdrSrc, IEnumerable<int> aIncl, IEnumerable<int> aExcl) {
			if((pPrpHdrDst.pPrpKey != pPrpHdrSrc.pPrpKey) ||
			   (pPrpHdrDst.iTbl    != pPrpHdrSrc.iTbl   )) { throw new ApplicationException(); }
			PrpTbl_copy_attr_v(pPrpHdrDst.pPrpKey, pPrpHdrDst.iTbl, pPrpHdrDst.pPrpTbl, 0,
			                                                        pPrpHdrSrc.pPrpTbl, 0, aIncl, aExcl);
		}
		public static void PrpHdr_init_l(ST_PrpHdr pPrpHdr, params int[] aName) {
			PrpHdr_init_v(pPrpHdr, aName);
		}
		public static void PrpHdr_init_v(ST_PrpHdr pPrpHdr, IEnumerable<int> aName) {
			PrpTbl_init_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, aName);
		}
		public static void PrpHdr_init_f(ST_PrpHdr pPrpHdr, string sFmt, params object[] args) {
			PrpHdr_init_p(pPrpHdr, string.Format(sFmt, args));
		}
		public static void PrpHdr_init_p(ST_PrpHdr pPrpHdr, string sPath) {
			PrpTbl_init_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, sPath);
		}
		public static void PrpHdr_set_l(ST_PrpHdr pPrpHdr, int iNewVal, params int[] aName) {
			PrpHdr_set_v(pPrpHdr, iNewVal, aName);
		}
		public static void PrpHdr_set_v(ST_PrpHdr pPrpHdr, int iNewVal, IEnumerable<int> aName) {
			PrpTbl_set_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, iNewVal, aName);
		}
		public static void PrpHdr_set_f(ST_PrpHdr pPrpHdr, int iNewVal, string sFmt, params object[] args) {
			PrpHdr_set_p(pPrpHdr, iNewVal, string.Format(sFmt, args));
		}
		public static void PrpHdr_set_p(ST_PrpHdr pPrpHdr, int iNewVal, string sPath) {
			PrpTbl_set_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, iNewVal, sPath);
		}
		public static int PrpHdr_get_l(ST_PrpHdr pPrpHdr, params int[] aName) {
			return PrpHdr_get_v(pPrpHdr, aName);
		}
		public static int PrpHdr_get_v(ST_PrpHdr pPrpHdr, IEnumerable<int> aName) {
			return PrpTbl_get_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, aName);
		}
		public static int PrpHdr_get_f(ST_PrpHdr pPrpHdr, string sFmt, params object[] args) {
			return PrpHdr_get_p(pPrpHdr, string.Format(sFmt, args));
		}
		public static int PrpHdr_get_p(ST_PrpHdr pPrpHdr, string sPath) {
			return PrpTbl_get_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, sPath);
		}
		public static int PrpHdr_acc_l(ST_PrpHdr pPrpHdr, int iAcc, params int[] aName) {
			return PrpHdr_acc_v(pPrpHdr, iAcc, aName);
		}
		public static int PrpHdr_acc_v(ST_PrpHdr pPrpHdr, int iAcc, IEnumerable<int> aName) {
			return PrpTbl_acc_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, iAcc, aName);
		}
		public static int PrpHdr_acc_f(ST_PrpHdr pPrpHdr, int iAcc, string sFmt, params object[] args) {
			return PrpHdr_acc_p(pPrpHdr, iAcc, string.Format(sFmt, args));
		}
		public static int PrpHdr_acc_p(ST_PrpHdr pPrpHdr, int iAcc, string sPath) {
			return PrpTbl_acc_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, iAcc, sPath);
		}
		public static ST_PrpInf PrpHdr_inf_l(ST_PrpHdr pPrpHdr, params int[] aName) {
			return PrpHdr_inf_v(pPrpHdr, aName);
		}
		public static ST_PrpInf PrpHdr_inf_v(ST_PrpHdr pPrpHdr, IEnumerable<int> aName) {
			return PrpTbl_inf_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, aName);
		}
		public static ST_PrpInf PrpHdr_inf_f(ST_PrpHdr pPrpHdr, string sFmt, params object[] args) {
			return PrpHdr_inf_p(pPrpHdr, string.Format(sFmt, args));
		}
		public static ST_PrpInf PrpHdr_inf_p(ST_PrpHdr pPrpHdr, string sPath) {
			return PrpTbl_inf_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, sPath);
		}
		public static string PrpHdr_fmt_l(ST_PrpHdr pPrpHdr, Func<int,int,string> fnVarFmt, params int[] aName) {
			return PrpHdr_fmt_v(pPrpHdr, fnVarFmt, aName);
		}
		public static string PrpHdr_fmt_v(ST_PrpHdr pPrpHdr, Func<int,int,string> fnVarFmt, IEnumerable<int> aName) {
			return PrpTbl_fmt_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, fnVarFmt, aName);
		}
		public static string PrpHdr_fmt_f(ST_PrpHdr pPrpHdr, Func<int,int,string> fnVarFmt, string sFmt, params object[] args) {
			return PrpHdr_fmt_p(pPrpHdr, fnVarFmt, string.Format(sFmt, args));
		}
		public static string PrpHdr_fmt_p(ST_PrpHdr pPrpHdr, Func<int,int,string> fnVarFmt, string sPath) {
			return PrpTbl_fmt_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, fnVarFmt, sPath);
		}
		public static void PrpHdr_fset_l(ST_PrpHdr pPrpHdr, double dNewVal, params int[] aName) {
			PrpHdr_fset_v(pPrpHdr, dNewVal, aName);
		}
		public static void PrpHdr_fset_v(ST_PrpHdr pPrpHdr, double dNewVal, IEnumerable<int> aName) {
			PrpTbl_fset_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, dNewVal, aName);
		}
		public static void PrpHdr_fset_f(ST_PrpHdr pPrpHdr, double dNewVal, string sFmt, params object[] args) {
			PrpHdr_fset_p(pPrpHdr, dNewVal, string.Format(sFmt, args));
		}
		public static void PrpHdr_fset_p(ST_PrpHdr pPrpHdr, double dNewVal, string sPath) {
			PrpTbl_fset_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, dNewVal, sPath);
		}
		public static double PrpHdr_fget_l(ST_PrpHdr pPrpHdr, params int[] aName) {
			return PrpHdr_fget_v(pPrpHdr, aName);
		}
		public static double PrpHdr_fget_v(ST_PrpHdr pPrpHdr, IEnumerable<int> aName) {
			return PrpTbl_fget_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, aName);
		}
		public static double PrpHdr_fget_f(ST_PrpHdr pPrpHdr, string sFmt, params object[] args) {
			return PrpHdr_fget_p(pPrpHdr, string.Format(sFmt, args));
		}
		public static double PrpHdr_fget_p(ST_PrpHdr pPrpHdr, string sPath) {
			return PrpTbl_fget_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, sPath);
		}
		public static string PrpHdr_ffmt_l(ST_PrpHdr pPrpHdr, params int[] aName) {
			return PrpHdr_ffmt_v(pPrpHdr, aName);
		}
		public static string PrpHdr_ffmt_v(ST_PrpHdr pPrpHdr, IEnumerable<int> aName) {
			return PrpTbl_ffmt_v(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, aName);
		}
		public static string PrpHdr_ffmt_f(ST_PrpHdr pPrpHdr, string sFmt, params object[] args) {
			return PrpHdr_ffmt_p(pPrpHdr, string.Format(sFmt, args));
		}
		public static string PrpHdr_ffmt_p(ST_PrpHdr pPrpHdr, string sPath) {
			return PrpTbl_ffmt_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, sPath);
		}
		public static IEnumerable<int> PrpHdr_path_f(ST_PrpHdr pPrpHdr, string sFmt, params object[] args) {
			return PrpHdr_path_p(pPrpHdr, string.Format(sFmt, args));
		}
		public static IEnumerable<int> PrpHdr_path_p(ST_PrpHdr pPrpHdr, string sPath) {
			return PrpTbl_path_p(pPrpHdr.pPrpKey, pPrpHdr.iTbl, sPath);
		}
		public static bool PrpHdr_list(ST_PrpHdr pPrpHdr, Func<int,IEnumerable<int>,string,object,bool> callback, out IEnumerable<int> aName, out string sPath, object arg) {
			return PrpTbl_list(pPrpHdr.pPrpKey, pPrpHdr.iTbl, callback, out aName, out sPath, arg);
		}
		public static void PrpHdr_dump(TextWriter fp, ST_PrpHdr pPrpHdr, Func<int,int,string> fnVarFmt, int fOpt) {
			PrpTbl_dump(fp, pPrpHdr.pPrpKey, pPrpHdr.iTbl, pPrpHdr.pPrpTbl, 0, fnVarFmt, fOpt);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public struct VoidPtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(VoidPtr x, VoidPtr y) { return  x.Equals(y); }
			public static bool operator !=(VoidPtr x, VoidPtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			public  VoidPtr(Array     Array, int Offset) {
				if(Array != null) {
					if(Array is Byte[]   ) { Offset *= sizeof(Byte   ); } else
					if(Array is SByte[]  ) { Offset *= sizeof(SByte  ); } else
					if(Array is Int16[]  ) { Offset *= sizeof(Int16  ); } else
					if(Array is UInt16[] ) { Offset *= sizeof(UInt16 ); } else
					if(Array is Int32[]  ) { Offset *= sizeof(Int32  ); } else
					if(Array is UInt32[] ) { Offset *= sizeof(UInt32 ); } else
					if(Array is Int64[]  ) { Offset *= sizeof(Int64  ); } else
					if(Array is UInt64[] ) { Offset *= sizeof(UInt64 ); } else
					if(Array is Boolean[]) { Offset *= sizeof(Boolean); } else
					if(Array is Char[]   ) { Offset *= sizeof(Char   ); } else
					if(Array is Single[] ) { Offset *= sizeof(Single ); } else
					if(Array is Double[] ) { Offset *= sizeof(Double ); } else { throw new ApplicationException(); }
				}
				this.Array  = Array;
				this.Offset = Offset;
			}
			public static implicit operator VoidPtr(Array     Array) { return new VoidPtr(Array, 0); }
			public static implicit operator bool(VoidPtr x) { return x.Array != null; }
			public static implicit operator VoidPtr(BytePtr    x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(SBytePtr   x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(Int16Ptr   x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(UInt16Ptr  x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(Int32Ptr   x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(UInt32Ptr  x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(Int64Ptr   x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(UInt64Ptr  x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(BooleanPtr x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(CharPtr    x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(SinglePtr  x) { return new VoidPtr(x.Array, x.Offset); }
			public static implicit operator VoidPtr(DoublePtr  x) { return new VoidPtr(x.Array, x.Offset); }
			public static bool operator <(VoidPtr x, VoidPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				return x.Offset < y.Offset;
			}
			public static bool operator >(VoidPtr x, VoidPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				return x.Offset > y.Offset;
			}
			public static bool operator <=(VoidPtr x, VoidPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				return x.Offset <= y.Offset;
			}
			public static bool operator >=(VoidPtr x, VoidPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				return x.Offset >= y.Offset;
			}
		}
		public struct BytePtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(BytePtr x, BytePtr y) { return  x.Equals(y); }
			public static bool operator !=(BytePtr x, BytePtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private BytePtr(Array  Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  BytePtr(Byte[] Array, int Offset) : this((Array)Array, Offset * sizeof(Byte)) {  }
			public static implicit operator BytePtr(Byte[] Array) { return new BytePtr(Array, 0); }
			public static implicit operator bool(BytePtr x) { return x.Array != null; }
			public static implicit operator BytePtr(VoidPtr    x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(SBytePtr   x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(Int16Ptr   x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(UInt16Ptr  x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(Int32Ptr   x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(UInt32Ptr  x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(Int64Ptr   x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(UInt64Ptr  x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(BooleanPtr x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(CharPtr    x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(SinglePtr  x) { return new BytePtr(x.Array, x.Offset); }
			public static explicit operator BytePtr(DoublePtr  x) { return new BytePtr(x.Array, x.Offset); }
			public static bool operator <(BytePtr x, BytePtr y) { return (x - y) < 0; }
			public static bool operator >(BytePtr x, BytePtr y) { return (x - y) > 0; }
			public static bool operator <=(BytePtr x, BytePtr y) { return (x - y) <= 0; }
			public static bool operator >=(BytePtr x, BytePtr y) { return (x - y) >= 0; }
			public static int operator -(BytePtr x, BytePtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Byte)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Byte);
			}
			public Byte this[int i] {
				get { return Buffer.GetByte(Array, Offset + (i * sizeof(Byte))); }
				set { Buffer.SetByte(Array, Offset + (i * sizeof(Byte)), value); }
			}
			public Byte Read() {
				return (this++)[0];
			}
			public void Write(Byte value) {
				this[0] = value;
				this++;
			}
			public static BytePtr operator +(BytePtr x, int i) { return new BytePtr(x.Array, x.Offset + (i * sizeof(Byte))); }
			public static BytePtr operator -(BytePtr x, int i) { return new BytePtr(x.Array, x.Offset - (i * sizeof(Byte))); }
			public static BytePtr operator ++(BytePtr x) { return x + 1; }
			public static BytePtr operator --(BytePtr x) { return x - 1; }
		}
		public struct SBytePtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(SBytePtr x, SBytePtr y) { return  x.Equals(y); }
			public static bool operator !=(SBytePtr x, SBytePtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private SBytePtr(Array   Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  SBytePtr(SByte[] Array, int Offset) : this((Array)Array, Offset * sizeof(SByte)) {  }
			public static implicit operator SBytePtr(SByte[] Array) { return new SBytePtr(Array, 0); }
			public static implicit operator bool(SBytePtr x) { return x.Array != null; }
			public static implicit operator SBytePtr(VoidPtr    x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(BytePtr    x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(Int16Ptr   x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(UInt16Ptr  x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(Int32Ptr   x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(UInt32Ptr  x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(Int64Ptr   x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(UInt64Ptr  x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(BooleanPtr x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(CharPtr    x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(SinglePtr  x) { return new SBytePtr(x.Array, x.Offset); }
			public static explicit operator SBytePtr(DoublePtr  x) { return new SBytePtr(x.Array, x.Offset); }
			public static bool operator <(SBytePtr x, SBytePtr y) { return (x - y) < 0; }
			public static bool operator >(SBytePtr x, SBytePtr y) { return (x - y) > 0; }
			public static bool operator <=(SBytePtr x, SBytePtr y) { return (x - y) <= 0; }
			public static bool operator >=(SBytePtr x, SBytePtr y) { return (x - y) >= 0; }
			public static int operator -(SBytePtr x, SBytePtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(SByte)) != 0) { throw new ApplicationException(); }
				return n / sizeof(SByte);
			}
			public SByte this[int i] {
				get { return (SByte)Buffer.GetByte(Array, Offset + (i * sizeof(SByte))); }
				set { Buffer.SetByte(Array, Offset + (i * sizeof(SByte)), (byte)value); }
			}
			public SByte Read() {
				return (this++)[0];
			}
			public void Write(SByte value) {
				this[0] = value;
				this++;
			}
			public static SBytePtr operator +(SBytePtr x, int i) { return new SBytePtr(x.Array, x.Offset + (i * sizeof(SByte))); }
			public static SBytePtr operator -(SBytePtr x, int i) { return new SBytePtr(x.Array, x.Offset - (i * sizeof(SByte))); }
			public static SBytePtr operator ++(SBytePtr x) { return x + 1; }
			public static SBytePtr operator --(SBytePtr x) { return x - 1; }
		}
		public struct Int16Ptr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(Int16Ptr x, Int16Ptr y) { return  x.Equals(y); }
			public static bool operator !=(Int16Ptr x, Int16Ptr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private Int16Ptr(Array   Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  Int16Ptr(Int16[] Array, int Offset) : this((Array)Array, Offset * sizeof(Int16)) {  }
			public static implicit operator Int16Ptr(Int16[] Array) { return new Int16Ptr(Array, 0); }
			public static implicit operator bool(Int16Ptr x) { return x.Array != null; }
			public static implicit operator Int16Ptr(VoidPtr    x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(BytePtr    x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(SBytePtr   x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(UInt16Ptr  x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(Int32Ptr   x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(UInt32Ptr  x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(Int64Ptr   x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(UInt64Ptr  x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(BooleanPtr x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(CharPtr    x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(SinglePtr  x) { return new Int16Ptr(x.Array, x.Offset); }
			public static explicit operator Int16Ptr(DoublePtr  x) { return new Int16Ptr(x.Array, x.Offset); }
			public static bool operator <(Int16Ptr x, Int16Ptr y) { return (x - y) < 0; }
			public static bool operator >(Int16Ptr x, Int16Ptr y) { return (x - y) > 0; }
			public static bool operator <=(Int16Ptr x, Int16Ptr y) { return (x - y) <= 0; }
			public static bool operator >=(Int16Ptr x, Int16Ptr y) { return (x - y) >= 0; }
			public static int operator -(Int16Ptr x, Int16Ptr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Int16)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Int16);
			}
			public Int16 this[int i] {
				get {
					byte[] x = new byte[sizeof(Int16)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Int16)), x, 0, x.Length);
					return BitConverter.ToInt16(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Int16)), x.Length);
				}
			}
			public Int16 Read() {
				return (this++)[0];
			}
			public void Write(Int16 value) {
				this[0] = value;
				this++;
			}
			public static Int16Ptr operator +(Int16Ptr x, int i) { return new Int16Ptr(x.Array, x.Offset + (i * sizeof(Int16))); }
			public static Int16Ptr operator -(Int16Ptr x, int i) { return new Int16Ptr(x.Array, x.Offset - (i * sizeof(Int16))); }
			public static Int16Ptr operator ++(Int16Ptr x) { return x + 1; }
			public static Int16Ptr operator --(Int16Ptr x) { return x - 1; }
		}
		public struct UInt16Ptr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(UInt16Ptr x, UInt16Ptr y) { return  x.Equals(y); }
			public static bool operator !=(UInt16Ptr x, UInt16Ptr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private UInt16Ptr(Array    Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  UInt16Ptr(UInt16[] Array, int Offset) : this((Array)Array, Offset * sizeof(UInt16)) {  }
			public static implicit operator UInt16Ptr(UInt16[] Array) { return new UInt16Ptr(Array, 0); }
			public static implicit operator bool(UInt16Ptr x) { return x.Array != null; }
			public static implicit operator UInt16Ptr(VoidPtr    x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(BytePtr    x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(SBytePtr   x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(Int16Ptr   x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(Int32Ptr   x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(UInt32Ptr  x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(Int64Ptr   x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(UInt64Ptr  x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(BooleanPtr x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(CharPtr    x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(SinglePtr  x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static explicit operator UInt16Ptr(DoublePtr  x) { return new UInt16Ptr(x.Array, x.Offset); }
			public static bool operator <(UInt16Ptr x, UInt16Ptr y) { return (x - y) < 0; }
			public static bool operator >(UInt16Ptr x, UInt16Ptr y) { return (x - y) > 0; }
			public static bool operator <=(UInt16Ptr x, UInt16Ptr y) { return (x - y) <= 0; }
			public static bool operator >=(UInt16Ptr x, UInt16Ptr y) { return (x - y) >= 0; }
			public static int operator -(UInt16Ptr x, UInt16Ptr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(UInt16)) != 0) { throw new ApplicationException(); }
				return n / sizeof(UInt16);
			}
			public UInt16 this[int i] {
				get {
					byte[] x = new byte[sizeof(UInt16)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(UInt16)), x, 0, x.Length);
					return BitConverter.ToUInt16(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(UInt16)), x.Length);
				}
			}
			public UInt16 Read() {
				return (this++)[0];
			}
			public void Write(UInt16 value) {
				this[0] = value;
				this++;
			}
			public static UInt16Ptr operator +(UInt16Ptr x, int i) { return new UInt16Ptr(x.Array, x.Offset + (i * sizeof(UInt16))); }
			public static UInt16Ptr operator -(UInt16Ptr x, int i) { return new UInt16Ptr(x.Array, x.Offset - (i * sizeof(UInt16))); }
			public static UInt16Ptr operator ++(UInt16Ptr x) { return x + 1; }
			public static UInt16Ptr operator --(UInt16Ptr x) { return x - 1; }
		}
		public struct Int32Ptr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(Int32Ptr x, Int32Ptr y) { return  x.Equals(y); }
			public static bool operator !=(Int32Ptr x, Int32Ptr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private Int32Ptr(Array   Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  Int32Ptr(Int32[] Array, int Offset) : this((Array)Array, Offset * sizeof(Int32)) {  }
			public static implicit operator Int32Ptr(Int32[] Array) { return new Int32Ptr(Array, 0); }
			public static implicit operator bool(Int32Ptr x) { return x.Array != null; }
			public static implicit operator Int32Ptr(VoidPtr    x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(BytePtr    x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(SBytePtr   x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(Int16Ptr   x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(UInt16Ptr  x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(UInt32Ptr  x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(Int64Ptr   x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(UInt64Ptr  x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(BooleanPtr x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(CharPtr    x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(SinglePtr  x) { return new Int32Ptr(x.Array, x.Offset); }
			public static explicit operator Int32Ptr(DoublePtr  x) { return new Int32Ptr(x.Array, x.Offset); }
			public static bool operator <(Int32Ptr x, Int32Ptr y) { return (x - y) < 0; }
			public static bool operator >(Int32Ptr x, Int32Ptr y) { return (x - y) > 0; }
			public static bool operator <=(Int32Ptr x, Int32Ptr y) { return (x - y) <= 0; }
			public static bool operator >=(Int32Ptr x, Int32Ptr y) { return (x - y) >= 0; }
			public static int operator -(Int32Ptr x, Int32Ptr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Int32)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Int32);
			}
			public Int32 this[int i] {
				get {
					byte[] x = new byte[sizeof(Int32)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Int32)), x, 0, x.Length);
					return BitConverter.ToInt32(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Int32)), x.Length);
				}
			}
			public Int32 Read() {
				return (this++)[0];
			}
			public void Write(Int32 value) {
				this[0] = value;
				this++;
			}
			public static Int32Ptr operator +(Int32Ptr x, int i) { return new Int32Ptr(x.Array, x.Offset + (i * sizeof(Int32))); }
			public static Int32Ptr operator -(Int32Ptr x, int i) { return new Int32Ptr(x.Array, x.Offset - (i * sizeof(Int32))); }
			public static Int32Ptr operator ++(Int32Ptr x) { return x + 1; }
			public static Int32Ptr operator --(Int32Ptr x) { return x - 1; }
		}
		public struct UInt32Ptr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(UInt32Ptr x, UInt32Ptr y) { return  x.Equals(y); }
			public static bool operator !=(UInt32Ptr x, UInt32Ptr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private UInt32Ptr(Array    Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  UInt32Ptr(UInt32[] Array, int Offset) : this((Array)Array, Offset * sizeof(UInt32)) {  }
			public static implicit operator UInt32Ptr(UInt32[] Array) { return new UInt32Ptr(Array, 0); }
			public static implicit operator bool(UInt32Ptr x) { return x.Array != null; }
			public static implicit operator UInt32Ptr(VoidPtr    x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(BytePtr    x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(SBytePtr   x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(Int16Ptr   x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(UInt16Ptr  x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(Int32Ptr   x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(Int64Ptr   x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(UInt64Ptr  x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(BooleanPtr x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(CharPtr    x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(SinglePtr  x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static explicit operator UInt32Ptr(DoublePtr  x) { return new UInt32Ptr(x.Array, x.Offset); }
			public static bool operator <(UInt32Ptr x, UInt32Ptr y) { return (x - y) < 0; }
			public static bool operator >(UInt32Ptr x, UInt32Ptr y) { return (x - y) > 0; }
			public static bool operator <=(UInt32Ptr x, UInt32Ptr y) { return (x - y) <= 0; }
			public static bool operator >=(UInt32Ptr x, UInt32Ptr y) { return (x - y) >= 0; }
			public static int operator -(UInt32Ptr x, UInt32Ptr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(UInt32)) != 0) { throw new ApplicationException(); }
				return n / sizeof(UInt32);
			}
			public UInt32 this[int i] {
				get {
					byte[] x = new byte[sizeof(UInt32)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(UInt32)), x, 0, x.Length);
					return BitConverter.ToUInt32(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(UInt32)), x.Length);
				}
			}
			public UInt32 Read() {
				return (this++)[0];
			}
			public void Write(UInt32 value) {
				this[0] = value;
				this++;
			}
			public static UInt32Ptr operator +(UInt32Ptr x, int i) { return new UInt32Ptr(x.Array, x.Offset + (i * sizeof(UInt32))); }
			public static UInt32Ptr operator -(UInt32Ptr x, int i) { return new UInt32Ptr(x.Array, x.Offset - (i * sizeof(UInt32))); }
			public static UInt32Ptr operator ++(UInt32Ptr x) { return x + 1; }
			public static UInt32Ptr operator --(UInt32Ptr x) { return x - 1; }
		}
		public struct Int64Ptr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(Int64Ptr x, Int64Ptr y) { return  x.Equals(y); }
			public static bool operator !=(Int64Ptr x, Int64Ptr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private Int64Ptr(Array   Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  Int64Ptr(Int64[] Array, int Offset) : this((Array)Array, Offset * sizeof(Int64)) {  }
			public static implicit operator Int64Ptr(Int64[] Array) { return new Int64Ptr(Array, 0); }
			public static implicit operator bool(Int64Ptr x) { return x.Array != null; }
			public static implicit operator Int64Ptr(VoidPtr    x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(BytePtr    x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(SBytePtr   x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(Int16Ptr   x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(UInt16Ptr  x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(Int32Ptr   x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(UInt32Ptr  x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(UInt64Ptr  x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(BooleanPtr x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(CharPtr    x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(SinglePtr  x) { return new Int64Ptr(x.Array, x.Offset); }
			public static explicit operator Int64Ptr(DoublePtr  x) { return new Int64Ptr(x.Array, x.Offset); }
			public static bool operator <(Int64Ptr x, Int64Ptr y) { return (x - y) < 0; }
			public static bool operator >(Int64Ptr x, Int64Ptr y) { return (x - y) > 0; }
			public static bool operator <=(Int64Ptr x, Int64Ptr y) { return (x - y) <= 0; }
			public static bool operator >=(Int64Ptr x, Int64Ptr y) { return (x - y) >= 0; }
			public static int operator -(Int64Ptr x, Int64Ptr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Int64)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Int64);
			}
			public Int64 this[int i] {
				get {
					byte[] x = new byte[sizeof(Int64)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Int64)), x, 0, x.Length);
					return BitConverter.ToInt64(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Int64)), x.Length);
				}
			}
			public Int64 Read() {
				return (this++)[0];
			}
			public void Write(Int64 value) {
				this[0] = value;
				this++;
			}
			public static Int64Ptr operator +(Int64Ptr x, int i) { return new Int64Ptr(x.Array, x.Offset + (i * sizeof(Int64))); }
			public static Int64Ptr operator -(Int64Ptr x, int i) { return new Int64Ptr(x.Array, x.Offset - (i * sizeof(Int64))); }
			public static Int64Ptr operator ++(Int64Ptr x) { return x + 1; }
			public static Int64Ptr operator --(Int64Ptr x) { return x - 1; }
		}
		public struct UInt64Ptr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(UInt64Ptr x, UInt64Ptr y) { return  x.Equals(y); }
			public static bool operator !=(UInt64Ptr x, UInt64Ptr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private UInt64Ptr(Array    Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  UInt64Ptr(UInt64[] Array, int Offset) : this((Array)Array, Offset * sizeof(UInt64)) {  }
			public static implicit operator UInt64Ptr(UInt64[] Array) { return new UInt64Ptr(Array, 0); }
			public static implicit operator bool(UInt64Ptr x) { return x.Array != null; }
			public static implicit operator UInt64Ptr(VoidPtr    x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(BytePtr    x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(SBytePtr   x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(Int16Ptr   x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(UInt16Ptr  x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(Int32Ptr   x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(UInt32Ptr  x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(Int64Ptr   x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(BooleanPtr x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(CharPtr    x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(SinglePtr  x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static explicit operator UInt64Ptr(DoublePtr  x) { return new UInt64Ptr(x.Array, x.Offset); }
			public static bool operator <(UInt64Ptr x, UInt64Ptr y) { return (x - y) < 0; }
			public static bool operator >(UInt64Ptr x, UInt64Ptr y) { return (x - y) > 0; }
			public static bool operator <=(UInt64Ptr x, UInt64Ptr y) { return (x - y) <= 0; }
			public static bool operator >=(UInt64Ptr x, UInt64Ptr y) { return (x - y) >= 0; }
			public static int operator -(UInt64Ptr x, UInt64Ptr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(UInt64)) != 0) { throw new ApplicationException(); }
				return n / sizeof(UInt64);
			}
			public UInt64 this[int i] {
				get {
					byte[] x = new byte[sizeof(UInt64)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(UInt64)), x, 0, x.Length);
					return BitConverter.ToUInt64(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(UInt64)), x.Length);
				}
			}
			public UInt64 Read() {
				return (this++)[0];
			}
			public void Write(UInt64 value) {
				this[0] = value;
				this++;
			}
			public static UInt64Ptr operator +(UInt64Ptr x, int i) { return new UInt64Ptr(x.Array, x.Offset + (i * sizeof(UInt64))); }
			public static UInt64Ptr operator -(UInt64Ptr x, int i) { return new UInt64Ptr(x.Array, x.Offset - (i * sizeof(UInt64))); }
			public static UInt64Ptr operator ++(UInt64Ptr x) { return x + 1; }
			public static UInt64Ptr operator --(UInt64Ptr x) { return x - 1; }
		}
		public struct BooleanPtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(BooleanPtr x, BooleanPtr y) { return  x.Equals(y); }
			public static bool operator !=(BooleanPtr x, BooleanPtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private BooleanPtr(Array     Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  BooleanPtr(Boolean[] Array, int Offset) : this((Array)Array, Offset * sizeof(Boolean)) {  }
			public static implicit operator BooleanPtr(Boolean[] Array) { return new BooleanPtr(Array, 0); }
			public static implicit operator bool(BooleanPtr x) { return x.Array != null; }
			public static implicit operator BooleanPtr(VoidPtr    x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(BytePtr    x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(SBytePtr   x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(Int16Ptr   x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(UInt16Ptr  x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(Int32Ptr   x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(UInt32Ptr  x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(Int64Ptr   x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(UInt64Ptr  x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(CharPtr    x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(SinglePtr  x) { return new BooleanPtr(x.Array, x.Offset); }
			public static explicit operator BooleanPtr(DoublePtr  x) { return new BooleanPtr(x.Array, x.Offset); }
			public static bool operator <(BooleanPtr x, BooleanPtr y) { return (x - y) < 0; }
			public static bool operator >(BooleanPtr x, BooleanPtr y) { return (x - y) > 0; }
			public static bool operator <=(BooleanPtr x, BooleanPtr y) { return (x - y) <= 0; }
			public static bool operator >=(BooleanPtr x, BooleanPtr y) { return (x - y) >= 0; }
			public static int operator -(BooleanPtr x, BooleanPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Boolean)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Boolean);
			}
			public Boolean this[int i] {
				get {
					byte[] x = new byte[sizeof(Boolean)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Boolean)), x, 0, x.Length);
					return BitConverter.ToBoolean(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Boolean)), x.Length);
				}
			}
			public Boolean Read() {
				return (this++)[0];
			}
			public void Write(Boolean value) {
				this[0] = value;
				this++;
			}
			public static BooleanPtr operator +(BooleanPtr x, int i) { return new BooleanPtr(x.Array, x.Offset + (i * sizeof(Boolean))); }
			public static BooleanPtr operator -(BooleanPtr x, int i) { return new BooleanPtr(x.Array, x.Offset - (i * sizeof(Boolean))); }
			public static BooleanPtr operator ++(BooleanPtr x) { return x + 1; }
			public static BooleanPtr operator --(BooleanPtr x) { return x - 1; }
		}
		public struct CharPtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(CharPtr x, CharPtr y) { return  x.Equals(y); }
			public static bool operator !=(CharPtr x, CharPtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private CharPtr(Array  Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  CharPtr(Char[] Array, int Offset) : this((Array)Array, Offset * sizeof(Char)) {  }
			public static implicit operator CharPtr(Char[] Array) { return new CharPtr(Array, 0); }
			public static implicit operator bool(CharPtr x) { return x.Array != null; }
			public static implicit operator CharPtr(VoidPtr    x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(BytePtr    x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(SBytePtr   x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(Int16Ptr   x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(UInt16Ptr  x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(Int32Ptr   x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(UInt32Ptr  x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(Int64Ptr   x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(UInt64Ptr  x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(BooleanPtr x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(SinglePtr  x) { return new CharPtr(x.Array, x.Offset); }
			public static explicit operator CharPtr(DoublePtr  x) { return new CharPtr(x.Array, x.Offset); }
			public static bool operator <(CharPtr x, CharPtr y) { return (x - y) < 0; }
			public static bool operator >(CharPtr x, CharPtr y) { return (x - y) > 0; }
			public static bool operator <=(CharPtr x, CharPtr y) { return (x - y) <= 0; }
			public static bool operator >=(CharPtr x, CharPtr y) { return (x - y) >= 0; }
			public static int operator -(CharPtr x, CharPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Char)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Char);
			}
			public Char this[int i] {
				get {
					byte[] x = new byte[sizeof(Char)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Char)), x, 0, x.Length);
					return BitConverter.ToChar(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Char)), x.Length);
				}
			}
			public Char Read() {
				return (this++)[0];
			}
			public void Write(Char value) {
				this[0] = value;
				this++;
			}
			public static CharPtr operator +(CharPtr x, int i) { return new CharPtr(x.Array, x.Offset + (i * sizeof(Char))); }
			public static CharPtr operator -(CharPtr x, int i) { return new CharPtr(x.Array, x.Offset - (i * sizeof(Char))); }
			public static CharPtr operator ++(CharPtr x) { return x + 1; }
			public static CharPtr operator --(CharPtr x) { return x - 1; }
		}
		public struct SinglePtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(SinglePtr x, SinglePtr y) { return  x.Equals(y); }
			public static bool operator !=(SinglePtr x, SinglePtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private SinglePtr(Array    Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  SinglePtr(Single[] Array, int Offset) : this((Array)Array, Offset * sizeof(Single)) {  }
			public static implicit operator SinglePtr(Single[] Array) { return new SinglePtr(Array, 0); }
			public static implicit operator bool(SinglePtr x) { return x.Array != null; }
			public static implicit operator SinglePtr(VoidPtr    x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(BytePtr    x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(SBytePtr   x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(Int16Ptr   x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(UInt16Ptr  x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(Int32Ptr   x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(UInt32Ptr  x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(Int64Ptr   x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(UInt64Ptr  x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(BooleanPtr x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(CharPtr    x) { return new SinglePtr(x.Array, x.Offset); }
			public static explicit operator SinglePtr(DoublePtr  x) { return new SinglePtr(x.Array, x.Offset); }
			public static bool operator <(SinglePtr x, SinglePtr y) { return (x - y) < 0; }
			public static bool operator >(SinglePtr x, SinglePtr y) { return (x - y) > 0; }
			public static bool operator <=(SinglePtr x, SinglePtr y) { return (x - y) <= 0; }
			public static bool operator >=(SinglePtr x, SinglePtr y) { return (x - y) >= 0; }
			public static int operator -(SinglePtr x, SinglePtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Single)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Single);
			}
			public Single this[int i] {
				get {
					byte[] x = new byte[sizeof(Single)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Single)), x, 0, x.Length);
					return BitConverter.ToSingle(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Single)), x.Length);
				}
			}
			public Single Read() {
				return (this++)[0];
			}
			public void Write(Single value) {
				this[0] = value;
				this++;
			}
			public static SinglePtr operator +(SinglePtr x, int i) { return new SinglePtr(x.Array, x.Offset + (i * sizeof(Single))); }
			public static SinglePtr operator -(SinglePtr x, int i) { return new SinglePtr(x.Array, x.Offset - (i * sizeof(Single))); }
			public static SinglePtr operator ++(SinglePtr x) { return x + 1; }
			public static SinglePtr operator --(SinglePtr x) { return x - 1; }
		}
		public struct DoublePtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(DoublePtr x, DoublePtr y) { return  x.Equals(y); }
			public static bool operator !=(DoublePtr x, DoublePtr y) { return !x.Equals(y); }
			public readonly Array Array;
			public readonly int  Offset;
			private DoublePtr(Array    Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public  DoublePtr(Double[] Array, int Offset) : this((Array)Array, Offset * sizeof(Double)) {  }
			public static implicit operator DoublePtr(Double[] Array) { return new DoublePtr(Array, 0); }
			public static implicit operator bool(DoublePtr x) { return x.Array != null; }
			public static implicit operator DoublePtr(VoidPtr    x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(BytePtr    x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(SBytePtr   x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(Int16Ptr   x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(UInt16Ptr  x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(Int32Ptr   x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(UInt32Ptr  x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(Int64Ptr   x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(UInt64Ptr  x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(BooleanPtr x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(CharPtr    x) { return new DoublePtr(x.Array, x.Offset); }
			public static explicit operator DoublePtr(SinglePtr  x) { return new DoublePtr(x.Array, x.Offset); }
			public static bool operator <(DoublePtr x, DoublePtr y) { return (x - y) < 0; }
			public static bool operator >(DoublePtr x, DoublePtr y) { return (x - y) > 0; }
			public static bool operator <=(DoublePtr x, DoublePtr y) { return (x - y) <= 0; }
			public static bool operator >=(DoublePtr x, DoublePtr y) { return (x - y) >= 0; }
			public static int operator -(DoublePtr x, DoublePtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				int n = x.Offset - y.Offset;
				if((n % sizeof(Double)) != 0) { throw new ApplicationException(); }
				return n / sizeof(Double);
			}
			public Double this[int i] {
				get {
					byte[] x = new byte[sizeof(Double)];
					Buffer.BlockCopy(Array, Offset + (i * sizeof(Double)), x, 0, x.Length);
					return BitConverter.ToDouble(x, 0);
				}
				set {
					byte[] x = BitConverter.GetBytes(value);
					Buffer.BlockCopy(x, 0, Array, Offset + (i * sizeof(Double)), x.Length);
				}
			}
			public Double Read() {
				return (this++)[0];
			}
			public void Write(Double value) {
				this[0] = value;
				this++;
			}
			public static DoublePtr operator +(DoublePtr x, int i) { return new DoublePtr(x.Array, x.Offset + (i * sizeof(Double))); }
			public static DoublePtr operator -(DoublePtr x, int i) { return new DoublePtr(x.Array, x.Offset - (i * sizeof(Double))); }
			public static DoublePtr operator ++(DoublePtr x) { return x + 1; }
			public static DoublePtr operator --(DoublePtr x) { return x - 1; }
		}
		public struct StringPtr {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(StringPtr x, StringPtr y) { return  x.Equals(y); }
			public static bool operator !=(StringPtr x, StringPtr y) { return !x.Equals(y); }
			public readonly char[] Array;
			public readonly int   Offset;
			public StringPtr(char[] Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public static implicit operator StringPtr(char[] Array) { return new StringPtr(Array, 0); }
			public static implicit operator bool(StringPtr x) { return x.Array != null; }
			public static implicit operator StringPtr(string x) { return new StringPtr(x.ToCharArray(), 0); }
			public static implicit operator string(StringPtr x) {
				if(x.Array == null) { return null; }
				int i = System.Array.IndexOf(x.Array, '\0', x.Offset);
				if(i == -1) { i = x.Array.Length; }
				return new string(x.Array, x.Offset, i - x.Offset);
			}
			public static bool operator <(StringPtr x, StringPtr y) { return (x - y) < 0; }
			public static bool operator >(StringPtr x, StringPtr y) { return (x - y) > 0; }
			public static bool operator <=(StringPtr x, StringPtr y) { return (x - y) <= 0; }
			public static bool operator >=(StringPtr x, StringPtr y) { return (x - y) >= 0; }
			public static int operator -(StringPtr x, StringPtr y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				return x.Offset - y.Offset;
			}
			public char this[int i] {
				get {
					i += Offset;
					if(i == Array.Length) { return '\0'; }
					return Array[i];
				}
				set {
					i += Offset;
					if((i == Array.Length) && (value == '\0')) { return; }
					Array[i] = value;
				}
			}
			public char Read() {
				return (this++)[0];
			}
			public void Write(char value) {
				this[0] = value;
				this++;
			}
			public static StringPtr operator +(StringPtr x, int i) { return new StringPtr(x.Array, x.Offset + i); }
			public static StringPtr operator -(StringPtr x, int i) { return new StringPtr(x.Array, x.Offset - i); }
			public static StringPtr operator ++(StringPtr x) { return x + 1; }
			public static StringPtr operator --(StringPtr x) { return x - 1; }
		}
		public struct GenericPtr<T> {
			public override int GetHashCode() { return base.GetHashCode(); }
			public override bool Equals(object obj) { return base.Equals(obj); }
			public static bool operator ==(GenericPtr<T> x, GenericPtr<T> y) { return  x.Equals(y); }
			public static bool operator !=(GenericPtr<T> x, GenericPtr<T> y) { return !x.Equals(y); }
			public readonly T[]  Array;
			public readonly int Offset;
			public GenericPtr(T[] Array, int Offset) { this.Array = Array; this.Offset = Offset; }
			public static implicit operator GenericPtr<T>(T[] Array) { return new GenericPtr<T>(Array, 0); }
			public static implicit operator bool(GenericPtr<T> x) { return x.Array != null; }
			public static bool operator <(GenericPtr<T> x, GenericPtr<T> y) { return (x - y) < 0; }
			public static bool operator >(GenericPtr<T> x, GenericPtr<T> y) { return (x - y) > 0; }
			public static bool operator <=(GenericPtr<T> x, GenericPtr<T> y) { return (x - y) <= 0; }
			public static bool operator >=(GenericPtr<T> x, GenericPtr<T> y) { return (x - y) >= 0; }
			public static int operator -(GenericPtr<T> x, GenericPtr<T> y) {
				if(x.Array != y.Array) { throw new ApplicationException(); }
				return x.Offset - y.Offset;
			}
			public T this[int i] {
				get { return Array[Offset + i]; }
				set { Array[Offset + i] = value; }
			}
			public T Read() {
				return (this++)[0];
			}
			public void Write(T value) {
				this[0] = value;
				this++;
			}
			public static GenericPtr<T> operator +(GenericPtr<T> x, int i) { return new GenericPtr<T>(x.Array, x.Offset + i); }
			public static GenericPtr<T> operator -(GenericPtr<T> x, int i) { return new GenericPtr<T>(x.Array, x.Offset - i); }
			public static GenericPtr<T> operator ++(GenericPtr<T> x) { return x + 1; }
			public static GenericPtr<T> operator --(GenericPtr<T> x) { return x - 1; }
		}
	}
}
namespace com.Company {
	public static partial class Library {
		private struct REG_data_addr {
			public int	data;
			public BytePtr	addr;
		}
		private static BytePtr REG_bsearch(BytePtr addr, int name, int n) {
			int nameL, nameH, diff;
			BytePtr mid;
			nameL  = (byte)name;
			name >>= 8;
			nameH  = (byte)name;
			name >>= 8;
			if(name == 0) {
				while(n != 0) {
					mid = addr + ((n >> 1) * (2+3));
					diff = mid[0] - nameH;
					if(diff == 0) {
						diff = mid[1] - nameL;
						if(diff == 0) { return mid + 2; }
					}
					if(diff < 0) {
						addr = mid + (2+3);
						n--;
					}
					n >>= 1;
				}
			}
			return null;
		}
		private static REG_data_addr REG_op(BytePtr addr, int name, int type) {
			int mask, n, data;
			if(!addr) { return new REG_data_addr(); }
			mask = addr.Read() << 24;
			for(;;) {
				if(mask < 0) {
					mask <<= 1;
					n   = addr.Read();
					n <<= 8;
					n  |= addr.Read();
					n++;
				} else {
					mask <<= 1;
					if(mask == 0) { return new REG_data_addr(); }
					n = 0;
				}
				if(--type < 0) { break; }
				addr += n * (2+3);
			}
		    {{
			addr = REG_bsearch(addr, name, n);
			if(!addr) { return new REG_data_addr(); }
		    }}
			data   = addr.Read();
			data <<= 8;
			data  |= addr.Read();
			data <<= 8;
			data  |= addr.Read();
			addr  += (data << 8) >> 8;
			return new REG_data_addr() { data = data, addr = addr };
		}
		public static BytePtr REG_open_key(BytePtr keyBody, int keyName) {
			REG_data_addr data_addr = REG_op(keyBody, keyName, 0);
			return data_addr.addr;
		}
		public static int REG_get_value(BytePtr keyBody, int valueName) {
			REG_data_addr data_addr = REG_op(keyBody, valueName, 1);
			if(!data_addr.addr) { return -1; }
			return data_addr.data;
		}
		public static string REG_get_string(BytePtr keyBody, int stringName) {
			REG_data_addr data_addr = REG_op(keyBody, stringName, 2);
			if(!data_addr.addr) { return null; }
			return ShiftJisToUnicodeStr(data_addr.addr);
		}
		public static VoidPtr REG_get_blob(BytePtr keyBody, int blobName) {
			REG_data_addr data_addr = REG_op(keyBody, blobName, 3);
			return data_addr.addr;
		}
		public static BytePtr REG_open_key_l(BytePtr keyBody, params int[] names) {
			return REG_open_key_v(keyBody, names);
		}
		public static BytePtr REG_open_key_v(BytePtr keyBody, IEnumerable<int> names) {
			IEnumerator<int> e = names.GetEnumerator();
			if(!e.MoveNext()) { return keyBody; }
			int name = e.Current;
			while(e.MoveNext()) {
				keyBody = REG_open_key(keyBody, name);
				name = e.Current;
			}
			return REG_open_key(keyBody, name);
		}
		public static int REG_get_value_l(BytePtr keyBody, params int[] names) {
			return REG_get_value_v(keyBody, names);
		}
		public static int REG_get_value_v(BytePtr keyBody, IEnumerable<int> names) {
			IEnumerator<int> e = names.GetEnumerator();
			if(!e.MoveNext()) { return -1; }
			int name = e.Current;
			while(e.MoveNext()) {
				keyBody = REG_open_key(keyBody, name);
				name = e.Current;
			}
			return REG_get_value(keyBody, name);
		}
		public static string REG_get_string_l(BytePtr keyBody, params int[] names) {
			return REG_get_string_v(keyBody, names);
		}
		public static string REG_get_string_v(BytePtr keyBody, IEnumerable<int> names) {
			IEnumerator<int> e = names.GetEnumerator();
			if(!e.MoveNext()) { return null; }
			int name = e.Current;
			while(e.MoveNext()) {
				keyBody = REG_open_key(keyBody, name);
				name = e.Current;
			}
			return REG_get_string(keyBody, name);
		}
		public static VoidPtr REG_get_blob_l(BytePtr keyBody, params int[] names) {
			return REG_get_blob_v(keyBody, names);
		}
		public static VoidPtr REG_get_blob_v(BytePtr keyBody, IEnumerable<int> names) {
			IEnumerator<int> e = names.GetEnumerator();
			if(!e.MoveNext()) { return null; }
			int name = e.Current;
			while(e.MoveNext()) {
				keyBody = REG_open_key(keyBody, name);
				name = e.Current;
			}
			return REG_get_blob(keyBody, name);
		}
		private static REG_data_addr REG_nth(BytePtr addr, int index, out int p_name, int type) {
			int mask, n, data;
			p_name = -1;
			if(!addr) { return new REG_data_addr(); }
			mask = addr.Read() << 24;
			for(;;) {
				if(mask < 0) {
					mask <<= 1;
					n   = addr.Read();
					n <<= 8;
					n  |= addr.Read();
					n++;
				} else {
					mask <<= 1;
					if(mask == 0) { return new REG_data_addr(); }
					n = 0;
				}
				if(--type < 0) { break; }
				addr += n * (2+3);
			}
		    {{
			int name;
			if((uint)index >= (uint)n) { return new REG_data_addr(); }
			addr  += index * (2+3);
			name   = addr.Read();
			name <<= 8;
			name  |= addr.Read();
			p_name = name;
		    }}
			data   = addr.Read();
			data <<= 8;
			data  |= addr.Read();
			data <<= 8;
			data  |= addr.Read();
			addr  += (data << 8) >> 8;
			return new REG_data_addr() { data = data, addr = addr };
		}
		public static BytePtr REG_open_nth_key(BytePtr keyBody, int index) {
			int p_keyName;
			return REG_open_nth_key(keyBody, index, out p_keyName);
		}
		public static BytePtr REG_open_nth_key(BytePtr keyBody, int index, out int p_keyName) {
			REG_data_addr data_addr = REG_nth(keyBody, index, out p_keyName, 0);
			return data_addr.addr;
		}
		public static int REG_get_nth_value(BytePtr keyBody, int index) {
			int p_valueName;
			return REG_get_nth_value(keyBody, index, out p_valueName);
		}
		public static int REG_get_nth_value(BytePtr keyBody, int index, out int p_valueName) {
			REG_data_addr data_addr = REG_nth(keyBody, index, out p_valueName, 1);
			if(!data_addr.addr) { return -1; }
			return data_addr.data;
		}
		public static string REG_get_nth_string(BytePtr keyBody, int index) {
			int p_stringName;
			return REG_get_nth_string(keyBody, index, out p_stringName);
		}
		public static string REG_get_nth_string(BytePtr keyBody, int index, out int p_stringName) {
			REG_data_addr data_addr = REG_nth(keyBody, index, out p_stringName, 2);
			if(!data_addr.addr) { return null; }
			return ShiftJisToUnicodeStr(data_addr.addr);
		}
		public static VoidPtr REG_get_nth_blob(BytePtr keyBody, int index) {
			int p_blobName;
			return REG_get_nth_blob(keyBody, index, out p_blobName);
		}
		public static VoidPtr REG_get_nth_blob(BytePtr keyBody, int index, out int p_blobName) {
			REG_data_addr data_addr = REG_nth(keyBody, index, out p_blobName, 3);
			return data_addr.addr;
		}
		public static BytePtr REG_open_nth_key_l(BytePtr keyBody, int index, params int[] names) {
			int p_keyName;
			return REG_open_nth_key_l(keyBody, index, out p_keyName, names);
		}
		public static BytePtr REG_open_nth_key_l(BytePtr keyBody, int index, out int p_keyName, params int[] names) {
			return REG_open_nth_key_v(keyBody, index, out p_keyName, names);
		}
		public static BytePtr REG_open_nth_key_v(BytePtr keyBody, int index, IEnumerable<int> names) {
			int p_keyName;
			return REG_open_nth_key_v(keyBody, index, out p_keyName, names);
		}
		public static BytePtr REG_open_nth_key_v(BytePtr keyBody, int index, out int p_keyName, IEnumerable<int> names) {
			return REG_open_nth_key(REG_open_key_v(keyBody, names), index, out p_keyName);
		}
		public static int REG_get_nth_value_l(BytePtr keyBody, int index, params int[] names) {
			int p_valueName;
			return REG_get_nth_value_l(keyBody, index, out p_valueName, names);
		}
		public static int REG_get_nth_value_l(BytePtr keyBody, int index, out int p_valueName, params int[] names) {
			return REG_get_nth_value_v(keyBody, index, out p_valueName, names);
		}
		public static int REG_get_nth_value_v(BytePtr keyBody, int index, IEnumerable<int> names) {
			int p_valueName;
			return REG_get_nth_value_v(keyBody, index, out p_valueName, names);
		}
		public static int REG_get_nth_value_v(BytePtr keyBody, int index, out int p_valueName, IEnumerable<int> names) {
			return REG_get_nth_value(REG_open_key_v(keyBody, names), index, out p_valueName);
		}
		public static string REG_get_nth_string_l(BytePtr keyBody, int index, params int[] names) {
			int p_stringName;
			return REG_get_nth_string_l(keyBody, index, out p_stringName, names);
		}
		public static string REG_get_nth_string_l(BytePtr keyBody, int index, out int p_stringName, params int[] names) {
			return REG_get_nth_string_v(keyBody, index, out p_stringName, names);
		}
		public static string REG_get_nth_string_v(BytePtr keyBody, int index, IEnumerable<int> names) {
			int p_stringName;
			return REG_get_nth_string_v(keyBody, index, out p_stringName, names);
		}
		public static string REG_get_nth_string_v(BytePtr keyBody, int index, out int p_stringName, IEnumerable<int> names) {
			return REG_get_nth_string(REG_open_key_v(keyBody, names), index, out p_stringName);
		}
		public static VoidPtr REG_get_nth_blob_l(BytePtr keyBody, int index, params int[] names) {
			int p_blobName;
			return REG_get_nth_blob_l(keyBody, index, out p_blobName, names);
		}
		public static VoidPtr REG_get_nth_blob_l(BytePtr keyBody, int index, out int p_blobName, params int[] names) {
			return REG_get_nth_blob_v(keyBody, index, out p_blobName, names);
		}
		public static VoidPtr REG_get_nth_blob_v(BytePtr keyBody, int index, IEnumerable<int> names) {
			int p_blobName;
			return REG_get_nth_blob_v(keyBody, index, out p_blobName, names);
		}
		public static VoidPtr REG_get_nth_blob_v(BytePtr keyBody, int index, out int p_blobName, IEnumerable<int> names) {
			return REG_get_nth_blob(REG_open_key_v(keyBody, names), index, out p_blobName);
		}
		private static int REG_num(BytePtr addr, int type) {
			int mask, n;
			if(!addr) { return 0; }
			mask = addr.Read() << 24;
			for(;;) {
				if(mask < 0) {
					mask <<= 1;
					n   = addr.Read();
					n <<= 8;
					n  |= addr.Read();
					n++;
				} else {
					mask <<= 1;
					if(mask == 0) { return 0; }
					n = 0;
				}
				if(--type < 0) { break; }
				addr += n * (2+3);
			}
			return n;
		}
		public static int REG_num_key(BytePtr keyBody) {
			return REG_num(keyBody, 0);
		}
		public static int REG_num_value(BytePtr keyBody) {
			return REG_num(keyBody, 1);
		}
		public static int REG_num_string(BytePtr keyBody) {
			return REG_num(keyBody, 2);
		}
		public static int REG_num_blob(BytePtr keyBody) {
			return REG_num(keyBody, 3);
		}
		public static int REG_num_key_l(BytePtr keyBody, params int[] names) {
			return REG_num_key_v(keyBody, names);
		}
		public static int REG_num_key_v(BytePtr keyBody, IEnumerable<int> names) {
			return REG_num_key(REG_open_key_v(keyBody, names));
		}
		public static int REG_num_value_l(BytePtr keyBody, params int[] names) {
			return REG_num_value_v(keyBody, names);
		}
		public static int REG_num_value_v(BytePtr keyBody, IEnumerable<int> names) {
			return REG_num_value(REG_open_key_v(keyBody, names));
		}
		public static int REG_num_string_l(BytePtr keyBody, params int[] names) {
			return REG_num_string_v(keyBody, names);
		}
		public static int REG_num_string_v(BytePtr keyBody, IEnumerable<int> names) {
			return REG_num_string(REG_open_key_v(keyBody, names));
		}
		public static int REG_num_blob_l(BytePtr keyBody, params int[] names) {
			return REG_num_blob_v(keyBody, names);
		}
		public static int REG_num_blob_v(BytePtr keyBody, IEnumerable<int> names) {
			return REG_num_blob(REG_open_key_v(keyBody, names));
		}
		public static int REG_get_blob_size(VoidPtr _blob) {
			BytePtr blob = _blob;
			int size;
			if(!blob) { return 0; }
			blob  -= 3;
			size   = blob.Read();
			size <<= 8;
			size  |= blob.Read();
			size <<= 8;
			size  |= blob.Read();
			size++;
			return size;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_RinBuf {
			public int		iMaxPos { get { return TBL_Buf.Length - 1; } }
			public int		iAddPos;
			public int		iGetPos;
			public int		nOvrCnt;
			public object[]		TBL_Buf;
		}
		public static ST_RinBuf RinBuf_New(int nElmCnt) {
			ST_RinBuf pRinBuf;
			if(nElmCnt < 2) { throw new ApplicationException(); }
			pRinBuf = new ST_RinBuf();
			RinBuf_Init(pRinBuf, nElmCnt);
			return pRinBuf;
		}
		public static void RinBuf_Init(ST_RinBuf pRinBuf, int nElmCnt) {
			if(nElmCnt < 2) { throw new ApplicationException(); }
			pRinBuf.iAddPos = 0;
			pRinBuf.iGetPos = 0;
			pRinBuf.nOvrCnt = 0;
			pRinBuf.TBL_Buf = new object[nElmCnt];
		}
		public static void RinBuf_Add(ST_RinBuf pRinBuf, object pElm) {
		lock(pRinBuf) {
				int iAddPos = pRinBuf.iAddPos;
				int iBuf = iAddPos;
				if(++iAddPos > pRinBuf.iMaxPos) { iAddPos = 0; }
				if(iAddPos != pRinBuf.iGetPos) {
					pRinBuf.iAddPos = iAddPos;
					pRinBuf.TBL_Buf[iBuf] = pElm;
				} else {
					if(pRinBuf.nOvrCnt < int.MaxValue) { pRinBuf.nOvrCnt++; }
				}
		}
		}
		public static object RinBuf_Get(ST_RinBuf pRinBuf) {
			object pBuf;
		lock(pRinBuf) {
				int iGetPos = pRinBuf.iGetPos;
				if(iGetPos != pRinBuf.iAddPos) {
					pBuf = pRinBuf.TBL_Buf[iGetPos];
					if(++iGetPos > pRinBuf.iMaxPos) { iGetPos = 0; }
					pRinBuf.iGetPos = iGetPos;
				} else {
					pBuf = null;
				}
		}
			return pBuf;
		}
		public static int RinBuf_Ovr(ST_RinBuf pRinBuf) {
			int nOvrCnt;
		lock(pRinBuf) {
				nOvrCnt = pRinBuf.nOvrCnt;
				pRinBuf.nOvrCnt = 0;
		}
			return nOvrCnt;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public static void shuffle(VoidPtr _base, int num, int width, System.Random seed) {
			BytePtr p_dst = _base;
			while(num > 1) {
				BytePtr p_src = p_dst + (seed.Next(num) * width);
				for(int i = 0; i < width; i++) {
					byte c = p_src[0];
					         p_src.Write(p_dst[0]);
					                     p_dst.Write(c);
				}
				num--;
			}
		}
		public static void shuffle<T>(GenericPtr<T> _base, int num, System.Random seed) {
			shuffle(_base.Array, _base.Offset, num, seed);
		}
		public static void shuffle<T>(T[] array, System.Random seed) {
			shuffle(array, 0, array.Length, seed);
		}
		public static void shuffle<T>(T[] array, int index, int length, System.Random seed) {
			int i_dst = index;
			while(length > 1) {
				int i_src = i_dst + seed.Next(length);
				XCHG(ref array[i_dst], ref array[i_src]);
				i_dst++;
				length--;
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_RRS {
			public ushort			n_job;
			public ushort			i_job;
			public Thread[]	TBL_thr;
		}
		public static void RRS_new_l(out ST_RRS pRRS, int stacksize, params Action<ST_RRS>[] aFn) {
			RRS_new_v(out pRRS, stacksize, aFn);
		}
		public static void RRS_new_v(out ST_RRS pRRS, int stacksize, Action<ST_RRS>[] aFn) {
			pRRS = new ST_RRS();
			pRRS.TBL_thr = new Thread[aFn.Length];
			pRRS.n_job = (ushort)(aFn.Length + 1);
			for(int i = 0; i < aFn.Length; i++) {
				pRRS.TBL_thr[i] = new Thread(
					delegate(object obj) {
						try {
							aFn[i].Invoke((ST_RRS)obj);
						} catch(ThreadInterruptedException) {
						} catch(Exception e) {
							UnityEngine.Debug.LogException(e);
							for(;;) { RRS_yield((ST_RRS)obj); }
						}
					});
				pRRS.TBL_thr[i].Start(pRRS);
				lock(pRRS) {
					while(pRRS.i_job == i) { Monitor.Wait(pRRS); }
					if(pRRS.i_job != (i + 1)) { throw new ApplicationException(); }
				}
			}
		}
		public static void RRS_free(ST_RRS pRRS) {
			if(Array.IndexOf(pRRS.TBL_thr, Thread.CurrentThread) != -1) { throw new ApplicationException(); }
			foreach(Thread i in pRRS.TBL_thr) {
				i.Interrupt();
				i.Join();
			}
		}
		public static void RRS_yield(ST_RRS pRRS) {
			int i_job = pRRS.i_job;
			lock(pRRS) {
				if(++pRRS.i_job == pRRS.n_job) { pRRS.i_job = 0; }
				Monitor.PulseAll(pRRS);
				while(pRRS.i_job != i_job) {
					Monitor.Wait(pRRS);
				}
			}
		}
		public static int RRS_n_job(ST_RRS pRRS) {
			return pRRS.n_job;
		}
		public static int RRS_i_job(ST_RRS pRRS) {
			return pRRS.i_job;
		}
		public class ST_RRS_sync_root {
			public ushort			req;
			public ushort			cnt;
			public ST_RRS_sync_node		first;
		}
		public class ST_RRS_sync_node {
			public bool			done;
			public ST_RRS_sync_node		next;
		}
		public static void RRS_sync(ST_RRS pRRS, ST_RRS_sync_root root) {
			RRS_sync_idle(pRRS, root, null, null);
		}
		public static void RRS_sync_idle(ST_RRS pRRS, ST_RRS_sync_root root, Action<object> idle, object arg) {
			ST_RRS_sync_node node = new ST_RRS_sync_node();
			if(root.cnt >= root.req) { throw new ApplicationException(); }
			node.next = root.first;
			            root.first = node;
			if(++root.cnt == root.req) {
				do {
#if     DEBUG
					root.cnt--;
					if(root.first.done) { throw new ApplicationException(); }
#endif
					root.first.done = true;
					root.first = root.first.next;
				} while(root.first != null);
#if     DEBUG
				if(root.cnt != 0) { throw new ApplicationException(); }
#endif
				root.cnt = 0;
			}
			while(!node.done) {
#if     DEBUG
				ST_RRS_sync_node pnode;
				for(pnode = root.first; pnode != null; pnode = pnode.next) {
					if(pnode == node) { break; }
				}
				if(pnode == null) { throw new ApplicationException(); }
#endif
				idle?.Invoke(arg);
				RRS_yield(pRRS);
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public const int SprFnt_SprNo	= 0;
		public const int SprFnt_NextX	= 1;
		public const int SprFnt_NextY	= 2;
		public const int SprFnt_DrawX	= 3;
		public const int SprFnt_DrawY	= 4;
		private struct ST_SprFnt_Info {
			public int	SprNo;
			public int	NextX;
			public int	NextY;
			public int	DrawX;
			public int	DrawY;
		}
		private static int SprFnt_GetInfo_subr(VoidPtr pSprFnt, VoidPtr pChrKey, int iValueName) {
			int iValue = REG_get_value(pChrKey, iValueName);
			if(iValue == -1) {
				iValue = REG_get_value(pSprFnt, iValueName);
				if(iValue == -1) { iValue = 0; }
			}
			return iValue << 8 >> 8;
		}
		private static void SprFnt_GetInfo(VoidPtr pSprFnt, int c, out ST_SprFnt_Info pInfo) {
			VoidPtr pChrKey = REG_open_key(pSprFnt, c);
			if(!pChrKey) {
				pChrKey = REG_open_key(pSprFnt, 0);
				if(!pChrKey) { throw new ApplicationException(); }
			}
			pInfo.SprNo = REG_get_value(pChrKey, SprFnt_SprNo);
			if(pInfo.SprNo == -1) { throw new ApplicationException(); }
			pInfo.NextX = SprFnt_GetInfo_subr(pSprFnt, pChrKey, SprFnt_NextX);
			pInfo.NextY = SprFnt_GetInfo_subr(pSprFnt, pChrKey, SprFnt_NextY);
			pInfo.DrawX = SprFnt_GetInfo_subr(pSprFnt, pChrKey, SprFnt_DrawX);
			pInfo.DrawY = SprFnt_GetInfo_subr(pSprFnt, pChrKey, SprFnt_DrawY);
		}
		private static void SprFnt_Print_subr(VoidPtr pSprFnt, Action<object,int,int,double,double,double,int,int> fn, object user_data, int x0, int y0, double scale_x, double scale_y, double rot, double cx, double cy, int color, string s) {
			int h = 0, x = 0, y = 0;
			double dCos = Math.Cos(rot), dSin = Math.Sin(rot);
			double a00 = dCos * scale_x, a01 = -dSin * scale_y, a02 = x0 - (a00 * cx) - (a01 * cy);
			double a10 = dSin * scale_x, a11 =  dCos * scale_y, a12 = y0 - (a10 * cx) - (a11 * cy);
			foreach(int _c in s) {
				int c = UnicodeToShiftJisChr(_c);
				if(c == '\n') {
					x = 0;
					y += h;
					h = 0;
				} else {
					ST_SprFnt_Info stInfo;
					SprFnt_GetInfo(pSprFnt, c, out stInfo);
					if(stInfo.SprNo != 0) {
						double dx = x + stInfo.DrawX, dy = y + stInfo.DrawY;
						double ex = (dx * a00) + (dy * a01) + a02;
						double ey = (dx * a10) + (dy * a11) + a12;
						fn.Invoke(user_data, (int)ex, (int)ey, scale_x, scale_y, rot, color, stInfo.SprNo);
					}
					x += stInfo.NextX;
					if(stInfo.NextY > h) { h = stInfo.NextY; }
				}
			}
		}
		private static void SprFnt_PrintXF_subr(VoidPtr pSprFnt, Action<object,int,int,double,double,double,int,int> fn, object user_data, int x0, int y0, double scale_x, double scale_y, double rot, double cx1, double cy1, double cx2, double cy2, int color, StringPtr s1, StringPtr s2, double transition) {
			double t1 = (1.0 - transition), t2 = transition;
			int color1 = RGBA_MAKE(RGBA_GETRED(color), RGBA_GETGREEN(color), RGBA_GETBLUE(color), (int)(RGBA_GETALPHA(color) * t1));
			int color2 = RGBA_MAKE(RGBA_GETRED(color), RGBA_GETGREEN(color), RGBA_GETBLUE(color), (int)(RGBA_GETALPHA(color) * t2));
			int c1, c2, h1 = 0, x1 = 0, y1 = 0, h2 = 0, x2 = 0, y2 = 0;
			double dCos = Math.Cos(rot), dSin = Math.Sin(rot);
			double cx = (cx1 == cx2) ? cx1 : ((cx1 * t1) + (cx2 * t2));
			double cy = (cy1 == cy2) ? cy1 : ((cy1 * t1) + (cy2 * t2));
			double a00 = dCos * scale_x, a01 = -dSin * scale_y, a02 = x0 - (a00 * cx) - (a01 * cy);
			double a10 = dSin * scale_x, a11 =  dCos * scale_y, a12 = y0 - (a10 * cx) - (a11 * cy);
			for(;;) {
				ST_SprFnt_Info stInfo1 = default(ST_SprFnt_Info), stInfo2 = default(ST_SprFnt_Info);
				double dx, dy, ex, ey;
				for(;;) {
					if((c1 = s1[0]) == '\0') { break; }
					s1++;
					c1 = UnicodeToShiftJisChr(c1);
					if(c1 != '\n') {
						SprFnt_GetInfo(pSprFnt, c1, out stInfo1);
						break;
					}
					x1 = 0;
					y1 += h1;
					h1 = 0;
				}
				for(;;) {
					if((c2 = s2[0]) == '\0') { break; }
					s2++;
					c2 = UnicodeToShiftJisChr(c2);
					if(c2 != '\n') {
						SprFnt_GetInfo(pSprFnt, c2, out stInfo2);
						break;
					}
					x2 = 0;
					y2 += h2;
					h2 = 0;
				}
				if((c1 == '\0') && (c2 == '\0')) { break; }
				if((c1 != '\0') && (stInfo1.SprNo != 0)) {
					if((c2 != '\0') && (stInfo2.SprNo != 0)) {
						double x = (x1 == x2) ? x1 : ((x1 * t1) + (x2 * t2));
						double y = (y1 == y2) ? y1 : ((y1 * t1) + (y2 * t2));
						if(stInfo1.SprNo == stInfo2.SprNo) {
							dx = x  + stInfo1.DrawX; dy = y  + stInfo1.DrawY;
							ex = (dx * a00) + (dy * a01) + a02;
							ey = (dx * a10) + (dy * a11) + a12;
							fn.Invoke(user_data, (int)ex, (int)ey, scale_x, scale_y, rot, color , stInfo1.SprNo);
						} else {
							dx = x  + stInfo1.DrawX; dy = y  + stInfo1.DrawY;
							ex = (dx * a00) + (dy * a01) + a02;
							ey = (dx * a10) + (dy * a11) + a12;
							fn.Invoke(user_data, (int)ex, (int)ey, scale_x, scale_y, rot, color1, stInfo1.SprNo);
							dx = x  + stInfo2.DrawX; dy = y  + stInfo2.DrawY;
							ex = (dx * a00) + (dy * a01) + a02;
							ey = (dx * a10) + (dy * a11) + a12;
							fn.Invoke(user_data, (int)ex, (int)ey, scale_x, scale_y, rot, color2, stInfo2.SprNo);
						}
					} else {
							dx = x1 + stInfo1.DrawX; dy = y1 + stInfo1.DrawY;
							ex = (dx * a00) + (dy * a01) + a02;
							ey = (dx * a10) + (dy * a11) + a12;
							fn.Invoke(user_data, (int)ex, (int)ey, scale_x, scale_y, rot, color1, stInfo1.SprNo);
					}
				} else {
					if((c2 != '\0') && (stInfo2.SprNo != 0)) {
							dx = x2 + stInfo2.DrawX; dy = y2 + stInfo2.DrawY;
							ex = (dx * a00) + (dy * a01) + a02;
							ey = (dx * a10) + (dy * a11) + a12;
							fn.Invoke(user_data, (int)ex, (int)ey, scale_x, scale_y, rot, color2, stInfo2.SprNo);
					} else {
					}
				}
				if(c1 != '\0') {
					x1 += stInfo1.NextX;
					if(stInfo1.NextY > h1) { h1 = stInfo1.NextY; }
				}
				if(c2 != '\0') {
					x2 += stInfo2.NextX;
					if(stInfo2.NextY > h2) { h2 = stInfo2.NextY; }
				}
			}
		}
		public static void SprFnt_Print(  VoidPtr pSprFnt, Action<object,int,int,double,double,double,int,int> fn, object user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, string s) {
			int size_x, size_y;
			double cx, cy;
			SprFnt_GetSize(pSprFnt, s, out size_x, out size_y);
			cx = size_x * ax;
			cy = size_y * ay;
			SprFnt_Print_subr(pSprFnt, fn, user_data, x, y, scale_x, scale_y, rot, cx, cy, color, s);
		}
		public static void SprFnt_PrintF( VoidPtr pSprFnt, Action<object,int,int,double,double,double,int,int> fn, object user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, string fmt, params object[] ap) {
			SprFnt_Print(pSprFnt, fn, user_data, x, y, scale_x, scale_y, rot, ax, ay, color, string.Format(fmt, ap));
		}
		public static void SprFnt_PrintXF(VoidPtr pSprFnt, Action<object,int,int,double,double,double,int,int> fn, object user_data, int x, int y, double scale_x, double scale_y, double rot, double ax, double ay, int color, string s1, string s2, double transition) {
			int size_x1, size_y1, size_x2, size_y2;
			double cx1, cy1, cx2, cy2;
			SprFnt_GetSize(pSprFnt, s1, out size_x1, out size_y1);
			SprFnt_GetSize(pSprFnt, s2, out size_x2, out size_y2);
			if((size_x1 | size_y1) == 0) { size_x1 = size_x2; size_y1 = size_y2; }
			if((size_x2 | size_y2) == 0) { size_x2 = size_x1; size_y2 = size_y1; }
			cx1 = size_x1 * ax;
			cy1 = size_y1 * ay;
			cx2 = size_x2 * ax;
			cy2 = size_y2 * ay;
			SprFnt_PrintXF_subr(pSprFnt, fn, user_data, x, y, scale_x, scale_y, rot, cx1, cy1, cx2, cy2, color, s1, s2, transition);
		}
		public static void SprFnt_GetSize(VoidPtr pSprFnt, string s, out int p_size_x, out int p_size_y) {
			int x = 0, y = 0, size_x = 0, size_y = 0;
			int h = 0;
			foreach(int _c in s) {
				int c = UnicodeToShiftJisChr(_c);
				if(c == '\n') {
					x = 0;
					y += h;
					h = 0;
				} else {
					ST_SprFnt_Info stInfo;
					SprFnt_GetInfo(pSprFnt, c, out stInfo);
					x += stInfo.NextX;
					if(stInfo.NextY > h) { h = stInfo.NextY; }
					if(x > size_x) { size_x = x; }
					if((y + h) > size_y) { size_y = (y + h); }
				}
			}
			p_size_x = size_x;
			p_size_y = size_y;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_TapDevCh {
			public byte			iLogCh;
		}
		public class ST_TapLogCh {
			public ushort			iPhr;
			public byte			iLoop;
			public byte			iAtt;
			public sbyte			iPan;
			public byte			iDevCh;
			public byte			iSeqCh;
			public byte			iCont;
			public int			iWait;
		}
		public class ST_TapSeqCh {
			public BytePtr			pData;
			public int			iWait;
		}
		public const int TapEvt_Play		= 0;
		public const int TapEvt_Stop		= 1;
		public const int TapEvt_Loop		= 2;
		public const int TapEvt_End		= 3;
		public const int TapEvt_Next		= 4;
		public const int TapEvt_Ctrl		= 5;
		public struct ST_TapEvt {
			public byte			iEvt;
			public byte			iLogCh;
			public ushort			iPhr;
		}
		public class ST_TapEvtBuf {
			public byte			iAddPos;
			public byte			iGetPos;
			public ushort			nOvrCnt;
			public ST_TapEvt[]		TBL_Buf;
		}
		public class ST_TapSeq {
			public ST_TapSeqInfo		pInfo;
			public ST_TapDevCh[]		TBL_DevCh;
			public ST_TapLogCh[]		TBL_LogCh;
			public ST_TapSeqCh[]		TBL_SeqCh;
			public ST_TapEvtBuf		EvtBuf;
		}
		public class ST_TapSeqInfo {
			public ushort								nPhr;
			public byte								nDevCh;
			public int							nLogCh { get { return pTBL_TapSet.Length; } }
			public int							nSeqCh { get { return pTBL_BaseCh.Length; } }
			public byte								iCont;
			public ushort								iPrep;
			public byte								nEvt;
			public byte								iEvtMsk;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnPlay;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnStop;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnLoop;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnEnd;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnNext;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnCtrl;
			public Action<ST_TapSeq,int,ST_TapLogCh>	fnPrep;
			public Func<ST_TapSeq,int,int>			fnGetPhrTime;
			public Func<ST_TapSeq,int,int>			fnGetPhrNext;
			public byte[][]								pTBL_TapSet;
			public byte[]								pTBL_BaseCh;
		}
		public static ST_TapSeq TapSeq_New(ST_TapSeqInfo pInfo) {
			ST_TapSeq pTapSeq;
			TapSeqInfo_Verify(pInfo);
			pTapSeq = new ST_TapSeq();
			TapSeq_Init(pTapSeq, pInfo);
			return pTapSeq;
		}
		public static void TapSeq_Init(ST_TapSeq pTapSeq, ST_TapSeqInfo pInfo) {
			int iDevCh, iLogCh, iSeqCh;
			TapSeqInfo_Verify(pInfo);
			pTapSeq.pInfo = pInfo;
			pTapSeq.TBL_DevCh = new ST_TapDevCh[pTapSeq.pInfo.nDevCh];
			for(iDevCh = 0; iDevCh < pTapSeq.pInfo.nDevCh; iDevCh++) {
				ST_TapDevCh pDevCh = new ST_TapDevCh();
				pTapSeq.TBL_DevCh[iDevCh] = pDevCh;
				pDevCh.iLogCh = byte.MaxValue;
			}
			pTapSeq.TBL_LogCh = new ST_TapLogCh[pTapSeq.pInfo.nLogCh];
			for(iLogCh = 0; iLogCh < pTapSeq.pInfo.nLogCh; iLogCh++) {
				ST_TapLogCh pLogCh = new ST_TapLogCh();
				pTapSeq.TBL_LogCh[iLogCh] = pLogCh;
				pLogCh.iPhr   = ushort.MaxValue;
				pLogCh.iDevCh = byte.MaxValue;
				pLogCh.iSeqCh = byte.MaxValue;
			}
			pTapSeq.TBL_SeqCh = new ST_TapSeqCh[pTapSeq.pInfo.nSeqCh];
			for(iSeqCh = 0; iSeqCh < pTapSeq.pInfo.nSeqCh; iSeqCh++) {
				ST_TapSeqCh pSeqCh = new ST_TapSeqCh();
				pTapSeq.TBL_SeqCh[iSeqCh] = pSeqCh;
			}
			if(pInfo.nEvt != 0) {
				ST_TapEvtBuf pEvtBuf = new ST_TapEvtBuf();
				pTapSeq.EvtBuf = pEvtBuf;
				pEvtBuf.iAddPos = 0;
				pEvtBuf.iGetPos = 0;
				pEvtBuf.nOvrCnt = 0;
				pEvtBuf.TBL_Buf = new ST_TapEvt[(pInfo.nEvt+1)];
			} else {
				pTapSeq.EvtBuf = null;
			}
		}
		public static void TapSeq_Exec(ST_TapSeq pTapSeq, int iElapTime) {
			int iLogCh, iSeqCh;
			if(iElapTime <    0) { iElapTime =    0; }
			if(iElapTime > 1000) { iElapTime = 1000; }
		lock(pTapSeq) {
				for(iLogCh = 0; iLogCh < pTapSeq.pInfo.nLogCh; iLogCh++) {
					TapLogCh_Exec(pTapSeq, iLogCh, iElapTime);
				}
				for(iSeqCh = 0; iSeqCh < pTapSeq.pInfo.nSeqCh; iSeqCh++) {
					TapSeqCh_Exec(pTapSeq, iSeqCh, iElapTime);
				}
		}
		}
		public static void TapLogCh_Play(ST_TapSeq pTapSeq, int iLogCh, int iPhr, int iLoop, int iAtt, int iPan) {
			int iPhrType;
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
		lock(pTapSeq) {
				pLogCh.iSeqCh = byte.MaxValue;
				pLogCh.iCont  = 0;
				iPhrType = TapSeq_GetPhrType(pTapSeq, iPhr);
				if(iPhrType >= 0) {
					if(pLogCh.iPhr != ushort.MaxValue) {
						if(TapSeq_GetPhrType(pTapSeq, pLogCh.iPhr) == iPhrType) {
							TapLogCh_Ctrl(pTapSeq, iLogCh, iAtt, iPan);
							return;
						}
					}
					iLoop = 0;
				}
				TapLogCh_Stop(pTapSeq, iLogCh);
				pLogCh.iLoop = (byte)iLoop;
				pLogCh.iAtt  = (byte)iAtt;
				pLogCh.iPan  = (sbyte)iPan;
				pLogCh.iWait = 0;
				TapSeq_AcqLogCh(pTapSeq, iLogCh);
				TapLogCh_PlaySubr(pTapSeq, iLogCh, iPhr);
		}
		}
		public static void TapLogCh_Stop(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
		lock(pTapSeq) {
				pLogCh.iSeqCh = byte.MaxValue;
				if(pLogCh.iPhr == ushort.MaxValue) { return; }
				if(TapSeq_GetPhrType(pTapSeq, pLogCh.iPhr) != -2) {
					TapSeq_fnStop(pTapSeq, iLogCh);
					TapLogCh_StopSubr(pTapSeq, iLogCh);
				}
		}
		}
		public static void TapLogCh_Ctrl(ST_TapSeq pTapSeq, int iLogCh, int iAtt, int iPan) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
		lock(pTapSeq) {
				if(pLogCh.iPhr == ushort.MaxValue) { return; }
				if((pLogCh.iAtt == iAtt) && (pLogCh.iPan == iPan)) { return; }
				pLogCh.iAtt = (byte)iAtt;
				pLogCh.iPan = (sbyte)iPan;
				TapSeq_fnCtrl(pTapSeq, iLogCh);
		}
		}
		public static void TapSeqCh_Play(ST_TapSeq pTapSeq, int iSeqCh, VoidPtr pData) {
			ST_TapSeqCh pSeqCh = TapSeq_GetSeqCh(pTapSeq, iSeqCh);
		lock(pTapSeq) {
				TapSeqCh_Stop(pTapSeq, iSeqCh);
				pSeqCh.pData = pData;
				pSeqCh.iWait = 0;
				TapSeqCh_Exec(pTapSeq, iSeqCh, 0);
		}
		}
		public static void TapSeqCh_Stop(ST_TapSeq pTapSeq, int iSeqCh) {
			ST_TapSeqCh pSeqCh = TapSeq_GetSeqCh(pTapSeq, iSeqCh);
			int iLogCh;
		lock(pTapSeq) {
				pSeqCh.pData = null;
				for(iLogCh = 0; iLogCh < pTapSeq.pInfo.nLogCh; iLogCh++) {
					ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
					if(pLogCh.iSeqCh == iSeqCh) {
						pLogCh.iSeqCh = byte.MaxValue;
						if(pLogCh.iPhr != ushort.MaxValue) {
							if((pTapSeq.pInfo.iCont != 0) && (TapSeq_GetPhrType(pTapSeq, pLogCh.iPhr) >= 0)) {
								if(pLogCh.iCont == 0) { pLogCh.iCont = pTapSeq.pInfo.iCont; }
							} else {
								TapLogCh_Stop(pTapSeq, iLogCh);
							}
						}
					}
				}
		}
		}
		public static ST_TapDevCh TapSeq_GetDevCh(ST_TapSeq pTapSeq, int iDevCh) {
			if((uint)iDevCh >= (uint)pTapSeq.pInfo.nDevCh) { throw new ApplicationException(); }
			return pTapSeq.TBL_DevCh[iDevCh];
		}
		public static ST_TapLogCh TapSeq_GetLogCh(ST_TapSeq pTapSeq, int iLogCh) {
			if((uint)iLogCh >= (uint)pTapSeq.pInfo.nLogCh) { throw new ApplicationException(); }
			return pTapSeq.TBL_LogCh[iLogCh];
		}
		public static ST_TapSeqCh TapSeq_GetSeqCh(ST_TapSeq pTapSeq, int iSeqCh) {
			if((uint)iSeqCh >= (uint)pTapSeq.pInfo.nSeqCh) { throw new ApplicationException(); }
			return pTapSeq.TBL_SeqCh[iSeqCh];
		}
		public static bool TapSeq_EvtGet(ST_TapSeq pTapSeq, out ST_TapEvt pBuf) {
			ST_TapEvtBuf pEvtBuf = TapSeq_GetEvtBuf(pTapSeq);
			ST_TapEvt[] TBL_Buf = pEvtBuf.TBL_Buf;
		lock(pTapSeq) {
				int iGetPos = pEvtBuf.iGetPos;
				if(iGetPos != pEvtBuf.iAddPos) {
					pBuf = TBL_Buf[iGetPos];
					if(++iGetPos > pTapSeq.pInfo.nEvt) { iGetPos = 0; }
					pEvtBuf.iGetPos = (byte)iGetPos;
					return true;
				} else {
					pBuf = default(ST_TapEvt);
					return false;
				}
		}
		}
		public static int TapSeq_EvtOvr(ST_TapSeq pTapSeq) {
			ST_TapEvtBuf pEvtBuf = TapSeq_GetEvtBuf(pTapSeq);
			int nOvrCnt;
		lock(pTapSeq) {
				nOvrCnt = pEvtBuf.nOvrCnt;
				pEvtBuf.nOvrCnt = 0;
		}
			return nOvrCnt;
		}
		private static void TapSeqInfo_Verify(ST_TapSeqInfo pInfo) {
			int iLogCh, iSeqCh;
			if((pInfo.nPhr   == 0)					||
			   (pInfo.nDevCh == 0)					||
			   (pInfo.nLogCh == 0)					||
			   (pInfo.nSeqCh == 0)					||
			  ((pInfo.nEvt   == 0) ^ (pInfo.iEvtMsk == 0))		||
			   (pInfo.fnPlay       == null)				||
			   (pInfo.fnStop       == null)				||
			   (pInfo.fnLoop       == null)				||
			   (pInfo.fnEnd        == null)				||
			   (pInfo.fnNext       == null)				||
			  ((pInfo.fnPrep       == null) && (pInfo.iPrep != 0))	||
			   (pInfo.fnCtrl       == null)				||
			   (pInfo.fnGetPhrTime == null)				||
			   (pInfo.fnGetPhrNext == null)) { throw new ApplicationException(); }
			for(iLogCh = 0; iLogCh < pInfo.nLogCh; iLogCh++) {
				byte[] pTapSet = pInfo.pTBL_TapSet[iLogCh];
				byte[] mask = new byte[256/8];
				foreach(int iDevCh in pTapSet) {
					if((uint)iDevCh >= (uint)pInfo.nDevCh) { throw new ApplicationException(); }
					if((mask[iDevCh/8] &        (1<<(iDevCh&7))) != 0) { throw new ApplicationException(); }
					    mask[iDevCh/8] |= (byte)(1<<(iDevCh&7));
				}
			}
			for(iSeqCh = 0; iSeqCh < pInfo.nSeqCh; iSeqCh++) {
				iLogCh = pInfo.pTBL_BaseCh[iSeqCh];
				if((uint)iLogCh >= (uint)pInfo.nLogCh) { throw new ApplicationException(); }
			}
		}
		private static void TapSeq_fnPlay(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			TapSeq_AddEvt(pTapSeq, TapEvt_Play, iLogCh, pLogCh.iPhr);
			pTapSeq.pInfo.fnPlay.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static void TapSeq_fnStop(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			TapSeq_AddEvt(pTapSeq, TapEvt_Stop, iLogCh, pLogCh.iPhr);
			pTapSeq.pInfo.fnStop.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static void TapSeq_fnLoop(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			TapSeq_AddEvt(pTapSeq, TapEvt_Loop, iLogCh, pLogCh.iPhr);
			pTapSeq.pInfo.fnLoop.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static void TapSeq_fnEnd(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			TapSeq_AddEvt(pTapSeq, TapEvt_End, iLogCh, pLogCh.iPhr);
			pTapSeq.pInfo.fnEnd.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static void TapSeq_fnNext(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			TapSeq_AddEvt(pTapSeq, TapEvt_Next, iLogCh, pLogCh.iPhr);
			pTapSeq.pInfo.fnNext.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static void TapSeq_fnCtrl(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			TapSeq_AddEvt(pTapSeq, TapEvt_Ctrl, iLogCh, pLogCh.iPhr);
			pTapSeq.pInfo.fnCtrl.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static void TapSeq_fnPrep(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			pTapSeq.pInfo.fnPrep.Invoke(pTapSeq, iLogCh, pLogCh);
		}
		private static int TapSeq_fnGetPhrTime(ST_TapSeq pTapSeq, int iPhr) {
			int iTime;
			if((uint)iPhr >= (uint)pTapSeq.pInfo.nPhr) { throw new ApplicationException(); }
			iTime = pTapSeq.pInfo.fnGetPhrTime.Invoke(pTapSeq, iPhr);
			if(iTime < 0) { throw new ApplicationException(); }
			return iTime;
		}
		private static int TapSeq_fnGetPhrNext(ST_TapSeq pTapSeq, int iPhr) {
			if((uint)iPhr >= (uint)pTapSeq.pInfo.nPhr) { throw new ApplicationException(); }
			iPhr = pTapSeq.pInfo.fnGetPhrNext.Invoke(pTapSeq, iPhr);
			if((iPhr < -2) || (iPhr >= pTapSeq.pInfo.nPhr)) { throw new ApplicationException(); }
			return iPhr;
		}
		private static int TapSeq_GetPhrType(ST_TapSeq pTapSeq, int iPhr) {
			if((uint)iPhr >= (uint)pTapSeq.pInfo.nPhr) { throw new ApplicationException(); }
			for(;;) {
				int iPhrNext = TapSeq_fnGetPhrNext(pTapSeq, iPhr);
				if(iPhrNext <     0) { return iPhrNext; }
				if(iPhrNext == iPhr) { return iPhr;     }
				iPhr = iPhrNext;
			}
		}
		private static void TapSeq_AcqLogCh(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh;
			ST_TapDevCh pDevCh;
			byte[] pTapSet;
			int iDevChSel, iLogChMin;
			pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			if(pLogCh.iDevCh != byte.MaxValue) { throw new ApplicationException(); }
			pTapSet = pTapSeq.pInfo.pTBL_TapSet[iLogCh];
			iDevChSel = -1;
			iLogChMin = iLogCh;
			foreach(int iDevCh in pTapSet) {
				pDevCh = TapSeq_GetDevCh(pTapSeq, iDevCh);
				if(pDevCh.iLogCh == iLogCh) { throw new ApplicationException(); }
				if(pDevCh.iLogCh == byte.MaxValue) {
					iDevChSel = iDevCh;
					break;
				}
				if(pDevCh.iLogCh < iLogChMin) {
					iDevChSel = iDevCh;
					iLogChMin = pDevCh.iLogCh;
				}
			}
			if(iDevChSel != -1) {
				pLogCh.iDevCh = (byte)iDevChSel;
				pDevCh = TapSeq_GetDevCh(pTapSeq, iDevChSel);
				if(pDevCh.iLogCh != byte.MaxValue) {
					pLogCh = TapSeq_GetLogCh(pTapSeq, pDevCh.iLogCh);
					if(pLogCh.iDevCh != iDevChSel) { throw new ApplicationException(); }
					pLogCh.iDevCh = byte.MaxValue;
				}
				pDevCh.iLogCh = (byte)iLogCh;
			}
		}
		private static void TapLogCh_PlaySubr(ST_TapSeq pTapSeq, int iLogCh, int iPhr) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			pLogCh.iPhr   = (ushort)iPhr;
			pLogCh.iWait += TapSeq_fnGetPhrTime(pTapSeq, pLogCh.iPhr);
			TapSeq_fnPlay(pTapSeq, iLogCh);
		}
		private static void TapLogCh_NextSubr(ST_TapSeq pTapSeq, int iLogCh, int iPhr) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			pLogCh.iPhr   = (ushort)iPhr;
			pLogCh.iWait += TapSeq_fnGetPhrTime(pTapSeq, pLogCh.iPhr);
			TapSeq_fnNext(pTapSeq, iLogCh);
		}
		private static void TapLogCh_LoopSubr(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			pLogCh.iWait += TapSeq_fnGetPhrTime(pTapSeq, pLogCh.iPhr);
			TapSeq_fnLoop(pTapSeq, iLogCh);
		}
		private static void TapLogCh_StopSubr(ST_TapSeq pTapSeq, int iLogCh) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			pLogCh.iPhr = ushort.MaxValue;
			if(pLogCh.iDevCh != byte.MaxValue) {
				ST_TapDevCh pDevCh = TapSeq_GetDevCh(pTapSeq, pLogCh.iDevCh);
				if(pDevCh.iLogCh != iLogCh) { throw new ApplicationException(); }
				pDevCh.iLogCh = byte.MaxValue;
				pLogCh.iDevCh = byte.MaxValue;
			}
		}
		private static void TapLogCh_Exec(ST_TapSeq pTapSeq, int iLogCh, int iElapTime) {
			ST_TapLogCh pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
			if(pLogCh.iPhr == ushort.MaxValue) { return; }
			if(pLogCh.iCont != 0) {
				UVAR_SUB(ref pLogCh.iCont, iElapTime);
				if(pLogCh.iCont == 0) {
					TapSeq_fnStop(pTapSeq, iLogCh);
					TapLogCh_StopSubr(pTapSeq, iLogCh);
					return;
				}
			}
			{
				int save_iWait = pLogCh.iWait;
				VAR_SUB(ref pLogCh.iWait, iElapTime);
				if(pLogCh.iWait > 0) {
					if((  save_iWait >= pTapSeq.pInfo.iPrep) &&
					   (pLogCh.iWait <  pTapSeq.pInfo.iPrep)) {
						TapSeq_fnPrep(pTapSeq, iLogCh);
					}
				}
			}
			while(pLogCh.iWait <= 0) {
				int iPhr = TapSeq_fnGetPhrNext(pTapSeq, pLogCh.iPhr);
				if(iPhr < 0) {
					if((pLogCh.iLoop != 0) && (--pLogCh.iLoop == 0)) {
						TapSeq_fnEnd(pTapSeq, iLogCh);
						TapLogCh_StopSubr(pTapSeq, iLogCh);
						return;
					} else {
						TapLogCh_LoopSubr(pTapSeq, iLogCh);
					}
				} else if(iPhr == pLogCh.iPhr) {
					TapLogCh_LoopSubr(pTapSeq, iLogCh);
				} else {
					TapLogCh_NextSubr(pTapSeq, iLogCh, iPhr);
				}
			}
		}
		private static void TapSeqCh_Exec(ST_TapSeq pTapSeq, int iSeqCh, int iElapTime) {
			ST_TapSeqCh pSeqCh = TapSeq_GetSeqCh(pTapSeq, iSeqCh);
			ST_TapLogCh pLogCh;
			int iData, iTime, iDist, iLogCh, iPhr, iLoop, iAtt, iPan;
			BytePtr pData;
			if(!pSeqCh.pData) { return; }
			VAR_SUB(ref pSeqCh.iWait, iElapTime);
			while(pSeqCh.iWait <= 0) {
				switch((iData = pSeqCh.pData.Read())) {
				default:throw new ApplicationException();
				case 0x00:
					pSeqCh.pData--;
					return;
				case 0x01:
				case 0x02:
				case 0x03:
				case 0x04:
					iTime  = 0;
					if(iData == 0x04) { iTime = -0x01010101; }
					do {
						iTime <<= 8;
						iTime  += ((pSeqCh.pData.Read()) + 1);
					} while(--iData != 0);
					VAR_ADD(ref pSeqCh.iWait, iTime);
					break;
				case 0x05:
				case 0x06:
				case 0x07:
					iLogCh = pSeqCh.pData.Read();
					iLogCh += pTapSeq.pInfo.pTBL_BaseCh[iSeqCh];
					pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
					iAtt   = pLogCh.iAtt; if((iData & 1) != 0) { iAtt =       pSeqCh.pData.Read(); }
					iPan   = pLogCh.iPan; if((iData & 2) != 0) { iPan = (byte)pSeqCh.pData.Read(); }
					TapLogCh_Ctrl(pTapSeq, iLogCh, iAtt, pLogCh.iPan);
					break;
				case 0x08:
				case 0x09:
				case 0x0A:
				case 0x0B:
				case 0x0C:
				case 0x0D:
				case 0x0E:
				case 0x0F:
				case 0x18:
				case 0x19:
				case 0x1A:
				case 0x1B:
				case 0x1C:
				case 0x1D:
				case 0x1E:
				case 0x1F:
					iLogCh = pSeqCh.pData.Read();
					iLogCh += pTapSeq.pInfo.pTBL_BaseCh[iSeqCh];
					pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
					iPhr   = pSeqCh.pData.Read();
					iPhr <<= 8;
					iPhr  |= pSeqCh.pData.Read();
					iLoop  = 1; if((iData & 1) != 0) { iLoop =       pSeqCh.pData.Read(); }
					iAtt   = 0; if((iData & 2) != 0) { iAtt  =       pSeqCh.pData.Read(); }
					iPan   = 0; if((iData & 4) != 0) { iPan  = (byte)pSeqCh.pData.Read(); }
					TapLogCh_Play(pTapSeq, iLogCh, iPhr, iLoop, iAtt, iPan);
					pLogCh.iSeqCh = (byte)iSeqCh;
					if((iData & 0x10) != 0) {
						iTime = TapSeq_fnGetPhrTime(pTapSeq, iPhr);
						VAR_ADD(ref pSeqCh.iWait, iTime);
					}
					break;
				case 0x10:
					iLogCh = pSeqCh.pData.Read();
					iLogCh += pTapSeq.pInfo.pTBL_BaseCh[iSeqCh];
					pLogCh = TapSeq_GetLogCh(pTapSeq, iLogCh);
					TapLogCh_Stop(pTapSeq, iLogCh);
					break;
				case 0x11:
				case 0x12:
				case 0x13:
				case 0x14:
					iData -= 0x10;
					pData = pSeqCh.pData - 1;
					iDist  = 0;
					if(iData == 0x04) { iDist = -0x01010101; }
					do {
						iDist <<= 8;
						iDist  += ((pSeqCh.pData.Read()) + 1);
					} while(--iData != 0);
					pSeqCh.pData = pData - iDist;
					break;
				}
			}
		}
		private static ST_TapEvtBuf TapSeq_GetEvtBuf(ST_TapSeq pTapSeq) {
			if(pTapSeq.pInfo.nEvt == 0) { throw new ApplicationException(); }
			return pTapSeq.EvtBuf;
		}
		private static void TapSeq_AddEvt(ST_TapSeq pTapSeq, int iEvt, int iLogCh, int iPhr) {
			if((pTapSeq.pInfo.nEvt != 0) &&
			  ((pTapSeq.pInfo.iEvtMsk & (1<<iEvt)) != 0)) {
				ST_TapEvtBuf pEvtBuf = TapSeq_GetEvtBuf(pTapSeq);
				ST_TapEvt[] TBL_Buf = pEvtBuf.TBL_Buf;
			lock(pTapSeq) {
					int iAddPos = pEvtBuf.iAddPos;
					int iBuf = iAddPos;
					if(++iAddPos > pTapSeq.pInfo.nEvt) { iAddPos = 0; }
					if(iAddPos != pEvtBuf.iGetPos) {
						pEvtBuf.iAddPos = (byte)iAddPos;
						TBL_Buf[iBuf].iEvt   = (byte)iEvt;
						TBL_Buf[iBuf].iLogCh = (byte)iLogCh;
						TBL_Buf[iBuf].iPhr   = (ushort)iPhr;
					} else {
						if(pEvtBuf.nOvrCnt < ushort.MaxValue) { pEvtBuf.nOvrCnt++; }
					}
			}
			}
		}
#if     USE_TAPDEF_BIN
		public static void TapSeqCh_PlayNo(ST_TapSeq pTapSeq, int iTapSeqCh, VoidPtr pTapDefBin, int iTapSeqNo) {
			Int32Ptr TBL_TapSeqNo = pTapDefBin;
			int nTapSeqNo = TBL_TapSeqNo[0];
			BytePtr TBL_TapSeq = (BytePtr)(TBL_TapSeqNo + nTapSeqNo);
			if((iTapSeqNo <= 0) || (iTapSeqNo >= nTapSeqNo)) { throw new ApplicationException(); }
			TapSeqCh_Play(pTapSeq, iTapSeqCh, TBL_TapSeq + TBL_TapSeqNo[iTapSeqNo]);
		}
#endif
	}
}
namespace com.Company {
	public static partial class Library {
		public class ST_TapMxrCh {
			public byte		iAttNow;
			public byte		iAttTo;
			public ushort		iRate;
			public ushort		iScale;
			public ushort		iErrTerm;
		}
		public class ST_TapMxr {
			public byte		nMxrCh;
			public ST_TapMxrCh[]	TBL_MxrCh;
		}
		public static ST_TapMxr TapMxr_New(int nMxrCh) {
			ST_TapMxr pTapMxr;
			if(((nMxrCh < 1) || (nMxrCh > byte.MaxValue))) { throw new ApplicationException(); }
			pTapMxr = new ST_TapMxr();
			TapMxr_Init(pTapMxr, nMxrCh);
			return pTapMxr;
		}
		public static void TapMxr_Init(ST_TapMxr pTapMxr, int nMxrCh) {
			if(((nMxrCh < 1) || (nMxrCh > byte.MaxValue))) { throw new ApplicationException(); }
			pTapMxr.nMxrCh = (byte)nMxrCh;
			pTapMxr.TBL_MxrCh = new ST_TapMxrCh[nMxrCh];
			for(int iMxrCh = 0; iMxrCh < nMxrCh; iMxrCh++) {
				pTapMxr.TBL_MxrCh[iMxrCh] = new ST_TapMxrCh();
			}
		}
		public static void TapMxr_Exec(ST_TapMxr pTapMxr, int iElapTime) {
			if(iElapTime <    0) { iElapTime =    0; }
			if(iElapTime > 1000) { iElapTime = 1000; }
			lock(pTapMxr) {
				for(int iMxrCh = 0; iMxrCh < pTapMxr.nMxrCh; iMxrCh++) {
					TapMxrCh_Exec(pTapMxr, iMxrCh, iElapTime);
				}
			}
		}
		public static void TapMxrCh_SetAtt(ST_TapMxr pTapMxr, int iMxrCh, int iAttTo, int iRate, int iScale) {
			ST_TapMxrCh pMxrCh = TapMxr_GetMxrCh(pTapMxr, iMxrCh);
			lock(pTapMxr) {
				if((pMxrCh.iAttTo != iAttTo) || (pMxrCh.iRate != iRate) || (pMxrCh.iScale != iScale)) {
					pMxrCh.iAttTo   = (byte)iAttTo;
					pMxrCh.iRate    = (ushort)iRate;
					pMxrCh.iScale   = (ushort)iScale;
					pMxrCh.iErrTerm = 0;
					if((iRate == 0) || (iScale == 0)) { pMxrCh.iAttNow = (byte)iAttTo; }
				}
			}
		}
		public static int TapMxr_GetAtt(ST_TapMxr pTapMxr, IEnumerable<int> aMxrChMask) {
			int iAttSum = 0;
			IEnumerator<int> pMask = aMxrChMask.GetEnumerator();
			uint uMask = 0;
			int  nBits = 0;
			int iMxrCh = 0;
			for(;;) {
				if(uMask != 0) {
					if((uMask & 1) != 0) {
						ST_TapMxrCh pMxrCh = TapMxr_GetMxrCh(pTapMxr, iMxrCh);
						iAttSum += pMxrCh.iAttNow;
					}
					iMxrCh++;
					if(iMxrCh >= pTapMxr.nMxrCh) { break; }
					uMask >>= 1;
					nBits--;
				} else {
					iMxrCh += nBits;
					if(iMxrCh >= pTapMxr.nMxrCh) { break; }
					if(!pMask.MoveNext()) { throw new ApplicationException(); }
					uMask = (uint)pMask.Current;
					nBits = 32;
				}
			}
			return iAttSum;
		}
		public static ST_TapMxrCh TapMxr_GetMxrCh(ST_TapMxr pTapMxr, int iMxrCh) {
			if((uint)iMxrCh >= (uint)pTapMxr.nMxrCh) { throw new ApplicationException(); }
			return pTapMxr.TBL_MxrCh[iMxrCh];
		}
		private static void TapMxrCh_Exec(ST_TapMxr pTapMxr, int iMxrCh, int iElapTime) {
			ST_TapMxrCh pMxrCh = TapMxr_GetMxrCh(pTapMxr, iMxrCh);
			int iAttNow = pMxrCh.iAttNow;
			int iAttTo  = pMxrCh.iAttTo;
			if(iAttNow != iAttTo) {
				int quot, rem;
				quot = Math.DivRem(
					pMxrCh.iErrTerm + (pMxrCh.iRate * iElapTime),
					pMxrCh.iScale,
					out rem);
				pMxrCh.iErrTerm = (ushort)rem;
				if(iAttNow < iAttTo) { if((iAttNow += quot) > iAttTo) { iAttNow = iAttTo; } }
				else                 { if((iAttNow -= quot) < iAttTo) { iAttNow = iAttTo; } }
				pMxrCh.iAttNow = (byte)iAttNow;
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public const int TimMgrCh_1f		= 0;
		public const int TimMgrCh_10ms		= 1;
		public const int TimMgrCh_100ms		= 2;
		public const int TimMgrCh_1s		= 3;
		public const int TimMgrCh_1ms		= 4;
		public const int TimMgrCh_SIZE		= 5;
		public class ST_TimMgrFunc {
			public Action<object>	fn;
			public object			arg;
			public ushort			uItv;
			public ushort			uCnt;
			public ST_TimMgrFunc		pNext;
		}
		public class ST_TimMgrCh {
			public          ushort		uSub;
			public volatile ushort		uErr;
			public volatile int		uCnt;
			public ST_TimMgrFunc		pNext;
		}
		public class ST_TimMgr {
			public byte				uAdd;
			public ST_TimMgrCh[]	TBL_TimMgrCh	= new ST_TimMgrCh[TimMgrCh_SIZE];
		}
		private static void TimMgr_Invoke(ST_TimMgrCh pCh) {
			ST_TimMgrFunc pFunc;
			pCh.uCnt++;
			for(pFunc = pCh.pNext; pFunc != null; pFunc = pFunc.pNext) {
				if(++pFunc.uCnt >= pFunc.uItv) {
					pFunc.uCnt = 0;
					pFunc.fn.Invoke(pFunc.arg);
				}
			}
		}
		public static void TimMgr_Init(ST_TimMgr pTimMgr, int uFps) {
			if((uFps < 1) || (uFps > (ushort.MaxValue/1000))) { throw new ApplicationException(); }
			for(int iCh = 0; iCh < TimMgrCh_SIZE; iCh++) {
				pTimMgr.TBL_TimMgrCh[iCh] = new ST_TimMgrCh();
			}
			pTimMgr.uAdd = (byte)uFps;
			pTimMgr.TBL_TimMgrCh[TimMgrCh_1f   ].uSub =                 1000;
			pTimMgr.TBL_TimMgrCh[TimMgrCh_10ms ].uSub = (ushort)(uFps *= 10);
			pTimMgr.TBL_TimMgrCh[TimMgrCh_100ms].uSub = (ushort)(uFps *= 10);
			pTimMgr.TBL_TimMgrCh[TimMgrCh_1s   ].uSub = (ushort)(uFps *= 10);
		}
		public static void TimMgr_AddFunc(ST_TimMgr pTimMgr, int iCh, ST_TimMgrFunc pFunc) {
			if(((uint)iCh >= TimMgrCh_SIZE) || (pFunc.fn == null) || (pFunc.uItv == 0)) { throw new ApplicationException(); }
			pFunc.uCnt  = 0;
			pFunc.pNext = null;
			ST_TimMgrCh pCh = pTimMgr.TBL_TimMgrCh[iCh];
			ST_TimMgrFunc ppNext = pCh.pNext;
			if(ppNext == null) {
				pCh.pNext = pFunc;
			} else {
				for(;;) {
					if(ppNext == pFunc) { throw new ApplicationException(); }
					if(ppNext.pNext == null) { break; }
					ppNext = ppNext.pNext;
				}
				ppNext.pNext = pFunc;
			}
		}
		public static int TimMgr_GetCnt(ST_TimMgr pTimMgr, int iCh) {
			if((uint)iCh >= TimMgrCh_SIZE) { throw new ApplicationException(); }
			return pTimMgr.TBL_TimMgrCh[iCh].uCnt;
		}
		public static void TimMgr_Exec(ST_TimMgr pTimMgr) {
			int uErr;
			foreach(ST_TimMgrCh pCh in pTimMgr.TBL_TimMgrCh) {
				if(pCh.uSub == 0) {
					break;
				}
				for(;;) {
				lock(pCh) {
						if((uErr = pCh.uErr - pCh.uSub) >= 0) { pCh.uErr = (ushort)uErr; }
				}
					if(uErr < 0) { break; }
					TimMgr_Invoke(pCh);
				}
			}
		}
		public static void TimMgr_Intr(ST_TimMgr pTimMgr) {
			int uErr;
			foreach(ST_TimMgrCh pCh in pTimMgr.TBL_TimMgrCh) {
				if(pCh.uSub == 0) {
					TimMgr_Invoke(pCh);
					break;
				}
			lock(pCh) {
					uErr = pCh.uErr + pTimMgr.uAdd;
					if(uErr > ushort.MaxValue) { uErr = ushort.MaxValue; }
					pCh.uErr = (ushort)uErr;
			}
			}
		}
	}
}
namespace com.Company {
	public static partial class Library {
		private static Dictionary<ushort,char> ShiftJisToUnicode = new Dictionary<ushort,char>();
		public static char ShiftJisToUnicodeChr(int s) {
			char u;
			if((uint)s <= 0x7F) { return (char)s; }
			if(!ShiftJisToUnicode.TryGetValue((ushort)s, out u)) {
				u = '?';
				for(int i = 0; i < cp932_to_Unicode_table.GetLength(0); i++) {
					if(cp932_to_Unicode_table[i,0] == s) {
						u = (char)cp932_to_Unicode_table[i,1];
						if(ShiftJisToUnicode.Count >= 1024) { ShiftJisToUnicode.Clear(); }
						ShiftJisToUnicode.Add((ushort)s, u);
						break;
					}
				}
			}
			return u;
		}
		public static string ShiftJisToUnicodeStr(BytePtr s) {
			List<char> u = new List<char>();
			int c1 = s.Read();
			while(c1 != 0) {
				int c2 = s.Read();
				if(ismbblead(c1) && ismbbtrail(c2)) {
					u.Add(ShiftJisToUnicodeChr((c1 << 8) | c2));
					c1 = s.Read();
				} else {
					u.Add(ShiftJisToUnicodeChr(c1));
					c1 = c2;
				}
			}
			return new string(u.ToArray());
		}
		private static Dictionary<char,ushort> UnicodeToShiftJis = new Dictionary<char,ushort>();
		public static int UnicodeToShiftJisChr(int u) {
			ushort s;
			if((uint)u <= 0x7F) { return u; }
			if(!UnicodeToShiftJis.TryGetValue((char)u, out s)) {
				s = '?';
				for(int i = 0; i < cp932_to_Unicode_table.GetLength(0); i++) {
					if(cp932_to_Unicode_table[i,1] == u) {
						s = cp932_to_Unicode_table[i,0];
						if(UnicodeToShiftJis.Count >= 1024) { UnicodeToShiftJis.Clear(); }
						UnicodeToShiftJis.Add((char)u, s);
						break;
					}
				}
			}
			return s;
		}
		public static byte[] UnicodeToShiftJisStr(string u) {
			List<byte> s = new List<byte>();
			foreach(char c1 in u) {
				int c2 = UnicodeToShiftJisChr(c1);
				if(c2 > byte.MaxValue) { s.Add((byte)(c2 >> 8)); }
				s.Add((byte)c2);
			}
			s.Add(0);
			return s.ToArray();
		}
		private static readonly ushort[,] cp932_to_Unicode_table = {
		{0x00A1,0xFF61},{0x00A2,0xFF62},{0x00A3,0xFF63},{0x00A4,0xFF64},{0x00A5,0xFF65},{0x00A6,0xFF66},{0x00A7,0xFF67},{0x00A8,0xFF68},{0x00A9,0xFF69},{0x00AA,0xFF6A},{0x00AB,0xFF6B},{0x00AC,0xFF6C},{0x00AD,0xFF6D},{0x00AE,0xFF6E},{0x00AF,0xFF6F},{0x00B0,0xFF70},
		{0x00B1,0xFF71},{0x00B2,0xFF72},{0x00B3,0xFF73},{0x00B4,0xFF74},{0x00B5,0xFF75},{0x00B6,0xFF76},{0x00B7,0xFF77},{0x00B8,0xFF78},{0x00B9,0xFF79},{0x00BA,0xFF7A},{0x00BB,0xFF7B},{0x00BC,0xFF7C},{0x00BD,0xFF7D},{0x00BE,0xFF7E},{0x00BF,0xFF7F},{0x00C0,0xFF80},
		{0x00C1,0xFF81},{0x00C2,0xFF82},{0x00C3,0xFF83},{0x00C4,0xFF84},{0x00C5,0xFF85},{0x00C6,0xFF86},{0x00C7,0xFF87},{0x00C8,0xFF88},{0x00C9,0xFF89},{0x00CA,0xFF8A},{0x00CB,0xFF8B},{0x00CC,0xFF8C},{0x00CD,0xFF8D},{0x00CE,0xFF8E},{0x00CF,0xFF8F},{0x00D0,0xFF90},
		{0x00D1,0xFF91},{0x00D2,0xFF92},{0x00D3,0xFF93},{0x00D4,0xFF94},{0x00D5,0xFF95},{0x00D6,0xFF96},{0x00D7,0xFF97},{0x00D8,0xFF98},{0x00D9,0xFF99},{0x00DA,0xFF9A},{0x00DB,0xFF9B},{0x00DC,0xFF9C},{0x00DD,0xFF9D},{0x00DE,0xFF9E},{0x00DF,0xFF9F},{0x8140,0x3000},
		{0x8141,0x3001},{0x8142,0x3002},{0x8143,0xFF0C},{0x8144,0xFF0E},{0x8145,0x30FB},{0x8146,0xFF1A},{0x8147,0xFF1B},{0x8148,0xFF1F},{0x8149,0xFF01},{0x814A,0x309B},{0x814B,0x309C},{0x814C,0x00B4},{0x814D,0xFF40},{0x814E,0x00A8},{0x814F,0xFF3E},{0x8150,0xFFE3},
		{0x8151,0xFF3F},{0x8152,0x30FD},{0x8153,0x30FE},{0x8154,0x309D},{0x8155,0x309E},{0x8156,0x3003},{0x8157,0x4EDD},{0x8158,0x3005},{0x8159,0x3006},{0x815A,0x3007},{0x815B,0x30FC},{0x815C,0x2015},{0x815D,0x2010},{0x815E,0xFF0F},{0x815F,0xFF3C},{0x8160,0xFF5E},
		{0x8161,0x2225},{0x8162,0xFF5C},{0x8163,0x2026},{0x8164,0x2025},{0x8165,0x2018},{0x8166,0x2019},{0x8167,0x201C},{0x8168,0x201D},{0x8169,0xFF08},{0x816A,0xFF09},{0x816B,0x3014},{0x816C,0x3015},{0x816D,0xFF3B},{0x816E,0xFF3D},{0x816F,0xFF5B},{0x8170,0xFF5D},
		{0x8171,0x3008},{0x8172,0x3009},{0x8173,0x300A},{0x8174,0x300B},{0x8175,0x300C},{0x8176,0x300D},{0x8177,0x300E},{0x8178,0x300F},{0x8179,0x3010},{0x817A,0x3011},{0x817B,0xFF0B},{0x817C,0xFF0D},{0x817D,0x00B1},{0x817E,0x00D7},{0x8180,0x00F7},{0x8181,0xFF1D},
		{0x8182,0x2260},{0x8183,0xFF1C},{0x8184,0xFF1E},{0x8185,0x2266},{0x8186,0x2267},{0x8187,0x221E},{0x8188,0x2234},{0x8189,0x2642},{0x818A,0x2640},{0x818B,0x00B0},{0x818C,0x2032},{0x818D,0x2033},{0x818E,0x2103},{0x818F,0xFFE5},{0x8190,0xFF04},{0x8191,0xFFE0},
		{0x8192,0xFFE1},{0x8193,0xFF05},{0x8194,0xFF03},{0x8195,0xFF06},{0x8196,0xFF0A},{0x8197,0xFF20},{0x8198,0x00A7},{0x8199,0x2606},{0x819A,0x2605},{0x819B,0x25CB},{0x819C,0x25CF},{0x819D,0x25CE},{0x819E,0x25C7},{0x819F,0x25C6},{0x81A0,0x25A1},{0x81A1,0x25A0},
		{0x81A2,0x25B3},{0x81A3,0x25B2},{0x81A4,0x25BD},{0x81A5,0x25BC},{0x81A6,0x203B},{0x81A7,0x3012},{0x81A8,0x2192},{0x81A9,0x2190},{0x81AA,0x2191},{0x81AB,0x2193},{0x81AC,0x3013},{0x81B8,0x2208},{0x81B9,0x220B},{0x81BA,0x2286},{0x81BB,0x2287},{0x81BC,0x2282},
		{0x81BD,0x2283},{0x81BE,0x222A},{0x81BF,0x2229},{0x81C8,0x2227},{0x81C9,0x2228},{0x81CA,0xFFE2},{0x81CB,0x21D2},{0x81CC,0x21D4},{0x81CD,0x2200},{0x81CE,0x2203},{0x81DA,0x2220},{0x81DB,0x22A5},{0x81DC,0x2312},{0x81DD,0x2202},{0x81DE,0x2207},{0x81DF,0x2261},
		{0x81E0,0x2252},{0x81E1,0x226A},{0x81E2,0x226B},{0x81E3,0x221A},{0x81E4,0x223D},{0x81E5,0x221D},{0x81E6,0x2235},{0x81E7,0x222B},{0x81E8,0x222C},{0x81F0,0x212B},{0x81F1,0x2030},{0x81F2,0x266F},{0x81F3,0x266D},{0x81F4,0x266A},{0x81F5,0x2020},{0x81F6,0x2021},
		{0x81F7,0x00B6},{0x81FC,0x25EF},{0x824F,0xFF10},{0x8250,0xFF11},{0x8251,0xFF12},{0x8252,0xFF13},{0x8253,0xFF14},{0x8254,0xFF15},{0x8255,0xFF16},{0x8256,0xFF17},{0x8257,0xFF18},{0x8258,0xFF19},{0x8260,0xFF21},{0x8261,0xFF22},{0x8262,0xFF23},{0x8263,0xFF24},
		{0x8264,0xFF25},{0x8265,0xFF26},{0x8266,0xFF27},{0x8267,0xFF28},{0x8268,0xFF29},{0x8269,0xFF2A},{0x826A,0xFF2B},{0x826B,0xFF2C},{0x826C,0xFF2D},{0x826D,0xFF2E},{0x826E,0xFF2F},{0x826F,0xFF30},{0x8270,0xFF31},{0x8271,0xFF32},{0x8272,0xFF33},{0x8273,0xFF34},
		{0x8274,0xFF35},{0x8275,0xFF36},{0x8276,0xFF37},{0x8277,0xFF38},{0x8278,0xFF39},{0x8279,0xFF3A},{0x8281,0xFF41},{0x8282,0xFF42},{0x8283,0xFF43},{0x8284,0xFF44},{0x8285,0xFF45},{0x8286,0xFF46},{0x8287,0xFF47},{0x8288,0xFF48},{0x8289,0xFF49},{0x828A,0xFF4A},
		{0x828B,0xFF4B},{0x828C,0xFF4C},{0x828D,0xFF4D},{0x828E,0xFF4E},{0x828F,0xFF4F},{0x8290,0xFF50},{0x8291,0xFF51},{0x8292,0xFF52},{0x8293,0xFF53},{0x8294,0xFF54},{0x8295,0xFF55},{0x8296,0xFF56},{0x8297,0xFF57},{0x8298,0xFF58},{0x8299,0xFF59},{0x829A,0xFF5A},
		{0x829F,0x3041},{0x82A0,0x3042},{0x82A1,0x3043},{0x82A2,0x3044},{0x82A3,0x3045},{0x82A4,0x3046},{0x82A5,0x3047},{0x82A6,0x3048},{0x82A7,0x3049},{0x82A8,0x304A},{0x82A9,0x304B},{0x82AA,0x304C},{0x82AB,0x304D},{0x82AC,0x304E},{0x82AD,0x304F},{0x82AE,0x3050},
		{0x82AF,0x3051},{0x82B0,0x3052},{0x82B1,0x3053},{0x82B2,0x3054},{0x82B3,0x3055},{0x82B4,0x3056},{0x82B5,0x3057},{0x82B6,0x3058},{0x82B7,0x3059},{0x82B8,0x305A},{0x82B9,0x305B},{0x82BA,0x305C},{0x82BB,0x305D},{0x82BC,0x305E},{0x82BD,0x305F},{0x82BE,0x3060},
		{0x82BF,0x3061},{0x82C0,0x3062},{0x82C1,0x3063},{0x82C2,0x3064},{0x82C3,0x3065},{0x82C4,0x3066},{0x82C5,0x3067},{0x82C6,0x3068},{0x82C7,0x3069},{0x82C8,0x306A},{0x82C9,0x306B},{0x82CA,0x306C},{0x82CB,0x306D},{0x82CC,0x306E},{0x82CD,0x306F},{0x82CE,0x3070},
		{0x82CF,0x3071},{0x82D0,0x3072},{0x82D1,0x3073},{0x82D2,0x3074},{0x82D3,0x3075},{0x82D4,0x3076},{0x82D5,0x3077},{0x82D6,0x3078},{0x82D7,0x3079},{0x82D8,0x307A},{0x82D9,0x307B},{0x82DA,0x307C},{0x82DB,0x307D},{0x82DC,0x307E},{0x82DD,0x307F},{0x82DE,0x3080},
		{0x82DF,0x3081},{0x82E0,0x3082},{0x82E1,0x3083},{0x82E2,0x3084},{0x82E3,0x3085},{0x82E4,0x3086},{0x82E5,0x3087},{0x82E6,0x3088},{0x82E7,0x3089},{0x82E8,0x308A},{0x82E9,0x308B},{0x82EA,0x308C},{0x82EB,0x308D},{0x82EC,0x308E},{0x82ED,0x308F},{0x82EE,0x3090},
		{0x82EF,0x3091},{0x82F0,0x3092},{0x82F1,0x3093},{0x8340,0x30A1},{0x8341,0x30A2},{0x8342,0x30A3},{0x8343,0x30A4},{0x8344,0x30A5},{0x8345,0x30A6},{0x8346,0x30A7},{0x8347,0x30A8},{0x8348,0x30A9},{0x8349,0x30AA},{0x834A,0x30AB},{0x834B,0x30AC},{0x834C,0x30AD},
		{0x834D,0x30AE},{0x834E,0x30AF},{0x834F,0x30B0},{0x8350,0x30B1},{0x8351,0x30B2},{0x8352,0x30B3},{0x8353,0x30B4},{0x8354,0x30B5},{0x8355,0x30B6},{0x8356,0x30B7},{0x8357,0x30B8},{0x8358,0x30B9},{0x8359,0x30BA},{0x835A,0x30BB},{0x835B,0x30BC},{0x835C,0x30BD},
		{0x835D,0x30BE},{0x835E,0x30BF},{0x835F,0x30C0},{0x8360,0x30C1},{0x8361,0x30C2},{0x8362,0x30C3},{0x8363,0x30C4},{0x8364,0x30C5},{0x8365,0x30C6},{0x8366,0x30C7},{0x8367,0x30C8},{0x8368,0x30C9},{0x8369,0x30CA},{0x836A,0x30CB},{0x836B,0x30CC},{0x836C,0x30CD},
		{0x836D,0x30CE},{0x836E,0x30CF},{0x836F,0x30D0},{0x8370,0x30D1},{0x8371,0x30D2},{0x8372,0x30D3},{0x8373,0x30D4},{0x8374,0x30D5},{0x8375,0x30D6},{0x8376,0x30D7},{0x8377,0x30D8},{0x8378,0x30D9},{0x8379,0x30DA},{0x837A,0x30DB},{0x837B,0x30DC},{0x837C,0x30DD},
		{0x837D,0x30DE},{0x837E,0x30DF},{0x8380,0x30E0},{0x8381,0x30E1},{0x8382,0x30E2},{0x8383,0x30E3},{0x8384,0x30E4},{0x8385,0x30E5},{0x8386,0x30E6},{0x8387,0x30E7},{0x8388,0x30E8},{0x8389,0x30E9},{0x838A,0x30EA},{0x838B,0x30EB},{0x838C,0x30EC},{0x838D,0x30ED},
		{0x838E,0x30EE},{0x838F,0x30EF},{0x8390,0x30F0},{0x8391,0x30F1},{0x8392,0x30F2},{0x8393,0x30F3},{0x8394,0x30F4},{0x8395,0x30F5},{0x8396,0x30F6},{0x839F,0x0391},{0x83A0,0x0392},{0x83A1,0x0393},{0x83A2,0x0394},{0x83A3,0x0395},{0x83A4,0x0396},{0x83A5,0x0397},
		{0x83A6,0x0398},{0x83A7,0x0399},{0x83A8,0x039A},{0x83A9,0x039B},{0x83AA,0x039C},{0x83AB,0x039D},{0x83AC,0x039E},{0x83AD,0x039F},{0x83AE,0x03A0},{0x83AF,0x03A1},{0x83B0,0x03A3},{0x83B1,0x03A4},{0x83B2,0x03A5},{0x83B3,0x03A6},{0x83B4,0x03A7},{0x83B5,0x03A8},
		{0x83B6,0x03A9},{0x83BF,0x03B1},{0x83C0,0x03B2},{0x83C1,0x03B3},{0x83C2,0x03B4},{0x83C3,0x03B5},{0x83C4,0x03B6},{0x83C5,0x03B7},{0x83C6,0x03B8},{0x83C7,0x03B9},{0x83C8,0x03BA},{0x83C9,0x03BB},{0x83CA,0x03BC},{0x83CB,0x03BD},{0x83CC,0x03BE},{0x83CD,0x03BF},
		{0x83CE,0x03C0},{0x83CF,0x03C1},{0x83D0,0x03C3},{0x83D1,0x03C4},{0x83D2,0x03C5},{0x83D3,0x03C6},{0x83D4,0x03C7},{0x83D5,0x03C8},{0x83D6,0x03C9},{0x8440,0x0410},{0x8441,0x0411},{0x8442,0x0412},{0x8443,0x0413},{0x8444,0x0414},{0x8445,0x0415},{0x8446,0x0401},
		{0x8447,0x0416},{0x8448,0x0417},{0x8449,0x0418},{0x844A,0x0419},{0x844B,0x041A},{0x844C,0x041B},{0x844D,0x041C},{0x844E,0x041D},{0x844F,0x041E},{0x8450,0x041F},{0x8451,0x0420},{0x8452,0x0421},{0x8453,0x0422},{0x8454,0x0423},{0x8455,0x0424},{0x8456,0x0425},
		{0x8457,0x0426},{0x8458,0x0427},{0x8459,0x0428},{0x845A,0x0429},{0x845B,0x042A},{0x845C,0x042B},{0x845D,0x042C},{0x845E,0x042D},{0x845F,0x042E},{0x8460,0x042F},{0x8470,0x0430},{0x8471,0x0431},{0x8472,0x0432},{0x8473,0x0433},{0x8474,0x0434},{0x8475,0x0435},
		{0x8476,0x0451},{0x8477,0x0436},{0x8478,0x0437},{0x8479,0x0438},{0x847A,0x0439},{0x847B,0x043A},{0x847C,0x043B},{0x847D,0x043C},{0x847E,0x043D},{0x8480,0x043E},{0x8481,0x043F},{0x8482,0x0440},{0x8483,0x0441},{0x8484,0x0442},{0x8485,0x0443},{0x8486,0x0444},
		{0x8487,0x0445},{0x8488,0x0446},{0x8489,0x0447},{0x848A,0x0448},{0x848B,0x0449},{0x848C,0x044A},{0x848D,0x044B},{0x848E,0x044C},{0x848F,0x044D},{0x8490,0x044E},{0x8491,0x044F},{0x849F,0x2500},{0x84A0,0x2502},{0x84A1,0x250C},{0x84A2,0x2510},{0x84A3,0x2518},
		{0x84A4,0x2514},{0x84A5,0x251C},{0x84A6,0x252C},{0x84A7,0x2524},{0x84A8,0x2534},{0x84A9,0x253C},{0x84AA,0x2501},{0x84AB,0x2503},{0x84AC,0x250F},{0x84AD,0x2513},{0x84AE,0x251B},{0x84AF,0x2517},{0x84B0,0x2523},{0x84B1,0x2533},{0x84B2,0x252B},{0x84B3,0x253B},
		{0x84B4,0x254B},{0x84B5,0x2520},{0x84B6,0x252F},{0x84B7,0x2528},{0x84B8,0x2537},{0x84B9,0x253F},{0x84BA,0x251D},{0x84BB,0x2530},{0x84BC,0x2525},{0x84BD,0x2538},{0x84BE,0x2542},{0x8740,0x2460},{0x8741,0x2461},{0x8742,0x2462},{0x8743,0x2463},{0x8744,0x2464},
		{0x8745,0x2465},{0x8746,0x2466},{0x8747,0x2467},{0x8748,0x2468},{0x8749,0x2469},{0x874A,0x246A},{0x874B,0x246B},{0x874C,0x246C},{0x874D,0x246D},{0x874E,0x246E},{0x874F,0x246F},{0x8750,0x2470},{0x8751,0x2471},{0x8752,0x2472},{0x8753,0x2473},{0x8754,0x2160},
		{0x8755,0x2161},{0x8756,0x2162},{0x8757,0x2163},{0x8758,0x2164},{0x8759,0x2165},{0x875A,0x2166},{0x875B,0x2167},{0x875C,0x2168},{0x875D,0x2169},{0x875F,0x3349},{0x8760,0x3314},{0x8761,0x3322},{0x8762,0x334D},{0x8763,0x3318},{0x8764,0x3327},{0x8765,0x3303},
		{0x8766,0x3336},{0x8767,0x3351},{0x8768,0x3357},{0x8769,0x330D},{0x876A,0x3326},{0x876B,0x3323},{0x876C,0x332B},{0x876D,0x334A},{0x876E,0x333B},{0x876F,0x339C},{0x8770,0x339D},{0x8771,0x339E},{0x8772,0x338E},{0x8773,0x338F},{0x8774,0x33C4},{0x8775,0x33A1},
		{0x877E,0x337B},{0x8780,0x301D},{0x8781,0x301F},{0x8782,0x2116},{0x8783,0x33CD},{0x8784,0x2121},{0x8785,0x32A4},{0x8786,0x32A5},{0x8787,0x32A6},{0x8788,0x32A7},{0x8789,0x32A8},{0x878A,0x3231},{0x878B,0x3232},{0x878C,0x3239},{0x878D,0x337E},{0x878E,0x337D},
		{0x878F,0x337C},{0x8790,0x2252},{0x8791,0x2261},{0x8792,0x222B},{0x8793,0x222E},{0x8794,0x2211},{0x8795,0x221A},{0x8796,0x22A5},{0x8797,0x2220},{0x8798,0x221F},{0x8799,0x22BF},{0x879A,0x2235},{0x879B,0x2229},{0x879C,0x222A},{0x889F,0x4E9C},{0x88A0,0x5516},
		{0x88A1,0x5A03},{0x88A2,0x963F},{0x88A3,0x54C0},{0x88A4,0x611B},{0x88A5,0x6328},{0x88A6,0x59F6},{0x88A7,0x9022},{0x88A8,0x8475},{0x88A9,0x831C},{0x88AA,0x7A50},{0x88AB,0x60AA},{0x88AC,0x63E1},{0x88AD,0x6E25},{0x88AE,0x65ED},{0x88AF,0x8466},{0x88B0,0x82A6},
		{0x88B1,0x9BF5},{0x88B2,0x6893},{0x88B3,0x5727},{0x88B4,0x65A1},{0x88B5,0x6271},{0x88B6,0x5B9B},{0x88B7,0x59D0},{0x88B8,0x867B},{0x88B9,0x98F4},{0x88BA,0x7D62},{0x88BB,0x7DBE},{0x88BC,0x9B8E},{0x88BD,0x6216},{0x88BE,0x7C9F},{0x88BF,0x88B7},{0x88C0,0x5B89},
		{0x88C1,0x5EB5},{0x88C2,0x6309},{0x88C3,0x6697},{0x88C4,0x6848},{0x88C5,0x95C7},{0x88C6,0x978D},{0x88C7,0x674F},{0x88C8,0x4EE5},{0x88C9,0x4F0A},{0x88CA,0x4F4D},{0x88CB,0x4F9D},{0x88CC,0x5049},{0x88CD,0x56F2},{0x88CE,0x5937},{0x88CF,0x59D4},{0x88D0,0x5A01},
		{0x88D1,0x5C09},{0x88D2,0x60DF},{0x88D3,0x610F},{0x88D4,0x6170},{0x88D5,0x6613},{0x88D6,0x6905},{0x88D7,0x70BA},{0x88D8,0x754F},{0x88D9,0x7570},{0x88DA,0x79FB},{0x88DB,0x7DAD},{0x88DC,0x7DEF},{0x88DD,0x80C3},{0x88DE,0x840E},{0x88DF,0x8863},{0x88E0,0x8B02},
		{0x88E1,0x9055},{0x88E2,0x907A},{0x88E3,0x533B},{0x88E4,0x4E95},{0x88E5,0x4EA5},{0x88E6,0x57DF},{0x88E7,0x80B2},{0x88E8,0x90C1},{0x88E9,0x78EF},{0x88EA,0x4E00},{0x88EB,0x58F1},{0x88EC,0x6EA2},{0x88ED,0x9038},{0x88EE,0x7A32},{0x88EF,0x8328},{0x88F0,0x828B},
		{0x88F1,0x9C2F},{0x88F2,0x5141},{0x88F3,0x5370},{0x88F4,0x54BD},{0x88F5,0x54E1},{0x88F6,0x56E0},{0x88F7,0x59FB},{0x88F8,0x5F15},{0x88F9,0x98F2},{0x88FA,0x6DEB},{0x88FB,0x80E4},{0x88FC,0x852D},{0x8940,0x9662},{0x8941,0x9670},{0x8942,0x96A0},{0x8943,0x97FB},
		{0x8944,0x540B},{0x8945,0x53F3},{0x8946,0x5B87},{0x8947,0x70CF},{0x8948,0x7FBD},{0x8949,0x8FC2},{0x894A,0x96E8},{0x894B,0x536F},{0x894C,0x9D5C},{0x894D,0x7ABA},{0x894E,0x4E11},{0x894F,0x7893},{0x8950,0x81FC},{0x8951,0x6E26},{0x8952,0x5618},{0x8953,0x5504},
		{0x8954,0x6B1D},{0x8955,0x851A},{0x8956,0x9C3B},{0x8957,0x59E5},{0x8958,0x53A9},{0x8959,0x6D66},{0x895A,0x74DC},{0x895B,0x958F},{0x895C,0x5642},{0x895D,0x4E91},{0x895E,0x904B},{0x895F,0x96F2},{0x8960,0x834F},{0x8961,0x990C},{0x8962,0x53E1},{0x8963,0x55B6},
		{0x8964,0x5B30},{0x8965,0x5F71},{0x8966,0x6620},{0x8967,0x66F3},{0x8968,0x6804},{0x8969,0x6C38},{0x896A,0x6CF3},{0x896B,0x6D29},{0x896C,0x745B},{0x896D,0x76C8},{0x896E,0x7A4E},{0x896F,0x9834},{0x8970,0x82F1},{0x8971,0x885B},{0x8972,0x8A60},{0x8973,0x92ED},
		{0x8974,0x6DB2},{0x8975,0x75AB},{0x8976,0x76CA},{0x8977,0x99C5},{0x8978,0x60A6},{0x8979,0x8B01},{0x897A,0x8D8A},{0x897B,0x95B2},{0x897C,0x698E},{0x897D,0x53AD},{0x897E,0x5186},{0x8980,0x5712},{0x8981,0x5830},{0x8982,0x5944},{0x8983,0x5BB4},{0x8984,0x5EF6},
		{0x8985,0x6028},{0x8986,0x63A9},{0x8987,0x63F4},{0x8988,0x6CBF},{0x8989,0x6F14},{0x898A,0x708E},{0x898B,0x7114},{0x898C,0x7159},{0x898D,0x71D5},{0x898E,0x733F},{0x898F,0x7E01},{0x8990,0x8276},{0x8991,0x82D1},{0x8992,0x8597},{0x8993,0x9060},{0x8994,0x925B},
		{0x8995,0x9D1B},{0x8996,0x5869},{0x8997,0x65BC},{0x8998,0x6C5A},{0x8999,0x7525},{0x899A,0x51F9},{0x899B,0x592E},{0x899C,0x5965},{0x899D,0x5F80},{0x899E,0x5FDC},{0x899F,0x62BC},{0x89A0,0x65FA},{0x89A1,0x6A2A},{0x89A2,0x6B27},{0x89A3,0x6BB4},{0x89A4,0x738B},
		{0x89A5,0x7FC1},{0x89A6,0x8956},{0x89A7,0x9D2C},{0x89A8,0x9D0E},{0x89A9,0x9EC4},{0x89AA,0x5CA1},{0x89AB,0x6C96},{0x89AC,0x837B},{0x89AD,0x5104},{0x89AE,0x5C4B},{0x89AF,0x61B6},{0x89B0,0x81C6},{0x89B1,0x6876},{0x89B2,0x7261},{0x89B3,0x4E59},{0x89B4,0x4FFA},
		{0x89B5,0x5378},{0x89B6,0x6069},{0x89B7,0x6E29},{0x89B8,0x7A4F},{0x89B9,0x97F3},{0x89BA,0x4E0B},{0x89BB,0x5316},{0x89BC,0x4EEE},{0x89BD,0x4F55},{0x89BE,0x4F3D},{0x89BF,0x4FA1},{0x89C0,0x4F73},{0x89C1,0x52A0},{0x89C2,0x53EF},{0x89C3,0x5609},{0x89C4,0x590F},
		{0x89C5,0x5AC1},{0x89C6,0x5BB6},{0x89C7,0x5BE1},{0x89C8,0x79D1},{0x89C9,0x6687},{0x89CA,0x679C},{0x89CB,0x67B6},{0x89CC,0x6B4C},{0x89CD,0x6CB3},{0x89CE,0x706B},{0x89CF,0x73C2},{0x89D0,0x798D},{0x89D1,0x79BE},{0x89D2,0x7A3C},{0x89D3,0x7B87},{0x89D4,0x82B1},
		{0x89D5,0x82DB},{0x89D6,0x8304},{0x89D7,0x8377},{0x89D8,0x83EF},{0x89D9,0x83D3},{0x89DA,0x8766},{0x89DB,0x8AB2},{0x89DC,0x5629},{0x89DD,0x8CA8},{0x89DE,0x8FE6},{0x89DF,0x904E},{0x89E0,0x971E},{0x89E1,0x868A},{0x89E2,0x4FC4},{0x89E3,0x5CE8},{0x89E4,0x6211},
		{0x89E5,0x7259},{0x89E6,0x753B},{0x89E7,0x81E5},{0x89E8,0x82BD},{0x89E9,0x86FE},{0x89EA,0x8CC0},{0x89EB,0x96C5},{0x89EC,0x9913},{0x89ED,0x99D5},{0x89EE,0x4ECB},{0x89EF,0x4F1A},{0x89F0,0x89E3},{0x89F1,0x56DE},{0x89F2,0x584A},{0x89F3,0x58CA},{0x89F4,0x5EFB},
		{0x89F5,0x5FEB},{0x89F6,0x602A},{0x89F7,0x6094},{0x89F8,0x6062},{0x89F9,0x61D0},{0x89FA,0x6212},{0x89FB,0x62D0},{0x89FC,0x6539},{0x8A40,0x9B41},{0x8A41,0x6666},{0x8A42,0x68B0},{0x8A43,0x6D77},{0x8A44,0x7070},{0x8A45,0x754C},{0x8A46,0x7686},{0x8A47,0x7D75},
		{0x8A48,0x82A5},{0x8A49,0x87F9},{0x8A4A,0x958B},{0x8A4B,0x968E},{0x8A4C,0x8C9D},{0x8A4D,0x51F1},{0x8A4E,0x52BE},{0x8A4F,0x5916},{0x8A50,0x54B3},{0x8A51,0x5BB3},{0x8A52,0x5D16},{0x8A53,0x6168},{0x8A54,0x6982},{0x8A55,0x6DAF},{0x8A56,0x788D},{0x8A57,0x84CB},
		{0x8A58,0x8857},{0x8A59,0x8A72},{0x8A5A,0x93A7},{0x8A5B,0x9AB8},{0x8A5C,0x6D6C},{0x8A5D,0x99A8},{0x8A5E,0x86D9},{0x8A5F,0x57A3},{0x8A60,0x67FF},{0x8A61,0x86CE},{0x8A62,0x920E},{0x8A63,0x5283},{0x8A64,0x5687},{0x8A65,0x5404},{0x8A66,0x5ED3},{0x8A67,0x62E1},
		{0x8A68,0x64B9},{0x8A69,0x683C},{0x8A6A,0x6838},{0x8A6B,0x6BBB},{0x8A6C,0x7372},{0x8A6D,0x78BA},{0x8A6E,0x7A6B},{0x8A6F,0x899A},{0x8A70,0x89D2},{0x8A71,0x8D6B},{0x8A72,0x8F03},{0x8A73,0x90ED},{0x8A74,0x95A3},{0x8A75,0x9694},{0x8A76,0x9769},{0x8A77,0x5B66},
		{0x8A78,0x5CB3},{0x8A79,0x697D},{0x8A7A,0x984D},{0x8A7B,0x984E},{0x8A7C,0x639B},{0x8A7D,0x7B20},{0x8A7E,0x6A2B},{0x8A80,0x6A7F},{0x8A81,0x68B6},{0x8A82,0x9C0D},{0x8A83,0x6F5F},{0x8A84,0x5272},{0x8A85,0x559D},{0x8A86,0x6070},{0x8A87,0x62EC},{0x8A88,0x6D3B},
		{0x8A89,0x6E07},{0x8A8A,0x6ED1},{0x8A8B,0x845B},{0x8A8C,0x8910},{0x8A8D,0x8F44},{0x8A8E,0x4E14},{0x8A8F,0x9C39},{0x8A90,0x53F6},{0x8A91,0x691B},{0x8A92,0x6A3A},{0x8A93,0x9784},{0x8A94,0x682A},{0x8A95,0x515C},{0x8A96,0x7AC3},{0x8A97,0x84B2},{0x8A98,0x91DC},
		{0x8A99,0x938C},{0x8A9A,0x565B},{0x8A9B,0x9D28},{0x8A9C,0x6822},{0x8A9D,0x8305},{0x8A9E,0x8431},{0x8A9F,0x7CA5},{0x8AA0,0x5208},{0x8AA1,0x82C5},{0x8AA2,0x74E6},{0x8AA3,0x4E7E},{0x8AA4,0x4F83},{0x8AA5,0x51A0},{0x8AA6,0x5BD2},{0x8AA7,0x520A},{0x8AA8,0x52D8},
		{0x8AA9,0x52E7},{0x8AAA,0x5DFB},{0x8AAB,0x559A},{0x8AAC,0x582A},{0x8AAD,0x59E6},{0x8AAE,0x5B8C},{0x8AAF,0x5B98},{0x8AB0,0x5BDB},{0x8AB1,0x5E72},{0x8AB2,0x5E79},{0x8AB3,0x60A3},{0x8AB4,0x611F},{0x8AB5,0x6163},{0x8AB6,0x61BE},{0x8AB7,0x63DB},{0x8AB8,0x6562},
		{0x8AB9,0x67D1},{0x8ABA,0x6853},{0x8ABB,0x68FA},{0x8ABC,0x6B3E},{0x8ABD,0x6B53},{0x8ABE,0x6C57},{0x8ABF,0x6F22},{0x8AC0,0x6F97},{0x8AC1,0x6F45},{0x8AC2,0x74B0},{0x8AC3,0x7518},{0x8AC4,0x76E3},{0x8AC5,0x770B},{0x8AC6,0x7AFF},{0x8AC7,0x7BA1},{0x8AC8,0x7C21},
		{0x8AC9,0x7DE9},{0x8ACA,0x7F36},{0x8ACB,0x7FF0},{0x8ACC,0x809D},{0x8ACD,0x8266},{0x8ACE,0x839E},{0x8ACF,0x89B3},{0x8AD0,0x8ACC},{0x8AD1,0x8CAB},{0x8AD2,0x9084},{0x8AD3,0x9451},{0x8AD4,0x9593},{0x8AD5,0x9591},{0x8AD6,0x95A2},{0x8AD7,0x9665},{0x8AD8,0x97D3},
		{0x8AD9,0x9928},{0x8ADA,0x8218},{0x8ADB,0x4E38},{0x8ADC,0x542B},{0x8ADD,0x5CB8},{0x8ADE,0x5DCC},{0x8ADF,0x73A9},{0x8AE0,0x764C},{0x8AE1,0x773C},{0x8AE2,0x5CA9},{0x8AE3,0x7FEB},{0x8AE4,0x8D0B},{0x8AE5,0x96C1},{0x8AE6,0x9811},{0x8AE7,0x9854},{0x8AE8,0x9858},
		{0x8AE9,0x4F01},{0x8AEA,0x4F0E},{0x8AEB,0x5371},{0x8AEC,0x559C},{0x8AED,0x5668},{0x8AEE,0x57FA},{0x8AEF,0x5947},{0x8AF0,0x5B09},{0x8AF1,0x5BC4},{0x8AF2,0x5C90},{0x8AF3,0x5E0C},{0x8AF4,0x5E7E},{0x8AF5,0x5FCC},{0x8AF6,0x63EE},{0x8AF7,0x673A},{0x8AF8,0x65D7},
		{0x8AF9,0x65E2},{0x8AFA,0x671F},{0x8AFB,0x68CB},{0x8AFC,0x68C4},{0x8B40,0x6A5F},{0x8B41,0x5E30},{0x8B42,0x6BC5},{0x8B43,0x6C17},{0x8B44,0x6C7D},{0x8B45,0x757F},{0x8B46,0x7948},{0x8B47,0x5B63},{0x8B48,0x7A00},{0x8B49,0x7D00},{0x8B4A,0x5FBD},{0x8B4B,0x898F},
		{0x8B4C,0x8A18},{0x8B4D,0x8CB4},{0x8B4E,0x8D77},{0x8B4F,0x8ECC},{0x8B50,0x8F1D},{0x8B51,0x98E2},{0x8B52,0x9A0E},{0x8B53,0x9B3C},{0x8B54,0x4E80},{0x8B55,0x507D},{0x8B56,0x5100},{0x8B57,0x5993},{0x8B58,0x5B9C},{0x8B59,0x622F},{0x8B5A,0x6280},{0x8B5B,0x64EC},
		{0x8B5C,0x6B3A},{0x8B5D,0x72A0},{0x8B5E,0x7591},{0x8B5F,0x7947},{0x8B60,0x7FA9},{0x8B61,0x87FB},{0x8B62,0x8ABC},{0x8B63,0x8B70},{0x8B64,0x63AC},{0x8B65,0x83CA},{0x8B66,0x97A0},{0x8B67,0x5409},{0x8B68,0x5403},{0x8B69,0x55AB},{0x8B6A,0x6854},{0x8B6B,0x6A58},
		{0x8B6C,0x8A70},{0x8B6D,0x7827},{0x8B6E,0x6775},{0x8B6F,0x9ECD},{0x8B70,0x5374},{0x8B71,0x5BA2},{0x8B72,0x811A},{0x8B73,0x8650},{0x8B74,0x9006},{0x8B75,0x4E18},{0x8B76,0x4E45},{0x8B77,0x4EC7},{0x8B78,0x4F11},{0x8B79,0x53CA},{0x8B7A,0x5438},{0x8B7B,0x5BAE},
		{0x8B7C,0x5F13},{0x8B7D,0x6025},{0x8B7E,0x6551},{0x8B80,0x673D},{0x8B81,0x6C42},{0x8B82,0x6C72},{0x8B83,0x6CE3},{0x8B84,0x7078},{0x8B85,0x7403},{0x8B86,0x7A76},{0x8B87,0x7AAE},{0x8B88,0x7B08},{0x8B89,0x7D1A},{0x8B8A,0x7CFE},{0x8B8B,0x7D66},{0x8B8C,0x65E7},
		{0x8B8D,0x725B},{0x8B8E,0x53BB},{0x8B8F,0x5C45},{0x8B90,0x5DE8},{0x8B91,0x62D2},{0x8B92,0x62E0},{0x8B93,0x6319},{0x8B94,0x6E20},{0x8B95,0x865A},{0x8B96,0x8A31},{0x8B97,0x8DDD},{0x8B98,0x92F8},{0x8B99,0x6F01},{0x8B9A,0x79A6},{0x8B9B,0x9B5A},{0x8B9C,0x4EA8},
		{0x8B9D,0x4EAB},{0x8B9E,0x4EAC},{0x8B9F,0x4F9B},{0x8BA0,0x4FA0},{0x8BA1,0x50D1},{0x8BA2,0x5147},{0x8BA3,0x7AF6},{0x8BA4,0x5171},{0x8BA5,0x51F6},{0x8BA6,0x5354},{0x8BA7,0x5321},{0x8BA8,0x537F},{0x8BA9,0x53EB},{0x8BAA,0x55AC},{0x8BAB,0x5883},{0x8BAC,0x5CE1},
		{0x8BAD,0x5F37},{0x8BAE,0x5F4A},{0x8BAF,0x602F},{0x8BB0,0x6050},{0x8BB1,0x606D},{0x8BB2,0x631F},{0x8BB3,0x6559},{0x8BB4,0x6A4B},{0x8BB5,0x6CC1},{0x8BB6,0x72C2},{0x8BB7,0x72ED},{0x8BB8,0x77EF},{0x8BB9,0x80F8},{0x8BBA,0x8105},{0x8BBB,0x8208},{0x8BBC,0x854E},
		{0x8BBD,0x90F7},{0x8BBE,0x93E1},{0x8BBF,0x97FF},{0x8BC0,0x9957},{0x8BC1,0x9A5A},{0x8BC2,0x4EF0},{0x8BC3,0x51DD},{0x8BC4,0x5C2D},{0x8BC5,0x6681},{0x8BC6,0x696D},{0x8BC7,0x5C40},{0x8BC8,0x66F2},{0x8BC9,0x6975},{0x8BCA,0x7389},{0x8BCB,0x6850},{0x8BCC,0x7C81},
		{0x8BCD,0x50C5},{0x8BCE,0x52E4},{0x8BCF,0x5747},{0x8BD0,0x5DFE},{0x8BD1,0x9326},{0x8BD2,0x65A4},{0x8BD3,0x6B23},{0x8BD4,0x6B3D},{0x8BD5,0x7434},{0x8BD6,0x7981},{0x8BD7,0x79BD},{0x8BD8,0x7B4B},{0x8BD9,0x7DCA},{0x8BDA,0x82B9},{0x8BDB,0x83CC},{0x8BDC,0x887F},
		{0x8BDD,0x895F},{0x8BDE,0x8B39},{0x8BDF,0x8FD1},{0x8BE0,0x91D1},{0x8BE1,0x541F},{0x8BE2,0x9280},{0x8BE3,0x4E5D},{0x8BE4,0x5036},{0x8BE5,0x53E5},{0x8BE6,0x533A},{0x8BE7,0x72D7},{0x8BE8,0x7396},{0x8BE9,0x77E9},{0x8BEA,0x82E6},{0x8BEB,0x8EAF},{0x8BEC,0x99C6},
		{0x8BED,0x99C8},{0x8BEE,0x99D2},{0x8BEF,0x5177},{0x8BF0,0x611A},{0x8BF1,0x865E},{0x8BF2,0x55B0},{0x8BF3,0x7A7A},{0x8BF4,0x5076},{0x8BF5,0x5BD3},{0x8BF6,0x9047},{0x8BF7,0x9685},{0x8BF8,0x4E32},{0x8BF9,0x6ADB},{0x8BFA,0x91E7},{0x8BFB,0x5C51},{0x8BFC,0x5C48},
		{0x8C40,0x6398},{0x8C41,0x7A9F},{0x8C42,0x6C93},{0x8C43,0x9774},{0x8C44,0x8F61},{0x8C45,0x7AAA},{0x8C46,0x718A},{0x8C47,0x9688},{0x8C48,0x7C82},{0x8C49,0x6817},{0x8C4A,0x7E70},{0x8C4B,0x6851},{0x8C4C,0x936C},{0x8C4D,0x52F2},{0x8C4E,0x541B},{0x8C4F,0x85AB},
		{0x8C50,0x8A13},{0x8C51,0x7FA4},{0x8C52,0x8ECD},{0x8C53,0x90E1},{0x8C54,0x5366},{0x8C55,0x8888},{0x8C56,0x7941},{0x8C57,0x4FC2},{0x8C58,0x50BE},{0x8C59,0x5211},{0x8C5A,0x5144},{0x8C5B,0x5553},{0x8C5C,0x572D},{0x8C5D,0x73EA},{0x8C5E,0x578B},{0x8C5F,0x5951},
		{0x8C60,0x5F62},{0x8C61,0x5F84},{0x8C62,0x6075},{0x8C63,0x6176},{0x8C64,0x6167},{0x8C65,0x61A9},{0x8C66,0x63B2},{0x8C67,0x643A},{0x8C68,0x656C},{0x8C69,0x666F},{0x8C6A,0x6842},{0x8C6B,0x6E13},{0x8C6C,0x7566},{0x8C6D,0x7A3D},{0x8C6E,0x7CFB},{0x8C6F,0x7D4C},
		{0x8C70,0x7D99},{0x8C71,0x7E4B},{0x8C72,0x7F6B},{0x8C73,0x830E},{0x8C74,0x834A},{0x8C75,0x86CD},{0x8C76,0x8A08},{0x8C77,0x8A63},{0x8C78,0x8B66},{0x8C79,0x8EFD},{0x8C7A,0x981A},{0x8C7B,0x9D8F},{0x8C7C,0x82B8},{0x8C7D,0x8FCE},{0x8C7E,0x9BE8},{0x8C80,0x5287},
		{0x8C81,0x621F},{0x8C82,0x6483},{0x8C83,0x6FC0},{0x8C84,0x9699},{0x8C85,0x6841},{0x8C86,0x5091},{0x8C87,0x6B20},{0x8C88,0x6C7A},{0x8C89,0x6F54},{0x8C8A,0x7A74},{0x8C8B,0x7D50},{0x8C8C,0x8840},{0x8C8D,0x8A23},{0x8C8E,0x6708},{0x8C8F,0x4EF6},{0x8C90,0x5039},
		{0x8C91,0x5026},{0x8C92,0x5065},{0x8C93,0x517C},{0x8C94,0x5238},{0x8C95,0x5263},{0x8C96,0x55A7},{0x8C97,0x570F},{0x8C98,0x5805},{0x8C99,0x5ACC},{0x8C9A,0x5EFA},{0x8C9B,0x61B2},{0x8C9C,0x61F8},{0x8C9D,0x62F3},{0x8C9E,0x6372},{0x8C9F,0x691C},{0x8CA0,0x6A29},
		{0x8CA1,0x727D},{0x8CA2,0x72AC},{0x8CA3,0x732E},{0x8CA4,0x7814},{0x8CA5,0x786F},{0x8CA6,0x7D79},{0x8CA7,0x770C},{0x8CA8,0x80A9},{0x8CA9,0x898B},{0x8CAA,0x8B19},{0x8CAB,0x8CE2},{0x8CAC,0x8ED2},{0x8CAD,0x9063},{0x8CAE,0x9375},{0x8CAF,0x967A},{0x8CB0,0x9855},
		{0x8CB1,0x9A13},{0x8CB2,0x9E78},{0x8CB3,0x5143},{0x8CB4,0x539F},{0x8CB5,0x53B3},{0x8CB6,0x5E7B},{0x8CB7,0x5F26},{0x8CB8,0x6E1B},{0x8CB9,0x6E90},{0x8CBA,0x7384},{0x8CBB,0x73FE},{0x8CBC,0x7D43},{0x8CBD,0x8237},{0x8CBE,0x8A00},{0x8CBF,0x8AFA},{0x8CC0,0x9650},
		{0x8CC1,0x4E4E},{0x8CC2,0x500B},{0x8CC3,0x53E4},{0x8CC4,0x547C},{0x8CC5,0x56FA},{0x8CC6,0x59D1},{0x8CC7,0x5B64},{0x8CC8,0x5DF1},{0x8CC9,0x5EAB},{0x8CCA,0x5F27},{0x8CCB,0x6238},{0x8CCC,0x6545},{0x8CCD,0x67AF},{0x8CCE,0x6E56},{0x8CCF,0x72D0},{0x8CD0,0x7CCA},
		{0x8CD1,0x88B4},{0x8CD2,0x80A1},{0x8CD3,0x80E1},{0x8CD4,0x83F0},{0x8CD5,0x864E},{0x8CD6,0x8A87},{0x8CD7,0x8DE8},{0x8CD8,0x9237},{0x8CD9,0x96C7},{0x8CDA,0x9867},{0x8CDB,0x9F13},{0x8CDC,0x4E94},{0x8CDD,0x4E92},{0x8CDE,0x4F0D},{0x8CDF,0x5348},{0x8CE0,0x5449},
		{0x8CE1,0x543E},{0x8CE2,0x5A2F},{0x8CE3,0x5F8C},{0x8CE4,0x5FA1},{0x8CE5,0x609F},{0x8CE6,0x68A7},{0x8CE7,0x6A8E},{0x8CE8,0x745A},{0x8CE9,0x7881},{0x8CEA,0x8A9E},{0x8CEB,0x8AA4},{0x8CEC,0x8B77},{0x8CED,0x9190},{0x8CEE,0x4E5E},{0x8CEF,0x9BC9},{0x8CF0,0x4EA4},
		{0x8CF1,0x4F7C},{0x8CF2,0x4FAF},{0x8CF3,0x5019},{0x8CF4,0x5016},{0x8CF5,0x5149},{0x8CF6,0x516C},{0x8CF7,0x529F},{0x8CF8,0x52B9},{0x8CF9,0x52FE},{0x8CFA,0x539A},{0x8CFB,0x53E3},{0x8CFC,0x5411},{0x8D40,0x540E},{0x8D41,0x5589},{0x8D42,0x5751},{0x8D43,0x57A2},
		{0x8D44,0x597D},{0x8D45,0x5B54},{0x8D46,0x5B5D},{0x8D47,0x5B8F},{0x8D48,0x5DE5},{0x8D49,0x5DE7},{0x8D4A,0x5DF7},{0x8D4B,0x5E78},{0x8D4C,0x5E83},{0x8D4D,0x5E9A},{0x8D4E,0x5EB7},{0x8D4F,0x5F18},{0x8D50,0x6052},{0x8D51,0x614C},{0x8D52,0x6297},{0x8D53,0x62D8},
		{0x8D54,0x63A7},{0x8D55,0x653B},{0x8D56,0x6602},{0x8D57,0x6643},{0x8D58,0x66F4},{0x8D59,0x676D},{0x8D5A,0x6821},{0x8D5B,0x6897},{0x8D5C,0x69CB},{0x8D5D,0x6C5F},{0x8D5E,0x6D2A},{0x8D5F,0x6D69},{0x8D60,0x6E2F},{0x8D61,0x6E9D},{0x8D62,0x7532},{0x8D63,0x7687},
		{0x8D64,0x786C},{0x8D65,0x7A3F},{0x8D66,0x7CE0},{0x8D67,0x7D05},{0x8D68,0x7D18},{0x8D69,0x7D5E},{0x8D6A,0x7DB1},{0x8D6B,0x8015},{0x8D6C,0x8003},{0x8D6D,0x80AF},{0x8D6E,0x80B1},{0x8D6F,0x8154},{0x8D70,0x818F},{0x8D71,0x822A},{0x8D72,0x8352},{0x8D73,0x884C},
		{0x8D74,0x8861},{0x8D75,0x8B1B},{0x8D76,0x8CA2},{0x8D77,0x8CFC},{0x8D78,0x90CA},{0x8D79,0x9175},{0x8D7A,0x9271},{0x8D7B,0x783F},{0x8D7C,0x92FC},{0x8D7D,0x95A4},{0x8D7E,0x964D},{0x8D80,0x9805},{0x8D81,0x9999},{0x8D82,0x9AD8},{0x8D83,0x9D3B},{0x8D84,0x525B},
		{0x8D85,0x52AB},{0x8D86,0x53F7},{0x8D87,0x5408},{0x8D88,0x58D5},{0x8D89,0x62F7},{0x8D8A,0x6FE0},{0x8D8B,0x8C6A},{0x8D8C,0x8F5F},{0x8D8D,0x9EB9},{0x8D8E,0x514B},{0x8D8F,0x523B},{0x8D90,0x544A},{0x8D91,0x56FD},{0x8D92,0x7A40},{0x8D93,0x9177},{0x8D94,0x9D60},
		{0x8D95,0x9ED2},{0x8D96,0x7344},{0x8D97,0x6F09},{0x8D98,0x8170},{0x8D99,0x7511},{0x8D9A,0x5FFD},{0x8D9B,0x60DA},{0x8D9C,0x9AA8},{0x8D9D,0x72DB},{0x8D9E,0x8FBC},{0x8D9F,0x6B64},{0x8DA0,0x9803},{0x8DA1,0x4ECA},{0x8DA2,0x56F0},{0x8DA3,0x5764},{0x8DA4,0x58BE},
		{0x8DA5,0x5A5A},{0x8DA6,0x6068},{0x8DA7,0x61C7},{0x8DA8,0x660F},{0x8DA9,0x6606},{0x8DAA,0x6839},{0x8DAB,0x68B1},{0x8DAC,0x6DF7},{0x8DAD,0x75D5},{0x8DAE,0x7D3A},{0x8DAF,0x826E},{0x8DB0,0x9B42},{0x8DB1,0x4E9B},{0x8DB2,0x4F50},{0x8DB3,0x53C9},{0x8DB4,0x5506},
		{0x8DB5,0x5D6F},{0x8DB6,0x5DE6},{0x8DB7,0x5DEE},{0x8DB8,0x67FB},{0x8DB9,0x6C99},{0x8DBA,0x7473},{0x8DBB,0x7802},{0x8DBC,0x8A50},{0x8DBD,0x9396},{0x8DBE,0x88DF},{0x8DBF,0x5750},{0x8DC0,0x5EA7},{0x8DC1,0x632B},{0x8DC2,0x50B5},{0x8DC3,0x50AC},{0x8DC4,0x518D},
		{0x8DC5,0x6700},{0x8DC6,0x54C9},{0x8DC7,0x585E},{0x8DC8,0x59BB},{0x8DC9,0x5BB0},{0x8DCA,0x5F69},{0x8DCB,0x624D},{0x8DCC,0x63A1},{0x8DCD,0x683D},{0x8DCE,0x6B73},{0x8DCF,0x6E08},{0x8DD0,0x707D},{0x8DD1,0x91C7},{0x8DD2,0x7280},{0x8DD3,0x7815},{0x8DD4,0x7826},
		{0x8DD5,0x796D},{0x8DD6,0x658E},{0x8DD7,0x7D30},{0x8DD8,0x83DC},{0x8DD9,0x88C1},{0x8DDA,0x8F09},{0x8DDB,0x969B},{0x8DDC,0x5264},{0x8DDD,0x5728},{0x8DDE,0x6750},{0x8DDF,0x7F6A},{0x8DE0,0x8CA1},{0x8DE1,0x51B4},{0x8DE2,0x5742},{0x8DE3,0x962A},{0x8DE4,0x583A},
		{0x8DE5,0x698A},{0x8DE6,0x80B4},{0x8DE7,0x54B2},{0x8DE8,0x5D0E},{0x8DE9,0x57FC},{0x8DEA,0x7895},{0x8DEB,0x9DFA},{0x8DEC,0x4F5C},{0x8DED,0x524A},{0x8DEE,0x548B},{0x8DEF,0x643E},{0x8DF0,0x6628},{0x8DF1,0x6714},{0x8DF2,0x67F5},{0x8DF3,0x7A84},{0x8DF4,0x7B56},
		{0x8DF5,0x7D22},{0x8DF6,0x932F},{0x8DF7,0x685C},{0x8DF8,0x9BAD},{0x8DF9,0x7B39},{0x8DFA,0x5319},{0x8DFB,0x518A},{0x8DFC,0x5237},{0x8E40,0x5BDF},{0x8E41,0x62F6},{0x8E42,0x64AE},{0x8E43,0x64E6},{0x8E44,0x672D},{0x8E45,0x6BBA},{0x8E46,0x85A9},{0x8E47,0x96D1},
		{0x8E48,0x7690},{0x8E49,0x9BD6},{0x8E4A,0x634C},{0x8E4B,0x9306},{0x8E4C,0x9BAB},{0x8E4D,0x76BF},{0x8E4E,0x6652},{0x8E4F,0x4E09},{0x8E50,0x5098},{0x8E51,0x53C2},{0x8E52,0x5C71},{0x8E53,0x60E8},{0x8E54,0x6492},{0x8E55,0x6563},{0x8E56,0x685F},{0x8E57,0x71E6},
		{0x8E58,0x73CA},{0x8E59,0x7523},{0x8E5A,0x7B97},{0x8E5B,0x7E82},{0x8E5C,0x8695},{0x8E5D,0x8B83},{0x8E5E,0x8CDB},{0x8E5F,0x9178},{0x8E60,0x9910},{0x8E61,0x65AC},{0x8E62,0x66AB},{0x8E63,0x6B8B},{0x8E64,0x4ED5},{0x8E65,0x4ED4},{0x8E66,0x4F3A},{0x8E67,0x4F7F},
		{0x8E68,0x523A},{0x8E69,0x53F8},{0x8E6A,0x53F2},{0x8E6B,0x55E3},{0x8E6C,0x56DB},{0x8E6D,0x58EB},{0x8E6E,0x59CB},{0x8E6F,0x59C9},{0x8E70,0x59FF},{0x8E71,0x5B50},{0x8E72,0x5C4D},{0x8E73,0x5E02},{0x8E74,0x5E2B},{0x8E75,0x5FD7},{0x8E76,0x601D},{0x8E77,0x6307},
		{0x8E78,0x652F},{0x8E79,0x5B5C},{0x8E7A,0x65AF},{0x8E7B,0x65BD},{0x8E7C,0x65E8},{0x8E7D,0x679D},{0x8E7E,0x6B62},{0x8E80,0x6B7B},{0x8E81,0x6C0F},{0x8E82,0x7345},{0x8E83,0x7949},{0x8E84,0x79C1},{0x8E85,0x7CF8},{0x8E86,0x7D19},{0x8E87,0x7D2B},{0x8E88,0x80A2},
		{0x8E89,0x8102},{0x8E8A,0x81F3},{0x8E8B,0x8996},{0x8E8C,0x8A5E},{0x8E8D,0x8A69},{0x8E8E,0x8A66},{0x8E8F,0x8A8C},{0x8E90,0x8AEE},{0x8E91,0x8CC7},{0x8E92,0x8CDC},{0x8E93,0x96CC},{0x8E94,0x98FC},{0x8E95,0x6B6F},{0x8E96,0x4E8B},{0x8E97,0x4F3C},{0x8E98,0x4F8D},
		{0x8E99,0x5150},{0x8E9A,0x5B57},{0x8E9B,0x5BFA},{0x8E9C,0x6148},{0x8E9D,0x6301},{0x8E9E,0x6642},{0x8E9F,0x6B21},{0x8EA0,0x6ECB},{0x8EA1,0x6CBB},{0x8EA2,0x723E},{0x8EA3,0x74BD},{0x8EA4,0x75D4},{0x8EA5,0x78C1},{0x8EA6,0x793A},{0x8EA7,0x800C},{0x8EA8,0x8033},
		{0x8EA9,0x81EA},{0x8EAA,0x8494},{0x8EAB,0x8F9E},{0x8EAC,0x6C50},{0x8EAD,0x9E7F},{0x8EAE,0x5F0F},{0x8EAF,0x8B58},{0x8EB0,0x9D2B},{0x8EB1,0x7AFA},{0x8EB2,0x8EF8},{0x8EB3,0x5B8D},{0x8EB4,0x96EB},{0x8EB5,0x4E03},{0x8EB6,0x53F1},{0x8EB7,0x57F7},{0x8EB8,0x5931},
		{0x8EB9,0x5AC9},{0x8EBA,0x5BA4},{0x8EBB,0x6089},{0x8EBC,0x6E7F},{0x8EBD,0x6F06},{0x8EBE,0x75BE},{0x8EBF,0x8CEA},{0x8EC0,0x5B9F},{0x8EC1,0x8500},{0x8EC2,0x7BE0},{0x8EC3,0x5072},{0x8EC4,0x67F4},{0x8EC5,0x829D},{0x8EC6,0x5C61},{0x8EC7,0x854A},{0x8EC8,0x7E1E},
		{0x8EC9,0x820E},{0x8ECA,0x5199},{0x8ECB,0x5C04},{0x8ECC,0x6368},{0x8ECD,0x8D66},{0x8ECE,0x659C},{0x8ECF,0x716E},{0x8ED0,0x793E},{0x8ED1,0x7D17},{0x8ED2,0x8005},{0x8ED3,0x8B1D},{0x8ED4,0x8ECA},{0x8ED5,0x906E},{0x8ED6,0x86C7},{0x8ED7,0x90AA},{0x8ED8,0x501F},
		{0x8ED9,0x52FA},{0x8EDA,0x5C3A},{0x8EDB,0x6753},{0x8EDC,0x707C},{0x8EDD,0x7235},{0x8EDE,0x914C},{0x8EDF,0x91C8},{0x8EE0,0x932B},{0x8EE1,0x82E5},{0x8EE2,0x5BC2},{0x8EE3,0x5F31},{0x8EE4,0x60F9},{0x8EE5,0x4E3B},{0x8EE6,0x53D6},{0x8EE7,0x5B88},{0x8EE8,0x624B},
		{0x8EE9,0x6731},{0x8EEA,0x6B8A},{0x8EEB,0x72E9},{0x8EEC,0x73E0},{0x8EED,0x7A2E},{0x8EEE,0x816B},{0x8EEF,0x8DA3},{0x8EF0,0x9152},{0x8EF1,0x9996},{0x8EF2,0x5112},{0x8EF3,0x53D7},{0x8EF4,0x546A},{0x8EF5,0x5BFF},{0x8EF6,0x6388},{0x8EF7,0x6A39},{0x8EF8,0x7DAC},
		{0x8EF9,0x9700},{0x8EFA,0x56DA},{0x8EFB,0x53CE},{0x8EFC,0x5468},{0x8F40,0x5B97},{0x8F41,0x5C31},{0x8F42,0x5DDE},{0x8F43,0x4FEE},{0x8F44,0x6101},{0x8F45,0x62FE},{0x8F46,0x6D32},{0x8F47,0x79C0},{0x8F48,0x79CB},{0x8F49,0x7D42},{0x8F4A,0x7E4D},{0x8F4B,0x7FD2},
		{0x8F4C,0x81ED},{0x8F4D,0x821F},{0x8F4E,0x8490},{0x8F4F,0x8846},{0x8F50,0x8972},{0x8F51,0x8B90},{0x8F52,0x8E74},{0x8F53,0x8F2F},{0x8F54,0x9031},{0x8F55,0x914B},{0x8F56,0x916C},{0x8F57,0x96C6},{0x8F58,0x919C},{0x8F59,0x4EC0},{0x8F5A,0x4F4F},{0x8F5B,0x5145},
		{0x8F5C,0x5341},{0x8F5D,0x5F93},{0x8F5E,0x620E},{0x8F5F,0x67D4},{0x8F60,0x6C41},{0x8F61,0x6E0B},{0x8F62,0x7363},{0x8F63,0x7E26},{0x8F64,0x91CD},{0x8F65,0x9283},{0x8F66,0x53D4},{0x8F67,0x5919},{0x8F68,0x5BBF},{0x8F69,0x6DD1},{0x8F6A,0x795D},{0x8F6B,0x7E2E},
		{0x8F6C,0x7C9B},{0x8F6D,0x587E},{0x8F6E,0x719F},{0x8F6F,0x51FA},{0x8F70,0x8853},{0x8F71,0x8FF0},{0x8F72,0x4FCA},{0x8F73,0x5CFB},{0x8F74,0x6625},{0x8F75,0x77AC},{0x8F76,0x7AE3},{0x8F77,0x821C},{0x8F78,0x99FF},{0x8F79,0x51C6},{0x8F7A,0x5FAA},{0x8F7B,0x65EC},
		{0x8F7C,0x696F},{0x8F7D,0x6B89},{0x8F7E,0x6DF3},{0x8F80,0x6E96},{0x8F81,0x6F64},{0x8F82,0x76FE},{0x8F83,0x7D14},{0x8F84,0x5DE1},{0x8F85,0x9075},{0x8F86,0x9187},{0x8F87,0x9806},{0x8F88,0x51E6},{0x8F89,0x521D},{0x8F8A,0x6240},{0x8F8B,0x6691},{0x8F8C,0x66D9},
		{0x8F8D,0x6E1A},{0x8F8E,0x5EB6},{0x8F8F,0x7DD2},{0x8F90,0x7F72},{0x8F91,0x66F8},{0x8F92,0x85AF},{0x8F93,0x85F7},{0x8F94,0x8AF8},{0x8F95,0x52A9},{0x8F96,0x53D9},{0x8F97,0x5973},{0x8F98,0x5E8F},{0x8F99,0x5F90},{0x8F9A,0x6055},{0x8F9B,0x92E4},{0x8F9C,0x9664},
		{0x8F9D,0x50B7},{0x8F9E,0x511F},{0x8F9F,0x52DD},{0x8FA0,0x5320},{0x8FA1,0x5347},{0x8FA2,0x53EC},{0x8FA3,0x54E8},{0x8FA4,0x5546},{0x8FA5,0x5531},{0x8FA6,0x5617},{0x8FA7,0x5968},{0x8FA8,0x59BE},{0x8FA9,0x5A3C},{0x8FAA,0x5BB5},{0x8FAB,0x5C06},{0x8FAC,0x5C0F},
		{0x8FAD,0x5C11},{0x8FAE,0x5C1A},{0x8FAF,0x5E84},{0x8FB0,0x5E8A},{0x8FB1,0x5EE0},{0x8FB2,0x5F70},{0x8FB3,0x627F},{0x8FB4,0x6284},{0x8FB5,0x62DB},{0x8FB6,0x638C},{0x8FB7,0x6377},{0x8FB8,0x6607},{0x8FB9,0x660C},{0x8FBA,0x662D},{0x8FBB,0x6676},{0x8FBC,0x677E},
		{0x8FBD,0x68A2},{0x8FBE,0x6A1F},{0x8FBF,0x6A35},{0x8FC0,0x6CBC},{0x8FC1,0x6D88},{0x8FC2,0x6E09},{0x8FC3,0x6E58},{0x8FC4,0x713C},{0x8FC5,0x7126},{0x8FC6,0x7167},{0x8FC7,0x75C7},{0x8FC8,0x7701},{0x8FC9,0x785D},{0x8FCA,0x7901},{0x8FCB,0x7965},{0x8FCC,0x79F0},
		{0x8FCD,0x7AE0},{0x8FCE,0x7B11},{0x8FCF,0x7CA7},{0x8FD0,0x7D39},{0x8FD1,0x8096},{0x8FD2,0x83D6},{0x8FD3,0x848B},{0x8FD4,0x8549},{0x8FD5,0x885D},{0x8FD6,0x88F3},{0x8FD7,0x8A1F},{0x8FD8,0x8A3C},{0x8FD9,0x8A54},{0x8FDA,0x8A73},{0x8FDB,0x8C61},{0x8FDC,0x8CDE},
		{0x8FDD,0x91A4},{0x8FDE,0x9266},{0x8FDF,0x937E},{0x8FE0,0x9418},{0x8FE1,0x969C},{0x8FE2,0x9798},{0x8FE3,0x4E0A},{0x8FE4,0x4E08},{0x8FE5,0x4E1E},{0x8FE6,0x4E57},{0x8FE7,0x5197},{0x8FE8,0x5270},{0x8FE9,0x57CE},{0x8FEA,0x5834},{0x8FEB,0x58CC},{0x8FEC,0x5B22},
		{0x8FED,0x5E38},{0x8FEE,0x60C5},{0x8FEF,0x64FE},{0x8FF0,0x6761},{0x8FF1,0x6756},{0x8FF2,0x6D44},{0x8FF3,0x72B6},{0x8FF4,0x7573},{0x8FF5,0x7A63},{0x8FF6,0x84B8},{0x8FF7,0x8B72},{0x8FF8,0x91B8},{0x8FF9,0x9320},{0x8FFA,0x5631},{0x8FFB,0x57F4},{0x8FFC,0x98FE},
		{0x9040,0x62ED},{0x9041,0x690D},{0x9042,0x6B96},{0x9043,0x71ED},{0x9044,0x7E54},{0x9045,0x8077},{0x9046,0x8272},{0x9047,0x89E6},{0x9048,0x98DF},{0x9049,0x8755},{0x904A,0x8FB1},{0x904B,0x5C3B},{0x904C,0x4F38},{0x904D,0x4FE1},{0x904E,0x4FB5},{0x904F,0x5507},
		{0x9050,0x5A20},{0x9051,0x5BDD},{0x9052,0x5BE9},{0x9053,0x5FC3},{0x9054,0x614E},{0x9055,0x632F},{0x9056,0x65B0},{0x9057,0x664B},{0x9058,0x68EE},{0x9059,0x699B},{0x905A,0x6D78},{0x905B,0x6DF1},{0x905C,0x7533},{0x905D,0x75B9},{0x905E,0x771F},{0x905F,0x795E},
		{0x9060,0x79E6},{0x9061,0x7D33},{0x9062,0x81E3},{0x9063,0x82AF},{0x9064,0x85AA},{0x9065,0x89AA},{0x9066,0x8A3A},{0x9067,0x8EAB},{0x9068,0x8F9B},{0x9069,0x9032},{0x906A,0x91DD},{0x906B,0x9707},{0x906C,0x4EBA},{0x906D,0x4EC1},{0x906E,0x5203},{0x906F,0x5875},
		{0x9070,0x58EC},{0x9071,0x5C0B},{0x9072,0x751A},{0x9073,0x5C3D},{0x9074,0x814E},{0x9075,0x8A0A},{0x9076,0x8FC5},{0x9077,0x9663},{0x9078,0x976D},{0x9079,0x7B25},{0x907A,0x8ACF},{0x907B,0x9808},{0x907C,0x9162},{0x907D,0x56F3},{0x907E,0x53A8},{0x9080,0x9017},
		{0x9081,0x5439},{0x9082,0x5782},{0x9083,0x5E25},{0x9084,0x63A8},{0x9085,0x6C34},{0x9086,0x708A},{0x9087,0x7761},{0x9088,0x7C8B},{0x9089,0x7FE0},{0x908A,0x8870},{0x908B,0x9042},{0x908C,0x9154},{0x908D,0x9310},{0x908E,0x9318},{0x908F,0x968F},{0x9090,0x745E},
		{0x9091,0x9AC4},{0x9092,0x5D07},{0x9093,0x5D69},{0x9094,0x6570},{0x9095,0x67A2},{0x9096,0x8DA8},{0x9097,0x96DB},{0x9098,0x636E},{0x9099,0x6749},{0x909A,0x6919},{0x909B,0x83C5},{0x909C,0x9817},{0x909D,0x96C0},{0x909E,0x88FE},{0x909F,0x6F84},{0x90A0,0x647A},
		{0x90A1,0x5BF8},{0x90A2,0x4E16},{0x90A3,0x702C},{0x90A4,0x755D},{0x90A5,0x662F},{0x90A6,0x51C4},{0x90A7,0x5236},{0x90A8,0x52E2},{0x90A9,0x59D3},{0x90AA,0x5F81},{0x90AB,0x6027},{0x90AC,0x6210},{0x90AD,0x653F},{0x90AE,0x6574},{0x90AF,0x661F},{0x90B0,0x6674},
		{0x90B1,0x68F2},{0x90B2,0x6816},{0x90B3,0x6B63},{0x90B4,0x6E05},{0x90B5,0x7272},{0x90B6,0x751F},{0x90B7,0x76DB},{0x90B8,0x7CBE},{0x90B9,0x8056},{0x90BA,0x58F0},{0x90BB,0x88FD},{0x90BC,0x897F},{0x90BD,0x8AA0},{0x90BE,0x8A93},{0x90BF,0x8ACB},{0x90C0,0x901D},
		{0x90C1,0x9192},{0x90C2,0x9752},{0x90C3,0x9759},{0x90C4,0x6589},{0x90C5,0x7A0E},{0x90C6,0x8106},{0x90C7,0x96BB},{0x90C8,0x5E2D},{0x90C9,0x60DC},{0x90CA,0x621A},{0x90CB,0x65A5},{0x90CC,0x6614},{0x90CD,0x6790},{0x90CE,0x77F3},{0x90CF,0x7A4D},{0x90D0,0x7C4D},
		{0x90D1,0x7E3E},{0x90D2,0x810A},{0x90D3,0x8CAC},{0x90D4,0x8D64},{0x90D5,0x8DE1},{0x90D6,0x8E5F},{0x90D7,0x78A9},{0x90D8,0x5207},{0x90D9,0x62D9},{0x90DA,0x63A5},{0x90DB,0x6442},{0x90DC,0x6298},{0x90DD,0x8A2D},{0x90DE,0x7A83},{0x90DF,0x7BC0},{0x90E0,0x8AAC},
		{0x90E1,0x96EA},{0x90E2,0x7D76},{0x90E3,0x820C},{0x90E4,0x8749},{0x90E5,0x4ED9},{0x90E6,0x5148},{0x90E7,0x5343},{0x90E8,0x5360},{0x90E9,0x5BA3},{0x90EA,0x5C02},{0x90EB,0x5C16},{0x90EC,0x5DDD},{0x90ED,0x6226},{0x90EE,0x6247},{0x90EF,0x64B0},{0x90F0,0x6813},
		{0x90F1,0x6834},{0x90F2,0x6CC9},{0x90F3,0x6D45},{0x90F4,0x6D17},{0x90F5,0x67D3},{0x90F6,0x6F5C},{0x90F7,0x714E},{0x90F8,0x717D},{0x90F9,0x65CB},{0x90FA,0x7A7F},{0x90FB,0x7BAD},{0x90FC,0x7DDA},{0x9140,0x7E4A},{0x9141,0x7FA8},{0x9142,0x817A},{0x9143,0x821B},
		{0x9144,0x8239},{0x9145,0x85A6},{0x9146,0x8A6E},{0x9147,0x8CCE},{0x9148,0x8DF5},{0x9149,0x9078},{0x914A,0x9077},{0x914B,0x92AD},{0x914C,0x9291},{0x914D,0x9583},{0x914E,0x9BAE},{0x914F,0x524D},{0x9150,0x5584},{0x9151,0x6F38},{0x9152,0x7136},{0x9153,0x5168},
		{0x9154,0x7985},{0x9155,0x7E55},{0x9156,0x81B3},{0x9157,0x7CCE},{0x9158,0x564C},{0x9159,0x5851},{0x915A,0x5CA8},{0x915B,0x63AA},{0x915C,0x66FE},{0x915D,0x66FD},{0x915E,0x695A},{0x915F,0x72D9},{0x9160,0x758F},{0x9161,0x758E},{0x9162,0x790E},{0x9163,0x7956},
		{0x9164,0x79DF},{0x9165,0x7C97},{0x9166,0x7D20},{0x9167,0x7D44},{0x9168,0x8607},{0x9169,0x8A34},{0x916A,0x963B},{0x916B,0x9061},{0x916C,0x9F20},{0x916D,0x50E7},{0x916E,0x5275},{0x916F,0x53CC},{0x9170,0x53E2},{0x9171,0x5009},{0x9172,0x55AA},{0x9173,0x58EE},
		{0x9174,0x594F},{0x9175,0x723D},{0x9176,0x5B8B},{0x9177,0x5C64},{0x9178,0x531D},{0x9179,0x60E3},{0x917A,0x60F3},{0x917B,0x635C},{0x917C,0x6383},{0x917D,0x633F},{0x917E,0x63BB},{0x9180,0x64CD},{0x9181,0x65E9},{0x9182,0x66F9},{0x9183,0x5DE3},{0x9184,0x69CD},
		{0x9185,0x69FD},{0x9186,0x6F15},{0x9187,0x71E5},{0x9188,0x4E89},{0x9189,0x75E9},{0x918A,0x76F8},{0x918B,0x7A93},{0x918C,0x7CDF},{0x918D,0x7DCF},{0x918E,0x7D9C},{0x918F,0x8061},{0x9190,0x8349},{0x9191,0x8358},{0x9192,0x846C},{0x9193,0x84BC},{0x9194,0x85FB},
		{0x9195,0x88C5},{0x9196,0x8D70},{0x9197,0x9001},{0x9198,0x906D},{0x9199,0x9397},{0x919A,0x971C},{0x919B,0x9A12},{0x919C,0x50CF},{0x919D,0x5897},{0x919E,0x618E},{0x919F,0x81D3},{0x91A0,0x8535},{0x91A1,0x8D08},{0x91A2,0x9020},{0x91A3,0x4FC3},{0x91A4,0x5074},
		{0x91A5,0x5247},{0x91A6,0x5373},{0x91A7,0x606F},{0x91A8,0x6349},{0x91A9,0x675F},{0x91AA,0x6E2C},{0x91AB,0x8DB3},{0x91AC,0x901F},{0x91AD,0x4FD7},{0x91AE,0x5C5E},{0x91AF,0x8CCA},{0x91B0,0x65CF},{0x91B1,0x7D9A},{0x91B2,0x5352},{0x91B3,0x8896},{0x91B4,0x5176},
		{0x91B5,0x63C3},{0x91B6,0x5B58},{0x91B7,0x5B6B},{0x91B8,0x5C0A},{0x91B9,0x640D},{0x91BA,0x6751},{0x91BB,0x905C},{0x91BC,0x4ED6},{0x91BD,0x591A},{0x91BE,0x592A},{0x91BF,0x6C70},{0x91C0,0x8A51},{0x91C1,0x553E},{0x91C2,0x5815},{0x91C3,0x59A5},{0x91C4,0x60F0},
		{0x91C5,0x6253},{0x91C6,0x67C1},{0x91C7,0x8235},{0x91C8,0x6955},{0x91C9,0x9640},{0x91CA,0x99C4},{0x91CB,0x9A28},{0x91CC,0x4F53},{0x91CD,0x5806},{0x91CE,0x5BFE},{0x91CF,0x8010},{0x91D0,0x5CB1},{0x91D1,0x5E2F},{0x91D2,0x5F85},{0x91D3,0x6020},{0x91D4,0x614B},
		{0x91D5,0x6234},{0x91D6,0x66FF},{0x91D7,0x6CF0},{0x91D8,0x6EDE},{0x91D9,0x80CE},{0x91DA,0x817F},{0x91DB,0x82D4},{0x91DC,0x888B},{0x91DD,0x8CB8},{0x91DE,0x9000},{0x91DF,0x902E},{0x91E0,0x968A},{0x91E1,0x9EDB},{0x91E2,0x9BDB},{0x91E3,0x4EE3},{0x91E4,0x53F0},
		{0x91E5,0x5927},{0x91E6,0x7B2C},{0x91E7,0x918D},{0x91E8,0x984C},{0x91E9,0x9DF9},{0x91EA,0x6EDD},{0x91EB,0x7027},{0x91EC,0x5353},{0x91ED,0x5544},{0x91EE,0x5B85},{0x91EF,0x6258},{0x91F0,0x629E},{0x91F1,0x62D3},{0x91F2,0x6CA2},{0x91F3,0x6FEF},{0x91F4,0x7422},
		{0x91F5,0x8A17},{0x91F6,0x9438},{0x91F7,0x6FC1},{0x91F8,0x8AFE},{0x91F9,0x8338},{0x91FA,0x51E7},{0x91FB,0x86F8},{0x91FC,0x53EA},{0x9240,0x53E9},{0x9241,0x4F46},{0x9242,0x9054},{0x9243,0x8FB0},{0x9244,0x596A},{0x9245,0x8131},{0x9246,0x5DFD},{0x9247,0x7AEA},
		{0x9248,0x8FBF},{0x9249,0x68DA},{0x924A,0x8C37},{0x924B,0x72F8},{0x924C,0x9C48},{0x924D,0x6A3D},{0x924E,0x8AB0},{0x924F,0x4E39},{0x9250,0x5358},{0x9251,0x5606},{0x9252,0x5766},{0x9253,0x62C5},{0x9254,0x63A2},{0x9255,0x65E6},{0x9256,0x6B4E},{0x9257,0x6DE1},
		{0x9258,0x6E5B},{0x9259,0x70AD},{0x925A,0x77ED},{0x925B,0x7AEF},{0x925C,0x7BAA},{0x925D,0x7DBB},{0x925E,0x803D},{0x925F,0x80C6},{0x9260,0x86CB},{0x9261,0x8A95},{0x9262,0x935B},{0x9263,0x56E3},{0x9264,0x58C7},{0x9265,0x5F3E},{0x9266,0x65AD},{0x9267,0x6696},
		{0x9268,0x6A80},{0x9269,0x6BB5},{0x926A,0x7537},{0x926B,0x8AC7},{0x926C,0x5024},{0x926D,0x77E5},{0x926E,0x5730},{0x926F,0x5F1B},{0x9270,0x6065},{0x9271,0x667A},{0x9272,0x6C60},{0x9273,0x75F4},{0x9274,0x7A1A},{0x9275,0x7F6E},{0x9276,0x81F4},{0x9277,0x8718},
		{0x9278,0x9045},{0x9279,0x99B3},{0x927A,0x7BC9},{0x927B,0x755C},{0x927C,0x7AF9},{0x927D,0x7B51},{0x927E,0x84C4},{0x9280,0x9010},{0x9281,0x79E9},{0x9282,0x7A92},{0x9283,0x8336},{0x9284,0x5AE1},{0x9285,0x7740},{0x9286,0x4E2D},{0x9287,0x4EF2},{0x9288,0x5B99},
		{0x9289,0x5FE0},{0x928A,0x62BD},{0x928B,0x663C},{0x928C,0x67F1},{0x928D,0x6CE8},{0x928E,0x866B},{0x928F,0x8877},{0x9290,0x8A3B},{0x9291,0x914E},{0x9292,0x92F3},{0x9293,0x99D0},{0x9294,0x6A17},{0x9295,0x7026},{0x9296,0x732A},{0x9297,0x82E7},{0x9298,0x8457},
		{0x9299,0x8CAF},{0x929A,0x4E01},{0x929B,0x5146},{0x929C,0x51CB},{0x929D,0x558B},{0x929E,0x5BF5},{0x929F,0x5E16},{0x92A0,0x5E33},{0x92A1,0x5E81},{0x92A2,0x5F14},{0x92A3,0x5F35},{0x92A4,0x5F6B},{0x92A5,0x5FB4},{0x92A6,0x61F2},{0x92A7,0x6311},{0x92A8,0x66A2},
		{0x92A9,0x671D},{0x92AA,0x6F6E},{0x92AB,0x7252},{0x92AC,0x753A},{0x92AD,0x773A},{0x92AE,0x8074},{0x92AF,0x8139},{0x92B0,0x8178},{0x92B1,0x8776},{0x92B2,0x8ABF},{0x92B3,0x8ADC},{0x92B4,0x8D85},{0x92B5,0x8DF3},{0x92B6,0x929A},{0x92B7,0x9577},{0x92B8,0x9802},
		{0x92B9,0x9CE5},{0x92BA,0x52C5},{0x92BB,0x6357},{0x92BC,0x76F4},{0x92BD,0x6715},{0x92BE,0x6C88},{0x92BF,0x73CD},{0x92C0,0x8CC3},{0x92C1,0x93AE},{0x92C2,0x9673},{0x92C3,0x6D25},{0x92C4,0x589C},{0x92C5,0x690E},{0x92C6,0x69CC},{0x92C7,0x8FFD},{0x92C8,0x939A},
		{0x92C9,0x75DB},{0x92CA,0x901A},{0x92CB,0x585A},{0x92CC,0x6802},{0x92CD,0x63B4},{0x92CE,0x69FB},{0x92CF,0x4F43},{0x92D0,0x6F2C},{0x92D1,0x67D8},{0x92D2,0x8FBB},{0x92D3,0x8526},{0x92D4,0x7DB4},{0x92D5,0x9354},{0x92D6,0x693F},{0x92D7,0x6F70},{0x92D8,0x576A},
		{0x92D9,0x58F7},{0x92DA,0x5B2C},{0x92DB,0x7D2C},{0x92DC,0x722A},{0x92DD,0x540A},{0x92DE,0x91E3},{0x92DF,0x9DB4},{0x92E0,0x4EAD},{0x92E1,0x4F4E},{0x92E2,0x505C},{0x92E3,0x5075},{0x92E4,0x5243},{0x92E5,0x8C9E},{0x92E6,0x5448},{0x92E7,0x5824},{0x92E8,0x5B9A},
		{0x92E9,0x5E1D},{0x92EA,0x5E95},{0x92EB,0x5EAD},{0x92EC,0x5EF7},{0x92ED,0x5F1F},{0x92EE,0x608C},{0x92EF,0x62B5},{0x92F0,0x633A},{0x92F1,0x63D0},{0x92F2,0x68AF},{0x92F3,0x6C40},{0x92F4,0x7887},{0x92F5,0x798E},{0x92F6,0x7A0B},{0x92F7,0x7DE0},{0x92F8,0x8247},
		{0x92F9,0x8A02},{0x92FA,0x8AE6},{0x92FB,0x8E44},{0x92FC,0x9013},{0x9340,0x90B8},{0x9341,0x912D},{0x9342,0x91D8},{0x9343,0x9F0E},{0x9344,0x6CE5},{0x9345,0x6458},{0x9346,0x64E2},{0x9347,0x6575},{0x9348,0x6EF4},{0x9349,0x7684},{0x934A,0x7B1B},{0x934B,0x9069},
		{0x934C,0x93D1},{0x934D,0x6EBA},{0x934E,0x54F2},{0x934F,0x5FB9},{0x9350,0x64A4},{0x9351,0x8F4D},{0x9352,0x8FED},{0x9353,0x9244},{0x9354,0x5178},{0x9355,0x586B},{0x9356,0x5929},{0x9357,0x5C55},{0x9358,0x5E97},{0x9359,0x6DFB},{0x935A,0x7E8F},{0x935B,0x751C},
		{0x935C,0x8CBC},{0x935D,0x8EE2},{0x935E,0x985B},{0x935F,0x70B9},{0x9360,0x4F1D},{0x9361,0x6BBF},{0x9362,0x6FB1},{0x9363,0x7530},{0x9364,0x96FB},{0x9365,0x514E},{0x9366,0x5410},{0x9367,0x5835},{0x9368,0x5857},{0x9369,0x59AC},{0x936A,0x5C60},{0x936B,0x5F92},
		{0x936C,0x6597},{0x936D,0x675C},{0x936E,0x6E21},{0x936F,0x767B},{0x9370,0x83DF},{0x9371,0x8CED},{0x9372,0x9014},{0x9373,0x90FD},{0x9374,0x934D},{0x9375,0x7825},{0x9376,0x783A},{0x9377,0x52AA},{0x9378,0x5EA6},{0x9379,0x571F},{0x937A,0x5974},{0x937B,0x6012},
		{0x937C,0x5012},{0x937D,0x515A},{0x937E,0x51AC},{0x9380,0x51CD},{0x9381,0x5200},{0x9382,0x5510},{0x9383,0x5854},{0x9384,0x5858},{0x9385,0x5957},{0x9386,0x5B95},{0x9387,0x5CF6},{0x9388,0x5D8B},{0x9389,0x60BC},{0x938A,0x6295},{0x938B,0x642D},{0x938C,0x6771},
		{0x938D,0x6843},{0x938E,0x68BC},{0x938F,0x68DF},{0x9390,0x76D7},{0x9391,0x6DD8},{0x9392,0x6E6F},{0x9393,0x6D9B},{0x9394,0x706F},{0x9395,0x71C8},{0x9396,0x5F53},{0x9397,0x75D8},{0x9398,0x7977},{0x9399,0x7B49},{0x939A,0x7B54},{0x939B,0x7B52},{0x939C,0x7CD6},
		{0x939D,0x7D71},{0x939E,0x5230},{0x939F,0x8463},{0x93A0,0x8569},{0x93A1,0x85E4},{0x93A2,0x8A0E},{0x93A3,0x8B04},{0x93A4,0x8C46},{0x93A5,0x8E0F},{0x93A6,0x9003},{0x93A7,0x900F},{0x93A8,0x9419},{0x93A9,0x9676},{0x93AA,0x982D},{0x93AB,0x9A30},{0x93AC,0x95D8},
		{0x93AD,0x50CD},{0x93AE,0x52D5},{0x93AF,0x540C},{0x93B0,0x5802},{0x93B1,0x5C0E},{0x93B2,0x61A7},{0x93B3,0x649E},{0x93B4,0x6D1E},{0x93B5,0x77B3},{0x93B6,0x7AE5},{0x93B7,0x80F4},{0x93B8,0x8404},{0x93B9,0x9053},{0x93BA,0x9285},{0x93BB,0x5CE0},{0x93BC,0x9D07},
		{0x93BD,0x533F},{0x93BE,0x5F97},{0x93BF,0x5FB3},{0x93C0,0x6D9C},{0x93C1,0x7279},{0x93C2,0x7763},{0x93C3,0x79BF},{0x93C4,0x7BE4},{0x93C5,0x6BD2},{0x93C6,0x72EC},{0x93C7,0x8AAD},{0x93C8,0x6803},{0x93C9,0x6A61},{0x93CA,0x51F8},{0x93CB,0x7A81},{0x93CC,0x6934},
		{0x93CD,0x5C4A},{0x93CE,0x9CF6},{0x93CF,0x82EB},{0x93D0,0x5BC5},{0x93D1,0x9149},{0x93D2,0x701E},{0x93D3,0x5678},{0x93D4,0x5C6F},{0x93D5,0x60C7},{0x93D6,0x6566},{0x93D7,0x6C8C},{0x93D8,0x8C5A},{0x93D9,0x9041},{0x93DA,0x9813},{0x93DB,0x5451},{0x93DC,0x66C7},
		{0x93DD,0x920D},{0x93DE,0x5948},{0x93DF,0x90A3},{0x93E0,0x5185},{0x93E1,0x4E4D},{0x93E2,0x51EA},{0x93E3,0x8599},{0x93E4,0x8B0E},{0x93E5,0x7058},{0x93E6,0x637A},{0x93E7,0x934B},{0x93E8,0x6962},{0x93E9,0x99B4},{0x93EA,0x7E04},{0x93EB,0x7577},{0x93EC,0x5357},
		{0x93ED,0x6960},{0x93EE,0x8EDF},{0x93EF,0x96E3},{0x93F0,0x6C5D},{0x93F1,0x4E8C},{0x93F2,0x5C3C},{0x93F3,0x5F10},{0x93F4,0x8FE9},{0x93F5,0x5302},{0x93F6,0x8CD1},{0x93F7,0x8089},{0x93F8,0x8679},{0x93F9,0x5EFF},{0x93FA,0x65E5},{0x93FB,0x4E73},{0x93FC,0x5165},
		{0x9440,0x5982},{0x9441,0x5C3F},{0x9442,0x97EE},{0x9443,0x4EFB},{0x9444,0x598A},{0x9445,0x5FCD},{0x9446,0x8A8D},{0x9447,0x6FE1},{0x9448,0x79B0},{0x9449,0x7962},{0x944A,0x5BE7},{0x944B,0x8471},{0x944C,0x732B},{0x944D,0x71B1},{0x944E,0x5E74},{0x944F,0x5FF5},
		{0x9450,0x637B},{0x9451,0x649A},{0x9452,0x71C3},{0x9453,0x7C98},{0x9454,0x4E43},{0x9455,0x5EFC},{0x9456,0x4E4B},{0x9457,0x57DC},{0x9458,0x56A2},{0x9459,0x60A9},{0x945A,0x6FC3},{0x945B,0x7D0D},{0x945C,0x80FD},{0x945D,0x8133},{0x945E,0x81BF},{0x945F,0x8FB2},
		{0x9460,0x8997},{0x9461,0x86A4},{0x9462,0x5DF4},{0x9463,0x628A},{0x9464,0x64AD},{0x9465,0x8987},{0x9466,0x6777},{0x9467,0x6CE2},{0x9468,0x6D3E},{0x9469,0x7436},{0x946A,0x7834},{0x946B,0x5A46},{0x946C,0x7F75},{0x946D,0x82AD},{0x946E,0x99AC},{0x946F,0x4FF3},
		{0x9470,0x5EC3},{0x9471,0x62DD},{0x9472,0x6392},{0x9473,0x6557},{0x9474,0x676F},{0x9475,0x76C3},{0x9476,0x724C},{0x9477,0x80CC},{0x9478,0x80BA},{0x9479,0x8F29},{0x947A,0x914D},{0x947B,0x500D},{0x947C,0x57F9},{0x947D,0x5A92},{0x947E,0x6885},{0x9480,0x6973},
		{0x9481,0x7164},{0x9482,0x72FD},{0x9483,0x8CB7},{0x9484,0x58F2},{0x9485,0x8CE0},{0x9486,0x966A},{0x9487,0x9019},{0x9488,0x877F},{0x9489,0x79E4},{0x948A,0x77E7},{0x948B,0x8429},{0x948C,0x4F2F},{0x948D,0x5265},{0x948E,0x535A},{0x948F,0x62CD},{0x9490,0x67CF},
		{0x9491,0x6CCA},{0x9492,0x767D},{0x9493,0x7B94},{0x9494,0x7C95},{0x9495,0x8236},{0x9496,0x8584},{0x9497,0x8FEB},{0x9498,0x66DD},{0x9499,0x6F20},{0x949A,0x7206},{0x949B,0x7E1B},{0x949C,0x83AB},{0x949D,0x99C1},{0x949E,0x9EA6},{0x949F,0x51FD},{0x94A0,0x7BB1},
		{0x94A1,0x7872},{0x94A2,0x7BB8},{0x94A3,0x8087},{0x94A4,0x7B48},{0x94A5,0x6AE8},{0x94A6,0x5E61},{0x94A7,0x808C},{0x94A8,0x7551},{0x94A9,0x7560},{0x94AA,0x516B},{0x94AB,0x9262},{0x94AC,0x6E8C},{0x94AD,0x767A},{0x94AE,0x9197},{0x94AF,0x9AEA},{0x94B0,0x4F10},
		{0x94B1,0x7F70},{0x94B2,0x629C},{0x94B3,0x7B4F},{0x94B4,0x95A5},{0x94B5,0x9CE9},{0x94B6,0x567A},{0x94B7,0x5859},{0x94B8,0x86E4},{0x94B9,0x96BC},{0x94BA,0x4F34},{0x94BB,0x5224},{0x94BC,0x534A},{0x94BD,0x53CD},{0x94BE,0x53DB},{0x94BF,0x5E06},{0x94C0,0x642C},
		{0x94C1,0x6591},{0x94C2,0x677F},{0x94C3,0x6C3E},{0x94C4,0x6C4E},{0x94C5,0x7248},{0x94C6,0x72AF},{0x94C7,0x73ED},{0x94C8,0x7554},{0x94C9,0x7E41},{0x94CA,0x822C},{0x94CB,0x85E9},{0x94CC,0x8CA9},{0x94CD,0x7BC4},{0x94CE,0x91C6},{0x94CF,0x7169},{0x94D0,0x9812},
		{0x94D1,0x98EF},{0x94D2,0x633D},{0x94D3,0x6669},{0x94D4,0x756A},{0x94D5,0x76E4},{0x94D6,0x78D0},{0x94D7,0x8543},{0x94D8,0x86EE},{0x94D9,0x532A},{0x94DA,0x5351},{0x94DB,0x5426},{0x94DC,0x5983},{0x94DD,0x5E87},{0x94DE,0x5F7C},{0x94DF,0x60B2},{0x94E0,0x6249},
		{0x94E1,0x6279},{0x94E2,0x62AB},{0x94E3,0x6590},{0x94E4,0x6BD4},{0x94E5,0x6CCC},{0x94E6,0x75B2},{0x94E7,0x76AE},{0x94E8,0x7891},{0x94E9,0x79D8},{0x94EA,0x7DCB},{0x94EB,0x7F77},{0x94EC,0x80A5},{0x94ED,0x88AB},{0x94EE,0x8AB9},{0x94EF,0x8CBB},{0x94F0,0x907F},
		{0x94F1,0x975E},{0x94F2,0x98DB},{0x94F3,0x6A0B},{0x94F4,0x7C38},{0x94F5,0x5099},{0x94F6,0x5C3E},{0x94F7,0x5FAE},{0x94F8,0x6787},{0x94F9,0x6BD8},{0x94FA,0x7435},{0x94FB,0x7709},{0x94FC,0x7F8E},{0x9540,0x9F3B},{0x9541,0x67CA},{0x9542,0x7A17},{0x9543,0x5339},
		{0x9544,0x758B},{0x9545,0x9AED},{0x9546,0x5F66},{0x9547,0x819D},{0x9548,0x83F1},{0x9549,0x8098},{0x954A,0x5F3C},{0x954B,0x5FC5},{0x954C,0x7562},{0x954D,0x7B46},{0x954E,0x903C},{0x954F,0x6867},{0x9550,0x59EB},{0x9551,0x5A9B},{0x9552,0x7D10},{0x9553,0x767E},
		{0x9554,0x8B2C},{0x9555,0x4FF5},{0x9556,0x5F6A},{0x9557,0x6A19},{0x9558,0x6C37},{0x9559,0x6F02},{0x955A,0x74E2},{0x955B,0x7968},{0x955C,0x8868},{0x955D,0x8A55},{0x955E,0x8C79},{0x955F,0x5EDF},{0x9560,0x63CF},{0x9561,0x75C5},{0x9562,0x79D2},{0x9563,0x82D7},
		{0x9564,0x9328},{0x9565,0x92F2},{0x9566,0x849C},{0x9567,0x86ED},{0x9568,0x9C2D},{0x9569,0x54C1},{0x956A,0x5F6C},{0x956B,0x658C},{0x956C,0x6D5C},{0x956D,0x7015},{0x956E,0x8CA7},{0x956F,0x8CD3},{0x9570,0x983B},{0x9571,0x654F},{0x9572,0x74F6},{0x9573,0x4E0D},
		{0x9574,0x4ED8},{0x9575,0x57E0},{0x9576,0x592B},{0x9577,0x5A66},{0x9578,0x5BCC},{0x9579,0x51A8},{0x957A,0x5E03},{0x957B,0x5E9C},{0x957C,0x6016},{0x957D,0x6276},{0x957E,0x6577},{0x9580,0x65A7},{0x9581,0x666E},{0x9582,0x6D6E},{0x9583,0x7236},{0x9584,0x7B26},
		{0x9585,0x8150},{0x9586,0x819A},{0x9587,0x8299},{0x9588,0x8B5C},{0x9589,0x8CA0},{0x958A,0x8CE6},{0x958B,0x8D74},{0x958C,0x961C},{0x958D,0x9644},{0x958E,0x4FAE},{0x958F,0x64AB},{0x9590,0x6B66},{0x9591,0x821E},{0x9592,0x8461},{0x9593,0x856A},{0x9594,0x90E8},
		{0x9595,0x5C01},{0x9596,0x6953},{0x9597,0x98A8},{0x9598,0x847A},{0x9599,0x8557},{0x959A,0x4F0F},{0x959B,0x526F},{0x959C,0x5FA9},{0x959D,0x5E45},{0x959E,0x670D},{0x959F,0x798F},{0x95A0,0x8179},{0x95A1,0x8907},{0x95A2,0x8986},{0x95A3,0x6DF5},{0x95A4,0x5F17},
		{0x95A5,0x6255},{0x95A6,0x6CB8},{0x95A7,0x4ECF},{0x95A8,0x7269},{0x95A9,0x9B92},{0x95AA,0x5206},{0x95AB,0x543B},{0x95AC,0x5674},{0x95AD,0x58B3},{0x95AE,0x61A4},{0x95AF,0x626E},{0x95B0,0x711A},{0x95B1,0x596E},{0x95B2,0x7C89},{0x95B3,0x7CDE},{0x95B4,0x7D1B},
		{0x95B5,0x96F0},{0x95B6,0x6587},{0x95B7,0x805E},{0x95B8,0x4E19},{0x95B9,0x4F75},{0x95BA,0x5175},{0x95BB,0x5840},{0x95BC,0x5E63},{0x95BD,0x5E73},{0x95BE,0x5F0A},{0x95BF,0x67C4},{0x95C0,0x4E26},{0x95C1,0x853D},{0x95C2,0x9589},{0x95C3,0x965B},{0x95C4,0x7C73},
		{0x95C5,0x9801},{0x95C6,0x50FB},{0x95C7,0x58C1},{0x95C8,0x7656},{0x95C9,0x78A7},{0x95CA,0x5225},{0x95CB,0x77A5},{0x95CC,0x8511},{0x95CD,0x7B86},{0x95CE,0x504F},{0x95CF,0x5909},{0x95D0,0x7247},{0x95D1,0x7BC7},{0x95D2,0x7DE8},{0x95D3,0x8FBA},{0x95D4,0x8FD4},
		{0x95D5,0x904D},{0x95D6,0x4FBF},{0x95D7,0x52C9},{0x95D8,0x5A29},{0x95D9,0x5F01},{0x95DA,0x97AD},{0x95DB,0x4FDD},{0x95DC,0x8217},{0x95DD,0x92EA},{0x95DE,0x5703},{0x95DF,0x6355},{0x95E0,0x6B69},{0x95E1,0x752B},{0x95E2,0x88DC},{0x95E3,0x8F14},{0x95E4,0x7A42},
		{0x95E5,0x52DF},{0x95E6,0x5893},{0x95E7,0x6155},{0x95E8,0x620A},{0x95E9,0x66AE},{0x95EA,0x6BCD},{0x95EB,0x7C3F},{0x95EC,0x83E9},{0x95ED,0x5023},{0x95EE,0x4FF8},{0x95EF,0x5305},{0x95F0,0x5446},{0x95F1,0x5831},{0x95F2,0x5949},{0x95F3,0x5B9D},{0x95F4,0x5CF0},
		{0x95F5,0x5CEF},{0x95F6,0x5D29},{0x95F7,0x5E96},{0x95F8,0x62B1},{0x95F9,0x6367},{0x95FA,0x653E},{0x95FB,0x65B9},{0x95FC,0x670B},{0x9640,0x6CD5},{0x9641,0x6CE1},{0x9642,0x70F9},{0x9643,0x7832},{0x9644,0x7E2B},{0x9645,0x80DE},{0x9646,0x82B3},{0x9647,0x840C},
		{0x9648,0x84EC},{0x9649,0x8702},{0x964A,0x8912},{0x964B,0x8A2A},{0x964C,0x8C4A},{0x964D,0x90A6},{0x964E,0x92D2},{0x964F,0x98FD},{0x9650,0x9CF3},{0x9651,0x9D6C},{0x9652,0x4E4F},{0x9653,0x4EA1},{0x9654,0x508D},{0x9655,0x5256},{0x9656,0x574A},{0x9657,0x59A8},
		{0x9658,0x5E3D},{0x9659,0x5FD8},{0x965A,0x5FD9},{0x965B,0x623F},{0x965C,0x66B4},{0x965D,0x671B},{0x965E,0x67D0},{0x965F,0x68D2},{0x9660,0x5192},{0x9661,0x7D21},{0x9662,0x80AA},{0x9663,0x81A8},{0x9664,0x8B00},{0x9665,0x8C8C},{0x9666,0x8CBF},{0x9667,0x927E},
		{0x9668,0x9632},{0x9669,0x5420},{0x966A,0x982C},{0x966B,0x5317},{0x966C,0x50D5},{0x966D,0x535C},{0x966E,0x58A8},{0x966F,0x64B2},{0x9670,0x6734},{0x9671,0x7267},{0x9672,0x7766},{0x9673,0x7A46},{0x9674,0x91E6},{0x9675,0x52C3},{0x9676,0x6CA1},{0x9677,0x6B86},
		{0x9678,0x5800},{0x9679,0x5E4C},{0x967A,0x5954},{0x967B,0x672C},{0x967C,0x7FFB},{0x967D,0x51E1},{0x967E,0x76C6},{0x9680,0x6469},{0x9681,0x78E8},{0x9682,0x9B54},{0x9683,0x9EBB},{0x9684,0x57CB},{0x9685,0x59B9},{0x9686,0x6627},{0x9687,0x679A},{0x9688,0x6BCE},
		{0x9689,0x54E9},{0x968A,0x69D9},{0x968B,0x5E55},{0x968C,0x819C},{0x968D,0x6795},{0x968E,0x9BAA},{0x968F,0x67FE},{0x9690,0x9C52},{0x9691,0x685D},{0x9692,0x4EA6},{0x9693,0x4FE3},{0x9694,0x53C8},{0x9695,0x62B9},{0x9696,0x672B},{0x9697,0x6CAB},{0x9698,0x8FC4},
		{0x9699,0x4FAD},{0x969A,0x7E6D},{0x969B,0x9EBF},{0x969C,0x4E07},{0x969D,0x6162},{0x969E,0x6E80},{0x969F,0x6F2B},{0x96A0,0x8513},{0x96A1,0x5473},{0x96A2,0x672A},{0x96A3,0x9B45},{0x96A4,0x5DF3},{0x96A5,0x7B95},{0x96A6,0x5CAC},{0x96A7,0x5BC6},{0x96A8,0x871C},
		{0x96A9,0x6E4A},{0x96AA,0x84D1},{0x96AB,0x7A14},{0x96AC,0x8108},{0x96AD,0x5999},{0x96AE,0x7C8D},{0x96AF,0x6C11},{0x96B0,0x7720},{0x96B1,0x52D9},{0x96B2,0x5922},{0x96B3,0x7121},{0x96B4,0x725F},{0x96B5,0x77DB},{0x96B6,0x9727},{0x96B7,0x9D61},{0x96B8,0x690B},
		{0x96B9,0x5A7F},{0x96BA,0x5A18},{0x96BB,0x51A5},{0x96BC,0x540D},{0x96BD,0x547D},{0x96BE,0x660E},{0x96BF,0x76DF},{0x96C0,0x8FF7},{0x96C1,0x9298},{0x96C2,0x9CF4},{0x96C3,0x59EA},{0x96C4,0x725D},{0x96C5,0x6EC5},{0x96C6,0x514D},{0x96C7,0x68C9},{0x96C8,0x7DBF},
		{0x96C9,0x7DEC},{0x96CA,0x9762},{0x96CB,0x9EBA},{0x96CC,0x6478},{0x96CD,0x6A21},{0x96CE,0x8302},{0x96CF,0x5984},{0x96D0,0x5B5F},{0x96D1,0x6BDB},{0x96D2,0x731B},{0x96D3,0x76F2},{0x96D4,0x7DB2},{0x96D5,0x8017},{0x96D6,0x8499},{0x96D7,0x5132},{0x96D8,0x6728},
		{0x96D9,0x9ED9},{0x96DA,0x76EE},{0x96DB,0x6762},{0x96DC,0x52FF},{0x96DD,0x9905},{0x96DE,0x5C24},{0x96DF,0x623B},{0x96E0,0x7C7E},{0x96E1,0x8CB0},{0x96E2,0x554F},{0x96E3,0x60B6},{0x96E4,0x7D0B},{0x96E5,0x9580},{0x96E6,0x5301},{0x96E7,0x4E5F},{0x96E8,0x51B6},
		{0x96E9,0x591C},{0x96EA,0x723A},{0x96EB,0x8036},{0x96EC,0x91CE},{0x96ED,0x5F25},{0x96EE,0x77E2},{0x96EF,0x5384},{0x96F0,0x5F79},{0x96F1,0x7D04},{0x96F2,0x85AC},{0x96F3,0x8A33},{0x96F4,0x8E8D},{0x96F5,0x9756},{0x96F6,0x67F3},{0x96F7,0x85AE},{0x96F8,0x9453},
		{0x96F9,0x6109},{0x96FA,0x6108},{0x96FB,0x6CB9},{0x96FC,0x7652},{0x9740,0x8AED},{0x9741,0x8F38},{0x9742,0x552F},{0x9743,0x4F51},{0x9744,0x512A},{0x9745,0x52C7},{0x9746,0x53CB},{0x9747,0x5BA5},{0x9748,0x5E7D},{0x9749,0x60A0},{0x974A,0x6182},{0x974B,0x63D6},
		{0x974C,0x6709},{0x974D,0x67DA},{0x974E,0x6E67},{0x974F,0x6D8C},{0x9750,0x7336},{0x9751,0x7337},{0x9752,0x7531},{0x9753,0x7950},{0x9754,0x88D5},{0x9755,0x8A98},{0x9756,0x904A},{0x9757,0x9091},{0x9758,0x90F5},{0x9759,0x96C4},{0x975A,0x878D},{0x975B,0x5915},
		{0x975C,0x4E88},{0x975D,0x4F59},{0x975E,0x4E0E},{0x975F,0x8A89},{0x9760,0x8F3F},{0x9761,0x9810},{0x9762,0x50AD},{0x9763,0x5E7C},{0x9764,0x5996},{0x9765,0x5BB9},{0x9766,0x5EB8},{0x9767,0x63DA},{0x9768,0x63FA},{0x9769,0x64C1},{0x976A,0x66DC},{0x976B,0x694A},
		{0x976C,0x69D8},{0x976D,0x6D0B},{0x976E,0x6EB6},{0x976F,0x7194},{0x9770,0x7528},{0x9771,0x7AAF},{0x9772,0x7F8A},{0x9773,0x8000},{0x9774,0x8449},{0x9775,0x84C9},{0x9776,0x8981},{0x9777,0x8B21},{0x9778,0x8E0A},{0x9779,0x9065},{0x977A,0x967D},{0x977B,0x990A},
		{0x977C,0x617E},{0x977D,0x6291},{0x977E,0x6B32},{0x9780,0x6C83},{0x9781,0x6D74},{0x9782,0x7FCC},{0x9783,0x7FFC},{0x9784,0x6DC0},{0x9785,0x7F85},{0x9786,0x87BA},{0x9787,0x88F8},{0x9788,0x6765},{0x9789,0x83B1},{0x978A,0x983C},{0x978B,0x96F7},{0x978C,0x6D1B},
		{0x978D,0x7D61},{0x978E,0x843D},{0x978F,0x916A},{0x9790,0x4E71},{0x9791,0x5375},{0x9792,0x5D50},{0x9793,0x6B04},{0x9794,0x6FEB},{0x9795,0x85CD},{0x9796,0x862D},{0x9797,0x89A7},{0x9798,0x5229},{0x9799,0x540F},{0x979A,0x5C65},{0x979B,0x674E},{0x979C,0x68A8},
		{0x979D,0x7406},{0x979E,0x7483},{0x979F,0x75E2},{0x97A0,0x88CF},{0x97A1,0x88E1},{0x97A2,0x91CC},{0x97A3,0x96E2},{0x97A4,0x9678},{0x97A5,0x5F8B},{0x97A6,0x7387},{0x97A7,0x7ACB},{0x97A8,0x844E},{0x97A9,0x63A0},{0x97AA,0x7565},{0x97AB,0x5289},{0x97AC,0x6D41},
		{0x97AD,0x6E9C},{0x97AE,0x7409},{0x97AF,0x7559},{0x97B0,0x786B},{0x97B1,0x7C92},{0x97B2,0x9686},{0x97B3,0x7ADC},{0x97B4,0x9F8D},{0x97B5,0x4FB6},{0x97B6,0x616E},{0x97B7,0x65C5},{0x97B8,0x865C},{0x97B9,0x4E86},{0x97BA,0x4EAE},{0x97BB,0x50DA},{0x97BC,0x4E21},
		{0x97BD,0x51CC},{0x97BE,0x5BEE},{0x97BF,0x6599},{0x97C0,0x6881},{0x97C1,0x6DBC},{0x97C2,0x731F},{0x97C3,0x7642},{0x97C4,0x77AD},{0x97C5,0x7A1C},{0x97C6,0x7CE7},{0x97C7,0x826F},{0x97C8,0x8AD2},{0x97C9,0x907C},{0x97CA,0x91CF},{0x97CB,0x9675},{0x97CC,0x9818},
		{0x97CD,0x529B},{0x97CE,0x7DD1},{0x97CF,0x502B},{0x97D0,0x5398},{0x97D1,0x6797},{0x97D2,0x6DCB},{0x97D3,0x71D0},{0x97D4,0x7433},{0x97D5,0x81E8},{0x97D6,0x8F2A},{0x97D7,0x96A3},{0x97D8,0x9C57},{0x97D9,0x9E9F},{0x97DA,0x7460},{0x97DB,0x5841},{0x97DC,0x6D99},
		{0x97DD,0x7D2F},{0x97DE,0x985E},{0x97DF,0x4EE4},{0x97E0,0x4F36},{0x97E1,0x4F8B},{0x97E2,0x51B7},{0x97E3,0x52B1},{0x97E4,0x5DBA},{0x97E5,0x601C},{0x97E6,0x73B2},{0x97E7,0x793C},{0x97E8,0x82D3},{0x97E9,0x9234},{0x97EA,0x96B7},{0x97EB,0x96F6},{0x97EC,0x970A},
		{0x97ED,0x9E97},{0x97EE,0x9F62},{0x97EF,0x66A6},{0x97F0,0x6B74},{0x97F1,0x5217},{0x97F2,0x52A3},{0x97F3,0x70C8},{0x97F4,0x88C2},{0x97F5,0x5EC9},{0x97F6,0x604B},{0x97F7,0x6190},{0x97F8,0x6F23},{0x97F9,0x7149},{0x97FA,0x7C3E},{0x97FB,0x7DF4},{0x97FC,0x806F},
		{0x9840,0x84EE},{0x9841,0x9023},{0x9842,0x932C},{0x9843,0x5442},{0x9844,0x9B6F},{0x9845,0x6AD3},{0x9846,0x7089},{0x9847,0x8CC2},{0x9848,0x8DEF},{0x9849,0x9732},{0x984A,0x52B4},{0x984B,0x5A41},{0x984C,0x5ECA},{0x984D,0x5F04},{0x984E,0x6717},{0x984F,0x697C},
		{0x9850,0x6994},{0x9851,0x6D6A},{0x9852,0x6F0F},{0x9853,0x7262},{0x9854,0x72FC},{0x9855,0x7BED},{0x9856,0x8001},{0x9857,0x807E},{0x9858,0x874B},{0x9859,0x90CE},{0x985A,0x516D},{0x985B,0x9E93},{0x985C,0x7984},{0x985D,0x808B},{0x985E,0x9332},{0x985F,0x8AD6},
		{0x9860,0x502D},{0x9861,0x548C},{0x9862,0x8A71},{0x9863,0x6B6A},{0x9864,0x8CC4},{0x9865,0x8107},{0x9866,0x60D1},{0x9867,0x67A0},{0x9868,0x9DF2},{0x9869,0x4E99},{0x986A,0x4E98},{0x986B,0x9C10},{0x986C,0x8A6B},{0x986D,0x85C1},{0x986E,0x8568},{0x986F,0x6900},
		{0x9870,0x6E7E},{0x9871,0x7897},{0x9872,0x8155},{0x989F,0x5F0C},{0x98A0,0x4E10},{0x98A1,0x4E15},{0x98A2,0x4E2A},{0x98A3,0x4E31},{0x98A4,0x4E36},{0x98A5,0x4E3C},{0x98A6,0x4E3F},{0x98A7,0x4E42},{0x98A8,0x4E56},{0x98A9,0x4E58},{0x98AA,0x4E82},{0x98AB,0x4E85},
		{0x98AC,0x8C6B},{0x98AD,0x4E8A},{0x98AE,0x8212},{0x98AF,0x5F0D},{0x98B0,0x4E8E},{0x98B1,0x4E9E},{0x98B2,0x4E9F},{0x98B3,0x4EA0},{0x98B4,0x4EA2},{0x98B5,0x4EB0},{0x98B6,0x4EB3},{0x98B7,0x4EB6},{0x98B8,0x4ECE},{0x98B9,0x4ECD},{0x98BA,0x4EC4},{0x98BB,0x4EC6},
		{0x98BC,0x4EC2},{0x98BD,0x4ED7},{0x98BE,0x4EDE},{0x98BF,0x4EED},{0x98C0,0x4EDF},{0x98C1,0x4EF7},{0x98C2,0x4F09},{0x98C3,0x4F5A},{0x98C4,0x4F30},{0x98C5,0x4F5B},{0x98C6,0x4F5D},{0x98C7,0x4F57},{0x98C8,0x4F47},{0x98C9,0x4F76},{0x98CA,0x4F88},{0x98CB,0x4F8F},
		{0x98CC,0x4F98},{0x98CD,0x4F7B},{0x98CE,0x4F69},{0x98CF,0x4F70},{0x98D0,0x4F91},{0x98D1,0x4F6F},{0x98D2,0x4F86},{0x98D3,0x4F96},{0x98D4,0x5118},{0x98D5,0x4FD4},{0x98D6,0x4FDF},{0x98D7,0x4FCE},{0x98D8,0x4FD8},{0x98D9,0x4FDB},{0x98DA,0x4FD1},{0x98DB,0x4FDA},
		{0x98DC,0x4FD0},{0x98DD,0x4FE4},{0x98DE,0x4FE5},{0x98DF,0x501A},{0x98E0,0x5028},{0x98E1,0x5014},{0x98E2,0x502A},{0x98E3,0x5025},{0x98E4,0x5005},{0x98E5,0x4F1C},{0x98E6,0x4FF6},{0x98E7,0x5021},{0x98E8,0x5029},{0x98E9,0x502C},{0x98EA,0x4FFE},{0x98EB,0x4FEF},
		{0x98EC,0x5011},{0x98ED,0x5006},{0x98EE,0x5043},{0x98EF,0x5047},{0x98F0,0x6703},{0x98F1,0x5055},{0x98F2,0x5050},{0x98F3,0x5048},{0x98F4,0x505A},{0x98F5,0x5056},{0x98F6,0x506C},{0x98F7,0x5078},{0x98F8,0x5080},{0x98F9,0x509A},{0x98FA,0x5085},{0x98FB,0x50B4},
		{0x98FC,0x50B2},{0x9940,0x50C9},{0x9941,0x50CA},{0x9942,0x50B3},{0x9943,0x50C2},{0x9944,0x50D6},{0x9945,0x50DE},{0x9946,0x50E5},{0x9947,0x50ED},{0x9948,0x50E3},{0x9949,0x50EE},{0x994A,0x50F9},{0x994B,0x50F5},{0x994C,0x5109},{0x994D,0x5101},{0x994E,0x5102},
		{0x994F,0x5116},{0x9950,0x5115},{0x9951,0x5114},{0x9952,0x511A},{0x9953,0x5121},{0x9954,0x513A},{0x9955,0x5137},{0x9956,0x513C},{0x9957,0x513B},{0x9958,0x513F},{0x9959,0x5140},{0x995A,0x5152},{0x995B,0x514C},{0x995C,0x5154},{0x995D,0x5162},{0x995E,0x7AF8},
		{0x995F,0x5169},{0x9960,0x516A},{0x9961,0x516E},{0x9962,0x5180},{0x9963,0x5182},{0x9964,0x56D8},{0x9965,0x518C},{0x9966,0x5189},{0x9967,0x518F},{0x9968,0x5191},{0x9969,0x5193},{0x996A,0x5195},{0x996B,0x5196},{0x996C,0x51A4},{0x996D,0x51A6},{0x996E,0x51A2},
		{0x996F,0x51A9},{0x9970,0x51AA},{0x9971,0x51AB},{0x9972,0x51B3},{0x9973,0x51B1},{0x9974,0x51B2},{0x9975,0x51B0},{0x9976,0x51B5},{0x9977,0x51BD},{0x9978,0x51C5},{0x9979,0x51C9},{0x997A,0x51DB},{0x997B,0x51E0},{0x997C,0x8655},{0x997D,0x51E9},{0x997E,0x51ED},
		{0x9980,0x51F0},{0x9981,0x51F5},{0x9982,0x51FE},{0x9983,0x5204},{0x9984,0x520B},{0x9985,0x5214},{0x9986,0x520E},{0x9987,0x5227},{0x9988,0x522A},{0x9989,0x522E},{0x998A,0x5233},{0x998B,0x5239},{0x998C,0x524F},{0x998D,0x5244},{0x998E,0x524B},{0x998F,0x524C},
		{0x9990,0x525E},{0x9991,0x5254},{0x9992,0x526A},{0x9993,0x5274},{0x9994,0x5269},{0x9995,0x5273},{0x9996,0x527F},{0x9997,0x527D},{0x9998,0x528D},{0x9999,0x5294},{0x999A,0x5292},{0x999B,0x5271},{0x999C,0x5288},{0x999D,0x5291},{0x999E,0x8FA8},{0x999F,0x8FA7},
		{0x99A0,0x52AC},{0x99A1,0x52AD},{0x99A2,0x52BC},{0x99A3,0x52B5},{0x99A4,0x52C1},{0x99A5,0x52CD},{0x99A6,0x52D7},{0x99A7,0x52DE},{0x99A8,0x52E3},{0x99A9,0x52E6},{0x99AA,0x98ED},{0x99AB,0x52E0},{0x99AC,0x52F3},{0x99AD,0x52F5},{0x99AE,0x52F8},{0x99AF,0x52F9},
		{0x99B0,0x5306},{0x99B1,0x5308},{0x99B2,0x7538},{0x99B3,0x530D},{0x99B4,0x5310},{0x99B5,0x530F},{0x99B6,0x5315},{0x99B7,0x531A},{0x99B8,0x5323},{0x99B9,0x532F},{0x99BA,0x5331},{0x99BB,0x5333},{0x99BC,0x5338},{0x99BD,0x5340},{0x99BE,0x5346},{0x99BF,0x5345},
		{0x99C0,0x4E17},{0x99C1,0x5349},{0x99C2,0x534D},{0x99C3,0x51D6},{0x99C4,0x535E},{0x99C5,0x5369},{0x99C6,0x536E},{0x99C7,0x5918},{0x99C8,0x537B},{0x99C9,0x5377},{0x99CA,0x5382},{0x99CB,0x5396},{0x99CC,0x53A0},{0x99CD,0x53A6},{0x99CE,0x53A5},{0x99CF,0x53AE},
		{0x99D0,0x53B0},{0x99D1,0x53B6},{0x99D2,0x53C3},{0x99D3,0x7C12},{0x99D4,0x96D9},{0x99D5,0x53DF},{0x99D6,0x66FC},{0x99D7,0x71EE},{0x99D8,0x53EE},{0x99D9,0x53E8},{0x99DA,0x53ED},{0x99DB,0x53FA},{0x99DC,0x5401},{0x99DD,0x543D},{0x99DE,0x5440},{0x99DF,0x542C},
		{0x99E0,0x542D},{0x99E1,0x543C},{0x99E2,0x542E},{0x99E3,0x5436},{0x99E4,0x5429},{0x99E5,0x541D},{0x99E6,0x544E},{0x99E7,0x548F},{0x99E8,0x5475},{0x99E9,0x548E},{0x99EA,0x545F},{0x99EB,0x5471},{0x99EC,0x5477},{0x99ED,0x5470},{0x99EE,0x5492},{0x99EF,0x547B},
		{0x99F0,0x5480},{0x99F1,0x5476},{0x99F2,0x5484},{0x99F3,0x5490},{0x99F4,0x5486},{0x99F5,0x54C7},{0x99F6,0x54A2},{0x99F7,0x54B8},{0x99F8,0x54A5},{0x99F9,0x54AC},{0x99FA,0x54C4},{0x99FB,0x54C8},{0x99FC,0x54A8},{0x9A40,0x54AB},{0x9A41,0x54C2},{0x9A42,0x54A4},
		{0x9A43,0x54BE},{0x9A44,0x54BC},{0x9A45,0x54D8},{0x9A46,0x54E5},{0x9A47,0x54E6},{0x9A48,0x550F},{0x9A49,0x5514},{0x9A4A,0x54FD},{0x9A4B,0x54EE},{0x9A4C,0x54ED},{0x9A4D,0x54FA},{0x9A4E,0x54E2},{0x9A4F,0x5539},{0x9A50,0x5540},{0x9A51,0x5563},{0x9A52,0x554C},
		{0x9A53,0x552E},{0x9A54,0x555C},{0x9A55,0x5545},{0x9A56,0x5556},{0x9A57,0x5557},{0x9A58,0x5538},{0x9A59,0x5533},{0x9A5A,0x555D},{0x9A5B,0x5599},{0x9A5C,0x5580},{0x9A5D,0x54AF},{0x9A5E,0x558A},{0x9A5F,0x559F},{0x9A60,0x557B},{0x9A61,0x557E},{0x9A62,0x5598},
		{0x9A63,0x559E},{0x9A64,0x55AE},{0x9A65,0x557C},{0x9A66,0x5583},{0x9A67,0x55A9},{0x9A68,0x5587},{0x9A69,0x55A8},{0x9A6A,0x55DA},{0x9A6B,0x55C5},{0x9A6C,0x55DF},{0x9A6D,0x55C4},{0x9A6E,0x55DC},{0x9A6F,0x55E4},{0x9A70,0x55D4},{0x9A71,0x5614},{0x9A72,0x55F7},
		{0x9A73,0x5616},{0x9A74,0x55FE},{0x9A75,0x55FD},{0x9A76,0x561B},{0x9A77,0x55F9},{0x9A78,0x564E},{0x9A79,0x5650},{0x9A7A,0x71DF},{0x9A7B,0x5634},{0x9A7C,0x5636},{0x9A7D,0x5632},{0x9A7E,0x5638},{0x9A80,0x566B},{0x9A81,0x5664},{0x9A82,0x562F},{0x9A83,0x566C},
		{0x9A84,0x566A},{0x9A85,0x5686},{0x9A86,0x5680},{0x9A87,0x568A},{0x9A88,0x56A0},{0x9A89,0x5694},{0x9A8A,0x568F},{0x9A8B,0x56A5},{0x9A8C,0x56AE},{0x9A8D,0x56B6},{0x9A8E,0x56B4},{0x9A8F,0x56C2},{0x9A90,0x56BC},{0x9A91,0x56C1},{0x9A92,0x56C3},{0x9A93,0x56C0},
		{0x9A94,0x56C8},{0x9A95,0x56CE},{0x9A96,0x56D1},{0x9A97,0x56D3},{0x9A98,0x56D7},{0x9A99,0x56EE},{0x9A9A,0x56F9},{0x9A9B,0x5700},{0x9A9C,0x56FF},{0x9A9D,0x5704},{0x9A9E,0x5709},{0x9A9F,0x5708},{0x9AA0,0x570B},{0x9AA1,0x570D},{0x9AA2,0x5713},{0x9AA3,0x5718},
		{0x9AA4,0x5716},{0x9AA5,0x55C7},{0x9AA6,0x571C},{0x9AA7,0x5726},{0x9AA8,0x5737},{0x9AA9,0x5738},{0x9AAA,0x574E},{0x9AAB,0x573B},{0x9AAC,0x5740},{0x9AAD,0x574F},{0x9AAE,0x5769},{0x9AAF,0x57C0},{0x9AB0,0x5788},{0x9AB1,0x5761},{0x9AB2,0x577F},{0x9AB3,0x5789},
		{0x9AB4,0x5793},{0x9AB5,0x57A0},{0x9AB6,0x57B3},{0x9AB7,0x57A4},{0x9AB8,0x57AA},{0x9AB9,0x57B0},{0x9ABA,0x57C3},{0x9ABB,0x57C6},{0x9ABC,0x57D4},{0x9ABD,0x57D2},{0x9ABE,0x57D3},{0x9ABF,0x580A},{0x9AC0,0x57D6},{0x9AC1,0x57E3},{0x9AC2,0x580B},{0x9AC3,0x5819},
		{0x9AC4,0x581D},{0x9AC5,0x5872},{0x9AC6,0x5821},{0x9AC7,0x5862},{0x9AC8,0x584B},{0x9AC9,0x5870},{0x9ACA,0x6BC0},{0x9ACB,0x5852},{0x9ACC,0x583D},{0x9ACD,0x5879},{0x9ACE,0x5885},{0x9ACF,0x58B9},{0x9AD0,0x589F},{0x9AD1,0x58AB},{0x9AD2,0x58BA},{0x9AD3,0x58DE},
		{0x9AD4,0x58BB},{0x9AD5,0x58B8},{0x9AD6,0x58AE},{0x9AD7,0x58C5},{0x9AD8,0x58D3},{0x9AD9,0x58D1},{0x9ADA,0x58D7},{0x9ADB,0x58D9},{0x9ADC,0x58D8},{0x9ADD,0x58E5},{0x9ADE,0x58DC},{0x9ADF,0x58E4},{0x9AE0,0x58DF},{0x9AE1,0x58EF},{0x9AE2,0x58FA},{0x9AE3,0x58F9},
		{0x9AE4,0x58FB},{0x9AE5,0x58FC},{0x9AE6,0x58FD},{0x9AE7,0x5902},{0x9AE8,0x590A},{0x9AE9,0x5910},{0x9AEA,0x591B},{0x9AEB,0x68A6},{0x9AEC,0x5925},{0x9AED,0x592C},{0x9AEE,0x592D},{0x9AEF,0x5932},{0x9AF0,0x5938},{0x9AF1,0x593E},{0x9AF2,0x7AD2},{0x9AF3,0x5955},
		{0x9AF4,0x5950},{0x9AF5,0x594E},{0x9AF6,0x595A},{0x9AF7,0x5958},{0x9AF8,0x5962},{0x9AF9,0x5960},{0x9AFA,0x5967},{0x9AFB,0x596C},{0x9AFC,0x5969},{0x9B40,0x5978},{0x9B41,0x5981},{0x9B42,0x599D},{0x9B43,0x4F5E},{0x9B44,0x4FAB},{0x9B45,0x59A3},{0x9B46,0x59B2},
		{0x9B47,0x59C6},{0x9B48,0x59E8},{0x9B49,0x59DC},{0x9B4A,0x598D},{0x9B4B,0x59D9},{0x9B4C,0x59DA},{0x9B4D,0x5A25},{0x9B4E,0x5A1F},{0x9B4F,0x5A11},{0x9B50,0x5A1C},{0x9B51,0x5A09},{0x9B52,0x5A1A},{0x9B53,0x5A40},{0x9B54,0x5A6C},{0x9B55,0x5A49},{0x9B56,0x5A35},
		{0x9B57,0x5A36},{0x9B58,0x5A62},{0x9B59,0x5A6A},{0x9B5A,0x5A9A},{0x9B5B,0x5ABC},{0x9B5C,0x5ABE},{0x9B5D,0x5ACB},{0x9B5E,0x5AC2},{0x9B5F,0x5ABD},{0x9B60,0x5AE3},{0x9B61,0x5AD7},{0x9B62,0x5AE6},{0x9B63,0x5AE9},{0x9B64,0x5AD6},{0x9B65,0x5AFA},{0x9B66,0x5AFB},
		{0x9B67,0x5B0C},{0x9B68,0x5B0B},{0x9B69,0x5B16},{0x9B6A,0x5B32},{0x9B6B,0x5AD0},{0x9B6C,0x5B2A},{0x9B6D,0x5B36},{0x9B6E,0x5B3E},{0x9B6F,0x5B43},{0x9B70,0x5B45},{0x9B71,0x5B40},{0x9B72,0x5B51},{0x9B73,0x5B55},{0x9B74,0x5B5A},{0x9B75,0x5B5B},{0x9B76,0x5B65},
		{0x9B77,0x5B69},{0x9B78,0x5B70},{0x9B79,0x5B73},{0x9B7A,0x5B75},{0x9B7B,0x5B78},{0x9B7C,0x6588},{0x9B7D,0x5B7A},{0x9B7E,0x5B80},{0x9B80,0x5B83},{0x9B81,0x5BA6},{0x9B82,0x5BB8},{0x9B83,0x5BC3},{0x9B84,0x5BC7},{0x9B85,0x5BC9},{0x9B86,0x5BD4},{0x9B87,0x5BD0},
		{0x9B88,0x5BE4},{0x9B89,0x5BE6},{0x9B8A,0x5BE2},{0x9B8B,0x5BDE},{0x9B8C,0x5BE5},{0x9B8D,0x5BEB},{0x9B8E,0x5BF0},{0x9B8F,0x5BF6},{0x9B90,0x5BF3},{0x9B91,0x5C05},{0x9B92,0x5C07},{0x9B93,0x5C08},{0x9B94,0x5C0D},{0x9B95,0x5C13},{0x9B96,0x5C20},{0x9B97,0x5C22},
		{0x9B98,0x5C28},{0x9B99,0x5C38},{0x9B9A,0x5C39},{0x9B9B,0x5C41},{0x9B9C,0x5C46},{0x9B9D,0x5C4E},{0x9B9E,0x5C53},{0x9B9F,0x5C50},{0x9BA0,0x5C4F},{0x9BA1,0x5B71},{0x9BA2,0x5C6C},{0x9BA3,0x5C6E},{0x9BA4,0x4E62},{0x9BA5,0x5C76},{0x9BA6,0x5C79},{0x9BA7,0x5C8C},
		{0x9BA8,0x5C91},{0x9BA9,0x5C94},{0x9BAA,0x599B},{0x9BAB,0x5CAB},{0x9BAC,0x5CBB},{0x9BAD,0x5CB6},{0x9BAE,0x5CBC},{0x9BAF,0x5CB7},{0x9BB0,0x5CC5},{0x9BB1,0x5CBE},{0x9BB2,0x5CC7},{0x9BB3,0x5CD9},{0x9BB4,0x5CE9},{0x9BB5,0x5CFD},{0x9BB6,0x5CFA},{0x9BB7,0x5CED},
		{0x9BB8,0x5D8C},{0x9BB9,0x5CEA},{0x9BBA,0x5D0B},{0x9BBB,0x5D15},{0x9BBC,0x5D17},{0x9BBD,0x5D5C},{0x9BBE,0x5D1F},{0x9BBF,0x5D1B},{0x9BC0,0x5D11},{0x9BC1,0x5D14},{0x9BC2,0x5D22},{0x9BC3,0x5D1A},{0x9BC4,0x5D19},{0x9BC5,0x5D18},{0x9BC6,0x5D4C},{0x9BC7,0x5D52},
		{0x9BC8,0x5D4E},{0x9BC9,0x5D4B},{0x9BCA,0x5D6C},{0x9BCB,0x5D73},{0x9BCC,0x5D76},{0x9BCD,0x5D87},{0x9BCE,0x5D84},{0x9BCF,0x5D82},{0x9BD0,0x5DA2},{0x9BD1,0x5D9D},{0x9BD2,0x5DAC},{0x9BD3,0x5DAE},{0x9BD4,0x5DBD},{0x9BD5,0x5D90},{0x9BD6,0x5DB7},{0x9BD7,0x5DBC},
		{0x9BD8,0x5DC9},{0x9BD9,0x5DCD},{0x9BDA,0x5DD3},{0x9BDB,0x5DD2},{0x9BDC,0x5DD6},{0x9BDD,0x5DDB},{0x9BDE,0x5DEB},{0x9BDF,0x5DF2},{0x9BE0,0x5DF5},{0x9BE1,0x5E0B},{0x9BE2,0x5E1A},{0x9BE3,0x5E19},{0x9BE4,0x5E11},{0x9BE5,0x5E1B},{0x9BE6,0x5E36},{0x9BE7,0x5E37},
		{0x9BE8,0x5E44},{0x9BE9,0x5E43},{0x9BEA,0x5E40},{0x9BEB,0x5E4E},{0x9BEC,0x5E57},{0x9BED,0x5E54},{0x9BEE,0x5E5F},{0x9BEF,0x5E62},{0x9BF0,0x5E64},{0x9BF1,0x5E47},{0x9BF2,0x5E75},{0x9BF3,0x5E76},{0x9BF4,0x5E7A},{0x9BF5,0x9EBC},{0x9BF6,0x5E7F},{0x9BF7,0x5EA0},
		{0x9BF8,0x5EC1},{0x9BF9,0x5EC2},{0x9BFA,0x5EC8},{0x9BFB,0x5ED0},{0x9BFC,0x5ECF},{0x9C40,0x5ED6},{0x9C41,0x5EE3},{0x9C42,0x5EDD},{0x9C43,0x5EDA},{0x9C44,0x5EDB},{0x9C45,0x5EE2},{0x9C46,0x5EE1},{0x9C47,0x5EE8},{0x9C48,0x5EE9},{0x9C49,0x5EEC},{0x9C4A,0x5EF1},
		{0x9C4B,0x5EF3},{0x9C4C,0x5EF0},{0x9C4D,0x5EF4},{0x9C4E,0x5EF8},{0x9C4F,0x5EFE},{0x9C50,0x5F03},{0x9C51,0x5F09},{0x9C52,0x5F5D},{0x9C53,0x5F5C},{0x9C54,0x5F0B},{0x9C55,0x5F11},{0x9C56,0x5F16},{0x9C57,0x5F29},{0x9C58,0x5F2D},{0x9C59,0x5F38},{0x9C5A,0x5F41},
		{0x9C5B,0x5F48},{0x9C5C,0x5F4C},{0x9C5D,0x5F4E},{0x9C5E,0x5F2F},{0x9C5F,0x5F51},{0x9C60,0x5F56},{0x9C61,0x5F57},{0x9C62,0x5F59},{0x9C63,0x5F61},{0x9C64,0x5F6D},{0x9C65,0x5F73},{0x9C66,0x5F77},{0x9C67,0x5F83},{0x9C68,0x5F82},{0x9C69,0x5F7F},{0x9C6A,0x5F8A},
		{0x9C6B,0x5F88},{0x9C6C,0x5F91},{0x9C6D,0x5F87},{0x9C6E,0x5F9E},{0x9C6F,0x5F99},{0x9C70,0x5F98},{0x9C71,0x5FA0},{0x9C72,0x5FA8},{0x9C73,0x5FAD},{0x9C74,0x5FBC},{0x9C75,0x5FD6},{0x9C76,0x5FFB},{0x9C77,0x5FE4},{0x9C78,0x5FF8},{0x9C79,0x5FF1},{0x9C7A,0x5FDD},
		{0x9C7B,0x60B3},{0x9C7C,0x5FFF},{0x9C7D,0x6021},{0x9C7E,0x6060},{0x9C80,0x6019},{0x9C81,0x6010},{0x9C82,0x6029},{0x9C83,0x600E},{0x9C84,0x6031},{0x9C85,0x601B},{0x9C86,0x6015},{0x9C87,0x602B},{0x9C88,0x6026},{0x9C89,0x600F},{0x9C8A,0x603A},{0x9C8B,0x605A},
		{0x9C8C,0x6041},{0x9C8D,0x606A},{0x9C8E,0x6077},{0x9C8F,0x605F},{0x9C90,0x604A},{0x9C91,0x6046},{0x9C92,0x604D},{0x9C93,0x6063},{0x9C94,0x6043},{0x9C95,0x6064},{0x9C96,0x6042},{0x9C97,0x606C},{0x9C98,0x606B},{0x9C99,0x6059},{0x9C9A,0x6081},{0x9C9B,0x608D},
		{0x9C9C,0x60E7},{0x9C9D,0x6083},{0x9C9E,0x609A},{0x9C9F,0x6084},{0x9CA0,0x609B},{0x9CA1,0x6096},{0x9CA2,0x6097},{0x9CA3,0x6092},{0x9CA4,0x60A7},{0x9CA5,0x608B},{0x9CA6,0x60E1},{0x9CA7,0x60B8},{0x9CA8,0x60E0},{0x9CA9,0x60D3},{0x9CAA,0x60B4},{0x9CAB,0x5FF0},
		{0x9CAC,0x60BD},{0x9CAD,0x60C6},{0x9CAE,0x60B5},{0x9CAF,0x60D8},{0x9CB0,0x614D},{0x9CB1,0x6115},{0x9CB2,0x6106},{0x9CB3,0x60F6},{0x9CB4,0x60F7},{0x9CB5,0x6100},{0x9CB6,0x60F4},{0x9CB7,0x60FA},{0x9CB8,0x6103},{0x9CB9,0x6121},{0x9CBA,0x60FB},{0x9CBB,0x60F1},
		{0x9CBC,0x610D},{0x9CBD,0x610E},{0x9CBE,0x6147},{0x9CBF,0x613E},{0x9CC0,0x6128},{0x9CC1,0x6127},{0x9CC2,0x614A},{0x9CC3,0x613F},{0x9CC4,0x613C},{0x9CC5,0x612C},{0x9CC6,0x6134},{0x9CC7,0x613D},{0x9CC8,0x6142},{0x9CC9,0x6144},{0x9CCA,0x6173},{0x9CCB,0x6177},
		{0x9CCC,0x6158},{0x9CCD,0x6159},{0x9CCE,0x615A},{0x9CCF,0x616B},{0x9CD0,0x6174},{0x9CD1,0x616F},{0x9CD2,0x6165},{0x9CD3,0x6171},{0x9CD4,0x615F},{0x9CD5,0x615D},{0x9CD6,0x6153},{0x9CD7,0x6175},{0x9CD8,0x6199},{0x9CD9,0x6196},{0x9CDA,0x6187},{0x9CDB,0x61AC},
		{0x9CDC,0x6194},{0x9CDD,0x619A},{0x9CDE,0x618A},{0x9CDF,0x6191},{0x9CE0,0x61AB},{0x9CE1,0x61AE},{0x9CE2,0x61CC},{0x9CE3,0x61CA},{0x9CE4,0x61C9},{0x9CE5,0x61F7},{0x9CE6,0x61C8},{0x9CE7,0x61C3},{0x9CE8,0x61C6},{0x9CE9,0x61BA},{0x9CEA,0x61CB},{0x9CEB,0x7F79},
		{0x9CEC,0x61CD},{0x9CED,0x61E6},{0x9CEE,0x61E3},{0x9CEF,0x61F6},{0x9CF0,0x61FA},{0x9CF1,0x61F4},{0x9CF2,0x61FF},{0x9CF3,0x61FD},{0x9CF4,0x61FC},{0x9CF5,0x61FE},{0x9CF6,0x6200},{0x9CF7,0x6208},{0x9CF8,0x6209},{0x9CF9,0x620D},{0x9CFA,0x620C},{0x9CFB,0x6214},
		{0x9CFC,0x621B},{0x9D40,0x621E},{0x9D41,0x6221},{0x9D42,0x622A},{0x9D43,0x622E},{0x9D44,0x6230},{0x9D45,0x6232},{0x9D46,0x6233},{0x9D47,0x6241},{0x9D48,0x624E},{0x9D49,0x625E},{0x9D4A,0x6263},{0x9D4B,0x625B},{0x9D4C,0x6260},{0x9D4D,0x6268},{0x9D4E,0x627C},
		{0x9D4F,0x6282},{0x9D50,0x6289},{0x9D51,0x627E},{0x9D52,0x6292},{0x9D53,0x6293},{0x9D54,0x6296},{0x9D55,0x62D4},{0x9D56,0x6283},{0x9D57,0x6294},{0x9D58,0x62D7},{0x9D59,0x62D1},{0x9D5A,0x62BB},{0x9D5B,0x62CF},{0x9D5C,0x62FF},{0x9D5D,0x62C6},{0x9D5E,0x64D4},
		{0x9D5F,0x62C8},{0x9D60,0x62DC},{0x9D61,0x62CC},{0x9D62,0x62CA},{0x9D63,0x62C2},{0x9D64,0x62C7},{0x9D65,0x629B},{0x9D66,0x62C9},{0x9D67,0x630C},{0x9D68,0x62EE},{0x9D69,0x62F1},{0x9D6A,0x6327},{0x9D6B,0x6302},{0x9D6C,0x6308},{0x9D6D,0x62EF},{0x9D6E,0x62F5},
		{0x9D6F,0x6350},{0x9D70,0x633E},{0x9D71,0x634D},{0x9D72,0x641C},{0x9D73,0x634F},{0x9D74,0x6396},{0x9D75,0x638E},{0x9D76,0x6380},{0x9D77,0x63AB},{0x9D78,0x6376},{0x9D79,0x63A3},{0x9D7A,0x638F},{0x9D7B,0x6389},{0x9D7C,0x639F},{0x9D7D,0x63B5},{0x9D7E,0x636B},
		{0x9D80,0x6369},{0x9D81,0x63BE},{0x9D82,0x63E9},{0x9D83,0x63C0},{0x9D84,0x63C6},{0x9D85,0x63E3},{0x9D86,0x63C9},{0x9D87,0x63D2},{0x9D88,0x63F6},{0x9D89,0x63C4},{0x9D8A,0x6416},{0x9D8B,0x6434},{0x9D8C,0x6406},{0x9D8D,0x6413},{0x9D8E,0x6426},{0x9D8F,0x6436},
		{0x9D90,0x651D},{0x9D91,0x6417},{0x9D92,0x6428},{0x9D93,0x640F},{0x9D94,0x6467},{0x9D95,0x646F},{0x9D96,0x6476},{0x9D97,0x644E},{0x9D98,0x652A},{0x9D99,0x6495},{0x9D9A,0x6493},{0x9D9B,0x64A5},{0x9D9C,0x64A9},{0x9D9D,0x6488},{0x9D9E,0x64BC},{0x9D9F,0x64DA},
		{0x9DA0,0x64D2},{0x9DA1,0x64C5},{0x9DA2,0x64C7},{0x9DA3,0x64BB},{0x9DA4,0x64D8},{0x9DA5,0x64C2},{0x9DA6,0x64F1},{0x9DA7,0x64E7},{0x9DA8,0x8209},{0x9DA9,0x64E0},{0x9DAA,0x64E1},{0x9DAB,0x62AC},{0x9DAC,0x64E3},{0x9DAD,0x64EF},{0x9DAE,0x652C},{0x9DAF,0x64F6},
		{0x9DB0,0x64F4},{0x9DB1,0x64F2},{0x9DB2,0x64FA},{0x9DB3,0x6500},{0x9DB4,0x64FD},{0x9DB5,0x6518},{0x9DB6,0x651C},{0x9DB7,0x6505},{0x9DB8,0x6524},{0x9DB9,0x6523},{0x9DBA,0x652B},{0x9DBB,0x6534},{0x9DBC,0x6535},{0x9DBD,0x6537},{0x9DBE,0x6536},{0x9DBF,0x6538},
		{0x9DC0,0x754B},{0x9DC1,0x6548},{0x9DC2,0x6556},{0x9DC3,0x6555},{0x9DC4,0x654D},{0x9DC5,0x6558},{0x9DC6,0x655E},{0x9DC7,0x655D},{0x9DC8,0x6572},{0x9DC9,0x6578},{0x9DCA,0x6582},{0x9DCB,0x6583},{0x9DCC,0x8B8A},{0x9DCD,0x659B},{0x9DCE,0x659F},{0x9DCF,0x65AB},
		{0x9DD0,0x65B7},{0x9DD1,0x65C3},{0x9DD2,0x65C6},{0x9DD3,0x65C1},{0x9DD4,0x65C4},{0x9DD5,0x65CC},{0x9DD6,0x65D2},{0x9DD7,0x65DB},{0x9DD8,0x65D9},{0x9DD9,0x65E0},{0x9DDA,0x65E1},{0x9DDB,0x65F1},{0x9DDC,0x6772},{0x9DDD,0x660A},{0x9DDE,0x6603},{0x9DDF,0x65FB},
		{0x9DE0,0x6773},{0x9DE1,0x6635},{0x9DE2,0x6636},{0x9DE3,0x6634},{0x9DE4,0x661C},{0x9DE5,0x664F},{0x9DE6,0x6644},{0x9DE7,0x6649},{0x9DE8,0x6641},{0x9DE9,0x665E},{0x9DEA,0x665D},{0x9DEB,0x6664},{0x9DEC,0x6667},{0x9DED,0x6668},{0x9DEE,0x665F},{0x9DEF,0x6662},
		{0x9DF0,0x6670},{0x9DF1,0x6683},{0x9DF2,0x6688},{0x9DF3,0x668E},{0x9DF4,0x6689},{0x9DF5,0x6684},{0x9DF6,0x6698},{0x9DF7,0x669D},{0x9DF8,0x66C1},{0x9DF9,0x66B9},{0x9DFA,0x66C9},{0x9DFB,0x66BE},{0x9DFC,0x66BC},{0x9E40,0x66C4},{0x9E41,0x66B8},{0x9E42,0x66D6},
		{0x9E43,0x66DA},{0x9E44,0x66E0},{0x9E45,0x663F},{0x9E46,0x66E6},{0x9E47,0x66E9},{0x9E48,0x66F0},{0x9E49,0x66F5},{0x9E4A,0x66F7},{0x9E4B,0x670F},{0x9E4C,0x6716},{0x9E4D,0x671E},{0x9E4E,0x6726},{0x9E4F,0x6727},{0x9E50,0x9738},{0x9E51,0x672E},{0x9E52,0x673F},
		{0x9E53,0x6736},{0x9E54,0x6741},{0x9E55,0x6738},{0x9E56,0x6737},{0x9E57,0x6746},{0x9E58,0x675E},{0x9E59,0x6760},{0x9E5A,0x6759},{0x9E5B,0x6763},{0x9E5C,0x6764},{0x9E5D,0x6789},{0x9E5E,0x6770},{0x9E5F,0x67A9},{0x9E60,0x677C},{0x9E61,0x676A},{0x9E62,0x678C},
		{0x9E63,0x678B},{0x9E64,0x67A6},{0x9E65,0x67A1},{0x9E66,0x6785},{0x9E67,0x67B7},{0x9E68,0x67EF},{0x9E69,0x67B4},{0x9E6A,0x67EC},{0x9E6B,0x67B3},{0x9E6C,0x67E9},{0x9E6D,0x67B8},{0x9E6E,0x67E4},{0x9E6F,0x67DE},{0x9E70,0x67DD},{0x9E71,0x67E2},{0x9E72,0x67EE},
		{0x9E73,0x67B9},{0x9E74,0x67CE},{0x9E75,0x67C6},{0x9E76,0x67E7},{0x9E77,0x6A9C},{0x9E78,0x681E},{0x9E79,0x6846},{0x9E7A,0x6829},{0x9E7B,0x6840},{0x9E7C,0x684D},{0x9E7D,0x6832},{0x9E7E,0x684E},{0x9E80,0x68B3},{0x9E81,0x682B},{0x9E82,0x6859},{0x9E83,0x6863},
		{0x9E84,0x6877},{0x9E85,0x687F},{0x9E86,0x689F},{0x9E87,0x688F},{0x9E88,0x68AD},{0x9E89,0x6894},{0x9E8A,0x689D},{0x9E8B,0x689B},{0x9E8C,0x6883},{0x9E8D,0x6AAE},{0x9E8E,0x68B9},{0x9E8F,0x6874},{0x9E90,0x68B5},{0x9E91,0x68A0},{0x9E92,0x68BA},{0x9E93,0x690F},
		{0x9E94,0x688D},{0x9E95,0x687E},{0x9E96,0x6901},{0x9E97,0x68CA},{0x9E98,0x6908},{0x9E99,0x68D8},{0x9E9A,0x6922},{0x9E9B,0x6926},{0x9E9C,0x68E1},{0x9E9D,0x690C},{0x9E9E,0x68CD},{0x9E9F,0x68D4},{0x9EA0,0x68E7},{0x9EA1,0x68D5},{0x9EA2,0x6936},{0x9EA3,0x6912},
		{0x9EA4,0x6904},{0x9EA5,0x68D7},{0x9EA6,0x68E3},{0x9EA7,0x6925},{0x9EA8,0x68F9},{0x9EA9,0x68E0},{0x9EAA,0x68EF},{0x9EAB,0x6928},{0x9EAC,0x692A},{0x9EAD,0x691A},{0x9EAE,0x6923},{0x9EAF,0x6921},{0x9EB0,0x68C6},{0x9EB1,0x6979},{0x9EB2,0x6977},{0x9EB3,0x695C},
		{0x9EB4,0x6978},{0x9EB5,0x696B},{0x9EB6,0x6954},{0x9EB7,0x697E},{0x9EB8,0x696E},{0x9EB9,0x6939},{0x9EBA,0x6974},{0x9EBB,0x693D},{0x9EBC,0x6959},{0x9EBD,0x6930},{0x9EBE,0x6961},{0x9EBF,0x695E},{0x9EC0,0x695D},{0x9EC1,0x6981},{0x9EC2,0x696A},{0x9EC3,0x69B2},
		{0x9EC4,0x69AE},{0x9EC5,0x69D0},{0x9EC6,0x69BF},{0x9EC7,0x69C1},{0x9EC8,0x69D3},{0x9EC9,0x69BE},{0x9ECA,0x69CE},{0x9ECB,0x5BE8},{0x9ECC,0x69CA},{0x9ECD,0x69DD},{0x9ECE,0x69BB},{0x9ECF,0x69C3},{0x9ED0,0x69A7},{0x9ED1,0x6A2E},{0x9ED2,0x6991},{0x9ED3,0x69A0},
		{0x9ED4,0x699C},{0x9ED5,0x6995},{0x9ED6,0x69B4},{0x9ED7,0x69DE},{0x9ED8,0x69E8},{0x9ED9,0x6A02},{0x9EDA,0x6A1B},{0x9EDB,0x69FF},{0x9EDC,0x6B0A},{0x9EDD,0x69F9},{0x9EDE,0x69F2},{0x9EDF,0x69E7},{0x9EE0,0x6A05},{0x9EE1,0x69B1},{0x9EE2,0x6A1E},{0x9EE3,0x69ED},
		{0x9EE4,0x6A14},{0x9EE5,0x69EB},{0x9EE6,0x6A0A},{0x9EE7,0x6A12},{0x9EE8,0x6AC1},{0x9EE9,0x6A23},{0x9EEA,0x6A13},{0x9EEB,0x6A44},{0x9EEC,0x6A0C},{0x9EED,0x6A72},{0x9EEE,0x6A36},{0x9EEF,0x6A78},{0x9EF0,0x6A47},{0x9EF1,0x6A62},{0x9EF2,0x6A59},{0x9EF3,0x6A66},
		{0x9EF4,0x6A48},{0x9EF5,0x6A38},{0x9EF6,0x6A22},{0x9EF7,0x6A90},{0x9EF8,0x6A8D},{0x9EF9,0x6AA0},{0x9EFA,0x6A84},{0x9EFB,0x6AA2},{0x9EFC,0x6AA3},{0x9F40,0x6A97},{0x9F41,0x8617},{0x9F42,0x6ABB},{0x9F43,0x6AC3},{0x9F44,0x6AC2},{0x9F45,0x6AB8},{0x9F46,0x6AB3},
		{0x9F47,0x6AAC},{0x9F48,0x6ADE},{0x9F49,0x6AD1},{0x9F4A,0x6ADF},{0x9F4B,0x6AAA},{0x9F4C,0x6ADA},{0x9F4D,0x6AEA},{0x9F4E,0x6AFB},{0x9F4F,0x6B05},{0x9F50,0x8616},{0x9F51,0x6AFA},{0x9F52,0x6B12},{0x9F53,0x6B16},{0x9F54,0x9B31},{0x9F55,0x6B1F},{0x9F56,0x6B38},
		{0x9F57,0x6B37},{0x9F58,0x76DC},{0x9F59,0x6B39},{0x9F5A,0x98EE},{0x9F5B,0x6B47},{0x9F5C,0x6B43},{0x9F5D,0x6B49},{0x9F5E,0x6B50},{0x9F5F,0x6B59},{0x9F60,0x6B54},{0x9F61,0x6B5B},{0x9F62,0x6B5F},{0x9F63,0x6B61},{0x9F64,0x6B78},{0x9F65,0x6B79},{0x9F66,0x6B7F},
		{0x9F67,0x6B80},{0x9F68,0x6B84},{0x9F69,0x6B83},{0x9F6A,0x6B8D},{0x9F6B,0x6B98},{0x9F6C,0x6B95},{0x9F6D,0x6B9E},{0x9F6E,0x6BA4},{0x9F6F,0x6BAA},{0x9F70,0x6BAB},{0x9F71,0x6BAF},{0x9F72,0x6BB2},{0x9F73,0x6BB1},{0x9F74,0x6BB3},{0x9F75,0x6BB7},{0x9F76,0x6BBC},
		{0x9F77,0x6BC6},{0x9F78,0x6BCB},{0x9F79,0x6BD3},{0x9F7A,0x6BDF},{0x9F7B,0x6BEC},{0x9F7C,0x6BEB},{0x9F7D,0x6BF3},{0x9F7E,0x6BEF},{0x9F80,0x9EBE},{0x9F81,0x6C08},{0x9F82,0x6C13},{0x9F83,0x6C14},{0x9F84,0x6C1B},{0x9F85,0x6C24},{0x9F86,0x6C23},{0x9F87,0x6C5E},
		{0x9F88,0x6C55},{0x9F89,0x6C62},{0x9F8A,0x6C6A},{0x9F8B,0x6C82},{0x9F8C,0x6C8D},{0x9F8D,0x6C9A},{0x9F8E,0x6C81},{0x9F8F,0x6C9B},{0x9F90,0x6C7E},{0x9F91,0x6C68},{0x9F92,0x6C73},{0x9F93,0x6C92},{0x9F94,0x6C90},{0x9F95,0x6CC4},{0x9F96,0x6CF1},{0x9F97,0x6CD3},
		{0x9F98,0x6CBD},{0x9F99,0x6CD7},{0x9F9A,0x6CC5},{0x9F9B,0x6CDD},{0x9F9C,0x6CAE},{0x9F9D,0x6CB1},{0x9F9E,0x6CBE},{0x9F9F,0x6CBA},{0x9FA0,0x6CDB},{0x9FA1,0x6CEF},{0x9FA2,0x6CD9},{0x9FA3,0x6CEA},{0x9FA4,0x6D1F},{0x9FA5,0x884D},{0x9FA6,0x6D36},{0x9FA7,0x6D2B},
		{0x9FA8,0x6D3D},{0x9FA9,0x6D38},{0x9FAA,0x6D19},{0x9FAB,0x6D35},{0x9FAC,0x6D33},{0x9FAD,0x6D12},{0x9FAE,0x6D0C},{0x9FAF,0x6D63},{0x9FB0,0x6D93},{0x9FB1,0x6D64},{0x9FB2,0x6D5A},{0x9FB3,0x6D79},{0x9FB4,0x6D59},{0x9FB5,0x6D8E},{0x9FB6,0x6D95},{0x9FB7,0x6FE4},
		{0x9FB8,0x6D85},{0x9FB9,0x6DF9},{0x9FBA,0x6E15},{0x9FBB,0x6E0A},{0x9FBC,0x6DB5},{0x9FBD,0x6DC7},{0x9FBE,0x6DE6},{0x9FBF,0x6DB8},{0x9FC0,0x6DC6},{0x9FC1,0x6DEC},{0x9FC2,0x6DDE},{0x9FC3,0x6DCC},{0x9FC4,0x6DE8},{0x9FC5,0x6DD2},{0x9FC6,0x6DC5},{0x9FC7,0x6DFA},
		{0x9FC8,0x6DD9},{0x9FC9,0x6DE4},{0x9FCA,0x6DD5},{0x9FCB,0x6DEA},{0x9FCC,0x6DEE},{0x9FCD,0x6E2D},{0x9FCE,0x6E6E},{0x9FCF,0x6E2E},{0x9FD0,0x6E19},{0x9FD1,0x6E72},{0x9FD2,0x6E5F},{0x9FD3,0x6E3E},{0x9FD4,0x6E23},{0x9FD5,0x6E6B},{0x9FD6,0x6E2B},{0x9FD7,0x6E76},
		{0x9FD8,0x6E4D},{0x9FD9,0x6E1F},{0x9FDA,0x6E43},{0x9FDB,0x6E3A},{0x9FDC,0x6E4E},{0x9FDD,0x6E24},{0x9FDE,0x6EFF},{0x9FDF,0x6E1D},{0x9FE0,0x6E38},{0x9FE1,0x6E82},{0x9FE2,0x6EAA},{0x9FE3,0x6E98},{0x9FE4,0x6EC9},{0x9FE5,0x6EB7},{0x9FE6,0x6ED3},{0x9FE7,0x6EBD},
		{0x9FE8,0x6EAF},{0x9FE9,0x6EC4},{0x9FEA,0x6EB2},{0x9FEB,0x6ED4},{0x9FEC,0x6ED5},{0x9FED,0x6E8F},{0x9FEE,0x6EA5},{0x9FEF,0x6EC2},{0x9FF0,0x6E9F},{0x9FF1,0x6F41},{0x9FF2,0x6F11},{0x9FF3,0x704C},{0x9FF4,0x6EEC},{0x9FF5,0x6EF8},{0x9FF6,0x6EFE},{0x9FF7,0x6F3F},
		{0x9FF8,0x6EF2},{0x9FF9,0x6F31},{0x9FFA,0x6EEF},{0x9FFB,0x6F32},{0x9FFC,0x6ECC},{0xE040,0x6F3E},{0xE041,0x6F13},{0xE042,0x6EF7},{0xE043,0x6F86},{0xE044,0x6F7A},{0xE045,0x6F78},{0xE046,0x6F81},{0xE047,0x6F80},{0xE048,0x6F6F},{0xE049,0x6F5B},{0xE04A,0x6FF3},
		{0xE04B,0x6F6D},{0xE04C,0x6F82},{0xE04D,0x6F7C},{0xE04E,0x6F58},{0xE04F,0x6F8E},{0xE050,0x6F91},{0xE051,0x6FC2},{0xE052,0x6F66},{0xE053,0x6FB3},{0xE054,0x6FA3},{0xE055,0x6FA1},{0xE056,0x6FA4},{0xE057,0x6FB9},{0xE058,0x6FC6},{0xE059,0x6FAA},{0xE05A,0x6FDF},
		{0xE05B,0x6FD5},{0xE05C,0x6FEC},{0xE05D,0x6FD4},{0xE05E,0x6FD8},{0xE05F,0x6FF1},{0xE060,0x6FEE},{0xE061,0x6FDB},{0xE062,0x7009},{0xE063,0x700B},{0xE064,0x6FFA},{0xE065,0x7011},{0xE066,0x7001},{0xE067,0x700F},{0xE068,0x6FFE},{0xE069,0x701B},{0xE06A,0x701A},
		{0xE06B,0x6F74},{0xE06C,0x701D},{0xE06D,0x7018},{0xE06E,0x701F},{0xE06F,0x7030},{0xE070,0x703E},{0xE071,0x7032},{0xE072,0x7051},{0xE073,0x7063},{0xE074,0x7099},{0xE075,0x7092},{0xE076,0x70AF},{0xE077,0x70F1},{0xE078,0x70AC},{0xE079,0x70B8},{0xE07A,0x70B3},
		{0xE07B,0x70AE},{0xE07C,0x70DF},{0xE07D,0x70CB},{0xE07E,0x70DD},{0xE080,0x70D9},{0xE081,0x7109},{0xE082,0x70FD},{0xE083,0x711C},{0xE084,0x7119},{0xE085,0x7165},{0xE086,0x7155},{0xE087,0x7188},{0xE088,0x7166},{0xE089,0x7162},{0xE08A,0x714C},{0xE08B,0x7156},
		{0xE08C,0x716C},{0xE08D,0x718F},{0xE08E,0x71FB},{0xE08F,0x7184},{0xE090,0x7195},{0xE091,0x71A8},{0xE092,0x71AC},{0xE093,0x71D7},{0xE094,0x71B9},{0xE095,0x71BE},{0xE096,0x71D2},{0xE097,0x71C9},{0xE098,0x71D4},{0xE099,0x71CE},{0xE09A,0x71E0},{0xE09B,0x71EC},
		{0xE09C,0x71E7},{0xE09D,0x71F5},{0xE09E,0x71FC},{0xE09F,0x71F9},{0xE0A0,0x71FF},{0xE0A1,0x720D},{0xE0A2,0x7210},{0xE0A3,0x721B},{0xE0A4,0x7228},{0xE0A5,0x722D},{0xE0A6,0x722C},{0xE0A7,0x7230},{0xE0A8,0x7232},{0xE0A9,0x723B},{0xE0AA,0x723C},{0xE0AB,0x723F},
		{0xE0AC,0x7240},{0xE0AD,0x7246},{0xE0AE,0x724B},{0xE0AF,0x7258},{0xE0B0,0x7274},{0xE0B1,0x727E},{0xE0B2,0x7282},{0xE0B3,0x7281},{0xE0B4,0x7287},{0xE0B5,0x7292},{0xE0B6,0x7296},{0xE0B7,0x72A2},{0xE0B8,0x72A7},{0xE0B9,0x72B9},{0xE0BA,0x72B2},{0xE0BB,0x72C3},
		{0xE0BC,0x72C6},{0xE0BD,0x72C4},{0xE0BE,0x72CE},{0xE0BF,0x72D2},{0xE0C0,0x72E2},{0xE0C1,0x72E0},{0xE0C2,0x72E1},{0xE0C3,0x72F9},{0xE0C4,0x72F7},{0xE0C5,0x500F},{0xE0C6,0x7317},{0xE0C7,0x730A},{0xE0C8,0x731C},{0xE0C9,0x7316},{0xE0CA,0x731D},{0xE0CB,0x7334},
		{0xE0CC,0x732F},{0xE0CD,0x7329},{0xE0CE,0x7325},{0xE0CF,0x733E},{0xE0D0,0x734E},{0xE0D1,0x734F},{0xE0D2,0x9ED8},{0xE0D3,0x7357},{0xE0D4,0x736A},{0xE0D5,0x7368},{0xE0D6,0x7370},{0xE0D7,0x7378},{0xE0D8,0x7375},{0xE0D9,0x737B},{0xE0DA,0x737A},{0xE0DB,0x73C8},
		{0xE0DC,0x73B3},{0xE0DD,0x73CE},{0xE0DE,0x73BB},{0xE0DF,0x73C0},{0xE0E0,0x73E5},{0xE0E1,0x73EE},{0xE0E2,0x73DE},{0xE0E3,0x74A2},{0xE0E4,0x7405},{0xE0E5,0x746F},{0xE0E6,0x7425},{0xE0E7,0x73F8},{0xE0E8,0x7432},{0xE0E9,0x743A},{0xE0EA,0x7455},{0xE0EB,0x743F},
		{0xE0EC,0x745F},{0xE0ED,0x7459},{0xE0EE,0x7441},{0xE0EF,0x745C},{0xE0F0,0x7469},{0xE0F1,0x7470},{0xE0F2,0x7463},{0xE0F3,0x746A},{0xE0F4,0x7476},{0xE0F5,0x747E},{0xE0F6,0x748B},{0xE0F7,0x749E},{0xE0F8,0x74A7},{0xE0F9,0x74CA},{0xE0FA,0x74CF},{0xE0FB,0x74D4},
		{0xE0FC,0x73F1},{0xE140,0x74E0},{0xE141,0x74E3},{0xE142,0x74E7},{0xE143,0x74E9},{0xE144,0x74EE},{0xE145,0x74F2},{0xE146,0x74F0},{0xE147,0x74F1},{0xE148,0x74F8},{0xE149,0x74F7},{0xE14A,0x7504},{0xE14B,0x7503},{0xE14C,0x7505},{0xE14D,0x750C},{0xE14E,0x750E},
		{0xE14F,0x750D},{0xE150,0x7515},{0xE151,0x7513},{0xE152,0x751E},{0xE153,0x7526},{0xE154,0x752C},{0xE155,0x753C},{0xE156,0x7544},{0xE157,0x754D},{0xE158,0x754A},{0xE159,0x7549},{0xE15A,0x755B},{0xE15B,0x7546},{0xE15C,0x755A},{0xE15D,0x7569},{0xE15E,0x7564},
		{0xE15F,0x7567},{0xE160,0x756B},{0xE161,0x756D},{0xE162,0x7578},{0xE163,0x7576},{0xE164,0x7586},{0xE165,0x7587},{0xE166,0x7574},{0xE167,0x758A},{0xE168,0x7589},{0xE169,0x7582},{0xE16A,0x7594},{0xE16B,0x759A},{0xE16C,0x759D},{0xE16D,0x75A5},{0xE16E,0x75A3},
		{0xE16F,0x75C2},{0xE170,0x75B3},{0xE171,0x75C3},{0xE172,0x75B5},{0xE173,0x75BD},{0xE174,0x75B8},{0xE175,0x75BC},{0xE176,0x75B1},{0xE177,0x75CD},{0xE178,0x75CA},{0xE179,0x75D2},{0xE17A,0x75D9},{0xE17B,0x75E3},{0xE17C,0x75DE},{0xE17D,0x75FE},{0xE17E,0x75FF},
		{0xE180,0x75FC},{0xE181,0x7601},{0xE182,0x75F0},{0xE183,0x75FA},{0xE184,0x75F2},{0xE185,0x75F3},{0xE186,0x760B},{0xE187,0x760D},{0xE188,0x7609},{0xE189,0x761F},{0xE18A,0x7627},{0xE18B,0x7620},{0xE18C,0x7621},{0xE18D,0x7622},{0xE18E,0x7624},{0xE18F,0x7634},
		{0xE190,0x7630},{0xE191,0x763B},{0xE192,0x7647},{0xE193,0x7648},{0xE194,0x7646},{0xE195,0x765C},{0xE196,0x7658},{0xE197,0x7661},{0xE198,0x7662},{0xE199,0x7668},{0xE19A,0x7669},{0xE19B,0x766A},{0xE19C,0x7667},{0xE19D,0x766C},{0xE19E,0x7670},{0xE19F,0x7672},
		{0xE1A0,0x7676},{0xE1A1,0x7678},{0xE1A2,0x767C},{0xE1A3,0x7680},{0xE1A4,0x7683},{0xE1A5,0x7688},{0xE1A6,0x768B},{0xE1A7,0x768E},{0xE1A8,0x7696},{0xE1A9,0x7693},{0xE1AA,0x7699},{0xE1AB,0x769A},{0xE1AC,0x76B0},{0xE1AD,0x76B4},{0xE1AE,0x76B8},{0xE1AF,0x76B9},
		{0xE1B0,0x76BA},{0xE1B1,0x76C2},{0xE1B2,0x76CD},{0xE1B3,0x76D6},{0xE1B4,0x76D2},{0xE1B5,0x76DE},{0xE1B6,0x76E1},{0xE1B7,0x76E5},{0xE1B8,0x76E7},{0xE1B9,0x76EA},{0xE1BA,0x862F},{0xE1BB,0x76FB},{0xE1BC,0x7708},{0xE1BD,0x7707},{0xE1BE,0x7704},{0xE1BF,0x7729},
		{0xE1C0,0x7724},{0xE1C1,0x771E},{0xE1C2,0x7725},{0xE1C3,0x7726},{0xE1C4,0x771B},{0xE1C5,0x7737},{0xE1C6,0x7738},{0xE1C7,0x7747},{0xE1C8,0x775A},{0xE1C9,0x7768},{0xE1CA,0x776B},{0xE1CB,0x775B},{0xE1CC,0x7765},{0xE1CD,0x777F},{0xE1CE,0x777E},{0xE1CF,0x7779},
		{0xE1D0,0x778E},{0xE1D1,0x778B},{0xE1D2,0x7791},{0xE1D3,0x77A0},{0xE1D4,0x779E},{0xE1D5,0x77B0},{0xE1D6,0x77B6},{0xE1D7,0x77B9},{0xE1D8,0x77BF},{0xE1D9,0x77BC},{0xE1DA,0x77BD},{0xE1DB,0x77BB},{0xE1DC,0x77C7},{0xE1DD,0x77CD},{0xE1DE,0x77D7},{0xE1DF,0x77DA},
		{0xE1E0,0x77DC},{0xE1E1,0x77E3},{0xE1E2,0x77EE},{0xE1E3,0x77FC},{0xE1E4,0x780C},{0xE1E5,0x7812},{0xE1E6,0x7926},{0xE1E7,0x7820},{0xE1E8,0x792A},{0xE1E9,0x7845},{0xE1EA,0x788E},{0xE1EB,0x7874},{0xE1EC,0x7886},{0xE1ED,0x787C},{0xE1EE,0x789A},{0xE1EF,0x788C},
		{0xE1F0,0x78A3},{0xE1F1,0x78B5},{0xE1F2,0x78AA},{0xE1F3,0x78AF},{0xE1F4,0x78D1},{0xE1F5,0x78C6},{0xE1F6,0x78CB},{0xE1F7,0x78D4},{0xE1F8,0x78BE},{0xE1F9,0x78BC},{0xE1FA,0x78C5},{0xE1FB,0x78CA},{0xE1FC,0x78EC},{0xE240,0x78E7},{0xE241,0x78DA},{0xE242,0x78FD},
		{0xE243,0x78F4},{0xE244,0x7907},{0xE245,0x7912},{0xE246,0x7911},{0xE247,0x7919},{0xE248,0x792C},{0xE249,0x792B},{0xE24A,0x7940},{0xE24B,0x7960},{0xE24C,0x7957},{0xE24D,0x795F},{0xE24E,0x795A},{0xE24F,0x7955},{0xE250,0x7953},{0xE251,0x797A},{0xE252,0x797F},
		{0xE253,0x798A},{0xE254,0x799D},{0xE255,0x79A7},{0xE256,0x9F4B},{0xE257,0x79AA},{0xE258,0x79AE},{0xE259,0x79B3},{0xE25A,0x79B9},{0xE25B,0x79BA},{0xE25C,0x79C9},{0xE25D,0x79D5},{0xE25E,0x79E7},{0xE25F,0x79EC},{0xE260,0x79E1},{0xE261,0x79E3},{0xE262,0x7A08},
		{0xE263,0x7A0D},{0xE264,0x7A18},{0xE265,0x7A19},{0xE266,0x7A20},{0xE267,0x7A1F},{0xE268,0x7980},{0xE269,0x7A31},{0xE26A,0x7A3B},{0xE26B,0x7A3E},{0xE26C,0x7A37},{0xE26D,0x7A43},{0xE26E,0x7A57},{0xE26F,0x7A49},{0xE270,0x7A61},{0xE271,0x7A62},{0xE272,0x7A69},
		{0xE273,0x9F9D},{0xE274,0x7A70},{0xE275,0x7A79},{0xE276,0x7A7D},{0xE277,0x7A88},{0xE278,0x7A97},{0xE279,0x7A95},{0xE27A,0x7A98},{0xE27B,0x7A96},{0xE27C,0x7AA9},{0xE27D,0x7AC8},{0xE27E,0x7AB0},{0xE280,0x7AB6},{0xE281,0x7AC5},{0xE282,0x7AC4},{0xE283,0x7ABF},
		{0xE284,0x9083},{0xE285,0x7AC7},{0xE286,0x7ACA},{0xE287,0x7ACD},{0xE288,0x7ACF},{0xE289,0x7AD5},{0xE28A,0x7AD3},{0xE28B,0x7AD9},{0xE28C,0x7ADA},{0xE28D,0x7ADD},{0xE28E,0x7AE1},{0xE28F,0x7AE2},{0xE290,0x7AE6},{0xE291,0x7AED},{0xE292,0x7AF0},{0xE293,0x7B02},
		{0xE294,0x7B0F},{0xE295,0x7B0A},{0xE296,0x7B06},{0xE297,0x7B33},{0xE298,0x7B18},{0xE299,0x7B19},{0xE29A,0x7B1E},{0xE29B,0x7B35},{0xE29C,0x7B28},{0xE29D,0x7B36},{0xE29E,0x7B50},{0xE29F,0x7B7A},{0xE2A0,0x7B04},{0xE2A1,0x7B4D},{0xE2A2,0x7B0B},{0xE2A3,0x7B4C},
		{0xE2A4,0x7B45},{0xE2A5,0x7B75},{0xE2A6,0x7B65},{0xE2A7,0x7B74},{0xE2A8,0x7B67},{0xE2A9,0x7B70},{0xE2AA,0x7B71},{0xE2AB,0x7B6C},{0xE2AC,0x7B6E},{0xE2AD,0x7B9D},{0xE2AE,0x7B98},{0xE2AF,0x7B9F},{0xE2B0,0x7B8D},{0xE2B1,0x7B9C},{0xE2B2,0x7B9A},{0xE2B3,0x7B8B},
		{0xE2B4,0x7B92},{0xE2B5,0x7B8F},{0xE2B6,0x7B5D},{0xE2B7,0x7B99},{0xE2B8,0x7BCB},{0xE2B9,0x7BC1},{0xE2BA,0x7BCC},{0xE2BB,0x7BCF},{0xE2BC,0x7BB4},{0xE2BD,0x7BC6},{0xE2BE,0x7BDD},{0xE2BF,0x7BE9},{0xE2C0,0x7C11},{0xE2C1,0x7C14},{0xE2C2,0x7BE6},{0xE2C3,0x7BE5},
		{0xE2C4,0x7C60},{0xE2C5,0x7C00},{0xE2C6,0x7C07},{0xE2C7,0x7C13},{0xE2C8,0x7BF3},{0xE2C9,0x7BF7},{0xE2CA,0x7C17},{0xE2CB,0x7C0D},{0xE2CC,0x7BF6},{0xE2CD,0x7C23},{0xE2CE,0x7C27},{0xE2CF,0x7C2A},{0xE2D0,0x7C1F},{0xE2D1,0x7C37},{0xE2D2,0x7C2B},{0xE2D3,0x7C3D},
		{0xE2D4,0x7C4C},{0xE2D5,0x7C43},{0xE2D6,0x7C54},{0xE2D7,0x7C4F},{0xE2D8,0x7C40},{0xE2D9,0x7C50},{0xE2DA,0x7C58},{0xE2DB,0x7C5F},{0xE2DC,0x7C64},{0xE2DD,0x7C56},{0xE2DE,0x7C65},{0xE2DF,0x7C6C},{0xE2E0,0x7C75},{0xE2E1,0x7C83},{0xE2E2,0x7C90},{0xE2E3,0x7CA4},
		{0xE2E4,0x7CAD},{0xE2E5,0x7CA2},{0xE2E6,0x7CAB},{0xE2E7,0x7CA1},{0xE2E8,0x7CA8},{0xE2E9,0x7CB3},{0xE2EA,0x7CB2},{0xE2EB,0x7CB1},{0xE2EC,0x7CAE},{0xE2ED,0x7CB9},{0xE2EE,0x7CBD},{0xE2EF,0x7CC0},{0xE2F0,0x7CC5},{0xE2F1,0x7CC2},{0xE2F2,0x7CD8},{0xE2F3,0x7CD2},
		{0xE2F4,0x7CDC},{0xE2F5,0x7CE2},{0xE2F6,0x9B3B},{0xE2F7,0x7CEF},{0xE2F8,0x7CF2},{0xE2F9,0x7CF4},{0xE2FA,0x7CF6},{0xE2FB,0x7CFA},{0xE2FC,0x7D06},{0xE340,0x7D02},{0xE341,0x7D1C},{0xE342,0x7D15},{0xE343,0x7D0A},{0xE344,0x7D45},{0xE345,0x7D4B},{0xE346,0x7D2E},
		{0xE347,0x7D32},{0xE348,0x7D3F},{0xE349,0x7D35},{0xE34A,0x7D46},{0xE34B,0x7D73},{0xE34C,0x7D56},{0xE34D,0x7D4E},{0xE34E,0x7D72},{0xE34F,0x7D68},{0xE350,0x7D6E},{0xE351,0x7D4F},{0xE352,0x7D63},{0xE353,0x7D93},{0xE354,0x7D89},{0xE355,0x7D5B},{0xE356,0x7D8F},
		{0xE357,0x7D7D},{0xE358,0x7D9B},{0xE359,0x7DBA},{0xE35A,0x7DAE},{0xE35B,0x7DA3},{0xE35C,0x7DB5},{0xE35D,0x7DC7},{0xE35E,0x7DBD},{0xE35F,0x7DAB},{0xE360,0x7E3D},{0xE361,0x7DA2},{0xE362,0x7DAF},{0xE363,0x7DDC},{0xE364,0x7DB8},{0xE365,0x7D9F},{0xE366,0x7DB0},
		{0xE367,0x7DD8},{0xE368,0x7DDD},{0xE369,0x7DE4},{0xE36A,0x7DDE},{0xE36B,0x7DFB},{0xE36C,0x7DF2},{0xE36D,0x7DE1},{0xE36E,0x7E05},{0xE36F,0x7E0A},{0xE370,0x7E23},{0xE371,0x7E21},{0xE372,0x7E12},{0xE373,0x7E31},{0xE374,0x7E1F},{0xE375,0x7E09},{0xE376,0x7E0B},
		{0xE377,0x7E22},{0xE378,0x7E46},{0xE379,0x7E66},{0xE37A,0x7E3B},{0xE37B,0x7E35},{0xE37C,0x7E39},{0xE37D,0x7E43},{0xE37E,0x7E37},{0xE380,0x7E32},{0xE381,0x7E3A},{0xE382,0x7E67},{0xE383,0x7E5D},{0xE384,0x7E56},{0xE385,0x7E5E},{0xE386,0x7E59},{0xE387,0x7E5A},
		{0xE388,0x7E79},{0xE389,0x7E6A},{0xE38A,0x7E69},{0xE38B,0x7E7C},{0xE38C,0x7E7B},{0xE38D,0x7E83},{0xE38E,0x7DD5},{0xE38F,0x7E7D},{0xE390,0x8FAE},{0xE391,0x7E7F},{0xE392,0x7E88},{0xE393,0x7E89},{0xE394,0x7E8C},{0xE395,0x7E92},{0xE396,0x7E90},{0xE397,0x7E93},
		{0xE398,0x7E94},{0xE399,0x7E96},{0xE39A,0x7E8E},{0xE39B,0x7E9B},{0xE39C,0x7E9C},{0xE39D,0x7F38},{0xE39E,0x7F3A},{0xE39F,0x7F45},{0xE3A0,0x7F4C},{0xE3A1,0x7F4D},{0xE3A2,0x7F4E},{0xE3A3,0x7F50},{0xE3A4,0x7F51},{0xE3A5,0x7F55},{0xE3A6,0x7F54},{0xE3A7,0x7F58},
		{0xE3A8,0x7F5F},{0xE3A9,0x7F60},{0xE3AA,0x7F68},{0xE3AB,0x7F69},{0xE3AC,0x7F67},{0xE3AD,0x7F78},{0xE3AE,0x7F82},{0xE3AF,0x7F86},{0xE3B0,0x7F83},{0xE3B1,0x7F88},{0xE3B2,0x7F87},{0xE3B3,0x7F8C},{0xE3B4,0x7F94},{0xE3B5,0x7F9E},{0xE3B6,0x7F9D},{0xE3B7,0x7F9A},
		{0xE3B8,0x7FA3},{0xE3B9,0x7FAF},{0xE3BA,0x7FB2},{0xE3BB,0x7FB9},{0xE3BC,0x7FAE},{0xE3BD,0x7FB6},{0xE3BE,0x7FB8},{0xE3BF,0x8B71},{0xE3C0,0x7FC5},{0xE3C1,0x7FC6},{0xE3C2,0x7FCA},{0xE3C3,0x7FD5},{0xE3C4,0x7FD4},{0xE3C5,0x7FE1},{0xE3C6,0x7FE6},{0xE3C7,0x7FE9},
		{0xE3C8,0x7FF3},{0xE3C9,0x7FF9},{0xE3CA,0x98DC},{0xE3CB,0x8006},{0xE3CC,0x8004},{0xE3CD,0x800B},{0xE3CE,0x8012},{0xE3CF,0x8018},{0xE3D0,0x8019},{0xE3D1,0x801C},{0xE3D2,0x8021},{0xE3D3,0x8028},{0xE3D4,0x803F},{0xE3D5,0x803B},{0xE3D6,0x804A},{0xE3D7,0x8046},
		{0xE3D8,0x8052},{0xE3D9,0x8058},{0xE3DA,0x805A},{0xE3DB,0x805F},{0xE3DC,0x8062},{0xE3DD,0x8068},{0xE3DE,0x8073},{0xE3DF,0x8072},{0xE3E0,0x8070},{0xE3E1,0x8076},{0xE3E2,0x8079},{0xE3E3,0x807D},{0xE3E4,0x807F},{0xE3E5,0x8084},{0xE3E6,0x8086},{0xE3E7,0x8085},
		{0xE3E8,0x809B},{0xE3E9,0x8093},{0xE3EA,0x809A},{0xE3EB,0x80AD},{0xE3EC,0x5190},{0xE3ED,0x80AC},{0xE3EE,0x80DB},{0xE3EF,0x80E5},{0xE3F0,0x80D9},{0xE3F1,0x80DD},{0xE3F2,0x80C4},{0xE3F3,0x80DA},{0xE3F4,0x80D6},{0xE3F5,0x8109},{0xE3F6,0x80EF},{0xE3F7,0x80F1},
		{0xE3F8,0x811B},{0xE3F9,0x8129},{0xE3FA,0x8123},{0xE3FB,0x812F},{0xE3FC,0x814B},{0xE440,0x968B},{0xE441,0x8146},{0xE442,0x813E},{0xE443,0x8153},{0xE444,0x8151},{0xE445,0x80FC},{0xE446,0x8171},{0xE447,0x816E},{0xE448,0x8165},{0xE449,0x8166},{0xE44A,0x8174},
		{0xE44B,0x8183},{0xE44C,0x8188},{0xE44D,0x818A},{0xE44E,0x8180},{0xE44F,0x8182},{0xE450,0x81A0},{0xE451,0x8195},{0xE452,0x81A4},{0xE453,0x81A3},{0xE454,0x815F},{0xE455,0x8193},{0xE456,0x81A9},{0xE457,0x81B0},{0xE458,0x81B5},{0xE459,0x81BE},{0xE45A,0x81B8},
		{0xE45B,0x81BD},{0xE45C,0x81C0},{0xE45D,0x81C2},{0xE45E,0x81BA},{0xE45F,0x81C9},{0xE460,0x81CD},{0xE461,0x81D1},{0xE462,0x81D9},{0xE463,0x81D8},{0xE464,0x81C8},{0xE465,0x81DA},{0xE466,0x81DF},{0xE467,0x81E0},{0xE468,0x81E7},{0xE469,0x81FA},{0xE46A,0x81FB},
		{0xE46B,0x81FE},{0xE46C,0x8201},{0xE46D,0x8202},{0xE46E,0x8205},{0xE46F,0x8207},{0xE470,0x820A},{0xE471,0x820D},{0xE472,0x8210},{0xE473,0x8216},{0xE474,0x8229},{0xE475,0x822B},{0xE476,0x8238},{0xE477,0x8233},{0xE478,0x8240},{0xE479,0x8259},{0xE47A,0x8258},
		{0xE47B,0x825D},{0xE47C,0x825A},{0xE47D,0x825F},{0xE47E,0x8264},{0xE480,0x8262},{0xE481,0x8268},{0xE482,0x826A},{0xE483,0x826B},{0xE484,0x822E},{0xE485,0x8271},{0xE486,0x8277},{0xE487,0x8278},{0xE488,0x827E},{0xE489,0x828D},{0xE48A,0x8292},{0xE48B,0x82AB},
		{0xE48C,0x829F},{0xE48D,0x82BB},{0xE48E,0x82AC},{0xE48F,0x82E1},{0xE490,0x82E3},{0xE491,0x82DF},{0xE492,0x82D2},{0xE493,0x82F4},{0xE494,0x82F3},{0xE495,0x82FA},{0xE496,0x8393},{0xE497,0x8303},{0xE498,0x82FB},{0xE499,0x82F9},{0xE49A,0x82DE},{0xE49B,0x8306},
		{0xE49C,0x82DC},{0xE49D,0x8309},{0xE49E,0x82D9},{0xE49F,0x8335},{0xE4A0,0x8334},{0xE4A1,0x8316},{0xE4A2,0x8332},{0xE4A3,0x8331},{0xE4A4,0x8340},{0xE4A5,0x8339},{0xE4A6,0x8350},{0xE4A7,0x8345},{0xE4A8,0x832F},{0xE4A9,0x832B},{0xE4AA,0x8317},{0xE4AB,0x8318},
		{0xE4AC,0x8385},{0xE4AD,0x839A},{0xE4AE,0x83AA},{0xE4AF,0x839F},{0xE4B0,0x83A2},{0xE4B1,0x8396},{0xE4B2,0x8323},{0xE4B3,0x838E},{0xE4B4,0x8387},{0xE4B5,0x838A},{0xE4B6,0x837C},{0xE4B7,0x83B5},{0xE4B8,0x8373},{0xE4B9,0x8375},{0xE4BA,0x83A0},{0xE4BB,0x8389},
		{0xE4BC,0x83A8},{0xE4BD,0x83F4},{0xE4BE,0x8413},{0xE4BF,0x83EB},{0xE4C0,0x83CE},{0xE4C1,0x83FD},{0xE4C2,0x8403},{0xE4C3,0x83D8},{0xE4C4,0x840B},{0xE4C5,0x83C1},{0xE4C6,0x83F7},{0xE4C7,0x8407},{0xE4C8,0x83E0},{0xE4C9,0x83F2},{0xE4CA,0x840D},{0xE4CB,0x8422},
		{0xE4CC,0x8420},{0xE4CD,0x83BD},{0xE4CE,0x8438},{0xE4CF,0x8506},{0xE4D0,0x83FB},{0xE4D1,0x846D},{0xE4D2,0x842A},{0xE4D3,0x843C},{0xE4D4,0x855A},{0xE4D5,0x8484},{0xE4D6,0x8477},{0xE4D7,0x846B},{0xE4D8,0x84AD},{0xE4D9,0x846E},{0xE4DA,0x8482},{0xE4DB,0x8469},
		{0xE4DC,0x8446},{0xE4DD,0x842C},{0xE4DE,0x846F},{0xE4DF,0x8479},{0xE4E0,0x8435},{0xE4E1,0x84CA},{0xE4E2,0x8462},{0xE4E3,0x84B9},{0xE4E4,0x84BF},{0xE4E5,0x849F},{0xE4E6,0x84D9},{0xE4E7,0x84CD},{0xE4E8,0x84BB},{0xE4E9,0x84DA},{0xE4EA,0x84D0},{0xE4EB,0x84C1},
		{0xE4EC,0x84C6},{0xE4ED,0x84D6},{0xE4EE,0x84A1},{0xE4EF,0x8521},{0xE4F0,0x84FF},{0xE4F1,0x84F4},{0xE4F2,0x8517},{0xE4F3,0x8518},{0xE4F4,0x852C},{0xE4F5,0x851F},{0xE4F6,0x8515},{0xE4F7,0x8514},{0xE4F8,0x84FC},{0xE4F9,0x8540},{0xE4FA,0x8563},{0xE4FB,0x8558},
		{0xE4FC,0x8548},{0xE540,0x8541},{0xE541,0x8602},{0xE542,0x854B},{0xE543,0x8555},{0xE544,0x8580},{0xE545,0x85A4},{0xE546,0x8588},{0xE547,0x8591},{0xE548,0x858A},{0xE549,0x85A8},{0xE54A,0x856D},{0xE54B,0x8594},{0xE54C,0x859B},{0xE54D,0x85EA},{0xE54E,0x8587},
		{0xE54F,0x859C},{0xE550,0x8577},{0xE551,0x857E},{0xE552,0x8590},{0xE553,0x85C9},{0xE554,0x85BA},{0xE555,0x85CF},{0xE556,0x85B9},{0xE557,0x85D0},{0xE558,0x85D5},{0xE559,0x85DD},{0xE55A,0x85E5},{0xE55B,0x85DC},{0xE55C,0x85F9},{0xE55D,0x860A},{0xE55E,0x8613},
		{0xE55F,0x860B},{0xE560,0x85FE},{0xE561,0x85FA},{0xE562,0x8606},{0xE563,0x8622},{0xE564,0x861A},{0xE565,0x8630},{0xE566,0x863F},{0xE567,0x864D},{0xE568,0x4E55},{0xE569,0x8654},{0xE56A,0x865F},{0xE56B,0x8667},{0xE56C,0x8671},{0xE56D,0x8693},{0xE56E,0x86A3},
		{0xE56F,0x86A9},{0xE570,0x86AA},{0xE571,0x868B},{0xE572,0x868C},{0xE573,0x86B6},{0xE574,0x86AF},{0xE575,0x86C4},{0xE576,0x86C6},{0xE577,0x86B0},{0xE578,0x86C9},{0xE579,0x8823},{0xE57A,0x86AB},{0xE57B,0x86D4},{0xE57C,0x86DE},{0xE57D,0x86E9},{0xE57E,0x86EC},
		{0xE580,0x86DF},{0xE581,0x86DB},{0xE582,0x86EF},{0xE583,0x8712},{0xE584,0x8706},{0xE585,0x8708},{0xE586,0x8700},{0xE587,0x8703},{0xE588,0x86FB},{0xE589,0x8711},{0xE58A,0x8709},{0xE58B,0x870D},{0xE58C,0x86F9},{0xE58D,0x870A},{0xE58E,0x8734},{0xE58F,0x873F},
		{0xE590,0x8737},{0xE591,0x873B},{0xE592,0x8725},{0xE593,0x8729},{0xE594,0x871A},{0xE595,0x8760},{0xE596,0x875F},{0xE597,0x8778},{0xE598,0x874C},{0xE599,0x874E},{0xE59A,0x8774},{0xE59B,0x8757},{0xE59C,0x8768},{0xE59D,0x876E},{0xE59E,0x8759},{0xE59F,0x8753},
		{0xE5A0,0x8763},{0xE5A1,0x876A},{0xE5A2,0x8805},{0xE5A3,0x87A2},{0xE5A4,0x879F},{0xE5A5,0x8782},{0xE5A6,0x87AF},{0xE5A7,0x87CB},{0xE5A8,0x87BD},{0xE5A9,0x87C0},{0xE5AA,0x87D0},{0xE5AB,0x96D6},{0xE5AC,0x87AB},{0xE5AD,0x87C4},{0xE5AE,0x87B3},{0xE5AF,0x87C7},
		{0xE5B0,0x87C6},{0xE5B1,0x87BB},{0xE5B2,0x87EF},{0xE5B3,0x87F2},{0xE5B4,0x87E0},{0xE5B5,0x880F},{0xE5B6,0x880D},{0xE5B7,0x87FE},{0xE5B8,0x87F6},{0xE5B9,0x87F7},{0xE5BA,0x880E},{0xE5BB,0x87D2},{0xE5BC,0x8811},{0xE5BD,0x8816},{0xE5BE,0x8815},{0xE5BF,0x8822},
		{0xE5C0,0x8821},{0xE5C1,0x8831},{0xE5C2,0x8836},{0xE5C3,0x8839},{0xE5C4,0x8827},{0xE5C5,0x883B},{0xE5C6,0x8844},{0xE5C7,0x8842},{0xE5C8,0x8852},{0xE5C9,0x8859},{0xE5CA,0x885E},{0xE5CB,0x8862},{0xE5CC,0x886B},{0xE5CD,0x8881},{0xE5CE,0x887E},{0xE5CF,0x889E},
		{0xE5D0,0x8875},{0xE5D1,0x887D},{0xE5D2,0x88B5},{0xE5D3,0x8872},{0xE5D4,0x8882},{0xE5D5,0x8897},{0xE5D6,0x8892},{0xE5D7,0x88AE},{0xE5D8,0x8899},{0xE5D9,0x88A2},{0xE5DA,0x888D},{0xE5DB,0x88A4},{0xE5DC,0x88B0},{0xE5DD,0x88BF},{0xE5DE,0x88B1},{0xE5DF,0x88C3},
		{0xE5E0,0x88C4},{0xE5E1,0x88D4},{0xE5E2,0x88D8},{0xE5E3,0x88D9},{0xE5E4,0x88DD},{0xE5E5,0x88F9},{0xE5E6,0x8902},{0xE5E7,0x88FC},{0xE5E8,0x88F4},{0xE5E9,0x88E8},{0xE5EA,0x88F2},{0xE5EB,0x8904},{0xE5EC,0x890C},{0xE5ED,0x890A},{0xE5EE,0x8913},{0xE5EF,0x8943},
		{0xE5F0,0x891E},{0xE5F1,0x8925},{0xE5F2,0x892A},{0xE5F3,0x892B},{0xE5F4,0x8941},{0xE5F5,0x8944},{0xE5F6,0x893B},{0xE5F7,0x8936},{0xE5F8,0x8938},{0xE5F9,0x894C},{0xE5FA,0x891D},{0xE5FB,0x8960},{0xE5FC,0x895E},{0xE640,0x8966},{0xE641,0x8964},{0xE642,0x896D},
		{0xE643,0x896A},{0xE644,0x896F},{0xE645,0x8974},{0xE646,0x8977},{0xE647,0x897E},{0xE648,0x8983},{0xE649,0x8988},{0xE64A,0x898A},{0xE64B,0x8993},{0xE64C,0x8998},{0xE64D,0x89A1},{0xE64E,0x89A9},{0xE64F,0x89A6},{0xE650,0x89AC},{0xE651,0x89AF},{0xE652,0x89B2},
		{0xE653,0x89BA},{0xE654,0x89BD},{0xE655,0x89BF},{0xE656,0x89C0},{0xE657,0x89DA},{0xE658,0x89DC},{0xE659,0x89DD},{0xE65A,0x89E7},{0xE65B,0x89F4},{0xE65C,0x89F8},{0xE65D,0x8A03},{0xE65E,0x8A16},{0xE65F,0x8A10},{0xE660,0x8A0C},{0xE661,0x8A1B},{0xE662,0x8A1D},
		{0xE663,0x8A25},{0xE664,0x8A36},{0xE665,0x8A41},{0xE666,0x8A5B},{0xE667,0x8A52},{0xE668,0x8A46},{0xE669,0x8A48},{0xE66A,0x8A7C},{0xE66B,0x8A6D},{0xE66C,0x8A6C},{0xE66D,0x8A62},{0xE66E,0x8A85},{0xE66F,0x8A82},{0xE670,0x8A84},{0xE671,0x8AA8},{0xE672,0x8AA1},
		{0xE673,0x8A91},{0xE674,0x8AA5},{0xE675,0x8AA6},{0xE676,0x8A9A},{0xE677,0x8AA3},{0xE678,0x8AC4},{0xE679,0x8ACD},{0xE67A,0x8AC2},{0xE67B,0x8ADA},{0xE67C,0x8AEB},{0xE67D,0x8AF3},{0xE67E,0x8AE7},{0xE680,0x8AE4},{0xE681,0x8AF1},{0xE682,0x8B14},{0xE683,0x8AE0},
		{0xE684,0x8AE2},{0xE685,0x8AF7},{0xE686,0x8ADE},{0xE687,0x8ADB},{0xE688,0x8B0C},{0xE689,0x8B07},{0xE68A,0x8B1A},{0xE68B,0x8AE1},{0xE68C,0x8B16},{0xE68D,0x8B10},{0xE68E,0x8B17},{0xE68F,0x8B20},{0xE690,0x8B33},{0xE691,0x97AB},{0xE692,0x8B26},{0xE693,0x8B2B},
		{0xE694,0x8B3E},{0xE695,0x8B28},{0xE696,0x8B41},{0xE697,0x8B4C},{0xE698,0x8B4F},{0xE699,0x8B4E},{0xE69A,0x8B49},{0xE69B,0x8B56},{0xE69C,0x8B5B},{0xE69D,0x8B5A},{0xE69E,0x8B6B},{0xE69F,0x8B5F},{0xE6A0,0x8B6C},{0xE6A1,0x8B6F},{0xE6A2,0x8B74},{0xE6A3,0x8B7D},
		{0xE6A4,0x8B80},{0xE6A5,0x8B8C},{0xE6A6,0x8B8E},{0xE6A7,0x8B92},{0xE6A8,0x8B93},{0xE6A9,0x8B96},{0xE6AA,0x8B99},{0xE6AB,0x8B9A},{0xE6AC,0x8C3A},{0xE6AD,0x8C41},{0xE6AE,0x8C3F},{0xE6AF,0x8C48},{0xE6B0,0x8C4C},{0xE6B1,0x8C4E},{0xE6B2,0x8C50},{0xE6B3,0x8C55},
		{0xE6B4,0x8C62},{0xE6B5,0x8C6C},{0xE6B6,0x8C78},{0xE6B7,0x8C7A},{0xE6B8,0x8C82},{0xE6B9,0x8C89},{0xE6BA,0x8C85},{0xE6BB,0x8C8A},{0xE6BC,0x8C8D},{0xE6BD,0x8C8E},{0xE6BE,0x8C94},{0xE6BF,0x8C7C},{0xE6C0,0x8C98},{0xE6C1,0x621D},{0xE6C2,0x8CAD},{0xE6C3,0x8CAA},
		{0xE6C4,0x8CBD},{0xE6C5,0x8CB2},{0xE6C6,0x8CB3},{0xE6C7,0x8CAE},{0xE6C8,0x8CB6},{0xE6C9,0x8CC8},{0xE6CA,0x8CC1},{0xE6CB,0x8CE4},{0xE6CC,0x8CE3},{0xE6CD,0x8CDA},{0xE6CE,0x8CFD},{0xE6CF,0x8CFA},{0xE6D0,0x8CFB},{0xE6D1,0x8D04},{0xE6D2,0x8D05},{0xE6D3,0x8D0A},
		{0xE6D4,0x8D07},{0xE6D5,0x8D0F},{0xE6D6,0x8D0D},{0xE6D7,0x8D10},{0xE6D8,0x9F4E},{0xE6D9,0x8D13},{0xE6DA,0x8CCD},{0xE6DB,0x8D14},{0xE6DC,0x8D16},{0xE6DD,0x8D67},{0xE6DE,0x8D6D},{0xE6DF,0x8D71},{0xE6E0,0x8D73},{0xE6E1,0x8D81},{0xE6E2,0x8D99},{0xE6E3,0x8DC2},
		{0xE6E4,0x8DBE},{0xE6E5,0x8DBA},{0xE6E6,0x8DCF},{0xE6E7,0x8DDA},{0xE6E8,0x8DD6},{0xE6E9,0x8DCC},{0xE6EA,0x8DDB},{0xE6EB,0x8DCB},{0xE6EC,0x8DEA},{0xE6ED,0x8DEB},{0xE6EE,0x8DDF},{0xE6EF,0x8DE3},{0xE6F0,0x8DFC},{0xE6F1,0x8E08},{0xE6F2,0x8E09},{0xE6F3,0x8DFF},
		{0xE6F4,0x8E1D},{0xE6F5,0x8E1E},{0xE6F6,0x8E10},{0xE6F7,0x8E1F},{0xE6F8,0x8E42},{0xE6F9,0x8E35},{0xE6FA,0x8E30},{0xE6FB,0x8E34},{0xE6FC,0x8E4A},{0xE740,0x8E47},{0xE741,0x8E49},{0xE742,0x8E4C},{0xE743,0x8E50},{0xE744,0x8E48},{0xE745,0x8E59},{0xE746,0x8E64},
		{0xE747,0x8E60},{0xE748,0x8E2A},{0xE749,0x8E63},{0xE74A,0x8E55},{0xE74B,0x8E76},{0xE74C,0x8E72},{0xE74D,0x8E7C},{0xE74E,0x8E81},{0xE74F,0x8E87},{0xE750,0x8E85},{0xE751,0x8E84},{0xE752,0x8E8B},{0xE753,0x8E8A},{0xE754,0x8E93},{0xE755,0x8E91},{0xE756,0x8E94},
		{0xE757,0x8E99},{0xE758,0x8EAA},{0xE759,0x8EA1},{0xE75A,0x8EAC},{0xE75B,0x8EB0},{0xE75C,0x8EC6},{0xE75D,0x8EB1},{0xE75E,0x8EBE},{0xE75F,0x8EC5},{0xE760,0x8EC8},{0xE761,0x8ECB},{0xE762,0x8EDB},{0xE763,0x8EE3},{0xE764,0x8EFC},{0xE765,0x8EFB},{0xE766,0x8EEB},
		{0xE767,0x8EFE},{0xE768,0x8F0A},{0xE769,0x8F05},{0xE76A,0x8F15},{0xE76B,0x8F12},{0xE76C,0x8F19},{0xE76D,0x8F13},{0xE76E,0x8F1C},{0xE76F,0x8F1F},{0xE770,0x8F1B},{0xE771,0x8F0C},{0xE772,0x8F26},{0xE773,0x8F33},{0xE774,0x8F3B},{0xE775,0x8F39},{0xE776,0x8F45},
		{0xE777,0x8F42},{0xE778,0x8F3E},{0xE779,0x8F4C},{0xE77A,0x8F49},{0xE77B,0x8F46},{0xE77C,0x8F4E},{0xE77D,0x8F57},{0xE77E,0x8F5C},{0xE780,0x8F62},{0xE781,0x8F63},{0xE782,0x8F64},{0xE783,0x8F9C},{0xE784,0x8F9F},{0xE785,0x8FA3},{0xE786,0x8FAD},{0xE787,0x8FAF},
		{0xE788,0x8FB7},{0xE789,0x8FDA},{0xE78A,0x8FE5},{0xE78B,0x8FE2},{0xE78C,0x8FEA},{0xE78D,0x8FEF},{0xE78E,0x9087},{0xE78F,0x8FF4},{0xE790,0x9005},{0xE791,0x8FF9},{0xE792,0x8FFA},{0xE793,0x9011},{0xE794,0x9015},{0xE795,0x9021},{0xE796,0x900D},{0xE797,0x901E},
		{0xE798,0x9016},{0xE799,0x900B},{0xE79A,0x9027},{0xE79B,0x9036},{0xE79C,0x9035},{0xE79D,0x9039},{0xE79E,0x8FF8},{0xE79F,0x904F},{0xE7A0,0x9050},{0xE7A1,0x9051},{0xE7A2,0x9052},{0xE7A3,0x900E},{0xE7A4,0x9049},{0xE7A5,0x903E},{0xE7A6,0x9056},{0xE7A7,0x9058},
		{0xE7A8,0x905E},{0xE7A9,0x9068},{0xE7AA,0x906F},{0xE7AB,0x9076},{0xE7AC,0x96A8},{0xE7AD,0x9072},{0xE7AE,0x9082},{0xE7AF,0x907D},{0xE7B0,0x9081},{0xE7B1,0x9080},{0xE7B2,0x908A},{0xE7B3,0x9089},{0xE7B4,0x908F},{0xE7B5,0x90A8},{0xE7B6,0x90AF},{0xE7B7,0x90B1},
		{0xE7B8,0x90B5},{0xE7B9,0x90E2},{0xE7BA,0x90E4},{0xE7BB,0x6248},{0xE7BC,0x90DB},{0xE7BD,0x9102},{0xE7BE,0x9112},{0xE7BF,0x9119},{0xE7C0,0x9132},{0xE7C1,0x9130},{0xE7C2,0x914A},{0xE7C3,0x9156},{0xE7C4,0x9158},{0xE7C5,0x9163},{0xE7C6,0x9165},{0xE7C7,0x9169},
		{0xE7C8,0x9173},{0xE7C9,0x9172},{0xE7CA,0x918B},{0xE7CB,0x9189},{0xE7CC,0x9182},{0xE7CD,0x91A2},{0xE7CE,0x91AB},{0xE7CF,0x91AF},{0xE7D0,0x91AA},{0xE7D1,0x91B5},{0xE7D2,0x91B4},{0xE7D3,0x91BA},{0xE7D4,0x91C0},{0xE7D5,0x91C1},{0xE7D6,0x91C9},{0xE7D7,0x91CB},
		{0xE7D8,0x91D0},{0xE7D9,0x91D6},{0xE7DA,0x91DF},{0xE7DB,0x91E1},{0xE7DC,0x91DB},{0xE7DD,0x91FC},{0xE7DE,0x91F5},{0xE7DF,0x91F6},{0xE7E0,0x921E},{0xE7E1,0x91FF},{0xE7E2,0x9214},{0xE7E3,0x922C},{0xE7E4,0x9215},{0xE7E5,0x9211},{0xE7E6,0x925E},{0xE7E7,0x9257},
		{0xE7E8,0x9245},{0xE7E9,0x9249},{0xE7EA,0x9264},{0xE7EB,0x9248},{0xE7EC,0x9295},{0xE7ED,0x923F},{0xE7EE,0x924B},{0xE7EF,0x9250},{0xE7F0,0x929C},{0xE7F1,0x9296},{0xE7F2,0x9293},{0xE7F3,0x929B},{0xE7F4,0x925A},{0xE7F5,0x92CF},{0xE7F6,0x92B9},{0xE7F7,0x92B7},
		{0xE7F8,0x92E9},{0xE7F9,0x930F},{0xE7FA,0x92FA},{0xE7FB,0x9344},{0xE7FC,0x932E},{0xE840,0x9319},{0xE841,0x9322},{0xE842,0x931A},{0xE843,0x9323},{0xE844,0x933A},{0xE845,0x9335},{0xE846,0x933B},{0xE847,0x935C},{0xE848,0x9360},{0xE849,0x937C},{0xE84A,0x936E},
		{0xE84B,0x9356},{0xE84C,0x93B0},{0xE84D,0x93AC},{0xE84E,0x93AD},{0xE84F,0x9394},{0xE850,0x93B9},{0xE851,0x93D6},{0xE852,0x93D7},{0xE853,0x93E8},{0xE854,0x93E5},{0xE855,0x93D8},{0xE856,0x93C3},{0xE857,0x93DD},{0xE858,0x93D0},{0xE859,0x93C8},{0xE85A,0x93E4},
		{0xE85B,0x941A},{0xE85C,0x9414},{0xE85D,0x9413},{0xE85E,0x9403},{0xE85F,0x9407},{0xE860,0x9410},{0xE861,0x9436},{0xE862,0x942B},{0xE863,0x9435},{0xE864,0x9421},{0xE865,0x943A},{0xE866,0x9441},{0xE867,0x9452},{0xE868,0x9444},{0xE869,0x945B},{0xE86A,0x9460},
		{0xE86B,0x9462},{0xE86C,0x945E},{0xE86D,0x946A},{0xE86E,0x9229},{0xE86F,0x9470},{0xE870,0x9475},{0xE871,0x9477},{0xE872,0x947D},{0xE873,0x945A},{0xE874,0x947C},{0xE875,0x947E},{0xE876,0x9481},{0xE877,0x947F},{0xE878,0x9582},{0xE879,0x9587},{0xE87A,0x958A},
		{0xE87B,0x9594},{0xE87C,0x9596},{0xE87D,0x9598},{0xE87E,0x9599},{0xE880,0x95A0},{0xE881,0x95A8},{0xE882,0x95A7},{0xE883,0x95AD},{0xE884,0x95BC},{0xE885,0x95BB},{0xE886,0x95B9},{0xE887,0x95BE},{0xE888,0x95CA},{0xE889,0x6FF6},{0xE88A,0x95C3},{0xE88B,0x95CD},
		{0xE88C,0x95CC},{0xE88D,0x95D5},{0xE88E,0x95D4},{0xE88F,0x95D6},{0xE890,0x95DC},{0xE891,0x95E1},{0xE892,0x95E5},{0xE893,0x95E2},{0xE894,0x9621},{0xE895,0x9628},{0xE896,0x962E},{0xE897,0x962F},{0xE898,0x9642},{0xE899,0x964C},{0xE89A,0x964F},{0xE89B,0x964B},
		{0xE89C,0x9677},{0xE89D,0x965C},{0xE89E,0x965E},{0xE89F,0x965D},{0xE8A0,0x965F},{0xE8A1,0x9666},{0xE8A2,0x9672},{0xE8A3,0x966C},{0xE8A4,0x968D},{0xE8A5,0x9698},{0xE8A6,0x9695},{0xE8A7,0x9697},{0xE8A8,0x96AA},{0xE8A9,0x96A7},{0xE8AA,0x96B1},{0xE8AB,0x96B2},
		{0xE8AC,0x96B0},{0xE8AD,0x96B4},{0xE8AE,0x96B6},{0xE8AF,0x96B8},{0xE8B0,0x96B9},{0xE8B1,0x96CE},{0xE8B2,0x96CB},{0xE8B3,0x96C9},{0xE8B4,0x96CD},{0xE8B5,0x894D},{0xE8B6,0x96DC},{0xE8B7,0x970D},{0xE8B8,0x96D5},{0xE8B9,0x96F9},{0xE8BA,0x9704},{0xE8BB,0x9706},
		{0xE8BC,0x9708},{0xE8BD,0x9713},{0xE8BE,0x970E},{0xE8BF,0x9711},{0xE8C0,0x970F},{0xE8C1,0x9716},{0xE8C2,0x9719},{0xE8C3,0x9724},{0xE8C4,0x972A},{0xE8C5,0x9730},{0xE8C6,0x9739},{0xE8C7,0x973D},{0xE8C8,0x973E},{0xE8C9,0x9744},{0xE8CA,0x9746},{0xE8CB,0x9748},
		{0xE8CC,0x9742},{0xE8CD,0x9749},{0xE8CE,0x975C},{0xE8CF,0x9760},{0xE8D0,0x9764},{0xE8D1,0x9766},{0xE8D2,0x9768},{0xE8D3,0x52D2},{0xE8D4,0x976B},{0xE8D5,0x9771},{0xE8D6,0x9779},{0xE8D7,0x9785},{0xE8D8,0x977C},{0xE8D9,0x9781},{0xE8DA,0x977A},{0xE8DB,0x9786},
		{0xE8DC,0x978B},{0xE8DD,0x978F},{0xE8DE,0x9790},{0xE8DF,0x979C},{0xE8E0,0x97A8},{0xE8E1,0x97A6},{0xE8E2,0x97A3},{0xE8E3,0x97B3},{0xE8E4,0x97B4},{0xE8E5,0x97C3},{0xE8E6,0x97C6},{0xE8E7,0x97C8},{0xE8E8,0x97CB},{0xE8E9,0x97DC},{0xE8EA,0x97ED},{0xE8EB,0x9F4F},
		{0xE8EC,0x97F2},{0xE8ED,0x7ADF},{0xE8EE,0x97F6},{0xE8EF,0x97F5},{0xE8F0,0x980F},{0xE8F1,0x980C},{0xE8F2,0x9838},{0xE8F3,0x9824},{0xE8F4,0x9821},{0xE8F5,0x9837},{0xE8F6,0x983D},{0xE8F7,0x9846},{0xE8F8,0x984F},{0xE8F9,0x984B},{0xE8FA,0x986B},{0xE8FB,0x986F},
		{0xE8FC,0x9870},{0xE940,0x9871},{0xE941,0x9874},{0xE942,0x9873},{0xE943,0x98AA},{0xE944,0x98AF},{0xE945,0x98B1},{0xE946,0x98B6},{0xE947,0x98C4},{0xE948,0x98C3},{0xE949,0x98C6},{0xE94A,0x98E9},{0xE94B,0x98EB},{0xE94C,0x9903},{0xE94D,0x9909},{0xE94E,0x9912},
		{0xE94F,0x9914},{0xE950,0x9918},{0xE951,0x9921},{0xE952,0x991D},{0xE953,0x991E},{0xE954,0x9924},{0xE955,0x9920},{0xE956,0x992C},{0xE957,0x992E},{0xE958,0x993D},{0xE959,0x993E},{0xE95A,0x9942},{0xE95B,0x9949},{0xE95C,0x9945},{0xE95D,0x9950},{0xE95E,0x994B},
		{0xE95F,0x9951},{0xE960,0x9952},{0xE961,0x994C},{0xE962,0x9955},{0xE963,0x9997},{0xE964,0x9998},{0xE965,0x99A5},{0xE966,0x99AD},{0xE967,0x99AE},{0xE968,0x99BC},{0xE969,0x99DF},{0xE96A,0x99DB},{0xE96B,0x99DD},{0xE96C,0x99D8},{0xE96D,0x99D1},{0xE96E,0x99ED},
		{0xE96F,0x99EE},{0xE970,0x99F1},{0xE971,0x99F2},{0xE972,0x99FB},{0xE973,0x99F8},{0xE974,0x9A01},{0xE975,0x9A0F},{0xE976,0x9A05},{0xE977,0x99E2},{0xE978,0x9A19},{0xE979,0x9A2B},{0xE97A,0x9A37},{0xE97B,0x9A45},{0xE97C,0x9A42},{0xE97D,0x9A40},{0xE97E,0x9A43},
		{0xE980,0x9A3E},{0xE981,0x9A55},{0xE982,0x9A4D},{0xE983,0x9A5B},{0xE984,0x9A57},{0xE985,0x9A5F},{0xE986,0x9A62},{0xE987,0x9A65},{0xE988,0x9A64},{0xE989,0x9A69},{0xE98A,0x9A6B},{0xE98B,0x9A6A},{0xE98C,0x9AAD},{0xE98D,0x9AB0},{0xE98E,0x9ABC},{0xE98F,0x9AC0},
		{0xE990,0x9ACF},{0xE991,0x9AD1},{0xE992,0x9AD3},{0xE993,0x9AD4},{0xE994,0x9ADE},{0xE995,0x9ADF},{0xE996,0x9AE2},{0xE997,0x9AE3},{0xE998,0x9AE6},{0xE999,0x9AEF},{0xE99A,0x9AEB},{0xE99B,0x9AEE},{0xE99C,0x9AF4},{0xE99D,0x9AF1},{0xE99E,0x9AF7},{0xE99F,0x9AFB},
		{0xE9A0,0x9B06},{0xE9A1,0x9B18},{0xE9A2,0x9B1A},{0xE9A3,0x9B1F},{0xE9A4,0x9B22},{0xE9A5,0x9B23},{0xE9A6,0x9B25},{0xE9A7,0x9B27},{0xE9A8,0x9B28},{0xE9A9,0x9B29},{0xE9AA,0x9B2A},{0xE9AB,0x9B2E},{0xE9AC,0x9B2F},{0xE9AD,0x9B32},{0xE9AE,0x9B44},{0xE9AF,0x9B43},
		{0xE9B0,0x9B4F},{0xE9B1,0x9B4D},{0xE9B2,0x9B4E},{0xE9B3,0x9B51},{0xE9B4,0x9B58},{0xE9B5,0x9B74},{0xE9B6,0x9B93},{0xE9B7,0x9B83},{0xE9B8,0x9B91},{0xE9B9,0x9B96},{0xE9BA,0x9B97},{0xE9BB,0x9B9F},{0xE9BC,0x9BA0},{0xE9BD,0x9BA8},{0xE9BE,0x9BB4},{0xE9BF,0x9BC0},
		{0xE9C0,0x9BCA},{0xE9C1,0x9BB9},{0xE9C2,0x9BC6},{0xE9C3,0x9BCF},{0xE9C4,0x9BD1},{0xE9C5,0x9BD2},{0xE9C6,0x9BE3},{0xE9C7,0x9BE2},{0xE9C8,0x9BE4},{0xE9C9,0x9BD4},{0xE9CA,0x9BE1},{0xE9CB,0x9C3A},{0xE9CC,0x9BF2},{0xE9CD,0x9BF1},{0xE9CE,0x9BF0},{0xE9CF,0x9C15},
		{0xE9D0,0x9C14},{0xE9D1,0x9C09},{0xE9D2,0x9C13},{0xE9D3,0x9C0C},{0xE9D4,0x9C06},{0xE9D5,0x9C08},{0xE9D6,0x9C12},{0xE9D7,0x9C0A},{0xE9D8,0x9C04},{0xE9D9,0x9C2E},{0xE9DA,0x9C1B},{0xE9DB,0x9C25},{0xE9DC,0x9C24},{0xE9DD,0x9C21},{0xE9DE,0x9C30},{0xE9DF,0x9C47},
		{0xE9E0,0x9C32},{0xE9E1,0x9C46},{0xE9E2,0x9C3E},{0xE9E3,0x9C5A},{0xE9E4,0x9C60},{0xE9E5,0x9C67},{0xE9E6,0x9C76},{0xE9E7,0x9C78},{0xE9E8,0x9CE7},{0xE9E9,0x9CEC},{0xE9EA,0x9CF0},{0xE9EB,0x9D09},{0xE9EC,0x9D08},{0xE9ED,0x9CEB},{0xE9EE,0x9D03},{0xE9EF,0x9D06},
		{0xE9F0,0x9D2A},{0xE9F1,0x9D26},{0xE9F2,0x9DAF},{0xE9F3,0x9D23},{0xE9F4,0x9D1F},{0xE9F5,0x9D44},{0xE9F6,0x9D15},{0xE9F7,0x9D12},{0xE9F8,0x9D41},{0xE9F9,0x9D3F},{0xE9FA,0x9D3E},{0xE9FB,0x9D46},{0xE9FC,0x9D48},{0xEA40,0x9D5D},{0xEA41,0x9D5E},{0xEA42,0x9D64},
		{0xEA43,0x9D51},{0xEA44,0x9D50},{0xEA45,0x9D59},{0xEA46,0x9D72},{0xEA47,0x9D89},{0xEA48,0x9D87},{0xEA49,0x9DAB},{0xEA4A,0x9D6F},{0xEA4B,0x9D7A},{0xEA4C,0x9D9A},{0xEA4D,0x9DA4},{0xEA4E,0x9DA9},{0xEA4F,0x9DB2},{0xEA50,0x9DC4},{0xEA51,0x9DC1},{0xEA52,0x9DBB},
		{0xEA53,0x9DB8},{0xEA54,0x9DBA},{0xEA55,0x9DC6},{0xEA56,0x9DCF},{0xEA57,0x9DC2},{0xEA58,0x9DD9},{0xEA59,0x9DD3},{0xEA5A,0x9DF8},{0xEA5B,0x9DE6},{0xEA5C,0x9DED},{0xEA5D,0x9DEF},{0xEA5E,0x9DFD},{0xEA5F,0x9E1A},{0xEA60,0x9E1B},{0xEA61,0x9E1E},{0xEA62,0x9E75},
		{0xEA63,0x9E79},{0xEA64,0x9E7D},{0xEA65,0x9E81},{0xEA66,0x9E88},{0xEA67,0x9E8B},{0xEA68,0x9E8C},{0xEA69,0x9E92},{0xEA6A,0x9E95},{0xEA6B,0x9E91},{0xEA6C,0x9E9D},{0xEA6D,0x9EA5},{0xEA6E,0x9EA9},{0xEA6F,0x9EB8},{0xEA70,0x9EAA},{0xEA71,0x9EAD},{0xEA72,0x9761},
		{0xEA73,0x9ECC},{0xEA74,0x9ECE},{0xEA75,0x9ECF},{0xEA76,0x9ED0},{0xEA77,0x9ED4},{0xEA78,0x9EDC},{0xEA79,0x9EDE},{0xEA7A,0x9EDD},{0xEA7B,0x9EE0},{0xEA7C,0x9EE5},{0xEA7D,0x9EE8},{0xEA7E,0x9EEF},{0xEA80,0x9EF4},{0xEA81,0x9EF6},{0xEA82,0x9EF7},{0xEA83,0x9EF9},
		{0xEA84,0x9EFB},{0xEA85,0x9EFC},{0xEA86,0x9EFD},{0xEA87,0x9F07},{0xEA88,0x9F08},{0xEA89,0x76B7},{0xEA8A,0x9F15},{0xEA8B,0x9F21},{0xEA8C,0x9F2C},{0xEA8D,0x9F3E},{0xEA8E,0x9F4A},{0xEA8F,0x9F52},{0xEA90,0x9F54},{0xEA91,0x9F63},{0xEA92,0x9F5F},{0xEA93,0x9F60},
		{0xEA94,0x9F61},{0xEA95,0x9F66},{0xEA96,0x9F67},{0xEA97,0x9F6C},{0xEA98,0x9F6A},{0xEA99,0x9F77},{0xEA9A,0x9F72},{0xEA9B,0x9F76},{0xEA9C,0x9F95},{0xEA9D,0x9F9C},{0xEA9E,0x9FA0},{0xEA9F,0x582F},{0xEAA0,0x69C7},{0xEAA1,0x9059},{0xEAA2,0x7464},{0xEAA3,0x51DC},
		{0xEAA4,0x7199},{0xED40,0x7E8A},{0xED41,0x891C},{0xED42,0x9348},{0xED43,0x9288},{0xED44,0x84DC},{0xED45,0x4FC9},{0xED46,0x70BB},{0xED47,0x6631},{0xED48,0x68C8},{0xED49,0x92F9},{0xED4A,0x66FB},{0xED4B,0x5F45},{0xED4C,0x4E28},{0xED4D,0x4EE1},{0xED4E,0x4EFC},
		{0xED4F,0x4F00},{0xED50,0x4F03},{0xED51,0x4F39},{0xED52,0x4F56},{0xED53,0x4F92},{0xED54,0x4F8A},{0xED55,0x4F9A},{0xED56,0x4F94},{0xED57,0x4FCD},{0xED58,0x5040},{0xED59,0x5022},{0xED5A,0x4FFF},{0xED5B,0x501E},{0xED5C,0x5046},{0xED5D,0x5070},{0xED5E,0x5042},
		{0xED5F,0x5094},{0xED60,0x50F4},{0xED61,0x50D8},{0xED62,0x514A},{0xED63,0x5164},{0xED64,0x519D},{0xED65,0x51BE},{0xED66,0x51EC},{0xED67,0x5215},{0xED68,0x529C},{0xED69,0x52A6},{0xED6A,0x52C0},{0xED6B,0x52DB},{0xED6C,0x5300},{0xED6D,0x5307},{0xED6E,0x5324},
		{0xED6F,0x5372},{0xED70,0x5393},{0xED71,0x53B2},{0xED72,0x53DD},{0xED73,0xFA0E},{0xED74,0x549C},{0xED75,0x548A},{0xED76,0x54A9},{0xED77,0x54FF},{0xED78,0x5586},{0xED79,0x5759},{0xED7A,0x5765},{0xED7B,0x57AC},{0xED7C,0x57C8},{0xED7D,0x57C7},{0xED7E,0xFA0F},
		{0xED80,0xFA10},{0xED81,0x589E},{0xED82,0x58B2},{0xED83,0x590B},{0xED84,0x5953},{0xED85,0x595B},{0xED86,0x595D},{0xED87,0x5963},{0xED88,0x59A4},{0xED89,0x59BA},{0xED8A,0x5B56},{0xED8B,0x5BC0},{0xED8C,0x752F},{0xED8D,0x5BD8},{0xED8E,0x5BEC},{0xED8F,0x5C1E},
		{0xED90,0x5CA6},{0xED91,0x5CBA},{0xED92,0x5CF5},{0xED93,0x5D27},{0xED94,0x5D53},{0xED95,0xFA11},{0xED96,0x5D42},{0xED97,0x5D6D},{0xED98,0x5DB8},{0xED99,0x5DB9},{0xED9A,0x5DD0},{0xED9B,0x5F21},{0xED9C,0x5F34},{0xED9D,0x5F67},{0xED9E,0x5FB7},{0xED9F,0x5FDE},
		{0xEDA0,0x605D},{0xEDA1,0x6085},{0xEDA2,0x608A},{0xEDA3,0x60DE},{0xEDA4,0x60D5},{0xEDA5,0x6120},{0xEDA6,0x60F2},{0xEDA7,0x6111},{0xEDA8,0x6137},{0xEDA9,0x6130},{0xEDAA,0x6198},{0xEDAB,0x6213},{0xEDAC,0x62A6},{0xEDAD,0x63F5},{0xEDAE,0x6460},{0xEDAF,0x649D},
		{0xEDB0,0x64CE},{0xEDB1,0x654E},{0xEDB2,0x6600},{0xEDB3,0x6615},{0xEDB4,0x663B},{0xEDB5,0x6609},{0xEDB6,0x662E},{0xEDB7,0x661E},{0xEDB8,0x6624},{0xEDB9,0x6665},{0xEDBA,0x6657},{0xEDBB,0x6659},{0xEDBC,0xFA12},{0xEDBD,0x6673},{0xEDBE,0x6699},{0xEDBF,0x66A0},
		{0xEDC0,0x66B2},{0xEDC1,0x66BF},{0xEDC2,0x66FA},{0xEDC3,0x670E},{0xEDC4,0xF929},{0xEDC5,0x6766},{0xEDC6,0x67BB},{0xEDC7,0x6852},{0xEDC8,0x67C0},{0xEDC9,0x6801},{0xEDCA,0x6844},{0xEDCB,0x68CF},{0xEDCC,0xFA13},{0xEDCD,0x6968},{0xEDCE,0xFA14},{0xEDCF,0x6998},
		{0xEDD0,0x69E2},{0xEDD1,0x6A30},{0xEDD2,0x6A6B},{0xEDD3,0x6A46},{0xEDD4,0x6A73},{0xEDD5,0x6A7E},{0xEDD6,0x6AE2},{0xEDD7,0x6AE4},{0xEDD8,0x6BD6},{0xEDD9,0x6C3F},{0xEDDA,0x6C5C},{0xEDDB,0x6C86},{0xEDDC,0x6C6F},{0xEDDD,0x6CDA},{0xEDDE,0x6D04},{0xEDDF,0x6D87},
		{0xEDE0,0x6D6F},{0xEDE1,0x6D96},{0xEDE2,0x6DAC},{0xEDE3,0x6DCF},{0xEDE4,0x6DF8},{0xEDE5,0x6DF2},{0xEDE6,0x6DFC},{0xEDE7,0x6E39},{0xEDE8,0x6E5C},{0xEDE9,0x6E27},{0xEDEA,0x6E3C},{0xEDEB,0x6EBF},{0xEDEC,0x6F88},{0xEDED,0x6FB5},{0xEDEE,0x6FF5},{0xEDEF,0x7005},
		{0xEDF0,0x7007},{0xEDF1,0x7028},{0xEDF2,0x7085},{0xEDF3,0x70AB},{0xEDF4,0x710F},{0xEDF5,0x7104},{0xEDF6,0x715C},{0xEDF7,0x7146},{0xEDF8,0x7147},{0xEDF9,0xFA15},{0xEDFA,0x71C1},{0xEDFB,0x71FE},{0xEDFC,0x72B1},{0xEE40,0x72BE},{0xEE41,0x7324},{0xEE42,0xFA16},
		{0xEE43,0x7377},{0xEE44,0x73BD},{0xEE45,0x73C9},{0xEE46,0x73D6},{0xEE47,0x73E3},{0xEE48,0x73D2},{0xEE49,0x7407},{0xEE4A,0x73F5},{0xEE4B,0x7426},{0xEE4C,0x742A},{0xEE4D,0x7429},{0xEE4E,0x742E},{0xEE4F,0x7462},{0xEE50,0x7489},{0xEE51,0x749F},{0xEE52,0x7501},
		{0xEE53,0x756F},{0xEE54,0x7682},{0xEE55,0x769C},{0xEE56,0x769E},{0xEE57,0x769B},{0xEE58,0x76A6},{0xEE59,0xFA17},{0xEE5A,0x7746},{0xEE5B,0x52AF},{0xEE5C,0x7821},{0xEE5D,0x784E},{0xEE5E,0x7864},{0xEE5F,0x787A},{0xEE60,0x7930},{0xEE61,0xFA18},{0xEE62,0xFA19},
		{0xEE63,0xFA1A},{0xEE64,0x7994},{0xEE65,0xFA1B},{0xEE66,0x799B},{0xEE67,0x7AD1},{0xEE68,0x7AE7},{0xEE69,0xFA1C},{0xEE6A,0x7AEB},{0xEE6B,0x7B9E},{0xEE6C,0xFA1D},{0xEE6D,0x7D48},{0xEE6E,0x7D5C},{0xEE6F,0x7DB7},{0xEE70,0x7DA0},{0xEE71,0x7DD6},{0xEE72,0x7E52},
		{0xEE73,0x7F47},{0xEE74,0x7FA1},{0xEE75,0xFA1E},{0xEE76,0x8301},{0xEE77,0x8362},{0xEE78,0x837F},{0xEE79,0x83C7},{0xEE7A,0x83F6},{0xEE7B,0x8448},{0xEE7C,0x84B4},{0xEE7D,0x8553},{0xEE7E,0x8559},{0xEE80,0x856B},{0xEE81,0xFA1F},{0xEE82,0x85B0},{0xEE83,0xFA20},
		{0xEE84,0xFA21},{0xEE85,0x8807},{0xEE86,0x88F5},{0xEE87,0x8A12},{0xEE88,0x8A37},{0xEE89,0x8A79},{0xEE8A,0x8AA7},{0xEE8B,0x8ABE},{0xEE8C,0x8ADF},{0xEE8D,0xFA22},{0xEE8E,0x8AF6},{0xEE8F,0x8B53},{0xEE90,0x8B7F},{0xEE91,0x8CF0},{0xEE92,0x8CF4},{0xEE93,0x8D12},
		{0xEE94,0x8D76},{0xEE95,0xFA23},{0xEE96,0x8ECF},{0xEE97,0xFA24},{0xEE98,0xFA25},{0xEE99,0x9067},{0xEE9A,0x90DE},{0xEE9B,0xFA26},{0xEE9C,0x9115},{0xEE9D,0x9127},{0xEE9E,0x91DA},{0xEE9F,0x91D7},{0xEEA0,0x91DE},{0xEEA1,0x91ED},{0xEEA2,0x91EE},{0xEEA3,0x91E4},
		{0xEEA4,0x91E5},{0xEEA5,0x9206},{0xEEA6,0x9210},{0xEEA7,0x920A},{0xEEA8,0x923A},{0xEEA9,0x9240},{0xEEAA,0x923C},{0xEEAB,0x924E},{0xEEAC,0x9259},{0xEEAD,0x9251},{0xEEAE,0x9239},{0xEEAF,0x9267},{0xEEB0,0x92A7},{0xEEB1,0x9277},{0xEEB2,0x9278},{0xEEB3,0x92E7},
		{0xEEB4,0x92D7},{0xEEB5,0x92D9},{0xEEB6,0x92D0},{0xEEB7,0xFA27},{0xEEB8,0x92D5},{0xEEB9,0x92E0},{0xEEBA,0x92D3},{0xEEBB,0x9325},{0xEEBC,0x9321},{0xEEBD,0x92FB},{0xEEBE,0xFA28},{0xEEBF,0x931E},{0xEEC0,0x92FF},{0xEEC1,0x931D},{0xEEC2,0x9302},{0xEEC3,0x9370},
		{0xEEC4,0x9357},{0xEEC5,0x93A4},{0xEEC6,0x93C6},{0xEEC7,0x93DE},{0xEEC8,0x93F8},{0xEEC9,0x9431},{0xEECA,0x9445},{0xEECB,0x9448},{0xEECC,0x9592},{0xEECD,0xF9DC},{0xEECE,0xFA29},{0xEECF,0x969D},{0xEED0,0x96AF},{0xEED1,0x9733},{0xEED2,0x973B},{0xEED3,0x9743},
		{0xEED4,0x974D},{0xEED5,0x974F},{0xEED6,0x9751},{0xEED7,0x9755},{0xEED8,0x9857},{0xEED9,0x9865},{0xEEDA,0xFA2A},{0xEEDB,0xFA2B},{0xEEDC,0x9927},{0xEEDD,0xFA2C},{0xEEDE,0x999E},{0xEEDF,0x9A4E},{0xEEE0,0x9AD9},{0xEEE1,0x9ADC},{0xEEE2,0x9B75},{0xEEE3,0x9B72},
		{0xEEE4,0x9B8F},{0xEEE5,0x9BB1},{0xEEE6,0x9BBB},{0xEEE7,0x9C00},{0xEEE8,0x9D70},{0xEEE9,0x9D6B},{0xEEEA,0xFA2D},{0xEEEB,0x9E19},{0xEEEC,0x9ED1},{0xEEEF,0x2170},{0xEEF0,0x2171},{0xEEF1,0x2172},{0xEEF2,0x2173},{0xEEF3,0x2174},{0xEEF4,0x2175},{0xEEF5,0x2176},
		{0xEEF6,0x2177},{0xEEF7,0x2178},{0xEEF8,0x2179},{0xEEF9,0xFFE2},{0xEEFA,0xFFE4},{0xEEFB,0xFF07},{0xEEFC,0xFF02},{0xFA40,0x2170},{0xFA41,0x2171},{0xFA42,0x2172},{0xFA43,0x2173},{0xFA44,0x2174},{0xFA45,0x2175},{0xFA46,0x2176},{0xFA47,0x2177},{0xFA48,0x2178},
		{0xFA49,0x2179},{0xFA4A,0x2160},{0xFA4B,0x2161},{0xFA4C,0x2162},{0xFA4D,0x2163},{0xFA4E,0x2164},{0xFA4F,0x2165},{0xFA50,0x2166},{0xFA51,0x2167},{0xFA52,0x2168},{0xFA53,0x2169},{0xFA54,0xFFE2},{0xFA55,0xFFE4},{0xFA56,0xFF07},{0xFA57,0xFF02},{0xFA58,0x3231},
		{0xFA59,0x2116},{0xFA5A,0x2121},{0xFA5B,0x2235},{0xFA5C,0x7E8A},{0xFA5D,0x891C},{0xFA5E,0x9348},{0xFA5F,0x9288},{0xFA60,0x84DC},{0xFA61,0x4FC9},{0xFA62,0x70BB},{0xFA63,0x6631},{0xFA64,0x68C8},{0xFA65,0x92F9},{0xFA66,0x66FB},{0xFA67,0x5F45},{0xFA68,0x4E28},
		{0xFA69,0x4EE1},{0xFA6A,0x4EFC},{0xFA6B,0x4F00},{0xFA6C,0x4F03},{0xFA6D,0x4F39},{0xFA6E,0x4F56},{0xFA6F,0x4F92},{0xFA70,0x4F8A},{0xFA71,0x4F9A},{0xFA72,0x4F94},{0xFA73,0x4FCD},{0xFA74,0x5040},{0xFA75,0x5022},{0xFA76,0x4FFF},{0xFA77,0x501E},{0xFA78,0x5046},
		{0xFA79,0x5070},{0xFA7A,0x5042},{0xFA7B,0x5094},{0xFA7C,0x50F4},{0xFA7D,0x50D8},{0xFA7E,0x514A},{0xFA80,0x5164},{0xFA81,0x519D},{0xFA82,0x51BE},{0xFA83,0x51EC},{0xFA84,0x5215},{0xFA85,0x529C},{0xFA86,0x52A6},{0xFA87,0x52C0},{0xFA88,0x52DB},{0xFA89,0x5300},
		{0xFA8A,0x5307},{0xFA8B,0x5324},{0xFA8C,0x5372},{0xFA8D,0x5393},{0xFA8E,0x53B2},{0xFA8F,0x53DD},{0xFA90,0xFA0E},{0xFA91,0x549C},{0xFA92,0x548A},{0xFA93,0x54A9},{0xFA94,0x54FF},{0xFA95,0x5586},{0xFA96,0x5759},{0xFA97,0x5765},{0xFA98,0x57AC},{0xFA99,0x57C8},
		{0xFA9A,0x57C7},{0xFA9B,0xFA0F},{0xFA9C,0xFA10},{0xFA9D,0x589E},{0xFA9E,0x58B2},{0xFA9F,0x590B},{0xFAA0,0x5953},{0xFAA1,0x595B},{0xFAA2,0x595D},{0xFAA3,0x5963},{0xFAA4,0x59A4},{0xFAA5,0x59BA},{0xFAA6,0x5B56},{0xFAA7,0x5BC0},{0xFAA8,0x752F},{0xFAA9,0x5BD8},
		{0xFAAA,0x5BEC},{0xFAAB,0x5C1E},{0xFAAC,0x5CA6},{0xFAAD,0x5CBA},{0xFAAE,0x5CF5},{0xFAAF,0x5D27},{0xFAB0,0x5D53},{0xFAB1,0xFA11},{0xFAB2,0x5D42},{0xFAB3,0x5D6D},{0xFAB4,0x5DB8},{0xFAB5,0x5DB9},{0xFAB6,0x5DD0},{0xFAB7,0x5F21},{0xFAB8,0x5F34},{0xFAB9,0x5F67},
		{0xFABA,0x5FB7},{0xFABB,0x5FDE},{0xFABC,0x605D},{0xFABD,0x6085},{0xFABE,0x608A},{0xFABF,0x60DE},{0xFAC0,0x60D5},{0xFAC1,0x6120},{0xFAC2,0x60F2},{0xFAC3,0x6111},{0xFAC4,0x6137},{0xFAC5,0x6130},{0xFAC6,0x6198},{0xFAC7,0x6213},{0xFAC8,0x62A6},{0xFAC9,0x63F5},
		{0xFACA,0x6460},{0xFACB,0x649D},{0xFACC,0x64CE},{0xFACD,0x654E},{0xFACE,0x6600},{0xFACF,0x6615},{0xFAD0,0x663B},{0xFAD1,0x6609},{0xFAD2,0x662E},{0xFAD3,0x661E},{0xFAD4,0x6624},{0xFAD5,0x6665},{0xFAD6,0x6657},{0xFAD7,0x6659},{0xFAD8,0xFA12},{0xFAD9,0x6673},
		{0xFADA,0x6699},{0xFADB,0x66A0},{0xFADC,0x66B2},{0xFADD,0x66BF},{0xFADE,0x66FA},{0xFADF,0x670E},{0xFAE0,0xF929},{0xFAE1,0x6766},{0xFAE2,0x67BB},{0xFAE3,0x6852},{0xFAE4,0x67C0},{0xFAE5,0x6801},{0xFAE6,0x6844},{0xFAE7,0x68CF},{0xFAE8,0xFA13},{0xFAE9,0x6968},
		{0xFAEA,0xFA14},{0xFAEB,0x6998},{0xFAEC,0x69E2},{0xFAED,0x6A30},{0xFAEE,0x6A6B},{0xFAEF,0x6A46},{0xFAF0,0x6A73},{0xFAF1,0x6A7E},{0xFAF2,0x6AE2},{0xFAF3,0x6AE4},{0xFAF4,0x6BD6},{0xFAF5,0x6C3F},{0xFAF6,0x6C5C},{0xFAF7,0x6C86},{0xFAF8,0x6C6F},{0xFAF9,0x6CDA},
		{0xFAFA,0x6D04},{0xFAFB,0x6D87},{0xFAFC,0x6D6F},{0xFB40,0x6D96},{0xFB41,0x6DAC},{0xFB42,0x6DCF},{0xFB43,0x6DF8},{0xFB44,0x6DF2},{0xFB45,0x6DFC},{0xFB46,0x6E39},{0xFB47,0x6E5C},{0xFB48,0x6E27},{0xFB49,0x6E3C},{0xFB4A,0x6EBF},{0xFB4B,0x6F88},{0xFB4C,0x6FB5},
		{0xFB4D,0x6FF5},{0xFB4E,0x7005},{0xFB4F,0x7007},{0xFB50,0x7028},{0xFB51,0x7085},{0xFB52,0x70AB},{0xFB53,0x710F},{0xFB54,0x7104},{0xFB55,0x715C},{0xFB56,0x7146},{0xFB57,0x7147},{0xFB58,0xFA15},{0xFB59,0x71C1},{0xFB5A,0x71FE},{0xFB5B,0x72B1},{0xFB5C,0x72BE},
		{0xFB5D,0x7324},{0xFB5E,0xFA16},{0xFB5F,0x7377},{0xFB60,0x73BD},{0xFB61,0x73C9},{0xFB62,0x73D6},{0xFB63,0x73E3},{0xFB64,0x73D2},{0xFB65,0x7407},{0xFB66,0x73F5},{0xFB67,0x7426},{0xFB68,0x742A},{0xFB69,0x7429},{0xFB6A,0x742E},{0xFB6B,0x7462},{0xFB6C,0x7489},
		{0xFB6D,0x749F},{0xFB6E,0x7501},{0xFB6F,0x756F},{0xFB70,0x7682},{0xFB71,0x769C},{0xFB72,0x769E},{0xFB73,0x769B},{0xFB74,0x76A6},{0xFB75,0xFA17},{0xFB76,0x7746},{0xFB77,0x52AF},{0xFB78,0x7821},{0xFB79,0x784E},{0xFB7A,0x7864},{0xFB7B,0x787A},{0xFB7C,0x7930},
		{0xFB7D,0xFA18},{0xFB7E,0xFA19},{0xFB80,0xFA1A},{0xFB81,0x7994},{0xFB82,0xFA1B},{0xFB83,0x799B},{0xFB84,0x7AD1},{0xFB85,0x7AE7},{0xFB86,0xFA1C},{0xFB87,0x7AEB},{0xFB88,0x7B9E},{0xFB89,0xFA1D},{0xFB8A,0x7D48},{0xFB8B,0x7D5C},{0xFB8C,0x7DB7},{0xFB8D,0x7DA0},
		{0xFB8E,0x7DD6},{0xFB8F,0x7E52},{0xFB90,0x7F47},{0xFB91,0x7FA1},{0xFB92,0xFA1E},{0xFB93,0x8301},{0xFB94,0x8362},{0xFB95,0x837F},{0xFB96,0x83C7},{0xFB97,0x83F6},{0xFB98,0x8448},{0xFB99,0x84B4},{0xFB9A,0x8553},{0xFB9B,0x8559},{0xFB9C,0x856B},{0xFB9D,0xFA1F},
		{0xFB9E,0x85B0},{0xFB9F,0xFA20},{0xFBA0,0xFA21},{0xFBA1,0x8807},{0xFBA2,0x88F5},{0xFBA3,0x8A12},{0xFBA4,0x8A37},{0xFBA5,0x8A79},{0xFBA6,0x8AA7},{0xFBA7,0x8ABE},{0xFBA8,0x8ADF},{0xFBA9,0xFA22},{0xFBAA,0x8AF6},{0xFBAB,0x8B53},{0xFBAC,0x8B7F},{0xFBAD,0x8CF0},
		{0xFBAE,0x8CF4},{0xFBAF,0x8D12},{0xFBB0,0x8D76},{0xFBB1,0xFA23},{0xFBB2,0x8ECF},{0xFBB3,0xFA24},{0xFBB4,0xFA25},{0xFBB5,0x9067},{0xFBB6,0x90DE},{0xFBB7,0xFA26},{0xFBB8,0x9115},{0xFBB9,0x9127},{0xFBBA,0x91DA},{0xFBBB,0x91D7},{0xFBBC,0x91DE},{0xFBBD,0x91ED},
		{0xFBBE,0x91EE},{0xFBBF,0x91E4},{0xFBC0,0x91E5},{0xFBC1,0x9206},{0xFBC2,0x9210},{0xFBC3,0x920A},{0xFBC4,0x923A},{0xFBC5,0x9240},{0xFBC6,0x923C},{0xFBC7,0x924E},{0xFBC8,0x9259},{0xFBC9,0x9251},{0xFBCA,0x9239},{0xFBCB,0x9267},{0xFBCC,0x92A7},{0xFBCD,0x9277},
		{0xFBCE,0x9278},{0xFBCF,0x92E7},{0xFBD0,0x92D7},{0xFBD1,0x92D9},{0xFBD2,0x92D0},{0xFBD3,0xFA27},{0xFBD4,0x92D5},{0xFBD5,0x92E0},{0xFBD6,0x92D3},{0xFBD7,0x9325},{0xFBD8,0x9321},{0xFBD9,0x92FB},{0xFBDA,0xFA28},{0xFBDB,0x931E},{0xFBDC,0x92FF},{0xFBDD,0x931D},
		{0xFBDE,0x9302},{0xFBDF,0x9370},{0xFBE0,0x9357},{0xFBE1,0x93A4},{0xFBE2,0x93C6},{0xFBE3,0x93DE},{0xFBE4,0x93F8},{0xFBE5,0x9431},{0xFBE6,0x9445},{0xFBE7,0x9448},{0xFBE8,0x9592},{0xFBE9,0xF9DC},{0xFBEA,0xFA29},{0xFBEB,0x969D},{0xFBEC,0x96AF},{0xFBED,0x9733},
		{0xFBEE,0x973B},{0xFBEF,0x9743},{0xFBF0,0x974D},{0xFBF1,0x974F},{0xFBF2,0x9751},{0xFBF3,0x9755},{0xFBF4,0x9857},{0xFBF5,0x9865},{0xFBF6,0xFA2A},{0xFBF7,0xFA2B},{0xFBF8,0x9927},{0xFBF9,0xFA2C},{0xFBFA,0x999E},{0xFBFB,0x9A4E},{0xFBFC,0x9AD9},{0xFC40,0x9ADC},
		{0xFC41,0x9B75},{0xFC42,0x9B72},{0xFC43,0x9B8F},{0xFC44,0x9BB1},{0xFC45,0x9BBB},{0xFC46,0x9C00},{0xFC47,0x9D70},{0xFC48,0x9D6B},{0xFC49,0xFA2D},{0xFC4A,0x9E19},{0xFC4B,0x9ED1}};
	}
}
namespace com.Company {
	public static partial class Library {
		public const int VslAtt_Wild		= (1<<0);
		public const int VslAtt_Scatter		= (1<<1);
		public static int VslCmn_GetWin(int[,] TBL_Sta,
		    int nRow,
		    Func<int,int,object,int> fnScaPay,
		    Func<int,object,int> fnGetAtt,
		    Func<int,int,object,int> fnGetSta,
		    Action<int,int,int,object> fnScaWin,
		    object arg) {
			int nPaySum = 0;
			int[,] TBL_Sca = new int[(5*nRow),2];
			int nSca = 0;
			int nScwCnt =  0;
			int iScwSym = -1;
			if(nRow < 1) { throw new ApplicationException(); }
			{
				int iRel;
				for(iRel = 0; iRel < 5; iRel++) {
					int iRow;
					for(iRow = 0; iRow < nRow; iRow++) {
						int iSym = fnGetSta.Invoke(iRel, iRow, arg);
						int iAtt = fnGetAtt.Invoke(iSym, arg);
						TBL_Sta[iRel,iRow] = iSym;
						if((iAtt & VslAtt_Scatter) != 0) {
							if((iAtt & VslAtt_Wild) != 0) {
								nScwCnt++;
								iScwSym = iSym;
							} else {
								int iSca;
								for(iSca = 0; iSca < nSca; iSca++) {
									if(TBL_Sca[iSca,0] == iSym) { break; }
								}
								if(iSca == nSca) {
									if(++nSca > TBL_Sca.GetLength(0)) { throw new ApplicationException(); }
									TBL_Sca[iSca,0] = iSym;
									TBL_Sca[iSca,1] = 0;
								}
								TBL_Sca[iSca,1]++;
							}
						}
					}
				}
			}
			{
				if(nSca != 0) {
					int iSca;
					for(iSca = 0; iSca < nSca; iSca++) {
						int iSym = TBL_Sca[iSca,0];
						int nOak = TBL_Sca[iSca,1] + nScwCnt;
						int nPay = fnScaPay.Invoke(iSym, nOak, arg);
						fnScaWin.Invoke(iSym, nOak, nPay, arg);
						nPaySum += nPay;
					}
				} else if(nScwCnt != 0) {
					int nPay = fnScaPay.Invoke(iScwSym, nScwCnt, arg);
					fnScaWin.Invoke(iScwSym, nScwCnt, nPay, arg);
					nPaySum += nPay;
				}
			}
			return nPaySum;
		}
		public struct ST_Vsl5nl_GetWin_Inf {
			public int nRow;
			public int nLin;
			public Func<int,int,object,int> fnGetRow;
			public Func<int,int,int,object,int> fnLinPay;
			public Func<int,int,object,int> fnScaPay;
			public Func<int,object,int> fnGetAtt;
			public Func<int,int,object,int> fnGetSta;
			public Action<int,int,int,int,object> fnLinWin;
			public Action<int,int,int,object> fnScaWin;
		}
		public static int Vsl5nl_GetWin(ST_Vsl5nl_GetWin_Inf pInf, object arg) {
			int nPaySum;
			int[,] TBL_Sta = new int[5,pInf.nRow];
			{
				nPaySum = VslCmn_GetWin(TBL_Sta,
					pInf.nRow,
					pInf.fnScaPay,
					pInf.fnGetAtt,
					pInf.fnGetSta,
					pInf.fnScaWin,
					arg);
			}
			{
				int iLin, iRel, iRow, iAtt;
				int[] iSym = new int[5];
				int iPurSym, nPurOak, nPurPay;
				int iCpxSym, nCpxOak, nCpxPay;
				for(iLin = 0; iLin < pInf.nLin; iLin++) {
					for(iRel = 0; iRel < 5; iRel++) {
						iRow = pInf.fnGetRow.Invoke(iLin, iRel, arg);
						if((uint)iRow >= (uint)pInf.nRow) { throw new ApplicationException(); }
						iSym[iRel] = TBL_Sta[iRel,iRow];
					}
					if(pInf.fnGetAtt.Invoke(iSym[0], arg) == VslAtt_Scatter) { continue; }
					iPurSym = iSym[0];
					for(nPurOak = 1; nPurOak < 5; nPurOak++) {
						iAtt = pInf.fnGetAtt.Invoke(iSym[nPurOak], arg);
						if(iAtt == VslAtt_Scatter) { break; }
						if(iSym[nPurOak] != iPurSym) { break; }
					}
					nPurPay = pInf.fnLinPay.Invoke(iPurSym, nPurOak, iLin, arg);
					iCpxSym = iSym[0];
					for(nCpxOak = 1; nCpxOak < 5; nCpxOak++) {
						iAtt = pInf.fnGetAtt.Invoke(iSym[nCpxOak], arg);
						if(iAtt == VslAtt_Scatter) { break; }
						if(iSym[nCpxOak] != iCpxSym) {
							if((iAtt & VslAtt_Wild) == 0) {
								if((pInf.fnGetAtt.Invoke(iCpxSym, arg) & VslAtt_Wild) == 0) { break; }
								iCpxSym = iSym[nCpxOak];
							}
						}
					}
					nCpxPay = pInf.fnLinPay.Invoke(iCpxSym, nCpxOak, iLin, arg);
					if(nPurPay > nCpxPay) {
						pInf.fnLinWin.Invoke(iPurSym, nPurOak, iLin, nPurPay, arg);
						nPaySum += nPurPay;
					} else {
						pInf.fnLinWin.Invoke(iCpxSym, nCpxOak, iLin, nCpxPay, arg);
						nPaySum += nCpxPay;
					}
				}
			}
			return nPaySum;
		}
		public struct ST_Vsl243_GetWin_Inf {
			public int nRow;
			public Func<int,int,int[],object,int> fnWayPay;
			public Func<int,int,object,int> fnScaPay;
			public Func<int,object,int> fnGetAtt;
			public Func<int,int,object,int> fnGetSta;
			public Action<int,int,int[],int,object> fnWayWin;
			public Action<int,int,int,object> fnScaWin;
		}
		public static int Vsl243_GetWin(ST_Vsl243_GetWin_Inf pInf, object arg) {
			int nPaySum;
			int[,] TBL_Sta = new int[5,pInf.nRow];
			{
				nPaySum = VslCmn_GetWin(TBL_Sta,
					pInf.nRow,
					pInf.fnScaPay,
					pInf.fnGetAtt,
					pInf.fnGetSta,
					pInf.fnScaWin,
					arg);
			}
			{
				int iAtt, nPay;
				int[] bWay = new int[5], iRow = new int[5], iSym = new int[5];
				bWay[0] = 0;
				for(iRow[0] = 0; iRow[0] < pInf.nRow; iRow[0]++) {
					iSym[0] = TBL_Sta[0,iRow[0]];
					iAtt = pInf.fnGetAtt.Invoke(iSym[0], arg);
					if(iAtt == VslAtt_Scatter) { continue; }
					if((iAtt & VslAtt_Wild) != 0) { iSym[0] = -1; }
					{
						bWay[1] = 0;
						for(iRow[1] = 0; iRow[1] < pInf.nRow; iRow[1]++) {
							iSym[1] = TBL_Sta[1,iRow[1]];
							iAtt = pInf.fnGetAtt.Invoke(iSym[1], arg);
							if(iAtt == VslAtt_Scatter) { continue; }
							if((iAtt & VslAtt_Wild) != 0) { iSym[1] = -1; }
							if(iSym[0] != iSym[1]) {
								if(iSym[0] != -1) {
									if(iSym[1] != -1) {
										continue;
									} else {
										iSym[1] = iSym[0];
									}
								}
							}
							{
								bWay[2] = 0;
								for(iRow[2] = 0; iRow[2] < pInf.nRow; iRow[2]++) {
									iSym[2] = TBL_Sta[2,iRow[2]];
									iAtt = pInf.fnGetAtt.Invoke(iSym[2], arg);
									if(iAtt == VslAtt_Scatter) { continue; }
									if((iAtt & VslAtt_Wild) != 0) { iSym[2] = -1; }
									if(iSym[1] != iSym[2]) {
										if(iSym[1] != -1) {
											if(iSym[2] != -1) {
												continue;
											} else {
												iSym[2] = iSym[1];
											}
										}
									}
									{
										bWay[3] = 0;
										for(iRow[3] = 0; iRow[3] < pInf.nRow; iRow[3]++) {
											iSym[3] = TBL_Sta[3,iRow[3]];
											iAtt = pInf.fnGetAtt.Invoke(iSym[3], arg);
											if(iAtt == VslAtt_Scatter) { continue; }
											if((iAtt & VslAtt_Wild) != 0) { iSym[3] = -1; }
											if(iSym[2] != iSym[3]) {
												if(iSym[2] != -1) {
													if(iSym[3] != -1) {
														continue;
													} else {
														iSym[3] = iSym[2];
													}
												}
											}
											{
												bWay[4] = 0;
												for(iRow[4] = 0; iRow[4] < pInf.nRow; iRow[4]++) {
													iSym[4] = TBL_Sta[4,iRow[4]];
													iAtt = pInf.fnGetAtt.Invoke(iSym[4], arg);
													if(iAtt == VslAtt_Scatter) { continue; }
													if((iAtt & VslAtt_Wild) != 0) { iSym[4] = -1; }
													if(iSym[3] != iSym[4]) {
														if(iSym[3] != -1) {
															if(iSym[4] != -1) {
																continue;
															} else {
																iSym[4] = iSym[3];
															}
														}
													}
													if(iSym[4] != -1) {
														nPay = pInf.fnWayPay.Invoke(iSym[4], 5, iRow, arg);
														pInf.fnWayWin.Invoke(iSym[4], 5, iRow, nPay, arg);
														nPaySum += nPay;
														bWay[4] = 1;
													}
												}
												if(bWay[4] != 0) {
													bWay[3] = 1;
												} else {
													if(iSym[3] != -1) {
														nPay = pInf.fnWayPay.Invoke(iSym[3], 4, iRow, arg);
														pInf.fnWayWin.Invoke(iSym[3], 4, iRow, nPay, arg);
														nPaySum += nPay;
														bWay[3] = 1;
													}
												}
											}
										}
										if(bWay[3] != 0) {
											bWay[2] = 1;
										} else {
											if(iSym[2] != -1) {
												nPay = pInf.fnWayPay.Invoke(iSym[2], 3, iRow, arg);
												pInf.fnWayWin.Invoke(iSym[2], 3, iRow, nPay, arg);
												nPaySum += nPay;
												bWay[2] = 1;
											}
										}
									}
								}
								if(bWay[2] != 0) {
									bWay[1] = 1;
								} else {
									if(iSym[1] != -1) {
										nPay = pInf.fnWayPay.Invoke(iSym[1], 2, iRow, arg);
										pInf.fnWayWin.Invoke(iSym[1], 2, iRow, nPay, arg);
										nPaySum += nPay;
										bWay[1] = 1;
									}
								}
							}
						}
						if(bWay[1] != 0) {
							bWay[0] = 1;
						} else {
							if(iSym[0] != -1) {
								nPay = pInf.fnWayPay.Invoke(iSym[0], 1, iRow, arg);
								pInf.fnWayWin.Invoke(iSym[0], 1, iRow, nPay, arg);
								nPaySum += nPay;
								bWay[0] = 1;
							}
						}
					}
				}
			}
			return nPaySum;
		}
		public static int VslRel_GetSensorCrossingCount_Linear(double oldpos, double vec, double snspos) {
			double pnewpos;
			return VslRel_GetSensorCrossingCount_Linear(oldpos, vec, snspos, out pnewpos);
		}
		public static int VslRel_GetSensorCrossingCount_Linear(double oldpos, double vec, double snspos, out double pnewpos) {
			int count = 0;
			double newpos = oldpos + vec;
			if(vec > 0.0) {
				if((oldpos < snspos) && (newpos >= snspos)) { count++; }
			} else if(vec < 0.0) {
				if((oldpos >= snspos) && (newpos < snspos)) { count--; }
			} else {
			}
			pnewpos = newpos;
			return count;
		}
		public static int VslRel_GetSensorCrossingCount_Circular(double oldpos, double vec, double snspos, double lbound, double ubound) {
			double pnewpos;
			return VslRel_GetSensorCrossingCount_Circular(oldpos, vec, snspos, lbound, ubound, out pnewpos);
		}
		public static int VslRel_GetSensorCrossingCount_Circular(double oldpos, double vec, double snspos, double lbound, double ubound, out double pnewpos) {
			int count = 0;
			double width = ubound - lbound;
			if(width <= 0.0) { throw new ApplicationException(); }
			oldpos -= lbound;
			oldpos = oldpos % width;
			if(oldpos < 0.0) { oldpos += width; }
			oldpos += lbound;
			snspos -= lbound;
			snspos = snspos % width;
			if(snspos < 0.0) { snspos += width; }
			snspos += lbound;
			{
				double newpos = oldpos;
				if(vec > 0.0) {
					do {
						oldpos = newpos;
						newpos = oldpos + vec;
						if((oldpos < snspos) && (newpos >= snspos)) { count++; }
						vec = newpos - ubound;
						if(vec >= 0.0) {
							newpos = lbound;
							if(newpos >= snspos) { count++; }
						}
					} while(vec > 0.0);
				} else if(vec < 0.0) {
					do {
						oldpos = newpos;
						newpos = oldpos + vec;
						if((oldpos >= snspos) && (newpos < snspos)) { count--; }
						vec = newpos - lbound;
						if(vec < 0.0) {
							newpos = ubound;
						}
					} while(vec < 0.0);
				}
				pnewpos = newpos;
			}
			return count;
		}
		public static int VslRel_GetSensorExceedingCount_Linear(double oldpos, double vec, double snspos) {
			double pnewpos;
			return VslRel_GetSensorExceedingCount_Linear(oldpos, vec, snspos, out pnewpos);
		}
		public static int VslRel_GetSensorExceedingCount_Linear(double oldpos, double vec, double snspos, out double pnewpos) {
			int count = 0;
			double newpos = oldpos + vec;
			if(vec > 0.0) {
				if(newpos >= snspos) { count++; }
			} else if(vec < 0.0) {
				if(newpos <  snspos) { count--; }
			} else {
			}
			pnewpos = newpos;
			return count;
		}
		public const int VslDef_ReelStrip	= 1;
		public const int VslDef_LineDef		= 2;
		public const int VslDef_PayTable	= 3;
		public static int VslDef_GetSymNum(VoidPtr pEnmKey, int _RegKey_VslSym) {
			return EnmDef_GetNum(pEnmKey, _RegKey_VslSym);
		}
		public static string VslDef_GetSymName(VoidPtr pEnmKey, int _RegKey_VslSym, int iVslSym) {
			return EnmDef_GetName(pEnmKey, _RegKey_VslSym, iVslSym);
		}
		public static string VslDef_GetSymDesc(VoidPtr pEnmKey, int _RegKey_VslSym, int iVslSym) {
			return EnmDef_GetDesc(pEnmKey, _RegKey_VslSym, iVslSym);
		}
		public static int VslDef_GetGmdNum(VoidPtr pEnmKey, int _RegKey_VslGmd) {
			return EnmDef_GetNum(pEnmKey, _RegKey_VslGmd);
		}
		public static string VslDef_GetGmdName(VoidPtr pEnmKey, int _RegKey_VslGmd, int iVslGmd) {
			return EnmDef_GetName(pEnmKey, _RegKey_VslGmd, iVslGmd);
		}
		public static int VslDef_GetRstNum(VoidPtr pVslKey, int iVslGmd) {
			int nReel = REG_num_blob_l(pVslKey, iVslGmd, VslDef_ReelStrip);
			if(nReel == 0) { throw new ApplicationException(); }
			return nReel;
		}
		public static int VslDef_GetRstLen(VoidPtr pVslKey, int iVslGmd, int iReel) {
			BytePtr pReelStrip = REG_get_blob_l(pVslKey, iVslGmd, VslDef_ReelStrip, iReel);
			if(!pReelStrip) { throw new ApplicationException(); }
			return REG_get_blob_size(pReelStrip);
		}
		public static int VslDef_GetRstSym(VoidPtr pVslKey, int iVslGmd, int iReel, int iPos) {
			BytePtr pReelStrip = REG_get_blob_l(pVslKey, iVslGmd, VslDef_ReelStrip, iReel);
			if(!pReelStrip) { throw new ApplicationException(); }
			if((uint)iPos >= (uint)REG_get_blob_size(pReelStrip)) { throw new ApplicationException(); }
			return pReelStrip[iPos];
		}
		public static int VslDef_GetRstSym_w(VoidPtr pVslKey, int iVslGmd, int iReel, int iPos) {
			int nLen = VslDef_GetRstLen(pVslKey, iVslGmd, iReel);
			if((iPos %= nLen) < 0) { iPos += nLen; }
			return VslDef_GetRstSym(pVslKey, iVslGmd, iReel, iPos);
		}
		public static int VslDef_GetLinNum(VoidPtr pVslKey, int iVslGmd) {
			int nLine = REG_num_blob_l(pVslKey, iVslGmd, VslDef_LineDef);
			if(nLine == 0) { throw new ApplicationException(); }
			return nLine;
		}
		public static int VslDef_GetLinRow(VoidPtr pVslKey, int iVslGmd, int iLine, int iReel) {
			BytePtr pLineDef = REG_get_blob_l(pVslKey, iVslGmd, VslDef_LineDef, iLine);
			if(!pLineDef) { throw new ApplicationException(); }
			if((uint)iReel >= (uint)REG_get_blob_size(pLineDef)) { throw new ApplicationException(); }
			return pLineDef[iReel];
		}
		public static int VslDef_GetMaxOak(VoidPtr pVslKey, int iVslGmd, int iVslSym) {
			UInt16Ptr pPayTable = REG_get_blob_l(pVslKey, iVslGmd, VslDef_PayTable, iVslSym);
			if(!pPayTable) { return 0; }
			return REG_get_blob_size(pPayTable) / sizeof(ushort);
		}
		public static int VslDef_GetPay(VoidPtr pVslKey, int iVslGmd, int iVslSym, int nOfAKind) {
			UInt16Ptr pPayTable = REG_get_blob_l(pVslKey, iVslGmd, VslDef_PayTable, iVslSym);
			if(!pPayTable) { throw new ApplicationException(); }
			if((uint)(nOfAKind - 1) >= ((uint)REG_get_blob_size(pPayTable) / sizeof(ushort))) { throw new ApplicationException(); }
			return Exp10_Decode(pPayTable[nOfAKind - 1]);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		private static bool ctype_subr(int c, ushort[] range) {
			int width, lo, i = 0;
			for(;;) {
				width = range[i++];
				lo = (byte)width;
				if((width >>= 8) == 0) { break; }
				c -= lo;
				if((uint)c < (uint)width) { break; }
				c -= width;
			}
			return width != 0;
		}
		public static bool isdigit(int c) {
			ushort[] range = new ushort[] {
						('0'-(0+0x0))|((1+'9')-'0')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isxdigit(int c) {
			ushort[] range = new ushort[] {
						('0'-(0+0x0))|((1+'9')-'0')<<8,
						('A'-(1+'9'))|((1+'F')-'A')<<8,
						('a'-(1+'F'))|((1+'f')-'a')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isupper(int c) {
			ushort[] range = new ushort[] {
						('A'-(0+0x00))|((1+'Z')-'A')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool islower(int c) {
			ushort[] range = new ushort[] {
						('a'-(0+0x00))|((1+'z')-'a')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isalpha(int c) {
			ushort[] range = new ushort[] {
						('A'-(0+0x0))|((1+'Z')-'A')<<8,
						('a'-(1+'Z'))|((1+'z')-'a')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isalnum(int c) {
			ushort[] range = new ushort[] {
						('0'-(0+0x0))|((1+'9')-'0')<<8,
						('A'-(1+'9'))|((1+'Z')-'A')<<8,
						('a'-(1+'Z'))|((1+'z')-'a')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool iscsymf(int c) {
			ushort[] range = new ushort[] {
						('A'-(0+0x0))|((1+'Z')-'A')<<8,
						('_'-(1+'Z'))|((1+'_')-'_')<<8,
						('a'-(1+'_'))|((1+'z')-'a')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool iscsym(int c) {
			ushort[] range = new ushort[] {
						('0'-(0+0x0))|((1+'9')-'0')<<8,
						('A'-(1+'9'))|((1+'Z')-'A')<<8,
						('_'-(1+'Z'))|((1+'_')-'_')<<8,
						('a'-(1+'_'))|((1+'z')-'a')<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool iscntrl(int c) {
			ushort[] range = new ushort[] {
						(0x00-(0+0x00))|((1+0x1F)-0x00)<<8,
						(0x7F-(1+0x1F))|((1+0x7F)-0x7F)<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isblank(int c) {
			ushort[] range = new ushort[] {
						(0x09-(0+0x00))|((1+0x09)-0x09)<<8,
						(0x20-(1+0x09))|((1+0x20)-0x20)<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isspace(int c) {
			ushort[] range = new ushort[] {
						(0x09-(0+0x00))|((1+0x0D)-0x09)<<8,
						(0x20-(1+0x0D))|((1+0x20)-0x20)<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isgraph(int c) {
			ushort[] range = new ushort[] {
						(0x21-(0+0x00))|((1+0x7E)-0x21)<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool isprint(int c) {
			ushort[] range = new ushort[] {
						(0x20-(0+0x00))|((1+0x7E)-0x20)<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool ispunct(int c) {
			ushort[] range = new ushort[] {
						(0x21-(0+0x00))|((1+0x2F)-0x21)<<8,
						(0x3A-(1+0x2F))|((1+0x40)-0x3A)<<8,
						(0x5B-(1+0x40))|((1+0x60)-0x5B)<<8,
						(0x7B-(1+0x60))|((1+0x7E)-0x7B)<<8,
			0};
			return ctype_subr(c, range);
		}
		public static bool ismbblead(int c) {
			ushort[] range = new ushort[] {
						(0x81-(0+0x00))|((1+0x9F)-0x81)<<8,
						(0xE0-(1+0x9F))|((1+0xFC)-0xE0)<<8,
			0};
			return ctype_subr((byte)c, range);
		}
		public static bool ismbbtrail(int c) {
			ushort[] range = new ushort[] {
						(0x40-(0+0x00))|((1+0x7E)-0x40)<<8,
						(0x80-(1+0x7E))|((1+0xFC)-0x80)<<8,
			0};
			return ctype_subr((byte)c, range);
		}
		public static int toupper(int c) {
			if(((c >= 'a') && (c <= 'z'))) {
				c -= ('a' - 'A');
			}
			return c;
		}
		public static int tolower(int c) {
			if(((c >= 'A') && (c <= 'Z'))) {
				c += ('a' - 'A');
			}
			return c;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class ght_hash_entry_t {
			public readonly LIST_ENTRY			le_iterator;
			public readonly LIST_ENTRY			le_bucket;
			public object					p_entry_data;
			public object					key_data;
			public ght_hash_entry_t() {
				le_iterator = new LIST_ENTRY(this);
				le_bucket   = new LIST_ENTRY(this);
			}
		}
		public struct ght_iterator_t {
			public LIST_ENTRY				le_next;
		}
		public class ght_hash_table_t {
			public bool					b_rehash;
			public int					i_size;
			public readonly LIST_ENTRY			le_iterator  = new LIST_ENTRY();
			public int					i_table_size { get { return le_bucket.Length; } }
			public LIST_ENTRY[]		le_bucket;
			public int					bucket_limit;
			public Action<object,object>	fn_bucket_free;
		}
		private static int ght_get_hash_value(ght_hash_table_t p_ht, object p_key_data) {
			return (int)((uint)p_key_data.GetHashCode() % (uint)p_ht.i_table_size);
		}
		private static ght_hash_entry_t ght_search_in_bucket(ght_hash_table_t p_ht, object p_key_data) {
			int l_key = ght_get_hash_value(p_ht, p_key_data);
			LIST_ENTRY list_head = p_ht.le_bucket[l_key];
			LIST_ENTRY list_entry = list_head.Flink;
			while(list_entry != list_head) {
				ght_hash_entry_t p_e = CONTAINING_RECORD<ght_hash_entry_t>(list_entry);
				if(p_e.key_data.Equals(p_key_data)) {
						RemoveEntryList(p_e.le_bucket);
						InsertHeadList(list_head, p_e.le_bucket);
					return p_e;
				}
				list_entry = list_entry.Flink;
			}
			return null;
		}
		private static void ght_check_rehash(ght_hash_table_t p_ht) {
			if(p_ht.b_rehash) {
				int i_size = p_ht.i_size;
				if(i_size == 0) { i_size = 1; }
				if((p_ht.i_table_size < (i_size / 2)) ||
				   (p_ht.i_table_size > (i_size * 2))) { ght_rehash(p_ht, i_size); }
			}
		}
		public static ght_hash_table_t ght_create(int i_table_size) {
			ght_hash_table_t p_ht;
			p_ht = new ght_hash_table_t();
			InitializeListHead(p_ht.le_iterator);
			ght_rehash(p_ht, i_table_size);
			return p_ht;
		}
		public static int ght_size(ght_hash_table_t p_ht) {
			return p_ht.i_size;
		}
		public static int ght_table_size(ght_hash_table_t p_ht) {
			return p_ht.i_table_size;
		}
		public static bool ght_insert(ght_hash_table_t p_ht, object p_entry_data, object p_key_data) {
			ght_hash_entry_t p_e;
			int l_key;
			if(p_entry_data == null) { throw new ApplicationException(); }
			if(ght_get(p_ht, p_key_data) != null) { return false; }
			l_key = ght_get_hash_value(p_ht, p_key_data);
			if(p_ht.bucket_limit != 0) {
				LIST_ENTRY list_head = p_ht.le_bucket[l_key];
				LIST_ENTRY list_entry = list_head.Flink;
				int i = p_ht.bucket_limit;
				while(list_entry != list_head) {
					p_e = CONTAINING_RECORD<ght_hash_entry_t>(list_entry);
					list_entry = list_entry.Flink;
					if(--i <= 0) {
						RemoveEntryList(p_e.le_iterator);
						RemoveEntryList(p_e.le_bucket);
						p_ht.fn_bucket_free?.Invoke(p_e.p_entry_data, p_e.key_data);
						p_ht.i_size--;
					}
				}
			}
			p_e = new ght_hash_entry_t();
			p_e.p_entry_data = p_entry_data;
			p_e.key_data = p_key_data;
			InsertTailList(p_ht.le_iterator, p_e.le_iterator);
			InsertHeadList(p_ht.le_bucket[l_key], p_e.le_bucket);
			p_ht.i_size++;
			ght_check_rehash(p_ht);
			return true;
		}
		public static object ght_get(ght_hash_table_t p_ht, object p_key_data) {
			ght_hash_entry_t p_e;
			p_e = ght_search_in_bucket(p_ht, p_key_data);
			return p_e?.p_entry_data;
		}
		public static object ght_replace(ght_hash_table_t p_ht, object p_entry_data, object p_key_data) {
			ght_hash_entry_t p_e;
			object p_old_data;
			p_e = ght_search_in_bucket(p_ht, p_key_data);
			if(p_e == null) { return null; }
			p_old_data = p_e.p_entry_data;
			p_e.p_entry_data = p_entry_data;
			return p_old_data;
		}
		public static object ght_remove(ght_hash_table_t p_ht, object p_key_data) {
			ght_hash_entry_t p_e;
			object p_old_data;
			p_e = ght_search_in_bucket(p_ht, p_key_data);
			if(p_e == null) { return null; }
			RemoveEntryList(p_e.le_iterator);
			RemoveEntryList(p_e.le_bucket);
			p_old_data = p_e.p_entry_data;
			p_ht.i_size--;
			ght_check_rehash(p_ht);
			return p_old_data;
		}
		public static object ght_first(ght_hash_table_t p_ht, out ght_iterator_t p_iterator, out object pp_key_data) {
			LIST_ENTRY list_head = p_ht.le_iterator;
			LIST_ENTRY list_entry = list_head.Flink;
			p_iterator.le_next = list_entry;
			return ght_next(p_ht, ref p_iterator, out pp_key_data);
		}
		public static object ght_next(ght_hash_table_t p_ht, ref ght_iterator_t p_iterator, out object pp_key_data) {
			LIST_ENTRY list_head = p_ht.le_iterator;
			LIST_ENTRY list_entry = p_iterator.le_next;
			if(list_entry != list_head) {
				ght_hash_entry_t p_e = CONTAINING_RECORD<ght_hash_entry_t>(list_entry);
				p_iterator.le_next = list_entry.Flink;
				pp_key_data = p_e.key_data;
				return p_e.p_entry_data;
			}
			pp_key_data = null;
			return null;
		}
		public static void ght_set_rehash(ght_hash_table_t p_ht, bool b_rehash) {
			p_ht.b_rehash = b_rehash;
		}
		public static void ght_rehash(ght_hash_table_t p_ht, int i_table_size) {
			LIST_ENTRY list_head = p_ht.le_iterator;
			LIST_ENTRY list_entry = list_head.Flink;
			int i, l_key;
			if(i_table_size < 1) { i_table_size = 1; }
			p_ht.le_bucket = new LIST_ENTRY[i_table_size];
			for(i = 0; i < i_table_size; i++) {
				p_ht.le_bucket[i] = new LIST_ENTRY();
				InitializeListHead(p_ht.le_bucket[i]);
			}
			while(list_entry != list_head) {
				ght_hash_entry_t p_e = CONTAINING_RECORD<ght_hash_entry_t>(list_entry);
				l_key = ght_get_hash_value(p_ht, p_e.key_data);
				InsertHeadList(p_ht.le_bucket[l_key], p_e.le_bucket);
				list_entry = list_entry.Flink;
			}
		}
		public static void ght_set_bounded_buckets(ght_hash_table_t p_ht, int bucket_limit, Action<object,object> fn_bucket_free) {
			if((bucket_limit < 0) ||
			  ((bucket_limit == 0) && (fn_bucket_free != null))) { throw new ApplicationException(); }
			p_ht.bucket_limit = bucket_limit;
			p_ht.fn_bucket_free = fn_bucket_free;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public const int G_PRE_ORDER		= 1;
		public const int G_POST_ORDER		= 2;
		public const int G_LEVEL_ORDER		= 3;
		public const int G_TRAVERSE_LEAVES	= (1<<0);
		public const int G_TRAVERSE_NON_LEAVES	= (1<<1);
		public const int G_TRAVERSE_ALL		= (G_TRAVERSE_LEAVES|G_TRAVERSE_NON_LEAVES);
		public const int G_TRAVERSE_MASK	= G_TRAVERSE_ALL;
		public const int G_TRAVERSE_LEAFS	= G_TRAVERSE_LEAVES;
		public const int G_TRAVERSE_NON_LEAFS	= G_TRAVERSE_NON_LEAVES;
		public static bool G_NODE_IS_ROOT(GNode node) {
			return (node.parent == null) &&
			       (node.prev   == null) &&
			       (node.next   == null);
		}
		public static bool G_NODE_IS_LEAF(GNode node) {
			return node.children == null;
		}
		public class GNode {
			public object		data;
			public GNode		next;
			public GNode		prev;
			public GNode		parent;
			public GNode		children;
		}
		public static GNode g_node_new(object data) {
			GNode node = new GNode();
			node.data = data;
			return node;
		}
		public static GNode g_node_copy(GNode node) {
			return g_node_copy_deep(node, null, null);
		}
		public static GNode g_node_copy_deep(GNode node, Func<object,object,object> copy_func, object data) {
			object new_data;
			GNode new_node, child, new_child;
			new_data = node.data;
			if(copy_func != null) { new_data = copy_func.Invoke(new_data, data); }
			new_node = g_node_new(new_data);
			for(child = g_node_first_child(node);
			    child != null;
			    child = g_node_next_sibling(child)) {
				new_child = g_node_copy_deep(child, copy_func, data);
				g_node_append(new_node, new_child);
			}
			return new_node;
		}
		public static GNode g_node_insert(GNode parent, int position, GNode node) {
			return g_node_insert_before(parent, g_node_nth_child(parent, position), node);
		}
		public static GNode g_node_insert_before(GNode parent, GNode sibling, GNode node) {
			node.parent = parent;
			if(sibling != null) {
				if(sibling.prev != null) {
					node.prev = sibling.prev;
					node.prev.next = node;
				} else {
					parent.children = node;
				}
				node.next = sibling;
				sibling.prev = node;
			} else {
				if(parent.children != null) {
					sibling = g_node_last_child(parent);
					node.prev = sibling;
					sibling.next = node;
				} else {
					parent.children = node;
				}
			}
			return node;
		}
		public static GNode g_node_insert_after(GNode parent, GNode sibling, GNode node) {
			node.parent = parent;
			if(sibling != null) {
				if(sibling.next != null) {
					sibling.next.prev = node;
				}
				node.next = sibling.next;
				node.prev = sibling;
				sibling.next = node;
			} else {
				if(parent.children != null) {
					node.next = parent.children;
					parent.children.prev = node;
				}
				parent.children = node;
			}
			return node;
		}
		public static GNode g_node_append(GNode parent, GNode node) {
			return g_node_insert_before(parent, null, node);
		}
		public static GNode g_node_prepend(GNode parent, GNode node) {
			return g_node_insert_before(parent, parent.children, node);
		}
		public static GNode g_node_insert_data(GNode parent, int position, object data) {
			return g_node_insert(parent, position, g_node_new(data));
		}
		public static GNode g_node_insert_data_after(GNode parent, GNode sibling, object data) {
			return g_node_insert_after(parent, sibling, g_node_new(data));
		}
		public static GNode g_node_insert_data_before(GNode parent, GNode sibling, object data) {
			return g_node_insert_before(parent, sibling, g_node_new(data));
		}
		public static GNode g_node_append_data(GNode parent, object data) {
			return g_node_insert_before(parent, null, g_node_new(data));
		}
		public static GNode g_node_prepend_data(GNode parent, object data) {
			return g_node_prepend(parent, g_node_new(data));
		}
		public static void g_node_reverse_children(GNode node) {
			GNode child = node.children;
			while(child != null) {
				node.children = child;
				                child = node.children.next;
				                        node.children.next = node.children.prev;
				                                             node.children.prev = child;
			}
		}
		private static bool g_node_traverse_pre_or_post_order(GNode node, int order, int flags, int depth, Func<GNode,object,bool> func, object data) {
			if(node.children != null) {
				if(order == G_PRE_ORDER) {
					if(((flags & G_TRAVERSE_NON_LEAVES) != 0) && func.Invoke(node, data)) { return true; }
				}
				if(--depth != 0) {
					GNode child = node.children;
					while(child != null) {
						GNode current = child;
						child = child.next;
						if(g_node_traverse_pre_or_post_order(current, order, flags, depth, func, data)) { return true; }
					}
				}
				if(order == G_POST_ORDER) {
					if(((flags & G_TRAVERSE_NON_LEAVES) != 0) && func.Invoke(node, data)) { return true; }
				}
			} else {
				if(((flags & G_TRAVERSE_LEAVES) != 0) && func.Invoke(node, data)) { return true; }
			}
			return false;
		}
		private static bool g_node_traverse_level(GNode node, int flags, int level, Func<GNode,object,bool> func, object data) {
			if(--level != 0) {
				node = node.children;
				while(node != null) {
					GNode current = node;
					node = node.next;
					if(g_node_traverse_level(current, flags, level, func, data)) { return true; }
				}
			} else {
				if(node.children != null) {
					if(((flags & G_TRAVERSE_NON_LEAVES) != 0) && func.Invoke(node, data)) { return true; }
				} else {
					if(((flags & G_TRAVERSE_LEAVES) != 0) && func.Invoke(node, data)) { return true; }
				}
			}
			return false;
		}
		public static void g_node_traverse(GNode root, int order, int flags, int depth, Func<GNode,object,bool> func, object data) {
			switch(order) {
			default:throw new ApplicationException();
			case G_PRE_ORDER:
			case G_POST_ORDER:
				{
					if(depth != 0) {
						g_node_traverse_pre_or_post_order(root, order, flags, depth, func, data);
					}
				}
				break;
			case G_LEVEL_ORDER:
				{
					int level, height = g_node_max_height(root);
					if((uint)depth > (uint)height) { depth = height; }
					for(level = 1; level <= depth; level++) {
						if(g_node_traverse_level(root, flags, level, func, data)) { break; }
					}
				}
				break;
			}
		}
		public static void g_node_children_foreach(GNode node, int flags, Action<GNode,object> func, object data) {
			node = node.children;
			while(node != null) {
				GNode current = node;
				node = node.next;
				if(G_NODE_IS_LEAF(current)) {
					if((flags & G_TRAVERSE_LEAVES) != 0) { func.Invoke(current, data); }
				} else {
					if((flags & G_TRAVERSE_NON_LEAVES) != 0) { func.Invoke(current, data); }
				}
			}
		}
		public static GNode g_node_get_root(GNode node) {
			while(node.parent != null) {
				node = node.parent;
			}
			return node;
		}
		private static bool g_node_find_func(GNode node, object data) {
			object[] d = (object[])data;
			if(d[0] == node.data) {
				d[1] = node;
				return true;
			} else {
				return false;
			}
		}
		public static GNode g_node_find(GNode root, int order, int flags, object data) {
			object[] d = new object[] { data, null };
			g_node_traverse(root, order, flags, -1, g_node_find_func, d);
			return (GNode)d[1];
		}
		public static GNode g_node_find_child(GNode node, int flags, object data) {
			node = node.children;
			while(node != null) {
				if(node.data == data) {
					if(G_NODE_IS_LEAF(node)) {
						if((flags & G_TRAVERSE_LEAVES) != 0) { return node; }
					} else {
						if((flags & G_TRAVERSE_NON_LEAVES) != 0) { return node; }
					}
				}
				node = node.next;
			}
			return null;
		}
		public static int g_node_child_index(GNode node, object data) {
			int n = 0;
			node = node.children;
			while(node != null) {
				if(node.data == data) { return n; }
				n++;
				node = node.next;
			}
			return -1;
		}
		public static int g_node_child_position(GNode node, GNode child) {
			int n = 0;
			node = node.children;
			while(node != null) {
				if(node == child) { return n; }
				n++;
				node = node.next;
			}
			return -1;
		}
		public static GNode g_node_first_child(GNode node) {
			return node?.children;
		}
		public static GNode g_node_last_child(GNode node) {
			return (node.children != null) ? g_node_last_sibling(node.children) : null;
		}
		public static GNode g_node_nth_child(GNode node, int n) {
			node = node.children;
			while(node != null) {
				if(n-- == 0) { break; }
				node = node.next;
			}
			return node;
		}
		public static GNode g_node_first_sibling(GNode node) {
			while(node.prev != null) { node = node.prev; }
			return node;
		}
		public static GNode g_node_next_sibling(GNode node) {
			return node?.next;
		}
		public static GNode g_node_prev_sibling(GNode node) {
			return node?.prev;
		}
		public static GNode g_node_last_sibling(GNode node) {
			while(node.next != null) { node = node.next; }
			return node;
		}
		public static int g_node_depth(GNode node) {
			int depth = 0;
			while(node != null) {
				depth++;
				node = node.parent;
			}
			return depth;
		}
		private static int g_node_count_func(GNode node, int flags, int n) {
			node = node.children;
			if(node != null) {
				if((flags & G_TRAVERSE_NON_LEAVES) != 0) { n++; }
				do {
					n = g_node_count_func(node, flags, n);
					node = node.next;
				} while(node != null);
			} else {
				if((flags & G_TRAVERSE_LEAVES) != 0) { n++; }
			}
			return n;
		}
		public static int g_node_n_nodes(GNode root, int flags) {
			return g_node_count_func(root, flags, 0);
		}
		public static int g_node_n_children(GNode node) {
			int n = 0;
			node = node.children;
			while(node != null) {
				n++;
				node = node.next;
			}
			return n;
		}
		public static bool g_node_is_ancestor(GNode node, GNode descendant) {
			while(descendant != null) {
				descendant = descendant.parent;
				if(descendant == node) { return true; }
			}
			return false;
		}
		public static int g_node_max_height(GNode root) {
			int max_height = 0;
			if(root != null) {
				GNode child = root.children;
				while(child != null) {
					int tmp_height = g_node_max_height(child);
					if(tmp_height > max_height) { max_height = tmp_height; }
					child = child.next;
				}
				max_height++;
			}
			return max_height;
		}
		public static void g_node_unlink(GNode node) {
			if(node.next != null) {
				node.next.prev = node.prev;
			}
			if(node.prev != null) {
				node.prev.next = node.next;
			} else if(node.parent != null) {
				node.parent.children = node.next;
			}
			node.next   = null;
			node.prev   = null;
			node.parent = null;
		}
		private static void g_nodes_free(GNode node) {
			while(node != null) {
				GNode current = node;
				node = node.next;
					g_nodes_free(current.children);
				current.children = null;
			}
		}
		public static void g_node_destroy(GNode root) {
				g_node_unlink(root);
			g_nodes_free(root);
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class GSList {
			public object		data;
			public GSList		next;
		}
		private static GSList g_slist_alloc_subr(object data, GSList next) {
			GSList new_list = new GSList();
			new_list.data = data;
			new_list.next = next;
			return new_list;
		}
		public static GSList g_slist_alloc() {
			return g_slist_alloc_subr(null, null);
		}
		public static GSList g_slist_append(GSList list, object data) {
			GSList new_list = g_slist_alloc_subr(data, null);
			if(list != null) {
				GSList last = g_slist_last(list);
				last.next = new_list;
			} else {
				list = new_list;
			}
			return list;
		}
		public static GSList g_slist_prepend(GSList list, object data) {
			return g_slist_alloc_subr(data, list);
		}
		public static GSList g_slist_insert(GSList list, object data, int position) {
			if((list == null) || (position == 0)) {
				list = g_slist_prepend(list, data);
			} else {
				GSList prev = g_slist_nth(list, position - 1);
				if(prev != null) {
					GSList new_list = g_slist_alloc_subr(data, prev.next);
					prev.next = new_list;
				} else {
					list = g_slist_append(list, data);
				}
			}
			return list;
		}
		public static GSList g_slist_insert_before(GSList slist, GSList sibling, object data) {
			int i = g_slist_position(slist, sibling);
			slist = g_slist_insert(slist, data, i);
			return slist;
		}
		public static GSList g_slist_insert_sorted(GSList list, object data, Func<object,object,int> compare_func) {
			return g_slist_insert_sorted_with_data(list, data, delegate(object a, object b, object user_data) { return compare_func.Invoke(a, b); }, null);
		}
		public static GSList g_slist_insert_sorted_with_data(GSList list, object data, Func<object,object,object,int> compare_func, object user_data) {
			GSList node = list;
			while((node != null) && (compare_func.Invoke(data, node.data, user_data) > 0)) {
				node = node.next;
			}
			return g_slist_insert_before(list, node, data);
		}
		public static GSList g_slist_remove(GSList list, object data) {
			GSList link_ = g_slist_find(list, data);
			if(link_ != null) {
				list = g_slist_delete_link(list, link_);
			}
			return list;
		}
		public static GSList g_slist_remove_all(GSList list, object data) {
			for(;;) {
				GSList link_ = g_slist_find(list, data);
				if(link_ == null) { break; }
				list = g_slist_delete_link(list, link_);
			}
			return list;
		}
		public static GSList g_slist_remove_link(GSList list, GSList link_) {
			if(list == link_) {
				list = list.next;
			} else {
				GSList node = list, prev;
				do {
					if(node == null) { throw new ApplicationException(); }
					prev = node;
					node = node.next;
				} while(node != link_);
				prev.next = link_.next;
			}
			link_.next = null;
			return list;
		}
		public static GSList g_slist_delete_link(GSList list, GSList link_) {
			list = g_slist_remove_link(list, link_);
			g_slist_free_1(link_);
			return list;
		}
		public static void g_slist_free(GSList list) {
			g_slist_free_full(list, null);
		}
		public static void g_slist_free_full(GSList list, Action<object> free_func_) {
			while(list != null) {
				free_func_?.Invoke(list.data);
				list = g_slist_delete_link(list, list);
			}
		}
		public static void g_slist_free_1(GSList list) {
		}
		public static int g_slist_length(GSList list) {
			int length = 0;
			while(list != null) {
				list = list.next;
				length++;
			}
			return length;
		}
		public static GSList g_slist_copy(GSList list) {
			return g_slist_copy_deep(list, null, null);
		}
		public static GSList g_slist_copy_deep(GSList list, Func<object,object,object> copy_func, object user_data) {
			GSList new_list = null;
			while(list != null) {
				object data = list.data;
				if(copy_func != null) { data = copy_func.Invoke(data, user_data); }
				new_list = g_slist_prepend(new_list, data);
				list = list.next;
			}
			return g_slist_reverse(new_list);
		}
		public static GSList g_slist_reverse(GSList list) {
			GSList prev = null;
			while(list != null) {
				GSList next = list.next;
				list.next = prev;
				prev = list;
				list = next;
			}
			return prev;
		}
		public static GSList g_slist_sort(GSList list, Func<object,object,int> compare_func) {
			return g_slist_sort_with_data(list, delegate(object a, object b, object user_data) { return compare_func.Invoke(a, b); }, null);
		}
		public static GSList g_slist_sort_with_data(GSList list, Func<object,object,object,int> compare_func, object user_data) {
			GSList list1, list2, node1, node2, pnext;
			list1 = null;
			list2 = null;
			for(;;) {
				if(list == null) { break; }
				node1 = list;
				list = list.next;
				node1.next = list1;
				list1 = node1;
				if(list == null) { break; }
				node2 = list;
				list = list.next;
				node2.next = list2;
				list2 = node2;
			}
			if(list2 != null) {
				list1 = g_slist_sort_with_data(list1, compare_func, user_data);
				list2 = g_slist_sort_with_data(list2, compare_func, user_data);
			}
			list = pnext = g_slist_alloc();
			for(;;) {
				node1 = list1;
				if(node1 != null) {
					list1 = node1.next;
					node1.next = null;
				}
				node2 = list2;
				if(node2 != null) {
					list2 = node2.next;
					node2.next = null;
				}
				if(node1 != null) {
					if(node2 != null) {
						if(compare_func.Invoke(node1.data, node2.data, user_data) <= 0) {
							pnext.next = node1;
							pnext = node1;
							node2.next = list2;
							list2 = node2;
						} else {
							pnext.next = node2;
							pnext = node2;
							node1.next = list1;
							list1 = node1;
						}
					} else {
						pnext.next = node1;
						pnext = node1;
					}
				} else {
					if(node2 != null) {
						pnext.next = node2;
						pnext = node2;
					} else {
						break;
					}
				}
			}
			return list.next;
		}
		public static GSList g_slist_concat(GSList list1, GSList list2) {
			if(list2 != null) {
				if(list1 != null) {
					g_slist_last(list1).next = list2;
				} else {
					list1 = list2;
				}
			}
			return list1;
		}
		public static void g_slist_foreach(GSList list, Action<object,object> func, object user_data) {
			while(list != null) {
				GSList next = list.next;
				func.Invoke(list.data, user_data);
				list = next;
			}
		}
		public static GSList g_slist_last(GSList list) {
			GSList last = null;
			while(list != null) {
				last = list;
				list = list.next;
			}
			return last;
		}
		public static GSList g_slist_nth(GSList list, int n) {
			while((list != null) && (n-- != 0)) {
				list = list.next;
			}
			return list;
		}
		public static object g_slist_nth_data(GSList list, int n) {
			list = g_slist_nth(list, n);
			return list?.data;
		}
		public static GSList g_slist_find(GSList list, object data) {
			while((list != null) && (list.data != data)) {
				list = list.next;
			}
			return list;
		}
		public static GSList g_slist_find_custom(GSList list, object data, Func<object,object,int> compare_func) {
			while((list != null) && (compare_func.Invoke(list.data, data) != 0)) {
				list = list.next;
			}
			return list;
		}
		public static int g_slist_position(GSList list, GSList llink) {
			int i = 0;
			while(list != null) {
				if(list == llink) { return i; }
				list = list.next;
				i++;
			}
			return -1;
		}
		public static int g_slist_index(GSList list, object data) {
			int i = 0;
			while(list != null) {
				if(list.data == data) { return i; }
				list = list.next;
				i++;
			}
			return -1;
		}
	}
}
namespace com.Company {
	public static partial class Library {
		public class GTree {
			public GTreeNode						root;
			public Func<object,object,object,int>	key_compare_func;
			public object							key_compare_data;
			public Action<object>					key_destroy_func;
			public Action<object>					value_destroy_func;
			public int							nnodes;
			public int							ref_count;
		}
		public class GTreeNode {
			public int		height;
			public object		key;
			public object		value;
			public GTreeNode	lst;
			public GTreeNode	rst;
		}
		private class GTreeTrio {
			public GTree		tree;
			public object		key;
			public object		value;
			public int		mode;
			public bool		found;
		}
		private static GTreeNode g_tree_node_new(object key, object value) {
			GTreeNode t = new GTreeNode();
			t.height = 1;
			t.key    = key;
			t.value  = value;
			return t;
		}
		private static int g_tree_node_height(GTreeNode t) {
			return (t != null) ? t.height : 0;
		}
		private static int g_tree_node_bias(GTreeNode t) {
			return g_tree_node_height(t.lst) - g_tree_node_height(t.rst);
		}
		private static void g_tree_node_setHeight(GTreeNode t) {
			int lh = g_tree_node_height(t.lst);
			int rh = g_tree_node_height(t.rst);
			t.height = 1 + max(lh, rh);
		}
		private static GTreeNode g_tree_node_rotateL(GTree tree, GTreeNode t) {
			GTreeNode u = t.rst;
			GTreeNode v = u.lst;
			u.lst = t;
			t.rst = v;
			g_tree_node_setHeight(t);
			g_tree_node_setHeight(u);
			return u;
		}
		private static GTreeNode g_tree_node_rotateR(GTree tree, GTreeNode t) {
			GTreeNode u = t.lst;
			GTreeNode v = u.rst;
			u.rst = t;
			t.lst = v;
			g_tree_node_setHeight(t);
			g_tree_node_setHeight(u);
			return u;
		}
		private static GTreeNode g_tree_node_rotateLR(GTree tree, GTreeNode t) {
			t.lst = g_tree_node_rotateL(tree, t.lst);
			return   g_tree_node_rotateR(tree, t);
		}
		private static GTreeNode g_tree_node_rotateRL(GTree tree, GTreeNode t) {
			t.rst = g_tree_node_rotateR(tree, t.rst);
			return   g_tree_node_rotateL(tree, t);
		}
		static GTreeNode g_tree_node_balanceL(GTreeTrio aux, GTreeNode t) {
			int bias = g_tree_node_bias(t);
#if     DEBUG
			if((bias > 2) || (bias < -1)) { throw new ApplicationException(); }
#endif
			if(bias == 2) {
				bias = g_tree_node_bias(t.lst);
#if     DEBUG
				if((bias > 1) || (bias < -1)) { throw new ApplicationException(); }
#endif
				if(bias >= 0) {
					t = g_tree_node_rotateR(aux.tree, t);
				} else {
					t = g_tree_node_rotateLR(aux.tree, t);
				}
			} else {
				g_tree_node_setHeight(t);
			}
			return t;
		}
		private static GTreeNode g_tree_node_balanceR(GTreeTrio aux, GTreeNode t) {
			int bias = g_tree_node_bias(t);
#if     DEBUG
			if((bias < -2) || (bias > 1)) { throw new ApplicationException(); }
#endif
			if(bias == -2) {
				bias = g_tree_node_bias(t.rst);
#if     DEBUG
				if((bias < -1) || (bias > 1)) { throw new ApplicationException(); }
#endif
				if(bias <= 0) {
					t = g_tree_node_rotateL(aux.tree, t);
				} else {
					t = g_tree_node_rotateRL(aux.tree, t);
				}
			} else {
				g_tree_node_setHeight(t);
			}
			return t;
		}
		private static GTreeNode g_tree_node_balanceLi(GTreeTrio aux, GTreeNode t) { return g_tree_node_balanceL(aux, t); }
		private static GTreeNode g_tree_node_balanceRi(GTreeTrio aux, GTreeNode t) { return g_tree_node_balanceR(aux, t); }
		private static GTreeNode g_tree_node_balanceLd(GTreeTrio aux, GTreeNode t) { return g_tree_node_balanceR(aux, t); }
		private static GTreeNode g_tree_node_balanceRd(GTreeTrio aux, GTreeNode t) { return g_tree_node_balanceL(aux, t); }
		private static GTreeNode g_tree_insert_subr2(GTreeTrio aux, GTreeNode t) {
			if(t != null) {
				int diff = aux.tree.key_compare_func.Invoke(aux.key, t.key, aux.tree.key_compare_data);
				if(diff < 0) {
					t.lst = g_tree_insert_subr2(aux, t.lst);
					t = g_tree_node_balanceLi(aux, t);
				} else if(diff > 0) {
					t.rst = g_tree_insert_subr2(aux, t.rst);
					t = g_tree_node_balanceRi(aux, t);
				} else {
					switch(aux.mode) {
					default:throw new ApplicationException();
					case 0:
						aux.tree.key_destroy_func.Invoke(aux.key);
						break;
					case 1:
						aux.tree.key_destroy_func.Invoke(t.key);
						t.key = aux.key;
						break;
					}
					aux.tree.value_destroy_func.Invoke(t.value);
					t.value = aux.value;
				}
			} else {
				t = g_tree_node_new(aux.key, aux.value);
				aux.tree.nnodes++;
#if     DEBUG
				if(aux.tree.nnodes <= 0) { throw new ApplicationException(); }
#endif
			}
			return t;
		}
		private static void g_tree_insert_subr1(GTree tree, object key, object value, int mode) {
			GTreeTrio aux = new GTreeTrio() { tree = tree, key = key, value = value, mode = mode };
			tree.root = g_tree_insert_subr2(aux, tree.root);
		}
		private static GTreeNode g_tree_remove_subr3(GTreeTrio aux, GTreeNode t) {
			if(t.rst != null) {
				t.rst = g_tree_remove_subr3(aux, t.rst);
				t = g_tree_node_balanceRd(aux, t);
			} else {
				GTreeNode u = t.lst;
				aux.key   = t.key;
				aux.value = t.value;
				aux.tree.nnodes--;
#if     DEBUG
				if(aux.tree.nnodes < 0) { throw new ApplicationException(); }
#endif
				t = u;
			}
			return t;
		}
		private static GTreeNode g_tree_remove_subr2(GTreeTrio aux, GTreeNode t) {
			if(t != null) {
				int diff = aux.tree.key_compare_func.Invoke(aux.key, t.key, aux.tree.key_compare_data);
				if(diff < 0) {
					t.lst = g_tree_remove_subr2(aux, t.lst);
					t = g_tree_node_balanceLd(aux, t);
				} else if(diff > 0) {
					t.rst = g_tree_remove_subr2(aux, t.rst);
					t = g_tree_node_balanceRd(aux, t);
				} else {
					if(t.lst != null) {
						switch(aux.mode) {
						default:throw new ApplicationException();
						case 2:
							aux.tree.key_destroy_func.Invoke(t.key);
							aux.tree.value_destroy_func.Invoke(t.value);
							break;
						case 3:
							break;
						}
						t.lst = g_tree_remove_subr3(aux, t.lst);
						t.key = aux.key;
						t.value = aux.value;
						t = g_tree_node_balanceLd(aux, t);
					} else {
						GTreeNode u = t.rst;
						switch(aux.mode) {
						default:throw new ApplicationException();
						case 2:
							aux.tree.key_destroy_func.Invoke(t.key);
							aux.tree.value_destroy_func.Invoke(t.value);
							break;
						case 3:
							break;
						}
						aux.tree.nnodes--;
#if     DEBUG
						if(aux.tree.nnodes < 0) { throw new ApplicationException(); }
#endif
						t = u;
					}
					aux.found = true;
				}
			} else {
			}
			return t;
		}
		private static bool g_tree_remove_subr1(GTree tree, object key, int mode) {
			GTreeTrio aux = new GTreeTrio() { tree = tree, key = key, value = null, mode = mode };
			tree.root = g_tree_remove_subr2(aux, tree.root);
			return aux.found;
		}
		private static void g_tree_clear(GTree tree) {
			GTreeNode t;
			while((t = tree.root) != null) {
				g_tree_remove(tree, t.key);
			}
#if     DEBUG
			if(tree.nnodes != 0) { throw new ApplicationException(); }
#endif
		}
		public static GTree g_tree_new(Func<object,object,int> key_compare_func) {
			return g_tree_new_with_data(delegate(object a, object b, object user_data) { return key_compare_func(a, b); }, null);
		}
		public static GTree g_tree_ref(GTree tree) {
			tree.ref_count++;
			return tree;
		}
		public static void g_tree_unref(GTree tree) {
			if(--tree.ref_count == 0) {
				g_tree_clear(tree);
			}
		}
		public static GTree g_tree_new_with_data(Func<object,object,object,int> key_compare_func, object key_compare_data) {
			return g_tree_new_full(key_compare_func, key_compare_data, null, null);
		}
		public static GTree g_tree_new_full(Func<object,object,object,int> key_compare_func, object key_compare_data, Action<object> key_destroy_func, Action<object> value_destroy_func) {
			GTree tree = new GTree();
			tree.key_compare_func   = key_compare_func;
			tree.key_destroy_func   = key_destroy_func   ?? delegate(object data) { };
			tree.value_destroy_func = value_destroy_func ?? delegate(object data) { };
			tree.key_compare_data   = key_compare_data;
			tree.ref_count          = 1;
			return tree;
		}
		public static void g_tree_insert(GTree tree, object key, object value) {
			g_tree_insert_subr1(tree, key, value, 0);
		}
		public static void g_tree_replace(GTree tree, object key, object value) {
			g_tree_insert_subr1(tree, key, value, 1);
		}
		public static int g_tree_nnodes(GTree tree) {
			return tree.nnodes;
		}
		public static int g_tree_height(GTree tree) {
			return g_tree_node_height(tree.root);
		}
		public static object g_tree_lookup(GTree tree, object key) {
			object orig_key, value;
			return g_tree_lookup_extended(tree, key, out orig_key, out value) ? value : null;
		}
		public static bool g_tree_lookup_extended(GTree tree, object lookup_key, out object orig_key, out object value) {
			orig_key = value = null;
			GTreeNode t = tree.root;
			while(t != null) {
				int diff = tree.key_compare_func.Invoke(lookup_key, t.key, tree.key_compare_data);
				if(diff < 0) {
					t = t.lst;
				} else if(diff > 0) {
					t = t.rst;
				} else {
					orig_key = t.key;
					value    = t.value;
					return true;
				}
			}
			return false;
		}
		private static bool g_tree_foreach_subr(GTree tree, GTreeNode t, Func<object,object,object,bool> func, object user_data) {
			if(t != null) {
				if(g_tree_foreach_subr(tree, t.lst, func, user_data)) { return true; }
				if(func.Invoke(t.key, t.value, user_data)) { return true; }
				if(g_tree_foreach_subr(tree, t.rst, func, user_data)) { return true; }
			}
			return false;
		}
		public static void g_tree_foreach(GTree tree, Func<object,object,object,bool> func, object user_data) {
			g_tree_foreach_subr(tree, tree.root, func, user_data);
		}
		public static object g_tree_search(GTree tree, Func<object,object,int> search_func, object user_data) {
			GTreeNode t = tree.root;
			while(t != null) {
				int diff = search_func.Invoke(t.key, user_data);
				if(diff < 0) {
					t = t.lst;
				} else if(diff > 0) {
					t = t.rst;
				} else {
					return t.value;
				}
			}
			return null;
		}
		public static bool g_tree_remove(GTree tree, object key) {
			return g_tree_remove_subr1(tree, key, 2);
		}
		public static bool g_tree_steal(GTree tree, object key) {
			return g_tree_remove_subr1(tree, key, 3);
		}
		public static void g_tree_destroy(GTree tree) {
			g_tree_clear(tree);
			g_tree_unref(tree);
		}
		public struct GTreeIteratorNP {
			public Stack<GTreeNode>		stack;
		}
		private static void g_tree_push(ref GTreeIteratorNP iter, GTreeNode t) {
			if(t == null) { throw new ApplicationException(); }
			iter.stack.Push(t);
		}
		private static GTreeNode g_tree_pop(ref GTreeIteratorNP iter) {
			GTreeNode t;
			if(iter.stack.Count == 0) { return null; }
			t = iter.stack.Pop();
			if(t == null) { throw new ApplicationException(); }
			return t;
		}
		public static bool g_tree_first_np(GTree tree, out GTreeIteratorNP iter, out object _key, out object _value) {
			iter.stack = new Stack<GTreeNode>();
			return g_tree_next_np(tree, ref iter, out _key, out _value);
		}
		public static bool g_tree_next_np(GTree tree, ref GTreeIteratorNP iter, out object _key, out object _value) {
			_key = _value = null;
			GTreeNode t, u;
			t = g_tree_pop(ref iter);
			if(t == null) {
				u = tree.root;
				if(u != null) {
					for(;;) {
						g_tree_push(ref iter, u);
						if(u.lst == null) { break; }
						u = u.lst;
					}
				}
			} else {
				u = t.rst;
				if(u != null) {
					g_tree_push(ref iter, t);
					for(;;) {
						g_tree_push(ref iter, u);
						if(u.lst == null) { break; }
						u = u.lst;
					}
				} else {
					for(;;) {
						u = g_tree_pop(ref iter);
						if(u == null) {
							GTreeNode dummy = new GTreeNode();
							g_tree_push(ref iter, dummy);
							break;
						}
						if(t == u.lst) {
							g_tree_push(ref iter, u);
							break;
						}
						if(t != u.rst) { throw new ApplicationException(); }
						t = u;
					}
				}
			}
			if(u != null) {
				_key   = u.key;
				_value = u.value;
			}
			return u != null;
		}
	}
}
