OSDN Git Service

TCP/IP開始・停止の強化
authornyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Sun, 9 Jun 2013 13:37:59 +0000 (13:37 +0000)
committernyatla <nyatla@47198e57-cb75-475f-84c4-a814cd6f29e0>
Sun, 9 Jun 2013 13:37:59 +0000 (13:37 +0000)
コンフィギュレーションの拡張

git-svn-id: http://svn.osdn.jp/svnroot/mimic/trunk@258 47198e57-cb75-475f-84c4-a814cd6f29e0

24 files changed:
lib/Debug/src/http/NyLPC_cHttpBodyWriter.d
lib/src/flash/NyLPC_cMiMicConfiglation.c
lib/src/flash/NyLPC_cMiMicConfiglation.h
lib/src/http/NyLPC_cHttpBodyWriter.c
lib/src/include/NyLPC_utils.h
lib/src/net/NyLPC_cNet.c
lib/src/net/NyLPC_cNet.h
lib/src/net/NyLPC_cNetConfig.c
lib/src/net/NyLPC_cNetConfig.h
lib/src/net/httpd/NyLPC_cHttpdThread.h
lib/src/net/httpd/mod/NyLPC_cModMiMicSetting.c
lib/src/net/httpd/mod/NyLPC_cModMiMicSetting.h
lib/src/os/NyLPC_cMutex.h
lib/src/uip/NyLPC_cIPv4.c
lib/src/uip/NyLPC_cIPv4.h
lib/src/uip/NyLPC_cTcpListener.c
lib/src/uip/NyLPC_cTcpListener.h
lib/src/uip/NyLPC_cTcpSocket.c
lib/src/uip/NyLPC_cTcpSocket_protected.h
lib/src/uip/NyLPC_cUdpSocket.c
lib/src/uip/NyLPC_cUdpSocket_protected.h
lib/src/uip/NyLPC_cUipService.h
projects/app.RemoteMCU/.project
projects/app.RemoteMCU/src/fsdata.c

index e2842f1..aff2dcb 100644 (file)
@@ -1,6 +1,7 @@
 src/http/NyLPC_cHttpBodyWriter.d src/http/NyLPC_cHttpBodyWriter.o: \\r
- ../src/http/NyLPC_cHttpBodyWriter.c ../src/http/NyLPC_cHttpBodyWriter.h \\r
- ../src/http/NyLPC_cHttpHeaderWriter.h \\r
+ ../src/http/NyLPC_cHttpBodyWriter.c \\r
+ D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_utils.h \\r
+ D:\project.sourceforge\MiMic\trunk\lib\src\include/../utils/NyLPC_cRomFileSet.h \\r
  D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_stdlib.h \\r
  D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_config.h \\r
  D:\project.sourceforge\MiMic\trunk\lib\src\include/../NyLPC_cMiMicEnv.h \\r
@@ -9,7 +10,10 @@ src/http/NyLPC_cHttpBodyWriter.d src/http/NyLPC_cHttpBodyWriter.o: \
  D:\project.sourceforge\MiMic\trunk\lib\src\include/../NyLPC_cFifoBuffer.h \\r
  D:\project.sourceforge\MiMic\trunk\lib\src\include/../NyLPC_cPtrStream.h \\r
  D:\project.sourceforge\MiMic\trunk\lib\src\include/../NyLPC_cStr.h \\r
- ../src/http/NyLPC_cHttpStream.h \\r
+ D:\project.sourceforge\MiMic\trunk\lib\src\include/../utils/NyLPC_cFormatTextReader.h \\r
+ D:\project.sourceforge\MiMic\trunk\lib\src\include/../utils/NyLPC_cFormatWriter.h \\r
+ ../src/http/NyLPC_cHttpBodyWriter.h \\r
+ ../src/http/NyLPC_cHttpHeaderWriter.h ../src/http/NyLPC_cHttpStream.h \\r
  D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_config.h \\r
  ../src/http/NyLPC_iHttpPtrStream.h ../src/http/../uip/NyLPC_cTcpSocket.h \\r
  ../src/http/../uip/NyLPC_uip.h \\r
@@ -41,9 +45,9 @@ src/http/NyLPC_cHttpBodyWriter.d src/http/NyLPC_cHttpBodyWriter.o: \
  ../src/http/NyLPC_cHttpBasicHeaderParser.h \\r
  ../src/http/NyLPC_cHttpdConfig.h\r
 \r
-../src/http/NyLPC_cHttpBodyWriter.h:\r
+D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_utils.h:\r
 \r
-../src/http/NyLPC_cHttpHeaderWriter.h:\r
+D:\project.sourceforge\MiMic\trunk\lib\src\include/../utils/NyLPC_cRomFileSet.h:\r
 \r
 D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_stdlib.h:\r
 \r
@@ -61,6 +65,14 @@ D:\project.sourceforge\MiMic\trunk\lib\src\include/../NyLPC_cPtrStream.h:
 \r
 D:\project.sourceforge\MiMic\trunk\lib\src\include/../NyLPC_cStr.h:\r
 \r
+D:\project.sourceforge\MiMic\trunk\lib\src\include/../utils/NyLPC_cFormatTextReader.h:\r
+\r
+D:\project.sourceforge\MiMic\trunk\lib\src\include/../utils/NyLPC_cFormatWriter.h:\r
+\r
+../src/http/NyLPC_cHttpBodyWriter.h:\r
+\r
+../src/http/NyLPC_cHttpHeaderWriter.h:\r
+\r
 ../src/http/NyLPC_cHttpStream.h:\r
 \r
 D:\project.sourceforge\MiMic\trunk\lib\src\include/NyLPC_config.h:\r
index fc7457d..ed2002a 100644 (file)
@@ -1,7 +1,7 @@
 #include "NyLPC_flash.h"\r
 #include "NyLPC_http.h"\r
 #include "NyLPC_cMiMicConfiglation.h"\r
-\r
+#include "NyLPC_net.h"\r
 /**\r
  * Onchip flashを使ったコンフィギュレーション保存システムです。\r
  */\r
 /**\r
  * コンフィギュレーション値はホストオーダーで保存する。\r
  */\r
-const struct NyLPC_TMimicConfigulation factory_default=\r
+const struct NyLPC_TMiMicConfigulation factory_default=\r
 {\r
-       0xffffffff,\r
-       0x02010203,0x0405ffff,\r
+       0xffffffff,                             //fastboot\r
+       "MiMic020102030405",\r
+       0x02010203,0x0405ffff,  //Mac addr\r
+       //IPv4\r
+       NyLPC_TcNetConfig_IPV4_FLAG_MODE_MANUAL,        //flags\r
        IP2Int(192,168,0,39),\r
        IP2Int(255,255,255,0),\r
        IP2Int(192,168,0,254),\r
-       80,\r
-       0x0000FFFF\r
+       //ServerFlags\r
+       NyLPC_TcNetConfig_SERVICE_FLAG_MDNS,\r
+       //HTTP\r
+       80,     //HTTP-Port\r
+       0       //padding\r
 };\r
 \r
 \r
@@ -37,7 +43,7 @@ const static NyLPC_TUInt32 FAST_BOOT_DATA=0xfffffffe;
  * ユーザコンフィギュレーションを更新する。\r
  * この関数をコールするときは、割込/FreeRTOSを一時停止すること。\r
  */\r
-NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMimicConfigulation* i_congfiglation)\r
+NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMiMicConfigulation* i_congfiglation)\r
 {\r
        const NyLPC_TUInt32* volatile fast_boot=&(factory_default.fast_boot);\r
        //イレース\r
@@ -45,7 +51,7 @@ NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMim
                NyLPC_OnErrorGoto(Error);\r
        }\r
        //コンフィギュレーションを書き込む。\r
-       if(!NyLPC_cOnchipFlashWriter_writeSector(MIMIC_CONFIGLATION_FLASH_SECTOR,0x00000000,i_congfiglation,sizeof(struct NyLPC_TMimicConfigulation))){\r
+       if(!NyLPC_cOnchipFlashWriter_writeSector(MIMIC_CONFIGLATION_FLASH_SECTOR,0x00000000,i_congfiglation,sizeof(struct NyLPC_TMiMicConfigulation))){\r
                NyLPC_OnErrorGoto(Error);\r
        }\r
        //プログラム済フラッシュの一部を書き換えてユーザコンフィギュレーションをONにする。\r
@@ -65,17 +71,17 @@ Error:
 /**\r
  * コンフィギュレーション値を返す。\r
  */\r
-const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadFromFlash(void)\r
+const struct NyLPC_TMiMicConfigulation* NyLPC_cMiMicConfiglation_loadFromFlash(void)\r
 {\r
        if(NyLPC_cMiMicConfiglation_hasUserConfigulation()){\r
                //userコンフィギュレーション読むよ\r
-               return (const struct NyLPC_TMimicConfigulation*)(MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR);\r
+               return (const struct NyLPC_TMiMicConfigulation*)(MIMIC_CONFIGLATION_FLASH_SECTOR_ADDR);\r
        }else{\r
                //Userコンフィギュレーションない\r
                return &factory_default;\r
        }\r
 }\r
-const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadFactoryDefault(void)\r
+const struct NyLPC_TMiMicConfigulation* NyLPC_cMiMicConfiglation_loadFactoryDefault(void)\r
 {\r
        return &factory_default;\r
 }\r
index 8978f15..9295c2d 100644 (file)
 extern "C" {\r
 #endif /* __cplusplus */\r
 \r
+\r
 /**\r
  * IPアドレスはネットワークオーダーで格納する。\r
  * 構造体は4バイトアライメントであること。\r
  */\r
-struct NyLPC_TMimicConfigulation{\r
-    /**\r
-     * ROM焼検出用。0xFFFFFFFFを書く\r
-     */\r
+struct NyLPC_TMiMicConfigulation{\r
+    /** ROM焼検出用。0xFFFFFFFFを書く */\r
     NyLPC_TUInt32   fast_boot;\r
+    /** ホスト名*/\r
+    NyLPC_TChar     hostname[32];\r
+    /** MACアドレスの下位4bit*/\r
     NyLPC_TUInt32   mac_00_01_02_03;\r
+    /** MACアドレスの上位2bit*/\r
     NyLPC_TUInt32   mac_04_05_xx_xx;\r
+    /*\r
+     * IPv4設定\r
+     */\r
+\r
+    /**\r
+     * 0-1bit 起動モード\r
+     *         0:default,1:DHCP,2:AUTOIP,3:APIPA\r
+     */\r
+    NyLPC_TUInt32   ipv4_flags;\r
+    /** IPV4アドレス*/\r
     NyLPC_TUInt32   ipv4_addr_net;\r
     NyLPC_TUInt32   ipv4_mask_net;\r
     NyLPC_TUInt32   ipv4_drut_net;\r
-    NyLPC_TUInt32   ipv4_port;\r
-    NyLPC_TUInt32   accessmode;\r
+\r
+    /*\r
+     * Service setting\r
+     */\r
+\r
+    /**\r
+     * Service flags\r
+     * 0:mdns ON/OFF\r
+     */\r
+    NyLPC_TUInt32   srv_flags;\r
+    /** HTTPポート番号*/\r
+    NyLPC_TUInt16   http_port;\r
+    NyLPC_TUInt16   padding;\r
+\r
 };\r
 \r
 /**\r
@@ -42,13 +67,13 @@ NyLPC_TBool NyLPC_cMiMicConfiglation_hasUserConfigulation(void);
  * この関数は、RTOSが停止中に実行すること。\r
  * この関数は384バイト程度のスタックが必要です。\r
  */\r
-NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMimicConfigulation* i_congfiglation);\r
+NyLPC_TBool NyLPC_cMiMicConfiglation_updateConfigulation(const struct NyLPC_TMiMicConfigulation* i_congfiglation);\r
 /**\r
  * コンフィギュレーション値を返す。\r
  * この関数は、RTOSが停止中に実行すること。\r
  */\r
-const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadFromFlash(void);\r
-const struct NyLPC_TMimicConfigulation* NyLPC_cMiMicConfiglation_loadFactoryDefault(void);\r
+const struct NyLPC_TMiMicConfigulation* NyLPC_cMiMicConfiglation_loadFromFlash(void);\r
+const struct NyLPC_TMiMicConfigulation* NyLPC_cMiMicConfiglation_loadFactoryDefault(void);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 6f80fd0..25080a4 100644 (file)
@@ -26,6 +26,7 @@
 \r
 \r
 #include <stdlib.h>\r
+#include "NyLPC_utils.h"\r
 #include "NyLPC_cHttpBodyWriter.h"\r
 \r
 \r
 \r
 \r
 \r
-static NyLPC_TBool print(void* i_inst,const char* i_fmt,va_list args);\r
+/**\r
+ * PrintHandler\r
+ */\r
+static NyLPC_TBool printHandler(void* i_inst,const void* i_buf,NyLPC_TUInt32 i_len)\r
+{\r
+       //エラー状態ならFALSE\r
+       if(((NyLPC_TcHttpBodyWriter_t*)i_inst)->_is_error){\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       ((NyLPC_TcHttpBodyWriter_t*)i_inst)->_size_of_sent+=i_len;\r
+       if(!NyLPC_iHttpPtrStream_write(((NyLPC_TcHttpBodyWriter_t*)i_inst)->_ref_stream,i_buf,i_len)){\r
+               ((NyLPC_TcHttpBodyWriter_t*)i_inst)->_is_error=NyLPC_TUInt8_TRUE;\r
+               return NyLPC_TBool_FALSE;\r
+       }\r
+       return NyLPC_TBool_TRUE;\r
+}\r
+\r
 \r
 \r
 void NyLPC_cHttpBodyWriter_initialize(NyLPC_TcHttpBodyWriter_t* i_inst,NyLPC_TcHttpStream_t* i_stream)\r
@@ -66,17 +83,9 @@ void NyLPC_cHttpBodyWriter_setContentLength(NyLPC_TcHttpBodyWriter_t* i_inst,NyL
  */\r
 NyLPC_TBool NyLPC_cHttpBodyWriter_write(NyLPC_TcHttpBodyWriter_t* i_inst,const void* i_buf,NyLPC_TUInt32 i_len)\r
 {\r
-       //エラー状態ならFALSE\r
-       if(i_inst->_is_error){\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       i_inst->_size_of_sent+=i_len;\r
-       if(!NyLPC_iHttpPtrStream_write(i_inst->_ref_stream,i_buf,i_len)){\r
-               i_inst->_is_error=NyLPC_TUInt8_TRUE;\r
-               return NyLPC_TBool_FALSE;\r
-       }\r
-       return NyLPC_TBool_TRUE;\r
+       return printHandler(i_inst,i_buf,i_len);\r
 }\r
+\r
 /**\r
  * HttpBodyの書き込みを完了します。\r
  * @return\r
@@ -117,7 +126,7 @@ NyLPC_TBool NyLPC_cHttpBodyWriter_format(NyLPC_TcHttpBodyWriter_t* i_inst,const
                return NyLPC_TBool_FALSE;\r
        }\r
        va_start(a,i_fmt);\r
-       ret=print(i_inst,i_fmt,a);\r
+       ret=   NyLPC_cFormatWriter_print(printHandler,i_inst,i_fmt,a);\r
        va_end(a);\r
        return ret;\r
 }\r
@@ -129,117 +138,10 @@ NyLPC_TBool NyLPC_cHttpBodyWriter_formatV(NyLPC_TcHttpBodyWriter_t* i_inst,const
        if(i_inst->_is_error){\r
                return NyLPC_TBool_FALSE;\r
        }\r
-       ret=print(i_inst,i_fmt,i_args);\r
+       ret=NyLPC_cFormatWriter_print(printHandler,i_inst,i_fmt,i_args);\r
        return ret;\r
 }\r
 \r
-#define NUM_OF_WORK 16\r
-\r
-static NyLPC_TBool print(void* i_inst,const char* i_fmt,va_list args)\r
-{\r
-       const char* rp=i_fmt;\r
-       const char* sp;\r
-       char wk[NUM_OF_WORK];\r
-       NyLPC_TUInt32 ut;\r
-       int ol=0;\r
-       while(*rp!='\0'){\r
-               if(*rp=='%'){\r
-                       rp++;\r
-                       switch (*rp){\r
-                       case 's':\r
-                               sp=va_arg(args,const char*);\r
-                               while(*sp!=0){\r
-                                       wk[ol]=*sp;\r
-                                       ol++;\r
-                                       sp++;\r
-                                       //バッファフルなら書込み。\r
-                                       if(ol>=NUM_OF_WORK){\r
-                                               NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,NUM_OF_WORK);\r
-                                               ol=0;\r
-                                       }\r
-                               }\r
-                               rp++;\r
-                               continue;\r
-                       case 'c':\r
-                               wk[ol]=(char)va_arg(args,int);\r
-                               rp++;\r
-                               ol++;\r
-                               break;\r
-                       case 'd':\r
-                               //ワークを空にする。\r
-                               if(ol>0){\r
-                                       NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,ol);\r
-                                       ol=0;\r
-                               }\r
-                               NyLPC_itoa((va_arg(args,int)),wk,10);\r
-                               //強制コミット\r
-                               NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,strlen(wk));\r
-                               rp++;\r
-                               continue;\r
-                       case 'u':\r
-                               //ワークを空にする。\r
-                               if(ol>0){\r
-                                       NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,ol);\r
-                               }\r
-                               ut=va_arg(args,NyLPC_TUInt32);\r
-                               ol=15;\r
-                               wk[ol--]='\0';\r
-                               do{\r
-                                       wk[ol--]='0'+(ut%10);\r
-                                       ut/=10;\r
-                               }while(ut>0);\r
-                               NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,(wk+ol+1),14-ol);\r
-                               ol=0;\r
-                               rp++;\r
-                               continue;\r
-                       case 'x':\r
-                               //ワークを空にする。\r
-                               if(ol>0){\r
-                                       NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,ol);\r
-                                       ol=0;\r
-                               }\r
-                               NyLPC_uitoa((va_arg(args,unsigned int)),wk,16);\r
-                               //強制コミット\r
-                               NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,strlen(wk));\r
-                               rp++;\r
-                               continue;\r
-//                     case 'X':\r
-                       case '%':\r
-                               wk[ol]='%';\r
-                               ol++;\r
-                               rp++;\r
-                               break;\r
-                       case '\0':\r
-                               //オワタ(ループ抜けるためにrpはそのまま。)\r
-                               break;\r
-                       default:\r
-                               wk[ol]=*rp;\r
-                               ol++;\r
-                       }\r
-                       //バッファフルなら書込み。\r
-                       if(ol>=NUM_OF_WORK){\r
-                               NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,NUM_OF_WORK);\r
-                               ol=0;\r
-                       }\r
-               }else if(*rp==0){\r
-                       //オワタ\r
-                       break;\r
-               }else{\r
-                       wk[ol]=*rp;\r
-                       ol++;\r
-                       rp++;\r
-                       if(ol>=NUM_OF_WORK){\r
-                               NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,NUM_OF_WORK);\r
-                               ol=0;\r
-                       }\r
-               }\r
-       }\r
-       //どこかでエラーが起こってればFALSE返す。\r
-       return NyLPC_cHttpBodyWriter_write((NyLPC_TcHttpBodyWriter_t*)i_inst,wk,ol);\r
-}\r
-\r
-\r
-\r
 /**\r
  * テスト用のコード。\r
  */\r
index e9ab846..a373460 100644 (file)
@@ -32,6 +32,7 @@
 \r
 #include "../utils/NyLPC_cRomFileSet.h"\r
 #include "../utils/NyLPC_cFormatTextReader.h"\r
+#include "../utils/NyLPC_cFormatWriter.h"\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif /* __cplusplus */\r
index 2a11e68..8a1d6c5 100644 (file)
@@ -40,7 +40,7 @@ void NyLPC_cNet_initialize(NyLPC_TcNet_t* i_inst)
 \r
 void NyLPC_cNet_start(NyLPC_TcNet_t* i_inst,const NyLPC_TcNetConfig_t* i_ref_config)\r
 {\r
-       NyLPC_cUipService_start(&(i_ref_config->interface_setting.ethernet));\r
+       NyLPC_cUipService_start(&(i_ref_config->super));\r
        //プラットフォーム名を推測(デバイス名の初めの1文字だけ見る。)\r
        switch(*(NyLPC_cUipService_refDeviceName())){\r
        case 'L':\r
index 4d2993c..041e4ef 100644 (file)
@@ -66,6 +66,7 @@ void NyLPC_cNet_start(NyLPC_TcNet_t* i_inst,const NyLPC_TcNetConfig_t* i_ref_con
  * ネットワークスタックを停止します。\r
  * サービスは開始中でなければなりません。\r
  * start関数で開始済である必要があります。\r
+ * この関数をコールする前に、全てのTCPソケットを閉じ、非同期なソケット操作を停止してください。\r
  */\r
 void NyLPC_cNet_stop(NyLPC_TcNet_t* i_inst);\r
 \r
index f9ac38f..5c514e8 100644 (file)
@@ -27,7 +27,7 @@
 #include "../flash/NyLPC_cMiMicConfiglation.h"\r
 \r
 \r
-static void update(NyLPC_TcNetConfig_t* i_inst,const struct NyLPC_TMimicConfigulation* pdata);\r
+static void update(NyLPC_TcNetConfig_t* i_inst,const struct NyLPC_TMiMicConfigulation* pdata);\r
 \r
 \r
 void NyLPC_cNetConfig_initialize(NyLPC_TcNetConfig_t* i_inst,NyLPC_TBool i_is_factory_default)\r
@@ -90,7 +90,7 @@ Error:
  */\r
 //#define ETHERNET_FRAME_LEN 1480\r
 #define ETHERNET_FRAME_LEN 1400\r
-static void update(NyLPC_TcNetConfig_t* i_inst,const struct NyLPC_TMimicConfigulation* pdata)\r
+static void update(NyLPC_TcNetConfig_t* i_inst,const struct NyLPC_TMiMicConfigulation* pdata)\r
 {\r
        struct NyLPC_TEthAddr ea;\r
        struct NyLPC_TIPv4Addr ip,mask,drt;\r
@@ -104,11 +104,13 @@ static void update(NyLPC_TcNetConfig_t* i_inst,const struct NyLPC_TMimicConfigul
        ip.v=NyLPC_htonl(pdata->ipv4_addr_net);\r
        mask.v=NyLPC_htonl(pdata->ipv4_mask_net);\r
        drt.v=NyLPC_htonl(pdata->ipv4_drut_net);\r
-       i_inst->version=1;\r
-       i_inst->interface_type=NyLPC_cNetConfig_INTERFACE_TYPE_ETHERNET;\r
-       NyLPC_cIPv4Config_initialzeForEthernet(&i_inst->interface_setting.ethernet,&ea,ETHERNET_FRAME_LEN);\r
-       NyLPC_cIPv4Config_setDefaultRoute(&i_inst->interface_setting.ethernet,&drt);\r
-       NyLPC_cIPv4Config_setIp(&i_inst->interface_setting.ethernet,&ip,&mask);\r
+       strcpy(i_inst->hostname,"MiMic");\r
+       NyLPC_cIPv4Config_initialzeForEthernet(&i_inst->super,&ea,ETHERNET_FRAME_LEN);\r
+       NyLPC_cIPv4Config_setDefaultRoute(&i_inst->super,&drt);\r
+       NyLPC_cIPv4Config_setIp(&i_inst->super,&ip,&mask);\r
+       i_inst->services.flags=pdata->srv_flags;\r
+       i_inst->services.http_port=pdata->http_port;\r
+       i_inst->tcp_mode=pdata->ipv4_flags;\r
        return;\r
 }\r
 \r
index 27080d5..8850e50 100644 (file)
@@ -31,8 +31,8 @@
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif /* __cplusplus */\r
-#define NyLPC_cNetConfig_INTERFACE_TYPE_ETHERNET 1\r
 \r
+#define NyLPC_TcNetConfig_HOSTNAME_LEN 32\r
 /**\r
  * クラス型を定義します。\r
  * NyLPC_cNetConfigクラスは、NyLPC_NetConfigの初期化データを保持します。\r
@@ -42,24 +42,42 @@ typedef struct NyLPC_TcNetConfig NyLPC_TcNetConfig_t;
 \r
 \r
 /**\r
- * NyLPC_TcFifoBufferクラスの構造体です。\r
+ * NyLPC_TcIPv4Configクラスの継承クラスです。\r
+ * IPv4設定にネットワーク設定項目を加えます。\r
+ * 加えられる項目は全て[RECOMMEND]パラメータです。\r
  */\r
 struct NyLPC_TcNetConfig\r
 {\r
-       /** Must be 1*/\r
-       NyLPC_TUInt16 version;\r
-       /** インタフェイスタイプ*/\r
-       NyLPC_TUInt16 interface_type;\r
+       NyLPC_TcIPv4Config_t super;\r
+       /**\r
+        * ホスト名\r
+        */\r
+       NyLPC_TChar hostname[NyLPC_TcNetConfig_HOSTNAME_LEN];\r
+       /**\r
+        * tcp初期設定モードのフラグ値\r
+        * NyLPC_TcNetConfig_IPV4_FLAG_Xの組み合わせ\r
+        */\r
+       NyLPC_TUInt32 tcp_mode;\r
+       struct{\r
+               /**\r
+                * サービスのフラグセット。\r
+                * NyLPC_TcNetConfig_SERVICE_FLAG_xの組み合わせ\r
+                * bit 01:IP初期設定のモード. 0:Manual指定,1:DHCP指定,2:AutoIP指定,3:APIPA指定\r
+                */\r
+               NyLPC_TUInt32 flags;\r
+               NyLPC_TUInt16 http_port;\r
+               NyLPC_TUInt16 padding;\r
+       }services;\r
+\r
        /** インタフェイス層の設定*/\r
-       union{\r
-               /** Ethernet mac address */\r
-               NyLPC_TcIPv4Config_t ethernet;\r
-//\r
-//             struct{\r
-//                     struct NyLPC_TEthAddr mac_addr;\r
-//             }ethernet2;\r
-       }interface_setting;\r
 };\r
+#define NyLPC_TcNetConfig_IPV4_FLAG_MODE_MASK 3\r
+#define NyLPC_TcNetConfig_IPV4_FLAG_MODE_MANUAL 0\r
+#define NyLPC_TcNetConfig_IPV4_FLAG_MODE_DHCP 1\r
+#define NyLPC_TcNetConfig_IPV4_FLAG_MODE_AUTOIP 2\r
+#define NyLPC_TcNetConfig_IPV4_FLAG_MODE_APIPA (NyLPC_TcNetConfig_IPV4_FLAG_MODE_DHCP|NyLPC_TcNetConfig_IPV4_FLAG_MODE_AUTOIP)\r
+\r
+#define NyLPC_TcNetConfig_SERVICE_FLAG_MDNS 1\r
 \r
 /**\r
  * フラッシュメモリから設定値を読み出して、インスタンスを初期化します。\r
index ce95be9..fe17911 100644 (file)
@@ -21,7 +21,7 @@ extern "C" {
 #endif\r
 \r
 /** Httpdセッションスレッドのスタックサイズ*/\r
-#define NyLPC_TcHttpdThread_SIZE_OF_THREAD_STACK 1024\r
+#define NyLPC_TcHttpdThread_SIZE_OF_THREAD_STACK 1024+128\r
 \r
 typedef struct NyLPC_TcHttpdThread NyLPC_TcHttpdThread_t;\r
 /**\r
index 7cc37e0..62cbb27 100644 (file)
 #include "NyLPC_flash.h"\r
 #include "../NyLPC_cHttpdConnection_protected.h"\r
 #include "../../NyLPC_cNet.h"\r
+#include <ctype.h>\r
 \r
-#define MOD_VERSION "ModMiMicSetting/1.2"\r
-#define SIZE_OF_SETUP_PARAM 7\r
+#define MOD_VERSION "ModMiMicSetting/1.3"\r
+#define SIZE_OF_SETUP_PARAM 8\r
 struct TModMiMicSettingRequest\r
 {\r
        struct NyLPC_THttpBasicHeader super;\r
@@ -48,17 +49,13 @@ struct TModMiMicSettingRequest
        NyLPC_TcMiMicDbCompiler_t _binparser;\r
        union{\r
                struct{\r
-                       /**pパラメータ。最大長さは16。長さ6であること。\r
-                        * [0]:MACAddrの、[0][1][2][3]\r
-                        * [1]:MACAddrの、[4][5][X][X]\r
-                        * [2]:IPAddr(Networkorder)\r
-                        * [3]:Subnetmask(Networkorder)\r
-                        * [4]:Defaultgateway\r
-                        * [5]:[0:port0][1:port1][X][X]\r
-                        * [6]:accessmode [0:AC1][1:AC2][X][X]\r
+                       /**pパラメータ。最大長さは16。\r
+                        * 詳細はNyLPC_TcModMiMicSetting_tを参照\r
                         */\r
                        NyLPC_TUInt32 param_buf[SIZE_OF_SETUP_PARAM];\r
+                       NyLPC_TChar host_name[NyLPC_TcNetConfig_HOSTNAME_LEN];\r
                        NyLPC_TUInt16 param_len;\r
+                       NyLPC_TUInt16 host_len;\r
                        NyLPC_TUInt32 cval;//コマンド値\r
                }setup;\r
                struct{\r
@@ -84,6 +81,7 @@ static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const
 #define ST_PARSE_QUERY_VALUE 3         //Query読み出し中\r
 #define ST_PARSE_QUERY_VALUE_P 4\r
 #define ST_PARSE_QUERY_VALUE_C 5\r
+#define ST_PARSE_QUERY_VALUE_HOST 6\r
 /**\r
  * コンテンツID定義(コンテンツ名に対応)\r
  */\r
@@ -96,6 +94,7 @@ static NyLPC_TBool messageHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,const
 \r
 #define QNAME_ID_P     4\r
 #define QNAME_ID_C     5\r
+#define QNAME_ID_HOST  6\r
 #define QNAME_ID_UNKNOWN 0\r
 \r
 #define QVAL_C_GET 1\r
@@ -113,6 +112,7 @@ static const struct NyLPC_TTextIdTbl qname_id_table[]=
 {\r
        {"p",QNAME_ID_P},\r
        {"c",QNAME_ID_C},\r
+       {"host",QNAME_ID_HOST},\r
        {NULL,QNAME_ID_UNKNOWN}\r
 };\r
 \r
@@ -139,7 +139,8 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                switch(out->_content_id)\r
                {\r
                case CONTENT_ID_SETUP:\r
-                       out->content.setup.param_len=0;\r
+                       out->content.setup.param_len=0;//クエリが無い場合の初期値\r
+                       out->content.setup.host_len =0;//クエリが無い場合の初期値\r
                        out->content.setup.cval=QVAL_C_UNKNOWN;\r
                        break;\r
                default:\r
@@ -172,6 +173,10 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                        case QNAME_ID_C:\r
                                out->_astate=ST_PARSE_QUERY_VALUE_C;\r
                                break;\r
+                       case QNAME_ID_HOST:\r
+                               out->_astate=ST_PARSE_QUERY_VALUE_HOST;//_host_nameに蓄積\r
+                               out->content.setup.host_len=0;\r
+                               break;\r
                        default:\r
                                out->_astate=ST_PARSE_QUERY_VALUE;\r
                                break;\r
@@ -185,6 +190,24 @@ static NyLPC_TBool urlHandler(NyLPC_TcHttpBasicHeaderParser_t* i_inst,NyLPC_TCha
                        //クエリ値解析完了\r
                        out->_astate=ST_PARSE_QUERY_NAME;\r
                        return NyLPC_TBool_TRUE;\r
+               case ST_PARSE_QUERY_VALUE_HOST:\r
+                       //未知のクエリは無視\r
+                       if(i_c!='\0' && i_c!='&'){\r
+                               //許可する文字列は、[:AlNum:]||'_'\r
+                               if(!isalnum(i_c) && i_c!='_'){\r
+                                       NyLPC_OnErrorGoto(ERROR);\r
+                               }\r
+                               out->content.setup.host_name[out->content.setup.host_len++]=i_c;\r
+                               if(out->content.setup.host_len>=NyLPC_TcNetConfig_HOSTNAME_LEN){\r
+                                       //長すぎ\r
+                                       NyLPC_OnErrorGoto(ERROR);\r
+                               }\r
+                               return NyLPC_TBool_TRUE;\r
+                       }\r
+                       //クエリ値解析完了\r
+                       out->content.setup.host_name[out->content.setup.host_len]='\0';\r
+                       out->_astate=ST_PARSE_QUERY_NAME;\r
+                       return NyLPC_TBool_TRUE;\r
                case ST_PARSE_QUERY_VALUE_C:\r
                        if(i_c!='\0' && i_c!='&'){\r
                                if(!NyLPC_cStr_put(&(out->_tstr),i_c)){\r
@@ -345,9 +368,9 @@ Error2:
 static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicSettingRequest* i_req)\r
 {\r
        NyLPC_TBool ret;\r
-       const struct NyLPC_TMimicConfigulation* config;\r
-       struct NyLPC_TMimicConfigulation cfg_image;\r
-       const NyLPC_TcIPv4Config_t* currebt_cfg;\r
+       const struct NyLPC_TMiMicConfigulation* config;\r
+       struct NyLPC_TMiMicConfigulation cfg_image;\r
+       const NyLPC_TcNetConfig_t* currebt_cfg;\r
        NyLPC_Assert(\r
                (NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET)||\r
                (NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_HEAD));\r
@@ -359,45 +382,70 @@ static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicS
                }\r
                if(NyLPC_cHttpdConnection_getMethod(i_connection)==NyLPC_THttpMethodType_GET){\r
                        config=NyLPC_cMiMicConfiglation_loadFromFlash();\r
-                       //JSONを書く。\r
+                       //Flashの内容から\r
                        if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,\r
                                "{"\r
                                "\"application\":\""MOD_VERSION";"NyLPC_cMiMicEnv_VERSION";%s\","\r
+                               "\"landev\":\"%s\",",\r
+                               NyLPC_cNet_PlatformName,\r
+                               NyLPC_cUipService_refDeviceName()\r
+                               ))\r
+                       {\r
+                               NyLPC_OnErrorGoto(Error);\r
+                       }\r
+                       if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,\r
+                               "\"cfg\":{"\r
                                "\"mac00010203\":%u,"\r
                                "\"mac0405xxxx\":%u,"\r
-                               "\"ip\":%u,"\r
-                               "\"mask\":%u,"\r
-                               "\"droute\":%u,"\r
-                               "\"port\":%u,"\r
-                               "\"access\":%u,",\r
-                               NyLPC_cNet_PlatformName,\r
+                               "\"host\":\"%s\","\r
+                               "\"ipv4\":{"\r
+                                       "\"flags\":%u,"\r
+                                       "\"ip\":%u,"\r
+                                       "\"mask\":%u,"\r
+                                       "\"droute\":%u,"\r
+                               "},"\r
+                               "\"services\":{"\r
+                                       "\"flags\":%u,"\r
+                                       "\"http_port\":%u"\r
+                               "}},",\r
                                config->mac_00_01_02_03,\r
                                config->mac_04_05_xx_xx,\r
+                               config->hostname,\r
+                               config->ipv4_flags,\r
                                config->ipv4_addr_net,\r
                                config->ipv4_mask_net,\r
                                config->ipv4_drut_net,\r
-                               config->ipv4_port,\r
-                               config->accessmode\r
+                               config->srv_flags,\r
+                               config->http_port\r
                                )){\r
                                NyLPC_OnErrorGoto(Error);\r
                        }\r
                        //write current status\r
-                       currebt_cfg=NyLPC_cUipService_refCurrentConfig();\r
+                       currebt_cfg=(const NyLPC_TcNetConfig_t*)NyLPC_cUipService_refCurrentConfig();\r
                        if(!NyLPC_cHttpdConnection_sendResponseBodyF(i_connection,\r
-                               "\"info\":{"\r
-                                       "\"landev\":\"%s\","\r
-                                       "\"mac00010203\":%u,"\r
-                                       "\"mac0405xxxx\":%u,"\r
+                               "\"cur\":{"\r
+                               "\"mac00010203\":%u,"\r
+                               "\"mac0405xxxx\":%u,"\r
+                               "\"host\":\"%s\","\r
+                               "\"ipv4\":{"\r
+                                       "\"flags\":%u,"\r
                                        "\"ip\":%u,"\r
                                        "\"mask\":%u,"\r
-                                       "\"droute\":%u"\r
-                               "}}",\r
-                               NyLPC_cUipService_refDeviceName(),\r
-                               (currebt_cfg->eth_mac.addr[0]<<24)|(currebt_cfg->eth_mac.addr[1]<<16)|(currebt_cfg->eth_mac.addr[2]<<8)|currebt_cfg->eth_mac.addr[3],\r
-                               (currebt_cfg->eth_mac.addr[4]<<24)|(currebt_cfg->eth_mac.addr[5]<<16),\r
-                               NyLPC_ntohl(currebt_cfg->ip_addr.v),\r
-                               NyLPC_ntohl(currebt_cfg->netmask.v),\r
-                               NyLPC_ntohl(currebt_cfg->dr_addr.v)\r
+                                       "\"droute\":%u,"\r
+                               "},"\r
+                               "\"services\":{"\r
+                                       "\"flags\":%u,"\r
+                                       "\"http_port\":%u"\r
+                               "}}}",\r
+                               (currebt_cfg->super.eth_mac.addr[0]<<24)|(currebt_cfg->super.eth_mac.addr[1]<<16)|(currebt_cfg->super.eth_mac.addr[2]<<8)|currebt_cfg->super.eth_mac.addr[3],\r
+                               (currebt_cfg->super.eth_mac.addr[4]<<24)|(currebt_cfg->super.eth_mac.addr[5]<<16),\r
+                               currebt_cfg->hostname,\r
+                               currebt_cfg->tcp_mode,\r
+                               NyLPC_ntohl(currebt_cfg->super.ip_addr.v),\r
+                               NyLPC_ntohl(currebt_cfg->super.netmask.v),\r
+                               NyLPC_ntohl(currebt_cfg->super.dr_addr.v),\r
+                               currebt_cfg->services.flags,\r
+                               currebt_cfg->services.http_port\r
                                )){\r
                                NyLPC_OnErrorGoto(Error);\r
                        }\r
@@ -405,7 +453,7 @@ static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicS
                break;\r
        case QVAL_C_UPDATE:\r
                //check parameter length\r
-               if(i_req->content.setup.param_len!=SIZE_OF_SETUP_PARAM)\r
+               if(i_req->content.setup.param_len!=SIZE_OF_SETUP_PARAM || i_req->content.setup.host_len<1)\r
                {\r
                        NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
                }else{\r
@@ -413,13 +461,15 @@ static void setup_proc(NyLPC_TcHttpdConnection_t* i_connection,struct TModMiMicS
                        cfg_image.fast_boot=0xffffffff;\r
                        cfg_image.mac_00_01_02_03=(i_req->content.setup.param_buf[0]);\r
                        cfg_image.mac_04_05_xx_xx=(i_req->content.setup.param_buf[1]&0xffff0000);\r
-                       cfg_image.ipv4_addr_net  =i_req->content.setup.param_buf[2];\r
-                       cfg_image.ipv4_mask_net  =i_req->content.setup.param_buf[3];\r
-                       cfg_image.ipv4_drut_net  =i_req->content.setup.param_buf[4];\r
-                       cfg_image.ipv4_port =(NyLPC_TUInt16)(i_req->content.setup.param_buf[5]>>16);\r
-                       cfg_image.accessmode=(i_req->content.setup.param_buf[6]);\r
+                       cfg_image.ipv4_flags     =i_req->content.setup.param_buf[2];\r
+                       cfg_image.ipv4_addr_net  =i_req->content.setup.param_buf[3];\r
+                       cfg_image.ipv4_mask_net  =i_req->content.setup.param_buf[4];\r
+                       cfg_image.ipv4_drut_net  =i_req->content.setup.param_buf[5];\r
+                       cfg_image.srv_flags =i_req->content.setup.param_buf[6];\r
+                       cfg_image.http_port =(NyLPC_TUInt16)(i_req->content.setup.param_buf[7]>>16);\r
+                       strcpy(cfg_image.hostname,i_req->content.setup.host_name);\r
                        //一応確認。\r
-                       if((cfg_image.ipv4_port==0)|| (cfg_image.accessmode & 0xFEFE0000)!=0x00000000){\r
+                       if(cfg_image.http_port==0){\r
                                NyLPC_cHttpdUtils_sendErrorResponse(i_connection,500);\r
                        }else{\r
                                //FreeRTOSの停止\r
index c9d9c9d..6262625 100644 (file)
@@ -34,6 +34,7 @@ extern "C" {
 \r
 /**\r
  * MiMicの動作設定CGIです。MiMicの設定値をオンチップフラッシュへ保存/読み出しします。\r
+ * uipServiceはNyLPC_TcNetConfig_tを継承したインスタンスで初期化してください。\r
  *\r
  * JSONAPIとして、以下のAPIを提供します。\r
  * ./setup.api?c=[update|get]&p=[:param:]\r
@@ -45,23 +46,22 @@ extern "C" {
  *             mac0405xxxx: [:HEX32:],\r
  *             ip: [:HEX32:],\r
  *             mask: [:HEX32:],\r
- *             droute: [:HEX32:]\r
- *             port: [:HEX16:]\r
- *             access\":%u}",\r
- * c=update pパラメタの内容でFlashをアップデートする。\r
- *             [:param:]=[:emac:][:hostaddr:][:subnetmask:][:defaultroot:][:port:]\r
- *             ROMパラメータ。固定長のHEX文字列である。\r
- *             [:emac:]=[[:HEX32:]{2}}\r
- *             ビックエンディアン48bit値+パディング16bit\r
- *             [:hostaddr:]=[:HEX32:]\r
- *             IPアドレス。32bit値。ビックエンディアン\r
- *             [:subnetmask:]=[:HEX32:]\r
- *             サブネットマスク。32bit値。ビックエンディアン\r
- *             [:defaultroot:]=[:HEX32:]\r
- *             defaultrootアドレス。32bit値。ビックエンディアン\r
- *             [:port:]=[:HEX32:]\r
- *             ポート番号。2桁のHEX値である。ビックエンディアン。値16bit、パディング16bit\r
+ *             droute: [:HEX32:],\r
  *\r
+ *             port: [:HEX16:],\r
+ *             access\":%u}",\r
+ * c=update pパラメタ/hostの内容でFlashをアップデートする。\r
+ *             pパラメタは32bitの16進数文字列。\r
+ *             [ 0] emac_0123          ビックエンディアン48bit値+パディング16bit\r
+ *             [ 1] emac_45xx          :\r
+ *                     [emac4][emac5][x][x]\r
+ *             [ 2] ipv4_flags         IPV4設定フラグ\r
+ *             [ 3] ipv4_ip            IPアドレス。32bit値。ビックエンディアン\r
+ *             [ 4] ipv4_mask          サブネットマスク。32bit値。ビックエンディアン\r
+ *             [ 5] ipv4_deoute        defaultrootアドレス。32bit値。ビックエンディアン\r
+ *             [ 6] service_flag\r
+ *             [ 7] http_param         HTTPサービスポート番号。2桁のHEX値である。ビックエンディアン。値16bit、パディング16bit\r
+ *                     [port_h][port_l][x][x]\r
  */\r
 typedef struct NyLPC_TcModMiMicSetting NyLPC_TcModMiMicSetting_t;\r
 \r
index 188fd50..69ef6ef 100644 (file)
@@ -71,6 +71,7 @@ NyLPC_TBool NyLPC_cMutex_lock(NyLPC_TcMutex_t* i_inst);
 \r
 NyLPC_TBool NyLPC_cMutex_unlock(NyLPC_TcMutex_t* i_inst);\r
 \r
+#define NyLPC_cMutex_isLocked(i_inst) ((i_inst)->_lock_count>0)\r
 #define NyLPC_cMutex_finalize(i_inst)\r
 \r
 #ifdef __cplusplus\r
index aa6613d..211ca42 100644 (file)
@@ -196,9 +196,9 @@ static void cSocketTbl_callPeriodic(
 }\r
 \r
 /**\r
- * テーブルにある有効なソケットのperiodicをすべて呼び出します。\r
+ * テーブルにある有効なソケットのstartを全て呼び出します。\r
  */\r
-static void cSocketTbl_callUpdateConfiguration(\r
+static void cSocketTbl_callSocketStart(\r
        NyLPC_TcPtrTbl_t* i_inst,\r
        const NyLPC_TcIPv4Config_t* i_cfg)\r
 {\r
@@ -210,16 +210,41 @@ static void cSocketTbl_callUpdateConfiguration(
                }\r
                switch(p[i]->_typeid){\r
                case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK:\r
-                       NyLPC_cUdpSocket_updateConfigulation((NyLPC_TcUdpSocket_t*)(p[i]),i_cfg);\r
+                       NyLPC_cUdpSocket_startService((NyLPC_TcUdpSocket_t*)(p[i]),i_cfg);\r
+                       break;\r
+               case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK:\r
+                       NyLPC_cTcpSocket_startService((NyLPC_TcTcpSocket_t*)(p[i]),i_cfg);\r
+                       break;\r
+               default:\r
+                       continue;\r
+               }\r
+       }\r
+}\r
+/**\r
+ * テーブルにある有効なソケットのstartを全て呼び出します。\r
+ */\r
+static void cSocketTbl_callSocketStop(\r
+       NyLPC_TcPtrTbl_t* i_inst)\r
+{\r
+       NyLPC_TcBaseSocket_t** p=(NyLPC_TcBaseSocket_t**)(i_inst->buf);\r
+       int i;\r
+       for(i=i_inst->size-1;i>=0;i--){\r
+               if(p[i]==NULL){\r
+                       continue;\r
+               }\r
+               switch(p[i]->_typeid){\r
+               case NyLPC_TcBaseSocket_TYPEID_UDP_SOCK:\r
+                       NyLPC_cUdpSocket_stopService((NyLPC_TcUdpSocket_t*)(p[i]));\r
                        break;\r
                case NyLPC_TcBaseSocket_TYPEID_TCP_SOCK:\r
-                       NyLPC_cTcpSocket_updateConfigulation((NyLPC_TcTcpSocket_t*)(p[i]),i_cfg);\r
+                       NyLPC_cTcpSocket_stopService((NyLPC_TcTcpSocket_t*)(p[i]));\r
                        break;\r
                default:\r
                        continue;\r
                }\r
        }\r
 }\r
+\r
 /****************************************************\r
  * NyLPC_cIPv4\r
  ***************************************************/\r
@@ -245,6 +270,7 @@ void NyLPC_cIPv4_initialize(
        cSocketTbl_initialize(&(i_inst->_socket_tbl),(void**)(i_inst->_socket_array_buf));\r
        //instanceの初期化\r
        NyLPC_cMutex_initialize(&(i_inst->_sock_mutex));\r
+       NyLPC_cMutex_initialize(&(i_inst->_listener_mutex));\r
        i_inst->_ref_config=NULL;\r
        return;\r
 }\r
@@ -257,6 +283,7 @@ void NyLPC_cIPv4_finalize(
 {\r
        cSocketTbl_finalize(&(i_inst->_socket_tbl));\r
        NyLPC_cMutex_finalize(&(i_inst->_sock_mutex));\r
+       NyLPC_cMutex_finalize(&(i_inst->_listener_mutex));\r
        return;\r
 }\r
 \r
@@ -271,7 +298,7 @@ void NyLPC_cIPv4_start(
        //リストの初期化、ここでするべき?しないべき?\r
        i_inst->_ref_config=i_ref_configlation;\r
        //configulationのアップデートを登録されてるソケットに通知\r
-       cSocketTbl_callUpdateConfiguration(&(i_inst->_socket_tbl),i_ref_configlation);\r
+       cSocketTbl_callSocketStart(&(i_inst->_socket_tbl),i_ref_configlation);\r
        return;\r
 }\r
 \r
@@ -281,8 +308,7 @@ void NyLPC_cIPv4_start(
 void NyLPC_cIPv4_stop(\r
        NyLPC_TcIPv4_t* i_inst)\r
 {\r
-       //実行タイミングが未設計。当分は使わないこと。\r
-       //新規ソケットの生成を打ち切って、すべてのソケットが停止するのを待つ?\r
+       cSocketTbl_callSocketStop(&(i_inst->_socket_tbl));\r
        i_inst->_ref_config=NULL;\r
        return;\r
 }\r
index b07dbe5..69cf245 100644 (file)
@@ -113,6 +113,8 @@ struct NyLPC_TcIPv4
        const NyLPC_TcIPv4Config_t* _ref_config;\r
        /** ソケットリソースの保護用。コールバック関数から呼び出されるソケット内部のリソース保護に使用する共通MUTEX*/\r
        NyLPC_TcMutex_t _sock_mutex;\r
+       /** リスナリソースの保護用。コールバック関数から呼び出されるソケット内部のリソース保護に使用する共通MUTEX*/\r
+       NyLPC_TcMutex_t _listener_mutex;\r
        /** NyLPC_cTcpSocketを管理するポインタリストです。*/\r
        NyLPC_TcPtrTbl_t _socket_tbl;\r
        /** _socket_tblが使用するメモリ領域です。*/\r
@@ -218,7 +220,10 @@ void NyLPC_cIPv4_periodec(NyLPC_TcIPv4_t* i_inst);
  * このMutexはソケット同士の干渉が起こらない処理にだけ使ってください。\r
  */\r
 #define NyLPC_cIPv4_getSockMutex(i_inst) (&((i_inst)->_sock_mutex))\r
-\r
+/**\r
+ * リスナーリソースとコールバックの排他処理に使う共通MUTEXを返します。\r
+ */\r
+#define NyLPC_cIPv4_getListenerMutex(i_inst) (&((i_inst)->_listener_mutex))\r
 \r
 #ifdef __cplusplus\r
 }\r
index 3230839..6f6ed1b 100644 (file)
@@ -30,8 +30,8 @@
 #include "NyLPC_stdlib.h"\r
 \r
 \r
-#define lockResource(i_inst) NyLPC_cMutex_lock(&((i_inst)->_mutex))\r
-#define unlockResource(i_inst) NyLPC_cMutex_unlock(&((i_inst)->_mutex))\r
+#define lockResource(i_inst) NyLPC_cMutex_lock(((i_inst)->_mutex))\r
+#define unlockResource(i_inst) NyLPC_cMutex_unlock(((i_inst)->_mutex))\r
 \r
 \r
 /**\r
@@ -45,7 +45,8 @@ NyLPC_TBool NyLPC_cTcpListener_initialize(NyLPC_TcTcpListener_t* i_inst,NyLPC_TU
        //uipサービスは初期化済であること。\r
        NyLPC_Assert(NyLPC_TcUipService_isInitService());\r
        //初期化\r
-       NyLPC_cMutex_initialize(&(i_inst->_mutex));\r
+       //      NyLPC_cMutex_initialize(&(i_inst->_mutex));\r
+       i_inst->_mutex=NyLPC_cIPv4_getListenerMutex(&srv->_tcpv4);//    NyLPC_cMutex_initialize(&(i_inst->_mutex));\r
        i_inst->_port=NyLPC_htons(i_port);\r
        i_inst->_ref_sock=NULL;\r
        //管理リストへ登録。\r
index 7109a6c..b36c9ed 100644 (file)
@@ -52,9 +52,9 @@ struct NyLPC_TcTcpListener
        /** バインドするためのソケット*/\r
        NyLPC_TcTcpSocket_t* _ref_sock;\r
        /** タスク間の調停用Mutex\r
-        * cTcpSocketのAPIをコールしている箇所があるので、そこをどうにかしないと共有化はムリ。\r
+        * Listener用の共通Mutexポインタ\r
         */\r
-       NyLPC_TcMutex_t _mutex;\r
+       NyLPC_TcMutex_t* _mutex;\r
 };\r
 /**\r
  * この関数は、TCPのリスナーを初期化します。\r
index 4342172..0398d18 100644 (file)
@@ -311,8 +311,8 @@ NyLPC_TBool NyLPC_cTcpSocket_initialize(NyLPC_TcTcpSocket_t* i_inst,void* i_rbuf
        NyLPC_Assert(NyLPC_TcUipService_isInitService());\r
 \r
        NyLPC_cFifoBuffer_initialize(&(i_inst->rxbuf),i_rbuf,i_rbuf_len);\r
-       //      NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));\r
-       i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));\r
+       //      NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(i_inst->_smutex)));//個別Mutex\r
+       i_inst->_smutex=NyLPC_cIPv4_getSockMutex(&(srv->_tcpv4));//共有Mutex\r
        i_inst->tcpstateflags=UIP_CLOSED;\r
        i_inst->txbuf.rp=i_inst->txbuf.wp=0;\r
        for(i=0;i<NyLPC_TcTcpSocket_NUMBER_OF_TXQ;i++){\r
@@ -345,18 +345,13 @@ void NyLPC_cTcpSocket_finalize(NyLPC_TcTcpSocket_t* i_inst)
        return;\r
 }\r
 \r
-/**\r
- * この関数は、NyLPC_cTcpListenerが呼び出すシステムAPIです。\r
- * uipコアタスクが実行します。\r
- * ソケットを、SYNパケットで初期化して、UIP_SYN_RECV状態にします。\r
- * @return\r
- * 遷移に成功すると、TRUEを返します。\r
- */\r
+\r
 NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Payload_t* i_ipp)\r
 {\r
        NyLPC_TUInt16 tmp16;\r
-       //ソケットが無効であること。\r
+//     NyLPC_Assert(NyLPC_cMutex_isLocked(i_inst->_smutex));\r
        lockResource(i_inst);\r
+       //ソケットが無効であること。\r
        if(i_inst->tcpstateflags==UIP_CLOSED)\r
        {\r
                //localipとdefault_mmsは別枠で設定\r
@@ -986,8 +981,8 @@ ReturnWithUnlock:
 }\r
 \r
 /**\r
- * 定期的に実行する関数。最低でも1s単位で実行してください。\r
  * uipサービスタスクが実行する関数です。\r
+ * 定期的に実行する関数。最低でも1s単位で実行してください。\r
  */\r
 void NyLPC_cTcpSocket_periodic(\r
        NyLPC_TcTcpSocket_t* i_inst)\r
@@ -1041,7 +1036,36 @@ void NyLPC_cTcpSocket_periodic(
        NyLPC_cStopwatch_finalize(&sw);\r
        return;\r
 }\r
-\r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの開始を通知します。\r
+ */\r
+void NyLPC_cTcpSocket_startService(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)\r
+{\r
+       NyLPC_Assert(i_inst->tcpstateflags==UIP_CLOSED);//閉じてなければおかしい。\r
+       i_inst->uip_connr.lipaddr=&(i_config->ip_addr);\r
+       i_inst->uip_connr.default_mss=i_config->default_mss;\r
+       //NyLPC_cTcpSocket_setSynPayload関数でも実行するけど、IFのリセット時なのでここでもやる。\r
+       NyLPC_cFifoBuffer_clear(&(i_inst->rxbuf));\r
+       return;\r
+}\r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの停止を通知します。\r
+ */\r
+void NyLPC_cTcpSocket_stopService(NyLPC_TcTcpSocket_t* i_inst)\r
+{\r
+       lockResource(i_inst);\r
+       if(i_inst->tcpstateflags==UIP_CLOSED)\r
+       {\r
+               unlockResource(i_inst);\r
+       }else{\r
+               i_inst->tcpstateflags=UIP_CLOSED;\r
+               resetTxQWithUnlock(i_inst);\r
+               sendRst(i_inst);\r
+       }\r
+       return;\r
+}\r
 \r
 /**\r
  * この関数は、rxパケットを処理して、ソケットの状態を更新します。\r
@@ -1224,12 +1248,7 @@ NyLPC_Trace();
        return NyLPC_TBool_FALSE;\r
 }\r
 \r
-void NyLPC_cTcpSocket_updateConfigulation(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)\r
-{\r
-       i_inst->uip_connr.lipaddr=&(i_config->ip_addr);\r
-       i_inst->uip_connr.default_mss=i_config->default_mss;\r
-       return;\r
-}\r
+\r
 \r
 \r
 \r
index 4a74759..a472363 100644 (file)
@@ -79,13 +79,29 @@ void NyLPC_cTcpSocket_periodic(
        NyLPC_TcTcpSocket_t* i_inst);\r
 \r
 /**\r
- * ソケットをlisten済みにマークします。cTcpListenerからコールします。\r
+ * uipサービスタスクが実行する関数です。\r
+ * uipコアタスクが実行します。\r
+ * コール前に共有MUTEXにロックをかけてください。\r
+ * ソケットを、SYNパケットで初期化して、UIP_SYN_RECV状態にします。\r
+ * @return\r
+ * 遷移に成功すると、TRUEを返します。\r
  */\r
 NyLPC_TBool NyLPC_cTcpSocket_setSynPayload(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Payload_t* i_ipp);\r
 \r
-void NyLPC_cTcpSocket_updateConfigulation(\r
-       NyLPC_TcTcpSocket_t* i_inst,\r
-       const NyLPC_TcIPv4Config_t* i_config);\r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの開始を通知します。\r
+ * この関数は他のAPIが非同期に実行されないことが保証される状況で使用する必要があります。\r
+ */\r
+void NyLPC_cTcpSocket_startService(NyLPC_TcTcpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config);\r
+\r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの停止を通知します。\r
+ * この関数は他のAPIが非同期に実行されないことが保証される状況で使用する必要があります。\r
+ */\r
+void NyLPC_cTcpSocket_stopService(NyLPC_TcTcpSocket_t* i_inst);\r
+\r
 \r
 #ifdef __cplusplus\r
 }\r
index dfc2d40..516ed0d 100644 (file)
@@ -299,11 +299,17 @@ NyLPC_TInt32 NyLPC_cUdpSocket_send(NyLPC_TcUdpSocket_t* i_inst,const struct NyLP
        return i_len;\r
 }\r
 \r
-void NyLPC_cUdpSocket_updateConfigulation(NyLPC_TcUdpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)\r
+void NyLPC_cUdpSocket_startService(NyLPC_TcUdpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config)\r
 {\r
        i_inst->uip_udp_conn.lipaddr=i_config->ip_addr;\r
+       //受信バッファのクリア\r
+       NyLPC_cFifoBuffer_clear(&(i_inst->rxbuf));\r
        return;\r
 }\r
 \r
 \r
+void NyLPC_cUdpSocket_stopService(NyLPC_TcUdpSocket_t* i_inst)\r
+{\r
+       //停止処理?\r
+}\r
 \r
index fe604b3..4444b92 100644 (file)
@@ -23,13 +23,20 @@ extern "C" {
 NyLPC_TBool NyLPC_cUdpSocket_parseRx(\r
        NyLPC_TcUdpSocket_t* i_inst,\r
        NyLPC_TcIPv4Payload_t* o_ipp);\r
+\r
 /**\r
- * この関数は、ネットワークコンフィギュレーションのアップデートを通知します。\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの開始を通知します。\r
+ * この関数は他のAPIが非同期に実行されないことが保証される状況で使用する必要があります。\r
  */\r
-void NyLPC_cUdpSocket_updateConfigulation(\r
-       NyLPC_TcUdpSocket_t* i_inst,\r
-       const NyLPC_TcIPv4Config_t* i_config);\r
+void NyLPC_cUdpSocket_startService(NyLPC_TcUdpSocket_t* i_inst,const NyLPC_TcIPv4Config_t* i_config);\r
 \r
+/**\r
+ * uipサービスタスクが実行する関数です。\r
+ * サービスの停止を通知します。\r
+ * この関数は他のAPIが非同期に実行されないことが保証される状況で使用する必要があります。\r
+ */\r
+void NyLPC_cUdpSocket_stopService(NyLPC_TcUdpSocket_t* i_inst);\r
 \r
 \r
 #ifdef __cplusplus\r
index 3e1f7e5..d5519c7 100644 (file)
@@ -108,6 +108,7 @@ void NyLPC_cUipService_start(const NyLPC_TcIPv4Config_t* i_ref_config);
 /**\r
  * UIP処理を停止します。\r
  * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。\r
+ * 関数を使用する前に、全ての非同期ソケット操作を停止してください。\r
  */\r
 void NyLPC_cUipService_stop(void);\r
 \r
index f635f88..e9ad8e9 100644 (file)
@@ -3,8 +3,6 @@
        <name>app.RemoteMCU</name>\r
        <comment></comment>\r
        <projects>\r
-               <project>NyLPCLib</project>\r
-               <project>FreeRTOSLib</project>\r
        </projects>\r
        <buildSpec>\r
                <buildCommand>\r
index eb80ece..460b802 100644 (file)
@@ -6,9 +6,9 @@ struct NyLPC_TRomFileData fsdata[5]=
 {\r
        {\r
                "setup.html",\r
-               9074,\r
+               9684,\r
                "text/html",\r
-               "\x3C\x68\x74\x6D\x6C\x3E\x0D\x0A\x3C\x68\x65\x61\x64\x3E\x0D\x0A\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x55\x54\x46\x2D\x38\x22\x3E\x0D\x0A\x3C\x6C\x69\x6E\x6B\x20\x68\x72\x65\x66\x3D\x22\x2E\x2F\x6D\x69\x6D\x69\x63\x2E\x63\x73\x73\x22\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x3E\x0D\x0A\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22\x2E\x2F\x73\x6C\x69\x62\x2E\x6A\x73\x22\x3E\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0D\x0A\x0D\x0A\x3C\x73\x74\x79\x6C\x65\x20\x69\x64\x3D\x22\x75\x73\x65\x72\x2D\x73\x74\x79\x6C\x65\x2D\x6E\x79\x61\x74\x6C\x61\x2D\x62\x67\x2D\x69\x6D\x67\x22\x3E\x0D\x0A\x09\x62\x6F\x64\x79\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x39\x35\x25\x3B\x0D\x0A\x09\x09\x68\x65\x69\x67\x68\x74\x3A\x39\x35\x25\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x2C\x70\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x34\x38\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x20\x74\x64\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x6D\x61\x72\x67\x69\x6E\x3A\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x3B\x0D\x0A\x09\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x65\x78\x74\x5F\x72\x6F\x77\x2C\x20\x2E\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x7B\x0D\x0A\x09\x09\x68\x65\x69\x67\x68\x74\x3A\x32\x35\x70\x78\x3B\x0D\x0A\x09\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x34\x31\x36\x39\x45\x31\x3B\x0D\x0A\x09\x09\x63\x6F\x6C\x6F\x72\x3A\x77\x68\x69\x74\x65\x3B\x0D\x0A\x09\x09\x62\x6F\x72\x64\x65\x72\x3A\x73\x6F\x6C\x69\x64\x20\x31\x70\x78\x20\x23\x61\x61\x61\x61\x61\x61\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x62\x6F\x6C\x64\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x64\x31\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x62\x6F\x6C\x64\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x34\x70\x78\x3B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x31\x32\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x64\x32\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x6E\x6F\x72\x6D\x61\x6C\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x32\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x20\x69\x6E\x70\x75\x74\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x32\x30\x30\x70\x78\x3B\x0D\x0A\x09\x09\x62\x6F\x72\x64\x65\x72\x3A\x73\x6F\x6C\x69\x64\x20\x31\x70\x78\x20\x23\x61\x61\x61\x61\x61\x61\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x62\x75\x74\x74\x6F\x6E\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x62\x6F\x6C\x64\x3B\x0D\x0A\x09\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x63\x65\x6E\x74\x65\x72\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x32\x70\x78\x3B\x0D\x0A\x09\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x30\x70\x78\x3B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x36\x30\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x34\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x70\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x39\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0D\x0A\x3C\x73\x63\x72\x69\x70\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22\x3E\x0D\x0A\x0D\x0A\x76\x61\x72\x20\x61\x70\x70\x3B\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x69\x64\x29\x3B\x7D\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x28\x69\x5F\x73\x74\x72\x2C\x64\x65\x6C\x69\x6D\x2C\x6C\x65\x6E\x2C\x64\x69\x67\x69\x74\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x6C\x3D\x69\x5F\x73\x74\x72\x2E\x73\x70\x6C\x69\x74\x28\x64\x65\x6C\x69\x6D\x29\x3B\x0D\x0A\x09\x69\x66\x28\x6C\x2E\x6C\x65\x6E\x67\x74\x68\x3D\x3D\x6C\x65\x6E\x29\x7B\x0D\x0A\x09\x09\x76\x61\x72\x20\x72\x3D\x6E\x65\x77\x20\x41\x72\x72\x61\x79\x28\x29\x3B\x0D\x0A\x09\x09\x66\x6F\x72\x28\x76\x61\x72\x20\x69\x3D\x30\x3B\x69\x3C\x6C\x65\x6E\x3B\x69\x2B\x2B\x29\x7B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x76\x3D\x70\x61\x72\x73\x65\x49\x6E\x74\x28\x6C\x5B\x69\x5D\x2C\x64\x69\x67\x69\x74\x29\x3B\x0D\x0A\x09\x09\x09\x69\x66\x28\x21\x69\x73\x4E\x61\x4E\x28\x76\x29\x20\x26\x26\x20\x76\x3E\x3D\x30\x20\x26\x26\x20\x76\x3C\x3D\x32\x35\x35\x29\x7B\x0D\x0A\x09\x09\x09\x09\x72\x2E\x70\x75\x73\x68\x28\x76\x29\x3B\x0D\x0A\x09\x09\x09\x7D\x65\x6C\x73\x65\x7B\x0D\x0A\x09\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x20\x66\x61\x69\x6C\x65\x64\x2E\x22\x3B\x0D\x0A\x09\x09\x09\x7D\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x74\x68\x72\x6F\x77\x20\x22\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x20\x66\x61\x69\x6C\x65\x64\x2E\x22\x3B\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x76\x61\x6C\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x72\x3D\x76\x61\x6C\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x31\x36\x29\x3B\x0D\x0A\x09\x69\x66\x28\x72\x2E\x6C\x65\x6E\x67\x74\x68\x3C\x32\x29\x7B\x0D\x0A\x09\x09\x72\x3D\x22\x30\x22\x2B\x72\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x3B\x0D\x0A\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x61\x72\x29\x0D\x0A\x7B\x0D\x0A\x09\x69\x66\x28\x61\x72\x3D\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x6E\x75\x6C\x6C\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x76\x61\x72\x20\x72\x65\x74\x3D\x22\x22\x3B\x0D\x0A\x09\x66\x6F\x72\x28\x76\x61\x72\x20\x69\x3D\x30\x3B\x69\x3C\x61\x72\x2E\x6C\x65\x6E\x67\x74\x68\x3B\x69\x2B\x2B\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x2B\x3D\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x61\x72\x5B\x69\x5D\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x65\x74\x3B\x0D\x0A\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x73\x74\x72\x28\x76\x61\x6C\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x76\x61\x6C\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x31\x30\x29\x3B\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x76\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x2E\x22\x2B\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x2E\x22\x2B\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x38\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x2E\x22\x2B\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x30\x29\x26\x30\x78\x66\x66\x29\x3B\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x4D\x61\x63\x41\x64\x64\x72\x28\x76\x31\x2C\x76\x32\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x38\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x30\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x32\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x32\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x3B\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x76\x61\x72\x20\x55\x69\x3D\x6E\x65\x77\x20\x4F\x62\x6A\x65\x63\x74\x28\x29\x3B\x0D\x0A\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x69\x6E\x70\x75\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x3D\x7B\x0D\x0A\x09\x09\x6F\x6E\x63\x68\x61\x6E\x67\x65\x3A\x6E\x75\x6C\x6C\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x6F\x6E\x43\x68\x61\x6E\x67\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x21\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x28\x29\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x2C\x22\x2E\x22\x2C\x34\x2C\x31\x30\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x54\x65\x78\x74\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x31\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3D\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x76\x31\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x55\x69\x2E\x4D\x61\x63\x41\x64\x64\x72\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x69\x6E\x70\x75\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x65\x76\x65\x6E\x74\x73\x3D\x7B\x0D\x0A\x09\x09\x6F\x6E\x63\x68\x61\x6E\x67\x65\x3A\x6E\x75\x6C\x6C\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x6F\x6E\x43\x68\x61\x6E\x67\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x21\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x28\x29\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x09\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x4D\x61\x63\x41\x64\x64\x72\x2E\x70\x72\x6F\x74\x6F\x74\x79\x70\x65\x3D\x0D\x0A\x7B\x0D\x0A\x09\x65\x76\x65\x6E\x74\x73\x3A\x6E\x75\x6C\x6C\x2C\x0D\x0A\x09\x5F\x74\x61\x67\x73\x3A\x6E\x75\x6C\x6C\x2C\x0D\x0A\x09\x67\x65\x74\x4D\x61\x63\x41\x64\x64\x72\x3A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x28\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x2C\x22\x3A\x22\x2C\x36\x2C\x31\x36\x29\x3B\x0D\x0A\x09\x7D\x2C\x0D\x0A\x09\x67\x65\x74\x54\x65\x78\x74\x3A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3B\x0D\x0A\x09\x7D\x2C\x0D\x0A\x09\x73\x65\x74\x4D\x61\x63\x56\x61\x6C\x75\x65\x3A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x31\x2C\x76\x32\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3D\x69\x6E\x74\x32\x4D\x61\x63\x41\x64\x64\x72\x28\x76\x31\x2C\x76\x32\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x55\x69\x2E\x41\x63\x63\x65\x73\x73\x4D\x6F\x64\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x73\x65\x6C\x65\x63\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x65\x76\x65\x6E\x74\x73\x3D\x7B\x0D\x0A\x09\x09\x6F\x6E\x63\x68\x61\x6E\x67\x65\x3A\x6E\x75\x6C\x6C\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x73\x65\x6C\x65\x63\x74\x2E\x6F\x6E\x43\x68\x61\x6E\x67\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x21\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x28\x29\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x09\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x41\x63\x63\x65\x73\x73\x4D\x6F\x64\x65\x2E\x70\x72\x6F\x74\x6F\x74\x79\x70\x65\x3D\x0D\x0A\x7B\x0D\x0A\x09\x65\x76\x65\x6E\x74\x73\x3A\x6E\x75\x6C\x6C\x2C\x0D\x0A\x09\x5F\x74\x61\x67\x73\x3A\x6E\x75\x6C\x6C\x2C\x0D\x0A\x09\x67\x65\x74\x4D\x6F\x64\x65\x3A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x73\x65\x6C\x65\x63\x74\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x20\x3B\x0D\x0A\x09\x7D\x2C\x0D\x0A\x09\x73\x65\x74\x56\x61\x6C\x75\x65\x3A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x31\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x73\x65\x6C\x65\x63\x74\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x20\x3D\x76\x31\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x0D\x0A\x55\x69\x2E\x55\x70\x64\x61\x74\x65\x42\x75\x74\x74\x6F\x6E\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x62\x75\x74\x74\x6F\x6E\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x7D\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x65\x76\x65\x6E\x74\x73\x3D\x7B\x6F\x6E\x63\x6C\x69\x63\x6B\x3A\x6E\x75\x6C\x6C\x7D\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x62\x75\x74\x74\x6F\x6E\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x21\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x28\x29\x3B\x0D\x0A\x09\x09\x7D\x09\x09\x0D\x0A\x09\x7D\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x62\x75\x74\x74\x6F\x6E\x2E\x64\x69\x73\x61\x62\x6C\x65\x64\x3D\x66\x61\x6C\x73\x65\x3B\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x55\x70\x64\x61\x74\x65\x42\x75\x74\x74\x6F\x6E\x2E\x70\x72\x6F\x74\x6F\x74\x79\x70\x65\x3D\x0D\x0A\x7B\x0D\x0A\x09\x65\x76\x65\x6E\x74\x73\x3A\x6E\x75\x6C\x6C\x2C\x5F\x74\x61\x67\x73\x3A\x6E\x75\x6C\x6C\x2C\x0D\x0A\x09\x64\x69\x73\x61\x62\x6C\x65\x3A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x62\x75\x74\x74\x6F\x6E\x2E\x64\x69\x73\x61\x62\x6C\x65\x64\x3D\x74\x72\x75\x65\x3B\x7D\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x43\x61\x6E\x63\x65\x6C\x42\x75\x74\x74\x6F\x6E\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x62\x75\x74\x74\x6F\x6E\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x7D\x3B\x0D\x0A\x09\x74\x68\x69\x73\x2E\x5F\x74\x61\x67\x73\x2E\x62\x75\x74\x74\x6F\x6E\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x77\x69\x6E\x64\x6F\x77\x2E\x63\x6F\x6E\x66\x69\x72\x6D\x28\x27\x44\x6F\x20\x79\x6F\x75\x20\x77\x61\x6E\x74\x20\x74\x6F\x20\x63\x61\x6E\x63\x65\x6C\x3F\x27\x29\x29\x7B\x0D\x0A\x09\x09\x09\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x6C\x6F\x63\x61\x74\x69\x6F\x6E\x3D\x22\x2E\x2F\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C\x22\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x53\x45\x54\x55\x50\x5F\x41\x50\x49\x3D\x22\x2F\x73\x65\x74\x75\x70\x2F\x73\x65\x74\x75\x70\x2E\x61\x70\x69\x22\x3B\x20\x0D\x0A\x09\x76\x61\x72\x20\x75\x69\x3D\x7B\x0D\x0A\x09\x09\x6D\x61\x63\x61\x64\x64\x72\x3A\x6E\x65\x77\x20\x55\x69\x2E\x4D\x61\x63\x41\x64\x64\x72\x28\x22\x6D\x61\x63\x61\x64\x64\x72\x69\x6E\x70\x75\x74\x22\x29\x2C\x0D\x0A\x09\x09\x63\x61\x6E\x63\x65\x6C\x3A\x6E\x65\x77\x20\x55\x69\x2E\x43\x61\x6E\x63\x65\x6C\x42\x75\x74\x74\x6F\x6E\x28\x22\x63\x61\x6E\x63\x65\x6C\x22\x29\x2C\x0D\x0A\x09\x09\x75\x70\x64\x61\x74\x65\x3A\x6E\x65\x77\x20\x55\x69\x2E\x55\x70\x64\x61\x74\x65\x42\x75\x74\x74\x6F\x6E\x28\x22\x75\x70\x64\x61\x74\x65\x62\x74\x6E\x22\x29\x2C\x0D\x0A\x09\x09\x69\x70\x61\x64\x64\x72\x3A\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x28\x22\x69\x70\x69\x6E\x70\x75\x74\x22\x29\x2C\x0D\x0A\x09\x09\x73\x75\x62\x6E\x65\x74\x6D\x61\x73\x6B\x3A\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x28\x22\x73\x75\x62\x6E\x65\x74\x69\x6E\x70\x75\x74\x22\x29\x2C\x0D\x0A\x09\x09\x64\x67\x61\x74\x65\x77\x61\x79\x3A\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x28\x22\x64\x67\x69\x6E\x70\x75\x74\x22\x29\x2C\x0D\x0A\x09\x09\x6D\x76\x6D\x5F\x61\x63\x3A\x6E\x65\x77\x20\x55\x69\x2E\x41\x63\x63\x65\x73\x73\x4D\x6F\x64\x65\x28\x22\x6D\x76\x6D\x73\x65\x6C\x65\x63\x74\x22\x29\x2C\x0D\x0A\x09\x09\x73\x65\x74\x75\x70\x5F\x61\x63\x3A\x6E\x65\x77\x20\x55\x69\x2E\x41\x63\x63\x65\x73\x73\x4D\x6F\x64\x65\x28\x22\x73\x65\x74\x75\x70\x73\x65\x6C\x65\x63\x74\x22\x29\x0D\x0A\x09\x7D\x0D\x0A\x09\x75\x69\x2E\x75\x70\x64\x61\x74\x65\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x2F\x2F\xE5\x80\xA4\xE3\x83\x81\xE3\x82\xA7\xE3\x83\x83\xE3\x82\xAF\x0D\x0A\x09\x09\x74\x72\x79\x7B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x73\x71\x3D\x30\x3B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x6D\x61\x63\x3D\x75\x69\x2E\x6D\x61\x63\x61\x64\x64\x72\x2E\x67\x65\x74\x4D\x61\x63\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x73\x71\x3D\x31\x3B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x69\x70\x3D\x75\x69\x2E\x69\x70\x61\x64\x64\x72\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x73\x71\x3D\x32\x3B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x73\x75\x62\x6E\x65\x74\x3D\x75\x69\x2E\x73\x75\x62\x6E\x65\x74\x6D\x61\x73\x6B\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x73\x71\x3D\x33\x3B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x64\x67\x61\x74\x65\x3D\x75\x69\x2E\x64\x67\x61\x74\x65\x77\x61\x79\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x73\x71\x3D\x34\x3B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x70\x6D\x3D\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x6D\x61\x63\x29\x2B\x22\x66\x66\x66\x66\x22\x0D\x0A\x09\x09\x09\x09\x2B\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x69\x70\x29\x0D\x0A\x09\x09\x09\x09\x2B\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x73\x75\x62\x6E\x65\x74\x29\x0D\x0A\x09\x09\x09\x09\x2B\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x64\x67\x61\x74\x65\x29\x0D\x0A\x09\x09\x09\x09\x2B\x22\x30\x30\x35\x30\x30\x30\x30\x30\x22\x0D\x0A\x09\x09\x09\x09\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x75\x69\x2E\x6D\x76\x6D\x5F\x61\x63\x2E\x67\x65\x74\x4D\x6F\x64\x65\x28\x29\x29\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x75\x69\x2E\x73\x65\x74\x75\x70\x5F\x61\x63\x2E\x67\x65\x74\x4D\x6F\x64\x65\x28\x29\x29\x2B\x22\x66\x66\x66\x66\x22\x3B\x0D\x0A\x09\x09\x09\x73\x71\x3D\x35\x3B\x0D\x0A\x09\x09\x09\x2F\x2F\x4C\x50\x43\x58\x50\x72\x65\x73\x73\x6F\xE3\x81\xB8\xE9\x80\x81\xE4\xBF\xA1\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x72\x65\x74\x3D\x65\x76\x61\x6C\x28\x22\x28\x22\x2B\x73\x6C\x69\x62\x2E\x78\x68\x72\x28\x53\x45\x54\x55\x50\x5F\x41\x50\x49\x2B\x22\x3F\x63\x3D\x75\x70\x64\x61\x74\x65\x26\x70\x3D\x22\x2B\x70\x6D\x29\x2E\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74\x2B\x22\x29\x22\x29\x3B\x0D\x0A\x09\x09\x09\x73\x71\x3D\x36\x3B\x0D\x0A\x09\x09\x09\x69\x66\x28\x72\x65\x74\x2E\x72\x65\x73\x75\x6C\x74\x21\x3D\x30\x78\x30\x29\x7B\x0D\x0A\x09\x09\x09\x09\x61\x6C\x65\x72\x74\x28\x22\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x75\x70\x64\x61\x74\x65\x20\x69\x73\x20\x66\x61\x69\x6C\x65\x64\x2E\x20\x63\x6F\x64\x65\x3D\x30\x78\x22\x2B\x72\x65\x74\x2E\x72\x65\x73\x75\x6C\x74\x29\x3B\x0D\x0A\x09\x09\x09\x7D\x65\x6C\x73\x65\x7B\x0D\x0A\x09\x09\x09\x09\x61\x6C\x65\x72\x74\x28\x22\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x69\x73\x20\x63\x68\x61\x6E\x67\x65\x64\x2E\x5C\x6E\x20\x52\x65\x73\x74\x61\x72\x74\x20\x74\x68\x65\x20\x4D\x69\x4D\x69\x63\x52\x65\x6D\x6F\x74\x65\x4D\x43\x55\x20\x74\x6F\x20\x65\x6E\x61\x62\x6C\x65\x20\x74\x68\x65\x20\x73\x65\x74\x74\x69\x6E\x67\x2E\x22\x29\x3B\x0D\x0A\x09\x09\x09\x7D\x0D\x0A\x09\x09\x7D\x63\x61\x74\x63\x68\x28\x65\x29\x7B\x0D\x0A\x09\x09\x09\x73\x77\x69\x74\x63\x68\x28\x73\x71\x29\x7B\x0D\x0A\x09\x09\x09\x63\x61\x73\x65\x20\x30\x3A\x09\x61\x6C\x65\x72\x74\x28\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x4D\x41\x43\x20\x61\x64\x64\x72\x65\x73\x73\x20\x27\x22\x2B\x75\x69\x2E\x6D\x61\x63\x61\x64\x64\x72\x2E\x67\x65\x74\x54\x65\x78\x74\x28\x29\x2B\x22\x27\x22\x29\x3B\x62\x72\x65\x61\x6B\x3B\x0D\x0A\x09\x09\x09\x63\x61\x73\x65\x20\x31\x3A\x20\x61\x6C\x65\x72\x74\x28\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x49\x50\x20\x61\x64\x64\x72\x65\x73\x73\x20\x27\x22\x2B\x75\x69\x2E\x69\x70\x61\x64\x64\x72\x2E\x67\x65\x74\x54\x65\x78\x74\x28\x29\x2B\x22\x27\x22\x29\x3B\x62\x72\x65\x61\x6B\x3B\x0D\x0A\x09\x09\x09\x63\x61\x73\x65\x20\x32\x3A\x09\x61\x6C\x65\x72\x74\x28\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x73\x75\x62\x6E\x65\x74\x20\x6D\x61\x73\x6B\x20\x27\x22\x2B\x75\x69\x2E\x73\x75\x62\x6E\x65\x74\x6D\x61\x73\x6B\x2E\x67\x65\x74\x54\x65\x78\x74\x28\x29\x2B\x22\x27\x22\x29\x3B\x62\x72\x65\x61\x6B\x3B\x0D\x0A\x09\x09\x09\x63\x61\x73\x65\x20\x33\x3A\x20\x61\x6C\x65\x72\x74\x28\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x64\x65\x66\x61\x75\x6C\x74\x20\x67\x61\x74\x65\x77\x61\x79\x27\x22\x2B\x75\x69\x2E\x64\x67\x61\x74\x65\x77\x61\x79\x2E\x67\x65\x74\x54\x65\x78\x74\x28\x29\x2B\x22\x27\x22\x29\x3B\x62\x72\x65\x61\x6B\x3B\x0D\x0A\x09\x09\x09\x63\x61\x73\x65\x20\x36\x3A\x20\x61\x6C\x65\x72\x74\x28\x22\x4D\x69\x4D\x69\x63\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x70\x72\x6F\x63\x65\x73\x73\x20\x66\x61\x69\x6C\x65\x64\x20\x61\x74\x20\x58\x48\x52\x2E\x22\x29\x3B\x62\x72\x65\x61\x6B\x3B\x0D\x0A\x09\x09\x09\x64\x65\x66\x61\x75\x6C\x74\x3A\x0D\x0A\x09\x09\x09\x09\x61\x6C\x65\x72\x74\x28\x22\x4D\x69\x4D\x69\x63\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x70\x72\x6F\x63\x65\x73\x73\x20\x66\x61\x69\x6C\x65\x64\x20\x62\x79\x20\x27\x22\x2B\x65\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x29\x2B\x22\x27\x2E\x22\x29\x3B\x62\x72\x65\x61\x6B\x3B\x0D\x0A\x09\x09\x09\x7D\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x09\x0D\x0A\x09\x7D\x0D\x0A\x09\x74\x72\x79\x7B\x0D\x0A\x09\x09\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x6E\x2C\x76\x29\x7B\x67\x65\x74\x45\x6C\x65\x6D\x28\x6E\x29\x2E\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x3D\x76\x3B\x7D\x0D\x0A\x09\x09\x76\x61\x72\x20\x63\x66\x67\x3D\x65\x76\x61\x6C\x28\x22\x28\x22\x2B\x73\x6C\x69\x62\x2E\x78\x68\x72\x28\x53\x45\x54\x55\x50\x5F\x41\x50\x49\x2B\x22\x3F\x63\x3D\x67\x65\x74\x22\x29\x2E\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74\x2B\x22\x29\x22\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x76\x65\x72\x73\x69\x6F\x6E\x22\x2C\x63\x66\x67\x2E\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x6C\x61\x6E\x22\x2C\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x6C\x61\x6E\x64\x65\x76\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x63\x64\x72\x22\x2C\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x63\x6F\x72\x65\x64\x62\x67\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x6D\x61\x63\x22\x2C\x69\x6E\x74\x32\x4D\x61\x63\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x6D\x61\x63\x30\x30\x30\x31\x30\x32\x30\x33\x2C\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x6D\x61\x63\x30\x34\x30\x35\x78\x78\x78\x78\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x69\x70\x22\x2C\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x69\x70\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x6D\x61\x73\x6B\x22\x2C\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x6D\x61\x73\x6B\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x74\x64\x5F\x63\x75\x72\x5F\x64\x72\x6F\x75\x74\x65\x22\x2C\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x69\x6E\x66\x6F\x2E\x64\x72\x6F\x75\x74\x65\x29\x29\x3B\x0D\x0A\x09\x09\x0D\x0A\x09\x09\x75\x69\x2E\x6D\x61\x63\x61\x64\x64\x72\x2E\x73\x65\x74\x4D\x61\x63\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x6D\x61\x63\x30\x30\x30\x31\x30\x32\x30\x33\x2C\x63\x66\x67\x2E\x6D\x61\x63\x30\x34\x30\x35\x78\x78\x78\x78\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x69\x70\x61\x64\x64\x72\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x69\x70\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x73\x75\x62\x6E\x65\x74\x6D\x61\x73\x6B\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x6D\x61\x73\x6B\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x64\x67\x61\x74\x65\x77\x61\x79\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x64\x72\x6F\x75\x74\x65\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x6D\x76\x6D\x5F\x61\x63\x2E\x73\x65\x74\x56\x61\x6C\x75\x65\x28\x28\x63\x66\x67\x2E\x61\x63\x63\x65\x73\x73\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x73\x65\x74\x75\x70\x5F\x61\x63\x2E\x73\x65\x74\x56\x61\x6C\x75\x65\x28\x28\x63\x66\x67\x2E\x61\x63\x63\x65\x73\x73\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x3B\x0D\x0A\x09\x7D\x63\x61\x74\x63\x68\x28\x65\x29\x7B\x0D\x0A\x09\x09\x75\x69\x2E\x75\x70\x64\x61\x74\x65\x2E\x64\x69\x73\x61\x62\x6C\x65\x28\x29\x3B\x0D\x0A\x09\x09\x61\x6C\x65\x72\x74\x28\x22\x4D\x69\x4D\x69\x63\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x6F\x72\x20\x66\x61\x69\x6C\x65\x64\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x27\x22\x2B\x65\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x29\x2B\x22\x27\x22\x29\x3B\x0D\x0A\x09\x7D\x09\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x28\x29\x0D\x0A\x7B\x0D\x0A\x09\x61\x70\x70\x3D\x6E\x65\x77\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x28\x29\x3B\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0D\x0A\x3C\x2F\x68\x65\x61\x64\x3E\x0D\x0A\x3C\x62\x6F\x64\x79\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x69\x6E\x69\x74\x28\x29\x3B\x22\x3E\x0D\x0A\x3C\x68\x31\x3E\x4D\x69\x4D\x69\x63\x20\x52\x65\x6D\x6F\x74\x65\x4D\x43\x55\x20\x6F\x6E\x2D\x63\x68\x69\x70\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x3C\x2F\x68\x31\x3E\x0D\x0A\x3C\x68\x72\x2F\x3E\x0D\x0A\x0D\x0A\x09\x3C\x68\x32\x3E\x43\x75\x72\x72\x65\x6E\x74\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3C\x2F\x68\x32\x3E\x0D\x0A\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x22\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x56\x65\x72\x73\x69\x6F\x6E\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x76\x65\x72\x73\x69\x6F\x6E\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x4C\x41\x4E\x20\x50\x48\x59\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x6C\x61\x6E\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x43\x44\x52\x20\x74\x79\x70\x65\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x63\x64\x72\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x4D\x41\x43\x20\x61\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x6D\x61\x63\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x49\x50\x20\x61\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x69\x70\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x4E\x65\x74\x20\x4D\x61\x73\x6B\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x6D\x61\x73\x6B\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x65\x78\x74\x5F\x72\x6F\x77\x22\x20\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x44\x65\x66\x61\x75\x6C\x74\x20\x67\x61\x74\x65\x77\x61\x79\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x32\x22\x20\x69\x64\x3D\x22\x74\x64\x5F\x63\x75\x72\x5F\x64\x72\x6F\x75\x74\x65\x22\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x3C\x70\x3E\x0D\x0A\x49\x66\x20\x6C\x6F\x63\x61\x6C\x20\x73\x65\x74\x74\x69\x6E\x67\x20\x66\x69\x6C\x65\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x2C\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x20\x6D\x69\x67\x68\x74\x20\x62\x65\x20\x64\x69\x66\x66\x65\x72\x65\x6E\x74\x20\x77\x69\x74\x68\x20\x6F\x6E\x63\x68\x69\x70\x2D\x73\x65\x74\x74\x69\x6E\x67\x2E\x20\x54\x6F\x20\x66\x75\x6C\x6C\x79\x20\x65\x6E\x61\x62\x6C\x65\x20\x6F\x6E\x2D\x63\x68\x69\x70\x20\x73\x65\x74\x74\x69\x6E\x67\x2C\x20\x70\x6C\x65\x61\x73\x65\x20\x72\x65\x6D\x6F\x76\x65\x20\x74\x68\x65\x20\x73\x65\x74\x74\x69\x6E\x67\x20\x66\x69\x6C\x65\x20\x22\x2F\x6D\x69\x6D\x69\x63\x2E\x63\x66\x67\x22\x20\x69\x6E\x20\x6D\x62\x65\x64\x20\x20\x6C\x6F\x63\x61\x6C\x20\x66\x69\x6C\x65\x20\x73\x79\x73\x74\x65\x6D\x20\x6F\x72\x20\x53\x44\x63\x61\x72\x64\x20\x66\x69\x6C\x65\x20\x73\x79\x73\x74\x65\x6D\x2E\x0D\x0A\x09\x3C\x2F\x70\x3E\x0D\x0A\x09\x0D\x0A\x09\x3C\x68\x32\x3E\x45\x74\x68\x65\x72\x6E\x65\x74\x3C\x2F\x68\x32\x3E\x0D\x0A\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x22\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x22\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x4D\x41\x43\x20\x61\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x6D\x61\x63\x61\x64\x64\x72\x69\x6E\x70\x75\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x22\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x49\x50\x20\x61\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x69\x70\x69\x6E\x70\x75\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x22\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x53\x75\x62\x6E\x65\x74\x20\x6D\x61\x73\x6B\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x73\x75\x62\x6E\x65\x74\x69\x6E\x70\x75\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x22\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x44\x65\x66\x61\x75\x6C\x74\x20\x67\x61\x74\x65\x77\x61\x79\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x64\x67\x69\x6E\x70\x75\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x3C\x68\x32\x3E\x53\x65\x63\x75\x72\x69\x74\x79\x28\x75\x6E\x73\x75\x70\x70\x6F\x72\x74\x65\x64\x29\x3C\x2F\x68\x32\x3E\x0D\x0A\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x22\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x22\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x73\x65\x74\x75\x70\x2E\x61\x70\x69\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x73\x65\x6C\x65\x63\x74\x20\x69\x64\x3D\x22\x73\x65\x74\x75\x70\x73\x65\x6C\x65\x63\x74\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79\x3A\x68\x69\x64\x64\x65\x6E\x22\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x20\x76\x61\x6C\x75\x65\x3D\x22\x30\x22\x3E\x53\x75\x62\x6E\x65\x74\x20\x6F\x6E\x6C\x79\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x20\x76\x61\x6C\x75\x65\x3D\x22\x31\x22\x3E\x41\x6C\x6C\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x2F\x73\x65\x6C\x65\x63\x74\x3E\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x20\x63\x6C\x61\x73\x73\x3D\x22\x69\x6E\x70\x75\x74\x5F\x72\x6F\x77\x22\x3E\x3C\x74\x64\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x64\x31\x22\x3E\x6D\x76\x6D\x2E\x61\x70\x69\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x73\x65\x6C\x65\x63\x74\x20\x69\x64\x3D\x22\x6D\x76\x6D\x73\x65\x6C\x65\x63\x74\x22\x20\x73\x74\x79\x6C\x65\x3D\x22\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79\x3A\x68\x69\x64\x64\x65\x6E\x22\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x20\x76\x61\x6C\x75\x65\x3D\x22\x30\x22\x3E\x53\x75\x62\x6E\x65\x74\x20\x6F\x6E\x6C\x79\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x20\x76\x61\x6C\x75\x65\x3D\x22\x31\x22\x3E\x41\x6C\x6C\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x2F\x73\x65\x6C\x65\x63\x74\x3E\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x3C\x62\x72\x2F\x3E\x0D\x0A\x09\x3C\x62\x72\x2F\x3E\x0D\x0A\x09\x3C\x62\x75\x74\x74\x6F\x6E\x20\x69\x64\x3D\x22\x75\x70\x64\x61\x74\x65\x62\x74\x6E\x22\x3E\x55\x70\x64\x61\x74\x65\x3C\x2F\x62\x75\x74\x74\x6F\x6E\x3E\x0D\x0A\x09\x3C\x62\x75\x74\x74\x6F\x6E\x20\x69\x64\x3D\x22\x63\x61\x6E\x63\x65\x6C\x22\x3E\x43\x61\x6E\x63\x65\x6C\x3C\x2F\x62\x75\x74\x74\x6F\x6E\x3E\x0D\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0D\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x2F\x6D\x69\x6D\x69\x63\x2F\x77\x70\x22\x20\x61\x6C\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x2F\x6D\x69\x6D\x69\x63\x2F\x77\x70\x22\x3E\x0D\x0A\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x2E\x2F\x6D\x69\x6D\x69\x63\x6C\x6F\x67\x6F\x2E\x70\x6E\x67\x22\x2F\x3E\x3C\x2F\x61\x3E\x0D\x0A\x4D\x69\x4D\x69\x63\x3C\x62\x72\x2F\x3E\x0D\x0A\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x2D\x32\x30\x31\x33\x20\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x20\x41\x6C\x6C\x20\x52\x69\x67\x68\x74\x73\x20\x52\x65\x73\x65\x72\x76\x65\x64\x2E\x0D\x0A\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x3C\x2F\x62\x6F\x64\x79\x3E\x0D\x0A"\r
+               "\x3C\x68\x74\x6D\x6C\x3E\x0D\x0A\x3C\x68\x65\x61\x64\x3E\x0D\x0A\x3C\x6D\x65\x74\x61\x20\x68\x74\x74\x70\x2D\x65\x71\x75\x69\x76\x3D\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65\x22\x20\x63\x6F\x6E\x74\x65\x6E\x74\x3D\x22\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x3B\x20\x63\x68\x61\x72\x73\x65\x74\x3D\x55\x54\x46\x2D\x38\x22\x3E\x0D\x0A\x3C\x6C\x69\x6E\x6B\x20\x68\x72\x65\x66\x3D\x22\x2E\x2F\x6D\x69\x6D\x69\x63\x2E\x63\x73\x73\x22\x20\x72\x65\x6C\x3D\x22\x73\x74\x79\x6C\x65\x73\x68\x65\x65\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x63\x73\x73\x22\x3E\x0D\x0A\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22\x2E\x2F\x73\x6C\x69\x62\x2E\x6A\x73\x22\x3E\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0D\x0A\x0D\x0A\x3C\x73\x74\x79\x6C\x65\x20\x69\x64\x3D\x22\x75\x73\x65\x72\x2D\x73\x74\x79\x6C\x65\x2D\x6E\x79\x61\x74\x6C\x61\x2D\x62\x67\x2D\x69\x6D\x67\x22\x3E\x0D\x0A\x09\x62\x6F\x64\x79\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x39\x35\x25\x3B\x0D\x0A\x09\x09\x68\x65\x69\x67\x68\x74\x3A\x39\x35\x25\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x62\x75\x74\x74\x6F\x6E\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x62\x6F\x6C\x64\x3B\x0D\x0A\x09\x09\x74\x65\x78\x74\x2D\x61\x6C\x69\x67\x6E\x3A\x63\x65\x6E\x74\x65\x72\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x32\x70\x78\x3B\x0D\x0A\x09\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x30\x70\x78\x3B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x36\x30\x70\x78\x3B\x68\x65\x69\x67\x68\x74\x3A\x34\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x65\x78\x70\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x39\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x31\x2C\x70\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x34\x38\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x31\x20\x74\x72\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x68\x65\x69\x67\x68\x74\x3A\x32\x35\x70\x78\x3B\x0D\x0A\x09\x09\x62\x61\x63\x6B\x67\x72\x6F\x75\x6E\x64\x2D\x63\x6F\x6C\x6F\x72\x3A\x23\x34\x31\x36\x39\x45\x31\x3B\x0D\x0A\x09\x09\x63\x6F\x6C\x6F\x72\x3A\x77\x68\x69\x74\x65\x3B\x0D\x0A\x09\x09\x62\x6F\x72\x64\x65\x72\x3A\x73\x6F\x6C\x69\x64\x20\x31\x70\x78\x20\x23\x61\x61\x61\x61\x61\x61\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x62\x6F\x6C\x64\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x31\x20\x74\x64\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x6D\x61\x72\x67\x69\x6E\x3A\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x3B\x0D\x0A\x09\x09\x70\x61\x64\x64\x69\x6E\x67\x3A\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x20\x32\x70\x78\x3B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x73\x69\x7A\x65\x3A\x31\x32\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x31\x20\x2E\x63\x6F\x6C\x31\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x31\x32\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x31\x20\x70\x7B\x0D\x0A\x09\x09\x66\x6F\x6E\x74\x2D\x77\x65\x69\x67\x68\x74\x3A\x6E\x6F\x72\x6D\x61\x6C\x3B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x31\x30\x30\x25\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x69\x6E\x70\x75\x74\x2C\x73\x65\x6C\x65\x63\x74\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x62\x6F\x72\x64\x65\x72\x3A\x73\x6F\x6C\x69\x64\x20\x31\x70\x78\x20\x23\x61\x61\x61\x61\x61\x61\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x31\x20\x69\x6E\x70\x75\x74\x2C\x73\x65\x6C\x65\x63\x74\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x32\x30\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x2E\x74\x61\x62\x6C\x65\x32\x20\x69\x6E\x70\x75\x74\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x77\x69\x64\x74\x68\x3A\x31\x30\x30\x70\x78\x3B\x0D\x0A\x09\x7D\x0D\x0A\x3C\x2F\x73\x74\x79\x6C\x65\x3E\x0D\x0A\x3C\x73\x63\x72\x69\x70\x74\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x2F\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x22\x3E\x0D\x0A\x0D\x0A\x76\x61\x72\x20\x61\x70\x70\x3B\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x67\x65\x74\x45\x6C\x65\x6D\x65\x6E\x74\x42\x79\x49\x64\x28\x69\x64\x29\x3B\x7D\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x28\x69\x5F\x73\x74\x72\x2C\x64\x65\x6C\x69\x6D\x2C\x6C\x65\x6E\x2C\x64\x69\x67\x69\x74\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x6C\x3D\x69\x5F\x73\x74\x72\x2E\x73\x70\x6C\x69\x74\x28\x64\x65\x6C\x69\x6D\x29\x3B\x0D\x0A\x09\x69\x66\x28\x6C\x2E\x6C\x65\x6E\x67\x74\x68\x3D\x3D\x6C\x65\x6E\x29\x7B\x0D\x0A\x09\x09\x76\x61\x72\x20\x72\x3D\x6E\x65\x77\x20\x41\x72\x72\x61\x79\x28\x29\x3B\x0D\x0A\x09\x09\x66\x6F\x72\x28\x76\x61\x72\x20\x69\x3D\x30\x3B\x69\x3C\x6C\x65\x6E\x3B\x69\x2B\x2B\x29\x7B\x0D\x0A\x09\x09\x09\x76\x61\x72\x20\x76\x3D\x70\x61\x72\x73\x65\x49\x6E\x74\x28\x6C\x5B\x69\x5D\x2C\x64\x69\x67\x69\x74\x29\x3B\x0D\x0A\x09\x09\x09\x69\x66\x28\x21\x69\x73\x4E\x61\x4E\x28\x76\x29\x20\x26\x26\x20\x76\x3E\x3D\x30\x20\x26\x26\x20\x76\x3C\x3D\x32\x35\x35\x29\x7B\x0D\x0A\x09\x09\x09\x09\x72\x2E\x70\x75\x73\x68\x28\x76\x29\x3B\x0D\x0A\x09\x09\x09\x7D\x65\x6C\x73\x65\x7B\x0D\x0A\x09\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x20\x66\x61\x69\x6C\x65\x64\x2E\x22\x3B\x0D\x0A\x09\x09\x09\x7D\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x74\x68\x72\x6F\x77\x20\x22\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x20\x66\x61\x69\x6C\x65\x64\x2E\x22\x3B\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x68\x65\x78\x28\x76\x2C\x64\x29\x7B\x76\x61\x72\x20\x72\x3D\x76\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x31\x36\x29\x3B\x77\x68\x69\x6C\x65\x28\x72\x2E\x6C\x65\x6E\x67\x74\x68\x3C\x64\x29\x7B\x72\x3D\x22\x30\x22\x2B\x72\x3B\x7D\x72\x65\x74\x75\x72\x6E\x20\x72\x3B\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x76\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x69\x6E\x74\x32\x68\x65\x78\x28\x76\x2C\x32\x29\x3B\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x61\x72\x29\x0D\x0A\x7B\x0D\x0A\x09\x69\x66\x28\x61\x72\x3D\x3D\x6E\x75\x6C\x6C\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x6E\x75\x6C\x6C\x3B\x7D\x0D\x0A\x09\x76\x61\x72\x20\x72\x65\x74\x3D\x22\x22\x3B\x0D\x0A\x09\x66\x6F\x72\x28\x76\x61\x72\x20\x69\x3D\x30\x3B\x69\x3C\x61\x72\x2E\x6C\x65\x6E\x67\x74\x68\x3B\x69\x2B\x2B\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x2B\x3D\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x61\x72\x5B\x69\x5D\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x65\x74\x3B\x0D\x0A\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x73\x74\x72\x28\x76\x61\x6C\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x76\x61\x6C\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x31\x30\x29\x3B\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x76\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x2E\x22\x2B\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x2E\x22\x2B\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x38\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x2E\x22\x2B\x69\x6E\x74\x32\x73\x74\x72\x28\x28\x76\x3E\x3E\x30\x29\x26\x30\x78\x66\x66\x29\x3B\x7D\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x74\x32\x4D\x61\x63\x41\x64\x64\x72\x28\x76\x31\x2C\x76\x32\x29\x7B\x72\x65\x74\x75\x72\x6E\x20\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x38\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x31\x3E\x3E\x30\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x32\x3E\x3E\x32\x34\x29\x26\x30\x78\x66\x66\x29\x2B\x22\x3A\x22\x2B\x69\x6E\x74\x32\x68\x65\x78\x32\x28\x28\x76\x32\x3E\x3E\x31\x36\x29\x26\x30\x78\x66\x66\x29\x3B\x7D\x0D\x0A\x0D\x0A\x76\x61\x72\x20\x55\x69\x3D\x6E\x65\x77\x20\x4F\x62\x6A\x65\x63\x74\x28\x29\x3B\x0D\x0A\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x69\x6E\x70\x75\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x2C\x22\x2E\x22\x2C\x34\x2C\x31\x30\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x54\x65\x78\x74\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x31\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3D\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x76\x31\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x49\x70\x53\x65\x74\x74\x69\x6E\x67\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x6D\x6F\x64\x65\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x2B\x22\x5F\x6D\x6F\x64\x65\x22\x29\x2C\x0D\x0A\x09\x09\x64\x69\x76\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x2B\x22\x5F\x64\x69\x76\x22\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x3D\x7B\x0D\x0A\x09\x09\x6F\x6E\x63\x68\x61\x6E\x67\x65\x3A\x6E\x75\x6C\x6C\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x61\x64\x64\x72\x3D\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x28\x69\x64\x2B\x22\x5F\x61\x64\x64\x72\x22\x29\x3B\x0D\x0A\x09\x5F\x74\x2E\x6D\x61\x73\x6B\x3D\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x28\x69\x64\x2B\x22\x5F\x6D\x61\x73\x6B\x22\x29\x3B\x0D\x0A\x09\x5F\x74\x2E\x67\x77\x3D\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x41\x64\x64\x72\x49\x6E\x70\x75\x74\x28\x69\x64\x2B\x22\x5F\x64\x65\x66\x67\x77\x22\x29\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x6F\x64\x65\x2E\x61\x64\x64\x45\x76\x65\x6E\x74\x4C\x69\x73\x74\x65\x6E\x65\x72\x28\x22\x63\x68\x61\x6E\x67\x65\x22\x2C\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x64\x69\x76\x2E\x73\x74\x79\x6C\x65\x2E\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79\x3D\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x6F\x64\x65\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x3D\x3D\x30\x29\x3F\x22\x76\x69\x73\x69\x62\x6C\x65\x22\x3A\x22\x68\x69\x64\x64\x65\x6E\x22\x3B\x0D\x0A\x09\x09\x69\x66\x28\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x21\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x63\x68\x61\x6E\x67\x65\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x6F\x64\x65\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x29\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x29\x3B\x0D\x0A\x09\x5F\x74\x2E\x73\x65\x74\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x6F\x64\x65\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x3D\x28\x76\x2E\x66\x6C\x61\x67\x73\x20\x26\x20\x30\x78\x30\x33\x29\x3B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x64\x69\x76\x2E\x73\x74\x79\x6C\x65\x2E\x76\x69\x73\x69\x62\x69\x6C\x69\x74\x79\x3D\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x6F\x64\x65\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x3D\x3D\x30\x29\x3F\x22\x76\x69\x73\x69\x62\x6C\x65\x22\x3A\x22\x68\x69\x64\x64\x65\x6E\x22\x3B\x0D\x0A\x09\x09\x5F\x74\x2E\x61\x64\x64\x72\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x28\x76\x2E\x69\x70\x29\x3B\x0D\x0A\x09\x09\x5F\x74\x2E\x6D\x61\x73\x6B\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x28\x76\x2E\x6D\x61\x73\x6B\x29\x3B\x0D\x0A\x09\x09\x5F\x74\x2E\x67\x77\x2E\x73\x65\x74\x49\x70\x56\x61\x6C\x75\x65\x28\x76\x2E\x64\x72\x6F\x75\x74\x65\x29\x3B\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x76\x61\x72\x20\x72\x65\x74\x3D\x7B\x7D\x3B\x0D\x0A\x09\x09\x76\x61\x72\x20\x65\x72\x72\x3B\x0D\x0A\x09\x09\x74\x72\x79\x7B\x0D\x0A\x09\x09\x09\x65\x72\x72\x3D\x22\x49\x50\x20\x4D\x6F\x64\x65\x22\x3B\x0D\x0A\x09\x09\x09\x72\x65\x74\x2E\x66\x6C\x61\x67\x3D\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x6F\x64\x65\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x3B\x0D\x0A\x09\x09\x09\x65\x72\x72\x3D\x22\x49\x50\x20\x41\x64\x64\x72\x65\x73\x73\x22\x3B\x0D\x0A\x09\x09\x09\x72\x65\x74\x2E\x61\x64\x64\x72\x3D\x5F\x74\x2E\x61\x64\x64\x72\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x65\x72\x72\x3D\x22\x49\x50\x20\x4D\x61\x73\x6B\x22\x3B\x0D\x0A\x09\x09\x09\x72\x65\x74\x2E\x6D\x61\x73\x6B\x3D\x5F\x74\x2E\x6D\x61\x73\x6B\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x65\x72\x72\x3D\x22\x49\x50\x20\x47\x61\x74\x65\x77\x61\x79\x22\x3B\x0D\x0A\x09\x09\x09\x72\x65\x74\x2E\x67\x77\x3D\x5F\x74\x2E\x67\x77\x2E\x67\x65\x74\x49\x70\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x65\x74\x3B\x0D\x0A\x09\x09\x7D\x63\x61\x74\x63\x68\x28\x65\x29\x7B\x0D\x0A\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x76\x61\x6C\x75\x65\x3A\x22\x2B\x65\x72\x72\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x4D\x61\x63\x41\x64\x64\x72\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x69\x6E\x70\x75\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x4D\x61\x63\x41\x64\x64\x72\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x74\x72\x79\x7B\x0D\x0A\x09\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x73\x74\x72\x32\x48\x65\x78\x41\x72\x72\x61\x79\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x2C\x22\x3A\x22\x2C\x36\x2C\x31\x36\x29\x3B\x0D\x0A\x09\x09\x7D\x63\x61\x74\x63\x68\x28\x65\x29\x7B\x0D\x0A\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x4D\x41\x43\x20\x61\x64\x64\x72\x65\x73\x73\x20\x27\x22\x2B\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x2B\x22\x27\x22\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x73\x65\x74\x4D\x61\x63\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x31\x2C\x76\x32\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3D\x69\x6E\x74\x32\x4D\x61\x63\x41\x64\x64\x72\x28\x76\x31\x2C\x76\x32\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x48\x6F\x73\x74\x4E\x61\x6D\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x69\x6E\x70\x75\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x76\x61\x72\x20\x72\x3D\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3B\x0D\x0A\x09\x09\x69\x66\x28\x72\x2E\x6C\x65\x6E\x67\x74\x68\x3C\x31\x20\x7C\x7C\x72\x2E\x6C\x65\x6E\x67\x74\x68\x3E\x33\x31\x20\x7C\x7C\x20\x72\x2E\x6D\x61\x74\x63\x68\x28\x2F\x5B\x5E\x28\x61\x2D\x7A\x30\x2D\x39\x5F\x29\x5D\x2F\x69\x29\x29\x7B\x0D\x0A\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x48\x6F\x73\x74\x20\x6E\x61\x6D\x65\x2E\x22\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x3B\x0D\x0A\x09\x7D\x2C\x0D\x0A\x09\x5F\x74\x2E\x73\x65\x74\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x76\x31\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x69\x6E\x70\x75\x74\x2E\x76\x61\x6C\x75\x65\x3D\x76\x31\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x55\x69\x2E\x53\x65\x72\x76\x69\x63\x65\x73\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x2B\x22\x5F\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x22\x29\x2C\x0D\x0A\x09\x09\x6D\x64\x6E\x73\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x2B\x22\x5F\x6D\x64\x6E\x73\x5F\x73\x77\x22\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x67\x65\x74\x56\x61\x6C\x75\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x76\x61\x72\x20\x72\x3D\x7B\x0D\x0A\x09\x09\x09\x70\x6F\x72\x74\x3A\x70\x61\x72\x73\x65\x49\x6E\x74\x28\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x2E\x76\x61\x6C\x75\x65\x29\x2C\x0D\x0A\x09\x09\x09\x66\x6C\x61\x67\x3A\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x64\x6E\x73\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x26\x30\x78\x30\x31\x7D\x3B\x0D\x0A\x09\x09\x69\x66\x28\x69\x73\x4E\x61\x4E\x28\x72\x2E\x70\x6F\x72\x74\x29\x20\x7C\x7C\x20\x72\x2E\x70\x6F\x72\x74\x3C\x3D\x30\x29\x7B\x0D\x0A\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x49\x6E\x76\x61\x6C\x69\x64\x20\x70\x6F\x72\x74\x20\x6E\x75\x6D\x62\x65\x72\x22\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x09\x72\x65\x74\x75\x72\x6E\x20\x72\x3B\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x69\x6E\x69\x74\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x63\x66\x67\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x2E\x76\x61\x6C\x75\x65\x3D\x63\x66\x67\x2E\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x3B\x0D\x0A\x09\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x6D\x64\x6E\x73\x2E\x73\x65\x6C\x65\x63\x74\x65\x64\x49\x6E\x64\x65\x78\x3D\x28\x63\x66\x67\x2E\x66\x6C\x61\x67\x73\x26\x30\x78\x30\x31\x29\x21\x3D\x30\x3F\x31\x3A\x30\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x55\x69\x2E\x43\x6D\x64\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x69\x64\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x5F\x74\x3D\x74\x68\x69\x73\x3B\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x3D\x7B\x0D\x0A\x09\x09\x75\x70\x64\x61\x74\x65\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x2B\x22\x5F\x75\x70\x64\x61\x74\x65\x22\x29\x2C\x0D\x0A\x09\x09\x63\x61\x6E\x63\x65\x6C\x3A\x67\x65\x74\x45\x6C\x65\x6D\x28\x69\x64\x2B\x22\x5F\x63\x61\x6E\x63\x65\x6C\x22\x29\x0D\x0A\x09\x7D\x3B\x0D\x0A\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x3D\x7B\x6F\x6E\x75\x70\x64\x61\x74\x65\x3A\x6E\x75\x6C\x6C\x7D\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x75\x70\x64\x61\x74\x65\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x75\x70\x64\x61\x74\x65\x21\x3D\x6E\x75\x6C\x6C\x29\x7B\x0D\x0A\x09\x09\x09\x5F\x74\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x75\x70\x64\x61\x74\x65\x28\x29\x3B\x0D\x0A\x09\x09\x7D\x09\x09\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x63\x61\x6E\x63\x65\x6C\x2E\x6F\x6E\x63\x6C\x69\x63\x6B\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x09\x7B\x0D\x0A\x09\x09\x69\x66\x28\x77\x69\x6E\x64\x6F\x77\x2E\x63\x6F\x6E\x66\x69\x72\x6D\x28\x27\x44\x6F\x20\x79\x6F\x75\x20\x77\x61\x6E\x74\x20\x74\x6F\x20\x63\x61\x6E\x63\x65\x6C\x3F\x27\x29\x29\x7B\x0D\x0A\x09\x09\x09\x64\x6F\x63\x75\x6D\x65\x6E\x74\x2E\x6C\x6F\x63\x61\x74\x69\x6F\x6E\x3D\x22\x2E\x2F\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C\x22\x3B\x0D\x0A\x09\x09\x7D\x0D\x0A\x09\x7D\x0D\x0A\x09\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x75\x70\x64\x61\x74\x65\x2E\x64\x69\x73\x61\x62\x6C\x65\x64\x3D\x66\x61\x6C\x73\x65\x3B\x0D\x0A\x09\x5F\x74\x2E\x64\x69\x73\x61\x62\x6C\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x5F\x74\x2E\x5F\x74\x61\x67\x73\x2E\x75\x70\x64\x61\x74\x65\x2E\x64\x69\x73\x61\x62\x6C\x65\x64\x3D\x74\x72\x75\x65\x3B\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x28\x29\x0D\x0A\x7B\x0D\x0A\x09\x76\x61\x72\x20\x53\x45\x54\x55\x50\x5F\x41\x50\x49\x3D\x22\x2F\x73\x65\x74\x75\x70\x2F\x73\x65\x74\x75\x70\x2E\x61\x70\x69\x22\x3B\x20\x0D\x0A\x09\x76\x61\x72\x20\x75\x69\x3D\x7B\x0D\x0A\x09\x09\x6D\x61\x63\x61\x64\x64\x72\x3A\x6E\x65\x77\x20\x55\x69\x2E\x4D\x61\x63\x41\x64\x64\x72\x28\x22\x69\x6E\x5F\x65\x6D\x61\x63\x22\x29\x2C\x0D\x0A\x09\x09\x63\x6D\x64\x3A\x6E\x65\x77\x20\x55\x69\x2E\x43\x6D\x64\x28\x22\x63\x6D\x64\x22\x29\x2C\x0D\x0A\x09\x09\x69\x70\x73\x65\x74\x3A\x6E\x65\x77\x20\x55\x69\x2E\x49\x70\x53\x65\x74\x74\x69\x6E\x67\x28\x22\x69\x6E\x5F\x69\x70\x22\x29\x2C\x0D\x0A\x09\x09\x73\x72\x76\x3A\x6E\x65\x77\x20\x55\x69\x2E\x53\x65\x72\x76\x69\x63\x65\x73\x28\x22\x73\x72\x76\x22\x29\x2C\x0D\x0A\x09\x09\x68\x6F\x73\x74\x6E\x61\x6D\x65\x3A\x6E\x65\x77\x20\x55\x69\x2E\x48\x6F\x73\x74\x4E\x61\x6D\x65\x28\x22\x69\x6E\x5F\x68\x6F\x73\x74\x22\x29\x0D\x0A\x09\x7D\x0D\x0A\x09\x75\x69\x2E\x63\x6D\x64\x2E\x65\x76\x65\x6E\x74\x73\x2E\x6F\x6E\x75\x70\x64\x61\x74\x65\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x28\x29\x7B\x0D\x0A\x09\x09\x2F\x2F\xE5\x80\xA4\xE3\x83\x81\xE3\x82\xA7\xE3\x83\x83\xE3\x82\xAF\x0D\x0A\x09\x74\x72\x79\x7B\x0D\x0A\x09\x09\x76\x61\x72\x20\x6D\x61\x63\x3D\x75\x69\x2E\x6D\x61\x63\x61\x64\x64\x72\x2E\x67\x65\x74\x4D\x61\x63\x41\x64\x64\x72\x28\x29\x3B\x0D\x0A\x09\x09\x76\x61\x72\x20\x68\x6F\x73\x74\x3D\x75\x69\x2E\x68\x6F\x73\x74\x6E\x61\x6D\x65\x2E\x67\x65\x74\x56\x61\x6C\x75\x65\x28\x29\x3B\x0D\x0A\x09\x09\x76\x61\x72\x20\x69\x70\x76\x34\x3D\x75\x69\x2E\x69\x70\x73\x65\x74\x2E\x67\x65\x74\x56\x61\x6C\x75\x65\x28\x29\x3B\x0D\x0A\x09\x09\x76\x61\x72\x20\x73\x72\x76\x3D\x75\x69\x2E\x73\x72\x76\x2E\x67\x65\x74\x56\x61\x6C\x75\x65\x28\x29\x3B\x0D\x0A\x09\x09\x76\x61\x72\x20\x70\x6D\x3D\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x6D\x61\x63\x29\x2B\x22\x66\x66\x66\x66\x22\x0D\x0A\x09\x09\x09\x2B\x69\x6E\x74\x32\x68\x65\x78\x28\x69\x70\x76\x34\x2E\x66\x6C\x61\x67\x2C\x38\x29\x2B\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x69\x70\x76\x34\x2E\x61\x64\x64\x72\x29\x2B\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x69\x70\x76\x34\x2E\x6D\x61\x73\x6B\x29\x2B\x61\x72\x72\x61\x79\x54\x6F\x48\x65\x78\x28\x69\x70\x76\x34\x2E\x67\x77\x29\x0D\x0A\x09\x09\x09\x2B\x69\x6E\x74\x32\x68\x65\x78\x28\x73\x72\x76\x2E\x66\x6C\x61\x67\x2C\x38\x29\x2B\x69\x6E\x74\x32\x68\x65\x78\x28\x73\x72\x76\x2E\x70\x6F\x72\x74\x2C\x34\x29\x2B\x22\x30\x30\x30\x30\x22\x3B\x0D\x0A\x09\x09\x2F\x2F\x4C\x50\x43\x58\x50\x72\x65\x73\x73\x6F\xE3\x81\xB8\xE9\x80\x81\xE4\xBF\xA1\x0D\x0A\x09\x09\x76\x61\x72\x20\x72\x65\x74\x3D\x65\x76\x61\x6C\x28\x22\x28\x22\x2B\x73\x6C\x69\x62\x2E\x78\x68\x72\x28\x53\x45\x54\x55\x50\x5F\x41\x50\x49\x2B\x22\x3F\x63\x3D\x75\x70\x64\x61\x74\x65\x26\x70\x3D\x22\x2B\x70\x6D\x2B\x22\x26\x68\x6F\x73\x74\x3D\x22\x2B\x68\x6F\x73\x74\x29\x2E\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74\x2B\x22\x29\x22\x29\x3B\x0D\x0A\x09\x09\x09\x69\x66\x28\x72\x65\x74\x2E\x72\x65\x73\x75\x6C\x74\x21\x3D\x30\x78\x30\x29\x7B\x0D\x0A\x09\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x75\x70\x64\x61\x74\x65\x20\x69\x73\x20\x66\x61\x69\x6C\x65\x64\x2E\x20\x63\x6F\x64\x65\x3D\x30\x78\x22\x2B\x72\x65\x74\x2E\x72\x65\x73\x75\x6C\x74\x3B\x0D\x0A\x09\x09\x09\x7D\x65\x6C\x73\x65\x7B\x0D\x0A\x09\x09\x09\x09\x74\x68\x72\x6F\x77\x20\x22\x43\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x69\x73\x20\x63\x68\x61\x6E\x67\x65\x64\x2E\x5C\x6E\x20\x52\x65\x73\x74\x61\x72\x74\x20\x74\x68\x65\x20\x4D\x69\x4D\x69\x63\x52\x65\x6D\x6F\x74\x65\x4D\x43\x55\x20\x74\x6F\x20\x65\x6E\x61\x62\x6C\x65\x20\x74\x68\x65\x20\x73\x65\x74\x74\x69\x6E\x67\x2E\x22\x3B\x0D\x0A\x09\x09\x09\x7D\x0D\x0A\x09\x7D\x63\x61\x74\x63\x68\x28\x65\x29\x7B\x0D\x0A\x09\x09\x61\x6C\x65\x72\x74\x28\x65\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x0D\x0A\x09\x7D\x0D\x0A\x09\x74\x72\x79\x7B\x0D\x0A\x09\x09\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x6E\x2C\x76\x29\x7B\x67\x65\x74\x45\x6C\x65\x6D\x28\x6E\x29\x2E\x69\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x3D\x76\x3B\x7D\x0D\x0A\x09\x09\x76\x61\x72\x20\x63\x66\x67\x3D\x65\x76\x61\x6C\x28\x22\x28\x22\x2B\x73\x6C\x69\x62\x2E\x78\x68\x72\x28\x53\x45\x54\x55\x50\x5F\x41\x50\x49\x2B\x22\x3F\x63\x3D\x67\x65\x74\x22\x29\x2E\x72\x65\x73\x70\x6F\x6E\x73\x65\x54\x65\x78\x74\x2B\x22\x29\x22\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x76\x65\x72\x73\x69\x6F\x6E\x22\x2C\x63\x66\x67\x2E\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x6C\x61\x6E\x22\x2C\x63\x66\x67\x2E\x6C\x61\x6E\x64\x65\x76\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x68\x6F\x73\x74\x22\x2C\x63\x66\x67\x2E\x63\x75\x72\x2E\x68\x6F\x73\x74\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x6D\x61\x63\x22\x2C\x69\x6E\x74\x32\x4D\x61\x63\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x63\x75\x72\x2E\x6D\x61\x63\x30\x30\x30\x31\x30\x32\x30\x33\x2C\x63\x66\x67\x2E\x63\x75\x72\x2E\x6D\x61\x63\x30\x34\x30\x35\x78\x78\x78\x78\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x69\x70\x22\x2C\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x63\x75\x72\x2E\x69\x70\x76\x34\x2E\x69\x70\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x6D\x61\x73\x6B\x22\x2C\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x63\x75\x72\x2E\x69\x70\x76\x34\x2E\x6D\x61\x73\x6B\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x64\x72\x6F\x75\x74\x65\x22\x2C\x69\x6E\x74\x32\x49\x70\x41\x64\x64\x72\x28\x63\x66\x67\x2E\x63\x75\x72\x2E\x69\x70\x76\x34\x2E\x64\x72\x6F\x75\x74\x65\x29\x29\x3B\x0D\x0A\x09\x09\x73\x65\x74\x49\x6E\x6E\x65\x72\x48\x54\x4D\x4C\x28\x22\x63\x75\x72\x5F\x73\x65\x72\x76\x69\x63\x65\x22\x2C\x0D\x0A\x09\x09\x09\x22\x48\x74\x74\x70\x20\x50\x6F\x72\x74\x3D\x22\x2B\x63\x66\x67\x2E\x63\x75\x72\x2E\x73\x65\x72\x76\x69\x63\x65\x73\x2E\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x2B\x22\x2C\x22\x2B\x0D\x0A\x09\x09\x09\x22\x6D\x44\x4E\x53\x3D\x22\x2B\x28\x28\x63\x66\x67\x2E\x63\x75\x72\x2E\x73\x65\x72\x76\x69\x63\x65\x73\x2E\x66\x6C\x61\x67\x73\x26\x30\x78\x30\x31\x29\x3F\x22\x45\x6E\x61\x62\x6C\x65\x22\x3A\x22\x44\x69\x73\x61\x62\x6C\x65\x22\x29\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x6D\x61\x63\x61\x64\x64\x72\x2E\x73\x65\x74\x4D\x61\x63\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x63\x66\x67\x2E\x6D\x61\x63\x30\x30\x30\x31\x30\x32\x30\x33\x2C\x63\x66\x67\x2E\x63\x66\x67\x2E\x6D\x61\x63\x30\x34\x30\x35\x78\x78\x78\x78\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x69\x70\x73\x65\x74\x2E\x73\x65\x74\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x63\x66\x67\x2E\x69\x70\x76\x34\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x68\x6F\x73\x74\x6E\x61\x6D\x65\x2E\x73\x65\x74\x56\x61\x6C\x75\x65\x28\x63\x66\x67\x2E\x63\x66\x67\x2E\x68\x6F\x73\x74\x29\x3B\x0D\x0A\x09\x09\x75\x69\x2E\x73\x72\x76\x2E\x69\x6E\x69\x74\x28\x63\x66\x67\x2E\x63\x66\x67\x2E\x73\x65\x72\x76\x69\x63\x65\x73\x29\x3B\x0D\x0A\x09\x7D\x63\x61\x74\x63\x68\x28\x65\x29\x7B\x0D\x0A\x09\x09\x75\x69\x2E\x75\x70\x64\x61\x74\x65\x2E\x64\x69\x73\x61\x62\x6C\x65\x28\x29\x3B\x0D\x0A\x09\x09\x61\x6C\x65\x72\x74\x28\x22\x4D\x69\x4D\x69\x63\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x6F\x72\x20\x66\x61\x69\x6C\x65\x64\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x27\x22\x2B\x65\x2E\x74\x6F\x53\x74\x72\x69\x6E\x67\x28\x29\x2B\x22\x27\x22\x29\x3B\x0D\x0A\x09\x7D\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x28\x29\x0D\x0A\x7B\x0D\x0A\x09\x61\x70\x70\x3D\x6E\x65\x77\x20\x41\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x28\x29\x3B\x0D\x0A\x7D\x0D\x0A\x0D\x0A\x0D\x0A\x3C\x2F\x73\x63\x72\x69\x70\x74\x3E\x0D\x0A\x3C\x2F\x68\x65\x61\x64\x3E\x0D\x0A\x3C\x62\x6F\x64\x79\x20\x6F\x6E\x6C\x6F\x61\x64\x3D\x22\x69\x6E\x69\x74\x28\x29\x3B\x22\x3E\x0D\x0A\x3C\x68\x31\x3E\x4D\x69\x4D\x69\x63\x20\x52\x65\x6D\x6F\x74\x65\x4D\x43\x55\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x20\x3C\x2F\x68\x31\x3E\x0D\x0A\x3C\x68\x72\x2F\x3E\x0D\x0A\x09\x3C\x68\x32\x3E\x43\x75\x72\x72\x65\x6E\x74\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3C\x2F\x68\x32\x3E\x0D\x0A\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x31\x20\x22\x3E\x0D\x0A\x09\x09\x3C\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x3C\x63\x6F\x6C\x20\x73\x70\x61\x6E\x3D\x22\x31\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6C\x31\x22\x20\x2F\x3E\x3C\x2F\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x0D\x0A\x09\x09\x3C\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x3C\x63\x6F\x6C\x20\x73\x70\x61\x6E\x3D\x22\x32\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6C\x32\x22\x20\x2F\x3E\x3C\x2F\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x56\x65\x72\x73\x69\x6F\x6E\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x76\x65\x72\x73\x69\x6F\x6E\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x4C\x41\x4E\x20\x50\x48\x59\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x6C\x61\x6E\x22\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x4D\x41\x43\x20\x41\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x6D\x61\x63\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x48\x6F\x73\x74\x20\x4E\x61\x6D\x65\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x68\x6F\x73\x74\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x49\x50\x20\x41\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x69\x70\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x4E\x65\x74\x20\x4D\x61\x73\x6B\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x6D\x61\x73\x6B\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x44\x65\x66\x61\x75\x6C\x74\x20\x47\x61\x74\x65\x77\x61\x79\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x64\x72\x6F\x75\x74\x65\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x53\x65\x72\x76\x69\x63\x65\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x70\x20\x69\x64\x3D\x22\x63\x75\x72\x5F\x73\x65\x72\x76\x69\x63\x65\x22\x3E\x3C\x2F\x70\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x3C\x70\x20\x63\x6C\x61\x73\x73\x3D\x22\x65\x78\x70\x22\x3E\x0D\x0A\x49\x66\x20\x6C\x6F\x63\x61\x6C\x20\x73\x65\x74\x74\x69\x6E\x67\x20\x66\x69\x6C\x65\x20\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x2C\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x20\x6D\x69\x67\x68\x74\x20\x62\x65\x20\x64\x69\x66\x66\x65\x72\x65\x6E\x74\x20\x77\x69\x74\x68\x20\x6F\x6E\x63\x68\x69\x70\x2D\x73\x65\x74\x74\x69\x6E\x67\x2E\x20\x54\x6F\x20\x66\x75\x6C\x6C\x79\x20\x65\x6E\x61\x62\x6C\x65\x20\x6F\x6E\x2D\x63\x68\x69\x70\x20\x73\x65\x74\x74\x69\x6E\x67\x2C\x20\x70\x6C\x65\x61\x73\x65\x20\x72\x65\x6D\x6F\x76\x65\x20\x74\x68\x65\x20\x73\x65\x74\x74\x69\x6E\x67\x20\x66\x69\x6C\x65\x20\x22\x2F\x6D\x69\x6D\x69\x63\x2E\x63\x66\x67\x22\x20\x69\x6E\x20\x6D\x62\x65\x64\x20\x20\x6C\x6F\x63\x61\x6C\x20\x66\x69\x6C\x65\x20\x73\x79\x73\x74\x65\x6D\x20\x6F\x72\x20\x53\x44\x63\x61\x72\x64\x20\x66\x69\x6C\x65\x20\x73\x79\x73\x74\x65\x6D\x2E\x0D\x0A\x09\x3C\x2F\x70\x3E\x0D\x0A\x09\x3C\x68\x32\x3E\x4F\x6E\x43\x68\x69\x70\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x3C\x2F\x68\x32\x3E\x0D\x0A\x09\x0D\x0A\x09\x3C\x68\x33\x3E\x45\x74\x68\x65\x72\x6E\x65\x74\x3C\x2F\x68\x33\x3E\x0D\x0A\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x31\x22\x3E\x0D\x0A\x09\x09\x3C\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x3C\x63\x6F\x6C\x20\x73\x70\x61\x6E\x3D\x22\x31\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6C\x31\x22\x20\x2F\x3E\x3C\x2F\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x0D\x0A\x09\x09\x3C\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x3C\x63\x6F\x6C\x20\x73\x70\x61\x6E\x3D\x22\x32\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6C\x32\x22\x20\x2F\x3E\x3C\x2F\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x4D\x41\x43\x20\x41\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x69\x6E\x5F\x65\x6D\x61\x63\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x48\x6F\x73\x74\x20\x4E\x61\x6D\x65\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x69\x6E\x5F\x68\x6F\x73\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x0D\x0A\x09\x09\x09\x3C\x74\x64\x3E\x49\x50\x20\x41\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x0D\x0A\x09\x09\x09\x3C\x74\x64\x3E\x0D\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x3E\x3C\x73\x65\x6C\x65\x63\x74\x20\x69\x64\x3D\x22\x69\x6E\x5F\x69\x70\x5F\x6D\x6F\x64\x65\x22\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x3E\x4D\x61\x6E\x75\x61\x6C\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x3E\x44\x48\x43\x50\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x3E\x41\x75\x74\x6F\x49\x50\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x3E\x41\x75\x74\x6F\x49\x50\x2B\x44\x48\x43\x50\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x2F\x73\x65\x6C\x65\x63\x74\x3E\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x09\x09\x09\x09\x3C\x64\x69\x76\x20\x69\x64\x3D\x22\x69\x6E\x5F\x69\x70\x5F\x64\x69\x76\x22\x3E\x0D\x0A\x09\x09\x09\x09\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x32\x22\x3E\x0D\x0A\x09\x09\x09\x09\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x41\x64\x64\x72\x65\x73\x73\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x69\x6E\x5F\x69\x70\x5F\x61\x64\x64\x72\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x09\x09\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x4D\x61\x73\x6B\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x69\x6E\x5F\x69\x70\x5F\x6D\x61\x73\x6B\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x09\x09\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x47\x61\x74\x65\x77\x61\x79\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x69\x6E\x5F\x69\x70\x5F\x64\x65\x66\x67\x77\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x09\x09\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x09\x09\x09\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x09\x09\x09\x3C\x2F\x74\x64\x3E\x0D\x0A\x09\x09\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x3C\x68\x33\x3E\x53\x65\x72\x76\x69\x63\x65\x3C\x2F\x68\x33\x3E\x0D\x0A\x09\x3C\x74\x61\x62\x6C\x65\x20\x63\x6C\x61\x73\x73\x3D\x22\x74\x61\x62\x6C\x65\x31\x22\x3E\x0D\x0A\x09\x09\x3C\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x3C\x63\x6F\x6C\x20\x73\x70\x61\x6E\x3D\x22\x31\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6C\x31\x22\x20\x2F\x3E\x3C\x2F\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x0D\x0A\x09\x09\x3C\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x3C\x63\x6F\x6C\x20\x73\x70\x61\x6E\x3D\x22\x32\x22\x20\x63\x6C\x61\x73\x73\x3D\x22\x63\x6F\x6C\x32\x22\x20\x2F\x3E\x3C\x2F\x63\x6F\x6C\x67\x72\x6F\x75\x70\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x48\x54\x54\x50\x20\x50\x6F\x72\x74\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x69\x6E\x70\x75\x74\x20\x69\x64\x3D\x22\x73\x72\x76\x5F\x68\x74\x74\x70\x5F\x70\x6F\x72\x74\x22\x20\x74\x79\x70\x65\x3D\x22\x74\x65\x78\x74\x22\x2F\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x09\x3C\x74\x72\x3E\x3C\x74\x64\x3E\x6D\x44\x4E\x53\x3C\x2F\x74\x64\x3E\x3C\x74\x64\x3E\x3C\x73\x65\x6C\x65\x63\x74\x20\x69\x64\x3D\x22\x73\x72\x76\x5F\x6D\x64\x6E\x73\x5F\x73\x77\x22\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x3E\x44\x69\x73\x61\x62\x6C\x65\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x6F\x70\x74\x69\x6F\x6E\x3E\x45\x6E\x61\x62\x6C\x65\x3C\x2F\x6F\x70\x74\x69\x6F\x6E\x3E\x3C\x2F\x73\x65\x6C\x65\x63\x74\x3E\x3C\x2F\x74\x64\x3E\x3C\x2F\x74\x72\x3E\x0D\x0A\x09\x3C\x2F\x74\x61\x62\x6C\x65\x3E\x0D\x0A\x09\x3C\x62\x72\x2F\x3E\x0D\x0A\x09\x3C\x62\x72\x2F\x3E\x0D\x0A\x09\x3C\x62\x75\x74\x74\x6F\x6E\x20\x69\x64\x3D\x22\x63\x6D\x64\x5F\x75\x70\x64\x61\x74\x65\x22\x3E\x55\x70\x64\x61\x74\x65\x3C\x2F\x62\x75\x74\x74\x6F\x6E\x3E\x0D\x0A\x09\x3C\x62\x75\x74\x74\x6F\x6E\x20\x69\x64\x3D\x22\x63\x6D\x64\x5F\x63\x61\x6E\x63\x65\x6C\x22\x3E\x43\x61\x6E\x63\x65\x6C\x3C\x2F\x62\x75\x74\x74\x6F\x6E\x3E\x0D\x0A\x3C\x64\x69\x76\x20\x63\x6C\x61\x73\x73\x3D\x22\x66\x6F\x6F\x74\x65\x72\x22\x3E\x0D\x0A\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x2F\x6D\x69\x6D\x69\x63\x2F\x77\x70\x22\x20\x61\x6C\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x2F\x6D\x69\x6D\x69\x63\x2F\x77\x70\x22\x3E\x0D\x0A\x3C\x69\x6D\x67\x20\x73\x72\x63\x3D\x22\x2E\x2F\x6D\x69\x6D\x69\x63\x6C\x6F\x67\x6F\x2E\x70\x6E\x67\x22\x2F\x3E\x3C\x2F\x61\x3E\x0D\x0A\x4D\x69\x4D\x69\x63\x3C\x62\x72\x2F\x3E\x0D\x0A\x43\x6F\x70\x79\x72\x69\x67\x68\x74\x20\x28\x43\x29\x20\x32\x30\x31\x31\x2D\x32\x30\x31\x33\x20\x6E\x79\x61\x74\x6C\x61\x2E\x6A\x70\x20\x41\x6C\x6C\x20\x52\x69\x67\x68\x74\x73\x20\x52\x65\x73\x65\x72\x76\x65\x64\x2E\x0D\x0A\x3C\x2F\x64\x69\x76\x3E\x0D\x0A\x3C\x2F\x62\x6F\x64\x79\x3E\x0D\x0A"\r
        },\r
        {\r
                "mimiclogo.png",\r